284 StatusCode
JpsiXPlus2V0::performSearch(std::vector<Trk::VxCascadeInfo*>& cascadeinfoContainer,
const std::vector<std::pair<const xAOD::Vertex*,V0Enum> >& selectedV0Candidates,
const EventContext& ctx)
const {
286 if(selectedV0Candidates.size()==0)
return StatusCode::SUCCESS;
289 std::vector<const xAOD::TrackParticleContainer*> trackCols;
293 trackCols.push_back(handle.
cptr());
313 std::vector<const xAOD::Vertex*> selectedJXCandidates;
314 for(
auto vxcItr=jxContainer.
ptr()->begin(); vxcItr!=jxContainer.
ptr()->end(); ++vxcItr) {
327 TLorentzVector p4_mu1, p4_mu2;
330 double mass_jpsi = (p4_mu1 + p4_mu2).M();
331 if (mass_jpsi < m_jpsiMassLower || mass_jpsi >
m_jpsiMassUpper)
continue;
333 TLorentzVector p4_trk1, p4_trk2;
338 double mass_jx = (p4_mu1 + p4_mu2 + p4_trk1).M();
340 if(mass_jx < m_jxMassLower || mass_jx >
m_jxMassUpper)
continue;
343 double mass_jx = (p4_mu1 + p4_mu2 + p4_trk1 + p4_trk2).M();
345 if(mass_jx < m_jxMassLower || mass_jx >
m_jxMassUpper)
continue;
348 double mass_diTrk = (p4_trk1 + p4_trk2).M();
356 selectedJXCandidates.push_back(vtx);
358 if(selectedJXCandidates.size()==0)
return StatusCode::SUCCESS;
360 std::sort( selectedJXCandidates.begin(), selectedJXCandidates.end(), [](
const xAOD::Vertex*
a,
const xAOD::Vertex* b) { return a->chiSquared()/a->numberDoF() < b->chiSquared()/b->numberDoF(); } );
362 selectedJXCandidates.erase(selectedJXCandidates.begin()+
m_maxJXCandidates, selectedJXCandidates.end());
366 std::vector<const xAOD::TrackParticle*> tracksJX; tracksJX.reserve(
m_jxDaug_num);
367 std::vector<const xAOD::TrackParticle*> tracksV01; tracksV01.reserve(2);
368 for(
auto jxItr=selectedJXCandidates.cbegin(); jxItr!=selectedJXCandidates.cend(); ++jxItr) {
370 for(
size_t i=0; i<(*jxItr)->nTrackParticles(); i++) tracksJX.push_back((*jxItr)->trackParticle(i));
371 for(
auto V0Itr1=selectedV0Candidates.cbegin(); V0Itr1!=selectedV0Candidates.cend(); ++V0Itr1) {
372 if(std::find(tracksJX.cbegin(), tracksJX.cend(), V0Itr1->first->trackParticle(0)) != tracksJX.cend())
continue;
373 if(std::find(tracksJX.cbegin(), tracksJX.cend(), V0Itr1->first->trackParticle(1)) != tracksJX.cend())
continue;
375 for(
size_t j=0; j<V0Itr1->first->nTrackParticles(); j++) tracksV01.push_back(V0Itr1->first->trackParticle(j));
376 for(
auto V0Itr2=V0Itr1+1; V0Itr2!=selectedV0Candidates.cend(); ++V0Itr2) {
377 if(std::find(tracksJX.cbegin(), tracksJX.cend(), V0Itr2->first->trackParticle(0)) != tracksJX.cend())
continue;
378 if(std::find(tracksJX.cbegin(), tracksJX.cend(), V0Itr2->first->trackParticle(1)) != tracksJX.cend())
continue;
379 if(std::find(tracksV01.cbegin(), tracksV01.cend(), V0Itr2->first->trackParticle(0)) != tracksV01.cend())
continue;
380 if(std::find(tracksV01.cbegin(), tracksV01.cend(), V0Itr2->first->trackParticle(1)) != tracksV01.cend())
continue;
382 int numberOfVertices = 0;
392 else numberOfVertices = -1;
401 else numberOfVertices = -1;
405 if(V0Itr1->second==
KS && (V0Itr2->second==
LAMBDA || V0Itr2->second==
LAMBDABAR)) numberOfVertices = 1;
406 else if(V0Itr2->second==
KS && (V0Itr1->second==
LAMBDA || V0Itr1->second==
LAMBDABAR)) numberOfVertices = -1;
409 if((V0Itr1->second==
LAMBDA || V0Itr1->second==
LAMBDABAR) && V0Itr2->second==
KS) numberOfVertices = 1;
410 else if((V0Itr2->second==
LAMBDA || V0Itr2->second==
LAMBDABAR) && V0Itr1->second==
KS) numberOfVertices = -1;
419 if(numberOfVertices==2) {
420 Trk::VxCascadeInfo* result1 =
fitMainVtx(*jxItr, massesJX, V0Itr1->first, V0Itr1->second, V0Itr2->first, V0Itr2->second, trackCols, defaultPVContainer.
cptr(), pvContainer.
cptr());
421 if(result1) cascadeinfoContainer.push_back(result1);
422 Trk::VxCascadeInfo* result2 =
fitMainVtx(*jxItr, massesJX, V0Itr2->first, V0Itr2->second, V0Itr1->first, V0Itr1->second, trackCols, defaultPVContainer.
cptr(), pvContainer.
cptr());
423 if(result2) cascadeinfoContainer.push_back(result2);
425 else if(numberOfVertices==1) {
429 else if(numberOfVertices==-1) {
437 return StatusCode::SUCCESS;
445 ATH_MSG_FATAL(
"Incorrect number of output cascade vertices");
446 return StatusCode::FAILURE;
449 std::array<SG::WriteHandle<xAOD::VertexContainer>, 4> VtxWriteHandles;
int ikey(0);
452 ATH_CHECK( VtxWriteHandles[ikey].record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()) );
462 if (defaultPVContainer.
cptr()->size()==0) {
464 return StatusCode::RECOVERABLE;
466 else primaryVertex = (*defaultPVContainer.
cptr())[0];
474 ATH_CHECK( refPvContainer.
record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()) );
482 std::vector<const xAOD::TrackParticleContainer*> trackCols;
486 trackCols.push_back(handle.
cptr());
493 ATH_CHECK( V0OutputContainer.
record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()) );
500 if(jxContainer->size()==0)
return StatusCode::SUCCESS;
503 std::vector<const xAOD::TrackParticle*> tracksDisplaced;
512 if(!
m_useTRT && nclus == 0)
continue;
514 bool trk_cut =
false;
515 if(nclus != 0) trk_cut =
true;
516 if(nclus == 0 && TP->pt()>=
m_ptTRT) trk_cut =
true;
517 if(!trk_cut)
continue;
520 if(!
d0Pass(TP,primaryVertex))
continue;
522 tracksDisplaced.push_back(TP);
533 std::vector<std::pair<const xAOD::Vertex*,V0Enum> > selectedV0Candidates;
541 std::string type_V0Vtx;
542 if(mAcc_type.
isAvailable(*vtx)) type_V0Vtx = mAcc_type(*vtx);
545 if(type_V0Vtx ==
"Lambda") {
550 else if(type_V0Vtx ==
"Lambdabar") {
555 else if(type_V0Vtx ==
"Ks") {
567 int gamma_fit = mAcc_gfit.
isAvailable(*vtx) ? mAcc_gfit(*vtx) : 0;
568 double gamma_mass = mAcc_gmass.
isAvailable(*vtx) ? mAcc_gmass(*vtx) : -1;
569 double gamma_chisq = mAcc_gchisq.
isAvailable(*vtx) ? mAcc_gchisq(*vtx) : 999999;
570 double gamma_ndof = mAcc_gndof.
isAvailable(*vtx) ? mAcc_gndof(*vtx) : 0;
573 selectedV0Candidates.push_back(std::pair<const xAOD::Vertex*,V0Enum>{vtx,opt});
581 std::string type_V0Vtx;
582 if(mAcc_type.
isAvailable(*vtx)) type_V0Vtx = mAcc_type(*vtx);
585 if(type_V0Vtx ==
"Lambda") {
590 else if(type_V0Vtx ==
"Lambdabar") {
595 else if(type_V0Vtx ==
"Ks") {
607 int gamma_fit = mAcc_gfit.
isAvailable(*vtx) ? mAcc_gfit(*vtx) : 0;
608 double gamma_mass = mAcc_gmass.
isAvailable(*vtx) ? mAcc_gmass(*vtx) : -1;
609 double gamma_chisq = mAcc_gchisq.
isAvailable(*vtx) ? mAcc_gchisq(*vtx) : 999999;
610 double gamma_ndof = mAcc_gndof.
isAvailable(*vtx) ? mAcc_gndof(*vtx) : 0;
613 selectedV0Candidates.push_back(std::pair<const xAOD::Vertex*,V0Enum>{vtx,opt});
618 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(); } );
620 selectedV0Candidates.erase(selectedV0Candidates.begin()+
m_maxV0Candidates, selectedV0Candidates.end());
622 if(selectedV0Candidates.size()==0)
return StatusCode::SUCCESS;
624 std::vector<Trk::VxCascadeInfo*> cascadeinfoContainer;
630 for(
auto it=cascadeinfoContainer.begin()+
m_maxMainVCandidates; it!=cascadeinfoContainer.end(); it++)
delete *it;
631 cascadeinfoContainer.erase(cascadeinfoContainer.begin()+
m_maxMainVCandidates, cascadeinfoContainer.end());
670 for(
auto cascade_info : cascadeinfoContainer) {
671 if(cascade_info==
nullptr) {
676 const std::vector<xAOD::Vertex*> &cascadeVertices = cascade_info->vertices();
677 if(cascadeVertices.size() != topoN)
ATH_MSG_ERROR(
"Incorrect number of vertices");
678 for(
size_t i=0; i<topoN; i++) {
679 if(cascadeVertices[i]==
nullptr)
ATH_MSG_ERROR(
"Error null vertex");
682 cascade_info->setSVOwnership(
false);
683 const auto mainVertex = cascadeVertices[topoN-1];
684 const std::vector< std::vector<TLorentzVector> > &moms = cascade_info->getParticleMoms();
708 PtErr_decor(*mainVertex) =
m_CascadeTools->pTError(moms[topoN-1],cascade_info->getCovariance()[topoN-1]);
710 chi2_decor(*mainVertex) = cascade_info->fitChi2();
711 ndof_decor(*mainVertex) = cascade_info->nDoF();
714 lxy_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],mainVertex);
715 lxyErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->lxyError(moms[0],cascade_info->getCovariance()[0],cascadeVertices[0],mainVertex);
716 a0z_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0z(moms[0],cascadeVertices[0],mainVertex);
717 a0zErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0zError(moms[0],cascade_info->getCovariance()[0],cascadeVertices[0],mainVertex);
718 a0xy_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],mainVertex);
719 a0xyErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xyError(moms[0],cascade_info->getCovariance()[0],cascadeVertices[0],mainVertex);
722 lxy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],cascadeVertices[2]);
723 lxyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxyError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],cascadeVertices[2]);
724 a0z_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0z(moms[1],cascadeVertices[1],cascadeVertices[2]);
725 a0zErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0zError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],cascadeVertices[2]);
726 a0xy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xy(moms[1],cascadeVertices[1],cascadeVertices[2]);
727 a0xyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xyError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],cascadeVertices[2]);
730 lxy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],mainVertex);
731 lxyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxyError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],mainVertex);
732 a0z_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0z(moms[1],cascadeVertices[1],mainVertex);
733 a0zErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0zError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],mainVertex);
734 a0xy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xy(moms[1],cascadeVertices[1],mainVertex);
735 a0xyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xyError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],mainVertex);
739 lxy_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->lxy(moms[2],cascadeVertices[2],mainVertex);
740 lxyErr_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->lxyError(moms[2],cascade_info->getCovariance()[2],cascadeVertices[2],mainVertex);
741 a0z_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->a0z(moms[2],cascadeVertices[2],mainVertex);
742 a0zErr_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->a0zError(moms[2],cascade_info->getCovariance()[2],cascadeVertices[2],mainVertex);
743 a0xy_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->a0xy(moms[2],cascadeVertices[2],mainVertex);
744 a0xyErr_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->a0xyError(moms[2],cascade_info->getCovariance()[2],cascadeVertices[2],mainVertex);
747 chi2_V3_decor(*cascadeVertices[2]) =
m_V0Tools->chisq(jxVtx);
748 ndof_V3_decor(*cascadeVertices[2]) =
m_V0Tools->ndof(jxVtx);
754 for(
size_t i=0; i<topoN; i++) {
755 VtxWriteHandles[i].ptr()->push_back(cascadeVertices[i]);
763 if( vertexLink1.
isValid() ) cascadeVertexLinks.push_back( vertexLink1 );
767 if( vertexLink2.
isValid() ) cascadeVertexLinks.push_back( vertexLink2 );
772 if( vertexLink3.
isValid() ) cascadeVertexLinks.push_back( vertexLink3 );
774 CascadeLinksDecor(*mainVertex) = cascadeVertexLinks;
778 for (
auto cascade_info : cascadeinfoContainer) {
779 if(cascade_info)
delete cascade_info;
782 return StatusCode::SUCCESS;
799 std::vector<const xAOD::TrackParticle*> tracksJX;
801 if (tracksJX.size() != massesJX.size()) {
802 ATH_MSG_ERROR(
"Problems with JX input: number of tracks or track mass inputs is not correct!");
805 std::vector<const xAOD::TrackParticle*> tracksV01;
807 std::vector<const xAOD::TrackParticle*> tracksV02;
810 std::vector<const xAOD::TrackParticle*> tracksJpsi{tracksJX[0], tracksJX[1]};
811 std::vector<const xAOD::TrackParticle*> tracksX;
815 std::vector<double> massesV01;
819 std::vector<double> massesV02;
824 TLorentzVector p4_moth, p4_JX, p4_v01, p4_v02, tmp;
827 p4_moth += tmp; p4_JX += tmp;
830 for(
int it=0; it<V01_helper.
nRefTrks(); it++) {
831 p4_moth += V01_helper.
refTrk(it,massesV01[it]);
832 p4_v01 += V01_helper.
refTrk(it,massesV01[it]);
835 for(
int it=0; it<V02_helper.
nRefTrks(); it++) {
836 p4_moth += V02_helper.
refTrk(it,massesV02[it]);
837 p4_v02 += V02_helper.
refTrk(it,massesV02[it]);
839 double main_mass = p4_moth.M();
851 double JXV02_mass = (p4_JX+p4_v02).M();
869 std::unique_ptr<Trk::RecVertex> pv_AOD;
870 if(pv_xAOD) pv_AOD = std::make_unique<Trk::RecVertex>(pv_xAOD->
position(),pv_xAOD->covariancePosition(),pv_xAOD->
numberDoF(),pv_xAOD->
chiSquared());
896 std::vector<float> trk_px;
897 std::vector<float> trk_py;
898 std::vector<float> trk_pz;
907 std::vector<Trk::VertexID> vrtList;
916 vrtList.push_back(vID1);
924 vrtList.push_back(vID2);
929 std::vector<Trk::VertexID> vrtList1{vID1};
930 std::vector<Trk::VertexID> vrtList2{vID2};
936 vrtList1.push_back(vID3);
938 std::vector<Trk::VertexID> cnstV; cnstV.clear();
944 std::vector<const xAOD::TrackParticle*> tp; tp.clear();
945 std::vector<double> tp_masses; tp_masses.clear();
959 vrtList.push_back(vID3);
961 std::vector<const xAOD::TrackParticle*> tp; tp.clear();
962 std::vector<double> tp_masses; tp_masses.clear();
978 std::vector<Trk::VertexID> cnstV; cnstV.clear();
986 std::vector<Trk::VertexID> cnstV; cnstV.clear();
992 std::vector<Trk::VertexID> cnstV; cnstV.clear();
998 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) );
1000 if (fit_result !=
nullptr) {
1001 for(
auto v : fit_result->vertices()) {
1002 if(v->nTrackParticles()==0) {
1003 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
1004 v->setTrackParticleLinks(nullLinkVector);
1011 fit_result->setSVOwnership(
true);
1014 double chi2DOF = fit_result->fitChi2()/fit_result->nDoF();
1017 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->getParticleMoms();
1018 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->vertices();
1019 size_t iMoth = cascadeVertices.size()-1;
1020 double lxy_SV1 =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[iMoth]);
1023 chi2_V1_decor(*cascadeVertices[0]) = V01vtx->
chiSquared();
1024 ndof_V1_decor(*cascadeVertices[0]) = V01vtx->
numberDoF();
1025 if(V01==
LAMBDA) type_V1_decor(*cascadeVertices[0]) =
"Lambda";
1026 else if(V01==
LAMBDABAR) type_V1_decor(*cascadeVertices[0]) =
"Lambdabar";
1027 else if(V01==
KS) type_V1_decor(*cascadeVertices[0]) =
"Ks";
1028 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.
isAvailable(*V01vtx) ? mAcc_gfit(*V01vtx) : 0;
1029 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.
isAvailable(*V01vtx) ? mAcc_gmass(*V01vtx) : -1;
1030 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.
isAvailable(*V01vtx) ? mAcc_gmasserr(*V01vtx) : -1;
1031 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.
isAvailable(*V01vtx) ? mAcc_gchisq(*V01vtx) : 999999;
1032 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.
isAvailable(*V01vtx) ? mAcc_gndof(*V01vtx) : 0;
1033 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.
isAvailable(*V01vtx) ? mAcc_gprob(*V01vtx) : -1;
1034 trk_px.clear(); trk_py.clear(); trk_pz.clear();
1035 for(
int it=0; it<V01_helper.
nRefTrks(); it++) {
1036 trk_px.push_back( V01_helper.
refTrk(it).Px() );
1037 trk_py.push_back( V01_helper.
refTrk(it).Py() );
1038 trk_pz.push_back( V01_helper.
refTrk(it).Pz() );
1040 trk_pxDeco(*cascadeVertices[0]) = trk_px;
1041 trk_pyDeco(*cascadeVertices[0]) = trk_py;
1042 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
1044 chi2_V2_decor(*cascadeVertices[1]) = V02vtx->
chiSquared();
1045 ndof_V2_decor(*cascadeVertices[1]) = V02vtx->
numberDoF();
1046 if(V02==
LAMBDA) type_V2_decor(*cascadeVertices[1]) =
"Lambda";
1047 else if(V02==
LAMBDABAR) type_V2_decor(*cascadeVertices[1]) =
"Lambdabar";
1048 else if(V02==
KS) type_V2_decor(*cascadeVertices[1]) =
"Ks";
1049 mDec_gfit(*cascadeVertices[1]) = mAcc_gfit.
isAvailable(*V02vtx) ? mAcc_gfit(*V02vtx) : 0;
1050 mDec_gmass(*cascadeVertices[1]) = mAcc_gmass.
isAvailable(*V02vtx) ? mAcc_gmass(*V02vtx) : -1;
1051 mDec_gmasserr(*cascadeVertices[1]) = mAcc_gmasserr.
isAvailable(*V02vtx) ? mAcc_gmasserr(*V02vtx) : -1;
1052 mDec_gchisq(*cascadeVertices[1]) = mAcc_gchisq.
isAvailable(*V02vtx) ? mAcc_gchisq(*V02vtx) : 999999;
1053 mDec_gndof(*cascadeVertices[1]) = mAcc_gndof.
isAvailable(*V02vtx) ? mAcc_gndof(*V02vtx) : 0;
1054 mDec_gprob(*cascadeVertices[1]) = mAcc_gprob.
isAvailable(*V02vtx) ? mAcc_gprob(*V02vtx) : -1;
1055 trk_px.clear(); trk_py.clear(); trk_pz.clear();
1056 for(
int it=0; it<V02_helper.
nRefTrks(); it++) {
1057 trk_px.push_back( V02_helper.
refTrk(it).Px() );
1058 trk_py.push_back( V02_helper.
refTrk(it).Py() );
1059 trk_pz.push_back( V02_helper.
refTrk(it).Pz() );
1061 trk_pxDeco(*cascadeVertices[1]) = trk_px;
1062 trk_pyDeco(*cascadeVertices[1]) = trk_py;
1063 trk_pzDeco(*cascadeVertices[1]) = trk_pz;
1065 result = fit_result.release();
1069 if(pv_xAOD &&
result &&
result->getParticleMoms().size()>0) {
1070 size_t index =
result->getParticleMoms().size() - 1;
1071 const std::vector<TLorentzVector> &mom =
result->getParticleMoms()[
index];
1075 bool isInDefaultPVCont =
false;
1077 if(pv_xAOD == pvVtx) { isInDefaultPVCont =
true;
break; }
1079 if(isInDefaultPVCont) vtx.
setPv( pv_xAOD, defaultPVContainer, pvtype );
1080 else vtx.
setPv( pv_xAOD, pvContainer, pvtype );
1081 if(origPv_xAOD) vtx.
setOrigPv( origPv_xAOD, defaultPVContainer, pvtype );
1102 const EventContext& ctx = Gaudi::Hive::currentContext();
1112 std::vector<const xAOD::TrackParticle*> posTracks;
1113 std::vector<const xAOD::TrackParticle*> negTracks;
1115 if(TP->charge()>0) posTracks.push_back(TP);
1116 else negTracks.push_back(TP);
1120 const Trk::Perigee& aPerigee1 = TP1->perigeeParameters();
1122 const Trk::Perigee& aPerigee2 = TP2->perigeeParameters();
1123 int sflag(0), errorcode(0);
1125 if (errorcode != 0) {startingPoint(0) = 0.0; startingPoint(1) = 0.0; startingPoint(2) = 0.0;}
1127 if (errorcode == 0 || errorcode == 5 || errorcode == 6 || errorcode == 8) {
1131 std::vector<std::unique_ptr<const Trk::TrackParameters> > cleanup;
1132 if(!extrapolatedPerigee1) extrapolatedPerigee1 = &TP1->perigeeParameters();
1133 else cleanup.push_back(std::unique_ptr<const Trk::TrackParameters>(extrapolatedPerigee1));
1134 if(!extrapolatedPerigee2) extrapolatedPerigee2 = &TP2->perigeeParameters();
1135 else cleanup.push_back(std::unique_ptr<const Trk::TrackParameters>(extrapolatedPerigee2));
1136 if(extrapolatedPerigee1 && extrapolatedPerigee2) {
1138 TLorentzVector v1; TLorentzVector v2;
1142 if((v1+v2).M()>1030.0 && (v1+v2).M()<1200.0) pass =
true;
1147 if((v1+v2).M()>1030.0 && (v1+v2).M()<1200.0) pass =
true;
1152 if((v1+v2).M()>430.0 && (v1+v2).M()<565.0) pass =
true;
1155 std::vector<const xAOD::TrackParticle*> tracksV0;
1156 tracksV0.push_back(TP1); tracksV0.push_back(TP2);
1157 std::unique_ptr<xAOD::Vertex> V0vtx = std::unique_ptr<xAOD::Vertex>(
m_iV0Fitter->fit(tracksV0, startingPoint) );
1158 if(V0vtx && V0vtx->chiSquared()>=0) {
1159 double chi2DOF = V0vtx->chiSquared()/V0vtx->numberDoF();
1165 if(massSig_V0_Lambda1<=massSig_V0_Lambda2 && massSig_V0_Lambda1<=massSig_V0_Ks) {
1166 mDec_type(*V0vtx.get()) =
"Lambda";
1168 else if(massSig_V0_Lambda2<=massSig_V0_Lambda1 && massSig_V0_Lambda2<=massSig_V0_Ks) {
1169 mDec_type(*V0vtx.get()) =
"Lambdabar";
1171 else if(massSig_V0_Ks<=massSig_V0_Lambda1 && massSig_V0_Ks<=massSig_V0_Lambda2) {
1172 mDec_type(*V0vtx.get()) =
"Ks";
1175 int gamma_fit = 0;
int gamma_ndof = 0;
double gamma_chisq = 999999.;
1176 double gamma_prob = -1., gamma_mass = -1., gamma_massErr = -1.;
1177 std::unique_ptr<xAOD::Vertex> gammaVtx = std::unique_ptr<xAOD::Vertex>(
m_iGammaFitter->fit(tracksV0,
m_V0Tools->vtx(V0vtx.get())) );
1182 gamma_chisq =
m_V0Tools->chisq(gammaVtx.get());
1183 gamma_ndof =
m_V0Tools->ndof(gammaVtx.get());
1184 gamma_prob =
m_V0Tools->vertexProbability(gammaVtx.get());
1186 mDec_gfit(*V0vtx.get()) = gamma_fit;
1187 mDec_gmass(*V0vtx.get()) = gamma_mass;
1188 mDec_gmasserr(*V0vtx.get()) = gamma_massErr;
1189 mDec_gchisq(*V0vtx.get()) = gamma_chisq;
1190 mDec_gndof(*V0vtx.get()) = gamma_ndof;
1191 mDec_gprob(*V0vtx.get()) = gamma_prob;
1196 if(not trackCols.empty()){
1199 }
catch (std::runtime_error
const& e) {
1205 V0ContainerNew->
push_back(std::move(V0vtx));