75 {
76 std::vector<Trk::VxCascadeInfo*> cascadeinfoContainer;
77 constexpr int topoN = 2;
78 std::array<SG::WriteHandle<xAOD::VertexContainer>, topoN> Vtxwritehandles;
80
81 for (
int i =0;
i<topoN;
i++) {
83 ATH_CHECK( Vtxwritehandles[i].record (std::make_unique<xAOD::VertexContainer>(),
84 std::make_unique<xAOD::VertexAuxContainer>()) );
85 }
86
87
88
89
93 return StatusCode::FAILURE;
94 }
96
97 if (pvContainer->size()==0){
98 ATH_MSG_WARNING(
"You have no primary vertices: " << pvContainer->size());
99 return StatusCode::RECOVERABLE;
100 }
102
103
104
105
106 SG::WriteHandle<xAOD::VertexContainer> refPvContainer;
108
110 ATH_CHECK(refPvContainer.
record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()));
111 }
112
114
119
120
124 SG::AuxElement::Decorator<float> chi2_decor("ChiSquared");
125 SG::AuxElement::Decorator<float> ndof_decor("NumberDoF");
126 SG::AuxElement::Decorator<float> Pt_decor("Pt");
127 SG::AuxElement::Decorator<float> PtErr_decor("PtErr");
128 SG::AuxElement::Decorator<float> Mass_svdecor("V0_mass");
129 SG::AuxElement::Decorator<float> MassErr_svdecor("V0_massErr");
130 SG::AuxElement::Decorator<float> Pt_svdecor("V0_Pt");
131 SG::AuxElement::Decorator<float> PtErr_svdecor("V0_PtErr");
132 SG::AuxElement::Decorator<float> Lxy_svdecor("V0_Lxy");
133 SG::AuxElement::Decorator<float> LxyErr_svdecor("V0_LxyErr");
134 SG::AuxElement::Decorator<float> Tau_svdecor("V0_Tau");
135 SG::AuxElement::Decorator<float> TauErr_svdecor("V0_TauErr");
136
137 ATH_MSG_DEBUG(
"cascadeinfoContainer size " << cascadeinfoContainer.size());
138
139
141 if (!jpsiContainer.
isValid()) {
143 return StatusCode::FAILURE;
144 }
148 return StatusCode::FAILURE;
149 }
150
151 for (Trk::VxCascadeInfo*
x : cascadeinfoContainer) {
154
155 return StatusCode::FAILURE;
156 }
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176 const std::vector<xAOD::Vertex*> &cascadeVertices =
x->vertices();
177 if(cascadeVertices.size()!=topoN)
179 if(cascadeVertices[0] ==
nullptr || cascadeVertices[1] ==
nullptr)
ATH_MSG_ERROR(
"Error null vertex");
180
181 for(
int i =0;
i<topoN;
i++) Vtxwritehandles[i]->push_back(cascadeVertices[i]);
182
183 x->setSVOwnership(
false);
184 const auto mainVertex = cascadeVertices[1];
185
186 const std::vector< std::vector<TLorentzVector> > &moms =
x->getParticleMoms();
187
188
189 std::vector<const xAOD::Vertex*> verticestoLink;
190 verticestoLink.push_back(cascadeVertices[0]);
194
195
197 ATH_MSG_DEBUG(
"1 pt Jpsi tracks " << cascadeVertices[1]->trackParticle(0)->
pt() <<
", " << cascadeVertices[1]->trackParticle(1)->
pt());
199
200
202 ATH_MSG_DEBUG(
"1 pt V0 tracks " << cascadeVertices[0]->trackParticle(0)->
pt() <<
", " << cascadeVertices[0]->trackParticle(1)->
pt());
204
205
206 std::vector<const xAOD::Vertex*> jpsiVerticestoLink;
207 if (jpsiVertex) jpsiVerticestoLink.push_back(jpsiVertex);
211
212 std::vector<const xAOD::Vertex*> v0VerticestoLink;
213 if (v0Vertex) v0VerticestoLink.push_back(v0Vertex);
217
221 std::vector<double> massesJpsi(2, mass_track);
222 std::vector<double> massesV0;
223 std::vector<double> Masses(2, mass_track);
240 }
241
242
243
244
245
246 xAOD::BPhysHypoHelper vtx(
m_hypoName, mainVertex);
247
249
250
251
252
253
256
258 PtErr_decor(*mainVertex) =
m_CascadeTools->pTError(moms[1],
x->getCovariance()[1]);
259
260 chi2_decor(*mainVertex) =
x->fitChi2();
261 ndof_decor(*mainVertex) =
x->nDoF();
262
264 if (
m_refitPV) { refPVContainer = refPvContainer.
ptr(); }
267
268
269
270
271 Mass_svdecor(*mainVertex) =
m_CascadeTools->invariantMass(moms[0]);
272 MassErr_svdecor(*mainVertex) =
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0]);
274 PtErr_svdecor(*mainVertex) =
m_CascadeTools->pTError(moms[0],
x->getCovariance()[0]);
275 Lxy_svdecor(*mainVertex) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
276 LxyErr_svdecor(*mainVertex) =
m_CascadeTools->lxyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
277 Tau_svdecor(*mainVertex) =
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1]);
278 TauErr_svdecor(*mainVertex) =
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
279
280
282 <<
" chi2_1 " <<
m_V0Tools->chisq(cascadeVertices[0])
283 <<
" chi2_2 " <<
m_V0Tools->chisq(cascadeVertices[1])
287 <<
" error " <<
m_V0Tools->invariantMassError(cascadeVertices[0],massesV0)
288 <<
" mass_J " <<
m_V0Tools->invariantMass(cascadeVertices[1],massesJpsi)
289 <<
" error " <<
m_V0Tools->invariantMassError(cascadeVertices[1],massesJpsi));
290
293 double Mass_B_err =
m_CascadeTools->invariantMassError(moms[1],
x->getCovariance()[1]);
294 double Mass_V0_err =
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0]);
295 ATH_MSG_DEBUG(
"Mass_B " << Mass_B <<
" Mass_V0 " << Mass_V0);
296 ATH_MSG_DEBUG(
"Mass_B_err " << Mass_B_err <<
" Mass_V0_err " << Mass_V0_err);
297 double mprob_B =
m_CascadeTools->massProbability(mass_b,Mass_B,Mass_B_err);
298 double mprob_V0 =
m_CascadeTools->massProbability(mass_v0,Mass_V0,Mass_V0_err);
299 ATH_MSG_DEBUG(
"mprob_B " << mprob_B <<
" mprob_V0 " << mprob_V0);
300
302 <<
" Mass_v0 " <<
m_CascadeTools->invariantMass(moms[0],massesV0));
304 <<
" Mass_v0_err " <<
m_CascadeTools->invariantMassError(moms[0],
x->getCovariance()[0],massesV0));
307 <<
" pt_v0 " <<
m_V0Tools->pT(cascadeVertices[0]));
309 <<
" ptErr_v " <<
m_CascadeTools->pTError(moms[0],
x->getCovariance()[0])
310 <<
" ptErr_v0 " <<
m_V0Tools->pTError(cascadeVertices[0]));
314 <<
" lxyErr_v " <<
m_CascadeTools->lxyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
315 <<
" lxyErr_v0 " <<
m_V0Tools->lxyError(cascadeVertices[0],cascadeVertices[1]));
317 <<
" tau_v0 " <<
m_V0Tools->tau(cascadeVertices[0],cascadeVertices[1],massesV0));
319 <<
" tau_v " <<
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1])
320 <<
" tau_V " <<
m_CascadeTools->tau(moms[0],cascadeVertices[0],cascadeVertices[1],mass_v0));
322 <<
" tauErr_v " <<
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
323 <<
" tauErr_v0 " <<
m_V0Tools->tauError(cascadeVertices[0],cascadeVertices[1],massesV0));
325 <<
" TauErr_v " <<
m_CascadeTools->tauError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1],mass_v0)
326 <<
" TauErr_v0 " <<
m_V0Tools->tauError(cascadeVertices[0],cascadeVertices[1],massesV0,mass_v0));
327
328 ATH_MSG_DEBUG(
"CascadeTools main vert wrt PV " <<
" CascadeTools SV " <<
" V0Tools SV");
330 <<
", " <<
m_CascadeTools->a0z(moms[0],cascadeVertices[0],cascadeVertices[1])
331 <<
", " <<
m_V0Tools->a0z(cascadeVertices[0],cascadeVertices[1]));
333 <<
", " <<
m_CascadeTools->a0zError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
334 <<
", " <<
m_V0Tools->a0zError(cascadeVertices[0],cascadeVertices[1]));
336 <<
", " <<
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],cascadeVertices[1])
337 <<
", " <<
m_V0Tools->a0xy(cascadeVertices[0],cascadeVertices[1]));
339 <<
", " <<
m_CascadeTools->a0xyError(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
340 <<
", " <<
m_V0Tools->a0xyError(cascadeVertices[0],cascadeVertices[1]));
342 <<
", " <<
m_CascadeTools->a0(moms[0],cascadeVertices[0],cascadeVertices[1])
343 <<
", " <<
m_V0Tools->a0(cascadeVertices[0],cascadeVertices[1]));
345 <<
", " <<
m_CascadeTools->a0Error(moms[0],
x->getCovariance()[0],cascadeVertices[0],cascadeVertices[1])
346 <<
", " <<
m_V0Tools->a0Error(cascadeVertices[0],cascadeVertices[1]));
349 ATH_MSG_DEBUG(
"X0 " << primaryVertex->
x() <<
" Y0 " << primaryVertex->
y() <<
" Z0 " << primaryVertex->
z());
352 ATH_MSG_DEBUG(
"Rxy0 wrt PV " <<
m_V0Tools->rxy(cascadeVertices[0],primaryVertex) <<
" RxyErr0 wrt PV " <<
m_V0Tools->rxyError(cascadeVertices[0],primaryVertex));
353 ATH_MSG_DEBUG(
"Rxy1 wrt PV " <<
m_V0Tools->rxy(cascadeVertices[1],primaryVertex) <<
" RxyErr1 wrt PV " <<
m_V0Tools->rxyError(cascadeVertices[1],primaryVertex));
354 ATH_MSG_DEBUG(
"number of covariance matrices " << (
x->getCovariance()).size());
355 }
356
357
358
359 for (
auto x : cascadeinfoContainer)
delete x;
360
361 return StatusCode::SUCCESS;
362 }
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
bool isValid(const T &p)
Av: we implement here an ATLAS-sepcific convention: all particles which are 99xxxxx are fine.
#define BPHYS_CHECK(EXP)
Useful CHECK macro.
Gaudi::Property< int > m_PV_max
Gaudi::Property< int > m_v0_pid
SG::ReadHandleKey< xAOD::VertexContainer > m_vertexContainerKey
SG::ReadHandleKey< xAOD::VertexContainer > m_VxPrimaryCandidateName
Name of primary vertex container.
ToolHandle< Analysis::PrimaryVertexRefitter > m_pvRefitter
PublicToolHandle< DerivationFramework::CascadeTools > m_CascadeTools
PublicToolHandle< Trk::V0Tools > m_V0Tools
Gaudi::Property< int > m_jpsi_trk_pdg
StatusCode performSearch(std::vector< Trk::VxCascadeInfo * > &cascadeinfoContainer, const EventContext &ctx) const
SG::ReadHandleKey< xAOD::VertexContainer > m_vertexV0ContainerKey
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfo_key
SG::WriteHandleKey< xAOD::VertexContainer > m_refPVContainerName
Gaudi::Property< size_t > m_PV_minNTracks
Gaudi::Property< bool > m_refitPV
Gaudi::Property< std::string > m_hypoName
name of the mass hypothesis.
Gaudi::Property< int > m_DoVertexType
SG::WriteHandleKeyArray< xAOD::VertexContainer > m_cascadeOutputsKeys
SG::Decorator< T, ALLOC > Decorator
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
pointer_type ptr()
Dereference the pointer.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
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 isElectron(const T &p)
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
VertexContainer_v1 VertexContainer
Definition of the current "Vertex container version".
Vertex_v1 Vertex
Define the latest version of the vertex class.