794 {
795 Trk::VxCascadeInfo*
result(
nullptr);
796
797 std::vector<const xAOD::TrackParticle*> tracksJX;
799 if (tracksJX.size() != massesJX.size()) {
800 ATH_MSG_ERROR(
"Problems with JX input: number of tracks or track mass inputs is not correct!");
802 }
803 std::vector<const xAOD::TrackParticle*> tracksV01;
805 std::vector<const xAOD::TrackParticle*> tracksV02;
807
808 std::vector<const xAOD::TrackParticle*> tracksJpsi{tracksJX[0], tracksJX[1]};
809 std::vector<const xAOD::TrackParticle*> tracksX;
812
813 std::vector<double> massesV01;
817 std::vector<double> massesV02;
821
822 TLorentzVector p4_moth, p4_JX, p4_v01, p4_v02,
tmp;
825 p4_moth +=
tmp; p4_JX +=
tmp;
826 }
827 xAOD::BPhysHelper V01_helper(V01vtx);
828 for(
int it=0;
it<V01_helper.nRefTrks();
it++) {
829 p4_moth += V01_helper.refTrk(it,massesV01[it]);
830 p4_v01 += V01_helper.refTrk(it,massesV01[it]);
831 }
832 xAOD::BPhysHelper V02_helper(V02vtx);
833 for(
int it=0;
it<V02_helper.nRefTrks();
it++) {
834 p4_moth += V02_helper.refTrk(it,massesV02[it]);
835 p4_v02 += V02_helper.refTrk(it,massesV02[it]);
836 }
837 double main_mass = p4_moth.M();
845 }
847
849 double JXV02_mass = (p4_JX+p4_v02).M();
855 }
857 }
858
864 xAOD::BPhysHelper JX_helper(JXvtx);
867 std::unique_ptr<Trk::RecVertex> pv_AOD;
868 if(pv_xAOD) pv_AOD = std::make_unique<Trk::RecVertex>(pv_xAOD->
position(),pv_xAOD->covariancePosition(),pv_xAOD->
numberDoF(),pv_xAOD->
chiSquared());
869
870 SG::AuxElement::Decorator<float> chi2_V1_decor("ChiSquared_V1");
871 SG::AuxElement::Decorator<int> ndof_V1_decor("nDoF_V1");
872 SG::AuxElement::Decorator<std::string> type_V1_decor("Type_V1");
873 SG::AuxElement::Decorator<float> chi2_V2_decor("ChiSquared_V2");
874 SG::AuxElement::Decorator<int> ndof_V2_decor("nDoF_V2");
875 SG::AuxElement::Decorator<std::string> type_V2_decor("Type_V2");
876
877 SG::AuxElement::Accessor<int> mAcc_gfit("gamma_fit");
878 SG::AuxElement::Accessor<float> mAcc_gmass("gamma_mass");
879 SG::AuxElement::Accessor<float> mAcc_gmasserr("gamma_massError");
880 SG::AuxElement::Accessor<float> mAcc_gchisq("gamma_chisq");
881 SG::AuxElement::Accessor<int> mAcc_gndof("gamma_ndof");
882 SG::AuxElement::Accessor<float> mAcc_gprob("gamma_probability");
883
884 SG::AuxElement::Decorator<int> mDec_gfit("gamma_fit");
885 SG::AuxElement::Decorator<float> mDec_gmass("gamma_mass");
886 SG::AuxElement::Decorator<float> mDec_gmasserr("gamma_massError");
887 SG::AuxElement::Decorator<float> mDec_gchisq("gamma_chisq");
888 SG::AuxElement::Decorator<int> mDec_gndof("gamma_ndof");
889 SG::AuxElement::Decorator<float> mDec_gprob("gamma_probability");
890 SG::AuxElement::Decorator< std::vector<float> > trk_pxDeco("TrackPx_V0nc");
891 SG::AuxElement::Decorator< std::vector<float> > trk_pyDeco("TrackPy_V0nc");
892 SG::AuxElement::Decorator< std::vector<float> > trk_pzDeco("TrackPz_V0nc");
893
894 std::vector<float> trk_px;
895 std::vector<float> trk_py;
896 std::vector<float> trk_pz;
897
898
899 std::unique_ptr<Trk::IVKalState> state =
m_iVertexFitter->makeState(ctx);
900
901 int robustness = 0;
903
904
905 std::vector<Trk::VertexID> vrtList;
906
907
911 } else {
913 }
914 vrtList.push_back(vID1);
915
919 } else {
921 }
922 vrtList.push_back(vID2);
926
927 std::vector<Trk::VertexID> vrtList1{vID1};
928 std::vector<Trk::VertexID> vrtList2{vID2};
931 } else {
933 }
934 vrtList1.push_back(vID3);
936 std::vector<Trk::VertexID> cnstV; cnstV.clear();
939 }
940 }
941
942 std::vector<const xAOD::TrackParticle*> tp; tp.clear();
943 std::vector<double> tp_masses; tp_masses.clear();
946 } else {
948 }
949 }
950 else {
951
954 } else {
956 }
957 vrtList.push_back(vID3);
958
959 std::vector<const xAOD::TrackParticle*> tp; tp.clear();
960 std::vector<double> tp_masses; tp_masses.clear();
963 } else {
965 }
966 }
967 }
968 else {
969
972 } else {
974 }
976 std::vector<Trk::VertexID> cnstV; cnstV.clear();
979 }
980 }
981 }
982
984 std::vector<Trk::VertexID> cnstV; cnstV.clear();
987 }
988 }
990 std::vector<Trk::VertexID> cnstV; cnstV.clear();
993 }
994 }
995
996 std::unique_ptr<Trk::VxCascadeInfo> fit_result = std::unique_ptr<Trk::VxCascadeInfo>(
m_iVertexFitter->fitCascade(*state, pv_AOD.get(), pv_AOD.get() &&
m_firstDecayAtPV ?
true :
false) );
997
998 if (fit_result != nullptr) {
999 for(auto v : fit_result->vertices()) {
1000 if(
v->nTrackParticles()==0) {
1001 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
1002 v->setTrackParticleLinks(nullLinkVector);
1003 }
1004 }
1005
1007
1008
1009 fit_result->setSVOwnership(true);
1010
1011
1012 double chi2DOF = fit_result->fitChi2()/fit_result->nDoF();
1014
1015 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->getParticleMoms();
1016 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->vertices();
1017 size_t iMoth = cascadeVertices.size()-1;
1018 double lxy_SV1 =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[iMoth]);
1021 chi2_V1_decor(*cascadeVertices[0]) = V01vtx->
chiSquared();
1022 ndof_V1_decor(*cascadeVertices[0]) = V01vtx->
numberDoF();
1023 if(V01==
LAMBDA) type_V1_decor(*cascadeVertices[0]) =
"Lambda";
1024 else if(V01==
LAMBDABAR) type_V1_decor(*cascadeVertices[0]) =
"Lambdabar";
1025 else if(V01==
KS) type_V1_decor(*cascadeVertices[0]) =
"Ks";
1026 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.isAvailable(*V01vtx) ? mAcc_gfit(*V01vtx) : 0;
1027 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.isAvailable(*V01vtx) ? mAcc_gmass(*V01vtx) : -1;
1028 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.isAvailable(*V01vtx) ? mAcc_gmasserr(*V01vtx) : -1;
1029 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.isAvailable(*V01vtx) ? mAcc_gchisq(*V01vtx) : 999999;
1030 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.isAvailable(*V01vtx) ? mAcc_gndof(*V01vtx) : 0;
1031 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.isAvailable(*V01vtx) ? mAcc_gprob(*V01vtx) : -1;
1032 trk_px.clear(); trk_py.clear(); trk_pz.clear();
1033 for(
int it=0;
it<V01_helper.nRefTrks();
it++) {
1034 trk_px.push_back( V01_helper.refTrk(it).Px() );
1035 trk_py.push_back( V01_helper.refTrk(it).Py() );
1036 trk_pz.push_back( V01_helper.refTrk(it).Pz() );
1037 }
1038 trk_pxDeco(*cascadeVertices[0]) = trk_px;
1039 trk_pyDeco(*cascadeVertices[0]) = trk_py;
1040 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
1041
1042 chi2_V2_decor(*cascadeVertices[1]) = V02vtx->
chiSquared();
1043 ndof_V2_decor(*cascadeVertices[1]) = V02vtx->
numberDoF();
1044 if(V02==
LAMBDA) type_V2_decor(*cascadeVertices[1]) =
"Lambda";
1045 else if(V02==
LAMBDABAR) type_V2_decor(*cascadeVertices[1]) =
"Lambdabar";
1046 else if(V02==
KS) type_V2_decor(*cascadeVertices[1]) =
"Ks";
1047 mDec_gfit(*cascadeVertices[1]) = mAcc_gfit.isAvailable(*V02vtx) ? mAcc_gfit(*V02vtx) : 0;
1048 mDec_gmass(*cascadeVertices[1]) = mAcc_gmass.isAvailable(*V02vtx) ? mAcc_gmass(*V02vtx) : -1;
1049 mDec_gmasserr(*cascadeVertices[1]) = mAcc_gmasserr.isAvailable(*V02vtx) ? mAcc_gmasserr(*V02vtx) : -1;
1050 mDec_gchisq(*cascadeVertices[1]) = mAcc_gchisq.isAvailable(*V02vtx) ? mAcc_gchisq(*V02vtx) : 999999;
1051 mDec_gndof(*cascadeVertices[1]) = mAcc_gndof.isAvailable(*V02vtx) ? mAcc_gndof(*V02vtx) : 0;
1052 mDec_gprob(*cascadeVertices[1]) = mAcc_gprob.isAvailable(*V02vtx) ? mAcc_gprob(*V02vtx) : -1;
1053 trk_px.clear(); trk_py.clear(); trk_pz.clear();
1054 for(
int it=0;
it<V02_helper.nRefTrks();
it++) {
1055 trk_px.push_back( V02_helper.refTrk(it).Px() );
1056 trk_py.push_back( V02_helper.refTrk(it).Py() );
1057 trk_pz.push_back( V02_helper.refTrk(it).Pz() );
1058 }
1059 trk_pxDeco(*cascadeVertices[1]) = trk_px;
1060 trk_pyDeco(*cascadeVertices[1]) = trk_py;
1061 trk_pzDeco(*cascadeVertices[1]) = trk_pz;
1062
1063 result = fit_result.release();
1064 }
1065 }
1066
1067 if(pv_xAOD && result &&
result->getParticleMoms().size()>0) {
1068 size_t index =
result->getParticleMoms().size() - 1;
1069 const std::vector<TLorentzVector> &
mom =
result->getParticleMoms()[
index];
1072 xAOD::BPhysHypoHelper vtx(
m_hypoName, mainVertex);
1073 bool isInDefaultPVCont = false;
1075 if(pv_xAOD == pvVtx) { isInDefaultPVCont = true; break; }
1076 }
1077 if(isInDefaultPVCont) vtx.setPv( pv_xAOD, defaultPVContainer, pvtype );
1078 else vtx.setPv( pv_xAOD, pvContainer, pvtype );
1079 if(origPv_xAOD) vtx.setOrigPv( origPv_xAOD, defaultPVContainer, pvtype );
1080 vtx.setLxy (
m_CascadeTools->lxy (mom, vtx.vtx(), pv_xAOD), pvtype );
1081 vtx.setLxyErr (
m_CascadeTools->lxyError (mom, cov, vtx.vtx(), pv_xAOD), pvtype );
1082 vtx.setA0 (
m_CascadeTools->a0 (mom, vtx.vtx(), pv_xAOD), pvtype );
1083 vtx.setA0Err (
m_CascadeTools->a0Error (mom, cov, vtx.vtx(), pv_xAOD), pvtype );
1084 vtx.setA0xy (
m_CascadeTools->a0xy (mom, vtx.vtx(), pv_xAOD), pvtype );
1085 vtx.setA0xyErr(
m_CascadeTools->a0xyError(mom, cov, vtx.vtx(), pv_xAOD), pvtype );
1086 vtx.setZ0 (
m_CascadeTools->a0z (mom, vtx.vtx(), pv_xAOD), pvtype );
1087 vtx.setZ0Err (
m_CascadeTools->a0zError (mom, cov, vtx.vtx(), pv_xAOD), pvtype );
1088 vtx.setRefitPVStatus( 0, pvtype );
1089
1094 }
1095
1097 }
pv_type
: Enum type of the PV
virtual double phi() const override final
The azimuthal angle ( ) of the particle (has range to .).
virtual double pt() const override final
The transverse momentum ( ) of the particle.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
size_t nTrackParticles() const
Get the number of tracks associated with this vertex.
const TrackParticle * trackParticle(size_t i) const
Get the pointer to a given track that was used in vertex reco.
float numberDoF() const
Returns the number of degrees of freedom of the vertex fit as float.
float chiSquared() const
Returns the of the vertex fit as float.
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
float j(const xAOD::IParticle &, const xAOD::TrackMeasurementValidation &hit, const Eigen::Matrix3d &jab_inv)