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 if (truthEventLink.isValid() && *truthEventLink) {
516 size_t i_vtx = 0;
517 size_t n_vtx = (*truthEventLink)->nTruthVertices();
518 while(!truthVtx && i_vtx<n_vtx){
519 truthVtx = (*truthEventLink)->truthVertex(i_vtx);
520 i_vtx++;
521 }
522 }
523 }
524 else {
525 ATH_MSG_WARNING("TruthEventMatchingInfos DECORATOR yields empty vector -- returning nullptr!");
526 }
527 }
528 catch (SG::ExcBadAuxVar &){
529 ATH_MSG_WARNING("TruthEventMatchingInfos DECORATOR yields empty vector -- returning nullptr!");
530 }
531 }
532 return truthVtx;
533}
534
535void InDetPerfPlot_VertexTruthMatching::fill(const xAOD::Vertex& vertex, const xAOD::TruthVertex * tvrt, float weight) {
536 // not sure how to deal with this type of histogram
537 if (tvrt) {
538 const float diff_x = vertex.x() - tvrt->x();
539 const float diff_y = vertex.y() - tvrt->y();
540 const float diff_z = vertex.z() - tvrt->z();
541 const AmgSymMatrix(3)& covariance = vertex.covariancePosition();
542 const float err_x = std::abs(Amg::error(covariance, 0)) > 1e-7 ? Amg::error(covariance, 0) : 1000.;
543 const float err_y = std::abs(Amg::error(covariance, 1)) > 1e-7 ? Amg::error(covariance, 1) : 1000.;
544 const float err_z = std::abs(Amg::error(covariance, 2)) > 1e-7 ? Amg::error(covariance, 2) : 1000.;
545 fillHisto(m_vx_x_diff, diff_x, weight);
546 fillHisto(m_vx_x_diff_pull, diff_x / err_x, weight);
547 fillHisto(m_vx_y_diff, diff_y, weight);
548 fillHisto(m_vx_y_diff_pull, diff_y / err_y, weight);
549 fillHisto(m_vx_z_diff, diff_z, weight);
550 fillHisto(m_vx_z_diff_pull, diff_z / err_z, weight);
551
552 if (m_isITk) {
553 static const SG::Accessor<uint8_t> accHasValidTime("hasValidTime");
554 static const SG::Accessor<float> accTime("time");
555 static const SG::Accessor<float> accTimeResolution("timeResolution");
556 if (accHasValidTime.isAvailable(vertex) && accTime.isAvailable(vertex) &&
557 accTimeResolution.isAvailable(vertex)) {
558
559 if (vertex.hasValidTime()) {
560 float diff_time = vertex.time() - tvrt->t() / Gaudi::Units::c_light;
561 float err_time = vertex.timeResolution();
562 fillHisto(m_vx_time_diff, diff_time, weight);
563 fillHisto(m_vx_time_diff_pull, diff_time / err_time, weight);
564 }
565 }
566 }
567 }
568
569 // Get the match type info for each vertex:
570 const static xAOD::Vertex::Decorator<InDetVertexTruthMatchUtils::VertexMatchType> recoVtxMatchTypeInfo("VertexMatchType");
572 if (recoVtxMatchTypeInfo.isAvailable(vertex)) {
573 try {
574 matchType = recoVtxMatchTypeInfo(vertex);
575 ATH_MSG_DEBUG("VERTEX DECORATOR ======= " << matchType << ", with nTRACKS === " << vertex.nTrackParticles() << ", vertex index = " << vertex.index() << " AT (x, y, z) = (" << vertex.x() << ", " << vertex.y() << ", " << vertex.z() << ")");
576 fillHisto(m_vx_type_truth, matchType, weight);
577 }
578 catch (SG::ExcBadAuxVar &) {
579 ATH_MSG_WARNING("VertexMatchType DECORATOR seems to be available, but may be broken ===========");
580 }
581 }
582 else {
583 ATH_MSG_WARNING("VertexMatchType DECORATOR is NOT available ===========");
584 }
585
586} // void InDetPerfPlot_VertexTruthMatching::fill(const xAOD::Vertex& vertex) {
587
589(const xAOD::Vertex* recoHardScatter,
590 const xAOD::VertexContainer& vertexContainer,
591 const std::vector<const xAOD::TruthVertex*>& truthHSVertices,
592 const std::vector<const xAOD::TruthVertex*>& truthPUVertices,
593 float actualMu, float weight) {
594
595 // Fill our histograms
597 fillHisto(m_vx_hs_classification, hsType, weight);
598
599 int nRecoVertices = static_cast<int>(vertexContainer.size()-1); //Not counting the dummy vertex of type 0
600
601 // Get the truth HS vertex
602 const xAOD::TruthVertex* truthHSVtx = nullptr;
603
604 // Check that we have *exactly* 1 truth HS vertex
605 if (!truthHSVertices.empty()) {
606 if (truthHSVertices.size() != 1) {
607 ATH_MSG_WARNING("Size of truth HS vertex vector is >1 -- only using the first one in the vector.");
608 }
609 truthHSVtx = truthHSVertices.at(0);
610 }
611 else {
612 ATH_MSG_WARNING("Size of truth HS vertex vector is 0 -- assuming truth HS vertex to NOT be reconstructed.");
613 }
614
615 if (!truthHSVtx){
616 ATH_MSG_INFO("No truthHSVtx vertex - not filling vertex truth matching.");
617 return;
618 }
619
620 bool isHSVtx_dist_matched = recoHardScatter ? getRadialDiff2(recoHardScatter, truthHSVtx) < std::pow(m_cutMinTruthRecoRadialDiff, 2) : false;
621 fillHisto(m_vx_hs_sel_eff_dist_vs_nReco, nRecoVertices, isHSVtx_dist_matched, weight);
622
623 // Best reco HS vertex identified via truth HS weights
624 const xAOD::Vertex* bestRecoHSVtx_truth = InDetVertexTruthMatchUtils::bestHardScatterMatch(vertexContainer);
625
626 bool isHSVtx_vtx_matched = bestRecoHSVtx_truth && (recoHardScatter == bestRecoHSVtx_truth);
627 fillHisto(m_vx_hs_sel_eff_mu, actualMu, isHSVtx_vtx_matched, weight);
628 fillHisto(m_vx_hs_sel_eff_vs_nReco, nRecoVertices, isHSVtx_vtx_matched, weight);
629
630 // Did we successfully reconstruct our truth HS vertex?
631 bool isHSVtx_reco = bestRecoHSVtx_truth ? getRadialDiff2(bestRecoHSVtx_truth, truthHSVtx) < std::pow(m_cutMinTruthRecoRadialDiff, 2) : false;
632 fillHisto(m_vx_hs_reco_eff_mu, actualMu, isHSVtx_reco, weight);
633
634 float residual_z = isHSVtx_reco ? truthHSVtx->z() - bestRecoHSVtx_truth->z() : -9999.;
635 if(isHSVtx_reco) fillHisto(m_resHelper_mu_hsVxTruthLong, actualMu, residual_z, weight);
636
637 if (m_detailLevel >= 200) {
638 // Inclusive:
639 int nTruthVertices = static_cast<int>(truthHSVertices.size() + truthPUVertices.size());
640 fillHisto(m_vx_nReco_vs_nTruth_inclusive, nTruthVertices, nRecoVertices, weight);
641 fillHisto(m_vx_nTruth, nTruthVertices, weight);
642
643 // Let's also plot the vertices by vertex match type:
644 const static xAOD::Vertex::Decorator<InDetVertexTruthMatchUtils::VertexMatchType> recoVtxMatchTypeInfo("VertexMatchType");
645 std::map<InDetVertexTruthMatchUtils::VertexMatchType, int> breakdown = {};
651
652 fillHisto(m_vx_hs_sel_eff_dist, nTruthVertices, isHSVtx_dist_matched, weight);
653
654 //Calculating the local PU density around the true HS vertex
655 float localPUDensity = getLocalPUDensity(truthHSVtx, truthHSVertices, truthPUVertices);
656 fillHisto(m_vx_PUdensity, localPUDensity, weight);
657 fillHisto(m_vx_nTruth_vs_PUdensity, nTruthVertices, localPUDensity, weight);
658
659 fillHisto(m_vx_hs_sel_eff, localPUDensity, isHSVtx_vtx_matched, weight);
660 fillHisto(m_vx_hs_sel_eff_vs_ntruth, nTruthVertices, isHSVtx_vtx_matched, weight);
661
662 // add variables here so that they are in correct scope (outside loop over vertices)
663 float number_matched = 0;
664 float number_merged = 0;
665 float number_split = 0;
666 float number_fake = 0;
667 float number_matched_HS = 0;
668 float number_merged_HS = 0;
669 float number_split_HS = 0;
670 float number_fake_HS = 0;
671 float number_matched_PU = 0;
672 float number_merged_PU = 0;
673 float number_split_PU = 0;
674 float number_fake_PU = 0;
675
676 // variables for delta z between the HS and the closest one
677 float vx_hs_mindz=9999.;
678
679 // Iterate over vertices:
681 for (const auto& vertex : vertexContainer.stdcont()) {
682
683 unsigned int nTrackPart = vertex->nTrackParticles();
684
685 // Skip dummy vertex (last one in the container)
686 if (vertex->vertexType() == xAOD::VxType::NoVtx) {
687 continue;
688 }
689
690 fill(*vertex);
691
692 matchType = recoVtxMatchTypeInfo(*vertex);
693 breakdown[matchType] += 1;
694
695 const xAOD::TruthVertex *matchVertex = getTruthVertex(vertex);
696 if(matchVertex){
697 float residual_z = matchVertex->z() - vertex->z();
698 float residual_x = matchVertex->x() - vertex->x();
699 float residual_y = matchVertex->y() - vertex->y();
700 const AmgSymMatrix(3)& covariance = vertex->covariancePosition();
701 float vtxerr_x = std::abs(Amg::error(covariance, 0)) > 1e-7 ? Amg::error(covariance, 0) : 1000.;
702 float vtxerr_y = std::abs(Amg::error(covariance, 1)) > 1e-7 ? Amg::error(covariance, 1) : 1000.;
703 float vtxerr_z = std::abs(Amg::error(covariance, 2)) > 1e-7 ? Amg::error(covariance, 2) : 1000.;
704
705 fillHisto(m_vx_all_z_pull, residual_z/vtxerr_z, weight);
706 fillHisto(m_vx_all_y_pull, residual_y/vtxerr_y, weight);
707 fillHisto(m_vx_all_x_pull, residual_x/vtxerr_x, weight);
708
709 float localPUDensity = getLocalPUDensity(matchVertex, truthHSVertices, truthPUVertices);
710
711 fillHisto(m_vx_all_truth_z_res_vs_PU, localPUDensity, residual_z, weight);
712 fillHisto(m_vx_all_truth_x_res_vs_PU, localPUDensity, residual_x, weight);
713 fillHisto(m_vx_all_truth_y_res_vs_PU, localPUDensity, residual_y, weight);
714
715 fillHisto(m_vx_all_z_res, residual_z, weight);
716 fillHisto(m_vx_all_y_res, residual_y, weight);
717 fillHisto(m_vx_all_x_res, residual_x, weight);
718
719 fillHisto(m_vx_all_truth_z_pull_vs_PU, localPUDensity, residual_z/vtxerr_z, weight);
720 fillHisto(m_vx_all_truth_x_pull_vs_PU, localPUDensity, residual_x/vtxerr_x, weight);
721 fillHisto(m_vx_all_truth_y_pull_vs_PU, localPUDensity, residual_y/vtxerr_y, weight);
722
723 fillHisto(m_vx_all_truth_z_res_vs_nTrk, nTrackPart, residual_z, weight);
724 fillHisto(m_vx_all_truth_x_res_vs_nTrk, nTrackPart, residual_x, weight);
725 fillHisto(m_vx_all_truth_y_res_vs_nTrk, nTrackPart, residual_y, weight);
726
727 fillHisto(m_vx_all_truth_z_pull_vs_nTrk, nTrackPart, residual_z/vtxerr_z, weight);
728 fillHisto(m_vx_all_truth_x_pull_vs_nTrk, nTrackPart, residual_x/vtxerr_x, weight);
729 fillHisto(m_vx_all_truth_y_pull_vs_nTrk, nTrackPart, residual_y/vtxerr_y, weight);
730 }
731
732 // New Expert histograms for observables for vertex classifications for HS and PU
733 // For each vertex, loop over all tracks and get sumpt and sum of charges
734 // also use this to get the z asymmetry around the vertex.
735
736 // Declaring variables for the observables
737 const xAOD::TrackParticle* trackTmp = nullptr;
738 float sumPt =0;
739 float minpt = 20000 ; // minimum sum pt required for the 'All' vertices plots - 20 GeV
740 float trackPt = 0;
741
742 // variables for calculation of delta Z asymmetry and delta d asymmetry
743 float z_asym = 0;
744 float sumDZ = 0;
745 float deltaZ =0;
746 float modsumDZ =0;
747 float weighted_sumDZ = 0;
748 float weighted_deltaZ = 0;
749 float weighted_modsumDZ = 0;
750 float weighted_z_asym =0;
751
752 // make vector
753 std::vector<float> track_deltaZ;
754 std::vector<float> track_deltaPt;
755 std::vector<float> track_deltaZ_weighted;
756
757 // loop over tracks
758 for (size_t i = 0; i < nTrackPart; i++) {
759 trackTmp = vertex->trackParticle(i);
760
761 if (trackTmp) {
762 trackPt = trackTmp->pt(); // MeV
763 sumPt = sumPt + trackPt; // in MeV
764 deltaZ = trackTmp->z0() - vertex->z();
765 track_deltaZ.push_back(deltaZ);
766 // get the track weight for each track to get the deltaZ/trk_weight
767 float trk_weight = vertex->trackWeight(i);
768 weighted_deltaZ = deltaZ*trk_weight;
769 // sum of delta z
770 sumDZ = sumDZ + deltaZ;
771 modsumDZ = modsumDZ + std::abs(deltaZ);
772 weighted_sumDZ = weighted_sumDZ + weighted_deltaZ;
773 weighted_modsumDZ = weighted_modsumDZ + std::abs(weighted_deltaZ);
774 }
775 } // end loop over tracks
776
777 if (modsumDZ >0) z_asym = sumDZ/modsumDZ;
778 if (weighted_modsumDZ >0) weighted_z_asym = weighted_sumDZ/weighted_modsumDZ;
779
780 double mean_Dz =0;
781 mean_Dz=sumDZ/track_deltaZ.size(); //calculate average
782 double number_tracks =0;
783 number_tracks = track_deltaZ.size(); // get number of tracks
784
785 double z_sd = 0; // standard deviation
786 double z_skew = 0; // skewness of DeltaZ asymmetry
787 double z_kurt = 0; // Kurtosis of DeltaZ asymmetry
788 double z_var=0; // variance of DeltaZ
789 double z_zbar=0; // for use in calculation below
790
791 for ( auto i : track_deltaZ) {
792 z_zbar = (i - mean_Dz);
793 z_var =(z_var + z_zbar*z_zbar);
794 z_skew =(z_skew + z_zbar*z_zbar*z_zbar);
795 z_kurt =(z_kurt + z_zbar*z_zbar*z_zbar*z_zbar);
796 }
797
798 z_var = z_var/(number_tracks -1);
799 z_sd = std::sqrt(z_var);
800 z_skew = z_skew/((number_tracks -1)*z_sd*z_sd*z_sd);
801 z_kurt = z_kurt/((number_tracks -1)*z_sd*z_sd*z_sd*z_sd);
802
803 float ndf = vertex->numberDoF();
804 if (ndf != 0) {
806
807 if (vertex == bestRecoHSVtx_truth) {
808 fillHisto(m_vx_sumpT_HS_matched,sumPt ,weight);
809 fillHisto(m_vx_z_asym_HS_matched, z_asym,weight);
810 fillHisto(m_vx_z_asym_weighted_HS_matched, weighted_z_asym,weight);
811 fillHisto(m_vx_chi2Over_ndf_HS_matched, vertex->chiSquared()/ndf,weight);
812
815
816 for (const float& trkWeight : vertex->trackWeights()) {
817 fillHisto(m_vx_track_weight_HS_matched, trkWeight,weight);
818 fillHisto(m_vx_normalised_track_weight_HS_matched, trkWeight/number_tracks,weight);
819 }
820 } else {
821 fillHisto(m_vx_sumpT_matched,sumPt ,weight);
822 fillHisto(m_vx_z_asym_matched, z_asym,weight);
823 fillHisto(m_vx_z_asym_weighted_matched, weighted_z_asym,weight);
824 fillHisto(m_vx_chi2Over_ndf_matched, vertex->chiSquared()/ndf,weight);
825
826 fillHisto(m_vx_z0_skewness_matched, z_skew,weight);
827 fillHisto(m_vx_z0_kurtosis_matched, z_kurt,weight);
828
829 for (const float& trkWeight : vertex->trackWeights()) {
830 fillHisto(m_vx_track_weight_matched, trkWeight,weight);
831 fillHisto(m_vx_normalised_track_weight_matched, trkWeight/number_tracks,weight);
832 }
833 }
834
835 // fill some histograms that contain both HS and PU above a min pt - say 20GeV
836 if (sumPt > minpt) {
837 fillHisto(m_vx_sumpT_ALL_matched,sumPt ,weight);
838 fillHisto(m_vx_z_asym_ALL_matched, z_asym,weight);
839 fillHisto(m_vx_z_asym_weighted_ALL_matched, weighted_z_asym,weight);
840 fillHisto(m_vx_chi2Over_ndf_ALL_matched, vertex->chiSquared()/ndf,weight);
841
844 for (const float& trkWeight : vertex->trackWeights()) {
845 fillHisto(m_vx_track_weight_ALL_matched, trkWeight,weight);
846 fillHisto(m_vx_normalised_track_weight_ALL_matched, trkWeight/number_tracks,weight);
847 }
848
849 }
850 } // end of if matched vertices
851
853 if (vertex == bestRecoHSVtx_truth) {
854 fillHisto(m_vx_sumpT_HS_merged, sumPt ,weight);
855 fillHisto(m_vx_z_asym_HS_merged, z_asym,weight);
856 fillHisto(m_vx_z_asym_weighted_HS_merged, weighted_z_asym,weight);
857 fillHisto(m_vx_chi2Over_ndf_HS_merged, vertex->chiSquared()/ndf,weight);
858
861 for (const float& trkWeight : vertex->trackWeights()) {
862 fillHisto(m_vx_track_weight_HS_merged, trkWeight,weight);
863 fillHisto(m_vx_normalised_track_weight_HS_merged, trkWeight/number_tracks,weight);
864 }
865 }
866 else {
867 fillHisto(m_vx_sumpT_merged, sumPt ,weight);
868 fillHisto(m_vx_z_asym_merged, z_asym,weight);
869 fillHisto(m_vx_z_asym_weighted_merged, weighted_z_asym,weight);
870 fillHisto(m_vx_chi2Over_ndf_merged, vertex->chiSquared()/ndf,weight);
871
872 fillHisto(m_vx_z0_skewness_merged, z_skew,weight);
873 fillHisto(m_vx_z0_kurtosis_merged, z_kurt,weight);
874 for (const float& trkWeight : vertex->trackWeights()) {
875 fillHisto(m_vx_track_weight_merged, trkWeight,weight);
876 fillHisto(m_vx_normalised_track_weight_merged, trkWeight/number_tracks,weight);
877 }
878 }
879
880 if (sumPt > minpt) {
881 fillHisto(m_vx_sumpT_ALL_merged,sumPt ,weight);
882 fillHisto(m_vx_z_asym_ALL_merged, z_asym,weight);
883 fillHisto(m_vx_z_asym_weighted_ALL_merged, weighted_z_asym,weight);
884 fillHisto(m_vx_chi2Over_ndf_ALL_merged, vertex->chiSquared()/ndf,weight);
885
888 for (const float& trkWeight : vertex->trackWeights()) {
889 fillHisto(m_vx_track_weight_ALL_merged, trkWeight,weight);
890 fillHisto(m_vx_normalised_track_weight_ALL_merged, trkWeight/number_tracks,weight);
891 }
892 }
893 } //end of if merged vertices
894
896 if (vertex == bestRecoHSVtx_truth) {
897 fillHisto(m_vx_sumpT_HS_split, sumPt ,weight);
898 fillHisto(m_vx_z_asym_HS_split, z_asym,weight);
899 fillHisto(m_vx_z_asym_weighted_HS_split, weighted_z_asym,weight);
900 fillHisto(m_vx_chi2Over_ndf_HS_split, vertex->chiSquared()/ndf,weight);
901
902 fillHisto(m_vx_z0_skewness_HS_split, z_skew,weight);
903 fillHisto(m_vx_z0_kurtosis_HS_split, z_kurt,weight);
904 for (const float& trkWeight : vertex->trackWeights()) {
905 fillHisto(m_vx_track_weight_HS_split, trkWeight,weight);
906 fillHisto(m_vx_normalised_track_weight_HS_split, trkWeight/number_tracks,weight);
907 }
908 } else {
909 fillHisto(m_vx_sumpT_split, sumPt ,weight);
910 fillHisto(m_vx_z_asym_split, z_asym,weight);
911 fillHisto(m_vx_z_asym_weighted_split, weighted_z_asym,weight);
912 fillHisto(m_vx_chi2Over_ndf_split, vertex->chiSquared()/ndf,weight);
913
914 fillHisto(m_vx_z0_skewness_split, z_skew,weight);
915 fillHisto(m_vx_z0_kurtosis_split, z_kurt,weight);
916 for (const float& trkWeight : vertex->trackWeights()) {
917 fillHisto(m_vx_track_weight_split, trkWeight,weight);
918 fillHisto(m_vx_normalised_track_weight_split, trkWeight/number_tracks,weight);
919 }
920
921 }
922
923 if (sumPt > minpt) {
924 fillHisto(m_vx_sumpT_ALL_split,sumPt ,weight);
925 fillHisto(m_vx_z_asym_ALL_split, z_asym,weight);
926 fillHisto(m_vx_z_asym_weighted_ALL_split, weighted_z_asym,weight);
927 fillHisto(m_vx_chi2Over_ndf_ALL_split, vertex->chiSquared()/ndf,weight);
928
931 for (const float& trkWeight : vertex->trackWeights()) {
932 fillHisto(m_vx_track_weight_ALL_split, trkWeight,weight);
933 fillHisto(m_vx_normalised_track_weight_ALL_split, trkWeight/number_tracks,weight);
934 }
935 }
936 } // end of if split vertices
937
938 // Count the number of vertices for each type per event
940 if (vertex == bestRecoHSVtx_truth) number_matched_HS++;
941 else number_matched_PU++;
942 if (sumPt > minpt) number_matched++;
944 if (vertex == bestRecoHSVtx_truth) number_merged_HS++;
945 else number_merged_PU++;
946 if (sumPt > minpt) number_merged++;
948 if (vertex == bestRecoHSVtx_truth) number_split_HS++;
949 else number_split_PU++;
950 if (sumPt > minpt) number_split++;
952 if (vertex == bestRecoHSVtx_truth) number_fake_HS++;
953 else number_fake_PU++;
954 if (sumPt > minpt) number_fake++;
955 }
956 } // end of if (ndf != 0)
957
958 // New histos to check for number of tracks for each vertex type
959 if (vertex == bestRecoHSVtx_truth) {
960 switch(matchType) {
962 fillHisto(m_vx_ntracks_HS_matched, nTrackPart, weight);
963 break;
965 fillHisto(m_vx_ntracks_HS_merged, nTrackPart, weight);
966 break;
968 fillHisto(m_vx_ntracks_HS_split, nTrackPart, weight);
969 break;
970 default:
971 break;
972 }
973 } else {
974 switch(matchType) {
976 fillHisto(m_vx_ntracks_matched, nTrackPart, weight);
977 break;
979 fillHisto(m_vx_ntracks_merged, nTrackPart, weight);
980 break;
982 fillHisto(m_vx_ntracks_split, nTrackPart, weight);
983 break;
984 default:
985 break;
986 }
987 }
988
989 if (sumPt > minpt) {
990 switch(matchType) {
992 fillHisto(m_vx_ntracks_ALL_matched, nTrackPart, weight);
993 break;
995 fillHisto(m_vx_ntracks_ALL_merged, nTrackPart, weight);
996 break;
998 fillHisto(m_vx_ntracks_ALL_split, nTrackPart, weight);
999 break;
1000 default:
1001 break;
1002 }
1003 }
1004
1005 // delta z between HS and nearby vertices
1006 if(bestRecoHSVtx_truth && bestRecoHSVtx_truth != vertex) {
1007 float dz = bestRecoHSVtx_truth->z() - vertex->z();
1008 if(std::abs(dz) < std::abs(vx_hs_mindz)) vx_hs_mindz = dz;
1009 }
1010
1011 // loop over vertices again for dz of every vertices pair
1012 for (const auto& vertex2 : vertexContainer.stdcont()) {
1013 if (vertex2->vertexType() == xAOD::VxType::NoVtx) continue;
1014 if(vertex2 == vertex) continue;
1015 fillHisto(m_vx_all_dz, vertex->z() - vertex2->z(), 0.5*weight);
1016 }
1017
1018 } // end loop over vertices
1019
1020 // new histos to count number of vertices per event
1021 fillHisto(m_vx_nVertices_ALL_matched, number_matched,weight);
1022 fillHisto(m_vx_nVertices_ALL_merged, number_merged,weight);
1023 fillHisto(m_vx_nVertices_ALL_split, number_split,weight);
1024 fillHisto(m_vx_nVertices_ALL_fake, number_fake,weight);
1025 fillHisto(m_vx_nVertices_HS_matched, number_matched_HS,weight);
1026 fillHisto(m_vx_nVertices_HS_merged, number_merged_HS,weight);
1027 fillHisto(m_vx_nVertices_HS_split, number_split_HS,weight);
1028 fillHisto(m_vx_nVertices_HS_fake, number_fake_HS,weight);
1029 fillHisto(m_vx_nVertices_matched, number_matched_PU,weight);
1030 fillHisto(m_vx_nVertices_merged, number_merged_PU,weight);
1031 fillHisto(m_vx_nVertices_split, number_split_PU,weight);
1032 fillHisto(m_vx_nVertices_fake, number_fake_PU,weight);
1033
1034 // new histo to delta z between HS and the closest one
1035 fillHisto(m_vx_hs_mindz, vx_hs_mindz, weight);
1036
1037 // Now fill plots relating to the reconstruction of our truth HS vertex (efficiency and resolutions)
1038 if (!truthHSVertices.empty()) {
1039 if (isHSVtx_reco) {
1040 fillHisto(m_vx_hs_reco_eff, localPUDensity, 1, weight);
1041 fillHisto(m_vx_hs_reco_sel_eff, localPUDensity, (recoHardScatter == bestRecoHSVtx_truth), weight);
1042 fillHisto(m_vx_hs_reco_eff_vs_ntruth, nTruthVertices, 1, weight);
1043 fillHisto(m_vx_hs_reco_sel_eff_vs_ntruth, nTruthVertices, (recoHardScatter == bestRecoHSVtx_truth), weight);
1044
1045 fillHisto(m_vx_hs_reco_long_reso, localPUDensity,
1046 getRecoLongitudinalReso(bestRecoHSVtx_truth), weight);
1047 fillHisto(m_vx_hs_reco_trans_reso, localPUDensity,
1048 getRecoTransverseReso(bestRecoHSVtx_truth), weight);
1049
1050 float residual_x = truthHSVtx->x() - bestRecoHSVtx_truth->x();
1051 float residual_y = truthHSVtx->y() - bestRecoHSVtx_truth->y();
1052 float residual_r = std::hypot(residual_x, residual_y);
1053
1054 fillHisto(m_resHelper_PUdensity_hsVxTruthLong, localPUDensity, residual_z, weight);
1055 fillHisto(m_resHelper_PUdensity_hsVxTruthTransv, localPUDensity, residual_r, weight);
1056
1057 const AmgSymMatrix(3)& covariance = bestRecoHSVtx_truth->covariancePosition();
1058 float vtxerr_x = Amg::error(covariance, 0);
1059 float vtxerr_y = Amg::error(covariance, 1);
1060 float vtxerr_z = Amg::error(covariance, 2);
1061
1062 if(std::abs(vtxerr_z) > 1e-7) fillHisto(m_vx_hs_z_pull, residual_z/vtxerr_z, weight);
1063 if(std::abs(vtxerr_y) > 1e-7) fillHisto(m_vx_hs_y_pull, residual_y/vtxerr_y, weight);
1064 if(std::abs(vtxerr_x) > 1e-7) fillHisto(m_vx_hs_x_pull, residual_x/vtxerr_x, weight);
1065
1066 fillHisto(m_vx_hs_truth_z_res_vs_PU, localPUDensity, residual_z, weight);
1067 fillHisto(m_vx_hs_truth_x_res_vs_PU, localPUDensity, residual_x, weight);
1068 fillHisto(m_vx_hs_truth_y_res_vs_PU, localPUDensity, residual_y, weight);
1069
1070 fillHisto(m_vx_hs_z_res, residual_z, weight);
1071 fillHisto(m_vx_hs_y_res, residual_y, weight);
1072 fillHisto(m_vx_hs_x_res, residual_x, weight);
1073
1074 fillHisto(m_vx_hs_truth_z_pull_vs_PU, localPUDensity, residual_z/vtxerr_z, weight);
1075 fillHisto(m_vx_hs_truth_x_pull_vs_PU, localPUDensity, residual_x/vtxerr_x, weight);
1076 fillHisto(m_vx_hs_truth_y_pull_vs_PU, localPUDensity, residual_y/vtxerr_y, weight);
1077
1078 int nTrackPart = bestRecoHSVtx_truth->nTrackParticles();
1079 fillHisto(m_vx_hs_truth_z_res_vs_nTrk, nTrackPart, residual_z, weight);
1080 fillHisto(m_vx_hs_truth_x_res_vs_nTrk, nTrackPart, residual_x, weight);
1081 fillHisto(m_vx_hs_truth_y_res_vs_nTrk, nTrackPart, residual_y, weight);
1082
1083 fillHisto(m_vx_hs_truth_z_pull_vs_nTrk, nTrackPart, residual_z/vtxerr_z, weight);
1084 fillHisto(m_vx_hs_truth_x_pull_vs_nTrk, nTrackPart, residual_x/vtxerr_x, weight);
1085 fillHisto(m_vx_hs_truth_y_pull_vs_nTrk, nTrackPart, residual_y/vtxerr_y, weight);
1086 } else {
1087 fillHisto(m_vx_hs_reco_eff, localPUDensity, 0, weight);
1088 fillHisto(m_vx_hs_reco_eff_vs_ntruth, nTruthVertices, 0, weight);
1089 }
1090 }
1091
1097
1098 // And by hardscatter type:
1099 switch (hsType) {
1101 fillHisto(m_vx_nReco_vs_nTruth_clean, nTruthVertices, nRecoVertices, weight);
1102 break;
1103 }
1105 fillHisto(m_vx_nReco_vs_nTruth_lowpu, nTruthVertices, nRecoVertices, weight);
1106 break;
1107 }
1109 fillHisto(m_vx_nReco_vs_nTruth_highpu, nTruthVertices, nRecoVertices, weight);
1110 break;
1111 }
1113 fillHisto(m_vx_nReco_vs_nTruth_hssplit, nTruthVertices, nRecoVertices, weight);
1114 break;
1115 }
1117 fillHisto(m_vx_nReco_vs_nTruth_none, nTruthVertices, nRecoVertices, weight);
1118 break;
1119 }
1120 default: {
1121 break;
1122 }
1123 } // End of switch
1124
1125 } // end of Expert plots - (if (m_detailLevel >= 200))
1126
1127} // end InDetPerfPlot_VertexTruthMatching::fill(const xAOD::VertexContainer& vertexContainer, const std::vector<const xAOD::TruthVertex*>& truthHSVertices, const std::vector<const xAOD::TruthVertex*>& truthPUVertices)
1128
1129
#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.
Helper class to provide type-safe access to aux data.
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
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.
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.