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),
46 m_vx_hs_reco_eff_mu(nullptr),
51
52 //Longitudinal and transverse resolution plots for hs vertices
62
63 m_vx_hs_z_pull(nullptr),
64 m_vx_hs_y_pull(nullptr),
65 m_vx_hs_x_pull(nullptr),
66 m_vx_all_z_pull(nullptr),
67 m_vx_all_y_pull(nullptr),
68 m_vx_all_x_pull(nullptr),
69 m_vx_hs_z_res(nullptr),
70 m_vx_hs_y_res(nullptr),
71 m_vx_hs_x_res(nullptr),
72 m_vx_all_z_res(nullptr),
73 m_vx_all_y_res(nullptr),
74 m_vx_all_x_res(nullptr),
99
100 // New Expert Histograms for vertex classifiations
101 m_vx_ntracks_matched(nullptr),
102 m_vx_ntracks_merged(nullptr),
103 m_vx_ntracks_split(nullptr),
105 m_vx_ntracks_HS_merged(nullptr),
106 m_vx_ntracks_HS_split(nullptr),
109 m_vx_ntracks_ALL_split(nullptr),
110 m_vx_sumpT_matched(nullptr),
111 m_vx_sumpT_merged(nullptr),
112 m_vx_sumpT_split(nullptr),
113 m_vx_sumpT_HS_matched(nullptr),
114 m_vx_sumpT_HS_merged(nullptr),
115 m_vx_sumpT_HS_split(nullptr),
116
117 m_vx_z_asym_matched(nullptr),
118 m_vx_z_asym_merged(nullptr),
119 m_vx_z_asym_split(nullptr),
120 m_vx_z_asym_HS_matched(nullptr),
121 m_vx_z_asym_HS_merged(nullptr),
122 m_vx_z_asym_HS_split(nullptr),
129
136
143
150
153 m_vx_z0_skewness_split(nullptr),
157
160 m_vx_z0_kurtosis_split(nullptr),
164
165 m_vx_sumpT_ALL_matched(nullptr),
166 m_vx_sumpT_ALL_merged(nullptr),
167 m_vx_sumpT_ALL_split(nullptr),
169 m_vx_z_asym_ALL_merged(nullptr),
170 m_vx_z_asym_ALL_split(nullptr),
174
178
182
186
190
194
202 m_vx_nVertices_HS_fake(nullptr),
203 m_vx_nVertices_matched(nullptr),
204 m_vx_nVertices_merged(nullptr),
205 m_vx_nVertices_split(nullptr),
206 m_vx_nVertices_fake(nullptr),
207
208 m_vx_all_dz(nullptr),
209 m_vx_hs_mindz(nullptr),
210
211 m_vx_PUdensity(nullptr),
212 m_vx_nTruth(nullptr),
214
215
216{
217 // nop
218}
219
221
222 book(m_vx_type_truth,"vx_type_truth");
223 book(m_vx_x_diff,"vx_x_diff");
224 book(m_vx_x_diff_pull,"vx_x_diff_pull");
225 book(m_vx_y_diff,"vx_y_diff");
226 book(m_vx_y_diff_pull,"vx_y_diff_pull");
227 book(m_vx_z_diff,"vx_z_diff");
228 book(m_vx_z_diff_pull,"vx_z_diff_pull");
229 if(m_isITk){
230 book(m_vx_time_diff,"vx_time_diff");
231 book(m_vx_time_diff_pull,"vx_time_diff_pull");
232 }
233
234 book(m_vx_hs_classification,"vx_hs_classification");
235 book(m_vx_hs_sel_eff_dist_vs_nReco,"vx_hs_sel_eff_dist_vs_nReco");
236 book(m_vx_hs_sel_eff_mu,"vx_hs_sel_eff_mu");
237 book(m_vx_hs_sel_eff_vs_nReco,"vx_hs_sel_eff_vs_nReco");
238 book(m_vx_hs_reco_eff_mu,"vx_hs_reco_eff_mu");
239
240 book(m_resHelper_mu_hsVxTruthLong,"resHelper_mu_hsVxTruthLong");
241 book(m_resolution_vs_mu_hsVxTruthLong,"resolution_vs_mu_hsVxTruthLong");
242 book(m_resmean_vs_mu_hsVxTruthLong,"resmean_vs_mu_hsVxTruthLong");
243
244 if (m_detailLevel >= 200) {
245
246 book(m_vx_hs_reco_eff,"vx_hs_reco_eff");
247 book(m_vx_hs_sel_eff,"vx_hs_sel_eff");
248 book(m_vx_hs_sel_eff_dist,"vx_hs_sel_eff_dist");
249 book(m_vx_hs_reco_sel_eff,"vx_hs_reco_sel_eff");
250 book(m_vx_hs_reco_eff_vs_ntruth,"vx_hs_reco_eff_vs_ntruth");
251 book(m_vx_hs_sel_eff_vs_ntruth,"vx_hs_sel_eff_vs_ntruth");
252 book(m_vx_hs_reco_sel_eff_vs_ntruth,"vx_hs_reco_sel_eff_vs_ntruth");
253
254 book(m_vx_nReco_vs_nTruth_inclusive,"vx_nReco_vs_nTruth_inclusive");
255 book(m_vx_nReco_vs_nTruth_matched,"vx_nReco_vs_nTruth_matched");
256 book(m_vx_nReco_vs_nTruth_merged,"vx_nReco_vs_nTruth_merged");
257 book(m_vx_nReco_vs_nTruth_split,"vx_nReco_vs_nTruth_split");
258 book(m_vx_nReco_vs_nTruth_fake,"vx_nReco_vs_nTruth_fake");
259 book(m_vx_nReco_vs_nTruth_dummy,"vx_nReco_vs_nTruth_dummy");
260 book(m_vx_nReco_vs_nTruth_clean,"vx_nReco_vs_nTruth_clean");
261 book(m_vx_nReco_vs_nTruth_lowpu,"vx_nReco_vs_nTruth_lowpu");
262 book(m_vx_nReco_vs_nTruth_highpu,"vx_nReco_vs_nTruth_highpu");
263 book(m_vx_nReco_vs_nTruth_hssplit,"vx_nReco_vs_nTruth_hssplit");
264 book(m_vx_nReco_vs_nTruth_none,"vx_nReco_vs_nTruth_none");
265
266 book(m_vx_hs_z_pull,"vx_TYPE_z_pull","vx_hs_z_pull");
267 book(m_vx_hs_y_pull,"vx_TYPE_y_pull","vx_hs_y_pull");
268 book(m_vx_hs_x_pull,"vx_TYPE_x_pull","vx_hs_x_pull");
269
270 book(m_vx_all_z_pull,"vx_TYPE_z_pull","vx_all_z_pull");
271 book(m_vx_all_y_pull,"vx_TYPE_y_pull","vx_all_y_pull");
272 book(m_vx_all_x_pull,"vx_TYPE_x_pull","vx_all_x_pull");
273
274 book(m_vx_hs_z_res,"vx_TYPE_z_reso","vx_hs_z_res");
275 book(m_vx_hs_y_res,"vx_TYPE_y_reso","vx_hs_y_res");
276 book(m_vx_hs_x_res,"vx_TYPE_x_reso","vx_hs_x_res");
277 book(m_vx_all_z_res,"vx_TYPE_z_reso","vx_all_z_res");
278 book(m_vx_all_y_res,"vx_TYPE_y_reso","vx_all_y_res");
279 book(m_vx_all_x_res,"vx_TYPE_x_reso","vx_all_x_res");
280
281 book(m_vx_all_truth_z_res_vs_PU, "vx_TYPE_truth_reso_z_vs_PU", "vx_all_truth_reso_z_vs_PU");
282 book(m_vx_all_truth_x_res_vs_PU, "vx_TYPE_truth_reso_x_vs_PU", "vx_all_truth_reso_x_vs_PU");
283 book(m_vx_all_truth_y_res_vs_PU, "vx_TYPE_truth_reso_y_vs_PU", "vx_all_truth_reso_y_vs_PU");
284 book(m_vx_all_truth_z_res_vs_nTrk, "vx_TYPE_truth_reso_z_vs_nTrk", "vx_all_truth_reso_z_vs_nTrk");
285 book(m_vx_all_truth_x_res_vs_nTrk, "vx_TYPE_truth_reso_x_vs_nTrk", "vx_all_truth_reso_x_vs_nTrk");
286 book(m_vx_all_truth_y_res_vs_nTrk, "vx_TYPE_truth_reso_y_vs_nTrk", "vx_all_truth_reso_y_vs_nTrk");
287
288 book(m_vx_all_truth_z_pull_vs_PU, "vx_TYPE_truth_pull_z_vs_PU", "vx_all_truth_pull_z_vs_PU");
289 book(m_vx_all_truth_x_pull_vs_PU, "vx_TYPE_truth_pull_x_vs_PU", "vx_all_truth_pull_x_vs_PU");
290 book(m_vx_all_truth_y_pull_vs_PU, "vx_TYPE_truth_pull_y_vs_PU", "vx_all_truth_pull_y_vs_PU");
291 book(m_vx_all_truth_z_pull_vs_nTrk, "vx_TYPE_truth_pull_z_vs_nTrk", "vx_all_truth_pull_z_vs_nTrk");
292 book(m_vx_all_truth_x_pull_vs_nTrk, "vx_TYPE_truth_pull_x_vs_nTrk", "vx_all_truth_pull_x_vs_nTrk");
293 book(m_vx_all_truth_y_pull_vs_nTrk, "vx_TYPE_truth_pull_y_vs_nTrk", "vx_all_truth_pull_y_vs_nTrk");
294
295 book(m_vx_hs_truth_z_res_vs_PU, "vx_TYPE_truth_reso_z_vs_PU", "vx_hs_truth_reso_z_vs_PU");
296 book(m_vx_hs_truth_x_res_vs_PU, "vx_TYPE_truth_reso_x_vs_PU", "vx_hs_truth_reso_x_vs_PU");
297 book(m_vx_hs_truth_y_res_vs_PU, "vx_TYPE_truth_reso_y_vs_PU", "vx_hs_truth_reso_y_vs_PU");
298 book(m_vx_hs_truth_z_res_vs_nTrk, "vx_TYPE_truth_reso_z_vs_nTrk", "vx_hs_truth_reso_z_vs_nTrk");
299 book(m_vx_hs_truth_x_res_vs_nTrk, "vx_TYPE_truth_reso_x_vs_nTrk", "vx_hs_truth_reso_x_vs_nTrk");
300 book(m_vx_hs_truth_y_res_vs_nTrk, "vx_TYPE_truth_reso_y_vs_nTrk", "vx_hs_truth_reso_y_vs_nTrk");
301
302 book(m_vx_hs_truth_z_pull_vs_PU, "vx_TYPE_truth_pull_z_vs_PU", "vx_hs_truth_pull_z_vs_PU");
303 book(m_vx_hs_truth_x_pull_vs_PU, "vx_TYPE_truth_pull_x_vs_PU", "vx_hs_truth_pull_x_vs_PU");
304 book(m_vx_hs_truth_y_pull_vs_PU, "vx_TYPE_truth_pull_y_vs_PU", "vx_hs_truth_pull_y_vs_PU");
305 book(m_vx_hs_truth_z_pull_vs_nTrk, "vx_TYPE_truth_pull_z_vs_nTrk", "vx_hs_truth_pull_z_vs_nTrk");
306 book(m_vx_hs_truth_x_pull_vs_nTrk, "vx_TYPE_truth_pull_x_vs_nTrk", "vx_hs_truth_pull_x_vs_nTrk");
307 book(m_vx_hs_truth_y_pull_vs_nTrk, "vx_TYPE_truth_pull_y_vs_nTrk", "vx_hs_truth_pull_y_vs_nTrk");
308
309 // book the new expert histos for vertex classifications
310 book(m_vx_ntracks_matched,"vx_ntracks_matched");
311 book(m_vx_ntracks_merged,"vx_ntracks_merged");
312 book(m_vx_ntracks_split,"vx_ntracks_split");
313 book(m_vx_ntracks_HS_matched,"vx_ntracks_HS_matched");
314 book(m_vx_ntracks_HS_merged,"vx_ntracks_HS_merged");
315 book(m_vx_ntracks_HS_split,"vx_ntracks_HS_split");
316 book(m_vx_ntracks_ALL_matched,"vx_ntracks_ALL_matched");
317 book(m_vx_ntracks_ALL_merged,"vx_ntracks_ALL_merged");
318 book(m_vx_ntracks_ALL_split,"vx_ntracks_ALL_split");
319 book(m_vx_sumpT_matched,"vx_sumpT_matched");
320 book(m_vx_sumpT_merged,"vx_sumpT_merged");
321 book(m_vx_sumpT_split,"vx_sumpT_split");
322 book(m_vx_sumpT_HS_matched,"vx_sumpT_HS_matched");
323 book(m_vx_sumpT_HS_merged,"vx_sumpT_HS_merged");
324 book(m_vx_sumpT_HS_split,"vx_sumpT_HS_split");
325 book(m_vx_sumpT_ALL_matched,"vx_sumpT_ALL_matched");
326 book(m_vx_sumpT_ALL_merged,"vx_sumpT_ALL_merged");
327 book(m_vx_sumpT_ALL_split,"vx_sumpT_ALL_split");
328
329 book(m_vx_z_asym_matched,"vx_z_asym_matched");
330 book(m_vx_z_asym_merged,"vx_z_asym_merged");
331 book(m_vx_z_asym_split,"vx_z_asym_split");
332 book(m_vx_z_asym_HS_matched,"vx_z_asym_HS_matched");
333 book(m_vx_z_asym_HS_merged,"vx_z_asym_HS_merged");
334 book(m_vx_z_asym_HS_split,"vx_z_asym_HS_split");
335 book(m_vx_z_asym_ALL_matched,"vx_z_asym_ALL_matched");
336 book(m_vx_z_asym_ALL_merged,"vx_z_asym_ALL_merged");
337 book(m_vx_z_asym_ALL_split,"vx_z_asym_ALL_split");
338 book(m_vx_z_asym_weighted_matched,"vx_z_asym_weighted_matched");
339 book(m_vx_z_asym_weighted_merged,"vx_z_asym_weighted_merged");
340 book(m_vx_z_asym_weighted_split,"vx_z_asym_weighted_split");
341 book(m_vx_z_asym_weighted_HS_matched,"vx_z_asym_weighted_HS_matched");
342 book(m_vx_z_asym_weighted_HS_merged,"vx_z_asym_weighted_HS_merged");
343 book(m_vx_z_asym_weighted_HS_split,"vx_z_asym_weighted_HS_split");
344 book(m_vx_z_asym_weighted_ALL_matched,"vx_z_asym_weighted_ALL_matched");
345 book(m_vx_z_asym_weighted_ALL_merged,"vx_z_asym_weighted_ALL_merged");
346 book(m_vx_z_asym_weighted_ALL_split,"vx_z_asym_weighted_ALL_split");
347
348 book(m_vx_track_weight_matched, "vx_track_weight_matched");
349 book(m_vx_track_weight_merged, "vx_track_weight_merged");
350 book(m_vx_track_weight_split, "vx_track_weight_split");
351 book(m_vx_track_weight_HS_matched, "vx_track_weight_HS_matched");
352 book(m_vx_track_weight_HS_merged, "vx_track_weight_HS_merged");
353 book(m_vx_track_weight_HS_split, "vx_track_weight_HS_split");
354 book(m_vx_track_weight_ALL_matched, "vx_track_weight_ALL_matched");
355 book(m_vx_track_weight_ALL_merged, "vx_track_weight_ALL_merged");
356 book(m_vx_track_weight_ALL_split, "vx_track_weight_ALL_split");
357
358 book(m_vx_normalised_track_weight_matched, "vx_normalised_track_weight_matched");
359 book(m_vx_normalised_track_weight_merged, "vx_normalised_track_weight_merged");
360 book(m_vx_normalised_track_weight_split, "vx_normalised_track_weight_split");
361 book(m_vx_normalised_track_weight_HS_matched, "vx_normalised_track_weight_HS_matched");
362 book(m_vx_normalised_track_weight_HS_merged, "vx_normalised_track_weight_HS_merged");
363 book(m_vx_normalised_track_weight_HS_split, "vx_normalised_track_weight_HS_split");
364 book(m_vx_normalised_track_weight_ALL_matched, "vx_normalised_track_weight_ALL_matched");
365 book(m_vx_normalised_track_weight_ALL_merged, "vx_normalised_track_weight_ALL_merged");
366 book(m_vx_normalised_track_weight_ALL_split, "vx_normalised_track_weight_ALL_split");
367
368 book(m_vx_chi2Over_ndf_matched,"vx_chi2Over_ndf_matched");
369 book(m_vx_chi2Over_ndf_merged,"vx_chi2Over_ndf_merged");
370 book(m_vx_chi2Over_ndf_split,"vx_chi2Over_ndf_split");
371 book(m_vx_chi2Over_ndf_HS_matched,"vx_chi2Over_ndf_HS_matched");
372 book(m_vx_chi2Over_ndf_HS_merged,"vx_chi2Over_ndf_HS_merged");
373 book(m_vx_chi2Over_ndf_HS_split,"vx_chi2Over_ndf_HS_split");
374 book(m_vx_chi2Over_ndf_ALL_matched,"vx_chi2Over_ndf_ALL_matched");
375 book(m_vx_chi2Over_ndf_ALL_merged,"vx_chi2Over_ndf_ALL_merged");
376 book(m_vx_chi2Over_ndf_ALL_split,"vx_chi2Over_ndf_ALL_split");
377
378 book(m_vx_z0_skewness_matched, "vx_z0_skewness_matched");
379 book(m_vx_z0_skewness_merged, "vx_z0_skewness_merged");
380 book(m_vx_z0_skewness_split, "vx_z0_skewness_split");
381 book(m_vx_z0_skewness_HS_matched, "vx_z0_skewness_HS_matched");
382 book(m_vx_z0_skewness_HS_merged, "vx_z0_skewness_HS_merged");
383 book(m_vx_z0_skewness_HS_split, "vx_z0_skewness_HS_split");
384 book(m_vx_z0_skewness_ALL_matched, "vx_z0_skewness_ALL_matched");
385 book(m_vx_z0_skewness_ALL_merged, "vx_z0_skewness_ALL_merged");
386 book(m_vx_z0_skewness_ALL_split, "vx_z0_skewness_ALL_split");
387 book(m_vx_z0_kurtosis_matched,"vx_z0_kurtosis_matched");
388 book(m_vx_z0_kurtosis_merged,"vx_z0_kurtosis_merged");
389 book(m_vx_z0_kurtosis_split,"vx_z0_kurtosis_split");
390 book(m_vx_z0_kurtosis_HS_matched,"vx_z0_kurtosis_HS_matched");
391 book(m_vx_z0_kurtosis_HS_merged,"vx_z0_kurtosis_HS_merged");
392 book(m_vx_z0_kurtosis_HS_split,"vx_z0_kurtosis_HS_split");
393 book(m_vx_z0_kurtosis_ALL_matched,"vx_z0_kurtosis_ALL_matched");
394 book(m_vx_z0_kurtosis_ALL_merged,"vx_z0_kurtosis_ALL_merged");
395 book(m_vx_z0_kurtosis_ALL_split,"vx_z0_kurtosis_ALL_split");
396
397 book(m_vx_nVertices_matched,"vx_nVertices_matched");
398 book(m_vx_nVertices_merged,"vx_nVertices_merged");
399 book(m_vx_nVertices_split, "vx_nVertices_split");
400 book(m_vx_nVertices_fake, "vx_nVertices_fake");
401 book(m_vx_nVertices_HS_matched,"vx_nVertices_HS_matched");
402 book(m_vx_nVertices_HS_merged,"vx_nVertices_HS_merged");
403 book(m_vx_nVertices_HS_split,"vx_nVertices_HS_split");
404 book(m_vx_nVertices_HS_fake,"vx_nVertices_HS_fake");
405 book(m_vx_nVertices_ALL_matched,"vx_nVertices_ALL_matched");
406 book(m_vx_nVertices_ALL_merged,"vx_nVertices_ALL_merged");
407 book(m_vx_nVertices_ALL_split,"vx_nVertices_ALL_split");
408 book(m_vx_nVertices_ALL_fake,"vx_nVertices_ALL_fake");
409
410 book(m_vx_hs_mindz,"vx_hs_mindz");
411 book(m_vx_all_dz,"vx_all_dz");
412
413 book(m_vx_hs_reco_long_reso,"vx_hs_reco_long_reso");
414 book(m_vx_hs_reco_trans_reso,"vx_hs_reco_trans_reso");
415
416 //Helpers for resolution plots for HS vertex
417 book(m_resHelper_PUdensity_hsVxTruthLong,"resHelper_PUdensity_hsVxTruthLong");
418 book(m_resolution_vs_PUdensity_hsVxTruthLong,"resolution_vs_PUdensity_hsVxTruthLong");
419 book(m_resmean_vs_PUdensity_hsVxTruthLong,"resmean_vs_PUdensity_hsVxTruthLong");
420
421 book(m_resHelper_PUdensity_hsVxTruthTransv,"resHelper_PUdensity_hsVxTruthTransv");
422 book(m_resolution_vs_PUdensity_hsVxTruthTransv,"resolution_vs_PUdensity_hsVxTruthTransv");
423 book(m_resmean_vs_PUdensity_hsVxTruthTransv,"resmean_vs_PUdensity_hsVxTruthTransv");
424
425 book(m_vx_PUdensity,"vx_PUdensity");
426 book(m_vx_nTruth,"vx_nTruth");
427 book(m_vx_nTruth_vs_PUdensity,"vx_nTruth_vs_PUdensity");
428 }
429
430}
431
432
433
435 const xAOD::Vertex* recoHSVertex = nullptr;
436 float sumPtMax = -1.;
437 const xAOD::TrackParticle* trackTmp = nullptr;
438 float sumPtTmp;
439 for (const auto& vtx : recoVertices.stdcont()) {
440 if (vtx) {
441 sumPtTmp = 0.;
442 for (size_t i = 0; i < vtx->nTrackParticles(); i++) {
443 trackTmp = vtx->trackParticle(i);
444 if (trackTmp) {
445 sumPtTmp += std::pow(trackTmp->pt(), 2);
446 }
447 }
448 if (sumPtTmp > sumPtMax) {
449 sumPtMax = sumPtTmp;
450 recoHSVertex = vtx;
451 }
452 }
453 }
454 return recoHSVertex;
455}
456
457
458template<typename U, typename V>
459float InDetPerfPlot_VertexTruthMatching::getRadialDiff2(const U* vtx1, const V* vtx2) const {
460 return (std::pow((vtx1->x() - vtx2->x()), 2) + std::pow((vtx1->y() - vtx2->y()), 2) + std::pow((vtx1->z() - vtx2->z()), 2));
461}
462
463float 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 {
464 float radialWindow2 = std::pow(radialWindow, 2);
465 int nTracksInWindow = 0;
466 float localPUDensity;
467 float radialDiff2;
468 for (const auto& vtx : truthHSVertices) {
469 if (vtx != vtxOfInterest) {
470 radialDiff2 = getRadialDiff2(vtxOfInterest, vtx);
471 if (radialDiff2 < radialWindow2) {
472 nTracksInWindow += 1;
473 }
474 }
475 }
476 for (const auto& vtx : truthPUVertices) {
477 if (vtx != vtxOfInterest) {
478 radialDiff2 = getRadialDiff2(vtxOfInterest, vtx);
479 if (radialDiff2 < radialWindow2) {
480 nTracksInWindow += 1;
481 }
482 }
483 }
484 localPUDensity = (float)(nTracksInWindow) / (2 * radialWindow);
485 return localPUDensity;
486}
487
489 return std::sqrt(recoVtx->covariancePosition()(2, 2));
490}
491
493 float x = recoVtx->x();
494 float y = recoVtx->y();
495 float xErr2 = recoVtx->covariancePosition()(0, 0);
496 float yErr2 = recoVtx->covariancePosition()(1, 1);
497 float xyCov = recoVtx->covariancePosition()(0, 1);
498 float r2 = std::pow(x, 2) + std::pow(y, 2);
499 return std::sqrt(std::pow(x, 2) / r2 * xErr2 + std::pow(y, 2) / r2 * yErr2 + 2 * x * y / r2 * xyCov);
500}
501
503 const xAOD::TruthVertex* truthVtx = nullptr;
504 if (recoVtx) {
505 const static xAOD::Vertex::Decorator<std::vector<InDetVertexTruthMatchUtils::VertexTruthMatchInfo>> truthMatchingInfos("TruthEventMatchingInfos");
506 try{
507 if (!truthMatchingInfos.isAvailable(*recoVtx)){
508 ATH_MSG_WARNING("TruthEventMatchingInfos DECORATOR not available -- returning nullptr!");
509 return truthVtx;
510 }
511 const std::vector<InDetVertexTruthMatchUtils::VertexTruthMatchInfo>& truthInfos = truthMatchingInfos(*recoVtx);
512 if (!truthInfos.empty()) {
513 const InDetVertexTruthMatchUtils::VertexTruthMatchInfo& truthInfo = truthInfos.at(0);
514 const ElementLink<xAOD::TruthEventBaseContainer> truthEventLink = std::get<0>(truthInfo);
515 const xAOD::TruthEvent* truthEvent = nullptr;
516 if (truthEventLink.isValid()) {
517 truthEvent = static_cast<const xAOD::TruthEvent*>(*truthEventLink);
518 if (truthEvent) {
519 size_t i_vtx = 0;
520 size_t n_vtx = truthEvent->nTruthVertices();
521 while(!truthVtx && i_vtx<n_vtx){
522 truthVtx = truthEvent->truthVertex(i_vtx);
523 i_vtx++;
524 }
525 }
526 }
527 }
528 else {
529 ATH_MSG_WARNING("TruthEventMatchingInfos DECORATOR yields empty vector -- returning nullptr!");
530 }
531 }
532 catch (SG::ExcBadAuxVar &){
533 ATH_MSG_WARNING("TruthEventMatchingInfos DECORATOR yields empty vector -- returning nullptr!");
534 }
535 }
536 return truthVtx;
537}
538
539void InDetPerfPlot_VertexTruthMatching::fill(const xAOD::Vertex& vertex, const xAOD::TruthVertex * tvrt, float weight) {
540 // not sure how to deal with this type of histogram
541 if (tvrt) {
542 const float diff_x = vertex.x() - tvrt->x();
543 const float diff_y = vertex.y() - tvrt->y();
544 const float diff_z = vertex.z() - tvrt->z();
545 const AmgSymMatrix(3)& covariance = vertex.covariancePosition();
546 const float err_x = std::abs(Amg::error(covariance, 0)) > 1e-7 ? Amg::error(covariance, 0) : 1000.;
547 const float err_y = std::abs(Amg::error(covariance, 1)) > 1e-7 ? Amg::error(covariance, 1) : 1000.;
548 const float err_z = std::abs(Amg::error(covariance, 2)) > 1e-7 ? Amg::error(covariance, 2) : 1000.;
549 fillHisto(m_vx_x_diff, diff_x, weight);
550 fillHisto(m_vx_x_diff_pull, diff_x / err_x, weight);
551 fillHisto(m_vx_y_diff, diff_y, weight);
552 fillHisto(m_vx_y_diff_pull, diff_y / err_y, weight);
553 fillHisto(m_vx_z_diff, diff_z, weight);
554 fillHisto(m_vx_z_diff_pull, diff_z / err_z, weight);
555
556 if (m_isITk) {
557 static const SG::AuxElement::Accessor<uint8_t> accHasValidTime("hasValidTime");
558 static const SG::AuxElement::Accessor<float> accTime("time");
559 static const SG::AuxElement::Accessor<float> accTimeResolution("timeResolution");
560 if (accHasValidTime.isAvailable(vertex) && accTime.isAvailable(vertex) &&
561 accTimeResolution.isAvailable(vertex)) {
562
563 if (vertex.hasValidTime()) {
564 float diff_time = vertex.time() - tvrt->t() / Gaudi::Units::c_light;
565 float err_time = vertex.timeResolution();
566 fillHisto(m_vx_time_diff, diff_time, weight);
567 fillHisto(m_vx_time_diff_pull, diff_time / err_time, weight);
568 }
569 }
570 }
571 }
572
573 // Get the match type info for each vertex:
574 const static xAOD::Vertex::Decorator<InDetVertexTruthMatchUtils::VertexMatchType> recoVtxMatchTypeInfo("VertexMatchType");
576 if (recoVtxMatchTypeInfo.isAvailable(vertex)) {
577 try {
578 matchType = recoVtxMatchTypeInfo(vertex);
579 ATH_MSG_DEBUG("VERTEX DECORATOR ======= " << matchType << ", with nTRACKS === " << vertex.nTrackParticles() << ", vertex index = " << vertex.index() << " AT (x, y, z) = (" << vertex.x() << ", " << vertex.y() << ", " << vertex.z() << ")");
580 fillHisto(m_vx_type_truth, matchType, weight);
581 }
582 catch (SG::ExcBadAuxVar &) {
583 ATH_MSG_WARNING("VertexMatchType DECORATOR seems to be available, but may be broken ===========");
584 }
585 }
586 else {
587 ATH_MSG_WARNING("VertexMatchType DECORATOR is NOT available ===========");
588 }
589
590} // void InDetPerfPlot_VertexTruthMatching::fill(const xAOD::Vertex& vertex) {
591
593(const xAOD::Vertex* recoHardScatter,
594 const xAOD::VertexContainer& vertexContainer,
595 const std::vector<const xAOD::TruthVertex*>& truthHSVertices,
596 const std::vector<const xAOD::TruthVertex*>& truthPUVertices,
597 float actualMu, float weight) {
598
599 // Fill our histograms
601 fillHisto(m_vx_hs_classification, hsType, weight);
602
603 int nRecoVertices = static_cast<int>(vertexContainer.size()-1); //Not counting the dummy vertex of type 0
604
605 if (!recoHardScatter){
606 ATH_MSG_INFO("No recoHardScatter vertex - not filling vertex truth matching.");
607 return;
608 }
609
610 // Get the truth HS vertex
611 const xAOD::TruthVertex* truthHSVtx = nullptr;
612
613 // Check that we have *exactly* 1 truth HS vertex
614 if (!truthHSVertices.empty()) {
615 if (truthHSVertices.size() != 1) {
616 ATH_MSG_WARNING("Size of truth HS vertex vector is >1 -- only using the first one in the vector.");
617 }
618 truthHSVtx = truthHSVertices.at(0);
619 }
620 else {
621 ATH_MSG_WARNING("Size of truth HS vertex vector is 0 -- assuming truth HS vertex to NOT be reconstructed.");
622 }
623
624 if (!truthHSVtx){
625 ATH_MSG_INFO("No truthHSVtx vertex - not filling vertex truth matching.");
626 return;
627 }
628
629 bool isHSVtx_dist_matched = getRadialDiff2(recoHardScatter, truthHSVtx) < std::pow(m_cutMinTruthRecoRadialDiff, 2);
630 fillHisto(m_vx_hs_sel_eff_dist_vs_nReco, nRecoVertices, isHSVtx_dist_matched, weight);
631
632 // Best reco HS vertex identified via truth HS weights
633 const xAOD::Vertex* bestRecoHSVtx_truth = InDetVertexTruthMatchUtils::bestHardScatterMatch(vertexContainer);
634 if (!bestRecoHSVtx_truth){
635 ATH_MSG_INFO("No bestRecoHS vertex - not filling vertex truth matching.");
636 return;
637 }
638
639 bool isHSVtx_vtx_matched = (recoHardScatter == bestRecoHSVtx_truth);
640 fillHisto(m_vx_hs_sel_eff_mu, actualMu, isHSVtx_vtx_matched, weight);
641 fillHisto(m_vx_hs_sel_eff_vs_nReco, nRecoVertices, isHSVtx_vtx_matched, weight);
642
643 // Did we successfully reconstruct our truth HS vertex?
644 bool isHSVtx_reco = getRadialDiff2(bestRecoHSVtx_truth, truthHSVtx) < std::pow(m_cutMinTruthRecoRadialDiff, 2);
645 fillHisto(m_vx_hs_reco_eff_mu, actualMu, isHSVtx_reco, weight);
646
647 float residual_z = truthHSVtx->z() - bestRecoHSVtx_truth->z();
648 if(isHSVtx_reco) fillHisto(m_resHelper_mu_hsVxTruthLong, actualMu, residual_z, weight);
649
650 if (m_detailLevel >= 200) {
651 // Inclusive:
652 int nTruthVertices = static_cast<int>(truthHSVertices.size() + truthPUVertices.size());
653 fillHisto(m_vx_nReco_vs_nTruth_inclusive, nTruthVertices, nRecoVertices, weight);
654 fillHisto(m_vx_nTruth, nTruthVertices, weight);
655
656 // Let's also plot the vertices by vertex match type:
657 const static xAOD::Vertex::Decorator<InDetVertexTruthMatchUtils::VertexMatchType> recoVtxMatchTypeInfo("VertexMatchType");
658 std::map<InDetVertexTruthMatchUtils::VertexMatchType, int> breakdown = {};
664
665 fillHisto(m_vx_hs_sel_eff_dist, nTruthVertices, isHSVtx_dist_matched, weight);
666
667 //Calculating the local PU density around the true HS vertex
668 float localPUDensity = getLocalPUDensity(truthHSVtx, truthHSVertices, truthPUVertices);
669 fillHisto(m_vx_PUdensity, localPUDensity, weight);
670 fillHisto(m_vx_nTruth_vs_PUdensity, nTruthVertices, localPUDensity, weight);
671
672 fillHisto(m_vx_hs_sel_eff, localPUDensity, isHSVtx_vtx_matched, weight);
673 fillHisto(m_vx_hs_sel_eff_vs_ntruth, nTruthVertices, isHSVtx_vtx_matched, weight);
674
675 // add variables here so that they are in correct scope (outside loop over vertices)
676 float number_matched = 0;
677 float number_merged = 0;
678 float number_split = 0;
679 float number_fake = 0;
680 float number_matched_HS = 0;
681 float number_merged_HS = 0;
682 float number_split_HS = 0;
683 float number_fake_HS = 0;
684 float number_matched_PU = 0;
685 float number_merged_PU = 0;
686 float number_split_PU = 0;
687 float number_fake_PU = 0;
688
689 // variables for delta z between the HS and the closest one
690 float vx_hs_mindz=9999.;
691
692 // Iterate over vertices:
694 for (const auto& vertex : vertexContainer.stdcont()) {
695
696 // Skip dummy vertex (last one in the container)
697 if (vertex->vertexType() == xAOD::VxType::NoVtx) {
698 continue;
699 }
700
701 fill(*vertex);
702
703 matchType = recoVtxMatchTypeInfo(*vertex);
704 breakdown[matchType] += 1;
705
706 const xAOD::TruthVertex *matchVertex = getTruthVertex(vertex);
707 if(!matchVertex) continue;
708 float residual_z = matchVertex->z() - vertex->z();
709 float residual_x = matchVertex->x() - vertex->x();
710 float residual_y = matchVertex->y() - vertex->y();
711 const AmgSymMatrix(3)& covariance = vertex->covariancePosition();
712 float vtxerr_x = std::abs(Amg::error(covariance, 0)) > 1e-7 ? Amg::error(covariance, 0) : 1000.;
713 float vtxerr_y = std::abs(Amg::error(covariance, 1)) > 1e-7 ? Amg::error(covariance, 1) : 1000.;
714 float vtxerr_z = std::abs(Amg::error(covariance, 2)) > 1e-7 ? Amg::error(covariance, 2) : 1000.;
715
716 fillHisto(m_vx_all_z_pull, residual_z/vtxerr_z, weight);
717 fillHisto(m_vx_all_y_pull, residual_y/vtxerr_y, weight);
718 fillHisto(m_vx_all_x_pull, residual_x/vtxerr_x, weight);
719
720 float localPUDensity = getLocalPUDensity(matchVertex, truthHSVertices, truthPUVertices);
721
722 fillHisto(m_vx_all_truth_z_res_vs_PU, localPUDensity, residual_z, weight);
723 fillHisto(m_vx_all_truth_x_res_vs_PU, localPUDensity, residual_x, weight);
724 fillHisto(m_vx_all_truth_y_res_vs_PU, localPUDensity, residual_y, weight);
725
726 fillHisto(m_vx_all_z_res, residual_z, weight);
727 fillHisto(m_vx_all_y_res, residual_y, weight);
728 fillHisto(m_vx_all_x_res, residual_x, weight);
729
730 fillHisto(m_vx_all_truth_z_pull_vs_PU, localPUDensity, residual_z/vtxerr_z, weight);
731 fillHisto(m_vx_all_truth_x_pull_vs_PU, localPUDensity, residual_x/vtxerr_x, weight);
732 fillHisto(m_vx_all_truth_y_pull_vs_PU, localPUDensity, residual_y/vtxerr_y, weight);
733
734 int nTrackPart = vertex->nTrackParticles();
735 fillHisto(m_vx_all_truth_z_res_vs_nTrk, nTrackPart, residual_z, weight);
736 fillHisto(m_vx_all_truth_x_res_vs_nTrk, nTrackPart, residual_x, weight);
737 fillHisto(m_vx_all_truth_y_res_vs_nTrk, nTrackPart, residual_y, weight);
738
739 fillHisto(m_vx_all_truth_z_pull_vs_nTrk, nTrackPart, residual_z/vtxerr_z, weight);
740 fillHisto(m_vx_all_truth_x_pull_vs_nTrk, nTrackPart, residual_x/vtxerr_x, weight);
741 fillHisto(m_vx_all_truth_y_pull_vs_nTrk, nTrackPart, residual_y/vtxerr_y, weight);
742
743 // New Expert histograms for observables for vertex classifications for HS and PU
744 // For each vertex, loop over all tracks and get sumpt and sum of charges
745 // also use this to get the z asymmetry around the vertex.
746
747 // Declaring variables for the observables
748 const xAOD::TrackParticle* trackTmp = nullptr;
749 float sumPt =0;
750 float minpt = 20000 ; // minimum sum pt required for the 'All' vertices plots - 20 GeV
751 float trackPt = 0;
752
753 // variables for calculation of delta Z asymmetry and delta d asymmetry
754 float z_asym = 0;
755 float sumDZ = 0;
756 float deltaZ =0;
757 float modsumDZ =0;
758 float weighted_sumDZ = 0;
759 float weighted_deltaZ = 0;
760 float weighted_modsumDZ = 0;
761 float weighted_z_asym =0;
762
763 // make vector
764 std::vector<float> track_deltaZ;
765 std::vector<float> track_deltaPt;
766 std::vector<float> track_deltaZ_weighted;
767
768 // loop over tracks
769 for (size_t i = 0; i < vertex->nTrackParticles(); i++) {
770 trackTmp = vertex->trackParticle(i);
771
772 if (trackTmp) {
773 trackPt = trackTmp->pt(); // MeV
774 sumPt = sumPt + trackPt; // in MeV
775 deltaZ = trackTmp->z0() - vertex->z();
776 track_deltaZ.push_back(deltaZ);
777 // get the track weight for each track to get the deltaZ/trk_weight
778 float trk_weight = vertex->trackWeight(i);
779 weighted_deltaZ = deltaZ*trk_weight;
780 // sum of delta z
781 sumDZ = sumDZ + deltaZ;
782 modsumDZ = modsumDZ + std::abs(deltaZ);
783 weighted_sumDZ = weighted_sumDZ + weighted_deltaZ;
784 weighted_modsumDZ = weighted_modsumDZ + std::abs(weighted_deltaZ);
785 }
786 } // end loop over tracks
787
788 if (modsumDZ >0) z_asym = sumDZ/modsumDZ;
789 if (weighted_modsumDZ >0) weighted_z_asym = weighted_sumDZ/weighted_modsumDZ;
790
791 double mean_Dz =0;
792 mean_Dz=sumDZ/track_deltaZ.size(); //calculate average
793 double number_tracks =0;
794 number_tracks = track_deltaZ.size(); // get number of tracks
795
796 double z_sd = 0; // standard deviation
797 double z_skew = 0; // skewness of DeltaZ asymmetry
798 double z_kurt = 0; // Kurtosis of DeltaZ asymmetry
799 double z_var=0; // variance of DeltaZ
800 double z_zbar=0; // for use in calculation below
801
802 for ( auto i : track_deltaZ) {
803 z_zbar = (i - mean_Dz);
804 z_var =(z_var + z_zbar*z_zbar);
805 z_skew =(z_skew + z_zbar*z_zbar*z_zbar);
806 z_kurt =(z_kurt + z_zbar*z_zbar*z_zbar*z_zbar);
807 }
808
809 z_var = z_var/(number_tracks -1);
810 z_sd = std::sqrt(z_var);
811 z_skew = z_skew/((number_tracks -1)*z_sd*z_sd*z_sd);
812 z_kurt = z_kurt/((number_tracks -1)*z_sd*z_sd*z_sd*z_sd);
813
814 float ndf = vertex->numberDoF();
815 if (ndf != 0) {
817
818 if (vertex == bestRecoHSVtx_truth) {
819 fillHisto(m_vx_sumpT_HS_matched,sumPt ,weight);
820 fillHisto(m_vx_z_asym_HS_matched, z_asym,weight);
821 fillHisto(m_vx_z_asym_weighted_HS_matched, weighted_z_asym,weight);
822 fillHisto(m_vx_chi2Over_ndf_HS_matched, vertex->chiSquared()/ndf,weight);
823
826
827 for (const float& trkWeight : vertex->trackWeights()) {
828 fillHisto(m_vx_track_weight_HS_matched, trkWeight,weight);
829 fillHisto(m_vx_normalised_track_weight_HS_matched, trkWeight/number_tracks,weight);
830 }
831 } else {
832 fillHisto(m_vx_sumpT_matched,sumPt ,weight);
833 fillHisto(m_vx_z_asym_matched, z_asym,weight);
834 fillHisto(m_vx_z_asym_weighted_matched, weighted_z_asym,weight);
835 fillHisto(m_vx_chi2Over_ndf_matched, vertex->chiSquared()/ndf,weight);
836
837 fillHisto(m_vx_z0_skewness_matched, z_skew,weight);
838 fillHisto(m_vx_z0_kurtosis_matched, z_kurt,weight);
839
840 for (const float& trkWeight : vertex->trackWeights()) {
841 fillHisto(m_vx_track_weight_matched, trkWeight,weight);
842 fillHisto(m_vx_normalised_track_weight_matched, trkWeight/number_tracks,weight);
843 }
844 }
845
846 // fill some histograms that contain both HS and PU above a min pt - say 20GeV
847 if (sumPt > minpt) {
848 fillHisto(m_vx_sumpT_ALL_matched,sumPt ,weight);
849 fillHisto(m_vx_z_asym_ALL_matched, z_asym,weight);
850 fillHisto(m_vx_z_asym_weighted_ALL_matched, weighted_z_asym,weight);
851 fillHisto(m_vx_chi2Over_ndf_ALL_matched, vertex->chiSquared()/ndf,weight);
852
855 for (const float& trkWeight : vertex->trackWeights()) {
856 fillHisto(m_vx_track_weight_ALL_matched, trkWeight,weight);
857 fillHisto(m_vx_normalised_track_weight_ALL_matched, trkWeight/number_tracks,weight);
858 }
859
860 }
861 } // end of if matched vertices
862
864 if (vertex == bestRecoHSVtx_truth) {
865 fillHisto(m_vx_sumpT_HS_merged, sumPt ,weight);
866 fillHisto(m_vx_z_asym_HS_merged, z_asym,weight);
867 fillHisto(m_vx_z_asym_weighted_HS_merged, weighted_z_asym,weight);
868 fillHisto(m_vx_chi2Over_ndf_HS_merged, vertex->chiSquared()/ndf,weight);
869
872 for (const float& trkWeight : vertex->trackWeights()) {
873 fillHisto(m_vx_track_weight_HS_merged, trkWeight,weight);
874 fillHisto(m_vx_normalised_track_weight_HS_merged, trkWeight/number_tracks,weight);
875 }
876 }
877 else {
878 fillHisto(m_vx_sumpT_merged, sumPt ,weight);
879 fillHisto(m_vx_z_asym_merged, z_asym,weight);
880 fillHisto(m_vx_z_asym_weighted_merged, weighted_z_asym,weight);
881 fillHisto(m_vx_chi2Over_ndf_merged, vertex->chiSquared()/ndf,weight);
882
883 fillHisto(m_vx_z0_skewness_merged, z_skew,weight);
884 fillHisto(m_vx_z0_kurtosis_merged, z_kurt,weight);
885 for (const float& trkWeight : vertex->trackWeights()) {
886 fillHisto(m_vx_track_weight_merged, trkWeight,weight);
887 fillHisto(m_vx_normalised_track_weight_merged, trkWeight/number_tracks,weight);
888 }
889 }
890
891 if (sumPt > minpt) {
892 fillHisto(m_vx_sumpT_ALL_merged,sumPt ,weight);
893 fillHisto(m_vx_z_asym_ALL_merged, z_asym,weight);
894 fillHisto(m_vx_z_asym_weighted_ALL_merged, weighted_z_asym,weight);
895 fillHisto(m_vx_chi2Over_ndf_ALL_merged, vertex->chiSquared()/ndf,weight);
896
899 for (const float& trkWeight : vertex->trackWeights()) {
900 fillHisto(m_vx_track_weight_ALL_merged, trkWeight,weight);
901 fillHisto(m_vx_normalised_track_weight_ALL_merged, trkWeight/number_tracks,weight);
902 }
903 }
904 } //end of if merged vertices
905
907 if (vertex == bestRecoHSVtx_truth) {
908 fillHisto(m_vx_sumpT_HS_split, sumPt ,weight);
909 fillHisto(m_vx_z_asym_HS_split, z_asym,weight);
910 fillHisto(m_vx_z_asym_weighted_HS_split, weighted_z_asym,weight);
911 fillHisto(m_vx_chi2Over_ndf_HS_split, vertex->chiSquared()/ndf,weight);
912
913 fillHisto(m_vx_z0_skewness_HS_split, z_skew,weight);
914 fillHisto(m_vx_z0_kurtosis_HS_split, z_kurt,weight);
915 for (const float& trkWeight : vertex->trackWeights()) {
916 fillHisto(m_vx_track_weight_HS_split, trkWeight,weight);
917 fillHisto(m_vx_normalised_track_weight_HS_split, trkWeight/number_tracks,weight);
918 }
919 } else {
920 fillHisto(m_vx_sumpT_split, sumPt ,weight);
921 fillHisto(m_vx_z_asym_split, z_asym,weight);
922 fillHisto(m_vx_z_asym_weighted_split, weighted_z_asym,weight);
923 fillHisto(m_vx_chi2Over_ndf_split, vertex->chiSquared()/ndf,weight);
924
925 fillHisto(m_vx_z0_skewness_split, z_skew,weight);
926 fillHisto(m_vx_z0_kurtosis_split, z_kurt,weight);
927 for (const float& trkWeight : vertex->trackWeights()) {
928 fillHisto(m_vx_track_weight_split, trkWeight,weight);
929 fillHisto(m_vx_normalised_track_weight_split, trkWeight/number_tracks,weight);
930 }
931
932 }
933
934 if (sumPt > minpt) {
935 fillHisto(m_vx_sumpT_ALL_split,sumPt ,weight);
936 fillHisto(m_vx_z_asym_ALL_split, z_asym,weight);
937 fillHisto(m_vx_z_asym_weighted_ALL_split, weighted_z_asym,weight);
938 fillHisto(m_vx_chi2Over_ndf_ALL_split, vertex->chiSquared()/ndf,weight);
939
942 for (const float& trkWeight : vertex->trackWeights()) {
943 fillHisto(m_vx_track_weight_ALL_split, trkWeight,weight);
944 fillHisto(m_vx_normalised_track_weight_ALL_split, trkWeight/number_tracks,weight);
945 }
946 }
947 } // end of if split vertices
948
949 // Count the number of vertices for each type per event
951 if (vertex == bestRecoHSVtx_truth) number_matched_HS++;
952 else number_matched_PU++;
953 if (sumPt > minpt) number_matched++;
955 if (vertex == bestRecoHSVtx_truth) number_merged_HS++;
956 else number_merged_PU++;
957 if (sumPt > minpt) number_merged++;
959 if (vertex == bestRecoHSVtx_truth) number_split_HS++;
960 else number_split_PU++;
961 if (sumPt > minpt) number_split++;
963 if (vertex == bestRecoHSVtx_truth) number_fake_HS++;
964 else number_fake_PU++;
965 if (sumPt > minpt) number_fake++;
966 }
967 } // end of if (ndf != 0)
968
969 // New histos to check for number of tracks for each vertex type
970 if (vertex == bestRecoHSVtx_truth) {
971 switch(matchType) {
973 fillHisto(m_vx_ntracks_HS_matched, nTrackPart, weight);
974 break;
976 fillHisto(m_vx_ntracks_HS_merged, nTrackPart, weight);
977 break;
979 fillHisto(m_vx_ntracks_HS_split, nTrackPart, weight);
980 break;
981 default:
982 break;
983 }
984 } else {
985 switch(matchType) {
987 fillHisto(m_vx_ntracks_matched, nTrackPart, weight);
988 break;
990 fillHisto(m_vx_ntracks_merged, nTrackPart, weight);
991 break;
993 fillHisto(m_vx_ntracks_split, nTrackPart, weight);
994 break;
995 default:
996 break;
997 }
998 }
999
1000 if (sumPt > minpt) {
1001 switch(matchType) {
1003 fillHisto(m_vx_ntracks_ALL_matched, nTrackPart, weight);
1004 break;
1006 fillHisto(m_vx_ntracks_ALL_merged, nTrackPart, weight);
1007 break;
1009 fillHisto(m_vx_ntracks_ALL_split, nTrackPart, weight);
1010 break;
1011 default:
1012 break;
1013 }
1014 }
1015
1016 // delta z between HS and nearby vertices
1017 float dz = bestRecoHSVtx_truth->z() - vertex->z();
1018 if(bestRecoHSVtx_truth != vertex && std::abs(dz) < std::abs(vx_hs_mindz)) {
1019 vx_hs_mindz = dz;
1020 }
1021
1022 // loop over vertices again for dz of every vertices pair
1023 for (const auto& vertex2 : vertexContainer.stdcont()) {
1024 if (vertex2->vertexType() == xAOD::VxType::NoVtx) continue;
1025 if(vertex2 == vertex) continue;
1026 fillHisto(m_vx_all_dz, vertex->z() - vertex2->z(), 0.5*weight);
1027 }
1028
1029 } // end loop over vertices
1030
1031 // new histos to count number of vertices per event
1032 fillHisto(m_vx_nVertices_ALL_matched, number_matched,weight);
1033 fillHisto(m_vx_nVertices_ALL_merged, number_merged,weight);
1034 fillHisto(m_vx_nVertices_ALL_split, number_split,weight);
1035 fillHisto(m_vx_nVertices_ALL_fake, number_fake,weight);
1036 fillHisto(m_vx_nVertices_HS_matched, number_matched_HS,weight);
1037 fillHisto(m_vx_nVertices_HS_merged, number_merged_HS,weight);
1038 fillHisto(m_vx_nVertices_HS_split, number_split_HS,weight);
1039 fillHisto(m_vx_nVertices_HS_fake, number_fake_HS,weight);
1040 fillHisto(m_vx_nVertices_matched, number_matched_PU,weight);
1041 fillHisto(m_vx_nVertices_merged, number_merged_PU,weight);
1042 fillHisto(m_vx_nVertices_split, number_split_PU,weight);
1043 fillHisto(m_vx_nVertices_fake, number_fake_PU,weight);
1044
1045 // new histo to delta z between HS and the closest one
1046 fillHisto(m_vx_hs_mindz, vx_hs_mindz, weight);
1047
1048 // Now fill plots relating to the reconstruction of our truth HS vertex (efficiency and resolutions)
1049 if (!truthHSVertices.empty()) {
1050 if (isHSVtx_reco) {
1051 fillHisto(m_vx_hs_reco_eff, localPUDensity, 1, weight);
1052 fillHisto(m_vx_hs_reco_sel_eff, localPUDensity, (recoHardScatter == bestRecoHSVtx_truth), weight);
1053 fillHisto(m_vx_hs_reco_eff_vs_ntruth, nTruthVertices, 1, weight);
1054 fillHisto(m_vx_hs_reco_sel_eff_vs_ntruth, nTruthVertices, (recoHardScatter == bestRecoHSVtx_truth), weight);
1055
1056 fillHisto(m_vx_hs_reco_long_reso, localPUDensity,
1057 getRecoLongitudinalReso(bestRecoHSVtx_truth), weight);
1058 fillHisto(m_vx_hs_reco_trans_reso, localPUDensity,
1059 getRecoTransverseReso(bestRecoHSVtx_truth), weight);
1060
1061 float residual_x = truthHSVtx->x() - bestRecoHSVtx_truth->x();
1062 float residual_y = truthHSVtx->y() - bestRecoHSVtx_truth->y();
1063 float residual_r = std::hypot(residual_x, residual_y);
1064
1065 fillHisto(m_resHelper_PUdensity_hsVxTruthLong, localPUDensity, residual_z, weight);
1066 fillHisto(m_resHelper_PUdensity_hsVxTruthTransv, localPUDensity, residual_r, weight);
1067
1068 const AmgSymMatrix(3)& covariance = bestRecoHSVtx_truth->covariancePosition();
1069 float vtxerr_x = Amg::error(covariance, 0);
1070 float vtxerr_y = Amg::error(covariance, 1);
1071 float vtxerr_z = Amg::error(covariance, 2);
1072
1073 if(std::abs(vtxerr_z) > 1e-7) fillHisto(m_vx_hs_z_pull, residual_z/vtxerr_z, weight);
1074 if(std::abs(vtxerr_y) > 1e-7) fillHisto(m_vx_hs_y_pull, residual_y/vtxerr_y, weight);
1075 if(std::abs(vtxerr_x) > 1e-7) fillHisto(m_vx_hs_x_pull, residual_x/vtxerr_x, weight);
1076
1077 fillHisto(m_vx_hs_truth_z_res_vs_PU, localPUDensity, residual_z, weight);
1078 fillHisto(m_vx_hs_truth_x_res_vs_PU, localPUDensity, residual_x, weight);
1079 fillHisto(m_vx_hs_truth_y_res_vs_PU, localPUDensity, residual_y, weight);
1080
1081 fillHisto(m_vx_hs_z_res, residual_z, weight);
1082 fillHisto(m_vx_hs_y_res, residual_y, weight);
1083 fillHisto(m_vx_hs_x_res, residual_x, weight);
1084
1085 fillHisto(m_vx_hs_truth_z_pull_vs_PU, localPUDensity, residual_z/vtxerr_z, weight);
1086 fillHisto(m_vx_hs_truth_x_pull_vs_PU, localPUDensity, residual_x/vtxerr_x, weight);
1087 fillHisto(m_vx_hs_truth_y_pull_vs_PU, localPUDensity, residual_y/vtxerr_y, weight);
1088
1089 int nTrackPart = bestRecoHSVtx_truth->nTrackParticles();
1090 fillHisto(m_vx_hs_truth_z_res_vs_nTrk, nTrackPart, residual_z, weight);
1091 fillHisto(m_vx_hs_truth_x_res_vs_nTrk, nTrackPart, residual_x, weight);
1092 fillHisto(m_vx_hs_truth_y_res_vs_nTrk, nTrackPart, residual_y, weight);
1093
1094 fillHisto(m_vx_hs_truth_z_pull_vs_nTrk, nTrackPart, residual_z/vtxerr_z, weight);
1095 fillHisto(m_vx_hs_truth_x_pull_vs_nTrk, nTrackPart, residual_x/vtxerr_x, weight);
1096 fillHisto(m_vx_hs_truth_y_pull_vs_nTrk, nTrackPart, residual_y/vtxerr_y, weight);
1097 } else {
1098 fillHisto(m_vx_hs_reco_eff, localPUDensity, 0, weight);
1099 fillHisto(m_vx_hs_reco_eff_vs_ntruth, nTruthVertices, 0, weight);
1100 }
1101 }
1102
1108
1109 // And by hardscatter type:
1110 switch (hsType) {
1112 fillHisto(m_vx_nReco_vs_nTruth_clean, nTruthVertices, nRecoVertices, weight);
1113 break;
1114 }
1116 fillHisto(m_vx_nReco_vs_nTruth_lowpu, nTruthVertices, nRecoVertices, weight);
1117 break;
1118 }
1120 fillHisto(m_vx_nReco_vs_nTruth_highpu, nTruthVertices, nRecoVertices, weight);
1121 break;
1122 }
1124 fillHisto(m_vx_nReco_vs_nTruth_hssplit, nTruthVertices, nRecoVertices, weight);
1125 break;
1126 }
1128 fillHisto(m_vx_nReco_vs_nTruth_none, nTruthVertices, nRecoVertices, weight);
1129 break;
1130 }
1131 default: {
1132 break;
1133 }
1134 } // End of switch
1135
1136 } // end of Expert plots - (if (m_detailLevel >= 200))
1137
1138} // end InDetPerfPlot_VertexTruthMatching::fill(const xAOD::VertexContainer& vertexContainer, const std::vector<const xAOD::TruthVertex*>& truthHSVertices, const std::vector<const xAOD::TruthVertex*>& truthPUVertices)
1139
1140
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_INFO(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)
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)
IDPVM::ResolutionHelper::methods m_resolutionMethod
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.
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