ATLAS Offline Software
Loading...
Searching...
No Matches
InDetPerfPlot_Resolution.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
9
11#include <map>
12#include <utility>
13#include <cmath>
14#include "logLinearBinning.h"
17
20
21
22namespace{
23 constexpr float undefinedValue{-9999.};
24 constexpr float smallestAllowableSin(1e-8);
25 constexpr float smallestAllowableTan(1e-8);
26 constexpr float smallestAllowableQoverPt(1e-8);
27}
28
29InDetPerfPlot_Resolution::InDetPerfPlot_Resolution(InDetPlotBase* pParent, const std::string& sDir, bool d0Only) : InDetPlotBase(pParent, sDir),
30 m_resolutionMethod(IDPVM::ResolutionHelper::iterRMS_convergence),
31 m_primTrk(false),
32 m_secdTrk(false),
33 m_allTrk(false),
34
35 m_trkP{},
36 m_truetrkP{},
37 m_trkErrP{},
38
39 m_resP{},
40 m_pullP{},
41 m_sigP{},
42
43 m_pull{},
44 m_res{},
45 m_sigma{},
46
53
60
67
74
81
88
95
99 {
100 m_d0Only = d0Only;
101
102 TString tsDir = (TString) sDir;
103
104 if (tsDir.Contains("Primary")) {
105 m_primTrk = true; // control if sec/prim from init
106 } else if (tsDir.Contains("Secondary")) {
107 m_secdTrk = true;
108 } else {
109 m_allTrk = true;
110 }
111
112
113
114 std::vector<double> ptBins = IDPVM::logLinearBinning(m_nPtBins, m_ptMin, m_ptMax, false);
115 for (int ipt = 0; ipt <= m_nPtBins; ipt++) {
116 m_PtBins[ipt] = (float) ptBins[ipt];
117 }
118
119 std::vector<double> lowPtBins = IDPVM::logLinearBinning(m_nLowPtBins, m_lowPtMin, m_lowPtMax, false);
120 for (int ipt = 0; ipt <= m_nLowPtBins; ipt++) {
121 m_LowPtBins[ipt] = (float) lowPtBins[ipt];
122 }
123
124
125
126}
127
128void
130
131 for (unsigned int iparam = 0; iparam < NPARAMS; iparam++) {
132 //
133 //1D distributions
134 //
135
136 if(iparam == PT) continue;
137 if(m_d0Only && iparam != D0) continue;
138
139 book(m_pull[iparam], "pull_" + m_paramProp[iparam]);
140 book(m_res[iparam], "res_" + m_paramProp[iparam]);
141
142 book(m_sigma[iparam], "sigma_" + m_paramProp[iparam]); //New One
143 //
144 //2D Distributions to evaluate resolutions vs eta and pT
145 //
146 book(m_resHelpereta[iparam], "resHelper_eta_" + m_paramProp[iparam]);
147 book(m_resHelperpt[iparam], "resHelper_pt_" + m_paramProp[iparam]);
148 book(m_resHelperlowpt[iparam], "resHelper_lowpt_" + m_paramProp[iparam]);
149 book(m_pullHelpereta[iparam], "pullHelper_eta_" + m_paramProp[iparam]);
150 book(m_pullHelperpt[iparam], "pullHelper_pt_" + m_paramProp[iparam]);
151 book(m_pullHelperlowpt[iparam], "pullHelper_lowpt_" + m_paramProp[iparam]);
152 m_resHelperpt[iparam]->GetXaxis()->Set(m_nPtBins,m_PtBins);
153 m_pullHelperpt[iparam]->GetXaxis()->Set(m_nPtBins,m_PtBins);
154 m_resHelperlowpt[iparam]->GetXaxis()->Set(m_nLowPtBins,m_LowPtBins);
155 m_pullHelperlowpt[iparam]->GetXaxis()->Set(m_nLowPtBins,m_LowPtBins);
156 //
157 //1D Histograms for the final resolution and means
158 //
159 book(m_reswidth_vs_eta[iparam], "resolution_vs_eta_" + m_paramProp[iparam]);
160 book(m_resmean_vs_eta[iparam], "resmean_vs_eta_" + m_paramProp[iparam]);
161 book(m_reswidth_vs_pt[iparam], "resolution_vs_pt_" + m_paramProp[iparam]);
162 book(m_resmean_vs_pt[iparam], "resmean_vs_pt_" + m_paramProp[iparam]);
163 book(m_reswidth_vs_lowpt[iparam], "resolution_vs_lowpt_" + m_paramProp[iparam]);
164 book(m_resmean_vs_lowpt[iparam], "resmean_vs_lowpt_" + m_paramProp[iparam]);
165
166 book(m_pullwidth_vs_eta[iparam], "pullwidth_vs_eta_" + m_paramProp[iparam]);
167 book(m_pullmean_vs_eta[iparam], "pullmean_vs_eta_" + m_paramProp[iparam]);
168 book(m_pullwidth_vs_pt[iparam], "pullwidth_vs_pt_" + m_paramProp[iparam]);
169 book(m_pullmean_vs_pt[iparam], "pullmean_vs_pt_" + m_paramProp[iparam]);
170 book(m_pullwidth_vs_lowpt[iparam], "pullwidth_vs_lowpt_" + m_paramProp[iparam]);
171 book(m_pullmean_vs_lowpt[iparam], "pullmean_vs_lowpt_" + m_paramProp[iparam]);
172
173 m_reswidth_vs_pt[iparam]->GetXaxis()->Set(m_nPtBins, m_PtBins);
174 m_resmean_vs_pt[iparam]->GetXaxis()->Set(m_nPtBins, m_PtBins);
175 m_pullwidth_vs_pt[iparam]->GetXaxis()->Set(m_nPtBins, m_PtBins);
176 m_pullmean_vs_pt[iparam]->GetXaxis()->Set(m_nPtBins, m_PtBins);
177 m_reswidth_vs_lowpt[iparam]->GetXaxis()->Set(m_nLowPtBins, m_LowPtBins);
178 m_resmean_vs_lowpt[iparam]->GetXaxis()->Set(m_nLowPtBins, m_LowPtBins);
179 m_pullwidth_vs_lowpt[iparam]->GetXaxis()->Set(m_nLowPtBins, m_LowPtBins);
180 m_pullmean_vs_lowpt[iparam]->GetXaxis()->Set(m_nLowPtBins, m_LowPtBins);
181
182 //
183 //TProfiles of the sqrt(covii)
184 //
185 book(m_sigma_vs_eta[iparam], "sigma_vs_eta_" + m_paramProp[iparam]);
186 book(m_sigma_vs_pt[iparam], "sigma_vs_pt_" + m_paramProp[iparam]);
187 book(m_sigma_vs_lowpt[iparam], "sigma_vs_lowpt_" + m_paramProp[iparam]);
188
189 //NORA
190 //
191 //Projections only done if high level of detail specified
192 //To keep functionalies to produce projections for varied number of pt / eta bins
193 //keep histogram to the old Book1D methods instead of xml definitions
194 //
195 //
196 //Detailed histograms
197 //
198 if(m_iDetailLevel >= 200){
199 book(m_resHelpereta_pos[iparam], "resHelper_eta_" + m_paramProp[iparam], "resHelper_eta_" + m_paramProp[iparam]+"_posQ");
200 book(m_resHelpereta_neg[iparam], "resHelper_eta_" + m_paramProp[iparam], "resHelper_eta_" + m_paramProp[iparam]+"_negQ");
201 book(m_resHelperpt_pos[iparam], "resHelper_pt_" + m_paramProp[iparam], "resHelper_pt_" + m_paramProp[iparam]+"_posQ");
202 book(m_resHelperpt_neg[iparam], "resHelper_pt_" + m_paramProp[iparam], "resHelper_pt_" + m_paramProp[iparam]+"_negQ");
203 book(m_resHelperlowpt_pos[iparam], "resHelper_lowpt_" + m_paramProp[iparam], "resHelper_lowpt_" + m_paramProp[iparam]+"_posQ");
204 book(m_resHelperlowpt_neg[iparam], "resHelper_lowpt_" + m_paramProp[iparam], "resHelper_lowpt_" + m_paramProp[iparam]+"_negQ");
205
206 //Add log binning
207 m_resHelperpt_pos[iparam]->GetXaxis()->Set(m_nPtBins,m_PtBins);
208 m_resHelperpt_neg[iparam]->GetXaxis()->Set(m_nPtBins,m_PtBins);
209 m_resHelperlowpt_pos[iparam]->GetXaxis()->Set(m_nLowPtBins,m_LowPtBins);
210 m_resHelperlowpt_neg[iparam]->GetXaxis()->Set(m_nLowPtBins,m_LowPtBins);
211
212 //Resolution, Resolution Mean, Pull, Pull Mean
213 book(m_reswidth_vs_eta_pos[iparam], "resolution_vs_eta_" + m_paramProp[iparam], "resolution_vs_eta_" + m_paramProp[iparam] + "_posQ");
214 book(m_reswidth_vs_eta_neg[iparam], "resolution_vs_eta_" + m_paramProp[iparam], "resolution_vs_eta_" + m_paramProp[iparam] + "_negQ");
215 book(m_resmean_vs_eta_pos[iparam], "resmean_vs_eta_" + m_paramProp[iparam], "resmean_vs_eta_" + m_paramProp[iparam] + "_posQ");
216 book(m_resmean_vs_eta_neg[iparam], "resmean_vs_eta_" + m_paramProp[iparam], "resmean_vs_eta_" + m_paramProp[iparam] + "_negQ");
217
218 book(m_reswidth_vs_pt_pos[iparam], "resolution_vs_pt_" + m_paramProp[iparam], "resolution_vs_pt_" + m_paramProp[iparam] + "_posQ");
219 book(m_reswidth_vs_pt_neg[iparam], "resolution_vs_pt_" + m_paramProp[iparam], "resolution_vs_pt_" + m_paramProp[iparam] + "_negQ");
220 book(m_resmean_vs_pt_pos[iparam], "resmean_vs_pt_" + m_paramProp[iparam], "resmean_vs_pt_" + m_paramProp[iparam] + "_posQ");
221 book(m_resmean_vs_pt_neg[iparam], "resmean_vs_pt_" + m_paramProp[iparam], "resmean_vs_pt_" + m_paramProp[iparam] + "_negQ");
222
223 book(m_reswidth_vs_lowpt_pos[iparam], "resolution_vs_lowpt_" + m_paramProp[iparam], "resolution_vs_lowpt_" + m_paramProp[iparam] + "_posQ");
224 book(m_reswidth_vs_lowpt_neg[iparam], "resolution_vs_lowpt_" + m_paramProp[iparam], "resolution_vs_lowpt_" + m_paramProp[iparam] + "_negQ");
225 book(m_resmean_vs_lowpt_pos[iparam], "resmean_vs_lowpt_" + m_paramProp[iparam], "resmean_vs_lowpt_" + m_paramProp[iparam] + "_posQ");
226 book(m_resmean_vs_lowpt_neg[iparam], "resmean_vs_lowpt_" + m_paramProp[iparam], "resmean_vs_lowpt_" + m_paramProp[iparam] + "_negQ");
227
228 m_reswidth_vs_pt_pos[iparam]->GetXaxis()->Set(m_nPtBins, m_PtBins);
229 m_resmean_vs_pt_pos[iparam]->GetXaxis()->Set(m_nPtBins, m_PtBins);
230 m_reswidth_vs_pt_neg[iparam]->GetXaxis()->Set(m_nPtBins, m_PtBins);
231 m_resmean_vs_pt_neg[iparam]->GetXaxis()->Set(m_nPtBins, m_PtBins);
232 m_reswidth_vs_lowpt_pos[iparam]->GetXaxis()->Set(m_nLowPtBins, m_LowPtBins);
233 m_resmean_vs_lowpt_pos[iparam]->GetXaxis()->Set(m_nLowPtBins, m_LowPtBins);
234 m_reswidth_vs_lowpt_neg[iparam]->GetXaxis()->Set(m_nLowPtBins, m_LowPtBins);
235 m_resmean_vs_lowpt_neg[iparam]->GetXaxis()->Set(m_nLowPtBins, m_LowPtBins);
236
237 std::string tmpName, tmpTitle;
238
239 int nPtBins = m_pullHelperpt[iparam]->GetNbinsX();
240 int nLowPtBins = m_pullHelperlowpt[iparam]->GetNbinsX();
241 int nEtaBins = m_pullHelpereta[iparam]->GetNbinsX();
242
243 std::shared_ptr<TH1D> refHistEta { m_pullHelpereta[iparam]->ProjectionY("refEta")};
244 std::shared_ptr<TH1D> refHistPt { m_pullHelperpt[iparam]->ProjectionY("refPt")};
245 std::shared_ptr<TH1D> refHistLowPt { m_pullHelperlowpt[iparam]->ProjectionY("refLowPt")};
246
247 //Projections - VERY expensive, hence only at higher detail levels above 200
248 if(m_iDetailLevel > 200){
249 for (int ibins = 0; ibins < nPtBins; ibins++) {
250 tmpName = "pullProjection_pt_" + m_paramProp[iparam] +"_bin_"+ std::to_string(ibins + 1);
251 tmpTitle = tmpName + "; (" + m_paramProp[iparam] + "^{reco}-" + m_paramProp[iparam] +
252 "^{true})/#sigma_{" + m_paramProp[iparam] + "}";
253 m_pullProjections_vs_pt[iparam][ibins] = Book1D(tmpName, refHistPt.get(), tmpTitle , false);
254
255
256 tmpName = "resProjection_pt_" + m_paramProp[iparam] +"_bin_"+ std::to_string(ibins + 1);
257 tmpTitle = tmpName + "; " + m_paramProp[iparam] + "^{reco}-" + m_paramProp[iparam] + "^{true} ";
258 m_resProjections_vs_pt[iparam][ibins] = Book1D(tmpName, refHistPt.get(), tmpTitle , false);
259
260 }
261 for (int ibins = 0; ibins < nLowPtBins; ibins++) {
262 tmpName = "pullProjection_lowpt_" + m_paramProp[iparam] +"_bin_"+ std::to_string(ibins + 1);
263 tmpTitle = tmpName + "; (" + m_paramProp[iparam] + "^{reco}-" + m_paramProp[iparam] +
264 "^{true})/#sigma_{" + m_paramProp[iparam] + "}";
265 m_pullProjections_vs_lowpt[iparam][ibins] = Book1D(tmpName, refHistLowPt.get(), tmpTitle , false);
266
267
268 tmpName = "resProjection_lowpt_" + m_paramProp[iparam] +"_bin_"+ std::to_string(ibins + 1);
269 tmpTitle = tmpName + "; " + m_paramProp[iparam] + "^{reco}-" + m_paramProp[iparam] + "^{true} ";
270 m_resProjections_vs_lowpt[iparam][ibins] = Book1D(tmpName, refHistLowPt.get(), tmpTitle , false);
271
272 }
273 for (int ibins = 0; ibins < nEtaBins; ibins++) {
274 tmpName = "pullProjection_eta_" + m_paramProp[iparam] +"_bin_"+ std::to_string(ibins + 1);
275 tmpTitle = tmpName + "; (" + m_paramProp[iparam] + "^{reco}-" + m_paramProp[iparam] +
276 "^{true})/#sigma_{" + m_paramProp[iparam] + "}";
277 m_pullProjections_vs_eta[iparam][ibins] = Book1D(tmpName, refHistEta.get(), tmpTitle , false);
278
279
280 tmpName = "resProjection_eta_" + m_paramProp[iparam] +"_bin_"+ std::to_string(ibins + 1);
281 tmpTitle = tmpName + "; " + m_paramProp[iparam] + "^{reco}-" + m_paramProp[iparam] + "^{true} ";
282 m_resProjections_vs_eta[iparam][ibins] = Book1D(tmpName, refHistEta.get(), tmpTitle , false);
283 }
284 }
285 }
286 //
287 //End of saving resolution and pull residual binnings
288 //
289
290 }
291
292}
293
294void
295InDetPerfPlot_Resolution::fill(const xAOD::TrackParticle& trkprt, const xAOD::TruthParticle& truthprt, float weight) {
296
297 int isPrimTrk = 0;
298 int isSecdTrk = 0;
299
300 if (HepMC::is_simulation_particle(&truthprt)) {
301 isSecdTrk = 1;
302 } else {
303 if (HepMC::uniqueID(truthprt) > 0) isPrimTrk = 1;
304 }
305
306 // Move on to the next track incase the wrong track category
307 if (!isPrimTrk && !isSecdTrk) {
308 return;
309 }
310 if (!isPrimTrk && m_primTrk) {
311 return;
312 }
313 if (!isSecdTrk && m_secdTrk) {
314 return;
315 }
316
317 // Get track paramters for truth and reco tracks for easy access
318 // store all in track parameter maps trkP/truetrkP
319 getTrackParameters(trkprt);
320 getTrackParameters(truthprt);
322 getPlots(weight);
323
324}
325
326
327void
329 for (int iParams = 0; iParams < NPARAMS; iParams++) m_truetrkP[iParams] = 0.;
330 getTrackParameters(trkprt);
332 getPlots(weight, false);
333}
334
335
336
337void
338InDetPerfPlot_Resolution::getPlots(float weight, bool useTruthKin) {
339 float pt = useTruthKin ? m_truetrkP[PT] : m_trkP[PT];
340 float theta = useTruthKin ? m_truetrkP[THETA] : m_trkP[THETA];
341 const float tanHalfTheta = std::tan(theta * 0.5);
342 const bool tanThetaIsSane = std::abs(tanHalfTheta) > smallestAllowableTan;
343 float eta = undefinedValue;
344 if (tanThetaIsSane) eta = -std::log(tanHalfTheta);
345 for (unsigned int iparam = 0; iparam < NPARAMS; iparam++) {
346 if(iparam == PT) continue;
347 if(m_d0Only && iparam != D0) continue;
348 m_pull[iparam]->Fill(m_pullP[iparam], weight);
349 m_res[iparam]->Fill(m_resP[iparam], weight);
350 m_sigma[iparam]->Fill(m_sigP[iparam], weight);
351 m_sigma_vs_eta[iparam]->Fill(eta, m_sigP[iparam], weight);
352 m_sigma_vs_pt[iparam]->Fill(pt, m_sigP[iparam], weight);
353 m_sigma_vs_lowpt[iparam]->Fill(pt, m_sigP[iparam], weight);
354 m_resHelpereta[iparam]->Fill(eta, m_resP[iparam], weight);
355 m_resHelperpt[iparam]->Fill(pt, m_resP[iparam], weight);
356 m_resHelperlowpt[iparam]->Fill(pt, m_resP[iparam], weight);
357 m_pullHelperpt[iparam]->Fill(pt, m_pullP[iparam], weight);
358 m_pullHelperlowpt[iparam]->Fill(pt, m_pullP[iparam], weight);
359 m_pullHelpereta[iparam]->Fill(eta, m_pullP[iparam], weight);
360
361 if(m_iDetailLevel >= 200){
362 if (m_trkP[QOVERPT] >= 0.) {
363 m_resHelpereta_pos[iparam]->Fill(eta, m_resP[iparam], weight);
364 m_resHelperpt_pos[iparam]->Fill(pt, m_resP[iparam], weight);
365 m_resHelperlowpt_pos[iparam]->Fill(pt, m_resP[iparam], weight);
366 }
367 if (m_trkP[QOVERPT] < 0.) {
368 m_resHelpereta_neg[iparam]->Fill(eta, m_resP[iparam], weight);
369 m_resHelperpt_neg[iparam]->Fill(pt, m_resP[iparam], weight);
370 m_resHelperlowpt_neg[iparam]->Fill(pt, m_resP[iparam], weight);
371 }
372 }
373
374 }
375
376}
377
378void
380 for (unsigned int iparam = 0; iparam < NPARAMS; iparam++) {
381 m_resP[iparam] = m_trkP[iparam] - m_truetrkP[iparam];
382 if(iparam==PHI) m_resP[iparam] = xAOD::P4Helpers::deltaPhi(m_trkP[iparam], m_truetrkP[iparam]);
383 m_sigP[iparam] = m_trkErrP[iparam];
384 (m_sigP[iparam] != 0) ? m_pullP[iparam] = m_resP[iparam] / m_sigP[iparam] : m_pullP[iparam] = undefinedValue;
385 }
386 bool saneQoverPt = std::abs(m_truetrkP[QOVERPT]) > smallestAllowableQoverPt;
387 if (not saneQoverPt){
388 m_resP[QOVERPT] = undefinedValue;
389 } else {
390 m_resP[QOVERPT] = (m_trkP[QOVERPT] - m_truetrkP[QOVERPT]) * (1 / m_truetrkP[QOVERPT]); // relative q/pt resolution
391 }
392 bool saneQoverPtrec = std::abs(m_trkP[QOVERPT]) > smallestAllowableQoverPt;
393 if (not saneQoverPtrec){
394 m_sigP[QOVERPT] = undefinedValue;
395 } else {
396 m_sigP[QOVERPT] *= 1. / std::abs(m_trkP[QOVERPT]); // relative q/pt error
397 }
398}
399
400void
402
403 m_trkP[D0] = trkprt.d0();
404 m_trkP[Z0] = trkprt.z0();
405 m_trkP[QOVERP] = trkprt.qOverP() * Gaudi::Units::GeV;
406 const float sinTheta{std::sin(trkprt.theta())};
407 const float cosTheta{std::cos(trkprt.theta())};
408 const bool saneSineValue = (std::abs(sinTheta) > smallestAllowableSin);
409 const float inverseSinTheta = saneSineValue ? 1./sinTheta : undefinedValue;
410 m_trkP[QOVERPT] = saneSineValue ?
411 trkprt.qOverP()*inverseSinTheta * Gaudi::Units::GeV : undefinedValue;
412 m_trkP[THETA] = trkprt.theta();
413 m_trkP[PHI] = trkprt.phi0();
414 m_trkP[PT] = trkprt.pt() / Gaudi::Units::GeV;
415 m_trkP[Z0SIN] = trkprt.z0() * sinTheta;
416
417 // Track fit errors
418 m_trkErrP[D0] = trkprt.definingParametersCovMatrix()(0, 0) < 0 ? 0 : std::sqrt(trkprt.definingParametersCovMatrix()(0, 0));
419 m_trkErrP[Z0] = trkprt.definingParametersCovMatrix()(1, 1) < 0 ? 0 : std::sqrt(trkprt.definingParametersCovMatrix()(1, 1));
420 m_trkErrP[PHI] = trkprt.definingParametersCovMatrix()(2, 2) < 0 ? 0 : std::sqrt(trkprt.definingParametersCovMatrix()(2, 2));
421 m_trkErrP[THETA] = trkprt.definingParametersCovMatrix()(3, 3) < 0 ? 0 : std::sqrt(trkprt.definingParametersCovMatrix()(3, 3));
422 m_trkErrP[QOVERP] = trkprt.definingParametersCovMatrix()(4, 4) < 0 ? 0 : std::sqrt(trkprt.definingParametersCovMatrix()(4, 4)) * Gaudi::Units::GeV;
423 float qOverPT_err2 = trkprt.definingParametersCovMatrix()(4, 4) * std::pow(inverseSinTheta, 2)
424 + trkprt.definingParametersCovMatrix()(3, 3) * std::pow(trkprt.qOverP() * cosTheta * std::pow(inverseSinTheta, 2), 2)
425 - 2 * trkprt.qOverP() * cosTheta * trkprt.definingParametersCovMatrix()(3, 4) * std::pow(inverseSinTheta, 3);
426 m_trkErrP[QOVERPT] = qOverPT_err2 > 0 ? std::sqrt(qOverPT_err2) * Gaudi::Units::GeV : 0.;
427 float z0sin2 = std::pow(m_trkErrP[Z0] * std::sin(m_trkP[THETA]), 2) + std::pow(m_trkP[Z0] * m_trkErrP[THETA] * std::cos(m_trkP[THETA]), 2) + 2 * m_trkP[Z0] * std::sin(m_trkP[THETA]) * std::cos(m_trkP[THETA]) * trkprt.definingParametersCovMatrix()(1, 3); // Fixing incorrect formula for z0sin error
428 m_trkErrP[Z0SIN] = z0sin2 < 0 ? 0 : std::sqrt(z0sin2);
429
430
431 // Get error on pT, taken from xAOD::TrackingHelpers.pTErr() but this function only works on a pointer input...
432 if (trkprt.definingParametersCovMatrixVec().size() < 15) {
433 throw std::runtime_error(
434 "TrackParticle without covariance matrix for defining parameters or the covariance matrix is wrong dimensionality.");
435 }
436 if (std::abs(trkprt.qOverP()) < 0) {
437 m_trkErrP[PT] = 0.0;
438 throw std::runtime_error("q/p is zero");
439 } else {
440 double pt = trkprt.pt();
441 double diff_qp = -pt / std::abs(trkprt.qOverP());
442 double diff_theta = trkprt.theta() == 0 ? 0 : pt / std::tan(trkprt.theta());
443 const std::vector<float>& cov = trkprt.definingParametersCovMatrixVec();
444 double pt_err2 = diff_qp * (diff_qp * cov[14] + diff_theta * cov[13]) + diff_theta * diff_theta * cov[9];
445 m_trkErrP[PT] = pt_err2 < 0 ? 0 : std::sqrt(pt_err2) / Gaudi::Units::GeV;
446 }
447
448}
449
450
451 void
453 // "d0", "z0", "phi", "theta" , "qOverP"
454 // Perigee for truth particles are in aux container
455 for (int iParams = 0; iParams < NPARAMS; iParams++) {
456 m_truetrkP[iParams] = undefinedValue;
458 if (acc.isAvailable(truthprt)) {
459 m_truetrkP[iParams] = acc(truthprt);
460 }
461 }
462 //rescale Pt
463 m_truetrkP[PT] = truthprt.pt() / Gaudi::Units::GeV;
464 //special cases
465 //need both theta and qOverP for qOverPT
466 //we didnt check qOverP yet, since the closest named variable (strangely; see header) is ptqopt
467 static const SG::ConstAccessor<float> qOverPAcc("qOverP");
468 const float qOverP = qOverPAcc.isAvailable(truthprt) ? qOverPAcc(truthprt) : undefinedValue;
469 if ((qOverP != undefinedValue) and (m_truetrkP[THETA] != undefinedValue)){
470 const float sinTheta =std::sin(m_truetrkP[THETA]);
471 if (std::abs(sinTheta) > smallestAllowableSin){
472 m_truetrkP[QOVERPT] = qOverP / sinTheta * Gaudi::Units::GeV;
473 } else {
474 m_truetrkP[QOVERPT] = undefinedValue;
475 }
476 }
477 m_truetrkP[QOVERP] = qOverP * Gaudi::Units::GeV;
478 //need both z0 and theta for z0sinTheta
479 if ((m_truetrkP[Z0] != undefinedValue) and (m_truetrkP[THETA] != undefinedValue)){
480 const float sinTheta =std::sin(m_truetrkP[THETA]);
481 m_truetrkP[Z0SIN] = m_truetrkP[Z0] * sinTheta;
482 } else {
483 m_truetrkP[Z0SIN] = undefinedValue;
484 }
485}
486
487
488void
490
491 bool saveProjections = (m_iDetailLevel > 200);
492 for (unsigned int iparam = 0; iparam < NPARAMS; iparam++) {
493 if(iparam == PT) continue;
494 if(m_d0Only && iparam != D0) continue;
495 //
496 //Only save vert detailed information if... high detail level
497 //Reduces output for ART / PhysVal
498 //
499 if(m_iDetailLevel >= 200){
500 m_resolutionHelper.makeResolutions(m_resHelpereta[iparam], m_reswidth_vs_eta[iparam], m_resmean_vs_eta[iparam],
501 (saveProjections ? m_resProjections_vs_eta[iparam] : nullptr), saveProjections, m_resolutionMethod);
502 m_resolutionHelper.makeResolutions(m_resHelperpt[iparam], m_reswidth_vs_pt[iparam], m_resmean_vs_pt[iparam],
503 (saveProjections ? m_resProjections_vs_pt[iparam] : nullptr), saveProjections, m_resolutionMethod);
504 m_resolutionHelper.makeResolutions(m_resHelperlowpt[iparam], m_reswidth_vs_lowpt[iparam], m_resmean_vs_lowpt[iparam],
505 (saveProjections ? m_resProjections_vs_lowpt[iparam] : nullptr), saveProjections, m_resolutionMethod);
506 m_resolutionHelper.makeResolutions(m_pullHelperpt[iparam], m_pullwidth_vs_pt[iparam], m_pullmean_vs_pt[iparam],
507 (saveProjections ? m_pullProjections_vs_pt[iparam] : nullptr), saveProjections, m_resolutionMethod);
508 m_resolutionHelper.makeResolutions(m_pullHelperlowpt[iparam], m_pullwidth_vs_lowpt[iparam], m_pullmean_vs_lowpt[iparam],
509 (saveProjections ? m_pullProjections_vs_lowpt[iparam] : nullptr), saveProjections, m_resolutionMethod);
510 m_resolutionHelper.makeResolutions(m_pullHelpereta[iparam], m_pullwidth_vs_eta[iparam], m_pullmean_vs_eta[iparam],
511 (saveProjections ? m_pullProjections_vs_eta[iparam] : nullptr), saveProjections, m_resolutionMethod);
518 } else {
520 m_resolutionHelper.makeResolutions(m_resHelperpt[iparam], m_reswidth_vs_pt[iparam], m_resmean_vs_pt[iparam], m_resolutionMethod);
525 }
526
527 }
528
529}
Scalar eta() const
pseudorapidity method
Scalar theta() const
theta method
Helper class to provide constant type-safe access to aux data.
if(febId1==febId2)
IDPVM::ResolutionHelper::methods m_resolutionMethod
TH1 * m_resProjections_vs_eta[NPARAMS][m_nEtaBins]
TH1 * m_pullProjections_vs_lowpt[NPARAMS][m_nLowPtBins]
TH1 * m_resProjections_vs_pt[NPARAMS][m_nPtBins]
void fill(const xAOD::TrackParticle &trkprt, const xAOD::TruthParticle &truthprt, float weight)
TH1 * m_pullProjections_vs_eta[NPARAMS][m_nEtaBins]
void getTrackParameters(const xAOD::TruthParticle &truthprt)
void getPlots(float weight=1.0, bool useTruthKin=true)
float m_LowPtBins[m_nLowPtBins+1]
TH1 * m_pullProjections_vs_pt[NPARAMS][m_nPtBins]
IDPVM::ResolutionHelper m_resolutionHelper
TH1 * m_resProjections_vs_lowpt[NPARAMS][m_nLowPtBins]
InDetPerfPlot_Resolution(InDetPlotBase *pParent, const std::string &dirName, bool d0Only=false)
void book(Htype *&pHisto, const std::string &histoIdentifier, const std::string &nameOverride="", const std::string &folder="default")
Helper method to book histograms using an identifier string.
InDetPlotBase(InDetPlotBase *pParent, const std::string &dirName)
Constructor taking parent node and directory name for plots.
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
int m_iDetailLevel
Definition PlotBase.h:101
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.
float z0() const
Returns the parameter.
float theta() const
Returns the parameter, which has range 0 to .
const ParametersCovMatrix_t definingParametersCovMatrix() const
Returns the 5x5 symmetric matrix containing the defining parameters covariance matrix.
float d0() const
Returns the parameter.
float qOverP() const
Returns the parameter.
std::vector< float > definingParametersCovMatrixVec() const
Returns the length 6 vector containing the elements of defining parameters covariance matrix.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
float phi0() const
Returns the parameter, which has range to .
virtual double pt() const override final
The transverse momentum ( ) of the particle.
int uniqueID(const T &p)
bool is_simulation_particle(const T &p)
Method to establish if a particle (or barcode) was created during the simulation (TODO update to be s...
Class to retrieve associated truth from a track, implementing a cached response.
std::vector< double > logLinearBinning(const unsigned int nBins, const double absXmin, const double absXmax, const bool symmetriseAroundZero)
double deltaPhi(double phiA, double phiB)
delta Phi in range [-pi,pi[
TrackParticle_v1 TrackParticle
Reference the current persistent version:
TruthParticle_v1 TruthParticle
Typedef to implementation.