CMS 3D CMS Logo

CMSSW_4_4_3_patch1/src/DQM/EcalEndcapMonitorTasks/src/EEHltTask.cc

Go to the documentation of this file.
00001 /*
00002  * \file EEHltTask.cc
00003  *
00004  * $Date: 2011/08/30 09:28:42 $
00005  * $Revision: 1.17 $
00006  * \author G. Della Ricca
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 #include "FWCore/Framework/interface/ESHandle.h"
00016 #include "Geometry/EcalMapping/interface/EcalMappingRcd.h"
00017 
00018 #include "DQMServices/Core/interface/MonitorElement.h"
00019 
00020 #include "DQMServices/Core/interface/DQMStore.h"
00021 
00022 #include "DataFormats/FEDRawData/interface/FEDRawData.h"
00023 #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
00024 
00025 #include "DataFormats/EcalDetId/interface/EEDetId.h"
00026 
00027 #include "DataFormats/EcalRawData/interface/EcalRawDataCollections.h"
00028 #include "DataFormats/EcalDetId/interface/EcalDetIdCollections.h"
00029 
00030 #include "DQM/EcalEndcapMonitorTasks/interface/EEHltTask.h"
00031 
00032 EEHltTask::EEHltTask(const edm::ParameterSet& ps){
00033 
00034   init_ = false;
00035 
00036   initGeometry_ = false;
00037 
00038   dqmStore_ = edm::Service<DQMStore>().operator->();
00039 
00040   prefixME_ = ps.getUntrackedParameter<std::string>("prefixME", "");
00041 
00042   folderName_ = ps.getUntrackedParameter<std::string>("folderName", "FEDIntegrity");
00043 
00044   enableCleanup_ = ps.getUntrackedParameter<bool>("enableCleanup", false);
00045 
00046   mergeRuns_ = ps.getUntrackedParameter<bool>("mergeRuns", false);
00047 
00048   EEDetIdCollection0_ =  ps.getParameter<edm::InputTag>("EEDetIdCollection0");
00049   EEDetIdCollection1_ =  ps.getParameter<edm::InputTag>("EEDetIdCollection1");
00050   EEDetIdCollection2_ =  ps.getParameter<edm::InputTag>("EEDetIdCollection2");
00051   EEDetIdCollection3_ =  ps.getParameter<edm::InputTag>("EEDetIdCollection3");
00052   EcalElectronicsIdCollection1_ = ps.getParameter<edm::InputTag>("EcalElectronicsIdCollection1");
00053   EcalElectronicsIdCollection2_ = ps.getParameter<edm::InputTag>("EcalElectronicsIdCollection2");
00054   EcalElectronicsIdCollection3_ = ps.getParameter<edm::InputTag>("EcalElectronicsIdCollection3");
00055   EcalElectronicsIdCollection4_ = ps.getParameter<edm::InputTag>("EcalElectronicsIdCollection4");
00056   EcalElectronicsIdCollection5_ = ps.getParameter<edm::InputTag>("EcalElectronicsIdCollection5");
00057   EcalElectronicsIdCollection6_ = ps.getParameter<edm::InputTag>("EcalElectronicsIdCollection6");
00058   FEDRawDataCollection_ = ps.getParameter<edm::InputTag>("FEDRawDataCollection");
00059 
00060   meEEFedsOccupancy_ = 0;
00061   meEEFedsSizeErrors_ = 0;
00062   meEEFedsIntegrityErrors_ = 0;
00063 
00064   map = 0;
00065 
00066 }
00067 
00068 EEHltTask::~EEHltTask(){
00069 
00070 }
00071 
00072 void EEHltTask::beginJob(void){
00073 
00074   ievt_ = 0;
00075 
00076   if ( dqmStore_ ) {
00077     dqmStore_->setCurrentFolder(prefixME_ + "/" + folderName_);
00078     dqmStore_->rmdir(prefixME_ + "/" + folderName_);
00079   }
00080 
00081 }
00082 
00083 void EEHltTask::beginRun(const edm::Run& r, const edm::EventSetup& c) {
00084 
00085   initGeometry(c);
00086 
00087   if ( ! mergeRuns_ ) this->reset();
00088 
00089 }
00090 
00091 void EEHltTask::endRun(const edm::Run& r, const edm::EventSetup& c) {
00092 
00093 }
00094 
00095 void EEHltTask::reset(void) {
00096 
00097   if ( meEEFedsOccupancy_ ) meEEFedsOccupancy_->Reset();
00098   if ( meEEFedsSizeErrors_ ) meEEFedsSizeErrors_->Reset();
00099   if ( meEEFedsIntegrityErrors_ ) meEEFedsIntegrityErrors_->Reset();
00100 
00101 }
00102 
00103 void EEHltTask::setup(void){
00104 
00105   init_ = true;
00106 
00107   std::string name;
00108 
00109   if ( dqmStore_ ) {
00110     dqmStore_->setCurrentFolder(prefixME_ + "/" + folderName_);
00111 
00112     name = "FEDEntries";
00113     meEEFedsOccupancy_ = dqmStore_->book1D(name, name, 54, 601, 655);
00114 
00115     name = "FEDFatal";
00116     meEEFedsSizeErrors_ = dqmStore_->book1D(name, name, 54, 601, 655);
00117 
00118     name = "FEDNonFatal";
00119     meEEFedsIntegrityErrors_ = dqmStore_->book1D(name, name, 54, 601, 655);
00120 
00121   }
00122 
00123 }
00124 
00125 void EEHltTask::cleanup(void){
00126 
00127   if ( ! init_ ) return;
00128 
00129   if ( dqmStore_ ) {
00130     dqmStore_->setCurrentFolder(prefixME_ + "/" + folderName_);
00131 
00132     if ( meEEFedsOccupancy_ ) dqmStore_->removeElement( meEEFedsOccupancy_->getName() );
00133     meEEFedsOccupancy_ = 0;
00134 
00135     if ( meEEFedsSizeErrors_ ) dqmStore_->removeElement( meEEFedsSizeErrors_->getName() );
00136     meEEFedsSizeErrors_ = 0;
00137 
00138     if ( meEEFedsIntegrityErrors_ ) dqmStore_->removeElement( meEEFedsIntegrityErrors_->getName() );
00139     meEEFedsIntegrityErrors_ = 0;
00140 
00141   }
00142 
00143   init_ = false;
00144 
00145 }
00146 
00147 void EEHltTask::endJob(void){
00148 
00149   edm::LogInfo("EEHltTask") << "analyzed " << ievt_ << " events";
00150 
00151   if ( enableCleanup_ ) this->cleanup();
00152 
00153 }
00154 
00155 void EEHltTask::analyze(const edm::Event& e, const edm::EventSetup& c){
00156 
00157   if ( ! init_ ) this->setup();
00158 
00159   ievt_++;
00160 
00161   // ECAL endcap FEDs
00162   int EEFirstFED[2];
00163   EEFirstFED[0] = 601; // EE-
00164   EEFirstFED[1] = 646; // EE+
00165 
00166   int FedsSizeErrors[18];
00167   for ( int i=0; i<18; i++ ) FedsSizeErrors[i]=0;
00168 
00169   edm::Handle<EEDetIdCollection> ids0;
00170 
00171   if ( e.getByLabel(EEDetIdCollection0_, ids0) ) {
00172 
00173     for ( EEDetIdCollection::const_iterator idItr = ids0->begin(); idItr != ids0->end(); ++idItr ) {
00174 
00175       int ism = iSM( *idItr );
00176 
00177       if ( ism > -1 ) FedsSizeErrors[ism-1]++;
00178 
00179     }
00180 
00181   } else {
00182 
00183 //    edm::LogWarning("EEHltTask") << EEDetIdCollection0_ << " not available";
00184 
00185   }
00186 
00187   edm::Handle<FEDRawDataCollection> allFedRawData;
00188 
00189   if ( e.getByLabel(FEDRawDataCollection_, allFedRawData) ) {
00190 
00191     for(int zside=0; zside<2; zside++) {
00192 
00193       int firstFedOnSide=EEFirstFED[zside];
00194 
00195       for ( int ism=1; ism<=9; ism++ ) {
00196 
00197         const FEDRawData& fedData = allFedRawData->FEDData( firstFedOnSide + ism - 1 );
00198 
00199         int length = fedData.size()/sizeof(uint64_t);
00200 
00201         if ( length > 0 ) {
00202 
00203           if ( meEEFedsOccupancy_ ) meEEFedsOccupancy_->Fill( firstFedOnSide + ism - 1 );
00204 
00205           uint64_t * pData = (uint64_t *)(fedData.data());
00206           uint64_t * fedTrailer = pData + (length - 1);
00207           bool crcError = (*fedTrailer >> 2 ) & 0x1;
00208 
00209           if (crcError) FedsSizeErrors[ism-1]++;
00210 
00211         }
00212 
00213       }
00214 
00215     }
00216 
00217   } else {
00218     edm::LogWarning("EEHltTask") << FEDRawDataCollection_ << " not available";
00219   }
00220 
00221 
00222   for( int ism=1; ism<=18; ism++ ) {
00223 
00224     if ( FedsSizeErrors[ism-1] != 0 ) {
00225 
00226       int fednumber = ( ism < 10 ) ? 600 + ism : 636 + ism;
00227 
00228       if ( meEEFedsSizeErrors_ ) meEEFedsSizeErrors_->Fill( fednumber );
00229 
00230     }
00231 
00232   }
00233 
00234 
00235   // Integrity errors
00236   edm::Handle<EEDetIdCollection> ids1;
00237 
00238   if ( e.getByLabel(EEDetIdCollection1_, ids1) ) {
00239 
00240     for ( EEDetIdCollection::const_iterator idItr = ids1->begin(); idItr != ids1->end(); ++idItr ) {
00241 
00242       int ism = iSM( *idItr );
00243       int fednumber = ( ism < 10 ) ? 600 + ism : 636 + ism;
00244 
00245       if ( ism > -1 ) meEEFedsIntegrityErrors_->Fill( fednumber, 1./850.);
00246 
00247     }
00248 
00249   } else {
00250 
00251     edm::LogWarning("EEHltTask") << EEDetIdCollection1_ << " not available";
00252 
00253   }
00254 
00255   edm::Handle<EEDetIdCollection> ids2;
00256 
00257   if ( e.getByLabel(EEDetIdCollection2_, ids2) ) {
00258 
00259     for ( EEDetIdCollection::const_iterator idItr = ids2->begin(); idItr != ids2->end(); ++idItr ) {
00260 
00261       int ism = iSM( *idItr );
00262       int fednumber = ( ism < 10 ) ? 600 + ism : 636 + ism;
00263 
00264       if ( ism > -1 ) meEEFedsIntegrityErrors_->Fill( fednumber, 1./850.);
00265 
00266     }
00267 
00268   } else {
00269 
00270     edm::LogWarning("EEHltTask") << EEDetIdCollection2_ << " not available";
00271 
00272   }
00273 
00274   edm::Handle<EEDetIdCollection> ids3;
00275 
00276   if ( e.getByLabel(EEDetIdCollection3_, ids3) ) {
00277 
00278     for ( EEDetIdCollection::const_iterator idItr = ids3->begin(); idItr != ids3->end(); ++idItr ) {
00279 
00280       int ism = iSM( *idItr );
00281       int fednumber = ( ism < 10 ) ? 600 + ism : 636 + ism;
00282 
00283       if ( ism > -1 ) meEEFedsIntegrityErrors_->Fill( fednumber, 1./850.);
00284 
00285     }
00286 
00287   } else {
00288 
00289     edm::LogWarning("EEHltTask") << EEDetIdCollection3_ << " not available";
00290 
00291   }
00292 
00293   edm::Handle<EcalElectronicsIdCollection> ids4;
00294 
00295   if ( e.getByLabel(EcalElectronicsIdCollection1_, ids4) ) {
00296 
00297     for ( EcalElectronicsIdCollection::const_iterator idItr = ids4->begin(); idItr != ids4->end(); ++idItr ) {
00298 
00299       if ( subDet( *idItr ) != EcalEndcap ) continue;
00300 
00301       int ism = iSM( *idItr );
00302       int fednumber = ( ism < 10 ) ? 600 + ism : 636 + ism;
00303 
00304       if ( ism > -1 ) meEEFedsIntegrityErrors_->Fill( fednumber, 1./34.);
00305 
00306     }
00307 
00308   } else {
00309 
00310     edm::LogWarning("EEHltTask") << EcalElectronicsIdCollection1_ << " not available";
00311 
00312   }
00313 
00314   edm::Handle<EcalElectronicsIdCollection> ids5;
00315 
00316   if ( e.getByLabel(EcalElectronicsIdCollection2_, ids5) ) {
00317 
00318     for ( EcalElectronicsIdCollection::const_iterator idItr = ids5->begin(); idItr != ids5->end(); ++idItr ) {
00319 
00320       if ( subDet( *idItr ) != EcalEndcap ) continue;
00321 
00322       int ism = iSM( *idItr );
00323       int fednumber = ( ism < 10 ) ? 600 + ism : 636 + ism;
00324 
00325       if ( ism > -1 ) meEEFedsIntegrityErrors_->Fill( fednumber, 1./850.);
00326 
00327     }
00328 
00329   } else {
00330 
00331     edm::LogWarning("EEHltTask") << EcalElectronicsIdCollection2_ << " not available";
00332 
00333   }
00334 
00335   edm::Handle<EcalElectronicsIdCollection> ids6;
00336 
00337   if ( e.getByLabel(EcalElectronicsIdCollection3_, ids6) ) {
00338 
00339     for ( EcalElectronicsIdCollection::const_iterator idItr = ids6->begin(); idItr != ids6->end(); ++idItr ) {
00340 
00341       if ( subDet( *idItr ) != EcalEndcap ) continue;
00342 
00343       int ism = iSM( *idItr );
00344       int fednumber = ( ism < 10 ) ? 600 + ism : 636 + ism;
00345 
00346       if ( ism > -1 ) meEEFedsIntegrityErrors_->Fill( fednumber, 1./34.);
00347 
00348     }
00349 
00350   } else {
00351 
00352     edm::LogWarning("EEHltTask") << EcalElectronicsIdCollection3_ << " not available";
00353 
00354   }
00355 
00356   edm::Handle<EcalElectronicsIdCollection> ids7;
00357 
00358   if ( e.getByLabel(EcalElectronicsIdCollection4_, ids7) ) {
00359 
00360     for ( EcalElectronicsIdCollection::const_iterator idItr = ids7->begin(); idItr != ids7->end(); ++idItr ) {
00361 
00362       if ( subDet( *idItr ) != EcalEndcap ) continue;
00363 
00364       int ism = iSM( *idItr );
00365       int fednumber = ( ism < 10 ) ? 600 + ism : 636 + ism;
00366 
00367       if ( ism > -1 ) meEEFedsIntegrityErrors_->Fill( fednumber, 1./850.);
00368 
00369     }
00370 
00371   } else {
00372 
00373     edm::LogWarning("EEHltTask") << EcalElectronicsIdCollection4_ << " not available";
00374 
00375   }
00376 
00377   edm::Handle<EcalElectronicsIdCollection> ids8;
00378 
00379   if ( e.getByLabel(EcalElectronicsIdCollection5_, ids8) ) {
00380 
00381     for ( EcalElectronicsIdCollection::const_iterator idItr = ids8->begin(); idItr != ids8->end(); ++idItr ) {
00382 
00383       if ( subDet( *idItr ) != EcalEndcap ) continue;
00384 
00385       int ism = iSM( *idItr );
00386       int fednumber = ( ism < 10 ) ? 600 + ism : 636 + ism;
00387 
00388       if ( ism > -1 ) meEEFedsIntegrityErrors_->Fill( fednumber, 1./850.);
00389 
00390     }
00391 
00392   } else {
00393 
00394     edm::LogWarning("EEHltTask") << EcalElectronicsIdCollection5_ << " not available";
00395 
00396   }
00397 
00398   edm::Handle<EcalElectronicsIdCollection> ids9;
00399 
00400   if ( e.getByLabel(EcalElectronicsIdCollection6_, ids9) ) {
00401 
00402     for ( EcalElectronicsIdCollection::const_iterator idItr = ids9->begin(); idItr != ids9->end(); ++idItr ) {
00403 
00404       if ( subDet( *idItr ) != EcalEndcap ) continue;
00405 
00406       int ism = iSM( *idItr );
00407       int fednumber = ( ism < 10 ) ? 600 + ism : 636 + ism;
00408 
00409       if ( ism > -1 ) meEEFedsIntegrityErrors_->Fill( fednumber, 1./850.);
00410 
00411     }
00412 
00413   } else {
00414 
00415     edm::LogWarning("EEHltTask") << EcalElectronicsIdCollection6_ << " not available";
00416 
00417   }
00418 
00419 }
00420 
00421 //-------------------------------------------------------------------------
00422 
00423 void EEHltTask::initGeometry( const edm::EventSetup& setup ) {
00424 
00425   if( initGeometry_ ) return;
00426 
00427   initGeometry_ = true;
00428 
00429   edm::ESHandle< EcalElectronicsMapping > handle;
00430   setup.get< EcalMappingRcd >().get(handle);
00431   map = handle.product();
00432 
00433   if( ! map ) edm::LogWarning("EEHltTask") << "EcalElectronicsMapping not available";
00434 
00435 }
00436 
00437 int EEHltTask::iSM( const EEDetId& id ) {
00438 
00439   if( ! map ) return -1;
00440 
00441   EcalElectronicsId eid = map->getElectronicsId(id);
00442   int idcc = eid.dccId();
00443 
00444   // EE-
00445   if( idcc >=  1 && idcc <=  9 ) return( idcc );
00446 
00447   // EE+
00448   if( idcc >= 46 && idcc <= 54 ) return( idcc - 45 + 9 );
00449 
00450   edm::LogWarning("EEHltTask") << "Wrong DCC id: dcc = " << idcc;
00451   return -1;
00452 
00453 }
00454 
00455 int EEHltTask::iSM( const EcalElectronicsId& id ) {
00456 
00457   int idcc = id.dccId();
00458 
00459   // EE-
00460   if( idcc >=  1 && idcc <=  9 ) return( idcc );
00461 
00462   // EE+
00463   if( idcc >= 46 && idcc <= 54 ) return( idcc - 45 + 9 );
00464 
00465   edm::LogWarning("EEHltTask") << "Wrong DCC id: dcc = " << idcc;
00466   return -1;
00467 
00468 }
00469