ATLAS Offline Software
xAODMuDstarFilter.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 // -------------------------------------------------------------
5 // File: GeneratorFilters/xAODMuDstarFilter.cxx
6 // Description:
7 //
8 // Allows the user to search for (mu D*) combinations
9 // with both same and opposite charges.
10 // For D*+-, the decay D*+ -> D0 pi_s+ is selected
11 // with D0 in the nominal decay mode, D0 -> K- pi+ (Br = 3.947%),
12 // and, if "D0Kpi_only=false", 14 main other decays to 2 or 3 particles (except nu_e and nu_mu)
13 // in case they can immitate the nominal decay:
14 // D0 -> K-mu+nu, K-e+nu, pi-mu+nu, pi-e+nu,
15 // K-mu+nu pi0, K-e+nu pi0, pi-mu+nu pi0, pi-e+nu pi0,
16 // pi-pi+, K-K+, K-pi+pi0, K-K+pi0, pi-pi+pi0, K-pi+gamma
17 // Doubly Cabbibo supressed modes are also considered
18 // Requirements for non-nominal decay modes:
19 // D*+ -> ("K-" "pi+") pi_s+ (+c.c.) charges
20 // mKpiMin < m("K" "pi") < mKpiMax
21 // m("K" "pi" pi_s) - m("K" "pi") < delta_m_Max
22 //
23 // AuthorList:
24 // L K Gladilin (gladilin@mail.cern.ch) March 2023
25 // Versions:
26 // 1.0.0; 2023.04.01 (no jokes) - baseline version
27 // 1.0.1; 2023.04.14 - allow photons for "m_D0Kpi_only" for a case of Photos
28 // 1.0.2; 2023.04.17 - skip history Photos lines (status=3)
29 //
30 // Header for this module:-
31 
33 
34 // Framework Related Headers:-
35 #include "GaudiKernel/MsgStream.h"
36 
37 // Other classes used by this class:-
38 #include <math.h>
39 #include <limits>
40 
41 #include "TLorentzVector.h"
42 
44 
46 #include "xAODTruth/TruthVertex.h"
47 
48 //--------------------------------------------------------------------------
50  ISvcLocator *pSvcLocator) : GenFilter(name, pSvcLocator)
51 {
52  //--------------------------------------------------------------------------
53 }
54 
56 
57 //---------------------------------------------------------------------------
59 {
60  //---------------------------------------------------------------------------
61  ATH_MSG_INFO("xAODMuDstarFilter v1.02 INITIALISING ");
62 
63  ATH_MSG_INFO("PtMinMuon = " << m_PtMinMuon);
64  ATH_MSG_INFO("PtMaxMuon = " << m_PtMaxMuon);
65  ATH_MSG_INFO("EtaRangeMuon = " << m_EtaRangeMuon);
66 
67  ATH_MSG_INFO("PtMinDstar = " << m_PtMinDstar);
68  ATH_MSG_INFO("PtMaxDstar = " << m_PtMaxDstar);
69  ATH_MSG_INFO("EtaRangeDstar = " << m_EtaRangeDstar);
70 
71  ATH_MSG_INFO("RxyMinDstar = " << m_RxyMinDstar);
72 
73  ATH_MSG_INFO("PtMinPis = " << m_PtMinPis);
74  ATH_MSG_INFO("PtMaxPis = " << m_PtMaxPis);
75  ATH_MSG_INFO("EtaRangePis = " << m_EtaRangePis);
76 
77  ATH_MSG_INFO("D0Kpi_only = " << m_D0Kpi_only);
78  ATH_MSG_INFO("PtMinKpi = " << m_PtMinKpi);
79  ATH_MSG_INFO("PtMaxKpi = " << m_PtMaxKpi);
80  ATH_MSG_INFO("EtaRangeKpi = " << m_EtaRangeKpi);
81 
82  ATH_MSG_INFO("mKpiMin = " << m_mKpiMin);
83  ATH_MSG_INFO("mKpiMax = " << m_mKpiMax);
84 
85  ATH_MSG_INFO("delta_m_Max = " << m_delta_m_Max);
86 
87  ATH_MSG_INFO("DstarMu_m_Max = " << m_DstarMu_m_Max);
88 
90 
91  return StatusCode::SUCCESS;
92 }
93 
94 //---------------------------------------------------------------------------
96 {
97  //---------------------------------------------------------------------------
98 
99 // Retrieve TruthGen container from xAODTruthParticleSlimmerGen, contains all particles witout barcode_zero and
100 // duplicated barcode ones
101  const EventContext& context = Gaudi::Hive::currentContext();
103  xTruthParticleContainer(
105  if (!xTruthParticleContainer.isValid()) {
106  ATH_MSG_ERROR("Could not retrieve xAOD::TruthParticleGenContainer with key:"
108 
109  return StatusCode::FAILURE;
110  }
111 
112  ATH_MSG_DEBUG(" xAODMuDstarFilter filtering ");
113  double primx = 0.;
114  double primy = 0.;
115  int NumMuons = 0;
116  int NumDstars = 0;
117 
118  std::vector<const xAOD::TruthParticle *> Muons;
119 
120  unsigned int nPart = xTruthParticleContainer->size();
121  ATH_MSG_DEBUG("xAODMuDstarFilter:number of particles " << nPart);
122 
123  // Loop over all particles in the event
124  for (const xAOD::TruthParticle* pitr : *xTruthParticleContainer) {
125 
126  if (MC::isBeam(pitr)){
127  const xAOD::TruthVertex *vprim = (pitr)->decayVtx();
128  primx = vprim->x();
129  primy = vprim->y();
130 
131  ATH_MSG_DEBUG("xAODMuDstarFilter: PV x, y = " << primx << " , " << primy);
132  }
133 
134  if (!MC::isPhysical(pitr))
135  continue; // photos history line
136 
137  // muons
138  if (pitr->isMuon())
139  {
140  if ((pitr->pt() >= m_PtMinMuon) &&
141  (pitr->pt() < m_PtMaxMuon) &&
142  (std::abs(pitr->eta()) < m_EtaRangeMuon))
143  {
144  NumMuons++;
145  Muons.push_back(pitr);
146  }
147  }
148  }
149 
150  if (NumMuons == 0){
151  setFilterPassed(false);
152  return StatusCode::SUCCESS;
153  }
154 
155  ATH_MSG_DEBUG("xAODMuDstarFilter: NumMuons = " << NumMuons );
156 
157  for (const xAOD::TruthParticle* pitr : *xTruthParticleContainer) {
158  if (!MC::isPhysical(pitr))
159  continue; // photos history line
160 
161  // Dstars
162  if (std::abs(pitr->pdgId()) == MC::DSTAR)
163  {
164  if ((pitr->pt() >= m_PtMinDstar) &&
165  (pitr->pt() < m_PtMaxDstar) &&
166  (std::abs(pitr->eta()) < m_EtaRangeDstar))
167  {
168 
169  //Check if has end_vertex
170  if (!(pitr->decayVtx()))
171  continue;
172  double Rxy = std::hypot(pitr->decayVtx()->x() - primx, pitr->decayVtx()->y() - primy);
173 
174  ATH_MSG_DEBUG("xAODMuDstarFilter: R_xy(Dstar) = " << Rxy);
175 
176  if (Rxy < m_RxyMinDstar)
177  continue;
178 
179  auto firstChild = pitr->decayVtx()->outgoingParticle(0);
180  if (firstChild->pdgId() == pitr->pdgId())
181  continue;
182 
183  TLorentzVector p4_pis;
184 
185  int pis_pdg = 0;
186  int K_pdg = 0;
187 
188  int NumD0 = 0;
189  int NumPis = 0;
190 
191  for (size_t thisChild_id = 0; thisChild_id < pitr->decayVtx()->nOutgoingParticles(); thisChild_id++)
192  {
193 
194  auto thisChild = pitr->decayVtx()->outgoingParticle(thisChild_id);
195  if (!MC::isPhysical(thisChild))
196  continue; // photos history line
197 
198  if (std::abs(thisChild->pdgId()) == MC::PIPLUS)
199  {
200  if ((thisChild->pt() >= m_PtMinPis) &&
201  (thisChild->pt() < m_PtMaxPis) &&
202  (std::abs(thisChild->eta()) < m_EtaRangePis))
203  {
204  NumPis++;
205 
206  p4_pis.SetPtEtaPhiM(thisChild->pt(), thisChild->eta(), thisChild->phi(), m_PionMass);
207  pis_pdg = thisChild->pdgId();
208  }
209  }
210  } // thisChild
211 
212  if (NumPis == 0)
213  continue;
214 
215  ATH_MSG_DEBUG("xAODMuDstarFilter: NumPis = " << NumPis);
216 
217  const xAOD::TruthParticle *D0Child1{nullptr}, *D0Child2{nullptr}, *D0ChildMu{nullptr};
218 
219  int NumChildD0 = 0;
220  int NumChildD0Charged = 0;
221  int NumChildD0neutrinos = 0;
222  int NumChildD0gammas = 0;
223  int ChargeD0Child1 = 0;
224  int ChargeD0Child2 = 0;
225  int NumChildD0K = 0;
226  int NumChildD0pi = 0;
227  int NumChildD0mu = 0;
228 
229  for (size_t thisChild_id = 0; thisChild_id < pitr->decayVtx()->nOutgoingParticles(); thisChild_id++)
230  {
231  auto thisChild = pitr->decayVtx()->outgoingParticle(thisChild_id);
232  if (!MC::isPhysical(thisChild))
233  continue; // photos history line
234 
235  if (std::abs(thisChild->pdgId()) == MC::D0)
236  {
237  if (! thisChild->decayVtx()) continue;
238 
239  for (size_t thisChild1_id = 0; thisChild1_id < thisChild->decayVtx()->nOutgoingParticles(); thisChild1_id++)
240  {
241  auto thisChild1 = thisChild->decayVtx()->outgoingParticle(thisChild1_id);
242  if (!MC::isPhysical(thisChild1))
243  continue; // photos history line
244 
245  if (thisChild1->isElectron() || thisChild1->isMuon() ||
246  std::abs(thisChild1->pdgId()) == MC::PIPLUS || std::abs(thisChild1->pdgId()) == MC::KPLUS)
247  {
248 
249  NumChildD0++;
250  if ((thisChild1->pt() >= m_PtMinKpi) &&
251  (thisChild1->pt() < m_PtMaxKpi) &&
252  (std::abs(thisChild1->eta()) < m_EtaRangeKpi))
253  {
254  NumChildD0Charged++;
255 
256  if (NumChildD0Charged == 1)
257  {
258  D0Child1 = thisChild1;
259  ChargeD0Child1 = D0Child1->charge();
260  }
261  if (NumChildD0Charged == 2)
262  {
263  D0Child2 = thisChild1;
264  ChargeD0Child2 = D0Child2->charge();
265  }
266  if (thisChild1->isMuon())
267  {
268  NumChildD0mu++;
269  D0ChildMu = thisChild1;
270  }
271  if (std::abs(thisChild1->pdgId()) == MC::PIPLUS)
272  NumChildD0pi++;
273  if (std::abs(thisChild1->pdgId()) == MC::KPLUS)
274  {
275  NumChildD0K++;
276  K_pdg = thisChild1->pdgId();
277  }
278  }
279  }
280  else if (std::abs(thisChild1->pdgId()) == MC::PI0)
281  {
282  NumChildD0++;
283  }
284  else if (thisChild1->isNeutrino())
285  {
286  NumChildD0neutrinos++;
287  }
288  else if (thisChild1->isPhoton())
289  {
290  NumChildD0gammas++;
291  }
292  else if (std::abs(thisChild1->pdgId()) == MC::K0 || std::abs(thisChild1->pdgId()) == MC::K0L ||
293  std::abs(thisChild1->pdgId()) == MC::K0S)
294  {
295  NumChildD0++;
296  NumChildD0++;
297  }
298  else if (thisChild1->decayVtx())
299  {
300  for (size_t thisChild2_id = 0; thisChild2_id < thisChild1->decayVtx()->nOutgoingParticles(); thisChild2_id++)
301  {
302 
303  auto thisChild2 = thisChild1->decayVtx()->outgoingParticle(thisChild2_id);
304  if (!MC::isPhysical(thisChild2))
305  continue; // photos history line
306 
307  if (thisChild2->isElectron() || thisChild2->isMuon() ||
308  std::abs(thisChild2->pdgId()) == MC::PIPLUS || std::abs(thisChild2->pdgId()) == MC::KPLUS)
309  {
310  NumChildD0++;
311 
312  if ((thisChild2->pt() >= m_PtMinKpi) &&
313  (thisChild2->pt() < m_PtMaxKpi) &&
314  (std::abs(thisChild2->eta()) < m_EtaRangeKpi))
315  {
316  NumChildD0Charged++;
317 
318  if (NumChildD0Charged == 1)
319  {
320  D0Child1 = thisChild2;
321  ChargeD0Child2 = D0Child1->charge();
322  }
323  if (NumChildD0Charged == 2)
324  {
325  D0Child2 = thisChild2;
326  ChargeD0Child2 = D0Child2->charge();
327  }
328  if (thisChild2->isMuon())
329  {
330  NumChildD0mu++;
331  D0ChildMu = thisChild2;
332  }
333  }
334  }
335  else if (std::abs(thisChild2->pdgId()) == MC::PI0)
336  {
337  NumChildD0++;
338  }
339  else if (thisChild2->isNeutrino())
340  {
341  NumChildD0neutrinos++;
342  }
343  else if (thisChild2->isPhoton())
344  {
345  NumChildD0gammas++;
346  }
347  else if (std::abs(thisChild2->pdgId()) == MC::K0 || std::abs(thisChild2->pdgId()) == MC::K0L ||
348  std::abs(thisChild2->pdgId()) == MC::K0S)
349  {
350  NumChildD0++;
351  NumChildD0++;
352  }
353  else if (thisChild2->decayVtx())
354  {
355  NumChildD0++;
356  NumChildD0++;
357  }
358  else
359  {
360  NumChildD0++;
361  NumChildD0++;
362  ATH_MSG_DEBUG("xAODMuDstarFilter: unexpected D0 granddaughter = " << thisChild2->pdgId());
363  }
364  } // thisChild2
365  }
366  else
367  {
368  NumChildD0++;
369  NumChildD0++;
370  ATH_MSG_DEBUG("xAODMuDstarFilter: unexpected D0 daughter = " << thisChild1->pdgId());
371  }
372  } // thisChild1
373 
374  ATH_MSG_DEBUG("xAODMuDstarFilter: NumChildD0, NumChildD0Charged = " << NumChildD0 << " , " << NumChildD0Charged);
375 
376  if (NumChildD0 <= 3 && NumChildD0Charged == 2 && ChargeD0Child1 * ChargeD0Child2 < 0)
377  {
378  if (m_D0Kpi_only)
379  {
380  if (NumChildD0 == 2 && NumChildD0K == 1 && NumChildD0pi == 1){
381  NumD0++;
382  }
383  }
384  else
385  {
386  NumD0++;
387  }
388  }
389  } // D0
390 
391  ATH_MSG_DEBUG("xAODMuDstarFilter: NumD0 = " << NumD0);
392 
393  if (NumD0 == 1)
394  {
395 
396  if (pis_pdg * ChargeD0Child1 > 0) std::swap(D0Child1, D0Child2);
397  TLorentzVector p4_K;
398  p4_K.SetPtEtaPhiM(D0Child1->pt(), D0Child1->eta(), D0Child1->phi(), m_KaonMass);
399  TLorentzVector p4_pi;
400  p4_pi.SetPtEtaPhiM(D0Child2->pt(), D0Child2->eta(), D0Child2->phi(), m_PionMass);
401 
402  TLorentzVector p4_D0 = p4_K + p4_pi;
403  double mKpi = p4_D0.M();
404 
405  ATH_MSG_DEBUG("xAODMuDstarFilter: mKpi = " << mKpi);
406 
407  if (mKpi >= m_mKpiMin && mKpi <= m_mKpiMax)
408  {
409 
410  TLorentzVector p4_Dstar = p4_D0 + p4_pis;
411 
412  double delta_m = p4_Dstar.M() - mKpi;
413 
414  ATH_MSG_DEBUG("xAODMuDstarFilter: delta_m = " << delta_m);
415 
416  if (delta_m <= m_delta_m_Max)
417  {
418  NumDstars++;
419 
420  ATH_MSG_DEBUG("xAODMuDstarFilter: NumDstars = " << NumDstars);
421 
422  for (size_t i = 0; i < Muons.size(); ++i)
423  {
424 
425  if (NumChildD0mu == 1)
426  {
427  if (std::fabs(Muons[i]->pt() - D0ChildMu->pt()) < std::numeric_limits<double>::epsilon())
428  continue;
429  ATH_MSG_DEBUG("xAODMuDstarFilter: Mu(pT), D0Mu(pT) = " << Muons[i]->pt() << " , " << D0ChildMu->pt());
430  }
431 
432  TLorentzVector p4_Mu;
433  p4_Mu.SetPtEtaPhiM(Muons[i]->pt(), Muons[i]->eta(), Muons[i]->phi(), m_MuonMass);
434 
435  TLorentzVector p4_DstarMu = p4_Dstar + p4_Mu;
436 
437  ATH_MSG_DEBUG("xAODMuDstarFilter: p4_DstarMu.M() = " << p4_DstarMu.M());
438 
439  if (p4_DstarMu.M() <= m_DstarMu_m_Max)
440  {
441 
442  ATH_MSG_DEBUG("xAODMuDstarFilter: MuDstar candidate found");
443  ATH_MSG_DEBUG("xAODMuDstarFilter: p4_DstarMu.M() = " << p4_DstarMu.M());
444  ATH_MSG_DEBUG("xAODMuDstarFilter: NumChildD0, NumChildD0Charged = " << NumChildD0 << " , " << NumChildD0Charged);
445  ATH_MSG_DEBUG("xAODMuDstarFilter: NumChildD0K, NumChildD0pi, NumChildD0mu = " << NumChildD0K << " , " << NumChildD0pi << " , " << NumChildD0mu);
446 
447  if (NumChildD0mu == 1)
448  {
449 
450  ATH_MSG_DEBUG("xAODMuDstarFilter: Mu(pT), D0Mu(pT) = " << Muons[i]->pt() << " , " << D0ChildMu->pt());
451  }
452 
453  ATH_MSG_DEBUG("xAODMuDstarFilter: NumChildD0neutrinos, NumChildD0gammas = " << NumChildD0neutrinos << " , " << NumChildD0gammas);
454  ATH_MSG_DEBUG("xAODMuDstarFilter: pis_pdg, K_pdg, ChargeD0Child1, ChargeD0Child2 = " << pis_pdg << " , " << K_pdg << " , " << ChargeD0Child1 << " , " << ChargeD0Child2);
455 
456  setFilterPassed(true);
457  return StatusCode::SUCCESS;
458  }
459  } // for i
460 
461  } //delta_m
462  } // mKpi
463  } // NumD0
464  } // thisChild
465  } // PtMinDstar
466 
467  } // DSTAR
468 
469  } // pitr
470 
471 
472 
473  //
474  // if we get here we have failed
475  //
476  setFilterPassed(false);
477  return StatusCode::SUCCESS;
478 }
479 
480 
xAODMuDstarFilter::m_KaonMass
const double m_KaonMass
Definition: xAODMuDstarFilter.h:76
xAODMuDstarFilter::m_EtaRangePis
Gaudi::Property< double > m_EtaRangePis
Definition: xAODMuDstarFilter.h:58
xAODMuDstarFilter::m_D0Kpi_only
Gaudi::Property< bool > m_D0Kpi_only
Definition: xAODMuDstarFilter.h:64
xAODMuDstarFilter::m_mKpiMax
Gaudi::Property< double > m_mKpiMax
Definition: xAODMuDstarFilter.h:67
xAODMuDstarFilter::m_PtMaxMuon
Gaudi::Property< double > m_PtMaxMuon
Definition: xAODMuDstarFilter.h:48
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:64
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
xAODMuDstarFilter::filterEvent
virtual StatusCode filterEvent()
Definition: xAODMuDstarFilter.cxx:95
xAODMuDstarFilter::m_xaodTruthParticleContainerNameGenKey
SG::ReadHandleKey< xAOD::TruthParticleContainer > m_xaodTruthParticleContainerNameGenKey
Definition: xAODMuDstarFilter.h:79
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:79
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
test_pyathena.pt
pt
Definition: test_pyathena.py:11
xAODMuDstarFilter::xAODMuDstarFilter
xAODMuDstarFilter(const std::string &name, ISvcLocator *pSvcLocator)
Definition: xAODMuDstarFilter.cxx:49
xAODMuDstarFilter::m_EtaRangeMuon
Gaudi::Property< double > m_EtaRangeMuon
Definition: xAODMuDstarFilter.h:49
xAODMuDstarFilter::m_PtMaxKpi
Gaudi::Property< double > m_PtMaxKpi
Definition: xAODMuDstarFilter.h:61
xAODMuDstarFilter::m_PtMaxDstar
Gaudi::Property< double > m_PtMaxDstar
Definition: xAODMuDstarFilter.h:52
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
xAOD::TruthVertex_v1::y
float y() const
Vertex y displacement.
xAODMuDstarFilter::m_PionMass
const double m_PionMass
Definition: xAODMuDstarFilter.h:75
xAODMuDstarFilter::m_PtMinDstar
Gaudi::Property< double > m_PtMinDstar
Definition: xAODMuDstarFilter.h:51
MC::isPhysical
bool isPhysical(const T &p)
Definition: HepMCHelpers.h:32
xAODMuDstarFilter::m_PtMinMuon
Gaudi::Property< double > m_PtMinMuon
Definition: xAODMuDstarFilter.h:47
GenFilter
Base class for event generator filtering modules.
Definition: GenFilter.h:30
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
lumiFormat.i
int i
Definition: lumiFormat.py:92
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
xAOD::TruthParticle_v1
Class describing a truth particle in the MC record.
Definition: TruthParticle_v1.h:41
xAODMuDstarFilter::m_delta_m_Max
Gaudi::Property< double > m_delta_m_Max
Definition: xAODMuDstarFilter.h:69
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
xAODMuDstarFilter::m_mKpiMin
Gaudi::Property< double > m_mKpiMin
Definition: xAODMuDstarFilter.h:66
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
WriteCalibToCool.swap
swap
Definition: WriteCalibToCool.py:94
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
xAODMuDstarFilter::m_MuonMass
const double m_MuonMass
Definition: xAODMuDstarFilter.h:74
TruthVertex.h
xAOD::TruthParticle_v1::decayVtx
const TruthVertex_v1 * decayVtx() const
The decay vertex of this particle.
xAODMuDstarFilter::m_DstarMu_m_Max
Gaudi::Property< double > m_DstarMu_m_Max
Definition: xAODMuDstarFilter.h:71
xAOD::TruthVertex_v1
Class describing a truth vertex in the MC record.
Definition: TruthVertex_v1.h:41
xAODMuDstarFilter::m_EtaRangeDstar
Gaudi::Property< double > m_EtaRangeDstar
Definition: xAODMuDstarFilter.h:53
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
xAODMuDstarFilter::m_EtaRangeKpi
Gaudi::Property< double > m_EtaRangeKpi
Definition: xAODMuDstarFilter.h:62
xAODMuDstarFilter::filterInitialize
virtual StatusCode filterInitialize()
Definition: xAODMuDstarFilter.cxx:58
xAODMuDstarFilter.h
xAODMuDstarFilter::m_PtMinPis
Gaudi::Property< double > m_PtMinPis
Definition: xAODMuDstarFilter.h:56
xAOD::TruthVertex_v1::x
float x() const
Vertex x displacement.
xAODMuDstarFilter::m_RxyMinDstar
Gaudi::Property< double > m_RxyMinDstar
Definition: xAODMuDstarFilter.h:54
MC::isBeam
bool isBeam(const T &p)
Definition: HepMCHelpers.h:28
xAODMuDstarFilter::m_PtMaxPis
Gaudi::Property< double > m_PtMaxPis
Definition: xAODMuDstarFilter.h:57
xAODMuDstarFilter::m_PtMinKpi
Gaudi::Property< double > m_PtMinKpi
Definition: xAODMuDstarFilter.h:60
TruthParticle.h
xAODMuDstarFilter::~xAODMuDstarFilter
virtual ~xAODMuDstarFilter()
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
xAOD::TruthVertex_v1::outgoingParticle
const TruthParticle_v1 * outgoingParticle(size_t index) const
Get one of the outgoing particles.
Definition: TruthVertex_v1.cxx:121
xAOD::TruthParticle_v1::charge
double charge() const
Physical charge.
HepMCHelpers.h