CMS 3D CMS Logo

MuonCaloCompatibility.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: MuonIdentification
4 // Class: MuonCaloCompatibility
5 //
6 /*
7 
8  Description: test track muon hypothesis using energy deposition in ECAL,HCAL,HO
9 
10 */
11 //
12 // Original Author: Ingo Bloch
13 //
14 //
18 
19 #include "TFile.h"
20 
22 {
23  const std::string muonfileName = (iConfig.getParameter<edm::FileInPath>("MuonTemplateFileName")).fullPath();
24  const std::string pionfileName = (iConfig.getParameter<edm::FileInPath>("PionTemplateFileName")).fullPath();
25  TFile muon_templates(muonfileName.c_str(),"READ");
26  TFile pion_templates(pionfileName.c_str(),"READ");
27 
28  pion_em_etaEmi.reset((TH2D*) pion_templates.Get("em_etaEmi"));
29  pion_had_etaEmi.reset((TH2D*) pion_templates.Get("had_etaEmi"));
30 
31  pion_em_etaTmi.reset((TH2D*) pion_templates.Get("em_etaTmi"));
32  pion_had_etaTmi.reset((TH2D*) pion_templates.Get("had_etaTmi"));
33 
34  pion_em_etaB.reset((TH2D*) pion_templates.Get("em_etaB"));
35  pion_had_etaB.reset((TH2D*) pion_templates.Get("had_etaB"));
36  pion_ho_etaB.reset((TH2D*) pion_templates.Get("ho_etaB"));
37 
38  pion_em_etaTpl.reset((TH2D*) pion_templates.Get("em_etaTpl"));
39  pion_had_etaTpl.reset((TH2D*) pion_templates.Get("had_etaTpl"));
40 
41  pion_em_etaEpl.reset((TH2D*) pion_templates.Get("em_etaEpl"));
42  pion_had_etaEpl.reset((TH2D*) pion_templates.Get("had_etaEpl"));
43 
44  muon_em_etaEmi.reset((TH2D*) muon_templates.Get("em_etaEmi"));
45  muon_had_etaEmi.reset((TH2D*) muon_templates.Get("had_etaEmi"));
46 
47  muon_em_etaTmi.reset((TH2D*) muon_templates.Get("em_etaTmi"));
48  muon_had_etaTmi.reset((TH2D*) muon_templates.Get("had_etaTmi"));
49 
50  muon_em_etaB.reset((TH2D*) muon_templates.Get("em_etaB"));
51  muon_had_etaB.reset((TH2D*) muon_templates.Get("had_etaB"));
52  muon_ho_etaB.reset((TH2D*) muon_templates.Get("ho_etaB"));
53 
54  muon_em_etaTpl.reset((TH2D*) muon_templates.Get("em_etaTpl"));
55  muon_had_etaTpl.reset((TH2D*) muon_templates.Get("had_etaTpl"));
56 
57  muon_em_etaEpl.reset((TH2D*) muon_templates.Get("em_etaEpl"));
58  muon_had_etaEpl.reset((TH2D*) muon_templates.Get("had_etaEpl"));
59 
60  // Release from the opened file
61  pion_em_etaEmi->SetDirectory(nullptr);
62  pion_had_etaEmi->SetDirectory(nullptr);
63 
64  pion_em_etaTmi->SetDirectory(nullptr);
65  pion_had_etaTmi->SetDirectory(nullptr);
66 
67  pion_em_etaB->SetDirectory(nullptr);
68  pion_had_etaB->SetDirectory(nullptr);
69  pion_ho_etaB->SetDirectory(nullptr);
70 
71  pion_em_etaTpl->SetDirectory(nullptr);
72  pion_had_etaTpl->SetDirectory(nullptr);
73 
74  pion_em_etaEpl->SetDirectory(nullptr);
75  pion_had_etaEpl->SetDirectory(nullptr);
76 
77  muon_em_etaEmi->SetDirectory(nullptr);
78  muon_had_etaEmi->SetDirectory(nullptr);
79 
80  muon_em_etaTmi->SetDirectory(nullptr);
81  muon_had_etaTmi->SetDirectory(nullptr);
82 
83  muon_em_etaB->SetDirectory(nullptr);
84  muon_had_etaB->SetDirectory(nullptr);
85  muon_ho_etaB->SetDirectory(nullptr);
86 
87  muon_em_etaTpl->SetDirectory(nullptr);
88  muon_had_etaTpl->SetDirectory(nullptr);
89 
90  muon_em_etaEpl->SetDirectory(nullptr);
91  muon_had_etaEpl->SetDirectory(nullptr);
92 
93  // change names
94  const std::string prefixPion = "MuonCaloCompatibility_pion_";
95  pion_em_etaEmi->SetName((prefixPion+pion_em_etaEmi->GetName()).c_str());
96  pion_had_etaEmi->SetName((prefixPion+pion_had_etaEmi->GetName()).c_str());
97 
98  pion_em_etaTmi->SetName((prefixPion+pion_em_etaTmi->GetName()).c_str());
99  pion_had_etaTmi->SetName((prefixPion+pion_had_etaTmi->GetName()).c_str());
100 
101  pion_em_etaB->SetName((prefixPion+pion_em_etaB->GetName()).c_str());
102  pion_had_etaB->SetName((prefixPion+pion_had_etaB->GetName()).c_str());
103  pion_ho_etaB->SetName((prefixPion+pion_ho_etaB->GetName()).c_str());
104 
105  pion_em_etaTpl->SetName((prefixPion+pion_em_etaTpl->GetName()).c_str());
106  pion_had_etaTpl->SetName((prefixPion+pion_had_etaTpl->GetName()).c_str());
107 
108  pion_em_etaEpl->SetName((prefixPion+pion_em_etaEpl->GetName()).c_str());
109  pion_had_etaEpl->SetName((prefixPion+pion_had_etaEpl->GetName()).c_str());
110 
111  const std::string prefixMuon = "MuonCaloCompatibility_muon_";
112  muon_em_etaEmi->SetName((prefixMuon+muon_em_etaEmi->GetName()).c_str());
113  muon_had_etaEmi->SetName((prefixMuon+muon_had_etaEmi->GetName()).c_str());
114 
115  muon_em_etaTmi->SetName((prefixMuon+muon_em_etaTmi->GetName()).c_str());
116  muon_had_etaTmi->SetName((prefixMuon+muon_had_etaTmi->GetName()).c_str());
117 
118  muon_em_etaB->SetName((prefixMuon+muon_em_etaB->GetName()).c_str());
119  muon_had_etaB->SetName((prefixMuon+muon_had_etaB->GetName()).c_str());
120  muon_ho_etaB->SetName((prefixMuon+muon_ho_etaB->GetName()).c_str());
121 
122  muon_em_etaTpl->SetName((prefixMuon+muon_em_etaTpl->GetName()).c_str());
123  muon_had_etaTpl->SetName((prefixMuon+muon_had_etaTpl->GetName()).c_str());
124 
125  muon_em_etaEpl->SetName((prefixMuon+muon_em_etaEpl->GetName()).c_str());
126  muon_had_etaEpl->SetName((prefixMuon+muon_had_etaEpl->GetName()).c_str());
127 
128  pbx = -1;
129  pby = -1;
130  pbz = -1;
131 
132  psx = -1;
133  psy = -1;
134  psz = -1;
135 
136  muon_compatibility = -1;
137 
138  use_corrected_hcal = true;
139  use_em_special = true;
140  isConfigured_ = true;
141 }
142 
143 bool MuonCaloCompatibility::accessing_overflow( const TH2D& histo, double x, double y ) {
144  bool access = false;
145 
146  if( histo.GetXaxis()->FindBin(x) == 0 ||
147  histo.GetXaxis()->FindBin(x) > histo.GetXaxis()->GetNbins() ) {
148  access = true;
149  }
150  if( histo.GetYaxis()->FindBin(y) == 0 ||
151  histo.GetYaxis()->FindBin(y) > histo.GetYaxis()->GetNbins() ) {
152  access = true;
153  }
154  return access;
155 }
156 
158  if (! isConfigured_) {
159  edm::LogWarning("MuonIdentification") << "MuonCaloCompatibility is not configured! Nothing is calculated.";
160  return -9999;
161  }
162 
163  double eta = 0.;
164  double p = 0.;
165  double em = 0.;
166  double had = 0.;
167  double ho = 0.;
168 
169  // had forgotten this reset in previous versions 070409
170  pbx = 1.;
171  pby = 1.;
172  pbz = 1.;
173 
174  psx = 1.;
175  psy = 1.;
176  psz = 1.;
177 
178  muon_compatibility = -1.;
179 
180  pion_template_em = nullptr;
181  muon_template_em = nullptr;
182 
183  pion_template_had = nullptr;
184  muon_template_had = nullptr;
185 
186  pion_template_ho = nullptr;
187  muon_template_ho = nullptr;
188 
189  // 071002: Get either tracker track, or SAmuon track.
190  // CaloCompatibility templates may have to be specialized for
191  // the use with SAmuons, currently just using the ones produced
192  // using tracker tracks.
193  const reco::Track* track = nullptr;
194  if ( ! amuon.track().isNull() ) {
195  track = amuon.track().get();
196  }
197  else {
198  if ( ! amuon.standAloneMuon().isNull() ) {
199  track = amuon.standAloneMuon().get();
200  }
201  else {
202  throw cms::Exception("FatalError") << "Failed to fill muon id calo_compatibility information for a muon with undefined references to tracks";
203  }
204  }
205 
206  if( !use_corrected_hcal ) { // old eta regions, uncorrected energy
207  eta = track->eta();
208  p = track->p();
209 
210  // new 070904: Set lookup momentum to 1999.9 if larger than 2 TeV.
211  // Though the templates were produced with p<2TeV, we believe that
212  // this approximation should be roughly valid. A special treatment
213  // for >1 TeV muons is advisable anyway :)
214  if( p>=2000. ) p = 1999.9;
215 
216  // p = 10./sin(track->theta()); // use this for templates < 1_5
217  if( use_em_special ) {
218  if( amuon.calEnergy().em == 0. ) em = -5.;
219  else em = amuon.calEnergy().em;
220  }
221  else {
222  em = amuon.calEnergy().em;
223  }
224  had = amuon.calEnergy().had;
225  ho = amuon.calEnergy().ho;
226  }
227  else {
228  eta = track->eta();
229  p = track->p();
230 
231  // new 070904: Set lookup momentum to 1999.9 if larger than 2 TeV.
232  // Though the templates were produced with p<2TeV, we believe that
233  // this approximation should be roughly valid. A special treatment
234  // for >1 TeV muons is advisable anyway :)
235  if( p>=2000. ) p = 1999.9;
236 
237  // p = 10./sin(track->theta()); // use this for templates < 1_5
238  // hcal energy is now done where we get the template histograms (to use corrected cal energy)!
239  // had = amuon.calEnergy().had;
240  if( use_em_special ) {
241  if( amuon.calEnergy().em == 0. ) em = -5.;
242  else em = amuon.calEnergy().em;
243  }
244  else {
245  em = amuon.calEnergy().em;
246  }
247  ho = amuon.calEnergy().ho;
248  }
249 
250 
251  // Skip everyting and return "I don't know" (i.e. 0.5) for uncovered regions:
252  // if( p < 0. || p > 500.) return 0.5; // removed 500 GeV cutoff 070817 after updating the tempates (v2_0) to have valid entried beyond 500 GeV
253  if( p < 0. ) return 0.5; // return "unknown" for unphysical momentum input.
254  if( fabs(eta) > 2.5 ) return 0.5;
255  // temporary fix for low association efficiency:
256  // set caloCompatibility to 0.12345 for tracks
257  // which have 0 energy in BOTH ecal and hcal
258  if( amuon.calEnergy().had == 0.0 && amuon.calEnergy().em == 0.0 ) return 0.12345;
259 
260  // std::cout<<std::endl<<"Input values are: "<<eta <<" "<< p <<" "<< em <<" "<< had <<" "<< ho;
261 
262  // depending on the eta, choose correct histogram: (now all for barrel):
263  // bad! eta range has to be syncronised with choice for histogram... should be read out from the histo file somehow... 070322
264  if(42 != 42) { // old eta ranges and uncorrected hcal energy
265  if(eta <= -1.4) {
266  // std::cout<<"Emi"<<std::endl;
271  }
272  else if(eta > -1.4 && eta <= -1.31) {
273  // std::cout<<"Tmi"<<std::endl;
278  }
279  else if(eta > -1.31 && eta <= 1.31) {
280  // std::cout<<"B"<<std::endl;
287  }
288  else if(eta > 1.31 && eta <= 1.4) {
289  // std::cout<<"Tpl"<<std::endl;
294  }
295  else if(eta > 1.4) {
296  // std::cout<<"Epl"<<std::endl;
301  }
302  else {
303  LogTrace("MuonIdentification")<<"Some very weird thing happened in MuonCaloCompatibility::evaluate - go figure ;) ";
304  return -999;
305  }
306  }
307  else if( 42 == 42 ) { // new eta bins, corrected hcal energy
308  if( track->eta() > 1.27 ) {
309  // had_etaEpl ->Fill(muon->track().get()->p(),1.8/2.2*muon->calEnergy().had );
310  if(use_corrected_hcal) had = 1.8/2.2*amuon.calEnergy().had;
311  else had = amuon.calEnergy().had;
314  }
315  if( track->eta() <= 1.27 && track->eta() > 1.1 ) {
316  // had_etaTpl ->Fill(muon->track().get()->p(),(1.8/(-2.2*muon->track().get()->eta()+5.5))*muon->calEnergy().had );
317  if(use_corrected_hcal) had = (1.8/(-2.2*track->eta()+5.5))*amuon.calEnergy().had;
318  else had = amuon.calEnergy().had;
321  }
322  if( track->eta() <= 1.1 && track->eta() > -1.1 ) {
323  // had_etaB ->Fill(muon->track().get()->p(),sin(muon->track().get()->theta())*muon->calEnergy().had );
324  if(use_corrected_hcal) had = sin(track->theta())*amuon.calEnergy().had;
325  else had = amuon.calEnergy().had;
328  }
329  if( track->eta() <= -1.1 && track->eta() > -1.27 ) {
330  // had_etaTmi ->Fill(muon->track().get()->p(),(1.8/(-2.2*muon->track().get()->eta()+5.5))*muon->calEnergy().had );
331  if(use_corrected_hcal) had = (1.8/(2.2*track->eta()+5.5))*amuon.calEnergy().had;
332  else had = amuon.calEnergy().had;
335  }
336  if( track->eta() <= -1.27 ) {
337  // had_etaEmi ->Fill(muon->track().get()->p(),1.8/2.2*muon->calEnergy().had );
338  if(use_corrected_hcal) had = 1.8/2.2*amuon.calEnergy().had;
339  else had = amuon.calEnergy().had;
342  }
343 
344  // just two eta regions for Ecal (+- 1.479 for barrel, else for rest), no correction:
345 
346  // std::cout<<"We have a muon with an eta of: "<<track->eta()<<std::endl;
347 
348  if( track->eta() > 1.479 ) {
349  // em_etaEpl ->Fill(muon->track().get()->p(),muon->calEnergy().em );
350  // // em_etaTpl ->Fill(muon->track().get()->p(),muon->calEnergy().em );
354  }
355  if( track->eta() <= 1.479 && track->eta() > -1.479 ) {
356  // em_etaB ->Fill(muon->track().get()->p(),muon->calEnergy().em );
360  }
361  if( track->eta() <= -1.479 ) {
362  // // em_etaTmi ->Fill(muon->track().get()->p(),muon->calEnergy().em );
363  // em_etaEmi ->Fill(muon->track().get()->p(),muon->calEnergy().em );
367  }
368 
369  // just one barrel eta region for the HO, no correction
370  // if( track->eta() < 1.4 && track->eta() > -1.4 ) { // experimenting now...
371  if( track->eta() < 1.28 && track->eta() > -1.28 ) {
372  // ho_etaB ->Fill(muon->track().get()->p(),muon->calEnergy().ho );
376  }
377 
378 
379  }
380 
381 
382  if( 42 != 42 ) { // check validity of input template histos and input variables"
383  pion_template_em ->ls();
384  pion_template_had->ls();
386  muon_template_em ->ls();
387  muon_template_had->ls();
389 
390  LogTrace("MuonIdentification")<<"Input variables: eta p em had ho "<<"\n"
391  <<eta<<" "<<p<<" "<<em<<" "<<had<<" "<<ho<<" "<<"\n"
392  <<"cal uncorr: em had ho "<<"\n"
393  <<eta<<" "<<p<<" "<<amuon.calEnergy().em<<" "<<amuon.calEnergy().had<<" "<<amuon.calEnergy().ho;
394  }
395 
396 
397  // Look up Compatibility by, where x is p and y the energy.
398  // We have a set of different histograms for different regions of eta.
399 
400  // need error meassage in case the template histos are missing / the template file is not present!!! 070412
401 
402  if( pion_template_em ) { // access ecal background template
403  if( accessing_overflow( *pion_template_em, p, em ) ) {
404  pbx = 1.;
405  psx = 1.;
406  LogTrace("MuonIdentification")<<" // Message: trying to access overflow bin in MuonCompatibility template for ecal - defaulting signal and background ";
407  LogTrace("MuonIdentification")<<" // template value to 1. "<<pion_template_em->GetName()<<" e: "<<em<<" p: "<<p;
408  }
409  else pbx = pion_template_em->GetBinContent( pion_template_em->GetXaxis()->FindBin(p), pion_template_em->GetYaxis()->FindBin(em) );
410  }
411  if( pion_template_had ) { // access hcal background template
412  if( accessing_overflow( *pion_template_had, p, had ) ) {
413  pby = 1.;
414  psy = 1.;
415  LogTrace("MuonIdentification")<<" // Message: trying to access overflow bin in MuonCompatibility template for hcal - defaulting signal and background ";
416  LogTrace("MuonIdentification")<<" // template value to 1. "<<pion_template_had->GetName()<<" e: "<<had<<" p: "<<p;
417  }
418  else pby = pion_template_had->GetBinContent( pion_template_had->GetXaxis()->FindBin(p), pion_template_had->GetYaxis()->FindBin(had) );
419  }
420  if(pion_template_ho) { // access ho background template
421  if( accessing_overflow( *pion_template_ho, p, ho ) ) {
422  pbz = 1.;
423  psz = 1.;
424  LogTrace("MuonIdentification")<<" // Message: trying to access overflow bin in MuonCompatibility template for ho - defaulting signal and background ";
425  LogTrace("MuonIdentification")<<" // template value to 1. "<<pion_template_ho->GetName()<<" e: "<<em<<" p: "<<p;
426  }
427  else pbz = pion_template_ho->GetBinContent( pion_template_ho->GetXaxis()->FindBin(p), pion_template_ho->GetYaxis()->FindBin(ho) );
428  }
429 
430 
431  if( muon_template_em ) { // access ecal background template
432  if( accessing_overflow( *muon_template_em, p, em ) ) {
433  psx = 1.;
434  pbx = 1.;
435  LogTrace("MuonIdentification")<<" // Message: trying to access overflow bin in MuonCompatibility template for ecal - defaulting signal and background ";
436  LogTrace("MuonIdentification")<<" // template value to 1. "<<muon_template_em->GetName()<<" e: "<<em<<" p: "<<p;
437  }
438  else psx = muon_template_em->GetBinContent( muon_template_em->GetXaxis()->FindBin(p), muon_template_em->GetYaxis()->FindBin(em) );
439  }
440  if( muon_template_had ) { // access hcal background template
441  if( accessing_overflow( *muon_template_had, p, had ) ) {
442  psy = 1.;
443  pby = 1.;
444  LogTrace("MuonIdentification")<<" // Message: trying to access overflow bin in MuonCompatibility template for hcal - defaulting signal and background ";
445  LogTrace("MuonIdentification")<<" // template value to 1. "<<muon_template_had->GetName()<<" e: "<<had<<" p: "<<p;
446  }
447  else psy = muon_template_had->GetBinContent( muon_template_had->GetXaxis()->FindBin(p), muon_template_had->GetYaxis()->FindBin(had) );
448  }
449  if(muon_template_ho) { // access ho background template
450  if( accessing_overflow( *muon_template_ho, p, ho ) ) {
451  psz = 1.;
452  pbz = 1.;
453  LogTrace("MuonIdentification")<<" // Message: trying to access overflow bin in MuonCompatibility template for ho - defaulting signal and background ";
454  LogTrace("MuonIdentification")<<" // template value to 1. "<<muon_template_ho->GetName()<<" e: "<<ho<<" p: "<<p;
455  }
456  else psz = muon_template_ho->GetBinContent( muon_template_ho->GetXaxis()->FindBin(p), muon_template_ho->GetYaxis()->FindBin(ho) );
457  }
458 
459  // erm - what is this?!?! How could the HO probability be less than 0????? Do we want this line!?!?
460  if(psz <= 0.) psz = 1.;
461  if(pbz <= 0.) pbz = 1.;
462 
463  // Protection agains empty bins - set cal part to neutral if the bin of the template is empty
464  // (temporary fix, a proper extrapolation would be better)
465  if (psx == 0. || pbx == 0.) {
466  psx = 1.;
467  pbx = 1.;
468  }
469  if (psy == 0. || pby == 0.) {
470  psy = 1.;
471  pby = 1.;
472  }
473  if (psz == 0. || pbz == 0.) {
474  psz = 1.;
475  pbz = 1.;
476  }
477 
478  // There are two classes of events that deliver 0 for the hcal or ho energy:
479  // 1) the track momentum is so low that the extrapolation tells us it should not have reached the cal
480  // 2) the crossed cell had an reading below the readout cuts.
481  // The 2nd case discriminates between muons and hadrons, the 1st not. Thus for the time being,
482  // we set the returned ps and pb to 0 for these cases.
483  // We need to have a return value different from 0 for the 1st case in the long run.
484  if ( had == 0.0 ) {
485  psy = 1.;
486  pby = 1.;
487  }
488  if ( ho == 0.0 ) {
489  psz = 1.;
490  pbz = 1.;
491  }
492 
493 
494  // Set em to neutral if no energy in em or negative energy measured.
495  // (These cases might indicate problems in the ecal association or readout?! The only
496  // hint so far: for critical eta region (eta in [1.52, 1.64]) have negative em values.)
497  if( em <= 0. && !use_em_special ) {
498  pbx = 1.;
499  psx = 1.;
500  }
501 
502  if( (psx*psy*psz+pbx*pby*pbz) > 0. ) muon_compatibility = psx*psy*psz / (psx*psy*psz+pbx*pby*pbz);
503  else {
504  LogTrace("MuonIdentification")<<"Divide by 0 - defaulting consistency to 0.5 (neutral)!!";
505  muon_compatibility = 0.5;
506  LogTrace("MuonIdentification")<<"Input variables: eta p em had ho "<<"\n"
507  <<eta<<" "<<p<<" "<<em<<" "<<had<<" "<<ho<<" "<<"\n"
508  <<"cal uncorr: em had ho "<<"\n"
509  <<eta<<" "<<p<<" "<<amuon.calEnergy().em<<" "<<amuon.calEnergy().had<<" "<<amuon.calEnergy().ho;
510  }
511  return muon_compatibility;
512 }
std::shared_ptr< TH2D > muon_em_etaTmi
double p() const
momentum vector magnitude
Definition: TrackBase.h:615
T getParameter(std::string const &) const
std::shared_ptr< TH2D > muon_template_em
std::shared_ptr< TH2D > muon_em_etaEmi
std::shared_ptr< TH2D > pion_ho_etaB
TrackRef track() const override
reference to a Track
Definition: Muon.h:49
std::shared_ptr< TH2D > muon_ho_etaB
std::shared_ptr< TH2D > pion_had_etaEpl
double theta() const
polar angle
Definition: TrackBase.h:579
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
double evaluate(const reco::Muon &)
std::shared_ptr< TH2D > pion_had_etaB
std::shared_ptr< TH2D > pion_em_etaEpl
std::shared_ptr< TH2D > muon_had_etaEpl
std::shared_ptr< TH2D > muon_template_ho
std::shared_ptr< TH2D > pion_template_em
std::shared_ptr< TH2D > pion_had_etaTmi
float ho
energy deposited in crossed HO towers
Definition: MuonEnergy.h:32
std::shared_ptr< TH2D > muon_template_had
double eta() const
pseudorapidity of momentum vector
Definition: TrackBase.h:651
std::shared_ptr< TH2D > pion_em_etaB
std::shared_ptr< TH2D > pion_em_etaTmi
std::shared_ptr< TH2D > muon_had_etaTpl
T const * get() const
Returns C++ pointer to the item.
Definition: Ref.h:245
bool isNull() const
Checks for null.
Definition: Ref.h:250
#define LogTrace(id)
TrackRef standAloneMuon() const override
reference to a stand-alone muon Track
Definition: Muon.h:52
MuonEnergy calEnergy() const
get energy deposition information
Definition: Muon.h:111
bool accessing_overflow(const TH2D &histo, double x, double y)
void configure(const edm::ParameterSet &)
std::shared_ptr< TH2D > pion_template_had
std::shared_ptr< TH2D > pion_template_ho
std::shared_ptr< TH2D > muon_em_etaB
std::shared_ptr< TH2D > pion_em_etaTpl
std::shared_ptr< TH2D > pion_had_etaEmi
std::shared_ptr< TH2D > muon_had_etaTmi
std::shared_ptr< TH2D > pion_em_etaEmi
std::shared_ptr< TH2D > muon_em_etaTpl
std::shared_ptr< TH2D > pion_had_etaTpl
std::shared_ptr< TH2D > muon_had_etaEmi
std::shared_ptr< TH2D > muon_had_etaB
std::shared_ptr< TH2D > muon_em_etaEpl