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);
653 SG::AuxElement::Accessor<std::string> mAcc_type(
"Type_V0Vtx");
654 SG::AuxElement::Accessor<int> mAcc_gfit(
"gamma_fit");
655 SG::AuxElement::Accessor<float> mAcc_gmass(
"gamma_mass");
656 SG::AuxElement::Accessor<float> mAcc_gchisq(
"gamma_chisq");
657 SG::AuxElement::Accessor<int> mAcc_gndof(
"gamma_ndof");
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(), [](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(); } );
742 selectedV0Candidates.erase(selectedV0Candidates.begin()+
m_maxV0Candidates, selectedV0Candidates.end());
744 if(selectedV0Candidates.size()==0)
return StatusCode::SUCCESS;
746 std::vector<std::pair<Trk::VxCascadeInfo*, Trk::VxCascadeInfo*> > cascadeinfoContainer;
750 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(); } );
752 for(
auto it=cascadeinfoContainer.begin()+
m_maxMainVCandidates; it!=cascadeinfoContainer.end(); it++) {
753 if(it->first)
delete it->first;
754 if(it->second)
delete it->second;
756 cascadeinfoContainer.erase(cascadeinfoContainer.begin()+
m_maxMainVCandidates, cascadeinfoContainer.end());
758 if(cascadeinfoContainer.size()==0)
return StatusCode::SUCCESS;
766 SG::AuxElement::Decorator<VertexLinkVector> CascadeLinksDecor(
"CascadeVertexLinks");
767 SG::AuxElement::Decorator<VertexLinkVector> PrecedingLinksDecor(
"PrecedingVertexLinks");
768 SG::AuxElement::Decorator<float> chi2_decor(
"ChiSquared");
769 SG::AuxElement::Decorator<int> ndof_decor(
"nDoF");
770 SG::AuxElement::Decorator<float> Pt_decor(
"Pt");
771 SG::AuxElement::Decorator<float> PtErr_decor(
"PtErr");
773 SG::AuxElement::Decorator<float> lxy_SV0_decor(
"lxy_SV0");
774 SG::AuxElement::Decorator<float> lxyErr_SV0_decor(
"lxyErr_SV0");
775 SG::AuxElement::Decorator<float> a0xy_SV0_decor(
"a0xy_SV0");
776 SG::AuxElement::Decorator<float> a0xyErr_SV0_decor(
"a0xyErr_SV0");
777 SG::AuxElement::Decorator<float> a0z_SV0_decor(
"a0z_SV0");
778 SG::AuxElement::Decorator<float> a0zErr_SV0_decor(
"a0zErr_SV0");
780 SG::AuxElement::Decorator<float> lxy_SV1_decor(
"lxy_SV1");
781 SG::AuxElement::Decorator<float> lxyErr_SV1_decor(
"lxyErr_SV1");
782 SG::AuxElement::Decorator<float> a0xy_SV1_decor(
"a0xy_SV1");
783 SG::AuxElement::Decorator<float> a0xyErr_SV1_decor(
"a0xyErr_SV1");
784 SG::AuxElement::Decorator<float> a0z_SV1_decor(
"a0z_SV1");
785 SG::AuxElement::Decorator<float> a0zErr_SV1_decor(
"a0zErr_SV1");
787 SG::AuxElement::Decorator<float> lxy_SV2_decor(
"lxy_SV2");
788 SG::AuxElement::Decorator<float> lxyErr_SV2_decor(
"lxyErr_SV2");
789 SG::AuxElement::Decorator<float> a0xy_SV2_decor(
"a0xy_SV2");
790 SG::AuxElement::Decorator<float> a0xyErr_SV2_decor(
"a0xyErr_SV2");
791 SG::AuxElement::Decorator<float> a0z_SV2_decor(
"a0z_SV2");
792 SG::AuxElement::Decorator<float> a0zErr_SV2_decor(
"a0zErr_SV2");
794 SG::AuxElement::Decorator<float> chi2_V2_decor(
"ChiSquared_V2");
795 SG::AuxElement::Decorator<int> ndof_V2_decor(
"nDoF_V2");
797 for(
auto cascade_info_pair : cascadeinfoContainer) {
798 if(cascade_info_pair.first==
nullptr) {
803 const std::vector<xAOD::Vertex*> &cascadeVertices = cascade_info_pair.first->vertices();
804 if(cascadeVertices.size() != topoN)
ATH_MSG_ERROR(
"Incorrect number of vertices");
805 for(
size_t i=0; i<topoN; i++) {
806 if(cascadeVertices[i]==
nullptr)
ATH_MSG_ERROR(
"Error null vertex");
809 cascade_info_pair.first->setSVOwnership(
false);
810 const auto mainVertex = cascadeVertices[topoN-1];
811 const std::vector< std::vector<TLorentzVector> > &moms = cascade_info_pair.first->getParticleMoms();
843 PtErr_decor(*mainVertex) =
m_CascadeTools->pTError(moms[topoN-1],cascade_info_pair.first->getCovariance()[topoN-1]);
845 chi2_decor(*mainVertex) = cascade_info_pair.first->fitChi2();
846 ndof_decor(*mainVertex) = cascade_info_pair.first->nDoF();
850 lxy_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
851 lxyErr_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->lxyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
852 a0z_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0z(moms[0],cascadeVertices[0],cascadeVertices[1]);
853 a0zErr_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0zError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
854 a0xy_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],cascadeVertices[1]);
855 a0xyErr_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
856 lxy_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],mainVertex);
857 lxyErr_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->lxyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
858 a0z_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0z(moms[1],cascadeVertices[1],mainVertex);
859 a0zErr_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0zError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
860 a0xy_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xy(moms[1],cascadeVertices[1],mainVertex);
861 a0xyErr_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
862 lxy_SV2_decor(*cascadeVertices[2]) =
m_CascadeTools->lxy(moms[2],cascadeVertices[2],mainVertex);
863 lxyErr_SV2_decor(*cascadeVertices[2]) =
m_CascadeTools->lxyError(moms[2],cascade_info_pair.first->getCovariance()[2],cascadeVertices[2],mainVertex);
864 a0z_SV2_decor(*cascadeVertices[2]) =
m_CascadeTools->a0z(moms[2],cascadeVertices[2],mainVertex);
865 a0zErr_SV2_decor(*cascadeVertices[2]) =
m_CascadeTools->a0zError(moms[2],cascade_info_pair.first->getCovariance()[2],cascadeVertices[2],mainVertex);
866 a0xy_SV2_decor(*cascadeVertices[2]) =
m_CascadeTools->a0xy(moms[2],cascadeVertices[2],mainVertex);
867 a0xyErr_SV2_decor(*cascadeVertices[2]) =
m_CascadeTools->a0xyError(moms[2],cascade_info_pair.first->getCovariance()[2],cascadeVertices[2],mainVertex);
870 lxy_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],mainVertex);
871 lxyErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->lxyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
872 a0z_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0z(moms[0],cascadeVertices[0],mainVertex);
873 a0zErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0zError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
874 a0xy_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],mainVertex);
875 a0xyErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
876 lxy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],mainVertex);
877 lxyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
878 a0z_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0z(moms[1],cascadeVertices[1],mainVertex);
879 a0zErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0zError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
880 a0xy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xy(moms[1],cascadeVertices[1],mainVertex);
881 a0xyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
886 lxy_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
887 lxyErr_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->lxyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
888 a0z_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0z(moms[0],cascadeVertices[0],cascadeVertices[1]);
889 a0zErr_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0zError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
890 a0xy_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],cascadeVertices[1]);
891 a0xyErr_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
892 lxy_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],mainVertex);
893 lxyErr_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->lxyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
894 a0z_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0z(moms[1],cascadeVertices[1],mainVertex);
895 a0zErr_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0zError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
896 a0xy_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xy(moms[1],cascadeVertices[1],mainVertex);
897 a0xyErr_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
900 lxy_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],mainVertex);
901 lxyErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->lxyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
902 a0z_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0z(moms[0],cascadeVertices[0],mainVertex);
903 a0zErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0zError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
904 a0xy_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],mainVertex);
905 a0xyErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
907 lxy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],mainVertex);
908 lxyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
909 a0z_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0z(moms[1],cascadeVertices[1],mainVertex);
910 a0zErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0zError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
911 a0xy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xy(moms[1],cascadeVertices[1],mainVertex);
912 a0xyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
918 lxy_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],mainVertex);
919 lxyErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->lxyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
920 a0z_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0z(moms[0],cascadeVertices[0],mainVertex);
921 a0zErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0zError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
922 a0xy_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],mainVertex);
923 a0xyErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
926 lxy_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
927 lxyErr_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->lxyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
928 a0z_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0z(moms[0],cascadeVertices[0],cascadeVertices[1]);
929 a0zErr_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0zError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
930 a0xy_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],cascadeVertices[1]);
931 a0xyErr_SV0_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
932 lxy_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],mainVertex);
933 lxyErr_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->lxyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
934 a0xy_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0z(moms[1],cascadeVertices[1],mainVertex);
935 a0xyErr_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0zError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
936 a0z_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xy(moms[1],cascadeVertices[1],mainVertex);
937 a0zErr_SV1_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
941 lxy_SV2_decor(*cascadeVertices[ijx]) =
m_CascadeTools->lxy(moms[ijx],cascadeVertices[ijx],mainVertex);
942 lxyErr_SV2_decor(*cascadeVertices[ijx]) =
m_CascadeTools->lxyError(moms[ijx],cascade_info_pair.first->getCovariance()[ijx],cascadeVertices[ijx],mainVertex);
943 a0z_SV2_decor(*cascadeVertices[ijx]) =
m_CascadeTools->a0z(moms[ijx],cascadeVertices[ijx],mainVertex);
944 a0zErr_SV2_decor(*cascadeVertices[ijx]) =
m_CascadeTools->a0zError(moms[ijx],cascade_info_pair.first->getCovariance()[ijx],cascadeVertices[ijx],mainVertex);
945 a0xy_SV2_decor(*cascadeVertices[ijx]) =
m_CascadeTools->a0xy(moms[ijx],cascadeVertices[ijx],mainVertex);
946 a0xyErr_SV2_decor(*cascadeVertices[ijx]) =
m_CascadeTools->a0xyError(moms[ijx],cascade_info_pair.first->getCovariance()[ijx],cascadeVertices[ijx],mainVertex);
950 chi2_V2_decor(*cascadeVertices[ijx]) =
m_V0Tools->chisq(jxVtx);
951 ndof_V2_decor(*cascadeVertices[ijx]) =
m_V0Tools->ndof(jxVtx);
957 for(
size_t i=0; i<topoN; i++) {
958 VtxWriteHandles[i].ptr()->push_back(cascadeVertices[i]);
966 if( vertexLink1.
isValid() ) cascadeVertexLinks.push_back( vertexLink1 );
971 if( vertexLink2.
isValid() ) cascadeVertexLinks.push_back( vertexLink2 );
977 if( vertexLink3.
isValid() ) cascadeVertexLinks.push_back( vertexLink3 );
979 CascadeLinksDecor(*mainVertex) = cascadeVertexLinks;
982 if(cascade_info_pair.second) {
983 const std::vector<xAOD::Vertex*> &cascadeVertices_mvc = cascade_info_pair.second->vertices();
984 if(cascadeVertices_mvc.size() != topoN)
ATH_MSG_ERROR(
"Incorrect number of vertices (mvc)");
985 for(
size_t i=0; i<topoN; i++) {
986 if(cascadeVertices_mvc[i]==
nullptr)
ATH_MSG_ERROR(
"Error null vertex (mvc)");
988 cascade_info_pair.second->setSVOwnership(
false);
989 const auto mainVertex_mvc = cascadeVertices_mvc[topoN-1];
990 const std::vector< std::vector<TLorentzVector> > &moms_mvc = cascade_info_pair.second->getParticleMoms();
995 else ijx_mvc = topoN-1;
999 else ijx_mvc = topoN-1;
1004 else jxVtx_mvc =
FindVertex<2>(jxContainer.
ptr(), cascadeVertices_mvc[ijx_mvc]);
1012 Pt_decor(*mainVertex_mvc) =
m_CascadeTools->pT(moms_mvc[topoN-1]);
1013 PtErr_decor(*mainVertex_mvc) =
m_CascadeTools->pTError(moms_mvc[topoN-1],cascade_info_pair.second->getCovariance()[topoN-1]);
1014 chi2_decor(*mainVertex_mvc) = cascade_info_pair.second->fitChi2();
1015 ndof_decor(*mainVertex_mvc) = cascade_info_pair.second->nDoF();
1019 lxy_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxy(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1020 lxyErr_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1021 a0z_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0z(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1022 a0zErr_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0zError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1023 a0xy_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xy(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1024 a0xyErr_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1025 lxy_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1026 lxyErr_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1027 a0z_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0z(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1028 a0zErr_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0zError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1029 a0xy_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1030 a0xyErr_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1031 lxy_SV2_decor(*cascadeVertices_mvc[2]) =
m_CascadeTools->lxy(moms_mvc[2],cascadeVertices_mvc[2],mainVertex_mvc);
1032 lxyErr_SV2_decor(*cascadeVertices_mvc[2]) =
m_CascadeTools->lxyError(moms_mvc[2],cascade_info_pair.second->getCovariance()[2],cascadeVertices_mvc[2],mainVertex_mvc);
1033 a0z_SV2_decor(*cascadeVertices_mvc[2]) =
m_CascadeTools->a0z(moms_mvc[2],cascadeVertices_mvc[2],mainVertex_mvc);
1034 a0zErr_SV2_decor(*cascadeVertices_mvc[2]) =
m_CascadeTools->a0zError(moms_mvc[2],cascade_info_pair.second->getCovariance()[2],cascadeVertices_mvc[2],mainVertex_mvc);
1035 a0xy_SV2_decor(*cascadeVertices_mvc[2]) =
m_CascadeTools->a0xy(moms_mvc[2],cascadeVertices_mvc[2],mainVertex_mvc);
1036 a0xyErr_SV2_decor(*cascadeVertices_mvc[2]) =
m_CascadeTools->a0xyError(moms_mvc[2],cascade_info_pair.second->getCovariance()[2],cascadeVertices_mvc[2],mainVertex_mvc);
1039 lxy_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxy(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1040 lxyErr_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1041 a0z_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0z(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1042 a0zErr_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0zError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1043 a0xy_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xy(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1044 a0xyErr_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1045 lxy_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1046 lxyErr_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1047 a0z_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0z(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1048 a0zErr_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0zError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1049 a0xy_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1050 a0xyErr_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1055 lxy_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxy(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1056 lxyErr_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1057 a0z_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0z(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1058 a0zErr_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0zError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1059 a0xy_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xy(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1060 a0xyErr_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1061 lxy_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1062 lxyErr_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1063 a0z_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0z(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1064 a0zErr_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0zError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1065 a0xy_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1066 a0xyErr_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1069 lxy_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxy(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1070 lxyErr_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1071 a0z_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0z(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1072 a0zErr_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0zError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1073 a0xy_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xy(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1074 a0xyErr_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1076 lxy_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1077 lxyErr_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1078 a0z_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0z(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1079 a0zErr_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0zError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1080 a0xy_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1081 a0xyErr_SV2_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1087 lxy_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxy(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1088 lxyErr_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1089 a0z_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0z(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1090 a0zErr_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0zError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1091 a0xy_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xy(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1092 a0xyErr_SV1_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1095 lxy_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxy(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1096 lxyErr_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->lxyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1097 a0z_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0z(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1098 a0zErr_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0zError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1099 a0xy_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xy(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1100 a0xyErr_SV0_decor(*cascadeVertices_mvc[0]) =
m_CascadeTools->a0xyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1101 lxy_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1102 lxyErr_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->lxyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1103 a0xy_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0z(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1104 a0xyErr_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0zError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1105 a0z_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1106 a0zErr_SV1_decor(*cascadeVertices_mvc[1]) =
m_CascadeTools->a0xyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1109 lxy_SV2_decor(*cascadeVertices_mvc[ijx_mvc]) =
m_CascadeTools->lxy(moms_mvc[ijx_mvc],cascadeVertices_mvc[ijx_mvc],mainVertex_mvc);
1110 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);
1111 a0z_SV2_decor(*cascadeVertices_mvc[ijx_mvc]) =
m_CascadeTools->a0z(moms_mvc[ijx_mvc],cascadeVertices_mvc[ijx_mvc],mainVertex_mvc);
1112 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);
1113 a0xy_SV2_decor(*cascadeVertices_mvc[ijx_mvc]) =
m_CascadeTools->a0xy(moms_mvc[ijx_mvc],cascadeVertices_mvc[ijx_mvc],mainVertex_mvc);
1114 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);
1117 chi2_V2_decor(*cascadeVertices_mvc[ijx_mvc]) =
m_V0Tools->chisq(jxVtx_mvc);
1118 ndof_V2_decor(*cascadeVertices_mvc[ijx_mvc]) =
m_V0Tools->ndof(jxVtx_mvc);
1124 for(
size_t i=0; i<topoN; i++) {
1125 VtxWriteHandles_mvc[i].ptr()->push_back(cascadeVertices_mvc[i]);
1130 vertexLink1_mvc.
setElement(cascadeVertices_mvc[0]);
1132 if( vertexLink1_mvc.
isValid() ) cascadeVertexLinks_mvc.push_back( vertexLink1_mvc );
1135 vertexLink2_mvc.
setElement(cascadeVertices_mvc[1]);
1137 if( vertexLink2_mvc.
isValid() ) cascadeVertexLinks_mvc.push_back( vertexLink2_mvc );
1141 vertexLink3_mvc.
setElement(cascadeVertices_mvc[2]);
1143 if( vertexLink3_mvc.
isValid() ) cascadeVertexLinks_mvc.push_back( vertexLink3_mvc );
1145 CascadeLinksDecor(*mainVertex_mvc) = cascadeVertexLinks_mvc;
1149 vertexLink_mvc.
setElement(cascadeVertices[topoN-1]);
1151 if( vertexLink_mvc.
isValid() ) precedingVertexLinks_mvc.push_back( vertexLink_mvc );
1152 PrecedingLinksDecor(*mainVertex_mvc) = precedingVertexLinks_mvc;
1157 for (
auto cascade_info_pair : cascadeinfoContainer) {
1158 if(cascade_info_pair.first)
delete cascade_info_pair.first;
1159 if(cascade_info_pair.second)
delete cascade_info_pair.second;
1162 return StatusCode::SUCCESS;
1310 std::vector<std::pair<Trk::VxCascadeInfo*,Trk::VxCascadeInfo*> > result;
1312 std::vector<const xAOD::TrackParticle*> tracksJX;
1315 if (tracksJX.size() != massesJX.size()) {
1316 ATH_MSG_ERROR(
"Problems with JX input: number of tracks or track mass inputs is not correct!");
1320 if(std::find(tracksJX.cbegin(), tracksJX.cend(), V0vtx->
trackParticle(0)) != tracksJX.cend())
return result;
1321 if(std::find(tracksJX.cbegin(), tracksJX.cend(), V0vtx->
trackParticle(1)) != tracksJX.cend())
return result;
1322 std::vector<const xAOD::TrackParticle*> tracksV0;
1326 std::vector<const xAOD::TrackParticle*> tracksJpsi{tracksJX[0], tracksJX[1]};
1327 std::vector<const xAOD::TrackParticle*> tracksX;
1331 std::vector<double> massesV0;
1342 TLorentzVector p4_moth, p4_v0, tmp;
1348 for(
int it=0; it<V0_helper.
nRefTrks(); it++) {
1349 p4_moth += V0_helper.
refTrk(it,massesV0[it]);
1350 p4_v0 += V0_helper.
refTrk(it,massesV0[it]);
1361 std::unique_ptr<Trk::RecVertex> pv_AOD;
1362 if(pv_xAOD) pv_AOD = std::make_unique<Trk::RecVertex>(pv_xAOD->
position(),pv_xAOD->covariancePosition(),pv_xAOD->
numberDoF(),pv_xAOD->
chiSquared());
1364 SG::AuxElement::Decorator<float> chi2_V1_decor(
"ChiSquared_V1");
1365 SG::AuxElement::Decorator<int> ndof_V1_decor(
"nDoF_V1");
1366 SG::AuxElement::Decorator<std::string> type_V1_decor(
"Type_V1");
1368 SG::AuxElement::Accessor<int> mAcc_gfit(
"gamma_fit");
1369 SG::AuxElement::Accessor<float> mAcc_gmass(
"gamma_mass");
1370 SG::AuxElement::Accessor<float> mAcc_gmasserr(
"gamma_massError");
1371 SG::AuxElement::Accessor<float> mAcc_gchisq(
"gamma_chisq");
1372 SG::AuxElement::Accessor<int> mAcc_gndof(
"gamma_ndof");
1373 SG::AuxElement::Accessor<float> mAcc_gprob(
"gamma_probability");
1375 SG::AuxElement::Decorator<int> mDec_gfit(
"gamma_fit");
1376 SG::AuxElement::Decorator<float> mDec_gmass(
"gamma_mass");
1377 SG::AuxElement::Decorator<float> mDec_gmasserr(
"gamma_massError");
1378 SG::AuxElement::Decorator<float> mDec_gchisq(
"gamma_chisq");
1379 SG::AuxElement::Decorator<int> mDec_gndof(
"gamma_ndof");
1380 SG::AuxElement::Decorator<float> mDec_gprob(
"gamma_probability");
1381 SG::AuxElement::Decorator< std::vector<float> > trk_pxDeco(
"TrackPx_V0nc");
1382 SG::AuxElement::Decorator< std::vector<float> > trk_pyDeco(
"TrackPy_V0nc");
1383 SG::AuxElement::Decorator< std::vector<float> > trk_pzDeco(
"TrackPz_V0nc");
1385 std::vector<float> trk_px;
1386 std::vector<float> trk_py;
1387 std::vector<float> trk_pz;
1390 double main_mass = p4_moth.M();
1397 if (main_mass < m_MassLower || main_mass >
m_MassUpper)
return result;
1400 std::unique_ptr<Trk::IVKalState> state =
m_iVertexFitter->makeState(ctx);
1406 std::vector<Trk::VertexID> vrtList;
1415 vrtList.push_back(vID1);
1424 vrtList.push_back(vID2);
1426 std::vector<const xAOD::TrackParticle*> tp;
1427 std::vector<double> tp_masses;
1442 std::vector<Trk::VertexID> cnstV;
1449 std::vector<Trk::VertexID> cnstV;
1455 std::vector<Trk::VertexID> cnstV;
1461 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) );
1464 for(
auto& v : fit_result->vertices()) {
1465 if(v->nTrackParticles()==0) {
1466 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
1467 v->setTrackParticleLinks(nullLinkVector);
1474 fit_result->setSVOwnership(
true);
1477 double chi2DOF = fit_result->fitChi2()/fit_result->nDoF();
1480 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->getParticleMoms();
1481 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->vertices();
1482 size_t iMoth = cascadeVertices.size()-1;
1483 double lxy_SV1 =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[iMoth]);
1485 chi2_V1_decor(*cascadeVertices[0]) = V0vtx->
chiSquared();
1486 ndof_V1_decor(*cascadeVertices[0]) = V0vtx->
numberDoF();
1488 type_V1_decor(*cascadeVertices[0]) =
"Lambda";
1491 type_V1_decor(*cascadeVertices[0]) =
"Lambdabar";
1494 type_V1_decor(*cascadeVertices[0]) =
"Ks";
1496 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.isAvailable(*V0vtx) ? mAcc_gfit(*V0vtx) : 0;
1497 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.isAvailable(*V0vtx) ? mAcc_gmass(*V0vtx) : -1;
1498 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.isAvailable(*V0vtx) ? mAcc_gmasserr(*V0vtx) : -1;
1499 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.isAvailable(*V0vtx) ? mAcc_gchisq(*V0vtx) : 999999;
1500 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.isAvailable(*V0vtx) ? mAcc_gndof(*V0vtx) : 0;
1501 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.isAvailable(*V0vtx) ? mAcc_gprob(*V0vtx) : -1;
1502 trk_px.clear(); trk_py.clear(); trk_pz.clear();
1503 trk_px.reserve(V0_helper.
nRefTrks());
1504 trk_py.reserve(V0_helper.
nRefTrks());
1505 trk_pz.reserve(V0_helper.
nRefTrks());
1506 for(
auto&& vec3 : V0_helper.
refTrks()) {
1507 trk_px.push_back( vec3.Px() );
1508 trk_py.push_back( vec3.Py() );
1509 trk_pz.push_back( vec3.Pz() );
1511 trk_pxDeco(*cascadeVertices[0]) = trk_px;
1512 trk_pyDeco(*cascadeVertices[0]) = trk_py;
1513 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
1515 result.push_back( std::make_pair(fit_result.release(),
nullptr) );
1521 std::vector<double> massesJXExtra = massesJX; massesJXExtra.push_back(
m_extraTrk1MassHypo);
1527 if(std::find(tracksJX.cbegin(),tracksJX.cend(),tpExtra) != tracksJX.cend())
continue;
1528 if(std::find(tracksV0.cbegin(),tracksV0.cend(),tpExtra) != tracksV0.cend())
continue;
1532 double main_mass = (p4_moth+tmp).M();
1539 if(main_mass < m_MassLower || main_mass >
m_MassUpper)
continue;
1541 std::vector<const xAOD::TrackParticle*> tracksExtra{tpExtra};
1542 std::vector<const xAOD::TrackParticle*> tracksJXExtra = tracksJX; tracksJXExtra.push_back(tpExtra);
1545 std::unique_ptr<Trk::IVKalState> state =
m_iVertexFitter->makeState(ctx);
1551 std::vector<Trk::VertexID> vrtList;
1552 std::vector<Trk::VertexID> vrtList2;
1562 vrtList.push_back(vID1);
1569 vrtList2.push_back(vID2);
1585 vrtList.push_back(vID1);
1589 vrtList.push_back(vID2);
1602 vID2 =
m_iVertexFitter->nextVertex(tracksJXExtra,massesJXExtra,vrtList,*state);
1607 std::vector<Trk::VertexID> cnstV;
1613 std::vector<Trk::VertexID> cnstV;
1619 std::vector<Trk::VertexID> cnstV;
1625 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) );
1628 for(
auto& v : fit_result->vertices()) {
1629 if(v->nTrackParticles()==0) {
1630 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
1631 v->setTrackParticleLinks(nullLinkVector);
1638 fit_result->setSVOwnership(
true);
1641 double chi2DOF = fit_result->fitChi2()/fit_result->nDoF();
1643 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->getParticleMoms();
1644 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->vertices();
1645 size_t iMoth = cascadeVertices.size()-1;
1648 lxy_SV1 =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
1651 lxy_SV1 =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[iMoth]);
1654 chi2_V1_decor(*cascadeVertices[0]) = V0vtx->
chiSquared();
1655 ndof_V1_decor(*cascadeVertices[0]) = V0vtx->
numberDoF();
1657 type_V1_decor(*cascadeVertices[0]) =
"Lambda";
1660 type_V1_decor(*cascadeVertices[0]) =
"Lambdabar";
1663 type_V1_decor(*cascadeVertices[0]) =
"Ks";
1665 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.isAvailable(*V0vtx) ? mAcc_gfit(*V0vtx) : 0;
1666 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.isAvailable(*V0vtx) ? mAcc_gmass(*V0vtx) : -1;
1667 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.isAvailable(*V0vtx) ? mAcc_gmasserr(*V0vtx) : -1;
1668 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.isAvailable(*V0vtx) ? mAcc_gchisq(*V0vtx) : 999999;
1669 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.isAvailable(*V0vtx) ? mAcc_gndof(*V0vtx) : 0;
1670 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.isAvailable(*V0vtx) ? mAcc_gprob(*V0vtx) : -1;
1671 trk_px.clear(); trk_py.clear(); trk_pz.clear();
1672 trk_px.reserve(V0_helper.
nRefTrks());
1673 trk_py.reserve(V0_helper.
nRefTrks());
1674 trk_pz.reserve(V0_helper.
nRefTrks());
1675 for(
auto&& vec3 : V0_helper.
refTrks()) {
1676 trk_px.push_back( vec3.Px() );
1677 trk_py.push_back( vec3.Py() );
1678 trk_pz.push_back( vec3.Pz() );
1680 trk_pxDeco(*cascadeVertices[0]) = trk_px;
1681 trk_pyDeco(*cascadeVertices[0]) = trk_py;
1682 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
1684 result.push_back( std::make_pair(fit_result.release(),
nullptr) );
1690 std::vector<const xAOD::TrackParticle*> tracksPlus;
1691 std::vector<const xAOD::TrackParticle*> tracksMinus;
1696 if(std::find(tracksJX.cbegin(),tracksJX.cend(),tpExtra) != tracksJX.cend())
continue;
1697 if(std::find(tracksV0.cbegin(),tracksV0.cend(),tpExtra) != tracksV0.cend())
continue;
1698 if(tpExtra->charge()>0) {
1699 tracksPlus.push_back(tpExtra);
1702 tracksMinus.push_back(tpExtra);
1707 TLorentzVector p4_ExtraTrk1, p4_ExtraTrk2;
1714 double main_mass = (p4_moth+p4_ExtraTrk1+p4_ExtraTrk2).M();
1722 if(main_mass < m_MassLower || main_mass >
m_MassUpper)
continue;
1724 if(D0.extraTrack1) D0Candidates.
push_back(D0);
1731 for(
auto&& D0 : D0Candidates.
vector()) {
1732 std::vector<const xAOD::TrackParticle*> tracksExtra{D0.extraTrack1,D0.extraTrack2};
1735 std::unique_ptr<Trk::IVKalState> state =
m_iVertexFitter->makeState(ctx);
1741 std::vector<Trk::VertexID> vrtList;
1750 vrtList.push_back(vID1);
1758 vrtList.push_back(vID2);
1767 std::vector<Trk::VertexID> cnstV;
1773 std::vector<Trk::VertexID> cnstV;
1779 std::vector<Trk::VertexID> cnstV;
1785 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) );
1788 for(
auto& v : fit_result->vertices()) {
1789 if(v->nTrackParticles()==0) {
1790 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
1791 v->setTrackParticleLinks(nullLinkVector);
1798 fit_result->setSVOwnership(
true);
1801 double chi2DOF = fit_result->fitChi2()/fit_result->nDoF();
1803 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->getParticleMoms();
1804 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->vertices();
1805 size_t iMoth = cascadeVertices.size()-1;
1806 double lxy_SV1 =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[iMoth]);
1807 double lxy_SV2 =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],cascadeVertices[iMoth]);
1809 chi2_V1_decor(*cascadeVertices[0]) = V0vtx->
chiSquared();
1810 ndof_V1_decor(*cascadeVertices[0]) = V0vtx->
numberDoF();
1812 type_V1_decor(*cascadeVertices[0]) =
"Lambda";
1815 type_V1_decor(*cascadeVertices[0]) =
"Lambdabar";
1818 type_V1_decor(*cascadeVertices[0]) =
"Ks";
1820 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.isAvailable(*V0vtx) ? mAcc_gfit(*V0vtx) : 0;
1821 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.isAvailable(*V0vtx) ? mAcc_gmass(*V0vtx) : -1;
1822 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.isAvailable(*V0vtx) ? mAcc_gmasserr(*V0vtx) : -1;
1823 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.isAvailable(*V0vtx) ? mAcc_gchisq(*V0vtx) : 999999;
1824 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.isAvailable(*V0vtx) ? mAcc_gndof(*V0vtx) : 0;
1825 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.isAvailable(*V0vtx) ? mAcc_gprob(*V0vtx) : -1;
1826 trk_px.clear(); trk_py.clear(); trk_pz.clear();
1827 trk_px.reserve(V0_helper.
nRefTrks());
1828 trk_py.reserve(V0_helper.
nRefTrks());
1829 trk_pz.reserve(V0_helper.
nRefTrks());
1830 for(
auto&& vec3 : V0_helper.
refTrks()) {
1831 trk_px.push_back( vec3.Px() );
1832 trk_py.push_back( vec3.Py() );
1833 trk_pz.push_back( vec3.Pz() );
1835 trk_pxDeco(*cascadeVertices[0]) = trk_px;
1836 trk_pyDeco(*cascadeVertices[0]) = trk_py;
1837 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
1839 result.push_back( std::make_pair(fit_result.release(),
nullptr) );
1845 std::vector<const xAOD::TrackParticle*> tracksPlus;
1846 std::vector<const xAOD::TrackParticle*> tracksMinus;
1849 if( tpExtra->pt() < minTrkPt )
continue;
1852 if(std::find(tracksJX.cbegin(),tracksJX.cend(),tpExtra) != tracksJX.cend())
continue;
1853 if(std::find(tracksV0.cbegin(),tracksV0.cend(),tpExtra) != tracksV0.cend())
continue;
1854 if(tpExtra->charge()>0) {
1855 tracksPlus.push_back(tpExtra);
1858 tracksMinus.push_back(tpExtra);
1863 TLorentzVector p4_ExtraTrk1, p4_ExtraTrk2, p4_ExtraTrk3;
1867 for(
auto tp2Itr=tracksMinus.cbegin(); tp2Itr!=tracksMinus.cend(); ++tp2Itr) {
1869 for(
auto tp3Itr=tp2Itr+1; tp3Itr!=tracksMinus.cend(); ++tp3Itr) {
1876 double main_mass = (p4_moth+p4_ExtraTrk1+p4_ExtraTrk2+p4_ExtraTrk3).M();
1882 if(
m_massDpm>0) main_mass += - (p4_ExtraTrk1+p4_ExtraTrk2+p4_ExtraTrk3).M() +
m_massDpm;
1884 if(main_mass < m_MassLower || main_mass >
m_MassUpper)
continue;
1886 if(Dpm.extraTrack1) DpmCandidates.
push_back(Dpm);
1894 for(
auto tp2Itr=tracksPlus.cbegin(); tp2Itr!=tracksPlus.cend(); ++tp2Itr) {
1896 for(
auto tp3Itr=tp2Itr+1; tp3Itr!=tracksPlus.cend(); ++tp3Itr) {
1903 double main_mass = (p4_moth+p4_ExtraTrk1+p4_ExtraTrk2+p4_ExtraTrk3).M();
1909 if(
m_massDpm>0) main_mass += - (p4_ExtraTrk1+p4_ExtraTrk2+p4_ExtraTrk3).M() +
m_massDpm;
1911 if(main_mass < m_MassLower || main_mass >
m_MassUpper)
continue;
1913 if(Dpm.extraTrack1) DpmCandidates.
push_back(Dpm);
1921 for(
auto&& Dpm : DpmCandidates.
vector()) {
1922 std::vector<const xAOD::TrackParticle*> tracksExtra{Dpm.extraTrack1,Dpm.extraTrack2,Dpm.extraTrack3};
1925 std::unique_ptr<Trk::IVKalState> state =
m_iVertexFitter->makeState(ctx);
1931 std::vector<Trk::VertexID> vrtList;
1932 std::vector<Trk::VertexID> vrtList2;
1942 vrtList.push_back(vID1);
1950 vrtList2.push_back(vID2);
1957 vrtList2.push_back(vID3);
1959 std::vector<const xAOD::TrackParticle*> tp;
1960 std::vector<double> tp_masses;
1967 std::vector<Trk::VertexID> cnstV;
1973 std::vector<Trk::VertexID> cnstV;
1979 std::vector<Trk::VertexID> cnstV;
1993 vrtList.push_back(vID1);
2001 vrtList.push_back(vID2);
2010 std::vector<Trk::VertexID> cnstV;
2016 std::vector<Trk::VertexID> cnstV;
2022 std::vector<Trk::VertexID> cnstV;
2029 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) );
2032 for(
auto& v : fit_result->vertices()) {
2033 if(v->nTrackParticles()==0) {
2034 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
2035 v->setTrackParticleLinks(nullLinkVector);
2042 fit_result->setSVOwnership(
true);
2045 double chi2DOF = fit_result->fitChi2()/fit_result->nDoF();
2047 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->getParticleMoms();
2048 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->vertices();
2049 size_t iMoth = cascadeVertices.size()-1;
2050 double lxy_SV1(0), lxy_SV2(0);
2052 lxy_SV1 =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
2053 lxy_SV2 =
m_CascadeTools->lxy(moms[2],cascadeVertices[2],cascadeVertices[iMoth]);
2056 lxy_SV1 =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[iMoth]);
2057 lxy_SV2 =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],cascadeVertices[iMoth]);
2060 chi2_V1_decor(*cascadeVertices[0]) = V0vtx->
chiSquared();
2061 ndof_V1_decor(*cascadeVertices[0]) = V0vtx->
numberDoF();
2063 type_V1_decor(*cascadeVertices[0]) =
"Lambda";
2066 type_V1_decor(*cascadeVertices[0]) =
"Lambdabar";
2069 type_V1_decor(*cascadeVertices[0]) =
"Ks";
2071 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.isAvailable(*V0vtx) ? mAcc_gfit(*V0vtx) : 0;
2072 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.isAvailable(*V0vtx) ? mAcc_gmass(*V0vtx) : -1;
2073 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.isAvailable(*V0vtx) ? mAcc_gmasserr(*V0vtx) : -1;
2074 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.isAvailable(*V0vtx) ? mAcc_gchisq(*V0vtx) : 999999;
2075 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.isAvailable(*V0vtx) ? mAcc_gndof(*V0vtx) : 0;
2076 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.isAvailable(*V0vtx) ? mAcc_gprob(*V0vtx) : -1;
2077 trk_px.clear(); trk_py.clear(); trk_pz.clear();
2078 trk_px.reserve(V0_helper.
nRefTrks());
2079 trk_py.reserve(V0_helper.
nRefTrks());
2080 trk_pz.reserve(V0_helper.
nRefTrks());
2081 for(
auto&& vec3 : V0_helper.
refTrks()) {
2082 trk_px.push_back( vec3.Px() );
2083 trk_py.push_back( vec3.Py() );
2084 trk_pz.push_back( vec3.Pz() );
2086 trk_pxDeco(*cascadeVertices[0]) = trk_px;
2087 trk_pyDeco(*cascadeVertices[0]) = trk_py;
2088 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
2092 TLorentzVector totalMom;
2093 for(
size_t it=0; it<moms[iMoth].size(); it++) totalMom += moms[iMoth][it];
2094 double mainV_mass = totalMom.M();
2096 std::unique_ptr<Trk::IVKalState> state_mvc =
m_iVertexFitter->makeState(ctx);
2097 int robustness_mvc = 0;
2099 std::vector<Trk::VertexID> vrtList_mvc;
2100 std::vector<Trk::VertexID> vrtList2_mvc;
2106 vID1_mvc =
m_iVertexFitter->startVertex(tracksV0,massesV0,*state_mvc);
2108 vrtList_mvc.push_back(vID1_mvc);
2113 vID2_mvc =
m_iVertexFitter->nextVertex(tracksJX,massesJX,vrtList_mvc,*state_mvc);
2115 vrtList2_mvc.push_back(vID2_mvc);
2120 vID3_mvc =
m_iVertexFitter->nextVertex(tracksExtra,massesExtra,*state_mvc);
2122 vrtList2_mvc.push_back(vID3_mvc);
2123 std::vector<const xAOD::TrackParticle*> tp;
2124 std::vector<double> tp_masses;
2127 std::vector<Trk::VertexID> cnstV_mvc;
2133 std::vector<Trk::VertexID> cnstV_mvc;
2139 std::vector<Trk::VertexID> cnstV_mvc;
2150 vID1_mvc =
m_iVertexFitter->startVertex(tracksV0,massesV0,*state_mvc);
2152 vrtList_mvc.push_back(vID1_mvc);
2157 vID2_mvc =
m_iVertexFitter->nextVertex(tracksExtra,massesExtra,*state_mvc);
2159 vrtList_mvc.push_back(vID2_mvc);
2162 std::vector<Trk::VertexID> cnstV_mvc;
2168 std::vector<Trk::VertexID> cnstV_mvc;
2174 std::vector<Trk::VertexID> cnstV_mvc;
2181 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) );
2183 if (fit_result_mvc) {
2184 for(
auto& v : fit_result_mvc->vertices()) {
2185 if(v->nTrackParticles()==0) {
2186 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
2187 v->setTrackParticleLinks(nullLinkVector);
2191 fit_result_mvc->setSVOwnership(
true);
2192 chi2_V1_decor(*cascadeVertices[0]) = V0vtx->
chiSquared();
2193 ndof_V1_decor(*cascadeVertices[0]) = V0vtx->
numberDoF();
2195 type_V1_decor(*cascadeVertices[0]) =
"Lambda";
2198 type_V1_decor(*cascadeVertices[0]) =
"Lambdabar";
2201 type_V1_decor(*cascadeVertices[0]) =
"Ks";
2203 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.isAvailable(*V0vtx) ? mAcc_gfit(*V0vtx) : 0;
2204 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.isAvailable(*V0vtx) ? mAcc_gmass(*V0vtx) : -1;
2205 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.isAvailable(*V0vtx) ? mAcc_gmasserr(*V0vtx) : -1;
2206 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.isAvailable(*V0vtx) ? mAcc_gchisq(*V0vtx) : 999999;
2207 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.isAvailable(*V0vtx) ? mAcc_gndof(*V0vtx) : 0;
2208 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.isAvailable(*V0vtx) ? mAcc_gprob(*V0vtx) : -1;
2209 trk_px.clear(); trk_py.clear(); trk_pz.clear();
2210 trk_px.reserve(V0_helper.
nRefTrks());
2211 trk_py.reserve(V0_helper.
nRefTrks());
2212 trk_pz.reserve(V0_helper.
nRefTrks());
2213 for(
auto&& vec3 : V0_helper.
refTrks()) {
2214 trk_px.push_back( vec3.Px() );
2215 trk_py.push_back( vec3.Py() );
2216 trk_pz.push_back( vec3.Pz() );
2218 trk_pxDeco(*cascadeVertices[0]) = trk_px;
2219 trk_pyDeco(*cascadeVertices[0]) = trk_py;
2220 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
2222 result.push_back( std::make_pair(fit_result.release(),fit_result_mvc.release()) );
2224 else result.push_back( std::make_pair(fit_result.release(),
nullptr) );
2226 else result.push_back( std::make_pair(fit_result.release(),
nullptr) );
2228 else result.push_back( std::make_pair(fit_result.release(),
nullptr) );
2235 for(
auto cascade_info_pair : result) {
2236 if(cascade_info_pair.first && cascade_info_pair.first->getParticleMoms().size()>0) {
2237 size_t index = cascade_info_pair.first->getParticleMoms().size() - 1;
2238 const std::vector<TLorentzVector> &mom = cascade_info_pair.first->getParticleMoms()[
index];
2242 bool isInDefaultPVCont =
false;
2244 if(pv_xAOD == pvVtx) { isInDefaultPVCont =
true;
break; }
2246 if(isInDefaultPVCont) vtx.
setPv( pv_xAOD, defaultPVContainer, pvtype );
2247 else vtx.
setPv( pv_xAOD, pvContainer, pvtype );
2248 if(origPv_xAOD) vtx.
setOrigPv( origPv_xAOD, defaultPVContainer, pvtype );
2264 if(cascade_info_pair.second && cascade_info_pair.second->getParticleMoms().size()>0) {
2265 index = cascade_info_pair.second->getParticleMoms().size() - 1;
2266 const std::vector<TLorentzVector> &mom_mvc = cascade_info_pair.second->getParticleMoms()[
index];
2268 const xAOD::Vertex* mainVertex_mvc = cascade_info_pair.second->vertices()[
index];
2270 if(isInDefaultPVCont) vtx_mvc.
setPv( pv_xAOD, defaultPVContainer, pvtype );
2271 else vtx_mvc.
setPv( pv_xAOD, pvContainer, pvtype );
2272 if(origPv_xAOD) vtx.
setOrigPv( origPv_xAOD, defaultPVContainer, pvtype );
2296 std::vector<std::pair<Trk::VxCascadeInfo*,Trk::VxCascadeInfo*> > result;
2298 std::vector<const xAOD::TrackParticle*> tracksJX;
2301 if (tracksJX.size() != massesJX.size()) {
2302 ATH_MSG_ERROR(
"Problems with JX input: number of tracks or track mass inputs is not correct!");
2306 if(std::find(tracksJX.cbegin(), tracksJX.cend(), disVtx.
V0vtx->
trackParticle(0)) != tracksJX.cend())
return result;
2307 if(std::find(tracksJX.cbegin(), tracksJX.cend(), disVtx.
V0vtx->
trackParticle(1)) != tracksJX.cend())
return result;
2308 std::vector<const xAOD::TrackParticle*> tracksV0;
2312 if(std::find(tracksJX.cbegin(), tracksJX.cend(), disVtx.
track) != tracksJX.cend())
return result;
2313 std::vector<const xAOD::TrackParticle*> tracks3{disVtx.
track};
2316 std::vector<const xAOD::TrackParticle*> tracksJpsi{tracksJX[0], tracksJX[1]};
2317 std::vector<const xAOD::TrackParticle*> tracksX;
2321 std::vector<double> massesV0;
2334 TLorentzVector p4_moth, p4_disV, tmp;
2350 std::unique_ptr<Trk::RecVertex> pv_AOD;
2351 if(pv_xAOD) pv_AOD = std::make_unique<Trk::RecVertex>(pv_xAOD->
position(),pv_xAOD->covariancePosition(),pv_xAOD->
numberDoF(),pv_xAOD->
chiSquared());
2353 SG::AuxElement::Decorator<float> chi2_V0_decor(
"ChiSquared_V0");
2354 SG::AuxElement::Decorator<int> ndof_V0_decor(
"nDoF_V0");
2355 SG::AuxElement::Decorator<std::string> type_V0_decor(
"Type_V0");
2357 SG::AuxElement::Accessor<int> mAcc_gfit(
"gamma_fit");
2358 SG::AuxElement::Accessor<float> mAcc_gmass(
"gamma_mass");
2359 SG::AuxElement::Accessor<float> mAcc_gmasserr(
"gamma_massError");
2360 SG::AuxElement::Accessor<float> mAcc_gchisq(
"gamma_chisq");
2361 SG::AuxElement::Accessor<int> mAcc_gndof(
"gamma_ndof");
2362 SG::AuxElement::Accessor<float> mAcc_gprob(
"gamma_probability");
2364 SG::AuxElement::Decorator<int> mDec_gfit(
"gamma_fit");
2365 SG::AuxElement::Decorator<float> mDec_gmass(
"gamma_mass");
2366 SG::AuxElement::Decorator<float> mDec_gmasserr(
"gamma_massError");
2367 SG::AuxElement::Decorator<float> mDec_gchisq(
"gamma_chisq");
2368 SG::AuxElement::Decorator<int> mDec_gndof(
"gamma_ndof");
2369 SG::AuxElement::Decorator<float> mDec_gprob(
"gamma_probability");
2370 SG::AuxElement::Decorator< std::vector<float> > trk_pxDeco(
"TrackPx_V0nc");
2371 SG::AuxElement::Decorator< std::vector<float> > trk_pyDeco(
"TrackPy_V0nc");
2372 SG::AuxElement::Decorator< std::vector<float> > trk_pzDeco(
"TrackPz_V0nc");
2373 SG::AuxElement::Decorator<float> trk_px_deco(
"TrackPx_DisVnc");
2374 SG::AuxElement::Decorator<float> trk_py_deco(
"TrackPy_DisVnc");
2375 SG::AuxElement::Decorator<float> trk_pz_deco(
"TrackPz_DisVnc");
2377 std::vector<float> trk_px;
2378 std::vector<float> trk_py;
2379 std::vector<float> trk_pz;
2382 double main_mass = p4_moth.M();
2388 if (main_mass < m_MassLower || main_mass >
m_MassUpper)
return result;
2391 std::unique_ptr<Trk::IVKalState> state =
m_iVertexFitter->makeState(ctx);
2397 std::vector<Trk::VertexID> vrtList;
2398 std::vector<Trk::VertexID> vrtList2;
2407 vrtList.push_back(vID1);
2413 vID2 =
m_iVertexFitter->nextVertex(tracks3,massesDis3,vrtList,*state);
2415 vrtList2.push_back(vID2);
2424 vrtList2.push_back(vID3);
2426 std::vector<const xAOD::TrackParticle*> tp;
2427 std::vector<double> tp_masses;
2439 vID3 =
m_iVertexFitter->nextVertex(tracksJX,massesJX,vrtList2,*state);
2442 std::vector<Trk::VertexID> cnstV;
2449 std::vector<Trk::VertexID> cnstV;
2455 std::vector<Trk::VertexID> cnstV;
2461 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) );
2464 for(
auto& v : fit_result->vertices()) {
2465 if(v->nTrackParticles()==0) {
2466 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
2467 v->setTrackParticleLinks(nullLinkVector);
2474 fit_result->setSVOwnership(
true);
2477 double chi2DOF = fit_result->fitChi2()/fit_result->nDoF();
2480 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->getParticleMoms();
2481 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->vertices();
2482 size_t iMoth = cascadeVertices.size()-1;
2483 double lxy_SV1_sub =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
2484 double lxy_SV1 =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],cascadeVertices[iMoth]);
2490 type_V0_decor(*cascadeVertices[0]) =
"Lambda";
2493 type_V0_decor(*cascadeVertices[0]) =
"Lambdabar";
2496 type_V0_decor(*cascadeVertices[0]) =
"Ks";
2498 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.isAvailable(*disVtx.
V0vtx) ? mAcc_gfit(*disVtx.
V0vtx) : 0;
2499 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.isAvailable(*disVtx.
V0vtx) ? mAcc_gmass(*disVtx.
V0vtx) : -1;
2500 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.isAvailable(*disVtx.
V0vtx) ? mAcc_gmasserr(*disVtx.
V0vtx) : -1;
2501 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.isAvailable(*disVtx.
V0vtx) ? mAcc_gchisq(*disVtx.
V0vtx) : 999999;
2502 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.isAvailable(*disVtx.
V0vtx) ? mAcc_gndof(*disVtx.
V0vtx) : 0;
2503 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.isAvailable(*disVtx.
V0vtx) ? mAcc_gprob(*disVtx.
V0vtx) : -1;
2504 trk_px.clear(); trk_py.clear(); trk_pz.clear();
2508 trk_pxDeco(*cascadeVertices[0]) = trk_px;
2509 trk_pyDeco(*cascadeVertices[0]) = trk_py;
2510 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
2511 trk_px_deco(*cascadeVertices[1]) = disVtx.
p4_disVtrack.Px();
2512 trk_py_deco(*cascadeVertices[1]) = disVtx.
p4_disVtrack.Py();
2513 trk_pz_deco(*cascadeVertices[1]) = disVtx.
p4_disVtrack.Pz();
2515 result.push_back( std::make_pair(fit_result.release(),
nullptr) );
2521 std::vector<double> massesJXExtra = massesJX; massesJXExtra.push_back(
m_extraTrk1MassHypo);
2525 if ( !
m_trkSelector->decision(*tpExtra,
nullptr) )
continue;
2527 if(std::find(tracksJX.cbegin(),tracksJX.cend(),tpExtra) != tracksJX.cend())
continue;
2528 if(std::find(tracksV0.cbegin(),tracksV0.cend(),tpExtra) != tracksV0.cend())
continue;
2529 if(tpExtra == disVtx.
track)
continue;
2533 double main_mass = (p4_moth+tmp).M();
2539 if (main_mass < m_MassLower || main_mass >
m_MassUpper)
continue;
2541 std::vector<const xAOD::TrackParticle*> tracksExtra{tpExtra};
2542 std::vector<const xAOD::TrackParticle*> tracksJXExtra = tracksJX; tracksJXExtra.push_back(tpExtra);
2545 std::unique_ptr<Trk::IVKalState> state =
m_iVertexFitter->makeState(ctx);
2551 std::vector<Trk::VertexID> vrtList;
2552 std::vector<Trk::VertexID> vrtList2;
2561 vrtList.push_back(vID1);
2567 vID2 =
m_iVertexFitter->nextVertex(tracks3,massesDis3,vrtList,*state);
2569 vrtList2.push_back(vID2);
2574 vrtList2.push_back(vID3);
2587 vID3 =
m_iVertexFitter->nextVertex(tracksJXExtra,massesJXExtra,vrtList2,*state);
2591 std::vector<Trk::VertexID> cnstV;
2597 std::vector<Trk::VertexID> cnstV;
2603 std::vector<Trk::VertexID> cnstV;
2609 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) );
2612 for(
auto& v : fit_result->vertices()) {
2613 if(v->nTrackParticles()==0) {
2614 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
2615 v->setTrackParticleLinks(nullLinkVector);
2622 fit_result->setSVOwnership(
true);
2625 double chi2DOF = fit_result->fitChi2()/fit_result->nDoF();
2628 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->getParticleMoms();
2629 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->vertices();
2630 size_t iMoth = cascadeVertices.size()-1;
2631 double lxy_SV1_sub =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
2632 double lxy_SV1 =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],cascadeVertices[iMoth]);
2638 type_V0_decor(*cascadeVertices[0]) =
"Lambda";
2641 type_V0_decor(*cascadeVertices[0]) =
"Lambdabar";
2644 type_V0_decor(*cascadeVertices[0]) =
"Ks";
2646 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.isAvailable(*disVtx.
V0vtx) ? mAcc_gfit(*disVtx.
V0vtx) : 0;
2647 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.isAvailable(*disVtx.
V0vtx) ? mAcc_gmass(*disVtx.
V0vtx) : -1;
2648 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.isAvailable(*disVtx.
V0vtx) ? mAcc_gmasserr(*disVtx.
V0vtx) : -1;
2649 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.isAvailable(*disVtx.
V0vtx) ? mAcc_gchisq(*disVtx.
V0vtx) : 999999;
2650 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.isAvailable(*disVtx.
V0vtx) ? mAcc_gndof(*disVtx.
V0vtx) : 0;
2651 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.isAvailable(*disVtx.
V0vtx) ? mAcc_gprob(*disVtx.
V0vtx) : -1;
2652 trk_px.clear(); trk_py.clear(); trk_pz.clear();
2656 trk_pxDeco(*cascadeVertices[0]) = trk_px;
2657 trk_pyDeco(*cascadeVertices[0]) = trk_py;
2658 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
2659 trk_px_deco(*cascadeVertices[1]) = disVtx.
p4_disVtrack.Px();
2660 trk_py_deco(*cascadeVertices[1]) = disVtx.
p4_disVtrack.Py();
2661 trk_pz_deco(*cascadeVertices[1]) = disVtx.
p4_disVtrack.Pz();
2663 result.push_back( std::make_pair(fit_result.release(),
nullptr) );
2670 for(
auto cascade_info_pair : result) {
2671 if(cascade_info_pair.first && cascade_info_pair.first->getParticleMoms().size()>0) {
2672 size_t index = cascade_info_pair.first->getParticleMoms().size() - 1;
2673 const std::vector<TLorentzVector> &mom = cascade_info_pair.first->getParticleMoms()[
index];
2677 bool isInDefaultPVCont =
false;
2679 if(pv_xAOD == pvVtx) { isInDefaultPVCont =
true;
break; }
2681 if(isInDefaultPVCont) vtx.
setPv( pv_xAOD, defaultPVContainer, pvtype );
2682 else vtx.
setPv( pv_xAOD, pvContainer, pvtype );
2683 if(origPv_xAOD) vtx.
setOrigPv( origPv_xAOD, defaultPVContainer, pvtype );