00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <iostream>
00011 #include <fstream>
00012
00013 #include "FWCore/ServiceRegistry/interface/Service.h"
00014 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00015
00016 #include "DQMServices/Core/interface/MonitorElement.h"
00017
00018 #include "DQMServices/Core/interface/DQMStore.h"
00019
00020 #include "DataFormats/EcalRawData/interface/EcalRawDataCollections.h"
00021 #include "DataFormats/EcalDetId/interface/EEDetId.h"
00022 #include "DataFormats/EcalRecHit/interface/EcalUncalibratedRecHit.h"
00023 #include "DataFormats/EcalRecHit/interface/EcalRecHitCollections.h"
00024
00025 #include "DQM/EcalCommon/interface/Numbers.h"
00026
00027 #include "DQM/EcalEndcapMonitorTasks/interface/EECosmicTask.h"
00028
00029 EECosmicTask::EECosmicTask(const edm::ParameterSet& ps){
00030
00031 init_ = false;
00032
00033 dqmStore_ = edm::Service<DQMStore>().operator->();
00034
00035 prefixME_ = ps.getUntrackedParameter<std::string>("prefixME", "");
00036
00037 enableCleanup_ = ps.getUntrackedParameter<bool>("enableCleanup", false);
00038
00039 mergeRuns_ = ps.getUntrackedParameter<bool>("mergeRuns", false);
00040
00041 EcalRawDataCollection_ = ps.getParameter<edm::InputTag>("EcalRawDataCollection");
00042 EcalUncalibratedRecHitCollection_ = ps.getParameter<edm::InputTag>("EcalUncalibratedRecHitCollection");
00043 EcalRecHitCollection_ = ps.getParameter<edm::InputTag>("EcalRecHitCollection");
00044
00045 threshold_ = 0.12500;
00046
00047 minJitter_ = -2.0;
00048 maxJitter_ = 1.5;
00049
00050 for (int i = 0; i < 18; i++) {
00051 meSelMap_[i] = 0;
00052 meSpectrum_[0][i] = 0;
00053 meSpectrum_[1][i] = 0;
00054 }
00055
00056 }
00057
00058 EECosmicTask::~EECosmicTask(){
00059
00060 }
00061
00062 void EECosmicTask::beginJob(void){
00063
00064 ievt_ = 0;
00065
00066 if ( dqmStore_ ) {
00067 dqmStore_->setCurrentFolder(prefixME_ + "/EECosmicTask");
00068 dqmStore_->rmdir(prefixME_ + "/EECosmicTask");
00069 }
00070
00071 }
00072
00073 void EECosmicTask::beginRun(const edm::Run& r, const edm::EventSetup& c) {
00074
00075 Numbers::initGeometry(c, false);
00076
00077 if ( ! mergeRuns_ ) this->reset();
00078
00079 }
00080
00081 void EECosmicTask::endRun(const edm::Run& r, const edm::EventSetup& c) {
00082
00083 }
00084
00085 void EECosmicTask::reset(void) {
00086
00087 for (int i = 0; i < 18; i++) {
00088 if ( meSelMap_[i] ) meSelMap_[i]->Reset();
00089 if ( meSpectrum_[0][i] ) meSpectrum_[0][i]->Reset();
00090 if ( meSpectrum_[1][i] ) meSpectrum_[1][i]->Reset();
00091 }
00092
00093 }
00094
00095 void EECosmicTask::setup(void){
00096
00097 init_ = true;
00098
00099 char histo[200];
00100
00101 if ( dqmStore_ ) {
00102 dqmStore_->setCurrentFolder(prefixME_ + "/EECosmicTask");
00103
00104 dqmStore_->setCurrentFolder(prefixME_ + "/EECosmicTask/Sel");
00105 for (int i = 0; i < 18; i++) {
00106 sprintf(histo, "EECT energy sel %s", Numbers::sEE(i+1).c_str());
00107 meSelMap_[i] = dqmStore_->bookProfile2D(histo, histo, 50, Numbers::ix0EE(i+1)+0., Numbers::ix0EE(i+1)+50., 50, Numbers::iy0EE(i+1)+0., Numbers::iy0EE(i+1)+50., 4096, 0., 4096., "s");
00108 meSelMap_[i]->setAxisTitle("ix", 1);
00109 if ( i+1 >= 1 && i+1 <= 9 ) meSelMap_[i]->setAxisTitle("101-ix", 1);
00110 meSelMap_[i]->setAxisTitle("iy", 2);
00111 meSelMap_[i]->setAxisTitle("energy (GeV)", 3);
00112 }
00113
00114 dqmStore_->setCurrentFolder(prefixME_ + "/EECosmicTask/Spectrum");
00115 for (int i = 0; i < 18; i++) {
00116 sprintf(histo, "EECT 1x1 energy spectrum %s", Numbers::sEE(i+1).c_str());
00117 meSpectrum_[0][i] = dqmStore_->book1D(histo, histo, 100, 0., 1.5);
00118 meSpectrum_[0][i]->setAxisTitle("energy (GeV)", 1);
00119 sprintf(histo, "EECT 3x3 energy spectrum %s", Numbers::sEE(i+1).c_str());
00120 meSpectrum_[1][i] = dqmStore_->book1D(histo, histo, 100, 0., 1.5);
00121 meSpectrum_[1][i]->setAxisTitle("energy (GeV)", 1);
00122 }
00123
00124 }
00125
00126 }
00127
00128 void EECosmicTask::cleanup(void){
00129
00130 if ( ! init_ ) return;
00131
00132 if ( dqmStore_ ) {
00133 dqmStore_->setCurrentFolder(prefixME_ + "/EECosmicTask");
00134
00135 dqmStore_->setCurrentFolder(prefixME_ + "/EECosmicTask/Sel");
00136 for (int i = 0; i < 18; i++) {
00137 if ( meSelMap_[i] ) dqmStore_->removeElement( meSelMap_[i]->getName() );
00138 meSelMap_[i] = 0;
00139 }
00140
00141 dqmStore_->setCurrentFolder(prefixME_ + "/EECosmicTask/Spectrum");
00142 for (int i = 0; i < 18; i++) {
00143 if ( meSpectrum_[0][i] ) dqmStore_->removeElement( meSpectrum_[0][i]->getName() );
00144 meSpectrum_[0][i] = 0;
00145 if ( meSpectrum_[1][i] ) dqmStore_->removeElement( meSpectrum_[1][i]->getName() );
00146 meSpectrum_[1][i] = 0;
00147 }
00148
00149 }
00150
00151 init_ = false;
00152
00153 }
00154
00155 void EECosmicTask::endJob(void){
00156
00157 edm::LogInfo("EECosmicTask") << "analyzed " << ievt_ << " events";
00158
00159 if ( enableCleanup_ ) this->cleanup();
00160
00161 }
00162
00163 void EECosmicTask::analyze(const edm::Event& e, const edm::EventSetup& c){
00164
00165 bool isData = true;
00166 bool enable = false;
00167 int runType[18];
00168 for (int i=0; i<18; i++) runType[i] = -1;
00169
00170 edm::Handle<EcalRawDataCollection> dcchs;
00171
00172 if ( e.getByLabel(EcalRawDataCollection_, dcchs) ) {
00173
00174 for ( EcalRawDataCollection::const_iterator dcchItr = dcchs->begin(); dcchItr != dcchs->end(); ++dcchItr ) {
00175
00176 if ( Numbers::subDet( *dcchItr ) != EcalEndcap ) continue;
00177
00178 int ism = Numbers::iSM( *dcchItr, EcalEndcap );
00179
00180 runType[ism-1] = dcchItr->getRunType();
00181
00182 if ( dcchItr->getRunType() == EcalDCCHeaderBlock::COSMIC ||
00183 dcchItr->getRunType() == EcalDCCHeaderBlock::MTCC ||
00184 dcchItr->getRunType() == EcalDCCHeaderBlock::COSMICS_GLOBAL ||
00185 dcchItr->getRunType() == EcalDCCHeaderBlock::PHYSICS_GLOBAL ||
00186 dcchItr->getRunType() == EcalDCCHeaderBlock::COSMICS_LOCAL ||
00187 dcchItr->getRunType() == EcalDCCHeaderBlock::PHYSICS_LOCAL ) enable = true;
00188
00189 }
00190
00191 } else {
00192
00193 isData = false; enable = true;
00194 edm::LogWarning("EECosmicTask") << EcalRawDataCollection_ << " not available";
00195
00196 }
00197
00198 if ( ! enable ) return;
00199
00200 if ( ! init_ ) this->setup();
00201
00202 ievt_++;
00203
00204 edm::Handle<EcalRecHitCollection> hits;
00205
00206 if ( e.getByLabel(EcalRecHitCollection_, hits) ) {
00207
00208 int neeh = hits->size();
00209 LogDebug("EECosmicTask") << "event " << ievt_ << " hits collection size " << neeh;
00210
00211 edm::Handle<EcalUncalibratedRecHitCollection> uhits;
00212
00213 if ( ! e.getByLabel(EcalUncalibratedRecHitCollection_, uhits) ) {
00214 edm::LogWarning("EECosmicTask") << EcalUncalibratedRecHitCollection_ << " not available";
00215 }
00216
00217 for ( EcalRecHitCollection::const_iterator hitItr = hits->begin(); hitItr != hits->end(); ++hitItr ) {
00218
00219 EEDetId id = hitItr->id();
00220
00221 int ix = id.ix();
00222 int iy = id.iy();
00223
00224 int ism = Numbers::iSM( id );
00225
00226 if ( ism >= 1 && ism <= 9 ) ix = 101 - ix;
00227
00228 float xix = ix - 0.5;
00229 float xiy = iy - 0.5;
00230
00231 int iz = 0;
00232
00233 if ( ism >= 1 && ism <= 9 ) iz = -1;
00234 if ( ism >= 10 && ism <= 18 ) iz = +1;
00235
00236 if ( isData ) {
00237
00238 if ( ! ( runType[ism-1] == EcalDCCHeaderBlock::COSMIC ||
00239 runType[ism-1] == EcalDCCHeaderBlock::MTCC ||
00240 runType[ism-1] == EcalDCCHeaderBlock::COSMICS_GLOBAL ||
00241 runType[ism-1] == EcalDCCHeaderBlock::PHYSICS_GLOBAL ||
00242 runType[ism-1] == EcalDCCHeaderBlock::COSMICS_LOCAL ||
00243 runType[ism-1] == EcalDCCHeaderBlock::PHYSICS_LOCAL ) ) continue;
00244
00245 }
00246
00247 float xval = hitItr->energy();
00248 if ( xval <= 0. ) xval = 0.0;
00249
00250
00251 float e3x3 = 0.;
00252 bool isSeed = true;
00253
00254
00255 for(int icry=0; icry<9; ++icry) {
00256 unsigned int row = icry/3;
00257 unsigned int column = icry%3;
00258 int icryX = id.ix()+column-1;
00259 int icryY = id.iy()+row-1;
00260 if ( EEDetId::validDetId(icryX, icryY, iz) ) {
00261 EEDetId id3x3 = EEDetId(icryX, icryY, iz, EEDetId::XYMODE);
00262 if ( hits->find(id3x3) != hits->end() ) {
00263 float neighbourEnergy = hits->find(id3x3)->energy();
00264 e3x3 += neighbourEnergy;
00265 if ( neighbourEnergy > xval ) isSeed = false;
00266 }
00267 }
00268 }
00269
00270
00271 float jitter = -999.;
00272 if ( isSeed ) {
00273 if ( uhits.isValid() ) {
00274 if ( uhits->find(id) != uhits->end() ) {
00275 jitter = uhits->find(id)->jitter();
00276 }
00277 }
00278 }
00279
00280 if ( isSeed && e3x3 >= threshold_ && jitter > minJitter_ && jitter < maxJitter_ ) {
00281 if ( meSelMap_[ism-1] ) meSelMap_[ism-1]->Fill(xix, xiy, e3x3);
00282 }
00283
00284 if ( meSpectrum_[0][ism-1] ) meSpectrum_[0][ism-1]->Fill(xval);
00285
00286 if ( isSeed && xval >= threshold_ && jitter > minJitter_ && jitter < maxJitter_ ) {
00287 if ( meSpectrum_[1][ism-1] ) meSpectrum_[1][ism-1]->Fill(e3x3);
00288 }
00289
00290 }
00291
00292 } else {
00293
00294 edm::LogWarning("EECosmicTask") << EcalRecHitCollection_ << " not available";
00295
00296 }
00297
00298 }
00299