File indexing completed on 2024-04-06 12:25:51
0001
0002
0003
0004
0005
0006
0007
0008 #include "HBHEIsolatedNoiseReflagger.h"
0009
0010 #include "FWCore/Framework/interface/EventSetup.h"
0011 #include "Geometry/Records/interface/CaloGeometryRecord.h"
0012 #include "DataFormats/JetReco/interface/TrackExtrapolation.h"
0013 #include "CondFormats/DataRecord/interface/EcalChannelStatusRcd.h"
0014 #include "RecoLocalCalo/HcalRecAlgos/interface/HcalSeverityLevelComputerRcd.h"
0015 #include "DataFormats/METReco/interface/HcalCaloFlagLabels.h"
0016 #include "RecoLocalCalo/EcalRecAlgos/interface/EcalSeverityLevelAlgoRcd.h"
0017 #include "RecoLocalCalo/EcalRecAlgos/interface/EcalSeverityLevelAlgo.h"
0018 #include "CondFormats/HcalObjects/interface/HcalChannelQuality.h"
0019 #include "CondFormats/DataRecord/interface/HcalChannelQualityRcd.h"
0020 #include "CondFormats/DataRecord/interface/HcalFrontEndMapRcd.h"
0021 #include "CondFormats/HcalObjects/interface/HcalFrontEndMap.h"
0022
0023 HBHEIsolatedNoiseReflagger::HBHEIsolatedNoiseReflagger(const edm::ParameterSet& iConfig)
0024 :
0025
0026 LooseHcalIsol_(iConfig.getParameter<double>("LooseHcalIsol")),
0027 LooseEcalIsol_(iConfig.getParameter<double>("LooseEcalIsol")),
0028 LooseTrackIsol_(iConfig.getParameter<double>("LooseTrackIsol")),
0029 TightHcalIsol_(iConfig.getParameter<double>("TightHcalIsol")),
0030 TightEcalIsol_(iConfig.getParameter<double>("TightEcalIsol")),
0031 TightTrackIsol_(iConfig.getParameter<double>("TightTrackIsol")),
0032
0033 LooseRBXEne1_(iConfig.getParameter<double>("LooseRBXEne1")),
0034 LooseRBXEne2_(iConfig.getParameter<double>("LooseRBXEne2")),
0035 LooseRBXHits1_(iConfig.getParameter<int>("LooseRBXHits1")),
0036 LooseRBXHits2_(iConfig.getParameter<int>("LooseRBXHits2")),
0037 TightRBXEne1_(iConfig.getParameter<double>("TightRBXEne1")),
0038 TightRBXEne2_(iConfig.getParameter<double>("TightRBXEne2")),
0039 TightRBXHits1_(iConfig.getParameter<int>("TightRBXHits1")),
0040 TightRBXHits2_(iConfig.getParameter<int>("TightRBXHits2")),
0041
0042 LooseHPDEne1_(iConfig.getParameter<double>("LooseHPDEne1")),
0043 LooseHPDEne2_(iConfig.getParameter<double>("LooseHPDEne2")),
0044 LooseHPDHits1_(iConfig.getParameter<int>("LooseHPDHits1")),
0045 LooseHPDHits2_(iConfig.getParameter<int>("LooseHPDHits2")),
0046 TightHPDEne1_(iConfig.getParameter<double>("TightHPDEne1")),
0047 TightHPDEne2_(iConfig.getParameter<double>("TightHPDEne2")),
0048 TightHPDHits1_(iConfig.getParameter<int>("TightHPDHits1")),
0049 TightHPDHits2_(iConfig.getParameter<int>("TightHPDHits2")),
0050
0051 LooseDiHitEne_(iConfig.getParameter<double>("LooseDiHitEne")),
0052 TightDiHitEne_(iConfig.getParameter<double>("TightDiHitEne")),
0053 LooseMonoHitEne_(iConfig.getParameter<double>("LooseMonoHitEne")),
0054 TightMonoHitEne_(iConfig.getParameter<double>("TightMonoHitEne")),
0055
0056 RBXEneThreshold_(iConfig.getParameter<double>("RBXEneThreshold")),
0057
0058 debug_(iConfig.getUntrackedParameter<bool>("debug", true)),
0059 objvalidator_(iConfig) {
0060 tok_hbhe_ = consumes<HBHERecHitCollection>(iConfig.getParameter<edm::InputTag>("hbheInput"));
0061 tok_EB_ = consumes<EcalRecHitCollection>(iConfig.getParameter<edm::InputTag>("ebInput"));
0062 tok_EE_ = consumes<EcalRecHitCollection>(iConfig.getParameter<edm::InputTag>("eeInput"));
0063 tok_trackExt_ =
0064 consumes<std::vector<reco::TrackExtrapolation> >(iConfig.getParameter<edm::InputTag>("trackExtrapolationInput"));
0065
0066
0067 ecalChStatusToken_ = esConsumes<EcalChannelStatus, EcalChannelStatusRcd>();
0068 hcalChStatusToken_ = esConsumes<HcalChannelQuality, HcalChannelQualityRcd>(edm::ESInputTag("", "withTopo"));
0069 hcalSevToken_ = esConsumes<HcalSeverityLevelComputer, HcalSeverityLevelComputerRcd>();
0070 ecalSevToken_ = esConsumes<EcalSeverityLevelAlgo, EcalSeverityLevelAlgoRcd>();
0071 ctcmToken_ = esConsumes<CaloTowerConstituentsMap, CaloGeometryRecord>();
0072 hfemapToken_ = esConsumes<HcalFrontEndMap, HcalFrontEndMapRcd>();
0073 geoToken_ = esConsumes();
0074
0075 produces<HBHERecHitCollection>();
0076 }
0077
0078 HBHEIsolatedNoiseReflagger::~HBHEIsolatedNoiseReflagger() {}
0079
0080 void HBHEIsolatedNoiseReflagger::produce(edm::Event& iEvent, const edm::EventSetup& evSetup) {
0081
0082 const EcalChannelStatus* dbEcalChStatus = &evSetup.getData(ecalChStatusToken_);
0083
0084
0085 const HcalChannelQuality* dbHcalChStatus = &evSetup.getData(hcalChStatusToken_);
0086
0087
0088 const HcalSeverityLevelComputer* hcalSevLvlComputer = &evSetup.getData(hcalSevToken_);
0089 const EcalSeverityLevelAlgo* ecalSevLvlAlgo = &evSetup.getData(ecalSevToken_);
0090
0091
0092 const CaloTowerConstituentsMap& ctcm = evSetup.getData(ctcmToken_);
0093
0094
0095 const HcalFrontEndMap* hfemap = &evSetup.getData(hfemapToken_);
0096
0097
0098 edm::Handle<HBHERecHitCollection> hbhehits_h;
0099 iEvent.getByToken(tok_hbhe_, hbhehits_h);
0100
0101
0102 edm::Handle<EcalRecHitCollection> ebhits_h;
0103 iEvent.getByToken(tok_EB_, ebhits_h);
0104 edm::Handle<EcalRecHitCollection> eehits_h;
0105 iEvent.getByToken(tok_EE_, eehits_h);
0106
0107
0108 edm::Handle<std::vector<reco::TrackExtrapolation> > trackextraps_h;
0109 iEvent.getByToken(tok_trackExt_, trackextraps_h);
0110
0111
0112 objvalidator_.setHcalChannelQuality(dbHcalChStatus);
0113 objvalidator_.setEcalChannelStatus(dbEcalChStatus);
0114 objvalidator_.setHcalSeverityLevelComputer(hcalSevLvlComputer);
0115 objvalidator_.setEcalSeverityLevelAlgo(ecalSevLvlAlgo);
0116 objvalidator_.setEBRecHitCollection(&(*ebhits_h));
0117 objvalidator_.setEERecHitCollection(&(*eehits_h));
0118
0119
0120 PhysicsTowerOrganizer pto(
0121 hbhehits_h, ebhits_h, eehits_h, trackextraps_h, objvalidator_, ctcm, evSetup.getData(geoToken_));
0122 HBHEHitMapOrganizer organizer(hbhehits_h, objvalidator_, pto, hfemap);
0123
0124
0125 std::vector<HBHEHitMap> rbxs;
0126 std::vector<HBHEHitMap> hpds;
0127 std::vector<HBHEHitMap> dihits;
0128 std::vector<HBHEHitMap> monohits;
0129 organizer.getRBXs(rbxs, LooseRBXEne1_ < TightRBXEne1_ ? LooseRBXEne1_ : TightRBXEne1_);
0130 organizer.getHPDs(hpds, LooseHPDEne1_ < TightHPDEne1_ ? LooseHPDEne1_ : TightHPDEne1_);
0131 organizer.getDiHits(dihits, LooseDiHitEne_ < TightDiHitEne_ ? LooseDiHitEne_ : TightDiHitEne_);
0132 organizer.getMonoHits(monohits, LooseMonoHitEne_ < TightMonoHitEne_ ? LooseMonoHitEne_ : TightMonoHitEne_);
0133
0134 if (debug_ && (!rbxs.empty() || !hpds.empty() || !dihits.empty() || !monohits.empty())) {
0135 edm::LogInfo("HBHEIsolatedNoiseReflagger") << "RBXs:" << std::endl;
0136 DumpHBHEHitMap(rbxs);
0137 edm::LogInfo("HBHEIsolatedNoiseReflagger") << "\nHPDs:" << std::endl;
0138 DumpHBHEHitMap(hpds);
0139 edm::LogInfo("HBHEIsolatedNoiseReflagger") << "\nDiHits:" << std::endl;
0140 DumpHBHEHitMap(dihits);
0141 edm::LogInfo("HBHEIsolatedNoiseReflagger") << "\nMonoHits:" << std::endl;
0142 DumpHBHEHitMap(monohits);
0143 }
0144
0145
0146
0147
0148 std::set<const HBHERecHit*> noisehits;
0149 for (int i = 0; i < static_cast<int>(rbxs.size()); i++) {
0150 int nhits = rbxs[i].nHits();
0151 double ene = rbxs[i].hitEnergy();
0152 double trkfide = rbxs[i].hitEnergyTrackFiducial();
0153 double isolhcale = rbxs[i].hcalEnergySameTowers() + rbxs[i].hcalEnergyNeighborTowers();
0154 double isolecale = rbxs[i].ecalEnergySameTowers();
0155 double isoltrke = rbxs[i].trackEnergySameTowers() + rbxs[i].trackEnergyNeighborTowers();
0156
0157
0158 bool isLooseIso = false;
0159 bool isTightIso = false;
0160 if (ene > RBXEneThreshold_ && ene > 0) {
0161 if (isolhcale < LooseHcalIsol_ * RBXEneThreshold_ && isolecale < LooseEcalIsol_ * RBXEneThreshold_ &&
0162 isoltrke < LooseTrackIsol_ * RBXEneThreshold_)
0163 isLooseIso = true;
0164 if (isolhcale < TightHcalIsol_ * RBXEneThreshold_ && isolecale < TightEcalIsol_ * RBXEneThreshold_ &&
0165 isoltrke < TightTrackIsol_ * RBXEneThreshold_)
0166 isTightIso = true;
0167 }
0168 if (ene <= RBXEneThreshold_ && ene > 0) {
0169 if (isolhcale / ene < LooseHcalIsol_ && isolecale / ene < LooseEcalIsol_ && isoltrke / ene < LooseTrackIsol_)
0170 isLooseIso = true;
0171 if (isolhcale / ene < TightHcalIsol_ && isolecale / ene < TightEcalIsol_ && isoltrke / ene < TightTrackIsol_)
0172 isTightIso = true;
0173 }
0174
0175 if ((isLooseIso && ((trkfide > LooseRBXEne1_ && nhits >= LooseRBXHits1_) ||
0176 (trkfide > LooseRBXEne2_ && nhits >= LooseRBXHits2_))) ||
0177 (isTightIso && ((trkfide > TightRBXEne1_ && nhits >= TightRBXHits1_) ||
0178 (trkfide > TightRBXEne2_ && nhits >= TightRBXHits2_)))) {
0179 for (HBHEHitMap::hitmap_const_iterator it = rbxs[i].beginHits(); it != rbxs[i].endHits(); ++it)
0180 noisehits.insert(it->first);
0181
0182 }
0183 }
0184
0185 for (int i = 0; i < static_cast<int>(hpds.size()); i++) {
0186 int nhits = hpds[i].nHits();
0187 double ene = hpds[i].hitEnergy();
0188 double trkfide = hpds[i].hitEnergyTrackFiducial();
0189 double isolhcale = hpds[i].hcalEnergySameTowers() + hpds[i].hcalEnergyNeighborTowers();
0190 double isolecale = hpds[i].ecalEnergySameTowers();
0191 double isoltrke = hpds[i].trackEnergySameTowers() + hpds[i].trackEnergyNeighborTowers();
0192 if ((ene > 0 && isolhcale / ene < LooseHcalIsol_ && isolecale / ene < LooseEcalIsol_ &&
0193 isoltrke / ene < LooseTrackIsol_ &&
0194 ((trkfide > LooseHPDEne1_ && nhits >= LooseHPDHits1_) ||
0195 (trkfide > LooseHPDEne2_ && nhits >= LooseHPDHits2_))) ||
0196 (ene > 0 && isolhcale / ene < TightHcalIsol_ && isolecale / ene < TightEcalIsol_ &&
0197 isoltrke / ene < TightTrackIsol_ &&
0198 ((trkfide > TightHPDEne1_ && nhits >= TightHPDHits1_) ||
0199 (trkfide > TightHPDEne2_ && nhits >= TightHPDHits2_)))) {
0200 for (HBHEHitMap::hitmap_const_iterator it = hpds[i].beginHits(); it != hpds[i].endHits(); ++it)
0201 noisehits.insert(it->first);
0202
0203 }
0204 }
0205
0206 for (int i = 0; i < static_cast<int>(dihits.size()); i++) {
0207 double ene = dihits[i].hitEnergy();
0208 double trkfide = dihits[i].hitEnergyTrackFiducial();
0209 double isolhcale = dihits[i].hcalEnergySameTowers() + dihits[i].hcalEnergyNeighborTowers();
0210 double isolecale = dihits[i].ecalEnergySameTowers();
0211 double isoltrke = dihits[i].trackEnergySameTowers() + dihits[i].trackEnergyNeighborTowers();
0212 if ((ene > 0 && isolhcale / ene < LooseHcalIsol_ && isolecale / ene < LooseEcalIsol_ &&
0213 isoltrke / ene < LooseTrackIsol_ && trkfide > 0.99 * ene && trkfide > LooseDiHitEne_) ||
0214 (ene > 0 && isolhcale / ene < TightHcalIsol_ && isolecale / ene < TightEcalIsol_ &&
0215 isoltrke / ene < TightTrackIsol_ && ene > TightDiHitEne_)) {
0216 for (HBHEHitMap::hitmap_const_iterator it = dihits[i].beginHits(); it != dihits[i].endHits(); ++it)
0217 noisehits.insert(it->first);
0218
0219 }
0220 }
0221
0222 for (int i = 0; i < static_cast<int>(monohits.size()); i++) {
0223 double ene = monohits[i].hitEnergy();
0224 double trkfide = monohits[i].hitEnergyTrackFiducial();
0225 double isolhcale = monohits[i].hcalEnergySameTowers() + monohits[i].hcalEnergyNeighborTowers();
0226 double isolecale = monohits[i].ecalEnergySameTowers();
0227 double isoltrke = monohits[i].trackEnergySameTowers() + monohits[i].trackEnergyNeighborTowers();
0228 if ((ene > 0 && isolhcale / ene < LooseHcalIsol_ && isolecale / ene < LooseEcalIsol_ &&
0229 isoltrke / ene < LooseTrackIsol_ && trkfide > 0.99 * ene && trkfide > LooseMonoHitEne_) ||
0230 (ene > 0 && isolhcale / ene < TightHcalIsol_ && isolecale / ene < TightEcalIsol_ &&
0231 isoltrke / ene < TightTrackIsol_ && ene > TightMonoHitEne_)) {
0232 for (HBHEHitMap::hitmap_const_iterator it = monohits[i].beginHits(); it != monohits[i].endHits(); ++it)
0233 noisehits.insert(it->first);
0234
0235 }
0236 }
0237
0238
0239 auto pOut = std::make_unique<HBHERecHitCollection>();
0240
0241 for (HBHERecHitCollection::const_iterator it = hbhehits_h->begin(); it != hbhehits_h->end(); ++it) {
0242 const HBHERecHit* hit = &(*it);
0243 HBHERecHit newhit(*hit);
0244 if (noisehits.end() != noisehits.find(hit)) {
0245 newhit.setFlagField(1, HcalCaloFlagLabels::HBHEIsolatedNoise);
0246 }
0247 pOut->push_back(newhit);
0248 }
0249
0250 iEvent.put(std::move(pOut));
0251
0252 return;
0253 }
0254
0255 void HBHEIsolatedNoiseReflagger::DumpHBHEHitMap(std::vector<HBHEHitMap>& i) const {
0256 for (std::vector<HBHEHitMap>::const_iterator it = i.begin(); it != i.end(); ++it) {
0257 edm::LogInfo("HBHEIsolatedNoiseReflagger")
0258 << "hit energy=" << it->hitEnergy() << "; # hits=" << it->nHits()
0259 << "; hcal energy same=" << it->hcalEnergySameTowers() << "; ecal energy same=" << it->ecalEnergySameTowers()
0260 << "; track energy same=" << it->trackEnergySameTowers()
0261 << "; neighbor hcal energy=" << it->hcalEnergyNeighborTowers() << std::endl;
0262 edm::LogInfo("HBHEIsolatedNoiseReflagger") << "hits:" << std::endl;
0263 for (HBHEHitMap::hitmap_const_iterator it2 = it->beginHits(); it2 != it->endHits(); ++it2) {
0264 const HBHERecHit* hit = it2->first;
0265 edm::LogInfo("HBHEIsolatedNoiseReflagger")
0266 << "RBX #=" << hfemap->lookupRBX(hit->id()) << "; HPD #=" << hfemap->lookupRMIndex(hit->id()) << "; "
0267 << (*hit) << std::endl;
0268 }
0269 }
0270 return;
0271 }
0272
0273
0274 DEFINE_FWK_MODULE(HBHEIsolatedNoiseReflagger);