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) {
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);
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;
569 double chisqPerNdof = (gamma_ndof > 0.) ? gamma_chisq/gamma_ndof : -999999.;
572 selectedV0Candidates.push_back(std::pair<const xAOD::Vertex*,V0Enum>{vtx,opt});
580 std::string type_V0Vtx;
581 if(mAcc_type.
isAvailable(*vtx)) type_V0Vtx = mAcc_type(*vtx);
584 if(type_V0Vtx ==
"Lambda") {
589 else if(type_V0Vtx ==
"Lambdabar") {
594 else if(type_V0Vtx ==
"Ks") {
606 int gamma_fit = mAcc_gfit.
isAvailable(*vtx) ? mAcc_gfit(*vtx) : 0;
607 double gamma_mass = mAcc_gmass.
isAvailable(*vtx) ? mAcc_gmass(*vtx) : -1;
608 double gamma_chisq = mAcc_gchisq.
isAvailable(*vtx) ? mAcc_gchisq(*vtx) : 999999;
609 double gamma_ndof = mAcc_gndof.
isAvailable(*vtx) ? mAcc_gndof(*vtx) : 0;
612 selectedV0Candidates.push_back(std::pair<const xAOD::Vertex*,V0Enum>{vtx,opt});
617 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(); } );
619 selectedV0Candidates.erase(selectedV0Candidates.begin()+
m_maxV0Candidates, selectedV0Candidates.end());
621 if(selectedV0Candidates.size()==0)
return StatusCode::SUCCESS;
623 std::vector<Trk::VxCascadeInfo*> cascadeinfoContainer;
629 for(
auto it=cascadeinfoContainer.begin()+
m_maxMainVCandidates; it!=cascadeinfoContainer.end(); it++)
delete *it;
630 cascadeinfoContainer.erase(cascadeinfoContainer.begin()+
m_maxMainVCandidates, cascadeinfoContainer.end());
669 for(
auto cascade_info : cascadeinfoContainer) {
670 if(cascade_info==
nullptr) {
675 const std::vector<xAOD::Vertex*> &cascadeVertices = cascade_info->vertices();
676 if(cascadeVertices.size() != topoN)
ATH_MSG_ERROR(
"Incorrect number of vertices");
677 for(
size_t i=0; i<topoN; i++) {
678 if(cascadeVertices[i]==
nullptr)
ATH_MSG_ERROR(
"Error null vertex");
681 cascade_info->setSVOwnership(
false);
682 const auto mainVertex = cascadeVertices[topoN-1];
683 const std::vector< std::vector<TLorentzVector> > &moms = cascade_info->getParticleMoms();
707 PtErr_decor(*mainVertex) =
m_CascadeTools->pTError(moms[topoN-1],cascade_info->getCovariance()[topoN-1]);
709 chi2_decor(*mainVertex) = cascade_info->fitChi2();
710 ndof_decor(*mainVertex) = cascade_info->nDoF();
713 lxy_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],mainVertex);
714 lxyErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->lxyError(moms[0],cascade_info->getCovariance()[0],cascadeVertices[0],mainVertex);
715 a0z_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0z(moms[0],cascadeVertices[0],mainVertex);
716 a0zErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0zError(moms[0],cascade_info->getCovariance()[0],cascadeVertices[0],mainVertex);
717 a0xy_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],mainVertex);
718 a0xyErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xyError(moms[0],cascade_info->getCovariance()[0],cascadeVertices[0],mainVertex);
721 lxy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],cascadeVertices[2]);
722 lxyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxyError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],cascadeVertices[2]);
723 a0z_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0z(moms[1],cascadeVertices[1],cascadeVertices[2]);
724 a0zErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0zError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],cascadeVertices[2]);
725 a0xy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xy(moms[1],cascadeVertices[1],cascadeVertices[2]);
726 a0xyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xyError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],cascadeVertices[2]);
729 lxy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],mainVertex);
730 lxyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxyError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],mainVertex);
731 a0z_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0z(moms[1],cascadeVertices[1],mainVertex);
732 a0zErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0zError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],mainVertex);
733 a0xy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xy(moms[1],cascadeVertices[1],mainVertex);
734 a0xyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xyError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],mainVertex);
738 lxy_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->lxy(moms[2],cascadeVertices[2],mainVertex);
739 lxyErr_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->lxyError(moms[2],cascade_info->getCovariance()[2],cascadeVertices[2],mainVertex);
740 a0z_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->a0z(moms[2],cascadeVertices[2],mainVertex);
741 a0zErr_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->a0zError(moms[2],cascade_info->getCovariance()[2],cascadeVertices[2],mainVertex);
742 a0xy_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->a0xy(moms[2],cascadeVertices[2],mainVertex);
743 a0xyErr_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->a0xyError(moms[2],cascade_info->getCovariance()[2],cascadeVertices[2],mainVertex);
746 chi2_V3_decor(*cascadeVertices[2]) =
m_V0Tools->chisq(jxVtx);
747 ndof_V3_decor(*cascadeVertices[2]) =
m_V0Tools->ndof(jxVtx);
753 for(
size_t i=0; i<topoN; i++) {
754 VtxWriteHandles[i].ptr()->push_back(cascadeVertices[i]);
762 if( vertexLink1.
isValid() ) cascadeVertexLinks.push_back( vertexLink1 );
766 if( vertexLink2.
isValid() ) cascadeVertexLinks.push_back( vertexLink2 );
771 if( vertexLink3.
isValid() ) cascadeVertexLinks.push_back( vertexLink3 );
773 CascadeLinksDecor(*mainVertex) = std::move(cascadeVertexLinks);
777 for (
auto cascade_info : cascadeinfoContainer) {
778 if(cascade_info)
delete cascade_info;
781 return StatusCode::SUCCESS;
798 std::vector<const xAOD::TrackParticle*> tracksJX;
800 if (tracksJX.size() != massesJX.size()) {
801 ATH_MSG_ERROR(
"Problems with JX input: number of tracks or track mass inputs is not correct!");
804 std::vector<const xAOD::TrackParticle*> tracksV01;
806 std::vector<const xAOD::TrackParticle*> tracksV02;
809 std::vector<const xAOD::TrackParticle*> tracksJpsi{tracksJX[0], tracksJX[1]};
810 std::vector<const xAOD::TrackParticle*> tracksX;
814 std::vector<double> massesV01;
818 std::vector<double> massesV02;
823 TLorentzVector p4_moth, p4_JX, p4_v01, p4_v02, tmp;
826 p4_moth += tmp; p4_JX += tmp;
829 for(
int it=0; it<V01_helper.
nRefTrks(); it++) {
830 p4_moth += V01_helper.
refTrk(it,massesV01[it]);
831 p4_v01 += V01_helper.
refTrk(it,massesV01[it]);
834 for(
int it=0; it<V02_helper.
nRefTrks(); it++) {
835 p4_moth += V02_helper.
refTrk(it,massesV02[it]);
836 p4_v02 += V02_helper.
refTrk(it,massesV02[it]);
838 double main_mass = p4_moth.M();
847 if (main_mass < m_MassLower || main_mass >
m_MassUpper)
return result;
850 double JXV02_mass = (p4_JX+p4_v02).M();
857 if (JXV02_mass < m_JXV02MassLower || JXV02_mass >
m_JXV02MassUpper)
return result;
868 std::unique_ptr<Trk::RecVertex> pv_AOD;
869 if(pv_xAOD) pv_AOD = std::make_unique<Trk::RecVertex>(pv_xAOD->
position(),pv_xAOD->covariancePosition(),pv_xAOD->
numberDoF(),pv_xAOD->
chiSquared());
895 std::vector<float> trk_px;
896 std::vector<float> trk_py;
897 std::vector<float> trk_pz;
900 std::unique_ptr<Trk::IVKalState> state =
m_iVertexFitter->makeState(ctx);
906 std::vector<Trk::VertexID> vrtList;
915 vrtList.push_back(vID1);
923 vrtList.push_back(vID2);
928 std::vector<Trk::VertexID> vrtList1{vID1};
929 std::vector<Trk::VertexID> vrtList2{vID2};
935 vrtList1.push_back(vID3);
937 std::vector<Trk::VertexID> cnstV; cnstV.clear();
943 std::vector<const xAOD::TrackParticle*> tp; tp.clear();
944 std::vector<double> tp_masses; tp_masses.clear();
958 vrtList.push_back(vID3);
960 std::vector<const xAOD::TrackParticle*> tp; tp.clear();
961 std::vector<double> tp_masses; tp_masses.clear();
977 std::vector<Trk::VertexID> cnstV; cnstV.clear();
985 std::vector<Trk::VertexID> cnstV; cnstV.clear();
991 std::vector<Trk::VertexID> cnstV; cnstV.clear();
997 std::unique_ptr<Trk::VxCascadeInfo> fit_result = std::unique_ptr<Trk::VxCascadeInfo>(
m_iVertexFitter->fitCascade(*state, pv_AOD.get(), pv_AOD.get() &&
m_firstDecayAtPV ?
true :
false) );
999 if (fit_result !=
nullptr) {
1000 for(
auto v : fit_result->vertices()) {
1001 if(v->nTrackParticles()==0) {
1002 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
1003 v->setTrackParticleLinks(nullLinkVector);
1010 fit_result->setSVOwnership(
true);
1013 double chi2DOF = fit_result->fitChi2()/fit_result->nDoF();
1016 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->getParticleMoms();
1017 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->vertices();
1018 size_t iMoth = cascadeVertices.size()-1;
1019 double lxy_SV1 =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[iMoth]);
1022 chi2_V1_decor(*cascadeVertices[0]) = V01vtx->
chiSquared();
1023 ndof_V1_decor(*cascadeVertices[0]) = V01vtx->
numberDoF();
1024 if(V01==
LAMBDA) type_V1_decor(*cascadeVertices[0]) =
"Lambda";
1025 else if(V01==
LAMBDABAR) type_V1_decor(*cascadeVertices[0]) =
"Lambdabar";
1026 else if(V01==
KS) type_V1_decor(*cascadeVertices[0]) =
"Ks";
1027 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.
isAvailable(*V01vtx) ? mAcc_gfit(*V01vtx) : 0;
1028 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.
isAvailable(*V01vtx) ? mAcc_gmass(*V01vtx) : -1;
1029 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.
isAvailable(*V01vtx) ? mAcc_gmasserr(*V01vtx) : -1;
1030 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.
isAvailable(*V01vtx) ? mAcc_gchisq(*V01vtx) : 999999;
1031 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.
isAvailable(*V01vtx) ? mAcc_gndof(*V01vtx) : 0;
1032 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.
isAvailable(*V01vtx) ? mAcc_gprob(*V01vtx) : -1;
1033 trk_px.clear(); trk_py.clear(); trk_pz.clear();
1034 for(
int it=0; it<V01_helper.
nRefTrks(); it++) {
1035 trk_px.push_back( V01_helper.
refTrk(it).Px() );
1036 trk_py.push_back( V01_helper.
refTrk(it).Py() );
1037 trk_pz.push_back( V01_helper.
refTrk(it).Pz() );
1039 trk_pxDeco(*cascadeVertices[0]) = trk_px;
1040 trk_pyDeco(*cascadeVertices[0]) = trk_py;
1041 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
1043 chi2_V2_decor(*cascadeVertices[1]) = V02vtx->
chiSquared();
1044 ndof_V2_decor(*cascadeVertices[1]) = V02vtx->
numberDoF();
1045 if(V02==
LAMBDA) type_V2_decor(*cascadeVertices[1]) =
"Lambda";
1046 else if(V02==
LAMBDABAR) type_V2_decor(*cascadeVertices[1]) =
"Lambdabar";
1047 else if(V02==
KS) type_V2_decor(*cascadeVertices[1]) =
"Ks";
1048 mDec_gfit(*cascadeVertices[1]) = mAcc_gfit.
isAvailable(*V02vtx) ? mAcc_gfit(*V02vtx) : 0;
1049 mDec_gmass(*cascadeVertices[1]) = mAcc_gmass.
isAvailable(*V02vtx) ? mAcc_gmass(*V02vtx) : -1;
1050 mDec_gmasserr(*cascadeVertices[1]) = mAcc_gmasserr.
isAvailable(*V02vtx) ? mAcc_gmasserr(*V02vtx) : -1;
1051 mDec_gchisq(*cascadeVertices[1]) = mAcc_gchisq.
isAvailable(*V02vtx) ? mAcc_gchisq(*V02vtx) : 999999;
1052 mDec_gndof(*cascadeVertices[1]) = mAcc_gndof.
isAvailable(*V02vtx) ? mAcc_gndof(*V02vtx) : 0;
1053 mDec_gprob(*cascadeVertices[1]) = mAcc_gprob.
isAvailable(*V02vtx) ? mAcc_gprob(*V02vtx) : -1;
1054 trk_px.clear(); trk_py.clear(); trk_pz.clear();
1055 for(
int it=0; it<V02_helper.
nRefTrks(); it++) {
1056 trk_px.push_back( V02_helper.
refTrk(it).Px() );
1057 trk_py.push_back( V02_helper.
refTrk(it).Py() );
1058 trk_pz.push_back( V02_helper.
refTrk(it).Pz() );
1060 trk_pxDeco(*cascadeVertices[1]) = std::move(trk_px);
1061 trk_pyDeco(*cascadeVertices[1]) = std::move(trk_py);
1062 trk_pzDeco(*cascadeVertices[1]) = std::move(trk_pz);
1064 result = fit_result.release();
1068 if(pv_xAOD && result && result->getParticleMoms().size()>0) {
1069 size_t index = result->getParticleMoms().size() - 1;
1070 const std::vector<TLorentzVector> &mom = result->getParticleMoms()[
index];
1074 bool isInDefaultPVCont =
false;
1076 if(pv_xAOD == pvVtx) { isInDefaultPVCont =
true;
break; }
1078 if(isInDefaultPVCont) vtx.
setPv( pv_xAOD, defaultPVContainer, pvtype );
1079 else vtx.
setPv( pv_xAOD, pvContainer, pvtype );
1080 if(origPv_xAOD) vtx.
setOrigPv( origPv_xAOD, defaultPVContainer, pvtype );
1101 const EventContext& ctx = Gaudi::Hive::currentContext();
1111 std::vector<const xAOD::TrackParticle*> posTracks;
1112 std::vector<const xAOD::TrackParticle*> negTracks;
1114 if(TP->charge()>0) posTracks.push_back(TP);
1115 else negTracks.push_back(TP);
1119 const Trk::Perigee& aPerigee1 = TP1->perigeeParameters();
1121 const Trk::Perigee& aPerigee2 = TP2->perigeeParameters();
1122 int sflag(0), errorcode(0);
1124 if (errorcode != 0) {startingPoint(0) = 0.0; startingPoint(1) = 0.0; startingPoint(2) = 0.0;}
1126 if (errorcode == 0 || errorcode == 5 || errorcode == 6 || errorcode == 8) {
1130 std::vector<std::unique_ptr<const Trk::TrackParameters> > cleanup;
1131 if(!extrapolatedPerigee1) extrapolatedPerigee1 = &TP1->perigeeParameters();
1132 else cleanup.push_back(std::unique_ptr<const Trk::TrackParameters>(extrapolatedPerigee1));
1133 if(!extrapolatedPerigee2) extrapolatedPerigee2 = &TP2->perigeeParameters();
1134 else cleanup.push_back(std::unique_ptr<const Trk::TrackParameters>(extrapolatedPerigee2));
1135 if(extrapolatedPerigee1 && extrapolatedPerigee2) {
1137 TLorentzVector v1; TLorentzVector v2;
1141 if((v1+v2).M()>1030.0 && (v1+v2).M()<1200.0) pass =
true;
1146 if((v1+v2).M()>1030.0 && (v1+v2).M()<1200.0) pass =
true;
1151 if((v1+v2).M()>430.0 && (v1+v2).M()<565.0) pass =
true;
1154 std::vector<const xAOD::TrackParticle*> tracksV0;
1155 tracksV0.push_back(TP1); tracksV0.push_back(TP2);
1156 std::unique_ptr<xAOD::Vertex> V0vtx =
m_iV0Fitter->fit(ctx, tracksV0, startingPoint);
1157 if(V0vtx && V0vtx->chiSquared()>=0) {
1158 double chi2DOF = V0vtx->chiSquared()/V0vtx->numberDoF();
1164 if(massSig_V0_Lambda1<=massSig_V0_Lambda2 && massSig_V0_Lambda1<=massSig_V0_Ks) {
1165 mDec_type(*V0vtx.get()) =
"Lambda";
1167 else if(massSig_V0_Lambda2<=massSig_V0_Lambda1 && massSig_V0_Lambda2<=massSig_V0_Ks) {
1168 mDec_type(*V0vtx.get()) =
"Lambdabar";
1170 else if(massSig_V0_Ks<=massSig_V0_Lambda1 && massSig_V0_Ks<=massSig_V0_Lambda2) {
1171 mDec_type(*V0vtx.get()) =
"Ks";
1174 int gamma_fit = 0;
int gamma_ndof = 0;
double gamma_chisq = 999999.;
1175 double gamma_prob = -1., gamma_mass = -1., gamma_massErr = -1.;
1181 gamma_chisq =
m_V0Tools->chisq(gammaVtx.get());
1182 gamma_ndof =
m_V0Tools->ndof(gammaVtx.get());
1183 gamma_prob =
m_V0Tools->vertexProbability(gammaVtx.get());
1185 mDec_gfit(*V0vtx.get()) = gamma_fit;
1186 mDec_gmass(*V0vtx.get()) = gamma_mass;
1187 mDec_gmasserr(*V0vtx.get()) = gamma_massErr;
1188 mDec_gchisq(*V0vtx.get()) = gamma_chisq;
1189 mDec_gndof(*V0vtx.get()) = gamma_ndof;
1190 mDec_gprob(*V0vtx.get()) = gamma_prob;
1195 if(not trackCols.empty()){
1198 }
catch (std::runtime_error
const& e) {
1204 V0ContainerNew->
push_back(std::move(V0vtx));