diff --git a/HLTrigger/Configuration/python/customizeHLTforCMSSW.py b/HLTrigger/Configuration/python/customizeHLTforCMSSW.py index bfa9c2f94cb14..ac5d2bcd684db 100644 --- a/HLTrigger/Configuration/python/customizeHLTforCMSSW.py +++ b/HLTrigger/Configuration/python/customizeHLTforCMSSW.py @@ -209,6 +209,14 @@ def customizeHLTfor49799(process): return process +def customizeHLTfor49852(process): + for prod in producers_by_type(process, 'HLTEcalPhiSymFilter'): + if not hasattr(prod, 'cleanReco'): + setattr(prod, 'cleanReco', cms.bool(False)) + if not hasattr(prod, 'cleaningConfig'): + from RecoLocalCalo.EcalRecAlgos.ecalCleaningAlgo import cleaningAlgoConfig + setattr(prod, 'cleaningConfig', cleaningAlgoConfig) + return process # CMSSW version specific customizations def customizeHLTforCMSSW(process, menuType="GRun"): @@ -220,5 +228,6 @@ def customizeHLTforCMSSW(process, menuType="GRun"): # process = customizeHLTfor49436(process) process = customizeHLTfor49799(process) + process = customizeHLTfor49852(process) return process diff --git a/HLTrigger/special/plugins/BuildFile.xml b/HLTrigger/special/plugins/BuildFile.xml index 1d5d708b2c782..52e0c47cf0947 100644 --- a/HLTrigger/special/plugins/BuildFile.xml +++ b/HLTrigger/special/plugins/BuildFile.xml @@ -54,6 +54,7 @@ + diff --git a/HLTrigger/special/plugins/HLTEcalPhiSymFilter.cc b/HLTrigger/special/plugins/HLTEcalPhiSymFilter.cc index 26334a8acb8b1..a237f672af9f3 100644 --- a/HLTrigger/special/plugins/HLTEcalPhiSymFilter.cc +++ b/HLTrigger/special/plugins/HLTEcalPhiSymFilter.cc @@ -10,7 +10,15 @@ #include "Geometry/CaloGeometry/interface/CaloSubdetectorGeometry.h" HLTEcalPhiSymFilter::HLTEcalPhiSymFilter(const edm::ParameterSet& config) - : ecalChannelStatusRcdToken_(esConsumes()), + : statusThreshold_(config.getParameter("statusThreshold")), + useRecoFlag_(config.getParameter("useRecoFlag")), + cleanReco_(config.getParameter("cleanReco")), + ampCut_barlP_(config.getParameter >("ampCut_barrelP")), + ampCut_barlM_(config.getParameter >("ampCut_barrelM")), + ampCut_endcP_(config.getParameter >("ampCut_endcapP")), + ampCut_endcM_(config.getParameter >("ampCut_endcapM")), + ecalChannelStatusRcdToken_(useRecoFlag_ ? decltype(ecalChannelStatusRcdToken_)() + : decltype(ecalChannelStatusRcdToken_)(esConsumes())), caloGeometryRecordToken_(esConsumes()), barrelDigisToken_(consumes(config.getParameter("barrelDigiCollection"))), endcapDigisToken_(consumes(config.getParameter("endcapDigiCollection"))), @@ -18,19 +26,22 @@ HLTEcalPhiSymFilter::HLTEcalPhiSymFilter(const edm::ParameterSet& config) consumes(config.getParameter("barrelUncalibHitCollection"))), endcapUncalibHitsToken_( consumes(config.getParameter("endcapUncalibHitCollection"))), - barrelHitsToken_(consumes(config.getParameter("barrelHitCollection"))), - endcapHitsToken_(consumes(config.getParameter("endcapHitCollection"))), + barrelHitsToken_(useRecoFlag_ + ? consumes(config.getParameter("barrelHitCollection")) + : edm::EDGetTokenT()), + endcapHitsToken_(useRecoFlag_ + ? consumes(config.getParameter("endcapHitCollection")) + : edm::EDGetTokenT()), phiSymBarrelDigis_(config.getParameter("phiSymBarrelDigiCollection")), - phiSymEndcapDigis_(config.getParameter("phiSymEndcapDigiCollection")), - ampCut_barlP_(config.getParameter >("ampCut_barrelP")), - ampCut_barlM_(config.getParameter >("ampCut_barrelM")), - ampCut_endcP_(config.getParameter >("ampCut_endcapP")), - ampCut_endcM_(config.getParameter >("ampCut_endcapM")), - statusThreshold_(config.getParameter("statusThreshold")), - useRecoFlag_(config.getParameter("useRecoFlag")) { + phiSymEndcapDigis_(config.getParameter("phiSymEndcapDigiCollection")) { //register your products produces(phiSymBarrelDigis_); produces(phiSymEndcapDigis_); + + if (useRecoFlag_ && cleanReco_) { + const auto cleaningPs = config.getParameter("cleaningConfig"); + cleaningAlgo_ = std::make_unique(cleaningPs); + } } HLTEcalPhiSymFilter::~HLTEcalPhiSymFilter() = default; @@ -63,6 +74,26 @@ void HLTEcalPhiSymFilter::fillDescriptions(edm::ConfigurationDescriptions& descr 12., 12., 12., 12., 12., 12., 12., 12., 12., 12., 12., 12., 12.}); desc.add("phiSymBarrelDigiCollection", "phiSymEcalDigisEB"); desc.add("phiSymEndcapDigiCollection", "phiSymEcalDigisEE"); + desc.add("cleanReco", false); + { + edm::ParameterSetDescription psd0; + psd0.add("e6e2thresh", 0.04); + psd0.add("tightenCrack_e6e2_double", 3); + psd0.add("e4e1Threshold_endcap", 0.3); + psd0.add("tightenCrack_e4e1_single", 3); + psd0.add("tightenCrack_e1_double", 2); + psd0.add("cThreshold_barrel", 4); + psd0.add("e4e1Threshold_barrel", 0.08); + psd0.add("tightenCrack_e1_single", 2); + psd0.add("e4e1_b_barrel", -0.024); + psd0.add("e4e1_a_barrel", 0.04); + psd0.add("ignoreOutOfTimeThresh", 1000000000.0); + psd0.add("cThreshold_endcap", 15); + psd0.add("e4e1_b_endcap", -0.0125); + psd0.add("e4e1_a_endcap", 0.02); + psd0.add("cThreshold_double", 10); + desc.add("cleaningConfig", psd0); + } descriptions.add("hltEcalPhiSymFilter", desc); } @@ -89,15 +120,11 @@ bool HLTEcalPhiSymFilter::filter(edm::StreamID, edm::Event& event, const edm::Ev Handle endcapDigisHandle; Handle barrelUncalibRecHitsHandle; Handle endcapUncalibRecHitsHandle; - Handle barrelRecHitsHandle; - Handle endcapRecHitsHandle; event.getByToken(barrelDigisToken_, barrelDigisHandle); event.getByToken(endcapDigisToken_, endcapDigisHandle); event.getByToken(barrelUncalibHitsToken_, barrelUncalibRecHitsHandle); event.getByToken(endcapUncalibHitsToken_, endcapUncalibRecHitsHandle); - event.getByToken(barrelHitsToken_, barrelRecHitsHandle); - event.getByToken(endcapHitsToken_, endcapRecHitsHandle); //Create empty output collections std::unique_ptr phiSymEBDigiCollection(new EBDigiCollection); @@ -105,27 +132,43 @@ bool HLTEcalPhiSymFilter::filter(edm::StreamID, edm::Event& event, const edm::Ev const EBDigiCollection* EBDigis = barrelDigisHandle.product(); const EEDigiCollection* EEDigis = endcapDigisHandle.product(); - const EBRecHitCollection* EBRechits = barrelRecHitsHandle.product(); - const EERecHitCollection* EERechits = endcapRecHitsHandle.product(); + // RecHits are only needed when recoFlags are checked + const auto* EBRechits = useRecoFlag_ ? &event.get(barrelHitsToken_) : nullptr; + const auto* EERechits = useRecoFlag_ ? &event.get(endcapHitsToken_) : nullptr; //Select interesting EcalDigis (barrel) EcalUncalibratedRecHitCollection::const_iterator itunb; for (itunb = barrelUncalibRecHitsHandle->begin(); itunb != barrelUncalibRecHitsHandle->end(); itunb++) { EcalUncalibratedRecHit hit = (*itunb); EBDetId hitDetId = hit.id(); - uint16_t statusCode = 0; - if (useRecoFlag_) - statusCode = EBRechits->find(hitDetId)->recoFlag(); - else - statusCode = channelStatus[itunb->id().rawId()].getStatusCode(); int iRing = CalibRing.getRingIndex(hitDetId); float ampCut = 0.; if (hitDetId.ieta() < 0) ampCut = ampCut_barlM_[iRing]; else if (hitDetId.ieta() > 0) ampCut = ampCut_barlP_[iRing - N_RING_BARREL / 2]; - float amplitude = hit.amplitude(); - if (statusCode <= statusThreshold_ && amplitude > ampCut) { + if (hit.amplitude() <= ampCut) { + continue; + } + + uint32_t statusCode = 0; + if (useRecoFlag_) { + const auto rechit = EBRechits->find(hitDetId); + if (rechit == EBRechits->end()) { + continue; + } + statusCode = rechit->recoFlag(); + if (cleanReco_ && cleaningAlgo_) { + const auto flags = cleaningAlgo_->checkTopology(hitDetId, *EBRechits); + if (flags > statusCode) { + statusCode = flags; + } + } + } else { + statusCode = channelStatus[hitDetId.rawId()].getStatusCode(); + } + + if (statusCode <= statusThreshold_) { const auto digiIt = EBDigis->find(hitDetId); if (digiIt != EBDigis->end()) { phiSymEBDigiCollection->push_back(digiIt->id(), digiIt->begin()); @@ -141,19 +184,34 @@ bool HLTEcalPhiSymFilter::filter(edm::StreamID, edm::Event& event, const edm::Ev for (itune = endcapUncalibRecHitsHandle->begin(); itune != endcapUncalibRecHitsHandle->end(); itune++) { EcalUncalibratedRecHit hit = (*itune); EEDetId hitDetId = hit.id(); - uint16_t statusCode = 0; - if (useRecoFlag_) - statusCode = EERechits->find(hitDetId)->recoFlag(); - else - statusCode = channelStatus[itune->id().rawId()].getStatusCode(); int iRing = CalibRing.getRingIndex(hitDetId); float ampCut = 0.; if (hitDetId.zside() < 0) ampCut = ampCut_endcM_[iRing - N_RING_BARREL]; else if (hitDetId.zside() > 0) ampCut = ampCut_endcP_[iRing - N_RING_BARREL - N_RING_ENDCAP / 2]; - float amplitude = hit.amplitude(); - if (statusCode <= statusThreshold_ && amplitude > ampCut) { + if (hit.amplitude() <= ampCut) { + continue; + } + + uint32_t statusCode = 0; + if (useRecoFlag_) { + const auto rechit = EERechits->find(hitDetId); + if (rechit == EERechits->end()) { + continue; + } + statusCode = rechit->recoFlag(); + if (cleanReco_ && cleaningAlgo_) { + const auto flags = cleaningAlgo_->checkTopology(hitDetId, *EERechits); + if (flags > statusCode) { + statusCode = flags; + } + } + } else { + statusCode = channelStatus[hitDetId.rawId()].getStatusCode(); + } + + if (statusCode <= statusThreshold_) { const auto digiIt = EEDigis->find(hitDetId); if (digiIt != EEDigis->end()) { phiSymEEDigiCollection->push_back(digiIt->id(), digiIt->begin()); diff --git a/HLTrigger/special/plugins/HLTEcalPhiSymFilter.h b/HLTrigger/special/plugins/HLTEcalPhiSymFilter.h index 1afdefb1813f9..1983958935b84 100644 --- a/HLTrigger/special/plugins/HLTEcalPhiSymFilter.h +++ b/HLTrigger/special/plugins/HLTEcalPhiSymFilter.h @@ -16,6 +16,9 @@ * threshold (e.g. eCut_barl_high_) is applied. If parameter useRecoFlag_ * is true, statusThreshold_ acts on EcalRecHit::recoFlag(), while if it is * false, it acts on the ChannelStatus record from the database. +* To allow to use tighter cleaning thresholds than the ones used in the +* RecHitProducer the cleanReco_ parameter can be used the specify a +* new cleaningConfig. */ @@ -42,6 +45,7 @@ #include "DataFormats/EcalDigi/interface/EcalDigiCollections.h" #include "Geometry/CaloGeometry/interface/CaloGeometry.h" #include "Geometry/Records/interface/CaloGeometryRecord.h" +#include "RecoLocalCalo/EcalRecAlgos/interface/EcalCleaningAlgo.h" namespace edm { class ConfigurationDescriptions; @@ -60,8 +64,18 @@ class HLTEcalPhiSymFilter : public edm::global::EDFilter<> { static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); private: - edm::ESGetToken const ecalChannelStatusRcdToken_; - edm::ESGetToken const caloGeometryRecordToken_; + std::unique_ptr cleaningAlgo_; + + const uint32_t statusThreshold_; ///< accept channels with up to this status + const bool useRecoFlag_; ///< use recoflag instead of DB for bad channels + const bool cleanReco_; ///< run cleaning algo and use flag if higher than the reco flag + const std::vector ampCut_barlP_; + const std::vector ampCut_barlM_; + const std::vector ampCut_endcP_; + const std::vector ampCut_endcM_; + + const edm::ESGetToken ecalChannelStatusRcdToken_; + const edm::ESGetToken caloGeometryRecordToken_; const edm::EDGetTokenT barrelDigisToken_; const edm::EDGetTokenT endcapDigisToken_; @@ -71,12 +85,6 @@ class HLTEcalPhiSymFilter : public edm::global::EDFilter<> { const edm::EDGetTokenT endcapHitsToken_; const std::string phiSymBarrelDigis_; const std::string phiSymEndcapDigis_; - const std::vector ampCut_barlP_; - const std::vector ampCut_barlM_; - const std::vector ampCut_endcP_; - const std::vector ampCut_endcM_; - const uint32_t statusThreshold_; ///< accept channels with up to this status - const bool useRecoFlag_; ///< use recoflag instead of DB for bad channels }; #endif