Go to the documentation of this file.00001 #include <iomanip>
00002
00003 #include "CSCFileDumper.h"
00004
00005
00006 #include "DataFormats/Common/interface/Handle.h"
00007 #include "FWCore/Framework/interface/Event.h"
00008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00009
00010
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
00065 edm::Handle<FEDRawDataCollection> rawdata;
00066
00067
00068 e.getByLabel(source_, rawdata);
00069
00070 for(int id=fedID_first; id<=fedID_last; ++id){
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
00090
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 }