58 std::vector<Trk::VxCascadeInfo*> cascadeinfoContainer;
59 constexpr int topoN = 2;
60 std::array<xAOD::VertexContainer*, topoN> Vtxwritehandles;
61 std::array<xAOD::VertexAuxContainer*, topoN> Vtxwritehandlesaux;
64 for(
int i =0; i<topoN;i++){
67 Vtxwritehandles[i]->setStore(Vtxwritehandlesaux[i]);
80 if (pvContainer->
size()==0){
82 return StatusCode::RECOVERABLE;
84 primaryVertex = (*pvContainer)[0];
101 refPvContainer->setStore(refPvAuxContainer);
110 if(not evt.isValid())
ATH_MSG_ERROR(
"Cannot Retrieve " << evt.key() );
115 SG::AuxElement::Decorator<VertexLinkVector> CascadeLinksDecor(
"CascadeVertexLinks");
116 SG::AuxElement::Decorator<VertexLinkVector> JpsipiLinksDecor(
"JpsipiVertexLinks");
117 SG::AuxElement::Decorator<VertexLinkVector> D0LinksDecor(
"D0VertexLinks");
118 SG::AuxElement::Decorator<float> chi2_decor(
"ChiSquared");
119 SG::AuxElement::Decorator<float> ndof_decor(
"NumberDoF");
120 SG::AuxElement::Decorator<float> Pt_decor(
"Pt");
121 SG::AuxElement::Decorator<float> PtErr_decor(
"PtErr");
122 SG::AuxElement::Decorator<float> Mass_svdecor(
"D0_mass");
123 SG::AuxElement::Decorator<float> MassErr_svdecor(
"D0_massErr");
124 SG::AuxElement::Decorator<float> Pt_svdecor(
"D0_Pt");
125 SG::AuxElement::Decorator<float> PtErr_svdecor(
"D0_PtErr");
126 SG::AuxElement::Decorator<float> Lxy_svdecor(
"D0_Lxy");
127 SG::AuxElement::Decorator<float> LxyErr_svdecor(
"D0_LxyErr");
128 SG::AuxElement::Decorator<float> Tau_svdecor(
"D0_Tau");
129 SG::AuxElement::Decorator<float> TauErr_svdecor(
"D0_TauErr");
131 SG::AuxElement::Decorator<float> MassMumu_decor(
"Mumu_mass");
132 SG::AuxElement::Decorator<float> MassKpi_svdecor(
"Kpi_mass");
133 SG::AuxElement::Decorator<float> MassJpsi_decor(
"Jpsi_mass");
134 SG::AuxElement::Decorator<float> MassPiD0_decor(
"PiD0_mass");
136 ATH_MSG_DEBUG(
"cascadeinfoContainer size " << cascadeinfoContainer.size());
148 return StatusCode::FAILURE;
169 const std::vector<xAOD::Vertex*> &cascadeVertices =
x->vertices();
170 if(cascadeVertices.size()!=topoN)
172 if(cascadeVertices[0] ==
nullptr || cascadeVertices[1] ==
nullptr)
ATH_MSG_ERROR(
"Error null vertex");
174 for(
int i =0;i<topoN;i++) Vtxwritehandles[i]->push_back(cascadeVertices[i]);
176 x->setSVOwnership(
false);
177 const auto mainVertex = cascadeVertices[1];
178 const std::vector< std::vector<TLorentzVector> > &moms =
x->getParticleMoms();
181 std::vector<const xAOD::Vertex*> verticestoLink;
182 verticestoLink.push_back(cascadeVertices[0]);
183 if(Vtxwritehandles[1] ==
nullptr)
ATH_MSG_ERROR(
"Vtxwritehandles[1] is null");
189 ATH_MSG_DEBUG(
"1 pt Jpsi+pi tracks " << cascadeVertices[1]->trackParticle(0)->pt() <<
", " << cascadeVertices[1]->trackParticle(1)->pt() <<
", " << cascadeVertices[1]->trackParticle(2)->pt());
194 ATH_MSG_DEBUG(
"1 pt D0 tracks " << cascadeVertices[0]->trackParticle(0)->pt() <<
", " << cascadeVertices[0]->trackParticle(1)->pt());
198 std::vector<const xAOD::Vertex*> jpsipiVerticestoLink;
199 if (jpsipiVertex) jpsipiVerticestoLink.push_back(jpsipiVertex);
204 std::vector<const xAOD::Vertex*> d0VerticestoLink;
205 if (d0Vertex) d0VerticestoLink.push_back(d0Vertex);
217 std::vector<double> massesJpsipi;
221 std::vector<double> massesD0;
229 std::vector<double> Masses;
251 PtErr_decor(*mainVertex) =
m_CascadeTools->pTError(moms[1],
x->getCovariance()[1]);
253 chi2_decor(*mainVertex) =
x->fitChi2();
254 ndof_decor(*mainVertex) =
x->nDoF();
258 TLorentzVector p4_mu1, p4_mu2;
265 massMumu = (p4_mu1 + p4_mu2).M();
267 MassMumu_decor(*mainVertex) = massMumu;
271 TLorentzVector p4_ka, p4_pi;
287 massKpi = (p4_ka + p4_pi).M();
289 MassKpi_svdecor(*mainVertex) = massKpi;
290 MassJpsi_decor(*mainVertex) = (moms[1][0] + moms[1][1]).M();
291 MassPiD0_decor(*mainVertex) = (moms[1][2] + moms[1][3]).M();
299 Mass_svdecor(*mainVertex) =
m_CascadeTools->invariantMass(moms[0]);
300 MassErr_svdecor(*mainVertex) =
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0]);
302 PtErr_svdecor(*mainVertex) =
m_CascadeTools->pTError(moms[0],
x->getCovariance()[0]);
303 Lxy_svdecor(*mainVertex) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
304 LxyErr_svdecor(*mainVertex) =
m_CascadeTools->lxyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
305 Tau_svdecor(*mainVertex) =
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1]);
306 TauErr_svdecor(*mainVertex) =
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
310 <<
" chi2_1 " <<
m_V0Tools->chisq(cascadeVertices[0])
311 <<
" chi2_2 " <<
m_V0Tools->chisq(cascadeVertices[1])
315 <<
" error " <<
m_V0Tools->invariantMassError(cascadeVertices[0],massesD0)
316 <<
" mass_J " <<
m_V0Tools->invariantMass(cascadeVertices[1],massesJpsipi)
317 <<
" error " <<
m_V0Tools->invariantMassError(cascadeVertices[1],massesJpsipi));
321 double Mass_B_err =
m_CascadeTools->invariantMassError(moms[1],
x->getCovariance()[1]);
322 double Mass_D0_err =
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0]);
323 ATH_MSG_DEBUG(
"Mass_B " << Mass_B <<
" Mass_D0 " << Mass_D0);
324 ATH_MSG_DEBUG(
"Mass_B_err " << Mass_B_err <<
" Mass_D0_err " << Mass_D0_err);
325 double mprob_B =
m_CascadeTools->massProbability(mass_b,Mass_B,Mass_B_err);
326 double mprob_D0 =
m_CascadeTools->massProbability(mass_d0,Mass_D0,Mass_D0_err);
327 ATH_MSG_DEBUG(
"mprob_B " << mprob_B <<
" mprob_D0 " << mprob_D0);
330 <<
" Mass_d0 " <<
m_CascadeTools->invariantMass(moms[0],massesD0));
332 <<
" Mass_d0_err " <<
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0],massesD0));
335 <<
" pt_d0 " <<
m_V0Tools->pT(cascadeVertices[0]));
337 <<
" ptErr_d " <<
m_CascadeTools->pTError(moms[0],
x->getCovariance()[0])
338 <<
" ptErr_d0 " <<
m_V0Tools->pTError(cascadeVertices[0]));
342 <<
" lxyErr_d " <<
m_CascadeTools->lxyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
343 <<
" lxyErr_d0 " <<
m_V0Tools->lxyError(cascadeVertices[0],cascadeVertices[1]));
345 <<
" tau_d0 " <<
m_V0Tools->tau(cascadeVertices[0],cascadeVertices[1],massesD0));
347 <<
" tau_d " <<
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1])
348 <<
" tau_D " <<
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1],mass_d0));
350 <<
" tauErr_d " <<
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
351 <<
" tauErr_d0 " <<
m_V0Tools->tauError(cascadeVertices[0],cascadeVertices[1],massesD0));
353 <<
" TauErr_d " <<
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1],mass_d0)
354 <<
" TauErr_d0 " <<
m_V0Tools->tauError(cascadeVertices[0],cascadeVertices[1],massesD0,mass_d0));
356 ATH_MSG_DEBUG(
"CascadeTools main vert wrt PV " <<
" CascadeTools SV " <<
" V0Tools SV");
358 <<
", " <<
m_CascadeTools->a0z(moms[0],cascadeVertices[0],cascadeVertices[1])
359 <<
", " <<
m_V0Tools->a0z(cascadeVertices[0],cascadeVertices[1]));
361 <<
", " <<
m_CascadeTools->a0zError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
362 <<
", " <<
m_V0Tools->a0zError(cascadeVertices[0],cascadeVertices[1]));
364 <<
", " <<
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],cascadeVertices[1])
365 <<
", " <<
m_V0Tools->a0xy(cascadeVertices[0],cascadeVertices[1]));
367 <<
", " <<
m_CascadeTools->a0xyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
368 <<
", " <<
m_V0Tools->a0xyError(cascadeVertices[0],cascadeVertices[1]));
370 <<
", " <<
m_CascadeTools->a0(moms[0],cascadeVertices[0],cascadeVertices[1])
371 <<
", " <<
m_V0Tools->a0(cascadeVertices[0],cascadeVertices[1]));
373 <<
", " <<
m_CascadeTools->a0Error(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
374 <<
", " <<
m_V0Tools->a0Error(cascadeVertices[0],cascadeVertices[1]));
377 ATH_MSG_DEBUG(
"X0 " << primaryVertex->
x() <<
" Y0 " << primaryVertex->
y() <<
" Z0 " << primaryVertex->
z());
380 ATH_MSG_DEBUG(
"Rxy0 wrt PV " <<
m_V0Tools->rxy(cascadeVertices[0],primaryVertex) <<
" RxyErr0 wrt PV " <<
m_V0Tools->rxyError(cascadeVertices[0],primaryVertex));
381 ATH_MSG_DEBUG(
"Rxy1 wrt PV " <<
m_V0Tools->rxy(cascadeVertices[1],primaryVertex) <<
" RxyErr1 wrt PV " <<
m_V0Tools->rxyError(cascadeVertices[1],primaryVertex));
382 ATH_MSG_DEBUG(
"number of covariance matrices " << (
x->getCovariance()).size());
387 for (
auto x : cascadeinfoContainer)
delete x;
389 return StatusCode::SUCCESS;
468 assert(cascadeinfoContainer!=
nullptr);
472 ATH_CHECK(evtStore()->retrieve(trackContainer ,
"InDetTrackParticles" ));
483 std::vector<const xAOD::TrackParticle*> tracksJpsipi;
484 std::vector<const xAOD::TrackParticle*> tracksJpsi;
485 std::vector<const xAOD::TrackParticle*> tracksD0;
486 std::vector<const xAOD::TrackParticle*> tracksBc;
487 std::vector<double> massesJpsipi;
491 std::vector<double> massesD0;
494 std::vector<double> massesD0b;
497 std::vector<double> Masses;
504 std::vector<const xAOD::Vertex*> selectedJpsipiCandidates;
505 for(
auto vxcItr=jpsipiContainer->
cbegin(); vxcItr!=jpsipiContainer->
cend(); ++vxcItr) {
509 SG::AuxElement::Accessor<Char_t> flagAcc1(
"passed_Jpsipi");
510 if(flagAcc1.isAvailable(*vtx)){
511 if(!flagAcc1(*vtx))
continue;
515 TLorentzVector p4Mup_in, p4Mum_in;
516 p4Mup_in.SetPtEtaPhiM((*vxcItr)->trackParticle(0)->pt(),
517 (*vxcItr)->trackParticle(0)->eta(),
519 p4Mum_in.SetPtEtaPhiM((*vxcItr)->trackParticle(1)->pt(),
520 (*vxcItr)->trackParticle(1)->eta(),
522 double mass_Jpsi = (p4Mup_in + p4Mum_in).M();
525 ATH_MSG_DEBUG(
" Original Jpsi candidate rejected by the mass cut: mass = "
531 double mass_Jpsipi =
m_V0Tools->invariantMass(*vxcItr, massesJpsipi);
534 ATH_MSG_DEBUG(
" Original Jpsipi candidate rejected by the mass cut: mass = "
539 selectedJpsipiCandidates.push_back(*vxcItr);
541 if(selectedJpsipiCandidates.size()<1)
return StatusCode::SUCCESS;
544 std::vector<const xAOD::Vertex*> selectedD0Candidates;
545 for(
auto vxcItr=d0Container->
cbegin(); vxcItr!=d0Container->
cend(); ++vxcItr) {
549 SG::AuxElement::Accessor<Char_t> flagAcc1(
"passed_D0");
550 SG::AuxElement::Accessor<Char_t> flagAcc2(
"passed_D0b");
553 if(flagAcc1.isAvailable(*vtx)){
554 if(!flagAcc1(*vtx)) isD0 =
false;
556 if(flagAcc2.isAvailable(*vtx)){
557 if(!flagAcc2(*vtx)) isD0b =
false;
559 if(!(isD0||isD0b))
continue;
562 if ((*vxcItr)->trackParticle(0)->charge() != 1 || (*vxcItr)->trackParticle(1)->charge() != -1) {
563 ATH_MSG_DEBUG(
" Original D0/D0-bar candidate rejected by the charge requirement: "
564 << (*vxcItr)->trackParticle(0)->charge() <<
", " << (*vxcItr)->trackParticle(1)->charge() );
569 double mass_D0 =
m_V0Tools->invariantMass(*vxcItr,massesD0);
570 double mass_D0b =
m_V0Tools->invariantMass(*vxcItr,massesD0b);
571 ATH_MSG_DEBUG(
"D0 mass " << mass_D0 <<
", D0b mass "<<mass_D0b);
573 ATH_MSG_DEBUG(
" Original D0 candidate rejected by the mass cut: mass = "
579 selectedD0Candidates.push_back(*vxcItr);
581 if(selectedD0Candidates.size()<1)
return StatusCode::SUCCESS;
585 for(
auto jpsipiItr=selectedJpsipiCandidates.cbegin(); jpsipiItr!=selectedJpsipiCandidates.cend(); ++jpsipiItr) {
587 size_t jpsipiTrkNum = (*jpsipiItr)->nTrackParticles();
588 tracksJpsipi.clear();
590 for(
unsigned int it=0; it<jpsipiTrkNum; it++) tracksJpsipi.push_back((*jpsipiItr)->trackParticle(it));
591 for(
unsigned int it=0; it<jpsipiTrkNum-1; it++) tracksJpsi.push_back((*jpsipiItr)->trackParticle(it));
593 if (tracksJpsipi.size() != 3 || massesJpsipi.size() != 3 ) {
598 if(abs(
m_Dx_pid)==421 && (*jpsipiItr)->trackParticle(2)->charge()==-1) tagD0 =
false;
600 TLorentzVector p4_pi1;
601 p4_pi1.SetPtEtaPhiM((*jpsipiItr)->trackParticle(2)->pt(),
602 (*jpsipiItr)->trackParticle(2)->eta(),
606 for(
auto d0Itr=selectedD0Candidates.cbegin(); d0Itr!=selectedD0Candidates.cend(); ++d0Itr) {
609 if(std::find(tracksJpsipi.cbegin(), tracksJpsipi.cend(), (*d0Itr)->trackParticle(0)) != tracksJpsipi.cend())
continue;
610 if(std::find(tracksJpsipi.cbegin(), tracksJpsipi.cend(), (*d0Itr)->trackParticle(1)) != tracksJpsipi.cend())
continue;
613 TLorentzVector p4_ka, p4_pi2;
615 p4_pi2.SetPtEtaPhiM((*d0Itr)->trackParticle(0)->pt(),
616 (*d0Itr)->trackParticle(0)->eta(),
618 p4_ka.SetPtEtaPhiM( (*d0Itr)->trackParticle(1)->pt(),
619 (*d0Itr)->trackParticle(1)->eta(),
622 p4_pi2.SetPtEtaPhiM((*d0Itr)->trackParticle(1)->pt(),
623 (*d0Itr)->trackParticle(1)->eta(),
625 p4_ka.SetPtEtaPhiM( (*d0Itr)->trackParticle(0)->pt(),
626 (*d0Itr)->trackParticle(0)->eta(),
630 double mass_Dst= (p4_pi1 + p4_ka + p4_pi2).M();
633 ATH_MSG_DEBUG(
" Original D*+/- candidate rejected by the mass cut: mass = "
638 size_t d0TrkNum = (*d0Itr)->nTrackParticles();
640 for(
unsigned int it=0; it<d0TrkNum; it++) tracksD0.push_back((*d0Itr)->trackParticle(it));
641 if (tracksD0.size() != 2 || massesD0.size() != 2 ) {
645 ATH_MSG_DEBUG(
"using tracks" << tracksJpsipi[0] <<
", " << tracksJpsipi[1] <<
", " << tracksJpsipi[2] <<
", " << tracksD0[0] <<
", " << tracksD0[1]);
646 ATH_MSG_DEBUG(
"Charge of Jpsi+pi tracks: "<<(*jpsipiItr)->trackParticle(0)->charge()<<
", "<<(*jpsipiItr)->trackParticle(1)->charge()<<
", "<<(*jpsipiItr)->trackParticle(2)->charge());
647 ATH_MSG_DEBUG(
"Charge of D0 tracks: "<<(*d0Itr)->trackParticle(0)->charge()<<
", "<<(*d0Itr)->trackParticle(1)->charge());
650 for(
unsigned int it=0; it<jpsipiTrkNum; it++) tracksBc.push_back((*jpsipiItr)->trackParticle(it));
651 for(
unsigned int it=0; it<d0TrkNum; it++) tracksBc.push_back((*d0Itr)->trackParticle(it));
656 std::unique_ptr<Trk::IVKalState> state (
m_iVertexFitter->makeState(ctx));
662 std::vector<Trk::VertexID> vrtList;
666 if(tagD0) vID =
m_iVertexFitter->startVertex(tracksD0,massesD0,*state,mass_d0);
667 else vID =
m_iVertexFitter->startVertex(tracksD0,massesD0b,*state,mass_d0);
669 if(tagD0) vID =
m_iVertexFitter->startVertex(tracksD0,massesD0,*state);
672 vrtList.push_back(vID);
676 std::vector<Trk::VertexID> cnstV;
684 std::unique_ptr<Trk::VxCascadeInfo> result(
m_iVertexFitter->fitCascade(*state));
686 if (result !=
nullptr) {
690 ATH_MSG_DEBUG(
"storing tracks " << ((result->vertices())[0])->trackParticle(0) <<
", "
691 << ((result->vertices())[0])->trackParticle(1) <<
", "
692 << ((result->vertices())[1])->trackParticle(0) <<
", "
693 << ((result->vertices())[1])->trackParticle(1) <<
", "
694 << ((result->vertices())[1])->trackParticle(2));
696 result->setSVOwnership(
true);
699 double bChi2DOF = result->fitChi2()/result->nDoF();
703 const std::vector< std::vector<TLorentzVector> > &moms = result->getParticleMoms();
707 cascadeinfoContainer->push_back(result.release());
719 ATH_MSG_DEBUG(
"cascadeinfoContainer size " << cascadeinfoContainer->size());
721 return StatusCode::SUCCESS;