ATLAS Offline Software
Public Types | Public Member Functions | Private Member Functions | List of all members
xAOD::RDataSource Class Referencefinal

Data source for xAOD input files. More...

#include <RDataSource.h>

Inheritance diagram for xAOD::RDataSource:
Collaboration diagram for xAOD::RDataSource:

Public Types

typedef std::vector< std::pair< ULong64_t, ULong64_t > > EntryRanges_t
 Type describing the entry ranges of the input file(s) More...
 

Public Member Functions

 RDataSource (std::string_view fileNameGlob, std::string_view treeName="CollectionTree")
 Constructor with the file name pattern. More...
 
 RDataSource (const std::vector< std::string > &fileNames, std::string_view treeName="CollectionTree")
 Constructor with list of file names. More...
 
 ~RDataSource ()
 Destructor. More...
 
void setVerboseOutput (Bool_t value=kTRUE)
 Set whether verbose output should be printed (for debugging) More...
 
Bool_t isVerboseOutput () const
 Check whether verbose output is set up to be printed. More...
 
Functions implemented from @c ROOT::RDF::RDataSource
virtual void SetNSlots (unsigned int slots) override final
 Set the number of threads/slots that the data source should use. More...
 
virtual void Initialize () override final
 Initialize the data source, before the start of the event loop. More...
 
virtual void InitSlot (unsigned int slot, ULong64_t firstEntry) override final
 Initialize one of the slots/threads. More...
 
virtual void FinalizeSlot (unsigned int slot) override final
 Close the input file reading in one of the slots/threads. More...
 
virtual void Finalize () override final
 Finalize the data source, after the event loop. More...
 
virtual const std::vector< std::string > & GetColumnNames () const override final
 Get the column/object names for the input file(s) More...
 
virtual bool HasColumn (std::string_view name) const override final
 Check if the dataset has a certain column/object. More...
 
virtual std::string GetTypeName (std::string_view column) const override final
 Get the type name of a given column/object. More...
 
virtual EntryRanges_t GetEntryRanges () override final
 Get the entry ranges in the input file(s) More...
 
virtual bool SetEntry (unsigned int slot, ULong64_t entry) override final
 Set which entry a give slot/thread should be processing. More...
 

Private Member Functions

virtual Record_t GetColumnReadersImpl (std::string_view column, const std::type_info &typeInfo) override final
 Return the type-erased vector of pointers to pointers to column values. More...
 
void readInputMetadata ()
 Fill the metadata variables. More...
 

Private Attributes

Arguments provided by the user
std::vector< std::string > m_fileNames
 Files to read. More...
 
std::string m_treeName
 Name of the event tree in the input files. More...
 
Bool_t m_verboseOutput
 Whether verbose output should be printed or not. More...
 
Variables valid right after construction
std::vector< std::string > m_columnNames
 Names of the columns/objects on the input. More...
 
std::unordered_map< std::string, std::string > m_classNameMap
 The object name -> class name map. More...
 
Variables that become valid after calling @c Initialize()
EntryRanges_t m_entryRanges
 Optimal entry ranges to split the processing into. More...
 
Variables that become valid after calling @c SetNSlots(...)
std::vector< std::unique_ptr< TChain > > m_chains
 Chains used in the file I/O. More...
 
std::vector< std::unique_ptr< RDataSourceEvent > > m_events
 Event objects performing the file I/O. More...
 
std::vector< std::unique_ptr< TStore > > m_stores
 In-memory whiteboards used during the event loop. More...
 

Detailed Description

Data source for xAOD input files.

This data source can be used to allow ROOT::RDataFrame to process (D)xAOD inputs.

Author
Umesh Worlikar Umesh.nosp@m..Dha.nosp@m.rmaji.nosp@m..Wor.nosp@m.likar.nosp@m.@cer.nosp@m.n.ch
Attila Krasznahorkay Attil.nosp@m.a.Kr.nosp@m.aszna.nosp@m.hork.nosp@m.ay@ce.nosp@m.rn.c.nosp@m.h

Definition at line 35 of file RDataSource.h.

Member Typedef Documentation

◆ EntryRanges_t

typedef std::vector< std::pair< ULong64_t, ULong64_t > > xAOD::RDataSource::EntryRanges_t

Type describing the entry ranges of the input file(s)

Definition at line 48 of file RDataSource.h.

Constructor & Destructor Documentation

◆ RDataSource() [1/2]

xAOD::RDataSource::RDataSource ( std::string_view  fileNameGlob,
std::string_view  treeName = "CollectionTree" 
)

Constructor with the file name pattern.

Definition at line 105 of file RDataSource.cxx.

107  : RDataSource( std::vector< std::string >( { fileNameGlob.data() } ),
108  treeName ) {
109 
110  }

◆ RDataSource() [2/2]

xAOD::RDataSource::RDataSource ( const std::vector< std::string > &  fileNames,
std::string_view  treeName = "CollectionTree" 
)

Constructor with list of file names.

Definition at line 112 of file RDataSource.cxx.

115  m_verboseOutput( kFALSE ) {
116 
118  }

◆ ~RDataSource()

xAOD::RDataSource::~RDataSource ( )

Destructor.

Definition at line 120 of file RDataSource.cxx.

120  {
121 
122  // I don't understand why, but ROOT really doesn't like it if the
123  // chains are not the first to be deleted from memory. :-/
124  m_chains.clear();
125  }

Member Function Documentation

◆ Finalize()

void xAOD::RDataSource::Finalize ( )
finaloverridevirtual

Finalize the data source, after the event loop.

Definition at line 303 of file RDataSource.cxx.

303  {
304 
305  // Simply print what's happening.
306  PRINT_VERBOSE( "Finalize: Function called" );
307 
308  // Return gracefully.
309  return;
310  }

◆ FinalizeSlot()

void xAOD::RDataSource::FinalizeSlot ( unsigned int  slot)
finaloverridevirtual

Close the input file reading in one of the slots/threads.

Definition at line 294 of file RDataSource.cxx.

294  {
295 
296  // Simply print what's happening.
297  PRINT_VERBOSE( "FinalizeSlot: Called for slot " << slot );
298 
299  // Return gracefully.
300  return;
301  }

◆ GetColumnNames()

const std::vector< std::string > & xAOD::RDataSource::GetColumnNames ( ) const
finaloverridevirtual

Get the column/object names for the input file(s)

Definition at line 313 of file RDataSource.cxx.

313  {
314 
315  return m_columnNames;
316  }

◆ GetColumnReadersImpl()

RDataSource::Record_t xAOD::RDataSource::GetColumnReadersImpl ( std::string_view  column,
const std::type_info &  typeInfo 
)
finaloverrideprivatevirtual

Return the type-erased vector of pointers to pointers to column values.

Definition at line 392 of file RDataSource.cxx.

393  {
394 
395  // Make sure that the column/object is known.
396  if( ! HasColumn( column ) ) {
397  ::Error( "xAOD::RDataSource::GetColumnReadersImpl",
398  XAOD_MESSAGE( "Column/object \"%s\" not available" ),
399  column.data() );
400  throw std::runtime_error( "Column/object \"" + std::string( column ) +
401  "\" not available" );
402  }
403  PRINT_VERBOSE( "GetColumnReadersImpl: Creating column readers for \""
404  << column << "/" << SG::normalizedTypeinfoName( typeInfo )
405  << "\"" );
406 
407  // Create the comlumn reader pointers.
408  Record_t result( m_events.size() );
409  for( size_t i = 0; i < m_events.size(); ++i ) {
410  result[ i ] = m_events[ i ]->columnReader( column, typeInfo );
411  }
412  return result;
413  }

◆ GetEntryRanges()

RDataSource::EntryRanges_t xAOD::RDataSource::GetEntryRanges ( )
finaloverridevirtual

Get the entry ranges in the input file(s)

Definition at line 347 of file RDataSource.cxx.

347  {
348 
349  // When ROOT asks for the entry ranges, we have to tell it which ones
350  // have not been processed yet. Since we process all entries right away
351  // (SetEntry(...) does not have logic for not processing a requested
352  // entry), the logic here is to empty out the m_entryRanges variable on
353  // this call. So that on the next call an empty range would be returned.
354  const EntryRanges_t dummy( std::move( m_entryRanges ) );
355  return dummy;
356  }

◆ GetTypeName()

std::string xAOD::RDataSource::GetTypeName ( std::string_view  column) const
finaloverridevirtual

Get the type name of a given column/object.

Definition at line 324 of file RDataSource.cxx.

324  {
325 
326  // Make sure that the column/object is known.
327  if( ! HasColumn( column ) ) {
328  ::Error( "xAOD::RDataSource::GetTypeName",
329  XAOD_MESSAGE( "Column/object \"%s\" not available" ),
330  column.data() );
331  throw std::runtime_error( "Column/object \"" + std::string( column ) +
332  "\" not available" );
333  }
334 
335  // Get the type.
336  auto itr = m_classNameMap.find( column.data() );
337  if( itr == m_classNameMap.end() ) {
338  // Note that the fatal message will abort the entire job in all cases.
339  ::Fatal( "xAOD::RDataSource::GetTypeName",
340  XAOD_MESSAGE( "Internal logic error found" ) );
341  }
342  PRINT_VERBOSE( "GetTypeName: Type name for column \"" << column
343  << "\" is: " << itr->second );
344  return itr->second;
345  }

◆ HasColumn()

bool xAOD::RDataSource::HasColumn ( std::string_view  name) const
finaloverridevirtual

Check if the dataset has a certain column/object.

Definition at line 318 of file RDataSource.cxx.

318  {
319 
320  return std::find( m_columnNames.begin(), m_columnNames.end(),
321  name ) != m_columnNames.end();
322  }

◆ Initialize()

void xAOD::RDataSource::Initialize ( )
finaloverridevirtual

Initialize the data source, before the start of the event loop.

Definition at line 187 of file RDataSource.cxx.

187  {
188 #endif
189 
190  // A sanity check.
191  if( m_entryRanges.size() != 0 ) {
192  ::Fatal( "xAOD::RDataSource::Initialize",
193  XAOD_MESSAGE( "Function called on an initialized object" ) );
194  }
195  PRINT_VERBOSE( "Initialize: Initializing the data source" );
196 
197  // Create a chain that will help determine the optimal entry ranges
198  // to process.
200  TObjArray* filesInChain = chain->GetListOfFiles();
201 
202  // Loop over the input files of the chain.
203  Long64_t fileOffset = 0;
204  for( Int_t ifile = 0; ifile < filesInChain->GetEntries(); ++ifile ) {
205 
206  // Open the file directly.
207  const char* fileName = filesInChain->At( ifile )->GetTitle();
208  auto file = std::unique_ptr< TFile >( TFile::Open( fileName,
209  "READ" ) );
210  if( ( ! file ) || file->IsZombie() ) {
211  ::Error( "xAOD::RDataSource::Initialize",
212  XAOD_MESSAGE( "Failed to open file: %s" ), fileName );
213  throw std::runtime_error( "Failed to open file: " +
214  std::string( fileName ) );
215  }
216 
217  // Access the event tree inside of it.
218  TTree* tree =
219  dynamic_cast< TTree* >( file->Get( m_treeName.c_str() ) );
220  if( ! tree ) {
221  // A file with no event tree is not necessarily a problem. It could
222  // just be a file that has no events left in it after all
223  // selections.
224  continue;
225  }
226 
227  // Extract the ideal entry ranges from the file.
228  const Long64_t entries = tree->GetEntries();
229  TTree::TClusterIterator clusterIter( tree->GetClusterIterator( 0 ) );
230  Long64_t clusterStart = 0;
231  while( ( clusterStart = clusterIter() ) < entries ) {
232  m_entryRanges.emplace_back( fileOffset + clusterStart,
233  fileOffset +
234  clusterIter.GetNextEntry() );
235  }
236 
237  // Increment the file offset value.
238  fileOffset += entries;
239  }
240  PRINT_VERBOSE( "Initialize: Created entry ranges: " << m_entryRanges );
241 
242  // Return gracefully.
243  return;
244  }

◆ InitSlot()

void xAOD::RDataSource::InitSlot ( unsigned int  slot,
ULong64_t  firstEntry 
)
finaloverridevirtual

Initialize one of the slots/threads.

Definition at line 246 of file RDataSource.cxx.

246  {
247 
248  // A sanity check.
249  if( m_events.size() <= slot ) {
250  ::Error( "xAOD::RDataSource::InitSlot",
251  XAOD_MESSAGE( "Invalid slot (%u) received" ), slot );
252  throw std::runtime_error( "Invalid slot received" );
253  }
254 
255  // Load the first entry for it.
256  if( m_events[ slot ]->getEntry( firstEntry ) < 0 ) {
257  ::Error( "xAOD::RDataSource::InitSlot",
258  XAOD_MESSAGE( "Failed to load entry %lld for slot %u" ),
259  firstEntry, slot );
260  throw std::runtime_error( "Failed to load entry for slot" );
261  }
262  PRINT_VERBOSE( "InitSlot: Retrieved entry " << firstEntry << " for slot "
263  << slot );
264 
265  // Activate and clear the store.
266  m_stores[ slot ]->setActive();
267  m_stores[ slot ]->clear();
268  PRINT_VERBOSE( "InitSlot: Activated and cleared transient store for slot "
269  << slot );
270 
271  // Return gracefully.
272  return;
273  }

◆ isVerboseOutput()

Bool_t xAOD::RDataSource::isVerboseOutput ( ) const

Check whether verbose output is set up to be printed.

Definition at line 386 of file RDataSource.cxx.

386  {
387 
388  return m_verboseOutput;
389  }

◆ readInputMetadata()

void xAOD::RDataSource::readInputMetadata ( )
private

Fill the metadata variables.

Definition at line 415 of file RDataSource.cxx.

415  {
416 
417  // Create a temporary event object.
419  RDataSourceEvent event;
420  if( ! event.readFrom( chain.get() ).isSuccess() ) {
421  ::Error( "xAOD::RDataSource::readInputMetadata",
422  XAOD_MESSAGE( "Failed to connect to the input chain" ) );
423  throw std::runtime_error( "Failed to connect to the input chain" );
424  }
425 
426  // Load the first event of the input, if one is available.
427  if( event.getEntries() > 0 ) {
428  if( event.getEntry( 0 ) < 0 ) {
429  ::Error( "xAOD::RDataSource::readInputMetadata",
430  "Couldn't load the first event of the input" );
431  throw std::runtime_error( "Couldn't load the first event of the "
432  "input" );
433  }
434  }
435 
436  // Fill the column and type name variables.
437  m_columnNames.clear(); m_classNameMap.clear();
438  auto names = event.columnAndTypeNames();
439  m_columnNames.reserve( names.size() );
440  m_classNameMap.reserve( names.size() );
441  for( const auto& pair : names ) {
442  m_columnNames.push_back( pair.first );
443  m_classNameMap[ pair.first ] = pair.second;
444  }
445  PRINT_VERBOSE( "readInputMetadata: m_columnNames = " << m_columnNames );
446  PRINT_VERBOSE( "readInputMetadata: m_classNameMap = " << m_classNameMap );
447 
448  // ROOT memory management is weird... We must delete the chain first,
449  // before the TEvent object on top of it would be deleted...
450  chain.reset();
451 
452  // Return gracefully.
453  return;
454  }

◆ SetEntry()

bool xAOD::RDataSource::SetEntry ( unsigned int  slot,
ULong64_t  entry 
)
finaloverridevirtual

Set which entry a give slot/thread should be processing.

Definition at line 358 of file RDataSource.cxx.

358  {
359 
360  // A sanity check.
361  if( m_events.size() <= slot ) {
362  ::Error( "xAOD::RDataSource::SetEntry",
363  XAOD_MESSAGE( "Invalid slot (%u) received" ), slot );
364  throw std::runtime_error( "Invalid slot received" );
365  }
366  PRINT_VERBOSE( "SetEntry: Called for slot " << slot << " and entry "
367  << entry );
368 
369  // Switch to the requested entry.
370  m_events[ slot ]->updateObjectsForEntry( entry );
371 
372  // Activate and clear the store.
373  m_stores[ slot ]->setActive();
374  m_stores[ slot ]->clear();
375 
376  // The entry is always processed.
377  return true;
378  }

◆ SetNSlots()

void xAOD::RDataSource::SetNSlots ( unsigned int  slots)
finaloverridevirtual

Set the number of threads/slots that the data source should use.

Definition at line 127 of file RDataSource.cxx.

127  {
128 
129  // Some sanity checks.
130  if( slots == 0 ) {
131  ::Error( "xAOD::RDataSource::SetNSlots",
132  XAOD_MESSAGE( "Zero slots requested" ) );
133  throw std::invalid_argument( "Zero slots requested" );
134  }
135  if( m_events.size() != 0 ) {
136  ::Error( "xAOD::RDataSource::SetNSlots",
137  XAOD_MESSAGE( "Function called multiple times" ) );
138  throw std::runtime_error( "Function called multiple times" );
139  }
140 
141  // Reserve the correct number of elements.
142  m_chains.reserve( slots );
143  m_events.reserve( slots );
144  m_stores.reserve( slots );
145  PRINT_VERBOSE( "SetNSlots: Reserved " << slots
146  << " slots for the chains, events and stores" );
147 
148  // Create the event objects already at this point.
149  for( unsigned int i = 0; i < slots; ++i ) {
150 
151  // Set up the chain, event and store.
152  m_chains.push_back( ::makeChain( m_fileNames, m_treeName ) );
153  m_events.push_back( std::make_unique< RDataSourceEvent >() );
154  m_stores.push_back( std::make_unique< TStore >() );
155  TChain* chain = m_chains.back().get();
156  RDataSourceEvent* event = m_events.back().get();
157 
158  // Initialize the event object.
159  if( ! event->readFrom( chain ).isSuccess() ) {
160  ::Error( "xAOD::RDataSource::SetNSlots",
161  XAOD_MESSAGE( "Failed to set up xAOD::RDataSourceEvent "
162  "for slot %u" ), i );
163  throw std::runtime_error( "Failed to set up "
164  "xAOD::RDataSourceEvent" );
165  }
166 
167  // Load entry 0 for it. Notice that this is a waste of CPU and I/O
168  // on the surface. But it's not... This triggers the initialization of
169  // the files/trees used by these chains. Which happens much more
170  // quickly in a serial way in a single thread than in multiple threads
171  // at the same time. To be followed up with the ROOT developers...
172  if( event->getEntry( 0 ) < 0 ) {
173  ::Error( "xAOD::RDataSource::SetNSlots",
174  XAOD_MESSAGE( "Failed to load entry 0 for slot %u" ), i );
175  throw std::runtime_error( "Failed to load entry for slot" );
176  }
177  PRINT_VERBOSE( "SetNSlots: Initialized objects for slot " << i );
178  }
179 
180  // Return gracefully.
181  return;
182  }

◆ setVerboseOutput()

void xAOD::RDataSource::setVerboseOutput ( Bool_t  value = kTRUE)

Set whether verbose output should be printed (for debugging)

Definition at line 380 of file RDataSource.cxx.

380  {
381 
383  return;
384  }

Member Data Documentation

◆ m_chains

std::vector< std::unique_ptr< TChain > > xAOD::RDataSource::m_chains
private

Chains used in the file I/O.

Definition at line 141 of file RDataSource.h.

◆ m_classNameMap

std::unordered_map< std::string, std::string > xAOD::RDataSource::m_classNameMap
private

The object name -> class name map.

Definition at line 125 of file RDataSource.h.

◆ m_columnNames

std::vector< std::string > xAOD::RDataSource::m_columnNames
private

Names of the columns/objects on the input.

Definition at line 123 of file RDataSource.h.

◆ m_entryRanges

EntryRanges_t xAOD::RDataSource::m_entryRanges
private

Optimal entry ranges to split the processing into.

Definition at line 133 of file RDataSource.h.

◆ m_events

std::vector< std::unique_ptr< RDataSourceEvent > > xAOD::RDataSource::m_events
private

Event objects performing the file I/O.

Definition at line 143 of file RDataSource.h.

◆ m_fileNames

std::vector< std::string > xAOD::RDataSource::m_fileNames
private

Files to read.

Definition at line 111 of file RDataSource.h.

◆ m_stores

std::vector< std::unique_ptr< TStore > > xAOD::RDataSource::m_stores
private

In-memory whiteboards used during the event loop.

Definition at line 145 of file RDataSource.h.

◆ m_treeName

std::string xAOD::RDataSource::m_treeName
private

Name of the event tree in the input files.

Definition at line 113 of file RDataSource.h.

◆ m_verboseOutput

Bool_t xAOD::RDataSource::m_verboseOutput
private

Whether verbose output should be printed or not.

Definition at line 115 of file RDataSource.h.


The documentation for this class was generated from the following files:
TestUtils.makeChain
def makeChain(flags, name, L1Thresholds, ChainSteps, Streams="physics:Main", Groups=["RATE:TestRateGroup", "BW:TestBW"])
Definition: TestUtils.py:34
TestSUSYToolsAlg.ifile
ifile
Definition: TestSUSYToolsAlg.py:92
xAOD::RDataSource::RDataSource
RDataSource(std::string_view fileNameGlob, std::string_view treeName="CollectionTree")
Constructor with the file name pattern.
Definition: RDataSource.cxx:105
xAOD::name
name
Definition: TriggerMenuJson_v1.cxx:29
xAOD::RDataSource::m_stores
std::vector< std::unique_ptr< TStore > > m_stores
In-memory whiteboards used during the event loop.
Definition: RDataSource.h:145
get_generator_info.result
result
Definition: get_generator_info.py:21
checkxAOD.fileNames
fileNames
Definition: Tools/PyUtils/bin/checkxAOD.py:73
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
SG::normalizedTypeinfoName
std::string normalizedTypeinfoName(const std::type_info &info)
Convert a type_info to a normalized string representation (matching the names used in the root dictio...
Definition: normalizedTypeinfoName.cxx:120
xAOD::RDataSource::m_fileNames
std::vector< std::string > m_fileNames
Files to read.
Definition: RDataSource.h:111
tree
TChain * tree
Definition: tile_monitor.h:30
DeMoUpdate.column
dictionary column
Definition: DeMoUpdate.py:1110
athena.value
value
Definition: athena.py:122
XAOD_MESSAGE
#define XAOD_MESSAGE(MESSAGE)
Simple macro for printing error/verbose messages.
Definition: Control/xAODRootAccess/xAODRootAccess/tools/Message.h:19
xAOD::RDataSource::m_chains
std::vector< std::unique_ptr< TChain > > m_chains
Chains used in the file I/O.
Definition: RDataSource.h:141
xAOD::RDataSource::m_classNameMap
std::unordered_map< std::string, std::string > m_classNameMap
The object name -> class name map.
Definition: RDataSource.h:125
beamspotPlotBcids.chain
chain
Definition: beamspotPlotBcids.py:442
xAOD::RDataSource::m_events
std::vector< std::unique_ptr< RDataSourceEvent > > m_events
Event objects performing the file I/O.
Definition: RDataSource.h:143
xAOD::RDataSource::m_entryRanges
EntryRanges_t m_entryRanges
Optimal entry ranges to split the processing into.
Definition: RDataSource.h:133
xAOD::RDataSource::m_verboseOutput
Bool_t m_verboseOutput
Whether verbose output should be printed or not.
Definition: RDataSource.h:115
POOL::TEvent::readFrom
StatusCode readFrom(TFile *file)
Definition: PhysicsAnalysis/POOLRootAccess/src/TEvent.cxx:132
FortranAlgorithmOptions.fileName
fileName
Definition: FortranAlgorithmOptions.py:13
xAOD::RDataSource::m_columnNames
std::vector< std::string > m_columnNames
Names of the columns/objects on the input.
Definition: RDataSource.h:123
event
POOL::TEvent event(POOL::TEvent::kClassAccess)
POOL::TEvent::getEntry
int getEntry(long entry)
Definition: PhysicsAnalysis/POOLRootAccess/src/TEvent.cxx:184
lumiFormat.i
int i
Definition: lumiFormat.py:92
POOL::TEvent::getEntries
long getEntries()
Definition: PhysicsAnalysis/POOLRootAccess/src/TEvent.cxx:123
python.subdetectors.mmg.names
names
Definition: mmg.py:8
file
TFile * file
Definition: tile_monitor.h:29
dumpFileToPlots.treeName
string treeName
Definition: dumpFileToPlots.py:20
python.xAODType.dummy
dummy
Definition: xAODType.py:4
GetAllXsec.entry
list entry
Definition: GetAllXsec.py:132
xAOD::RDataSource::HasColumn
virtual bool HasColumn(std::string_view name) const override final
Check if the dataset has a certain column/object.
Definition: RDataSource.cxx:318
xAOD::RDataSource::EntryRanges_t
std::vector< std::pair< ULong64_t, ULong64_t > > EntryRanges_t
Type describing the entry ranges of the input file(s)
Definition: RDataSource.h:48
xAOD::RDataSource::readInputMetadata
void readInputMetadata()
Fill the metadata variables.
Definition: RDataSource.cxx:415
PRINT_VERBOSE
#define PRINT_VERBOSE(MSG)
Helper macro for printing verbose messages for debugging.
Definition: RDataSource.cxx:96
xAOD::RDataSource::m_treeName
std::string m_treeName
Name of the event tree in the input files.
Definition: RDataSource.h:113
entries
double entries
Definition: listroot.cxx:49