11 #include "GaudiKernel/IPartPropSvc.h"
19 #include "HepPDT/ParticleDataTable.hh"
26 typedef std::vector<const xAOD::TrackParticle*>
TrackBag;
34 return StatusCode::FAILURE;
42 return StatusCode::FAILURE;
50 return StatusCode::FAILURE;
56 IPartPropSvc* partPropSvc = 0;
57 StatusCode sc = service(
"PartPropSvc", partPropSvc,
true);
59 msg(MSG::ERROR) <<
"Could not initialize Particle Properties Service" <<
endmsg;
60 return StatusCode::FAILURE;
62 const HepPDT::ParticleDataTable* pdt = partPropSvc->PDT();
76 return StatusCode::SUCCESS;
82 std::vector<Trk::VxCascadeInfo*> cascadeinfoContainer;
83 constexpr
int topoN = 2;
84 std::array<xAOD::VertexContainer*, topoN> Vtxwritehandles;
85 std::array<xAOD::VertexAuxContainer*, topoN> Vtxwritehandlesaux;
88 for(
int i =0;
i<topoN;
i++){
91 Vtxwritehandles[
i]->setStore(Vtxwritehandlesaux[
i]);
104 if (pvContainer->
size()==0){
106 return StatusCode::RECOVERABLE;
108 primaryVertex = (*pvContainer)[0];
120 refPvContainer->setStore(refPvAuxContainer);
149 ATH_MSG_DEBUG(
"cascadeinfoContainer size " << cascadeinfoContainer.size());
161 return StatusCode::FAILURE;
182 const std::vector<xAOD::Vertex*> &cascadeVertices =
x->vertices();
183 if(cascadeVertices.size()!=topoN)
185 if(cascadeVertices[0] ==
nullptr || cascadeVertices[1] ==
nullptr)
ATH_MSG_ERROR(
"Error null vertex");
187 for(
int i =0;
i<topoN;
i++) Vtxwritehandles[
i]->push_back(cascadeVertices[
i]);
189 x->setSVOwnership(
false);
190 const auto mainVertex = cascadeVertices[1];
192 const std::vector< std::vector<TLorentzVector> > &moms =
x->getParticleMoms();
195 std::vector<const xAOD::Vertex*> verticestoLink;
196 verticestoLink.push_back(cascadeVertices[0]);
197 if(Vtxwritehandles[1] ==
nullptr)
ATH_MSG_ERROR(
"Vtxwritehandles[1] is null");
202 const xAOD::Vertex* jpsiVertex = BPhysPVCascadeTools::FindVertex<2>(jpsiContainer, cascadeVertices[1]);
203 ATH_MSG_DEBUG(
"1 pt Jpsi tracks " << cascadeVertices[1]->trackParticle(0)->
pt() <<
", " << cascadeVertices[1]->trackParticle(1)->
pt());
207 const xAOD::Vertex* v0Vertex = BPhysPVCascadeTools::FindVertex<2>(v0Container, cascadeVertices[0]);;
208 ATH_MSG_DEBUG(
"1 pt V0 tracks " << cascadeVertices[0]->trackParticle(0)->
pt() <<
", " << cascadeVertices[0]->trackParticle(1)->
pt());
212 std::vector<const xAOD::Vertex*> jpsiVerticestoLink;
213 if (jpsiVertex) jpsiVerticestoLink.push_back(jpsiVertex);
218 std::vector<const xAOD::Vertex*> v0VerticestoLink;
219 if (v0Vertex) v0VerticestoLink.push_back(v0Vertex);
227 std::vector<double> massesJpsi(2, mass_track);
228 std::vector<double> massesV0;
229 std::vector<double> Masses(2, mass_track);
264 PtErr_decor(*mainVertex) =
m_CascadeTools->pTError(moms[1],
x->getCovariance()[1]);
266 chi2_decor(*mainVertex) =
x->fitChi2();
267 ndof_decor(*mainVertex) =
x->nDoF();
274 Mass_svdecor(*mainVertex) =
m_CascadeTools->invariantMass(moms[0]);
275 MassErr_svdecor(*mainVertex) =
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0]);
277 PtErr_svdecor(*mainVertex) =
m_CascadeTools->pTError(moms[0],
x->getCovariance()[0]);
278 Lxy_svdecor(*mainVertex) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
279 LxyErr_svdecor(*mainVertex) =
m_CascadeTools->lxyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
280 Tau_svdecor(*mainVertex) =
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1]);
281 TauErr_svdecor(*mainVertex) =
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
285 <<
" chi2_1 " <<
m_V0Tools->chisq(cascadeVertices[0])
286 <<
" chi2_2 " <<
m_V0Tools->chisq(cascadeVertices[1])
290 <<
" error " <<
m_V0Tools->invariantMassError(cascadeVertices[0],massesV0)
291 <<
" mass_J " <<
m_V0Tools->invariantMass(cascadeVertices[1],massesJpsi)
292 <<
" error " <<
m_V0Tools->invariantMassError(cascadeVertices[1],massesJpsi));
296 double Mass_B_err =
m_CascadeTools->invariantMassError(moms[1],
x->getCovariance()[1]);
297 double Mass_V0_err =
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0]);
298 ATH_MSG_DEBUG(
"Mass_B " << Mass_B <<
" Mass_V0 " << Mass_V0);
299 ATH_MSG_DEBUG(
"Mass_B_err " << Mass_B_err <<
" Mass_V0_err " << Mass_V0_err);
301 double mprob_V0 =
m_CascadeTools->massProbability(mass_v0,Mass_V0,Mass_V0_err);
302 ATH_MSG_DEBUG(
"mprob_B " << mprob_B <<
" mprob_V0 " << mprob_V0);
305 <<
" Mass_v0 " <<
m_CascadeTools->invariantMass(moms[0],massesV0));
307 <<
" Mass_v0_err " <<
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0],massesV0));
310 <<
" pt_v0 " <<
m_V0Tools->pT(cascadeVertices[0]));
312 <<
" ptErr_v " <<
m_CascadeTools->pTError(moms[0],
x->getCovariance()[0])
313 <<
" ptErr_v0 " <<
m_V0Tools->pTError(cascadeVertices[0]));
317 <<
" lxyErr_v " <<
m_CascadeTools->lxyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
318 <<
" lxyErr_v0 " <<
m_V0Tools->lxyError(cascadeVertices[0],cascadeVertices[1]));
320 <<
" tau_v0 " <<
m_V0Tools->tau(cascadeVertices[0],cascadeVertices[1],massesV0));
322 <<
" tau_v " <<
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1])
323 <<
" tau_V " <<
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1],mass_v0));
325 <<
" tauErr_v " <<
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
326 <<
" tauErr_v0 " <<
m_V0Tools->tauError(cascadeVertices[0],cascadeVertices[1],massesV0));
328 <<
" TauErr_v " <<
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1],mass_v0)
329 <<
" TauErr_v0 " <<
m_V0Tools->tauError(cascadeVertices[0],cascadeVertices[1],massesV0,mass_v0));
331 ATH_MSG_DEBUG(
"CascadeTools main vert wrt PV " <<
" CascadeTools SV " <<
" V0Tools SV");
333 <<
", " <<
m_CascadeTools->a0z(moms[0],cascadeVertices[0],cascadeVertices[1])
334 <<
", " <<
m_V0Tools->a0z(cascadeVertices[0],cascadeVertices[1]));
336 <<
", " <<
m_CascadeTools->a0zError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
337 <<
", " <<
m_V0Tools->a0zError(cascadeVertices[0],cascadeVertices[1]));
339 <<
", " <<
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],cascadeVertices[1])
340 <<
", " <<
m_V0Tools->a0xy(cascadeVertices[0],cascadeVertices[1]));
342 <<
", " <<
m_CascadeTools->a0xyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
343 <<
", " <<
m_V0Tools->a0xyError(cascadeVertices[0],cascadeVertices[1]));
345 <<
", " <<
m_CascadeTools->a0(moms[0],cascadeVertices[0],cascadeVertices[1])
346 <<
", " <<
m_V0Tools->a0(cascadeVertices[0],cascadeVertices[1]));
348 <<
", " <<
m_CascadeTools->a0Error(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
349 <<
", " <<
m_V0Tools->a0Error(cascadeVertices[0],cascadeVertices[1]));
352 ATH_MSG_DEBUG(
"X0 " << primaryVertex->
x() <<
" Y0 " << primaryVertex->
y() <<
" Z0 " << primaryVertex->
z());
355 ATH_MSG_DEBUG(
"Rxy0 wrt PV " <<
m_V0Tools->rxy(cascadeVertices[0],primaryVertex) <<
" RxyErr0 wrt PV " <<
m_V0Tools->rxyError(cascadeVertices[0],primaryVertex));
356 ATH_MSG_DEBUG(
"Rxy1 wrt PV " <<
m_V0Tools->rxy(cascadeVertices[1],primaryVertex) <<
" RxyErr1 wrt PV " <<
m_V0Tools->rxyError(cascadeVertices[1],primaryVertex));
357 ATH_MSG_DEBUG(
"number of covariance matrices " << (
x->getCovariance()).size());
368 for (
auto x : cascadeinfoContainer)
delete x;
370 return StatusCode::SUCCESS;
375 m_vertexContainerKey(
""),
376 m_vertexV0ContainerKey(
""),
377 m_cascadeOutputsKeys{
"JpsiPlusV0CascadeVtx1",
"JpsiPlusV0CascadeVtx2" },
378 m_VxPrimaryCandidateName(
"PrimaryVertices"),
379 m_jpsiMassLower(0.0),
380 m_jpsiMassUpper(10000.0),
382 m_V0MassUpper(10000.0),
384 m_MassUpper(20000.0),
385 m_mass_electron( 0 ),
397 m_iVertexFitter(
"Trk::TrkVKalVrtFitter"),
398 m_pvRefitter(
"Analysis::PrimaryVertexRefitter",
this),
399 m_V0Tools(
"Trk::V0Tools"),
400 m_CascadeTools(
"DerivationFramework::CascadeTools")
405 declareProperty(
"RefPVContainerName", m_refPVContainerName =
"RefittedPrimaryVertices");
406 declareProperty(
"JpsiTrackContainerName", m_jpsiTrackContainerName =
"InDetTrackParticles");
407 declareProperty(
"V0TrackContainerName", m_v0TrackContainerName =
"InDetTrackParticles");
435 assert(cascadeinfoContainer!=
nullptr);
453 std::vector<const xAOD::TrackParticle*> tracksJpsi;
454 std::vector<const xAOD::TrackParticle*> tracksV0;
455 std::vector<double> massesJpsi(2, mass_tracks);
456 std::vector<double> massesV0;
457 std::vector<double> Masses(2, mass_tracks);
473 const EventContext& ctx = Gaudi::Hive::currentContext();
474 std::vector<const xAOD::TrackParticleContainer*> trackCols;
477 trackCols.push_back(handle.
cptr());
481 for(
auto jpsi : *jpsiContainer) {
483 size_t jpsiTrkNum = jpsi->nTrackParticles();
485 for(
unsigned int it=0;
it<jpsiTrkNum;
it++) tracksJpsi.push_back(jpsi->trackParticle(
it));
487 if (tracksJpsi.size() != 2 || massesJpsi.size() != 2 ) {
490 double mass_Jpsi =
m_V0Tools->invariantMass(jpsi,massesJpsi);
493 ATH_MSG_DEBUG(
" Original Jpsi candidate rejected by the mass cut: mass = "
498 for(
auto v0 : *v0Container) {
500 size_t v0TrkNum =
v0->nTrackParticles();
502 for(
unsigned int it=0;
it<v0TrkNum;
it++) tracksV0.push_back(
v0->trackParticle(
it));
503 if (tracksV0.size() != 2 || massesV0.size() != 2 ) {
506 double mass_V0 =
m_V0Tools->invariantMass(
v0,massesV0);
509 ATH_MSG_DEBUG(
" Original V0 candidate rejected by the mass cut: mass = "
513 ATH_MSG_DEBUG(
"using tracks" << tracksJpsi[0] <<
", " << tracksJpsi[1] <<
", " << tracksV0[0] <<
", " << tracksV0[1]);
532 std::vector<Trk::VertexID> vrtList;
540 vrtList.push_back(vID);
544 std::vector<Trk::VertexID> cnstV;
560 << ((
result->vertices())[0])->trackParticle(1) <<
", "
561 << ((
result->vertices())[1])->trackParticle(0) <<
", "
562 << ((
result->vertices())[1])->trackParticle(1));
565 result->setSVOwnership(
true);
566 const std::vector< std::vector<TLorentzVector> > &moms =
result->getParticleMoms();
569 return StatusCode::FAILURE;
574 cascadeinfoContainer->push_back(
result.release());
585 ATH_MSG_DEBUG(
"cascadeinfoContainer size " << cascadeinfoContainer->size());
587 return StatusCode::SUCCESS;