96 {
97 std::vector<Trk::VxCascadeInfo*> cascadeinfoContainer;
98 constexpr int topoN = 2;
99 std::array<xAOD::VertexContainer*, topoN> Vtxwritehandles;
100 std::array<xAOD::VertexAuxContainer*, topoN> Vtxwritehandlesaux;
102
103 for(
int i =0;
i<topoN;
i++){
106 Vtxwritehandles[
i]->setStore(Vtxwritehandlesaux[i]);
109 }
110
111
112
113
118
119 if (pvContainer->
size()==0){
121 return StatusCode::RECOVERABLE;
122 } else {
123 primaryVertex = (*pvContainer)[0];
124 }
125
126
127
128
133
136 } else {
137
140 refPvContainer->setStore(refPvAuxContainer);
143 }
144 }
145
150 return StatusCode::FAILURE;
151 }
152
155
156
160 SG::AuxElement::Decorator<float> chi2_decor("ChiSquared");
161 SG::AuxElement::Decorator<float> ndof_decor("NumberDoF");
162 SG::AuxElement::Decorator<float> Pt_decor("Pt");
163 SG::AuxElement::Decorator<float> PtErr_decor("PtErr");
164 SG::AuxElement::Decorator<float> Mass_svdecor("Dx_mass");
165 SG::AuxElement::Decorator<float> MassErr_svdecor("Dx_massErr");
166 SG::AuxElement::Decorator<float> Pt_svdecor("Dx_Pt");
167 SG::AuxElement::Decorator<float> PtErr_svdecor("Dx_PtErr");
168 SG::AuxElement::Decorator<float> Lxy_svdecor("Dx_Lxy");
169 SG::AuxElement::Decorator<float> LxyErr_svdecor("Dx_LxyErr");
170 SG::AuxElement::Decorator<float> Tau_svdecor("Dx_Tau");
171 SG::AuxElement::Decorator<float> TauErr_svdecor("Dx_TauErr");
172 SG::AuxElement::Decorator<float> Dx_chi2_svdecor("Dx_chi2");
173 SG::AuxElement::Decorator<float> Dx_ndof_svdecor("Dx_ndof");
174
175
176
177
178
179
180 SG::AuxElement::Decorator<float> massKX1_svdecor("KX_mass");
181 SG::AuxElement::Decorator<float> massKX1X2_svdecor("KXpi_mass");
182 SG::AuxElement::Decorator<float> RapidityKX1X2_svdecor("KXpi_Rapidity");
183
184 SG::AuxElement::Decorator<float> MuMass_decor("Mu_mass");
185 SG::AuxElement::Decorator<float> MuPt_decor("Mu_pt");
186 SG::AuxElement::Decorator<float> MuEta_decor("Mu_eta");
187 SG::AuxElement::Decorator<float> MuChi2_decor("Mu_chi2");
188 SG::AuxElement::Decorator<float> MunDoF_decor("Mu_nDoF");
189
190 SG::AuxElement::Decorator<float> MuChi2B_decor("Mu_chi2_B");
191 SG::AuxElement::Decorator<float> MunDoFB_decor("Mu_nDoF_B");
192
193 SG::AuxElement::Decorator<float> ChargeK_decor("K_charge");
194 SG::AuxElement::Decorator<float> ChargeX1_decor("X_charge");
195 SG::AuxElement::Decorator<float> ChargeX2_decor("Pi_charge");
196 SG::AuxElement::Decorator<float> ChargeMu_decor("Mu_charge");
197
198 ATH_MSG_DEBUG(
"cascadeinfoContainer size " << cascadeinfoContainer.size());
199
200
204
205
208
209 for (Trk::VxCascadeInfo*
x : cascadeinfoContainer) {
212 continue;
213 }
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233 const std::vector<xAOD::Vertex*> &cascadeVertices =
x->vertices();
234
235 if(cascadeVertices.size()!=topoN)
ATH_MSG_ERROR(
"Incorrect number of vertices");
236 if(cascadeVertices[0] ==
nullptr || cascadeVertices[1] ==
nullptr)
ATH_MSG_ERROR(
"Error null vertex");
237
238 for(
int i =0;
i<topoN;
i++) Vtxwritehandles[i]->push_back(cascadeVertices[i]);
239
240 x->setSVOwnership(
false);
241 const auto mainVertex = cascadeVertices[1];
242
243 const std::vector< std::vector<TLorentzVector> > &moms =
x->getParticleMoms();
244
245
246
247 std::vector<const xAOD::Vertex*> verticestoLink;
248 verticestoLink.push_back(cascadeVertices[0]);
249 if(Vtxwritehandles[1] ==
nullptr)
ATH_MSG_ERROR(
"Vtxwritehandles[1] is null");
252
253
254
255 typedef std::vector<const xAOD::Muon*> MuonBag;
256 MuonBag selectedMuons; selectedMuons.clear();
257
260 if (muonTrk == cascadeVertices[1]->trackParticle(0)) selectedMuons.push_back(mu);
261 }
263
264
265
266
268
269
270 auto muItr = selectedMuons.begin();
271 for(; muItr != selectedMuons.end(); muItr++) {
272
276
277
278 if( !muLink.isValid() ) continue;
279
280
281 preMuLinks.push_back( muLink );
282
283 }
284
285
286 MuonsLinksDecor(*cascadeVertices[1]) = preMuLinks;
287
288
289
290
291
293 ATH_MSG_DEBUG(
"1 pt D_(s)+/Lambda_c+ tracks " << cascadeVertices[1]->trackParticle(0)->
pt()<<
", "
294 << cascadeVertices[0]->trackParticle(0)->
pt()<<
", "<< cascadeVertices[0]->trackParticle(1)->
pt()<<
", "
295 << cascadeVertices[0]->trackParticle(2)->
pt());
298
299 std::vector<const xAOD::Vertex*> dxVerticestoLink;
300 if (dxVertex) dxVerticestoLink.push_back(dxVertex);
303 ATH_MSG_ERROR(
"Error decorating with D_(s)+/Lambda_c+ vertices");
304
305
306 bool tagDp(true);
307 if (dxVertex) {
309 }
310
311
314 std::vector<double> massesMu;
316 std::vector<double> massesDx;
317 if(tagDp){
320 }else{
323 }
325 std::vector<double> Masses;
328
329
330
331
332
333
334 xAOD::BPhysHypoHelper vtx(
m_hypoName, mainVertex);
335
336
338
339
340
341
344
346 PtErr_decor(*mainVertex) =
m_CascadeTools->pTError(moms[1],
x->getCovariance()[1]);
347
348 chi2_decor(*mainVertex) =
x->fitChi2();
349 ndof_decor(*mainVertex) =
x->nDoF();
350 Dx_chi2_svdecor(*mainVertex) = cascadeVertices[0]->chiSquared();
351 Dx_ndof_svdecor(*mainVertex) = cascadeVertices[0]->numberDoF();
352
353
354 float muM = 0., mupt = 0., mueta = 0.;
355 if (selectedMuons.size()==1) {
356 TLorentzVector p4_mu1;
357 p4_mu1.SetPtEtaPhiM(selectedMuons.at(0)->pt(),
358 selectedMuons.at(0)->eta(),
360 muM = p4_mu1.M();
361 mupt = p4_mu1.Pt();
362 mueta = p4_mu1.Eta();
363 }
364 MuMass_decor(*mainVertex) = muM;
365 MuPt_decor(*mainVertex) = mupt;
366 MuEta_decor(*mainVertex) = mueta;
367 ChargeMu_decor(*mainVertex) = selectedMuons.at(0)->charge();
368 MuChi2_decor(*mainVertex) = cascadeVertices[1]->trackParticle(0)->chiSquared();
369 MunDoF_decor(*mainVertex) = cascadeVertices[1]->trackParticle(0)->numberDoF();
370
371
372 std::vector< Trk::VxTrackAtVertex > trkAtB = cascadeVertices[1]->vxTrackAtVertex();
373 MuChi2B_decor(*mainVertex) = trkAtB.at(0).trackQuality().chiSquared();
374 MunDoFB_decor(*mainVertex) = trkAtB.at(0).trackQuality().numberDoF();
375
376
377
378 float massKX1 = 0.;
379 float massKX1X2 = 0.;
380 float RapidityKX1X2 = 0.;
381 if (dxVertex) {
382 TLorentzVector p4_h1, p4_h2, p4_h3;
383 if(tagDp){
392 }else{
397
402 }
407
408 massKX1 = (p4_h1 + p4_h2).M();
409 massKX1X2 = (p4_h1 + p4_h2 + p4_h3).M();
410 RapidityKX1X2 = (p4_h1 + p4_h2 + p4_h3).Rapidity();
411 }
412 massKX1_svdecor(*mainVertex) = massKX1;
413 massKX1X2_svdecor(*mainVertex) = massKX1X2;
414 RapidityKX1X2_svdecor(*mainVertex) = RapidityKX1X2;
415
416
419
420
421
422
423 Mass_svdecor(*mainVertex) =
m_CascadeTools->invariantMass(moms[0]);
424 MassErr_svdecor(*mainVertex) =
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0]);
426 PtErr_svdecor(*mainVertex) =
m_CascadeTools->pTError(moms[0],
x->getCovariance()[0]);
427 Lxy_svdecor(*mainVertex) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
428 LxyErr_svdecor(*mainVertex) =
m_CascadeTools->lxyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
429 Tau_svdecor(*mainVertex) =
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1]);
430 TauErr_svdecor(*mainVertex) =
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
431
432
434 <<
" chi2_1 " <<
m_V0Tools->chisq(cascadeVertices[0])
435 <<
" chi2_2 " <<
m_V0Tools->chisq(cascadeVertices[1])
439 <<
" error " <<
m_V0Tools->invariantMassError(cascadeVertices[0],massesDx)
440 <<
" mass_J " <<
m_V0Tools->invariantMass(cascadeVertices[1],massesMu)
441 <<
" error " <<
m_V0Tools->invariantMassError(cascadeVertices[1],massesMu));
442
445 double Mass_B_err =
m_CascadeTools->invariantMassError(moms[1],
x->getCovariance()[1]);
446 double Mass_D_err =
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0]);
448 ATH_MSG_DEBUG(
"Mass_B_err " << Mass_B_err <<
" Mass_D_err " << Mass_D_err);
449 double mprob_B =
m_CascadeTools->massProbability(mass_b,Mass_B,Mass_B_err);
450 double mprob_D =
m_CascadeTools->massProbability(mass_d,Mass_D,Mass_D_err);
451 ATH_MSG_DEBUG(
"mprob_B " << mprob_B <<
" mprob_D " << mprob_D);
452
454 <<
" Mass_d " <<
m_CascadeTools->invariantMass(moms[0],massesDx));
456 <<
" Mass_d_err " <<
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0],massesDx));
459 <<
" pt_dp " <<
m_V0Tools->pT(cascadeVertices[0]));
461 <<
" ptErr_d " <<
m_CascadeTools->pTError(moms[0],
x->getCovariance()[0])
462 <<
" ptErr_dp " <<
m_V0Tools->pTError(cascadeVertices[0]));
466 <<
" lxyErr_d " <<
m_CascadeTools->lxyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
467 <<
" lxyErr_dp " <<
m_V0Tools->lxyError(cascadeVertices[0],cascadeVertices[1]));
469 <<
" tau_dp " <<
m_V0Tools->tau(cascadeVertices[0],cascadeVertices[1],massesDx));
471 <<
" tau_d " <<
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1])
472 <<
" tau_D " <<
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1],mass_d));
474 <<
" tauErr_d " <<
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
475 <<
" tauErr_dp " <<
m_V0Tools->tauError(cascadeVertices[0],cascadeVertices[1],massesDx));
477 <<
" TauErr_d " <<
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1],mass_d)
478 <<
" TauErr_dp " <<
m_V0Tools->tauError(cascadeVertices[0],cascadeVertices[1],massesDx,mass_d));
479
480 ATH_MSG_DEBUG(
"CascadeTools main vert wrt PV " <<
" CascadeTools SV " <<
" V0Tools SV");
482 <<
", " <<
m_CascadeTools->a0z(moms[0],cascadeVertices[0],cascadeVertices[1])
483 <<
", " <<
m_V0Tools->a0z(cascadeVertices[0],cascadeVertices[1]));
485 <<
", " <<
m_CascadeTools->a0zError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
486 <<
", " <<
m_V0Tools->a0zError(cascadeVertices[0],cascadeVertices[1]));
488 <<
", " <<
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],cascadeVertices[1])
489 <<
", " <<
m_V0Tools->a0xy(cascadeVertices[0],cascadeVertices[1]));
491 <<
", " <<
m_CascadeTools->a0xyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
492 <<
", " <<
m_V0Tools->a0xyError(cascadeVertices[0],cascadeVertices[1]));
494 <<
", " <<
m_CascadeTools->a0(moms[0],cascadeVertices[0],cascadeVertices[1])
495 <<
", " <<
m_V0Tools->a0(cascadeVertices[0],cascadeVertices[1]));
497 <<
", " <<
m_CascadeTools->a0Error(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
498 <<
", " <<
m_V0Tools->a0Error(cascadeVertices[0],cascadeVertices[1]));
501 ATH_MSG_DEBUG(
"X0 " << primaryVertex->
x() <<
" Y0 " << primaryVertex->
y() <<
" Z0 " << primaryVertex->
z());
504 ATH_MSG_DEBUG(
"Rxy0 wrt PV " <<
m_V0Tools->rxy(cascadeVertices[0],primaryVertex) <<
" RxyErr0 wrt PV " <<
m_V0Tools->rxyError(cascadeVertices[0],primaryVertex));
505 ATH_MSG_DEBUG(
"Rxy1 wrt PV " <<
m_V0Tools->rxy(cascadeVertices[1],primaryVertex) <<
" RxyErr1 wrt PV " <<
m_V0Tools->rxyError(cascadeVertices[1],primaryVertex));
506 ATH_MSG_DEBUG(
"number of covariance matrices " << (
x->getCovariance()).size());
507
508 }
509
510
511
512 for (
auto x : cascadeinfoContainer)
delete x;
513
514 return StatusCode::SUCCESS;
515 }
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
#define BPHYS_CHECK(EXP)
Useful CHECK macro.
xAOD::MuonContainer * muonContainer
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
bool setElement(ElementType element)
Set to point to an element.
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
ElementLink< xAOD::MuonContainer > MuonsLink
std::vector< MuonsLink > MuonsLinkVector
retrieve(aClass, aKey=None)
VertexAuxContainer_v1 VertexAuxContainer
Definition of the current jet auxiliary container.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
VertexContainer_v1 VertexContainer
Definition of the current "Vertex container version".
Vertex_v1 Vertex
Define the latest version of the vertex class.
Muon_v1 Muon
Reference the current persistent version:
MuonContainer_v1 MuonContainer
Definition of the current "Muon container version".