diff --git a/RecoMET/METFilters/plugins/EcalDeadCellTriggerPrimitiveFilter.cc b/RecoMET/METFilters/plugins/EcalDeadCellTriggerPrimitiveFilter.cc index 830c77443f50f..c22c0a253228b 100644 --- a/RecoMET/METFilters/plugins/EcalDeadCellTriggerPrimitiveFilter.cc +++ b/RecoMET/METFilters/plugins/EcalDeadCellTriggerPrimitiveFilter.cc @@ -75,9 +75,10 @@ class EcalDeadCellTriggerPrimitiveFilter : public edm::stream::EDFilter<> { ~EcalDeadCellTriggerPrimitiveFilter() override; private: + void beginStream(edm::StreamID) override; bool filter(edm::Event&, const edm::EventSetup&) override; void beginRun(const edm::Run&, const edm::EventSetup&) override; - virtual void envSet(const edm::EventSetup&); + void envSet(const edm::EventSetup&); // ----------member data --------------------------- @@ -92,15 +93,16 @@ class EcalDeadCellTriggerPrimitiveFilter : public edm::stream::EDFilter<> { edm::ESHandle ecalStatus; edm::ESHandle geometry; - void loadEcalDigis(edm::Event& iEvent, const edm::EventSetup& iSetup); - void loadEcalRecHits(edm::Event& iEvent, const edm::EventSetup& iSetup); + void loadEcalDigis(edm::Event& iEvent, + edm::Handle& pTPDigis); + void loadEcalRecHits(edm::Event& iEvent, + edm::Handle& barrelReducedRecHitsHandle, + edm::Handle& endcapReducedRecHitsHandle); const edm::InputTag ebReducedRecHitCollection_; const edm::InputTag eeReducedRecHitCollection_; edm::EDGetTokenT ebReducedRecHitCollectionToken_; edm::EDGetTokenT eeReducedRecHitCollectionToken_; - edm::Handle barrelReducedRecHitsHandle; - edm::Handle endcapReducedRecHitsHandle; edm::ESHandle ttMap_; @@ -125,24 +127,21 @@ class EcalDeadCellTriggerPrimitiveFilter : public edm::stream::EDFilter<> { const edm::InputTag tpDigiCollection_; edm::EDGetTokenT tpDigiCollectionToken_; - edm::Handle pTPDigis; // chnStatus > 0, then exclusive, i.e., only consider status == chnStatus // chnStatus < 0, then inclusive, i.e., consider status >= abs(chnStatus) // Return value: + : positive zside - : negative zside - int setEvtTPstatus(const double &tpCntCut, const int &chnStatus); + int setEvtTPstatus(const EcalTrigPrimDigiCollection& , const double &tpCntCut, const int &chnStatus); const bool useTTsum_; //If set to true, the filter will compare the sum of the 5x5 tower to the provided energy threshold const bool usekTPSaturated_; //If set to true, the filter will check the kTPSaturated flag - bool getEventInfoForFilterOnce_; + int hasReducedRecHits_ = 0; - std::string releaseVersion_; - int hastpDigiCollection_, hasReducedRecHits_; + bool useTPmethod_ = false; + bool useHITmethod_ = false; - bool useTPmethod_, useHITmethod_; - - void loadEventInfoForFilter(const edm::Event& iEvent); + edm::EDPutTokenT putToken_; // Only for EB since the dead front-end has one-to-one map to TT std::map accuTTetMap; @@ -156,7 +155,9 @@ class EcalDeadCellTriggerPrimitiveFilter : public edm::stream::EDFilter<> { // To be used before a bug fix std::vector avoidDuplicateVec; - int setEvtRecHitstatus(const double &tpValCut, const int &chnStatus, const int &towerTest); + int setEvtRecHitstatus(const double &tpValCut, const int &chnStatus, const int &towerTest, + const EBRecHitCollection& HitecalEB, + const EERecHitCollection& HitecalEE); }; @@ -170,87 +171,65 @@ EcalDeadCellTriggerPrimitiveFilter::EcalDeadCellTriggerPrimitiveFilter(const edm , doEEfilter_ (iConfig.getUntrackedParameter("doEEfilter") ) , ebReducedRecHitCollection_ (iConfig.getParameter("ebReducedRecHitCollection") ) , eeReducedRecHitCollection_ (iConfig.getParameter("eeReducedRecHitCollection") ) - , ebReducedRecHitCollectionToken_ (consumes(ebReducedRecHitCollection_)) - , eeReducedRecHitCollectionToken_ (consumes(eeReducedRecHitCollection_)) , maskedEcalChannelStatusThreshold_ (iConfig.getParameter("maskedEcalChannelStatusThreshold") ) , etValToBeFlagged_ (iConfig.getParameter("etValToBeFlagged") ) , tpDigiCollection_ (iConfig.getParameter("tpDigiCollection") ) , tpDigiCollectionToken_(consumes(tpDigiCollection_)) , useTTsum_ (iConfig.getParameter("useTTsum") ) , usekTPSaturated_ (iConfig.getParameter("usekTPSaturated") ) + , putToken_ ( produces() ) { - getEventInfoForFilterOnce_ = false; - hastpDigiCollection_ = 0; hasReducedRecHits_ = 0; - useTPmethod_ = true; useHITmethod_ = false; - - produces(); + callWhenNewProductsRegistered([this](edm::BranchDescription const& iBranch) { + // If TP is available, always use TP. + // In RECO file, we always have ecalTPSkim (at least from 38X for data and 39X for MC). + // In AOD file, we can only have recovered rechits in the reduced rechits collection after 42X + // Do NOT expect end-users provide ecalTPSkim or recovered rechits themselves!! + // If they really can provide them, they must be experts to modify this code to suit their own purpose :-) + if( iBranch.moduleLabel() == tpDigiCollection_.label() ){ + useTPmethod_ = true; + //if both collections are in the job then we may already have seen the reduced collections + useHITmethod_ = false; + } + if( iBranch.moduleLabel() == ebReducedRecHitCollection_.label() || iBranch.moduleLabel() == eeReducedRecHitCollection_.label() ){ + hasReducedRecHits_++; + if(not useTPmethod_ && hasReducedRecHits_ == 2) { + useHITmethod_ = true; + ebReducedRecHitCollectionToken_ = consumes(ebReducedRecHitCollection_); + eeReducedRecHitCollectionToken_ = consumes(eeReducedRecHitCollection_); + } + } + }); } EcalDeadCellTriggerPrimitiveFilter::~EcalDeadCellTriggerPrimitiveFilter() { } -void EcalDeadCellTriggerPrimitiveFilter::loadEventInfoForFilter(const edm::Event &iEvent){ +void EcalDeadCellTriggerPrimitiveFilter::beginStream(edm::StreamID){ - std::vector provenances; - iEvent.getAllStableProvenance(provenances); - const unsigned int nProvenance = provenances.size(); - for (unsigned int ip = 0; ip < nProvenance; ip++) { - const edm::StableProvenance& provenance = *( provenances[ip] ); - if( provenance.moduleLabel() == tpDigiCollection_.label() ){ hastpDigiCollection_ = 1; } - if( provenance.moduleLabel() == ebReducedRecHitCollection_.label() || provenance.moduleLabel() == eeReducedRecHitCollection_.label() ){ - hasReducedRecHits_++; - } - if( hastpDigiCollection_ && hasReducedRecHits_>=2 ){ break; } - } + if( debug_ ) edm::LogInfo("EcalDeadCellTriggerPrimitiveFilter")<<"\nuseTPmethod_ : "<At(1)->GetName()).Atoi(); - int minorV = TString(split->At(2)->GetName()).Atoi(); - - if( debug_ ) edm::LogInfo("EcalDeadCellTriggerPrimitiveFilter")<<"processName : "<=4 && minorV >=2 ){ useTPmethod_ = false; useHITmethod_ = true; } - else if( majorV >=5 || (majorV==4 && minorV >=2) ){ useTPmethod_ = false; useHITmethod_ = true; } - else{ useTPmethod_ = false; useHITmethod_ = false; - if( debug_ ){ - edm::LogInfo("EcalDeadCellTriggerPrimitiveFilter")<<"\nWARNING ... TP filter can ONLY be used in AOD after 42X"; - edm::LogInfo("EcalDeadCellTriggerPrimitiveFilter")<<" Will NOT DO ANY FILTERING !"; - } + if( not useTPmethod_ and not useHITmethod_){ + if( debug_ ){ + edm::LogInfo("EcalDeadCellTriggerPrimitiveFilter")<<"\nWARNING ... Cannot find either tpDigiCollection_ or reducedRecHitCollecion_ ?!"; + edm::LogInfo("EcalDeadCellTriggerPrimitiveFilter")<<" Will NOT DO ANY FILTERING !"; + } } if( debug_ ) edm::LogInfo("EcalDeadCellTriggerPrimitiveFilter")<<"useTPmethod_ : "<& pTPDigis){ iEvent.getByToken(tpDigiCollectionToken_, pTPDigis); if ( !pTPDigis.isValid() ) { edm::LogWarning("EcalDeadCellTriggerPrimitiveFilter") << "Can't get the product " << tpDigiCollection_.instance() << " with label " << tpDigiCollection_.label(); return; } } -void EcalDeadCellTriggerPrimitiveFilter::loadEcalRecHits(edm::Event& iEvent, const edm::EventSetup& iSetup){ +void EcalDeadCellTriggerPrimitiveFilter::loadEcalRecHits(edm::Event& iEvent, + edm::Handle& barrelReducedRecHitsHandle, + edm::Handle& endcapReducedRecHitsHandle) +{ iEvent.getByToken(ebReducedRecHitCollectionToken_,barrelReducedRecHitsHandle); iEvent.getByToken(eeReducedRecHitCollectionToken_,endcapReducedRecHitsHandle); @@ -283,20 +262,21 @@ bool EcalDeadCellTriggerPrimitiveFilter::filter(edm::Event& iEvent, const edm::E edm::EventNumber_t event = iEvent.id().event(); edm::LuminosityBlockNumber_t ls = iEvent.luminosityBlock(); - if( !getEventInfoForFilterOnce_ ){ loadEventInfoForFilter(iEvent); } - bool pass = true; int evtTagged = 0; if( useTPmethod_ ){ - loadEcalDigis(iEvent, iSetup); - evtTagged = setEvtTPstatus(etValToBeFlagged_, 13); + edm::Handle pTPDigis; + loadEcalDigis(iEvent, pTPDigis); + evtTagged = setEvtTPstatus(*pTPDigis, etValToBeFlagged_, 13); } if( useHITmethod_ ){ - loadEcalRecHits(iEvent, iSetup); - evtTagged = setEvtRecHitstatus(etValToBeFlagged_, 13, 13); + edm::Handle barrelReducedRecHitsHandle; + edm::Handle endcapReducedRecHitsHandle; + loadEcalRecHits(iEvent, barrelReducedRecHitsHandle, endcapReducedRecHitsHandle); + evtTagged = setEvtRecHitstatus(etValToBeFlagged_, 13, 13, *barrelReducedRecHitsHandle, *endcapReducedRecHitsHandle); } if( evtTagged ){ pass = false; } @@ -306,7 +286,7 @@ bool EcalDeadCellTriggerPrimitiveFilter::filter(edm::Event& iEvent, const edm::E printf("\nrun : %8u event : %10llu lumi : %4u evtTPstatus ABS : %d 13 : % 2d\n", run, event, ls, evtstatusABS, evtTagged); } - iEvent.put(std::make_unique(pass)); + iEvent.emplace(putToken_, pass); if (taggingMode_) return true; else return pass; @@ -322,7 +302,10 @@ void EcalDeadCellTriggerPrimitiveFilter::beginRun(const edm::Run &iRun, const ed return ; } -int EcalDeadCellTriggerPrimitiveFilter::setEvtRecHitstatus(const double &tpValCut, const int &chnStatus, const int &towerTest){ +int EcalDeadCellTriggerPrimitiveFilter::setEvtRecHitstatus(const double &tpValCut, const int &chnStatus, const int &towerTest, + const EBRecHitCollection& HitecalEB, + const EERecHitCollection& HitecalEE + ){ if( debug_ && verbose_ >=2) edm::LogInfo("EcalDeadCellTriggerPrimitiveFilter")<<"***begin setEvtTPstatusRecHits***"; @@ -334,9 +317,6 @@ int EcalDeadCellTriggerPrimitiveFilter::setEvtRecHitstatus(const double &tpValCu const EBRecHitCollection HitecalEB = *(barrelRecHitsHandle.product()); const EERecHitCollection HitecalEE = *(endcapRecHitsHandle.product()); */ - const EBRecHitCollection HitecalEB = *(barrelReducedRecHitsHandle.product()); - const EERecHitCollection HitecalEE = *(endcapReducedRecHitsHandle.product()); - int isPassCut =0; EBRecHitCollection::const_iterator ebrechit; @@ -524,7 +504,7 @@ int EcalDeadCellTriggerPrimitiveFilter::setEvtRecHitstatus(const double &tpValCu } -int EcalDeadCellTriggerPrimitiveFilter::setEvtTPstatus(const double &tpValCut, const int &chnStatus) { +int EcalDeadCellTriggerPrimitiveFilter::setEvtTPstatus(EcalTrigPrimDigiCollection const& tpDigis, const double &tpValCut, const int &chnStatus) { if( debug_ && verbose_ >=2) edm::LogInfo("EcalDeadCellTriggerPrimitiveFilter")<<"***begin setEvtTPstatus***"; @@ -551,10 +531,8 @@ int EcalDeadCellTriggerPrimitiveFilter::setEvtTPstatus(const double &tpValCut, c EcalTrigTowerDetId ttDetId = ttItor->second; int ttzside = ttDetId.zside(); - const EcalTrigPrimDigiCollection * tpDigis = nullptr; - tpDigis = pTPDigis.product(); - EcalTrigPrimDigiCollection::const_iterator tp = tpDigis->find( ttDetId ); - if( tp != tpDigis->end() ){ + EcalTrigPrimDigiCollection::const_iterator tp = tpDigis.find( ttDetId ); + if( tp != tpDigis.end() ){ double tpEt = ecalScale_.getTPGInGeV( tp->compressedEt(), tp->id() ); if(tpEt >= tpValCut ){ isPassCut = 1; isPassCut *= ttzside; } }