CMS 3D CMS Logo

CaloExtractorByAssociator.cc
Go to the documentation of this file.
2 
7 
12 
17 
19 
23 
25 
26 using namespace edm;
27 using namespace std;
28 using namespace reco;
29 using namespace muonisolation;
31 
32 namespace {
33  constexpr double dRMax_CandDep = 1.0; //pick up candidate own deposits up to this dR if theDR_Max is smaller
34 }
35 
36 CaloExtractorByAssociator::CaloExtractorByAssociator(const ParameterSet& par, edm::ConsumesCollector&& iC)
37  : theUseRecHitsFlag(par.getParameter<bool>("UseRecHitsFlag")),
38  theDepositLabel(par.getUntrackedParameter<string>("DepositLabel")),
39  theDepositInstanceLabels(par.getParameter<std::vector<std::string> >("DepositInstanceLabels")),
40  thePropagatorName(par.getParameter<std::string>("PropagatorName")),
41  theThreshold_E(par.getParameter<double>("Threshold_E")),
42  theThreshold_H(par.getParameter<double>("Threshold_H")),
43  theThreshold_HO(par.getParameter<double>("Threshold_HO")),
44  theDR_Veto_E(par.getParameter<double>("DR_Veto_E")),
45  theDR_Veto_H(par.getParameter<double>("DR_Veto_H")),
46  theDR_Veto_HO(par.getParameter<double>("DR_Veto_HO")),
47  theCenterConeOnCalIntersection(par.getParameter<bool>("CenterConeOnCalIntersection")),
48  theDR_Max(par.getParameter<double>("DR_Max")),
49  theNoise_EB(par.getParameter<double>("Noise_EB")),
50  theNoise_EE(par.getParameter<double>("Noise_EE")),
51  theNoise_HB(par.getParameter<double>("Noise_HB")),
52  theNoise_HE(par.getParameter<double>("Noise_HE")),
53  theNoise_HO(par.getParameter<double>("Noise_HO")),
54  theNoiseTow_EB(par.getParameter<double>("NoiseTow_EB")),
55  theNoiseTow_EE(par.getParameter<double>("NoiseTow_EE")),
56  theService(nullptr),
57  theAssociator(nullptr),
58  thePrintTimeReport(par.getUntrackedParameter<bool>("PrintTimeReport")) {
59  ParameterSet serviceParameters = par.getParameter<ParameterSet>("ServiceParameters");
60  theService = new MuonServiceProxy(serviceParameters);
61 
62  //theAssociatorParameters = new TrackAssociatorParameters(par.getParameter<edm::ParameterSet>("TrackAssociatorParameters"), iC);
64  theAssociatorParameters->loadParameters(par.getParameter<edm::ParameterSet>("TrackAssociatorParameters"), iC);
66 }
67 
71  if (theService)
72  delete theService;
73  if (theAssociator)
74  delete theAssociator;
75 }
76 
78  const edm::EventSetup& eventSetup,
79  const TrackCollection& muons) {
80  // LogWarning("CaloExtractorByAssociator")
81  // <<"fillVetos does nothing now: IsoDeposit provides enough functionality\n"
82  // <<"to remove a deposit at/around given (eta, phi)";
83 }
84 
86  const EventSetup& eventSetup,
87  const Track& muon) const {
88  IsoDeposit::Direction muonDir(muon.eta(), muon.phi());
89  IsoDeposit dep(muonDir);
90 
91  // LogWarning("CaloExtractorByAssociator")
92  // <<"single deposit is not an option here\n"
93  // <<"use ::deposits --> extract all and reweight as necessary";
94 
95  return dep;
96 }
97 
99 std::vector<IsoDeposit> CaloExtractorByAssociator::deposits(const Event& event,
100  const EventSetup& eventSetup,
101  const Track& muon) const {
102  theService->update(eventSetup);
104 
107  if (theDepositInstanceLabels.size() != 3) {
108  LogError("MuonIsolation") << "Configuration is inconsistent: Need 3 deposit instance labels";
109  }
110  if (!(theDepositInstanceLabels[0].compare(0, 1, std::string("e")) == 0) ||
111  !(theDepositInstanceLabels[1].compare(0, 1, std::string("h")) == 0) ||
112  !(theDepositInstanceLabels[2].compare(0, 2, std::string("ho")) == 0)) {
113  LogWarning("MuonIsolation")
114  << "Deposit instance labels do not look like (e*, h*, ho*):"
115  << "proceed at your own risk. The extractor interprets lab0=from ecal; lab1=from hcal; lab2=from ho";
116  }
117 
118  typedef IsoDeposit::Veto Veto;
121  IsoDeposit::Direction muonDir(muon.eta(), muon.phi());
122 
123  IsoDeposit depEcal(muonDir);
124  IsoDeposit depHcal(muonDir);
125  IsoDeposit depHOcal(muonDir);
126 
128  eventSetup.get<IdealMagneticFieldRecord>().get(bField);
129 
130  reco::TransientTrack tMuon(muon, &*bField);
131  FreeTrajectoryState iFTS = tMuon.initialFreeState();
132  TrackDetMatchInfo mInfo = theAssociator->associate(event, eventSetup, iFTS, *theAssociatorParameters);
133 
135  depEcal.setVeto(
137  depHcal.setVeto(
139  depHOcal.setVeto(
141 
143  reco::isodeposit::Direction dirTmp = depEcal.veto().vetoDir;
144  double dRtmp = depEcal.veto().dR;
145  depEcal = IsoDeposit(dirTmp);
146  depEcal.setVeto(Veto(dirTmp, dRtmp));
147 
148  dirTmp = depHcal.veto().vetoDir;
149  dRtmp = depHcal.veto().dR;
150  depHcal = IsoDeposit(dirTmp);
151  depHcal.setVeto(Veto(dirTmp, dRtmp));
152 
153  dirTmp = depHOcal.veto().vetoDir;
154  dRtmp = depHOcal.veto().dR;
155  depHOcal = IsoDeposit(dirTmp);
156  depHOcal.setVeto(Veto(dirTmp, dRtmp));
157  }
158 
159  if (theUseRecHitsFlag) {
163  eventSetup.get<CaloGeometryRecord>().get(caloGeom);
164 
165  //Ecal
166  std::vector<const EcalRecHit*>::const_iterator eHitCI = mInfo.ecalRecHits.begin();
167  for (; eHitCI != mInfo.ecalRecHits.end(); ++eHitCI) {
168  const EcalRecHit* eHitCPtr = *eHitCI;
169  GlobalPoint eHitPos = caloGeom->getPosition(eHitCPtr->detid());
170  double deltar0 = reco::deltaR(muon, eHitPos);
171  double cosTheta = 1. / cosh(eHitPos.eta());
172  double energy = eHitCPtr->energy();
173  double et = energy * cosTheta;
174  if (deltar0 > std::max(dRMax_CandDep, theDR_Max) ||
175  !(et > theThreshold_E && energy > 3 * noiseRecHit(eHitCPtr->detid())))
176  continue;
177 
178  bool vetoHit = false;
179  double deltar = reco::deltaR(mInfo.trkGlobPosAtEcal, eHitPos);
181  if (deltar < theDR_Veto_E) {
182  LogDebug("RecoMuon|CaloExtractorByAssociator") << " >>> Veto ECAL hit: Calo deltaR= " << deltar;
183  LogDebug("RecoMuon|CaloExtractorByAssociator")
184  << " >>> Calo eta phi ethcal: " << eHitPos.eta() << " " << eHitPos.phi() << " " << et;
185  vetoHit = true;
186  }
188  if (!vetoHit) {
189  for (unsigned int iH = 0; iH < mInfo.crossedEcalIds.size() && !vetoHit; ++iH) {
190  if (mInfo.crossedEcalIds[iH].rawId() == eHitCPtr->detid().rawId())
191  vetoHit = true;
192  }
193  }
194 
195  //check theDR_Max only here to keep vetoHits being added to the veto energy
196  if (deltar0 > theDR_Max && !vetoHit)
197  continue;
198 
199  if (vetoHit) {
200  depEcal.addCandEnergy(et);
201  } else {
202  depEcal.addDeposit(reco::isodeposit::Direction(eHitPos.eta(), eHitPos.phi()), et);
203  }
204  }
205 
206  //Hcal
207  std::vector<const HBHERecHit*>::const_iterator hHitCI = mInfo.hcalRecHits.begin();
208  for (; hHitCI != mInfo.hcalRecHits.end(); ++hHitCI) {
209  const HBHERecHit* hHitCPtr = *hHitCI;
210  GlobalPoint hHitPos = caloGeom->getPosition(hHitCPtr->detid());
211  double deltar0 = reco::deltaR(muon, hHitPos);
212  double cosTheta = 1. / cosh(hHitPos.eta());
213  double energy = hHitCPtr->energy();
214  double et = energy * cosTheta;
215  if (deltar0 > std::max(dRMax_CandDep, theDR_Max) ||
216  !(et > theThreshold_H && energy > 3 * noiseRecHit(hHitCPtr->detid())))
217  continue;
218 
219  bool vetoHit = false;
220  double deltar = reco::deltaR(mInfo.trkGlobPosAtHcal, hHitPos);
222  if (deltar < theDR_Veto_H) {
223  LogDebug("RecoMuon|CaloExtractorByAssociator") << " >>> Veto HBHE hit: Calo deltaR= " << deltar;
224  LogDebug("RecoMuon|CaloExtractorByAssociator")
225  << " >>> Calo eta phi ethcal: " << hHitPos.eta() << " " << hHitPos.phi() << " " << et;
226  vetoHit = true;
227  }
229  if (!vetoHit) {
230  for (unsigned int iH = 0; iH < mInfo.crossedHcalIds.size() && !vetoHit; ++iH) {
231  if (mInfo.crossedHcalIds[iH].rawId() == hHitCPtr->detid().rawId())
232  vetoHit = true;
233  }
234  }
235 
236  //check theDR_Max only here to keep vetoHits being added to the veto energy
237  if (deltar0 > theDR_Max && !vetoHit)
238  continue;
239 
240  if (vetoHit) {
241  depHcal.addCandEnergy(et);
242  } else {
243  depHcal.addDeposit(reco::isodeposit::Direction(hHitPos.eta(), hHitPos.phi()), et);
244  }
245  }
246 
247  //HOcal
248  std::vector<const HORecHit*>::const_iterator hoHitCI = mInfo.hoRecHits.begin();
249  for (; hoHitCI != mInfo.hoRecHits.end(); ++hoHitCI) {
250  const HORecHit* hoHitCPtr = *hoHitCI;
251  GlobalPoint hoHitPos = caloGeom->getPosition(hoHitCPtr->detid());
252  double deltar0 = reco::deltaR(muon, hoHitPos);
253  double cosTheta = 1. / cosh(hoHitPos.eta());
254  double energy = hoHitCPtr->energy();
255  double et = energy * cosTheta;
256  if (deltar0 > std::max(dRMax_CandDep, theDR_Max) ||
257  !(et > theThreshold_HO && energy > 3 * noiseRecHit(hoHitCPtr->detid())))
258  continue;
259 
260  bool vetoHit = false;
261  double deltar = reco::deltaR(mInfo.trkGlobPosAtHO, hoHitPos);
263  if (deltar < theDR_Veto_HO) {
264  LogDebug("RecoMuon|CaloExtractorByAssociator") << " >>> Veto HO hit: Calo deltaR= " << deltar;
265  LogDebug("RecoMuon|CaloExtractorByAssociator")
266  << " >>> Calo eta phi ethcal: " << hoHitPos.eta() << " " << hoHitPos.phi() << " " << et;
267  vetoHit = true;
268  }
270  if (!vetoHit) {
271  for (unsigned int iH = 0; iH < mInfo.crossedHOIds.size() && !vetoHit; ++iH) {
272  if (mInfo.crossedHOIds[iH].rawId() == hoHitCPtr->detid().rawId())
273  vetoHit = true;
274  }
275  }
276 
277  //check theDR_Max only here to keep vetoHits being added to the veto energy
278  if (deltar0 > theDR_Max && !vetoHit)
279  continue;
280 
281  if (vetoHit) {
282  depHOcal.addCandEnergy(et);
283  } else {
284  depHOcal.addDeposit(reco::isodeposit::Direction(hoHitPos.eta(), hoHitPos.phi()), et);
285  }
286  }
287 
288  } else {
290  std::vector<const CaloTower*>::const_iterator calCI = mInfo.towers.begin();
291  for (; calCI != mInfo.towers.end(); ++calCI) {
292  const CaloTower* calCPtr = *calCI;
293  double deltar0 = reco::deltaR(muon, *calCPtr);
294  if (deltar0 > std::max(dRMax_CandDep, theDR_Max))
295  continue;
296 
297  //even more copy-pasting .. need to refactor
298  double etecal = calCPtr->emEt();
299  double eecal = calCPtr->emEnergy();
300  bool doEcal = etecal > theThreshold_E && eecal > 3 * noiseEcal(*calCPtr);
301  double ethcal = calCPtr->hadEt();
302  double ehcal = calCPtr->hadEnergy();
303  bool doHcal = ethcal > theThreshold_H && ehcal > 3 * noiseHcal(*calCPtr);
304  double ethocal = calCPtr->outerEt();
305  double ehocal = calCPtr->outerEnergy();
306  bool doHOcal = ethocal > theThreshold_HO && ehocal > 3 * noiseHOcal(*calCPtr);
307  if ((!doEcal) && (!doHcal) && (!doHcal))
308  continue;
309 
310  bool vetoTowerEcal = false;
311  double deltarEcal = reco::deltaR(mInfo.trkGlobPosAtEcal, *calCPtr);
313  if (deltarEcal < theDR_Veto_E) {
314  LogDebug("RecoMuon|CaloExtractorByAssociator") << " >>> Veto ecal tower: Calo deltaR= " << deltarEcal;
315  LogDebug("RecoMuon|CaloExtractorByAssociator")
316  << " >>> Calo eta phi ethcal: " << calCPtr->eta() << " " << calCPtr->phi() << " " << ethcal;
317  vetoTowerEcal = true;
318  }
319  bool vetoTowerHcal = false;
320  double deltarHcal = reco::deltaR(mInfo.trkGlobPosAtHcal, *calCPtr);
322  if (deltarHcal < theDR_Veto_H) {
323  LogDebug("RecoMuon|CaloExtractorByAssociator") << " >>> Veto hcal tower: Calo deltaR= " << deltarHcal;
324  LogDebug("RecoMuon|CaloExtractorByAssociator")
325  << " >>> Calo eta phi ethcal: " << calCPtr->eta() << " " << calCPtr->phi() << " " << ethcal;
326  vetoTowerHcal = true;
327  }
328  bool vetoTowerHOCal = false;
329  double deltarHOcal = reco::deltaR(mInfo.trkGlobPosAtHO, *calCPtr);
331  if (deltarHOcal < theDR_Veto_HO) {
332  LogDebug("RecoMuon|CaloExtractorByAssociator") << " >>> Veto HO tower: Calo deltaR= " << deltarHOcal;
333  LogDebug("RecoMuon|CaloExtractorByAssociator")
334  << " >>> Calo eta phi ethcal: " << calCPtr->eta() << " " << calCPtr->phi() << " " << ethcal;
335  vetoTowerHOCal = true;
336  }
337 
339  if (!(vetoTowerHOCal && vetoTowerHcal && vetoTowerEcal)) {
340  for (unsigned int iH = 0; iH < mInfo.crossedTowerIds.size(); ++iH) {
341  if (mInfo.crossedTowerIds[iH].rawId() == calCPtr->id().rawId()) {
342  vetoTowerEcal = true;
343  vetoTowerHcal = true;
344  vetoTowerHOCal = true;
345  break;
346  }
347  }
348  }
349 
350  if (deltar0 > theDR_Max && !(vetoTowerEcal || vetoTowerHcal || vetoTowerHOCal))
351  continue;
352 
353  reco::isodeposit::Direction towerDir(calCPtr->eta(), calCPtr->phi());
355  if (doEcal) {
356  if (vetoTowerEcal)
357  depEcal.addCandEnergy(etecal);
358  else if (deltar0 <= theDR_Max)
359  depEcal.addDeposit(towerDir, etecal);
360  }
361  if (doHcal) {
362  if (vetoTowerHcal)
363  depHcal.addCandEnergy(ethcal);
364  else if (deltar0 <= theDR_Max)
365  depHcal.addDeposit(towerDir, ethcal);
366  }
367  if (doHOcal) {
368  if (vetoTowerHOCal)
369  depHOcal.addCandEnergy(ethocal);
370  else if (deltar0 <= theDR_Max)
371  depHOcal.addDeposit(towerDir, ethocal);
372  }
373  }
374  }
375 
376  std::vector<IsoDeposit> resultDeps;
377  resultDeps.push_back(depEcal);
378  resultDeps.push_back(depHcal);
379  resultDeps.push_back(depHOcal);
380 
381  return resultDeps;
382 }
383 
385  double noise = theNoiseTow_EB;
386  double eta = tower.eta();
387  if (fabs(eta) > 1.479)
388  noise = theNoiseTow_EE;
389  return noise;
390 }
391 
393  double noise = fabs(tower.eta()) > 1.479 ? theNoise_HE : theNoise_HB;
394  return noise;
395 }
396 
398  double noise = theNoise_HO;
399  return noise;
400 }
401 
402 double CaloExtractorByAssociator::noiseRecHit(const DetId& detId) const {
403  double noise = 100;
404  DetId::Detector det = detId.det();
405  if (det == DetId::Ecal) {
406  EcalSubdetector subDet = (EcalSubdetector)(detId.subdetId());
407  if (subDet == EcalBarrel) {
408  noise = theNoise_EB;
409  } else if (subDet == EcalEndcap) {
410  noise = theNoise_EE;
411  }
412  } else if (det == DetId::Hcal) {
413  HcalSubdetector subDet = (HcalSubdetector)(detId.subdetId());
414  if (subDet == HcalBarrel) {
415  noise = theNoise_HB;
416  } else if (subDet == HcalEndcap) {
417  noise = theNoise_HE;
418  } else if (subDet == HcalOuter) {
419  noise = theNoise_HO;
420  }
421  }
422  return noise;
423 }
#define LogDebug(id)
constexpr float energy() const
Definition: CaloRecHit.h:29
T getParameter(std::string const &) const
bool compare(const P &i, const P &j)
math::XYZPoint trkGlobPosAtHO
const Veto & veto() const
Get veto area.
Definition: IsoDeposit.h:80
double eta() const final
momentum pseudorapidity
std::vector< const CaloTower * > towers
void setVeto(const Veto &aVeto)
Set veto.
Definition: IsoDeposit.h:82
std::vector< DetId > crossedTowerIds
std::string thePropagatorName
propagator name to feed into the track associator
double hadEt() const
Definition: CaloTower.h:140
constexpr const DetId & detid() const
Definition: CaloRecHit.h:33
std::vector< const EcalRecHit * > ecalRecHits
hits in the cone
std::vector< DetId > crossedEcalIds
double theDR_Max
max cone size in which towers are considered
double outerEt() const
Definition: CaloTower.h:141
#define nullptr
Geom::Phi< T > phi() const
Definition: PV3DBase.h:66
const DetId & detid() const
Definition: EcalRecHit.h:72
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
std::vector< Track > TrackCollection
collection of Tracks
Definition: TrackFwd.h:14
void loadParameters(const edm::ParameterSet &, edm::ConsumesCollector &)
double noiseHOcal(const CaloTower &tower) const
double phi() const
azimuthal angle of momentum vector
Definition: TrackBase.h:614
std::vector< std::string > theDepositInstanceLabels
multiple deposits: labels – expect 3 labels beginning with "e", "h", "ho"
double noiseHcal(const CaloTower &tower) const
double theDR_Veto_E
cone sizes inside which the Et (towers) are not counted
TrackAssociatorParameters * theAssociatorParameters
associator, its&#39; parameters and the propagator
std::vector< DetId > crossedHcalIds
void addDeposit(double dr, double deposit)
Add deposit (ie. transverse energy or pT)
Definition: IsoDeposit.cc:19
math::XYZPoint trkGlobPosAtHcal
double eta() const
pseudorapidity of momentum vector
Definition: TrackBase.h:617
double noiseEcal(const CaloTower &tower) const
Determine noise for HCAL and ECAL (take some defaults for the time being)
double emEnergy() const
Definition: CaloTower.h:134
void setPropagator(const Propagator *)
use a user configured propagator
std::vector< const HBHERecHit * > hcalRecHits
void addCandEnergy(double et)
Set energy or pT attached to cand trajectory.
Definition: IsoDeposit.h:132
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:48
std::vector< DetId > crossedHOIds
GlobalPoint getPosition(const DetId &id) const
Get the position of a given detector id.
Definition: CaloGeometry.cc:50
HcalSubdetector
Definition: HcalAssistant.h:31
float energy() const
Definition: EcalRecHit.h:68
reco::IsoDeposit deposit(const edm::Event &ev, const edm::EventSetup &evSetup, const reco::Track &track) const override
no-op: by design of this extractor the deposits are pulled out all at a time
std::vector< reco::IsoDeposit > deposits(const edm::Event &ev, const edm::EventSetup &evSetup, const reco::Track &track) const override
return deposits for 3 calorimeter subdetectors (ecal, hcal, ho) – in this order
constexpr auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:30
double noiseRecHit(const DetId &detId) const
double hadEnergy() const
Definition: CaloTower.h:135
FreeTrajectoryState initialFreeState() const
Definition: DetId.h:17
CaloTowerDetId id() const
Definition: CaloTower.h:127
reco::IsoDeposit IsoDeposit
Definition: Isolation.h:7
Definition: deltar.py:1
MuonServiceProxy * theService
the event setup proxy, it takes care the services update
void fillVetos(const edm::Event &ev, const edm::EventSetup &evSetup, const reco::TrackCollection &tracks) override
allows to set extra vetoes (in addition to the muon) – no-op at this point
Detector
Definition: DetId.h:24
T eta() const
Definition: PV3DBase.h:73
fixed size matrix
HLT enums.
T get() const
Definition: EventSetup.h:73
TrackDetMatchInfo associate(const edm::Event &, const edm::EventSetup &, const FreeTrajectoryState &, const AssociatorParameters &)
math::XYZPoint trkGlobPosAtEcal
Track position at different parts of the calorimeter.
std::vector< const HORecHit * > hoRecHits
EcalSubdetector
double phi() const final
momentum azimuthal angle
double emEt() const
Definition: CaloTower.h:139
#define constexpr
double outerEnergy() const
Definition: CaloTower.h:136
Definition: event.py:1
constexpr Detector det() const
get the detector field from this detid
Definition: DetId.h:46