CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
MuonKinVsEtaAnalyzer.cc
Go to the documentation of this file.
1 /*
2  * See header file for a description of this class.
3  *
4  * \author S. Goy Lopez, CIEMAT
5  * \author S. Folgueras, U. Oviedo
6  */
9 
12 
13 #include <string>
14 #include <TMath.h>
15 using namespace std;
16 using namespace edm;
17 
18 //#define DEBUG
19 
21  LogTrace(metname)<<"[MuonKinVsEtaAnalyzer] Parameters initialization";
22 
23  parameters = pSet;
24 
25  // the services
26  theService = new MuonServiceProxy(parameters.getParameter<ParameterSet>("ServiceParameters"));
27  theDbe = edm::Service<DQMStore>().operator->();
28 
29  theMuonCollectionLabel_ = consumes<reco::MuonCollection>(parameters.getParameter<InputTag>("MuonCollection"));
30  theVertexLabel_ = consumes<reco::VertexCollection>(parameters.getParameter<edm::InputTag>("VertexLabel"));
31  theBeamSpotLabel_ = mayConsume<reco::BeamSpot> (parameters.getParameter<edm::InputTag>("BeamSpotLabel"));
32 }
34  delete theService;
35 }
36 
38  metname = "muonKinVsEta";
39 }
40 
41 void MuonKinVsEtaAnalyzer::beginRun(const edm::Run& iRun, const edm::EventSetup& iSetup){
42  metname = "muonKinVsEta";
43  theDbe->cd();
44  theDbe->setCurrentFolder("Muons/MuonKinVsEtaAnalyzer");
45 
46  etaBin = parameters.getParameter<int>("etaBin");
47  etaMin = parameters.getParameter<double>("etaMin");
48  etaMax = parameters.getParameter<double>("etaMax");
49 
50  phiBin = parameters.getParameter<int>("phiBin");
51  phiMin = parameters.getParameter<double>("phiMin");
52  phiMax = parameters.getParameter<double>("phiMax");
53 
54  pBin = parameters.getParameter<int>("pBin");
55  pMin = parameters.getParameter<double>("pMin");
56  pMax = parameters.getParameter<double>("pMax");
57 
58  ptBin = parameters.getParameter<int>("ptBin");
59  ptMin = parameters.getParameter<double>("ptMin");
60  ptMax = parameters.getParameter<double>("ptMax");
61 
62  chiBin = parameters.getParameter<int>("chiBin");
63  chiMin = parameters.getParameter<double>("chiMin");
64  chiMax = parameters.getParameter<double>("chiMax");
65  chiprobMin = parameters.getParameter<double>("chiprobMin");
66  chiprobMax = parameters.getParameter<double>("chiprobMax");
67 
68  etaBMin = parameters.getParameter<double>("etaBMin");
69  etaBMax = parameters.getParameter<double>("etaBMax");
70  etaECMin = parameters.getParameter<double>("etaECMin");
71  etaECMax = parameters.getParameter<double>("etaECMax");
72  etaOvlpMin = parameters.getParameter<double>("etaOvlpMin");
73  etaOvlpMax = parameters.getParameter<double>("etaOvlpMax");
74 
75  std::string EtaName;
76  for(unsigned int iEtaRegion=0;iEtaRegion<4;iEtaRegion++){
77  if (iEtaRegion==0) EtaName = "Barrel";
78  if (iEtaRegion==1) EtaName = "EndCap";
79  if (iEtaRegion==2) EtaName = "Overlap";
80  if (iEtaRegion==3) EtaName = "";
81 
82  // monitoring of eta parameter
83  etaGlbTrack.push_back(theDbe->book1D("GlbMuon_eta_"+EtaName, "#eta_{GLB} "+EtaName, etaBin, etaMin, etaMax));
84  etaTrack.push_back(theDbe->book1D("TkMuon_eta_"+EtaName, "#eta_{TK} "+EtaName, etaBin, etaMin, etaMax));
85  etaStaTrack.push_back(theDbe->book1D("StaMuon_eta_"+EtaName, "#eta_{STA} "+EtaName, etaBin, etaMin, etaMax));
86  etaTightTrack.push_back(theDbe->book1D("TightMuon_eta_"+EtaName, "#eta_{Tight} "+EtaName, etaBin, etaMin, etaMax));
87  etaLooseTrack.push_back(theDbe->book1D("LooseMuon_eta_"+EtaName, "#eta_{Loose} "+EtaName, etaBin, etaMin, etaMax));
88  etaSoftTrack.push_back(theDbe->book1D("SoftMuon_eta_"+EtaName, "#eta_{Soft} "+EtaName, etaBin, etaMin, etaMax));
89  etaHighPtTrack.push_back(theDbe->book1D("HighPtMuon_eta_"+EtaName, "#eta_{HighPt} "+EtaName, etaBin, etaMin, etaMax));
90 
91  // monitoring of phi paramater
92  phiGlbTrack.push_back(theDbe->book1D("GlbMuon_phi_"+EtaName, "#phi_{GLB} "+EtaName+ "(rad)", phiBin, phiMin, phiMax));
93  phiTrack.push_back(theDbe->book1D("TkMuon_phi_"+EtaName, "#phi_{TK}" +EtaName +"(rad)", phiBin, phiMin, phiMax));
94  phiStaTrack.push_back(theDbe->book1D("StaMuon_phi_"+EtaName, "#phi_{STA}"+EtaName+" (rad)", phiBin, phiMin, phiMax));
95  phiTightTrack.push_back(theDbe->book1D("TightMuon_phi_"+EtaName, "#phi_{Tight}_"+EtaName, phiBin, phiMin, phiMax));
96  phiLooseTrack.push_back(theDbe->book1D("LooseMuon_phi_"+EtaName, "#phi_{Loose}_"+EtaName, phiBin, phiMin, phiMax));
97  phiSoftTrack.push_back(theDbe->book1D("SoftMuon_phi_"+EtaName, "#phi_{Soft}_"+EtaName, phiBin, phiMin, phiMax));
98  phiHighPtTrack.push_back(theDbe->book1D("HighPtMuon_phi_"+EtaName, "#phi_{HighPt}_"+EtaName, phiBin, phiMin, phiMax));
99 
100  // monitoring of the momentum
101  pGlbTrack.push_back(theDbe->book1D("GlbMuon_p_"+EtaName, "p_{GLB} "+EtaName, pBin, pMin, pMax));
102  pTrack.push_back(theDbe->book1D("TkMuon_p"+EtaName, "p_{TK} "+EtaName, pBin, pMin, pMax));
103  pStaTrack.push_back(theDbe->book1D("StaMuon_p"+EtaName, "p_{STA} "+EtaName, pBin, pMin, pMax));
104  pTightTrack.push_back(theDbe->book1D("TightMuon_p_"+EtaName, "p_{Tight} "+EtaName, pBin, pMin, pMax));
105  pLooseTrack.push_back(theDbe->book1D("LooseMuon_p_"+EtaName, "p_{Loose} "+EtaName, pBin, pMin, pMax));
106  pSoftTrack.push_back(theDbe->book1D("SoftMuon_p_"+EtaName, "p_{Soft} "+EtaName, pBin, pMin, pMax));
107  pHighPtTrack.push_back(theDbe->book1D("HighPtMuon_p_"+EtaName, "p_{HighPt} "+EtaName, pBin, pMin, pMax));
108 
109  // monitoring of the transverse momentum
110  ptGlbTrack.push_back(theDbe->book1D("GlbMuon_pt_" +EtaName, "pt_{GLB} "+EtaName, ptBin, ptMin, ptMax));
111  ptTrack.push_back(theDbe->book1D("TkMuon_pt_"+EtaName, "pt_{TK} "+EtaName, ptBin, ptMin, ptMax));
112  ptStaTrack.push_back(theDbe->book1D("StaMuon_pt_"+EtaName, "pt_{STA} "+EtaName, ptBin, ptMin, pMax));
113  ptTightTrack.push_back(theDbe->book1D("TightMuon_pt_"+EtaName, "pt_{Tight} "+EtaName, ptBin, ptMin, ptMax));
114  ptLooseTrack.push_back(theDbe->book1D("LooseMuon_pt_"+EtaName, "pt_{Loose} "+EtaName, ptBin, ptMin, ptMax));
115  ptSoftTrack.push_back(theDbe->book1D("SoftMuon_pt_"+EtaName, "pt_{Soft} "+EtaName, ptBin, ptMin, ptMax));
116  ptHighPtTrack.push_back(theDbe->book1D("HighPtMuon_pt_"+EtaName, "pt_{HighPt} "+EtaName, ptBin, ptMin, ptMax));
117 
118  // monitoring chi2 and Prob.Chi2
119  chi2GlbTrack.push_back(theDbe->book1D("GlbMuon_chi2_"+EtaName, "#chi^{2}_{GLB} " + EtaName, chiBin, chiMin, chiMax));
120  chi2probGlbTrack.push_back(theDbe->book1D("GlbMuon_chi2prob_"+EtaName, "#chi^{2}_{GLB} prob." + EtaName, chiBin, chiprobMin, chiprobMax));
121  chi2Track.push_back(theDbe->book1D("TkMuon_chi2_"+EtaName, "#chi^{2}_{TK} " + EtaName, chiBin, chiMin, chiMax));
122  chi2probTrack.push_back(theDbe->book1D("TkMuon_chi2prob_"+EtaName, "#chi^{2}_{TK} prob." + EtaName, chiBin, chiprobMin, chiprobMax));
123  chi2StaTrack.push_back(theDbe->book1D("StaMuon_chi2_"+EtaName, "#chi^{2}_{STA} " + EtaName, chiBin, chiMin, chiMax));
124  chi2probStaTrack.push_back(theDbe->book1D("StaMuon_chi2prob_"+EtaName, "#chi^{2}_{STA} prob." + EtaName, chiBin, chiprobMin, chiprobMax));
125  chi2TightTrack.push_back(theDbe->book1D("TightMuon_chi2_"+EtaName, "#chi^{2}_{Tight} " + EtaName, chiBin, chiMin, chiMax));
126  chi2probTightTrack.push_back(theDbe->book1D("TightMuon_chi2prob_"+EtaName, "#chi^{2}_{Tight} prob." + EtaName, chiBin, chiprobMin, chiprobMax));
127  chi2LooseTrack.push_back(theDbe->book1D("LooseMuon_chi2_"+EtaName, "#chi^{2}_{Loose} " + EtaName, chiBin, chiMin, chiMax));
128  chi2probLooseTrack.push_back(theDbe->book1D("LooseMuon_chi2prob_"+EtaName, "#chi^{2}_{Loose} prob." + EtaName, chiBin, chiprobMin, chiprobMax));
129  chi2SoftTrack.push_back(theDbe->book1D("SoftMuon_chi2_"+EtaName, "#chi^{2}_{Soft} " + EtaName, chiBin, chiMin, chiMax));
130  chi2probSoftTrack.push_back(theDbe->book1D("SoftMuon_chi2prob_"+EtaName, "#chi^{2}_{Soft} prob." + EtaName, chiBin, chiprobMin, chiprobMax));
131  chi2HighPtTrack.push_back(theDbe->book1D("HighPtMuon_chi2_"+EtaName, "#chi^{2}_{HighPt} " + EtaName, chiBin, chiMin, chiMax));
132  chi2probHighPtTrack.push_back(theDbe->book1D("HighPtMuon_chi2prob_"+EtaName, "#chi^{2}_{HighPt} prob." + EtaName, chiBin, chiprobMin, chiprobMax));
133  }
134 }
136 
137  LogTrace(metname)<<"[MuonKinVsEtaAnalyzer] Analyze the mu in different eta regions";
138  theService->update(iSetup);
139 
141  iEvent.getByToken(theMuonCollectionLabel_,muons);
142 
143  // =================================================================================
144  // Look for the Primary Vertex (and use the BeamSpot instead, if you can't find it):
145  reco::Vertex::Point posVtx;
146  reco::Vertex::Error errVtx;
147  unsigned int theIndexOfThePrimaryVertex = 999.;
148 
150  iEvent.getByToken(theVertexLabel_, vertex);
151  if (vertex.isValid()){
152  for (unsigned int ind=0; ind<vertex->size(); ++ind) {
153  if ( (*vertex)[ind].isValid() && !((*vertex)[ind].isFake()) ) {
154  theIndexOfThePrimaryVertex = ind;
155  break;
156  }
157  }
158  }
159 
160  if (theIndexOfThePrimaryVertex<100) {
161  posVtx = ((*vertex)[theIndexOfThePrimaryVertex]).position();
162  errVtx = ((*vertex)[theIndexOfThePrimaryVertex]).error();
163  }
164  else {
165  LogInfo("RecoMuonValidator") << "reco::PrimaryVertex not found, use BeamSpot position instead\n";
166 
167  edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
168  iEvent.getByToken(theBeamSpotLabel_,recoBeamSpotHandle);
169  reco::BeamSpot bs = *recoBeamSpotHandle;
170 
171  posVtx = bs.position();
172  errVtx(0,0) = bs.BeamWidthX();
173  errVtx(1,1) = bs.BeamWidthY();
174  errVtx(2,2) = bs.sigmaZ();
175  }
176 
177  const reco::Vertex vtx(posVtx,errVtx);
178  // ==========================================================
179 
180 #ifdef DEBUG
181  cout << "[MuonKinVsEtaAnalyzer]: Analyze the mu in different eta regions" << endl;
182 #endif
183  if (!muons.isValid()) return;
184 
185  for (reco::MuonCollection::const_iterator muonIt = muons->begin(); muonIt!=muons->end(); ++muonIt){
186  reco::Muon recoMu = *muonIt;
187 
188  for(unsigned int iEtaRegion=0;iEtaRegion<4;iEtaRegion++){
189  if (iEtaRegion==0) {EtaCutMin= etaBMin; EtaCutMax=etaBMax;}
190  if (iEtaRegion==1) {EtaCutMin= etaECMin; EtaCutMax=etaECMax;}
191  if (iEtaRegion==2) {EtaCutMin= etaOvlpMin; EtaCutMax=etaOvlpMax;}
192  if (iEtaRegion==3) {EtaCutMin= etaBMin; EtaCutMax=etaECMax;}
193 
194  if(recoMu.isGlobalMuon()) {
195 #ifdef DEBUG
196  cout << "[MuonKinVsEtaAnalyzer]: The mu is global... Filling the histos" << endl;
197 #endif
198  LogTrace(metname)<<"[MuonKinVsEtaAnalyzer] The mu is global - filling the histos";
199  reco::TrackRef recoCombinedGlbTrack = recoMu.combinedMuon();
200  // get the track combinig the information from both the glb fit"
201  if(fabs(recoCombinedGlbTrack->eta())>EtaCutMin && fabs(recoCombinedGlbTrack->eta())<EtaCutMax){
202  etaGlbTrack[iEtaRegion]->Fill(recoCombinedGlbTrack->eta());
203  phiGlbTrack[iEtaRegion]->Fill(recoCombinedGlbTrack->phi());
204  pGlbTrack[iEtaRegion]->Fill(recoCombinedGlbTrack->p());
205  ptGlbTrack[iEtaRegion]->Fill(recoCombinedGlbTrack->pt());
206  chi2GlbTrack[iEtaRegion]->Fill(recoCombinedGlbTrack->normalizedChi2());
207  chi2probGlbTrack[iEtaRegion]->Fill(TMath::Prob(recoCombinedGlbTrack->normalizedChi2(),recoCombinedGlbTrack->ndof()));
208  }
209  }
210 
211  if(recoMu.isTrackerMuon()) {
212 #ifdef DEBUG
213  cout << "[MuonKinVsEtaAnalyzer]: The mu is tracker... Filling the histos" << endl;
214 #endif
215  LogTrace(metname)<<"[MuonKinVsEtaAnalyzer] The mu is tracker - filling the histos";
216  // get the track using only the tracker data
217  reco::TrackRef recoTrack = recoMu.track();
218  if(fabs(recoTrack->eta())>EtaCutMin && fabs(recoTrack->eta())<EtaCutMax){
219  etaTrack[iEtaRegion]->Fill(recoTrack->eta());
220  phiTrack[iEtaRegion]->Fill(recoTrack->phi());
221  pTrack[iEtaRegion]->Fill(recoTrack->p());
222  ptTrack[iEtaRegion]->Fill(recoTrack->pt());
223  chi2Track[iEtaRegion]->Fill(recoTrack->normalizedChi2());
224  chi2probTrack[iEtaRegion]->Fill(TMath::Prob(recoTrack->normalizedChi2(),recoTrack->ndof()));
225  }
226  }
227 
228  if(recoMu.isStandAloneMuon()) {
229 #ifdef DEBUG
230  cout << "[MuonKinVsEtaAnalyzer]: The mu is standlone... Filling the histos" << endl;
231 #endif
232  LogTrace(metname)<<"[MuonKinVsEtaAnalyzer] The mu is standalone - filling the histos";
233  // get the track using only the mu spectrometer data
234  reco::TrackRef recoStaTrack = recoMu.standAloneMuon();
235  if(fabs(recoStaTrack->eta())>EtaCutMin && fabs(recoStaTrack->eta())<EtaCutMax){
236  etaStaTrack[iEtaRegion]->Fill(recoStaTrack->eta());
237  phiStaTrack[iEtaRegion]->Fill(recoStaTrack->phi());
238  pStaTrack[iEtaRegion]->Fill(recoStaTrack->p());
239  ptStaTrack[iEtaRegion]->Fill(recoStaTrack->pt());
240  chi2StaTrack[iEtaRegion]->Fill(recoStaTrack->normalizedChi2());
241  chi2probStaTrack[iEtaRegion]->Fill(TMath::Prob(recoStaTrack->normalizedChi2(),recoStaTrack->ndof()));
242  }
243  }
244 
245  if ( muon::isTightMuon(recoMu, vtx) ) {
246 #ifdef DEBUG
247  cout << "[MuonKinVsEtaAnalyzer]: The mu is tight... Filling the histos" << endl;
248 #endif
249  LogTrace(metname)<<"[MuonKinVsEtaAnalyzer] The mu is Tight - filling the histos";
250  reco::TrackRef recoTightTrack = recoMu.combinedMuon();
251  if(fabs(recoTightTrack->eta())>EtaCutMin && fabs(recoTightTrack->eta())<EtaCutMax){
252  etaTightTrack[iEtaRegion]->Fill(recoTightTrack->eta());
253  phiTightTrack[iEtaRegion]->Fill(recoTightTrack->phi());
254  pTightTrack[iEtaRegion]->Fill(recoTightTrack->p());
255  ptTightTrack[iEtaRegion]->Fill(recoTightTrack->pt());
256  chi2TightTrack[iEtaRegion]->Fill(recoTightTrack->normalizedChi2());
257  chi2probTightTrack[iEtaRegion]->Fill(TMath::Prob(recoTightTrack->normalizedChi2(),recoTightTrack->ndof()));
258  }
259  }
260 
261 
262  if ( muon::isLooseMuon(recoMu) ) {
263 #ifdef DEBUG
264  cout << "[MuonKinVsEtaAnalyzer]: The mu is Loose... Filling the histos" << endl;
265 #endif
266  LogTrace(metname)<<"[MuonKinVsEtaAnalyzer] The mu is Loose - filling the histos";
267  reco::TrackRef recoLooseTrack;
268 
269  if ( recoMu.isGlobalMuon()) recoLooseTrack = recoMu.combinedMuon();
270  else recoLooseTrack = recoMu.track();
271 
272  if(fabs(recoLooseTrack->eta())>EtaCutMin && fabs(recoLooseTrack->eta())<EtaCutMax){
273  etaLooseTrack[iEtaRegion]->Fill(recoLooseTrack->eta());
274  phiLooseTrack[iEtaRegion]->Fill(recoLooseTrack->phi());
275  pLooseTrack[iEtaRegion]->Fill(recoLooseTrack->p());
276  ptLooseTrack[iEtaRegion]->Fill(recoLooseTrack->pt());
277  chi2LooseTrack[iEtaRegion]->Fill(recoLooseTrack->normalizedChi2());
278  chi2probLooseTrack[iEtaRegion]->Fill(TMath::Prob(recoLooseTrack->normalizedChi2(),recoLooseTrack->ndof()));
279  }
280  }
281 
282  if ( muon::isSoftMuon(recoMu, vtx) ) {
283 #ifdef DEBUG
284  cout << "[MuonKinVsEtaAnalyzer]: The mu is Soft... Filling the histos" << endl;
285 #endif
286  LogTrace(metname)<<"[MuonKinVsEtaAnalyzer] The mu is Soft - filling the histos";
287  reco::TrackRef recoSoftTrack = recoMu.track();
288  if(fabs(recoSoftTrack->eta())>EtaCutMin && fabs(recoSoftTrack->eta())<EtaCutMax){
289  etaSoftTrack[iEtaRegion]->Fill(recoSoftTrack->eta());
290  phiSoftTrack[iEtaRegion]->Fill(recoSoftTrack->phi());
291  pSoftTrack[iEtaRegion]->Fill(recoSoftTrack->p());
292  ptSoftTrack[iEtaRegion]->Fill(recoSoftTrack->pt());
293  chi2SoftTrack[iEtaRegion]->Fill(recoSoftTrack->normalizedChi2());
294  chi2probSoftTrack[iEtaRegion]->Fill(TMath::Prob(recoSoftTrack->normalizedChi2(),recoSoftTrack->ndof()));
295  }
296  }
297 
298  if ( muon::isHighPtMuon(recoMu, vtx) ) {
299 #ifdef DEBUG
300  cout << "[MuonKinVsEtaAnalyzer]: The mu is HighPt... Filling the histos" << endl;
301 #endif
302  LogTrace(metname)<<"[MuonKinVsEtaAnalyzer] The mu is HightPt - filling the histos";
303  reco::TrackRef recoHighPtTrack = recoMu.combinedMuon();
304  if(fabs(recoHighPtTrack->eta())>EtaCutMin && fabs(recoHighPtTrack->eta())<EtaCutMax){
305  etaHighPtTrack[iEtaRegion]->Fill(recoHighPtTrack->eta());
306  phiHighPtTrack[iEtaRegion]->Fill(recoHighPtTrack->phi());
307  pHighPtTrack[iEtaRegion]->Fill(recoHighPtTrack->p());
308  ptHighPtTrack[iEtaRegion]->Fill(recoHighPtTrack->pt());
309  chi2HighPtTrack[iEtaRegion]->Fill(recoHighPtTrack->normalizedChi2());
310  chi2probHighPtTrack[iEtaRegion]->Fill(TMath::Prob(recoHighPtTrack->normalizedChi2(),recoHighPtTrack->ndof()));
311  }
312  }
313  } //end iEtaRegions
314  } //end recoMu iteration
315 }
dictionary parameters
Definition: Parameters.py:2
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:434
const std::string metname
void analyze(const edm::Event &, const edm::EventSetup &)
Get the analysis.
bool isTrackerMuon() const
Definition: Muon.h:219
virtual TrackRef track() const
reference to a Track
Definition: Muon.h:49
bool isGlobalMuon() const
Definition: Muon.h:218
math::Error< dimension >::type Error
covariance error matrix (3x3)
Definition: Vertex.h:43
bool isStandAloneMuon() const
Definition: Muon.h:220
static int position[TOTALCHAMBERS][3]
Definition: ReadPGInfo.cc:509
bool isLooseMuon(const reco::Muon &)
bool isSoftMuon(const reco::Muon &, const reco::Vertex &)
int iEvent
Definition: GenABIO.cc:243
math::XYZPoint Point
point in the space
Definition: Vertex.h:39
double BeamWidthX() const
beam width X
Definition: BeamSpot.h:86
bool isValid() const
Definition: HandleBase.h:76
#define LogTrace(id)
void beginRun(const edm::Run &iRun, const edm::EventSetup &iSetup)
bool isHighPtMuon(const reco::Muon &, const reco::Vertex &)
virtual TrackRef combinedMuon() const
reference to a stand-alone muon Track
Definition: Muon.h:55
double sigmaZ() const
sigma z
Definition: BeamSpot.h:80
double BeamWidthY() const
beam width Y
Definition: BeamSpot.h:88
tuple muons
Definition: patZpeak.py:38
tuple cout
Definition: gather_cfg.py:121
const Point & position() const
position
Definition: BeamSpot.h:62
bool isTightMuon(const reco::Muon &, const reco::Vertex &)
MuonKinVsEtaAnalyzer(const edm::ParameterSet &pSet)
Constructor.
void beginJob(void)
Initialize parameters for histo binning.
Definition: Run.h:41
~MuonKinVsEtaAnalyzer()
Destructor.
virtual TrackRef standAloneMuon() const
reference to a stand-alone muon Track
Definition: Muon.h:52