00001
00002
00003
00004
00005
00006
00007
00008 #include "HBHEIsolatedNoiseReflagger.h"
00009
00010 #include "FWCore/Framework/interface/ESHandle.h"
00011 #include "FWCore/Framework/interface/EventSetup.h"
00012 #include "Geometry/Records/interface/IdealGeometryRecord.h"
00013 #include "DataFormats/JetReco/interface/TrackExtrapolation.h"
00014 #include "CondFormats/DataRecord/interface/EcalChannelStatusRcd.h"
00015 #include "CondFormats/DataRecord/interface/HcalChannelQualityRcd.h"
00016 #include "RecoLocalCalo/HcalRecAlgos/interface/HcalSeverityLevelComputerRcd.h"
00017 #include "RecoLocalCalo/HcalRecAlgos/interface/HcalCaloFlagLabels.h"
00018 #include "RecoLocalCalo/EcalRecAlgos/interface/EcalSeverityLevelAlgoRcd.h"
00019 #include "RecoLocalCalo/EcalRecAlgos/interface/EcalSeverityLevelAlgo.h"
00020
00021 #include "RecoMET/METAlgorithms/interface/HcalHPDRBXMap.h"
00022
00023 HBHEIsolatedNoiseReflagger::HBHEIsolatedNoiseReflagger(const edm::ParameterSet& iConfig) :
00024 hbheLabel_(iConfig.getParameter<edm::InputTag>("hbheInput")),
00025 ebLabel_(iConfig.getParameter<edm::InputTag>("ebInput")),
00026 eeLabel_(iConfig.getParameter<edm::InputTag>("eeInput")),
00027 trackExtrapolationLabel_(iConfig.getParameter<edm::InputTag>("trackExtrapolationInput")),
00028
00029 LooseHcalIsol_(iConfig.getParameter<double>("LooseHcalIsol")),
00030 LooseEcalIsol_(iConfig.getParameter<double>("LooseEcalIsol")),
00031 LooseTrackIsol_(iConfig.getParameter<double>("LooseTrackIsol")),
00032 TightHcalIsol_(iConfig.getParameter<double>("TightHcalIsol")),
00033 TightEcalIsol_(iConfig.getParameter<double>("TightEcalIsol")),
00034 TightTrackIsol_(iConfig.getParameter<double>("TightTrackIsol")),
00035
00036 LooseRBXEne1_(iConfig.getParameter<double>("LooseRBXEne1")),
00037 LooseRBXEne2_(iConfig.getParameter<double>("LooseRBXEne2")),
00038 LooseRBXHits1_(iConfig.getParameter<int>("LooseRBXHits1")),
00039 LooseRBXHits2_(iConfig.getParameter<int>("LooseRBXHits2")),
00040 TightRBXEne1_(iConfig.getParameter<double>("TightRBXEne1")),
00041 TightRBXEne2_(iConfig.getParameter<double>("TightRBXEne2")),
00042 TightRBXHits1_(iConfig.getParameter<int>("TightRBXHits1")),
00043 TightRBXHits2_(iConfig.getParameter<int>("TightRBXHits2")),
00044
00045 LooseHPDEne1_(iConfig.getParameter<double>("LooseHPDEne1")),
00046 LooseHPDEne2_(iConfig.getParameter<double>("LooseHPDEne2")),
00047 LooseHPDHits1_(iConfig.getParameter<int>("LooseHPDHits1")),
00048 LooseHPDHits2_(iConfig.getParameter<int>("LooseHPDHits2")),
00049 TightHPDEne1_(iConfig.getParameter<double>("TightHPDEne1")),
00050 TightHPDEne2_(iConfig.getParameter<double>("TightHPDEne2")),
00051 TightHPDHits1_(iConfig.getParameter<int>("TightHPDHits1")),
00052 TightHPDHits2_(iConfig.getParameter<int>("TightHPDHits2")),
00053
00054 LooseDiHitEne_(iConfig.getParameter<double>("LooseDiHitEne")),
00055 TightDiHitEne_(iConfig.getParameter<double>("TightDiHitEne")),
00056 LooseMonoHitEne_(iConfig.getParameter<double>("LooseMonoHitEne")),
00057 TightMonoHitEne_(iConfig.getParameter<double>("TightMonoHitEne")),
00058
00059 debug_(iConfig.getUntrackedParameter<bool>("debug",true)),
00060 objvalidator_(iConfig)
00061 {
00062 produces<HBHERecHitCollection>();
00063 }
00064
00065 HBHEIsolatedNoiseReflagger::~HBHEIsolatedNoiseReflagger()
00066 {
00067 }
00068
00069
00070 void
00071 HBHEIsolatedNoiseReflagger::produce(edm::Event& iEvent, const edm::EventSetup& evSetup)
00072 {
00073
00074 edm::ESHandle<EcalChannelStatus> ecalChStatus;
00075 evSetup.get<EcalChannelStatusRcd>().get( ecalChStatus );
00076 const EcalChannelStatus* dbEcalChStatus = ecalChStatus.product();
00077
00078
00079 edm::ESHandle<HcalChannelQuality> hcalChStatus;
00080 evSetup.get<HcalChannelQualityRcd>().get( hcalChStatus );
00081 const HcalChannelQuality* dbHcalChStatus = hcalChStatus.product();
00082
00083
00084 edm::ESHandle<HcalSeverityLevelComputer> hcalSevLvlComputerHndl;
00085 evSetup.get<HcalSeverityLevelComputerRcd>().get(hcalSevLvlComputerHndl);
00086 const HcalSeverityLevelComputer* hcalSevLvlComputer = hcalSevLvlComputerHndl.product();
00087
00088 edm::ESHandle<EcalSeverityLevelAlgo> ecalSevLvlAlgoHndl;
00089 evSetup.get<EcalSeverityLevelAlgoRcd>().get(ecalSevLvlAlgoHndl);
00090 const EcalSeverityLevelAlgo* ecalSevLvlAlgo = ecalSevLvlAlgoHndl.product();
00091
00092
00093 edm::ESHandle<CaloTowerConstituentsMap> ctcm;
00094 evSetup.get<IdealGeometryRecord>().get(ctcm);
00095
00096
00097 edm::Handle<HBHERecHitCollection> hbhehits_h;
00098 iEvent.getByLabel(hbheLabel_, hbhehits_h);
00099
00100
00101 edm::Handle<EcalRecHitCollection> ebhits_h;
00102 iEvent.getByLabel(ebLabel_, ebhits_h);
00103 edm::Handle<EcalRecHitCollection> eehits_h;
00104 iEvent.getByLabel(eeLabel_, eehits_h);
00105
00106
00107 edm::Handle<std::vector<reco::TrackExtrapolation> > trackextraps_h;
00108 iEvent.getByLabel(trackExtrapolationLabel_, trackextraps_h);
00109
00110
00111 objvalidator_.setHcalChannelQuality(dbHcalChStatus);
00112 objvalidator_.setEcalChannelStatus(dbEcalChStatus);
00113 objvalidator_.setHcalSeverityLevelComputer(hcalSevLvlComputer);
00114 objvalidator_.setEcalSeverityLevelAlgo(ecalSevLvlAlgo);
00115 objvalidator_.setEBRecHitCollection(&(*ebhits_h));
00116 objvalidator_.setEERecHitCollection(&(*eehits_h));
00117
00118
00119 PhysicsTowerOrganizer pto(iEvent, evSetup, hbhehits_h, ebhits_h, eehits_h, trackextraps_h, objvalidator_, *(ctcm.product()));
00120 HBHEHitMapOrganizer organizer(hbhehits_h, objvalidator_, pto);
00121
00122
00123 std::vector<HBHEHitMap> rbxs;
00124 std::vector<HBHEHitMap> hpds;
00125 std::vector<HBHEHitMap> dihits;
00126 std::vector<HBHEHitMap> monohits;
00127 organizer.getRBXs(rbxs, LooseRBXEne1_<TightRBXEne1_ ? LooseRBXEne1_ : TightRBXEne1_);
00128 organizer.getHPDs(hpds, LooseHPDEne1_<TightHPDEne1_ ? LooseHPDEne1_ : TightHPDEne1_);
00129 organizer.getDiHits(dihits, LooseDiHitEne_<TightDiHitEne_ ? LooseDiHitEne_ : TightDiHitEne_);
00130 organizer.getMonoHits(monohits, LooseMonoHitEne_<TightMonoHitEne_ ? LooseMonoHitEne_ : TightMonoHitEne_);
00131
00132 if(debug_ && (rbxs.size()>0 || hpds.size()>0 || dihits.size()>0 || monohits.size()>0)) {
00133 edm::LogInfo("HBHEIsolatedNoiseReflagger") << "RBXs:" << std::endl;
00134 DumpHBHEHitMap(rbxs);
00135 edm::LogInfo("HBHEIsolatedNoiseReflagger") << "\nHPDs:" << std::endl;
00136 DumpHBHEHitMap(hpds);
00137 edm::LogInfo("HBHEIsolatedNoiseReflagger") << "\nDiHits:" << std::endl;
00138 DumpHBHEHitMap(dihits);
00139 edm::LogInfo("HBHEIsolatedNoiseReflagger") << "\nMonoHits:" << std::endl;
00140 DumpHBHEHitMap(monohits);
00141 }
00142
00143
00144
00145
00146 std::set<const HBHERecHit*> noisehits;
00147 for(int i=0; i<static_cast<int>(rbxs.size()); i++) {
00148 int nhits=rbxs[i].nHits();
00149 double ene=rbxs[i].hitEnergy();
00150 double trkfide=rbxs[i].hitEnergyTrackFiducial();
00151 double isolhcale=rbxs[i].hcalEnergySameTowers()+rbxs[i].hcalEnergyNeighborTowers();
00152 double isolecale=rbxs[i].ecalEnergySameTowers();
00153 double isoltrke=rbxs[i].trackEnergySameTowers()+rbxs[i].trackEnergyNeighborTowers();
00154 if((isolhcale/ene<LooseHcalIsol_ && isolecale/ene<LooseEcalIsol_ && isoltrke/ene<LooseTrackIsol_ && ((trkfide>LooseRBXEne1_ && nhits>=LooseRBXHits1_) || (trkfide>LooseRBXEne2_ && nhits>=LooseRBXHits2_))) ||
00155 (isolhcale/ene<TightHcalIsol_ && isolecale/ene<TightEcalIsol_ && isoltrke/ene<TightTrackIsol_ && ((trkfide>TightRBXEne1_ && nhits>=TightRBXHits1_) || (trkfide>TightRBXEne2_ && nhits>=TightRBXHits2_)))) {
00156 for(HBHEHitMap::hitmap_const_iterator it=rbxs[i].beginHits(); it!=rbxs[i].endHits(); ++it)
00157 noisehits.insert(it->first);
00158
00159 }
00160 }
00161
00162 for(int i=0; i<static_cast<int>(hpds.size()); i++) {
00163 int nhits=hpds[i].nHits();
00164 double ene=hpds[i].hitEnergy();
00165 double trkfide=hpds[i].hitEnergyTrackFiducial();
00166 double isolhcale=hpds[i].hcalEnergySameTowers()+hpds[i].hcalEnergyNeighborTowers();
00167 double isolecale=hpds[i].ecalEnergySameTowers();
00168 double isoltrke=hpds[i].trackEnergySameTowers()+hpds[i].trackEnergyNeighborTowers();
00169 if((isolhcale/ene<LooseHcalIsol_ && isolecale/ene<LooseEcalIsol_ && isoltrke/ene<LooseTrackIsol_ && ((trkfide>LooseHPDEne1_ && nhits>=LooseHPDHits1_) || (trkfide>LooseHPDEne2_ && nhits>=LooseHPDHits2_))) ||
00170 (isolhcale/ene<TightHcalIsol_ && isolecale/ene<TightEcalIsol_ && isoltrke/ene<TightTrackIsol_ && ((trkfide>TightHPDEne1_ && nhits>=TightHPDHits1_) || (trkfide>TightHPDEne2_ && nhits>=TightHPDHits2_)))) {
00171 for(HBHEHitMap::hitmap_const_iterator it=hpds[i].beginHits(); it!=hpds[i].endHits(); ++it)
00172 noisehits.insert(it->first);
00173
00174 }
00175 }
00176
00177 for(int i=0; i<static_cast<int>(dihits.size()); i++) {
00178 double ene=dihits[i].hitEnergy();
00179 double trkfide=dihits[i].hitEnergyTrackFiducial();
00180 double isolhcale=dihits[i].hcalEnergySameTowers()+dihits[i].hcalEnergyNeighborTowers();
00181 double isolecale=dihits[i].ecalEnergySameTowers();
00182 double isoltrke=dihits[i].trackEnergySameTowers()+dihits[i].trackEnergyNeighborTowers();
00183 if((isolhcale/ene<LooseHcalIsol_ && isolecale/ene<LooseEcalIsol_ && isoltrke/ene<LooseTrackIsol_ && trkfide>0.99*ene && trkfide>LooseDiHitEne_) ||
00184 (isolhcale/ene<TightHcalIsol_ && isolecale/ene<TightEcalIsol_ && isoltrke/ene<TightTrackIsol_ && ene>TightDiHitEne_)) {
00185 for(HBHEHitMap::hitmap_const_iterator it=dihits[i].beginHits(); it!=dihits[i].endHits(); ++it)
00186 noisehits.insert(it->first);
00187
00188 }
00189 }
00190
00191 for(int i=0; i<static_cast<int>(monohits.size()); i++) {
00192 double ene=monohits[i].hitEnergy();
00193 double trkfide=monohits[i].hitEnergyTrackFiducial();
00194 double isolhcale=monohits[i].hcalEnergySameTowers()+monohits[i].hcalEnergyNeighborTowers();
00195 double isolecale=monohits[i].ecalEnergySameTowers();
00196 double isoltrke=monohits[i].trackEnergySameTowers()+monohits[i].trackEnergyNeighborTowers();
00197 if((isolhcale/ene<LooseHcalIsol_ && isolecale/ene<LooseEcalIsol_ && isoltrke/ene<LooseTrackIsol_ && trkfide>0.99*ene && trkfide>LooseMonoHitEne_) ||
00198 (isolhcale/ene<TightHcalIsol_ && isolecale/ene<TightEcalIsol_ && isoltrke/ene<TightTrackIsol_ && ene>TightMonoHitEne_)) {
00199 for(HBHEHitMap::hitmap_const_iterator it=monohits[i].beginHits(); it!=monohits[i].endHits(); ++it)
00200 noisehits.insert(it->first);
00201
00202 }
00203 }
00204
00205
00206 std::auto_ptr<HBHERecHitCollection> pOut(new HBHERecHitCollection());
00207
00208 for(HBHERecHitCollection::const_iterator it=hbhehits_h->begin(); it!=hbhehits_h->end(); ++it) {
00209 const HBHERecHit* hit=&(*it);
00210 HBHERecHit newhit(*hit);
00211 if(noisehits.end()!=noisehits.find(hit)) {
00212 newhit.setFlagField(1, HcalCaloFlagLabels::HBHEIsolatedNoise);
00213 }
00214 pOut->push_back(newhit);
00215 }
00216
00217 iEvent.put(pOut);
00218
00219 return;
00220 }
00221
00222
00223 void HBHEIsolatedNoiseReflagger::DumpHBHEHitMap(std::vector<HBHEHitMap>& i) const
00224 {
00225 for(std::vector<HBHEHitMap>::const_iterator it=i.begin(); it!=i.end(); ++it) {
00226 edm::LogInfo("HBHEIsolatedNoiseReflagger") << "hit energy=" << it->hitEnergy()
00227 << "; # hits=" << it->nHits()
00228 << "; hcal energy same=" << it->hcalEnergySameTowers()
00229 << "; ecal energy same=" << it->ecalEnergySameTowers()
00230 << "; track energy same=" << it->trackEnergySameTowers()
00231 << "; neighbor hcal energy=" << it->hcalEnergyNeighborTowers() << std::endl;
00232 edm::LogInfo("HBHEIsolatedNoiseReflagger") << "hits:" << std::endl;
00233 for(HBHEHitMap::hitmap_const_iterator it2=it->beginHits(); it2!=it->endHits(); ++it2) {
00234 const HBHERecHit *hit=it2->first;
00235 edm::LogInfo("HBHEIsolatedNoiseReflagger") << "RBX #=" << HcalHPDRBXMap::indexRBX(hit->id())
00236 << "; HPD #=" << HcalHPDRBXMap::indexHPD(hit->id())
00237 << "; " << (*hit) << std::endl;
00238 }
00239 }
00240 return;
00241 }
00242
00243
00244
00245 DEFINE_FWK_MODULE(HBHEIsolatedNoiseReflagger);