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
00012 #include "DataFormats/HcalDigi/interface/HcalDigiCollections.h"
00013
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();
00092 if (mergeRuns_==false)
00093 this->reset();
00094
00095 return;
00096
00097 }
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
00154 edm::Handle<FEDRawDataCollection> rawdata;
00155 iEvent.getByLabel(FEDRawDataCollection_,rawdata);
00156
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
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
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
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
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
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
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
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
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);