15 #include "TFitResult.h"
16 #include "TFitResultPtr.h"
17 #include "GaudiKernel/PhysicalConstants.h"
19 using namespace IDPVM;
24 m_detailLevel(detailLevel),
25 m_vx_type_truth(nullptr),
26 m_vx_hs_classification(nullptr),
27 m_vx_nReco_vs_nTruth_inclusive(nullptr),
28 m_vx_nReco_vs_nTruth_matched(nullptr),
29 m_vx_nReco_vs_nTruth_merged(nullptr),
30 m_vx_nReco_vs_nTruth_split(nullptr),
31 m_vx_nReco_vs_nTruth_fake(nullptr),
32 m_vx_nReco_vs_nTruth_dummy(nullptr),
33 m_vx_nReco_vs_nTruth_clean(nullptr),
34 m_vx_nReco_vs_nTruth_lowpu(nullptr),
35 m_vx_nReco_vs_nTruth_highpu(nullptr),
36 m_vx_nReco_vs_nTruth_hssplit(nullptr),
37 m_vx_nReco_vs_nTruth_none(nullptr),
38 m_vx_hs_reco_eff(nullptr),
39 m_vx_hs_sel_eff(nullptr),
40 m_vx_hs_sel_eff_vs_nReco(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),
44 m_vx_hs_sel_eff_dist_vs_nReco(nullptr),
45 m_vx_hs_reco_eff_vs_ntruth(nullptr),
46 m_vx_hs_sel_eff_vs_ntruth(nullptr),
47 m_vx_hs_reco_sel_eff_vs_ntruth(nullptr),
48 m_vx_hs_reco_long_reso(nullptr),
49 m_vx_hs_reco_trans_reso(nullptr),
52 m_resHelper_PUdensity_hsVxTruthLong(nullptr),
53 m_resolution_vs_PUdensity_hsVxTruthLong(nullptr),
54 m_resmean_vs_PUdensity_hsVxTruthLong(nullptr),
55 m_resHelper_PUdensity_hsVxTruthTransv(nullptr),
56 m_resolution_vs_PUdensity_hsVxTruthTransv(nullptr),
57 m_resmean_vs_PUdensity_hsVxTruthTransv(nullptr),
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),
71 m_vx_all_truth_z_res_vs_PU(nullptr),
72 m_vx_all_truth_x_res_vs_PU(nullptr),
73 m_vx_all_truth_y_res_vs_PU(nullptr),
74 m_vx_all_truth_z_pull_vs_PU(nullptr),
75 m_vx_all_truth_x_pull_vs_PU(nullptr),
76 m_vx_all_truth_y_pull_vs_PU(nullptr),
77 m_vx_all_truth_z_res_vs_nTrk(nullptr),
78 m_vx_all_truth_x_res_vs_nTrk(nullptr),
79 m_vx_all_truth_y_res_vs_nTrk(nullptr),
80 m_vx_all_truth_z_pull_vs_nTrk(nullptr),
81 m_vx_all_truth_x_pull_vs_nTrk(nullptr),
82 m_vx_all_truth_y_pull_vs_nTrk(nullptr),
83 m_vx_hs_truth_z_res_vs_PU(nullptr),
84 m_vx_hs_truth_x_res_vs_PU(nullptr),
85 m_vx_hs_truth_y_res_vs_PU(nullptr),
86 m_vx_hs_truth_z_pull_vs_PU(nullptr),
87 m_vx_hs_truth_x_pull_vs_PU(nullptr),
88 m_vx_hs_truth_y_pull_vs_PU(nullptr),
89 m_vx_hs_truth_z_res_vs_nTrk(nullptr),
90 m_vx_hs_truth_x_res_vs_nTrk(nullptr),
91 m_vx_hs_truth_y_res_vs_nTrk(nullptr),
92 m_vx_hs_truth_z_pull_vs_nTrk(nullptr),
93 m_vx_hs_truth_x_pull_vs_nTrk(nullptr),
94 m_vx_hs_truth_y_pull_vs_nTrk(nullptr),
97 m_vx_ntracks_matched(nullptr),
98 m_vx_ntracks_merged(nullptr),
99 m_vx_ntracks_split(nullptr),
100 m_vx_ntracks_HS_matched(nullptr),
101 m_vx_ntracks_HS_merged(nullptr),
102 m_vx_ntracks_HS_split(nullptr),
103 m_vx_ntracks_ALL_matched(nullptr),
104 m_vx_ntracks_ALL_merged(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),
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),
119 m_vx_z_asym_weighted_matched(nullptr),
120 m_vx_z_asym_weighted_merged(nullptr),
121 m_vx_z_asym_weighted_split(nullptr),
122 m_vx_z_asym_weighted_HS_matched(nullptr),
123 m_vx_z_asym_weighted_HS_merged(nullptr),
124 m_vx_z_asym_weighted_HS_split(nullptr),
126 m_vx_track_weight_matched(nullptr),
127 m_vx_track_weight_merged(nullptr),
128 m_vx_track_weight_split(nullptr),
129 m_vx_track_weight_HS_matched(nullptr),
130 m_vx_track_weight_HS_merged(nullptr),
131 m_vx_track_weight_HS_split(nullptr),
133 m_vx_normalised_track_weight_matched(nullptr),
134 m_vx_normalised_track_weight_merged(nullptr),
135 m_vx_normalised_track_weight_split(nullptr),
136 m_vx_normalised_track_weight_HS_matched(nullptr),
137 m_vx_normalised_track_weight_HS_merged(nullptr),
138 m_vx_normalised_track_weight_HS_split(nullptr),
140 m_vx_chi2Over_ndf_matched(nullptr),
141 m_vx_chi2Over_ndf_merged(nullptr),
142 m_vx_chi2Over_ndf_split(nullptr),
143 m_vx_chi2Over_ndf_HS_matched(nullptr),
144 m_vx_chi2Over_ndf_HS_merged(nullptr),
145 m_vx_chi2Over_ndf_HS_split(nullptr),
147 m_vx_z0_skewness_matched(nullptr),
148 m_vx_z0_skewness_merged(nullptr),
149 m_vx_z0_skewness_split(nullptr),
150 m_vx_z0_skewness_HS_matched(nullptr),
151 m_vx_z0_skewness_HS_merged(nullptr),
152 m_vx_z0_skewness_HS_split(nullptr),
154 m_vx_z0_kurtosis_matched(nullptr),
155 m_vx_z0_kurtosis_merged(nullptr),
156 m_vx_z0_kurtosis_split(nullptr),
157 m_vx_z0_kurtosis_HS_matched(nullptr),
158 m_vx_z0_kurtosis_HS_merged(nullptr),
159 m_vx_z0_kurtosis_HS_split(nullptr),
161 m_vx_sumpT_ALL_matched(nullptr),
162 m_vx_sumpT_ALL_merged(nullptr),
163 m_vx_sumpT_ALL_split(nullptr),
164 m_vx_z_asym_ALL_matched(nullptr),
165 m_vx_z_asym_ALL_merged(nullptr),
166 m_vx_z_asym_ALL_split(nullptr),
167 m_vx_z_asym_weighted_ALL_matched(nullptr),
168 m_vx_z_asym_weighted_ALL_merged(nullptr),
169 m_vx_z_asym_weighted_ALL_split(nullptr),
171 m_vx_track_weight_ALL_matched(nullptr),
172 m_vx_track_weight_ALL_merged(nullptr),
173 m_vx_track_weight_ALL_split(nullptr),
175 m_vx_normalised_track_weight_ALL_matched(nullptr),
176 m_vx_normalised_track_weight_ALL_merged(nullptr),
177 m_vx_normalised_track_weight_ALL_split(nullptr),
179 m_vx_chi2Over_ndf_ALL_matched(nullptr),
180 m_vx_chi2Over_ndf_ALL_merged(nullptr),
181 m_vx_chi2Over_ndf_ALL_split(nullptr),
183 m_vx_z0_skewness_ALL_matched(nullptr),
184 m_vx_z0_skewness_ALL_merged(nullptr),
185 m_vx_z0_skewness_ALL_split(nullptr),
187 m_vx_z0_kurtosis_ALL_matched(nullptr),
188 m_vx_z0_kurtosis_ALL_merged(nullptr),
189 m_vx_z0_kurtosis_ALL_split(nullptr),
191 m_vx_nVertices_ALL_matched(nullptr),
192 m_vx_nVertices_ALL_merged(nullptr),
193 m_vx_nVertices_ALL_split(nullptr),
194 m_vx_nVertices_ALL_fake(nullptr),
195 m_vx_nVertices_HS_matched(nullptr),
196 m_vx_nVertices_HS_merged(nullptr),
197 m_vx_nVertices_HS_split(nullptr),
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),
204 m_vx_all_dz(nullptr),
205 m_vx_hs_mindz(nullptr),
207 m_vx_PUdensity(nullptr),
208 m_vx_nTruth(nullptr),
209 m_vx_nTruth_vs_PUdensity(nullptr)
416 float sumPtMax = -1.;
419 for (
const auto& vtx : recoVertices.
stdcont()) {
422 for (
size_t i = 0;
i < vtx->nTrackParticles();
i++) {
423 trackTmp = vtx->trackParticle(
i);
428 if (sumPtTmp > sumPtMax) {
438 template<
typename U,
typename V>
440 return (
std::pow((vtx1->x() - vtx2->x()), 2) +
std::pow((vtx1->y() - vtx2->y()), 2) +
std::pow((vtx1->z() - vtx2->z()), 2));
444 float radialWindow2 =
std::pow(radialWindow, 2);
445 int nTracksInWindow = 0;
446 float localPUDensity;
448 for (
const auto& vtx : truthHSVertices) {
449 if (vtx != vtxOfInterest) {
451 if (radialDiff2 < radialWindow2) {
452 nTracksInWindow += 1;
456 for (
const auto& vtx : truthPUVertices) {
457 if (vtx != vtxOfInterest) {
459 if (radialDiff2 < radialWindow2) {
460 nTracksInWindow += 1;
464 localPUDensity = (
float)(nTracksInWindow) / (2 * radialWindow);
465 return localPUDensity;
469 return std::sqrt(recoVtx->covariancePosition()(2, 2));
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);
479 return std::sqrt(
std::pow(
x, 2) / r2 * xErr2 +
std::pow(
y, 2) / r2 * yErr2 + 2 *
x *
y / r2 * xyCov);
485 TH1* projHist =
nullptr;
487 TFitResultPtr fitResult;
490 double itr_rms = -1.;
493 for (
int i = 1;
i < resoHist2D->GetNbinsX() + 1;
i++) {
495 projHist = resoHist2D->ProjectionY(
"projectionY",
i,
i);
497 if (projHist->GetEntries() == 0.) {
498 resoHist->SetBinContent(
i, 0.);
499 resoHist->SetBinError(
i, 0.);
505 fitResult = projHist->Fit(
"gaus",
"QS0");
506 if (!fitResult.Get()) {
509 resoHist->SetBinContent(
i, 0.);
510 resoHist->SetBinError(
i, 0.);
513 mean = fitResult->Parameter(1);
514 rms = fitResult->Parameter(2);
520 fitResult = projHist->Fit(
"gaus",
"QS0");
521 if (!fitResult.Get()) {
526 itr_rms = fitResult->Parameter(2);
527 itr_rms_err = fitResult->ParError(2);
529 if ((fabs(itr_rms -
rms) < 0.0001) || (safety_counter == 5)) {
534 mean = fitResult->Parameter(1);
539 resoHist->SetBinContent(
i, itr_rms);
540 resoHist->SetBinError(
i, itr_rms_err);
551 ATH_MSG_WARNING(
"TruthEventMatchingInfos DECORATOR not available -- returning nullptr!");
554 const std::vector<InDetVertexTruthMatchUtils::VertexTruthMatchInfo>& truthInfos = truthMatchingInfos(*recoVtx);
555 if (!truthInfos.empty()) {
559 if (truthEventLink.
isValid()) {
564 while(!truthVtx && i_vtx<n_vtx){
572 ATH_MSG_WARNING(
"TruthEventMatchingInfos DECORATOR yields empty vector -- returning nullptr!");
576 ATH_MSG_WARNING(
"TruthEventMatchingInfos DECORATOR yields empty vector -- returning nullptr!");
585 float diff_z=
vertex.z()-tvrt->
z();
598 if (
vertex.hasValidTime()) {
600 float err_time =
vertex.timeResolution();
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() <<
")");
619 ATH_MSG_WARNING(
"VertexMatchType DECORATOR seems to be available, but may be broken ===========");
623 ATH_MSG_WARNING(
"VertexMatchType DECORATOR is NOT available ===========");
633 int nTruthVertices = (
int)(truthHSVertices.size() + truthPUVertices.size());
634 int nRecoVertices = (
int)vertexContainer.
size()-1;
640 std::map<InDetVertexTruthMatchUtils::VertexMatchType, int> breakdown = {};
647 if (!recoHardScatter){
648 ATH_MSG_INFO(
"No recoHardScatter vertex - not filling vertex truth matching.");
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.");
661 truthHSVtx = truthHSVertices.at(0);
666 ATH_MSG_WARNING(
"Size of truth HS vertex vector is 0 -- assuming truth HS vertex to NOT be reconstructed.");
670 float localPUDensity =
getLocalPUDensity(truthHSVtx, truthHSVertices, truthPUVertices);
676 if (!bestRecoHSVtx_truth){
677 ATH_MSG_INFO(
"No bestRecoHS vertex - not filling vertex truth matching.");
687 bool truthHSVtxRecoed =
false;
689 float truthRecoRadialDiff2 = -1.;
693 truthRecoRadialDiff2 =
getRadialDiff2(bestRecoHSVtx_truth, truthHSVtx);
694 if (truthRecoRadialDiff2 < minTruthRecoRadialDiff2) {
695 truthHSVtxRecoed =
true;
696 minTruthRecoRadialDiff2 = truthRecoRadialDiff2;
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;
715 float vx_hs_mindz=9999.;
716 float min_fabs_dz = 9999.;
729 matchType = recoVtxMatchTypeInfo(*
vertex);
730 breakdown[matchType] += 1;
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();
742 localPUDensity =
getLocalPUDensity(matchVertex, truthHSVertices, truthPUVertices);
778 float minpt = 20000 ;
786 float weighted_sumDZ = 0;
787 float weighted_deltaZ = 0;
788 float weighted_modsumDZ = 0;
789 float weighted_z_asym =0;
792 std::vector<float> track_deltaZ;
793 std::vector<float> track_deltaPt;
794 std::vector<float> track_deltaZ_weighted;
796 for (
size_t i = 0;
i <
vertex->nTrackParticles();
i++) {
797 trackTmp =
vertex->trackParticle(
i);
804 track_deltaZ.push_back(
deltaZ);
806 float trk_weight =
vertex->trackWeight(
i);
807 weighted_deltaZ =
deltaZ*trk_weight;
810 modsumDZ = modsumDZ + std::abs(
deltaZ);
811 weighted_sumDZ = weighted_sumDZ + weighted_deltaZ;
812 weighted_modsumDZ = weighted_modsumDZ + std::abs(weighted_deltaZ);
817 z_asym = sumDZ/modsumDZ;
819 if (weighted_modsumDZ >0) {
820 weighted_z_asym = weighted_sumDZ/weighted_modsumDZ;
826 mean_Dz=sumDZ/track_deltaZ.size();
827 double number_tracks =0;
828 number_tracks = track_deltaZ.size();
836 for (
auto i : track_deltaZ) {
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);
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);
853 if (
vertex == bestRecoHSVtx_truth) {
864 for (
const float& trkWeight :
vertex->trackWeights()) {
881 for (
const float& trkWeight :
vertex->trackWeights()) {
895 for (
const float& trkWeight :
vertex->trackWeights()) {
904 if (
vertex == bestRecoHSVtx_truth) {
913 for (
const float& trkWeight :
vertex->trackWeights()) {
929 for (
const float& trkWeight :
vertex->trackWeights()) {
943 for (
const float& trkWeight :
vertex->trackWeights()) {
952 if (
vertex == bestRecoHSVtx_truth) {
960 for (
const float& trkWeight :
vertex->trackWeights()) {
975 for (
const float& trkWeight :
vertex->trackWeights()) {
991 for (
const float& trkWeight :
vertex->trackWeights()) {
1003 if (
vertex == bestRecoHSVtx_truth) {
1004 number_matched_HS++;
1007 number_matched_PU++;
1009 if (sumPt > minpt) {
1015 if (
vertex == bestRecoHSVtx_truth) {
1021 if (sumPt > minpt) {
1027 if (
vertex == bestRecoHSVtx_truth) {
1033 if (sumPt > minpt) {
1039 if (
vertex == bestRecoHSVtx_truth) {
1045 if (sumPt > minpt) {
1055 if (
vertex == bestRecoHSVtx_truth) {
1090 if (sumPt > minpt) {
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();
1116 for (
const auto& vertex2 : vertexContainer.
stdcont()) {
1118 if(vertex2 ==
vertex)
continue;
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();
1158 const AmgSymMatrix(3)& covariance = bestRecoHSVtx_truth->covariancePosition();