282 StatusCode
JpsiXPlus2V0::performSearch(std::vector<Trk::VxCascadeInfo*>& cascadeinfoContainer,
const std::vector<std::pair<const xAOD::Vertex*,V0Enum> >& selectedV0Candidates,
const EventContext& ctx)
const {
284 if(selectedV0Candidates.size()==0)
return StatusCode::SUCCESS;
287 std::vector<const xAOD::TrackParticleContainer*> trackCols;
291 trackCols.push_back(handle.cptr());
311 std::vector<const xAOD::Vertex*> selectedJXCandidates;
312 for(
auto vxcItr=jxContainer.
ptr()->begin(); vxcItr!=jxContainer.
ptr()->end(); ++vxcItr) {
317 SG::AuxElement::Accessor<Char_t> flagAcc(
"passed_"+name);
318 if(flagAcc.isAvailable(*vtx) && flagAcc(*vtx)) {
325 TLorentzVector p4_mu1, p4_mu2;
328 double mass_jpsi = (p4_mu1 + p4_mu2).M();
329 if (mass_jpsi < m_jpsiMassLower || mass_jpsi >
m_jpsiMassUpper)
continue;
331 TLorentzVector p4_trk1, p4_trk2;
336 double mass_jx = (p4_mu1 + p4_mu2 + p4_trk1).M();
338 if(mass_jx < m_jxMassLower || mass_jx >
m_jxMassUpper)
continue;
341 double mass_jx = (p4_mu1 + p4_mu2 + p4_trk1 + p4_trk2).M();
343 if(mass_jx < m_jxMassLower || mass_jx >
m_jxMassUpper)
continue;
346 double mass_diTrk = (p4_trk1 + p4_trk2).M();
354 selectedJXCandidates.push_back(vtx);
356 if(selectedJXCandidates.size()==0)
return StatusCode::SUCCESS;
358 std::sort( selectedJXCandidates.begin(), selectedJXCandidates.end(), [](
const xAOD::Vertex*
a,
const xAOD::Vertex* b) { return a->chiSquared()/a->numberDoF() < b->chiSquared()/b->numberDoF(); } );
360 selectedJXCandidates.erase(selectedJXCandidates.begin()+
m_maxJXCandidates, selectedJXCandidates.end());
364 std::vector<const xAOD::TrackParticle*> tracksJX; tracksJX.reserve(
m_jxDaug_num);
365 std::vector<const xAOD::TrackParticle*> tracksV01; tracksV01.reserve(2);
366 for(
auto jxItr=selectedJXCandidates.cbegin(); jxItr!=selectedJXCandidates.cend(); ++jxItr) {
368 for(
size_t i=0; i<(*jxItr)->nTrackParticles(); i++) tracksJX.push_back((*jxItr)->trackParticle(i));
369 for(
auto V0Itr1=selectedV0Candidates.cbegin(); V0Itr1!=selectedV0Candidates.cend(); ++V0Itr1) {
370 if(std::find(tracksJX.cbegin(), tracksJX.cend(), V0Itr1->first->trackParticle(0)) != tracksJX.cend())
continue;
371 if(std::find(tracksJX.cbegin(), tracksJX.cend(), V0Itr1->first->trackParticle(1)) != tracksJX.cend())
continue;
373 for(
size_t j=0; j<V0Itr1->first->nTrackParticles(); j++) tracksV01.push_back(V0Itr1->first->trackParticle(j));
374 for(
auto V0Itr2=V0Itr1+1; V0Itr2!=selectedV0Candidates.cend(); ++V0Itr2) {
375 if(std::find(tracksJX.cbegin(), tracksJX.cend(), V0Itr2->first->trackParticle(0)) != tracksJX.cend())
continue;
376 if(std::find(tracksJX.cbegin(), tracksJX.cend(), V0Itr2->first->trackParticle(1)) != tracksJX.cend())
continue;
377 if(std::find(tracksV01.cbegin(), tracksV01.cend(), V0Itr2->first->trackParticle(0)) != tracksV01.cend())
continue;
378 if(std::find(tracksV01.cbegin(), tracksV01.cend(), V0Itr2->first->trackParticle(1)) != tracksV01.cend())
continue;
380 int numberOfVertices = 0;
390 else numberOfVertices = -1;
399 else numberOfVertices = -1;
403 if(V0Itr1->second==
KS && (V0Itr2->second==
LAMBDA || V0Itr2->second==
LAMBDABAR)) numberOfVertices = 1;
404 else if(V0Itr2->second==
KS && (V0Itr1->second==
LAMBDA || V0Itr1->second==
LAMBDABAR)) numberOfVertices = -1;
407 if((V0Itr1->second==
LAMBDA || V0Itr1->second==
LAMBDABAR) && V0Itr2->second==
KS) numberOfVertices = 1;
408 else if((V0Itr2->second==
LAMBDA || V0Itr2->second==
LAMBDABAR) && V0Itr1->second==
KS) numberOfVertices = -1;
417 if(numberOfVertices==2) {
418 Trk::VxCascadeInfo* result1 =
fitMainVtx(ctx, *jxItr, massesJX, V0Itr1->first, V0Itr1->second, V0Itr2->first, V0Itr2->second, trackCols, defaultPVContainer.
cptr(), pvContainer.
cptr());
419 if(result1) cascadeinfoContainer.push_back(result1);
420 Trk::VxCascadeInfo* result2 =
fitMainVtx(ctx, *jxItr, massesJX, V0Itr2->first, V0Itr2->second, V0Itr1->first, V0Itr1->second, trackCols, defaultPVContainer.
cptr(), pvContainer.
cptr());
421 if(result2) cascadeinfoContainer.push_back(result2);
423 else if(numberOfVertices==1) {
424 Trk::VxCascadeInfo* result =
fitMainVtx(ctx, *jxItr, massesJX, V0Itr1->first, V0Itr1->second, V0Itr2->first, V0Itr2->second, trackCols, defaultPVContainer.
cptr(), pvContainer.
cptr());
425 if(result) cascadeinfoContainer.push_back(result);
427 else if(numberOfVertices==-1) {
428 Trk::VxCascadeInfo* result =
fitMainVtx(ctx, *jxItr, massesJX, V0Itr2->first, V0Itr2->second, V0Itr1->first, V0Itr1->second, trackCols, defaultPVContainer.
cptr(), pvContainer.
cptr());
429 if(result) cascadeinfoContainer.push_back(result);
435 return StatusCode::SUCCESS;
443 ATH_MSG_FATAL(
"Incorrect number of output cascade vertices");
444 return StatusCode::FAILURE;
447 std::array<SG::WriteHandle<xAOD::VertexContainer>, 4> VtxWriteHandles;
int ikey(0);
450 ATH_CHECK( VtxWriteHandles[ikey].record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()) );
460 if (defaultPVContainer.
cptr()->size()==0) {
462 return StatusCode::RECOVERABLE;
464 else primaryVertex = (*defaultPVContainer.
cptr())[0];
472 ATH_CHECK( refPvContainer.
record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()) );
480 std::vector<const xAOD::TrackParticleContainer*> trackCols;
484 trackCols.push_back(handle.cptr());
491 ATH_CHECK( V0OutputContainer.
record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()) );
498 if(jxContainer->size()==0)
return StatusCode::SUCCESS;
501 std::vector<const xAOD::TrackParticle*> tracksDisplaced;
510 if(!
m_useTRT && nclus == 0)
continue;
512 bool trk_cut =
false;
513 if(nclus != 0) trk_cut =
true;
514 if(nclus == 0 && TP->pt()>=
m_ptTRT) trk_cut =
true;
515 if(!trk_cut)
continue;
518 if(!
d0Pass(TP,primaryVertex))
continue;
520 tracksDisplaced.push_back(TP);
525 SG::AuxElement::Accessor<std::string> mAcc_type(
"Type_V0Vtx");
526 SG::AuxElement::Accessor<int> mAcc_gfit(
"gamma_fit");
527 SG::AuxElement::Accessor<float> mAcc_gmass(
"gamma_mass");
528 SG::AuxElement::Accessor<float> mAcc_gchisq(
"gamma_chisq");
529 SG::AuxElement::Accessor<int> mAcc_gndof(
"gamma_ndof");
531 std::vector<std::pair<const xAOD::Vertex*,V0Enum> > selectedV0Candidates;
539 std::string type_V0Vtx;
540 if(mAcc_type.isAvailable(*vtx)) type_V0Vtx = mAcc_type(*vtx);
543 if(type_V0Vtx ==
"Lambda") {
548 else if(type_V0Vtx ==
"Lambdabar") {
553 else if(type_V0Vtx ==
"Ks") {
565 int gamma_fit = mAcc_gfit.isAvailable(*vtx) ? mAcc_gfit(*vtx) : 0;
566 double gamma_mass = mAcc_gmass.isAvailable(*vtx) ? mAcc_gmass(*vtx) : -1;
567 double gamma_chisq = mAcc_gchisq.isAvailable(*vtx) ? mAcc_gchisq(*vtx) : 999999;
568 double gamma_ndof = mAcc_gndof.isAvailable(*vtx) ? mAcc_gndof(*vtx) : 0;
571 selectedV0Candidates.push_back(std::pair<const xAOD::Vertex*,V0Enum>{vtx,opt});
579 std::string type_V0Vtx;
580 if(mAcc_type.isAvailable(*vtx)) type_V0Vtx = mAcc_type(*vtx);
583 if(type_V0Vtx ==
"Lambda") {
588 else if(type_V0Vtx ==
"Lambdabar") {
593 else if(type_V0Vtx ==
"Ks") {
605 int gamma_fit = mAcc_gfit.isAvailable(*vtx) ? mAcc_gfit(*vtx) : 0;
606 double gamma_mass = mAcc_gmass.isAvailable(*vtx) ? mAcc_gmass(*vtx) : -1;
607 double gamma_chisq = mAcc_gchisq.isAvailable(*vtx) ? mAcc_gchisq(*vtx) : 999999;
608 double gamma_ndof = mAcc_gndof.isAvailable(*vtx) ? mAcc_gndof(*vtx) : 0;
611 selectedV0Candidates.push_back(std::pair<const xAOD::Vertex*,V0Enum>{vtx,opt});
616 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(); } );
618 selectedV0Candidates.erase(selectedV0Candidates.begin()+
m_maxV0Candidates, selectedV0Candidates.end());
620 if(selectedV0Candidates.size()==0)
return StatusCode::SUCCESS;
622 std::vector<Trk::VxCascadeInfo*> cascadeinfoContainer;
628 for(
auto it=cascadeinfoContainer.begin()+
m_maxMainVCandidates; it!=cascadeinfoContainer.end(); it++)
delete *it;
629 cascadeinfoContainer.erase(cascadeinfoContainer.begin()+
m_maxMainVCandidates, cascadeinfoContainer.end());
638 SG::AuxElement::Decorator<VertexLinkVector> CascadeLinksDecor(
"CascadeVertexLinks");
639 SG::AuxElement::Decorator<float> chi2_decor(
"ChiSquared");
640 SG::AuxElement::Decorator<int> ndof_decor(
"nDoF");
641 SG::AuxElement::Decorator<float> Pt_decor(
"Pt");
642 SG::AuxElement::Decorator<float> PtErr_decor(
"PtErr");
644 SG::AuxElement::Decorator<float> lxy_SV1_decor(
"lxy_SV1");
645 SG::AuxElement::Decorator<float> lxyErr_SV1_decor(
"lxyErr_SV1");
646 SG::AuxElement::Decorator<float> a0xy_SV1_decor(
"a0xy_SV1");
647 SG::AuxElement::Decorator<float> a0xyErr_SV1_decor(
"a0xyErr_SV1");
648 SG::AuxElement::Decorator<float> a0z_SV1_decor(
"a0z_SV1");
649 SG::AuxElement::Decorator<float> a0zErr_SV1_decor(
"a0zErr_SV1");
651 SG::AuxElement::Decorator<float> lxy_SV2_decor(
"lxy_SV2");
652 SG::AuxElement::Decorator<float> lxyErr_SV2_decor(
"lxyErr_SV2");
653 SG::AuxElement::Decorator<float> a0xy_SV2_decor(
"a0xy_SV2");
654 SG::AuxElement::Decorator<float> a0xyErr_SV2_decor(
"a0xyErr_SV2");
655 SG::AuxElement::Decorator<float> a0z_SV2_decor(
"a0z_SV2");
656 SG::AuxElement::Decorator<float> a0zErr_SV2_decor(
"a0zErr_SV2");
658 SG::AuxElement::Decorator<float> lxy_SV3_decor(
"lxy_SV3");
659 SG::AuxElement::Decorator<float> lxyErr_SV3_decor(
"lxyErr_SV3");
660 SG::AuxElement::Decorator<float> a0xy_SV3_decor(
"a0xy_SV3");
661 SG::AuxElement::Decorator<float> a0xyErr_SV3_decor(
"a0xyErr_SV3");
662 SG::AuxElement::Decorator<float> a0z_SV3_decor(
"a0z_SV3");
663 SG::AuxElement::Decorator<float> a0zErr_SV3_decor(
"a0zErr_SV3");
665 SG::AuxElement::Decorator<float> chi2_V3_decor(
"ChiSquared_V3");
666 SG::AuxElement::Decorator<int> ndof_V3_decor(
"nDoF_V3");
668 for(
auto cascade_info : cascadeinfoContainer) {
669 if(cascade_info==
nullptr) {
674 const std::vector<xAOD::Vertex*> &cascadeVertices = cascade_info->vertices();
675 if(cascadeVertices.size() != topoN)
ATH_MSG_ERROR(
"Incorrect number of vertices");
676 for(
size_t i=0; i<topoN; i++) {
677 if(cascadeVertices[i]==
nullptr)
ATH_MSG_ERROR(
"Error null vertex");
680 cascade_info->setSVOwnership(
false);
681 const auto mainVertex = cascadeVertices[topoN-1];
682 const std::vector< std::vector<TLorentzVector> > &moms = cascade_info->getParticleMoms();
706 PtErr_decor(*mainVertex) =
m_CascadeTools->pTError(moms[topoN-1],cascade_info->getCovariance()[topoN-1]);
708 chi2_decor(*mainVertex) = cascade_info->fitChi2();
709 ndof_decor(*mainVertex) = cascade_info->nDoF();
712 lxy_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],mainVertex);
713 lxyErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->lxyError(moms[0],cascade_info->getCovariance()[0],cascadeVertices[0],mainVertex);
714 a0z_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0z(moms[0],cascadeVertices[0],mainVertex);
715 a0zErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0zError(moms[0],cascade_info->getCovariance()[0],cascadeVertices[0],mainVertex);
716 a0xy_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],mainVertex);
717 a0xyErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xyError(moms[0],cascade_info->getCovariance()[0],cascadeVertices[0],mainVertex);
720 lxy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],cascadeVertices[2]);
721 lxyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxyError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],cascadeVertices[2]);
722 a0z_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0z(moms[1],cascadeVertices[1],cascadeVertices[2]);
723 a0zErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0zError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],cascadeVertices[2]);
724 a0xy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xy(moms[1],cascadeVertices[1],cascadeVertices[2]);
725 a0xyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xyError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],cascadeVertices[2]);
728 lxy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],mainVertex);
729 lxyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxyError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],mainVertex);
730 a0z_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0z(moms[1],cascadeVertices[1],mainVertex);
731 a0zErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0zError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],mainVertex);
732 a0xy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xy(moms[1],cascadeVertices[1],mainVertex);
733 a0xyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xyError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],mainVertex);
737 lxy_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->lxy(moms[2],cascadeVertices[2],mainVertex);
738 lxyErr_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->lxyError(moms[2],cascade_info->getCovariance()[2],cascadeVertices[2],mainVertex);
739 a0z_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->a0z(moms[2],cascadeVertices[2],mainVertex);
740 a0zErr_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->a0zError(moms[2],cascade_info->getCovariance()[2],cascadeVertices[2],mainVertex);
741 a0xy_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->a0xy(moms[2],cascadeVertices[2],mainVertex);
742 a0xyErr_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->a0xyError(moms[2],cascade_info->getCovariance()[2],cascadeVertices[2],mainVertex);
745 chi2_V3_decor(*cascadeVertices[2]) =
m_V0Tools->chisq(jxVtx);
746 ndof_V3_decor(*cascadeVertices[2]) =
m_V0Tools->ndof(jxVtx);
752 for(
size_t i=0; i<topoN; i++) {
753 VtxWriteHandles[i].ptr()->push_back(cascadeVertices[i]);
761 if( vertexLink1.
isValid() ) cascadeVertexLinks.push_back( vertexLink1 );
765 if( vertexLink2.
isValid() ) cascadeVertexLinks.push_back( vertexLink2 );
770 if( vertexLink3.
isValid() ) cascadeVertexLinks.push_back( vertexLink3 );
772 CascadeLinksDecor(*mainVertex) = cascadeVertexLinks;
776 for (
auto cascade_info : cascadeinfoContainer) {
777 if(cascade_info)
delete cascade_info;
780 return StatusCode::SUCCESS;
797 std::vector<const xAOD::TrackParticle*> tracksJX;
799 if (tracksJX.size() != massesJX.size()) {
800 ATH_MSG_ERROR(
"Problems with JX input: number of tracks or track mass inputs is not correct!");
803 std::vector<const xAOD::TrackParticle*> tracksV01;
805 std::vector<const xAOD::TrackParticle*> tracksV02;
808 std::vector<const xAOD::TrackParticle*> tracksJpsi{tracksJX[0], tracksJX[1]};
809 std::vector<const xAOD::TrackParticle*> tracksX;
813 std::vector<double> massesV01;
817 std::vector<double> massesV02;
822 TLorentzVector p4_moth, p4_JX, p4_v01, p4_v02, tmp;
825 p4_moth += tmp; p4_JX += tmp;
828 for(
int it=0; it<V01_helper.
nRefTrks(); it++) {
829 p4_moth += V01_helper.
refTrk(it,massesV01[it]);
830 p4_v01 += V01_helper.
refTrk(it,massesV01[it]);
833 for(
int it=0; it<V02_helper.
nRefTrks(); it++) {
834 p4_moth += V02_helper.
refTrk(it,massesV02[it]);
835 p4_v02 += V02_helper.
refTrk(it,massesV02[it]);
837 double main_mass = p4_moth.M();
846 if (main_mass < m_MassLower || main_mass >
m_MassUpper)
return result;
849 double JXV02_mass = (p4_JX+p4_v02).M();
856 if (JXV02_mass < m_JXV02MassLower || JXV02_mass >
m_JXV02MassUpper)
return result;
867 std::unique_ptr<Trk::RecVertex> pv_AOD;
868 if(pv_xAOD) pv_AOD = std::make_unique<Trk::RecVertex>(pv_xAOD->
position(),pv_xAOD->covariancePosition(),pv_xAOD->
numberDoF(),pv_xAOD->
chiSquared());
870 SG::AuxElement::Decorator<float> chi2_V1_decor(
"ChiSquared_V1");
871 SG::AuxElement::Decorator<int> ndof_V1_decor(
"nDoF_V1");
872 SG::AuxElement::Decorator<std::string> type_V1_decor(
"Type_V1");
873 SG::AuxElement::Decorator<float> chi2_V2_decor(
"ChiSquared_V2");
874 SG::AuxElement::Decorator<int> ndof_V2_decor(
"nDoF_V2");
875 SG::AuxElement::Decorator<std::string> type_V2_decor(
"Type_V2");
877 SG::AuxElement::Accessor<int> mAcc_gfit(
"gamma_fit");
878 SG::AuxElement::Accessor<float> mAcc_gmass(
"gamma_mass");
879 SG::AuxElement::Accessor<float> mAcc_gmasserr(
"gamma_massError");
880 SG::AuxElement::Accessor<float> mAcc_gchisq(
"gamma_chisq");
881 SG::AuxElement::Accessor<int> mAcc_gndof(
"gamma_ndof");
882 SG::AuxElement::Accessor<float> mAcc_gprob(
"gamma_probability");
884 SG::AuxElement::Decorator<int> mDec_gfit(
"gamma_fit");
885 SG::AuxElement::Decorator<float> mDec_gmass(
"gamma_mass");
886 SG::AuxElement::Decorator<float> mDec_gmasserr(
"gamma_massError");
887 SG::AuxElement::Decorator<float> mDec_gchisq(
"gamma_chisq");
888 SG::AuxElement::Decorator<int> mDec_gndof(
"gamma_ndof");
889 SG::AuxElement::Decorator<float> mDec_gprob(
"gamma_probability");
890 SG::AuxElement::Decorator< std::vector<float> > trk_pxDeco(
"TrackPx_V0nc");
891 SG::AuxElement::Decorator< std::vector<float> > trk_pyDeco(
"TrackPy_V0nc");
892 SG::AuxElement::Decorator< std::vector<float> > trk_pzDeco(
"TrackPz_V0nc");
894 std::vector<float> trk_px;
895 std::vector<float> trk_py;
896 std::vector<float> trk_pz;
899 std::unique_ptr<Trk::IVKalState> state =
m_iVertexFitter->makeState(ctx);
905 std::vector<Trk::VertexID> vrtList;
914 vrtList.push_back(vID1);
922 vrtList.push_back(vID2);
927 std::vector<Trk::VertexID> vrtList1{vID1};
928 std::vector<Trk::VertexID> vrtList2{vID2};
934 vrtList1.push_back(vID3);
936 std::vector<Trk::VertexID> cnstV; cnstV.clear();
942 std::vector<const xAOD::TrackParticle*> tp; tp.clear();
943 std::vector<double> tp_masses; tp_masses.clear();
957 vrtList.push_back(vID3);
959 std::vector<const xAOD::TrackParticle*> tp; tp.clear();
960 std::vector<double> tp_masses; tp_masses.clear();
976 std::vector<Trk::VertexID> cnstV; cnstV.clear();
984 std::vector<Trk::VertexID> cnstV; cnstV.clear();
990 std::vector<Trk::VertexID> cnstV; cnstV.clear();
996 std::unique_ptr<Trk::VxCascadeInfo> fit_result = std::unique_ptr<Trk::VxCascadeInfo>(
m_iVertexFitter->fitCascade(*state, pv_AOD.get(), pv_AOD.get() &&
m_firstDecayAtPV ?
true :
false) );
998 if (fit_result !=
nullptr) {
999 for(
auto v : fit_result->vertices()) {
1000 if(v->nTrackParticles()==0) {
1001 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
1002 v->setTrackParticleLinks(nullLinkVector);
1009 fit_result->setSVOwnership(
true);
1012 double chi2DOF = fit_result->fitChi2()/fit_result->nDoF();
1015 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->getParticleMoms();
1016 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->vertices();
1017 size_t iMoth = cascadeVertices.size()-1;
1018 double lxy_SV1 =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[iMoth]);
1021 chi2_V1_decor(*cascadeVertices[0]) = V01vtx->
chiSquared();
1022 ndof_V1_decor(*cascadeVertices[0]) = V01vtx->
numberDoF();
1023 if(V01==
LAMBDA) type_V1_decor(*cascadeVertices[0]) =
"Lambda";
1024 else if(V01==
LAMBDABAR) type_V1_decor(*cascadeVertices[0]) =
"Lambdabar";
1025 else if(V01==
KS) type_V1_decor(*cascadeVertices[0]) =
"Ks";
1026 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.isAvailable(*V01vtx) ? mAcc_gfit(*V01vtx) : 0;
1027 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.isAvailable(*V01vtx) ? mAcc_gmass(*V01vtx) : -1;
1028 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.isAvailable(*V01vtx) ? mAcc_gmasserr(*V01vtx) : -1;
1029 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.isAvailable(*V01vtx) ? mAcc_gchisq(*V01vtx) : 999999;
1030 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.isAvailable(*V01vtx) ? mAcc_gndof(*V01vtx) : 0;
1031 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.isAvailable(*V01vtx) ? mAcc_gprob(*V01vtx) : -1;
1032 trk_px.clear(); trk_py.clear(); trk_pz.clear();
1033 for(
int it=0; it<V01_helper.
nRefTrks(); it++) {
1034 trk_px.push_back( V01_helper.
refTrk(it).Px() );
1035 trk_py.push_back( V01_helper.
refTrk(it).Py() );
1036 trk_pz.push_back( V01_helper.
refTrk(it).Pz() );
1038 trk_pxDeco(*cascadeVertices[0]) = trk_px;
1039 trk_pyDeco(*cascadeVertices[0]) = trk_py;
1040 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
1042 chi2_V2_decor(*cascadeVertices[1]) = V02vtx->
chiSquared();
1043 ndof_V2_decor(*cascadeVertices[1]) = V02vtx->
numberDoF();
1044 if(V02==
LAMBDA) type_V2_decor(*cascadeVertices[1]) =
"Lambda";
1045 else if(V02==
LAMBDABAR) type_V2_decor(*cascadeVertices[1]) =
"Lambdabar";
1046 else if(V02==
KS) type_V2_decor(*cascadeVertices[1]) =
"Ks";
1047 mDec_gfit(*cascadeVertices[1]) = mAcc_gfit.isAvailable(*V02vtx) ? mAcc_gfit(*V02vtx) : 0;
1048 mDec_gmass(*cascadeVertices[1]) = mAcc_gmass.isAvailable(*V02vtx) ? mAcc_gmass(*V02vtx) : -1;
1049 mDec_gmasserr(*cascadeVertices[1]) = mAcc_gmasserr.isAvailable(*V02vtx) ? mAcc_gmasserr(*V02vtx) : -1;
1050 mDec_gchisq(*cascadeVertices[1]) = mAcc_gchisq.isAvailable(*V02vtx) ? mAcc_gchisq(*V02vtx) : 999999;
1051 mDec_gndof(*cascadeVertices[1]) = mAcc_gndof.isAvailable(*V02vtx) ? mAcc_gndof(*V02vtx) : 0;
1052 mDec_gprob(*cascadeVertices[1]) = mAcc_gprob.isAvailable(*V02vtx) ? mAcc_gprob(*V02vtx) : -1;
1053 trk_px.clear(); trk_py.clear(); trk_pz.clear();
1054 for(
int it=0; it<V02_helper.
nRefTrks(); it++) {
1055 trk_px.push_back( V02_helper.
refTrk(it).Px() );
1056 trk_py.push_back( V02_helper.
refTrk(it).Py() );
1057 trk_pz.push_back( V02_helper.
refTrk(it).Pz() );
1059 trk_pxDeco(*cascadeVertices[1]) = trk_px;
1060 trk_pyDeco(*cascadeVertices[1]) = trk_py;
1061 trk_pzDeco(*cascadeVertices[1]) = trk_pz;
1063 result = fit_result.release();
1067 if(pv_xAOD && result && result->getParticleMoms().size()>0) {
1068 size_t index = result->getParticleMoms().size() - 1;
1069 const std::vector<TLorentzVector> &mom = result->getParticleMoms()[
index];
1073 bool isInDefaultPVCont =
false;
1075 if(pv_xAOD == pvVtx) { isInDefaultPVCont =
true;
break; }
1077 if(isInDefaultPVCont) vtx.
setPv( pv_xAOD, defaultPVContainer, pvtype );
1078 else vtx.
setPv( pv_xAOD, pvContainer, pvtype );
1079 if(origPv_xAOD) vtx.
setOrigPv( origPv_xAOD, defaultPVContainer, pvtype );
1100 const EventContext& ctx = Gaudi::Hive::currentContext();
1102 SG::AuxElement::Decorator<std::string> mDec_type(
"Type_V0Vtx");
1103 SG::AuxElement::Decorator<int> mDec_gfit(
"gamma_fit");
1104 SG::AuxElement::Decorator<float> mDec_gmass(
"gamma_mass");
1105 SG::AuxElement::Decorator<float> mDec_gmasserr(
"gamma_massError");
1106 SG::AuxElement::Decorator<float> mDec_gchisq(
"gamma_chisq");
1107 SG::AuxElement::Decorator<int> mDec_gndof(
"gamma_ndof");
1108 SG::AuxElement::Decorator<float> mDec_gprob(
"gamma_probability");
1110 std::vector<const xAOD::TrackParticle*> posTracks;
1111 std::vector<const xAOD::TrackParticle*> negTracks;
1113 if(TP->charge()>0) posTracks.push_back(TP);
1114 else negTracks.push_back(TP);
1118 const Trk::Perigee& aPerigee1 = TP1->perigeeParameters();
1120 const Trk::Perigee& aPerigee2 = TP2->perigeeParameters();
1121 int sflag(0), errorcode(0);
1123 if (errorcode != 0) {startingPoint(0) = 0.0; startingPoint(1) = 0.0; startingPoint(2) = 0.0;}
1125 if (errorcode == 0 || errorcode == 5 || errorcode == 6 || errorcode == 8) {
1129 std::vector<std::unique_ptr<const Trk::TrackParameters> > cleanup;
1130 if(!extrapolatedPerigee1) extrapolatedPerigee1 = &TP1->perigeeParameters();
1131 else cleanup.push_back(std::unique_ptr<const Trk::TrackParameters>(extrapolatedPerigee1));
1132 if(!extrapolatedPerigee2) extrapolatedPerigee2 = &TP2->perigeeParameters();
1133 else cleanup.push_back(std::unique_ptr<const Trk::TrackParameters>(extrapolatedPerigee2));
1134 if(extrapolatedPerigee1 && extrapolatedPerigee2) {
1136 TLorentzVector v1; TLorentzVector v2;
1140 if((v1+v2).M()>1030.0 && (v1+v2).M()<1200.0) pass =
true;
1145 if((v1+v2).M()>1030.0 && (v1+v2).M()<1200.0) pass =
true;
1150 if((v1+v2).M()>430.0 && (v1+v2).M()<565.0) pass =
true;
1153 std::vector<const xAOD::TrackParticle*> tracksV0;
1154 tracksV0.push_back(TP1); tracksV0.push_back(TP2);
1155 std::unique_ptr<xAOD::Vertex> V0vtx =
m_iV0Fitter->fit(ctx, tracksV0, startingPoint);
1156 if(V0vtx && V0vtx->chiSquared()>=0) {
1157 double chi2DOF = V0vtx->chiSquared()/V0vtx->numberDoF();
1163 if(massSig_V0_Lambda1<=massSig_V0_Lambda2 && massSig_V0_Lambda1<=massSig_V0_Ks) {
1164 mDec_type(*V0vtx.get()) =
"Lambda";
1166 else if(massSig_V0_Lambda2<=massSig_V0_Lambda1 && massSig_V0_Lambda2<=massSig_V0_Ks) {
1167 mDec_type(*V0vtx.get()) =
"Lambdabar";
1169 else if(massSig_V0_Ks<=massSig_V0_Lambda1 && massSig_V0_Ks<=massSig_V0_Lambda2) {
1170 mDec_type(*V0vtx.get()) =
"Ks";
1173 int gamma_fit = 0;
int gamma_ndof = 0;
double gamma_chisq = 999999.;
1174 double gamma_prob = -1., gamma_mass = -1., gamma_massErr = -1.;
1180 gamma_chisq =
m_V0Tools->chisq(gammaVtx.get());
1181 gamma_ndof =
m_V0Tools->ndof(gammaVtx.get());
1182 gamma_prob =
m_V0Tools->vertexProbability(gammaVtx.get());
1184 mDec_gfit(*V0vtx.get()) = gamma_fit;
1185 mDec_gmass(*V0vtx.get()) = gamma_mass;
1186 mDec_gmasserr(*V0vtx.get()) = gamma_massErr;
1187 mDec_gchisq(*V0vtx.get()) = gamma_chisq;
1188 mDec_gndof(*V0vtx.get()) = gamma_ndof;
1189 mDec_gprob(*V0vtx.get()) = gamma_prob;
1194 if(not trackCols.empty()){
1197 }
catch (std::runtime_error
const& e) {
1203 V0ContainerNew->
push_back(std::move(V0vtx));