ATLAS Offline Software
Loading...
Searching...
No Matches
MuonParamElossPlots.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
8
9namespace Muon{
10
11MuonParamElossPlots::MuonParamElossPlots(PlotBase *pParent, const std::string& sDir):PlotBase(pParent, sDir) {}
12
14{
15 msInnerMatchChi2 = Book1D("msInnerMatchChi2","inner match #chi^{2};inner match #chi^{2};;Entries",100,0.,100.);
16 msOuterMatchChi2 = Book1D("msOuterMatchChi2","outer match #chi^{2};outer match #chi^{2};;Entries",100,0.,100.);
17
18 ELoss = Book1D("ELoss","ELoss;ELoss [GeV];Entries",50,0,10);
19 ELossDiffTruth = Book1D("ELossDiffTruth","Difference ELoss to truth ELoss);#Delta(fitted - truth) [GeV];Entries",100,-10.,10.);
20 ELossDiffTruthEta0_1p35 = Book1D("ELossDiffTruthEta0_1p35","Difference ELoss to truth ELoss for 0<|#eta|<1.35;#Delta(fitted - truth) [GeV];Entries",100,-10.,10.);
21 ELossDiffTruthEta1p35_1p55 = Book1D("ELossDiffTruthEta1p35_1p55","Difference ELoss to truth ELoss for 1.35<|#eta|<1.55;#Delta(fitted - truth) [GeV];Entries",100,-10.,10.);
22 ELossDiffTruthEta1p55_end = Book1D("ELossDiffTruthEta1p55_end","Difference ELoss to truth ELoss for 1.55<|#eta|;#Delta(fitted - truth) [GeV];Entries",100,-10.,10.);
23 ELossSigma = Book1D("ELossSigma","ELossSigma;ELossSgima [GeV];Entries",50,0,5);
24
25 paramELoss = Book1D("paramELoss","paramELoss;paramELoss [GeV];Entries",50,0,10);
26 paramELossDiff = Book1D("paramELossDiff","Difference paramELoss to fitted ELoss;#Delta(param-fitted) [GeV];Entries",100,-3.,1.);
27 paramELossDiffTruth = Book1D("paramELossDiffTruth","Difference paramELoss to truth ELoss;#Delta(param-truth) [GeV];Entries",100,-10.,10.);
28 paramELossDiffTruthEta0_1p35 = Book1D("paramELossDiffTruthEta0_1p35","Difference paramELoss to truth ELoss for 0<|#eta|<1.35;#Delta(param-truth) [GeV];Entries",100,-10.,10.);
29 paramELossDiffTruthEta1p35_1p55 = Book1D("paramELossDiffTruthEta1p35_1p55","Difference paramELoss to truth ELoss for 1.35<|#eta|<1.55;#Delta(param-truth) [GeV];Entries",100,-10.,10.);
30 paramELossDiffTruthEta1p55_end = Book1D("paramELossDiffTruthhEta1p55_end","Difference paramELoss to truth ELoss for 1.55<|#eta|;#Delta(param-truth) [GeV];Entries",100,-10.,10.);
31
32 measELoss = Book1D("measELoss","measELoss;measELoss [GeV];Entries",50,0,10);
33 measELossDiff = Book1D("measELossDiff","Difference measELoss to fitted ELoss);#Delta(meas- fitted) [GeV];Entries",100,-3.,1.);
34 measELossDiffTruth = Book1D("measELossDiffTruth","Difference measELoss to truth ELoss);#Delta(meas- truth) [GeV];Entries",100,-10.,10.);
35 measELossDiffTruthEta0_1p35 = Book1D("measELossDiffTruthEta0_1p35","Difference measELoss to truth ELoss for 0<|#eta|<1.35;#Delta(meas- truth) [GeV];Entries",100,-10.,10.);
36 measELossDiffTruthEta1p35_1p55 = Book1D("measELossDiffTruthEta1p35_1p55","Difference measELoss to truth ELoss for 1.35<|#eta|<1.55;#Delta(meas- truth) [GeV];Entries",100,-10.,10.);
37 measELossDiffTruthEta1p55_end = Book1D("measELossDiffTruthEta1p55_end","Difference measELoss to truth ELoss for 1.55<|#eta|;#Delta(meas- truth) [GeV];Entries",100,-10.,10.);
38
39 ELossType = Book1D("ELossType","ELossType;Type;Entries",5,-0.5,4.5);
40 ELossTypeParametrPt = Book1D("ELossTypeParametrPt","ELossType:Parametrized Pt;Pt [GeV];Entries",50,0,500);
41 ELossTypeNotIsoPt = Book1D("ELossTypeNotIsoPt","ELossType:NotIsolated Pt;Pt [GeV];Entries",50,0,500);
42 ELossTypeTailPt = Book1D("ELossTypeTailPt","ELossType:Tail Pt;Pt [GeV];Entries",50,0,500);
43 ELossTypeAllPt = Book1D("ELossTypeAllPt","All ELossTypes Pt;Pt [GeV];Entries",50,0,500);
44}
45
46 void MuonParamElossPlots::fill(const xAOD::TruthParticle& truthmu, const xAOD::Muon& mu, float weight)
47{
48 FillPlot(msInnerMatchChi2,mu,xAOD::Muon::msInnerMatchChi2,weight);
49 FillPlot(msOuterMatchChi2,mu,xAOD::Muon::msOuterMatchChi2, weight);
50#ifndef XAOD_ANALYSIS
53 FillPlot(ELossSigma,mu,xAOD::Muon::EnergyLossSigma,0.001,weight);
55 FillPlotELossType(ELossType,mu,0.001,weight);
56 FillPlotELossType(ELossTypeNotIsoPt,mu,xAOD::Muon::NotIsolated,0.001,weight);
57 FillPlotELossType(ELossTypeParametrPt,mu,xAOD::Muon::Parametrized,0.001,weight);
58 FillPlotELossType(ELossTypeTailPt,mu,xAOD::Muon::Tail,0.001,weight);
59#endif // not XAOD_ANALYSIS
60}
61 void MuonParamElossPlots::FillPlot(TH1* hist, const xAOD::Muon& mu,const xAOD::Muon::ParamDef paramDef,float scale, float weight) {
62 if (mu.author()==xAOD::Muon::CaloTag || mu.author()==xAOD::Muon::CaloLikelihood || mu.author()==xAOD::Muon::ExtrapolateMuonToIP) return; //protection
63 float fpar = 0;
64 static const SG::ConstAccessor<float> elossAcc ("EnergyLoss");
65 if (elossAcc.isAvailable(mu)) {
66 if (mu.parameter(fpar, paramDef))
67 hist->Fill(scale*fpar,weight); //scale to GeV, if needed
68 }
69 return;
70}
71 void MuonParamElossPlots::FillPlot(TH1* hist, TH1* hist_DiffTruth, TH1* hist_DiffTruthEta0_1p35, TH1* hist_DiffTruthEta1p35_1p55, TH1* hist_DiffTruthEta1p55_end, const xAOD::TruthParticle& truthprt, const xAOD::Muon& mu,const xAOD::Muon::ParamDef paramDef,float scale, float weight) {
72 if (mu.author()==xAOD::Muon::CaloTag || mu.author()==xAOD::Muon::CaloLikelihood || mu.author()==xAOD::Muon::ExtrapolateMuonToIP) return; //protection
73 float fpar = 0;
74 static const SG::ConstAccessor<float> elossAcc("EnergyLoss");
75 if (elossAcc.isAvailable(mu)) {
76 if (mu.parameter(fpar, paramDef))
77 hist->Fill(scale*fpar,weight); //scale to GeV, if needed
78
79 //get true energy loss
80 static const SG::ConstAccessor<float> pxAcc("px");
81 static const SG::ConstAccessor<float> pyAcc("py");
82 static const SG::ConstAccessor<float> pzAcc("pz");
83 static const SG::ConstAccessor<float> muonEnt_pxAcc("MuonEntryLayer_px");
84 static const SG::ConstAccessor<float> muonEnt_pyAcc("MuonEntryLayer_py");
85 static const SG::ConstAccessor<float> muonEnt_pzAcc("MuonEntryLayer_pz");
86 if (!pxAcc.isAvailable(truthprt) ||
87 !pyAcc.isAvailable(truthprt) ||
88 !pzAcc.isAvailable(truthprt) ||
89 !muonEnt_pxAcc.isAvailable(truthprt) ||
90 !muonEnt_pyAcc.isAvailable(truthprt) ||
91 !muonEnt_pzAcc.isAvailable(truthprt)) return;
92
93 //workaround for missing caloentry
94 Amg::Vector3D vecCaloEntry{pxAcc(truthprt),
95 pyAcc(truthprt),
96 pzAcc(truthprt)};
97
98 Amg::Vector3D vecMuonExit{muonEnt_pxAcc(truthprt),
99 muonEnt_pyAcc(truthprt),
100 muonEnt_pzAcc(truthprt)};
101 float dpTruth=vecCaloEntry.mag()-vecMuonExit.mag();
102 hist_DiffTruth->Fill(scale*(fpar-dpTruth),weight); //scale to GeV, if needed
103 //again in eta ranges
104 if (std::abs(mu.eta())<1.35) hist_DiffTruthEta0_1p35->Fill(scale*(fpar-dpTruth),weight);
105 else {
106 if (std::abs(mu.eta())<1.55) hist_DiffTruthEta1p35_1p55->Fill(scale*(fpar-dpTruth),weight);
107 else hist_DiffTruthEta1p55_end->Fill(scale*(fpar-dpTruth),weight);
108 }
109 }
110 return;
111}
112 void MuonParamElossPlots::FillPlotELossType(TH1* hist, const xAOD::Muon& mu, float scale, float weight) {
113 if (mu.author()==xAOD::Muon::CaloTag || mu.author()==xAOD::Muon::CaloLikelihood || mu.author()==xAOD::Muon::ExtrapolateMuonToIP) return; //protection
114 static const SG::ConstAccessor<float> elossAcc("EnergyLoss");
115 if (elossAcc.isAvailable(mu)) {
116 hist->Fill(mu.energyLossType(), weight);
117 ELossTypeAllPt->Fill(mu.pt()*scale, weight);
118 float used=0;
119 float meas=-100000;
120 float param=-100000;
121 if (mu.parameter(used, xAOD::Muon::EnergyLoss) && mu.parameter(param, xAOD::Muon::ParamEnergyLoss) && mu.parameter(meas, xAOD::Muon::MeasEnergyLoss ) ){
122 //fill diff plots
123 if (mu.energyLossType()==xAOD::Muon::Parametrized){
124 paramELossDiff->Fill((param-used)*scale, weight);
125 }
126 if (mu.energyLossType()==xAOD::Muon::Tail){
127 measELossDiff->Fill((meas-used)*scale, weight);
128 }
129 }
130 }
131 return;
132}
133 void MuonParamElossPlots::FillPlotELossType(TH1* hist, const xAOD::Muon& mu, const xAOD::Muon::EnergyLossType type, float scale, float weight) {
134 if (mu.author()==xAOD::Muon::CaloTag || mu.author()==xAOD::Muon::CaloLikelihood || mu.author()==xAOD::Muon::ExtrapolateMuonToIP) return; //protection
135 static const SG::ConstAccessor<float> elossAcc("EnergyLoss");
136 if (elossAcc.isAvailable(mu)) {
137 if (mu.energyLossType()==type) hist->Fill(mu.pt()*scale,weight); //scale to GeV, if needed
138 }
139 return;
140}
141}//namespace Muon
Helper class to provide constant type-safe access to aux data.
void FillPlotELossType(TH1 *hist, const xAOD::Muon &mu, float scale=1, float weight=1.0)
MuonParamElossPlots(PlotBase *pParent, const std::string &sDir)
void FillPlot(TH1 *hist, const xAOD::Muon &mu, const xAOD::Muon::ParamDef paramDef, float scale=1, float weight=1.0)
void fill(const xAOD::TruthParticle &truthMu, const xAOD::Muon &mu, float weight=1.0)
TH1D * Book1D(const std::string &name, const std::string &labels, int nBins, float start, float end, bool prependDir=true)
Book a TH1D histogram.
Definition PlotBase.cxx:94
PlotBase(PlotBase *parent, const std::string &sDir)
Definition PlotBase.cxx:29
Helper class to provide constant type-safe access to aux data.
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
holding In fact this class is here in order to allow STL container for all features This class is sho...
Eigen::Matrix< double, 3, 1 > Vector3D
NRpcCablingAlg reads raw condition data and writes derived condition data to the condition store.
TruthParticle_v1 TruthParticle
Typedef to implementation.
Muon_v1 Muon
Reference the current persistent version: