00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include <iostream>
00012 #include <fstream>
00013 #include <vector>
00014
00015 #include "FWCore/ServiceRegistry/interface/Service.h"
00016 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00017
00018 #include "DQMServices/Core/interface/MonitorElement.h"
00019
00020 #include "DQMServices/Core/interface/DQMStore.h"
00021
00022 #include "DataFormats/EcalRawData/interface/EcalRawDataCollections.h"
00023 #include "DataFormats/EcalDetId/interface/EBDetId.h"
00024 #include "DataFormats/EcalDigi/interface/EBDataFrame.h"
00025 #include "DataFormats/EcalDigi/interface/EcalDigiCollections.h"
00026 #include "DataFormats/EcalRecHit/interface/EcalUncalibratedRecHit.h"
00027 #include "DataFormats/EcalRecHit/interface/EcalRecHitCollections.h"
00028
00029 #include <DQM/EcalCommon/interface/Numbers.h>
00030
00031 #include <DQM/EcalBarrelMonitorTasks/interface/EBTestPulseTask.h>
00032
00033 using namespace cms;
00034 using namespace edm;
00035 using namespace std;
00036
00037 EBTestPulseTask::EBTestPulseTask(const ParameterSet& ps){
00038
00039 init_ = false;
00040
00041 dqmStore_ = Service<DQMStore>().operator->();
00042
00043 prefixME_ = ps.getUntrackedParameter<string>("prefixME", "");
00044
00045 enableCleanup_ = ps.getUntrackedParameter<bool>("enableCleanup", false);
00046
00047 mergeRuns_ = ps.getUntrackedParameter<bool>("mergeRuns", false);
00048
00049 EcalRawDataCollection_ = ps.getParameter<edm::InputTag>("EcalRawDataCollection");
00050 EBDigiCollection_ = ps.getParameter<edm::InputTag>("EBDigiCollection");
00051 EcalPnDiodeDigiCollection_ = ps.getParameter<edm::InputTag>("EcalPnDiodeDigiCollection");
00052 EcalUncalibratedRecHitCollection_ = ps.getParameter<edm::InputTag>("EcalUncalibratedRecHitCollection");
00053
00054 for (int i = 0; i < 36; i++) {
00055 meShapeMapG01_[i] = 0;
00056 meAmplMapG01_[i] = 0;
00057 meShapeMapG06_[i] = 0;
00058 meAmplMapG06_[i] = 0;
00059 meShapeMapG12_[i] = 0;
00060 meAmplMapG12_[i] = 0;
00061 mePnAmplMapG01_[i] = 0;
00062 mePnPedMapG01_[i] = 0;
00063 mePnAmplMapG16_[i] = 0;
00064 mePnPedMapG16_[i] = 0;
00065 }
00066
00067
00068 }
00069
00070 EBTestPulseTask::~EBTestPulseTask(){
00071
00072 }
00073
00074 void EBTestPulseTask::beginJob(const EventSetup& c){
00075
00076 ievt_ = 0;
00077
00078 if ( dqmStore_ ) {
00079 dqmStore_->setCurrentFolder(prefixME_ + "/EBTestPulseTask");
00080 dqmStore_->rmdir(prefixME_ + "/EBTestPulseTask");
00081 }
00082
00083 Numbers::initGeometry(c, false);
00084
00085 }
00086
00087 void EBTestPulseTask::beginRun(const Run& r, const EventSetup& c) {
00088
00089 if ( ! mergeRuns_ ) this->reset();
00090
00091 }
00092
00093 void EBTestPulseTask::endRun(const Run& r, const EventSetup& c) {
00094
00095 }
00096
00097 void EBTestPulseTask::reset(void) {
00098
00099 for (int i = 0; i < 36; i++) {
00100 if ( meShapeMapG01_[i] ) meShapeMapG01_[i]->Reset();
00101 if ( meAmplMapG01_[i] ) meAmplMapG01_[i]->Reset();
00102 if ( meShapeMapG06_[i] ) meShapeMapG06_[i]->Reset();
00103 if ( meAmplMapG06_[i] ) meAmplMapG06_[i]->Reset();
00104 if ( meShapeMapG12_[i] ) meShapeMapG12_[i]->Reset();
00105 if ( meAmplMapG12_[i] ) meAmplMapG12_[i]->Reset();
00106 if ( mePnAmplMapG01_[i] ) mePnAmplMapG01_[i]->Reset();
00107 if ( mePnPedMapG01_[i] ) mePnPedMapG01_[i]->Reset();
00108 if ( mePnAmplMapG16_[i] ) mePnAmplMapG16_[i]->Reset();
00109 if ( mePnPedMapG16_[i] ) mePnPedMapG16_[i]->Reset();
00110 }
00111
00112 }
00113
00114 void EBTestPulseTask::setup(void){
00115
00116 init_ = true;
00117
00118 char histo[200];
00119
00120 if ( dqmStore_ ) {
00121 dqmStore_->setCurrentFolder(prefixME_ + "/EBTestPulseTask");
00122
00123 dqmStore_->setCurrentFolder(prefixME_ + "/EBTestPulseTask/Gain01");
00124 for (int i = 0; i < 36; i++) {
00125 sprintf(histo, "EBTPT shape %s G01", Numbers::sEB(i+1).c_str());
00126 meShapeMapG01_[i] = dqmStore_->bookProfile2D(histo, histo, 1700, 0., 1700., 10, 0., 10., 4096, 0., 4096., "s");
00127 meShapeMapG01_[i]->setAxisTitle("channel", 1);
00128 meShapeMapG01_[i]->setAxisTitle("sample", 2);
00129 meShapeMapG01_[i]->setAxisTitle("amplitude", 3);
00130 dqmStore_->tag(meShapeMapG01_[i], i+1);
00131 sprintf(histo, "EBTPT amplitude %s G01", Numbers::sEB(i+1).c_str());
00132 meAmplMapG01_[i] = dqmStore_->bookProfile2D(histo, histo, 85, 0., 85., 20, 0., 20., 4096, 0., 4096.*12., "s");
00133 meAmplMapG01_[i]->setAxisTitle("ieta", 1);
00134 meAmplMapG01_[i]->setAxisTitle("iphi", 2);
00135 dqmStore_->tag(meAmplMapG01_[i], i+1);
00136 }
00137
00138 dqmStore_->setCurrentFolder(prefixME_ + "/EBTestPulseTask/Gain06");
00139 for (int i = 0; i < 36; i++) {
00140 sprintf(histo, "EBTPT shape %s G06", Numbers::sEB(i+1).c_str());
00141 meShapeMapG06_[i] = dqmStore_->bookProfile2D(histo, histo, 1700, 0., 1700., 10, 0., 10., 4096, 0., 4096., "s");
00142 meShapeMapG06_[i]->setAxisTitle("channel", 1);
00143 meShapeMapG06_[i]->setAxisTitle("sample", 2);
00144 meShapeMapG06_[i]->setAxisTitle("amplitude", 3);
00145 dqmStore_->tag(meShapeMapG06_[i], i+1);
00146 sprintf(histo, "EBTPT amplitude %s G06", Numbers::sEB(i+1).c_str());
00147 meAmplMapG06_[i] = dqmStore_->bookProfile2D(histo, histo, 85, 0., 85., 20, 0., 20., 4096, 0., 4096.*12., "s");
00148 meAmplMapG06_[i]->setAxisTitle("ieta", 1);
00149 meAmplMapG06_[i]->setAxisTitle("iphi", 2);
00150 dqmStore_->tag(meAmplMapG06_[i], i+1);
00151 }
00152
00153 dqmStore_->setCurrentFolder(prefixME_ + "/EBTestPulseTask/Gain12");
00154 for (int i = 0; i < 36; i++) {
00155 sprintf(histo, "EBTPT shape %s G12", Numbers::sEB(i+1).c_str());
00156 meShapeMapG12_[i] = dqmStore_->bookProfile2D(histo, histo, 1700, 0., 1700., 10, 0., 10., 4096, 0., 4096., "s");
00157 meShapeMapG12_[i]->setAxisTitle("channel", 1);
00158 meShapeMapG12_[i]->setAxisTitle("sample", 2);
00159 meShapeMapG12_[i]->setAxisTitle("amplitude", 3);
00160 dqmStore_->tag(meShapeMapG12_[i], i+1);
00161 sprintf(histo, "EBTPT amplitude %s G12", Numbers::sEB(i+1).c_str());
00162 meAmplMapG12_[i] = dqmStore_->bookProfile2D(histo, histo, 85, 0., 85., 20, 0., 20., 4096, 0., 4096.*12., "s");
00163 meAmplMapG12_[i]->setAxisTitle("ieta", 1);
00164 meAmplMapG12_[i]->setAxisTitle("iphi", 2);
00165 dqmStore_->tag(meAmplMapG12_[i], i+1);
00166 }
00167
00168 dqmStore_->setCurrentFolder(prefixME_ + "/EBTestPulseTask/PN");
00169
00170 dqmStore_->setCurrentFolder(prefixME_ + "/EBTestPulseTask/PN/Gain01");
00171 for (int i = 0; i < 36; i++) {
00172 sprintf(histo, "EBPDT PNs amplitude %s G01", Numbers::sEB(i+1).c_str());
00173 mePnAmplMapG01_[i] = dqmStore_->bookProfile(histo, histo, 10, 0., 10., 4096, 0., 4096., "s");
00174 mePnAmplMapG01_[i]->setAxisTitle("channel", 1);
00175 mePnAmplMapG01_[i]->setAxisTitle("amplitude", 2);
00176 dqmStore_->tag(mePnAmplMapG01_[i], i+1);
00177 sprintf(histo, "EBPDT PNs pedestal %s G01", Numbers::sEB(i+1).c_str());
00178 mePnPedMapG01_[i] = dqmStore_->bookProfile(histo, histo, 10, 0., 10., 4096, 0., 4096., "s");
00179 mePnPedMapG01_[i]->setAxisTitle("channel", 1);
00180 mePnPedMapG01_[i]->setAxisTitle("pedestal", 2);
00181 dqmStore_->tag(mePnPedMapG01_[i], i+1);
00182 }
00183
00184 dqmStore_->setCurrentFolder(prefixME_ + "/EBTestPulseTask/PN/Gain16");
00185 for (int i = 0; i < 36; i++) {
00186 sprintf(histo, "EBPDT PNs amplitude %s G16", Numbers::sEB(i+1).c_str());
00187 mePnAmplMapG16_[i] = dqmStore_->bookProfile(histo, histo, 10, 0., 10., 4096, 0., 4096., "s");
00188 mePnAmplMapG16_[i]->setAxisTitle("channel", 1);
00189 mePnAmplMapG16_[i]->setAxisTitle("amplitude", 2);
00190 dqmStore_->tag(mePnAmplMapG16_[i], i+1);
00191 sprintf(histo, "EBPDT PNs pedestal %s G16", Numbers::sEB(i+1).c_str());
00192 mePnPedMapG16_[i] = dqmStore_->bookProfile(histo, histo, 10, 0., 10., 4096, 0., 4096., "s");
00193 mePnPedMapG16_[i]->setAxisTitle("channel", 1);
00194 mePnPedMapG16_[i]->setAxisTitle("pedestal", 2);
00195 dqmStore_->tag(mePnPedMapG16_[i], i+1);
00196 }
00197
00198 }
00199
00200 }
00201
00202 void EBTestPulseTask::cleanup(void){
00203
00204 if ( ! init_ ) return;
00205
00206 if ( dqmStore_ ) {
00207 dqmStore_->setCurrentFolder(prefixME_ + "/EBTestPulseTask");
00208
00209 dqmStore_->setCurrentFolder(prefixME_ + "/EBTestPulseTask/Gain01");
00210 for (int i = 0; i < 36; i++) {
00211 if ( meShapeMapG01_[i] ) dqmStore_->removeElement( meShapeMapG01_[i]->getName() );
00212 meShapeMapG01_[i] = 0;
00213 if ( meAmplMapG01_[i] ) dqmStore_->removeElement( meAmplMapG01_[i]->getName() );
00214 meAmplMapG01_[i] = 0;
00215 }
00216
00217 dqmStore_->setCurrentFolder(prefixME_ + "/EBTestPulseTask/Gain06");
00218 for (int i = 0; i < 36; i++) {
00219 if ( meShapeMapG06_[i] ) dqmStore_->removeElement( meShapeMapG06_[i]->getName() );
00220 meShapeMapG06_[i] = 0;
00221 if ( meAmplMapG06_[i] ) dqmStore_->removeElement( meAmplMapG06_[i]->getName() );
00222 meAmplMapG06_[i] = 0;
00223 }
00224
00225 dqmStore_->setCurrentFolder(prefixME_ + "/EBTestPulseTask/Gain12");
00226 for (int i = 0; i < 36; i++) {
00227 if ( meShapeMapG12_[i] ) dqmStore_->removeElement( meShapeMapG12_[i]->getName() );
00228 meShapeMapG12_[i] = 0;
00229 if ( meAmplMapG12_[i] ) dqmStore_->removeElement( meAmplMapG12_[i]->getName() );
00230 meAmplMapG12_[i] = 0;
00231 }
00232
00233 dqmStore_->setCurrentFolder(prefixME_ + "/EBTestPulseTask/PN");
00234
00235 dqmStore_->setCurrentFolder(prefixME_ + "/EBTestPulseTask/PN/Gain01");
00236 for (int i = 0; i < 36; i++) {
00237 if ( mePnAmplMapG01_[i] ) dqmStore_->removeElement( mePnAmplMapG01_[i]->getName() );
00238 mePnAmplMapG01_[i] = 0;
00239 if ( mePnPedMapG01_[i] ) dqmStore_->removeElement( mePnPedMapG01_[i]->getName() );
00240 mePnPedMapG01_[i] = 0;
00241 }
00242
00243 dqmStore_->setCurrentFolder(prefixME_ + "/EBTestPulseTask/PN/Gain16");
00244 for (int i = 0; i < 36; i++) {
00245 if ( mePnAmplMapG16_[i] ) dqmStore_->removeElement( mePnAmplMapG16_[i]->getName() );
00246 mePnAmplMapG16_[i] = 0;
00247 if ( mePnPedMapG16_[i] ) dqmStore_->removeElement( mePnPedMapG16_[i]->getName() );
00248 mePnPedMapG16_[i] = 0;
00249 }
00250
00251 }
00252
00253 init_ = false;
00254
00255 }
00256
00257 void EBTestPulseTask::endJob(void){
00258
00259 LogInfo("EBTestPulseTask") << "analyzed " << ievt_ << " events";
00260
00261 if ( enableCleanup_ ) this->cleanup();
00262
00263 }
00264
00265 void EBTestPulseTask::analyze(const Event& e, const EventSetup& c){
00266
00267 bool enable = false;
00268 int runType[36] = { -1 };
00269 int mgpaGain[36] = { -1 };
00270
00271 Handle<EcalRawDataCollection> dcchs;
00272
00273 if ( e.getByLabel(EcalRawDataCollection_, dcchs) ) {
00274
00275 for ( EcalRawDataCollection::const_iterator dcchItr = dcchs->begin(); dcchItr != dcchs->end(); ++dcchItr ) {
00276
00277 if ( Numbers::subDet( *dcchItr ) != EcalBarrel ) continue;
00278
00279 int ism = Numbers::iSM( *dcchItr, EcalBarrel );
00280
00281 runType[ism-1] = dcchItr->getRunType();
00282 mgpaGain[ism-1] = dcchItr->getMgpaGain();
00283
00284 if ( dcchItr->getRunType() == EcalDCCHeaderBlock::TESTPULSE_MGPA ||
00285 dcchItr->getRunType() == EcalDCCHeaderBlock::TESTPULSE_GAP ) enable = true;
00286
00287 }
00288
00289 } else {
00290
00291 LogWarning("EBTestPulseTask") << EcalRawDataCollection_ << " not available";
00292
00293 }
00294
00295 if ( ! enable ) return;
00296
00297 if ( ! init_ ) this->setup();
00298
00299 ievt_++;
00300
00301 Handle<EBDigiCollection> digis;
00302
00303 if ( e.getByLabel(EBDigiCollection_, digis) ) {
00304
00305 int nebd = digis->size();
00306 LogDebug("EBTestPulseTask") << "event " << ievt_ << " digi collection size " << nebd;
00307
00308 for ( EBDigiCollection::const_iterator digiItr = digis->begin(); digiItr != digis->end(); ++digiItr ) {
00309
00310 EBDetId id = digiItr->id();
00311
00312 int ic = id.ic();
00313 int ie = (ic-1)/20 + 1;
00314 int ip = (ic-1)%20 + 1;
00315
00316 int ism = Numbers::iSM( id );
00317
00318 if ( ! ( runType[ism-1] == EcalDCCHeaderBlock::TESTPULSE_MGPA ||
00319 runType[ism-1] == EcalDCCHeaderBlock::TESTPULSE_GAP ) ) continue;
00320
00321 LogDebug("EBTestPulseTask") << " det id = " << id;
00322 LogDebug("EBTestPulseTask") << " sm, ieta, iphi " << ism << " " << ie << " " << ip;
00323
00324 EBDataFrame dataframe = (*digiItr);
00325
00326 for (int i = 0; i < 10; i++) {
00327
00328 int adc = dataframe.sample(i).adc();
00329 float gain = 1.;
00330
00331 MonitorElement* meShapeMap = 0;
00332
00333 if ( dataframe.sample(i).gainId() == 1 ) gain = 1./12.;
00334 if ( dataframe.sample(i).gainId() == 2 ) gain = 1./ 6.;
00335 if ( dataframe.sample(i).gainId() == 3 ) gain = 1./ 1.;
00336
00337 if ( mgpaGain[ism-1] == 3 ) meShapeMap = meShapeMapG01_[ism-1];
00338 if ( mgpaGain[ism-1] == 2 ) meShapeMap = meShapeMapG06_[ism-1];
00339 if ( mgpaGain[ism-1] == 1 ) meShapeMap = meShapeMapG12_[ism-1];
00340
00341
00342 float xval = float(adc);
00343
00344 if ( meShapeMap ) meShapeMap->Fill(ic - 0.5, i + 0.5, xval);
00345
00346 }
00347
00348 }
00349
00350 } else {
00351
00352 LogWarning("EBTestPulseTask") << EBDigiCollection_ << " not available";
00353
00354 }
00355
00356 Handle<EcalUncalibratedRecHitCollection> hits;
00357
00358 if ( e.getByLabel(EcalUncalibratedRecHitCollection_, hits) ) {
00359
00360 int neh = hits->size();
00361 LogDebug("EBTestPulseTask") << "event " << ievt_ << " hits collection size " << neh;
00362
00363 for ( EcalUncalibratedRecHitCollection::const_iterator hitItr = hits->begin(); hitItr != hits->end(); ++hitItr ) {
00364
00365 EBDetId id = hitItr->id();
00366
00367 int ic = id.ic();
00368 int ie = (ic-1)/20 + 1;
00369 int ip = (ic-1)%20 + 1;
00370
00371 int ism = Numbers::iSM( id );
00372
00373 float xie = ie - 0.5;
00374 float xip = ip - 0.5;
00375
00376 if ( ! ( runType[ism-1] == EcalDCCHeaderBlock::TESTPULSE_MGPA ||
00377 runType[ism-1] == EcalDCCHeaderBlock::TESTPULSE_GAP ) ) continue;
00378
00379 LogDebug("EBTestPulseTask") << " det id = " << id;
00380 LogDebug("EBTestPulseTask") << " sm, ieta, iphi " << ism << " " << ie << " " << ip;
00381
00382 MonitorElement* meAmplMap = 0;
00383
00384 if ( mgpaGain[ism-1] == 3 ) meAmplMap = meAmplMapG01_[ism-1];
00385 if ( mgpaGain[ism-1] == 2 ) meAmplMap = meAmplMapG06_[ism-1];
00386 if ( mgpaGain[ism-1] == 1 ) meAmplMap = meAmplMapG12_[ism-1];
00387
00388 float xval = hitItr->amplitude();
00389 if ( xval <= 0. ) xval = 0.0;
00390
00391
00392
00393
00394
00395 LogDebug("EBTestPulseTask") << " hit amplitude " << xval;
00396
00397 if ( meAmplMap ) meAmplMap->Fill(xie, xip, xval);
00398
00399 LogDebug("EBTestPulseTask") << "Crystal " << ie << " " << ip << " Amplitude = " << xval;
00400
00401 }
00402
00403 } else {
00404
00405 LogWarning("EBTestPulseTask") << EcalUncalibratedRecHitCollection_ << " not available";
00406
00407 }
00408
00409 Handle<EcalPnDiodeDigiCollection> pns;
00410
00411 if ( e.getByLabel(EcalPnDiodeDigiCollection_, pns) ) {
00412
00413 int nep = pns->size();
00414 LogDebug("EBTestPulseTask") << "event " << ievt_ << " pns collection size " << nep;
00415
00416 for ( EcalPnDiodeDigiCollection::const_iterator pnItr = pns->begin(); pnItr != pns->end(); ++pnItr ) {
00417
00418 if ( Numbers::subDet( pnItr->id() ) != EcalBarrel ) continue;
00419
00420 int ism = Numbers::iSM( pnItr->id() );
00421
00422 int num = pnItr->id().iPnId();
00423
00424 if ( ! ( runType[ism-1] == EcalDCCHeaderBlock::TESTPULSE_MGPA ||
00425 runType[ism-1] == EcalDCCHeaderBlock::TESTPULSE_GAP ) ) continue;
00426
00427 LogDebug("EBTestPulseTask") << " det id = " << pnItr->id();
00428 LogDebug("EBTestPulseTask") << " sm, num " << ism << " " << num;
00429
00430 float xvalped = 0.;
00431
00432 for (int i = 0; i < 4; i++) {
00433
00434 int adc = pnItr->sample(i).adc();
00435
00436 MonitorElement* mePNPed = 0;
00437
00438 if ( pnItr->sample(i).gainId() == 0 ) mePNPed = mePnPedMapG01_[ism-1];
00439 if ( pnItr->sample(i).gainId() == 1 ) mePNPed = mePnPedMapG16_[ism-1];
00440
00441 float xval = float(adc);
00442
00443 if ( mePNPed ) mePNPed->Fill(num - 0.5, xval);
00444
00445 xvalped = xvalped + xval;
00446
00447 }
00448
00449 xvalped = xvalped / 4;
00450
00451 float xvalmax = 0.;
00452
00453 MonitorElement* mePN = 0;
00454
00455 for (int i = 0; i < 50; i++) {
00456
00457 int adc = pnItr->sample(i).adc();
00458
00459 float xval = float(adc);
00460
00461 if ( xval >= xvalmax ) xvalmax = xval;
00462
00463 }
00464
00465 xvalmax = xvalmax - xvalped;
00466
00467 if ( pnItr->sample(0).gainId() == 0 ) mePN = mePnAmplMapG01_[ism-1];
00468 if ( pnItr->sample(0).gainId() == 1 ) mePN = mePnAmplMapG16_[ism-1];
00469
00470 if ( mePN ) mePN->Fill(num - 0.5, xvalmax);
00471
00472 }
00473
00474 } else {
00475
00476 LogWarning("EBTestPulseTask") << EcalPnDiodeDigiCollection_ << " not available";
00477
00478 }
00479
00480 }
00481