ATLAS Offline Software
Macros | Functions
TruthDerivationTester.cxx File Reference
#include "POOLRootAccess/TEvent.h"
#include "GaudiKernel/SmartIF.h"
#include <boost/program_options.hpp>
#include "PATInterfaces/MessageCheck.h"
#include "AsgTools/AnaToolHandle.h"
#include "PMGAnalysisInterfaces/IPMGTruthWeightTool.h"
#include "xAODTruth/TruthEventContainer.h"
#include "xAODTruth/TruthParticleContainer.h"
#include "xAODEventInfo/EventInfo.h"
#include "xAODMissingET/MissingETContainer.h"
#include "xAODJet/JetContainer.h"
#include "xAODTruth/TruthVertexContainer.h"
#include "xAODTruth/TruthMetaDataContainer.h"
#include <TFile.h>
#include <TChain.h>
#include <TH1D.h>
#include <iostream>
#include <cmath>

Go to the source code of this file.

Macros

#define CHECK_RETRIEVE(container, name)
 

Functions

int countChildren (const xAOD::TruthParticle *p)
 
int countParents (const xAOD::TruthParticle *p)
 
int main (int argc, char **argv)
 

Macro Definition Documentation

◆ CHECK_RETRIEVE

#define CHECK_RETRIEVE (   container,
  name 
)
Value:
{ \
if (!event.retrieve( container , name ).isSuccess()){ \
Error( APP_NAME , "Could not load event %s from the file!" , name ); \
throw std::runtime_error("Container retrieval failed"); \
} \
}

Definition at line 56 of file TruthDerivationTester.cxx.

Function Documentation

◆ countChildren()

int countChildren ( const xAOD::TruthParticle p)

Definition at line 63 of file TruthDerivationTester.cxx.

63  {
64  if (!p) return 0;
65  int children = 0;
66  for (size_t n=0;n<p->nChildren();++n){
67  children += countChildren( p->child(n) );
68  }
69  return children;
70 }

◆ countParents()

int countParents ( const xAOD::TruthParticle p)

Definition at line 73 of file TruthDerivationTester.cxx.

73  {
74  if (!p) return 0;
75  int parents = 0;
76  for (size_t n=0;n<p->nParents();++n){
77  parents += countParents( p->parent(n) );
78  }
79  return parents;
80 }

◆ main()

int main ( int  argc,
char **  argv 
)

Definition at line 83 of file TruthDerivationTester.cxx.

83  {
84 
85  // The application's name:
86  const char* APP_NAME = argv[ 0 ];
87 
88  // Make sure things know we are not in StatusCode land
89  using namespace asg::msgUserCode;
90  ANA_CHECK_SET_TYPE (int);
91 
92  // Setup for reading -- if this fails, we have major problems
93 #ifdef XAOD_STANDALONE
94  if ( ! xAOD::Init().isSuccess() ) {
95  throw std::runtime_error("Cannot initialise xAOD access !");
96  }
97  ANA_MSG_INFO("Using xAOD access");
98 #else
99  SmartIF<IAppMgrUI> app = POOL::Init();
100  ANA_MSG_INFO("Using POOL access");
101 #endif
102 
103  // Get and parse the command-line arguments
104  po::options_description desc("Running a simple truth analysis");
105  std::string outputName,inputName;
106  desc.add_options()
107  ("help,h", "print usage and exit")
108  ("output,o", po::value<std::string>(&outputName), "Output file name")
109  ("input,i", po::value<std::string>(&inputName), "Input file name")
110  ("nevents", po::value<int>()->default_value(-1), "number of events to run on (set to -1 to ignore it")
111  ;
112 
113  po::variables_map vm;
114  po::store( po::command_line_parser(argc, argv).options(desc).run(), vm);
115  po::notify(vm);
116 
117  if (vm.count("help")) {
118  std::cout << desc << std::endl;
119  return 1;
120  }
121 
122  long long nevents = -1;
123  if (vm.count("nevents")) {
124  nevents = vm["nevents"].as<int>();
125  }
126 
127  Info( "Reading from %s and writing to %s" , inputName.c_str() , outputName.c_str() );
128 
129  // Input chain
130  std::unique_ptr< TFile > ifile( TFile::Open( inputName.c_str() , "READ" ) );
131  ANA_CHECK( ifile.get() );
132 #ifdef XAOD_STANDALONE
134 #else
136 #endif
137  ANA_CHECK( event.readFrom( ifile.get() ) );
138 
139  // Load metadata
140  event.getEntries();
141 
142  // Make some temporary variables that we'll get out during the event loop
143  const size_t nParticleContainers = 9;
144  std::string particleKeyList[nParticleContainers] = { "TruthElectrons", "TruthMuons", "TruthPhotons", "TruthTaus", "TruthNeutrinos", "TruthBSM", "TruthBottom", "TruthTop", "TruthBoson" };
145  const xAOD::TruthEventContainer* xTruthEventContainer(nullptr);
146  const xAOD::EventInfo* xEventInfo(nullptr);
147  const xAOD::JetContainer* smallRJets(nullptr);
148  const xAOD::JetContainer* largeRJets(nullptr);
149  const xAOD::TruthMetaDataContainer* truthMeta(nullptr);
150  const xAOD::MissingETContainer* truthMET(nullptr);
151  const xAOD::TruthParticleContainer * truthParticles[nParticleContainers];
152  for (size_t n=0;n<nParticleContainers;++n) truthParticles[n] = nullptr;
153 
154 /*
155  Missing full collections with aux: TruthBosonsWithDecayParticles, TruthBosonsWithDecayVertices
156 */
157  // Make histograms
158  // MET histograms
159  TH1D* h_metNonInt = new TH1D("MET_NonInt","",50,0,500.);
160  TH1D* h_metInt = new TH1D("MET_Int","",50,0,200.);
161  TH1D* h_metIntOut = new TH1D("MET_IntOut","",50,0,100.);
162  TH1D* h_metIntMuons = new TH1D("MET_IntMuons","",50,0,300.);
163  // Particle collections: pT and connections for all
164  TH1D* h_partPt[nParticleContainers];
165  for (size_t n=0;n<nParticleContainers;++n) h_partPt[n] = new TH1D((particleKeyList[n]+"_pT").c_str(),"",50,0.,500.);
166  TH1D* h_partConn[nParticleContainers];
167  for (size_t n=0;n<nParticleContainers;++n) h_partConn[n] = new TH1D((particleKeyList[n]+"_Connections").c_str(),"",35,-10,25);
168  // Isolation for e/y/u/tau
169  TH1D* h_elPtCone = new TH1D("ElPtCone","",50,0.,20.);
170  TH1D* h_elEtCone = new TH1D("ElEtCone","",50,0.,20.);
171  TH1D* h_muPtCone = new TH1D("MuPtCone","",50,0.,20.);
172  TH1D* h_muEtCone = new TH1D("MuEtCone","",50,0.,20.);
173  TH1D* h_phPtCone = new TH1D("PhPtCone","",50,0.,20.);
174  TH1D* h_phEtCone = new TH1D("PhEtCone","",50,0.,20.);
175  // MCTC decorations for e/y/u/tau/nu
176  TH1D* h_elType = new TH1D("ElType","",50,0,50);
177  TH1D* h_elOrig = new TH1D("ElOrigin","",50,0,50);
178  TH1D* h_muType = new TH1D("MuType","",50,0,50);
179  TH1D* h_muOrig = new TH1D("MuOrigin","",50,0,50);
180  TH1D* h_phType = new TH1D("PhType","",50,0,50);
181  TH1D* h_phOrig = new TH1D("PhOrigin","",50,0,50);
182  TH1D* h_taType = new TH1D("TaType","",50,0,50);
183  TH1D* h_taOrig = new TH1D("TaOrigin","",50,0,50);
184  TH1D* h_nuType = new TH1D("NuType","",50,0,50);
185  TH1D* h_nuOrig = new TH1D("NuOrigin","",50,0,50);
186  // Dressed momenta for e/mu/tau
187  TH1D* h_elDressedPt = new TH1D("ElDressedPt","",50,0.,200.);
188  TH1D* h_muDressedPt = new TH1D("MuDressedPt","",50,0.,200.);
189  TH1D* h_taDressedPt = new TH1D("TaDressedPt","",50,0.,200.);
190  // Truth jets: pT, three flavor classifiers
191  TH1D* h_jetPt = new TH1D("JetPt","",50,0,500.);
192  TH1D* h_jetFTAG = new TH1D("JetFTAG","",25,0,25);
193  TH1D* h_jetJeMe = new TH1D("JetJeMe","",25,0,25);
194  TH1D* h_jetFull = new TH1D("JetFull","",50,0,50);
195  // Large R : pT, tau2, D2
196  TH1D* h_jetLRPt = new TH1D("JetLRPt","",50,0,500.);
197  TH1D* h_jetLRT2 = new TH1D("JetLRT2","",50,0,500.);
198  TH1D* h_jetLRD2 = new TH1D("JetLRD2","",50,0,500.);
199  // Truth events: PDF info , cross section , filter outcome
200  TH1D* h_x1 = new TH1D("X1","",50,0,1.);
201  TH1D* h_x2 = new TH1D("X2","",50,0,1.);
202  TH1D* h_xsec = new TH1D("XSec","",50,0,1.);
203  TH1D* h_HTFilt = new TH1D("HTFilt","",50,0,1000.);
204  // Lazy for truth weights
205  asg::AnaToolHandle< PMGTools::IPMGTruthWeightTool > weightTool("PMGTools::PMGTruthWeightTool/PMGTruthWeightTool");
206  ANA_CHECK(weightTool.retrieve());
207 
208  // For the weights in the file
209  std::vector<TH1D*> h_weights;
210  // For testing the truth metadata
211  uint32_t channelNumber = 0;
212  std::vector<std::string> weightNames;
213 
214  // Into the event loop, with an optional cap
215  long long nEvents = nevents > 0 ? std::min(static_cast<long long>(event.getEntries()), nevents) : event.getEntries();
216  Info( APP_NAME , "Beginning event loop over %llu events." , nEvents );
217  for (long evt=0;evt<nEvents;++evt){
218  // Grab the data
219  event.getEntry(evt);
220  if (evt%1000==0) Info( APP_NAME , "Working on entry %lu" , evt );
221 
222  // Get the containers out
223  CHECK_RETRIEVE( xTruthEventContainer , "TruthEvents" )
224  CHECK_RETRIEVE( xEventInfo , "EventInfo" )
225  CHECK_RETRIEVE( smallRJets , "AntiKt4TruthDressedWZJets" )
226  CHECK_RETRIEVE( largeRJets , "AntiKt10TruthTrimmedPtFrac5SmallR20Jets" )
227  CHECK_RETRIEVE( truthMET , "MET_Truth" )
228  for (size_t n=0;n<nParticleContainers;++n){
229  CHECK_RETRIEVE( truthParticles[n] , particleKeyList[n].c_str() )
230  }
231 
232  if (!event.retrieveMetaInput( truthMeta , "TruthMetaData" ).isSuccess()){
233  Error( APP_NAME , "Could not load event TruthMetaData from the file!" );
234  throw std::runtime_error("Could not load event TruthMetaData from the file!");
235  }
236 
237  // Metadata check
238  if (truthMeta->size()>1){
239  Error( APP_NAME , "Truth metadata size: %lu . No one will look past item 0!" , truthMeta->size() );
240  throw std::runtime_error("Truth metadata size >1");
241  }
242  if (channelNumber==0){
243  channelNumber = (*truthMeta)[0]->mcChannelNumber();
244  weightNames = std::vector<std::string>((*truthMeta)[0]->weightNames());
245  Info( APP_NAME , "Got channel number %u and %lu weight names" , channelNumber , weightNames.size() );
246  }
247  if (channelNumber != (*truthMeta)[0]->mcChannelNumber()){
248  Error( APP_NAME , "Channel number changed mid-file! Was: %u now: %u " , channelNumber , (*truthMeta)[0]->mcChannelNumber() );
249  throw std::runtime_error("Channel number changed mid-file!");
250  }
251  if (weightNames != (*truthMeta)[0]->weightNames() ){
252  Error( APP_NAME , "Weights have changed!" );
253  for (size_t n=0;n<std::max( weightNames.size() , (*truthMeta)[0]->weightNames().size() );++n){
254  std::cerr << " " << n << " ";
255  if (n<weightNames.size()) std::cerr << weightNames[n] << " ";
256  else std::cerr << "- ";
257  if (n<(*truthMeta)[0]->weightNames().size()) std::cerr << (*truthMeta)[0]->weightNames()[n] << " ";
258  else std::cerr << "- ";
259  std::cerr << std::endl;
260  }
261  throw std::runtime_error("Weights have changed!");
262  }
263  // Event weight handling
264  if (h_weights.size()==0){
265  // First event, init!
266  for (auto & name : weightNames ){
267  h_weights.push_back( new TH1D(("h_W_"+name).c_str(),"",100,-10.,10.) );
268  }
269  h_weights.push_back( new TH1D("h_W_nominalTest","",100,-10.,10.) );
270  }
271  for (size_t n=0;n<weightNames.size();++n) h_weights[n]->Fill( weightTool->getWeight(xEventInfo,weightNames[n]) );
272  // Eventually this should be the nominal weight without needing to give an explicit name
273  h_weights[weightNames.size()]->Fill( weightTool->getWeight(xEventInfo," nominal ") );
274  // Event info
275  float x1=0.,x2=0.;
276  (*xTruthEventContainer)[0]->pdfInfoParameter( x1 , xAOD::TruthEvent::X1 );
277  (*xTruthEventContainer)[0]->pdfInfoParameter( x2 , xAOD::TruthEvent::X2 );
278  h_x1->Fill( x1 );
279  h_x2->Fill( x2 );
280  h_xsec->Fill( (*xTruthEventContainer)[0]->crossSection() );
281  h_HTFilt->Fill( xEventInfo->auxdata<float>("GenFiltHT") );
282  // For MET: NonInt, Int, IntOut, IntMuons
283  h_metNonInt->Fill( (*truthMET)["NonInt"]->met()*0.001 );
284  h_metNonInt->Fill( (*truthMET)["Int"]->met()*0.001 );
285  h_metNonInt->Fill( (*truthMET)["IntOut"]->met()*0.001 );
286  h_metNonInt->Fill( (*truthMET)["IntMuons"]->met()*0.001 );
287  // Truth particles
288  for (size_t n=0;n<nParticleContainers;++n){ // PT and connections for all
289  for (const auto * p : *truthParticles[n]){
290  h_partPt[n]->Fill( p->pt() );
291  h_partConn[n]->Fill( countChildren( p ) );
292  h_partConn[n]->Fill( -1-countParents( p ) );
293  }
294  }
295  for (const auto * p : *truthParticles[0]){ // Electrons
296  h_elPtCone->Fill( p->auxdata<float>("ptcone30")*0.001 );
297  h_elEtCone->Fill( p->auxdata<float>("etcone20")*0.001 );
298  h_elDressedPt->Fill( p->auxdata<float>("pt_dressed")*0.001 );
299  h_elType->Fill( p->auxdata<unsigned int>("classifierParticleType") );
300  h_elOrig->Fill( p->auxdata<unsigned int>("classifierParticleOrigin") );
301  }
302  for (const auto * p : *truthParticles[1]){ // Muons
303  h_muPtCone->Fill( p->auxdata<float>("ptcone30")*0.001 );
304  h_muEtCone->Fill( p->auxdata<float>("etcone20")*0.001 );
305  h_muDressedPt->Fill( p->auxdata<float>("pt_dressed")*0.001 );
306  h_muType->Fill( p->auxdata<unsigned int>("classifierParticleType") );
307  h_muOrig->Fill( p->auxdata<unsigned int>("classifierParticleOrigin") );
308  }
309  for (const auto * p : *truthParticles[2]){ // Photons
310  h_phPtCone->Fill( p->auxdata<float>("ptcone20")*0.001 );
311  h_phEtCone->Fill( p->auxdata<float>("etcone20")*0.001 );
312  h_phType->Fill( p->auxdata<unsigned int>("classifierParticleType") );
313  h_phOrig->Fill( p->auxdata<unsigned int>("classifierParticleOrigin") );
314  }
315  for (const auto * p : *truthParticles[3]){ // Taus
316  h_taDressedPt->Fill( p->auxdata<float>("pt_vis_dressed")*0.001 );
317  h_taType->Fill( p->auxdata<unsigned int>("classifierParticleType") );
318  h_taOrig->Fill( p->auxdata<unsigned int>("classifierParticleOrigin") );
319  }
320  for (const auto * p : *truthParticles[4]){ // Neutrinos
321  h_nuType->Fill( p->auxdata<unsigned int>("classifierParticleType") );
322  h_nuOrig->Fill( p->auxdata<unsigned int>("classifierParticleOrigin") );
323  }
324  for (const auto * j : *smallRJets){ // Small-R jets
325  h_jetPt->Fill( j->pt()*0.001 );
326  h_jetFTAG->Fill( j->auxdata<int>("HadronConeExclTruthLabelID") );
327  h_jetJeMe->Fill( j->auxdata<int>("PartonTruthLabelID") );
328  h_jetFull->Fill( j->auxdata<int>("TrueFlavor") );
329  }
330  for (const auto * j : *largeRJets){ // Large-R jets
331  h_jetLRPt->Fill( j->pt()*0.001 );
332  h_jetLRT2->Fill( j->auxdata<float>("Tau2_wta") );
333  h_jetLRD2->Fill( j->auxdata<float>("D2") );
334  }
335 
336  } // End of event loop
337  Info( APP_NAME , "Done with event loop" );
338 
339  // Output file
340  TFile * oRoot = new TFile(outputName.c_str(),"RECREATE");
341  oRoot->cd();
342 
343  // Write histograms
344  // MET histograms
345  h_metNonInt->Write();
346  h_metInt->Write();
347  h_metIntOut->Write();
348  h_metIntMuons->Write();
349  // Truth particle histograms
350  for (size_t n=0;n<nParticleContainers;++n) h_partPt[n]->Write();
351  for (size_t n=0;n<nParticleContainers;++n) h_partConn[n]->Write();
352  h_elPtCone->Write();
353  h_elEtCone->Write();
354  h_muPtCone->Write();
355  h_muEtCone->Write();
356  h_phPtCone->Write();
357  h_phEtCone->Write();
358  h_elDressedPt->Write();
359  h_muDressedPt->Write();
360  h_taDressedPt->Write();
361  h_elType->Write();
362  h_elOrig->Write();
363  h_muType->Write();
364  h_muOrig->Write();
365  h_phType->Write();
366  h_phOrig->Write();
367  h_taType->Write();
368  h_taOrig->Write();
369  h_nuType->Write();
370  h_nuOrig->Write();
371  // Truth jet histograms
372  h_jetPt->Write();
373  h_jetFTAG->Write();
374  h_jetJeMe->Write();
375  h_jetFull->Write();
376  h_jetLRPt->Write();
377  h_jetLRT2->Write();
378  h_jetLRD2->Write();
379  // Event histograms
380  h_x1->Write();
381  h_x2->Write();
382  h_xsec->Write();
383  h_HTFilt->Write();
384  for (auto * h : h_weights) h->Write();
385 
386  // Close up -- all done!
387  oRoot->Close();
388 
389  // trigger finalization of all services and tools created by the Gaudi Application
390 #ifndef XAOD_STANDALONE
391  if (app->finalize().isFailure()){
392  Warning( APP_NAME , "Finalization failed?" );
393  }
394 #endif
395 
396  Info( APP_NAME , "All done -- goodbye." );
397 
398  return 0;
399 }
POOL::TEvent::retrieveMetaInput
StatusCode retrieveMetaInput(const T *&obj, const std::string &key)
Definition: PhysicsAnalysis/POOLRootAccess/POOLRootAccess/TEvent.h:89
TestSUSYToolsAlg.ifile
ifile
Definition: TestSUSYToolsAlg.py:92
store
StoreGateSvc * store
Definition: fbtTestBasics.cxx:69
plotBeamSpotCompare.x1
x1
Definition: plotBeamSpotCompare.py:216
xAOD::TruthEvent_v1::X2
@ X2
[float]
Definition: TruthEvent_v1.h:80
asg::AnaToolHandle
a modified tool handle that allows its owner to configure new tools from the C++ side
Definition: AnaToolHandle.h:34
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
max
#define max(a, b)
Definition: cfImp.cxx:41
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
python.DecayParser.parents
parents
print ("==> buf:",buf)
Definition: DecayParser.py:31
plotBeamSpotCompare.x2
x2
Definition: plotBeamSpotCompare.py:218
run
int run(int argc, char *argv[])
Definition: ttree2hdf5.cxx:28
ANA_CHECK
#define ANA_CHECK(EXP)
check whether the given expression was successful
Definition: Control/AthToolSupport/AsgMessaging/AsgMessaging/MessageCheck.h:324
LArG4FSStartPointFilter.evt
evt
Definition: LArG4FSStartPointFilter.py:42
LArCellConditions.argv
argv
Definition: LArCellConditions.py:112
xAOD::TEvent::kClassAccess
@ kClassAccess
Access auxiliary data using the aux containers.
Definition: Control/xAODRootAccess/xAODRootAccess/TEvent.h:97
ZDCMsg::Info
@ Info
Definition: ZDCMsg.h:20
xAOD::mcChannelNumber
mcChannelNumber
Definition: EventInfo_v1.cxx:197
POOL::Init
IAppMgrUI * Init(const char *options="POOLRootAccess/basic.opts")
Bootstraps (creates and configures) the Gaudi Application with the provided options file.
Definition: PhysicsAnalysis/POOLRootAccess/src/TEvent.cxx:29
POOL::TEvent::kClassAccess
@ kClassAccess
Definition: PhysicsAnalysis/POOLRootAccess/POOLRootAccess/TEvent.h:45
met
Definition: IMETSignificance.h:24
POOL::TEvent::readFrom
StatusCode readFrom(TFile *file)
Definition: PhysicsAnalysis/POOLRootAccess/src/TEvent.cxx:132
CaloCondBlobAlgs_fillNoiseFromASCII.desc
desc
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:54
event
POOL::TEvent event(POOL::TEvent::kClassAccess)
POOL::TEvent::getEntries
long getEntries()
Definition: PhysicsAnalysis/POOLRootAccess/src/TEvent.cxx:123
h
beamspotman.n
n
Definition: beamspotman.py:731
ANA_MSG_INFO
#define ANA_MSG_INFO(xmsg)
Macro printing info messages.
Definition: Control/AthToolSupport/AsgMessaging/AsgMessaging/MessageCheck.h:290
CHECK_RETRIEVE
#define CHECK_RETRIEVE(container, name)
Definition: TruthDerivationTester.cxx:55
APP_NAME
#define APP_NAME
Definition: BoostedXbbTag.cxx:23
nEvents
int nEvents
Definition: fbtTestBasics.cxx:77
python.AtlRunQueryLib.options
options
Definition: AtlRunQueryLib.py:379
DQHistogramMergeRegExp.argc
argc
Definition: DQHistogramMergeRegExp.py:20
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
min
#define min(a, b)
Definition: cfImp.cxx:40
xAOD::MissingETContainer_v1
Container for xAOD::MissingET_v1 objects.
Definition: MissingETContainer_v1.h:21
POOL::TEvent
Definition: PhysicsAnalysis/POOLRootAccess/POOLRootAccess/TEvent.h:39
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
EventInfo
This class provides general information about an event. Event information is provided by the accessor...
Definition: EventInfo/EventInfo/EventInfo.h:42
xAOD::crossSection
crossSection
Definition: TruthEvent_v1.cxx:33
lumiFormat.outputName
string outputName
Definition: lumiFormat.py:71
xAOD::EventInfo_v1
Class describing the basic event information.
Definition: EventInfo_v1.h:43
xAOD::TruthEvent_v1::X1
@ X1
[float]
Definition: TruthEvent_v1.h:79
ANA_CHECK_SET_TYPE
#define ANA_CHECK_SET_TYPE(TYPE)
set the type for ANA_CHECK to report failures
Definition: Control/AthToolSupport/AsgMessaging/AsgMessaging/MessageCheck.h:314
POOL::TEvent::retrieve
StatusCode retrieve(const T *&obj)
Definition: PhysicsAnalysis/POOLRootAccess/POOLRootAccess/TEvent.h:73
python.DecayParser.children
children
Definition: DecayParser.py:32
countChildren
int countChildren(const xAOD::TruthParticle *p)
Definition: TruthDerivationTester.cxx:63
L1Topo::Error
Error
The different types of error that can be flagged in the L1TopoRDO.
Definition: Error.h:16
LArG4GenerateShowerLib.nevents
nevents
Definition: LArG4GenerateShowerLib.py:19
countParents
int countParents(const xAOD::TruthParticle *p)
Definition: TruthDerivationTester.cxx:73
xAOD::TEvent
Tool for accessing xAOD files outside of Athena.
Definition: Control/xAODRootAccess/xAODRootAccess/TEvent.h:81
xAOD::Init
StatusCode Init(const char *appname)
Function initialising ROOT/PyROOT for using the ATLAS EDM.
Definition: Init.cxx:31