10 #include "GaudiKernel/IPartPropSvc.h"
16 #include "HepPDT/ParticleDataTable.hh"
27 m_vertexJXContainerKey(
"InputJXVertices"),
28 m_vertexV0ContainerKeys{
"InputV0Containers"},
29 m_cascadeOutputKeys({
"JpsiXPlus2V0_SubVtx1",
"JpsiXPlus2V0_SubVtx2",
"JpsiXPlus2V0_SubVtx3",
"JpsiXPlus2V0_MainVtx"}),
32 m_v0VtxOutputKeys(
this,
"OutoutV0VtxCollections",{}),
33 m_TrkParticleCollection(
"InDetTrackParticles"),
34 m_VxPrimaryCandidateName(
"PrimaryVertices"),
35 m_eventInfo_key(
"EventInfo"),
37 m_jxMassUpper(30000.0),
39 m_jpsiMassUpper(20000.0),
40 m_diTrackMassLower(-1.0),
41 m_diTrackMassUpper(-1.0),
42 m_V01Hypothesis(
"Ks"),
44 m_V01MassUpper(20000.0),
46 m_V02Hypothesis(
"Lambda"),
48 m_V02MassUpper(20000.0),
52 m_minMass_gamma(-1.0),
53 m_chi2cut_gamma(-1.0),
57 m_jxDaug1MassHypo(-1),
58 m_jxDaug2MassHypo(-1),
59 m_jxDaug3MassHypo(-1),
60 m_jxDaug4MassHypo(-1),
80 m_maxMainVCandidates(0),
81 m_iVertexFitter(
"Trk::TrkVKalVrtFitter"),
82 m_iV0Fitter(
"Trk::V0VertexFitter"),
83 m_iGammaFitter(
"Trk::TrkVKalVrtFitter"),
84 m_pvRefitter(
"Analysis::PrimaryVertexRefitter",
this),
85 m_V0Tools(
"Trk::V0Tools"),
86 m_CascadeTools(
"DerivationFramework::CascadeTools")
98 declareProperty(
"RefPVContainerName", m_refPVContainerName =
"RefittedPrimaryVertices");
159 ATH_MSG_FATAL(
"Incorrect V0 container hypothesis - not recognized");
160 return StatusCode::FAILURE;
168 if(m_jxDaug_num<2 || m_jxDaug_num>4) {
170 return StatusCode::FAILURE;
175 return StatusCode::FAILURE;
205 IPartPropSvc* partPropSvc =
nullptr;
206 ATH_CHECK( service(
"PartPropSvc", partPropSvc,
true) );
207 auto pdt = partPropSvc->PDT();
230 return StatusCode::SUCCESS;
235 assert(cascadeinfoContainer!=
nullptr);
244 if (pvContainer.
cptr()->
size()==0) {
246 return StatusCode::RECOVERABLE;
249 std::vector<double> massesJX;
254 std::vector<double> massesV0_ppi;
257 std::vector<double> massesV0_pip;
260 std::vector<double> massesV0_pipi;
269 std::vector<const xAOD::VertexContainer*> V0Containers;
270 std::array<SG::ReadHandle<xAOD::VertexContainer>, 10> V0Handles;
int ikey(0);
274 V0Containers.push_back(V0Handles[ikey].cptr());
301 std::vector<float> trk_px;
302 std::vector<float> trk_py;
303 std::vector<float> trk_pz;
304 std::vector<const xAOD::TrackParticle*> tracksV0;
307 std::vector<std::pair<const xAOD::Vertex*,V0Enum> > selectedV0Candidates_EXISTING;
308 std::vector<std::pair<xAOD::Vertex*,V0Enum> > selectedV0Candidates_CREATED;
309 for(
size_t ic=0;
ic<V0Containers.size();
ic++) {
328 double massSig_V0_Ks = std::abs(
m_V0Tools->invariantMass(vtx, massesV0_pipi)-
m_mass_Ks)/
m_V0Tools->invariantMassError(vtx, massesV0_pipi);
329 if(massSig_V0_Lambda1<=massSig_V0_Lambda2 && massSig_V0_Lambda1<=massSig_V0_Ks) {
331 massV0 =
m_V0Tools->invariantMass(vtx, massesV0_ppi);
333 else if(massSig_V0_Lambda2<=massSig_V0_Lambda1 && massSig_V0_Lambda2<=massSig_V0_Ks) {
335 massV0 =
m_V0Tools->invariantMass(vtx, massesV0_pip);
337 else if(massSig_V0_Ks<=massSig_V0_Lambda1 && massSig_V0_Ks<=massSig_V0_Lambda2) {
339 massV0 =
m_V0Tools->invariantMass(vtx, massesV0_pipi);
368 std::string type_V0Vtx;
369 if(mAcc_type.
isAvailable(*vtx)) type_V0Vtx = mAcc_type(*vtx);
372 else if(type_V0Vtx ==
"Ks")
opt =
KS;
386 int gamma_fit = 0;
int gamma_ndof = 0;
387 double gamma_chisq = 999999., gamma_prob = -1., gamma_mass = -1., gamma_massErr = -1.;
389 gamma_fit = mAcc_gfit.
isAvailable(*vtx) ? mAcc_gfit(*vtx) : 0;
390 gamma_mass = mAcc_gmass.
isAvailable(*vtx) ? mAcc_gmass(*vtx) : -1;
391 gamma_massErr = mAcc_gmasserr.
isAvailable(*vtx) ? mAcc_gmasserr(*vtx) : -1;
392 gamma_chisq = mAcc_gchisq.
isAvailable(*vtx) ? mAcc_gchisq(*vtx) : 999999;
393 gamma_ndof = mAcc_gndof.
isAvailable(*vtx) ? mAcc_gndof(*vtx) : 0;
394 gamma_prob = mAcc_gprob.
isAvailable(*vtx) ? mAcc_gprob(*vtx) : -1;
397 std::unique_ptr<xAOD::Vertex> gammaVtx = std::unique_ptr<xAOD::Vertex>(
m_iGammaFitter->fit(tracksV0, vtxPos) );
402 gamma_chisq =
m_V0Tools->chisq(gammaVtx.get());
403 gamma_ndof =
m_V0Tools->ndof(gammaVtx.get());
404 gamma_prob =
m_V0Tools->vertexProbability(gammaVtx.get());
410 trk_px.clear(); trk_py.clear(); trk_pz.clear();
421 std::unique_ptr<xAOD::Vertex> V0vtx;
423 std::vector<double> massesV0;
424 if(
opt ==
LAMBDA) massesV0 = massesV0_ppi;
426 else if(
opt ==
KS) massesV0 = massesV0_pipi;
431 V0vtx = std::unique_ptr<xAOD::Vertex>(
m_iV0Fitter->fit(tracksV0, vtxPos) );
450 mDec_gfit(*V0vtx.get()) = gamma_fit;
451 mDec_gmass(*V0vtx.get()) = gamma_mass;
452 mDec_gmasserr(*V0vtx.get()) = gamma_massErr;
453 mDec_gchisq(*V0vtx.get()) = gamma_chisq;
454 mDec_gndof(*V0vtx.get()) = gamma_ndof;
455 mDec_gprob(*V0vtx.get()) = gamma_prob;
456 if(
opt==
LAMBDA) mDec_type(*V0vtx.get()) =
"Lambda";
457 else if(
opt==
LAMBDABAR) mDec_type(*V0vtx.get()) =
"Lambdabar";
458 else if(
opt==
KS) mDec_type(*V0vtx.get()) =
"Ks";
460 trk_pxDeco(*V0vtx.get()) = trk_px;
461 trk_pyDeco(*V0vtx.get()) = trk_py;
462 trk_pzDeco(*V0vtx.get()) = trk_pz;
464 selectedV0Candidates_CREATED.push_back(std::pair<xAOD::Vertex*,V0Enum>{V0vtx.release(),
opt});
470 mDec_gfit(*vtx) = gamma_fit;
471 mDec_gmass(*vtx) = gamma_mass;
472 mDec_gmasserr(*vtx) = gamma_massErr;
473 mDec_gchisq(*vtx) = gamma_chisq;
474 mDec_gndof(*vtx) = gamma_ndof;
475 mDec_gprob(*vtx) = gamma_prob;
476 if(
opt==
LAMBDA) mDec_type(*vtx) =
"Lambda";
478 else if(
opt==
KS) mDec_type(*vtx) =
"Ks";
479 selectedV0Candidates_EXISTING.push_back(std::pair<const xAOD::Vertex*,V0Enum>{vtx,
opt});
483 if((
m_refitV0 && selectedV0Candidates_CREATED.size()==0) || (!
m_refitV0 && selectedV0Candidates_EXISTING.size()==0))
return StatusCode::SUCCESS;
485 std::vector<std::pair<const xAOD::Vertex*,V0Enum> > selectedV01Candidates_EXISTING;
486 std::vector<std::pair<const xAOD::Vertex*,V0Enum> > selectedV02Candidates_EXISTING;
487 std::vector<std::pair<xAOD::Vertex*,V0Enum> > selectedV01Candidates_CREATED;
488 std::vector<std::pair<xAOD::Vertex*,V0Enum> > selectedV02Candidates_CREATED;
491 for(
size_t j=0; j<selectedV0Candidates_CREATED.size(); j++) {
492 std::pair<xAOD::Vertex*,V0Enum> candidate = selectedV0Candidates_CREATED[j];
494 if(
m_V01Hypothesis ==
"Lambda") selectedV01Candidates_CREATED.push_back(candidate);
495 else if(
m_V02Hypothesis ==
"Lambda") selectedV02Candidates_CREATED.push_back(candidate);
497 else if(candidate.second==
KS) {
498 if(
m_V01Hypothesis ==
"Ks") selectedV01Candidates_CREATED.push_back(candidate);
499 else if(
m_V02Hypothesis ==
"Ks") selectedV02Candidates_CREATED.push_back(candidate);
503 std::sort( selectedV01Candidates_CREATED.begin(), selectedV01Candidates_CREATED.end(), [](std::pair<xAOD::Vertex*,V0Enum>
a, std::pair<xAOD::Vertex*,V0Enum>
b) { return a.first->chiSquared()/a.first->numberDoF() < b.first->chiSquared()/b.first->numberDoF(); } );
505 for(
auto it=selectedV01Candidates_CREATED.begin()+
m_maxV0Candidates;
it!=selectedV01Candidates_CREATED.end();
it++)
delete it->first;
506 selectedV01Candidates_CREATED.erase(selectedV01Candidates_CREATED.begin()+
m_maxV0Candidates, selectedV01Candidates_CREATED.end());
508 std::sort( selectedV02Candidates_CREATED.begin(), selectedV02Candidates_CREATED.end(), [](std::pair<xAOD::Vertex*,V0Enum>
a, std::pair<xAOD::Vertex*,V0Enum>
b) { return a.first->chiSquared()/a.first->numberDoF() < b.first->chiSquared()/b.first->numberDoF(); } );
510 for(
auto it=selectedV02Candidates_CREATED.begin()+
m_maxV0Candidates;
it!=selectedV02Candidates_CREATED.end();
it++)
delete it->first;
511 selectedV02Candidates_CREATED.erase(selectedV02Candidates_CREATED.begin()+
m_maxV0Candidates, selectedV02Candidates_CREATED.end());
514 if(V0OutputContainers.size()==2) {
515 for(
auto v0VItr=selectedV01Candidates_CREATED.begin(); v0VItr!=selectedV01Candidates_CREATED.end(); ++v0VItr) V0OutputContainers[0]->push_back(v0VItr->first);
516 for(
auto v0VItr=selectedV02Candidates_CREATED.begin(); v0VItr!=selectedV02Candidates_CREATED.end(); ++v0VItr) V0OutputContainers[1]->push_back(v0VItr->first);
520 for(
size_t j=0; j<selectedV0Candidates_EXISTING.size(); j++) {
521 std::pair<const xAOD::Vertex*,V0Enum> candidate = selectedV0Candidates_EXISTING[j];
523 if(
m_V01Hypothesis ==
"Lambda") selectedV01Candidates_EXISTING.push_back(candidate);
524 else if(
m_V02Hypothesis ==
"Lambda") selectedV02Candidates_EXISTING.push_back(candidate);
526 else if(candidate.second==
KS) {
527 if(
m_V01Hypothesis ==
"Ks") selectedV01Candidates_EXISTING.push_back(candidate);
528 else if(
m_V02Hypothesis ==
"Ks") selectedV02Candidates_EXISTING.push_back(candidate);
532 std::sort( selectedV01Candidates_EXISTING.begin(), selectedV01Candidates_EXISTING.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(); } );
534 selectedV01Candidates_EXISTING.erase(selectedV01Candidates_EXISTING.begin()+
m_maxV0Candidates, selectedV01Candidates_EXISTING.end());
536 std::sort( selectedV02Candidates_EXISTING.begin(), selectedV02Candidates_EXISTING.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(); } );
538 selectedV02Candidates_EXISTING.erase(selectedV02Candidates_EXISTING.begin()+
m_maxV0Candidates, selectedV02Candidates_EXISTING.end());
544 std::sort( selectedV0Candidates_CREATED.begin(), selectedV0Candidates_CREATED.end(), [](std::pair<xAOD::Vertex*,V0Enum>
a, std::pair<xAOD::Vertex*,V0Enum>
b) { return a.first->chiSquared()/a.first->numberDoF() < b.first->chiSquared()/b.first->numberDoF(); } );
546 for(
auto it=selectedV0Candidates_CREATED.begin()+
m_maxV0Candidates;
it!=selectedV0Candidates_CREATED.end();
it++)
delete it->first;
547 selectedV0Candidates_CREATED.erase(selectedV0Candidates_CREATED.begin()+
m_maxV0Candidates, selectedV0Candidates_CREATED.end());
550 if(V0OutputContainers.size()==1) {
551 for(
auto v0VItr=selectedV0Candidates_CREATED.begin(); v0VItr!=selectedV0Candidates_CREATED.end(); ++v0VItr) V0OutputContainers[0]->push_back(v0VItr->first);
555 std::sort( selectedV0Candidates_EXISTING.begin(), selectedV0Candidates_EXISTING.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(); } );
557 selectedV0Candidates_EXISTING.erase(selectedV0Candidates_EXISTING.begin()+
m_maxV0Candidates, selectedV0Candidates_EXISTING.end());
563 std::vector<const xAOD::Vertex*> selectedJXCandidates;
564 for(
auto vxcItr=jxContainer.
ptr()->
begin(); vxcItr!=jxContainer.
ptr()->
end(); ++vxcItr) {
578 double mass_jx =
m_V0Tools->invariantMass(*vxcItr,massesJX);
579 if(mass_jx < m_jxMassLower || mass_jx >
m_jxMassUpper)
continue;
583 TLorentzVector p4_mu1, p4_mu2;
590 double mass_jpsi = (p4_mu1 + p4_mu2).M();
591 if (mass_jpsi < m_jpsiMassLower || mass_jpsi >
m_jpsiMassUpper)
continue;
594 TLorentzVector p4_trk1, p4_trk2;
601 double mass_diTrk = (p4_trk1 + p4_trk2).M();
608 selectedJXCandidates.push_back(vtx);
611 if(selectedJXCandidates.size()==0) {
612 if(V0OutputContainers.size()==0) {
614 for(
auto v0VItr=selectedV01Candidates_CREATED.begin(); v0VItr!=selectedV01Candidates_CREATED.end(); ++v0VItr)
delete v0VItr->first;
615 for(
auto v0VItr=selectedV02Candidates_CREATED.begin(); v0VItr!=selectedV02Candidates_CREATED.end(); ++v0VItr)
delete v0VItr->first;
617 for(
auto v0VItr=selectedV0Candidates_CREATED.begin(); v0VItr!=selectedV0Candidates_CREATED.end(); ++v0VItr)
delete v0VItr->first;
620 return StatusCode::SUCCESS;
623 std::sort( selectedJXCandidates.begin(), selectedJXCandidates.end(), [](
const xAOD::Vertex*
a,
const xAOD::Vertex*
b) { return a->chiSquared()/a->numberDoF() < b->chiSquared()/b->numberDoF(); } );
625 selectedJXCandidates.erase(selectedJXCandidates.begin()+
m_maxJXCandidates, selectedJXCandidates.end());
630 for(
auto jxItr=selectedJXCandidates.cbegin(); jxItr!=selectedJXCandidates.cend(); ++jxItr) {
634 for(
auto V0Itr1=selectedV0Candidates_CREATED.begin(); V0Itr1!=selectedV0Candidates_CREATED.end(); ++V0Itr1) {
635 for(
auto V0Itr2=V0Itr1+1; V0Itr2!=selectedV0Candidates_CREATED.end(); ++V0Itr2) {
642 for(
auto V0Itr1=selectedV0Candidates_EXISTING.begin(); V0Itr1!=selectedV0Candidates_EXISTING.end(); ++V0Itr1) {
643 for(
auto V0Itr2=V0Itr1+1; V0Itr2!=selectedV0Candidates_EXISTING.end(); ++V0Itr2) {
652 for(
auto V0Itr1=selectedV01Candidates_CREATED.begin(); V0Itr1!=selectedV01Candidates_CREATED.end(); ++V0Itr1) {
653 for(
auto V0Itr2=selectedV02Candidates_CREATED.begin(); V0Itr2!=selectedV02Candidates_CREATED.end(); ++V0Itr2) {
660 for(
auto V0Itr1=selectedV01Candidates_EXISTING.begin(); V0Itr1!=selectedV01Candidates_EXISTING.end(); ++V0Itr1) {
661 for(
auto V0Itr2=selectedV02Candidates_EXISTING.begin(); V0Itr2!=selectedV02Candidates_EXISTING.end(); ++V0Itr2) {
671 if(V0OutputContainers.size()==0) {
673 for(
auto v0VItr=selectedV01Candidates_CREATED.begin(); v0VItr!=selectedV01Candidates_CREATED.end(); ++v0VItr)
delete v0VItr->first;
674 for(
auto v0VItr=selectedV02Candidates_CREATED.begin(); v0VItr!=selectedV02Candidates_CREATED.end(); ++v0VItr)
delete v0VItr->first;
676 for(
auto v0VItr=selectedV0Candidates_CREATED.begin(); v0VItr!=selectedV0Candidates_CREATED.end(); ++v0VItr)
delete v0VItr->first;
680 return StatusCode::SUCCESS;
688 ATH_MSG_FATAL(
"Incorrect number of output cascade vertices");
689 return StatusCode::FAILURE;
692 std::array<SG::WriteHandle<xAOD::VertexContainer>, 4> VtxWriteHandles;
int ikey(0);
695 ATH_CHECK( VtxWriteHandles[ikey].record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()) );
704 if (pvContainer.
cptr()->
size()==0) {
706 return StatusCode::RECOVERABLE;
715 ATH_CHECK( refPvContainer.
record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()) );
719 std::vector<xAOD::VertexContainer*> V0OutputContainers;
720 std::array<SG::WriteHandle<xAOD::VertexContainer>, 2> V0OutputHandles; ikey = 0;
723 ATH_CHECK( V0OutputHandles[ikey].record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()) );
724 V0OutputContainers.push_back(V0OutputHandles[ikey].ptr());
728 std::vector<Trk::VxCascadeInfo*> cascadeinfoContainer;
734 cascadeinfoContainer.erase(cascadeinfoContainer.begin()+
m_maxMainVCandidates, cascadeinfoContainer.end());
779 for(
auto cascade_info : cascadeinfoContainer) {
780 if(cascade_info==
nullptr)
ATH_MSG_ERROR(
"CascadeInfo is null");
782 const std::vector<xAOD::Vertex*> &cascadeVertices = cascade_info->vertices();
783 if(cascadeVertices.size() != topoN)
ATH_MSG_ERROR(
"Incorrect number of vertices");
784 for(
size_t i=0;
i<topoN;
i++) {
785 if(cascadeVertices[
i]==
nullptr)
ATH_MSG_ERROR(
"Error null vertex");
788 cascade_info->setSVOwnership(
false);
789 const auto mainVertex = cascadeVertices[topoN-1];
790 const std::vector< std::vector<TLorentzVector> > &moms = cascade_info->getParticleMoms();
795 if(
m_jxDaug_num==4) jxVtx = FindVertex<4>(jxContainer.
ptr(), cascadeVertices[ijx]);
796 else if(
m_jxDaug_num==3) jxVtx = FindVertex<3>(jxContainer.
ptr(), cascadeVertices[ijx]);
797 else jxVtx = FindVertex<2>(jxContainer.
ptr(), cascadeVertices[ijx]);
814 PtErr_decor(*mainVertex) =
m_CascadeTools->pTError(moms[topoN-1],cascade_info->getCovariance()[topoN-1]);
816 chi2_decor(*mainVertex) = cascade_info->fitChi2();
817 ndof_decor(*mainVertex) = cascade_info->nDoF();
820 lxy_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],mainVertex);
821 lxyErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->lxyError(moms[0],cascade_info->getCovariance()[0],cascadeVertices[0],mainVertex);
822 a0z_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0z(moms[0],cascadeVertices[0],mainVertex);
823 a0zErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0zError(moms[0],cascade_info->getCovariance()[0],cascadeVertices[0],mainVertex);
824 a0xy_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],mainVertex);
825 a0xyErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xyError(moms[0],cascade_info->getCovariance()[0],cascadeVertices[0],mainVertex);
828 lxy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],cascadeVertices[2]);
829 lxyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxyError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],cascadeVertices[2]);
830 a0z_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0z(moms[1],cascadeVertices[1],cascadeVertices[2]);
831 a0zErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0zError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],cascadeVertices[2]);
832 a0xy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xy(moms[1],cascadeVertices[1],cascadeVertices[2]);
833 a0xyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xyError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],cascadeVertices[2]);
836 lxy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],mainVertex);
837 lxyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxyError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],mainVertex);
838 a0z_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0z(moms[1],cascadeVertices[1],mainVertex);
839 a0zErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0zError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],mainVertex);
840 a0xy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xy(moms[1],cascadeVertices[1],mainVertex);
841 a0xyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xyError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],mainVertex);
845 lxy_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->lxy(moms[2],cascadeVertices[2],mainVertex);
846 lxyErr_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->lxyError(moms[2],cascade_info->getCovariance()[2],cascadeVertices[2],mainVertex);
847 a0z_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->a0z(moms[2],cascadeVertices[2],mainVertex);
848 a0zErr_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->a0zError(moms[2],cascade_info->getCovariance()[2],cascadeVertices[2],mainVertex);
849 a0xy_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->a0xy(moms[2],cascadeVertices[2],mainVertex);
850 a0xyErr_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->a0xyError(moms[2],cascade_info->getCovariance()[2],cascadeVertices[2],mainVertex);
853 chi2_V3_decor(*cascadeVertices[2]) =
m_V0Tools->chisq(jxVtx);
854 ndof_V3_decor(*cascadeVertices[2]) =
m_V0Tools->ndof(jxVtx);
859 for(
size_t i=0;
i<topoN;
i++) {
860 VtxWriteHandles[
i].ptr()->push_back(cascadeVertices[
i]);
868 if( vertexLink1.
isValid() ) precedingVertexLinks.push_back( vertexLink1 );
872 if( vertexLink2.
isValid() ) precedingVertexLinks.push_back( vertexLink2 );
877 if( vertexLink3.
isValid() ) precedingVertexLinks.push_back( vertexLink3 );
879 CascadeLinksDecor(*mainVertex) = precedingVertexLinks;
884 for (
auto cascade_info : cascadeinfoContainer)
delete cascade_info;
886 return StatusCode::SUCCESS;
892 std::vector<const xAOD::TrackParticle*> tracksJX;
894 if (tracksJX.size() != massesJX.size()) {
895 ATH_MSG_ERROR(
"Problems with JX input: number of tracks or track mass inputs is not correct!");
905 std::vector<const xAOD::TrackParticle*> tracksV01;
909 std::vector<const xAOD::TrackParticle*> tracksV02;
912 std::vector<double> massesV01;
916 std::vector<double> massesV02;
921 TLorentzVector p4_moth,
tmp;
928 p4_moth += V01_helper.
refTrk(
it,massesV01[
it]);
932 p4_moth += V02_helper.
refTrk(
it,massesV02[
it]);
936 std::vector<const xAOD::TrackParticle*> tracksJpsi;
937 tracksJpsi.push_back(tracksJX[0]);
938 tracksJpsi.push_back(tracksJX[1]);
939 std::vector<const xAOD::TrackParticle*> tracksX;
943 std::vector<float> trk_px;
944 std::vector<float> trk_py;
945 std::vector<float> trk_pz;
954 std::vector<Trk::VertexID> vrtList;
963 vrtList.push_back(vID1);
971 vrtList.push_back(vID2);
976 std::vector<Trk::VertexID> vrtList1{vID1};
977 std::vector<Trk::VertexID> vrtList2{vID2};
983 vrtList1.push_back(vID3);
985 std::vector<const xAOD::TrackParticle*>
tp;
tp.clear();
986 std::vector<double> tp_masses; tp_masses.clear();
1000 vrtList.push_back(vID3);
1002 std::vector<const xAOD::TrackParticle*>
tp;
tp.clear();
1003 std::vector<double> tp_masses; tp_masses.clear();
1019 std::vector<Trk::VertexID> cnstV; cnstV.clear();
1026 std::vector<Trk::VertexID> cnstV; cnstV.clear();
1032 std::vector<Trk::VertexID> cnstV; cnstV.clear();
1038 std::unique_ptr<Trk::VxCascadeInfo> fit_result = std::unique_ptr<Trk::VxCascadeInfo>(
m_iVertexFitter->fitCascade(*state) );
1040 if (fit_result !=
nullptr) {
1042 if(
v->nTrackParticles()==0) {
1043 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
1044 v->setTrackParticleLinks(nullLinkVector);
1054 double chi2DOF = fit_result->
fitChi2()/fit_result->
nDoF();
1057 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->
getParticleMoms();
1058 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->
vertices();
1059 size_t iMoth = cascadeVertices.size()-1;
1060 double lxy_SV1 =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[iMoth]);
1090 chi2_V1_decor(*cascadeVertices[0]) = V01vtx->
chiSquared();
1091 ndof_V1_decor(*cascadeVertices[0]) = V01vtx->
numberDoF();
1092 if(V01==
LAMBDA) type_V1_decor(*cascadeVertices[0]) =
"Lambda";
1093 else if(V01==
LAMBDABAR) type_V1_decor(*cascadeVertices[0]) =
"Lambdabar";
1094 else if(V01==
KS) type_V1_decor(*cascadeVertices[0]) =
"Ks";
1095 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.
isAvailable(*V01vtx) ? mAcc_gfit(*V01vtx) : 0;
1096 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.
isAvailable(*V01vtx) ? mAcc_gmass(*V01vtx) : -1;
1097 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.
isAvailable(*V01vtx) ? mAcc_gmasserr(*V01vtx) : -1;
1098 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.
isAvailable(*V01vtx) ? mAcc_gchisq(*V01vtx) : 999999;
1099 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.
isAvailable(*V01vtx) ? mAcc_gndof(*V01vtx) : 0;
1100 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.
isAvailable(*V01vtx) ? mAcc_gprob(*V01vtx) : -1;
1101 trk_px.clear(); trk_py.clear(); trk_pz.clear();
1102 if(trk_pxAcc.
isAvailable(*V01vtx)) trk_px = trk_pxAcc(*V01vtx);
1103 if(trk_pyAcc.
isAvailable(*V01vtx)) trk_py = trk_pyAcc(*V01vtx);
1104 if(trk_pzAcc.
isAvailable(*V01vtx)) trk_pz = trk_pzAcc(*V01vtx);
1105 trk_pxDeco(*cascadeVertices[0]) = trk_px;
1106 trk_pyDeco(*cascadeVertices[0]) = trk_py;
1107 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
1109 chi2_V2_decor(*cascadeVertices[1]) = V02vtx->
chiSquared();
1110 ndof_V2_decor(*cascadeVertices[1]) = V02vtx->
numberDoF();
1111 if(V02==
LAMBDA) type_V2_decor(*cascadeVertices[1]) =
"Lambda";
1112 else if(V02==
LAMBDABAR) type_V2_decor(*cascadeVertices[1]) =
"Lambdabar";
1113 else if(V02==
KS) type_V2_decor(*cascadeVertices[1]) =
"Ks";
1114 mDec_gfit(*cascadeVertices[1]) = mAcc_gfit.
isAvailable(*V02vtx) ? mAcc_gfit(*V02vtx) : 0;
1115 mDec_gmass(*cascadeVertices[1]) = mAcc_gmass.
isAvailable(*V02vtx) ? mAcc_gmass(*V02vtx) : -1;
1116 mDec_gmasserr(*cascadeVertices[1]) = mAcc_gmasserr.
isAvailable(*V02vtx) ? mAcc_gmasserr(*V02vtx) : -1;
1117 mDec_gchisq(*cascadeVertices[1]) = mAcc_gchisq.
isAvailable(*V02vtx) ? mAcc_gchisq(*V02vtx) : 999999;
1118 mDec_gndof(*cascadeVertices[1]) = mAcc_gndof.
isAvailable(*V02vtx) ? mAcc_gndof(*V02vtx) : 0;
1119 mDec_gprob(*cascadeVertices[1]) = mAcc_gprob.
isAvailable(*V02vtx) ? mAcc_gprob(*V02vtx) : -1;
1120 trk_px.clear(); trk_py.clear(); trk_pz.clear();
1121 if(trk_pxAcc.
isAvailable(*V02vtx)) trk_px = trk_pxAcc(*V02vtx);
1122 if(trk_pyAcc.
isAvailable(*V02vtx)) trk_py = trk_pyAcc(*V02vtx);
1123 if(trk_pzAcc.
isAvailable(*V02vtx)) trk_pz = trk_pzAcc(*V02vtx);
1124 trk_pxDeco(*cascadeVertices[1]) = trk_px;
1125 trk_pyDeco(*cascadeVertices[1]) = trk_py;
1126 trk_pzDeco(*cascadeVertices[1]) = trk_pz;
1128 result = fit_result.release();
1135 template<
size_t NTracks>
1138 assert(v1->nTrackParticles() == NTracks);
1139 std::array<const xAOD::TrackParticle*, NTracks> a1;
1140 std::array<const xAOD::TrackParticle*, NTracks> a2;
1141 for(
size_t i=0;
i<NTracks;
i++){
1142 a1[
i] = v1->trackParticle(
i);
1143 a2[
i] =
v->trackParticle(
i);
1145 std::sort(a1.begin(), a1.end());
1146 std::sort(a2.begin(), a2.end());
1147 if(a1 == a2)
return v1;
1152 template<
size_t NTracks>