ATLAS Offline Software
TruthCollectionMaker.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 // TruthCollectionMaker.cxx
7 // Author: James Catmore (James.Catmore@cern.ch)
8 // Removes all truth particles/vertices which do not pass a user-defined cut
9 
10 // Base class
12 // EDM includes
16 // Handles
18 // To look up which generator is being used
19 #include "StoreGate/StoreGateSvc.h"
23 // STL Includes
24 #include <vector>
25 #include <string>
26 #include <numeric>
27 
28 // Constructor
30  const std::string& n,
31  const IInterface* p)
33  , m_ntotpart(0)
34  , m_npasspart(0)
35  , m_metaStore( "MetaDataStore", n )
36 {
37  declareInterface<DerivationFramework::IAugmentationTool>(this);
38  declareProperty("MetaDataStore", m_metaStore );
39 }
40 
41 // Destructor
43 }
44 
45 // Athena initialize and finalize
47 {
48  ATH_MSG_VERBOSE("initialize() ...");
49  // Input truth particles
50  ATH_CHECK( m_particlesKey.initialize() );
51  ATH_MSG_INFO("Using " << m_particlesKey.key() << " as the input truth container key");
52 
53  // Output (new) truth particles
54  ATH_CHECK(m_outputParticlesKey.initialize());
55  ATH_MSG_INFO("New truth particles container key: " << m_outputParticlesKey.key() );
56 
57  if (m_partString.empty()) {
58  ATH_MSG_FATAL("No selection string provided");
59  return StatusCode::FAILURE;
60  } else {ATH_MSG_INFO("Truth particle selection string: " << m_partString );}
61 
62  // Set up the text-parsing machinery for thinning the truth directly according to user cuts
63  if (!m_partString.empty()) {
64  ATH_CHECK( initializeParser(m_partString) );
65  }
66 
67  // Initialise read handle keys
68  ATH_CHECK(m_originReadDecorKey.initialize());
69  ATH_CHECK(m_typeReadDecorKey.initialize());
70  ATH_CHECK(m_outcomeReadDecorKey.initialize());
71  ATH_CHECK(m_classificationReadDecorKey.initialize());
72 
73  // Initialise decorator handle keys
74  ATH_CHECK(m_linkDecoratorKey.initialize());
75  ATH_CHECK(m_originDecoratorKey.initialize());
76  ATH_CHECK(m_typeDecoratorKey.initialize());
77  ATH_CHECK(m_outcomeDecoratorKey.initialize());
78  ATH_CHECK(m_classificationDecoratorKey.initialize());
79  ATH_CHECK(m_motherIDDecoratorKey.initialize());
80  ATH_CHECK(m_daughterIDDecoratorKey.initialize());
81  ATH_CHECK(m_hadronOriginDecoratorKey.initialize());
82 
83  return StatusCode::SUCCESS;
84 }
85 
87 {
88  ATH_MSG_VERBOSE("finalize() ...");
89  //ATH_MSG_INFO("Processed "<< m_ntotvtx <<" truth vertices, "<< m_npassvtx << " were retained ");
90  ATH_MSG_INFO("Processed "<< m_ntotpart <<" truth particles, "<< m_npasspart << " were retained ");
91  ATH_CHECK( finalizeParser() );
92  return StatusCode::SUCCESS;
93 }
94 
95 // Selection and collection creation
97 {
98  // Event context for AthenaMT
99  const EventContext& ctx = Gaudi::Hive::currentContext();
100 
101  // Set up for some metadata handling
102  // TODO: this isn't MT compliant. This information should go into the config level and avoid meta store
103  static const bool is_sherpa = [this]() {
104  bool is_sherpa = false;
105  if (m_metaStore->contains<xAOD::TruthMetaDataContainer>("TruthMetaData")){
106  // Note that I'd like to get this out of metadata in general, but it seems that the
107  // metadata isn't fully available in initialize, and since this is a const function
108  // I can only do the retrieve every event, rather than lazy-initializing, since this
109  // metadata ought not change during a run
110  const xAOD::TruthMetaDataContainer* truthMetaData(nullptr);
111  // Shamelessly stolen from the file meta data tool
112  if (m_metaStore->retrieve(truthMetaData).isSuccess() && !truthMetaData->empty()){
113  // Let's just be super sure...
114  const std::string gens = truthMetaData->at(0)->generators();
115  is_sherpa = (gens.find("sherpa")==std::string::npos &&
116  gens.find("Sherpa")==std::string::npos &&
117  gens.find("SHERPA")==std::string::npos) ? false : true;
118  } // Seems to be the only sure way...
119  else {
120  ATH_MSG_WARNING("Found xAODTruthMetaDataContainer empty! Configuring to be NOT Sherpa.");
121  }
122  ATH_MSG_INFO("From metadata configured: Sherpa? " << is_sherpa);
123  } else {
124  ATH_MSG_WARNING("Could not find metadata container in storegate; assuming NOT Sherpa");
125  }
126  return is_sherpa;
127  }();
128 
129  // Retrieve truth collections
130  SG::ReadHandle<xAOD::TruthParticleContainer> truthParticles(m_particlesKey,ctx);
131  if (!truthParticles.isValid()) {
132  ATH_MSG_ERROR("Couldn't retrieve TruthParticle collection with name " << m_particlesKey);
133  return StatusCode::FAILURE;
134  }
135 
136  // Create the new particle containers and WriteHandles
137  SG::WriteHandle<xAOD::TruthParticleContainer> newParticlesWriteHandle(m_outputParticlesKey, ctx);
138  ATH_CHECK(newParticlesWriteHandle.record(std::make_unique<xAOD::TruthParticleContainer>(),
139  std::make_unique<xAOD::TruthParticleAuxContainer>()));
140  ATH_MSG_DEBUG( "Recorded new TruthParticleContainer with key: " << (m_outputParticlesKey.key()));
141 
142  // Set up a mask with the same entries as the full collections
143  unsigned int nParticles = truthParticles->size();
144  m_ntotpart += nParticles;
145 
146  // Set up decor readers
147  SG::ReadDecorHandle<xAOD::TruthParticleContainer, unsigned int > originReadDecor(m_originReadDecorKey, ctx);
148  SG::ReadDecorHandle<xAOD::TruthParticleContainer, unsigned int > typeReadDecor(m_typeReadDecorKey, ctx);
149  SG::ReadDecorHandle<xAOD::TruthParticleContainer, unsigned int > outcomeReadDecor(m_outcomeReadDecorKey, ctx);
150  SG::ReadDecorHandle<xAOD::TruthParticleContainer, unsigned int > classificationReadDecor(m_classificationReadDecorKey, ctx);
151 
152  // Set up decorators
154  SG::WriteDecorHandle<xAOD::TruthParticleContainer, unsigned int > originDecorator(m_originDecoratorKey, ctx);
155  SG::WriteDecorHandle<xAOD::TruthParticleContainer, unsigned int > typeDecorator(m_typeDecoratorKey, ctx);
156  SG::WriteDecorHandle<xAOD::TruthParticleContainer, unsigned int > outcomeDecorator(m_outcomeDecoratorKey, ctx);
157  SG::WriteDecorHandle<xAOD::TruthParticleContainer, unsigned int > classificationDecorator(m_classificationDecoratorKey, ctx);
158  SG::WriteDecorHandle< xAOD::TruthParticleContainer, int > motherIDDecorator(m_motherIDDecoratorKey, ctx);
159  SG::WriteDecorHandle< xAOD::TruthParticleContainer, int > daughterIDDecorator(m_daughterIDDecoratorKey, ctx);
160  SG::WriteDecorHandle< xAOD::TruthParticleContainer, int > hadronOriginDecorator(m_hadronOriginDecoratorKey, ctx);
161 
162  // Execute the text parsers and update the mask
163  if (!m_partString.empty()) {
164  std::vector<int> entries = m_parser->evaluateAsVector();
165  unsigned int nEntries = entries.size();
166  // check the sizes are compatible
167  if (nParticles != nEntries ) {
168  ATH_MSG_ERROR("Sizes incompatible! Are you sure your selection string used TruthParticles?");
169  return StatusCode::FAILURE;
170  } else {
171  // add relevant particles to new collection
172 
173  //---------------
174  //This is some code to *add* new particles. Probably a good idea to break this off as a sub-function, but I'll let James C decide where that should go.
175  //---------------
176 
177  //Let's check if we want to build W/Z bosons
178  bool SherpaW = false;
179  bool SherpaZ = false;
180  if (m_partString.value().find("24") != std::string::npos && m_do_sherpa && is_sherpa) {
181  SherpaW = true;
182  }
183  if (m_partString.value().find("23") != std::string::npos && m_do_sherpa && is_sherpa) {
184  SherpaZ = true;
185  }
186  if ((SherpaW or SherpaZ) && is_sherpa){
187  if (std::accumulate(entries.begin(),entries.end(),0) > 0){ //We actually have some W and Z bosons in there.
188  SherpaW = false;
189  SherpaZ = false;
190  }
191  }
192 
193  if ((SherpaW || SherpaZ) && is_sherpa){
194  // Currently only handles un-ambiguous cases
195  std::vector<const xAOD::TruthParticle*> status_nonPhysical;
196  for (unsigned int i=0; i<nParticles; ++i) {
197  // Nullptr check
198  if (!truthParticles->at(i)) continue;
199  // Only collect leptons
200  if (!MC::isSMLepton(truthParticles->at(i))) continue;
201  // Gather by status
202  if (!MC::isPhysical(truthParticles->at(i))) status_nonPhysical.push_back( truthParticles->at(i) );
203  } // Done with loop over truth particles
204  // Boson cases that we can actually deal with -- generically up to VVV
205  if ((status_nonPhysical.size()==2 || status_nonPhysical.size()==4 || status_nonPhysical.size()==6) && (SherpaZ || SherpaW)){
206  // Basic boson pairing...
207  int gens[3] = {0,0,0};
208  for (size_t i=0;i<status_nonPhysical.size();++i){
209  if (status_nonPhysical[i]->absPdgId()<13) gens[0]++;
210  else if (status_nonPhysical[i]->absPdgId()<15) gens[1]++;
211  else gens[2]++;
212  } // Loop over status_nonPhysical particles
213  // Should only have even numbers per generation. Any number greater than 2 or ==1 and we're dead
214  if (gens[0]>2 || gens[0]==1 || gens[1]>2 || gens[1]==1 || gens[2]>2 || gens[2]==1){
215  // In agreeing with Sherpa authors, these are Q-M ambiguous states. Do not let users be evil.
216  ATH_MSG_VERBOSE("Too many leptons of one generation. Cannot make bosons. Give up");
217  return StatusCode::SUCCESS;
218  }
219  std::vector<const xAOD::TruthParticle*> boson;
220  for (size_t i=0;i<status_nonPhysical.size();++i){
221  if (status_nonPhysical[i]->absPdgId()<13) boson.push_back(status_nonPhysical[i]);
222  else if (gens[0]==0 && status_nonPhysical[i]->absPdgId()<15) boson.push_back(status_nonPhysical[i]);
223  else if (gens[0]==0 && gens[1]==0) boson.push_back(status_nonPhysical[i]);
224  if (boson.size()==2){
225  // Make a boson! Just have to figure out _which_ boson!
226  int pdg_id=0;
227  // Easy case: Z boson
228  if (boson[0]->pdgId()==-boson[1]->pdgId()) pdg_id=23;
229  else if (std::abs(boson[0]->pdgId()+boson[1]->pdgId())!=1){
230  // No idea what you were
231  ATH_MSG_WARNING("Do not know how to interpret as a boson: " << boson[0]->pdgId() << " " << boson[1]->pdgId());
232  } else {
233  // W boson
234  pdg_id=24*(boson[0]->pdgId()+boson[1]->pdgId());
235  }
236  if ( (SherpaW && std::abs(pdg_id)==24) ||
237  (SherpaZ && pdg_id==23) ){
238  // Make a Z or a W
239  xAOD::TruthParticle* xTruthParticle = new xAOD::TruthParticle();
240  newParticlesWriteHandle->push_back( xTruthParticle );
241  if (m_keep_navigation_info){
242  if (boson[0]->hasProdVtx()) {
243  if ((boson[0]->prodVtx()->nIncomingParticles() > 0) && (boson[0]->prodVtx()->incomingParticle(0)!=nullptr)) {
244  motherIDDecorator(*xTruthParticle) = boson[0]->prodVtx()->incomingParticle(0)->pdgId();
245  } else {motherIDDecorator(*xTruthParticle) = 0;}
246  } else {motherIDDecorator(*xTruthParticle) = 0;}
247  if (boson[0]->hasDecayVtx()) {
248  if ((boson[0]->decayVtx()->nOutgoingParticles() > 0) && (boson[0]->decayVtx()->outgoingParticle(0)!=nullptr)) {
249  daughterIDDecorator(*xTruthParticle) = boson[0]->decayVtx()->outgoingParticle(0)->pdgId();
250  } else {daughterIDDecorator(*xTruthParticle) = 0;}
251  } else {daughterIDDecorator(*xTruthParticle) = 0;}
252  }
253  // Set with what makes sense here
254  xTruthParticle->setPdgId(pdg_id);
255  // Set dummy values
256  xTruthParticle->setBarcode(HepMC::INVALID_PARTICLE_ID);
257  xTruthParticle->setStatus(3);
258  // Use the sum of the momenta
259  xAOD::IParticle::FourMom_t new_mom = boson[0]->p4()+boson[1]->p4();
260  xTruthParticle->setM(new_mom.M());
261  xTruthParticle->setPx(new_mom.Px());
262  xTruthParticle->setPy(new_mom.Py());
263  xTruthParticle->setPz(new_mom.Pz());
264  xTruthParticle->setE(new_mom.E());
265  }
266  // Now clear the vectors
267  boson.clear();
268  // And move to the next generation
269  if (gens[0]==0 && gens[1]==0) gens[2]=0;
270  else if (gens[0]==0) gens[1]=0;
271  else gens[0]=0;
272  } // Done making a boson
273  } // Done looping over particles
274  }
275  if (status_nonPhysical.size()==1 || status_nonPhysical.size()==3 || status_nonPhysical.size()==5 || status_nonPhysical.size()>6){
276  ATH_MSG_WARNING(status_nonPhysical.size() << " leptons found in the Sherpa event record. Not sure how to deal with this.");
277  }
278  return StatusCode::SUCCESS;
279  }
280  for (unsigned int i=0; i<nParticles; ++i) {
281  ElementLink<xAOD::TruthParticleContainer> eltp(*truthParticles,i);
282  if (entries[i]==1) {
283  //In TRUTH3, we want to remove all particles but the first and last in a decay chain. This is off in TRUTH1. The first and last particles in the decay chain are decorated as such.
284 
285  const xAOD::TruthParticle* theParticle = (*truthParticles)[i];
286  if (m_do_compress){
287  bool same_as_mother = false;
288  bool same_as_daughter = false;
289  if (theParticle->hasProdVtx()){
290  if ((theParticle->prodVtx()->nIncomingParticles() > 0) && (theParticle->prodVtx()->incomingParticle(0)!=nullptr)) {
291  if (theParticle->prodVtx()->incomingParticle(0)->pdgId() == theParticle->pdgId()){
292  same_as_mother = true;
293  }
294  }
295  }
296  if (theParticle->hasDecayVtx()){
297  if ((theParticle->decayVtx()->nOutgoingParticles() > 0) && (theParticle->decayVtx()->outgoingParticle(0)!=nullptr)) {
298  if (theParticle->decayVtx()->outgoingParticle(0)->pdgId() == theParticle->pdgId()){
299  same_as_daughter = true;
300  }
301  }
302  }
303  if (same_as_mother && same_as_daughter){
304  entries[i]=0;
305  continue;
306  }
307  }
308  xAOD::TruthParticle* xTruthParticle = new xAOD::TruthParticle();
309  newParticlesWriteHandle->push_back( xTruthParticle );
310  if (m_keep_navigation_info){
311  if (theParticle->hasProdVtx()) {
312  if ((theParticle->prodVtx()->nIncomingParticles() > 0) && (theParticle->prodVtx()->incomingParticle(0)!=nullptr)) {
313  motherIDDecorator(*xTruthParticle) = theParticle->prodVtx()->incomingParticle(0)->pdgId();
314  } else {motherIDDecorator(*xTruthParticle) = 0;}
315  } else {motherIDDecorator(*xTruthParticle) = 0;}
316  if (theParticle->hasDecayVtx()) {
317  if ((theParticle->decayVtx()->nOutgoingParticles() > 0) && (theParticle->decayVtx()->outgoingParticle(0)!=nullptr)) {
318  daughterIDDecorator(*xTruthParticle) = theParticle->decayVtx()->outgoingParticle(0)->pdgId();
319  } else {daughterIDDecorator(*xTruthParticle) = 0;}
320  } else {daughterIDDecorator(*xTruthParticle) = 0;}
321  }
322  // Fill with numerical content
323  *xTruthParticle=*theParticle;
324  // Copy over the decorations if they are available
325  typeDecorator(*xTruthParticle) =
326  typeReadDecor.withDefault(*theParticle, 0);
327 
328  originDecorator(*xTruthParticle) =
329  originReadDecor.withDefault(*theParticle, 0);
330 
331  outcomeDecorator(*xTruthParticle) =
332  outcomeReadDecor.withDefault(*theParticle, 0);
333 
334  classificationDecorator(*xTruthParticle) =
335  classificationReadDecor.withDefault(*theParticle, 0);
336 
337  if (m_outputParticlesKey.key()=="TruthHFHadrons"){
338  static const SG::ConstAccessor<int> TopHadronOriginFlagAcc("TopHadronOriginFlag");
339  hadronOriginDecorator(*xTruthParticle) =
340  TopHadronOriginFlagAcc.withDefault (*theParticle, 0);
341  }
342 
343  if(m_keep_navigation_info) linkDecorator(*xTruthParticle) = eltp;
344  }
345  }
346  }
347  // Count the mask
348  for (unsigned int i=0; i<nParticles; ++i) if (entries[i]) ++m_npasspart;
349  }
350 
351  return StatusCode::SUCCESS;
352 }
xAOD::TruthVertex_v1::nOutgoingParticles
size_t nOutgoingParticles() const
Get the number of outgoing particles.
xAOD::TruthParticle_v1::setStatus
void setStatus(int value)
Set status code.
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
SG::ReadDecorHandle::withDefault
const_reference_type withDefault(size_t index, const D &deflt)
Fetch the variable for one element, as a const reference.
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
xAOD::TruthParticle_v1::setE
void setE(float value)
Set the energy of the particle.
Definition: TruthParticle_v1.cxx:235
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
xAOD::TruthParticle_v1::setBarcode
void setBarcode(int value)
Set barcode.
TruthParticleContainer.h
accumulate
bool accumulate(AccumulateMap &map, std::vector< module_t > const &modules, FPGATrackSimMatrixAccumulator const &acc)
Accumulates an accumulator (e.g.
Definition: FPGATrackSimMatrixAccumulator.cxx:22
HepMC::INVALID_PARTICLE_ID
constexpr int INVALID_PARTICLE_ID
Definition: MagicNumbers.h:56
DerivationFramework::TruthCollectionMaker::addBranches
virtual StatusCode addBranches() const
Pass the thinning service
Definition: TruthCollectionMaker.cxx:96
xAOD::TruthParticle_v1::setPx
void setPx(float value)
Set the x component of the particle's momentum.
SG::ConstAccessor< int >
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
isSMLepton
bool isSMLepton(const T &p)
Definition: AtlasPID.h:143
xAOD::IParticle::FourMom_t
TLorentzVector FourMom_t
Definition of the 4-momentum type.
Definition: Event/xAOD/xAODBase/xAODBase/IParticle.h:69
TruthParticleAuxContainer.h
DerivationFramework::TruthCollectionMaker::TruthCollectionMaker
TruthCollectionMaker(const std::string &t, const std::string &n, const IInterface *p)
Definition: TruthCollectionMaker.cxx:29
MC::isPhysical
bool isPhysical(const T &p)
Identify if the particle is physical, i.e. is stable or decayed.
Definition: HepMCHelpers.h:51
xAOD::TruthParticle_v1::hasDecayVtx
bool hasDecayVtx() const
Check for a decay vertex on this particle.
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:210
xAOD::TruthParticle_v1::setM
void setM(float value)
Also store the mass.
Definition: TruthParticle_v1.cxx:241
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
SG::ReadDecorHandle
Handle class for reading a decoration on an object.
Definition: StoreGate/StoreGate/ReadDecorHandle.h:94
lumiFormat.i
int i
Definition: lumiFormat.py:85
beamspotman.n
n
Definition: beamspotman.py:731
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:37
SG::WriteDecorHandle
Handle class for adding a decoration to an object.
Definition: StoreGate/StoreGate/WriteDecorHandle.h:100
WriteDecorHandle.h
Handle class for adding a decoration to an object.
xAOD::TruthParticle
TruthParticle_v1 TruthParticle
Typedef to implementation.
Definition: Event/xAOD/xAODTruth/xAODTruth/TruthParticle.h:15
xAOD::TruthParticle_v1::hasProdVtx
bool hasProdVtx() const
Check for a production vertex on this particle.
Definition: TruthParticle_v1.cxx:74
xAOD::TruthParticle_v1::setPy
void setPy(float value)
Set the y component of the particle's momentum.
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
xAOD::TruthVertex_v1::incomingParticle
const TruthParticle_v1 * incomingParticle(size_t index) const
Get one of the incoming particles.
Definition: TruthVertex_v1.cxx:69
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
xAOD::TruthParticle_v1::decayVtx
const TruthVertex_v1 * decayVtx() const
The decay vertex of this particle.
xAOD::TruthParticle_v1::prodVtx
const TruthVertex_v1 * prodVtx() const
The production vertex of this particle.
Definition: TruthParticle_v1.cxx:80
DerivationFramework::TruthCollectionMaker::finalize
StatusCode finalize()
Definition: TruthCollectionMaker.cxx:86
ExpressionParserUser
Definition: ExpressionParserUser.h:107
xAOD::TruthParticle_v1::setPdgId
void setPdgId(int pid)
Set PDG ID code.
MagicNumbers.h
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:76
SG::WriteHandle::record
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
xAOD::TruthVertex_v1::nIncomingParticles
size_t nIncomingParticles() const
Get the number of incoming particles.
Definition: TruthVertex_v1.cxx:47
xAOD::TruthParticle_v1::setPz
void setPz(float value)
Set the z component of the particle's momentum.
entries
double entries
Definition: listroot.cxx:49
DerivationFramework::TruthCollectionMaker::m_metaStore
ServiceHandle< StoreGateSvc > m_metaStore
Handle on the metadata store for init.
Definition: TruthCollectionMaker.h:82
TruthCollectionMaker.h
DataVector::at
const T * at(size_type n) const
Access an element, as an rvalue.
ConstAccessor.h
Helper class to provide constant type-safe access to aux data.
AthAlgTool
Definition: AthAlgTool.h:26
xAOD::TruthParticle_v1::pdgId
int pdgId() const
PDG ID code.
dqBeamSpot.nEntries
int nEntries
Definition: dqBeamSpot.py:73
TruthMetaDataContainer.h
StoreGateSvc.h
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
DerivationFramework::TruthCollectionMaker::~TruthCollectionMaker
~TruthCollectionMaker()
Definition: TruthCollectionMaker.cxx:42
xAOD::TruthVertex_v1::outgoingParticle
const TruthParticle_v1 * outgoingParticle(size_t index) const
Get one of the outgoing particles.
Definition: TruthVertex_v1.cxx:119
DataVector::empty
bool empty() const noexcept
Returns true if the collection is empty.
DerivationFramework::TruthCollectionMaker::initialize
StatusCode initialize()
Definition: TruthCollectionMaker.cxx:46
HepMCHelpers.h
SG::ConstAccessor::withDefault
const_reference_type withDefault(const ELT &e, const T &deflt) const
Fetch the variable for one element, as a const reference, with a default.