CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_6_1_2_SLHC2_patch1/src/IORawData/HcalTBInputService/src/HcalTBWriter.cc

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   // adopt the buffers for writing
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   // copy the event info bits
00070   extractEventInfo(*raw,e.id());
00071 
00072   // fill the tree
00073   tree_->Fill();
00074   // release all the buffers
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; // it's empty... like
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); // assume 2 64-bit words for the CDF header
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 }