559 ATH_MSG_FATAL(
"Incorrect number of output cascade vertices");
560 return StatusCode::FAILURE;
563 ATH_MSG_FATAL(
"Incorrect number of output (mvc) cascade vertices");
564 return StatusCode::FAILURE;
567 std::array<SG::WriteHandle<xAOD::VertexContainer>, 4> VtxWriteHandles;
int ikey(0);
570 ATH_CHECK( VtxWriteHandles[ikey].record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()) );
573 std::array<SG::WriteHandle<xAOD::VertexContainer>, 4> VtxWriteHandles_mvc;
int ikey_mvc(0);
577 ATH_CHECK( VtxWriteHandles_mvc[ikey_mvc].record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()) );
588 if (defaultPVContainer.
cptr()->size()==0) {
590 return StatusCode::RECOVERABLE;
592 else primaryVertex = (*defaultPVContainer.
cptr())[0];
600 ATH_CHECK( refPvContainer.
record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()) );
608 std::vector<const xAOD::TrackParticleContainer*> trackCols;
612 trackCols.push_back(handle.cptr());
619 ATH_CHECK( V0OutputContainer.
record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()) );
626 if(jxContainer->size()==0)
return StatusCode::SUCCESS;
629 std::vector<const xAOD::TrackParticle*> tracksDisplaced;
638 if(!
m_useTRT && nclus == 0)
continue;
640 bool trk_cut =
false;
641 if(nclus != 0) trk_cut =
true;
642 if(nclus == 0 && TP->pt()>=
m_ptTRT) trk_cut =
true;
643 if(!trk_cut)
continue;
646 if(!
d0Pass(ctx,TP,primaryVertex))
continue;
648 tracksDisplaced.push_back(TP);
659 std::vector<std::pair<const xAOD::Vertex*,V0Enum> > selectedV0Candidates;
667 std::string type_V0Vtx;
668 if(mAcc_type.
isAvailable(*vtx)) type_V0Vtx = mAcc_type(*vtx);
671 if(type_V0Vtx ==
"Lambda") {
676 else if(type_V0Vtx ==
"Lambdabar") {
681 else if(type_V0Vtx ==
"Ks") {
691 int gamma_fit = mAcc_gfit.
isAvailable(*vtx) ? mAcc_gfit(*vtx) : 0;
692 double gamma_mass = mAcc_gmass.
isAvailable(*vtx) ? mAcc_gmass(*vtx) : -1;
693 double gamma_chisq = mAcc_gchisq.
isAvailable(*vtx) ? mAcc_gchisq(*vtx) : 999999;
694 double gamma_ndof = mAcc_gndof.
isAvailable(*vtx) ? mAcc_gndof(*vtx) : 0;
697 selectedV0Candidates.push_back(std::pair<const xAOD::Vertex*,V0Enum>{vtx,opt});
705 std::string type_V0Vtx;
706 if(mAcc_type.
isAvailable(*vtx)) type_V0Vtx = mAcc_type(*vtx);
709 if(type_V0Vtx ==
"Lambda") {
714 else if(type_V0Vtx ==
"Lambdabar") {
719 else if(type_V0Vtx ==
"Ks") {
729 int gamma_fit = mAcc_gfit.
isAvailable(*vtx) ? mAcc_gfit(*vtx) : 0;
730 double gamma_mass = mAcc_gmass.
isAvailable(*vtx) ? mAcc_gmass(*vtx) : -1;
731 double gamma_chisq = mAcc_gchisq.
isAvailable(*vtx) ? mAcc_gchisq(*vtx) : 999999;
732 double gamma_ndof = mAcc_gndof.
isAvailable(*vtx) ? mAcc_gndof(*vtx) : 0;
735 selectedV0Candidates.push_back(std::pair<const xAOD::Vertex*,V0Enum>{vtx,opt});
740 std::sort( selectedV0Candidates.begin(), selectedV0Candidates.end(),
741 [](std::pair<const xAOD::Vertex*,V0Enum>&
a, std::pair<const xAOD::Vertex*,V0Enum>& b)
742 { return a.first->chiSquared()/a.first->numberDoF() < b.first->chiSquared()/b.first->numberDoF(); } );
745 selectedV0Candidates.erase(selectedV0Candidates.begin()+
m_maxV0Candidates, selectedV0Candidates.end());
747 if(selectedV0Candidates.size()==0)
return StatusCode::SUCCESS;
749 std::vector<std::pair<Trk::VxCascadeInfo*, Trk::VxCascadeInfo*> > cascadeinfoContainer;
753 std::sort( cascadeinfoContainer.begin(), cascadeinfoContainer.end(),
754 [](std::pair<Trk::VxCascadeInfo*, Trk::VxCascadeInfo*>
a, std::pair<Trk::VxCascadeInfo*, Trk::VxCascadeInfo*> b)
755 { return a.first->fitChi2()/a.first->nDoF() < b.first->fitChi2()/b.first->nDoF(); } );
757 for(
auto it=cascadeinfoContainer.begin()+
m_maxMainVCandidates; it!=cascadeinfoContainer.end(); it++) {
761 cascadeinfoContainer.erase(cascadeinfoContainer.begin()+
m_maxMainVCandidates, cascadeinfoContainer.end());
763 if(cascadeinfoContainer.size()==0)
return StatusCode::SUCCESS;
802 for(
auto cascade_info_pair : cascadeinfoContainer) {
803 if(cascade_info_pair.first==
nullptr) {
808 const std::vector<xAOD::Vertex*> &cascadeVertices = cascade_info_pair.first->vertices();
809 if(cascadeVertices.size() != topoN)
ATH_MSG_ERROR(
"Incorrect number of vertices");
810 for(
size_t i=0; i<topoN; i++) {
811 if(cascadeVertices[i]==
nullptr)
ATH_MSG_ERROR(
"Error null vertex");
814 cascade_info_pair.first->setSVOwnership(
false);
815 const auto mainVertex = cascadeVertices[topoN-1];
816 const std::vector< std::vector<TLorentzVector> > &moms = cascade_info_pair.first->getParticleMoms();
848 PtErr_decor(*mainVertex) =
m_CascadeTools->pTError(moms[topoN-1],cascade_info_pair.first->getCovariance()[topoN-1]);
850 chi2_decor(*mainVertex) = cascade_info_pair.first->fitChi2();
851 ndof_decor(*mainVertex) = cascade_info_pair.first->nDoF();
855 lxy_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
856 lxyErr_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->lxyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
857 a0z_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0z(moms[0],cascadeVertices[0],cascadeVertices[1]);
858 a0zErr_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0zError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
859 a0xy_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],cascadeVertices[1]);
860 a0xyErr_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
861 lxy_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],mainVertex);
862 lxyErr_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->lxyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
863 a0z_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0z(moms[1],cascadeVertices[1],mainVertex);
864 a0zErr_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0zError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
865 a0xy_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xy(moms[1],cascadeVertices[1],mainVertex);
866 a0xyErr_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
867 lxy_SV2_decor(*cascadeVertices[2]) =
m_CascadeTools->lxy(moms[2],cascadeVertices[2],mainVertex);
868 lxyErr_SV2_decor(*cascadeVertices[2]) =
m_CascadeTools->lxyError(moms[2],cascade_info_pair.first->getCovariance()[2],cascadeVertices[2],mainVertex);
869 a0z_SV2_decor(*cascadeVertices[2]) =
m_CascadeTools->a0z(moms[2],cascadeVertices[2],mainVertex);
870 a0zErr_SV2_decor(*cascadeVertices[2]) =
m_CascadeTools->a0zError(moms[2],cascade_info_pair.first->getCovariance()[2],cascadeVertices[2],mainVertex);
871 a0xy_SV2_decor(*cascadeVertices[2]) =
m_CascadeTools->a0xy(moms[2],cascadeVertices[2],mainVertex);
872 a0xyErr_SV2_decor(*cascadeVertices[2]) =
m_CascadeTools->a0xyError(moms[2],cascade_info_pair.first->getCovariance()[2],cascadeVertices[2],mainVertex);
875 lxy_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],mainVertex);
876 lxyErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->lxyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
877 a0z_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0z(moms[0],cascadeVertices[0],mainVertex);
878 a0zErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0zError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
879 a0xy_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],mainVertex);
880 a0xyErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
881 lxy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],mainVertex);
882 lxyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
883 a0z_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0z(moms[1],cascadeVertices[1],mainVertex);
884 a0zErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0zError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
885 a0xy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xy(moms[1],cascadeVertices[1],mainVertex);
886 a0xyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
891 lxy_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
892 lxyErr_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->lxyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
893 a0z_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0z(moms[0],cascadeVertices[0],cascadeVertices[1]);
894 a0zErr_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0zError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
895 a0xy_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],cascadeVertices[1]);
896 a0xyErr_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
897 lxy_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],mainVertex);
898 lxyErr_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->lxyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
899 a0z_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0z(moms[1],cascadeVertices[1],mainVertex);
900 a0zErr_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0zError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
901 a0xy_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xy(moms[1],cascadeVertices[1],mainVertex);
902 a0xyErr_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
905 lxy_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],mainVertex);
906 lxyErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->lxyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
907 a0z_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0z(moms[0],cascadeVertices[0],mainVertex);
908 a0zErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0zError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
909 a0xy_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],mainVertex);
910 a0xyErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
912 lxy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],mainVertex);
913 lxyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
914 a0z_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0z(moms[1],cascadeVertices[1],mainVertex);
915 a0zErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0zError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
916 a0xy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xy(moms[1],cascadeVertices[1],mainVertex);
917 a0xyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
923 lxy_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],mainVertex);
924 lxyErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->lxyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
925 a0z_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0z(moms[0],cascadeVertices[0],mainVertex);
926 a0zErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0zError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
927 a0xy_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],mainVertex);
928 a0xyErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
931 lxy_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
932 lxyErr_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->lxyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
933 a0z_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0z(moms[0],cascadeVertices[0],cascadeVertices[1]);
934 a0zErr_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0zError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
935 a0xy_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],cascadeVertices[1]);
936 a0xyErr_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
937 lxy_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],mainVertex);
938 lxyErr_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->lxyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
939 a0xy_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0z(moms[1],cascadeVertices[1],mainVertex);
940 a0xyErr_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0zError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
941 a0z_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xy(moms[1],cascadeVertices[1],mainVertex);
942 a0zErr_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
946 lxy_SV2_decor(*cascadeVertices[ijx]) =
m_CascadeTools->lxy(moms[ijx],cascadeVertices[ijx],mainVertex);
947 lxyErr_SV2_decor(*cascadeVertices[ijx]) =
m_CascadeTools->lxyError(moms[ijx],cascade_info_pair.first->getCovariance()[ijx],cascadeVertices[ijx],mainVertex);
948 a0z_SV2_decor(*cascadeVertices[ijx]) =
m_CascadeTools->a0z(moms[ijx],cascadeVertices[ijx],mainVertex);
949 a0zErr_SV2_decor(*cascadeVertices[ijx]) =
m_CascadeTools->a0zError(moms[ijx],cascade_info_pair.first->getCovariance()[ijx],cascadeVertices[ijx],mainVertex);
950 a0xy_SV2_decor(*cascadeVertices[ijx]) =
m_CascadeTools->a0xy(moms[ijx],cascadeVertices[ijx],mainVertex);
951 a0xyErr_SV2_decor(*cascadeVertices[ijx]) =
m_CascadeTools->a0xyError(moms[ijx],cascade_info_pair.first->getCovariance()[ijx],cascadeVertices[ijx],mainVertex);
955 chi2_V2_decor(*cascadeVertices[ijx]) =
m_V0Tools->chisq(jxVtx);
956 ndof_V2_decor(*cascadeVertices[ijx]) =
m_V0Tools->ndof(jxVtx);
962 for(
size_t i=0; i<topoN; i++) {
963 VtxWriteHandles[i].ptr()->push_back(cascadeVertices[i]);
971 if( vertexLink1.
isValid() ) cascadeVertexLinks.push_back( vertexLink1 );
976 if( vertexLink2.
isValid() ) cascadeVertexLinks.push_back( vertexLink2 );
982 if( vertexLink3.
isValid() ) cascadeVertexLinks.push_back( vertexLink3 );
984 CascadeLinksDecor(*mainVertex) = cascadeVertexLinks;
987 if(cascade_info_pair.second) {
988 const std::vector<xAOD::Vertex*> &cascadeVertices_mvc = cascade_info_pair.second->vertices();
989 if(cascadeVertices_mvc.size() != topoN)
ATH_MSG_ERROR(
"Incorrect number of vertices (mvc)");
990 for(
size_t i=0; i<topoN; i++) {
991 if(cascadeVertices_mvc[i]==
nullptr)
ATH_MSG_ERROR(
"Error null vertex (mvc)");
993 cascade_info_pair.second->setSVOwnership(
false);
994 const auto mainVertex_mvc = cascadeVertices_mvc[topoN-1];
995 const std::vector< std::vector<TLorentzVector> > &moms_mvc = cascade_info_pair.second->getParticleMoms();
1000 else ijx_mvc = topoN-1;
1004 else ijx_mvc = topoN-1;
1009 else jxVtx_mvc =
FindVertex<2>(jxContainer.
ptr(), cascadeVertices_mvc[ijx_mvc]);
1017 Pt_decor(*mainVertex_mvc) =
m_CascadeTools->pT(moms_mvc[topoN-1]);
1018 PtErr_decor(*mainVertex_mvc) =
m_CascadeTools->pTError(moms_mvc[topoN-1],cascade_info_pair.second->getCovariance()[topoN-1]);
1019 chi2_decor(*mainVertex_mvc) = cascade_info_pair.second->fitChi2();
1020 ndof_decor(*mainVertex_mvc) = cascade_info_pair.second->nDoF();
1024 lxy_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxy(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1025 lxyErr_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1026 a0z_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0z(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1027 a0zErr_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0zError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1028 a0xy_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xy(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1029 a0xyErr_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1030 lxy_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1031 lxyErr_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1032 a0z_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0z(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1033 a0zErr_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0zError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1034 a0xy_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1035 a0xyErr_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1036 lxy_SV2_decor(*cascadeVertices_mvc[2]) =
m_CascadeTools->lxy(moms_mvc[2],cascadeVertices_mvc[2],mainVertex_mvc);
1037 lxyErr_SV2_decor(*cascadeVertices_mvc[2]) =
m_CascadeTools->lxyError(moms_mvc[2],cascade_info_pair.second->getCovariance()[2],cascadeVertices_mvc[2],mainVertex_mvc);
1038 a0z_SV2_decor(*cascadeVertices_mvc[2]) =
m_CascadeTools->a0z(moms_mvc[2],cascadeVertices_mvc[2],mainVertex_mvc);
1039 a0zErr_SV2_decor(*cascadeVertices_mvc[2]) =
m_CascadeTools->a0zError(moms_mvc[2],cascade_info_pair.second->getCovariance()[2],cascadeVertices_mvc[2],mainVertex_mvc);
1040 a0xy_SV2_decor(*cascadeVertices_mvc[2]) =
m_CascadeTools->a0xy(moms_mvc[2],cascadeVertices_mvc[2],mainVertex_mvc);
1041 a0xyErr_SV2_decor(*cascadeVertices_mvc[2]) =
m_CascadeTools->a0xyError(moms_mvc[2],cascade_info_pair.second->getCovariance()[2],cascadeVertices_mvc[2],mainVertex_mvc);
1044 lxy_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxy(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1045 lxyErr_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1046 a0z_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0z(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1047 a0zErr_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0zError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1048 a0xy_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xy(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1049 a0xyErr_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1050 lxy_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1051 lxyErr_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1052 a0z_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0z(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1053 a0zErr_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0zError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1054 a0xy_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1055 a0xyErr_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1060 lxy_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxy(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1061 lxyErr_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1062 a0z_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0z(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1063 a0zErr_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0zError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1064 a0xy_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xy(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1065 a0xyErr_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1066 lxy_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1067 lxyErr_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1068 a0z_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0z(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1069 a0zErr_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0zError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1070 a0xy_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1071 a0xyErr_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1074 lxy_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxy(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1075 lxyErr_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1076 a0z_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0z(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1077 a0zErr_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0zError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1078 a0xy_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xy(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1079 a0xyErr_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1081 lxy_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1082 lxyErr_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1083 a0z_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0z(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1084 a0zErr_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0zError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1085 a0xy_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1086 a0xyErr_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1092 lxy_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxy(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1093 lxyErr_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1094 a0z_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0z(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1095 a0zErr_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0zError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1096 a0xy_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xy(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1097 a0xyErr_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1100 lxy_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxy(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1101 lxyErr_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1102 a0z_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0z(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1103 a0zErr_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0zError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1104 a0xy_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xy(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1105 a0xyErr_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1106 lxy_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1107 lxyErr_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1108 a0xy_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0z(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1109 a0xyErr_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0zError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1110 a0z_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1111 a0zErr_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1114 lxy_SV2_decor(*cascadeVertices_mvc[ijx_mvc]) =
m_CascadeTools->lxy(moms_mvc[ijx_mvc],cascadeVertices_mvc[ijx_mvc],mainVertex_mvc);
1115 lxyErr_SV2_decor(*cascadeVertices_mvc[ijx_mvc]) =
m_CascadeTools->lxyError(moms_mvc[ijx_mvc],cascade_info_pair.second->getCovariance()[ijx_mvc],cascadeVertices_mvc[ijx_mvc],mainVertex_mvc);
1116 a0z_SV2_decor(*cascadeVertices_mvc[ijx_mvc]) =
m_CascadeTools->a0z(moms_mvc[ijx_mvc],cascadeVertices_mvc[ijx_mvc],mainVertex_mvc);
1117 a0zErr_SV2_decor(*cascadeVertices_mvc[ijx_mvc]) =
m_CascadeTools->a0zError(moms_mvc[ijx_mvc],cascade_info_pair.second->getCovariance()[ijx_mvc],cascadeVertices_mvc[ijx_mvc],mainVertex_mvc);
1118 a0xy_SV2_decor(*cascadeVertices_mvc[ijx_mvc]) =
m_CascadeTools->a0xy(moms_mvc[ijx_mvc],cascadeVertices_mvc[ijx_mvc],mainVertex_mvc);
1119 a0xyErr_SV2_decor(*cascadeVertices_mvc[ijx_mvc]) =
m_CascadeTools->a0xyError(moms_mvc[ijx_mvc],cascade_info_pair.second->getCovariance()[ijx_mvc],cascadeVertices_mvc[ijx_mvc],mainVertex_mvc);
1122 chi2_V2_decor(*cascadeVertices_mvc[ijx_mvc]) =
m_V0Tools->chisq(jxVtx_mvc);
1123 ndof_V2_decor(*cascadeVertices_mvc[ijx_mvc]) =
m_V0Tools->ndof(jxVtx_mvc);
1129 for(
size_t i=0; i<topoN; i++) {
1130 VtxWriteHandles_mvc[i].ptr()->push_back(cascadeVertices_mvc[i]);
1135 vertexLink1_mvc.
setElement(cascadeVertices_mvc[0]);
1137 if( vertexLink1_mvc.
isValid() ) cascadeVertexLinks_mvc.push_back( vertexLink1_mvc );
1140 vertexLink2_mvc.
setElement(cascadeVertices_mvc[1]);
1142 if( vertexLink2_mvc.
isValid() ) cascadeVertexLinks_mvc.push_back( vertexLink2_mvc );
1146 vertexLink3_mvc.
setElement(cascadeVertices_mvc[2]);
1148 if( vertexLink3_mvc.
isValid() ) cascadeVertexLinks_mvc.push_back( vertexLink3_mvc );
1150 CascadeLinksDecor(*mainVertex_mvc) = cascadeVertexLinks_mvc;
1154 vertexLink_mvc.
setElement(cascadeVertices[topoN-1]);
1156 if( vertexLink_mvc.
isValid() ) precedingVertexLinks_mvc.push_back( vertexLink_mvc );
1157 PrecedingLinksDecor(*mainVertex_mvc) = precedingVertexLinks_mvc;
1162 for (
auto cascade_info_pair : cascadeinfoContainer) {
1163 delete cascade_info_pair.first;
1164 delete cascade_info_pair.second;
1167 return StatusCode::SUCCESS;
1315 std::vector<std::pair<Trk::VxCascadeInfo*,Trk::VxCascadeInfo*> > result;
1317 std::vector<const xAOD::TrackParticle*> tracksJX;
1320 if (tracksJX.size() != massesJX.size()) {
1321 ATH_MSG_ERROR(
"Problems with JX input: number of tracks or track mass inputs is not correct!");
1325 if(std::find(tracksJX.cbegin(), tracksJX.cend(), V0vtx->
trackParticle(0)) != tracksJX.cend())
return result;
1326 if(std::find(tracksJX.cbegin(), tracksJX.cend(), V0vtx->
trackParticle(1)) != tracksJX.cend())
return result;
1327 std::vector<const xAOD::TrackParticle*> tracksV0;
1331 std::vector<const xAOD::TrackParticle*> tracksJpsi{tracksJX[0], tracksJX[1]};
1332 std::vector<const xAOD::TrackParticle*> tracksX;
1336 std::vector<double> massesV0;
1347 TLorentzVector p4_moth, p4_v0, tmp;
1353 for(
int it=0; it<V0_helper.
nRefTrks(); it++) {
1354 p4_moth += V0_helper.
refTrk(it,massesV0[it]);
1355 p4_v0 += V0_helper.
refTrk(it,massesV0[it]);
1366 std::unique_ptr<Trk::RecVertex> pv_AOD;
1367 if(pv_xAOD) pv_AOD = std::make_unique<Trk::RecVertex>(pv_xAOD->
position(),pv_xAOD->covariancePosition(),pv_xAOD->
numberDoF(),pv_xAOD->
chiSquared());
1390 std::vector<float> trk_px;
1391 std::vector<float> trk_py;
1392 std::vector<float> trk_pz;
1395 double main_mass = p4_moth.M();
1402 if (main_mass < m_MassLower || main_mass >
m_MassUpper)
return result;
1405 std::unique_ptr<Trk::IVKalState> state =
m_iVertexFitter->makeState(ctx);
1411 std::vector<Trk::VertexID> vrtList;
1420 vrtList.push_back(vID1);
1429 vrtList.push_back(vID2);
1431 std::vector<const xAOD::TrackParticle*> tp;
1432 std::vector<double> tp_masses;
1447 std::vector<Trk::VertexID> cnstV;
1454 std::vector<Trk::VertexID> cnstV;
1460 std::vector<Trk::VertexID> cnstV;
1466 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) );
1469 for(
auto& v : fit_result->vertices()) {
1470 if(v->nTrackParticles()==0) {
1471 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
1472 v->setTrackParticleLinks(nullLinkVector);
1479 fit_result->setSVOwnership(
true);
1482 double chi2DOF = fit_result->fitChi2()/fit_result->nDoF();
1485 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->getParticleMoms();
1486 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->vertices();
1487 size_t iMoth = cascadeVertices.size()-1;
1488 double lxy_SV1 =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[iMoth]);
1490 chi2_V1_decor(*cascadeVertices[0]) = V0vtx->
chiSquared();
1491 ndof_V1_decor(*cascadeVertices[0]) = V0vtx->
numberDoF();
1493 type_V1_decor(*cascadeVertices[0]) =
"Lambda";
1496 type_V1_decor(*cascadeVertices[0]) =
"Lambdabar";
1499 type_V1_decor(*cascadeVertices[0]) =
"Ks";
1501 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.
isAvailable(*V0vtx) ? mAcc_gfit(*V0vtx) : 0;
1502 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.
isAvailable(*V0vtx) ? mAcc_gmass(*V0vtx) : -1;
1503 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.
isAvailable(*V0vtx) ? mAcc_gmasserr(*V0vtx) : -1;
1504 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.
isAvailable(*V0vtx) ? mAcc_gchisq(*V0vtx) : 999999;
1505 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.
isAvailable(*V0vtx) ? mAcc_gndof(*V0vtx) : 0;
1506 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.
isAvailable(*V0vtx) ? mAcc_gprob(*V0vtx) : -1;
1507 trk_px.clear(); trk_py.clear(); trk_pz.clear();
1508 trk_px.reserve(V0_helper.
nRefTrks());
1509 trk_py.reserve(V0_helper.
nRefTrks());
1510 trk_pz.reserve(V0_helper.
nRefTrks());
1511 for(
auto&& vec3 : V0_helper.
refTrks()) {
1512 trk_px.push_back( vec3.Px() );
1513 trk_py.push_back( vec3.Py() );
1514 trk_pz.push_back( vec3.Pz() );
1516 trk_pxDeco(*cascadeVertices[0]) = std::move(trk_px);
1517 trk_pyDeco(*cascadeVertices[0]) = std::move(trk_py);
1518 trk_pzDeco(*cascadeVertices[0]) = std::move(trk_pz);
1520 result.push_back( std::make_pair(fit_result.release(),
nullptr) );
1526 std::vector<double> massesJXExtra = massesJX; massesJXExtra.push_back(
m_extraTrk1MassHypo);
1532 if(std::find(tracksJX.cbegin(),tracksJX.cend(),tpExtra) != tracksJX.cend())
continue;
1533 if(std::find(tracksV0.cbegin(),tracksV0.cend(),tpExtra) != tracksV0.cend())
continue;
1537 double main_mass = (p4_moth+tmp).M();
1544 if(main_mass < m_MassLower || main_mass >
m_MassUpper)
continue;
1546 std::vector<const xAOD::TrackParticle*> tracksExtra{tpExtra};
1547 std::vector<const xAOD::TrackParticle*> tracksJXExtra = tracksJX; tracksJXExtra.push_back(tpExtra);
1550 std::unique_ptr<Trk::IVKalState> state =
m_iVertexFitter->makeState(ctx);
1556 std::vector<Trk::VertexID> vrtList;
1557 std::vector<Trk::VertexID> vrtList2;
1567 vrtList.push_back(vID1);
1574 vrtList2.push_back(vID2);
1590 vrtList.push_back(vID1);
1594 vrtList.push_back(vID2);
1607 vID2 =
m_iVertexFitter->nextVertex(tracksJXExtra,massesJXExtra,vrtList,*state);
1612 std::vector<Trk::VertexID> cnstV;
1618 std::vector<Trk::VertexID> cnstV;
1624 std::vector<Trk::VertexID> cnstV;
1630 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) );
1633 for(
auto& v : fit_result->vertices()) {
1634 if(v->nTrackParticles()==0) {
1635 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
1636 v->setTrackParticleLinks(nullLinkVector);
1643 fit_result->setSVOwnership(
true);
1646 double chi2DOF = fit_result->fitChi2()/fit_result->nDoF();
1648 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->getParticleMoms();
1649 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->vertices();
1650 size_t iMoth = cascadeVertices.size()-1;
1653 lxy_SV1 =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
1656 lxy_SV1 =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[iMoth]);
1659 chi2_V1_decor(*cascadeVertices[0]) = V0vtx->
chiSquared();
1660 ndof_V1_decor(*cascadeVertices[0]) = V0vtx->
numberDoF();
1662 type_V1_decor(*cascadeVertices[0]) =
"Lambda";
1665 type_V1_decor(*cascadeVertices[0]) =
"Lambdabar";
1668 type_V1_decor(*cascadeVertices[0]) =
"Ks";
1670 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.
isAvailable(*V0vtx) ? mAcc_gfit(*V0vtx) : 0;
1671 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.
isAvailable(*V0vtx) ? mAcc_gmass(*V0vtx) : -1;
1672 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.
isAvailable(*V0vtx) ? mAcc_gmasserr(*V0vtx) : -1;
1673 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.
isAvailable(*V0vtx) ? mAcc_gchisq(*V0vtx) : 999999;
1674 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.
isAvailable(*V0vtx) ? mAcc_gndof(*V0vtx) : 0;
1675 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.
isAvailable(*V0vtx) ? mAcc_gprob(*V0vtx) : -1;
1676 trk_px.clear(); trk_py.clear(); trk_pz.clear();
1677 trk_px.reserve(V0_helper.
nRefTrks());
1678 trk_py.reserve(V0_helper.
nRefTrks());
1679 trk_pz.reserve(V0_helper.
nRefTrks());
1680 for(
auto&& vec3 : V0_helper.
refTrks()) {
1681 trk_px.push_back( vec3.Px() );
1682 trk_py.push_back( vec3.Py() );
1683 trk_pz.push_back( vec3.Pz() );
1685 trk_pxDeco(*cascadeVertices[0]) = trk_px;
1686 trk_pyDeco(*cascadeVertices[0]) = trk_py;
1687 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
1689 result.push_back( std::make_pair(fit_result.release(),
nullptr) );
1695 std::vector<const xAOD::TrackParticle*> tracksPlus;
1696 std::vector<const xAOD::TrackParticle*> tracksMinus;
1701 if(std::find(tracksJX.cbegin(),tracksJX.cend(),tpExtra) != tracksJX.cend())
continue;
1702 if(std::find(tracksV0.cbegin(),tracksV0.cend(),tpExtra) != tracksV0.cend())
continue;
1703 if(tpExtra->charge()>0) {
1704 tracksPlus.push_back(tpExtra);
1707 tracksMinus.push_back(tpExtra);
1712 TLorentzVector p4_ExtraTrk1, p4_ExtraTrk2;
1719 double main_mass = (p4_moth+p4_ExtraTrk1+p4_ExtraTrk2).M();
1727 if(main_mass < m_MassLower || main_mass >
m_MassUpper)
continue;
1729 if(D0.extraTrack1) D0Candidates.
push_back(D0);
1736 for(
auto&& D0 : D0Candidates.
vector()) {
1737 std::vector<const xAOD::TrackParticle*> tracksExtra{D0.extraTrack1,D0.extraTrack2};
1740 std::unique_ptr<Trk::IVKalState> state =
m_iVertexFitter->makeState(ctx);
1746 std::vector<Trk::VertexID> vrtList;
1755 vrtList.push_back(vID1);
1763 vrtList.push_back(vID2);
1772 std::vector<Trk::VertexID> cnstV;
1778 std::vector<Trk::VertexID> cnstV;
1784 std::vector<Trk::VertexID> cnstV;
1790 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) );
1793 for(
auto& v : fit_result->vertices()) {
1794 if(v->nTrackParticles()==0) {
1795 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
1796 v->setTrackParticleLinks(nullLinkVector);
1803 fit_result->setSVOwnership(
true);
1806 double chi2DOF = fit_result->fitChi2()/fit_result->nDoF();
1808 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->getParticleMoms();
1809 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->vertices();
1810 size_t iMoth = cascadeVertices.size()-1;
1811 double lxy_SV1 =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[iMoth]);
1812 double lxy_SV2 =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],cascadeVertices[iMoth]);
1814 chi2_V1_decor(*cascadeVertices[0]) = V0vtx->
chiSquared();
1815 ndof_V1_decor(*cascadeVertices[0]) = V0vtx->
numberDoF();
1817 type_V1_decor(*cascadeVertices[0]) =
"Lambda";
1820 type_V1_decor(*cascadeVertices[0]) =
"Lambdabar";
1823 type_V1_decor(*cascadeVertices[0]) =
"Ks";
1825 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.
isAvailable(*V0vtx) ? mAcc_gfit(*V0vtx) : 0;
1826 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.
isAvailable(*V0vtx) ? mAcc_gmass(*V0vtx) : -1;
1827 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.
isAvailable(*V0vtx) ? mAcc_gmasserr(*V0vtx) : -1;
1828 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.
isAvailable(*V0vtx) ? mAcc_gchisq(*V0vtx) : 999999;
1829 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.
isAvailable(*V0vtx) ? mAcc_gndof(*V0vtx) : 0;
1830 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.
isAvailable(*V0vtx) ? mAcc_gprob(*V0vtx) : -1;
1831 trk_px.clear(); trk_py.clear(); trk_pz.clear();
1832 trk_px.reserve(V0_helper.
nRefTrks());
1833 trk_py.reserve(V0_helper.
nRefTrks());
1834 trk_pz.reserve(V0_helper.
nRefTrks());
1835 for(
auto&& vec3 : V0_helper.
refTrks()) {
1836 trk_px.push_back( vec3.Px() );
1837 trk_py.push_back( vec3.Py() );
1838 trk_pz.push_back( vec3.Pz() );
1840 trk_pxDeco(*cascadeVertices[0]) = trk_px;
1841 trk_pyDeco(*cascadeVertices[0]) = trk_py;
1842 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
1844 result.push_back( std::make_pair(fit_result.release(),
nullptr) );
1850 std::vector<const xAOD::TrackParticle*> tracksPlus;
1851 std::vector<const xAOD::TrackParticle*> tracksMinus;
1854 if( tpExtra->pt() < minTrkPt )
continue;
1857 if(std::find(tracksJX.cbegin(),tracksJX.cend(),tpExtra) != tracksJX.cend())
continue;
1858 if(std::find(tracksV0.cbegin(),tracksV0.cend(),tpExtra) != tracksV0.cend())
continue;
1859 if(tpExtra->charge()>0) {
1860 tracksPlus.push_back(tpExtra);
1863 tracksMinus.push_back(tpExtra);
1868 TLorentzVector p4_ExtraTrk1, p4_ExtraTrk2, p4_ExtraTrk3;
1872 for(
auto tp2Itr=tracksMinus.cbegin(); tp2Itr!=tracksMinus.cend(); ++tp2Itr) {
1874 for(
auto tp3Itr=tp2Itr+1; tp3Itr!=tracksMinus.cend(); ++tp3Itr) {
1881 double main_mass = (p4_moth+p4_ExtraTrk1+p4_ExtraTrk2+p4_ExtraTrk3).M();
1887 if(
m_massDpm>0) main_mass += - (p4_ExtraTrk1+p4_ExtraTrk2+p4_ExtraTrk3).M() +
m_massDpm;
1889 if(main_mass < m_MassLower || main_mass >
m_MassUpper)
continue;
1891 if(Dpm.extraTrack1) DpmCandidates.
push_back(Dpm);
1899 for(
auto tp2Itr=tracksPlus.cbegin(); tp2Itr!=tracksPlus.cend(); ++tp2Itr) {
1901 for(
auto tp3Itr=tp2Itr+1; tp3Itr!=tracksPlus.cend(); ++tp3Itr) {
1908 double main_mass = (p4_moth+p4_ExtraTrk1+p4_ExtraTrk2+p4_ExtraTrk3).M();
1914 if(
m_massDpm>0) main_mass += - (p4_ExtraTrk1+p4_ExtraTrk2+p4_ExtraTrk3).M() +
m_massDpm;
1916 if(main_mass < m_MassLower || main_mass >
m_MassUpper)
continue;
1918 if(Dpm.extraTrack1) DpmCandidates.
push_back(Dpm);
1926 for(
auto&& Dpm : DpmCandidates.
vector()) {
1927 std::vector<const xAOD::TrackParticle*> tracksExtra{Dpm.extraTrack1,Dpm.extraTrack2,Dpm.extraTrack3};
1930 std::unique_ptr<Trk::IVKalState> state =
m_iVertexFitter->makeState(ctx);
1936 std::vector<Trk::VertexID> vrtList;
1937 std::vector<Trk::VertexID> vrtList2;
1947 vrtList.push_back(vID1);
1955 vrtList2.push_back(vID2);
1962 vrtList2.push_back(vID3);
1964 std::vector<const xAOD::TrackParticle*> tp;
1965 std::vector<double> tp_masses;
1972 std::vector<Trk::VertexID> cnstV;
1978 std::vector<Trk::VertexID> cnstV;
1984 std::vector<Trk::VertexID> cnstV;
1998 vrtList.push_back(vID1);
2006 vrtList.push_back(vID2);
2015 std::vector<Trk::VertexID> cnstV;
2021 std::vector<Trk::VertexID> cnstV;
2027 std::vector<Trk::VertexID> cnstV;
2034 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) );
2037 for(
auto& v : fit_result->vertices()) {
2038 if(v->nTrackParticles()==0) {
2039 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
2040 v->setTrackParticleLinks(nullLinkVector);
2047 fit_result->setSVOwnership(
true);
2050 double chi2DOF = fit_result->fitChi2()/fit_result->nDoF();
2052 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->getParticleMoms();
2053 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->vertices();
2054 size_t iMoth = cascadeVertices.size()-1;
2055 double lxy_SV1(0), lxy_SV2(0);
2057 lxy_SV1 =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
2058 lxy_SV2 =
m_CascadeTools->lxy(moms[2],cascadeVertices[2],cascadeVertices[iMoth]);
2061 lxy_SV1 =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[iMoth]);
2062 lxy_SV2 =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],cascadeVertices[iMoth]);
2065 chi2_V1_decor(*cascadeVertices[0]) = V0vtx->
chiSquared();
2066 ndof_V1_decor(*cascadeVertices[0]) = V0vtx->
numberDoF();
2068 type_V1_decor(*cascadeVertices[0]) =
"Lambda";
2071 type_V1_decor(*cascadeVertices[0]) =
"Lambdabar";
2074 type_V1_decor(*cascadeVertices[0]) =
"Ks";
2076 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.
isAvailable(*V0vtx) ? mAcc_gfit(*V0vtx) : 0;
2077 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.
isAvailable(*V0vtx) ? mAcc_gmass(*V0vtx) : -1;
2078 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.
isAvailable(*V0vtx) ? mAcc_gmasserr(*V0vtx) : -1;
2079 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.
isAvailable(*V0vtx) ? mAcc_gchisq(*V0vtx) : 999999;
2080 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.
isAvailable(*V0vtx) ? mAcc_gndof(*V0vtx) : 0;
2081 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.
isAvailable(*V0vtx) ? mAcc_gprob(*V0vtx) : -1;
2082 trk_px.clear(); trk_py.clear(); trk_pz.clear();
2083 trk_px.reserve(V0_helper.
nRefTrks());
2084 trk_py.reserve(V0_helper.
nRefTrks());
2085 trk_pz.reserve(V0_helper.
nRefTrks());
2086 for(
auto&& vec3 : V0_helper.
refTrks()) {
2087 trk_px.push_back( vec3.Px() );
2088 trk_py.push_back( vec3.Py() );
2089 trk_pz.push_back( vec3.Pz() );
2091 trk_pxDeco(*cascadeVertices[0]) = trk_px;
2092 trk_pyDeco(*cascadeVertices[0]) = trk_py;
2093 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
2097 TLorentzVector totalMom;
2098 for(
size_t it=0; it<moms[iMoth].size(); it++) totalMom += moms[iMoth][it];
2099 double mainV_mass = totalMom.M();
2101 std::unique_ptr<Trk::IVKalState> state_mvc =
m_iVertexFitter->makeState(ctx);
2102 int robustness_mvc = 0;
2104 std::vector<Trk::VertexID> vrtList_mvc;
2105 std::vector<Trk::VertexID> vrtList2_mvc;
2111 vID1_mvc =
m_iVertexFitter->startVertex(tracksV0,massesV0,*state_mvc);
2113 vrtList_mvc.push_back(vID1_mvc);
2118 vID2_mvc =
m_iVertexFitter->nextVertex(tracksJX,massesJX,vrtList_mvc,*state_mvc);
2120 vrtList2_mvc.push_back(vID2_mvc);
2125 vID3_mvc =
m_iVertexFitter->nextVertex(tracksExtra,massesExtra,*state_mvc);
2127 vrtList2_mvc.push_back(vID3_mvc);
2128 std::vector<const xAOD::TrackParticle*> tp;
2129 std::vector<double> tp_masses;
2132 std::vector<Trk::VertexID> cnstV_mvc;
2138 std::vector<Trk::VertexID> cnstV_mvc;
2144 std::vector<Trk::VertexID> cnstV_mvc;
2155 vID1_mvc =
m_iVertexFitter->startVertex(tracksV0,massesV0,*state_mvc);
2157 vrtList_mvc.push_back(vID1_mvc);
2162 vID2_mvc =
m_iVertexFitter->nextVertex(tracksExtra,massesExtra,*state_mvc);
2164 vrtList_mvc.push_back(vID2_mvc);
2167 std::vector<Trk::VertexID> cnstV_mvc;
2173 std::vector<Trk::VertexID> cnstV_mvc;
2179 std::vector<Trk::VertexID> cnstV_mvc;
2186 std::unique_ptr<Trk::VxCascadeInfo> fit_result_mvc = std::unique_ptr<Trk::VxCascadeInfo>(
m_iVertexFitter->fitCascade(*state_mvc, pv_AOD.get(), pv_AOD.get() &&
m_firstDecayAtPV ?
true :
false) );
2188 if (fit_result_mvc) {
2189 for(
auto& v : fit_result_mvc->vertices()) {
2190 if(v->nTrackParticles()==0) {
2191 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
2192 v->setTrackParticleLinks(nullLinkVector);
2196 fit_result_mvc->setSVOwnership(
true);
2197 chi2_V1_decor(*cascadeVertices[0]) = V0vtx->
chiSquared();
2198 ndof_V1_decor(*cascadeVertices[0]) = V0vtx->
numberDoF();
2200 type_V1_decor(*cascadeVertices[0]) =
"Lambda";
2203 type_V1_decor(*cascadeVertices[0]) =
"Lambdabar";
2206 type_V1_decor(*cascadeVertices[0]) =
"Ks";
2208 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.
isAvailable(*V0vtx) ? mAcc_gfit(*V0vtx) : 0;
2209 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.
isAvailable(*V0vtx) ? mAcc_gmass(*V0vtx) : -1;
2210 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.
isAvailable(*V0vtx) ? mAcc_gmasserr(*V0vtx) : -1;
2211 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.
isAvailable(*V0vtx) ? mAcc_gchisq(*V0vtx) : 999999;
2212 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.
isAvailable(*V0vtx) ? mAcc_gndof(*V0vtx) : 0;
2213 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.
isAvailable(*V0vtx) ? mAcc_gprob(*V0vtx) : -1;
2214 trk_px.clear(); trk_py.clear(); trk_pz.clear();
2215 trk_px.reserve(V0_helper.
nRefTrks());
2216 trk_py.reserve(V0_helper.
nRefTrks());
2217 trk_pz.reserve(V0_helper.
nRefTrks());
2218 for(
auto&& vec3 : V0_helper.
refTrks()) {
2219 trk_px.push_back( vec3.Px() );
2220 trk_py.push_back( vec3.Py() );
2221 trk_pz.push_back( vec3.Pz() );
2223 trk_pxDeco(*cascadeVertices[0]) = trk_px;
2224 trk_pyDeco(*cascadeVertices[0]) = trk_py;
2225 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
2227 result.push_back( std::make_pair(fit_result.release(),fit_result_mvc.release()) );
2229 else result.push_back( std::make_pair(fit_result.release(),
nullptr) );
2231 else result.push_back( std::make_pair(fit_result.release(),
nullptr) );
2233 else result.push_back( std::make_pair(fit_result.release(),
nullptr) );
2240 for(
auto cascade_info_pair : result) {
2241 if(cascade_info_pair.first && cascade_info_pair.first->getParticleMoms().size()>0) {
2242 size_t index = cascade_info_pair.first->getParticleMoms().size() - 1;
2243 const std::vector<TLorentzVector> &mom = cascade_info_pair.first->getParticleMoms()[
index];
2247 bool isInDefaultPVCont =
false;
2249 if(pv_xAOD == pvVtx) { isInDefaultPVCont =
true;
break; }
2251 if(isInDefaultPVCont) vtx.
setPv( pv_xAOD, defaultPVContainer, pvtype );
2252 else vtx.
setPv( pv_xAOD, pvContainer, pvtype );
2253 if(origPv_xAOD) vtx.
setOrigPv( origPv_xAOD, defaultPVContainer, pvtype );
2269 if(cascade_info_pair.second && cascade_info_pair.second->getParticleMoms().size()>0) {
2270 index = cascade_info_pair.second->getParticleMoms().size() - 1;
2271 const std::vector<TLorentzVector> &mom_mvc = cascade_info_pair.second->getParticleMoms()[
index];
2273 const xAOD::Vertex* mainVertex_mvc = cascade_info_pair.second->vertices()[
index];
2275 if(isInDefaultPVCont) vtx_mvc.
setPv( pv_xAOD, defaultPVContainer, pvtype );
2276 else vtx_mvc.
setPv( pv_xAOD, pvContainer, pvtype );
2277 if(origPv_xAOD) vtx.
setOrigPv( origPv_xAOD, defaultPVContainer, pvtype );
2301 std::vector<std::pair<Trk::VxCascadeInfo*,Trk::VxCascadeInfo*> > result;
2303 std::vector<const xAOD::TrackParticle*> tracksJX;
2306 if (tracksJX.size() != massesJX.size()) {
2307 ATH_MSG_ERROR(
"Problems with JX input: number of tracks or track mass inputs is not correct!");
2311 if(std::find(tracksJX.cbegin(), tracksJX.cend(), disVtx.
V0vtx->
trackParticle(0)) != tracksJX.cend())
return result;
2312 if(std::find(tracksJX.cbegin(), tracksJX.cend(), disVtx.
V0vtx->
trackParticle(1)) != tracksJX.cend())
return result;
2313 std::vector<const xAOD::TrackParticle*> tracksV0;
2317 if(std::find(tracksJX.cbegin(), tracksJX.cend(), disVtx.
track) != tracksJX.cend())
return result;
2318 std::vector<const xAOD::TrackParticle*> tracks3{disVtx.
track};
2321 std::vector<const xAOD::TrackParticle*> tracksJpsi{tracksJX[0], tracksJX[1]};
2322 std::vector<const xAOD::TrackParticle*> tracksX;
2326 std::vector<double> massesV0;
2339 TLorentzVector p4_moth, p4_disV, tmp;
2355 std::unique_ptr<Trk::RecVertex> pv_AOD;
2356 if(pv_xAOD) pv_AOD = std::make_unique<Trk::RecVertex>(pv_xAOD->
position(),pv_xAOD->covariancePosition(),pv_xAOD->
numberDoF(),pv_xAOD->
chiSquared());
2382 std::vector<float> trk_px;
2383 std::vector<float> trk_py;
2384 std::vector<float> trk_pz;
2387 double main_mass = p4_moth.M();
2393 if (main_mass < m_MassLower || main_mass >
m_MassUpper)
return result;
2396 std::unique_ptr<Trk::IVKalState> state =
m_iVertexFitter->makeState(ctx);
2402 std::vector<Trk::VertexID> vrtList;
2403 std::vector<Trk::VertexID> vrtList2;
2412 vrtList.push_back(vID1);
2418 vID2 =
m_iVertexFitter->nextVertex(tracks3,massesDis3,vrtList,*state);
2420 vrtList2.push_back(vID2);
2429 vrtList2.push_back(vID3);
2431 std::vector<const xAOD::TrackParticle*> tp;
2432 std::vector<double> tp_masses;
2444 vID3 =
m_iVertexFitter->nextVertex(tracksJX,massesJX,vrtList2,*state);
2447 std::vector<Trk::VertexID> cnstV;
2454 std::vector<Trk::VertexID> cnstV;
2460 std::vector<Trk::VertexID> cnstV;
2466 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) );
2469 for(
auto& v : fit_result->vertices()) {
2470 if(v->nTrackParticles()==0) {
2471 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
2472 v->setTrackParticleLinks(nullLinkVector);
2479 fit_result->setSVOwnership(
true);
2482 double chi2DOF = fit_result->fitChi2()/fit_result->nDoF();
2485 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->getParticleMoms();
2486 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->vertices();
2487 size_t iMoth = cascadeVertices.size()-1;
2488 double lxy_SV1_sub =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
2489 double lxy_SV1 =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],cascadeVertices[iMoth]);
2495 type_V0_decor(*cascadeVertices[0]) =
"Lambda";
2498 type_V0_decor(*cascadeVertices[0]) =
"Lambdabar";
2501 type_V0_decor(*cascadeVertices[0]) =
"Ks";
2503 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.
isAvailable(*disVtx.
V0vtx) ? mAcc_gfit(*disVtx.
V0vtx) : 0;
2504 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.
isAvailable(*disVtx.
V0vtx) ? mAcc_gmass(*disVtx.
V0vtx) : -1;
2505 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.
isAvailable(*disVtx.
V0vtx) ? mAcc_gmasserr(*disVtx.
V0vtx) : -1;
2506 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.
isAvailable(*disVtx.
V0vtx) ? mAcc_gchisq(*disVtx.
V0vtx) : 999999;
2507 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.
isAvailable(*disVtx.
V0vtx) ? mAcc_gndof(*disVtx.
V0vtx) : 0;
2508 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.
isAvailable(*disVtx.
V0vtx) ? mAcc_gprob(*disVtx.
V0vtx) : -1;
2509 trk_px.clear(); trk_py.clear(); trk_pz.clear();
2513 trk_pxDeco(*cascadeVertices[0]) = std::move(trk_px);
2514 trk_pyDeco(*cascadeVertices[0]) = std::move(trk_py);
2515 trk_pzDeco(*cascadeVertices[0]) = std::move(trk_pz);
2516 trk_px_deco(*cascadeVertices[1]) = disVtx.
p4_disVtrack.Px();
2517 trk_py_deco(*cascadeVertices[1]) = disVtx.
p4_disVtrack.Py();
2518 trk_pz_deco(*cascadeVertices[1]) = disVtx.
p4_disVtrack.Pz();
2520 result.push_back( std::make_pair(fit_result.release(),
nullptr) );
2526 std::vector<double> massesJXExtra = massesJX; massesJXExtra.push_back(
m_extraTrk1MassHypo);
2530 if ( !
m_trkSelector->decision(*tpExtra,
nullptr) )
continue;
2532 if(std::find(tracksJX.cbegin(),tracksJX.cend(),tpExtra) != tracksJX.cend())
continue;
2533 if(std::find(tracksV0.cbegin(),tracksV0.cend(),tpExtra) != tracksV0.cend())
continue;
2534 if(tpExtra == disVtx.
track)
continue;
2538 double main_mass = (p4_moth+tmp).M();
2544 if (main_mass < m_MassLower || main_mass >
m_MassUpper)
continue;
2546 std::vector<const xAOD::TrackParticle*> tracksExtra{tpExtra};
2547 std::vector<const xAOD::TrackParticle*> tracksJXExtra = tracksJX; tracksJXExtra.push_back(tpExtra);
2550 std::unique_ptr<Trk::IVKalState> state =
m_iVertexFitter->makeState(ctx);
2556 std::vector<Trk::VertexID> vrtList;
2557 std::vector<Trk::VertexID> vrtList2;
2566 vrtList.push_back(vID1);
2572 vID2 =
m_iVertexFitter->nextVertex(tracks3,massesDis3,vrtList,*state);
2574 vrtList2.push_back(vID2);
2579 vrtList2.push_back(vID3);
2592 vID3 =
m_iVertexFitter->nextVertex(tracksJXExtra,massesJXExtra,vrtList2,*state);
2596 std::vector<Trk::VertexID> cnstV;
2602 std::vector<Trk::VertexID> cnstV;
2608 std::vector<Trk::VertexID> cnstV;
2614 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) );
2617 for(
auto& v : fit_result->vertices()) {
2618 if(v->nTrackParticles()==0) {
2619 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
2620 v->setTrackParticleLinks(nullLinkVector);
2627 fit_result->setSVOwnership(
true);
2630 double chi2DOF = fit_result->fitChi2()/fit_result->nDoF();
2633 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->getParticleMoms();
2634 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->vertices();
2635 size_t iMoth = cascadeVertices.size()-1;
2636 double lxy_SV1_sub =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
2637 double lxy_SV1 =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],cascadeVertices[iMoth]);
2643 type_V0_decor(*cascadeVertices[0]) =
"Lambda";
2646 type_V0_decor(*cascadeVertices[0]) =
"Lambdabar";
2649 type_V0_decor(*cascadeVertices[0]) =
"Ks";
2651 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.
isAvailable(*disVtx.
V0vtx) ? mAcc_gfit(*disVtx.
V0vtx) : 0;
2652 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.
isAvailable(*disVtx.
V0vtx) ? mAcc_gmass(*disVtx.
V0vtx) : -1;
2653 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.
isAvailable(*disVtx.
V0vtx) ? mAcc_gmasserr(*disVtx.
V0vtx) : -1;
2654 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.
isAvailable(*disVtx.
V0vtx) ? mAcc_gchisq(*disVtx.
V0vtx) : 999999;
2655 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.
isAvailable(*disVtx.
V0vtx) ? mAcc_gndof(*disVtx.
V0vtx) : 0;
2656 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.
isAvailable(*disVtx.
V0vtx) ? mAcc_gprob(*disVtx.
V0vtx) : -1;
2657 trk_px.clear(); trk_py.clear(); trk_pz.clear();
2661 trk_pxDeco(*cascadeVertices[0]) = trk_px;
2662 trk_pyDeco(*cascadeVertices[0]) = trk_py;
2663 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
2664 trk_px_deco(*cascadeVertices[1]) = disVtx.
p4_disVtrack.Px();
2665 trk_py_deco(*cascadeVertices[1]) = disVtx.
p4_disVtrack.Py();
2666 trk_pz_deco(*cascadeVertices[1]) = disVtx.
p4_disVtrack.Pz();
2668 result.push_back( std::make_pair(fit_result.release(),
nullptr) );
2675 for(
auto cascade_info_pair : result) {
2676 if(cascade_info_pair.first && cascade_info_pair.first->getParticleMoms().size()>0) {
2677 size_t index = cascade_info_pair.first->getParticleMoms().size() - 1;
2678 const std::vector<TLorentzVector> &mom = cascade_info_pair.first->getParticleMoms()[
index];
2682 bool isInDefaultPVCont =
false;
2684 if(pv_xAOD == pvVtx) { isInDefaultPVCont =
true;
break; }
2686 if(isInDefaultPVCont) vtx.
setPv( pv_xAOD, defaultPVContainer, pvtype );
2687 else vtx.
setPv( pv_xAOD, pvContainer, pvtype );
2688 if(origPv_xAOD) vtx.
setOrigPv( origPv_xAOD, defaultPVContainer, pvtype );