796 {
797 Trk::VxCascadeInfo*
result(
nullptr);
798
799 std::vector<const xAOD::TrackParticle*> tracksJX;
801 if (tracksJX.size() != massesJX.size()) {
802 ATH_MSG_ERROR(
"Problems with JX input: number of tracks or track mass inputs is not correct!");
804 }
805 std::vector<const xAOD::TrackParticle*> tracksV01;
807 std::vector<const xAOD::TrackParticle*> tracksV02;
809
810 std::vector<const xAOD::TrackParticle*> tracksJpsi{tracksJX[0], tracksJX[1]};
811 std::vector<const xAOD::TrackParticle*> tracksX;
814
815 std::vector<double> massesV01;
819 std::vector<double> massesV02;
823
824 TLorentzVector p4_moth, p4_JX, p4_v01, p4_v02,
tmp;
827 p4_moth +=
tmp; p4_JX +=
tmp;
828 }
829 xAOD::BPhysHelper V01_helper(V01vtx);
830 for(
int it=0;
it<V01_helper.nRefTrks();
it++) {
831 p4_moth += V01_helper.refTrk(it,massesV01[it]);
832 p4_v01 += V01_helper.refTrk(it,massesV01[it]);
833 }
834 xAOD::BPhysHelper V02_helper(V02vtx);
835 for(
int it=0;
it<V02_helper.nRefTrks();
it++) {
836 p4_moth += V02_helper.refTrk(it,massesV02[it]);
837 p4_v02 += V02_helper.refTrk(it,massesV02[it]);
838 }
839 double main_mass = p4_moth.M();
847 }
849
851 double JXV02_mass = (p4_JX+p4_v02).M();
857 }
859 }
860
866 xAOD::BPhysHelper JX_helper(JXvtx);
869 std::unique_ptr<Trk::RecVertex> pv_AOD;
870 if(pv_xAOD) pv_AOD = std::make_unique<Trk::RecVertex>(pv_xAOD->
position(),pv_xAOD->covariancePosition(),pv_xAOD->
numberDoF(),pv_xAOD->
chiSquared());
871
872 SG::AuxElement::Decorator<float> chi2_V1_decor("ChiSquared_V1");
873 SG::AuxElement::Decorator<int> ndof_V1_decor("nDoF_V1");
874 SG::AuxElement::Decorator<std::string> type_V1_decor("Type_V1");
875 SG::AuxElement::Decorator<float> chi2_V2_decor("ChiSquared_V2");
876 SG::AuxElement::Decorator<int> ndof_V2_decor("nDoF_V2");
877 SG::AuxElement::Decorator<std::string> type_V2_decor("Type_V2");
878
879 SG::AuxElement::Accessor<int> mAcc_gfit("gamma_fit");
880 SG::AuxElement::Accessor<float> mAcc_gmass("gamma_mass");
881 SG::AuxElement::Accessor<float> mAcc_gmasserr("gamma_massError");
882 SG::AuxElement::Accessor<float> mAcc_gchisq("gamma_chisq");
883 SG::AuxElement::Accessor<int> mAcc_gndof("gamma_ndof");
884 SG::AuxElement::Accessor<float> mAcc_gprob("gamma_probability");
885
886 SG::AuxElement::Decorator<int> mDec_gfit("gamma_fit");
887 SG::AuxElement::Decorator<float> mDec_gmass("gamma_mass");
888 SG::AuxElement::Decorator<float> mDec_gmasserr("gamma_massError");
889 SG::AuxElement::Decorator<float> mDec_gchisq("gamma_chisq");
890 SG::AuxElement::Decorator<int> mDec_gndof("gamma_ndof");
891 SG::AuxElement::Decorator<float> mDec_gprob("gamma_probability");
892 SG::AuxElement::Decorator< std::vector<float> > trk_pxDeco("TrackPx_V0nc");
893 SG::AuxElement::Decorator< std::vector<float> > trk_pyDeco("TrackPy_V0nc");
894 SG::AuxElement::Decorator< std::vector<float> > trk_pzDeco("TrackPz_V0nc");
895
896 std::vector<float> trk_px;
897 std::vector<float> trk_py;
898 std::vector<float> trk_pz;
899
900
902
903 int robustness = 0;
905
906
907 std::vector<Trk::VertexID> vrtList;
908
909
913 } else {
915 }
916 vrtList.push_back(vID1);
917
921 } else {
923 }
924 vrtList.push_back(vID2);
928
929 std::vector<Trk::VertexID> vrtList1{vID1};
930 std::vector<Trk::VertexID> vrtList2{vID2};
933 } else {
935 }
936 vrtList1.push_back(vID3);
938 std::vector<Trk::VertexID> cnstV; cnstV.clear();
941 }
942 }
943
944 std::vector<const xAOD::TrackParticle*> tp; tp.clear();
945 std::vector<double> tp_masses; tp_masses.clear();
948 } else {
950 }
951 }
952 else {
953
956 } else {
958 }
959 vrtList.push_back(vID3);
960
961 std::vector<const xAOD::TrackParticle*> tp; tp.clear();
962 std::vector<double> tp_masses; tp_masses.clear();
965 } else {
967 }
968 }
969 }
970 else {
971
974 } else {
976 }
978 std::vector<Trk::VertexID> cnstV; cnstV.clear();
981 }
982 }
983 }
984
986 std::vector<Trk::VertexID> cnstV; cnstV.clear();
989 }
990 }
992 std::vector<Trk::VertexID> cnstV; cnstV.clear();
995 }
996 }
997
998 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) );
999
1000 if (fit_result != nullptr) {
1001 for(auto v : fit_result->vertices()) {
1002 if(
v->nTrackParticles()==0) {
1003 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
1004 v->setTrackParticleLinks(nullLinkVector);
1005 }
1006 }
1007
1009
1010
1011 fit_result->setSVOwnership(true);
1012
1013
1014 double chi2DOF = fit_result->fitChi2()/fit_result->nDoF();
1016
1017 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->getParticleMoms();
1018 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->vertices();
1019 size_t iMoth = cascadeVertices.size()-1;
1020 double lxy_SV1 =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[iMoth]);
1023 chi2_V1_decor(*cascadeVertices[0]) = V01vtx->
chiSquared();
1024 ndof_V1_decor(*cascadeVertices[0]) = V01vtx->
numberDoF();
1025 if(V01==
LAMBDA) type_V1_decor(*cascadeVertices[0]) =
"Lambda";
1026 else if(V01==
LAMBDABAR) type_V1_decor(*cascadeVertices[0]) =
"Lambdabar";
1027 else if(V01==
KS) type_V1_decor(*cascadeVertices[0]) =
"Ks";
1028 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.isAvailable(*V01vtx) ? mAcc_gfit(*V01vtx) : 0;
1029 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.isAvailable(*V01vtx) ? mAcc_gmass(*V01vtx) : -1;
1030 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.isAvailable(*V01vtx) ? mAcc_gmasserr(*V01vtx) : -1;
1031 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.isAvailable(*V01vtx) ? mAcc_gchisq(*V01vtx) : 999999;
1032 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.isAvailable(*V01vtx) ? mAcc_gndof(*V01vtx) : 0;
1033 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.isAvailable(*V01vtx) ? mAcc_gprob(*V01vtx) : -1;
1034 trk_px.clear(); trk_py.clear(); trk_pz.clear();
1035 for(
int it=0;
it<V01_helper.nRefTrks();
it++) {
1036 trk_px.push_back( V01_helper.refTrk(it).Px() );
1037 trk_py.push_back( V01_helper.refTrk(it).Py() );
1038 trk_pz.push_back( V01_helper.refTrk(it).Pz() );
1039 }
1040 trk_pxDeco(*cascadeVertices[0]) = trk_px;
1041 trk_pyDeco(*cascadeVertices[0]) = trk_py;
1042 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
1043
1044 chi2_V2_decor(*cascadeVertices[1]) = V02vtx->
chiSquared();
1045 ndof_V2_decor(*cascadeVertices[1]) = V02vtx->
numberDoF();
1046 if(V02==
LAMBDA) type_V2_decor(*cascadeVertices[1]) =
"Lambda";
1047 else if(V02==
LAMBDABAR) type_V2_decor(*cascadeVertices[1]) =
"Lambdabar";
1048 else if(V02==
KS) type_V2_decor(*cascadeVertices[1]) =
"Ks";
1049 mDec_gfit(*cascadeVertices[1]) = mAcc_gfit.isAvailable(*V02vtx) ? mAcc_gfit(*V02vtx) : 0;
1050 mDec_gmass(*cascadeVertices[1]) = mAcc_gmass.isAvailable(*V02vtx) ? mAcc_gmass(*V02vtx) : -1;
1051 mDec_gmasserr(*cascadeVertices[1]) = mAcc_gmasserr.isAvailable(*V02vtx) ? mAcc_gmasserr(*V02vtx) : -1;
1052 mDec_gchisq(*cascadeVertices[1]) = mAcc_gchisq.isAvailable(*V02vtx) ? mAcc_gchisq(*V02vtx) : 999999;
1053 mDec_gndof(*cascadeVertices[1]) = mAcc_gndof.isAvailable(*V02vtx) ? mAcc_gndof(*V02vtx) : 0;
1054 mDec_gprob(*cascadeVertices[1]) = mAcc_gprob.isAvailable(*V02vtx) ? mAcc_gprob(*V02vtx) : -1;
1055 trk_px.clear(); trk_py.clear(); trk_pz.clear();
1056 for(
int it=0;
it<V02_helper.nRefTrks();
it++) {
1057 trk_px.push_back( V02_helper.refTrk(it).Px() );
1058 trk_py.push_back( V02_helper.refTrk(it).Py() );
1059 trk_pz.push_back( V02_helper.refTrk(it).Pz() );
1060 }
1061 trk_pxDeco(*cascadeVertices[1]) = trk_px;
1062 trk_pyDeco(*cascadeVertices[1]) = trk_py;
1063 trk_pzDeco(*cascadeVertices[1]) = trk_pz;
1064
1065 result = fit_result.release();
1066 }
1067 }
1068
1069 if(pv_xAOD && result &&
result->getParticleMoms().size()>0) {
1070 size_t index =
result->getParticleMoms().size() - 1;
1071 const std::vector<TLorentzVector> &
mom =
result->getParticleMoms()[
index];
1074 xAOD::BPhysHypoHelper vtx(
m_hypoName, mainVertex);
1075 bool isInDefaultPVCont = false;
1077 if(pv_xAOD == pvVtx) { isInDefaultPVCont = true; break; }
1078 }
1079 if(isInDefaultPVCont) vtx.setPv( pv_xAOD, defaultPVContainer, pvtype );
1080 else vtx.setPv( pv_xAOD, pvContainer, pvtype );
1081 if(origPv_xAOD) vtx.setOrigPv( origPv_xAOD, defaultPVContainer, pvtype );
1082 vtx.setLxy (
m_CascadeTools->lxy (mom, vtx.vtx(), pv_xAOD), pvtype );
1083 vtx.setLxyErr (
m_CascadeTools->lxyError (mom, cov, vtx.vtx(), pv_xAOD), pvtype );
1084 vtx.setA0 (
m_CascadeTools->a0 (mom, vtx.vtx(), pv_xAOD), pvtype );
1085 vtx.setA0Err (
m_CascadeTools->a0Error (mom, cov, vtx.vtx(), pv_xAOD), pvtype );
1086 vtx.setA0xy (
m_CascadeTools->a0xy (mom, vtx.vtx(), pv_xAOD), pvtype );
1087 vtx.setA0xyErr(
m_CascadeTools->a0xyError(mom, cov, vtx.vtx(), pv_xAOD), pvtype );
1088 vtx.setZ0 (
m_CascadeTools->a0z (mom, vtx.vtx(), pv_xAOD), pvtype );
1089 vtx.setZ0Err (
m_CascadeTools->a0zError (mom, cov, vtx.vtx(), pv_xAOD), pvtype );
1090 vtx.setRefitPVStatus( 0, pvtype );
1091
1096 }
1097
1099 }
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)