63 {
64 std::vector<Trk::VxCascadeInfo*> cascadeinfoContainer;
65 constexpr int topoN = 2;
66 std::array<xAOD::VertexContainer*, topoN> Vtxwritehandles;
67 std::array<xAOD::VertexAuxContainer*, topoN> Vtxwritehandlesaux;
69
70 for(
int i =0;
i<topoN;
i++){
73 Vtxwritehandles[
i]->setStore(Vtxwritehandlesaux[i]);
76 }
77
78
79
80
85
86 if (pvContainer->
size()==0){
88 return StatusCode::RECOVERABLE;
89 } else {
90 primaryVertex = (*pvContainer)[0];
91 }
92
93
94
95
100
103 } else {
104
107 refPvContainer->setStore(refPvAuxContainer);
110 }
111 }
112
117 return StatusCode::FAILURE;
118 }
119
122
126 SG::AuxElement::Decorator<float> chi2_decor("ChiSquared");
127 SG::AuxElement::Decorator<float> ndof_decor("NumberDoF");
128 SG::AuxElement::Decorator<float> Pt_decor("Pt");
129 SG::AuxElement::Decorator<float> PtErr_decor("PtErr");
130 SG::AuxElement::Decorator<float> Mass_svdecor("D0_mass");
131 SG::AuxElement::Decorator<float> MassErr_svdecor("D0_massErr");
132 SG::AuxElement::Decorator<float> Pt_svdecor("D0_Pt");
133 SG::AuxElement::Decorator<float> PtErr_svdecor("D0_PtErr");
134 SG::AuxElement::Decorator<float> Lxy_svdecor("D0_Lxy");
135 SG::AuxElement::Decorator<float> LxyErr_svdecor("D0_LxyErr");
136 SG::AuxElement::Decorator<float> Tau_svdecor("D0_Tau");
137 SG::AuxElement::Decorator<float> TauErr_svdecor("D0_TauErr");
138
139 SG::AuxElement::Decorator<float> massMuPi_decor("MuPi_mass");
140 SG::AuxElement::Decorator<float> MassKpi_svdecor("Kpi_mass");
141 SG::AuxElement::Decorator<float> MassMuPiAft_decor("MuPiAft_mass");
142 SG::AuxElement::Decorator<float> MassPiD0_decor("PiD0_mass");
143 SG::AuxElement::Decorator<float> MassMuPiPiK_decor("MuPiPiK_mass");
144
145 SG::AuxElement::Decorator<float> ChargePi_decor("Pi_charge");
146 SG::AuxElement::Decorator<float> ChargeMu_decor("Mu_charge");
147 SG::AuxElement::Decorator<float> ChargeK_decor("K_charge");
148 SG::AuxElement::Decorator<float> ChargePi_s_decor("Pi_s_charge");
149 SG::AuxElement::Decorator<float> Chi2Mu_decor("Mu_chi2");
150 SG::AuxElement::Decorator<float> nDoFMu_decor("Mu_nDoF");
151
152 SG::AuxElement::Decorator<float> MuChi2B_decor("Mu_chi2_B");
153 SG::AuxElement::Decorator<float> MunDoFB_decor("Mu_nDoF_B");
154
155
156
161
162 for (Trk::VxCascadeInfo*
x : cascadeinfoContainer) {
165 continue;
166 }
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186 const std::vector<xAOD::Vertex*> &cascadeVertices =
x->vertices();
187 if(cascadeVertices.size()!=topoN)
189 if(cascadeVertices[0] ==
nullptr || cascadeVertices[1] ==
nullptr)
ATH_MSG_ERROR(
"Error null vertex");
190
191 for(
int i =0;
i<topoN;
i++) Vtxwritehandles[i]->push_back(cascadeVertices[i]);
192
193 x->setSVOwnership(
false);
194 const auto mainVertex = cascadeVertices[1];
195 const std::vector< std::vector<TLorentzVector> > &moms =
x->getParticleMoms();
196
197
198 std::vector<const xAOD::Vertex*> verticestoLink;
199 verticestoLink.push_back(cascadeVertices[0]);
200 if(Vtxwritehandles[1] ==
nullptr)
ATH_MSG_ERROR(
"Vtxwritehandles[1] is null");
203
204
206 ATH_MSG_DEBUG(
"1 pt mu+pi_soft tracks " << cascadeVertices[1]->trackParticle(0)->
pt() <<
", " << cascadeVertices[1]->trackParticle(1)->
pt());
208
209
211 ATH_MSG_DEBUG(
"1 pt D0 tracks " << cascadeVertices[0]->trackParticle(0)->
pt() <<
", " << cascadeVertices[0]->trackParticle(1)->
pt());
213
214
215 std::vector<const xAOD::Vertex*> MuPiVerticestoLink;
216 if (MuPiVertex) MuPiVerticestoLink.push_back(MuPiVertex);
220
221 std::vector<const xAOD::Vertex*> d0VerticestoLink;
222 if (d0Vertex) d0VerticestoLink.push_back(d0Vertex);
226
227 bool tagD0(true);
228 if (MuPiVertex){
230 }
231
234 std::vector<double> massesMuPi;
237 std::vector<double> massesD0;
238 if(tagD0){
241 }else{
244 }
245 std::vector<double> Masses;
249
250
251
252
253
254 xAOD::BPhysHypoHelper vtx(
m_hypoName, mainVertex);
255
256
258
259
260
261
262
265
267 PtErr_decor(*mainVertex) =
m_CascadeTools->pTError(moms[1],
x->getCovariance()[1]);
268
269 chi2_decor(*mainVertex) =
x->fitChi2();
270 ndof_decor(*mainVertex) =
x->nDoF();
271 Chi2Mu_decor(*mainVertex) = cascadeVertices[1]->trackParticle(0)->chiSquared();
272 nDoFMu_decor(*mainVertex) = cascadeVertices[1]->trackParticle(0)->numberDoF();
273
274
275 std::vector< Trk::VxTrackAtVertex > trkAtB = cascadeVertices[1]->vxTrackAtVertex();
276 MuChi2B_decor(*mainVertex) = trkAtB.at(0).trackQuality().chiSquared();
277 MunDoFB_decor(*mainVertex) = trkAtB.at(0).trackQuality().numberDoF();
278
279 float massMuPi = 0.;
280 if (MuPiVertex) {
281 TLorentzVector p4_mu1, p4_pi_s;
288 massMuPi = (p4_mu1 + p4_pi_s).M();
291 }
292 massMuPi_decor(*mainVertex) = massMuPi;
293
294
295 if (d0Vertex) {
296 TLorentzVector p4_ka, p4_pi;
297 if(tagD0){
306
307 }else{
316 }
317
318 }
319 MassMuPiAft_decor(*mainVertex) = (moms[1][0] + moms[1][1]).M();
320 MassPiD0_decor(*mainVertex) = (moms[1][1] + moms[0][0] + moms[0][1]).M();
321 MassKpi_svdecor(*mainVertex) = (moms[0][0] + moms[0][1]).M();
322 MassMuPiPiK_decor(*mainVertex) =
m_CascadeTools->invariantMass(moms[1]);
323
325
326
327
328 Mass_svdecor(*mainVertex) =
m_CascadeTools->invariantMass(moms[0]);
329 MassErr_svdecor(*mainVertex) =
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0]);
331 PtErr_svdecor(*mainVertex) =
m_CascadeTools->pTError(moms[0],
x->getCovariance()[0]);
332 Lxy_svdecor(*mainVertex) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
333 LxyErr_svdecor(*mainVertex) =
m_CascadeTools->lxyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
334 Tau_svdecor(*mainVertex) =
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1]);
335 TauErr_svdecor(*mainVertex) =
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
336
337
338
340 <<
" chi2_1 " <<
m_V0Tools->chisq(cascadeVertices[0])
341 <<
" chi2_2 " <<
m_V0Tools->chisq(cascadeVertices[1])
345 <<
" error " <<
m_V0Tools->invariantMassError(cascadeVertices[0],massesD0)
346 <<
" mass_J " <<
m_V0Tools->invariantMass(cascadeVertices[1],massesMuPi)
347 <<
" error " <<
m_V0Tools->invariantMassError(cascadeVertices[1],massesMuPi));
348
351 double Mass_B_err =
m_CascadeTools->invariantMassError(moms[1],
x->getCovariance()[1]);
352 double Mass_D0_err =
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0]);
353 ATH_MSG_DEBUG(
"Mass_B " << Mass_B <<
" Mass_D0 " << Mass_D0);
354 ATH_MSG_DEBUG(
"Mass_B_err " << Mass_B_err <<
" Mass_D0_err " << Mass_D0_err);
355 double mprob_B =
m_CascadeTools->massProbability(mass_b,Mass_B,Mass_B_err);
356 double mprob_D0 =
m_CascadeTools->massProbability(mass_d0,Mass_D0,Mass_D0_err);
357 ATH_MSG_DEBUG(
"mprob_B " << mprob_B <<
" mprob_D0 " << mprob_D0);
358
360 <<
" Mass_d0 " <<
m_CascadeTools->invariantMass(moms[0],massesD0));
362 <<
" Mass_d0_err " <<
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0],massesD0));
365 <<
" pt_d0 " <<
m_V0Tools->pT(cascadeVertices[0]));
367 <<
" ptErr_d " <<
m_CascadeTools->pTError(moms[0],
x->getCovariance()[0])
368 <<
" ptErr_d0 " <<
m_V0Tools->pTError(cascadeVertices[0]));
372 <<
" lxyErr_d " <<
m_CascadeTools->lxyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
373 <<
" lxyErr_d0 " <<
m_V0Tools->lxyError(cascadeVertices[0],cascadeVertices[1]));
375 <<
" tau_d0 " <<
m_V0Tools->tau(cascadeVertices[0],cascadeVertices[1],massesD0));
377 <<
" tau_d " <<
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1])
378 <<
" tau_D " <<
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1],mass_d0));
380 <<
" tauErr_d " <<
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
381 <<
" tauErr_d0 " <<
m_V0Tools->tauError(cascadeVertices[0],cascadeVertices[1],massesD0));
383 <<
" TauErr_d " <<
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1],mass_d0)
384 <<
" TauErr_d0 " <<
m_V0Tools->tauError(cascadeVertices[0],cascadeVertices[1],massesD0,mass_d0));
385
386 ATH_MSG_DEBUG(
"CascadeTools main vert wrt PV " <<
" CascadeTools SV " <<
" V0Tools SV");
388 <<
", " <<
m_CascadeTools->a0z(moms[0],cascadeVertices[0],cascadeVertices[1])
389 <<
", " <<
m_V0Tools->a0z(cascadeVertices[0],cascadeVertices[1]));
391 <<
", " <<
m_CascadeTools->a0zError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
392 <<
", " <<
m_V0Tools->a0zError(cascadeVertices[0],cascadeVertices[1]));
394 <<
", " <<
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],cascadeVertices[1])
395 <<
", " <<
m_V0Tools->a0xy(cascadeVertices[0],cascadeVertices[1]));
397 <<
", " <<
m_CascadeTools->a0xyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
398 <<
", " <<
m_V0Tools->a0xyError(cascadeVertices[0],cascadeVertices[1]));
400 <<
", " <<
m_CascadeTools->a0(moms[0],cascadeVertices[0],cascadeVertices[1])
401 <<
", " <<
m_V0Tools->a0(cascadeVertices[0],cascadeVertices[1]));
403 <<
", " <<
m_CascadeTools->a0Error(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
404 <<
", " <<
m_V0Tools->a0Error(cascadeVertices[0],cascadeVertices[1]));
407 ATH_MSG_DEBUG(
"X0 " << primaryVertex->
x() <<
" Y0 " << primaryVertex->
y() <<
" Z0 " << primaryVertex->
z());
410 ATH_MSG_DEBUG(
"Rxy0 wrt PV " <<
m_V0Tools->rxy(cascadeVertices[0],primaryVertex) <<
" RxyErr0 wrt PV " <<
m_V0Tools->rxyError(cascadeVertices[0],primaryVertex));
411 ATH_MSG_DEBUG(
"Rxy1 wrt PV " <<
m_V0Tools->rxy(cascadeVertices[1],primaryVertex) <<
" RxyErr1 wrt PV " <<
m_V0Tools->rxyError(cascadeVertices[1],primaryVertex));
412 ATH_MSG_DEBUG(
"number of covariance matrices " << (
x->getCovariance()).size());
413 }
414
415
416
417 for (
auto x : cascadeinfoContainer)
delete x;
418
419 return StatusCode::SUCCESS;
420 }
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
#define BPHYS_CHECK(EXP)
Useful CHECK macro.
size_type size() const noexcept
Returns the number of elements in the collection.
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfo_key
StatusCode performSearch(std::vector< Trk::VxCascadeInfo * > *cascadeinfoContainer, const EventContext &ctx) const
SG::Decorator< T, ALLOC > Decorator
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 ®x)
does a string contain the substring
retrieve(aClass, aKey=None)
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.