ATLAS Offline Software
Loading...
Searching...
No Matches
InDetPerfPlot_VertexTruthMatching.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
15#include "TFitResult.h"
16#include "TFitResultPtr.h"
17#include "GaudiKernel/PhysicalConstants.h"
18
19using namespace IDPVM;
20
21InDetPerfPlot_VertexTruthMatching::InDetPerfPlot_VertexTruthMatching(InDetPlotBase* pParent, const std::string& sDir, const int detailLevel, bool isITk) :
22 InDetPlotBase(pParent, sDir),
23 m_isITk(isITk),
24 m_detailLevel(detailLevel),
25 m_vx_type_truth(nullptr),
38 m_vx_hs_reco_eff(nullptr),
39 m_vx_hs_sel_eff(nullptr),
41 m_vx_hs_reco_sel_eff(nullptr),
42 m_vx_hs_sel_eff_dist(nullptr),
43 m_vx_hs_sel_eff_mu(nullptr),
50
51 //Longitudinal and transverse resolution plots for hs vertices
58
59 m_vx_hs_z_pull(nullptr),
60 m_vx_hs_y_pull(nullptr),
61 m_vx_hs_x_pull(nullptr),
62 m_vx_all_z_pull(nullptr),
63 m_vx_all_y_pull(nullptr),
64 m_vx_all_x_pull(nullptr),
65 m_vx_hs_z_res(nullptr),
66 m_vx_hs_y_res(nullptr),
67 m_vx_hs_x_res(nullptr),
68 m_vx_all_z_res(nullptr),
69 m_vx_all_y_res(nullptr),
70 m_vx_all_x_res(nullptr),
95
96 // New Expert Histograms for vertex classifiations
97 m_vx_ntracks_matched(nullptr),
98 m_vx_ntracks_merged(nullptr),
99 m_vx_ntracks_split(nullptr),
101 m_vx_ntracks_HS_merged(nullptr),
102 m_vx_ntracks_HS_split(nullptr),
105 m_vx_ntracks_ALL_split(nullptr),
106 m_vx_sumpT_matched(nullptr),
107 m_vx_sumpT_merged(nullptr),
108 m_vx_sumpT_split(nullptr),
109 m_vx_sumpT_HS_matched(nullptr),
110 m_vx_sumpT_HS_merged(nullptr),
111 m_vx_sumpT_HS_split(nullptr),
112
113 m_vx_z_asym_matched(nullptr),
114 m_vx_z_asym_merged(nullptr),
115 m_vx_z_asym_split(nullptr),
116 m_vx_z_asym_HS_matched(nullptr),
117 m_vx_z_asym_HS_merged(nullptr),
118 m_vx_z_asym_HS_split(nullptr),
125
132
139
146
149 m_vx_z0_skewness_split(nullptr),
153
156 m_vx_z0_kurtosis_split(nullptr),
160
161 m_vx_sumpT_ALL_matched(nullptr),
162 m_vx_sumpT_ALL_merged(nullptr),
163 m_vx_sumpT_ALL_split(nullptr),
165 m_vx_z_asym_ALL_merged(nullptr),
166 m_vx_z_asym_ALL_split(nullptr),
170
174
178
182
186
190
198 m_vx_nVertices_HS_fake(nullptr),
199 m_vx_nVertices_matched(nullptr),
200 m_vx_nVertices_merged(nullptr),
201 m_vx_nVertices_split(nullptr),
202 m_vx_nVertices_fake(nullptr),
203
204 m_vx_all_dz(nullptr),
205 m_vx_hs_mindz(nullptr),
206
207 m_vx_PUdensity(nullptr),
208 m_vx_nTruth(nullptr),
210
211
212{
213 // nop
214}
215
217
218 book(m_vx_type_truth,"vx_type_truth");
219 book(m_vx_x_diff,"vx_x_diff");
220 book(m_vx_x_diff_pull,"vx_x_diff_pull");
221 book(m_vx_y_diff,"vx_y_diff");
222 book(m_vx_y_diff_pull,"vx_y_diff_pull");
223 book(m_vx_z_diff,"vx_z_diff");
224 book(m_vx_z_diff_pull,"vx_z_diff_pull");
225 if(m_isITk){
226 book(m_vx_time_diff,"vx_time_diff");
227 book(m_vx_time_diff_pull,"vx_time_diff_pull");
228 }
229 if (m_detailLevel >= 200) {
230 book(m_vx_hs_classification,"vx_hs_classification");
231 book(m_vx_nReco_vs_nTruth_inclusive,"vx_nReco_vs_nTruth_inclusive");
232 book(m_vx_nReco_vs_nTruth_matched,"vx_nReco_vs_nTruth_matched");
233 book(m_vx_nReco_vs_nTruth_merged,"vx_nReco_vs_nTruth_merged");
234 book(m_vx_nReco_vs_nTruth_split,"vx_nReco_vs_nTruth_split");
235 book(m_vx_nReco_vs_nTruth_fake,"vx_nReco_vs_nTruth_fake");
236 book(m_vx_nReco_vs_nTruth_dummy,"vx_nReco_vs_nTruth_dummy");
237 book(m_vx_nReco_vs_nTruth_clean,"vx_nReco_vs_nTruth_clean");
238 book(m_vx_nReco_vs_nTruth_lowpu,"vx_nReco_vs_nTruth_lowpu");
239 book(m_vx_nReco_vs_nTruth_highpu,"vx_nReco_vs_nTruth_highpu");
240 book(m_vx_nReco_vs_nTruth_hssplit,"vx_nReco_vs_nTruth_hssplit");
241 book(m_vx_nReco_vs_nTruth_none,"vx_nReco_vs_nTruth_none");
242 book(m_vx_hs_reco_eff,"vx_hs_reco_eff");
243 book(m_vx_hs_sel_eff,"vx_hs_sel_eff");
244 book(m_vx_hs_sel_eff_vs_nReco,"vx_hs_sel_eff_vs_nReco");
245 book(m_vx_hs_reco_sel_eff,"vx_hs_reco_sel_eff");
246 book(m_vx_hs_sel_eff_dist,"vx_hs_sel_eff_dist");
247 book(m_vx_hs_sel_eff_mu,"vx_hs_sel_eff_mu");
248 book(m_vx_hs_sel_eff_dist_vs_nReco,"vx_hs_sel_eff_dist_vs_nReco");
249 book(m_vx_hs_reco_eff_vs_ntruth,"vx_hs_reco_eff_vs_ntruth");
250 book(m_vx_hs_sel_eff_vs_ntruth,"vx_hs_sel_eff_vs_ntruth");
251 book(m_vx_hs_reco_sel_eff_vs_ntruth,"vx_hs_reco_sel_eff_vs_ntruth");
252 book(m_vx_hs_reco_long_reso,"vx_hs_reco_long_reso");
253 book(m_vx_hs_reco_trans_reso,"vx_hs_reco_trans_reso");
254
255 //Helpers for resolution plots for HS vertex
256 book(m_resHelper_PUdensity_hsVxTruthLong,"resHelper_PUdensity_hsVxTruthLong");
257 book(m_resolution_vs_PUdensity_hsVxTruthLong,"resolution_vs_PUdensity_hsVxTruthLong");
258 book(m_resmean_vs_PUdensity_hsVxTruthLong,"resmean_vs_PUdensity_hsVxTruthLong");
259
260 book(m_resHelper_PUdensity_hsVxTruthTransv,"resHelper_PUdensity_hsVxTruthTransv");
261 book(m_resolution_vs_PUdensity_hsVxTruthTransv,"resolution_vs_PUdensity_hsVxTruthTransv");
262 book(m_resmean_vs_PUdensity_hsVxTruthTransv,"resmean_vs_PUdensity_hsVxTruthTransv");
263
264 book(m_vx_hs_z_pull,"vx_TYPE_z_pull","vx_hs_z_pull");
265 book(m_vx_hs_y_pull,"vx_TYPE_y_pull","vx_hs_y_pull");
266 book(m_vx_hs_x_pull,"vx_TYPE_x_pull","vx_hs_x_pull");
267
268 book(m_vx_all_z_pull,"vx_TYPE_z_pull","vx_all_z_pull");
269 book(m_vx_all_y_pull,"vx_TYPE_y_pull","vx_all_y_pull");
270 book(m_vx_all_x_pull,"vx_TYPE_x_pull","vx_all_x_pull");
271
272 book(m_vx_hs_z_res,"vx_TYPE_z_reso","vx_hs_z_res");
273 book(m_vx_hs_y_res,"vx_TYPE_y_reso","vx_hs_y_res");
274 book(m_vx_hs_x_res,"vx_TYPE_x_reso","vx_hs_x_res");
275 book(m_vx_all_z_res,"vx_TYPE_z_reso","vx_all_z_res");
276 book(m_vx_all_y_res,"vx_TYPE_y_reso","vx_all_y_res");
277 book(m_vx_all_x_res,"vx_TYPE_x_reso","vx_all_x_res");
278
279 book(m_vx_all_truth_z_res_vs_PU, "vx_TYPE_truth_reso_z_vs_PU", "vx_all_truth_reso_z_vs_PU");
280 book(m_vx_all_truth_x_res_vs_PU, "vx_TYPE_truth_reso_x_vs_PU", "vx_all_truth_reso_x_vs_PU");
281 book(m_vx_all_truth_y_res_vs_PU, "vx_TYPE_truth_reso_y_vs_PU", "vx_all_truth_reso_y_vs_PU");
282 book(m_vx_all_truth_z_res_vs_nTrk, "vx_TYPE_truth_reso_z_vs_nTrk", "vx_all_truth_reso_z_vs_nTrk");
283 book(m_vx_all_truth_x_res_vs_nTrk, "vx_TYPE_truth_reso_x_vs_nTrk", "vx_all_truth_reso_x_vs_nTrk");
284 book(m_vx_all_truth_y_res_vs_nTrk, "vx_TYPE_truth_reso_y_vs_nTrk", "vx_all_truth_reso_y_vs_nTrk");
285
286 book(m_vx_all_truth_z_pull_vs_PU, "vx_TYPE_truth_pull_z_vs_PU", "vx_all_truth_pull_z_vs_PU");
287 book(m_vx_all_truth_x_pull_vs_PU, "vx_TYPE_truth_pull_x_vs_PU", "vx_all_truth_pull_x_vs_PU");
288 book(m_vx_all_truth_y_pull_vs_PU, "vx_TYPE_truth_pull_y_vs_PU", "vx_all_truth_pull_y_vs_PU");
289 book(m_vx_all_truth_z_pull_vs_nTrk, "vx_TYPE_truth_pull_z_vs_nTrk", "vx_all_truth_pull_z_vs_nTrk");
290 book(m_vx_all_truth_x_pull_vs_nTrk, "vx_TYPE_truth_pull_x_vs_nTrk", "vx_all_truth_pull_x_vs_nTrk");
291 book(m_vx_all_truth_y_pull_vs_nTrk, "vx_TYPE_truth_pull_y_vs_nTrk", "vx_all_truth_pull_y_vs_nTrk");
292
293 book(m_vx_hs_truth_z_res_vs_PU, "vx_TYPE_truth_reso_z_vs_PU", "vx_hs_truth_reso_z_vs_PU");
294 book(m_vx_hs_truth_x_res_vs_PU, "vx_TYPE_truth_reso_x_vs_PU", "vx_hs_truth_reso_x_vs_PU");
295 book(m_vx_hs_truth_y_res_vs_PU, "vx_TYPE_truth_reso_y_vs_PU", "vx_hs_truth_reso_y_vs_PU");
296 book(m_vx_hs_truth_z_res_vs_nTrk, "vx_TYPE_truth_reso_z_vs_nTrk", "vx_hs_truth_reso_z_vs_nTrk");
297 book(m_vx_hs_truth_x_res_vs_nTrk, "vx_TYPE_truth_reso_x_vs_nTrk", "vx_hs_truth_reso_x_vs_nTrk");
298 book(m_vx_hs_truth_y_res_vs_nTrk, "vx_TYPE_truth_reso_y_vs_nTrk", "vx_hs_truth_reso_y_vs_nTrk");
299
300 book(m_vx_hs_truth_z_pull_vs_PU, "vx_TYPE_truth_pull_z_vs_PU", "vx_hs_truth_pull_z_vs_PU");
301 book(m_vx_hs_truth_x_pull_vs_PU, "vx_TYPE_truth_pull_x_vs_PU", "vx_hs_truth_pull_x_vs_PU");
302 book(m_vx_hs_truth_y_pull_vs_PU, "vx_TYPE_truth_pull_y_vs_PU", "vx_hs_truth_pull_y_vs_PU");
303 book(m_vx_hs_truth_z_pull_vs_nTrk, "vx_TYPE_truth_pull_z_vs_nTrk", "vx_hs_truth_pull_z_vs_nTrk");
304 book(m_vx_hs_truth_x_pull_vs_nTrk, "vx_TYPE_truth_pull_x_vs_nTrk", "vx_hs_truth_pull_x_vs_nTrk");
305 book(m_vx_hs_truth_y_pull_vs_nTrk, "vx_TYPE_truth_pull_y_vs_nTrk", "vx_hs_truth_pull_y_vs_nTrk");
306
307 // book the new expert histos for vertex classifications
308 book(m_vx_ntracks_matched,"vx_ntracks_matched");
309 book(m_vx_ntracks_merged,"vx_ntracks_merged");
310 book(m_vx_ntracks_split,"vx_ntracks_split");
311 book(m_vx_ntracks_HS_matched,"vx_ntracks_HS_matched");
312 book(m_vx_ntracks_HS_merged,"vx_ntracks_HS_merged");
313 book(m_vx_ntracks_HS_split,"vx_ntracks_HS_split");
314 book(m_vx_ntracks_ALL_matched,"vx_ntracks_ALL_matched");
315 book(m_vx_ntracks_ALL_merged,"vx_ntracks_ALL_merged");
316 book(m_vx_ntracks_ALL_split,"vx_ntracks_ALL_split");
317 book(m_vx_sumpT_matched,"vx_sumpT_matched");
318 book(m_vx_sumpT_merged,"vx_sumpT_merged");
319 book(m_vx_sumpT_split,"vx_sumpT_split");
320 book(m_vx_sumpT_HS_matched,"vx_sumpT_HS_matched");
321 book(m_vx_sumpT_HS_merged,"vx_sumpT_HS_merged");
322 book(m_vx_sumpT_HS_split,"vx_sumpT_HS_split");
323 book(m_vx_sumpT_ALL_matched,"vx_sumpT_ALL_matched");
324 book(m_vx_sumpT_ALL_merged,"vx_sumpT_ALL_merged");
325 book(m_vx_sumpT_ALL_split,"vx_sumpT_ALL_split");
326
327 book(m_vx_z_asym_matched,"vx_z_asym_matched");
328 book(m_vx_z_asym_merged,"vx_z_asym_merged");
329 book(m_vx_z_asym_split,"vx_z_asym_split");
330 book(m_vx_z_asym_HS_matched,"vx_z_asym_HS_matched");
331 book(m_vx_z_asym_HS_merged,"vx_z_asym_HS_merged");
332 book(m_vx_z_asym_HS_split,"vx_z_asym_HS_split");
333 book(m_vx_z_asym_ALL_matched,"vx_z_asym_ALL_matched");
334 book(m_vx_z_asym_ALL_merged,"vx_z_asym_ALL_merged");
335 book(m_vx_z_asym_ALL_split,"vx_z_asym_ALL_split");
336 book(m_vx_z_asym_weighted_matched,"vx_z_asym_weighted_matched");
337 book(m_vx_z_asym_weighted_merged,"vx_z_asym_weighted_merged");
338 book(m_vx_z_asym_weighted_split,"vx_z_asym_weighted_split");
339 book(m_vx_z_asym_weighted_HS_matched,"vx_z_asym_weighted_HS_matched");
340 book(m_vx_z_asym_weighted_HS_merged,"vx_z_asym_weighted_HS_merged");
341 book(m_vx_z_asym_weighted_HS_split,"vx_z_asym_weighted_HS_split");
342 book(m_vx_z_asym_weighted_ALL_matched,"vx_z_asym_weighted_ALL_matched");
343 book(m_vx_z_asym_weighted_ALL_merged,"vx_z_asym_weighted_ALL_merged");
344 book(m_vx_z_asym_weighted_ALL_split,"vx_z_asym_weighted_ALL_split");
345
346 book(m_vx_track_weight_matched, "vx_track_weight_matched");
347 book(m_vx_track_weight_merged, "vx_track_weight_merged");
348 book(m_vx_track_weight_split, "vx_track_weight_split");
349 book(m_vx_track_weight_HS_matched, "vx_track_weight_HS_matched");
350 book(m_vx_track_weight_HS_merged, "vx_track_weight_HS_merged");
351 book(m_vx_track_weight_HS_split, "vx_track_weight_HS_split");
352 book(m_vx_track_weight_ALL_matched, "vx_track_weight_ALL_matched");
353 book(m_vx_track_weight_ALL_merged, "vx_track_weight_ALL_merged");
354 book(m_vx_track_weight_ALL_split, "vx_track_weight_ALL_split");
355
356 book(m_vx_normalised_track_weight_matched, "vx_normalised_track_weight_matched");
357 book(m_vx_normalised_track_weight_merged, "vx_normalised_track_weight_merged");
358 book(m_vx_normalised_track_weight_split, "vx_normalised_track_weight_split");
359 book(m_vx_normalised_track_weight_HS_matched, "vx_normalised_track_weight_HS_matched");
360 book(m_vx_normalised_track_weight_HS_merged, "vx_normalised_track_weight_HS_merged");
361 book(m_vx_normalised_track_weight_HS_split, "vx_normalised_track_weight_HS_split");
362 book(m_vx_normalised_track_weight_ALL_matched, "vx_normalised_track_weight_ALL_matched");
363 book(m_vx_normalised_track_weight_ALL_merged, "vx_normalised_track_weight_ALL_merged");
364 book(m_vx_normalised_track_weight_ALL_split, "vx_normalised_track_weight_ALL_split");
365
366 book(m_vx_chi2Over_ndf_matched,"vx_chi2Over_ndf_matched");
367 book(m_vx_chi2Over_ndf_merged,"vx_chi2Over_ndf_merged");
368 book(m_vx_chi2Over_ndf_split,"vx_chi2Over_ndf_split");
369 book(m_vx_chi2Over_ndf_HS_matched,"vx_chi2Over_ndf_HS_matched");
370 book(m_vx_chi2Over_ndf_HS_merged,"vx_chi2Over_ndf_HS_merged");
371 book(m_vx_chi2Over_ndf_HS_split,"vx_chi2Over_ndf_HS_split");
372 book(m_vx_chi2Over_ndf_ALL_matched,"vx_chi2Over_ndf_ALL_matched");
373 book(m_vx_chi2Over_ndf_ALL_merged,"vx_chi2Over_ndf_ALL_merged");
374 book(m_vx_chi2Over_ndf_ALL_split,"vx_chi2Over_ndf_ALL_split");
375
376 book(m_vx_z0_skewness_matched, "vx_z0_skewness_matched");
377 book(m_vx_z0_skewness_merged, "vx_z0_skewness_merged");
378 book(m_vx_z0_skewness_split, "vx_z0_skewness_split");
379 book(m_vx_z0_skewness_HS_matched, "vx_z0_skewness_HS_matched");
380 book(m_vx_z0_skewness_HS_merged, "vx_z0_skewness_HS_merged");
381 book(m_vx_z0_skewness_HS_split, "vx_z0_skewness_HS_split");
382 book(m_vx_z0_skewness_ALL_matched, "vx_z0_skewness_ALL_matched");
383 book(m_vx_z0_skewness_ALL_merged, "vx_z0_skewness_ALL_merged");
384 book(m_vx_z0_skewness_ALL_split, "vx_z0_skewness_ALL_split");
385 book(m_vx_z0_kurtosis_matched,"vx_z0_kurtosis_matched");
386 book(m_vx_z0_kurtosis_merged,"vx_z0_kurtosis_merged");
387 book(m_vx_z0_kurtosis_split,"vx_z0_kurtosis_split");
388 book(m_vx_z0_kurtosis_HS_matched,"vx_z0_kurtosis_HS_matched");
389 book(m_vx_z0_kurtosis_HS_merged,"vx_z0_kurtosis_HS_merged");
390 book(m_vx_z0_kurtosis_HS_split,"vx_z0_kurtosis_HS_split");
391 book(m_vx_z0_kurtosis_ALL_matched,"vx_z0_kurtosis_ALL_matched");
392 book(m_vx_z0_kurtosis_ALL_merged,"vx_z0_kurtosis_ALL_merged");
393 book(m_vx_z0_kurtosis_ALL_split,"vx_z0_kurtosis_ALL_split");
394
395
396 book(m_vx_nVertices_matched,"vx_nVertices_matched");
397 book(m_vx_nVertices_merged,"vx_nVertices_merged");
398 book(m_vx_nVertices_split, "vx_nVertices_split");
399 book(m_vx_nVertices_fake, "vx_nVertices_fake");
400 book(m_vx_nVertices_HS_matched,"vx_nVertices_HS_matched");
401 book(m_vx_nVertices_HS_merged,"vx_nVertices_HS_merged");
402 book(m_vx_nVertices_HS_split,"vx_nVertices_HS_split");
403 book(m_vx_nVertices_HS_fake,"vx_nVertices_HS_fake");
404 book(m_vx_nVertices_ALL_matched,"vx_nVertices_ALL_matched");
405 book(m_vx_nVertices_ALL_merged,"vx_nVertices_ALL_merged");
406 book(m_vx_nVertices_ALL_split,"vx_nVertices_ALL_split");
407 book(m_vx_nVertices_ALL_fake,"vx_nVertices_ALL_fake");
408
409 book(m_vx_hs_mindz,"vx_hs_mindz");
410 book(m_vx_all_dz,"vx_all_dz");
411
412 book(m_vx_PUdensity,"vx_PUdensity");
413 book(m_vx_nTruth,"vx_nTruth");
414 book(m_vx_nTruth_vs_PUdensity,"vx_nTruth_vs_PUdensity");
415 }
416
417}
419 const xAOD::Vertex* recoHSVertex = nullptr;
420 float sumPtMax = -1.;
421 const xAOD::TrackParticle* trackTmp = nullptr;
422 float sumPtTmp;
423 for (const auto& vtx : recoVertices.stdcont()) {
424 if (vtx) {
425 sumPtTmp = 0.;
426 for (size_t i = 0; i < vtx->nTrackParticles(); i++) {
427 trackTmp = vtx->trackParticle(i);
428 if (trackTmp) {
429 sumPtTmp += std::pow(trackTmp->pt(), 2);
430 }
431 }
432 if (sumPtTmp > sumPtMax) {
433 sumPtMax = sumPtTmp;
434 recoHSVertex = vtx;
435 }
436 }
437 }
438 return recoHSVertex;
439}
440
441
442template<typename U, typename V>
443float InDetPerfPlot_VertexTruthMatching::getRadialDiff2(const U* vtx1, const V* vtx2) const {
444 return (std::pow((vtx1->x() - vtx2->x()), 2) + std::pow((vtx1->y() - vtx2->y()), 2) + std::pow((vtx1->z() - vtx2->z()), 2));
445}
446
447float InDetPerfPlot_VertexTruthMatching::getLocalPUDensity(const xAOD::TruthVertex* vtxOfInterest, const std::vector<const xAOD::TruthVertex*>& truthHSVertices, const std::vector<const xAOD::TruthVertex*>& truthPUVertices, const float radialWindow) const {
448 float radialWindow2 = std::pow(radialWindow, 2);
449 int nTracksInWindow = 0;
450 float localPUDensity;
451 float radialDiff2;
452 for (const auto& vtx : truthHSVertices) {
453 if (vtx != vtxOfInterest) {
454 radialDiff2 = getRadialDiff2(vtxOfInterest, vtx);
455 if (radialDiff2 < radialWindow2) {
456 nTracksInWindow += 1;
457 }
458 }
459 }
460 for (const auto& vtx : truthPUVertices) {
461 if (vtx != vtxOfInterest) {
462 radialDiff2 = getRadialDiff2(vtxOfInterest, vtx);
463 if (radialDiff2 < radialWindow2) {
464 nTracksInWindow += 1;
465 }
466 }
467 }
468 localPUDensity = (float)(nTracksInWindow) / (2 * radialWindow);
469 return localPUDensity;
470}
471
473 return std::sqrt(recoVtx->covariancePosition()(2, 2));
474}
475
477 float x = recoVtx->x();
478 float y = recoVtx->y();
479 float xErr2 = recoVtx->covariancePosition()(0, 0);
480 float yErr2 = recoVtx->covariancePosition()(1, 1);
481 float xyCov = recoVtx->covariancePosition()(0, 1);
482 float r2 = std::pow(x, 2) + std::pow(y, 2);
483 return std::sqrt(std::pow(x, 2) / r2 * xErr2 + std::pow(y, 2) / r2 * yErr2 + 2 * x * y / r2 * xyCov);
484}
485
486// Copied from Graham:
487void InDetPerfPlot_VertexTruthMatching::fillResoHist(TH1* resoHist, const TH2* resoHist2D) {
488
489 TH1* projHist = nullptr;
490 int safety_counter;
491 TFitResultPtr fitResult;
492 double mean;
493 double rms;
494 double itr_rms = -1.;
495 double itr_rms_err;
496
497 for (int i = 1; i < resoHist2D->GetNbinsX() + 1; i++) {
498
499 projHist = resoHist2D->ProjectionY("projectionY", i, i);
500
501 if (projHist->GetEntries() == 0.) {
502 resoHist->SetBinContent(i, 0.);
503 resoHist->SetBinError(i, 0.);
504 continue;
505 }
506
507 safety_counter = 0;
508
509 fitResult = projHist->Fit("gaus", "QS0");
510 if (!fitResult.Get()) {
511 // Is it necessary to also require fitResult->Status() % 1000 == 0 for a successful fit?
512 // --> fitStatus = migradResult + 10 * minosResult + 100 * hesseResult + 1000 * improveResult
513 resoHist->SetBinContent(i, 0.);
514 resoHist->SetBinError(i, 0.);
515 continue;
516 }
517 mean = fitResult->Parameter(1);
518 rms = fitResult->Parameter(2);
519
520 while (true) {
521
522 projHist->SetAxisRange(mean - 3 * rms, mean + 3 * rms, "X");
523
524 fitResult = projHist->Fit("gaus", "QS0");
525 if (!fitResult.Get()) {
526 itr_rms = 0.;
527 itr_rms_err = 0.;
528 break;
529 }
530 itr_rms = fitResult->Parameter(2);
531 itr_rms_err = fitResult->ParError(2);
532
533 if ((fabs(itr_rms - rms) < 0.0001) || (safety_counter == 5)) {
534 break;
535 }
536
537 safety_counter++;
538 mean = fitResult->Parameter(1);
539 rms = itr_rms;
540
541 }
542
543 resoHist->SetBinContent(i, itr_rms);
544 resoHist->SetBinError(i, itr_rms_err);
545
546 }
547}
548
550 const xAOD::TruthVertex* truthVtx = nullptr;
551 if (recoVtx) {
552 const static xAOD::Vertex::Decorator<std::vector<InDetVertexTruthMatchUtils::VertexTruthMatchInfo>> truthMatchingInfos("TruthEventMatchingInfos");
553 try{
554 if (!truthMatchingInfos.isAvailable(*recoVtx)){
555 ATH_MSG_WARNING("TruthEventMatchingInfos DECORATOR not available -- returning nullptr!");
556 return truthVtx;
557 }
558 const std::vector<InDetVertexTruthMatchUtils::VertexTruthMatchInfo>& truthInfos = truthMatchingInfos(*recoVtx);
559 if (!truthInfos.empty()) {
560 const InDetVertexTruthMatchUtils::VertexTruthMatchInfo& truthInfo = truthInfos.at(0);
561 const ElementLink<xAOD::TruthEventBaseContainer> truthEventLink = std::get<0>(truthInfo);
562 const xAOD::TruthEvent* truthEvent = nullptr;
563 if (truthEventLink.isValid()) {
564 truthEvent = static_cast<const xAOD::TruthEvent*>(*truthEventLink);
565 if (truthEvent) {
566 size_t i_vtx = 0;
567 size_t n_vtx = truthEvent->nTruthVertices();
568 while(!truthVtx && i_vtx<n_vtx){
569 truthVtx = truthEvent->truthVertex(i_vtx);
570 i_vtx++;
571 }
572 }
573 }
574 }
575 else {
576 ATH_MSG_WARNING("TruthEventMatchingInfos DECORATOR yields empty vector -- returning nullptr!");
577 }
578 }
579 catch (SG::ExcBadAuxVar &){
580 ATH_MSG_WARNING("TruthEventMatchingInfos DECORATOR yields empty vector -- returning nullptr!");
581 }
582 }
583 return truthVtx;
584}
585
586void InDetPerfPlot_VertexTruthMatching::fill(const xAOD::Vertex& vertex, const xAOD::TruthVertex * tvrt, float weight) {
587 // not sure how to deal with this type of histogram
588 if (tvrt) {
589 const float diff_x = vertex.x() - tvrt->x();
590 const float diff_y = vertex.y() - tvrt->y();
591 const float diff_z = vertex.z() - tvrt->z();
592 const AmgSymMatrix(3)& covariance = vertex.covariancePosition();
593 const float err_x = std::abs(Amg::error(covariance, 0)) > 1e-7 ? Amg::error(covariance, 0) : 1000.;
594 const float err_y = std::abs(Amg::error(covariance, 1)) > 1e-7 ? Amg::error(covariance, 1) : 1000.;
595 const float err_z = std::abs(Amg::error(covariance, 2)) > 1e-7 ? Amg::error(covariance, 2) : 1000.;
596 fillHisto(m_vx_x_diff, diff_x, weight);
597 fillHisto(m_vx_x_diff_pull, diff_x / err_x, weight);
598 fillHisto(m_vx_y_diff, diff_y, weight);
599 fillHisto(m_vx_y_diff_pull, diff_y / err_y, weight);
600 fillHisto(m_vx_z_diff, diff_z, weight);
601 fillHisto(m_vx_z_diff_pull, diff_z / err_z, weight);
602
603 if (m_isITk) {
604 static const SG::AuxElement::Accessor<uint8_t> accHasValidTime("hasValidTime");
605 static const SG::AuxElement::Accessor<float> accTime("time");
606 static const SG::AuxElement::Accessor<float> accTimeResolution("timeResolution");
607 if (accHasValidTime.isAvailable(vertex) && accTime.isAvailable(vertex) &&
608 accTimeResolution.isAvailable(vertex)) {
609
610 if (vertex.hasValidTime()) {
611 float diff_time = vertex.time() - tvrt->t() / Gaudi::Units::c_light;
612 float err_time = vertex.timeResolution();
613 fillHisto(m_vx_time_diff, diff_time, weight);
614 fillHisto(m_vx_time_diff_pull, diff_time / err_time, weight);
615 }
616 }
617 }
618 }
619
620 // Get the match type info for each vertex:
621 const static xAOD::Vertex::Decorator<InDetVertexTruthMatchUtils::VertexMatchType> recoVtxMatchTypeInfo("VertexMatchType");
623 if (recoVtxMatchTypeInfo.isAvailable(vertex)) {
624 try {
625 matchType = recoVtxMatchTypeInfo(vertex);
626 ATH_MSG_DEBUG("VERTEX DECORATOR ======= " << matchType << ", with nTRACKS === " << vertex.nTrackParticles() << ", vertex index = " << vertex.index() << " AT (x, y, z) = (" << vertex.x() << ", " << vertex.y() << ", " << vertex.z() << ")");
627 fillHisto(m_vx_type_truth, matchType, weight);
628 }
629 catch (SG::ExcBadAuxVar &) {
630 ATH_MSG_WARNING("VertexMatchType DECORATOR seems to be available, but may be broken ===========");
631 }
632 }
633 else {
634 ATH_MSG_WARNING("VertexMatchType DECORATOR is NOT available ===========");
635 }
636
637} // void InDetPerfPlot_VertexTruthMatching::fill(const xAOD::Vertex& vertex) {
638
639void InDetPerfPlot_VertexTruthMatching::fill(const xAOD::Vertex* recoHardScatter,const xAOD::VertexContainer& vertexContainer, const std::vector<const xAOD::TruthVertex*>& truthHSVertices, const std::vector<const xAOD::TruthVertex*>& truthPUVertices, float actualMu, float weight) {
640
641 if (m_detailLevel >= 200) {
642 // Fill our histograms
643 // Inclusive:
644 int nTruthVertices = (int)(truthHSVertices.size() + truthPUVertices.size());
645 int nRecoVertices = (int)vertexContainer.size()-1; //Not counting the dummy vertex of type 0
646 fillHisto(m_vx_nReco_vs_nTruth_inclusive, nTruthVertices, nRecoVertices, weight);
647 fillHisto(m_vx_nTruth, nTruthVertices, weight);
648
649 // Let's also plot the vertices by vertex match type:
650 const static xAOD::Vertex::Decorator<InDetVertexTruthMatchUtils::VertexMatchType> recoVtxMatchTypeInfo("VertexMatchType");
651 std::map<InDetVertexTruthMatchUtils::VertexMatchType, int> breakdown = {};
657
658 if (!recoHardScatter){
659 ATH_MSG_INFO("No recoHardScatter vertex - not filling vertex truth matching.");
660 return;
661 }
662
663
664 // Get the truth HS vertex
665 const xAOD::TruthVertex* truthHSVtx = nullptr;
666
667 // Check that we have *exactly* 1 truth HS vertex
668 if (!truthHSVertices.empty()) {
669 if (truthHSVertices.size() != 1) {
670 ATH_MSG_WARNING("Size of truth HS vertex vector is >1 -- only using the first one in the vector.");
671 }
672 truthHSVtx = truthHSVertices.at(0);
673 fillHisto(m_vx_hs_sel_eff_dist, nTruthVertices, getRadialDiff2(recoHardScatter, truthHSVtx) < std::pow(m_cutMinTruthRecoRadialDiff, 2), weight);
674 fillHisto(m_vx_hs_sel_eff_dist_vs_nReco, nRecoVertices, getRadialDiff2(recoHardScatter, truthHSVtx) < std::pow(m_cutMinTruthRecoRadialDiff, 2), weight);
675 }
676 else {
677 ATH_MSG_WARNING("Size of truth HS vertex vector is 0 -- assuming truth HS vertex to NOT be reconstructed.");
678 }
679
680 //Calculating the local PU density around the true HS vertex
681 if (!truthHSVtx){
682 ATH_MSG_INFO("No truthHSVtx vertex - not filling vertex truth matching.");
683 return;
684 }
685 float localPUDensity = getLocalPUDensity(truthHSVtx, truthHSVertices, truthPUVertices);
686 fillHisto(m_vx_PUdensity, localPUDensity, weight);
687 fillHisto(m_vx_nTruth_vs_PUdensity, nTruthVertices, localPUDensity, weight);
688
689 // Best reco HS vertex identified via truth HS weights
690 const xAOD::Vertex* bestRecoHSVtx_truth = InDetVertexTruthMatchUtils::bestHardScatterMatch(vertexContainer);
691 if (!bestRecoHSVtx_truth){
692 ATH_MSG_INFO("No bestRecoHS vertex - not filling vertex truth matching.");
693 return;
694 }
695
696 fillHisto(m_vx_hs_sel_eff_mu, actualMu, (recoHardScatter == bestRecoHSVtx_truth), weight);
697 fillHisto(m_vx_hs_sel_eff, localPUDensity, (recoHardScatter == bestRecoHSVtx_truth), weight);
698 fillHisto(m_vx_hs_sel_eff_vs_nReco, nRecoVertices, (recoHardScatter == bestRecoHSVtx_truth), weight);
699 fillHisto(m_vx_hs_sel_eff_vs_ntruth, nTruthVertices, (recoHardScatter == bestRecoHSVtx_truth), weight);
700
701 // Did we successfully reconstruct our truth HS vertex?
702 bool truthHSVtxRecoed = false;
703 float minTruthRecoRadialDiff2 = std::pow(m_cutMinTruthRecoRadialDiff, 2);
704 float truthRecoRadialDiff2 = -1.;
705 if (truthHSVtx) {
706 // If the radial difference between the truth-pkg-selected best reco HS vertex and the truth HS vertex is
707 // less than some cut (e.g., 0.1 mm), then we say the truth HS vertex is reconstructed
708 truthRecoRadialDiff2 = getRadialDiff2(bestRecoHSVtx_truth, truthHSVtx);
709 if (truthRecoRadialDiff2 < minTruthRecoRadialDiff2) {
710 truthHSVtxRecoed = true;
711 minTruthRecoRadialDiff2 = truthRecoRadialDiff2;
712 }
713 }
714
715 // add variables here so that they are in correct scope (outside loop over vertices)
716 float number_matched = 0;
717 float number_merged = 0;
718 float number_split = 0;
719 float number_fake = 0;
720 float number_matched_HS = 0;
721 float number_merged_HS = 0;
722 float number_split_HS = 0;
723 float number_fake_HS = 0;
724 float number_matched_PU = 0;
725 float number_merged_PU = 0;
726 float number_split_PU = 0;
727 float number_fake_PU = 0;
728
729 // variables for delta z between the HS and the closest one
730 float vx_hs_mindz=9999.;
731 float min_fabs_dz = 9999.;
732
733 // Iterate over vertices:
735 for (const auto& vertex : vertexContainer.stdcont()) {
736
737 // Skip dummy vertex (last one in the container)
738 if (vertex->vertexType() == xAOD::VxType::NoVtx) {
739 continue;
740 }
741
742 fill(*vertex);
743
744 matchType = recoVtxMatchTypeInfo(*vertex);
745 breakdown[matchType] += 1;
746
747
748 const xAOD::TruthVertex *matchVertex = getTruthVertex(vertex);
749 if(!matchVertex) continue;
750 float residual_z = matchVertex->z() - vertex->z();
751 float residual_x = matchVertex->x() - vertex->x();
752 float residual_y = matchVertex->y() - vertex->y();
753 const AmgSymMatrix(3)& covariance = vertex->covariancePosition();
754 float vtxerr_x = fabs(Amg::error(covariance, 0)) > 1e-7 ? Amg::error(covariance, 0) : 1000.;
755 float vtxerr_y = fabs(Amg::error(covariance, 1)) > 1e-7 ? Amg::error(covariance, 1) : 1000.;
756 float vtxerr_z = fabs(Amg::error(covariance, 2)) > 1e-7 ? Amg::error(covariance, 2) : 1000.;
757 localPUDensity = getLocalPUDensity(matchVertex, truthHSVertices, truthPUVertices);
758
759 fillHisto(m_vx_all_z_pull, residual_z/vtxerr_z, weight);
760 fillHisto(m_vx_all_y_pull, residual_y/vtxerr_y, weight);
761 fillHisto(m_vx_all_x_pull, residual_x/vtxerr_x, weight);
762
763 fillHisto(m_vx_all_truth_z_res_vs_PU, localPUDensity, residual_z, weight);
764 fillHisto(m_vx_all_truth_x_res_vs_PU, localPUDensity, residual_x, weight);
765 fillHisto(m_vx_all_truth_y_res_vs_PU, localPUDensity, residual_y, weight);
766
767 fillHisto(m_vx_all_z_res, residual_z, weight);
768 fillHisto(m_vx_all_y_res, residual_y, weight);
769 fillHisto(m_vx_all_x_res, residual_x, weight);
770
771 fillHisto(m_vx_all_truth_z_pull_vs_PU, localPUDensity, residual_z/vtxerr_z, weight);
772 fillHisto(m_vx_all_truth_x_pull_vs_PU, localPUDensity, residual_x/vtxerr_x, weight);
773 fillHisto(m_vx_all_truth_y_pull_vs_PU, localPUDensity, residual_y/vtxerr_y, weight);
774
775 fillHisto(m_vx_all_truth_z_res_vs_nTrk, vertex->nTrackParticles(), residual_z, weight);
776 fillHisto(m_vx_all_truth_x_res_vs_nTrk, vertex->nTrackParticles(), residual_x, weight);
777 fillHisto(m_vx_all_truth_y_res_vs_nTrk, vertex->nTrackParticles(), residual_y, weight);
778
779 fillHisto(m_vx_all_truth_z_pull_vs_nTrk, vertex->nTrackParticles(), residual_z/vtxerr_z, weight);
780 fillHisto(m_vx_all_truth_x_pull_vs_nTrk, vertex->nTrackParticles(), residual_x/vtxerr_x, weight);
781 fillHisto(m_vx_all_truth_y_pull_vs_nTrk, vertex->nTrackParticles(), residual_y/vtxerr_y, weight);
782
783
784
785
786 // New Expert histograms for observables for vertex classifications for HS and PU
787 // For each vertex, loop over all tracks and get sumpt and sum of charges
788 // also use this to get the z asymmetry around the vertex.
789
790 // Declaring variables for the observables
791 const xAOD::TrackParticle* trackTmp = nullptr;
792 float sumPt =0;
793 float minpt = 20000 ; // minimum sum pt required for the 'All' vertices plots - 20 GeV
794 float trackPt = 0;
795
796 // variables for calculation of delta Z asymmetry and delta d asymmetry
797 float z_asym = 0;
798 float sumDZ = 0;
799 float deltaZ =0;
800 float modsumDZ =0;
801 float weighted_sumDZ = 0;
802 float weighted_deltaZ = 0;
803 float weighted_modsumDZ = 0;
804 float weighted_z_asym =0;
805
806 // make vector
807 std::vector<float> track_deltaZ;
808 std::vector<float> track_deltaPt;
809 std::vector<float> track_deltaZ_weighted;
810 // loop over tracks
811 for (size_t i = 0; i < vertex->nTrackParticles(); i++) {
812 trackTmp = vertex->trackParticle(i);
813
814
815 if (trackTmp) {
816 trackPt = trackTmp->pt(); // MeV
817 sumPt = sumPt + trackPt; // in MeV
818 deltaZ = trackTmp->z0() - vertex->z();
819 track_deltaZ.push_back(deltaZ);
820 // get the track weight for each track to get the deltaZ/trk_weight
821 float trk_weight = vertex->trackWeight(i);
822 weighted_deltaZ = deltaZ*trk_weight;
823 // sum of delta z
824 sumDZ = sumDZ + deltaZ;
825 modsumDZ = modsumDZ + std::abs(deltaZ);
826 weighted_sumDZ = weighted_sumDZ + weighted_deltaZ;
827 weighted_modsumDZ = weighted_modsumDZ + std::abs(weighted_deltaZ);
828
829 }
830 } // end loop over tracks
831 if (modsumDZ >0) {
832 z_asym = sumDZ/modsumDZ;
833 }
834 if (weighted_modsumDZ >0) {
835 weighted_z_asym = weighted_sumDZ/weighted_modsumDZ;
836 }
837
838
839
840 double mean_Dz =0;
841 mean_Dz=sumDZ/track_deltaZ.size(); //calculate average
842 double number_tracks =0;
843 number_tracks = track_deltaZ.size(); // get number of tracks
844
845 double z_sd = 0; // standard deviation
846 double z_skew = 0; // skewness of DeltaZ asymmetry
847 double z_kurt = 0; // Kurtosis of DeltaZ asymmetry
848 double z_var=0; // variance of DeltaZ
849 double z_zbar=0; // for use in calculation below
850
851 for ( auto i : track_deltaZ) {
852
853 z_zbar = (i - mean_Dz);
854 z_var =(z_var + z_zbar*z_zbar);
855 z_skew =(z_skew + z_zbar*z_zbar*z_zbar);
856 z_kurt =(z_kurt + z_zbar*z_zbar*z_zbar*z_zbar);
857
858 }
859 z_var = z_var/(number_tracks -1);
860 z_sd = std::sqrt(z_var);
861 z_skew = z_skew/((number_tracks -1)*z_sd*z_sd*z_sd);
862 z_kurt = z_kurt/((number_tracks -1)*z_sd*z_sd*z_sd*z_sd);
863
864 float ndf = vertex->numberDoF();
865 if (ndf != 0) {
866
868 if (vertex == bestRecoHSVtx_truth) {
869
870 fillHisto(m_vx_sumpT_HS_matched,sumPt ,weight);
871 fillHisto(m_vx_z_asym_HS_matched, z_asym,weight);
872 fillHisto(m_vx_z_asym_weighted_HS_matched, weighted_z_asym,weight);
873 fillHisto(m_vx_chi2Over_ndf_HS_matched, vertex->chiSquared()/ndf,weight);
874
877
878
879 for (const float& trkWeight : vertex->trackWeights()) {
880 fillHisto(m_vx_track_weight_HS_matched, trkWeight,weight);
881 fillHisto(m_vx_normalised_track_weight_HS_matched, trkWeight/number_tracks,weight);
882 }
883
884 }
885 else {
886
887 fillHisto(m_vx_sumpT_matched,sumPt ,weight);
888 fillHisto(m_vx_z_asym_matched, z_asym,weight);
889 fillHisto(m_vx_z_asym_weighted_matched, weighted_z_asym,weight);
890 fillHisto(m_vx_chi2Over_ndf_matched, vertex->chiSquared()/ndf,weight);
891
892 fillHisto(m_vx_z0_skewness_matched, z_skew,weight);
893 fillHisto(m_vx_z0_kurtosis_matched, z_kurt,weight);
894
895
896 for (const float& trkWeight : vertex->trackWeights()) {
897 fillHisto(m_vx_track_weight_matched, trkWeight,weight);
898 fillHisto(m_vx_normalised_track_weight_matched, trkWeight/number_tracks,weight);
899 }
900 }
901// fill some histograms that contain both HS and PU above a min pt - say 20GeV
902 if (sumPt > minpt) {
903 fillHisto(m_vx_sumpT_ALL_matched,sumPt ,weight);
904 fillHisto(m_vx_z_asym_ALL_matched, z_asym,weight);
905 fillHisto(m_vx_z_asym_weighted_ALL_matched, weighted_z_asym,weight);
906 fillHisto(m_vx_chi2Over_ndf_ALL_matched, vertex->chiSquared()/ndf,weight);
907
910 for (const float& trkWeight : vertex->trackWeights()) {
911 fillHisto(m_vx_track_weight_ALL_matched, trkWeight,weight);
912 fillHisto(m_vx_normalised_track_weight_ALL_matched, trkWeight/number_tracks,weight);
913 }
914
915 }
916 } // end of if matched vertices
917
919 if (vertex == bestRecoHSVtx_truth) {
920
921 fillHisto(m_vx_sumpT_HS_merged, sumPt ,weight);
922 fillHisto(m_vx_z_asym_HS_merged, z_asym,weight);
923 fillHisto(m_vx_z_asym_weighted_HS_merged, weighted_z_asym,weight);
924 fillHisto(m_vx_chi2Over_ndf_HS_merged, vertex->chiSquared()/ndf,weight);
925
928 for (const float& trkWeight : vertex->trackWeights()) {
929 fillHisto(m_vx_track_weight_HS_merged, trkWeight,weight);
930 fillHisto(m_vx_normalised_track_weight_HS_merged, trkWeight/number_tracks,weight);
931 }
932
933
934
935 }
936 else {
937 fillHisto(m_vx_sumpT_merged, sumPt ,weight);
938 fillHisto(m_vx_z_asym_merged, z_asym,weight);
939 fillHisto(m_vx_z_asym_weighted_merged, weighted_z_asym,weight);
940 fillHisto(m_vx_chi2Over_ndf_merged, vertex->chiSquared()/ndf,weight);
941
942 fillHisto(m_vx_z0_skewness_merged, z_skew,weight);
943 fillHisto(m_vx_z0_kurtosis_merged, z_kurt,weight);
944 for (const float& trkWeight : vertex->trackWeights()) {
945 fillHisto(m_vx_track_weight_merged, trkWeight,weight);
946 fillHisto(m_vx_normalised_track_weight_merged, trkWeight/number_tracks,weight);
947 }
948
949 }
950 if (sumPt > minpt) {
951 fillHisto(m_vx_sumpT_ALL_merged,sumPt ,weight);
952 fillHisto(m_vx_z_asym_ALL_merged, z_asym,weight);
953 fillHisto(m_vx_z_asym_weighted_ALL_merged, weighted_z_asym,weight);
954 fillHisto(m_vx_chi2Over_ndf_ALL_merged, vertex->chiSquared()/ndf,weight);
955
958 for (const float& trkWeight : vertex->trackWeights()) {
959 fillHisto(m_vx_track_weight_ALL_merged, trkWeight,weight);
960 fillHisto(m_vx_normalised_track_weight_ALL_merged, trkWeight/number_tracks,weight);
961 }
962
963 }
964 } //end of if merged vertices
965
967 if (vertex == bestRecoHSVtx_truth) {
968 fillHisto(m_vx_sumpT_HS_split, sumPt ,weight);
969 fillHisto(m_vx_z_asym_HS_split, z_asym,weight);
970 fillHisto(m_vx_z_asym_weighted_HS_split, weighted_z_asym,weight);
971 fillHisto(m_vx_chi2Over_ndf_HS_split, vertex->chiSquared()/ndf,weight);
972
973 fillHisto(m_vx_z0_skewness_HS_split, z_skew,weight);
974 fillHisto(m_vx_z0_kurtosis_HS_split, z_kurt,weight);
975 for (const float& trkWeight : vertex->trackWeights()) {
976 fillHisto(m_vx_track_weight_HS_split, trkWeight,weight);
977 fillHisto(m_vx_normalised_track_weight_HS_split, trkWeight/number_tracks,weight);
978 }
979
980
981 }
982 else {
983 fillHisto(m_vx_sumpT_split, sumPt ,weight);
984 fillHisto(m_vx_z_asym_split, z_asym,weight);
985 fillHisto(m_vx_z_asym_weighted_split, weighted_z_asym,weight);
986 fillHisto(m_vx_chi2Over_ndf_split, vertex->chiSquared()/ndf,weight);
987
988 fillHisto(m_vx_z0_skewness_split, z_skew,weight);
989 fillHisto(m_vx_z0_kurtosis_split, z_kurt,weight);
990 for (const float& trkWeight : vertex->trackWeights()) {
991 fillHisto(m_vx_track_weight_split, trkWeight,weight);
992 fillHisto(m_vx_normalised_track_weight_split, trkWeight/number_tracks,weight);
993 }
994
995
996 }
997
998 if (sumPt > minpt) {
999 fillHisto(m_vx_sumpT_ALL_split,sumPt ,weight);
1000 fillHisto(m_vx_z_asym_ALL_split, z_asym,weight);
1001 fillHisto(m_vx_z_asym_weighted_ALL_split, weighted_z_asym,weight);
1002 fillHisto(m_vx_chi2Over_ndf_ALL_split, vertex->chiSquared()/ndf,weight);
1003
1004 fillHisto(m_vx_z0_skewness_ALL_split, z_skew,weight);
1005 fillHisto(m_vx_z0_kurtosis_ALL_split, z_kurt,weight);
1006 for (const float& trkWeight : vertex->trackWeights()) {
1007 fillHisto(m_vx_track_weight_ALL_split, trkWeight,weight);
1008 fillHisto(m_vx_normalised_track_weight_ALL_split, trkWeight/number_tracks,weight);
1009 }
1010 }
1011
1012 } // end of if split vertices
1013
1014// Count the number of vertices for each type per event
1015
1016
1018 if (vertex == bestRecoHSVtx_truth) {
1019 number_matched_HS++;
1020 }
1021 else {
1022 number_matched_PU++;
1023 }
1024 if (sumPt > minpt) {
1025 number_matched++;
1026 }
1027 }
1028
1030 if (vertex == bestRecoHSVtx_truth) {
1031 number_merged_HS++;
1032 }
1033 else {
1034 number_merged_PU++;
1035 }
1036 if (sumPt > minpt) {
1037 number_merged++;
1038 }
1039 }
1040
1042 if (vertex == bestRecoHSVtx_truth) {
1043 number_split_HS++;
1044 }
1045 else {
1046 number_split_PU++;
1047 }
1048 if (sumPt > minpt) {
1049 number_split++;
1050 }
1051 }
1052
1054 if (vertex == bestRecoHSVtx_truth) {
1055 number_fake_HS++;
1056 }
1057 else {
1058 number_fake_PU++;
1059 }
1060 if (sumPt > minpt) {
1061 number_fake++;
1062 }
1063 }
1064 } // end of if (ndf != 0)
1065
1066
1067
1068// New histos to check for number of tracks for each vertex type
1069 for (const auto& vertex : vertexContainer.stdcont()) {
1070 if (vertex == bestRecoHSVtx_truth) {
1071
1072
1074
1075 fillHisto(m_vx_ntracks_HS_matched, vertex->nTrackParticles(),weight);
1076 }
1077
1079 fillHisto(m_vx_ntracks_HS_merged, vertex->nTrackParticles(),weight);
1080
1081 }
1082
1084 fillHisto(m_vx_ntracks_HS_split, vertex->nTrackParticles(),weight);
1085 }
1086 }
1087 else {
1088
1089
1091
1092 fillHisto(m_vx_ntracks_matched, vertex->nTrackParticles(),weight);
1093 }
1094
1096 fillHisto(m_vx_ntracks_merged, vertex->nTrackParticles(),weight);
1097
1098 }
1099
1101 fillHisto(m_vx_ntracks_split, vertex->nTrackParticles(),weight);
1102 }
1103
1104 }
1105 if (sumPt > minpt) {
1107
1108 fillHisto(m_vx_ntracks_ALL_matched, vertex->nTrackParticles(),weight);
1109 }
1110
1112 fillHisto(m_vx_ntracks_ALL_merged, vertex->nTrackParticles(),weight);
1113
1114 }
1115
1117 fillHisto(m_vx_ntracks_ALL_split, vertex->nTrackParticles(),weight);
1118 }
1119
1120 }
1121
1122 }
1123
1124// delta z between HS and nearby vertices
1125 float absd_hs_dz = std::abs(bestRecoHSVtx_truth->z() - vertex->z());
1126 if(bestRecoHSVtx_truth != vertex && absd_hs_dz < min_fabs_dz) {
1127 min_fabs_dz = absd_hs_dz;
1128 vx_hs_mindz = bestRecoHSVtx_truth->z() - vertex->z();
1129 }
1130// loop over vertices again for dz of every vertices pair
1131 for (const auto& vertex2 : vertexContainer.stdcont()) {
1132 if (vertex2->vertexType() == xAOD::VxType::NoVtx) continue;
1133 if(vertex2 == vertex) continue;
1134 fillHisto(m_vx_all_dz, vertex->z() - vertex2->z(), 0.5*weight);
1135 }
1136
1137 } // end loop over vertices
1138
1139// new histos to count number of vertices per event
1140 fillHisto(m_vx_nVertices_ALL_matched, number_matched,weight);
1141 fillHisto(m_vx_nVertices_ALL_merged, number_merged,weight);
1142 fillHisto(m_vx_nVertices_ALL_split, number_split,weight);
1143 fillHisto(m_vx_nVertices_ALL_fake, number_fake,weight);
1144 fillHisto(m_vx_nVertices_HS_matched, number_matched_HS,weight);
1145 fillHisto(m_vx_nVertices_HS_merged, number_merged_HS,weight);
1146 fillHisto(m_vx_nVertices_HS_split, number_split_HS,weight);
1147 fillHisto(m_vx_nVertices_HS_fake, number_fake_HS,weight);
1148 fillHisto(m_vx_nVertices_matched, number_matched_PU,weight);
1149 fillHisto(m_vx_nVertices_merged, number_merged_PU,weight);
1150 fillHisto(m_vx_nVertices_split, number_split_PU,weight);
1151 fillHisto(m_vx_nVertices_fake, number_fake_PU,weight);
1152
1153// new histo to delta z between HS and the closest one
1154 fillHisto(m_vx_hs_mindz, vx_hs_mindz, weight);
1155
1156 // Now fill plots relating to the reconstruction of our truth HS vertex (efficiency and resolutions)
1157 if (!truthHSVertices.empty()) {
1158 if (truthHSVtxRecoed) {
1159 float residual_z = truthHSVtx->z() - bestRecoHSVtx_truth->z();
1160 float residual_r = std::sqrt(std::pow(truthHSVtx->x() - bestRecoHSVtx_truth->x(), 2) + std::pow(truthHSVtx->y() - bestRecoHSVtx_truth->y(), 2));
1161 float residual_x = truthHSVtx->x() - bestRecoHSVtx_truth->x();
1162 float residual_y = truthHSVtx->y() - bestRecoHSVtx_truth->y();
1163 fillHisto(m_vx_hs_reco_eff, localPUDensity, 1, weight);
1164 fillHisto(m_vx_hs_reco_sel_eff, localPUDensity, (recoHardScatter == bestRecoHSVtx_truth), weight);
1165 fillHisto(m_vx_hs_reco_eff_vs_ntruth, nTruthVertices, 1, weight);
1166 fillHisto(m_vx_hs_reco_sel_eff_vs_ntruth, nTruthVertices, (recoHardScatter == bestRecoHSVtx_truth), weight);
1167 fillHisto(m_vx_hs_reco_long_reso, localPUDensity, getRecoLongitudinalReso(bestRecoHSVtx_truth), weight);
1168 fillHisto(m_vx_hs_reco_trans_reso, localPUDensity, getRecoTransverseReso(bestRecoHSVtx_truth), weight);
1169
1170 fillHisto(m_resHelper_PUdensity_hsVxTruthLong, localPUDensity, residual_z, weight);
1171 fillHisto(m_resHelper_PUdensity_hsVxTruthTransv, localPUDensity, residual_r, weight);
1172
1173 const AmgSymMatrix(3)& covariance = bestRecoHSVtx_truth->covariancePosition();
1174 float vtxerr_x = Amg::error(covariance, 0);
1175 float vtxerr_y = Amg::error(covariance, 1);
1176 float vtxerr_z = Amg::error(covariance, 2);
1177
1178 if(fabs(vtxerr_z) > 1e-7) fillHisto(m_vx_hs_z_pull, residual_z/vtxerr_z, weight);
1179 if(fabs(vtxerr_y) > 1e-7) fillHisto(m_vx_hs_y_pull, residual_y/vtxerr_y, weight);
1180 if(fabs(vtxerr_x) > 1e-7) fillHisto(m_vx_hs_x_pull, residual_x/vtxerr_x, weight);
1181
1182 fillHisto(m_vx_hs_truth_z_res_vs_PU, localPUDensity, residual_z, weight);
1183 fillHisto(m_vx_hs_truth_x_res_vs_PU, localPUDensity, residual_x, weight);
1184 fillHisto(m_vx_hs_truth_y_res_vs_PU, localPUDensity, residual_y, weight);
1185
1186 fillHisto(m_vx_hs_z_res, residual_z, weight);
1187 fillHisto(m_vx_hs_y_res, residual_y, weight);
1188 fillHisto(m_vx_hs_x_res, residual_x, weight);
1189
1190 fillHisto(m_vx_hs_truth_z_pull_vs_PU, localPUDensity, residual_z/vtxerr_z, weight);
1191 fillHisto(m_vx_hs_truth_x_pull_vs_PU, localPUDensity, residual_x/vtxerr_x, weight);
1192 fillHisto(m_vx_hs_truth_y_pull_vs_PU, localPUDensity, residual_y/vtxerr_y, weight);
1193
1194 fillHisto(m_vx_hs_truth_z_res_vs_nTrk, bestRecoHSVtx_truth->nTrackParticles(), residual_z, weight);
1195 fillHisto(m_vx_hs_truth_x_res_vs_nTrk, bestRecoHSVtx_truth->nTrackParticles(), residual_x, weight);
1196 fillHisto(m_vx_hs_truth_y_res_vs_nTrk, bestRecoHSVtx_truth->nTrackParticles(), residual_y, weight);
1197
1198 fillHisto(m_vx_hs_truth_z_pull_vs_nTrk, bestRecoHSVtx_truth->nTrackParticles(), residual_z/vtxerr_z, weight);
1199 fillHisto(m_vx_hs_truth_x_pull_vs_nTrk, bestRecoHSVtx_truth->nTrackParticles(), residual_x/vtxerr_x, weight);
1200 fillHisto(m_vx_hs_truth_y_pull_vs_nTrk, bestRecoHSVtx_truth->nTrackParticles(), residual_y/vtxerr_y, weight);
1201
1202 }
1203 else {
1204 fillHisto(m_vx_hs_reco_eff, localPUDensity, 0, weight);
1205 fillHisto(m_vx_hs_reco_eff_vs_ntruth, nTruthVertices, 0, weight);
1206 }
1207 }
1208
1214
1215 // And by hardscatter type:
1217 fillHisto(m_vx_hs_classification, hsType, weight);
1218 switch (hsType) {
1220 fillHisto(m_vx_nReco_vs_nTruth_clean, nTruthVertices, nRecoVertices, weight);
1221 break;
1222 }
1224 fillHisto(m_vx_nReco_vs_nTruth_lowpu, nTruthVertices, nRecoVertices, weight);
1225 break;
1226 }
1228 fillHisto(m_vx_nReco_vs_nTruth_highpu, nTruthVertices, nRecoVertices, weight);
1229 break;
1230 }
1232 fillHisto(m_vx_nReco_vs_nTruth_hssplit, nTruthVertices, nRecoVertices, weight);
1233 break;
1234 }
1236 fillHisto(m_vx_nReco_vs_nTruth_none, nTruthVertices, nRecoVertices, weight);
1237 break;
1238 }
1239 default: {
1240 break;
1241 }
1242 } // End of switch
1243 } // end of EXpert plots - (if (m_detailLevel >= 200))
1244
1245} // end InDetPerfPlot_VertexTruthMatching::fill(const xAOD::VertexContainer& vertexContainer, const std::vector<const xAOD::TruthVertex*>& truthHSVertices, const std::vector<const xAOD::TruthVertex*>& truthPUVertices)
1246
1247
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
#define AmgSymMatrix(dim)
#define y
#define x
const PtrVector & stdcont() const
Return the underlying std::vector of the container.
size_type size() const noexcept
Returns the number of elements in the collection.
static const xAOD::Vertex * getHSRecoVertexSumPt2(const xAOD::VertexContainer &recoVertices)
void fill(const xAOD::Vertex &vertex, const xAOD::TruthVertex *tvrt=0, float weight=1.0)
TH1 * m_vx_hs_classification
hardscatter classification
static float getRecoLongitudinalReso(const xAOD::Vertex *recoVtx)
float getLocalPUDensity(const xAOD::TruthVertex *vtxOfInterest, const std::vector< const xAOD::TruthVertex * > &truthHSVertices, const std::vector< const xAOD::TruthVertex * > &truthPUVertices, const float radialWindow=2.0) const
TProfile * m_vx_nReco_vs_nTruth_inclusive
vertex reco efficiency
static float getRecoTransverseReso(const xAOD::Vertex *recoVtx)
static void fillResoHist(TH1 *resoHist, const TH2 *resoHist2D)
float getRadialDiff2(const U *vtx1, const V *vtx2) const
const xAOD::TruthVertex * getTruthVertex(const xAOD::Vertex *recoVtx) const
InDetPerfPlot_VertexTruthMatching(InDetPlotBase *pParent, const std::string &dirName, const int detailLevel=10, bool isITk=false)
static void fillHisto(TProfile *pTprofile, const float bin, const float weight, const float weight2=1.0)
InDetPlotBase(InDetPlotBase *pParent, const std::string &dirName)
Constructor taking parent node and directory name for plots.
void book(Htype *&pHisto, std::string_view histoIdentifier, std::string_view nameOverride="", std::string_view folder="default")
Helper method to book histograms using an identifier string.
Exception — Attempt to retrieve nonexistent aux data item.
float z0() const
Returns the parameter.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
const TruthVertex * truthVertex(size_t index) const
Get a pointer to one of the truth vertices.
size_t nTruthVertices() const
Get the number of truth vertices.
float z() const
Vertex longitudinal distance along the beam line form the origin.
float y() const
Vertex y displacement.
float t() const
Vertex time.
float x() const
Vertex x displacement.
float z() const
Returns the z position.
size_t nTrackParticles() const
Get the number of tracks associated with this vertex.
float y() const
Returns the y position.
float x() const
Returns the x position.
void mean(std::vector< double > &bins, std::vector< double > &values, const std::vector< std::string > &files, const std::string &histname, const std::string &tplotname, const std::string &label="")
double error(const Amg::MatrixX &mat, int index)
return diagonal error of the matrix caller should ensure the matrix is symmetric and the index is in ...
Class to retrieve associated truth from a track, implementing a cached response.
std::tuple< ElementLink< xAOD::TruthEventBaseContainer >, float, float > VertexTruthMatchInfo
const xAOD::Vertex * bestHardScatterMatch(const xAOD::VertexContainer &vxContainer)
HardScatterType classifyHardScatter(const xAOD::VertexContainer &vxContainer)
@ NoVtx
Dummy vertex. TrackParticle was not used in vertex fit.
TruthVertex_v1 TruthVertex
Typedef to implementation.
Definition TruthVertex.h:15
TrackParticle_v1 TrackParticle
Reference the current persistent version:
VertexContainer_v1 VertexContainer
Definition of the current "Vertex container version".
Vertex_v1 Vertex
Define the latest version of the vertex class.
TruthEvent_v1 TruthEvent
Typedef to implementation.
Definition TruthEvent.h:17