ATLAS Offline Software
Loading...
Searching...
No Matches
InDetPerfPlot_VertexTruthMatching.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 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 float localPUDensity = getLocalPUDensity(truthHSVtx, truthHSVertices, truthPUVertices);
682 fillHisto(m_vx_PUdensity, localPUDensity, weight);
683 fillHisto(m_vx_nTruth_vs_PUdensity, nTruthVertices, localPUDensity, weight);
684
685 // Best reco HS vertex identified via truth HS weights
686 const xAOD::Vertex* bestRecoHSVtx_truth = InDetVertexTruthMatchUtils::bestHardScatterMatch(vertexContainer);
687 if (!bestRecoHSVtx_truth){
688 ATH_MSG_INFO("No bestRecoHS vertex - not filling vertex truth matching.");
689 return;
690 }
691
692 fillHisto(m_vx_hs_sel_eff_mu, actualMu, (recoHardScatter == bestRecoHSVtx_truth), weight);
693 fillHisto(m_vx_hs_sel_eff, localPUDensity, (recoHardScatter == bestRecoHSVtx_truth), weight);
694 fillHisto(m_vx_hs_sel_eff_vs_nReco, nRecoVertices, (recoHardScatter == bestRecoHSVtx_truth), weight);
695 fillHisto(m_vx_hs_sel_eff_vs_ntruth, nTruthVertices, (recoHardScatter == bestRecoHSVtx_truth), weight);
696
697 // Did we successfully reconstruct our truth HS vertex?
698 bool truthHSVtxRecoed = false;
699 float minTruthRecoRadialDiff2 = std::pow(m_cutMinTruthRecoRadialDiff, 2);
700 float truthRecoRadialDiff2 = -1.;
701 if (truthHSVtx) {
702 // If the radial difference between the truth-pkg-selected best reco HS vertex and the truth HS vertex is
703 // less than some cut (e.g., 0.1 mm), then we say the truth HS vertex is reconstructed
704 truthRecoRadialDiff2 = getRadialDiff2(bestRecoHSVtx_truth, truthHSVtx);
705 if (truthRecoRadialDiff2 < minTruthRecoRadialDiff2) {
706 truthHSVtxRecoed = true;
707 minTruthRecoRadialDiff2 = truthRecoRadialDiff2;
708 }
709 }
710
711 // add variables here so that they are in correct scope (outside loop over vertices)
712 float number_matched = 0;
713 float number_merged = 0;
714 float number_split = 0;
715 float number_fake = 0;
716 float number_matched_HS = 0;
717 float number_merged_HS = 0;
718 float number_split_HS = 0;
719 float number_fake_HS = 0;
720 float number_matched_PU = 0;
721 float number_merged_PU = 0;
722 float number_split_PU = 0;
723 float number_fake_PU = 0;
724
725 // variables for delta z between the HS and the closest one
726 float vx_hs_mindz=9999.;
727 float min_fabs_dz = 9999.;
728
729 // Iterate over vertices:
731 for (const auto& vertex : vertexContainer.stdcont()) {
732
733 // Skip dummy vertex (last one in the container)
734 if (vertex->vertexType() == xAOD::VxType::NoVtx) {
735 continue;
736 }
737
738 fill(*vertex);
739
740 matchType = recoVtxMatchTypeInfo(*vertex);
741 breakdown[matchType] += 1;
742
743
744 const xAOD::TruthVertex *matchVertex = getTruthVertex(vertex);
745 if(!matchVertex) continue;
746 float residual_z = matchVertex->z() - vertex->z();
747 float residual_x = matchVertex->x() - vertex->x();
748 float residual_y = matchVertex->y() - vertex->y();
749 const AmgSymMatrix(3)& covariance = vertex->covariancePosition();
750 float vtxerr_x = fabs(Amg::error(covariance, 0)) > 1e-7 ? Amg::error(covariance, 0) : 1000.;
751 float vtxerr_y = fabs(Amg::error(covariance, 1)) > 1e-7 ? Amg::error(covariance, 1) : 1000.;
752 float vtxerr_z = fabs(Amg::error(covariance, 2)) > 1e-7 ? Amg::error(covariance, 2) : 1000.;
753 localPUDensity = getLocalPUDensity(matchVertex, truthHSVertices, truthPUVertices);
754
755 fillHisto(m_vx_all_z_pull, residual_z/vtxerr_z, weight);
756 fillHisto(m_vx_all_y_pull, residual_y/vtxerr_y, weight);
757 fillHisto(m_vx_all_x_pull, residual_x/vtxerr_x, weight);
758
759 fillHisto(m_vx_all_truth_z_res_vs_PU, localPUDensity, residual_z, weight);
760 fillHisto(m_vx_all_truth_x_res_vs_PU, localPUDensity, residual_x, weight);
761 fillHisto(m_vx_all_truth_y_res_vs_PU, localPUDensity, residual_y, weight);
762
763 fillHisto(m_vx_all_z_res, residual_z, weight);
764 fillHisto(m_vx_all_y_res, residual_y, weight);
765 fillHisto(m_vx_all_x_res, residual_x, weight);
766
767 fillHisto(m_vx_all_truth_z_pull_vs_PU, localPUDensity, residual_z/vtxerr_z, weight);
768 fillHisto(m_vx_all_truth_x_pull_vs_PU, localPUDensity, residual_x/vtxerr_x, weight);
769 fillHisto(m_vx_all_truth_y_pull_vs_PU, localPUDensity, residual_y/vtxerr_y, weight);
770
771 fillHisto(m_vx_all_truth_z_res_vs_nTrk, vertex->nTrackParticles(), residual_z, weight);
772 fillHisto(m_vx_all_truth_x_res_vs_nTrk, vertex->nTrackParticles(), residual_x, weight);
773 fillHisto(m_vx_all_truth_y_res_vs_nTrk, vertex->nTrackParticles(), residual_y, weight);
774
775 fillHisto(m_vx_all_truth_z_pull_vs_nTrk, vertex->nTrackParticles(), residual_z/vtxerr_z, weight);
776 fillHisto(m_vx_all_truth_x_pull_vs_nTrk, vertex->nTrackParticles(), residual_x/vtxerr_x, weight);
777 fillHisto(m_vx_all_truth_y_pull_vs_nTrk, vertex->nTrackParticles(), residual_y/vtxerr_y, weight);
778
779
780
781
782 // New Expert histograms for observables for vertex classifications for HS and PU
783 // For each vertex, loop over all tracks and get sumpt and sum of charges
784 // also use this to get the z asymmetry around the vertex.
785
786 // Declaring variables for the observables
787 const xAOD::TrackParticle* trackTmp = nullptr;
788 float sumPt =0;
789 float minpt = 20000 ; // minimum sum pt required for the 'All' vertices plots - 20 GeV
790 float trackPt = 0;
791
792 // variables for calculation of delta Z asymmetry and delta d asymmetry
793 float z_asym = 0;
794 float sumDZ = 0;
795 float deltaZ =0;
796 float modsumDZ =0;
797 float weighted_sumDZ = 0;
798 float weighted_deltaZ = 0;
799 float weighted_modsumDZ = 0;
800 float weighted_z_asym =0;
801
802 // make vector
803 std::vector<float> track_deltaZ;
804 std::vector<float> track_deltaPt;
805 std::vector<float> track_deltaZ_weighted;
806 // loop over tracks
807 for (size_t i = 0; i < vertex->nTrackParticles(); i++) {
808 trackTmp = vertex->trackParticle(i);
809
810
811 if (trackTmp) {
812 trackPt = trackTmp->pt(); // MeV
813 sumPt = sumPt + trackPt; // in MeV
814 deltaZ = trackTmp->z0() - vertex->z();
815 track_deltaZ.push_back(deltaZ);
816 // get the track weight for each track to get the deltaZ/trk_weight
817 float trk_weight = vertex->trackWeight(i);
818 weighted_deltaZ = deltaZ*trk_weight;
819 // sum of delta z
820 sumDZ = sumDZ + deltaZ;
821 modsumDZ = modsumDZ + std::abs(deltaZ);
822 weighted_sumDZ = weighted_sumDZ + weighted_deltaZ;
823 weighted_modsumDZ = weighted_modsumDZ + std::abs(weighted_deltaZ);
824
825 }
826 } // end loop over tracks
827 if (modsumDZ >0) {
828 z_asym = sumDZ/modsumDZ;
829 }
830 if (weighted_modsumDZ >0) {
831 weighted_z_asym = weighted_sumDZ/weighted_modsumDZ;
832 }
833
834
835
836 double mean_Dz =0;
837 mean_Dz=sumDZ/track_deltaZ.size(); //calculate average
838 double number_tracks =0;
839 number_tracks = track_deltaZ.size(); // get number of tracks
840
841 double z_sd = 0; // standard deviation
842 double z_skew = 0; // skewness of DeltaZ asymmetry
843 double z_kurt = 0; // Kurtosis of DeltaZ asymmetry
844 double z_var=0; // variance of DeltaZ
845 double z_zbar=0; // for use in calculation below
846
847 for ( auto i : track_deltaZ) {
848
849 z_zbar = (i - mean_Dz);
850 z_var =(z_var + z_zbar*z_zbar);
851 z_skew =(z_skew + z_zbar*z_zbar*z_zbar);
852 z_kurt =(z_kurt + z_zbar*z_zbar*z_zbar*z_zbar);
853
854 }
855 z_var = z_var/(number_tracks -1);
856 z_sd = std::sqrt(z_var);
857 z_skew = z_skew/((number_tracks -1)*z_sd*z_sd*z_sd);
858 z_kurt = z_kurt/((number_tracks -1)*z_sd*z_sd*z_sd*z_sd);
859
860 float ndf = vertex->numberDoF();
861 if (ndf != 0) {
862
864 if (vertex == bestRecoHSVtx_truth) {
865
866 fillHisto(m_vx_sumpT_HS_matched,sumPt ,weight);
867 fillHisto(m_vx_z_asym_HS_matched, z_asym,weight);
868 fillHisto(m_vx_z_asym_weighted_HS_matched, weighted_z_asym,weight);
869 fillHisto(m_vx_chi2Over_ndf_HS_matched, vertex->chiSquared()/ndf,weight);
870
873
874
875 for (const float& trkWeight : vertex->trackWeights()) {
876 fillHisto(m_vx_track_weight_HS_matched, trkWeight,weight);
877 fillHisto(m_vx_normalised_track_weight_HS_matched, trkWeight/number_tracks,weight);
878 }
879
880 }
881 else {
882
883 fillHisto(m_vx_sumpT_matched,sumPt ,weight);
884 fillHisto(m_vx_z_asym_matched, z_asym,weight);
885 fillHisto(m_vx_z_asym_weighted_matched, weighted_z_asym,weight);
886 fillHisto(m_vx_chi2Over_ndf_matched, vertex->chiSquared()/ndf,weight);
887
888 fillHisto(m_vx_z0_skewness_matched, z_skew,weight);
889 fillHisto(m_vx_z0_kurtosis_matched, z_kurt,weight);
890
891
892 for (const float& trkWeight : vertex->trackWeights()) {
893 fillHisto(m_vx_track_weight_matched, trkWeight,weight);
894 fillHisto(m_vx_normalised_track_weight_matched, trkWeight/number_tracks,weight);
895 }
896 }
897// fill some histograms that contain both HS and PU above a min pt - say 20GeV
898 if (sumPt > minpt) {
899 fillHisto(m_vx_sumpT_ALL_matched,sumPt ,weight);
900 fillHisto(m_vx_z_asym_ALL_matched, z_asym,weight);
901 fillHisto(m_vx_z_asym_weighted_ALL_matched, weighted_z_asym,weight);
902 fillHisto(m_vx_chi2Over_ndf_ALL_matched, vertex->chiSquared()/ndf,weight);
903
906 for (const float& trkWeight : vertex->trackWeights()) {
907 fillHisto(m_vx_track_weight_ALL_matched, trkWeight,weight);
908 fillHisto(m_vx_normalised_track_weight_ALL_matched, trkWeight/number_tracks,weight);
909 }
910
911 }
912 } // end of if matched vertices
913
915 if (vertex == bestRecoHSVtx_truth) {
916
917 fillHisto(m_vx_sumpT_HS_merged, sumPt ,weight);
918 fillHisto(m_vx_z_asym_HS_merged, z_asym,weight);
919 fillHisto(m_vx_z_asym_weighted_HS_merged, weighted_z_asym,weight);
920 fillHisto(m_vx_chi2Over_ndf_HS_merged, vertex->chiSquared()/ndf,weight);
921
924 for (const float& trkWeight : vertex->trackWeights()) {
925 fillHisto(m_vx_track_weight_HS_merged, trkWeight,weight);
926 fillHisto(m_vx_normalised_track_weight_HS_merged, trkWeight/number_tracks,weight);
927 }
928
929
930
931 }
932 else {
933 fillHisto(m_vx_sumpT_merged, sumPt ,weight);
934 fillHisto(m_vx_z_asym_merged, z_asym,weight);
935 fillHisto(m_vx_z_asym_weighted_merged, weighted_z_asym,weight);
936 fillHisto(m_vx_chi2Over_ndf_merged, vertex->chiSquared()/ndf,weight);
937
938 fillHisto(m_vx_z0_skewness_merged, z_skew,weight);
939 fillHisto(m_vx_z0_kurtosis_merged, z_kurt,weight);
940 for (const float& trkWeight : vertex->trackWeights()) {
941 fillHisto(m_vx_track_weight_merged, trkWeight,weight);
942 fillHisto(m_vx_normalised_track_weight_merged, trkWeight/number_tracks,weight);
943 }
944
945 }
946 if (sumPt > minpt) {
947 fillHisto(m_vx_sumpT_ALL_merged,sumPt ,weight);
948 fillHisto(m_vx_z_asym_ALL_merged, z_asym,weight);
949 fillHisto(m_vx_z_asym_weighted_ALL_merged, weighted_z_asym,weight);
950 fillHisto(m_vx_chi2Over_ndf_ALL_merged, vertex->chiSquared()/ndf,weight);
951
954 for (const float& trkWeight : vertex->trackWeights()) {
955 fillHisto(m_vx_track_weight_ALL_merged, trkWeight,weight);
956 fillHisto(m_vx_normalised_track_weight_ALL_merged, trkWeight/number_tracks,weight);
957 }
958
959 }
960 } //end of if merged vertices
961
963 if (vertex == bestRecoHSVtx_truth) {
964 fillHisto(m_vx_sumpT_HS_split, sumPt ,weight);
965 fillHisto(m_vx_z_asym_HS_split, z_asym,weight);
966 fillHisto(m_vx_z_asym_weighted_HS_split, weighted_z_asym,weight);
967 fillHisto(m_vx_chi2Over_ndf_HS_split, vertex->chiSquared()/ndf,weight);
968
969 fillHisto(m_vx_z0_skewness_HS_split, z_skew,weight);
970 fillHisto(m_vx_z0_kurtosis_HS_split, z_kurt,weight);
971 for (const float& trkWeight : vertex->trackWeights()) {
972 fillHisto(m_vx_track_weight_HS_split, trkWeight,weight);
973 fillHisto(m_vx_normalised_track_weight_HS_split, trkWeight/number_tracks,weight);
974 }
975
976
977 }
978 else {
979 fillHisto(m_vx_sumpT_split, sumPt ,weight);
980 fillHisto(m_vx_z_asym_split, z_asym,weight);
981 fillHisto(m_vx_z_asym_weighted_split, weighted_z_asym,weight);
982 fillHisto(m_vx_chi2Over_ndf_split, vertex->chiSquared()/ndf,weight);
983
984 fillHisto(m_vx_z0_skewness_split, z_skew,weight);
985 fillHisto(m_vx_z0_kurtosis_split, z_kurt,weight);
986 for (const float& trkWeight : vertex->trackWeights()) {
987 fillHisto(m_vx_track_weight_split, trkWeight,weight);
988 fillHisto(m_vx_normalised_track_weight_split, trkWeight/number_tracks,weight);
989 }
990
991
992 }
993
994 if (sumPt > minpt) {
995 fillHisto(m_vx_sumpT_ALL_split,sumPt ,weight);
996 fillHisto(m_vx_z_asym_ALL_split, z_asym,weight);
997 fillHisto(m_vx_z_asym_weighted_ALL_split, weighted_z_asym,weight);
998 fillHisto(m_vx_chi2Over_ndf_ALL_split, vertex->chiSquared()/ndf,weight);
999
1000 fillHisto(m_vx_z0_skewness_ALL_split, z_skew,weight);
1001 fillHisto(m_vx_z0_kurtosis_ALL_split, z_kurt,weight);
1002 for (const float& trkWeight : vertex->trackWeights()) {
1003 fillHisto(m_vx_track_weight_ALL_split, trkWeight,weight);
1004 fillHisto(m_vx_normalised_track_weight_ALL_split, trkWeight/number_tracks,weight);
1005 }
1006 }
1007
1008 } // end of if split vertices
1009
1010// Count the number of vertices for each type per event
1011
1012
1014 if (vertex == bestRecoHSVtx_truth) {
1015 number_matched_HS++;
1016 }
1017 else {
1018 number_matched_PU++;
1019 }
1020 if (sumPt > minpt) {
1021 number_matched++;
1022 }
1023 }
1024
1026 if (vertex == bestRecoHSVtx_truth) {
1027 number_merged_HS++;
1028 }
1029 else {
1030 number_merged_PU++;
1031 }
1032 if (sumPt > minpt) {
1033 number_merged++;
1034 }
1035 }
1036
1038 if (vertex == bestRecoHSVtx_truth) {
1039 number_split_HS++;
1040 }
1041 else {
1042 number_split_PU++;
1043 }
1044 if (sumPt > minpt) {
1045 number_split++;
1046 }
1047 }
1048
1050 if (vertex == bestRecoHSVtx_truth) {
1051 number_fake_HS++;
1052 }
1053 else {
1054 number_fake_PU++;
1055 }
1056 if (sumPt > minpt) {
1057 number_fake++;
1058 }
1059 }
1060 } // end of if (ndf != 0)
1061
1062
1063
1064// New histos to check for number of tracks for each vertex type
1065 for (const auto& vertex : vertexContainer.stdcont()) {
1066 if (vertex == bestRecoHSVtx_truth) {
1067
1068
1070
1071 fillHisto(m_vx_ntracks_HS_matched, vertex->nTrackParticles(),weight);
1072 }
1073
1075 fillHisto(m_vx_ntracks_HS_merged, vertex->nTrackParticles(),weight);
1076
1077 }
1078
1080 fillHisto(m_vx_ntracks_HS_split, vertex->nTrackParticles(),weight);
1081 }
1082 }
1083 else {
1084
1085
1087
1088 fillHisto(m_vx_ntracks_matched, vertex->nTrackParticles(),weight);
1089 }
1090
1092 fillHisto(m_vx_ntracks_merged, vertex->nTrackParticles(),weight);
1093
1094 }
1095
1097 fillHisto(m_vx_ntracks_split, vertex->nTrackParticles(),weight);
1098 }
1099
1100 }
1101 if (sumPt > minpt) {
1103
1104 fillHisto(m_vx_ntracks_ALL_matched, vertex->nTrackParticles(),weight);
1105 }
1106
1108 fillHisto(m_vx_ntracks_ALL_merged, vertex->nTrackParticles(),weight);
1109
1110 }
1111
1113 fillHisto(m_vx_ntracks_ALL_split, vertex->nTrackParticles(),weight);
1114 }
1115
1116 }
1117
1118 }
1119
1120// delta z between HS and nearby vertices
1121 float absd_hs_dz = std::abs(bestRecoHSVtx_truth->z() - vertex->z());
1122 if(bestRecoHSVtx_truth != vertex && absd_hs_dz < min_fabs_dz) {
1123 min_fabs_dz = absd_hs_dz;
1124 vx_hs_mindz = bestRecoHSVtx_truth->z() - vertex->z();
1125 }
1126// loop over vertices again for dz of every vertices pair
1127 for (const auto& vertex2 : vertexContainer.stdcont()) {
1128 if (vertex2->vertexType() == xAOD::VxType::NoVtx) continue;
1129 if(vertex2 == vertex) continue;
1130 fillHisto(m_vx_all_dz, vertex->z() - vertex2->z(), 0.5*weight);
1131 }
1132
1133 } // end loop over vertices
1134
1135// new histos to count number of vertices per event
1136 fillHisto(m_vx_nVertices_ALL_matched, number_matched,weight);
1137 fillHisto(m_vx_nVertices_ALL_merged, number_merged,weight);
1138 fillHisto(m_vx_nVertices_ALL_split, number_split,weight);
1139 fillHisto(m_vx_nVertices_ALL_fake, number_fake,weight);
1140 fillHisto(m_vx_nVertices_HS_matched, number_matched_HS,weight);
1141 fillHisto(m_vx_nVertices_HS_merged, number_merged_HS,weight);
1142 fillHisto(m_vx_nVertices_HS_split, number_split_HS,weight);
1143 fillHisto(m_vx_nVertices_HS_fake, number_fake_HS,weight);
1144 fillHisto(m_vx_nVertices_matched, number_matched_PU,weight);
1145 fillHisto(m_vx_nVertices_merged, number_merged_PU,weight);
1146 fillHisto(m_vx_nVertices_split, number_split_PU,weight);
1147 fillHisto(m_vx_nVertices_fake, number_fake_PU,weight);
1148
1149// new histo to delta z between HS and the closest one
1150 fillHisto(m_vx_hs_mindz, vx_hs_mindz, weight);
1151
1152 // Now fill plots relating to the reconstruction of our truth HS vertex (efficiency and resolutions)
1153 if (!truthHSVertices.empty()) {
1154 if (truthHSVtxRecoed) {
1155 float residual_z = truthHSVtx->z() - bestRecoHSVtx_truth->z();
1156 float residual_r = std::sqrt(std::pow(truthHSVtx->x() - bestRecoHSVtx_truth->x(), 2) + std::pow(truthHSVtx->y() - bestRecoHSVtx_truth->y(), 2));
1157 float residual_x = truthHSVtx->x() - bestRecoHSVtx_truth->x();
1158 float residual_y = truthHSVtx->y() - bestRecoHSVtx_truth->y();
1159 fillHisto(m_vx_hs_reco_eff, localPUDensity, 1, weight);
1160 fillHisto(m_vx_hs_reco_sel_eff, localPUDensity, (recoHardScatter == bestRecoHSVtx_truth), weight);
1161 fillHisto(m_vx_hs_reco_eff_vs_ntruth, nTruthVertices, 1, weight);
1162 fillHisto(m_vx_hs_reco_sel_eff_vs_ntruth, nTruthVertices, (recoHardScatter == bestRecoHSVtx_truth), weight);
1163 fillHisto(m_vx_hs_reco_long_reso, localPUDensity, getRecoLongitudinalReso(bestRecoHSVtx_truth), weight);
1164 fillHisto(m_vx_hs_reco_trans_reso, localPUDensity, getRecoTransverseReso(bestRecoHSVtx_truth), weight);
1165
1166 fillHisto(m_resHelper_PUdensity_hsVxTruthLong, localPUDensity, residual_z, weight);
1167 fillHisto(m_resHelper_PUdensity_hsVxTruthTransv, localPUDensity, residual_r, weight);
1168
1169 const AmgSymMatrix(3)& covariance = bestRecoHSVtx_truth->covariancePosition();
1170 float vtxerr_x = Amg::error(covariance, 0);
1171 float vtxerr_y = Amg::error(covariance, 1);
1172 float vtxerr_z = Amg::error(covariance, 2);
1173
1174 if(fabs(vtxerr_z) > 1e-7) fillHisto(m_vx_hs_z_pull, residual_z/vtxerr_z, weight);
1175 if(fabs(vtxerr_y) > 1e-7) fillHisto(m_vx_hs_y_pull, residual_y/vtxerr_y, weight);
1176 if(fabs(vtxerr_x) > 1e-7) fillHisto(m_vx_hs_x_pull, residual_x/vtxerr_x, weight);
1177
1178 fillHisto(m_vx_hs_truth_z_res_vs_PU, localPUDensity, residual_z, weight);
1179 fillHisto(m_vx_hs_truth_x_res_vs_PU, localPUDensity, residual_x, weight);
1180 fillHisto(m_vx_hs_truth_y_res_vs_PU, localPUDensity, residual_y, weight);
1181
1182 fillHisto(m_vx_hs_z_res, residual_z, weight);
1183 fillHisto(m_vx_hs_y_res, residual_y, weight);
1184 fillHisto(m_vx_hs_x_res, residual_x, weight);
1185
1186 fillHisto(m_vx_hs_truth_z_pull_vs_PU, localPUDensity, residual_z/vtxerr_z, weight);
1187 fillHisto(m_vx_hs_truth_x_pull_vs_PU, localPUDensity, residual_x/vtxerr_x, weight);
1188 fillHisto(m_vx_hs_truth_y_pull_vs_PU, localPUDensity, residual_y/vtxerr_y, weight);
1189
1190 fillHisto(m_vx_hs_truth_z_res_vs_nTrk, bestRecoHSVtx_truth->nTrackParticles(), residual_z, weight);
1191 fillHisto(m_vx_hs_truth_x_res_vs_nTrk, bestRecoHSVtx_truth->nTrackParticles(), residual_x, weight);
1192 fillHisto(m_vx_hs_truth_y_res_vs_nTrk, bestRecoHSVtx_truth->nTrackParticles(), residual_y, weight);
1193
1194 fillHisto(m_vx_hs_truth_z_pull_vs_nTrk, bestRecoHSVtx_truth->nTrackParticles(), residual_z/vtxerr_z, weight);
1195 fillHisto(m_vx_hs_truth_x_pull_vs_nTrk, bestRecoHSVtx_truth->nTrackParticles(), residual_x/vtxerr_x, weight);
1196 fillHisto(m_vx_hs_truth_y_pull_vs_nTrk, bestRecoHSVtx_truth->nTrackParticles(), residual_y/vtxerr_y, weight);
1197
1198 }
1199 else {
1200 fillHisto(m_vx_hs_reco_eff, localPUDensity, 0, weight);
1201 fillHisto(m_vx_hs_reco_eff_vs_ntruth, nTruthVertices, 0, weight);
1202 }
1203 }
1204
1210
1211 // And by hardscatter type:
1213 fillHisto(m_vx_hs_classification, hsType, weight);
1214 switch (hsType) {
1216 fillHisto(m_vx_nReco_vs_nTruth_clean, nTruthVertices, nRecoVertices, weight);
1217 break;
1218 }
1220 fillHisto(m_vx_nReco_vs_nTruth_lowpu, nTruthVertices, nRecoVertices, weight);
1221 break;
1222 }
1224 fillHisto(m_vx_nReco_vs_nTruth_highpu, nTruthVertices, nRecoVertices, weight);
1225 break;
1226 }
1228 fillHisto(m_vx_nReco_vs_nTruth_hssplit, nTruthVertices, nRecoVertices, weight);
1229 break;
1230 }
1232 fillHisto(m_vx_nReco_vs_nTruth_none, nTruthVertices, nRecoVertices, weight);
1233 break;
1234 }
1235 default: {
1236 break;
1237 }
1238 } // End of switch
1239 } // end of EXpert plots - (if (m_detailLevel >= 200))
1240
1241} // end InDetPerfPlot_VertexTruthMatching::fill(const xAOD::VertexContainer& vertexContainer, const std::vector<const xAOD::TruthVertex*>& truthHSVertices, const std::vector<const xAOD::TruthVertex*>& truthPUVertices)
1242
1243
#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)
void book(Htype *&pHisto, const std::string &histoIdentifier, const std::string &nameOverride="", const std::string &folder="default")
Helper method to book histograms using an identifier string.
InDetPlotBase(InDetPlotBase *pParent, const std::string &dirName)
Constructor taking parent node and directory name for plots.
SG::Accessor< T, ALLOC > Accessor
Definition AuxElement.h:573
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
SG::Decorator< T, ALLOC > Decorator
class to provide type-safe access to aux data.
Definition AuxElement.h:135
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.
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