11 #include "GaudiKernel/IPartPropSvc.h"
18 #include "HepPDT/ParticleDataTable.hh"
26 typedef std::vector<const xAOD::TrackParticle*>
TrackBag;
42 IPartPropSvc* partPropSvc =
nullptr;
43 ATH_CHECK( service(
"PartPropSvc", partPropSvc,
true) );
44 auto pdt = partPropSvc->PDT();
64 return StatusCode::SUCCESS;
70 std::vector<Trk::VxCascadeInfo*> cascadeinfoContainer;
71 constexpr
int topoN = 2;
72 std::array<xAOD::VertexContainer*, topoN> Vtxwritehandles;
73 std::array<xAOD::VertexAuxContainer*, topoN> Vtxwritehandlesaux;
76 for(
int i =0;
i<topoN;
i++){
79 Vtxwritehandles[
i]->setStore(Vtxwritehandlesaux[
i]);
92 if (pvContainer->
size()==0){
94 return StatusCode::RECOVERABLE;
96 primaryVertex = (*pvContainer)[0];
113 refPvContainer->setStore(refPvAuxContainer);
147 ATH_MSG_DEBUG(
"cascadeinfoContainer size " << cascadeinfoContainer.size());
159 return StatusCode::FAILURE;
180 const std::vector<xAOD::Vertex*> &cascadeVertices =
x->vertices();
181 if(cascadeVertices.size()!=topoN)
183 if(cascadeVertices[0] ==
nullptr || cascadeVertices[1] ==
nullptr)
ATH_MSG_ERROR(
"Error null vertex");
185 for(
int i =0;
i<topoN;
i++) Vtxwritehandles[
i]->push_back(cascadeVertices[
i]);
187 x->setSVOwnership(
false);
188 const auto mainVertex = cascadeVertices[1];
189 const std::vector< std::vector<TLorentzVector> > &moms =
x->getParticleMoms();
192 std::vector<const xAOD::Vertex*> verticestoLink;
193 verticestoLink.push_back(cascadeVertices[0]);
194 if(Vtxwritehandles[1] ==
nullptr)
ATH_MSG_ERROR(
"Vtxwritehandles[1] is null");
199 const xAOD::Vertex* jpsiVertex = BPhysPVCascadeTools::FindVertex<2>(jpsiContainer, cascadeVertices[1]);
200 ATH_MSG_DEBUG(
"1 pt Jpsi tracks " << cascadeVertices[1]->trackParticle(0)->
pt() <<
", " << cascadeVertices[1]->trackParticle(1)->
pt());
204 const xAOD::Vertex* dxVertex = BPhysPVCascadeTools::FindVertex<3>(dxContainer, cascadeVertices[0]);;
205 ATH_MSG_DEBUG(
"1 pt D_(s)+ tracks " << cascadeVertices[0]->trackParticle(0)->
pt() <<
", " << cascadeVertices[0]->trackParticle(1)->
pt() <<
", " << cascadeVertices[0]->trackParticle(2)->
pt());
209 std::vector<const xAOD::Vertex*> jpsiVerticestoLink;
210 if (jpsiVertex) jpsiVerticestoLink.push_back(jpsiVertex);
215 std::vector<const xAOD::Vertex*> dxVerticestoLink;
216 if (dxVertex) dxVerticestoLink.push_back(dxVertex);
228 std::vector<double> massesJpsi;
231 std::vector<double> massesDx;
240 std::vector<double> Masses;
262 PtErr_decor(*mainVertex) =
m_CascadeTools->pTError(moms[1],
x->getCovariance()[1]);
264 chi2_decor(*mainVertex) =
x->fitChi2();
265 ndof_decor(*mainVertex) =
x->nDoF();
269 TLorentzVector p4_mu1, p4_mu2;
276 massMumu = (p4_mu1 + p4_mu2).M();
278 MassMumu_decor(*mainVertex) = massMumu;
280 float massKX = 0., massKXpi = 0.;
282 TLorentzVector p4_h1, p4_h2, p4_h3;
301 massKX = (p4_h1 + p4_h2).M();
302 massKXpi = (p4_h1 + p4_h2 + p4_h3).M();
304 MassKX_svdecor(*mainVertex) = massKX;
305 MassKXpi_svdecor(*mainVertex) = massKXpi;
313 Mass_svdecor(*mainVertex) =
m_CascadeTools->invariantMass(moms[0]);
314 MassErr_svdecor(*mainVertex) =
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0]);
316 PtErr_svdecor(*mainVertex) =
m_CascadeTools->pTError(moms[0],
x->getCovariance()[0]);
317 Lxy_svdecor(*mainVertex) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
318 LxyErr_svdecor(*mainVertex) =
m_CascadeTools->lxyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
319 Tau_svdecor(*mainVertex) =
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1]);
320 TauErr_svdecor(*mainVertex) =
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
324 <<
" chi2_1 " <<
m_V0Tools->chisq(cascadeVertices[0])
325 <<
" chi2_2 " <<
m_V0Tools->chisq(cascadeVertices[1])
329 <<
" error " <<
m_V0Tools->invariantMassError(cascadeVertices[0],massesDx)
330 <<
" mass_J " <<
m_V0Tools->invariantMass(cascadeVertices[1],massesJpsi)
331 <<
" error " <<
m_V0Tools->invariantMassError(cascadeVertices[1],massesJpsi));
335 double Mass_B_err =
m_CascadeTools->invariantMassError(moms[1],
x->getCovariance()[1]);
336 double Mass_D_err =
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0]);
338 ATH_MSG_DEBUG(
"Mass_B_err " << Mass_B_err <<
" Mass_D_err " << Mass_D_err);
340 double mprob_D =
m_CascadeTools->massProbability(mass_d,Mass_D,Mass_D_err);
341 ATH_MSG_DEBUG(
"mprob_B " << mprob_B <<
" mprob_D " << mprob_D);
344 <<
" Mass_d " <<
m_CascadeTools->invariantMass(moms[0],massesDx));
346 <<
" Mass_d_err " <<
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0],massesDx));
349 <<
" pt_dp " <<
m_V0Tools->pT(cascadeVertices[0]));
351 <<
" ptErr_d " <<
m_CascadeTools->pTError(moms[0],
x->getCovariance()[0])
352 <<
" ptErr_dp " <<
m_V0Tools->pTError(cascadeVertices[0]));
356 <<
" lxyErr_d " <<
m_CascadeTools->lxyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
357 <<
" lxyErr_dp " <<
m_V0Tools->lxyError(cascadeVertices[0],cascadeVertices[1]));
359 <<
" tau_dp " <<
m_V0Tools->tau(cascadeVertices[0],cascadeVertices[1],massesDx));
361 <<
" tau_d " <<
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1])
362 <<
" tau_D " <<
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1],mass_d));
364 <<
" tauErr_d " <<
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
365 <<
" tauErr_dp " <<
m_V0Tools->tauError(cascadeVertices[0],cascadeVertices[1],massesDx));
367 <<
" TauErr_d " <<
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1],mass_d)
368 <<
" TauErr_dp " <<
m_V0Tools->tauError(cascadeVertices[0],cascadeVertices[1],massesDx,mass_d));
370 ATH_MSG_DEBUG(
"CascadeTools main vert wrt PV " <<
" CascadeTools SV " <<
" V0Tools SV");
372 <<
", " <<
m_CascadeTools->a0z(moms[0],cascadeVertices[0],cascadeVertices[1])
373 <<
", " <<
m_V0Tools->a0z(cascadeVertices[0],cascadeVertices[1]));
375 <<
", " <<
m_CascadeTools->a0zError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
376 <<
", " <<
m_V0Tools->a0zError(cascadeVertices[0],cascadeVertices[1]));
378 <<
", " <<
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],cascadeVertices[1])
379 <<
", " <<
m_V0Tools->a0xy(cascadeVertices[0],cascadeVertices[1]));
381 <<
", " <<
m_CascadeTools->a0xyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
382 <<
", " <<
m_V0Tools->a0xyError(cascadeVertices[0],cascadeVertices[1]));
384 <<
", " <<
m_CascadeTools->a0(moms[0],cascadeVertices[0],cascadeVertices[1])
385 <<
", " <<
m_V0Tools->a0(cascadeVertices[0],cascadeVertices[1]));
387 <<
", " <<
m_CascadeTools->a0Error(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
388 <<
", " <<
m_V0Tools->a0Error(cascadeVertices[0],cascadeVertices[1]));
391 ATH_MSG_DEBUG(
"X0 " << primaryVertex->
x() <<
" Y0 " << primaryVertex->
y() <<
" Z0 " << primaryVertex->
z());
394 ATH_MSG_DEBUG(
"Rxy0 wrt PV " <<
m_V0Tools->rxy(cascadeVertices[0],primaryVertex) <<
" RxyErr0 wrt PV " <<
m_V0Tools->rxyError(cascadeVertices[0],primaryVertex));
395 ATH_MSG_DEBUG(
"Rxy1 wrt PV " <<
m_V0Tools->rxy(cascadeVertices[1],primaryVertex) <<
" RxyErr1 wrt PV " <<
m_V0Tools->rxyError(cascadeVertices[1],primaryVertex));
396 ATH_MSG_DEBUG(
"number of covariance matrices " << (
x->getCovariance()).size());
401 for (
auto x : cascadeinfoContainer)
delete x;
403 return StatusCode::SUCCESS;
408 m_vertexContainerKey(
""),
409 m_vertexDxContainerKey(
""),
410 m_cascadeOutputsKeys{
"JpsiPlusDsCascadeVtx1",
"JpsiPlusDsCascadeVtx2" },
411 m_VxPrimaryCandidateName(
"PrimaryVertices"),
412 m_jpsiMassLower(0.0),
413 m_jpsiMassUpper(10000.0),
415 m_DxMassUpper(10000.0),
417 m_MassUpper(20000.0),
420 m_vtx0Daug1MassHypo(-1),
421 m_vtx0Daug2MassHypo(-1),
422 m_vtx1Daug1MassHypo(-1),
423 m_vtx1Daug2MassHypo(-1),
424 m_vtx1Daug3MassHypo(-1),
430 m_iVertexFitter(
"Trk::TrkVKalVrtFitter"),
431 m_pvRefitter(
"Analysis::PrimaryVertexRefitter"),
432 m_V0Tools(
"Trk::V0Tools"),
433 m_CascadeTools(
"DerivationFramework::CascadeTools")
438 declareProperty(
"RefPVContainerName", m_refPVContainerName =
"RefittedPrimaryVertices");
474 assert(cascadeinfoContainer!=
nullptr);
491 std::vector<const xAOD::TrackParticle*> tracksJpsi;
492 std::vector<const xAOD::TrackParticle*> tracksDx;
493 std::vector<const xAOD::TrackParticle*> tracksBc;
494 std::vector<double> massesJpsi;
497 std::vector<double> massesDx;
501 std::vector<double> massesDm;
505 std::vector<double> Masses;
511 std::vector<const xAOD::Vertex*> selectedJpsiCandidates;
512 for(
auto vxcItr=jpsiContainer->
cbegin(); vxcItr!=jpsiContainer->
cend(); ++vxcItr) {
518 if(!flagAcc1(*vtx))
continue;
522 double mass_Jpsi =
m_V0Tools->invariantMass(*vxcItr, massesJpsi);
524 ATH_MSG_DEBUG(
" Original Jpsi candidate rejected by the mass cut: mass = "
528 selectedJpsiCandidates.push_back(*vxcItr);
530 if(selectedJpsiCandidates.size()<1)
return StatusCode::SUCCESS;
533 std::vector<const xAOD::Vertex*> selectedDxCandidates;
534 for(
auto vxcItr=dxContainer->
cbegin(); vxcItr!=dxContainer->
cend(); ++vxcItr) {
541 if(!flagAcc1(*vtx))
continue;
551 if(!flagAcc1(*vtx)) isDp =
false;
554 if(!flagAcc2(*vtx)) isDm =
false;
556 if(!(isDp||isDm))
continue;
561 if(abs((*vxcItr)->trackParticle(0)->charge()+(*vxcItr)->trackParticle(1)->charge()+(*vxcItr)->trackParticle(2)->charge()) != 1){
562 ATH_MSG_DEBUG(
" Original D+ candidate rejected by the charge requirement: "
563 << (*vxcItr)->trackParticle(0)->charge() <<
", " << (*vxcItr)->trackParticle(1)->charge() <<
", " << (*vxcItr)->trackParticle(2)->charge() );
569 if(abs(
m_Dx_pid)==411 && (*vxcItr)->trackParticle(2)->charge()<0)
570 mass_D =
m_V0Tools->invariantMass(*vxcItr,massesDm);
572 mass_D =
m_V0Tools->invariantMass(*vxcItr,massesDx);
575 ATH_MSG_DEBUG(
" Original D_(s) candidate rejected by the mass cut: mass = "
582 TLorentzVector p4Kp_in, p4Km_in;
583 p4Kp_in.SetPtEtaPhiM( (*vxcItr)->trackParticle(0)->pt(),
584 (*vxcItr)->trackParticle(0)->eta(),
586 p4Km_in.SetPtEtaPhiM( (*vxcItr)->trackParticle(1)->pt(),
587 (*vxcItr)->trackParticle(1)->eta(),
589 double mass_phi = (p4Kp_in + p4Km_in).M();
591 if(mass_phi > 1200) {
592 ATH_MSG_DEBUG(
" Original phi candidate rejected by the mass cut: mass = " << mass_phi );
596 selectedDxCandidates.push_back(*vxcItr);
598 if(selectedDxCandidates.size()<1)
return StatusCode::SUCCESS;
602 for(
auto jpsiItr=selectedJpsiCandidates.cbegin(); jpsiItr!=selectedJpsiCandidates.cend(); ++jpsiItr) {
604 size_t jpsiTrkNum = (*jpsiItr)->nTrackParticles();
606 for(
unsigned int it=0;
it<jpsiTrkNum;
it++) tracksJpsi.push_back((*jpsiItr)->trackParticle(
it));
608 if (tracksJpsi.size() != 2 || massesJpsi.size() != 2 ) {
613 for(
auto dxItr=selectedDxCandidates.cbegin(); dxItr!=selectedDxCandidates.cend(); ++dxItr) {
616 if(
std::find(tracksJpsi.cbegin(), tracksJpsi.cend(), (*dxItr)->trackParticle(0)) != tracksJpsi.cend())
continue;
617 if(
std::find(tracksJpsi.cbegin(), tracksJpsi.cend(), (*dxItr)->trackParticle(1)) != tracksJpsi.cend())
continue;
618 if(
std::find(tracksJpsi.cbegin(), tracksJpsi.cend(), (*dxItr)->trackParticle(2)) != tracksJpsi.cend())
continue;
620 size_t dxTrkNum = (*dxItr)->nTrackParticles();
622 for(
unsigned int it=0;
it<dxTrkNum;
it++) tracksDx.push_back((*dxItr)->trackParticle(
it));
623 if (tracksDx.size() != 3 || massesDx.size() != 3 ) {
627 ATH_MSG_DEBUG(
"using tracks" << tracksJpsi[0] <<
", " << tracksJpsi[1] <<
", " << tracksDx[0] <<
", " << tracksDx[1] <<
", " << tracksDx[2]);
629 for(
unsigned int it=0;
it<jpsiTrkNum;
it++) tracksBc.push_back((*jpsiItr)->trackParticle(
it));
630 for(
unsigned int it=0;
it<dxTrkNum;
it++) tracksBc.push_back((*dxItr)->trackParticle(
it));
640 std::vector<Trk::VertexID> vrtList;
644 if(abs(
m_Dx_pid)==411 && (*dxItr)->trackParticle(2)->charge()<0)
649 if(abs(
m_Dx_pid)==411 && (*dxItr)->trackParticle(2)->charge()<0)
654 vrtList.push_back(vID);
658 std::vector<Trk::VertexID> cnstV;
672 << ((
result->vertices())[0])->trackParticle(1) <<
", "
673 << ((
result->vertices())[0])->trackParticle(2) <<
", "
674 << ((
result->vertices())[1])->trackParticle(0) <<
", "
675 << ((
result->vertices())[1])->trackParticle(1));
677 result->setSVOwnership(
true);
684 const std::vector< std::vector<TLorentzVector> > &moms =
result->getParticleMoms();
688 cascadeinfoContainer->push_back(
result.release());
700 ATH_MSG_DEBUG(
"cascadeinfoContainer size " << cascadeinfoContainer->size());
702 return StatusCode::SUCCESS;