ATLAS Offline Software
Loading...
Searching...
No Matches
DerivationFramework::JpsiPlusDsCascade Class Reference

#include <JpsiPlusDsCascade.h>

Inheritance diagram for DerivationFramework::JpsiPlusDsCascade:
Collaboration diagram for DerivationFramework::JpsiPlusDsCascade:

Public Member Functions

 JpsiPlusDsCascade (const std::string &t, const std::string &n, const IInterface *p)
 ~JpsiPlusDsCascade ()
virtual StatusCode initialize () override
StatusCode performSearch (std::vector< Trk::VxCascadeInfo * > *cascadeinfoContainer, const EventContext &ctx) const
virtual StatusCode addBranches (const EventContext &ctx) const override

Private Attributes

std::string m_vertexContainerKey
std::string m_vertexDxContainerKey
std::vector< std::string > m_cascadeOutputsKeys
std::string m_VxPrimaryCandidateName
 Name of primary vertex container // FIXME Use Handles.
double m_jpsiMassLower
double m_jpsiMassUpper
double m_DxMassLower
double m_DxMassUpper
double m_MassLower
double m_MassUpper
double m_vtx0MassHypo
double m_vtx1MassHypo
double m_vtx0Daug1MassHypo
double m_vtx0Daug2MassHypo
double m_vtx1Daug1MassHypo
double m_vtx1Daug2MassHypo
double m_vtx1Daug3MassHypo
double m_mass_jpsi
int m_Dx_pid
bool m_constrDx
bool m_constrJpsi
double m_chi2cut
SG::ReadHandleKey< xAOD::EventInfom_eventInfo_key {this, "EventInfo", "EventInfo", "Input event information"}
ToolHandle< Trk::TrkVKalVrtFitterm_iVertexFitter
PublicToolHandle< Analysis::PrimaryVertexRefitterm_pvRefitter
PublicToolHandle< Trk::V0Toolsm_V0Tools
PublicToolHandle< DerivationFramework::CascadeToolsm_CascadeTools
bool m_refitPV
std::string m_refPVContainerName
std::string m_hypoName
 name of the mass hypothesis.
int m_PV_max
int m_DoVertexType
size_t m_PV_minNTracks

Detailed Description

Definition at line 35 of file JpsiPlusDsCascade.h.

Constructor & Destructor Documentation

◆ JpsiPlusDsCascade()

DerivationFramework::JpsiPlusDsCascade::JpsiPlusDsCascade ( const std::string & t,
const std::string & n,
const IInterface * p )

Definition at line 404 of file JpsiPlusDsCascade.cxx.

404 : 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 }
PublicToolHandle< Trk::V0Tools > m_V0Tools
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.
PublicToolHandle< Analysis::PrimaryVertexRefitter > m_pvRefitter

◆ ~JpsiPlusDsCascade()

DerivationFramework::JpsiPlusDsCascade::~JpsiPlusDsCascade ( )

Definition at line 466 of file JpsiPlusDsCascade.cxx.

466{ }

Member Function Documentation

◆ addBranches()

StatusCode DerivationFramework::JpsiPlusDsCascade::addBranches ( const EventContext & ctx) const
overridevirtual

Definition at line 65 of file JpsiPlusDsCascade.cxx.

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
118 SG::ReadHandle<xAOD::EventInfo> evt(m_eventInfo_key, ctx);
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::AuxElement::Decorator<VertexLinkVector> CascadeLinksDecor("CascadeVertexLinks");
125 SG::AuxElement::Decorator<VertexLinkVector> JpsiLinksDecor("JpsiVertexLinks");
126 SG::AuxElement::Decorator<VertexLinkVector> DxLinksDecor("DxVertexLinks");
127 SG::AuxElement::Decorator<float> chi2_decor("ChiSquared");
128 SG::AuxElement::Decorator<float> ndof_decor("NumberDoF");
129 SG::AuxElement::Decorator<float> Pt_decor("Pt");
130 SG::AuxElement::Decorator<float> PtErr_decor("PtErr");
131 SG::AuxElement::Decorator<float> Mass_svdecor("Dx_mass");
132 SG::AuxElement::Decorator<float> MassErr_svdecor("Dx_massErr");
133 SG::AuxElement::Decorator<float> Pt_svdecor("Dx_Pt");
134 SG::AuxElement::Decorator<float> PtErr_svdecor("Dx_PtErr");
135 SG::AuxElement::Decorator<float> Lxy_svdecor("Dx_Lxy");
136 SG::AuxElement::Decorator<float> LxyErr_svdecor("Dx_LxyErr");
137 SG::AuxElement::Decorator<float> Tau_svdecor("Dx_Tau");
138 SG::AuxElement::Decorator<float> TauErr_svdecor("Dx_TauErr");
139
140 SG::AuxElement::Decorator<float> MassMumu_decor("Mumu_mass");
141 SG::AuxElement::Decorator<float> MassKX_svdecor("KX_mass");
142 SG::AuxElement::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 }
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
#define BPHYS_CHECK(EXP)
Useful CHECK macro.
#define x
size_type size() const noexcept
Returns the number of elements in the collection.
static bool LinkVertices(SG::AuxElement::Decorator< VertexLinkVector > &decor, const std::vector< const xAOD::Vertex * > &vertices, const xAOD::VertexContainer *vertexContainer, const xAOD::Vertex *vert)
static const xAOD::Vertex * FindVertex(const xAOD::VertexContainer *c, const xAOD::Vertex *v)
static void SetVectorInfo(xAOD::BPhysHelper &, const Trk::VxCascadeInfo *)
StatusCode performSearch(std::vector< Trk::VxCascadeInfo * > *cascadeinfoContainer, const EventContext &ctx) const
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfo_key
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
m_data push_back(elt)
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.

◆ initialize()

StatusCode DerivationFramework::JpsiPlusDsCascade::initialize ( )
overridevirtual

Definition at line 27 of file JpsiPlusDsCascade.cxx.

27 {
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 }
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

◆ performSearch()

StatusCode DerivationFramework::JpsiPlusDsCascade::performSearch ( std::vector< Trk::VxCascadeInfo * > * cascadeinfoContainer,
const EventContext & ctx ) const

Definition at line 468 of file JpsiPlusDsCascade.cxx.

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 for(auto vxcItr=jpsiContainer->cbegin(); vxcItr!=jpsiContainer->cend(); ++vxcItr) {
510
511 // Check the passed flag first
512 const xAOD::Vertex* vtx = *vxcItr;
513 SG::AuxElement::Accessor<Char_t> flagAcc1("passed_Jpsi");
514 if(flagAcc1.isAvailable(*vtx)){
515 if(!flagAcc1(*vtx)) continue;
516 }
517
518 // Check J/psi candidate invariant mass and skip if need be
519 double mass_Jpsi = m_V0Tools->invariantMass(*vxcItr, massesJpsi);
520 if (mass_Jpsi < m_jpsiMassLower || mass_Jpsi > m_jpsiMassUpper) {
521 ATH_MSG_DEBUG(" Original Jpsi candidate rejected by the mass cut: mass = "
522 << mass_Jpsi << " != (" << m_jpsiMassLower << ", " << m_jpsiMassUpper << ")" );
523 continue;
524 }
525 selectedJpsiCandidates.push_back(*vxcItr);
526 }
527 if(selectedJpsiCandidates.size()<1) return StatusCode::SUCCESS;
528
529 // Select the D_s+/D+ candidates before calling cascade fit
530 std::vector<const xAOD::Vertex*> selectedDxCandidates;
531 for(auto vxcItr=dxContainer->cbegin(); vxcItr!=dxContainer->cend(); ++vxcItr) {
532
533 // Check the passed flag first
534 const xAOD::Vertex* vtx = *vxcItr;
535 if(abs(m_Dx_pid)==431) { // D_s+/-
536 SG::AuxElement::Accessor<Char_t> flagAcc1("passed_Ds");
537 if(flagAcc1.isAvailable(*vtx)){
538 if(!flagAcc1(*vtx)) continue;
539 }
540 }
541
542 if(abs(m_Dx_pid)==411) { // D+/-
543 SG::AuxElement::Accessor<Char_t> flagAcc1("passed_Dp");
544 SG::AuxElement::Accessor<Char_t> flagAcc2("passed_Dm");
545 bool isDp(true);
546 bool isDm(true);
547 if(flagAcc1.isAvailable(*vtx)){
548 if(!flagAcc1(*vtx)) isDp = false;
549 }
550 if(flagAcc2.isAvailable(*vtx)){
551 if(!flagAcc2(*vtx)) isDm = false;
552 }
553 if(!(isDp||isDm)) continue;
554 }
555
556
557 // Ensure the total charge is correct
558 if(abs((*vxcItr)->trackParticle(0)->charge()+(*vxcItr)->trackParticle(1)->charge()+(*vxcItr)->trackParticle(2)->charge()) != 1){
559 ATH_MSG_DEBUG(" Original D+ candidate rejected by the charge requirement: "
560 << (*vxcItr)->trackParticle(0)->charge() << ", " << (*vxcItr)->trackParticle(1)->charge() << ", " << (*vxcItr)->trackParticle(2)->charge() );
561 continue;
562 }
563
564 // Check D_(s)+/- candidate invariant mass and skip if need be
565 double mass_D;
566 if(abs(m_Dx_pid)==411 && (*vxcItr)->trackParticle(2)->charge()<0) // D-
567 mass_D = m_V0Tools->invariantMass(*vxcItr,massesDm);
568 else // D+, D_s+/-
569 mass_D = m_V0Tools->invariantMass(*vxcItr,massesDx);
570 ATH_MSG_DEBUG("D_(s) mass " << mass_D);
571 if(mass_D < m_DxMassLower || mass_D > m_DxMassUpper) {
572 ATH_MSG_DEBUG(" Original D_(s) candidate rejected by the mass cut: mass = "
573 << mass_D << " != (" << m_DxMassLower << ", " << m_DxMassUpper << ")" );
574 continue;
575 }
576
577 // Add loose cut on K+k- mass for D_s->phi pi
578 if(m_Dx_pid==431){
579 TLorentzVector p4Kp_in, p4Km_in;
580 p4Kp_in.SetPtEtaPhiM( (*vxcItr)->trackParticle(0)->pt(),
581 (*vxcItr)->trackParticle(0)->eta(),
582 (*vxcItr)->trackParticle(0)->phi(), m_vtx1Daug1MassHypo);
583 p4Km_in.SetPtEtaPhiM( (*vxcItr)->trackParticle(1)->pt(),
584 (*vxcItr)->trackParticle(1)->eta(),
585 (*vxcItr)->trackParticle(1)->phi(), m_vtx1Daug2MassHypo);
586 double mass_phi = (p4Kp_in + p4Km_in).M();
587 ATH_MSG_DEBUG("phi mass " << mass_phi);
588 if(mass_phi > 1200) {
589 ATH_MSG_DEBUG(" Original phi candidate rejected by the mass cut: mass = " << mass_phi );
590 continue;
591 }
592 }
593 selectedDxCandidates.push_back(*vxcItr);
594 }
595 if(selectedDxCandidates.size()<1) return StatusCode::SUCCESS;
596
597 // Select J/psi D_(s)+ candidates
598 // Iterate over Jpsi vertices
599 for(auto jpsiItr=selectedJpsiCandidates.cbegin(); jpsiItr!=selectedJpsiCandidates.cend(); ++jpsiItr) {
600
601 size_t jpsiTrkNum = (*jpsiItr)->nTrackParticles();
602 tracksJpsi.clear();
603 for( unsigned int it=0; it<jpsiTrkNum; it++) tracksJpsi.push_back((*jpsiItr)->trackParticle(it));
604
605 if (tracksJpsi.size() != 2 || massesJpsi.size() != 2 ) {
606 ATH_MSG_INFO("problems with Jpsi input");
607 }
608
609 // Iterate over D_(s)+/- vertices
610 for(auto dxItr=selectedDxCandidates.cbegin(); dxItr!=selectedDxCandidates.cend(); ++dxItr) {
611
612 // Check identical tracks in input
613 if(std::find(tracksJpsi.cbegin(), tracksJpsi.cend(), (*dxItr)->trackParticle(0)) != tracksJpsi.cend()) continue;
614 if(std::find(tracksJpsi.cbegin(), tracksJpsi.cend(), (*dxItr)->trackParticle(1)) != tracksJpsi.cend()) continue;
615 if(std::find(tracksJpsi.cbegin(), tracksJpsi.cend(), (*dxItr)->trackParticle(2)) != tracksJpsi.cend()) continue;
616
617 size_t dxTrkNum = (*dxItr)->nTrackParticles();
618 tracksDx.clear();
619 for( unsigned int it=0; it<dxTrkNum; it++) tracksDx.push_back((*dxItr)->trackParticle(it));
620 if (tracksDx.size() != 3 || massesDx.size() != 3 ) {
621 ATH_MSG_INFO("problems with D_(s) input");
622 }
623
624 ATH_MSG_DEBUG("using tracks" << tracksJpsi[0] << ", " << tracksJpsi[1] << ", " << tracksDx[0] << ", " << tracksDx[1] << ", " << tracksDx[2]);
625 tracksBc.clear();
626 for( unsigned int it=0; it<jpsiTrkNum; it++) tracksBc.push_back((*jpsiItr)->trackParticle(it));
627 for( unsigned int it=0; it<dxTrkNum; it++) tracksBc.push_back((*dxItr)->trackParticle(it));
628
629 // Apply the user's settings to the fitter
630 // Reset
631 std::unique_ptr<Trk::IVKalState> state (m_iVertexFitter->makeState(ctx));
632 // Robustness
633 int robustness = 0;
634 m_iVertexFitter->setRobustness(robustness, *state);
635 // Build up the topology
636 // Vertex list
637 std::vector<Trk::VertexID> vrtList;
638 // D_(s)+/- vertex
639 Trk::VertexID vID;
640 if (m_constrDx) {
641 if(abs(m_Dx_pid)==411 && (*dxItr)->trackParticle(2)->charge()<0) // D-
642 vID = m_iVertexFitter->startVertex(tracksDx,massesDm,*state,mass_d);
643 else // D+, D_s+/-
644 vID = m_iVertexFitter->startVertex(tracksDx,massesDx,*state,mass_d);
645 } else {
646 if(abs(m_Dx_pid)==411 && (*dxItr)->trackParticle(2)->charge()<0) // D-
647 vID = m_iVertexFitter->startVertex(tracksDx,massesDm,*state);
648 else // D+, D_s+/-
649 vID = m_iVertexFitter->startVertex(tracksDx,massesDx,*state);
650 }
651 vrtList.push_back(vID);
652 // B vertex including Jpsi
653 Trk::VertexID vID2 = m_iVertexFitter->nextVertex(tracksJpsi,massesJpsi,vrtList,*state);
654 if (m_constrJpsi) {
655 std::vector<Trk::VertexID> cnstV;
656 cnstV.clear();
657 if ( !m_iVertexFitter->addMassConstraint(vID2,tracksJpsi,cnstV,*state,m_mass_jpsi).isSuccess() ) {
658 ATH_MSG_WARNING("addMassConstraint failed");
659 //return StatusCode::FAILURE;
660 }
661 }
662 // Do the work
663 std::unique_ptr<Trk::VxCascadeInfo> result(m_iVertexFitter->fitCascade(*state));
664
665 if (result != nullptr) {
666 // reset links to original tracks
667 BPhysPVCascadeTools::PrepareVertexLinks(result.get(), trackContainer);
668 ATH_MSG_DEBUG("storing tracks " << ((result->vertices())[0])->trackParticle(0) << ", "
669 << ((result->vertices())[0])->trackParticle(1) << ", "
670 << ((result->vertices())[0])->trackParticle(2) << ", "
671 << ((result->vertices())[1])->trackParticle(0) << ", "
672 << ((result->vertices())[1])->trackParticle(1));
673 // necessary to prevent memory leak
674 result->setSVOwnership(true);
675
676 // Chi2/DOF cut
677 double bChi2DOF = result->fitChi2()/result->nDoF();
678 ATH_MSG_DEBUG("Candidate chi2/DOF is " << bChi2DOF);
679 bool chi2CutPassed = (m_chi2cut <= 0.0 || bChi2DOF < m_chi2cut);
680
681 const std::vector< std::vector<TLorentzVector> > &moms = result->getParticleMoms();
682 double mass = m_CascadeTools->invariantMass(moms[1]);
683 if(chi2CutPassed) {
684 if (mass >= m_MassLower && mass <= m_MassUpper) {
685 cascadeinfoContainer->push_back(result.release());
686 } else {
687 ATH_MSG_DEBUG("Candidate rejected by the mass cut: mass = "
688 << mass << " != (" << m_MassLower << ", " << m_MassUpper << ")" );
689 }
690 }
691 }
692
693 } //Iterate over D_(s)+ vertices
694
695 } //Iterate over Jpsi vertices
696
697 ATH_MSG_DEBUG("cascadeinfoContainer size " << cascadeinfoContainer->size());
698
699 return StatusCode::SUCCESS;
700 }
#define ATH_MSG_INFO(x)
const_iterator cbegin() const noexcept
Return a const_iterator pointing at the beginning of 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)
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".

Member Data Documentation

◆ m_cascadeOutputsKeys

std::vector<std::string> DerivationFramework::JpsiPlusDsCascade::m_cascadeOutputsKeys
private

Definition at line 47 of file JpsiPlusDsCascade.h.

◆ m_CascadeTools

PublicToolHandle< DerivationFramework::CascadeTools > DerivationFramework::JpsiPlusDsCascade::m_CascadeTools
private

Definition at line 75 of file JpsiPlusDsCascade.h.

◆ m_chi2cut

double DerivationFramework::JpsiPlusDsCascade::m_chi2cut
private

Definition at line 69 of file JpsiPlusDsCascade.h.

◆ m_constrDx

bool DerivationFramework::JpsiPlusDsCascade::m_constrDx
private

Definition at line 67 of file JpsiPlusDsCascade.h.

◆ m_constrJpsi

bool DerivationFramework::JpsiPlusDsCascade::m_constrJpsi
private

Definition at line 68 of file JpsiPlusDsCascade.h.

◆ m_DoVertexType

int DerivationFramework::JpsiPlusDsCascade::m_DoVertexType
private

Definition at line 83 of file JpsiPlusDsCascade.h.

◆ m_Dx_pid

int DerivationFramework::JpsiPlusDsCascade::m_Dx_pid
private

Definition at line 66 of file JpsiPlusDsCascade.h.

◆ m_DxMassLower

double DerivationFramework::JpsiPlusDsCascade::m_DxMassLower
private

Definition at line 53 of file JpsiPlusDsCascade.h.

◆ m_DxMassUpper

double DerivationFramework::JpsiPlusDsCascade::m_DxMassUpper
private

Definition at line 54 of file JpsiPlusDsCascade.h.

◆ m_eventInfo_key

SG::ReadHandleKey<xAOD::EventInfo> DerivationFramework::JpsiPlusDsCascade::m_eventInfo_key {this, "EventInfo", "EventInfo", "Input event information"}
private

Definition at line 71 of file JpsiPlusDsCascade.h.

71{this, "EventInfo", "EventInfo", "Input event information"};

◆ m_hypoName

std::string DerivationFramework::JpsiPlusDsCascade::m_hypoName
private

name of the mass hypothesis.

E.g. Jpis, Upsi, etc. Will be used as a prefix for decorations

Definition at line 79 of file JpsiPlusDsCascade.h.

◆ m_iVertexFitter

ToolHandle< Trk::TrkVKalVrtFitter > DerivationFramework::JpsiPlusDsCascade::m_iVertexFitter
private

Definition at line 72 of file JpsiPlusDsCascade.h.

◆ m_jpsiMassLower

double DerivationFramework::JpsiPlusDsCascade::m_jpsiMassLower
private

Definition at line 51 of file JpsiPlusDsCascade.h.

◆ m_jpsiMassUpper

double DerivationFramework::JpsiPlusDsCascade::m_jpsiMassUpper
private

Definition at line 52 of file JpsiPlusDsCascade.h.

◆ m_mass_jpsi

double DerivationFramework::JpsiPlusDsCascade::m_mass_jpsi
private

Definition at line 65 of file JpsiPlusDsCascade.h.

◆ m_MassLower

double DerivationFramework::JpsiPlusDsCascade::m_MassLower
private

Definition at line 55 of file JpsiPlusDsCascade.h.

◆ m_MassUpper

double DerivationFramework::JpsiPlusDsCascade::m_MassUpper
private

Definition at line 56 of file JpsiPlusDsCascade.h.

◆ m_PV_max

int DerivationFramework::JpsiPlusDsCascade::m_PV_max
private

Definition at line 82 of file JpsiPlusDsCascade.h.

◆ m_PV_minNTracks

size_t DerivationFramework::JpsiPlusDsCascade::m_PV_minNTracks
private

Definition at line 84 of file JpsiPlusDsCascade.h.

◆ m_pvRefitter

PublicToolHandle< Analysis::PrimaryVertexRefitter > DerivationFramework::JpsiPlusDsCascade::m_pvRefitter
private

Definition at line 73 of file JpsiPlusDsCascade.h.

◆ m_refitPV

bool DerivationFramework::JpsiPlusDsCascade::m_refitPV
private

Definition at line 77 of file JpsiPlusDsCascade.h.

◆ m_refPVContainerName

std::string DerivationFramework::JpsiPlusDsCascade::m_refPVContainerName
private

Definition at line 78 of file JpsiPlusDsCascade.h.

◆ m_V0Tools

PublicToolHandle< Trk::V0Tools > DerivationFramework::JpsiPlusDsCascade::m_V0Tools
private

Definition at line 74 of file JpsiPlusDsCascade.h.

◆ m_vertexContainerKey

std::string DerivationFramework::JpsiPlusDsCascade::m_vertexContainerKey
private

Definition at line 45 of file JpsiPlusDsCascade.h.

◆ m_vertexDxContainerKey

std::string DerivationFramework::JpsiPlusDsCascade::m_vertexDxContainerKey
private

Definition at line 46 of file JpsiPlusDsCascade.h.

◆ m_vtx0Daug1MassHypo

double DerivationFramework::JpsiPlusDsCascade::m_vtx0Daug1MassHypo
private

Definition at line 59 of file JpsiPlusDsCascade.h.

◆ m_vtx0Daug2MassHypo

double DerivationFramework::JpsiPlusDsCascade::m_vtx0Daug2MassHypo
private

Definition at line 60 of file JpsiPlusDsCascade.h.

◆ m_vtx0MassHypo

double DerivationFramework::JpsiPlusDsCascade::m_vtx0MassHypo
private

Definition at line 57 of file JpsiPlusDsCascade.h.

◆ m_vtx1Daug1MassHypo

double DerivationFramework::JpsiPlusDsCascade::m_vtx1Daug1MassHypo
private

Definition at line 61 of file JpsiPlusDsCascade.h.

◆ m_vtx1Daug2MassHypo

double DerivationFramework::JpsiPlusDsCascade::m_vtx1Daug2MassHypo
private

Definition at line 62 of file JpsiPlusDsCascade.h.

◆ m_vtx1Daug3MassHypo

double DerivationFramework::JpsiPlusDsCascade::m_vtx1Daug3MassHypo
private

Definition at line 63 of file JpsiPlusDsCascade.h.

◆ m_vtx1MassHypo

double DerivationFramework::JpsiPlusDsCascade::m_vtx1MassHypo
private

Definition at line 58 of file JpsiPlusDsCascade.h.

◆ m_VxPrimaryCandidateName

std::string DerivationFramework::JpsiPlusDsCascade::m_VxPrimaryCandidateName
private

Name of primary vertex container // FIXME Use Handles.

Definition at line 49 of file JpsiPlusDsCascade.h.


The documentation for this class was generated from the following files: