ATLAS Offline Software
Loading...
Searching...
No Matches
JpsiPlusDsCascade.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
5// JpsiPlusDsCascade.cxx, (c) ATLAS Detector software
7#include "JpsiPlusDsCascade.h"
12#include "BPhysPVCascadeTools.h"
15#include <algorithm>
18
21
22namespace DerivationFramework {
23 typedef ElementLink<xAOD::VertexContainer> VertexLink;
24 typedef std::vector<VertexLink> VertexLinkVector;
25 typedef std::vector<const xAOD::TrackParticle*> TrackBag;
26
28
29 // retrieving vertex Fitter
30 ATH_CHECK( m_iVertexFitter.retrieve());
31
32 // retrieving the V0 tools
33 ATH_CHECK( m_V0Tools.retrieve());
34
35 // retrieving the Cascade tools
36 ATH_CHECK( m_CascadeTools.retrieve());
37
38 // Get the beam spot service
39 ATH_CHECK( m_eventInfo_key.initialize() );
40
41 auto gendata = std::make_shared<GenData>();
42
43 // retrieve particle masses
44 if(m_mass_jpsi < 0. ) m_mass_jpsi = gendata->particleMass(MC::JPSI).value();
45 if(m_vtx0MassHypo < 0.)
46 m_vtx0MassHypo = gendata->particleMass(MC::BCPLUS).value();
47 if(m_vtx1MassHypo < 0.) {
48 if(abs(m_Dx_pid) == 411) m_vtx1MassHypo = gendata->particleMass(MC::DPLUS).value();
49 else m_vtx1MassHypo = gendata->particleMass(MC::DSPLUS).value();
50 }
51
52 if(m_vtx0Daug1MassHypo < 0.) m_vtx0Daug1MassHypo = gendata->particleMass(MC::MUON).value();
53 if(m_vtx0Daug2MassHypo < 0.) m_vtx0Daug2MassHypo = gendata->particleMass(MC::MUON).value();
54 if(m_vtx1Daug1MassHypo < 0.) {
55 if(abs(m_Dx_pid) == 411) m_vtx1Daug1MassHypo = gendata->particleMass(MC::PIPLUS).value();
56 else m_vtx1Daug1MassHypo = gendata->particleMass(MC::KPLUS).value();
57 }
58 if(m_vtx1Daug2MassHypo < 0.) m_vtx1Daug2MassHypo = gendata->particleMass(MC::KPLUS).value();
59 if(m_vtx1Daug3MassHypo < 0.) m_vtx1Daug3MassHypo = gendata->particleMass(MC::PIPLUS).value();
60
61 return StatusCode::SUCCESS;
62 }
63
64
65 StatusCode JpsiPlusDsCascade::addBranches(const EventContext& ctx) const
66 {
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;
71 if(m_cascadeOutputsKeys.size() !=topoN) { ATH_MSG_FATAL("Incorrect number of VtxContainers"); return StatusCode::FAILURE; }
72
73 for(int i =0; i<topoN;i++){
74 Vtxwritehandles[i] = new xAOD::VertexContainer();
75 Vtxwritehandlesaux[i] = new xAOD::VertexAuxContainer();
76 Vtxwritehandles[i]->setStore(Vtxwritehandlesaux[i]);
77 ATH_CHECK(evtStore()->record(Vtxwritehandles[i] , m_cascadeOutputsKeys[i] )); // FIXME Use Handles
78 ATH_CHECK(evtStore()->record(Vtxwritehandlesaux[i], m_cascadeOutputsKeys[i] + "Aux.")); // FIXME Use Handles
79 }
80
81 //----------------------------------------------------
82 // retrieve primary vertices
83 //----------------------------------------------------
84 const xAOD::Vertex * primaryVertex{};
85 const xAOD::VertexContainer *pvContainer{};
86 ATH_CHECK(evtStore()->retrieve(pvContainer, m_VxPrimaryCandidateName)); // FIXME Use Handles
87 ATH_MSG_DEBUG("Found " << m_VxPrimaryCandidateName << " in StoreGate!");
88
89 if (pvContainer->size()==0){
90 ATH_MSG_WARNING("You have no primary vertices: " << pvContainer->size());
91 return StatusCode::RECOVERABLE;
92 } else {
93 primaryVertex = (*pvContainer)[0];
94 }
95
96 //----------------------------------------------------
97 // Try to retrieve refitted primary vertices
98 //----------------------------------------------------
99 xAOD::VertexContainer* refPvContainer{};
100 xAOD::VertexAuxContainer* refPvAuxContainer{};
101 if (m_refitPV) {
103 // refitted PV container exists. Get it from the store gate
104 ATH_CHECK(evtStore()->retrieve(refPvContainer , m_refPVContainerName )); // FIXME Use Handles
105 ATH_CHECK(evtStore()->retrieve(refPvAuxContainer, m_refPVContainerName + "Aux.")); // FIXME Use Handles
106 } else {
107 // refitted PV container does not exist. Create a new one.
108 refPvContainer = new xAOD::VertexContainer;
109 refPvAuxContainer = new xAOD::VertexAuxContainer;
110 refPvContainer->setStore(refPvAuxContainer);
111 ATH_CHECK(evtStore()->record(refPvContainer , m_refPVContainerName)); // FIXME Use Handles
112 ATH_CHECK(evtStore()->record(refPvAuxContainer, m_refPVContainerName+"Aux.")); // FIXME Use Handles
113 }
114 }
115
116 ATH_CHECK(performSearch(&cascadeinfoContainer, ctx));
117
119 if(not evt.isValid()) ATH_MSG_ERROR("Cannot Retrieve " << m_eventInfo_key.key() );
120 BPhysPVCascadeTools helper(&(*m_CascadeTools), evt.cptr());
121 helper.SetMinNTracksInPV(m_PV_minNTracks);
122
123 // Decorators for the main vertex: chi2, ndf, pt and pt error, plus the V0 vertex variables
124 SG::Decorator<VertexLinkVector> CascadeLinksDecor("CascadeVertexLinks");
125 SG::Decorator<VertexLinkVector> JpsiLinksDecor("JpsiVertexLinks");
126 SG::Decorator<VertexLinkVector> DxLinksDecor("DxVertexLinks");
127 SG::Decorator<float> chi2_decor("ChiSquared");
128 SG::Decorator<float> ndof_decor("NumberDoF");
129 SG::Decorator<float> Pt_decor("Pt");
130 SG::Decorator<float> PtErr_decor("PtErr");
131 SG::Decorator<float> Mass_svdecor("Dx_mass");
132 SG::Decorator<float> MassErr_svdecor("Dx_massErr");
133 SG::Decorator<float> Pt_svdecor("Dx_Pt");
134 SG::Decorator<float> PtErr_svdecor("Dx_PtErr");
135 SG::Decorator<float> Lxy_svdecor("Dx_Lxy");
136 SG::Decorator<float> LxyErr_svdecor("Dx_LxyErr");
137 SG::Decorator<float> Tau_svdecor("Dx_Tau");
138 SG::Decorator<float> TauErr_svdecor("Dx_TauErr");
139
140 SG::Decorator<float> MassMumu_decor("Mumu_mass");
141 SG::Decorator<float> MassKX_svdecor("KX_mass");
142 SG::Decorator<float> MassKXpi_svdecor("KXpi_mass");
143
144 ATH_MSG_DEBUG("cascadeinfoContainer size " << cascadeinfoContainer.size());
145
146 // Get Jpsi container and identify the input Jpsi
147 const xAOD::VertexContainer *jpsiContainer{};
148 ATH_CHECK(evtStore()->retrieve(jpsiContainer , m_vertexContainerKey )); // FIXME Use Handles
149 const xAOD::VertexContainer *dxContainer{};
150 ATH_CHECK(evtStore()->retrieve(dxContainer , m_vertexDxContainerKey )); // FIXME Use Handles
151
152 for (Trk::VxCascadeInfo* x : cascadeinfoContainer) {
153 if(x==nullptr) {
154 ATH_MSG_ERROR("cascadeinfoContainer is null");
155 //x is dereferenced if we pass this
156 return StatusCode::FAILURE;
157 }
158
159 // the cascade fitter returns:
160 // std::vector<xAOD::Vertex*>, each xAOD::Vertex contains the refitted track parameters (perigee at the vertex position)
161 // vertices[iv] the links to the original TPs and a covariance of size 3+5*NTRK; the chi2 of the total fit
162 // is split between the cascade vertices as per track contribution
163 // std::vector< std::vector<TLorentzVector> >, each std::vector<TLorentzVector> contains the refitted momenta (TLorentzVector)
164 // momenta[iv][...] of all tracks in the corresponding vertex, including any pseudotracks (from cascade vertices)
165 // originating in this vertex; the masses are as assigned in the cascade fit
166 // std::vector<Amg::MatrixX>, the corresponding covariance matrices in momentum space
167 // covariance[iv]
168 // int nDoF, double Chi2
169 //
170 // the invariant mass, pt, lifetime etc. errors should be calculated using the covariance matrices in momentum space as these
171 // take into account the full track-track and track-vertex correlations
172 //
173 // in the case of Jpsi+V0: vertices[0] is the V0 vertex, vertices[1] is the B/Lambda_b(bar) vertex, containing the 2 Jpsi tracks.
174 // The covariance terms between the two vertices are not stored. In momentum space momenta[0] contains the 2 V0 tracks,
175 // their momenta add up to the momentum of the 3rd track in momenta[1], the first two being the Jpsi tracks
176
177 const std::vector<xAOD::Vertex*> &cascadeVertices = x->vertices();
178 if(cascadeVertices.size()!=topoN)
179 ATH_MSG_ERROR("Incorrect number of vertices");
180 if(cascadeVertices[0] == nullptr || cascadeVertices[1] == nullptr) ATH_MSG_ERROR("Error null vertex");
181 // Keep vertices (bear in mind that they come in reverse order!)
182 for(int i =0;i<topoN;i++) Vtxwritehandles[i]->push_back(cascadeVertices[i]);
183
184 x->setSVOwnership(false); // Prevent Container from deleting vertices
185 const auto mainVertex = cascadeVertices[1]; // this is the B_c+/- vertex
186 const std::vector< std::vector<TLorentzVector> > &moms = x->getParticleMoms();
187
188 // Set links to cascade vertices
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");
192 if(!BPhysPVCascadeTools::LinkVertices(CascadeLinksDecor, verticestoLink, Vtxwritehandles[0], cascadeVertices[1]))
193 ATH_MSG_ERROR("Error decorating with cascade vertices");
194
195 // Identify the input Jpsi
196 const xAOD::Vertex* jpsiVertex = BPhysPVCascadeTools::FindVertex<2>(jpsiContainer, cascadeVertices[1]);
197 ATH_MSG_DEBUG("1 pt Jpsi tracks " << cascadeVertices[1]->trackParticle(0)->pt() << ", " << cascadeVertices[1]->trackParticle(1)->pt());
198 if (jpsiVertex) ATH_MSG_DEBUG("2 pt Jpsi tracks " << jpsiVertex->trackParticle(0)->pt() << ", " << jpsiVertex->trackParticle(1)->pt());
199
200 // Identify the input D_(s)+
201 const xAOD::Vertex* dxVertex = BPhysPVCascadeTools::FindVertex<3>(dxContainer, cascadeVertices[0]);;
202 ATH_MSG_DEBUG("1 pt D_(s)+ tracks " << cascadeVertices[0]->trackParticle(0)->pt() << ", " << cascadeVertices[0]->trackParticle(1)->pt() << ", " << cascadeVertices[0]->trackParticle(2)->pt());
203 if (dxVertex) ATH_MSG_DEBUG("2 pt D_(s)+ tracks " << dxVertex->trackParticle(0)->pt() << ", " << dxVertex->trackParticle(1)->pt() << ", " << dxVertex->trackParticle(2)->pt());
204
205 // Set links to input vertices
206 std::vector<const xAOD::Vertex*> jpsiVerticestoLink;
207 if (jpsiVertex) jpsiVerticestoLink.push_back(jpsiVertex);
208 else ATH_MSG_WARNING("Could not find linking Jpsi");
209 if(!BPhysPVCascadeTools::LinkVertices(JpsiLinksDecor, jpsiVerticestoLink, jpsiContainer, cascadeVertices[1]))
210 ATH_MSG_ERROR("Error decorating with Jpsi vertices");
211
212 std::vector<const xAOD::Vertex*> dxVerticestoLink;
213 if (dxVertex) dxVerticestoLink.push_back(dxVertex);
214 else ATH_MSG_WARNING("Could not find linking D_(s)+");
215 if(!BPhysPVCascadeTools::LinkVertices(DxLinksDecor, dxVerticestoLink, dxContainer, cascadeVertices[1]))
216 ATH_MSG_ERROR("Error decorating with D_(s)+ vertices");
217
218 bool tagDp(true);
219 if (dxVertex) {
220 if(abs(m_Dx_pid)==411 && (dxVertex->trackParticle(2)->charge()==-1)) tagDp = false;
221 }
222
223 double mass_b = m_vtx0MassHypo;
224 double mass_d = m_vtx1MassHypo;
225 std::vector<double> massesJpsi;
226 massesJpsi.push_back(m_vtx0Daug1MassHypo);
227 massesJpsi.push_back(m_vtx0Daug2MassHypo);
228 std::vector<double> massesDx;
229 if(tagDp){
230 massesDx.push_back(m_vtx1Daug1MassHypo);
231 massesDx.push_back(m_vtx1Daug2MassHypo);
232 }else{ // Change the order for D-
233 massesDx.push_back(m_vtx1Daug2MassHypo);
234 massesDx.push_back(m_vtx1Daug1MassHypo);
235 }
236 massesDx.push_back(m_vtx1Daug3MassHypo);
237 std::vector<double> Masses;
238 Masses.push_back(m_vtx0Daug1MassHypo);
239 Masses.push_back(m_vtx0Daug2MassHypo);
240 Masses.push_back(m_vtx1MassHypo);
241
242 // loop over candidates -- Don't apply PV_minNTracks requirement here
243 // because it may result in exclusion of the high-pt PV.
244 // get good PVs
245
246
247 xAOD::BPhysHypoHelper vtx(m_hypoName, mainVertex);
248
249 // Get refitted track momenta from all vertices, charged tracks only
251
252 // Decorate main vertex
253 //
254 // 1.a) mass, mass error
255 BPHYS_CHECK( vtx.setMass(m_CascadeTools->invariantMass(moms[1])) );
256 BPHYS_CHECK( vtx.setMassErr(m_CascadeTools->invariantMassError(moms[1],x->getCovariance()[1])) );
257 // 1.b) pt and pT error (the default pt of mainVertex is != the pt of the full cascade fit!)
258 Pt_decor(*mainVertex) = m_CascadeTools->pT(moms[1]);
259 PtErr_decor(*mainVertex) = m_CascadeTools->pTError(moms[1],x->getCovariance()[1]);
260 // 1.c) chi2 and ndof (the default chi2 of mainVertex is != the chi2 of the full cascade fit!)
261 chi2_decor(*mainVertex) = x->fitChi2();
262 ndof_decor(*mainVertex) = x->nDoF();
263
264 float massMumu = 0.;
265 if (jpsiVertex) {
266 TLorentzVector p4_mu1, p4_mu2;
267 p4_mu1.SetPtEtaPhiM(jpsiVertex->trackParticle(0)->pt(),
268 jpsiVertex->trackParticle(0)->eta(),
269 jpsiVertex->trackParticle(0)->phi(), m_vtx0Daug1MassHypo);
270 p4_mu2.SetPtEtaPhiM(jpsiVertex->trackParticle(1)->pt(),
271 jpsiVertex->trackParticle(1)->eta(),
272 jpsiVertex->trackParticle(1)->phi(), m_vtx0Daug2MassHypo);
273 massMumu = (p4_mu1 + p4_mu2).M();
274 }
275 MassMumu_decor(*mainVertex) = massMumu;
276
277 float massKX = 0., massKXpi = 0.;
278 if (dxVertex) {
279 TLorentzVector p4_h1, p4_h2, p4_h3;
280 if(tagDp){
281 p4_h1.SetPtEtaPhiM(dxVertex->trackParticle(0)->pt(),
282 dxVertex->trackParticle(0)->eta(),
283 dxVertex->trackParticle(0)->phi(), m_vtx1Daug1MassHypo);
284 p4_h2.SetPtEtaPhiM(dxVertex->trackParticle(1)->pt(),
285 dxVertex->trackParticle(1)->eta(),
286 dxVertex->trackParticle(1)->phi(), m_vtx1Daug2MassHypo);
287 }else{ // Change the order for D-
288 p4_h1.SetPtEtaPhiM(dxVertex->trackParticle(0)->pt(),
289 dxVertex->trackParticle(0)->eta(),
290 dxVertex->trackParticle(0)->phi(), m_vtx1Daug2MassHypo);
291 p4_h2.SetPtEtaPhiM(dxVertex->trackParticle(1)->pt(),
292 dxVertex->trackParticle(1)->eta(),
293 dxVertex->trackParticle(1)->phi(), m_vtx1Daug1MassHypo);
294 }
295 p4_h3.SetPtEtaPhiM(dxVertex->trackParticle(2)->pt(),
296 dxVertex->trackParticle(2)->eta(),
297 dxVertex->trackParticle(2)->phi(), m_vtx1Daug3MassHypo);
298 massKX = (p4_h1 + p4_h2).M();
299 massKXpi = (p4_h1 + p4_h2 + p4_h3).M();
300 }
301 MassKX_svdecor(*mainVertex) = massKX;
302 MassKXpi_svdecor(*mainVertex) = massKXpi;
303
304 ATH_CHECK(helper.FillCandwithRefittedVertices(m_refitPV, pvContainer,
305 refPvContainer, &(*m_pvRefitter), m_PV_max, m_DoVertexType, x, 1, mass_b, vtx));
306
307
308 // 4) decorate the main vertex with V0 vertex mass, pt, lifetime and lxy values (plus errors)
309 // V0 points to the main vertex, so lifetime and lxy are w.r.t the main vertex
310 Mass_svdecor(*mainVertex) = m_CascadeTools->invariantMass(moms[0]);
311 MassErr_svdecor(*mainVertex) = m_CascadeTools->invariantMassError(moms[0],x->getCovariance()[0]);
312 Pt_svdecor(*mainVertex) = m_CascadeTools->pT(moms[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]);
318
319 // Some checks in DEBUG mode
320 ATH_MSG_DEBUG("chi2 " << x->fitChi2()
321 << " chi2_1 " << m_V0Tools->chisq(cascadeVertices[0])
322 << " chi2_2 " << m_V0Tools->chisq(cascadeVertices[1])
323 << " vprob " << m_CascadeTools->vertexProbability(x->nDoF(),x->fitChi2()));
324 ATH_MSG_DEBUG("ndf " << x->nDoF() << " ndf_1 " << m_V0Tools->ndof(cascadeVertices[0]) << " ndf_2 " << m_V0Tools->ndof(cascadeVertices[1]));
325 ATH_MSG_DEBUG("V0Tools mass_d " << m_V0Tools->invariantMass(cascadeVertices[0],massesDx)
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));
329 // masses and errors, using track masses assigned in the fit
330 double Mass_B = m_CascadeTools->invariantMass(moms[1]);
331 double Mass_D = m_CascadeTools->invariantMass(moms[0]);
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]);
334 ATH_MSG_DEBUG("Mass_B " << Mass_B << " Mass_D " << Mass_D);
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);
339 // masses and errors, assigning user defined track masses
340 ATH_MSG_DEBUG("Mass_b " << m_CascadeTools->invariantMass(moms[1],Masses)
341 << " Mass_d " << m_CascadeTools->invariantMass(moms[0],massesDx));
342 ATH_MSG_DEBUG("Mass_b_err " << m_CascadeTools->invariantMassError(moms[1],x->getCovariance()[1],Masses)
343 << " Mass_d_err " << m_CascadeTools->invariantMassError(moms[0],x->getCovariance()[0],massesDx));
344 ATH_MSG_DEBUG("pt_b " << m_CascadeTools->pT(moms[1])
345 << " pt_d " << m_CascadeTools->pT(moms[0])
346 << " pt_dp " << m_V0Tools->pT(cascadeVertices[0]));
347 ATH_MSG_DEBUG("ptErr_b " << m_CascadeTools->pTError(moms[1],x->getCovariance()[1])
348 << " ptErr_d " << m_CascadeTools->pTError(moms[0],x->getCovariance()[0])
349 << " ptErr_dp " << m_V0Tools->pTError(cascadeVertices[0]));
350 ATH_MSG_DEBUG("lxy_B " << m_V0Tools->lxy(cascadeVertices[1],primaryVertex) << " lxy_D " << m_V0Tools->lxy(cascadeVertices[0],cascadeVertices[1]));
351 ATH_MSG_DEBUG("lxy_b " << m_CascadeTools->lxy(moms[1],cascadeVertices[1],primaryVertex) << " lxy_d " << m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]));
352 ATH_MSG_DEBUG("lxyErr_b " << m_CascadeTools->lxyError(moms[1],x->getCovariance()[1],cascadeVertices[1],primaryVertex)
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]));
355 ATH_MSG_DEBUG("tau_B " << m_CascadeTools->tau(moms[1],cascadeVertices[1],primaryVertex,mass_b)
356 << " tau_dp " << m_V0Tools->tau(cascadeVertices[0],cascadeVertices[1],massesDx));
357 ATH_MSG_DEBUG("tau_b " << m_CascadeTools->tau(moms[1],cascadeVertices[1],primaryVertex)
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));
360 ATH_MSG_DEBUG("tauErr_b " << m_CascadeTools->tauError(moms[1],x->getCovariance()[1],cascadeVertices[1],primaryVertex)
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));
363 ATH_MSG_DEBUG("TauErr_b " << m_CascadeTools->tauError(moms[1],x->getCovariance()[1],cascadeVertices[1],primaryVertex,mass_b)
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));
366
367 ATH_MSG_DEBUG("CascadeTools main vert wrt PV " << " CascadeTools SV " << " V0Tools SV");
368 ATH_MSG_DEBUG("a0z " << m_CascadeTools->a0z(moms[1],cascadeVertices[1],primaryVertex)
369 << ", " << m_CascadeTools->a0z(moms[0],cascadeVertices[0],cascadeVertices[1])
370 << ", " << m_V0Tools->a0z(cascadeVertices[0],cascadeVertices[1]));
371 ATH_MSG_DEBUG("a0zErr " << m_CascadeTools->a0zError(moms[1],x->getCovariance()[1],cascadeVertices[1],primaryVertex)
372 << ", " << m_CascadeTools->a0zError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
373 << ", " << m_V0Tools->a0zError(cascadeVertices[0],cascadeVertices[1]));
374 ATH_MSG_DEBUG("a0xy " << m_CascadeTools->a0xy(moms[1],cascadeVertices[1],primaryVertex)
375 << ", " << m_CascadeTools->a0xy(moms[0],cascadeVertices[0],cascadeVertices[1])
376 << ", " << m_V0Tools->a0xy(cascadeVertices[0],cascadeVertices[1]));
377 ATH_MSG_DEBUG("a0xyErr " << m_CascadeTools->a0xyError(moms[1],x->getCovariance()[1],cascadeVertices[1],primaryVertex)
378 << ", " << m_CascadeTools->a0xyError(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
379 << ", " << m_V0Tools->a0xyError(cascadeVertices[0],cascadeVertices[1]));
380 ATH_MSG_DEBUG("a0 " << m_CascadeTools->a0(moms[1],cascadeVertices[1],primaryVertex)
381 << ", " << m_CascadeTools->a0(moms[0],cascadeVertices[0],cascadeVertices[1])
382 << ", " << m_V0Tools->a0(cascadeVertices[0],cascadeVertices[1]));
383 ATH_MSG_DEBUG("a0Err " << m_CascadeTools->a0Error(moms[1],x->getCovariance()[1],cascadeVertices[1],primaryVertex)
384 << ", " << m_CascadeTools->a0Error(moms[0],x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
385 << ", " << m_V0Tools->a0Error(cascadeVertices[0],cascadeVertices[1]));
386 ATH_MSG_DEBUG("x0 " << m_V0Tools->vtx(cascadeVertices[0]).x() << " y0 " << m_V0Tools->vtx(cascadeVertices[0]).y() << " z0 " << m_V0Tools->vtx(cascadeVertices[0]).z());
387 ATH_MSG_DEBUG("x1 " << m_V0Tools->vtx(cascadeVertices[1]).x() << " y1 " << m_V0Tools->vtx(cascadeVertices[1]).y() << " z1 " << m_V0Tools->vtx(cascadeVertices[1]).z());
388 ATH_MSG_DEBUG("X0 " << primaryVertex->x() << " Y0 " << primaryVertex->y() << " Z0 " << primaryVertex->z());
389 ATH_MSG_DEBUG("rxy0 " << m_V0Tools->rxy(cascadeVertices[0]) << " rxyErr0 " << m_V0Tools->rxyError(cascadeVertices[0]));
390 ATH_MSG_DEBUG("rxy1 " << m_V0Tools->rxy(cascadeVertices[1]) << " rxyErr1 " << m_V0Tools->rxyError(cascadeVertices[1]));
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());
394 } // loop over cascadeinfoContainer
395
396 // Deleting cascadeinfo since this won't be stored.
397 // Vertices have been kept in m_cascadeOutputs and should be owned by their container
398 for (auto x : cascadeinfoContainer) delete x;
399
400 return StatusCode::SUCCESS;
401 }
402
403
404 JpsiPlusDsCascade::JpsiPlusDsCascade(const std::string& t, const std::string& n, const IInterface* p) : base_class(t,n,p),
407 m_cascadeOutputsKeys{ "JpsiPlusDsCascadeVtx1", "JpsiPlusDsCascadeVtx2" },
408 m_VxPrimaryCandidateName("PrimaryVertices"),
409 m_jpsiMassLower(0.0),
410 m_jpsiMassUpper(10000.0),
411 m_DxMassLower(0.0),
412 m_DxMassUpper(10000.0),
413 m_MassLower(0.0),
414 m_MassUpper(20000.0),
415 m_vtx0MassHypo(-1),
416 m_vtx1MassHypo(-1),
422 m_mass_jpsi(-1),
423 m_Dx_pid(431),
424 m_constrDx(true),
425 m_constrJpsi(true),
426 m_chi2cut(-1.0),
427 m_iVertexFitter("Trk::TrkVKalVrtFitter"),
428 m_pvRefitter("Analysis::PrimaryVertexRefitter"),
429 m_V0Tools("Trk::V0Tools"),
430 m_CascadeTools("DerivationFramework::CascadeTools")
431 {
432 declareProperty("JpsiVertices", m_vertexContainerKey);
433 declareProperty("DxVertices", m_vertexDxContainerKey);
434 declareProperty("VxPrimaryCandidateName", m_VxPrimaryCandidateName);
435 declareProperty("RefPVContainerName", m_refPVContainerName = "RefittedPrimaryVertices");
436 declareProperty("JpsiMassLowerCut", m_jpsiMassLower);
437 declareProperty("JpsiMassUpperCut", m_jpsiMassUpper);
438 declareProperty("DxMassLowerCut", m_DxMassLower);
439 declareProperty("DxMassUpperCut", m_DxMassUpper);
440 declareProperty("MassLowerCut", m_MassLower);
441 declareProperty("MassUpperCut", m_MassUpper);
442 declareProperty("HypothesisName", m_hypoName = "Bc");
443 declareProperty("Vtx0MassHypo", m_vtx0MassHypo);
444 declareProperty("Vtx1MassHypo", m_vtx1MassHypo);
445 declareProperty("Vtx0Daug1MassHypo", m_vtx0Daug1MassHypo);
446 declareProperty("Vtx0Daug2MassHypo", m_vtx0Daug2MassHypo);
447 declareProperty("Vtx1Daug1MassHypo", m_vtx1Daug1MassHypo);
448 declareProperty("Vtx1Daug2MassHypo", m_vtx1Daug2MassHypo);
449 declareProperty("Vtx1Daug3MassHypo", m_vtx1Daug3MassHypo);
450 declareProperty("JpsiMass", m_mass_jpsi);
451 declareProperty("DxHypothesis", m_Dx_pid);
452 declareProperty("ApplyDxMassConstraint", m_constrDx);
453 declareProperty("ApplyJpsiMassConstraint", m_constrJpsi);
454 declareProperty("Chi2Cut", m_chi2cut);
455 declareProperty("RefitPV", m_refitPV = true);
456 declareProperty("MaxnPV", m_PV_max = 999);
457 declareProperty("MinNTracksInPV", m_PV_minNTracks = 0);
458 declareProperty("DoVertexType", m_DoVertexType = 7);
459 declareProperty("TrkVertexFitterTool", m_iVertexFitter);
460 declareProperty("PVRefitter", m_pvRefitter);
461 declareProperty("V0Tools", m_V0Tools);
462 declareProperty("CascadeTools", m_CascadeTools);
463 declareProperty("CascadeVertexCollections", m_cascadeOutputsKeys);
464 }
465
467
468 StatusCode JpsiPlusDsCascade::performSearch(std::vector<Trk::VxCascadeInfo*> *cascadeinfoContainer, const EventContext& ctx) const
469 {
470 ATH_MSG_DEBUG( "JpsiPlusDsCascade::performSearch" );
471 assert(cascadeinfoContainer!=nullptr);
472
473 // Get TrackParticle container (for setting links to the original tracks)
474 const xAOD::TrackParticleContainer *trackContainer{};
475 ATH_CHECK(evtStore()->retrieve(trackContainer , "InDetTrackParticles" )); // FIXME Use Handles
476
477 // Get Jpsi container
478 const xAOD::VertexContainer *jpsiContainer{};
479 ATH_CHECK(evtStore()->retrieve(jpsiContainer , m_vertexContainerKey )); // FIXME Use Handles
480
481 // Get V0 container
482 const xAOD::VertexContainer *dxContainer{};
483 ATH_CHECK(evtStore()->retrieve(dxContainer , m_vertexDxContainerKey )); // FIXME Use Handles
484
485
486
487 double mass_d = m_vtx1MassHypo;
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;
492 massesJpsi.push_back(m_vtx0Daug1MassHypo);
493 massesJpsi.push_back(m_vtx0Daug2MassHypo);
494 std::vector<double> massesDx;
495 massesDx.push_back(m_vtx1Daug1MassHypo);
496 massesDx.push_back(m_vtx1Daug2MassHypo);
497 massesDx.push_back(m_vtx1Daug3MassHypo);
498 std::vector<double> massesDm; // Alter the order of masses for D-
499 massesDm.push_back(m_vtx1Daug2MassHypo);
500 massesDm.push_back(m_vtx1Daug1MassHypo);
501 massesDm.push_back(m_vtx1Daug3MassHypo);
502 std::vector<double> Masses;
503 Masses.push_back(m_vtx0Daug1MassHypo);
504 Masses.push_back(m_vtx0Daug2MassHypo);
505 Masses.push_back(m_vtx1MassHypo);
506
507 // Select the J/psi candidates before calling cascade fit
508 std::vector<const xAOD::Vertex*> selectedJpsiCandidates;
509 SG::Accessor<Char_t> flagAcc1("passed_Jpsi");
510 for(auto vxcItr=jpsiContainer->cbegin(); vxcItr!=jpsiContainer->cend(); ++vxcItr) {
511
512 // Check the passed flag first
513 const xAOD::Vertex* vtx = *vxcItr;
514
515 if(flagAcc1.isAvailable(*vtx)){
516 if(!flagAcc1(*vtx)) continue;
517 }
518
519 // Check J/psi candidate invariant mass and skip if need be
520 double mass_Jpsi = m_V0Tools->invariantMass(*vxcItr, massesJpsi);
521 if (mass_Jpsi < m_jpsiMassLower || mass_Jpsi > m_jpsiMassUpper) {
522 ATH_MSG_DEBUG(" Original Jpsi candidate rejected by the mass cut: mass = "
523 << mass_Jpsi << " != (" << m_jpsiMassLower << ", " << m_jpsiMassUpper << ")" );
524 continue;
525 }
526 selectedJpsiCandidates.push_back(*vxcItr);
527 }
528 if(selectedJpsiCandidates.size()<1) return StatusCode::SUCCESS;
529
530 // Select the D_s+/D+ candidates before calling cascade fit
531 std::vector<const xAOD::Vertex*> selectedDxCandidates;
532 for(auto vxcItr=dxContainer->cbegin(); vxcItr!=dxContainer->cend(); ++vxcItr) {
533
534 // Check the passed flag first
535 const xAOD::Vertex* vtx = *vxcItr;
536 if(abs(m_Dx_pid)==431) { // D_s+/-
537 SG::Accessor<Char_t> flagAcc1("passed_Ds");
538 if(flagAcc1.isAvailable(*vtx)){
539 if(!flagAcc1(*vtx)) continue;
540 }
541 }
542
543 if(abs(m_Dx_pid)==411) { // D+/-
544 SG::Accessor<Char_t> flagAcc1("passed_Dp");
545 SG::Accessor<Char_t> flagAcc2("passed_Dm");
546 bool isDp(true);
547 bool isDm(true);
548 if(flagAcc1.isAvailable(*vtx)){
549 if(!flagAcc1(*vtx)) isDp = false;
550 }
551 if(flagAcc2.isAvailable(*vtx)){
552 if(!flagAcc2(*vtx)) isDm = false;
553 }
554 if(!(isDp||isDm)) continue;
555 }
556
557
558 // Ensure the total charge is correct
559 if(abs((*vxcItr)->trackParticle(0)->charge()+(*vxcItr)->trackParticle(1)->charge()+(*vxcItr)->trackParticle(2)->charge()) != 1){
560 ATH_MSG_DEBUG(" Original D+ candidate rejected by the charge requirement: "
561 << (*vxcItr)->trackParticle(0)->charge() << ", " << (*vxcItr)->trackParticle(1)->charge() << ", " << (*vxcItr)->trackParticle(2)->charge() );
562 continue;
563 }
564
565 // Check D_(s)+/- candidate invariant mass and skip if need be
566 double mass_D;
567 if(abs(m_Dx_pid)==411 && (*vxcItr)->trackParticle(2)->charge()<0) // D-
568 mass_D = m_V0Tools->invariantMass(*vxcItr,massesDm);
569 else // D+, D_s+/-
570 mass_D = m_V0Tools->invariantMass(*vxcItr,massesDx);
571 ATH_MSG_DEBUG("D_(s) mass " << mass_D);
572 if(mass_D < m_DxMassLower || mass_D > m_DxMassUpper) {
573 ATH_MSG_DEBUG(" Original D_(s) candidate rejected by the mass cut: mass = "
574 << mass_D << " != (" << m_DxMassLower << ", " << m_DxMassUpper << ")" );
575 continue;
576 }
577
578 // Add loose cut on K+k- mass for D_s->phi pi
579 if(m_Dx_pid==431){
580 TLorentzVector p4Kp_in, p4Km_in;
581 p4Kp_in.SetPtEtaPhiM( (*vxcItr)->trackParticle(0)->pt(),
582 (*vxcItr)->trackParticle(0)->eta(),
583 (*vxcItr)->trackParticle(0)->phi(), m_vtx1Daug1MassHypo);
584 p4Km_in.SetPtEtaPhiM( (*vxcItr)->trackParticle(1)->pt(),
585 (*vxcItr)->trackParticle(1)->eta(),
586 (*vxcItr)->trackParticle(1)->phi(), m_vtx1Daug2MassHypo);
587 double mass_phi = (p4Kp_in + p4Km_in).M();
588 ATH_MSG_DEBUG("phi mass " << mass_phi);
589 if(mass_phi > 1200) {
590 ATH_MSG_DEBUG(" Original phi candidate rejected by the mass cut: mass = " << mass_phi );
591 continue;
592 }
593 }
594 selectedDxCandidates.push_back(*vxcItr);
595 }
596 if(selectedDxCandidates.size()<1) return StatusCode::SUCCESS;
597
598 // Select J/psi D_(s)+ candidates
599 // Iterate over Jpsi vertices
600 for(auto jpsiItr=selectedJpsiCandidates.cbegin(); jpsiItr!=selectedJpsiCandidates.cend(); ++jpsiItr) {
601
602 size_t jpsiTrkNum = (*jpsiItr)->nTrackParticles();
603 tracksJpsi.clear();
604 for( unsigned int it=0; it<jpsiTrkNum; it++) tracksJpsi.push_back((*jpsiItr)->trackParticle(it));
605
606 if (tracksJpsi.size() != 2 || massesJpsi.size() != 2 ) {
607 ATH_MSG_INFO("problems with Jpsi input");
608 }
609
610 // Iterate over D_(s)+/- vertices
611 for(auto dxItr=selectedDxCandidates.cbegin(); dxItr!=selectedDxCandidates.cend(); ++dxItr) {
612
613 // Check identical tracks in input
614 if(std::find(tracksJpsi.cbegin(), tracksJpsi.cend(), (*dxItr)->trackParticle(0)) != tracksJpsi.cend()) continue;
615 if(std::find(tracksJpsi.cbegin(), tracksJpsi.cend(), (*dxItr)->trackParticle(1)) != tracksJpsi.cend()) continue;
616 if(std::find(tracksJpsi.cbegin(), tracksJpsi.cend(), (*dxItr)->trackParticle(2)) != tracksJpsi.cend()) continue;
617
618 size_t dxTrkNum = (*dxItr)->nTrackParticles();
619 tracksDx.clear();
620 for( unsigned int it=0; it<dxTrkNum; it++) tracksDx.push_back((*dxItr)->trackParticle(it));
621 if (tracksDx.size() != 3 || massesDx.size() != 3 ) {
622 ATH_MSG_INFO("problems with D_(s) input");
623 }
624
625 ATH_MSG_DEBUG("using tracks" << tracksJpsi[0] << ", " << tracksJpsi[1] << ", " << tracksDx[0] << ", " << tracksDx[1] << ", " << tracksDx[2]);
626 tracksBc.clear();
627 for( unsigned int it=0; it<jpsiTrkNum; it++) tracksBc.push_back((*jpsiItr)->trackParticle(it));
628 for( unsigned int it=0; it<dxTrkNum; it++) tracksBc.push_back((*dxItr)->trackParticle(it));
629
630 // Apply the user's settings to the fitter
631 // Reset
632 std::unique_ptr<Trk::IVKalState> state (m_iVertexFitter->makeState(ctx));
633 // Robustness
634 int robustness = 0;
635 m_iVertexFitter->setRobustness(robustness, *state);
636 // Build up the topology
637 // Vertex list
638 std::vector<Trk::VertexID> vrtList;
639 // D_(s)+/- vertex
640 Trk::VertexID vID;
641 if (m_constrDx) {
642 if(abs(m_Dx_pid)==411 && (*dxItr)->trackParticle(2)->charge()<0) // D-
643 vID = m_iVertexFitter->startVertex(tracksDx,massesDm,*state,mass_d);
644 else // D+, D_s+/-
645 vID = m_iVertexFitter->startVertex(tracksDx,massesDx,*state,mass_d);
646 } else {
647 if(abs(m_Dx_pid)==411 && (*dxItr)->trackParticle(2)->charge()<0) // D-
648 vID = m_iVertexFitter->startVertex(tracksDx,massesDm,*state);
649 else // D+, D_s+/-
650 vID = m_iVertexFitter->startVertex(tracksDx,massesDx,*state);
651 }
652 vrtList.push_back(vID);
653 // B vertex including Jpsi
654 Trk::VertexID vID2 = m_iVertexFitter->nextVertex(tracksJpsi,massesJpsi,vrtList,*state);
655 if (m_constrJpsi) {
656 std::vector<Trk::VertexID> cnstV;
657 cnstV.clear();
658 if ( !m_iVertexFitter->addMassConstraint(vID2,tracksJpsi,cnstV,*state,m_mass_jpsi).isSuccess() ) {
659 ATH_MSG_WARNING("addMassConstraint failed");
660 //return StatusCode::FAILURE;
661 }
662 }
663 // Do the work
664 std::unique_ptr<Trk::VxCascadeInfo> result(m_iVertexFitter->fitCascade(*state));
665
666 if (result != nullptr) {
667 // reset links to original tracks
668 BPhysPVCascadeTools::PrepareVertexLinks(result.get(), trackContainer);
669 ATH_MSG_DEBUG("storing tracks " << ((result->vertices())[0])->trackParticle(0) << ", "
670 << ((result->vertices())[0])->trackParticle(1) << ", "
671 << ((result->vertices())[0])->trackParticle(2) << ", "
672 << ((result->vertices())[1])->trackParticle(0) << ", "
673 << ((result->vertices())[1])->trackParticle(1));
674 // necessary to prevent memory leak
675 result->setSVOwnership(true);
676
677 // Chi2/DOF cut
678 double bChi2DOF = result->fitChi2()/result->nDoF();
679 ATH_MSG_DEBUG("Candidate chi2/DOF is " << bChi2DOF);
680 bool chi2CutPassed = (m_chi2cut <= 0.0 || bChi2DOF < m_chi2cut);
681
682 const std::vector< std::vector<TLorentzVector> > &moms = result->getParticleMoms();
683 double mass = m_CascadeTools->invariantMass(moms[1]);
684 if(chi2CutPassed) {
685 if (mass >= m_MassLower && mass <= m_MassUpper) {
686 cascadeinfoContainer->push_back(result.release());
687 } else {
688 ATH_MSG_DEBUG("Candidate rejected by the mass cut: mass = "
689 << mass << " != (" << m_MassLower << ", " << m_MassUpper << ")" );
690 }
691 }
692 }
693
694 } //Iterate over D_(s)+ vertices
695
696 } //Iterate over Jpsi vertices
697
698 ATH_MSG_DEBUG("cascadeinfoContainer size " << cascadeinfoContainer->size());
699
700 return StatusCode::SUCCESS;
701 }
702
703}
704
705
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_INFO(x,...)
#define ATH_MSG_FATAL(x,...)
#define BPHYS_CHECK(EXP)
Useful CHECK macro.
: B-physics xAOD helpers.
ATLAS-specific HepMC functions.
#define x
const_iterator cbegin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
size_type size() const noexcept
Returns the number of elements in the collection.
const_iterator cend() const noexcept
Return a const_iterator pointing past the end of the collection.
static void PrepareVertexLinks(Trk::VxCascadeInfo *result, const xAOD::TrackParticleContainer *importedTrackCollection)
static const xAOD::Vertex * FindVertex(const xAOD::VertexContainer *c, const xAOD::Vertex *v)
static void SetVectorInfo(xAOD::BPhysHelper &, const Trk::VxCascadeInfo *)
static bool LinkVertices(SG::Decorator< VertexLinkVector > &decor, const std::vector< const xAOD::Vertex * > &vertices, const xAOD::VertexContainer *vertexContainer, const xAOD::Vertex *vert)
JpsiPlusDsCascade(const std::string &t, const std::string &n, const IInterface *p)
virtual StatusCode addBranches(const EventContext &ctx) const override
PublicToolHandle< Trk::V0Tools > m_V0Tools
StatusCode performSearch(std::vector< Trk::VxCascadeInfo * > *cascadeinfoContainer, const EventContext &ctx) const
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfo_key
PublicToolHandle< DerivationFramework::CascadeTools > m_CascadeTools
std::string m_VxPrimaryCandidateName
Name of primary vertex container // FIXME Use Handles.
ToolHandle< Trk::TrkVKalVrtFitter > m_iVertexFitter
std::vector< std::string > m_cascadeOutputsKeys
std::string m_hypoName
name of the mass hypothesis.
virtual StatusCode initialize() override
PublicToolHandle< Analysis::PrimaryVertexRefitter > m_pvRefitter
Helper class to provide type-safe access to aux data.
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
bool setMass(const float val)
Set given invariant mass and its error.
bool setMassErr(const float val)
invariant mass error
virtual double phi() const override final
The azimuthal angle ( ) of the particle (has range to .).
virtual double pt() const override final
The transverse momentum ( ) of the particle.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
float charge() const
Returns the charge.
float z() const
Returns the z position.
const TrackParticle * trackParticle(size_t i) const
Get the pointer to a given track that was used in vertex reco.
float y() const
Returns the y position.
float x() const
Returns the x position.
bool contains(const std::string &s, const std::string &regx)
does a string contain the substring
Definition hcg.cxx:116
THE reconstruction tool.
std::vector< const xAOD::TrackParticle * > TrackBag
ElementLink< xAOD::VertexContainer > VertexLink
std::vector< VertexLink > VertexLinkVector
static const int KPLUS
static const int MUON
static const int DPLUS
static const int BCPLUS
static const int DSPLUS
static const int PIPLUS
static const int JPSI
SG::Decorator< T, ALLOC > Decorator
Helper class to provide type-safe access to aux data, specialized for JaggedVecElt.
Definition AuxElement.h:576
VertexAuxContainer_v1 VertexAuxContainer
Definition of the current jet auxiliary container.
VertexContainer_v1 VertexContainer
Definition of the current "Vertex container version".
Vertex_v1 Vertex
Define the latest version of the vertex class.
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".