11 #include "GaudiKernel/IPartPropSvc.h"
19 #include "HepPDT/ParticleDataTable.hh"
26 typedef std::vector<const xAOD::TrackParticle*>
TrackBag;
47 IPartPropSvc* partPropSvc =
nullptr;
48 ATH_CHECK( service(
"PartPropSvc", partPropSvc,
true) );
49 auto pdt = partPropSvc->PDT();
60 return StatusCode::SUCCESS;
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);
120 return StatusCode::FAILURE;
189 const std::vector<xAOD::Vertex*> &cascadeVertices =
x->vertices();
190 if(cascadeVertices.size()!=topoN)
192 if(cascadeVertices[0] ==
nullptr || cascadeVertices[1] ==
nullptr)
ATH_MSG_ERROR(
"Error null vertex");
194 for(
int i =0;
i<topoN;
i++) Vtxwritehandles[
i]->push_back(cascadeVertices[
i]);
196 x->setSVOwnership(
false);
197 const auto mainVertex = cascadeVertices[1];
198 const std::vector< std::vector<TLorentzVector> > &moms =
x->getParticleMoms();
201 std::vector<const xAOD::Vertex*> verticestoLink;
202 verticestoLink.push_back(cascadeVertices[0]);
203 if(Vtxwritehandles[1] ==
nullptr)
ATH_MSG_ERROR(
"Vtxwritehandles[1] is null");
208 const xAOD::Vertex* MuPiVertex = BPhysPVCascadeTools::FindVertex<2>(MuPiContainer, cascadeVertices[1]);
209 ATH_MSG_DEBUG(
"1 pt mu+pi_soft tracks " << cascadeVertices[1]->trackParticle(0)->
pt() <<
", " << cascadeVertices[1]->trackParticle(1)->
pt());
213 const xAOD::Vertex* d0Vertex = BPhysPVCascadeTools::FindVertex<2>(d0Container, cascadeVertices[0]);;
214 ATH_MSG_DEBUG(
"1 pt D0 tracks " << cascadeVertices[0]->trackParticle(0)->
pt() <<
", " << cascadeVertices[0]->trackParticle(1)->
pt());
218 std::vector<const xAOD::Vertex*> MuPiVerticestoLink;
219 if (MuPiVertex) MuPiVerticestoLink.push_back(MuPiVertex);
224 std::vector<const xAOD::Vertex*> d0VerticestoLink;
225 if (d0Vertex) d0VerticestoLink.push_back(d0Vertex);
237 std::vector<double> massesMuPi;
240 std::vector<double> massesD0;
248 std::vector<double> Masses;
270 PtErr_decor(*mainVertex) =
m_CascadeTools->pTError(moms[1],
x->getCovariance()[1]);
272 chi2_decor(*mainVertex) =
x->fitChi2();
273 ndof_decor(*mainVertex) =
x->nDoF();
274 Chi2Mu_decor(*mainVertex) = cascadeVertices[1]->trackParticle(0)->chiSquared();
275 nDoFMu_decor(*mainVertex) = cascadeVertices[1]->trackParticle(0)->numberDoF();
278 std::vector< Trk::VxTrackAtVertex > trkAtB = cascadeVertices[1]->vxTrackAtVertex();
279 MuChi2B_decor(*mainVertex) = trkAtB.at(0).trackQuality().chiSquared();
280 MunDoFB_decor(*mainVertex) = trkAtB.at(0).trackQuality().numberDoF();
284 TLorentzVector p4_mu1, p4_pi_s;
291 massMuPi = (p4_mu1 + p4_pi_s).M();
295 massMuPi_decor(*mainVertex) = massMuPi;
299 TLorentzVector p4_ka, p4_pi;
322 MassMuPiAft_decor(*mainVertex) = (moms[1][0] + moms[1][1]).M();
323 MassPiD0_decor(*mainVertex) = (moms[1][1] + moms[0][0] + moms[0][1]).M();
324 MassKpi_svdecor(*mainVertex) = (moms[0][0] + moms[0][1]).M();
325 MassMuPiPiK_decor(*mainVertex) =
m_CascadeTools->invariantMass(moms[1]);
331 Mass_svdecor(*mainVertex) =
m_CascadeTools->invariantMass(moms[0]);
332 MassErr_svdecor(*mainVertex) =
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0]);
334 PtErr_svdecor(*mainVertex) =
m_CascadeTools->pTError(moms[0],
x->getCovariance()[0]);
335 Lxy_svdecor(*mainVertex) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
336 LxyErr_svdecor(*mainVertex) =
m_CascadeTools->lxyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
337 Tau_svdecor(*mainVertex) =
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1]);
338 TauErr_svdecor(*mainVertex) =
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
343 <<
" chi2_1 " <<
m_V0Tools->chisq(cascadeVertices[0])
344 <<
" chi2_2 " <<
m_V0Tools->chisq(cascadeVertices[1])
348 <<
" error " <<
m_V0Tools->invariantMassError(cascadeVertices[0],massesD0)
349 <<
" mass_J " <<
m_V0Tools->invariantMass(cascadeVertices[1],massesMuPi)
350 <<
" error " <<
m_V0Tools->invariantMassError(cascadeVertices[1],massesMuPi));
354 double Mass_B_err =
m_CascadeTools->invariantMassError(moms[1],
x->getCovariance()[1]);
355 double Mass_D0_err =
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0]);
356 ATH_MSG_DEBUG(
"Mass_B " << Mass_B <<
" Mass_D0 " << Mass_D0);
357 ATH_MSG_DEBUG(
"Mass_B_err " << Mass_B_err <<
" Mass_D0_err " << Mass_D0_err);
359 double mprob_D0 =
m_CascadeTools->massProbability(mass_d0,Mass_D0,Mass_D0_err);
360 ATH_MSG_DEBUG(
"mprob_B " << mprob_B <<
" mprob_D0 " << mprob_D0);
363 <<
" Mass_d0 " <<
m_CascadeTools->invariantMass(moms[0],massesD0));
365 <<
" Mass_d0_err " <<
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0],massesD0));
368 <<
" pt_d0 " <<
m_V0Tools->pT(cascadeVertices[0]));
370 <<
" ptErr_d " <<
m_CascadeTools->pTError(moms[0],
x->getCovariance()[0])
371 <<
" ptErr_d0 " <<
m_V0Tools->pTError(cascadeVertices[0]));
375 <<
" lxyErr_d " <<
m_CascadeTools->lxyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
376 <<
" lxyErr_d0 " <<
m_V0Tools->lxyError(cascadeVertices[0],cascadeVertices[1]));
378 <<
" tau_d0 " <<
m_V0Tools->tau(cascadeVertices[0],cascadeVertices[1],massesD0));
380 <<
" tau_d " <<
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1])
381 <<
" tau_D " <<
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1],mass_d0));
383 <<
" tauErr_d " <<
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
384 <<
" tauErr_d0 " <<
m_V0Tools->tauError(cascadeVertices[0],cascadeVertices[1],massesD0));
386 <<
" TauErr_d " <<
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1],mass_d0)
387 <<
" TauErr_d0 " <<
m_V0Tools->tauError(cascadeVertices[0],cascadeVertices[1],massesD0,mass_d0));
389 ATH_MSG_DEBUG(
"CascadeTools main vert wrt PV " <<
" CascadeTools SV " <<
" V0Tools SV");
391 <<
", " <<
m_CascadeTools->a0z(moms[0],cascadeVertices[0],cascadeVertices[1])
392 <<
", " <<
m_V0Tools->a0z(cascadeVertices[0],cascadeVertices[1]));
394 <<
", " <<
m_CascadeTools->a0zError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
395 <<
", " <<
m_V0Tools->a0zError(cascadeVertices[0],cascadeVertices[1]));
397 <<
", " <<
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],cascadeVertices[1])
398 <<
", " <<
m_V0Tools->a0xy(cascadeVertices[0],cascadeVertices[1]));
400 <<
", " <<
m_CascadeTools->a0xyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
401 <<
", " <<
m_V0Tools->a0xyError(cascadeVertices[0],cascadeVertices[1]));
403 <<
", " <<
m_CascadeTools->a0(moms[0],cascadeVertices[0],cascadeVertices[1])
404 <<
", " <<
m_V0Tools->a0(cascadeVertices[0],cascadeVertices[1]));
406 <<
", " <<
m_CascadeTools->a0Error(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
407 <<
", " <<
m_V0Tools->a0Error(cascadeVertices[0],cascadeVertices[1]));
410 ATH_MSG_DEBUG(
"X0 " << primaryVertex->
x() <<
" Y0 " << primaryVertex->
y() <<
" Z0 " << primaryVertex->
z());
413 ATH_MSG_DEBUG(
"Rxy0 wrt PV " <<
m_V0Tools->rxy(cascadeVertices[0],primaryVertex) <<
" RxyErr0 wrt PV " <<
m_V0Tools->rxyError(cascadeVertices[0],primaryVertex));
414 ATH_MSG_DEBUG(
"Rxy1 wrt PV " <<
m_V0Tools->rxy(cascadeVertices[1],primaryVertex) <<
" RxyErr1 wrt PV " <<
m_V0Tools->rxyError(cascadeVertices[1],primaryVertex));
415 ATH_MSG_DEBUG(
"number of covariance matrices " << (
x->getCovariance()).size());
420 for (
auto x : cascadeinfoContainer)
delete x;
422 return StatusCode::SUCCESS;
427 m_vertexContainerKey(
""),
428 m_vertexD0ContainerKey(
""),
429 m_cascadeOutputsKeys{
"MuPlusDpstCascadeVtx1",
"MuPlusDpstCascadeVtx2" },
430 m_VxPrimaryCandidateName(
"PrimaryVertices"),
431 m_MuPiMassLower(0.0),
432 m_MuPiMassUpper(10000.0),
434 m_D0MassUpper(10000.0),
436 m_DstMassUpper(10000.0),
437 m_DstMassUpperAft(10000.0),
439 m_MassUpper(20000.0),
442 m_vtx0Daug1MassHypo(-1),
443 m_vtx0Daug2MassHypo(-1),
444 m_vtx1Daug1MassHypo(-1),
445 m_vtx1Daug2MassHypo(-1),
450 m_iVertexFitter(
"Trk::TrkVKalVrtFitter"),
451 m_pvRefitter(
"Analysis::PrimaryVertexRefitter",
this),
452 m_V0Tools(
"Trk::V0Tools"),
453 m_CascadeTools(
"DerivationFramework::CascadeTools")
458 declareProperty(
"RefPVContainerName", m_refPVContainerName =
"RefittedPrimaryVertices");
496 assert(cascadeinfoContainer!=
nullptr);
511 std::vector<const xAOD::TrackParticle*> tracksMuPi;
512 std::vector<const xAOD::TrackParticle*> tracksD0;
513 std::vector<double> massesMuPi;
516 std::vector<double> massesD0;
519 std::vector<double> massesD0b;
522 std::vector<double> Masses;
530 std::vector<const xAOD::Vertex*> selectedMuPiCandidates;
531 for (
auto vxcItr : *MuPiContainer ){
533 TLorentzVector p4Mup_in, p4Mum_in;
534 p4Mup_in.SetPtEtaPhiM(vxcItr->trackParticle(0)->pt(),
535 vxcItr->trackParticle(0)->eta(),
537 p4Mum_in.SetPtEtaPhiM(vxcItr->trackParticle(1)->pt(),
538 vxcItr->trackParticle(1)->eta(),
540 double mass_MuPi = (p4Mup_in + p4Mum_in).M();
543 ATH_MSG_DEBUG(
" Original mu & pi_soft candidate rejected by the mass cut: mass = "
551 ATH_MSG_DEBUG(
" Original mu & pi_soft candidate rejected by the track's cut level - loose");
555 selectedMuPiCandidates.push_back(vxcItr);
557 if(selectedMuPiCandidates.size()<1)
return StatusCode::SUCCESS;
560 std::vector<const xAOD::Vertex*> selectedD0Candidates;
561 for(
auto vxcItr : *d0Container){
569 if(!flagAcc1(*vtx)) isD0 =
false;
572 if(!flagAcc2(*vtx)) isD0b =
false;
574 if(!(isD0||isD0b))
continue;
578 ATH_MSG_DEBUG(
" Original D0/D0-bar candidate rejected by the track's cut level - loose ");
582 ATH_MSG_DEBUG(
" Original D0/D0-bar candidate rejected by the track's cut level - loose ");
588 if (vxcItr->trackParticle(0)->charge() != 1 || vxcItr->trackParticle(1)->charge() != -1) {
589 ATH_MSG_DEBUG(
" Original D0/D0-bar candidate rejected by the charge requirement: "
590 << vxcItr->trackParticle(0)->charge() <<
", " << vxcItr->trackParticle(1)->charge() );
595 double mass_D0 =
m_V0Tools->invariantMass(vxcItr,massesD0);
596 double mass_D0b =
m_V0Tools->invariantMass(vxcItr,massesD0b);
597 ATH_MSG_DEBUG(
"D0 mass " << mass_D0 <<
", D0b mass "<<mass_D0b);
599 ATH_MSG_DEBUG(
" Original D0/D0-bar candidate rejected by the mass cut: mass = "
605 selectedD0Candidates.push_back(vxcItr);
607 if(selectedD0Candidates.size()<1)
return StatusCode::SUCCESS;
611 for(
auto MuPiItr:selectedMuPiCandidates){
612 size_t MuPiTrkNum = MuPiItr->nTrackParticles();
615 for(
unsigned int it=0;
it<MuPiTrkNum;
it++) tracksMuPi.push_back(MuPiItr->trackParticle(
it));
617 if (tracksMuPi.size() != 2 || massesMuPi.size() != 2 ) {
622 if(std::abs(
m_Dx_pid)==421 && MuPiItr->trackParticle(1)->charge()==-1) tagD0 =
false;
624 TLorentzVector p4_pi1;
625 p4_pi1.SetPtEtaPhiM(MuPiItr->trackParticle(1)->pt(),
626 MuPiItr->trackParticle(1)->eta(),
629 for(
auto d0Itr : selectedD0Candidates){
632 if(
std::find(tracksMuPi.cbegin(), tracksMuPi.cend(), d0Itr->trackParticle(0)) != tracksMuPi.cend())
continue;
633 if(
std::find(tracksMuPi.cbegin(), tracksMuPi.cend(), d0Itr->trackParticle(1)) != tracksMuPi.cend())
continue;
635 TLorentzVector p4_ka, p4_pi2;
637 p4_pi2.SetPtEtaPhiM(d0Itr->trackParticle(0)->pt(),
638 d0Itr->trackParticle(0)->eta(),
640 p4_ka.SetPtEtaPhiM( d0Itr->trackParticle(1)->pt(),
641 d0Itr->trackParticle(1)->eta(),
644 p4_pi2.SetPtEtaPhiM(d0Itr->trackParticle(1)->pt(),
645 d0Itr->trackParticle(1)->eta(),
647 p4_ka.SetPtEtaPhiM( d0Itr->trackParticle(0)->pt(),
648 d0Itr->trackParticle(0)->eta(),
652 double mass_Dst= (p4_pi1 + p4_ka + p4_pi2).M();
655 ATH_MSG_DEBUG(
" Original D*+/- candidate rejected by the mass cut: mass = "
660 size_t d0TrkNum = d0Itr->nTrackParticles();
662 for(
unsigned int it=0;
it<d0TrkNum;
it++) tracksD0.push_back(d0Itr->trackParticle(
it));
663 if (tracksD0.size() != 2 || massesD0.size() != 2 ) {
680 std::vector<Trk::VertexID> vrtList;
684 if(tagD0) vID =
m_iVertexFitter->startVertex(tracksD0,massesD0, *state,mass_d0);
685 else vID =
m_iVertexFitter->startVertex(tracksD0,massesD0b, *state,mass_d0);
687 if(tagD0) vID =
m_iVertexFitter->startVertex(tracksD0, massesD0,*state);
690 vrtList.push_back(vID);
694 std::vector<Trk::VertexID> cnstV;
709 << ((
result->vertices())[0])->trackParticle(1) <<
", "
710 << ((
result->vertices())[1])->trackParticle(0) <<
", "
711 << ((
result->vertices())[1])->trackParticle(1));
713 result->setSVOwnership(
true);
720 const std::vector< std::vector<TLorentzVector> > &moms =
result->getParticleMoms();
721 const std::vector<xAOD::Vertex*> &cascadeVertices =
result->vertices();
724 double DstMassAft = (moms[1][1] + moms[0][0] + moms[0][1]).M();
729 if (
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]) > 0){
732 cascadeinfoContainer->push_back(
result.release());
747 ATH_MSG_DEBUG(
"cascadeinfoContainer size " << cascadeinfoContainer->size());
748 return StatusCode::SUCCESS;