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