CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_5/src/IORawData/CSCCommissioning/src/CSCFileDumper.cc

Go to the documentation of this file.
00001 #include <iomanip>
00002 
00003 #include "CSCFileDumper.h"
00004 
00005 //Framework stuff
00006 #include "DataFormats/Common/interface/Handle.h"
00007 #include "FWCore/Framework/interface/Event.h"
00008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00009 
00010 //FEDRawData
00011 #include "DataFormats/FEDRawData/interface/FEDRawData.h"
00012 #include "DataFormats/FEDRawData/interface/FEDNumbering.h"
00013 #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
00014 
00015 #include "DataFormats/MuonDetId/interface/CSCDetId.h"
00016 
00017 #include "FWCore/ServiceRegistry/interface/Service.h"
00018 
00019 #include <iostream>
00020 #include <sstream>
00021 #include <stdio.h>
00022 
00023 CSCFileDumper::CSCFileDumper(const edm::ParameterSet & pset)
00024 {
00025         output = pset.getUntrackedParameter<std::string>("output");
00026         fedID_first = FEDNumbering::MINCSCFEDID;
00027         fedID_last  = FEDNumbering::MAXCSCTFFEDID;
00028         events = pset.getUntrackedParameter<std::string>("events","");
00029         source_ = pset.getUntrackedParameter<std::string>("source","rawDataCollector");
00030 
00031         if( events.length() ){
00032                 for(size_t pos1=0,pos2=events.find(",");;pos1=pos2+1,pos2=events.find(",",pos2+1)){
00033                         if( pos2!=std::string::npos ){
00034                                 long event=0;
00035                                 if( sscanf(events.substr(pos1,pos2-pos1).c_str(),"%ld",&event) == 1 && event>=0 )
00036                                         eventsToDump.insert((unsigned long)event);
00037                                 else
00038                                         edm::LogError("CSCFileDumper")<<" cannot parse events ("<<events<<") parameter: "<<events.substr(pos1,pos2-pos1);
00039                         } else {
00040                                 long event=0;
00041                                 if( sscanf(events.substr(pos1,events.length()-pos1).c_str(),"%ld",&event) == 1 && event>=0 )
00042                                         eventsToDump.insert((unsigned long)event);
00043                                 else
00044                                         edm::LogError("CSCFileDumper")<<" cannot parse events ("<<events<<") parameter: "<<events.substr(pos1,events.length()-pos1);
00045                                 break;
00046                         }
00047                 }
00048                 std::ostringstream tmp;
00049                 for(std::set<unsigned long>::const_iterator evt=eventsToDump.begin(); evt!=eventsToDump.end(); evt++) tmp<<*evt<<" ";
00050                 edm::LogInfo("CSCFileDumper")<<" Following events will be dumped: "<<tmp.str();
00051         } else
00052                 edm::LogInfo("CSCFileDumper")<<" All events will be dumped";
00053 }
00054 
00055 CSCFileDumper::~CSCFileDumper(void){
00056         std::map<int,FILE*>::const_iterator stream = dump_files.begin();
00057         while( stream != dump_files.end() ){
00058                 fclose(stream->second);
00059                 stream++;
00060         }
00061 }
00062 
00063 void CSCFileDumper::analyze(const edm::Event & e, const edm::EventSetup& c){
00064         // Get a handle to the FED data collection
00065         edm::Handle<FEDRawDataCollection> rawdata;
00066 
00067         // Get a handle to the FED data collection
00068         e.getByLabel(source_, rawdata);
00069 
00070         for(int id=fedID_first; id<=fedID_last; ++id){ //for each of our DCCs
00071                 std::map<int,FILE*>::const_iterator stream = dump_files.find(id);
00072                 if( stream == dump_files.end() ){
00073                         std::ostringstream name;
00074                         name<<output<<"_"<<id<<std::ends;
00075                         FILE *file;
00076                         if( (file = fopen(name.str().c_str(),"wt"))==NULL ){
00077                                 edm::LogError("CSCFileDumper")<<"Cannot open the file: "<<name.str();
00078                                 continue;
00079                         } else
00080                                 dump_files[id] = file;
00081                         stream = dump_files.find(id);
00082                 }
00083 
00085                 const FEDRawData& fedData = rawdata->FEDData(id);
00086                 unsigned short int length = fedData.size();
00087 
00088                 if( length && ( eventsToDump.empty() || eventsToDump.find( (unsigned long)e.id().event() )!=eventsToDump.end() ) ){
00089                         //std::cout<<"Event found for fed id:"<<id<<std::endl;
00090                         // Event buffer
00091                         size_t size=length/2;
00092                         const unsigned short *buf = (unsigned short *)fedData.data();
00093                         fwrite(buf,2,size,stream->second);
00094                 }
00095         }
00096 }