00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include <iostream>
00012 #include <fstream>
00013 #include <vector>
00014 #include <math.h>
00015
00016 #include "FWCore/ServiceRegistry/interface/Service.h"
00017 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00018
00019 #include "DQMServices/Core/interface/MonitorElement.h"
00020
00021 #include "DQMServices/Core/interface/DQMStore.h"
00022
00023 #include "DataFormats/EcalDetId/interface/EEDetId.h"
00024 #include "DataFormats/EcalDetId/interface/EcalTrigTowerDetId.h"
00025 #include "DataFormats/EcalDetId/interface/EcalScDetId.h"
00026
00027 #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
00028 #include "DataFormats/EcalDigi/interface/EcalDigiCollections.h"
00029
00030 #include <DQM/EcalCommon/interface/UtilsClient.h>
00031 #include <DQM/EcalCommon/interface/Numbers.h>
00032
00033 #include <DQM/EcalEndcapMonitorTasks/interface/EESelectiveReadoutTask.h>
00034
00035 using namespace cms;
00036 using namespace edm;
00037 using namespace std;
00038
00039 EESelectiveReadoutTask::EESelectiveReadoutTask(const ParameterSet& ps){
00040
00041 init_ = false;
00042
00043 dqmStore_ = Service<DQMStore>().operator->();
00044
00045 prefixME_ = ps.getUntrackedParameter<string>("prefixME", "");
00046
00047 enableCleanup_ = ps.getUntrackedParameter<bool>("enableCleanup", false);
00048
00049 mergeRuns_ = ps.getUntrackedParameter<bool>("mergeRuns", false);
00050
00051
00052 EEDigiCollection_ = ps.getParameter<edm::InputTag>("EEDigiCollection");
00053 EEUnsuppressedDigiCollection_ = ps.getParameter<edm::InputTag>("EEUsuppressedDigiCollection");
00054 EESRFlagCollection_ = ps.getParameter<edm::InputTag>("EESRFlagCollection");
00055 EcalTrigPrimDigiCollection_ = ps.getParameter<edm::InputTag>("EcalTrigPrimDigiCollection");
00056 FEDRawDataCollection_ = ps.getParameter<edm::InputTag>("FEDRawDataCollection");
00057
00058
00059 EEDccEventSize_ = 0;
00060
00061 EEReadoutUnitForcedBitMap_[0] = 0;
00062 EEFullReadoutSRFlagMap_[0] = 0;
00063 EEHighInterestTriggerTowerFlagMap_[0] = 0;
00064 EELowInterestTriggerTowerFlagMap_[0] = 0;
00065 EEEventSize_[0] = 0;
00066 EEHighInterestPayload_[0] = 0;
00067 EELowInterestPayload_[0] = 0;
00068
00069 EEReadoutUnitForcedBitMap_[1] = 0;
00070 EEFullReadoutSRFlagMap_[1] = 0;
00071 EEHighInterestTriggerTowerFlagMap_[1] = 0;
00072 EELowInterestTriggerTowerFlagMap_[1] = 0;
00073 EEEventSize_[1] = 0;
00074 EEHighInterestPayload_[1] = 0;
00075 EELowInterestPayload_[1] = 0;
00076
00077 }
00078
00079 EESelectiveReadoutTask::~EESelectiveReadoutTask() {
00080
00081 }
00082
00083 void EESelectiveReadoutTask::beginJob(const EventSetup& c) {
00084
00085 ievt_ = 0;
00086
00087 if ( dqmStore_ ) {
00088 dqmStore_->setCurrentFolder(prefixME_ + "/EESelectiveReadoutTask");
00089 dqmStore_->rmdir(prefixME_ + "/EESelectiveReadoutTask");
00090 }
00091
00092 Numbers::initGeometry(c, false);
00093
00094 }
00095
00096 void EESelectiveReadoutTask::setup(void) {
00097
00098 init_ = true;
00099
00100 char histo[200];
00101
00102 if ( dqmStore_ ) {
00103 dqmStore_->setCurrentFolder(prefixME_ + "/EESelectiveReadoutTask");
00104
00105 sprintf(histo, "EESRT DCC event size");
00106 EEDccEventSize_ = dqmStore_->bookProfile(histo, histo, 18, 1, 19, 100, 0., 200., "s");
00107 for (int i = 0; i < 18; i++) {
00108 EEDccEventSize_->setBinLabel(i+1, Numbers::sEE(i+1).c_str(), 1);
00109 }
00110
00111 sprintf(histo, "EESRT readout unit with SR forced EE -");
00112 EEReadoutUnitForcedBitMap_[0] = dqmStore_->book2D(histo, histo, 100, 0., 100., 100, 0., 100.);
00113 EEReadoutUnitForcedBitMap_[0]->setAxisTitle("jx", 1);
00114 EEReadoutUnitForcedBitMap_[0]->setAxisTitle("jy", 2);
00115
00116 sprintf(histo, "EESRT readout unit with SR forced EE +");
00117 EEReadoutUnitForcedBitMap_[1] = dqmStore_->book2D(histo, histo, 100, 0., 100., 100, 0., 100.);
00118 EEReadoutUnitForcedBitMap_[1]->setAxisTitle("jx", 1);
00119 EEReadoutUnitForcedBitMap_[1]->setAxisTitle("jy", 2);
00120
00121 sprintf(histo, "EESRT full readout SR flags EE -");
00122 EEFullReadoutSRFlagMap_[0] = dqmStore_->book2D(histo, histo, 100, 0., 100., 100, 0., 100.);
00123 EEFullReadoutSRFlagMap_[0]->setAxisTitle("jx", 1);
00124 EEFullReadoutSRFlagMap_[0]->setAxisTitle("jy", 2);
00125
00126 sprintf(histo, "EESRT full readout SR flags EE +");
00127 EEFullReadoutSRFlagMap_[1] = dqmStore_->book2D(histo, histo, 100, 0., 100., 100, 0., 100.);
00128 EEFullReadoutSRFlagMap_[1]->setAxisTitle("jx", 1);
00129 EEFullReadoutSRFlagMap_[1]->setAxisTitle("jy", 2);
00130
00131 sprintf(histo, "EESRT high interest TT Flags EE -");
00132 EEHighInterestTriggerTowerFlagMap_[0] = dqmStore_->book2D(histo, histo, 100, 0., 100., 100, 0., 100.);
00133 EEHighInterestTriggerTowerFlagMap_[0]->setAxisTitle("jx", 1);
00134 EEHighInterestTriggerTowerFlagMap_[0]->setAxisTitle("jy", 2);
00135
00136 sprintf(histo, "EESRT high interest TT Flags EE +");
00137 EEHighInterestTriggerTowerFlagMap_[1] = dqmStore_->book2D(histo, histo, 100, 0., 100., 100, 0., 100.);
00138 EEHighInterestTriggerTowerFlagMap_[1]->setAxisTitle("jx", 1);
00139 EEHighInterestTriggerTowerFlagMap_[1]->setAxisTitle("jy", 2);
00140
00141 sprintf(histo, "EESRT low interest TT Flags EE -");
00142 EELowInterestTriggerTowerFlagMap_[0] = dqmStore_->book2D(histo, histo, 100, 0., 100., 100, 0., 100.);
00143 EELowInterestTriggerTowerFlagMap_[0]->setAxisTitle("jx", 1);
00144 EELowInterestTriggerTowerFlagMap_[0]->setAxisTitle("jy", 2);
00145
00146 sprintf(histo, "EESRT low interest TT Flags EE +");
00147 EELowInterestTriggerTowerFlagMap_[1] = dqmStore_->book2D(histo, histo, 100, 0., 100., 100, 0., 100.);
00148 EELowInterestTriggerTowerFlagMap_[1]->setAxisTitle("jx", 1);
00149 EELowInterestTriggerTowerFlagMap_[1]->setAxisTitle("jy", 2);
00150
00151 sprintf(histo, "EESRT event size EE -");
00152 EEEventSize_[0] = dqmStore_->book1D(histo, histo, 100, 0, 200);
00153 EEEventSize_[0]->setAxisTitle("event size (kB)",1);
00154
00155 sprintf(histo, "EESRT event size EE +");
00156 EEEventSize_[1] = dqmStore_->book1D(histo, histo, 100, 0, 200);
00157 EEEventSize_[1]->setAxisTitle("event size (kB)",1);
00158
00159 sprintf(histo, "EESRT high interest payload EE -");
00160 EEHighInterestPayload_[0] = dqmStore_->book1D(histo, histo, 100, 0, 200);
00161 EEHighInterestPayload_[0]->setAxisTitle("event size (kB)",1);
00162
00163 sprintf(histo, "EESRT high interest payload EE +");
00164 EEHighInterestPayload_[1] = dqmStore_->book1D(histo, histo, 100, 0, 200);
00165 EEHighInterestPayload_[1]->setAxisTitle("event size (kB)",1);
00166
00167 sprintf(histo, "EESRT low interest payload EE -");
00168 EELowInterestPayload_[0] = dqmStore_->book1D(histo, histo, 100, 0, 200);
00169 EELowInterestPayload_[0]->setAxisTitle("event size (kB)",1);
00170
00171 sprintf(histo, "EESRT low interest payload EE +");
00172 EELowInterestPayload_[1] = dqmStore_->book1D(histo, histo, 100, 0, 200);
00173 EELowInterestPayload_[1]->setAxisTitle("event size (kB)",1);
00174
00175 }
00176
00177 }
00178
00179 void EESelectiveReadoutTask::cleanup(void){
00180
00181 if ( ! init_ ) return;
00182
00183 if ( dqmStore_ ) {
00184 dqmStore_->setCurrentFolder(prefixME_ + "/EESelectiveReadoutTask");
00185
00186 if ( EEDccEventSize_ ) dqmStore_->removeElement( EEDccEventSize_->getName() );
00187 EEDccEventSize_ = 0;
00188
00189 if ( EEReadoutUnitForcedBitMap_[0] ) dqmStore_->removeElement( EEReadoutUnitForcedBitMap_[0]->getName() );
00190 EEReadoutUnitForcedBitMap_[0] = 0;
00191
00192 if ( EEReadoutUnitForcedBitMap_[1] ) dqmStore_->removeElement( EEReadoutUnitForcedBitMap_[1]->getName() );
00193 EEReadoutUnitForcedBitMap_[1] = 0;
00194
00195 if ( EEFullReadoutSRFlagMap_[0] ) dqmStore_->removeElement( EEFullReadoutSRFlagMap_[0]->getName() );
00196 EEFullReadoutSRFlagMap_[0] = 0;
00197
00198 if ( EEFullReadoutSRFlagMap_[1] ) dqmStore_->removeElement( EEFullReadoutSRFlagMap_[1]->getName() );
00199 EEFullReadoutSRFlagMap_[1] = 0;
00200
00201 if ( EEHighInterestTriggerTowerFlagMap_[0] ) dqmStore_->removeElement( EEHighInterestTriggerTowerFlagMap_[0]->getName() );
00202 EEHighInterestTriggerTowerFlagMap_[0] = 0;
00203
00204 if ( EEHighInterestTriggerTowerFlagMap_[1] ) dqmStore_->removeElement( EEHighInterestTriggerTowerFlagMap_[1]->getName() );
00205 EEHighInterestTriggerTowerFlagMap_[1] = 0;
00206
00207 if ( EELowInterestTriggerTowerFlagMap_[0] ) dqmStore_->removeElement( EELowInterestTriggerTowerFlagMap_[0]->getName() );
00208 EELowInterestTriggerTowerFlagMap_[0] = 0;
00209
00210 if ( EELowInterestTriggerTowerFlagMap_[1] ) dqmStore_->removeElement( EELowInterestTriggerTowerFlagMap_[1]->getName() );
00211 EELowInterestTriggerTowerFlagMap_[1] = 0;
00212
00213 if ( EEEventSize_[0] ) dqmStore_->removeElement( EEEventSize_[0]->getName() );
00214 EEEventSize_[0] = 0;
00215
00216 if ( EEEventSize_[1] ) dqmStore_->removeElement( EEEventSize_[1]->getName() );
00217 EEEventSize_[1] = 0;
00218
00219 if ( EEHighInterestPayload_[0] ) dqmStore_->removeElement( EEHighInterestPayload_[0]->getName() );
00220 EEHighInterestPayload_[0] = 0;
00221
00222 if ( EEHighInterestPayload_[1] ) dqmStore_->removeElement( EEHighInterestPayload_[1]->getName() );
00223 EEHighInterestPayload_[1] = 0;
00224
00225 if ( EELowInterestPayload_[0] ) dqmStore_->removeElement( EELowInterestPayload_[0]->getName() );
00226 EELowInterestPayload_[0] = 0;
00227
00228 if ( EELowInterestPayload_[1] ) dqmStore_->removeElement( EELowInterestPayload_[1]->getName() );
00229 EELowInterestPayload_[1] = 0;
00230
00231 }
00232
00233 init_ = false;
00234
00235 }
00236
00237 void EESelectiveReadoutTask::endJob(void){
00238
00239 LogInfo("EESelectiveReadoutTask") << "analyzed " << ievt_ << " events";
00240
00241 if ( enableCleanup_ ) this->cleanup();
00242
00243 }
00244
00245 void EESelectiveReadoutTask::beginRun(const Run& r, const EventSetup& c) {
00246
00247 if ( ! mergeRuns_ ) this->reset();
00248
00249 }
00250
00251 void EESelectiveReadoutTask::endRun(const Run& r, const EventSetup& c) {
00252
00253 }
00254
00255 void EESelectiveReadoutTask::reset(void) {
00256
00257 if ( EEDccEventSize_ ) EEDccEventSize_->Reset();
00258
00259 if ( EEReadoutUnitForcedBitMap_[0] ) EEReadoutUnitForcedBitMap_[0]->Reset();
00260 if ( EEReadoutUnitForcedBitMap_[1] ) EEReadoutUnitForcedBitMap_[1]->Reset();
00261
00262 if ( EEFullReadoutSRFlagMap_[0] ) EEFullReadoutSRFlagMap_[0]->Reset();
00263 if ( EEFullReadoutSRFlagMap_[1] ) EEFullReadoutSRFlagMap_[1]->Reset();
00264
00265 if ( EEHighInterestTriggerTowerFlagMap_[0] ) EEHighInterestTriggerTowerFlagMap_[0]->Reset();
00266 if ( EEHighInterestTriggerTowerFlagMap_[1] ) EEHighInterestTriggerTowerFlagMap_[1]->Reset();
00267
00268 if ( EELowInterestTriggerTowerFlagMap_[0] ) EELowInterestTriggerTowerFlagMap_[0]->Reset();
00269 if ( EELowInterestTriggerTowerFlagMap_[1] ) EELowInterestTriggerTowerFlagMap_[1]->Reset();
00270
00271 if ( EEEventSize_[0] ) EEEventSize_[0]->Reset();
00272 if ( EEEventSize_[1] ) EEEventSize_[1]->Reset();
00273
00274 if ( EEHighInterestPayload_[0] ) EEHighInterestPayload_[0]->Reset();
00275 if ( EEHighInterestPayload_[1] ) EEHighInterestPayload_[1]->Reset();
00276
00277 if ( EELowInterestPayload_[0] ) EELowInterestPayload_[0]->Reset();
00278 if ( EELowInterestPayload_[1] ) EELowInterestPayload_[1]->Reset();
00279
00280 }
00281
00282 void EESelectiveReadoutTask::analyze(const Event& e, const EventSetup& c){
00283
00284 if ( ! init_ ) this->setup();
00285
00286 ievt_++;
00287
00288 Handle<FEDRawDataCollection> raw;
00289 if ( e.getByLabel(FEDRawDataCollection_, raw) ) {
00290
00291 int EEFirstFED[2];
00292 EEFirstFED[0] = 601;
00293 EEFirstFED[1] = 646;
00294 for(int zside=0; zside<2; zside++) {
00295
00296 int firstFedOnSide=EEFirstFED[zside];
00297
00298 for ( int iDcc = 0; iDcc < 9; ++iDcc ) {
00299
00300 int ism = 0;
00301 if ( zside == 0 ) ism = iDcc+1;
00302 else ism = 10+iDcc;
00303
00304 EEDccEventSize_->Fill(ism, ((double)raw->FEDData(firstFedOnSide+iDcc).size())/kByte );
00305
00306 }
00307 }
00308
00309 } else {
00310 LogWarning("EESelectiveReadoutTask") << FEDRawDataCollection_ << " not available";
00311 }
00312
00313 TH2F *h01[2];
00314 float integral01[2];
00315 for(int iside=0;iside<2;iside++) {
00316 h01[iside] = UtilsClient::getHisto<TH2F*>( EEFullReadoutSRFlagMap_[iside] );
00317 integral01[iside] = h01[iside]->GetEntries();
00318 if( integral01[iside] != 0 ) h01[iside]->Scale( integral01[iside] );
00319 }
00320
00321 TH2F *h02[2];
00322 float integral02[2];
00323 for(int iside=0;iside<2;iside++) {
00324 h02[iside] = UtilsClient::getHisto<TH2F*>( EEReadoutUnitForcedBitMap_[iside] );
00325 integral02[iside] = h02[iside]->GetEntries();
00326 if( integral02[iside] != 0 ) h02[iside]->Scale( integral02[iside] );
00327 }
00328
00329
00330 Handle<EESrFlagCollection> eeSrFlags;
00331 if ( e.getByLabel(EESRFlagCollection_,eeSrFlags) ) {
00332
00333 for ( EESrFlagCollection::const_iterator it = eeSrFlags->begin(); it != eeSrFlags->end(); ++it ) {
00334
00335 int ix = it->id().ix();
00336 int iy = it->id().iy();
00337
00338 int zside = it->id().zside();
00339
00340 if ( zside < 0 ) ix = 101 - ix;
00341
00342 float xix = ix-0.5;
00343 float xiy = iy-0.5;
00344
00345 int flag = it->value() & ~EcalSrFlag::SRF_FORCED_MASK;
00346
00347 if(flag == EcalSrFlag::SRF_FULL){
00348 if( zside < 0 ) {
00349 EEFullReadoutSRFlagMap_[0]->Fill(xix,xiy);
00350 }
00351 else {
00352 EEFullReadoutSRFlagMap_[1]->Fill(xix,xiy);
00353 }
00354 } else {
00355 if( zside < 0 ) {
00356 EEFullReadoutSRFlagMap_[0]->Fill(-1,-1);
00357 }
00358 else {
00359 EEFullReadoutSRFlagMap_[1]->Fill(-1,-1);
00360 }
00361 }
00362
00363 if(it->value() & EcalSrFlag::SRF_FORCED_MASK){
00364 if( zside < 0 ) {
00365 EEReadoutUnitForcedBitMap_[0]->Fill(xix,xiy);
00366 }
00367 else {
00368 EEReadoutUnitForcedBitMap_[1]->Fill(xix,xiy);
00369 }
00370 } else {
00371 if( zside < 0 ) {
00372 EEReadoutUnitForcedBitMap_[0]->Fill(-1,1);
00373 }
00374 else {
00375 EEReadoutUnitForcedBitMap_[1]->Fill(-1,1);
00376 }
00377 }
00378
00379 }
00380 } else {
00381 LogWarning("EESelectiveReadoutTask") << EESRFlagCollection_ << " not available";
00382 }
00383
00384 for(int iside=0;iside<2;iside++) {
00385 if( integral01[iside] != 0 ) h01[iside]->Scale( 1.0/integral01[iside] );
00386 if( integral02[iside] != 0 ) h02[iside]->Scale( 1.0/integral02[iside] );
00387 }
00388
00389 TH2F *h03[2];
00390 float integral03[2];
00391 for(int iside=0;iside<2;iside++) {
00392 h03[iside] = UtilsClient::getHisto<TH2F*>( EELowInterestTriggerTowerFlagMap_[iside] );
00393 integral03[iside] = h03[iside]->GetEntries();
00394 if( integral03[iside] != 0 ) h03[iside]->Scale( integral03[iside] );
00395 }
00396
00397 TH2F *h04[2];
00398 float integral04[2];
00399 for(int iside=0;iside<2;iside++) {
00400 h04[iside] = UtilsClient::getHisto<TH2F*>( EEHighInterestTriggerTowerFlagMap_[iside] );
00401 integral04[iside] = h04[iside]->GetEntries();
00402 if( integral04[iside] != 0 ) h04[iside]->Scale( integral04[iside] );
00403 }
00404
00405 Handle<EcalTrigPrimDigiCollection> TPCollection;
00406 if ( e.getByLabel(EcalTrigPrimDigiCollection_, TPCollection) ) {
00407
00408
00409 EcalTrigPrimDigiCollection::const_iterator TPdigi;
00410 for ( TPdigi = TPCollection->begin(); TPdigi != TPCollection->end(); ++TPdigi ) {
00411
00412 if ( Numbers::subDet( TPdigi->id() ) != EcalEndcap ) continue;
00413
00414 int ismt = Numbers::iSM( TPdigi->id() );
00415
00416 vector<DetId> crystals = Numbers::crystals( TPdigi->id() );
00417
00418 for ( unsigned int i=0; i<crystals.size(); i++ ) {
00419
00420 EEDetId id = crystals[i];
00421
00422 int ix = id.ix();
00423 int iy = id.iy();
00424
00425 if ( ismt >= 1 && ismt <= 9 ) ix = 101 - ix;
00426
00427 float xix = ix-0.5;
00428 float xiy = iy-0.5;
00429
00430 if ( (TPdigi->ttFlag() & 0x3) == 0 ) {
00431 if ( ismt >= 1 && ismt <= 9 ) {
00432 EELowInterestTriggerTowerFlagMap_[0]->Fill(xix,xiy);
00433 }
00434 else {
00435 EELowInterestTriggerTowerFlagMap_[1]->Fill(xix,xiy);
00436 }
00437 } else {
00438 if ( ismt >= 1 && ismt <= 9 ) {
00439 EELowInterestTriggerTowerFlagMap_[0]->Fill(-1,-1);
00440 }
00441 else {
00442 EELowInterestTriggerTowerFlagMap_[1]->Fill(-1,-1);
00443 }
00444 }
00445
00446 if ( (TPdigi->ttFlag() & 0x3) == 3 ) {
00447 if ( ismt >= 1 && ismt <= 9 ) {
00448 EEHighInterestTriggerTowerFlagMap_[0]->Fill(xix,xiy);
00449 }
00450 else {
00451 EEHighInterestTriggerTowerFlagMap_[1]->Fill(xix,xiy);
00452 }
00453 } else {
00454 if ( ismt >= 1 && ismt <= 9 ) {
00455 EEHighInterestTriggerTowerFlagMap_[0]->Fill(-1,-1);
00456 }
00457 else {
00458 EEHighInterestTriggerTowerFlagMap_[1]->Fill(-1,-1);
00459 }
00460 }
00461
00462 }
00463
00464 }
00465 } else {
00466 LogWarning("EESelectiveReadoutTask") << EcalTrigPrimDigiCollection_ << " not available";
00467 }
00468
00469 for(int iside=0;iside<2;iside++) {
00470 if( integral03[iside] != 0 ) h03[iside]->Scale( 1.0/integral03[iside] );
00471 if( integral04[iside] != 0 ) h04[iside]->Scale( 1.0/integral04[iside] );
00472 }
00473
00474 if (!eeSrFlags.isValid()) return;
00475
00476
00477 double aLowInterest[2];
00478 double aHighInterest[2];
00479 double aAnyInterest[2];
00480
00481 aLowInterest[0]=0;
00482 aHighInterest[0]=0;
00483 aAnyInterest[0]=0;
00484 aLowInterest[1]=0;
00485 aHighInterest[1]=0;
00486 aAnyInterest[1]=0;
00487
00488 Handle<EEDigiCollection> eeDigis;
00489 if ( e.getByLabel(EEDigiCollection_ , eeDigis) ) {
00490
00491 anaDigiInit();
00492
00493 for (unsigned int digis=0; digis<eeDigis->size(); ++digis) {
00494 EEDataFrame eedf = (*eeDigis)[digis];
00495 anaDigi(eedf, *eeSrFlags);
00496 }
00497
00498
00499 aLowInterest[0] = nEeLI_[0]*bytesPerCrystal/kByte;
00500 EELowInterestPayload_[0]->Fill(aLowInterest[0]);
00501 aLowInterest[1] = nEeLI_[1]*bytesPerCrystal/kByte;
00502 EELowInterestPayload_[1]->Fill(aLowInterest[1]);
00503
00504
00505 aHighInterest[0] = nEeHI_[0]*bytesPerCrystal/kByte;
00506 EEHighInterestPayload_[0]->Fill(aHighInterest[0]);
00507 aHighInterest[1] = nEeHI_[1]*bytesPerCrystal/kByte;
00508 EEHighInterestPayload_[1]->Fill(aHighInterest[1]);
00509
00510
00511 aAnyInterest[0] = getEeEventSize(nEe_[0])/kByte;
00512 EEEventSize_[0]->Fill(aAnyInterest[0]);
00513 aAnyInterest[1] = getEeEventSize(nEe_[1])/kByte;
00514 EEEventSize_[1]->Fill(aAnyInterest[1]);
00515
00516 } else {
00517 LogWarning("EESelectiveReadoutTask") << EEDigiCollection_ << " not available";
00518 }
00519
00520 }
00521
00522 void EESelectiveReadoutTask::anaDigi(const EEDataFrame& frame, const EESrFlagCollection& srFlagColl){
00523
00524 EEDetId id = frame.id();
00525 EESrFlagCollection::const_iterator srf = srFlagColl.find(readOutUnitOf(id));
00526
00527 if(srf == srFlagColl.end()){
00528
00529 return;
00530 }
00531
00532 bool highInterest = ((srf->value() & ~EcalSrFlag::SRF_FORCED_MASK)
00533 == EcalSrFlag::SRF_FULL);
00534
00535 bool endcap = (id.subdetId()==EcalEndcap);
00536
00537 if(endcap){
00538 int ism = Numbers::iSM( id );
00539 if ( ism >= 1 && ism <= 9 ) {
00540 ++nEe_[0];
00541 if(highInterest){
00542 ++nEeHI_[0];
00543 } else{
00544 ++nEeLI_[0];
00545 }
00546 } else {
00547 ++nEe_[1];
00548 if(highInterest){
00549 ++nEeHI_[1];
00550 } else{
00551 ++nEeLI_[1];
00552 }
00553 }
00554
00555 int iX0 = iXY2cIndex(id.ix());
00556 int iY0 = iXY2cIndex(id.iy());
00557 int iZ0 = id.zside()>0?1:0;
00558
00559 if(!eeRuActive_[iZ0][iX0/scEdge][iY0/scEdge]){
00560 ++nRuPerDcc_[dccNum(id)];
00561 eeRuActive_[iZ0][iX0/scEdge][iY0/scEdge] = true;
00562 }
00563 }
00564
00565 ++nPerDcc_[dccNum(id)-1];
00566 }
00567
00568 void EESelectiveReadoutTask::anaDigiInit(){
00569 nEe_[0] = 0;
00570 nEeLI_[0] = 0;
00571 nEeHI_[0] = 0;
00572 nEe_[1] = 0;
00573 nEeLI_[1] = 0;
00574 nEeHI_[1] = 0;
00575 bzero(nPerDcc_, sizeof(nPerDcc_));
00576 bzero(nRuPerDcc_, sizeof(nRuPerDcc_));
00577 bzero(eeRuActive_, sizeof(eeRuActive_));
00578 }
00579
00580 EcalScDetId
00581 EESelectiveReadoutTask::readOutUnitOf(const EEDetId& xtalId) const{
00582 const int scEdge = 5;
00583 return EcalScDetId((xtalId.ix()-1)/scEdge+1,
00584 (xtalId.iy()-1)/scEdge+1,
00585 xtalId.zside());
00586 }
00587
00588 unsigned EESelectiveReadoutTask::dccNum(const DetId& xtalId) const{
00589 int j;
00590 int k;
00591
00592 if ( xtalId.det()!=DetId::Ecal ) {
00593 throw cms::Exception("EESelectiveReadoutTask") << "Crystal does not belong to ECAL";
00594 }
00595
00596 int iDet = 0;
00597
00598 if(xtalId.subdetId()==EcalEndcap){
00599 EEDetId eeDetId(xtalId);
00600 j = iXY2cIndex(eeDetId.ix());
00601 k = iXY2cIndex(eeDetId.iy());
00602 int zside = eeDetId.zside();
00603 if ( zside < 0 ) iDet = 0;
00604 else iDet = 2;
00605 } else {
00606 throw cms::Exception("EESelectiveReadoutTask")
00607 <<"Not ECAL endcap.";
00608 }
00609 int iDcc0 = dccIndex(iDet,j,k);
00610 assert(iDcc0>=0 && iDcc0<nECALDcc);
00611 return iDcc0+1;
00612 }
00613
00614 double EESelectiveReadoutTask::getEeEventSize(double nReadXtals) const {
00615 double ruHeaderPayload = 0.;
00616 const int firstEbDcc0 = nEEDcc/2;
00617 for ( int iDcc0 = 0; iDcc0 < nECALDcc; ++iDcc0 ) {
00618
00619 if(iDcc0 == firstEbDcc0) iDcc0 += nEBDcc;
00620 ruHeaderPayload += nRuPerDcc_[iDcc0]*8.;
00621 }
00622 return getDccOverhead(EE)*nEEDcc + nReadXtals*bytesPerCrystal
00623 + ruHeaderPayload;
00624 }
00625
00626 int EESelectiveReadoutTask::dccPhiIndexOfRU(int i, int j) const {
00627 char flag=endcapDccMap[i+j*20];
00628 return (flag==' ')?-1:(flag-'0');
00629 }
00630
00631 int EESelectiveReadoutTask::dccIndex(int iDet, int i, int j) const {
00632 int iPhi = dccPhiIndex(i, j);
00633 if(iPhi<0) return -1;
00634
00635
00636 return iPhi+iDet/2*45;
00637 }
00638