CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_6_1_2_SLHC2/src/DQM/HcalMonitorTasks/src/HcalDetDiagTimingMonitor.cc

Go to the documentation of this file.
00001 #include "DQM/HcalMonitorTasks/interface/HcalDetDiagTimingMonitor.h"
00002 
00003 #include "DataFormats/FEDRawData/interface/FEDRawData.h"
00004 #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
00005 #include "DataFormats/FEDRawData/interface/FEDNumbering.h"
00006 #include "DataFormats/HcalDigi/interface/HcalCalibrationEventTypes.h"
00007 #include "EventFilter/HcalRawToDigi/interface/HcalDCCHeader.h"
00008 
00009 #include <math.h>
00010 
00011 // this is to retrieve HCAL digi's
00012 #include "DataFormats/HcalDigi/interface/HcalDigiCollections.h"
00013 // this is to retrieve GT digi's 
00014 #include "DataFormats/L1GlobalMuonTrigger/interface/L1MuRegionalCand.h"
00015 #include "DataFormats/L1GlobalMuonTrigger/interface/L1MuGMTReadoutCollection.h"
00016 #include "DataFormats/L1GlobalTrigger/interface/L1GlobalTriggerReadoutRecord.h"
00017 #include "DataFormats/L1GlobalTrigger/interface/L1GtPsbWord.h"
00018 #include "DataFormats/L1GlobalTrigger/interface/L1GtFdlWord.h"
00019 
00020 
00021 
00023 static const float adc2fC[128]={-0.5,0.5,1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5, 10.5,11.5,12.5,
00024                    13.5,15.,17.,19.,21.,23.,25.,27.,29.5,32.5,35.5,38.5,42.,46.,50.,54.5,59.5,
00025                    64.5,59.5,64.5,69.5,74.5,79.5,84.5,89.5,94.5,99.5,104.5,109.5,114.5,119.5,
00026                    124.5,129.5,137.,147.,157.,167.,177.,187.,197.,209.5,224.5,239.5,254.5,272.,
00027                    292.,312.,334.5,359.5,384.5,359.5,384.5,409.5,434.5,459.5,484.5,509.5,534.5,
00028                    559.5,584.5,609.5,634.5,659.5,684.5,709.5,747.,797.,847.,897.,947.,997.,
00029                    1047.,1109.5,1184.5,1259.5,1334.5,1422.,1522.,1622.,1734.5,1859.5,1984.5,
00030                    1859.5,1984.5,2109.5,2234.5,2359.5,2484.5,2609.5,2734.5,2859.5,2984.5,
00031                    3109.5,3234.5,3359.5,3484.5,3609.5,3797.,4047.,4297.,4547.,4797.,5047.,
00032                    5297.,5609.5,5984.5,6359.5,6734.5,7172.,7672.,8172.,8734.5,9359.5,9984.5};
00034 static const int MAXGEN =10;
00035 static const int MAXRPC =20;
00036 static const int MAXDTBX=20;
00037 static const int MAXCSC =20;    
00038 static const int MAXGMT =20;
00039 static const int TRIG_DT =1;
00040 static const int TRIG_RPC=2;
00041 static const int TRIG_GCT=4;
00042 static const int TRIG_CSC=8;
00043 static const int TRIG_RPCF=16;
00044 
00045 HcalDetDiagTimingMonitor::HcalDetDiagTimingMonitor(const edm::ParameterSet& ps) 
00046 {
00047   Online_                = ps.getUntrackedParameter<bool>("online",false);
00048   mergeRuns_             = ps.getUntrackedParameter<bool>("mergeRuns",false);
00049   enableCleanup_         = ps.getUntrackedParameter<bool>("enableCleanup",false);
00050   debug_                 = ps.getUntrackedParameter<int>("debug",0);
00051   prefixME_              = ps.getUntrackedParameter<std::string>("subSystemFolder","Hcal/");
00052   if (prefixME_.substr(prefixME_.size()-1,prefixME_.size())!="/")
00053     prefixME_.append("/");
00054   subdir_                = ps.getUntrackedParameter<std::string>("TaskFolder","DetDiagTimingMonitor_Hcal");
00055   if (subdir_.size()>0 && subdir_.substr(subdir_.size()-1,subdir_.size())!="/")
00056     subdir_.append("/");
00057   subdir_=prefixME_+subdir_;
00058   AllowedCalibTypes_     = ps.getUntrackedParameter<std::vector<int> > ("AllowedCalibTypes");
00059   skipOutOfOrderLS_      = ps.getUntrackedParameter<bool>("skipOutOfOrderLS",false);
00060   NLumiBlocks_           = ps.getUntrackedParameter<int>("NLumiBlocks",4000);
00061   makeDiagnostics_       = ps.getUntrackedParameter<bool>("makeDiagnostics",false);
00062 
00063   GCTTriggerBit1_= ps.getUntrackedParameter<int>("GCTTriggerBit1", 15);         
00064   GCTTriggerBit2_= ps.getUntrackedParameter<int>("GCTTriggerBit2", 16);         
00065   GCTTriggerBit3_= ps.getUntrackedParameter<int>("GCTTriggerBit3", 17);         
00066   GCTTriggerBit4_= ps.getUntrackedParameter<int>("GCTTriggerBit4", 18);         
00067   GCTTriggerBit5_= ps.getUntrackedParameter<int>("GCTTriggerBit5", 16);         
00068   CosmicsCorr_   = ps.getUntrackedParameter<bool>("CosmicsCorr", true); 
00069   
00070   L1ADataLabel_  = ps.getUntrackedParameter<edm::InputTag>("gtLabel");
00071   inputLabelDigi_= ps.getUntrackedParameter<edm::InputTag>("digiLabel");
00072   FEDRawDataCollection_ = ps.getUntrackedParameter<edm::InputTag>("FEDRawDataCollection",edm::InputTag("source",""));
00073 }
00074 
00075 HcalDetDiagTimingMonitor::~HcalDetDiagTimingMonitor(){}
00076 
00077 void HcalDetDiagTimingMonitor::cleanup(){
00078   if(dbe_){
00079     dbe_->setCurrentFolder(subdir_);
00080     dbe_->removeContents();
00081     dbe_ = 0;
00082   }
00083 } 
00084 void HcalDetDiagTimingMonitor::reset(){}
00085 
00086 void HcalDetDiagTimingMonitor::beginRun(const edm::Run& run, const edm::EventSetup& c)
00087 {
00088   if (debug_>1) std::cout <<"HcalDetDiagTimingMonitor::beginRun"<<std::endl;
00089   HcalBaseDQMonitor::beginRun(run,c);
00090 
00091   if (tevt_==0) this->setup(); // set up histograms if they have not been created before
00092   if (mergeRuns_==false)
00093     this->reset();
00094 
00095   return;
00096 
00097 } // void HcalNDetDiagTimingMonitor::beginRun(...)
00098 
00099 
00100 
00101 void HcalDetDiagTimingMonitor::setup()
00102 {
00103   
00104   HcalBaseDQMonitor::setup();
00105 
00106   std::string str;
00107   if(dbe_!=NULL){    
00108      dbe_->setCurrentFolder(subdir_);   
00109      str="Hcal Timing summary"; Summary = dbe_->book2D(str,str,6,0,6,6,0,6); 
00110      Summary->setBinLabel(1,"DT",1);
00111      Summary->setBinLabel(2,"RPC",1);
00112      Summary->setBinLabel(3,"GCT",1);
00113      Summary->setBinLabel(4,"CSC",1);
00114      Summary->setBinLabel(5,"RPCf",1);
00115      Summary->setBinLabel(6,"bit11",1);
00116      Summary->setBinLabel(1,"HB",2);
00117      Summary->setBinLabel(2,"HO",2);
00118      Summary->setBinLabel(3,"HEM",2);
00119      Summary->setBinLabel(4,"HEP",2);
00120      Summary->setBinLabel(5,"HFM",2);
00121      Summary->setBinLabel(6,"HFP",2);
00122      for(int i=1;i<=6;i++) for(int j=1;j<=6;j++) Summary->setBinContent(i,j,-1);
00123      
00124      dbe_->setCurrentFolder(subdir_+"Timing Plots");
00125      str="HB Timing (DT Trigger)";                      HBTimeDT  = dbe_->book1D(str,str,100,0,10); 
00126      str="HO Timing (DT Trigger)";                      HOTimeDT  = dbe_->book1D(str,str,100,0,10); 
00127      str="HB Timing (RPC Trigger)";                     HBTimeRPC = dbe_->book1D(str,str,100,0,10); 
00128      str="HO Timing (RPC Trigger)";                     HOTimeRPC = dbe_->book1D(str,str,100,0,10); 
00129      str="HB Timing (HO SelfTrigger tech bit 11)";      HBTimeHO  = dbe_->book1D(str,str,100,0,10); 
00130      str="HO Timing (HO SelfTrigger tech bit 11)";      HOTimeHO  = dbe_->book1D(str,str,100,0,10); 
00131      
00132      str="HB Timing (GCT Trigger alg bit 15 16 17 18)"; HBTimeGCT  =dbe_->book1D(str,str,100,0,10); 
00133      str="HO Timing (GCT Trigger alg bit 15 16 17 18)"; HOTimeGCT  =dbe_->book1D(str,str,100,0,10); 
00134      
00135      str="HEP Timing (CSC Trigger)";                    HETimeCSCp =dbe_->book1D(str,str,100,0,10); 
00136      str="HEM Timing (CSC Trigger)";                    HETimeCSCm =dbe_->book1D(str,str,100,0,10);
00137      str="HEP Timing (RPCf Trigger)";                   HETimeRPCp =dbe_->book1D(str,str,100,0,10); 
00138      str="HEM Timing (RPCf Trigger)";                   HETimeRPCm =dbe_->book1D(str,str,100,0,10);
00139      str="HFP Timing (CSC Trigger)";                    HFTimeCSCp =dbe_->book1D(str,str,100,0,10); 
00140      str="HFM Timing (CSC Trigger)";                    HFTimeCSCm =dbe_->book1D(str,str,100,0,10);     
00141   }   
00142 } 
00143 
00144 void HcalDetDiagTimingMonitor::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup)
00145 {
00146   if (!IsAllowedCalibType()) return;
00147   if (LumiInOrder(iEvent.luminosityBlock())==false) return;
00148   HcalBaseDQMonitor::analyze(iEvent, iSetup);
00149   
00150   int eta,phi,depth,nTS,BXinEVENT=1,TRIGGER=0;
00151   
00152   if(!dbe_) return;
00153   // We do not want to look at Abort Gap events
00154   edm::Handle<FEDRawDataCollection> rawdata;
00155   iEvent.getByLabel(FEDRawDataCollection_,rawdata);
00156   //checking FEDs for calibration information
00157   if(!rawdata.isValid()) return;
00158   for(int i=FEDNumbering::MINHCALFEDID;i<=FEDNumbering::MAXHCALFEDID; i++) {
00159     const FEDRawData& fedData = rawdata->FEDData(i) ;
00160     if ( fedData.size() < 24 ) continue ;
00161     if(((const HcalDCCHeader*)(fedData.data()))->getCalibType()!=hc_Null) return;
00162   }
00165   bool GCTTrigger1=false,GCTTrigger2=false,GCTTrigger3=false,GCTTrigger4=false,GCTTrigger5=false,HOselfTrigger=false;
00166   // Check GCT trigger bits
00167   edm::Handle< L1GlobalTriggerReadoutRecord > gtRecord;
00168   iEvent.getByLabel(L1ADataLabel_, gtRecord);
00169   if(gtRecord.isValid()){
00170 
00171     const TechnicalTriggerWord tWord = gtRecord->technicalTriggerWord();
00172     const DecisionWord         dWord = gtRecord->decisionWord();
00173     //bool HFselfTrigger   = tWord.at(9);
00174     if (!tWord.empty()) HOselfTrigger    = tWord.at(11);
00175 
00176     if (!dWord.empty()) 
00177       {
00178         GCTTrigger1      = dWord.at(GCTTriggerBit1_);     
00179         GCTTrigger2      = dWord.at(GCTTriggerBit2_);     
00180         GCTTrigger3      = dWord.at(GCTTriggerBit3_);     
00181         GCTTrigger4      = dWord.at(GCTTriggerBit4_);     
00182         GCTTrigger5      = dWord.at(GCTTriggerBit5_);     
00183       }
00184 
00185     // define trigger trigger source (example from GMT group)
00186     edm::Handle<L1MuGMTReadoutCollection> gmtrc_handle; 
00187     iEvent.getByLabel(L1ADataLabel_,gmtrc_handle);
00188     if(!gmtrc_handle.isValid()) return;
00189     L1MuGMTReadoutCollection const* gmtrc = gmtrc_handle.product();
00190    
00191     int idt   =0;
00192     int icsc  =0;
00193     int irpcb =0;
00194     int irpcf =0;
00195     int ndt[5]   = {0,0,0,0,0};
00196     int ncsc[5]  = {0,0,0,0,0};
00197     int nrpcb[5] = {0,0,0,0,0};
00198     int nrpcf[5] = {0,0,0,0,0};
00199     int N;      
00200     std::vector<L1MuGMTReadoutRecord> gmt_records = gmtrc->getRecords();
00201     std::vector<L1MuGMTReadoutRecord>::const_iterator igmtrr;
00202     N=0;
00203     int NN=0;
00204     for(igmtrr=gmt_records.begin(); igmtrr!=gmt_records.end(); igmtrr++) {
00205       if(igmtrr->getBxInEvent()==0) BXinEVENT=NN;
00206       NN++;
00207       std::vector<L1MuRegionalCand>::const_iterator iter1;
00208       std::vector<L1MuRegionalCand> rmc;
00209       // DTBX Trigger
00210       rmc = igmtrr->getDTBXCands(); 
00211       for(iter1=rmc.begin(); iter1!=rmc.end(); iter1++) {
00212         if ( idt < MAXDTBX && !(*iter1).empty() ) {
00213           idt++; 
00214           if(N<5) ndt[N]++; 
00215                                  
00216         }        
00217       }
00218       // CSC Trigger
00219       rmc = igmtrr->getCSCCands(); 
00220       for(iter1=rmc.begin(); iter1!=rmc.end(); iter1++) {
00221         if ( icsc < MAXCSC && !(*iter1).empty() ) {
00222           icsc++; 
00223           if(N<5) ncsc[N]++; 
00224         } 
00225       }
00226       // RPCb Trigger
00227       rmc = igmtrr->getBrlRPCCands();
00228       for(iter1=rmc.begin(); iter1!=rmc.end(); iter1++) {
00229         if ( irpcb < MAXRPC && !(*iter1).empty() ) {
00230           irpcb++;
00231           if(N<5) nrpcb[N]++;
00232                                 
00233         }  
00234       }
00235       // RPCfwd Trigger
00236       rmc = igmtrr->getFwdRPCCands();
00237       for(iter1=rmc.begin(); iter1!=rmc.end(); iter1++) {
00238         if ( irpcf < MAXRPC && !(*iter1).empty() ) {
00239           irpcf++;
00240           if(N<5) nrpcf[N]++;
00241                                 
00242         }  
00243       }
00244                 
00245       N++;
00246     }
00247     if(ncsc[BXinEVENT]>0 ) {   TRIGGER=+TRIG_CSC;  }
00248     if(ndt[BXinEVENT]>0  ) {   TRIGGER=+TRIG_DT;   }
00249     if(nrpcb[BXinEVENT]>0) {   TRIGGER=+TRIG_RPC;  }
00250     if(nrpcf[BXinEVENT]>0) {   TRIGGER=+TRIG_RPCF; }
00251     if(GCTTrigger1 || GCTTrigger2 || GCTTrigger3 || GCTTrigger4 || GCTTrigger5) {  TRIGGER=+TRIG_GCT; }
00252   }
00255   if(ievt_<100){
00256     edm::Handle<HBHEDigiCollection> hbhe; 
00257     iEvent.getByLabel(inputLabelDigi_,hbhe);
00258     if(hbhe.isValid()){   
00259       for(HBHEDigiCollection::const_iterator digi=hbhe->begin();digi!=hbhe->end();digi++){
00260         eta=digi->id().ieta(); phi=digi->id().iphi(); depth=digi->id().depth(); nTS=digi->size();
00261         for(int i=0;i<nTS;i++) if(digi->sample(i).adc()<20) set_hbhe(eta,phi,depth,digi->sample(i).capid(),adc2fC[digi->sample(i).adc()]);
00262       }   
00263     }    
00264     edm::Handle<HODigiCollection> ho; 
00265     iEvent.getByLabel(inputLabelDigi_,ho);
00266     if(ho.isValid()){
00267       for(HODigiCollection::const_iterator digi=ho->begin();digi!=ho->end();digi++){
00268         eta=digi->id().ieta(); phi=digi->id().iphi(); depth=digi->id().depth(); nTS=digi->size();
00269         for(int i=0;i<nTS;i++) if(digi->sample(i).adc()<20) set_ho(eta,phi,depth,digi->sample(i).capid(),adc2fC[digi->sample(i).adc()]);
00270       }   
00271     }
00272     edm::Handle<HFDigiCollection> hf;
00273     iEvent.getByLabel(inputLabelDigi_,hf);
00274     if(hf.isValid()){
00275       for(HFDigiCollection::const_iterator digi=hf->begin();digi!=hf->end();digi++){
00276         eta=digi->id().ieta(); phi=digi->id().iphi(); depth=digi->id().depth(); nTS=digi->size();
00277         for(int i=0;i<nTS;i++) if(digi->sample(i).adc()<20) set_hf(eta,phi,depth,digi->sample(i).capid(),adc2fC[digi->sample(i).adc()]);
00278       }   
00279     }
00280     return;   
00281   }
00284   double data[20];
00285   edm::Handle<HBHEDigiCollection> hbhe; 
00286   iEvent.getByLabel(inputLabelDigi_,hbhe);
00287   if(hbhe.isValid()){ 
00288     for(HBHEDigiCollection::const_iterator digi=hbhe->begin();digi!=hbhe->end();digi++){
00289       eta=digi->id().ieta(); phi=digi->id().iphi(); depth=digi->id().depth(); nTS=digi->size();
00290       for(int i=0;i<nTS;i++) data[i]=adc2fC[digi->sample(i).adc()]-get_ped_hbhe(eta,phi,depth,digi->sample(i).capid());
00291       if(!isSignal(data,nTS)) continue;
00292           
00293       occHBHE[eta+50][phi][depth]+=1.0; occSum+=1.0;
00294       if((occHBHE[eta+50][phi][depth]/(double)(ievt_))>0.001) continue;
00295              
00296       double Time=GetTime(data,nTS);
00297       if(digi->id().subdet()==HcalBarrel){
00298         if(TRIGGER==TRIG_GCT) HBTimeGCT->Fill(Time);
00299         if(CosmicsCorr_) Time+=(7.5*sin((phi*5.0)/180.0*3.14159))/25.0;
00300         if(TRIGGER==TRIG_DT)  HBTimeDT->Fill(Time);
00301         if(HOselfTrigger)     HBTimeHO->Fill(Time);
00302         if(TRIGGER==TRIG_RPC) HBTimeRPC->Fill(Time);
00303       }
00304       if(digi->id().subdet()==HcalEndcap){
00305         if(CosmicsCorr_) Time+=(3.5*sin((phi*5.0)/180.0*3.14159))/25.0; 
00306         if(TRIGGER==TRIG_CSC && eta>0)  HETimeCSCp->Fill(Time);
00307         if(TRIGGER==TRIG_CSC && eta<0)  HETimeCSCm->Fill(Time);  
00308         if(TRIGGER==TRIG_RPCF && eta>0) HETimeRPCp->Fill(Time);
00309         if(TRIGGER==TRIG_RPCF && eta<0) HETimeRPCm->Fill(Time);              
00310       }
00311          
00312     }    
00313   }
00314   edm::Handle<HODigiCollection> ho; 
00315   iEvent.getByLabel(inputLabelDigi_,ho);
00316   if(ho.isValid()){ 
00317     for(HODigiCollection::const_iterator digi=ho->begin();digi!=ho->end();digi++){
00318       eta=digi->id().ieta(); phi=digi->id().iphi(); depth=digi->id().depth(); nTS=digi->size();
00319       for(int i=0;i<nTS;i++) data[i]=adc2fC[digi->sample(i).adc()]-get_ped_ho(eta,phi,depth,digi->sample(i).capid());
00320       if(!isSignal(data,nTS)) continue;
00321       occHO[eta+50][phi][depth]+=1.0;
00322       occSum+=1.0;
00323       if((occHO[eta+50][phi][depth]/(double)(ievt_))>0.001) continue;
00324              
00325       double Time=GetTime(data,nTS);
00326       if(CosmicsCorr_) Time+=(12.0*sin((phi*5.0)/180.0*3.14159))/25.0;  
00327       if(TRIGGER==TRIG_DT)  HOTimeDT ->Fill(Time);
00328       if(HOselfTrigger)     HOTimeHO ->Fill(Time);
00329       if(TRIGGER==TRIG_RPC) HOTimeRPC->Fill(Time);
00330       if(TRIGGER==TRIG_GCT) HOTimeGCT->Fill(Time);
00331     }   
00332   }
00333   edm::Handle<HFDigiCollection> hf; 
00334   iEvent.getByLabel(inputLabelDigi_,hf);
00335   if(hf.isValid()){ 
00336     for(HFDigiCollection::const_iterator digi=hf->begin();digi!=hf->end();digi++){
00337       eta=digi->id().ieta(); phi=digi->id().iphi(); depth=digi->id().depth(); nTS=digi->size();
00338       double energy=0;
00339       for(int i=0;i<nTS;i++){
00340         data[i]=adc2fC[digi->sample(i).adc()]-get_ped_hf(eta,phi,depth,digi->sample(i).capid());
00341         energy+=data[i]; 
00342       }
00343             
00344       if(energy<25.0) continue;
00345       occHF[eta+50][phi][depth]+=1.0;
00346       occSum+=1.0;
00347             
00348       double Time=GetTime(data,nTS);
00349       if((occHF[eta+50][phi][depth]/(double)(ievt_))>0.01) continue;
00350             
00351       if(TRIGGER==TRIG_CSC && eta>0) HFTimeCSCp->Fill(Time); 
00352       if(TRIGGER==TRIG_CSC && eta<0) HFTimeCSCm->Fill(Time); 
00353     }   
00354   }
00355   if((ievt_%500)==0){
00356     CheckTiming();
00357     //printf("Run: %i, Evants processed: %i\n",iEvent.run(),ievt_);       
00358   }
00359 }
00360 
00361 void HcalDetDiagTimingMonitor::CheckTiming(){
00362   if(HBTimeDT->getEntries()>10){
00363     Summary->setBinContent(1,1,1); 
00364   }
00365   if(HBTimeRPC->getEntries()>10){
00366     Summary->setBinContent(2,1,1); 
00367   } 
00368   if(HBTimeGCT->getEntries()>10){
00369     Summary->setBinContent(3,1,1); 
00370   } 
00371   if(HBTimeHO->getEntries()>10){
00372     Summary->setBinContent(6,1,1); 
00373   } 
00374   if(HOTimeDT->getEntries()>10){
00375     Summary->setBinContent(1,2,1); 
00376   }
00377   if(HOTimeRPC->getEntries()>10){
00378     Summary->setBinContent(2,2,1); 
00379   } 
00380   if(HOTimeGCT->getEntries()>10){
00381     Summary->setBinContent(3,2,1); 
00382   } 
00383   if(HOTimeHO->getEntries()>10){
00384     Summary->setBinContent(6,2,1); 
00385   } 
00386   if(HETimeCSCp->getEntries()>10){
00387     Summary->setBinContent(4,4,1); 
00388   } 
00389   if(HETimeCSCm->getEntries()>10){
00390     Summary->setBinContent(4,3,1); 
00391   } 
00392   if(HETimeRPCp->getEntries()>10){
00393     Summary->setBinContent(5,4,1); 
00394   } 
00395   if(HETimeRPCm->getEntries()>10){
00396     Summary->setBinContent(5,3,1); 
00397   } 
00398   if(HFTimeCSCp->getEntries()>10){
00399     Summary->setBinContent(4,6,1); 
00400   } 
00401   if(HFTimeCSCm->getEntries()>10){
00402     Summary->setBinContent(4,4,1); 
00403   } 
00404 }
00405 
00406 void HcalDetDiagTimingMonitor::done(){   } 
00407 DEFINE_FWK_MODULE (HcalDetDiagTimingMonitor);