595 const std::vector<const xAOD::TruthVertex*>& truthHSVertices,
596 const std::vector<const xAOD::TruthVertex*>& truthPUVertices,
597 float actualMu,
float weight) {
603 int nRecoVertices =
static_cast<int>(vertexContainer.
size()-1);
605 if (!recoHardScatter){
606 ATH_MSG_INFO(
"No recoHardScatter vertex - not filling vertex truth matching.");
614 if (!truthHSVertices.empty()) {
615 if (truthHSVertices.size() != 1) {
616 ATH_MSG_WARNING(
"Size of truth HS vertex vector is >1 -- only using the first one in the vector.");
618 truthHSVtx = truthHSVertices.at(0);
621 ATH_MSG_WARNING(
"Size of truth HS vertex vector is 0 -- assuming truth HS vertex to NOT be reconstructed.");
625 ATH_MSG_INFO(
"No truthHSVtx vertex - not filling vertex truth matching.");
634 if (!bestRecoHSVtx_truth){
635 ATH_MSG_INFO(
"No bestRecoHS vertex - not filling vertex truth matching.");
639 bool isHSVtx_vtx_matched = (recoHardScatter == bestRecoHSVtx_truth);
647 float residual_z = truthHSVtx->
z() - bestRecoHSVtx_truth->
z();
652 int nTruthVertices =
static_cast<int>(truthHSVertices.size() + truthPUVertices.size());
657 const static xAOD::Vertex::Decorator<InDetVertexTruthMatchUtils::VertexMatchType> recoVtxMatchTypeInfo(
"VertexMatchType");
658 std::map<InDetVertexTruthMatchUtils::VertexMatchType, int> breakdown = {};
668 float localPUDensity =
getLocalPUDensity(truthHSVtx, truthHSVertices, truthPUVertices);
676 float number_matched = 0;
677 float number_merged = 0;
678 float number_split = 0;
679 float number_fake = 0;
680 float number_matched_HS = 0;
681 float number_merged_HS = 0;
682 float number_split_HS = 0;
683 float number_fake_HS = 0;
684 float number_matched_PU = 0;
685 float number_merged_PU = 0;
686 float number_split_PU = 0;
687 float number_fake_PU = 0;
690 float vx_hs_mindz=9999.;
694 for (
const auto& vertex : vertexContainer.
stdcont()) {
703 matchType = recoVtxMatchTypeInfo(*vertex);
704 breakdown[matchType] += 1;
707 if(!matchVertex)
continue;
708 float residual_z = matchVertex->
z() - vertex->z();
709 float residual_x = matchVertex->
x() - vertex->x();
710 float residual_y = matchVertex->
y() - vertex->y();
711 const AmgSymMatrix(3)& covariance = vertex->covariancePosition();
712 float vtxerr_x = std::abs(
Amg::error(covariance, 0)) > 1e-7 ?
Amg::error(covariance, 0) : 1000.;
713 float vtxerr_y = std::abs(
Amg::error(covariance, 1)) > 1e-7 ?
Amg::error(covariance, 1) : 1000.;
714 float vtxerr_z = std::abs(
Amg::error(covariance, 2)) > 1e-7 ?
Amg::error(covariance, 2) : 1000.;
720 float localPUDensity =
getLocalPUDensity(matchVertex, truthHSVertices, truthPUVertices);
734 int nTrackPart = vertex->nTrackParticles();
750 float minpt = 20000 ;
758 float weighted_sumDZ = 0;
759 float weighted_deltaZ = 0;
760 float weighted_modsumDZ = 0;
761 float weighted_z_asym =0;
764 std::vector<float> track_deltaZ;
765 std::vector<float> track_deltaPt;
766 std::vector<float> track_deltaZ_weighted;
769 for (
size_t i = 0; i < vertex->nTrackParticles(); i++) {
770 trackTmp = vertex->trackParticle(i);
773 trackPt = trackTmp->
pt();
774 sumPt = sumPt + trackPt;
775 deltaZ = trackTmp->
z0() - vertex->z();
776 track_deltaZ.push_back(deltaZ);
778 float trk_weight = vertex->trackWeight(i);
779 weighted_deltaZ = deltaZ*trk_weight;
781 sumDZ = sumDZ + deltaZ;
782 modsumDZ = modsumDZ + std::abs(deltaZ);
783 weighted_sumDZ = weighted_sumDZ + weighted_deltaZ;
784 weighted_modsumDZ = weighted_modsumDZ + std::abs(weighted_deltaZ);
788 if (modsumDZ >0) z_asym = sumDZ/modsumDZ;
789 if (weighted_modsumDZ >0) weighted_z_asym = weighted_sumDZ/weighted_modsumDZ;
792 mean_Dz=sumDZ/track_deltaZ.size();
793 double number_tracks =0;
794 number_tracks = track_deltaZ.size();
802 for (
auto i : track_deltaZ) {
803 z_zbar = (i - mean_Dz);
804 z_var =(z_var + z_zbar*z_zbar);
805 z_skew =(z_skew + z_zbar*z_zbar*z_zbar);
806 z_kurt =(z_kurt + z_zbar*z_zbar*z_zbar*z_zbar);
809 z_var = z_var/(number_tracks -1);
810 z_sd = std::sqrt(z_var);
811 z_skew = z_skew/((number_tracks -1)*z_sd*z_sd*z_sd);
812 z_kurt = z_kurt/((number_tracks -1)*z_sd*z_sd*z_sd*z_sd);
814 float ndf = vertex->numberDoF();
818 if (vertex == bestRecoHSVtx_truth) {
827 for (
const float& trkWeight : vertex->trackWeights()) {
840 for (
const float& trkWeight : vertex->trackWeights()) {
855 for (
const float& trkWeight : vertex->trackWeights()) {
864 if (vertex == bestRecoHSVtx_truth) {
872 for (
const float& trkWeight : vertex->trackWeights()) {
885 for (
const float& trkWeight : vertex->trackWeights()) {
899 for (
const float& trkWeight : vertex->trackWeights()) {
907 if (vertex == bestRecoHSVtx_truth) {
915 for (
const float& trkWeight : vertex->trackWeights()) {
927 for (
const float& trkWeight : vertex->trackWeights()) {
942 for (
const float& trkWeight : vertex->trackWeights()) {
951 if (vertex == bestRecoHSVtx_truth) number_matched_HS++;
952 else number_matched_PU++;
953 if (sumPt > minpt) number_matched++;
955 if (vertex == bestRecoHSVtx_truth) number_merged_HS++;
956 else number_merged_PU++;
957 if (sumPt > minpt) number_merged++;
959 if (vertex == bestRecoHSVtx_truth) number_split_HS++;
960 else number_split_PU++;
961 if (sumPt > minpt) number_split++;
963 if (vertex == bestRecoHSVtx_truth) number_fake_HS++;
964 else number_fake_PU++;
965 if (sumPt > minpt) number_fake++;
970 if (vertex == bestRecoHSVtx_truth) {
1000 if (sumPt > minpt) {
1017 float dz = bestRecoHSVtx_truth->
z() - vertex->z();
1018 if(bestRecoHSVtx_truth != vertex && std::abs(dz) < std::abs(vx_hs_mindz)) {
1023 for (
const auto& vertex2 : vertexContainer.
stdcont()) {
1025 if(vertex2 == vertex)
continue;
1049 if (!truthHSVertices.empty()) {
1061 float residual_x = truthHSVtx->
x() - bestRecoHSVtx_truth->
x();
1062 float residual_y = truthHSVtx->
y() - bestRecoHSVtx_truth->
y();
1063 float residual_r = std::hypot(residual_x, residual_y);
1068 const AmgSymMatrix(3)& covariance = bestRecoHSVtx_truth->covariancePosition();