Go to the documentation of this file.00001 #include <TFile.h>
00002 #include <TTree.h>
00003 #include "IORawData/HcalTBInputService/src/CDFChunk.h"
00004 #include "IORawData/HcalTBInputService/src/CDFEventInfo.h"
00005 #include "IORawData/HcalTBInputService/src/HcalTBWriter.h"
00006 #include "DataFormats/FEDRawData/interface/FEDNumbering.h"
00007 #include "DataFormats/FEDRawData/interface/FEDHeader.h"
00008 #include <unistd.h>
00009 #include <boost/cstdint.hpp>
00010 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00011
00012
00013 HcalTBWriter::HcalTBWriter(const edm::ParameterSet & pset) :
00014 namePattern_(pset.getUntrackedParameter<std::string>("FilenamePattern","/tmp/HTB_%06d.root")),
00015 fedRawDataCollectionTag_(pset.getParameter<edm::InputTag>("fedRawDataCollectionTag"))
00016 {
00017
00018 std::vector<edm::ParameterSet> names=pset.getUntrackedParameter<std::vector<edm::ParameterSet> >("ChunkNames");
00019 std::vector<edm::ParameterSet>::iterator j;
00020 for (j=names.begin(); j!=names.end(); j++) {
00021 std::string name=j->getUntrackedParameter<std::string>("Name");
00022 int num=j->getUntrackedParameter<int>("Number");
00023 blockToName_[num]=name;
00024 }
00025
00026 file_=0;
00027 tree_=0;
00028 eventInfo_=0;
00029 }
00030
00031 void HcalTBWriter::endJob() {
00032 char buffer[1024];
00033 if (file_!=0) {
00034 file_->Write();
00035
00036 ri_.setInfo("DAQSofwareRelease","UNKNOWN -- HcalTBWriter");
00037 gethostname(buffer,1024);
00038 ri_.setInfo("WriterHostname",buffer);
00039 ri_.store(file_);
00040
00041 file_->Close();
00042 file_=0;
00043 tree_=0;
00044 chunkMap_.clear();
00045 eventInfo_=0;
00046 }
00047 }
00048
00049 void HcalTBWriter::analyze(const edm::Event& e, const edm::EventSetup& es) {
00050 edm::Handle<FEDRawDataCollection> raw;
00051 e.getByLabel(fedRawDataCollectionTag_, raw);
00052
00053 if (file_==0) {
00054 char fname[4096];
00055 snprintf(fname,4096, namePattern_.c_str(),e.id().run());
00056 edm::LogInfo("HCAL") << "Opening " << fname << " for writing HCAL-format file.";
00057 file_=new TFile(fname,"RECREATE");
00058 ri_.setInfo("OriginalFile",fname);
00059 buildTree(*raw);
00060 }
00061
00062
00063 for (std::map<int,int>::const_iterator i=chunkMap_.begin(); i!=chunkMap_.end(); i++) {
00064 CDFChunk* c=chunkList_[i->second];
00065 const FEDRawData& frd=raw->FEDData(i->first);
00066 c->adoptBuffer((ULong64_t*)frd.data(),frd.size()/8);
00067 }
00068
00069
00070 extractEventInfo(*raw,e.id());
00071
00072
00073 tree_->Fill();
00074
00075 for (std::map<int,int>::const_iterator i=chunkMap_.begin(); i!=chunkMap_.end(); i++) {
00076 CDFChunk* c=chunkList_[i->second];
00077 c->releaseBuffer();
00078 }
00079
00080 }
00081
00082 void HcalTBWriter::buildTree(const FEDRawDataCollection& raw) {
00083 tree_=new TTree("CMSRAW","CMS Common Data Format Tree");
00084 chunkMap_.clear();
00085 trigChunk_=-1;
00086 int j=0;
00087 for (int i=0; i<2048; i++) {
00088 const FEDRawData& frd=raw.FEDData(i);
00089 if (frd.size()<16) continue;
00090
00091 std::string name;
00092 if (blockToName_.find(i)!=blockToName_.end()) name=blockToName_[i];
00093 else {
00094 char sname[64];
00095 snprintf(sname,64,"Chunk%03d",i);
00096 name=sname;
00097 }
00098
00099 CDFChunk* c=new CDFChunk(name.c_str());
00100 chunkList_[j]=c;
00101 tree_->Branch(name.c_str(),"CDFChunk",&(chunkList_[j]));
00102 chunkMap_[i]=j;
00103
00104 if (name=="HCAL_Trigger" || name=="SliceTest_Trigger") trigChunk_=j;
00105
00106 j++;
00107 }
00108 eventInfo_=new CDFEventInfo();
00109 tree_->Branch("CDFEventInfo","CDFEventInfo",&eventInfo_,16000,2);
00110 }
00111
00112 typedef struct StandardTrgMsgBlkStruct {
00113 uint32_t orbitNumber;
00114 uint32_t eventNumber;
00115 uint32_t flags_daq_ttype;
00116 uint32_t algo_bits_3;
00117 uint32_t algo_bits_2;
00118 uint32_t algo_bits_1;
00119 uint32_t algo_bits_0;
00120 uint32_t tech_bits;
00121 uint32_t gps_1234;
00122 uint32_t gps_5678;
00123 } StandardTrgMsgBlk;
00124
00125 typedef struct newExtendedTrgMsgBlkStruct {
00126 StandardTrgMsgBlk stdBlock;
00127 uint32_t triggerWord;
00128 uint32_t triggerTime_usec;
00129 uint32_t triggerTime_base;
00130 uint32_t spillNumber;
00131 uint32_t runNumber;
00132 char runNumberSequenceId[16];
00133 uint32_t eventStatus;
00134 } newExtendedTrgMsgBlk;
00135
00136 void HcalTBWriter::extractEventInfo(const FEDRawDataCollection& raw, const edm::EventID& id) {
00137 int runno=id.run();
00138 const char* seqid="";
00139 int eventNo=id.event();
00140 int l1aNo=eventNo;
00141 int orbitNo=0;
00142 int bunchNo=0;
00143
00144 if (trigChunk_>=0) {
00145 const newExtendedTrgMsgBlk* tinfo=(const newExtendedTrgMsgBlk*)(chunkList_[trigChunk_]->getData()+2);
00146 orbitNo=tinfo->stdBlock.orbitNumber;
00147 seqid=tinfo->runNumberSequenceId;
00148 FEDHeader head((const unsigned char*)chunkList_[trigChunk_]->getData());
00149 bunchNo=head.bxID();
00150 l1aNo=head.lvl1ID();
00151 }
00152
00153 eventInfo_->Set(runno,seqid,eventNo,l1aNo,orbitNo,bunchNo);
00154 }