67 std::vector<Trk::VxCascadeInfo*> cascadeinfoContainer;
68 constexpr int topoN = 2;
69 std::array<xAOD::VertexContainer*, topoN> Vtxwritehandles;
70 std::array<xAOD::VertexAuxContainer*, topoN> Vtxwritehandlesaux;
73 for(
int i =0; i<topoN;i++){
76 Vtxwritehandles[i]->setStore(Vtxwritehandlesaux[i]);
89 if (pvContainer->
size()==0){
91 return StatusCode::RECOVERABLE;
93 primaryVertex = (*pvContainer)[0];
110 refPvContainer->setStore(refPvAuxContainer);
124 SG::AuxElement::Decorator<VertexLinkVector> CascadeLinksDecor(
"CascadeVertexLinks");
125 SG::AuxElement::Decorator<VertexLinkVector> JpsiLinksDecor(
"JpsiVertexLinks");
126 SG::AuxElement::Decorator<VertexLinkVector> DxLinksDecor(
"DxVertexLinks");
127 SG::AuxElement::Decorator<float> chi2_decor(
"ChiSquared");
128 SG::AuxElement::Decorator<float> ndof_decor(
"NumberDoF");
129 SG::AuxElement::Decorator<float> Pt_decor(
"Pt");
130 SG::AuxElement::Decorator<float> PtErr_decor(
"PtErr");
131 SG::AuxElement::Decorator<float> Mass_svdecor(
"Dx_mass");
132 SG::AuxElement::Decorator<float> MassErr_svdecor(
"Dx_massErr");
133 SG::AuxElement::Decorator<float> Pt_svdecor(
"Dx_Pt");
134 SG::AuxElement::Decorator<float> PtErr_svdecor(
"Dx_PtErr");
135 SG::AuxElement::Decorator<float> Lxy_svdecor(
"Dx_Lxy");
136 SG::AuxElement::Decorator<float> LxyErr_svdecor(
"Dx_LxyErr");
137 SG::AuxElement::Decorator<float> Tau_svdecor(
"Dx_Tau");
138 SG::AuxElement::Decorator<float> TauErr_svdecor(
"Dx_TauErr");
140 SG::AuxElement::Decorator<float> MassMumu_decor(
"Mumu_mass");
141 SG::AuxElement::Decorator<float> MassKX_svdecor(
"KX_mass");
142 SG::AuxElement::Decorator<float> MassKXpi_svdecor(
"KXpi_mass");
144 ATH_MSG_DEBUG(
"cascadeinfoContainer size " << cascadeinfoContainer.size());
156 return StatusCode::FAILURE;
177 const std::vector<xAOD::Vertex*> &cascadeVertices =
x->vertices();
178 if(cascadeVertices.size()!=topoN)
180 if(cascadeVertices[0] ==
nullptr || cascadeVertices[1] ==
nullptr)
ATH_MSG_ERROR(
"Error null vertex");
182 for(
int i =0;i<topoN;i++) Vtxwritehandles[i]->push_back(cascadeVertices[i]);
184 x->setSVOwnership(
false);
185 const auto mainVertex = cascadeVertices[1];
186 const std::vector< std::vector<TLorentzVector> > &moms =
x->getParticleMoms();
189 std::vector<const xAOD::Vertex*> verticestoLink;
190 verticestoLink.push_back(cascadeVertices[0]);
191 if(Vtxwritehandles[1] ==
nullptr)
ATH_MSG_ERROR(
"Vtxwritehandles[1] is null");
197 ATH_MSG_DEBUG(
"1 pt Jpsi tracks " << cascadeVertices[1]->trackParticle(0)->pt() <<
", " << cascadeVertices[1]->trackParticle(1)->pt());
202 ATH_MSG_DEBUG(
"1 pt D_(s)+ tracks " << cascadeVertices[0]->trackParticle(0)->pt() <<
", " << cascadeVertices[0]->trackParticle(1)->pt() <<
", " << cascadeVertices[0]->trackParticle(2)->pt());
206 std::vector<const xAOD::Vertex*> jpsiVerticestoLink;
207 if (jpsiVertex) jpsiVerticestoLink.push_back(jpsiVertex);
212 std::vector<const xAOD::Vertex*> dxVerticestoLink;
213 if (dxVertex) dxVerticestoLink.push_back(dxVertex);
225 std::vector<double> massesJpsi;
228 std::vector<double> massesDx;
237 std::vector<double> Masses;
259 PtErr_decor(*mainVertex) =
m_CascadeTools->pTError(moms[1],
x->getCovariance()[1]);
261 chi2_decor(*mainVertex) =
x->fitChi2();
262 ndof_decor(*mainVertex) =
x->nDoF();
266 TLorentzVector p4_mu1, p4_mu2;
273 massMumu = (p4_mu1 + p4_mu2).M();
275 MassMumu_decor(*mainVertex) = massMumu;
277 float massKX = 0., massKXpi = 0.;
279 TLorentzVector p4_h1, p4_h2, p4_h3;
298 massKX = (p4_h1 + p4_h2).M();
299 massKXpi = (p4_h1 + p4_h2 + p4_h3).M();
301 MassKX_svdecor(*mainVertex) = massKX;
302 MassKXpi_svdecor(*mainVertex) = massKXpi;
310 Mass_svdecor(*mainVertex) =
m_CascadeTools->invariantMass(moms[0]);
311 MassErr_svdecor(*mainVertex) =
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0]);
313 PtErr_svdecor(*mainVertex) =
m_CascadeTools->pTError(moms[0],
x->getCovariance()[0]);
314 Lxy_svdecor(*mainVertex) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
315 LxyErr_svdecor(*mainVertex) =
m_CascadeTools->lxyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
316 Tau_svdecor(*mainVertex) =
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1]);
317 TauErr_svdecor(*mainVertex) =
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
321 <<
" chi2_1 " <<
m_V0Tools->chisq(cascadeVertices[0])
322 <<
" chi2_2 " <<
m_V0Tools->chisq(cascadeVertices[1])
326 <<
" error " <<
m_V0Tools->invariantMassError(cascadeVertices[0],massesDx)
327 <<
" mass_J " <<
m_V0Tools->invariantMass(cascadeVertices[1],massesJpsi)
328 <<
" error " <<
m_V0Tools->invariantMassError(cascadeVertices[1],massesJpsi));
332 double Mass_B_err =
m_CascadeTools->invariantMassError(moms[1],
x->getCovariance()[1]);
333 double Mass_D_err =
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0]);
335 ATH_MSG_DEBUG(
"Mass_B_err " << Mass_B_err <<
" Mass_D_err " << Mass_D_err);
336 double mprob_B =
m_CascadeTools->massProbability(mass_b,Mass_B,Mass_B_err);
337 double mprob_D =
m_CascadeTools->massProbability(mass_d,Mass_D,Mass_D_err);
338 ATH_MSG_DEBUG(
"mprob_B " << mprob_B <<
" mprob_D " << mprob_D);
341 <<
" Mass_d " <<
m_CascadeTools->invariantMass(moms[0],massesDx));
343 <<
" Mass_d_err " <<
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0],massesDx));
346 <<
" pt_dp " <<
m_V0Tools->pT(cascadeVertices[0]));
348 <<
" ptErr_d " <<
m_CascadeTools->pTError(moms[0],
x->getCovariance()[0])
349 <<
" ptErr_dp " <<
m_V0Tools->pTError(cascadeVertices[0]));
353 <<
" lxyErr_d " <<
m_CascadeTools->lxyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
354 <<
" lxyErr_dp " <<
m_V0Tools->lxyError(cascadeVertices[0],cascadeVertices[1]));
356 <<
" tau_dp " <<
m_V0Tools->tau(cascadeVertices[0],cascadeVertices[1],massesDx));
358 <<
" tau_d " <<
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1])
359 <<
" tau_D " <<
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1],mass_d));
361 <<
" tauErr_d " <<
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
362 <<
" tauErr_dp " <<
m_V0Tools->tauError(cascadeVertices[0],cascadeVertices[1],massesDx));
364 <<
" TauErr_d " <<
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1],mass_d)
365 <<
" TauErr_dp " <<
m_V0Tools->tauError(cascadeVertices[0],cascadeVertices[1],massesDx,mass_d));
367 ATH_MSG_DEBUG(
"CascadeTools main vert wrt PV " <<
" CascadeTools SV " <<
" V0Tools SV");
369 <<
", " <<
m_CascadeTools->a0z(moms[0],cascadeVertices[0],cascadeVertices[1])
370 <<
", " <<
m_V0Tools->a0z(cascadeVertices[0],cascadeVertices[1]));
372 <<
", " <<
m_CascadeTools->a0zError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
373 <<
", " <<
m_V0Tools->a0zError(cascadeVertices[0],cascadeVertices[1]));
375 <<
", " <<
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],cascadeVertices[1])
376 <<
", " <<
m_V0Tools->a0xy(cascadeVertices[0],cascadeVertices[1]));
378 <<
", " <<
m_CascadeTools->a0xyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
379 <<
", " <<
m_V0Tools->a0xyError(cascadeVertices[0],cascadeVertices[1]));
381 <<
", " <<
m_CascadeTools->a0(moms[0],cascadeVertices[0],cascadeVertices[1])
382 <<
", " <<
m_V0Tools->a0(cascadeVertices[0],cascadeVertices[1]));
384 <<
", " <<
m_CascadeTools->a0Error(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
385 <<
", " <<
m_V0Tools->a0Error(cascadeVertices[0],cascadeVertices[1]));
388 ATH_MSG_DEBUG(
"X0 " << primaryVertex->
x() <<
" Y0 " << primaryVertex->
y() <<
" Z0 " << primaryVertex->
z());
391 ATH_MSG_DEBUG(
"Rxy0 wrt PV " <<
m_V0Tools->rxy(cascadeVertices[0],primaryVertex) <<
" RxyErr0 wrt PV " <<
m_V0Tools->rxyError(cascadeVertices[0],primaryVertex));
392 ATH_MSG_DEBUG(
"Rxy1 wrt PV " <<
m_V0Tools->rxy(cascadeVertices[1],primaryVertex) <<
" RxyErr1 wrt PV " <<
m_V0Tools->rxyError(cascadeVertices[1],primaryVertex));
393 ATH_MSG_DEBUG(
"number of covariance matrices " << (
x->getCovariance()).size());
398 for (
auto x : cascadeinfoContainer)
delete x;
400 return StatusCode::SUCCESS;
471 assert(cascadeinfoContainer!=
nullptr);
475 ATH_CHECK(evtStore()->retrieve(trackContainer ,
"InDetTrackParticles" ));
488 std::vector<const xAOD::TrackParticle*> tracksJpsi;
489 std::vector<const xAOD::TrackParticle*> tracksDx;
490 std::vector<const xAOD::TrackParticle*> tracksBc;
491 std::vector<double> massesJpsi;
494 std::vector<double> massesDx;
498 std::vector<double> massesDm;
502 std::vector<double> Masses;
508 std::vector<const xAOD::Vertex*> selectedJpsiCandidates;
509 for(
auto vxcItr=jpsiContainer->
cbegin(); vxcItr!=jpsiContainer->
cend(); ++vxcItr) {
513 SG::AuxElement::Accessor<Char_t> flagAcc1(
"passed_Jpsi");
514 if(flagAcc1.isAvailable(*vtx)){
515 if(!flagAcc1(*vtx))
continue;
519 double mass_Jpsi =
m_V0Tools->invariantMass(*vxcItr, massesJpsi);
521 ATH_MSG_DEBUG(
" Original Jpsi candidate rejected by the mass cut: mass = "
525 selectedJpsiCandidates.push_back(*vxcItr);
527 if(selectedJpsiCandidates.size()<1)
return StatusCode::SUCCESS;
530 std::vector<const xAOD::Vertex*> selectedDxCandidates;
531 for(
auto vxcItr=dxContainer->
cbegin(); vxcItr!=dxContainer->
cend(); ++vxcItr) {
536 SG::AuxElement::Accessor<Char_t> flagAcc1(
"passed_Ds");
537 if(flagAcc1.isAvailable(*vtx)){
538 if(!flagAcc1(*vtx))
continue;
543 SG::AuxElement::Accessor<Char_t> flagAcc1(
"passed_Dp");
544 SG::AuxElement::Accessor<Char_t> flagAcc2(
"passed_Dm");
547 if(flagAcc1.isAvailable(*vtx)){
548 if(!flagAcc1(*vtx)) isDp =
false;
550 if(flagAcc2.isAvailable(*vtx)){
551 if(!flagAcc2(*vtx)) isDm =
false;
553 if(!(isDp||isDm))
continue;
558 if(abs((*vxcItr)->trackParticle(0)->charge()+(*vxcItr)->trackParticle(1)->charge()+(*vxcItr)->trackParticle(2)->charge()) != 1){
559 ATH_MSG_DEBUG(
" Original D+ candidate rejected by the charge requirement: "
560 << (*vxcItr)->trackParticle(0)->charge() <<
", " << (*vxcItr)->trackParticle(1)->charge() <<
", " << (*vxcItr)->trackParticle(2)->charge() );
566 if(abs(
m_Dx_pid)==411 && (*vxcItr)->trackParticle(2)->charge()<0)
567 mass_D =
m_V0Tools->invariantMass(*vxcItr,massesDm);
569 mass_D =
m_V0Tools->invariantMass(*vxcItr,massesDx);
572 ATH_MSG_DEBUG(
" Original D_(s) candidate rejected by the mass cut: mass = "
579 TLorentzVector p4Kp_in, p4Km_in;
580 p4Kp_in.SetPtEtaPhiM( (*vxcItr)->trackParticle(0)->pt(),
581 (*vxcItr)->trackParticle(0)->eta(),
583 p4Km_in.SetPtEtaPhiM( (*vxcItr)->trackParticle(1)->pt(),
584 (*vxcItr)->trackParticle(1)->eta(),
586 double mass_phi = (p4Kp_in + p4Km_in).M();
588 if(mass_phi > 1200) {
589 ATH_MSG_DEBUG(
" Original phi candidate rejected by the mass cut: mass = " << mass_phi );
593 selectedDxCandidates.push_back(*vxcItr);
595 if(selectedDxCandidates.size()<1)
return StatusCode::SUCCESS;
599 for(
auto jpsiItr=selectedJpsiCandidates.cbegin(); jpsiItr!=selectedJpsiCandidates.cend(); ++jpsiItr) {
601 size_t jpsiTrkNum = (*jpsiItr)->nTrackParticles();
603 for(
unsigned int it=0; it<jpsiTrkNum; it++) tracksJpsi.push_back((*jpsiItr)->trackParticle(it));
605 if (tracksJpsi.size() != 2 || massesJpsi.size() != 2 ) {
610 for(
auto dxItr=selectedDxCandidates.cbegin(); dxItr!=selectedDxCandidates.cend(); ++dxItr) {
613 if(std::find(tracksJpsi.cbegin(), tracksJpsi.cend(), (*dxItr)->trackParticle(0)) != tracksJpsi.cend())
continue;
614 if(std::find(tracksJpsi.cbegin(), tracksJpsi.cend(), (*dxItr)->trackParticle(1)) != tracksJpsi.cend())
continue;
615 if(std::find(tracksJpsi.cbegin(), tracksJpsi.cend(), (*dxItr)->trackParticle(2)) != tracksJpsi.cend())
continue;
617 size_t dxTrkNum = (*dxItr)->nTrackParticles();
619 for(
unsigned int it=0; it<dxTrkNum; it++) tracksDx.push_back((*dxItr)->trackParticle(it));
620 if (tracksDx.size() != 3 || massesDx.size() != 3 ) {
624 ATH_MSG_DEBUG(
"using tracks" << tracksJpsi[0] <<
", " << tracksJpsi[1] <<
", " << tracksDx[0] <<
", " << tracksDx[1] <<
", " << tracksDx[2]);
626 for(
unsigned int it=0; it<jpsiTrkNum; it++) tracksBc.push_back((*jpsiItr)->trackParticle(it));
627 for(
unsigned int it=0; it<dxTrkNum; it++) tracksBc.push_back((*dxItr)->trackParticle(it));
631 std::unique_ptr<Trk::IVKalState> state (
m_iVertexFitter->makeState(ctx));
637 std::vector<Trk::VertexID> vrtList;
641 if(abs(
m_Dx_pid)==411 && (*dxItr)->trackParticle(2)->charge()<0)
646 if(abs(
m_Dx_pid)==411 && (*dxItr)->trackParticle(2)->charge()<0)
651 vrtList.push_back(vID);
655 std::vector<Trk::VertexID> cnstV;
663 std::unique_ptr<Trk::VxCascadeInfo> result(
m_iVertexFitter->fitCascade(*state));
665 if (result !=
nullptr) {
668 ATH_MSG_DEBUG(
"storing tracks " << ((result->vertices())[0])->trackParticle(0) <<
", "
669 << ((result->vertices())[0])->trackParticle(1) <<
", "
670 << ((result->vertices())[0])->trackParticle(2) <<
", "
671 << ((result->vertices())[1])->trackParticle(0) <<
", "
672 << ((result->vertices())[1])->trackParticle(1));
674 result->setSVOwnership(
true);
677 double bChi2DOF = result->fitChi2()/result->nDoF();
681 const std::vector< std::vector<TLorentzVector> > &moms = result->getParticleMoms();
685 cascadeinfoContainer->push_back(result.release());
697 ATH_MSG_DEBUG(
"cascadeinfoContainer size " << cascadeinfoContainer->size());
699 return StatusCode::SUCCESS;