562 ATH_MSG_FATAL(
"Incorrect number of output cascade vertices");
563 return StatusCode::FAILURE;
566 ATH_MSG_FATAL(
"Incorrect number of output (mvc) cascade vertices");
567 return StatusCode::FAILURE;
570 std::array<SG::WriteHandle<xAOD::VertexContainer>, 4> VtxWriteHandles;
int ikey(0);
573 ATH_CHECK( VtxWriteHandles[ikey].record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()) );
576 std::array<SG::WriteHandle<xAOD::VertexContainer>, 4> VtxWriteHandles_mvc;
int ikey_mvc(0);
580 ATH_CHECK( VtxWriteHandles_mvc[ikey_mvc].record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()) );
591 if (defaultPVContainer.
cptr()->size()==0) {
593 return StatusCode::RECOVERABLE;
595 else primaryVertex = (*defaultPVContainer.
cptr())[0];
603 ATH_CHECK( refPvContainer.
record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()) );
611 std::vector<const xAOD::TrackParticleContainer*> trackCols;
615 trackCols.push_back(handle.
cptr());
622 ATH_CHECK( V0OutputContainer.
record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()) );
629 if(jxContainer->size()==0)
return StatusCode::SUCCESS;
632 std::vector<const xAOD::TrackParticle*> tracksDisplaced;
641 if(!
m_useTRT && nclus == 0)
continue;
643 bool trk_cut =
false;
644 if(nclus != 0) trk_cut =
true;
645 if(nclus == 0 && TP->pt()>=
m_ptTRT) trk_cut =
true;
646 if(!trk_cut)
continue;
649 if(!
d0Pass(TP,primaryVertex))
continue;
651 tracksDisplaced.push_back(TP);
662 std::vector<std::pair<const xAOD::Vertex*,V0Enum> > selectedV0Candidates;
670 std::string type_V0Vtx;
671 if(mAcc_type.
isAvailable(*vtx)) type_V0Vtx = mAcc_type(*vtx);
674 if(type_V0Vtx ==
"Lambda") {
679 else if(type_V0Vtx ==
"Lambdabar") {
684 else if(type_V0Vtx ==
"Ks") {
694 int gamma_fit = mAcc_gfit.
isAvailable(*vtx) ? mAcc_gfit(*vtx) : 0;
695 double gamma_mass = mAcc_gmass.
isAvailable(*vtx) ? mAcc_gmass(*vtx) : -1;
696 double gamma_chisq = mAcc_gchisq.
isAvailable(*vtx) ? mAcc_gchisq(*vtx) : 999999;
697 double gamma_ndof = mAcc_gndof.
isAvailable(*vtx) ? mAcc_gndof(*vtx) : 0;
700 selectedV0Candidates.push_back(std::pair<const xAOD::Vertex*,V0Enum>{vtx,opt});
708 std::string type_V0Vtx;
709 if(mAcc_type.
isAvailable(*vtx)) type_V0Vtx = mAcc_type(*vtx);
712 if(type_V0Vtx ==
"Lambda") {
717 else if(type_V0Vtx ==
"Lambdabar") {
722 else if(type_V0Vtx ==
"Ks") {
732 int gamma_fit = mAcc_gfit.
isAvailable(*vtx) ? mAcc_gfit(*vtx) : 0;
733 double gamma_mass = mAcc_gmass.
isAvailable(*vtx) ? mAcc_gmass(*vtx) : -1;
734 double gamma_chisq = mAcc_gchisq.
isAvailable(*vtx) ? mAcc_gchisq(*vtx) : 999999;
735 double gamma_ndof = mAcc_gndof.
isAvailable(*vtx) ? mAcc_gndof(*vtx) : 0;
738 selectedV0Candidates.push_back(std::pair<const xAOD::Vertex*,V0Enum>{vtx,opt});
743 std::sort( selectedV0Candidates.begin(), selectedV0Candidates.end(), [](std::pair<const xAOD::Vertex*,V0Enum>&
a, std::pair<const xAOD::Vertex*,V0Enum>& b) { 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(), [](std::pair<Trk::VxCascadeInfo*, Trk::VxCascadeInfo*>
a, std::pair<Trk::VxCascadeInfo*, Trk::VxCascadeInfo*> b) { return a.first->fitChi2()/a.first->nDoF() < b.first->fitChi2()/b.first->nDoF(); } );
755 for(
auto it=cascadeinfoContainer.begin()+
m_maxMainVCandidates; it!=cascadeinfoContainer.end(); it++) {
756 if(it->first)
delete it->first;
757 if(it->second)
delete it->second;
759 cascadeinfoContainer.erase(cascadeinfoContainer.begin()+
m_maxMainVCandidates, cascadeinfoContainer.end());
761 if(cascadeinfoContainer.size()==0)
return StatusCode::SUCCESS;
800 for(
auto cascade_info_pair : cascadeinfoContainer) {
801 if(cascade_info_pair.first==
nullptr) {
806 const std::vector<xAOD::Vertex*> &cascadeVertices = cascade_info_pair.first->vertices();
807 if(cascadeVertices.size() != topoN)
ATH_MSG_ERROR(
"Incorrect number of vertices");
808 for(
size_t i=0; i<topoN; i++) {
809 if(cascadeVertices[i]==
nullptr)
ATH_MSG_ERROR(
"Error null vertex");
812 cascade_info_pair.first->setSVOwnership(
false);
813 const auto mainVertex = cascadeVertices[topoN-1];
814 const std::vector< std::vector<TLorentzVector> > &moms = cascade_info_pair.first->getParticleMoms();
846 PtErr_decor(*mainVertex) =
m_CascadeTools->pTError(moms[topoN-1],cascade_info_pair.first->getCovariance()[topoN-1]);
848 chi2_decor(*mainVertex) = cascade_info_pair.first->fitChi2();
849 ndof_decor(*mainVertex) = cascade_info_pair.first->nDoF();
853 lxy_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
854 lxyErr_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->lxyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
855 a0z_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0z(moms[0],cascadeVertices[0],cascadeVertices[1]);
856 a0zErr_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0zError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
857 a0xy_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],cascadeVertices[1]);
858 a0xyErr_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
859 lxy_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],mainVertex);
860 lxyErr_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->lxyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
861 a0z_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0z(moms[1],cascadeVertices[1],mainVertex);
862 a0zErr_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0zError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
863 a0xy_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xy(moms[1],cascadeVertices[1],mainVertex);
864 a0xyErr_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
865 lxy_SV2_decor(*cascadeVertices[2]) =
m_CascadeTools->lxy(moms[2],cascadeVertices[2],mainVertex);
866 lxyErr_SV2_decor(*cascadeVertices[2]) =
m_CascadeTools->lxyError(moms[2],cascade_info_pair.first->getCovariance()[2],cascadeVertices[2],mainVertex);
867 a0z_SV2_decor(*cascadeVertices[2]) =
m_CascadeTools->a0z(moms[2],cascadeVertices[2],mainVertex);
868 a0zErr_SV2_decor(*cascadeVertices[2]) =
m_CascadeTools->a0zError(moms[2],cascade_info_pair.first->getCovariance()[2],cascadeVertices[2],mainVertex);
869 a0xy_SV2_decor(*cascadeVertices[2]) =
m_CascadeTools->a0xy(moms[2],cascadeVertices[2],mainVertex);
870 a0xyErr_SV2_decor(*cascadeVertices[2]) =
m_CascadeTools->a0xyError(moms[2],cascade_info_pair.first->getCovariance()[2],cascadeVertices[2],mainVertex);
873 lxy_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],mainVertex);
874 lxyErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->lxyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
875 a0z_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0z(moms[0],cascadeVertices[0],mainVertex);
876 a0zErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0zError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
877 a0xy_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],mainVertex);
878 a0xyErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
879 lxy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],mainVertex);
880 lxyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
881 a0z_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0z(moms[1],cascadeVertices[1],mainVertex);
882 a0zErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0zError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
883 a0xy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xy(moms[1],cascadeVertices[1],mainVertex);
884 a0xyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
889 lxy_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
890 lxyErr_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->lxyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
891 a0z_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0z(moms[0],cascadeVertices[0],cascadeVertices[1]);
892 a0zErr_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0zError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
893 a0xy_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],cascadeVertices[1]);
894 a0xyErr_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
895 lxy_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],mainVertex);
896 lxyErr_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->lxyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
897 a0z_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0z(moms[1],cascadeVertices[1],mainVertex);
898 a0zErr_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0zError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
899 a0xy_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xy(moms[1],cascadeVertices[1],mainVertex);
900 a0xyErr_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
903 lxy_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],mainVertex);
904 lxyErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->lxyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
905 a0z_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0z(moms[0],cascadeVertices[0],mainVertex);
906 a0zErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0zError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
907 a0xy_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],mainVertex);
908 a0xyErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
910 lxy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],mainVertex);
911 lxyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
912 a0z_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0z(moms[1],cascadeVertices[1],mainVertex);
913 a0zErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0zError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
914 a0xy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xy(moms[1],cascadeVertices[1],mainVertex);
915 a0xyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
921 lxy_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],mainVertex);
922 lxyErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->lxyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
923 a0z_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0z(moms[0],cascadeVertices[0],mainVertex);
924 a0zErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0zError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
925 a0xy_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],mainVertex);
926 a0xyErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
929 lxy_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
930 lxyErr_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->lxyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
931 a0z_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0z(moms[0],cascadeVertices[0],cascadeVertices[1]);
932 a0zErr_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0zError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
933 a0xy_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],cascadeVertices[1]);
934 a0xyErr_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
935 lxy_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],mainVertex);
936 lxyErr_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->lxyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
937 a0xy_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0z(moms[1],cascadeVertices[1],mainVertex);
938 a0xyErr_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0zError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
939 a0z_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xy(moms[1],cascadeVertices[1],mainVertex);
940 a0zErr_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
944 lxy_SV2_decor(*cascadeVertices[ijx]) =
m_CascadeTools->lxy(moms[ijx],cascadeVertices[ijx],mainVertex);
945 lxyErr_SV2_decor(*cascadeVertices[ijx]) =
m_CascadeTools->lxyError(moms[ijx],cascade_info_pair.first->getCovariance()[ijx],cascadeVertices[ijx],mainVertex);
946 a0z_SV2_decor(*cascadeVertices[ijx]) =
m_CascadeTools->a0z(moms[ijx],cascadeVertices[ijx],mainVertex);
947 a0zErr_SV2_decor(*cascadeVertices[ijx]) =
m_CascadeTools->a0zError(moms[ijx],cascade_info_pair.first->getCovariance()[ijx],cascadeVertices[ijx],mainVertex);
948 a0xy_SV2_decor(*cascadeVertices[ijx]) =
m_CascadeTools->a0xy(moms[ijx],cascadeVertices[ijx],mainVertex);
949 a0xyErr_SV2_decor(*cascadeVertices[ijx]) =
m_CascadeTools->a0xyError(moms[ijx],cascade_info_pair.first->getCovariance()[ijx],cascadeVertices[ijx],mainVertex);
953 chi2_V2_decor(*cascadeVertices[ijx]) =
m_V0Tools->chisq(jxVtx);
954 ndof_V2_decor(*cascadeVertices[ijx]) =
m_V0Tools->ndof(jxVtx);
960 for(
size_t i=0; i<topoN; i++) {
961 VtxWriteHandles[i].ptr()->push_back(cascadeVertices[i]);
969 if( vertexLink1.
isValid() ) cascadeVertexLinks.push_back( vertexLink1 );
974 if( vertexLink2.
isValid() ) cascadeVertexLinks.push_back( vertexLink2 );
980 if( vertexLink3.
isValid() ) cascadeVertexLinks.push_back( vertexLink3 );
982 CascadeLinksDecor(*mainVertex) = cascadeVertexLinks;
985 if(cascade_info_pair.second) {
986 const std::vector<xAOD::Vertex*> &cascadeVertices_mvc = cascade_info_pair.second->vertices();
987 if(cascadeVertices_mvc.size() != topoN)
ATH_MSG_ERROR(
"Incorrect number of vertices (mvc)");
988 for(
size_t i=0; i<topoN; i++) {
989 if(cascadeVertices_mvc[i]==
nullptr)
ATH_MSG_ERROR(
"Error null vertex (mvc)");
991 cascade_info_pair.second->setSVOwnership(
false);
992 const auto mainVertex_mvc = cascadeVertices_mvc[topoN-1];
993 const std::vector< std::vector<TLorentzVector> > &moms_mvc = cascade_info_pair.second->getParticleMoms();
998 else ijx_mvc = topoN-1;
1002 else ijx_mvc = topoN-1;
1007 else jxVtx_mvc =
FindVertex<2>(jxContainer.
ptr(), cascadeVertices_mvc[ijx_mvc]);
1015 Pt_decor(*mainVertex_mvc) =
m_CascadeTools->pT(moms_mvc[topoN-1]);
1016 PtErr_decor(*mainVertex_mvc) =
m_CascadeTools->pTError(moms_mvc[topoN-1],cascade_info_pair.second->getCovariance()[topoN-1]);
1017 chi2_decor(*mainVertex_mvc) = cascade_info_pair.second->fitChi2();
1018 ndof_decor(*mainVertex_mvc) = cascade_info_pair.second->nDoF();
1022 lxy_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxy(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1023 lxyErr_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1024 a0z_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0z(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1025 a0zErr_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0zError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1026 a0xy_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xy(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1027 a0xyErr_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1028 lxy_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1029 lxyErr_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1030 a0z_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0z(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1031 a0zErr_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0zError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1032 a0xy_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1033 a0xyErr_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1034 lxy_SV2_decor(*cascadeVertices_mvc[2]) =
m_CascadeTools->lxy(moms_mvc[2],cascadeVertices_mvc[2],mainVertex_mvc);
1035 lxyErr_SV2_decor(*cascadeVertices_mvc[2]) =
m_CascadeTools->lxyError(moms_mvc[2],cascade_info_pair.second->getCovariance()[2],cascadeVertices_mvc[2],mainVertex_mvc);
1036 a0z_SV2_decor(*cascadeVertices_mvc[2]) =
m_CascadeTools->a0z(moms_mvc[2],cascadeVertices_mvc[2],mainVertex_mvc);
1037 a0zErr_SV2_decor(*cascadeVertices_mvc[2]) =
m_CascadeTools->a0zError(moms_mvc[2],cascade_info_pair.second->getCovariance()[2],cascadeVertices_mvc[2],mainVertex_mvc);
1038 a0xy_SV2_decor(*cascadeVertices_mvc[2]) =
m_CascadeTools->a0xy(moms_mvc[2],cascadeVertices_mvc[2],mainVertex_mvc);
1039 a0xyErr_SV2_decor(*cascadeVertices_mvc[2]) =
m_CascadeTools->a0xyError(moms_mvc[2],cascade_info_pair.second->getCovariance()[2],cascadeVertices_mvc[2],mainVertex_mvc);
1042 lxy_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxy(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1043 lxyErr_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1044 a0z_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0z(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1045 a0zErr_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0zError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1046 a0xy_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xy(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1047 a0xyErr_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1048 lxy_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1049 lxyErr_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1050 a0z_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0z(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1051 a0zErr_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0zError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1052 a0xy_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1053 a0xyErr_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1058 lxy_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxy(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1059 lxyErr_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1060 a0z_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0z(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1061 a0zErr_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0zError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1062 a0xy_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xy(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1063 a0xyErr_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1064 lxy_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1065 lxyErr_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1066 a0z_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0z(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1067 a0zErr_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0zError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1068 a0xy_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1069 a0xyErr_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1072 lxy_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxy(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1073 lxyErr_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1074 a0z_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0z(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1075 a0zErr_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0zError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1076 a0xy_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xy(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1077 a0xyErr_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1079 lxy_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1080 lxyErr_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1081 a0z_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0z(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1082 a0zErr_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0zError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1083 a0xy_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1084 a0xyErr_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1090 lxy_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxy(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1091 lxyErr_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1092 a0z_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0z(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1093 a0zErr_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0zError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1094 a0xy_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xy(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1095 a0xyErr_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1098 lxy_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxy(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1099 lxyErr_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1100 a0z_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0z(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1101 a0zErr_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0zError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1102 a0xy_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xy(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1103 a0xyErr_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1104 lxy_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1105 lxyErr_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1106 a0xy_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0z(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1107 a0xyErr_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0zError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1108 a0z_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1109 a0zErr_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1112 lxy_SV2_decor(*cascadeVertices_mvc[ijx_mvc]) =
m_CascadeTools->lxy(moms_mvc[ijx_mvc],cascadeVertices_mvc[ijx_mvc],mainVertex_mvc);
1113 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);
1114 a0z_SV2_decor(*cascadeVertices_mvc[ijx_mvc]) =
m_CascadeTools->a0z(moms_mvc[ijx_mvc],cascadeVertices_mvc[ijx_mvc],mainVertex_mvc);
1115 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);
1116 a0xy_SV2_decor(*cascadeVertices_mvc[ijx_mvc]) =
m_CascadeTools->a0xy(moms_mvc[ijx_mvc],cascadeVertices_mvc[ijx_mvc],mainVertex_mvc);
1117 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);
1120 chi2_V2_decor(*cascadeVertices_mvc[ijx_mvc]) =
m_V0Tools->chisq(jxVtx_mvc);
1121 ndof_V2_decor(*cascadeVertices_mvc[ijx_mvc]) =
m_V0Tools->ndof(jxVtx_mvc);
1127 for(
size_t i=0; i<topoN; i++) {
1128 VtxWriteHandles_mvc[i].ptr()->push_back(cascadeVertices_mvc[i]);
1133 vertexLink1_mvc.
setElement(cascadeVertices_mvc[0]);
1135 if( vertexLink1_mvc.
isValid() ) cascadeVertexLinks_mvc.push_back( vertexLink1_mvc );
1138 vertexLink2_mvc.
setElement(cascadeVertices_mvc[1]);
1140 if( vertexLink2_mvc.
isValid() ) cascadeVertexLinks_mvc.push_back( vertexLink2_mvc );
1144 vertexLink3_mvc.
setElement(cascadeVertices_mvc[2]);
1146 if( vertexLink3_mvc.
isValid() ) cascadeVertexLinks_mvc.push_back( vertexLink3_mvc );
1148 CascadeLinksDecor(*mainVertex_mvc) = cascadeVertexLinks_mvc;
1152 vertexLink_mvc.
setElement(cascadeVertices[topoN-1]);
1154 if( vertexLink_mvc.
isValid() ) precedingVertexLinks_mvc.push_back( vertexLink_mvc );
1155 PrecedingLinksDecor(*mainVertex_mvc) = precedingVertexLinks_mvc;
1160 for (
auto cascade_info_pair : cascadeinfoContainer) {
1161 if(cascade_info_pair.first)
delete cascade_info_pair.first;
1162 if(cascade_info_pair.second)
delete cascade_info_pair.second;
1165 return StatusCode::SUCCESS;
1316 std::vector<std::pair<Trk::VxCascadeInfo*,Trk::VxCascadeInfo*> >
result;
1318 std::vector<const xAOD::TrackParticle*> tracksJX;
1321 if (tracksJX.size() != massesJX.size()) {
1322 ATH_MSG_ERROR(
"Problems with JX input: number of tracks or track mass inputs is not correct!");
1326 if(std::find(tracksJX.cbegin(), tracksJX.cend(), V0vtx->
trackParticle(0)) != tracksJX.cend())
return result;
1327 if(std::find(tracksJX.cbegin(), tracksJX.cend(), V0vtx->
trackParticle(1)) != tracksJX.cend())
return result;
1328 std::vector<const xAOD::TrackParticle*> tracksV0;
1332 std::vector<const xAOD::TrackParticle*> tracksJpsi{tracksJX[0], tracksJX[1]};
1333 std::vector<const xAOD::TrackParticle*> tracksX;
1337 std::vector<double> massesV0;
1348 TLorentzVector p4_moth, p4_v0, tmp;
1354 for(
int it=0; it<V0_helper.
nRefTrks(); it++) {
1355 p4_moth += V0_helper.
refTrk(it,massesV0[it]);
1356 p4_v0 += V0_helper.
refTrk(it,massesV0[it]);
1367 std::unique_ptr<Trk::RecVertex> pv_AOD;
1368 if(pv_xAOD) pv_AOD = std::make_unique<Trk::RecVertex>(pv_xAOD->
position(),pv_xAOD->covariancePosition(),pv_xAOD->
numberDoF(),pv_xAOD->
chiSquared());
1391 std::vector<float> trk_px;
1392 std::vector<float> trk_py;
1393 std::vector<float> trk_pz;
1396 double main_mass = p4_moth.M();
1406 std::unique_ptr<Trk::IVKalState> state =
m_iVertexFitter->makeState();
1412 std::vector<Trk::VertexID> vrtList;
1421 vrtList.push_back(vID1);
1430 vrtList.push_back(vID2);
1432 std::vector<const xAOD::TrackParticle*> tp;
1433 std::vector<double> tp_masses;
1448 std::vector<Trk::VertexID> cnstV;
1455 std::vector<Trk::VertexID> cnstV;
1461 std::vector<Trk::VertexID> cnstV;
1467 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) );
1470 for(
auto& v : fit_result->vertices()) {
1471 if(v->nTrackParticles()==0) {
1472 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
1473 v->setTrackParticleLinks(nullLinkVector);
1480 fit_result->setSVOwnership(
true);
1483 double chi2DOF = fit_result->fitChi2()/fit_result->nDoF();
1486 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->getParticleMoms();
1487 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->vertices();
1488 size_t iMoth = cascadeVertices.size()-1;
1489 double lxy_SV1 =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[iMoth]);
1491 chi2_V1_decor(*cascadeVertices[0]) = V0vtx->
chiSquared();
1492 ndof_V1_decor(*cascadeVertices[0]) = V0vtx->
numberDoF();
1494 type_V1_decor(*cascadeVertices[0]) =
"Lambda";
1497 type_V1_decor(*cascadeVertices[0]) =
"Lambdabar";
1500 type_V1_decor(*cascadeVertices[0]) =
"Ks";
1502 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.
isAvailable(*V0vtx) ? mAcc_gfit(*V0vtx) : 0;
1503 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.
isAvailable(*V0vtx) ? mAcc_gmass(*V0vtx) : -1;
1504 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.
isAvailable(*V0vtx) ? mAcc_gmasserr(*V0vtx) : -1;
1505 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.
isAvailable(*V0vtx) ? mAcc_gchisq(*V0vtx) : 999999;
1506 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.
isAvailable(*V0vtx) ? mAcc_gndof(*V0vtx) : 0;
1507 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.
isAvailable(*V0vtx) ? mAcc_gprob(*V0vtx) : -1;
1508 trk_px.clear(); trk_py.clear(); trk_pz.clear();
1509 trk_px.reserve(V0_helper.
nRefTrks());
1510 trk_py.reserve(V0_helper.
nRefTrks());
1511 trk_pz.reserve(V0_helper.
nRefTrks());
1512 for(
auto&& vec3 : V0_helper.
refTrks()) {
1513 trk_px.push_back( vec3.Px() );
1514 trk_py.push_back( vec3.Py() );
1515 trk_pz.push_back( vec3.Pz() );
1517 trk_pxDeco(*cascadeVertices[0]) = trk_px;
1518 trk_pyDeco(*cascadeVertices[0]) = trk_py;
1519 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
1521 result.push_back( std::make_pair(fit_result.release(),
nullptr) );
1527 std::vector<double> massesJXExtra = massesJX; massesJXExtra.push_back(
m_extraTrk1MassHypo);
1533 if(std::find(tracksJX.cbegin(),tracksJX.cend(),tpExtra) != tracksJX.cend())
continue;
1534 if(std::find(tracksV0.cbegin(),tracksV0.cend(),tpExtra) != tracksV0.cend())
continue;
1538 double main_mass = (p4_moth+tmp).M();
1545 if(main_mass < m_MassLower || main_mass >
m_MassUpper)
continue;
1547 std::vector<const xAOD::TrackParticle*> tracksExtra{tpExtra};
1548 std::vector<const xAOD::TrackParticle*> tracksJXExtra = tracksJX; tracksJXExtra.push_back(tpExtra);
1551 std::unique_ptr<Trk::IVKalState> state =
m_iVertexFitter->makeState();
1557 std::vector<Trk::VertexID> vrtList;
1558 std::vector<Trk::VertexID> vrtList2;
1568 vrtList.push_back(vID1);
1575 vrtList2.push_back(vID2);
1591 vrtList.push_back(vID1);
1595 vrtList.push_back(vID2);
1608 vID2 =
m_iVertexFitter->nextVertex(tracksJXExtra,massesJXExtra,vrtList,*state);
1613 std::vector<Trk::VertexID> cnstV;
1619 std::vector<Trk::VertexID> cnstV;
1625 std::vector<Trk::VertexID> cnstV;
1631 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) );
1634 for(
auto& v : fit_result->vertices()) {
1635 if(v->nTrackParticles()==0) {
1636 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
1637 v->setTrackParticleLinks(nullLinkVector);
1644 fit_result->setSVOwnership(
true);
1647 double chi2DOF = fit_result->fitChi2()/fit_result->nDoF();
1649 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->getParticleMoms();
1650 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->vertices();
1651 size_t iMoth = cascadeVertices.size()-1;
1654 lxy_SV1 =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
1657 lxy_SV1 =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[iMoth]);
1660 chi2_V1_decor(*cascadeVertices[0]) = V0vtx->
chiSquared();
1661 ndof_V1_decor(*cascadeVertices[0]) = V0vtx->
numberDoF();
1663 type_V1_decor(*cascadeVertices[0]) =
"Lambda";
1666 type_V1_decor(*cascadeVertices[0]) =
"Lambdabar";
1669 type_V1_decor(*cascadeVertices[0]) =
"Ks";
1671 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.
isAvailable(*V0vtx) ? mAcc_gfit(*V0vtx) : 0;
1672 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.
isAvailable(*V0vtx) ? mAcc_gmass(*V0vtx) : -1;
1673 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.
isAvailable(*V0vtx) ? mAcc_gmasserr(*V0vtx) : -1;
1674 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.
isAvailable(*V0vtx) ? mAcc_gchisq(*V0vtx) : 999999;
1675 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.
isAvailable(*V0vtx) ? mAcc_gndof(*V0vtx) : 0;
1676 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.
isAvailable(*V0vtx) ? mAcc_gprob(*V0vtx) : -1;
1677 trk_px.clear(); trk_py.clear(); trk_pz.clear();
1678 trk_px.reserve(V0_helper.
nRefTrks());
1679 trk_py.reserve(V0_helper.
nRefTrks());
1680 trk_pz.reserve(V0_helper.
nRefTrks());
1681 for(
auto&& vec3 : V0_helper.
refTrks()) {
1682 trk_px.push_back( vec3.Px() );
1683 trk_py.push_back( vec3.Py() );
1684 trk_pz.push_back( vec3.Pz() );
1686 trk_pxDeco(*cascadeVertices[0]) = trk_px;
1687 trk_pyDeco(*cascadeVertices[0]) = trk_py;
1688 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
1690 result.push_back( std::make_pair(fit_result.release(),
nullptr) );
1696 std::vector<const xAOD::TrackParticle*> tracksPlus;
1697 std::vector<const xAOD::TrackParticle*> tracksMinus;
1702 if(std::find(tracksJX.cbegin(),tracksJX.cend(),tpExtra) != tracksJX.cend())
continue;
1703 if(std::find(tracksV0.cbegin(),tracksV0.cend(),tpExtra) != tracksV0.cend())
continue;
1704 if(tpExtra->charge()>0) {
1705 tracksPlus.push_back(tpExtra);
1708 tracksMinus.push_back(tpExtra);
1713 TLorentzVector p4_ExtraTrk1, p4_ExtraTrk2;
1720 double main_mass = (p4_moth+p4_ExtraTrk1+p4_ExtraTrk2).M();
1728 if(main_mass < m_MassLower || main_mass >
m_MassUpper)
continue;
1730 if(D0.extraTrack1) D0Candidates.
push_back(D0);
1737 for(
auto&& D0 : D0Candidates.
vector()) {
1738 std::vector<const xAOD::TrackParticle*> tracksExtra{D0.extraTrack1,D0.extraTrack2};
1741 std::unique_ptr<Trk::IVKalState> state =
m_iVertexFitter->makeState();
1747 std::vector<Trk::VertexID> vrtList;
1756 vrtList.push_back(vID1);
1764 vrtList.push_back(vID2);
1773 std::vector<Trk::VertexID> cnstV;
1779 std::vector<Trk::VertexID> cnstV;
1785 std::vector<Trk::VertexID> cnstV;
1791 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) );
1794 for(
auto& v : fit_result->vertices()) {
1795 if(v->nTrackParticles()==0) {
1796 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
1797 v->setTrackParticleLinks(nullLinkVector);
1804 fit_result->setSVOwnership(
true);
1807 double chi2DOF = fit_result->fitChi2()/fit_result->nDoF();
1809 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->getParticleMoms();
1810 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->vertices();
1811 size_t iMoth = cascadeVertices.size()-1;
1812 double lxy_SV1 =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[iMoth]);
1813 double lxy_SV2 =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],cascadeVertices[iMoth]);
1815 chi2_V1_decor(*cascadeVertices[0]) = V0vtx->
chiSquared();
1816 ndof_V1_decor(*cascadeVertices[0]) = V0vtx->
numberDoF();
1818 type_V1_decor(*cascadeVertices[0]) =
"Lambda";
1821 type_V1_decor(*cascadeVertices[0]) =
"Lambdabar";
1824 type_V1_decor(*cascadeVertices[0]) =
"Ks";
1826 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.
isAvailable(*V0vtx) ? mAcc_gfit(*V0vtx) : 0;
1827 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.
isAvailable(*V0vtx) ? mAcc_gmass(*V0vtx) : -1;
1828 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.
isAvailable(*V0vtx) ? mAcc_gmasserr(*V0vtx) : -1;
1829 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.
isAvailable(*V0vtx) ? mAcc_gchisq(*V0vtx) : 999999;
1830 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.
isAvailable(*V0vtx) ? mAcc_gndof(*V0vtx) : 0;
1831 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.
isAvailable(*V0vtx) ? mAcc_gprob(*V0vtx) : -1;
1832 trk_px.clear(); trk_py.clear(); trk_pz.clear();
1833 trk_px.reserve(V0_helper.
nRefTrks());
1834 trk_py.reserve(V0_helper.
nRefTrks());
1835 trk_pz.reserve(V0_helper.
nRefTrks());
1836 for(
auto&& vec3 : V0_helper.
refTrks()) {
1837 trk_px.push_back( vec3.Px() );
1838 trk_py.push_back( vec3.Py() );
1839 trk_pz.push_back( vec3.Pz() );
1841 trk_pxDeco(*cascadeVertices[0]) = trk_px;
1842 trk_pyDeco(*cascadeVertices[0]) = trk_py;
1843 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
1845 result.push_back( std::make_pair(fit_result.release(),
nullptr) );
1851 std::vector<const xAOD::TrackParticle*> tracksPlus;
1852 std::vector<const xAOD::TrackParticle*> tracksMinus;
1855 if( tpExtra->pt() < minTrkPt )
continue;
1858 if(std::find(tracksJX.cbegin(),tracksJX.cend(),tpExtra) != tracksJX.cend())
continue;
1859 if(std::find(tracksV0.cbegin(),tracksV0.cend(),tpExtra) != tracksV0.cend())
continue;
1860 if(tpExtra->charge()>0) {
1861 tracksPlus.push_back(tpExtra);
1864 tracksMinus.push_back(tpExtra);
1869 TLorentzVector p4_ExtraTrk1, p4_ExtraTrk2, p4_ExtraTrk3;
1873 for(
auto tp2Itr=tracksMinus.cbegin(); tp2Itr!=tracksMinus.cend(); ++tp2Itr) {
1875 for(
auto tp3Itr=tp2Itr+1; tp3Itr!=tracksMinus.cend(); ++tp3Itr) {
1882 double main_mass = (p4_moth+p4_ExtraTrk1+p4_ExtraTrk2+p4_ExtraTrk3).M();
1888 if(
m_massDpm>0) main_mass += - (p4_ExtraTrk1+p4_ExtraTrk2+p4_ExtraTrk3).M() +
m_massDpm;
1890 if(main_mass < m_MassLower || main_mass >
m_MassUpper)
continue;
1892 if(Dpm.extraTrack1) DpmCandidates.
push_back(Dpm);
1900 for(
auto tp2Itr=tracksPlus.cbegin(); tp2Itr!=tracksPlus.cend(); ++tp2Itr) {
1902 for(
auto tp3Itr=tp2Itr+1; tp3Itr!=tracksPlus.cend(); ++tp3Itr) {
1909 double main_mass = (p4_moth+p4_ExtraTrk1+p4_ExtraTrk2+p4_ExtraTrk3).M();
1915 if(
m_massDpm>0) main_mass += - (p4_ExtraTrk1+p4_ExtraTrk2+p4_ExtraTrk3).M() +
m_massDpm;
1917 if(main_mass < m_MassLower || main_mass >
m_MassUpper)
continue;
1919 if(Dpm.extraTrack1) DpmCandidates.
push_back(Dpm);
1927 for(
auto&& Dpm : DpmCandidates.
vector()) {
1928 std::vector<const xAOD::TrackParticle*> tracksExtra{Dpm.extraTrack1,Dpm.extraTrack2,Dpm.extraTrack3};
1931 std::unique_ptr<Trk::IVKalState> state =
m_iVertexFitter->makeState();
1937 std::vector<Trk::VertexID> vrtList;
1938 std::vector<Trk::VertexID> vrtList2;
1948 vrtList.push_back(vID1);
1956 vrtList2.push_back(vID2);
1963 vrtList2.push_back(vID3);
1965 std::vector<const xAOD::TrackParticle*> tp;
1966 std::vector<double> tp_masses;
1973 std::vector<Trk::VertexID> cnstV;
1979 std::vector<Trk::VertexID> cnstV;
1985 std::vector<Trk::VertexID> cnstV;
1999 vrtList.push_back(vID1);
2007 vrtList.push_back(vID2);
2016 std::vector<Trk::VertexID> cnstV;
2022 std::vector<Trk::VertexID> cnstV;
2028 std::vector<Trk::VertexID> cnstV;
2035 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) );
2038 for(
auto& v : fit_result->vertices()) {
2039 if(v->nTrackParticles()==0) {
2040 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
2041 v->setTrackParticleLinks(nullLinkVector);
2048 fit_result->setSVOwnership(
true);
2051 double chi2DOF = fit_result->fitChi2()/fit_result->nDoF();
2053 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->getParticleMoms();
2054 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->vertices();
2055 size_t iMoth = cascadeVertices.size()-1;
2056 double lxy_SV1(0), lxy_SV2(0);
2058 lxy_SV1 =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
2059 lxy_SV2 =
m_CascadeTools->lxy(moms[2],cascadeVertices[2],cascadeVertices[iMoth]);
2062 lxy_SV1 =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[iMoth]);
2063 lxy_SV2 =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],cascadeVertices[iMoth]);
2066 chi2_V1_decor(*cascadeVertices[0]) = V0vtx->
chiSquared();
2067 ndof_V1_decor(*cascadeVertices[0]) = V0vtx->
numberDoF();
2069 type_V1_decor(*cascadeVertices[0]) =
"Lambda";
2072 type_V1_decor(*cascadeVertices[0]) =
"Lambdabar";
2075 type_V1_decor(*cascadeVertices[0]) =
"Ks";
2077 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.
isAvailable(*V0vtx) ? mAcc_gfit(*V0vtx) : 0;
2078 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.
isAvailable(*V0vtx) ? mAcc_gmass(*V0vtx) : -1;
2079 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.
isAvailable(*V0vtx) ? mAcc_gmasserr(*V0vtx) : -1;
2080 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.
isAvailable(*V0vtx) ? mAcc_gchisq(*V0vtx) : 999999;
2081 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.
isAvailable(*V0vtx) ? mAcc_gndof(*V0vtx) : 0;
2082 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.
isAvailable(*V0vtx) ? mAcc_gprob(*V0vtx) : -1;
2083 trk_px.clear(); trk_py.clear(); trk_pz.clear();
2084 trk_px.reserve(V0_helper.
nRefTrks());
2085 trk_py.reserve(V0_helper.
nRefTrks());
2086 trk_pz.reserve(V0_helper.
nRefTrks());
2087 for(
auto&& vec3 : V0_helper.
refTrks()) {
2088 trk_px.push_back( vec3.Px() );
2089 trk_py.push_back( vec3.Py() );
2090 trk_pz.push_back( vec3.Pz() );
2092 trk_pxDeco(*cascadeVertices[0]) = trk_px;
2093 trk_pyDeco(*cascadeVertices[0]) = trk_py;
2094 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
2098 TLorentzVector totalMom;
2099 for(
size_t it=0; it<moms[iMoth].size(); it++) totalMom += moms[iMoth][it];
2100 double mainV_mass = totalMom.M();
2102 std::unique_ptr<Trk::IVKalState> state_mvc =
m_iVertexFitter->makeState();
2103 int robustness_mvc = 0;
2105 std::vector<Trk::VertexID> vrtList_mvc;
2106 std::vector<Trk::VertexID> vrtList2_mvc;
2112 vID1_mvc =
m_iVertexFitter->startVertex(tracksV0,massesV0,*state_mvc);
2114 vrtList_mvc.push_back(vID1_mvc);
2119 vID2_mvc =
m_iVertexFitter->nextVertex(tracksJX,massesJX,vrtList_mvc,*state_mvc);
2121 vrtList2_mvc.push_back(vID2_mvc);
2126 vID3_mvc =
m_iVertexFitter->nextVertex(tracksExtra,massesExtra,*state_mvc);
2128 vrtList2_mvc.push_back(vID3_mvc);
2129 std::vector<const xAOD::TrackParticle*> tp;
2130 std::vector<double> tp_masses;
2133 std::vector<Trk::VertexID> cnstV_mvc;
2139 std::vector<Trk::VertexID> cnstV_mvc;
2145 std::vector<Trk::VertexID> cnstV_mvc;
2156 vID1_mvc =
m_iVertexFitter->startVertex(tracksV0,massesV0,*state_mvc);
2158 vrtList_mvc.push_back(vID1_mvc);
2163 vID2_mvc =
m_iVertexFitter->nextVertex(tracksExtra,massesExtra,*state_mvc);
2165 vrtList_mvc.push_back(vID2_mvc);
2168 std::vector<Trk::VertexID> cnstV_mvc;
2174 std::vector<Trk::VertexID> cnstV_mvc;
2180 std::vector<Trk::VertexID> cnstV_mvc;
2187 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) );
2189 if (fit_result_mvc) {
2190 for(
auto& v : fit_result_mvc->vertices()) {
2191 if(v->nTrackParticles()==0) {
2192 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
2193 v->setTrackParticleLinks(nullLinkVector);
2197 fit_result_mvc->setSVOwnership(
true);
2198 chi2_V1_decor(*cascadeVertices[0]) = V0vtx->
chiSquared();
2199 ndof_V1_decor(*cascadeVertices[0]) = V0vtx->
numberDoF();
2201 type_V1_decor(*cascadeVertices[0]) =
"Lambda";
2204 type_V1_decor(*cascadeVertices[0]) =
"Lambdabar";
2207 type_V1_decor(*cascadeVertices[0]) =
"Ks";
2209 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.
isAvailable(*V0vtx) ? mAcc_gfit(*V0vtx) : 0;
2210 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.
isAvailable(*V0vtx) ? mAcc_gmass(*V0vtx) : -1;
2211 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.
isAvailable(*V0vtx) ? mAcc_gmasserr(*V0vtx) : -1;
2212 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.
isAvailable(*V0vtx) ? mAcc_gchisq(*V0vtx) : 999999;
2213 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.
isAvailable(*V0vtx) ? mAcc_gndof(*V0vtx) : 0;
2214 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.
isAvailable(*V0vtx) ? mAcc_gprob(*V0vtx) : -1;
2215 trk_px.clear(); trk_py.clear(); trk_pz.clear();
2216 trk_px.reserve(V0_helper.
nRefTrks());
2217 trk_py.reserve(V0_helper.
nRefTrks());
2218 trk_pz.reserve(V0_helper.
nRefTrks());
2219 for(
auto&& vec3 : V0_helper.
refTrks()) {
2220 trk_px.push_back( vec3.Px() );
2221 trk_py.push_back( vec3.Py() );
2222 trk_pz.push_back( vec3.Pz() );
2224 trk_pxDeco(*cascadeVertices[0]) = trk_px;
2225 trk_pyDeco(*cascadeVertices[0]) = trk_py;
2226 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
2228 result.push_back( std::make_pair(fit_result.release(),fit_result_mvc.release()) );
2230 else result.push_back( std::make_pair(fit_result.release(),
nullptr) );
2232 else result.push_back( std::make_pair(fit_result.release(),
nullptr) );
2234 else result.push_back( std::make_pair(fit_result.release(),
nullptr) );
2241 for(
auto cascade_info_pair :
result) {
2242 if(cascade_info_pair.first && cascade_info_pair.first->getParticleMoms().size()>0) {
2243 size_t index = cascade_info_pair.first->getParticleMoms().size() - 1;
2244 const std::vector<TLorentzVector> &mom = cascade_info_pair.first->getParticleMoms()[
index];
2248 bool isInDefaultPVCont =
false;
2250 if(pv_xAOD == pvVtx) { isInDefaultPVCont =
true;
break; }
2252 if(isInDefaultPVCont) vtx.
setPv( pv_xAOD, defaultPVContainer, pvtype );
2253 else vtx.
setPv( pv_xAOD, pvContainer, pvtype );
2254 if(origPv_xAOD) vtx.
setOrigPv( origPv_xAOD, defaultPVContainer, pvtype );
2270 if(cascade_info_pair.second && cascade_info_pair.second->getParticleMoms().size()>0) {
2271 index = cascade_info_pair.second->getParticleMoms().size() - 1;
2272 const std::vector<TLorentzVector> &mom_mvc = cascade_info_pair.second->getParticleMoms()[
index];
2274 const xAOD::Vertex* mainVertex_mvc = cascade_info_pair.second->vertices()[
index];
2276 if(isInDefaultPVCont) vtx_mvc.
setPv( pv_xAOD, defaultPVContainer, pvtype );
2277 else vtx_mvc.
setPv( pv_xAOD, pvContainer, pvtype );
2278 if(origPv_xAOD) vtx.
setOrigPv( origPv_xAOD, defaultPVContainer, pvtype );
2302 std::vector<std::pair<Trk::VxCascadeInfo*,Trk::VxCascadeInfo*> >
result;
2304 std::vector<const xAOD::TrackParticle*> tracksJX;
2307 if (tracksJX.size() != massesJX.size()) {
2308 ATH_MSG_ERROR(
"Problems with JX input: number of tracks or track mass inputs is not correct!");
2312 if(std::find(tracksJX.cbegin(), tracksJX.cend(), disVtx.
V0vtx->
trackParticle(0)) != tracksJX.cend())
return result;
2313 if(std::find(tracksJX.cbegin(), tracksJX.cend(), disVtx.
V0vtx->
trackParticle(1)) != tracksJX.cend())
return result;
2314 std::vector<const xAOD::TrackParticle*> tracksV0;
2318 if(std::find(tracksJX.cbegin(), tracksJX.cend(), disVtx.
track) != tracksJX.cend())
return result;
2319 std::vector<const xAOD::TrackParticle*> tracks3{disVtx.
track};
2322 std::vector<const xAOD::TrackParticle*> tracksJpsi{tracksJX[0], tracksJX[1]};
2323 std::vector<const xAOD::TrackParticle*> tracksX;
2327 std::vector<double> massesV0;
2340 TLorentzVector p4_moth, p4_disV, tmp;
2356 std::unique_ptr<Trk::RecVertex> pv_AOD;
2357 if(pv_xAOD) pv_AOD = std::make_unique<Trk::RecVertex>(pv_xAOD->
position(),pv_xAOD->covariancePosition(),pv_xAOD->
numberDoF(),pv_xAOD->
chiSquared());
2383 std::vector<float> trk_px;
2384 std::vector<float> trk_py;
2385 std::vector<float> trk_pz;
2388 double main_mass = p4_moth.M();
2397 std::unique_ptr<Trk::IVKalState> state =
m_iVertexFitter->makeState();
2403 std::vector<Trk::VertexID> vrtList;
2404 std::vector<Trk::VertexID> vrtList2;
2413 vrtList.push_back(vID1);
2419 vID2 =
m_iVertexFitter->nextVertex(tracks3,massesDis3,vrtList,*state);
2421 vrtList2.push_back(vID2);
2430 vrtList2.push_back(vID3);
2432 std::vector<const xAOD::TrackParticle*> tp;
2433 std::vector<double> tp_masses;
2445 vID3 =
m_iVertexFitter->nextVertex(tracksJX,massesJX,vrtList2,*state);
2448 std::vector<Trk::VertexID> cnstV;
2455 std::vector<Trk::VertexID> cnstV;
2461 std::vector<Trk::VertexID> cnstV;
2467 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) );
2470 for(
auto& v : fit_result->vertices()) {
2471 if(v->nTrackParticles()==0) {
2472 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
2473 v->setTrackParticleLinks(nullLinkVector);
2480 fit_result->setSVOwnership(
true);
2483 double chi2DOF = fit_result->fitChi2()/fit_result->nDoF();
2486 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->getParticleMoms();
2487 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->vertices();
2488 size_t iMoth = cascadeVertices.size()-1;
2489 double lxy_SV1_sub =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
2490 double lxy_SV1 =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],cascadeVertices[iMoth]);
2496 type_V0_decor(*cascadeVertices[0]) =
"Lambda";
2499 type_V0_decor(*cascadeVertices[0]) =
"Lambdabar";
2502 type_V0_decor(*cascadeVertices[0]) =
"Ks";
2504 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.
isAvailable(*disVtx.
V0vtx) ? mAcc_gfit(*disVtx.
V0vtx) : 0;
2505 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.
isAvailable(*disVtx.
V0vtx) ? mAcc_gmass(*disVtx.
V0vtx) : -1;
2506 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.
isAvailable(*disVtx.
V0vtx) ? mAcc_gmasserr(*disVtx.
V0vtx) : -1;
2507 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.
isAvailable(*disVtx.
V0vtx) ? mAcc_gchisq(*disVtx.
V0vtx) : 999999;
2508 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.
isAvailable(*disVtx.
V0vtx) ? mAcc_gndof(*disVtx.
V0vtx) : 0;
2509 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.
isAvailable(*disVtx.
V0vtx) ? mAcc_gprob(*disVtx.
V0vtx) : -1;
2510 trk_px.clear(); trk_py.clear(); trk_pz.clear();
2514 trk_pxDeco(*cascadeVertices[0]) = trk_px;
2515 trk_pyDeco(*cascadeVertices[0]) = trk_py;
2516 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
2517 trk_px_deco(*cascadeVertices[1]) = disVtx.
p4_disVtrack.Px();
2518 trk_py_deco(*cascadeVertices[1]) = disVtx.
p4_disVtrack.Py();
2519 trk_pz_deco(*cascadeVertices[1]) = disVtx.
p4_disVtrack.Pz();
2521 result.push_back( std::make_pair(fit_result.release(),
nullptr) );
2527 std::vector<double> massesJXExtra = massesJX; massesJXExtra.push_back(
m_extraTrk1MassHypo);
2531 if ( !
m_trkSelector->decision(*tpExtra,
nullptr) )
continue;
2533 if(std::find(tracksJX.cbegin(),tracksJX.cend(),tpExtra) != tracksJX.cend())
continue;
2534 if(std::find(tracksV0.cbegin(),tracksV0.cend(),tpExtra) != tracksV0.cend())
continue;
2535 if(tpExtra == disVtx.
track)
continue;
2539 double main_mass = (p4_moth+tmp).M();
2545 if (main_mass < m_MassLower || main_mass >
m_MassUpper)
continue;
2547 std::vector<const xAOD::TrackParticle*> tracksExtra{tpExtra};
2548 std::vector<const xAOD::TrackParticle*> tracksJXExtra = tracksJX; tracksJXExtra.push_back(tpExtra);
2551 std::unique_ptr<Trk::IVKalState> state =
m_iVertexFitter->makeState();
2557 std::vector<Trk::VertexID> vrtList;
2558 std::vector<Trk::VertexID> vrtList2;
2567 vrtList.push_back(vID1);
2573 vID2 =
m_iVertexFitter->nextVertex(tracks3,massesDis3,vrtList,*state);
2575 vrtList2.push_back(vID2);
2580 vrtList2.push_back(vID3);
2593 vID3 =
m_iVertexFitter->nextVertex(tracksJXExtra,massesJXExtra,vrtList2,*state);
2597 std::vector<Trk::VertexID> cnstV;
2603 std::vector<Trk::VertexID> cnstV;
2609 std::vector<Trk::VertexID> cnstV;
2615 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) );
2618 for(
auto& v : fit_result->vertices()) {
2619 if(v->nTrackParticles()==0) {
2620 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
2621 v->setTrackParticleLinks(nullLinkVector);
2628 fit_result->setSVOwnership(
true);
2631 double chi2DOF = fit_result->fitChi2()/fit_result->nDoF();
2634 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->getParticleMoms();
2635 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->vertices();
2636 size_t iMoth = cascadeVertices.size()-1;
2637 double lxy_SV1_sub =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
2638 double lxy_SV1 =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],cascadeVertices[iMoth]);
2644 type_V0_decor(*cascadeVertices[0]) =
"Lambda";
2647 type_V0_decor(*cascadeVertices[0]) =
"Lambdabar";
2650 type_V0_decor(*cascadeVertices[0]) =
"Ks";
2652 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.
isAvailable(*disVtx.
V0vtx) ? mAcc_gfit(*disVtx.
V0vtx) : 0;
2653 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.
isAvailable(*disVtx.
V0vtx) ? mAcc_gmass(*disVtx.
V0vtx) : -1;
2654 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.
isAvailable(*disVtx.
V0vtx) ? mAcc_gmasserr(*disVtx.
V0vtx) : -1;
2655 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.
isAvailable(*disVtx.
V0vtx) ? mAcc_gchisq(*disVtx.
V0vtx) : 999999;
2656 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.
isAvailable(*disVtx.
V0vtx) ? mAcc_gndof(*disVtx.
V0vtx) : 0;
2657 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.
isAvailable(*disVtx.
V0vtx) ? mAcc_gprob(*disVtx.
V0vtx) : -1;
2658 trk_px.clear(); trk_py.clear(); trk_pz.clear();
2662 trk_pxDeco(*cascadeVertices[0]) = trk_px;
2663 trk_pyDeco(*cascadeVertices[0]) = trk_py;
2664 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
2665 trk_px_deco(*cascadeVertices[1]) = disVtx.
p4_disVtrack.Px();
2666 trk_py_deco(*cascadeVertices[1]) = disVtx.
p4_disVtrack.Py();
2667 trk_pz_deco(*cascadeVertices[1]) = disVtx.
p4_disVtrack.Pz();
2669 result.push_back( std::make_pair(fit_result.release(),
nullptr) );
2676 for(
auto cascade_info_pair :
result) {
2677 if(cascade_info_pair.first && cascade_info_pair.first->getParticleMoms().size()>0) {
2678 size_t index = cascade_info_pair.first->getParticleMoms().size() - 1;
2679 const std::vector<TLorentzVector> &mom = cascade_info_pair.first->getParticleMoms()[
index];
2683 bool isInDefaultPVCont =
false;
2685 if(pv_xAOD == pvVtx) { isInDefaultPVCont =
true;
break; }
2687 if(isInDefaultPVCont) vtx.
setPv( pv_xAOD, defaultPVContainer, pvtype );
2688 else vtx.
setPv( pv_xAOD, pvContainer, pvtype );
2689 if(origPv_xAOD) vtx.
setOrigPv( origPv_xAOD, defaultPVContainer, pvtype );