CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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(0),
57  theAssociator(0),
58  thePrintTimeReport(par.getUntrackedParameter<bool>("PrintTimeReport"))
59 {
60  ParameterSet serviceParameters = par.getParameter<ParameterSet>("ServiceParameters");
61  theService = new MuonServiceProxy(serviceParameters);
62 
63  //theAssociatorParameters = new TrackAssociatorParameters(par.getParameter<edm::ParameterSet>("TrackAssociatorParameters"), iC);
65  theAssociatorParameters->loadParameters(par.getParameter<edm::ParameterSet>("TrackAssociatorParameters"), iC);
67 }
68 
71  if (theService) delete theService;
72  if (theAssociator) delete theAssociator;
73 }
74 
76 {
77 // LogWarning("CaloExtractorByAssociator")
78 // <<"fillVetos does nothing now: IsoDeposit provides enough functionality\n"
79 // <<"to remove a deposit at/around given (eta, phi)";
80 
81 }
82 
83 IsoDeposit CaloExtractorByAssociator::deposit( const Event & event, const EventSetup& eventSetup, const Track & muon) const
84 {
85  IsoDeposit::Direction muonDir(muon.eta(), muon.phi());
86  IsoDeposit dep(muonDir );
87 
88 // LogWarning("CaloExtractorByAssociator")
89 // <<"single deposit is not an option here\n"
90 // <<"use ::deposits --> extract all and reweight as necessary";
91 
92  return dep;
93 
94 }
95 
96 
98 std::vector<IsoDeposit> CaloExtractorByAssociator::deposits( const Event & event, const EventSetup& eventSetup, const Track & muon) const
99 {
100  theService->update(eventSetup);
102 
105  if (theDepositInstanceLabels.size() != 3){
106  LogError("MuonIsolation")<<"Configuration is inconsistent: Need 3 deposit instance labels";
107  }
108  if (! theDepositInstanceLabels[0].compare(0,1, std::string("e")) == 0
109  || ! theDepositInstanceLabels[1].compare(0,1, std::string("h")) == 0
110  || ! theDepositInstanceLabels[2].compare(0,2, std::string("ho")) == 0){
111  LogWarning("MuonIsolation")<<"Deposit instance labels do not look like (e*, h*, ho*):"
112  <<"proceed at your own risk. The extractor interprets lab0=from ecal; lab1=from hcal; lab2=from ho";
113  }
114 
115  typedef IsoDeposit::Veto Veto;
118  IsoDeposit::Direction muonDir(muon.eta(), muon.phi());
119 
120  IsoDeposit depEcal(muonDir);
121  IsoDeposit depHcal(muonDir);
122  IsoDeposit depHOcal(muonDir);
123 
125  eventSetup.get<IdealMagneticFieldRecord>().get(bField);
126 
127 
128  reco::TransientTrack tMuon(muon, &*bField);
129  FreeTrajectoryState iFTS = tMuon.initialFreeState();
130  TrackDetMatchInfo mInfo = theAssociator->associate(event, eventSetup, iFTS, *theAssociatorParameters);
131 
133  depEcal.setVeto(Veto(reco::isodeposit::Direction(mInfo.trkGlobPosAtEcal.eta(), mInfo.trkGlobPosAtEcal.phi()),
134  theDR_Veto_E));
135  depHcal.setVeto(Veto(reco::isodeposit::Direction(mInfo.trkGlobPosAtHcal.eta(), mInfo.trkGlobPosAtHcal.phi()),
136  theDR_Veto_H));
137  depHOcal.setVeto(Veto(reco::isodeposit::Direction(mInfo.trkGlobPosAtHO.eta(), mInfo.trkGlobPosAtHO.phi()),
138  theDR_Veto_HO));
139 
141  reco::isodeposit::Direction dirTmp = depEcal.veto().vetoDir;
142  double dRtmp = depEcal.veto().dR;
143  depEcal = IsoDeposit(dirTmp); depEcal.setVeto(Veto(dirTmp, dRtmp));
144 
145  dirTmp = depHcal.veto().vetoDir;
146  dRtmp = depHcal.veto().dR;
147  depHcal = IsoDeposit(dirTmp); depHcal.setVeto(Veto(dirTmp, dRtmp));
148 
149  dirTmp = depHOcal.veto().vetoDir;
150  dRtmp = depHOcal.veto().dR;
151  depHOcal = IsoDeposit(dirTmp); depHOcal.setVeto(Veto(dirTmp, dRtmp));
152  }
153 
154  if (theUseRecHitsFlag){
158  eventSetup.get<CaloGeometryRecord>().get(caloGeom);
159 
160  //Ecal
161  std::vector<const EcalRecHit*>::const_iterator eHitCI = mInfo.ecalRecHits.begin();
162  for (; eHitCI != mInfo.ecalRecHits.end(); ++eHitCI){
163  const EcalRecHit* eHitCPtr = *eHitCI;
164  GlobalPoint eHitPos = caloGeom->getPosition(eHitCPtr->detid());
165  double deltar0 = reco::deltaR(muon, eHitPos);
166  double cosTheta = 1./cosh(eHitPos.eta());
167  double energy = eHitCPtr->energy();
168  double et = energy*cosTheta;
169  if (deltar0 > std::max(dRMax_CandDep, theDR_Max)
170  || ! (et > theThreshold_E && energy > 3*noiseRecHit(eHitCPtr->detid()))) continue;
171 
172  bool vetoHit = false;
173  double deltar = reco::deltaR(mInfo.trkGlobPosAtEcal, eHitPos);
175  if (deltar < theDR_Veto_E ){
176  LogDebug("RecoMuon|CaloExtractorByAssociator")
177  << " >>> Veto ECAL hit: Calo deltaR= " << deltar;
178  LogDebug("RecoMuon|CaloExtractorByAssociator")
179  << " >>> Calo eta phi ethcal: " << eHitPos.eta() << " " << eHitPos.phi() << " " << et;
180  vetoHit = true;
181  }
183  if (! vetoHit){
184  for (unsigned int iH = 0; iH< mInfo.crossedEcalIds.size() && ! vetoHit; ++iH){
185  if (mInfo.crossedEcalIds[iH].rawId() == eHitCPtr->detid().rawId()) vetoHit = true;
186  }
187  }
188 
189  //check theDR_Max only here to keep vetoHits being added to the veto energy
190  if (deltar0 > theDR_Max && ! vetoHit) continue;
191 
192  if (vetoHit ){
193  depEcal.addCandEnergy(et);
194  } else {
195  depEcal.addDeposit(reco::isodeposit::Direction(eHitPos.eta(), eHitPos.phi()), et);
196  }
197  }
198 
199  //Hcal
200  std::vector<const HBHERecHit*>::const_iterator hHitCI = mInfo.hcalRecHits.begin();
201  for (; hHitCI != mInfo.hcalRecHits.end(); ++hHitCI){
202  const HBHERecHit* hHitCPtr = *hHitCI;
203  GlobalPoint hHitPos = caloGeom->getPosition(hHitCPtr->detid());
204  double deltar0 = reco::deltaR(muon, hHitPos);
205  double cosTheta = 1./cosh(hHitPos.eta());
206  double energy = hHitCPtr->energy();
207  double et = energy*cosTheta;
208  if (deltar0 > std::max(dRMax_CandDep, theDR_Max)
209  || ! (et > theThreshold_H && energy > 3*noiseRecHit(hHitCPtr->detid()))) continue;
210 
211  bool vetoHit = false;
212  double deltar = reco::deltaR(mInfo.trkGlobPosAtHcal, hHitPos);
214  if (deltar < theDR_Veto_H ){
215  LogDebug("RecoMuon|CaloExtractorByAssociator")
216  << " >>> Veto HBHE hit: Calo deltaR= " << deltar;
217  LogDebug("RecoMuon|CaloExtractorByAssociator")
218  << " >>> Calo eta phi ethcal: " << hHitPos.eta() << " " << hHitPos.phi() << " " << et;
219  vetoHit = true;
220  }
222  if (! vetoHit){
223  for (unsigned int iH = 0; iH< mInfo.crossedHcalIds.size() && ! vetoHit; ++iH){
224  if (mInfo.crossedHcalIds[iH].rawId() == hHitCPtr->detid().rawId()) vetoHit = true;
225  }
226  }
227 
228  //check theDR_Max only here to keep vetoHits being added to the veto energy
229  if (deltar0 > theDR_Max && ! vetoHit) continue;
230 
231  if (vetoHit ){
232  depHcal.addCandEnergy(et);
233  } else {
234  depHcal.addDeposit(reco::isodeposit::Direction(hHitPos.eta(), hHitPos.phi()), et);
235  }
236  }
237 
238  //HOcal
239  std::vector<const HORecHit*>::const_iterator hoHitCI = mInfo.hoRecHits.begin();
240  for (; hoHitCI != mInfo.hoRecHits.end(); ++hoHitCI){
241  const HORecHit* hoHitCPtr = *hoHitCI;
242  GlobalPoint hoHitPos = caloGeom->getPosition(hoHitCPtr->detid());
243  double deltar0 = reco::deltaR(muon, hoHitPos);
244  double cosTheta = 1./cosh(hoHitPos.eta());
245  double energy = hoHitCPtr->energy();
246  double et = energy*cosTheta;
247  if (deltar0 > std::max(dRMax_CandDep, theDR_Max)
248  || ! (et > theThreshold_HO && energy > 3*noiseRecHit(hoHitCPtr->detid()))) continue;
249 
250  bool vetoHit = false;
251  double deltar = reco::deltaR(mInfo.trkGlobPosAtHO, hoHitPos);
253  if (deltar < theDR_Veto_HO ){
254  LogDebug("RecoMuon|CaloExtractorByAssociator")
255  << " >>> Veto HO hit: Calo deltaR= " << deltar;
256  LogDebug("RecoMuon|CaloExtractorByAssociator")
257  << " >>> Calo eta phi ethcal: " << hoHitPos.eta() << " " << hoHitPos.phi() << " " << et;
258  vetoHit = true;
259  }
261  if (! vetoHit){
262  for (unsigned int iH = 0; iH< mInfo.crossedHOIds.size() && ! vetoHit; ++iH){
263  if (mInfo.crossedHOIds[iH].rawId() == hoHitCPtr->detid().rawId()) vetoHit = true;
264  }
265  }
266 
267  //check theDR_Max only here to keep vetoHits being added to the veto energy
268  if (deltar0 > theDR_Max && ! vetoHit) continue;
269 
270  if (vetoHit ){
271  depHOcal.addCandEnergy(et);
272  } else {
273  depHOcal.addDeposit(reco::isodeposit::Direction(hoHitPos.eta(), hoHitPos.phi()), et);
274  }
275  }
276 
277 
278  } else {
280  std::vector<const CaloTower*>::const_iterator calCI = mInfo.towers.begin();
281  for (; calCI != mInfo.towers.end(); ++calCI){
282  const CaloTower* calCPtr = *calCI;
283  double deltar0 = reco::deltaR(muon,*calCPtr);
284  if (deltar0> std::max(dRMax_CandDep, theDR_Max)) continue;
285 
286  //even more copy-pasting .. need to refactor
287  double etecal = calCPtr->emEt();
288  double eecal = calCPtr->emEnergy();
289  bool doEcal = etecal>theThreshold_E && eecal>3*noiseEcal(*calCPtr);
290  double ethcal = calCPtr->hadEt();
291  double ehcal = calCPtr->hadEnergy();
292  bool doHcal = ethcal>theThreshold_H && ehcal>3*noiseHcal(*calCPtr);
293  double ethocal = calCPtr->outerEt();
294  double ehocal = calCPtr->outerEnergy();
295  bool doHOcal = ethocal>theThreshold_HO && ehocal>3*noiseHOcal(*calCPtr);
296  if ((!doEcal) && (!doHcal) && (!doHcal)) continue;
297 
298  bool vetoTowerEcal = false;
299  double deltarEcal = reco::deltaR(mInfo.trkGlobPosAtEcal, *calCPtr);
301  if (deltarEcal < theDR_Veto_E ){
302  LogDebug("RecoMuon|CaloExtractorByAssociator")
303  << " >>> Veto ecal tower: Calo deltaR= " << deltarEcal;
304  LogDebug("RecoMuon|CaloExtractorByAssociator")
305  << " >>> Calo eta phi ethcal: " << calCPtr->eta() << " " << calCPtr->phi() << " " << ethcal;
306  vetoTowerEcal = true;
307  }
308  bool vetoTowerHcal = false;
309  double deltarHcal = reco::deltaR(mInfo.trkGlobPosAtHcal, *calCPtr);
311  if (deltarHcal < theDR_Veto_H ){
312  LogDebug("RecoMuon|CaloExtractorByAssociator")
313  << " >>> Veto hcal tower: Calo deltaR= " << deltarHcal;
314  LogDebug("RecoMuon|CaloExtractorByAssociator")
315  << " >>> Calo eta phi ethcal: " << calCPtr->eta() << " " << calCPtr->phi() << " " << ethcal;
316  vetoTowerHcal = true;
317  }
318  bool vetoTowerHOCal = false;
319  double deltarHOcal = reco::deltaR(mInfo.trkGlobPosAtHO, *calCPtr);
321  if (deltarHOcal < theDR_Veto_HO ){
322  LogDebug("RecoMuon|CaloExtractorByAssociator")
323  << " >>> Veto HO tower: Calo deltaR= " << deltarHOcal;
324  LogDebug("RecoMuon|CaloExtractorByAssociator")
325  << " >>> Calo eta phi ethcal: " << calCPtr->eta() << " " << calCPtr->phi() << " " << ethcal;
326  vetoTowerHOCal = true;
327  }
328 
330  if (! (vetoTowerHOCal && vetoTowerHcal && vetoTowerEcal )){
331  for (unsigned int iH = 0; iH< mInfo.crossedTowerIds.size(); ++iH){
332  if (mInfo.crossedTowerIds[iH].rawId() == calCPtr->id().rawId()){
333  vetoTowerEcal = true;
334  vetoTowerHcal = true;
335  vetoTowerHOCal = true;
336  break;
337  }
338  }
339  }
340 
341  if (deltar0>theDR_Max && !(vetoTowerEcal || vetoTowerHcal || vetoTowerHOCal)) continue;
342 
343  reco::isodeposit::Direction towerDir(calCPtr->eta(), calCPtr->phi());
345  if (doEcal){
346  if (vetoTowerEcal) depEcal.addCandEnergy(etecal);
347  else if (deltar0<=theDR_Max) depEcal.addDeposit(towerDir, etecal);
348  }
349  if (doHcal){
350  if (vetoTowerHcal) depHcal.addCandEnergy(ethcal);
351  else if (deltar0<=theDR_Max) depHcal.addDeposit(towerDir, ethcal);
352  }
353  if (doHOcal){
354  if (vetoTowerHOCal) depHOcal.addCandEnergy(ethocal);
355  else if (deltar0<=theDR_Max) depHOcal.addDeposit(towerDir, ethocal);
356  }
357  }
358  }
359 
360  std::vector<IsoDeposit> resultDeps;
361  resultDeps.push_back(depEcal);
362  resultDeps.push_back(depHcal);
363  resultDeps.push_back(depHOcal);
364 
365  return resultDeps;
366 
367 }
368 
370  double noise = theNoiseTow_EB;
371  double eta = tower.eta();
372  if (fabs(eta)>1.479) noise = theNoiseTow_EE;
373  return noise;
374 }
375 
377  double noise = fabs(tower.eta())> 1.479 ? theNoise_HE : theNoise_HB;
378  return noise;
379 }
380 
382  double noise = theNoise_HO;
383  return noise;
384 }
385 
386 
387 double CaloExtractorByAssociator::noiseRecHit(const DetId& detId) const {
388  double noise = 100;
389  DetId::Detector det = detId.det();
390  if (det == DetId::Ecal){
391  EcalSubdetector subDet = (EcalSubdetector)(detId.subdetId());
392  if (subDet == EcalBarrel){
393  noise = theNoise_EB;
394  } else if (subDet == EcalEndcap){
395  noise = theNoise_EE;
396  }
397  } else if (det == DetId::Hcal){
398  HcalSubdetector subDet = (HcalSubdetector)(detId.subdetId());
399  if (subDet == HcalBarrel){
400  noise = theNoise_HB;
401  } else if (subDet == HcalEndcap){
402  noise = theNoise_HE;
403  } else if (subDet == HcalOuter){
404  noise = theNoise_HO;
405  }
406  }
407  return noise;
408 }
409 
#define LogDebug(id)
T getParameter(std::string const &) const
virtual void fillVetos(const edm::Event &ev, const edm::EventSetup &evSetup, const reco::TrackCollection &tracks)
allows to set extra vetoes (in addition to the muon) – no-op at this point
math::XYZPoint trkGlobPosAtHO
const Veto & veto() const
Get veto area.
Definition: IsoDeposit.h:78
std::vector< const CaloTower * > towers
virtual std::vector< reco::IsoDeposit > deposits(const edm::Event &ev, const edm::EventSetup &evSetup, const reco::Track &track) const
return deposits for 3 calorimeter subdetectors (ecal, hcal, ho) – in this order
void setVeto(const Veto &aVeto)
Set veto.
Definition: IsoDeposit.h:80
std::vector< DetId > crossedTowerIds
std::string thePropagatorName
propagator name to feed into the track associator
const DetId & detid() const
Definition: CaloRecHit.h:21
double hadEt() const
Definition: CaloTower.h:116
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:117
Geom::Phi< T > phi() const
Definition: PV3DBase.h:69
const DetId & detid() const
Definition: EcalRecHit.h:72
std::vector< Track > TrackCollection
collection of Tracks
Definition: TrackFwd.h:14
void loadParameters(const edm::ParameterSet &, edm::ConsumesCollector &)
virtual double phi() const final
momentum azimuthal angle
double noiseHOcal(const CaloTower &tower) const
double phi() const
azimuthal angle of momentum vector
Definition: TrackBase.h:640
std::vector< std::string > theDepositInstanceLabels
multiple deposits: labels – expect 3 labels beginning with &quot;e&quot;, &quot;h&quot;, &quot;ho&quot;
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
#define constexpr
void addDeposit(double dr, double deposit)
Add deposit (ie. transverse energy or pT)
Definition: IsoDeposit.cc:23
math::XYZPoint trkGlobPosAtHcal
uint32_t rawId() const
get the raw id
Definition: DetId.h:43
double eta() const
pseudorapidity of momentum vector
Definition: TrackBase.h:646
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:110
void setPropagator(const Propagator *)
use a user configured propagator
float energy() const
Definition: CaloRecHit.h:17
std::vector< const HBHERecHit * > hcalRecHits
void addCandEnergy(double et)
Set energy or pT attached to cand trajectory.
Definition: IsoDeposit.h:139
std::vector< DetId > crossedHOIds
HcalSubdetector
Definition: HcalAssistant.h:31
float energy() const
Definition: EcalRecHit.h:68
auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:28
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:37
double noiseRecHit(const DetId &detId) const
double hadEnergy() const
Definition: CaloTower.h:111
FreeTrajectoryState initialFreeState() const
Definition: DetId.h:18
CaloTowerDetId id() const
Definition: CaloTower.h:103
reco::IsoDeposit IsoDeposit
Definition: Isolation.h:7
MuonServiceProxy * theService
the event setup proxy, it takes care the services update
Detector
Definition: DetId.h:24
const T & get() const
Definition: EventSetup.h:56
T eta() const
Definition: PV3DBase.h:76
tuple muons
Definition: patZpeak.py:38
TrackDetMatchInfo associate(const edm::Event &, const edm::EventSetup &, const FreeTrajectoryState &, const AssociatorParameters &)
tuple TrackAssociatorParameters
math::XYZPoint trkGlobPosAtEcal
Track position at different parts of the calorimeter.
virtual double eta() const final
momentum pseudorapidity
virtual reco::IsoDeposit deposit(const edm::Event &ev, const edm::EventSetup &evSetup, const reco::Track &track) const
no-op: by design of this extractor the deposits are pulled out all at a time
std::vector< const HORecHit * > hoRecHits
Detector det() const
get the detector field from this detid
Definition: DetId.h:35
EcalSubdetector
double emEt() const
Definition: CaloTower.h:115
double outerEnergy() const
Definition: CaloTower.h:112