00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "FWCore/Framework/interface/Frameworkfwd.h"
00012 #include "FWCore/Framework/interface/MakerMacros.h"
00013
00014 #include "DataFormats/EcalRawData/interface/EcalRawDataCollections.h"
00015 #include "DataFormats/EcalDetId/interface/EBDetId.h"
00016 #include "DataFormats/EcalDigi/interface/EBDataFrame.h"
00017 #include "DataFormats/EcalDigi/interface/EcalDigiCollections.h"
00018 #include "DataFormats/EcalRecHit/interface/EcalRecHitCollections.h"
00019
00020 #include "DQMServices/Core/interface/MonitorElement.h"
00021
00022 #include "FWCore/ServiceRegistry/interface/Service.h"
00023 #include "DQMServices/Core/interface/DQMStore.h"
00024
00025 #include <DQM/EcalCommon/interface/Numbers.h>
00026
00027 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00028
00029 #include <memory>
00030 #include <iostream>
00031 #include <fstream>
00032 #include <vector>
00033
00034 #include <DQM/EcalBarrelMonitorModule/interface/EcalBarrelMonitorModule.h>
00035
00036 using namespace cms;
00037 using namespace edm;
00038 using namespace std;
00039
00040 EcalBarrelMonitorModule::EcalBarrelMonitorModule(const ParameterSet& ps){
00041
00042
00043 verbose_ = ps.getUntrackedParameter<bool>("verbose", false);
00044
00045 if ( verbose_ ) {
00046 cout << endl;
00047 cout << " *** Ecal Barrel Generic Monitor ***" << endl;
00048 cout << endl;
00049 }
00050
00051 init_ = false;
00052
00053 EcalRawDataCollection_ = ps.getParameter<edm::InputTag>("EcalRawDataCollection");
00054 EBDigiCollection_ = ps.getParameter<edm::InputTag>("EBDigiCollection");
00055 EcalRecHitCollection_ = ps.getParameter<edm::InputTag>("EcalRecHitCollection");
00056 EcalTrigPrimDigiCollection_ = ps.getParameter<edm::InputTag>("EcalTrigPrimDigiCollection");
00057
00058
00059 runNumber_ = ps.getUntrackedParameter<int>("runNumber", 0);
00060
00061 fixedRunNumber_ = false;
00062 if ( runNumber_ != 0 ) fixedRunNumber_ = true;
00063
00064 if ( fixedRunNumber_ ) {
00065 LogInfo("EcalBarrelMonitorModule") << " using fixed Run Number = " << runNumber_ << endl;
00066 }
00067
00068
00069 evtNumber_ = 0;
00070
00071
00072 runType_ = ps.getUntrackedParameter<int>("runType", -1);
00073 evtType_ = runType_;
00074
00075 fixedRunType_ = false;
00076 if ( runType_ != -1 ) fixedRunType_ = true;
00077
00078 if ( fixedRunType_) {
00079 LogInfo("EcalBarrelMonitorModule") << " using fixed Run Type = " << runType_ << endl;
00080 }
00081
00082
00083 debug_ = ps.getUntrackedParameter<bool>("debug", false);
00084
00085 if ( debug_ ) {
00086 LogInfo("EcalBarrelMonitorModule") << " debug switch is ON";
00087 } else {
00088 LogInfo("EcalBarrelMonitorModule") << " debug switch is OFF";
00089 }
00090
00091
00092 prefixME_ = ps.getUntrackedParameter<string>("prefixME", "");
00093
00094
00095 enableCleanup_ = ps.getUntrackedParameter<bool>("enableCleanup", false);
00096
00097
00098 mergeRuns_ = ps.getUntrackedParameter<bool>("mergeRuns", false);
00099
00100 if ( enableCleanup_ ) {
00101 LogInfo("EcalBarrelMonitorModule") << " enableCleanup switch is ON";
00102 } else {
00103 LogInfo("EcalBarrelMonitorModule") << " enableCleanup switch is OFF";
00104 }
00105
00106
00107 enableEventDisplay_ = ps.getUntrackedParameter<bool>("enableEventDisplay", false);
00108
00109 meStatus_ = 0;
00110 meRun_ = 0;
00111 meEvt_ = 0;
00112 meRunType_ = 0;
00113 meEvtType_ = 0;
00114
00115 meEBDCC_ = 0;
00116
00117 for (int i = 0; i < 2; i++) {
00118 meEBdigis_[i] = 0;
00119 meEBhits_[i] = 0;
00120 meEBtpdigis_[i] = 0;
00121 }
00122
00123 for (int i = 0; i < 36; i++) {
00124 meEvent_[i] = 0;
00125 }
00126
00127 }
00128
00129 EcalBarrelMonitorModule::~EcalBarrelMonitorModule(){
00130
00131 }
00132
00133 void EcalBarrelMonitorModule::beginJob(const EventSetup& c){
00134
00135 if ( debug_ ) cout << "EcalBarrelMonitorModule: beginJob" << endl;
00136
00137 ievt_ = 0;
00138
00139 dqmStore_ = Service<DQMStore>().operator->();
00140
00141 if ( dqmStore_ ) {
00142 dqmStore_->setCurrentFolder(prefixME_ + "/EcalInfo");
00143 dqmStore_->rmdir(prefixME_ + "/EcalInfo");
00144 if ( enableEventDisplay_ ) {
00145 dqmStore_->setCurrentFolder(prefixME_ + "/EcalEvent");
00146 dqmStore_->rmdir(prefixME_ + "/EcalEvent");
00147 }
00148 }
00149
00150 }
00151
00152 void EcalBarrelMonitorModule::beginRun(const Run& r, const EventSetup& c) {
00153
00154 if ( debug_ ) cout << "EcalBarrelMonitorModule: beginRun" << endl;
00155
00156 if ( ! mergeRuns_ ) this->reset();
00157
00158 }
00159
00160 void EcalBarrelMonitorModule::endRun(const Run& r, const EventSetup& c) {
00161
00162 if ( debug_ ) cout << "EcalBarrelMonitorModule: endRun" << endl;
00163
00164 }
00165
00166 void EcalBarrelMonitorModule::reset(void) {
00167
00168 if ( meEvtType_ ) meEvtType_->Reset();
00169
00170 if ( meEBDCC_ ) meEBDCC_->Reset();
00171
00172 for (int i = 0; i < 2; i++) {
00173 if ( meEBdigis_[i] ) meEBdigis_[i]->Reset();
00174
00175 if ( meEBhits_[i] ) meEBdigis_[i]->Reset();
00176
00177 if ( meEBtpdigis_[i] ) meEBtpdigis_[i]->Reset();
00178 }
00179
00180 if ( enableEventDisplay_ ) {
00181 for (int i = 0; i < 18; i++) {
00182 if ( meEvent_[i] ) meEvent_[i]->Reset();
00183 }
00184 }
00185
00186 }
00187
00188 void EcalBarrelMonitorModule::setup(void){
00189
00190 init_ = true;
00191
00192 if ( dqmStore_ ) {
00193 dqmStore_->setCurrentFolder(prefixME_ + "/EcalInfo");
00194
00195 meStatus_ = dqmStore_->bookInt("STATUS");
00196
00197 meRun_ = dqmStore_->bookInt("RUN");
00198 meEvt_ = dqmStore_->bookInt("EVT");
00199
00200 meRunType_ = dqmStore_->bookInt("RUNTYPE");
00201 meEvtType_ = dqmStore_->book1D("EVTTYPE", "EVTTYPE", 31, -1., 30.);
00202 meEvtType_->setBinLabel(1, "UNKNOWN", 1);
00203 meEvtType_->setBinLabel(2+EcalDCCHeaderBlock::COSMIC, "COSMIC", 1);
00204 meEvtType_->setBinLabel(2+EcalDCCHeaderBlock::BEAMH4, "BEAMH4", 1);
00205 meEvtType_->setBinLabel(2+EcalDCCHeaderBlock::BEAMH2, "BEAMH2", 1);
00206 meEvtType_->setBinLabel(2+EcalDCCHeaderBlock::MTCC, "MTCC", 1);
00207 meEvtType_->setBinLabel(2+EcalDCCHeaderBlock::LASER_STD, "LASER_STD", 1);
00208 meEvtType_->setBinLabel(2+EcalDCCHeaderBlock::LASER_POWER_SCAN, "LASER_POWER_SCAN", 1);
00209 meEvtType_->setBinLabel(2+EcalDCCHeaderBlock::LASER_DELAY_SCAN, "LASER_DELAY_SCAN", 1);
00210 meEvtType_->setBinLabel(2+EcalDCCHeaderBlock::TESTPULSE_SCAN_MEM, "TESTPULSE_SCAN_MEM", 1);
00211 meEvtType_->setBinLabel(2+EcalDCCHeaderBlock::TESTPULSE_MGPA, "TESTPULSE_MGPA", 1);
00212 meEvtType_->setBinLabel(2+EcalDCCHeaderBlock::PEDESTAL_STD, "PEDESTAL_STD", 1);
00213 meEvtType_->setBinLabel(2+EcalDCCHeaderBlock::PEDESTAL_OFFSET_SCAN, "PEDESTAL_OFFSET_SCAN", 1);
00214 meEvtType_->setBinLabel(2+EcalDCCHeaderBlock::PEDESTAL_25NS_SCAN, "PEDESTAL_25NS_SCAN", 1);
00215 meEvtType_->setBinLabel(2+EcalDCCHeaderBlock::LED_STD, "LED_STD", 1);
00216 meEvtType_->setBinLabel(2+EcalDCCHeaderBlock::PHYSICS_GLOBAL, "PHYSICS_GLOBAL", 1);
00217 meEvtType_->setBinLabel(2+EcalDCCHeaderBlock::COSMICS_GLOBAL, "COSMICS_GLOBAL", 1);
00218 meEvtType_->setBinLabel(2+EcalDCCHeaderBlock::HALO_GLOBAL, "HALO_GLOBAL", 1);
00219 meEvtType_->setBinLabel(2+EcalDCCHeaderBlock::LASER_GAP, "LASER_GAP", 1);
00220 meEvtType_->setBinLabel(2+EcalDCCHeaderBlock::TESTPULSE_GAP, "TESTPULSE_GAP");
00221 meEvtType_->setBinLabel(2+EcalDCCHeaderBlock::PEDESTAL_GAP, "PEDESTAL_GAP");
00222 meEvtType_->setBinLabel(2+EcalDCCHeaderBlock::LED_GAP, "LED_GAP", 1);
00223 meEvtType_->setBinLabel(2+EcalDCCHeaderBlock::PHYSICS_LOCAL, "PHYSICS_LOCAL", 1);
00224 meEvtType_->setBinLabel(2+EcalDCCHeaderBlock::COSMICS_LOCAL, "COSMICS_LOCAL", 1);
00225 meEvtType_->setBinLabel(2+EcalDCCHeaderBlock::HALO_LOCAL, "HALO_LOCAL", 1);
00226 }
00227
00228
00229 if ( meStatus_ ) meStatus_->Fill(-1);
00230
00231 if ( meRun_ ) meRun_->Fill(-1);
00232 if ( meEvt_ ) meEvt_->Fill(-1);
00233
00234 if ( meRunType_ ) meRunType_->Fill(-1);
00235
00236 char histo[20];
00237
00238 if ( dqmStore_ ) {
00239 dqmStore_->setCurrentFolder(prefixME_ + "/EcalInfo");
00240
00241 meEBDCC_ = dqmStore_->book1D("EBMM DCC", "EBMM DCC", 36, 1, 37.);
00242 for (int i = 0; i < 36; i++) {
00243 meEBDCC_->setBinLabel(i+1, Numbers::sEB(i+1).c_str(), 1);
00244 }
00245
00246 meEBdigis_[0] = dqmStore_->book1D("EBMM digi number", "EBMM digi number", 100, 0., 61201.);
00247
00248 meEBdigis_[1] = dqmStore_->bookProfile("EBMM digi number profile", "EBMM digi number profile", 36, 1, 37., 1700, 0., 1701., "s");
00249 for (int i = 0; i < 36; i++) {
00250 meEBdigis_[1]->setBinLabel(i+1, Numbers::sEB(i+1).c_str(), 1);
00251 }
00252
00253 meEBhits_[0] = dqmStore_->book1D("EBMM hit number", "EBMM hit number", 100, 0., 61201.);
00254
00255 meEBhits_[1] = dqmStore_->bookProfile("EBMM hit number profile", "EBMM hit number profile", 36, 1, 37., 1700, 0., 1701., "s");
00256 for (int i = 0; i < 36; i++) {
00257 meEBhits_[1]->setBinLabel(i+1, Numbers::sEB(i+1).c_str(), 1);
00258 }
00259
00260 meEBtpdigis_[0] = dqmStore_->book1D("EBMM TP digi number", "EBMM TP digi number", 100, 0., 2449.);
00261
00262 meEBtpdigis_[1] = dqmStore_->bookProfile("EBMM TP digi number profile", "EBMM TP digi number profile", 36, 1, 37., 68, 0., 69., "s");
00263 for (int i = 0; i < 36; i++) {
00264 meEBtpdigis_[1]->setBinLabel(i+1, Numbers::sEB(i+1).c_str(), 1);
00265 }
00266
00267 if ( enableEventDisplay_ ) {
00268 dqmStore_->setCurrentFolder(prefixME_ + "/EcalEvent");
00269 for (int i = 0; i < 36; i++) {
00270 sprintf(histo, "EBMM event %s", Numbers::sEB(i+1).c_str());
00271 meEvent_[i] = dqmStore_->book2D(histo, histo, 85, 0., 85., 20, 0., 20.);
00272 meEvent_[i]->setAxisTitle("ieta", 1);
00273 meEvent_[i]->setAxisTitle("iphi", 2);
00274 dqmStore_->tag(meEvent_[i], i+1);
00275 if ( meEvent_[i] ) meEvent_[i]->setResetMe(true);
00276 }
00277 }
00278
00279 }
00280
00281 }
00282
00283 void EcalBarrelMonitorModule::cleanup(void){
00284
00285 if ( ! enableCleanup_ ) return;
00286
00287 if ( dqmStore_ ) {
00288
00289 dqmStore_->setCurrentFolder(prefixME_ + "/EcalInfo");
00290
00291 if ( meStatus_ ) dqmStore_->removeElement( meStatus_->getName() );
00292 meStatus_ = 0;
00293
00294 if ( meRun_ ) dqmStore_->removeElement( meRun_->getName() );
00295 meRun_ = 0;
00296
00297 if ( meEvt_ ) dqmStore_->removeElement( meEvt_->getName() );
00298 meEvt_ = 0;
00299
00300 if ( meRunType_ ) dqmStore_->removeElement( meRunType_->getName() );
00301 meRunType_ = 0;
00302
00303 if ( meEvtType_ ) dqmStore_->removeElement( meEvtType_->getName() );
00304 meEvtType_ = 0;
00305
00306 if ( meEBDCC_ ) dqmStore_->removeElement( meEBDCC_->getName() );
00307 meEBDCC_ = 0;
00308
00309 for (int i = 0; i < 2; i++) {
00310
00311 if ( meEBdigis_[i] ) dqmStore_->removeElement( meEBdigis_[i]->getName() );
00312 meEBdigis_[i] = 0;
00313
00314 if ( meEBhits_[i] ) dqmStore_->removeElement( meEBhits_[i]->getName() );
00315 meEBhits_[i] = 0;
00316
00317 if ( meEBtpdigis_[i] ) dqmStore_->removeElement( meEBtpdigis_[i]->getName() );
00318 meEBtpdigis_[i] = 0;
00319
00320 }
00321
00322 if ( enableEventDisplay_ ) {
00323
00324 dqmStore_->setCurrentFolder(prefixME_ + "/EcalEvent");
00325
00326 for (int i = 0; i < 36; i++) {
00327
00328 if ( meEvent_[i] ) dqmStore_->removeElement( meEvent_[i]->getName() );
00329 meEvent_[i] = 0;
00330
00331 }
00332
00333 }
00334
00335 }
00336
00337 init_ = false;
00338
00339 }
00340
00341 void EcalBarrelMonitorModule::endJob(void) {
00342
00343 if ( debug_ ) cout << "EcalBarrelMonitorModule: endJob, ievt = " << ievt_ << endl;
00344
00345
00346 if ( meStatus_ ) meStatus_->Fill(2);
00347
00348 if ( meRun_ ) meRun_->Fill(runNumber_);
00349 if ( meEvt_ ) meEvt_->Fill(evtNumber_);
00350
00351 if ( init_ ) this->cleanup();
00352
00353 }
00354
00355 void EcalBarrelMonitorModule::analyze(const Event& e, const EventSetup& c){
00356
00357 Numbers::initGeometry(c, verbose_);
00358
00359 if ( ! init_ ) this->setup();
00360
00361 ievt_++;
00362
00363 LogInfo("EcalBarrelMonitorModule") << "processing event " << ievt_;
00364
00365 if ( ! fixedRunNumber_ ) runNumber_ = e.id().run();
00366
00367 evtNumber_ = e.id().event();
00368
00369 Handle<EcalRawDataCollection> dcchs;
00370
00371 if ( e.getByLabel(EcalRawDataCollection_, dcchs) ) {
00372
00373 if ( dcchs->size() == 0 ) {
00374 LogWarning("EcalBarrelMonitorModule") << EcalRawDataCollection_ << " is empty";
00375 return;
00376 }
00377
00378 int nebc = 0;
00379
00380 for ( EcalRawDataCollection::const_iterator dcchItr = dcchs->begin(); dcchItr != dcchs->end(); ++dcchItr ) {
00381
00382 if ( Numbers::subDet( *dcchItr ) != EcalBarrel ) continue;
00383
00384 nebc++;
00385
00386 if ( meEBDCC_ ) meEBDCC_->Fill(Numbers::iSM( *dcchItr, EcalBarrel )+0.5);
00387
00388 if ( ! fixedRunNumber_ ) {
00389 runNumber_ = dcchItr->getRunNumber();
00390 }
00391
00392 evtNumber_ = dcchItr->getLV1();
00393
00394 if ( ! fixedRunType_ ) {
00395 runType_ = dcchItr->getRunType();
00396 evtType_ = runType_;
00397 }
00398
00399 if ( evtType_ < 0 || evtType_ > 22 ) evtType_ = -1;
00400 if ( meEvtType_ ) meEvtType_->Fill(evtType_+0.5, 1./36.);
00401
00402 }
00403
00404 LogDebug("EcalBarrelMonitorModule") << "event: " << ievt_ << " DCC headers collection size: " << nebc;
00405
00406 } else {
00407
00408 if ( evtType_ < 0 || evtType_ > 22 ) evtType_ = -1;
00409 if ( meEvtType_ ) meEvtType_->Fill(evtType_+0.5, 1./36.);
00410
00411 LogWarning("EcalBarrelMonitorModule") << EcalRawDataCollection_ << " not available";
00412
00413 }
00414
00415 if ( meRunType_ ) meRunType_->Fill(runType_);
00416
00417 if ( ievt_ == 1 ) {
00418 LogInfo("EcalBarrelMonitorModule") << "processing run " << runNumber_;
00419
00420 if ( meStatus_ ) meStatus_->Fill(0);
00421 } else {
00422
00423 if ( meStatus_ ) meStatus_->Fill(1);
00424 }
00425
00426 if ( meRun_ ) meRun_->Fill(runNumber_);
00427 if ( meEvt_ ) meEvt_->Fill(evtNumber_);
00428
00429 Handle<EBDigiCollection> digis;
00430
00431 if ( e.getByLabel(EBDigiCollection_, digis) ) {
00432
00433 int counter[36] = { 0 };
00434
00435 int nebd = digis->size();
00436 LogDebug("EcalBarrelMonitorModule") << "event " << ievt_ << " digi collection size " << nebd;
00437
00438 if ( meEBdigis_[0] ) meEBdigis_[0]->Fill(float(nebd));
00439
00440 for ( EBDigiCollection::const_iterator digiItr = digis->begin(); digiItr != digis->end(); ++digiItr ) {
00441
00442 EBDataFrame dataframe = (*digiItr);
00443 EBDetId id = dataframe.id();
00444
00445 int ic = id.ic();
00446 int ie = (ic-1)/20 + 1;
00447 int ip = (ic-1)%20 + 1;
00448
00449 int ism = Numbers::iSM( id );
00450
00451 counter[ism-1]++;
00452
00453 LogDebug("EcalBarrelMonitorModule") << " det id = " << id;
00454 LogDebug("EcalBarrelMonitorModule") << " sm, ieta, iphi " << ism << " " << ie << " " << ip;
00455
00456 }
00457
00458 for (int i = 0; i < 36; i++) {
00459
00460 if ( meEBdigis_[1] ) meEBdigis_[1]->Fill(i+1+0.5, counter[i]);
00461
00462 }
00463
00464 } else {
00465
00466 LogWarning("EcalBarrelMonitorModule") << EBDigiCollection_ << " not available";
00467
00468 }
00469
00470 Handle<EcalRecHitCollection> hits;
00471
00472 if ( e.getByLabel(EcalRecHitCollection_, hits) ) {
00473
00474 int nebh = hits->size();
00475 LogDebug("EcalBarrelMonitorModule") << "event " << ievt_ << " hits collection size " << nebh;
00476
00477 if ( meEBhits_[0] ) meEBhits_[0]->Fill(float(nebh));
00478
00479 int counter[36] = { 0 };
00480
00481 for ( EcalRecHitCollection::const_iterator hitItr = hits->begin(); hitItr != hits->end(); ++hitItr ) {
00482
00483 EcalRecHit hit = (*hitItr);
00484 EBDetId id = hit.id();
00485
00486 int ic = id.ic();
00487 int ie = (ic-1)/20 + 1;
00488 int ip = (ic-1)%20 + 1;
00489
00490 int ism = Numbers::iSM( id );
00491
00492 counter[ism-1]++;
00493
00494 float xie = ie - 0.5;
00495 float xip = ip - 0.5;
00496
00497 LogDebug("EcalBarrelMonitorModule") << " det id = " << id;
00498 LogDebug("EcalBarrelMonitorModule") << " sm, ieta, iphi " << ism << " " << ie << " " << ip;
00499
00500 float xval = hit.energy();
00501
00502 LogDebug("EcalBarrelMonitorModule") << " hit energy " << xval;
00503
00504 if ( enableEventDisplay_ ) {
00505
00506 if ( xval >= 10 ) {
00507 if ( meEvent_[ism-1] ) meEvent_[ism-1]->Fill(xie, xip, xval);
00508 }
00509
00510 }
00511
00512 }
00513
00514 for (int i = 0; i < 36; i++) {
00515
00516 if ( meEBhits_[1] ) meEBhits_[1]->Fill(i+1+0.5, counter[i]);
00517
00518 }
00519
00520 } else {
00521
00522 LogWarning("EcalBarrelMonitorModule") << EcalRecHitCollection_ << " not available";
00523
00524 }
00525
00526 Handle<EcalTrigPrimDigiCollection> tpdigis;
00527
00528 if ( e.getByLabel(EcalTrigPrimDigiCollection_, tpdigis) ) {
00529
00530 int nebtpd = 0;
00531 int counter[36] = { 0 };
00532
00533 for ( EcalTrigPrimDigiCollection::const_iterator tpdigiItr = tpdigis->begin();
00534 tpdigiItr != tpdigis->end(); ++tpdigiItr ) {
00535
00536 EcalTriggerPrimitiveDigi data = (*tpdigiItr);
00537 EcalTrigTowerDetId idt = data.id();
00538
00539 if ( Numbers::subDet( idt ) != EcalBarrel ) continue;
00540
00541 int ismt = Numbers::iSM( idt );
00542
00543 nebtpd++;
00544 counter[ismt-1]++;
00545
00546 }
00547
00548 LogDebug("EcalBarrelMonitorModule") << "event " << ievt_ << " TP digi collection size " << nebtpd;
00549 if ( meEBtpdigis_[0] ) meEBtpdigis_[0]->Fill(float(nebtpd));
00550
00551 for (int i = 0; i < 36; i++) {
00552
00553 if ( meEBtpdigis_[1] ) meEBtpdigis_[1]->Fill(i+1+0.5, counter[i]);
00554
00555 }
00556
00557 } else {
00558
00559 LogWarning("EcalBarrelMonitorModule") << EcalTrigPrimDigiCollection_ << " not available";
00560
00561 }
00562
00563 }
00564