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