59 std::vector<Trk::VxCascadeInfo*> cascadeinfoContainer;
60 constexpr int topoN = 3;
61 std::array<xAOD::VertexContainer*, topoN> Vtxwritehandles;
62 std::array<xAOD::VertexAuxContainer*, topoN> Vtxwritehandlesaux;
65 for(
int i =0; i<topoN;i++){
68 Vtxwritehandles[i]->setStore(Vtxwritehandlesaux[i]);
81 if (pvContainer->
size()==0){
83 return StatusCode::RECOVERABLE;
85 primaryVertex = (*pvContainer)[0];
102 refPvContainer->setStore(refPvAuxContainer);
116 SG::AuxElement::Decorator<VertexLinkVector> CascadeV1LinksDecor(
"CascadeVertex1Links");
117 SG::AuxElement::Decorator<VertexLinkVector> CascadeV2LinksDecor(
"CascadeVertex2Links");
118 SG::AuxElement::Decorator<VertexLinkVector> JpsipiLinksDecor(
"JpsipiVertexLinks");
119 SG::AuxElement::Decorator<VertexLinkVector> D0LinksDecor(
"D0VertexLinks");
120 SG::AuxElement::Decorator<VertexLinkVector> K0LinksDecor(
"K0VertexLinks");
121 SG::AuxElement::Decorator<float> chi2_decor(
"ChiSquared");
122 SG::AuxElement::Decorator<float> ndof_decor(
"NumberDoF");
123 SG::AuxElement::Decorator<float> Pt_decor(
"Pt");
124 SG::AuxElement::Decorator<float> PtErr_decor(
"PtErr");
125 SG::AuxElement::Decorator<float> Mass_svdecor(
"D0_mass");
126 SG::AuxElement::Decorator<float> MassErr_svdecor(
"D0_massErr");
127 SG::AuxElement::Decorator<float> Pt_svdecor(
"D0_Pt");
128 SG::AuxElement::Decorator<float> PtErr_svdecor(
"D0_PtErr");
129 SG::AuxElement::Decorator<float> Lxy_svdecor(
"D0_Lxy");
130 SG::AuxElement::Decorator<float> LxyErr_svdecor(
"D0_LxyErr");
131 SG::AuxElement::Decorator<float> Tau_svdecor(
"D0_Tau");
132 SG::AuxElement::Decorator<float> TauErr_svdecor(
"D0_TauErr");
134 SG::AuxElement::Decorator<float> Mass_sv2decor(
"K0_mass");
135 SG::AuxElement::Decorator<float> MassErr_sv2decor(
"K0_massErr");
136 SG::AuxElement::Decorator<float> Pt_sv2decor(
"K0_Pt");
137 SG::AuxElement::Decorator<float> PtErr_sv2decor(
"K0_PtErr");
138 SG::AuxElement::Decorator<float> Lxy_sv2decor(
"K0_Lxy");
139 SG::AuxElement::Decorator<float> LxyErr_sv2decor(
"K0_LxyErr");
140 SG::AuxElement::Decorator<float> Tau_sv2decor(
"K0_Tau");
141 SG::AuxElement::Decorator<float> TauErr_sv2decor(
"K0_TauErr");
143 SG::AuxElement::Decorator<float> MassJpsi_decor(
"Jpsi_mass");
144 SG::AuxElement::Decorator<float> MassPiD0_decor(
"PiD0_mass");
145 SG::AuxElement::Decorator<float> MassPiD0K0_decor(
"PiD0K0_mass");
147 SG::AuxElement::Decorator<float> MassMumu_decor(
"Mumu_mass");
148 SG::AuxElement::Decorator<float> MassKpi_svdecor(
"Kpi_mass");
149 SG::AuxElement::Decorator<float> MassPipi_sv2decor(
"Pipi_mass");
151 ATH_MSG_DEBUG(
"cascadeinfoContainer size " << cascadeinfoContainer.size());
167 return StatusCode::FAILURE;
188 const std::vector<xAOD::Vertex*> &cascadeVertices =
x->vertices();
189 if(cascadeVertices.size()!=topoN)
191 if(cascadeVertices[0] ==
nullptr || cascadeVertices[1] ==
nullptr || cascadeVertices[2] ==
nullptr)
ATH_MSG_ERROR(
"Error null vertex");
193 for(
int i =0;i<topoN;i++) Vtxwritehandles[i]->push_back(cascadeVertices[i]);
195 x->setSVOwnership(
false);
196 const auto mainVertex = cascadeVertices[2];
197 const std::vector< std::vector<TLorentzVector> > &moms =
x->getParticleMoms();
200 std::vector<const xAOD::Vertex*> verticestoLink;
201 verticestoLink.push_back(cascadeVertices[0]);
203 if(Vtxwritehandles[2] ==
nullptr)
ATH_MSG_ERROR(
"Vtxwritehandles[2] is null");
207 verticestoLink.clear();
208 verticestoLink.push_back(cascadeVertices[1]);
214 ATH_MSG_DEBUG(
"1 pt Jpsi+pi tracks " << cascadeVertices[2]->trackParticle(0)->pt() <<
", " << cascadeVertices[2]->trackParticle(1)->pt() <<
", " << cascadeVertices[2]->trackParticle(2)->pt());
219 ATH_MSG_DEBUG(
"1 pt D0 tracks " << cascadeVertices[1]->trackParticle(0)->pt() <<
", " << cascadeVertices[1]->trackParticle(1)->pt());
224 ATH_MSG_DEBUG(
"1 pt K_S0 tracks " << cascadeVertices[0]->trackParticle(0)->pt() <<
", " << cascadeVertices[0]->trackParticle(1)->pt());
228 std::vector<const xAOD::Vertex*> jpsipiVerticestoLink;
229 if (jpsipiVertex) jpsipiVerticestoLink.push_back(jpsipiVertex);
234 std::vector<const xAOD::Vertex*> d0VerticestoLink;
235 if (d0Vertex) d0VerticestoLink.push_back(d0Vertex);
240 std::vector<const xAOD::Vertex*> k0VerticestoLink;
241 if (k0Vertex) k0VerticestoLink.push_back(k0Vertex);
254 std::vector<double> massesJpsipi;
258 std::vector<double> massesD0;
266 std::vector<double> massesK0;
269 std::vector<double> Masses;
291 PtErr_decor(*mainVertex) =
m_CascadeTools->pTError(moms[2],
x->getCovariance()[2]);
293 chi2_decor(*mainVertex) =
x->fitChi2();
294 ndof_decor(*mainVertex) =
x->nDoF();
298 TLorentzVector p4_mu1, p4_mu2;
305 massMumu = (p4_mu1 + p4_mu2).M();
307 MassMumu_decor(*mainVertex) = massMumu;
311 TLorentzVector p4_ka, p4_pi;
327 massKpi = (p4_ka + p4_pi).M();
329 MassKpi_svdecor(*mainVertex) = massKpi;
333 TLorentzVector p4_pip, p4_pim;
340 massPipi = (p4_pip + p4_pim).M();
342 MassPipi_sv2decor(*mainVertex) = massPipi;
344 MassJpsi_decor(*mainVertex) = (moms[2][0] + moms[2][1]).M();
345 MassPiD0_decor(*mainVertex) = (moms[2][2] + moms[2][4]).M();
346 MassPiD0K0_decor(*mainVertex) = (moms[2][2] + moms[2][4] + moms[2][3]).M();
353 Mass_svdecor(*mainVertex) =
m_CascadeTools->invariantMass(moms[1]);
354 MassErr_svdecor(*mainVertex) =
m_CascadeTools->invariantMassError(moms[1],
x->getCovariance()[1]);
356 PtErr_svdecor(*mainVertex) =
m_CascadeTools->pTError(moms[1],
x->getCovariance()[1]);
357 Lxy_svdecor(*mainVertex) =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],cascadeVertices[2]);
358 LxyErr_svdecor(*mainVertex) =
m_CascadeTools->lxyError(moms[1],
x->getCovariance()[1],cascadeVertices[1],cascadeVertices[2]);
359 Tau_svdecor(*mainVertex) =
m_CascadeTools->tau(moms[1],cascadeVertices[1],cascadeVertices[2]);
360 TauErr_svdecor(*mainVertex) =
m_CascadeTools->tauError(moms[1],
x->getCovariance()[1],cascadeVertices[1],cascadeVertices[2]);
364 Mass_sv2decor(*mainVertex) =
m_CascadeTools->invariantMass(moms[0]);
365 MassErr_sv2decor(*mainVertex) =
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0]);
367 PtErr_sv2decor(*mainVertex) =
m_CascadeTools->pTError(moms[0],
x->getCovariance()[0]);
368 Lxy_sv2decor(*mainVertex) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[2]);
369 LxyErr_sv2decor(*mainVertex) =
m_CascadeTools->lxyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[2]);
370 Tau_sv2decor(*mainVertex) =
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[2]);
371 TauErr_sv2decor(*mainVertex) =
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[2]);
375 <<
" chi2_1 " <<
m_V0Tools->chisq(cascadeVertices[0])
376 <<
" chi2_2 " <<
m_V0Tools->chisq(cascadeVertices[1])
377 <<
" chi2_3 " <<
m_V0Tools->chisq(cascadeVertices[2])
381 <<
" error " <<
m_V0Tools->invariantMassError(cascadeVertices[0],massesK0)
382 <<
" mass_d0 " <<
m_V0Tools->invariantMass(cascadeVertices[1],massesD0)
383 <<
" error " <<
m_V0Tools->invariantMassError(cascadeVertices[1],massesD0)
384 <<
" mass_J " <<
m_V0Tools->invariantMass(cascadeVertices[2],massesJpsipi)
385 <<
" error " <<
m_V0Tools->invariantMassError(cascadeVertices[2],massesJpsipi));
390 double Mass_B_err =
m_CascadeTools->invariantMassError(moms[2],
x->getCovariance()[2]);
391 double Mass_D0_err =
m_CascadeTools->invariantMassError(moms[1],
x->getCovariance()[1]);
392 double Mass_K0_err =
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0]);
393 ATH_MSG_DEBUG(
"Mass_B " << Mass_B <<
" Mass_D0 " << Mass_D0 <<
" Mass_K0 " << Mass_K0);
394 ATH_MSG_DEBUG(
"Mass_B_err " << Mass_B_err <<
" Mass_D0_err " << Mass_D0_err <<
" Mass_K0_err " << Mass_K0_err);
395 double mprob_B =
m_CascadeTools->massProbability(mass_b,Mass_B,Mass_B_err);
396 double mprob_D0 =
m_CascadeTools->massProbability(mass_d0,Mass_D0,Mass_D0_err);
397 double mprob_K0 =
m_CascadeTools->massProbability(mass_k0,Mass_K0,Mass_K0_err);
398 ATH_MSG_DEBUG(
"mprob_B " << mprob_B <<
" mprob_D0 " << mprob_D0 <<
" mprob_K0 " << mprob_K0);
402 <<
" Mass_k0 " <<
m_CascadeTools->invariantMass(moms[0],massesD0));
404 <<
" Mass_d0_err " <<
m_CascadeTools->invariantMassError(moms[1],
x->getCovariance()[1],massesD0)
405 <<
" Mass_k0_err " <<
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0],massesK0));
408 <<
" pt_d0 " <<
m_V0Tools->pT(cascadeVertices[1])
410 <<
" pt_k0 " <<
m_V0Tools->pT(cascadeVertices[0]));
412 <<
" ptErr_d " <<
m_CascadeTools->pTError(moms[1],
x->getCovariance()[1])
413 <<
" ptErr_d0 " <<
m_V0Tools->pTError(cascadeVertices[1])
414 <<
" ptErr_k " <<
m_CascadeTools->pTError(moms[0],
x->getCovariance()[0])
415 <<
" ptErr_k0 " <<
m_V0Tools->pTError(cascadeVertices[0]));
416 ATH_MSG_DEBUG(
"lxy_B " <<
m_V0Tools->lxy(cascadeVertices[2],primaryVertex) <<
" lxy_D " <<
m_V0Tools->lxy(cascadeVertices[1],cascadeVertices[2]) <<
" lxy_K " <<
m_V0Tools->lxy(cascadeVertices[0],cascadeVertices[2]));
419 <<
" lxyErr_d " <<
m_CascadeTools->lxyError(moms[1],
x->getCovariance()[1],cascadeVertices[1],cascadeVertices[2])
420 <<
" lxyErr_d0 " <<
m_V0Tools->lxyError(cascadeVertices[1],cascadeVertices[2])
421 <<
" lxyErr_k " <<
m_CascadeTools->lxyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[2])
422 <<
" lxyErr_k0 " <<
m_V0Tools->lxyError(cascadeVertices[0],cascadeVertices[2]));
424 <<
" tau_d0 " <<
m_V0Tools->tau(cascadeVertices[1],cascadeVertices[2],massesD0)
425 <<
" tau_k0 " <<
m_V0Tools->tau(cascadeVertices[0],cascadeVertices[2],massesK0));
427 <<
" tau_d " <<
m_CascadeTools->tau(moms[1],cascadeVertices[1],cascadeVertices[2])
428 <<
" tau_D " <<
m_CascadeTools->tau(moms[1],cascadeVertices[1],cascadeVertices[2],mass_d0)
429 <<
" tau_k " <<
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[2])
430 <<
" tau_K " <<
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[2],mass_k0));
432 <<
" tauErr_d " <<
m_CascadeTools->tauError(moms[1],
x->getCovariance()[1],cascadeVertices[1],cascadeVertices[2])
433 <<
" tauErr_d0 " <<
m_V0Tools->tauError(cascadeVertices[1],cascadeVertices[2],massesD0)
434 <<
" tauErr_k " <<
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[2])
435 <<
" tauErr_k0 " <<
m_V0Tools->tauError(cascadeVertices[0],cascadeVertices[2],massesK0));
437 <<
" TauErr_d " <<
m_CascadeTools->tauError(moms[1],
x->getCovariance()[1],cascadeVertices[1],cascadeVertices[2],mass_d0)
438 <<
" TauErr_d0 " <<
m_V0Tools->tauError(cascadeVertices[1],cascadeVertices[2],massesD0,mass_d0)
439 <<
" TauErr_k " <<
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[2],mass_k0)
440 <<
" TauErr_k0 " <<
m_V0Tools->tauError(cascadeVertices[0],cascadeVertices[2],massesD0,mass_k0));
442 ATH_MSG_DEBUG(
"CascadeTools main vert wrt PV " <<
" CascadeTools SV " <<
" V0Tools SV");
444 <<
", " <<
m_CascadeTools->a0z(moms[1],cascadeVertices[1],cascadeVertices[2])
445 <<
", " <<
m_CascadeTools->a0z(moms[0],cascadeVertices[0],cascadeVertices[2])
446 <<
", " <<
m_V0Tools->a0z(cascadeVertices[1],cascadeVertices[2])
447 <<
", " <<
m_V0Tools->a0z(cascadeVertices[0],cascadeVertices[2]));
449 <<
", " <<
m_CascadeTools->a0zError(moms[1],
x->getCovariance()[1],cascadeVertices[1],cascadeVertices[2])
450 <<
", " <<
m_CascadeTools->a0zError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[2])
451 <<
", " <<
m_V0Tools->a0zError(cascadeVertices[1],cascadeVertices[2])
452 <<
", " <<
m_V0Tools->a0zError(cascadeVertices[0],cascadeVertices[2]));
454 <<
", " <<
m_CascadeTools->a0xy(moms[1],cascadeVertices[1],cascadeVertices[2])
455 <<
", " <<
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],cascadeVertices[2])
456 <<
", " <<
m_V0Tools->a0xy(cascadeVertices[1],cascadeVertices[2])
457 <<
", " <<
m_V0Tools->a0xy(cascadeVertices[0],cascadeVertices[2]));
459 <<
", " <<
m_CascadeTools->a0xyError(moms[1],
x->getCovariance()[1],cascadeVertices[1],cascadeVertices[2])
460 <<
", " <<
m_CascadeTools->a0xyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[2])
461 <<
", " <<
m_V0Tools->a0xyError(cascadeVertices[1],cascadeVertices[2])
462 <<
", " <<
m_V0Tools->a0xyError(cascadeVertices[0],cascadeVertices[2]));
464 <<
", " <<
m_CascadeTools->a0(moms[1],cascadeVertices[1],cascadeVertices[2])
465 <<
", " <<
m_CascadeTools->a0(moms[0],cascadeVertices[0],cascadeVertices[2])
466 <<
", " <<
m_V0Tools->a0(cascadeVertices[1],cascadeVertices[2])
467 <<
", " <<
m_V0Tools->a0(cascadeVertices[0],cascadeVertices[2]));
469 <<
", " <<
m_CascadeTools->a0Error(moms[1],
x->getCovariance()[1],cascadeVertices[1],cascadeVertices[2])
470 <<
", " <<
m_CascadeTools->a0Error(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[2])
471 <<
", " <<
m_V0Tools->a0Error(cascadeVertices[1],cascadeVertices[2])
472 <<
", " <<
m_V0Tools->a0Error(cascadeVertices[0],cascadeVertices[2]));
476 ATH_MSG_DEBUG(
"X0 " << primaryVertex->
x() <<
" Y0 " << primaryVertex->
y() <<
" Z0 " << primaryVertex->
z());
480 ATH_MSG_DEBUG(
"Rxy0 wrt PV " <<
m_V0Tools->rxy(cascadeVertices[0],primaryVertex) <<
" RxyErr0 wrt PV " <<
m_V0Tools->rxyError(cascadeVertices[0],primaryVertex));
481 ATH_MSG_DEBUG(
"Rxy1 wrt PV " <<
m_V0Tools->rxy(cascadeVertices[1],primaryVertex) <<
" RxyErr1 wrt PV " <<
m_V0Tools->rxyError(cascadeVertices[1],primaryVertex));
482 ATH_MSG_DEBUG(
"Rxy2 wrt PV " <<
m_V0Tools->rxy(cascadeVertices[2],primaryVertex) <<
" RxyErr2 wrt PV " <<
m_V0Tools->rxyError(cascadeVertices[2],primaryVertex));
483 ATH_MSG_DEBUG(
"number of covariance matrices " << (
x->getCovariance()).size());
488 for (
auto x : cascadeinfoContainer)
delete x;
490 return StatusCode::SUCCESS;
583 assert(cascadeinfoContainer!=
nullptr);
587 ATH_CHECK(evtStore()->retrieve(trackContainer ,
"InDetTrackParticles" ));
603 std::vector<const xAOD::TrackParticle*> tracksJpsipi;
604 std::vector<const xAOD::TrackParticle*> tracksJpsi;
605 std::vector<const xAOD::TrackParticle*> tracksD0;
606 std::vector<const xAOD::TrackParticle*> tracksK0;
607 std::vector<const xAOD::TrackParticle*> tracksBc;
608 std::vector<double> massesJpsipi;
612 std::vector<double> massesD0;
615 std::vector<double> massesD0b;
618 std::vector<double> massesK0;
621 std::vector<double> Masses;
629 std::vector<const xAOD::Vertex*> selectedJpsipiCandidates;
630 for(
auto vxcItr=jpsipiContainer->
cbegin(); vxcItr!=jpsipiContainer->
cend(); ++vxcItr) {
634 SG::AuxElement::Accessor<Char_t> flagAcc1(
"passed_Jpsipi");
635 if(flagAcc1.isAvailable(*vtx)){
636 if(!flagAcc1(*vtx))
continue;
640 TLorentzVector p4Mup_in, p4Mum_in;
641 p4Mup_in.SetPtEtaPhiM((*vxcItr)->trackParticle(0)->pt(),
642 (*vxcItr)->trackParticle(0)->eta(),
644 p4Mum_in.SetPtEtaPhiM((*vxcItr)->trackParticle(1)->pt(),
645 (*vxcItr)->trackParticle(1)->eta(),
647 double mass_Jpsi = (p4Mup_in + p4Mum_in).M();
650 ATH_MSG_DEBUG(
" Original Jpsi candidate rejected by the mass cut: mass = "
656 double mass_Jpsipi =
m_V0Tools->invariantMass(*vxcItr, massesJpsipi);
659 ATH_MSG_DEBUG(
" Original Jpsipi candidate rejected by the mass cut: mass = "
664 selectedJpsipiCandidates.push_back(*vxcItr);
666 if(selectedJpsipiCandidates.size()<1)
return StatusCode::SUCCESS;
669 std::vector<const xAOD::Vertex*> selectedD0Candidates;
670 for(
auto vxcItr=d0Container->
cbegin(); vxcItr!=d0Container->
cend(); ++vxcItr) {
674 SG::AuxElement::Accessor<Char_t> flagAcc1(
"passed_D0");
675 SG::AuxElement::Accessor<Char_t> flagAcc2(
"passed_D0b");
678 if(flagAcc1.isAvailable(*vtx)){
679 if(!flagAcc1(*vtx)) isD0 =
false;
681 if(flagAcc2.isAvailable(*vtx)){
682 if(!flagAcc2(*vtx)) isD0b =
false;
684 if(!(isD0||isD0b))
continue;
687 if ((*vxcItr)->trackParticle(0)->charge() != 1 || (*vxcItr)->trackParticle(1)->charge() != -1) {
688 ATH_MSG_DEBUG(
" Original D0/D0-bar candidate rejected by the charge requirement: "
689 << (*vxcItr)->trackParticle(0)->charge() <<
", " << (*vxcItr)->trackParticle(1)->charge() );
694 double mass_D0 =
m_V0Tools->invariantMass(*vxcItr,massesD0);
695 double mass_D0b =
m_V0Tools->invariantMass(*vxcItr,massesD0b);
696 ATH_MSG_DEBUG(
"D0 mass " << mass_D0 <<
", D0b mass "<<mass_D0b);
698 ATH_MSG_DEBUG(
" Original D0 candidate rejected by the mass cut: mass = "
704 selectedD0Candidates.push_back(*vxcItr);
706 if(selectedD0Candidates.size()<1)
return StatusCode::SUCCESS;
709 std::vector<const xAOD::Vertex*> selectedK0Candidates;
710 for(
auto vxcItr=k0Container->
cbegin(); vxcItr!=k0Container->
cend(); ++vxcItr) {
714 SG::AuxElement::Accessor<Char_t> flagAcc1(
"passed_K0");
715 if(flagAcc1.isAvailable(*vtx)){
716 if(!flagAcc1(*vtx))
continue;
720 double mass_K0 =
m_V0Tools->invariantMass(*vxcItr, massesK0);
723 ATH_MSG_DEBUG(
" Original K_S0 candidate rejected by the mass cut: mass = "
728 selectedK0Candidates.push_back(*vxcItr);
730 if(selectedK0Candidates.size()<1)
return StatusCode::SUCCESS;
734 for(
auto jpsipiItr=selectedJpsipiCandidates.cbegin(); jpsipiItr!=selectedJpsipiCandidates.cend(); ++jpsipiItr) {
736 size_t jpsipiTrkNum = (*jpsipiItr)->nTrackParticles();
737 tracksJpsipi.clear();
739 for(
unsigned int it=0; it<jpsipiTrkNum; it++) tracksJpsipi.push_back((*jpsipiItr)->trackParticle(it));
740 for(
unsigned int it=0; it<jpsipiTrkNum-1; it++) tracksJpsi.push_back((*jpsipiItr)->trackParticle(it));
742 if (tracksJpsipi.size() != 3 || massesJpsipi.size() != 3 ) {
747 if(abs(
m_Dx_pid)==421 && (*jpsipiItr)->trackParticle(2)->charge()==-1) tagD0 =
false;
749 TLorentzVector p4_pi1;
750 p4_pi1.SetPtEtaPhiM((*jpsipiItr)->trackParticle(2)->pt(),
751 (*jpsipiItr)->trackParticle(2)->eta(),
755 for(
auto d0Itr=selectedD0Candidates.cbegin(); d0Itr!=selectedD0Candidates.cend(); ++d0Itr) {
758 if(std::find(tracksJpsipi.cbegin(), tracksJpsipi.cend(), (*d0Itr)->trackParticle(0)) != tracksJpsipi.cend())
continue;
759 if(std::find(tracksJpsipi.cbegin(), tracksJpsipi.cend(), (*d0Itr)->trackParticle(1)) != tracksJpsipi.cend())
continue;
761 TLorentzVector p4_ka, p4_pi2;
763 p4_pi2.SetPtEtaPhiM((*d0Itr)->trackParticle(0)->pt(),
764 (*d0Itr)->trackParticle(0)->eta(),
766 p4_ka.SetPtEtaPhiM( (*d0Itr)->trackParticle(1)->pt(),
767 (*d0Itr)->trackParticle(1)->eta(),
770 p4_pi2.SetPtEtaPhiM((*d0Itr)->trackParticle(1)->pt(),
771 (*d0Itr)->trackParticle(1)->eta(),
773 p4_ka.SetPtEtaPhiM( (*d0Itr)->trackParticle(0)->pt(),
774 (*d0Itr)->trackParticle(0)->eta(),
778 double mass_Dst= (p4_pi1 + p4_ka + p4_pi2).M();
781 ATH_MSG_DEBUG(
" Original D*+/- candidate rejected by the mass cut: mass = "
786 size_t d0TrkNum = (*d0Itr)->nTrackParticles();
788 for(
unsigned int it=0; it<d0TrkNum; it++) tracksD0.push_back((*d0Itr)->trackParticle(it));
789 if (tracksD0.size() != 2 || massesD0.size() != 2 ) {
794 for(
auto k0Itr=selectedK0Candidates.cbegin(); k0Itr!=selectedK0Candidates.cend(); ++k0Itr) {
797 if(std::find(tracksJpsipi.cbegin(), tracksJpsipi.cend(), (*k0Itr)->trackParticle(0)) != tracksJpsipi.cend())
continue;
798 if(std::find(tracksJpsipi.cbegin(), tracksJpsipi.cend(), (*k0Itr)->trackParticle(1)) != tracksJpsipi.cend())
continue;
799 if(std::find(tracksD0.cbegin(), tracksD0.cend(), (*k0Itr)->trackParticle(0)) != tracksD0.cend())
continue;
800 if(std::find(tracksD0.cbegin(), tracksD0.cend(), (*k0Itr)->trackParticle(1)) != tracksD0.cend())
continue;
802 size_t k0TrkNum = (*k0Itr)->nTrackParticles();
804 for(
unsigned int it=0; it<k0TrkNum; it++) tracksK0.push_back((*k0Itr)->trackParticle(it));
805 if (tracksK0.size() != 2 || massesK0.size() != 2 ) {
809 ATH_MSG_DEBUG(
"using tracks" << tracksJpsipi[0] <<
", " << tracksJpsipi[1] <<
", " << tracksJpsipi[2] <<
", " << tracksD0[0] <<
", " << tracksD0[1] <<
", " << tracksK0[0] <<
", " << tracksK0[1]);
812 for(
unsigned int it=0; it<jpsipiTrkNum; it++) tracksBc.push_back((*jpsipiItr)->trackParticle(it));
813 for(
unsigned int it=0; it<d0TrkNum; it++) tracksBc.push_back((*d0Itr)->trackParticle(it));
814 for(
unsigned int it=0; it<k0TrkNum; it++) tracksBc.push_back((*k0Itr)->trackParticle(it));
819 std::unique_ptr<Trk::IVKalState> state (
m_iVertexFitter->makeState(ctx));
825 std::vector<Trk::VertexID> vrtList;
829 vK0ID =
m_iVertexFitter->startVertex(tracksK0,massesK0, *state, mass_k0);
833 vrtList.push_back(vK0ID);
837 if(tagD0) vD0ID =
m_iVertexFitter->nextVertex(tracksD0,massesD0, *state, mass_d0);
838 else vD0ID =
m_iVertexFitter->nextVertex(tracksD0,massesD0b, *state, mass_d0);
840 if(tagD0) vD0ID =
m_iVertexFitter->nextVertex(tracksD0,massesD0, *state);
843 vrtList.push_back(vD0ID);
847 std::vector<Trk::VertexID> cnstV;
855 std::unique_ptr<Trk::VxCascadeInfo> result(
m_iVertexFitter->fitCascade(*state));
857 if (result !=
nullptr) {
861 ATH_MSG_DEBUG(
"storing tracks " << ((result->vertices())[0])->trackParticle(0) <<
", "
862 << ((result->vertices())[0])->trackParticle(1) <<
", "
863 << ((result->vertices())[1])->trackParticle(0) <<
", "
864 << ((result->vertices())[1])->trackParticle(1) <<
", "
865 << ((result->vertices())[2])->trackParticle(0) <<
", "
866 << ((result->vertices())[2])->trackParticle(1) <<
", "
867 << ((result->vertices())[2])->trackParticle(2));
869 result->setSVOwnership(
true);
872 double bChi2DOF = result->fitChi2()/result->nDoF();
876 const std::vector< std::vector<TLorentzVector> > &moms = result->getParticleMoms();
880 cascadeinfoContainer->push_back(result.release());
894 ATH_MSG_DEBUG(
"cascadeinfoContainer size " << cascadeinfoContainer->size());
896 return StatusCode::SUCCESS;