795 {
796 Trk::VxCascadeInfo*
result(
nullptr);
797
798 std::vector<const xAOD::TrackParticle*> tracksJX;
800 if (tracksJX.size() != massesJX.size()) {
801 ATH_MSG_ERROR(
"Problems with JX input: number of tracks or track mass inputs is not correct!");
803 }
804 std::vector<const xAOD::TrackParticle*> tracksV01;
806 std::vector<const xAOD::TrackParticle*> tracksV02;
808
809 std::vector<const xAOD::TrackParticle*> tracksJpsi{tracksJX[0], tracksJX[1]};
810 std::vector<const xAOD::TrackParticle*> tracksX;
813
814 std::vector<double> massesV01;
818 std::vector<double> massesV02;
822
823 TLorentzVector p4_moth, p4_JX, p4_v01, p4_v02,
tmp;
826 p4_moth +=
tmp; p4_JX +=
tmp;
827 }
828 xAOD::BPhysHelper V01_helper(V01vtx);
829 for(
int it=0;
it<V01_helper.nRefTrks();
it++) {
830 p4_moth += V01_helper.refTrk(it,massesV01[it]);
831 p4_v01 += V01_helper.refTrk(it,massesV01[it]);
832 }
833 xAOD::BPhysHelper V02_helper(V02vtx);
834 for(
int it=0;
it<V02_helper.nRefTrks();
it++) {
835 p4_moth += V02_helper.refTrk(it,massesV02[it]);
836 p4_v02 += V02_helper.refTrk(it,massesV02[it]);
837 }
838 double main_mass = p4_moth.M();
846 }
848
850 double JXV02_mass = (p4_JX+p4_v02).M();
856 }
858 }
859
865 xAOD::BPhysHelper JX_helper(JXvtx);
868 std::unique_ptr<Trk::RecVertex> pv_AOD;
869 if(pv_xAOD) pv_AOD = std::make_unique<Trk::RecVertex>(pv_xAOD->
position(),pv_xAOD->covariancePosition(),pv_xAOD->
numberDoF(),pv_xAOD->
chiSquared());
870
877
878 SG::Accessor<int> mAcc_gfit("gamma_fit");
879 SG::Accessor<float> mAcc_gmass("gamma_mass");
880 SG::Accessor<float> mAcc_gmasserr("gamma_massError");
881 SG::Accessor<float> mAcc_gchisq("gamma_chisq");
882 SG::Accessor<int> mAcc_gndof("gamma_ndof");
883 SG::Accessor<float> mAcc_gprob("gamma_probability");
884
894
895 std::vector<float> trk_px;
896 std::vector<float> trk_py;
897 std::vector<float> trk_pz;
898
899
900 std::unique_ptr<Trk::IVKalState> state =
m_iVertexFitter->makeState(ctx);
901
902 int robustness = 0;
904
905
906 std::vector<Trk::VertexID> vrtList;
907
908
912 } else {
914 }
915 vrtList.push_back(vID1);
916
920 } else {
922 }
923 vrtList.push_back(vID2);
927
928 std::vector<Trk::VertexID> vrtList1{vID1};
929 std::vector<Trk::VertexID> vrtList2{vID2};
932 } else {
934 }
935 vrtList1.push_back(vID3);
937 std::vector<Trk::VertexID> cnstV; cnstV.clear();
940 }
941 }
942
943 std::vector<const xAOD::TrackParticle*> tp; tp.clear();
944 std::vector<double> tp_masses; tp_masses.clear();
947 } else {
949 }
950 }
951 else {
952
955 } else {
957 }
958 vrtList.push_back(vID3);
959
960 std::vector<const xAOD::TrackParticle*> tp; tp.clear();
961 std::vector<double> tp_masses; tp_masses.clear();
964 } else {
966 }
967 }
968 }
969 else {
970
973 } else {
975 }
977 std::vector<Trk::VertexID> cnstV; cnstV.clear();
980 }
981 }
982 }
983
985 std::vector<Trk::VertexID> cnstV; cnstV.clear();
988 }
989 }
991 std::vector<Trk::VertexID> cnstV; cnstV.clear();
994 }
995 }
996
997 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) );
998
999 if (fit_result != nullptr) {
1000 for(auto v : fit_result->vertices()) {
1001 if(
v->nTrackParticles()==0) {
1002 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
1003 v->setTrackParticleLinks(nullLinkVector);
1004 }
1005 }
1006
1008
1009
1010 fit_result->setSVOwnership(true);
1011
1012
1013 double chi2DOF = fit_result->fitChi2()/fit_result->nDoF();
1015
1016 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->getParticleMoms();
1017 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->vertices();
1018 size_t iMoth = cascadeVertices.size()-1;
1019 double lxy_SV1 =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[iMoth]);
1022 chi2_V1_decor(*cascadeVertices[0]) = V01vtx->
chiSquared();
1023 ndof_V1_decor(*cascadeVertices[0]) = V01vtx->
numberDoF();
1024 if(V01==
LAMBDA) type_V1_decor(*cascadeVertices[0]) =
"Lambda";
1025 else if(V01==
LAMBDABAR) type_V1_decor(*cascadeVertices[0]) =
"Lambdabar";
1026 else if(V01==
KS) type_V1_decor(*cascadeVertices[0]) =
"Ks";
1027 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.isAvailable(*V01vtx) ? mAcc_gfit(*V01vtx) : 0;
1028 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.isAvailable(*V01vtx) ? mAcc_gmass(*V01vtx) : -1;
1029 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.isAvailable(*V01vtx) ? mAcc_gmasserr(*V01vtx) : -1;
1030 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.isAvailable(*V01vtx) ? mAcc_gchisq(*V01vtx) : 999999;
1031 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.isAvailable(*V01vtx) ? mAcc_gndof(*V01vtx) : 0;
1032 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.isAvailable(*V01vtx) ? mAcc_gprob(*V01vtx) : -1;
1033 trk_px.clear(); trk_py.clear(); trk_pz.clear();
1034 for(
int it=0;
it<V01_helper.nRefTrks();
it++) {
1035 trk_px.push_back( V01_helper.refTrk(it).Px() );
1036 trk_py.push_back( V01_helper.refTrk(it).Py() );
1037 trk_pz.push_back( V01_helper.refTrk(it).Pz() );
1038 }
1039 trk_pxDeco(*cascadeVertices[0]) = trk_px;
1040 trk_pyDeco(*cascadeVertices[0]) = trk_py;
1041 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
1042
1043 chi2_V2_decor(*cascadeVertices[1]) = V02vtx->
chiSquared();
1044 ndof_V2_decor(*cascadeVertices[1]) = V02vtx->
numberDoF();
1045 if(V02==
LAMBDA) type_V2_decor(*cascadeVertices[1]) =
"Lambda";
1046 else if(V02==
LAMBDABAR) type_V2_decor(*cascadeVertices[1]) =
"Lambdabar";
1047 else if(V02==
KS) type_V2_decor(*cascadeVertices[1]) =
"Ks";
1048 mDec_gfit(*cascadeVertices[1]) = mAcc_gfit.isAvailable(*V02vtx) ? mAcc_gfit(*V02vtx) : 0;
1049 mDec_gmass(*cascadeVertices[1]) = mAcc_gmass.isAvailable(*V02vtx) ? mAcc_gmass(*V02vtx) : -1;
1050 mDec_gmasserr(*cascadeVertices[1]) = mAcc_gmasserr.isAvailable(*V02vtx) ? mAcc_gmasserr(*V02vtx) : -1;
1051 mDec_gchisq(*cascadeVertices[1]) = mAcc_gchisq.isAvailable(*V02vtx) ? mAcc_gchisq(*V02vtx) : 999999;
1052 mDec_gndof(*cascadeVertices[1]) = mAcc_gndof.isAvailable(*V02vtx) ? mAcc_gndof(*V02vtx) : 0;
1053 mDec_gprob(*cascadeVertices[1]) = mAcc_gprob.isAvailable(*V02vtx) ? mAcc_gprob(*V02vtx) : -1;
1054 trk_px.clear(); trk_py.clear(); trk_pz.clear();
1055 for(
int it=0;
it<V02_helper.nRefTrks();
it++) {
1056 trk_px.push_back( V02_helper.refTrk(it).Px() );
1057 trk_py.push_back( V02_helper.refTrk(it).Py() );
1058 trk_pz.push_back( V02_helper.refTrk(it).Pz() );
1059 }
1060 trk_pxDeco(*cascadeVertices[1]) = std::move(trk_px);
1061 trk_pyDeco(*cascadeVertices[1]) = std::move(trk_py);
1062 trk_pzDeco(*cascadeVertices[1]) = std::move(trk_pz);
1063
1064 result = fit_result.release();
1065 }
1066 }
1067
1068 if(pv_xAOD && result &&
result->getParticleMoms().size()>0) {
1069 size_t index =
result->getParticleMoms().size() - 1;
1070 const std::vector<TLorentzVector> &
mom =
result->getParticleMoms()[
index];
1073 xAOD::BPhysHypoHelper vtx(
m_hypoName, mainVertex);
1074 bool isInDefaultPVCont = false;
1076 if(pv_xAOD == pvVtx) { isInDefaultPVCont = true; break; }
1077 }
1078 if(isInDefaultPVCont) vtx.setPv( pv_xAOD, defaultPVContainer, pvtype );
1079 else vtx.setPv( pv_xAOD, pvContainer, pvtype );
1080 if(origPv_xAOD) vtx.setOrigPv( origPv_xAOD, defaultPVContainer, pvtype );
1081 vtx.setLxy (
m_CascadeTools->lxy (mom, vtx.vtx(), pv_xAOD), pvtype );
1082 vtx.setLxyErr (
m_CascadeTools->lxyError (mom, cov, vtx.vtx(), pv_xAOD), pvtype );
1083 vtx.setA0 (
m_CascadeTools->a0 (mom, vtx.vtx(), pv_xAOD), pvtype );
1084 vtx.setA0Err (
m_CascadeTools->a0Error (mom, cov, vtx.vtx(), pv_xAOD), pvtype );
1085 vtx.setA0xy (
m_CascadeTools->a0xy (mom, vtx.vtx(), pv_xAOD), pvtype );
1086 vtx.setA0xyErr(
m_CascadeTools->a0xyError(mom, cov, vtx.vtx(), pv_xAOD), pvtype );
1087 vtx.setZ0 (
m_CascadeTools->a0z (mom, vtx.vtx(), pv_xAOD), pvtype );
1088 vtx.setZ0Err (
m_CascadeTools->a0zError (mom, cov, vtx.vtx(), pv_xAOD), pvtype );
1089 vtx.setRefitPVStatus( 0, pvtype );
1090
1095 }
1096
1098 }
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)