73 std::vector<Trk::VxCascadeInfo*> cascadeinfoContainer;
74 constexpr int topoN = 2;
75 std::array<SG::WriteHandle<xAOD::VertexContainer>, topoN> Vtxwritehandles;
78 for (
int i =0; i<topoN;i++) {
80 ATH_CHECK( Vtxwritehandles[i].record (std::make_unique<xAOD::VertexContainer>(),
81 std::make_unique<xAOD::VertexAuxContainer>()) );
90 return StatusCode::FAILURE;
94 if (pvContainer->size()==0){
95 ATH_MSG_WARNING(
"You have no primary vertices: " << pvContainer->size());
96 return StatusCode::RECOVERABLE;
107 ATH_CHECK(refPvContainer.
record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()));
118 SG::AuxElement::Decorator<VertexLinkVector> CascadeLinksDecor(
"CascadeVertexLinks");
119 SG::AuxElement::Decorator<VertexLinkVector> JpsiLinksDecor(
"JpsiVertexLinks");
120 SG::AuxElement::Decorator<VertexLinkVector> V0LinksDecor(
"V0VertexLinks");
121 SG::AuxElement::Decorator<float> chi2_decor(
"ChiSquared");
122 SG::AuxElement::Decorator<float> ndof_decor(
"NumberDoF");
123 SG::AuxElement::Decorator<float> Pt_decor(
"Pt");
124 SG::AuxElement::Decorator<float> PtErr_decor(
"PtErr");
125 SG::AuxElement::Decorator<float> Mass_svdecor(
"V0_mass");
126 SG::AuxElement::Decorator<float> MassErr_svdecor(
"V0_massErr");
127 SG::AuxElement::Decorator<float> Pt_svdecor(
"V0_Pt");
128 SG::AuxElement::Decorator<float> PtErr_svdecor(
"V0_PtErr");
129 SG::AuxElement::Decorator<float> Lxy_svdecor(
"V0_Lxy");
130 SG::AuxElement::Decorator<float> LxyErr_svdecor(
"V0_LxyErr");
131 SG::AuxElement::Decorator<float> Tau_svdecor(
"V0_Tau");
132 SG::AuxElement::Decorator<float> TauErr_svdecor(
"V0_TauErr");
134 ATH_MSG_DEBUG(
"cascadeinfoContainer size " << cascadeinfoContainer.size());
138 if (!jpsiContainer.
isValid()) {
140 return StatusCode::FAILURE;
145 return StatusCode::FAILURE;
152 return StatusCode::FAILURE;
173 const std::vector<xAOD::Vertex*> &cascadeVertices =
x->vertices();
174 if(cascadeVertices.size()!=topoN)
176 if(cascadeVertices[0] ==
nullptr || cascadeVertices[1] ==
nullptr)
ATH_MSG_ERROR(
"Error null vertex");
178 for(
int i =0;i<topoN;i++) Vtxwritehandles[i]->push_back(cascadeVertices[i]);
180 x->setSVOwnership(
false);
181 const auto mainVertex = cascadeVertices[1];
183 const std::vector< std::vector<TLorentzVector> > &moms =
x->getParticleMoms();
186 std::vector<const xAOD::Vertex*> verticestoLink;
187 verticestoLink.push_back(cascadeVertices[0]);
194 ATH_MSG_DEBUG(
"1 pt Jpsi tracks " << cascadeVertices[1]->trackParticle(0)->pt() <<
", " << cascadeVertices[1]->trackParticle(1)->pt());
199 ATH_MSG_DEBUG(
"1 pt V0 tracks " << cascadeVertices[0]->trackParticle(0)->pt() <<
", " << cascadeVertices[0]->trackParticle(1)->pt());
203 std::vector<const xAOD::Vertex*> jpsiVerticestoLink;
204 if (jpsiVertex) jpsiVerticestoLink.push_back(jpsiVertex);
209 std::vector<const xAOD::Vertex*> v0VerticestoLink;
210 if (v0Vertex) v0VerticestoLink.push_back(v0Vertex);
218 std::vector<double> massesJpsi(2, mass_track);
219 std::vector<double> massesV0;
220 std::vector<double> Masses(2, mass_track);
255 PtErr_decor(*mainVertex) =
m_CascadeTools->pTError(moms[1],
x->getCovariance()[1]);
257 chi2_decor(*mainVertex) =
x->fitChi2();
258 ndof_decor(*mainVertex) =
x->nDoF();
261 if (
m_refitPV) { refPVContainer = refPvContainer.
ptr(); }
268 Mass_svdecor(*mainVertex) =
m_CascadeTools->invariantMass(moms[0]);
269 MassErr_svdecor(*mainVertex) =
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0]);
271 PtErr_svdecor(*mainVertex) =
m_CascadeTools->pTError(moms[0],
x->getCovariance()[0]);
272 Lxy_svdecor(*mainVertex) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
273 LxyErr_svdecor(*mainVertex) =
m_CascadeTools->lxyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
274 Tau_svdecor(*mainVertex) =
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1]);
275 TauErr_svdecor(*mainVertex) =
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
279 <<
" chi2_1 " <<
m_V0Tools->chisq(cascadeVertices[0])
280 <<
" chi2_2 " <<
m_V0Tools->chisq(cascadeVertices[1])
284 <<
" error " <<
m_V0Tools->invariantMassError(cascadeVertices[0],massesV0)
285 <<
" mass_J " <<
m_V0Tools->invariantMass(cascadeVertices[1],massesJpsi)
286 <<
" error " <<
m_V0Tools->invariantMassError(cascadeVertices[1],massesJpsi));
290 double Mass_B_err =
m_CascadeTools->invariantMassError(moms[1],
x->getCovariance()[1]);
291 double Mass_V0_err =
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0]);
292 ATH_MSG_DEBUG(
"Mass_B " << Mass_B <<
" Mass_V0 " << Mass_V0);
293 ATH_MSG_DEBUG(
"Mass_B_err " << Mass_B_err <<
" Mass_V0_err " << Mass_V0_err);
294 double mprob_B =
m_CascadeTools->massProbability(mass_b,Mass_B,Mass_B_err);
295 double mprob_V0 =
m_CascadeTools->massProbability(mass_v0,Mass_V0,Mass_V0_err);
296 ATH_MSG_DEBUG(
"mprob_B " << mprob_B <<
" mprob_V0 " << mprob_V0);
299 <<
" Mass_v0 " <<
m_CascadeTools->invariantMass(moms[0],massesV0));
301 <<
" Mass_v0_err " <<
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0],massesV0));
304 <<
" pt_v0 " <<
m_V0Tools->pT(cascadeVertices[0]));
306 <<
" ptErr_v " <<
m_CascadeTools->pTError(moms[0],
x->getCovariance()[0])
307 <<
" ptErr_v0 " <<
m_V0Tools->pTError(cascadeVertices[0]));
311 <<
" lxyErr_v " <<
m_CascadeTools->lxyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
312 <<
" lxyErr_v0 " <<
m_V0Tools->lxyError(cascadeVertices[0],cascadeVertices[1]));
314 <<
" tau_v0 " <<
m_V0Tools->tau(cascadeVertices[0],cascadeVertices[1],massesV0));
316 <<
" tau_v " <<
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1])
317 <<
" tau_V " <<
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1],mass_v0));
319 <<
" tauErr_v " <<
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
320 <<
" tauErr_v0 " <<
m_V0Tools->tauError(cascadeVertices[0],cascadeVertices[1],massesV0));
322 <<
" TauErr_v " <<
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1],mass_v0)
323 <<
" TauErr_v0 " <<
m_V0Tools->tauError(cascadeVertices[0],cascadeVertices[1],massesV0,mass_v0));
325 ATH_MSG_DEBUG(
"CascadeTools main vert wrt PV " <<
" CascadeTools SV " <<
" V0Tools SV");
327 <<
", " <<
m_CascadeTools->a0z(moms[0],cascadeVertices[0],cascadeVertices[1])
328 <<
", " <<
m_V0Tools->a0z(cascadeVertices[0],cascadeVertices[1]));
330 <<
", " <<
m_CascadeTools->a0zError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
331 <<
", " <<
m_V0Tools->a0zError(cascadeVertices[0],cascadeVertices[1]));
333 <<
", " <<
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],cascadeVertices[1])
334 <<
", " <<
m_V0Tools->a0xy(cascadeVertices[0],cascadeVertices[1]));
336 <<
", " <<
m_CascadeTools->a0xyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
337 <<
", " <<
m_V0Tools->a0xyError(cascadeVertices[0],cascadeVertices[1]));
339 <<
", " <<
m_CascadeTools->a0(moms[0],cascadeVertices[0],cascadeVertices[1])
340 <<
", " <<
m_V0Tools->a0(cascadeVertices[0],cascadeVertices[1]));
342 <<
", " <<
m_CascadeTools->a0Error(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
343 <<
", " <<
m_V0Tools->a0Error(cascadeVertices[0],cascadeVertices[1]));
346 ATH_MSG_DEBUG(
"X0 " << primaryVertex->
x() <<
" Y0 " << primaryVertex->
y() <<
" Z0 " << primaryVertex->
z());
349 ATH_MSG_DEBUG(
"Rxy0 wrt PV " <<
m_V0Tools->rxy(cascadeVertices[0],primaryVertex) <<
" RxyErr0 wrt PV " <<
m_V0Tools->rxyError(cascadeVertices[0],primaryVertex));
350 ATH_MSG_DEBUG(
"Rxy1 wrt PV " <<
m_V0Tools->rxy(cascadeVertices[1],primaryVertex) <<
" RxyErr1 wrt PV " <<
m_V0Tools->rxyError(cascadeVertices[1],primaryVertex));
351 ATH_MSG_DEBUG(
"number of covariance matrices " << (
x->getCovariance()).size());
356 for (
auto x : cascadeinfoContainer)
delete x;
358 return StatusCode::SUCCESS;
368 if (!jpsiTrackContainer.
isValid()) {
370 return StatusCode::FAILURE;
373 if (!v0TrackContainer.
isValid()) {
375 return StatusCode::FAILURE;
380 if (!jpsiContainer.
isValid()) {
382 return StatusCode::FAILURE;
387 return StatusCode::FAILURE;
392 std::vector<const xAOD::TrackParticle*> tracksJpsi;
393 std::vector<const xAOD::TrackParticle*> tracksV0;
394 std::vector<double> massesJpsi(2, mass_tracks);
395 std::vector<double> massesV0;
396 std::vector<double> Masses(2, mass_tracks);
412 std::vector<const xAOD::TrackParticleContainer*> trackCols;
415 trackCols.push_back(handle.cptr());
419 for(
auto jpsi : *jpsiContainer) {
421 size_t jpsiTrkNum = jpsi->nTrackParticles();
423 for(
unsigned int it=0; it<jpsiTrkNum; it++) tracksJpsi.push_back(jpsi->trackParticle(it));
425 if (tracksJpsi.size() != 2 || massesJpsi.size() != 2 ) {
428 double mass_Jpsi =
m_V0Tools->invariantMass(jpsi,massesJpsi);
431 ATH_MSG_DEBUG(
" Original Jpsi candidate rejected by the mass cut: mass = "
436 for(
auto v0 : *v0Container) {
438 size_t v0TrkNum = v0->nTrackParticles();
440 for(
unsigned int it=0; it<v0TrkNum; it++) tracksV0.push_back(v0->trackParticle(it));
441 if (tracksV0.size() != 2 || massesV0.size() != 2 ) {
444 double mass_V0 =
m_V0Tools->invariantMass(v0,massesV0);
447 ATH_MSG_DEBUG(
" Original V0 candidate rejected by the mass cut: mass = "
451 ATH_MSG_DEBUG(
"using tracks" << tracksJpsi[0] <<
", " << tracksJpsi[1] <<
", " << tracksV0[0] <<
", " << tracksV0[1]);
456 std::unique_ptr<Trk::IVKalState> state =
m_iVertexFitter->makeState(ctx);
462 std::vector<Trk::VertexID> vrtList;
470 vrtList.push_back(vID);
474 std::vector<Trk::VertexID> cnstV;
482 std::unique_ptr<Trk::VxCascadeInfo> result(
m_iVertexFitter->fitCascade(*state));
489 ATH_MSG_DEBUG(
"storing tracks " << ((result->vertices())[0])->trackParticle(0) <<
", "
490 << ((result->vertices())[0])->trackParticle(1) <<
", "
491 << ((result->vertices())[1])->trackParticle(0) <<
", "
492 << ((result->vertices())[1])->trackParticle(1));
495 result->setSVOwnership(
true);
496 const std::vector< std::vector<TLorentzVector> > &moms = result->getParticleMoms();
499 return StatusCode::FAILURE;
504 cascadeinfoContainer.push_back(result.release());
515 ATH_MSG_DEBUG(
"cascadeinfoContainer size " << cascadeinfoContainer.size());
517 return StatusCode::SUCCESS;