The Gaudi Framework  master (594c33fa)
Gaudi::RootEventExtractor Struct Reference
Collaboration diagram for Gaudi::RootEventExtractor:

Public Member Functions

 RootEventExtractor ()=default
 Default constructor. More...
 
 RootEventExtractor (const char *input, const char *output, const char *output_option)
 Initializing constructor directly opening the input file and the output file. More...
 
virtual ~RootEventExtractor ()
 Default destructor. More...
 
ExtractStatus openInput (const char *name)
 Open input file. More...
 
ExtractStatus closeInput ()
 Close input file. More...
 
ExtractStatus openOutput (const char *name, const char *option)
 Open output file. More...
 
ExtractStatus closeOutput ()
 Close output file. More...
 
ExtractStatus cancel ()
 Clear the list of event numbers to be extracted from the file. More...
 
ExtractStatus select (int evt_num)
 Add a given entry number to the list of events to be selected to the output file. More...
 
ExtractStatus extract ()
 Extract all previously selected events from the input file and write it to the output. More...
 

Protected Attributes

std::unique_ptr< TFile > m_in
 
TTree * m_evt_in = nullptr
 
TTree * m_ref_in = nullptr
 
TFile * m_out = nullptr
 
TTree * m_evt_out = nullptr
 
TTree * m_ref_out = nullptr
 
int m_localDB_id = 0
 
std::vector< int > m_eventList
 

Detailed Description

Definition at line 126 of file extractEvt.C.

Constructor & Destructor Documentation

◆ RootEventExtractor() [1/2]

Gaudi::RootEventExtractor::RootEventExtractor ( )
default

Default constructor.

◆ RootEventExtractor() [2/2]

RootEventExtractor::RootEventExtractor ( const char *  input,
const char *  output,
const char *  output_option 
)

Initializing constructor directly opening the input file and the output file.

Definition at line 179 of file extractEvt.C.

179  {
180  if ( EXTRACT_SUCCESS != openInput( input ) ) {
181  throw std::runtime_error( "Failed to open input file:" + std::string( input ) );
182  }
183  if ( EXTRACT_SUCCESS != openOutput( output, output_option ) ) {
184  throw std::runtime_error( "Failed to open output file:" + std::string( output ) );
185  }
186 }

◆ ~RootEventExtractor()

RootEventExtractor::~RootEventExtractor ( )
virtual

Default destructor.

Definition at line 189 of file extractEvt.C.

189  {
190  closeInput();
191  closeOutput();
192 }

Member Function Documentation

◆ cancel()

ExtractStatus RootEventExtractor::cancel ( )

Clear the list of event numbers to be extracted from the file.

Definition at line 195 of file extractEvt.C.

195  {
196  m_eventList.clear();
197  ::printf( "+++ Event list cleared.\n" );
198  return EXTRACT_SUCCESS;
199 }

◆ closeInput()

ExtractStatus RootEventExtractor::closeInput ( )

Close input file.

Definition at line 228 of file extractEvt.C.

228  {
229  if ( m_in ) {
230  ::printf( "+++ Closing input file:%s\n", m_in->GetName() );
231  m_in->Close();
232  }
233  m_in.reset();
234  m_evt_in = nullptr;
235  m_ref_in = nullptr;
236  return EXTRACT_SUCCESS;
237 }

◆ closeOutput()

ExtractStatus RootEventExtractor::closeOutput ( )

Close output file.

Definition at line 240 of file extractEvt.C.

240  {
241  if ( m_out ) {
242  ::printf( "+++ Closing output file:%s\n", m_out->GetName() );
243  if ( m_evt_out ) m_evt_out->Write();
244  if ( m_ref_out ) m_ref_out->Write();
245  m_out->Close();
246  delete m_out;
247  }
248  m_out = nullptr;
249  m_evt_out = nullptr;
250  m_ref_out = nullptr;
251  return EXTRACT_SUCCESS;
252 }

◆ extract()

ExtractStatus RootEventExtractor::extract ( )

Extract all previously selected events from the input file and write it to the output.

Definition at line 255 of file extractEvt.C.

255  {
256  char text[1024];
257  bool new_output = false;
258  TBranch *br_in, *br_out;
259  if ( !m_in || m_in->IsZombie() ) {
260  throw std::runtime_error( "Input file missing - cannot extract events." );
261  } else if ( !m_out || m_out->IsZombie() ) {
262  throw std::runtime_error( "Output file missing - cannot extract events." );
263  } else {
264  m_evt_out = (TTree*)m_out->Get( "Event" );
265  if ( !m_evt_out ) { m_evt_out = m_evt_in->CloneTree( 0 ); }
266  m_ref_out = (TTree*)m_out->Get( "Refs" );
267  if ( !m_ref_out ) {
268  m_ref_out = m_ref_in->CloneTree( 0 );
269  new_output = true;
270  }
271  }
272  m_localDB_id = -1;
273  if ( new_output ) {
274  ::printf( "+++ Copy refs table to new output file:%s\n", m_out->GetName() );
275  br_in = m_ref_in->GetBranch( "Databases" );
276  br_in->SetAddress( text );
277  br_out = m_ref_out->GetBranch( "Databases" );
278  br_out->SetAddress( text );
279  for ( int i = 0; i < br_in->GetEntries(); ++i ) {
280  br_in->GetEntry( i );
281  br_out->Fill();
282  if ( m_localDB_id < 0 && strcmp( text, "<localDB>" ) == 0 ) { m_localDB_id = i; }
283  }
284 
285  br_in = m_ref_in->GetBranch( "Containers" );
286  br_in->SetAddress( text );
287  br_out = m_ref_out->GetBranch( "Containers" );
288  br_out->SetAddress( text );
289  for ( int i = 0; i < br_in->GetEntries(); ++i ) {
290  br_in->GetEntry( i );
291  br_out->Fill();
292  }
293 
294  br_in = m_ref_in->GetBranch( "Links" );
295  br_in->SetAddress( text );
296  br_out = m_ref_out->GetBranch( "Links" );
297  br_out->SetAddress( text );
298  for ( int i = 0; i < br_in->GetEntries(); ++i ) {
299  br_in->GetEntry( i );
300  br_out->Fill();
301  }
302 
303  br_in = m_ref_in->GetBranch( "Params" );
304  br_in->SetAddress( text );
305  br_out = m_ref_out->GetBranch( "Params" );
306  br_out->SetAddress( text );
307  for ( int i = 0; i < br_in->GetEntries(); ++i ) {
308  br_in->GetEntry( i );
309  if ( strncmp( text, "PFN=", 4 ) == 0 ) { // Update PFN entry
310  ::snprintf( text, sizeof( text ), "PFN=%s", br_out->GetFile()->GetName() );
311  ::printf( "+++ PFN of the created output file is:%s\n", text );
312  } else if ( strncmp( text, "FID=", 4 ) == 0 ) { // Create new FID for new file
313  static const char* fmt = "FID=%08lX-%04hX-%04hX-%02hhX%02hhX-%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX";
314  union uuid_data {
315  unsigned char buf[16];
316  unsigned short sbuf[8];
317  unsigned int ibuf[4];
318  } d;
319  TUUID uuid;
320  uuid.GetUUID( d.buf );
321  ::snprintf( text, sizeof( text ), fmt, d.ibuf[0], d.sbuf[2], d.sbuf[3], d.buf[8], d.buf[9], d.buf[10],
322  d.buf[11], d.buf[12], d.buf[13], d.buf[14], d.buf[15] );
323  ::printf( "+++ FID of the created output file is:%s\n", text );
324  }
325  br_out->Fill();
326  }
327  m_ref_out->Write();
328  }
329 
330  TIter next( m_evt_in->GetListOfBranches() );
331  while ( ( br_in = (TBranch*)next() ) ) {
332  TString name = br_in->GetName();
333  TClass* br_class = gROOT->GetClass( br_in->GetClassName(), kTRUE );
334  br_out = m_evt_out->GetBranch( name );
335  if ( !br_out ) {
336  ::printf( "+++ ERROR: Input and output event trees are incompatible. Selection not possible.\n" );
337  return EXTRACT_ERROR;
338  }
339  int out_num_entries = br_out->GetEntries();
340  for ( const auto& i : m_eventList ) {
341  int num_evt = i;
342  const char* br_type = "DataObject";
343  void* pObject = br_class->New();
344  br_in->SetAddress( &pObject );
345  br_out->SetAddress( &pObject );
346  int num_rd = br_in->GetEntry( num_evt );
347  if ( num_rd < 0 ) { // Definitive error
348  ::printf( "+++ ERROR: Failed to read data from branch:%s\n", name.Data() );
349  return EXTRACT_ERROR;
350  }
351  if ( name.EndsWith( "_R." ) ) {
352  RootObjectRefs* refs = (RootObjectRefs*)pObject;
353  for ( auto& ir : refs->refs ) {
354  RootRef& r = ir;
355  if ( r.dbase == m_localDB_id ) r.entry = out_num_entries;
356  }
357  br_type = "*Index*";
358  }
359  int num_wr = br_out->Fill();
360  if ( num_wr < 0 ) {
361  ::printf( "+++ ERROR: Failed to write data to extraction branch:%s "
362  "read:%d wrote:%d bytes [Length-mismatch]\n",
363  name.Data(), num_rd, num_wr );
364  return EXTRACT_ERROR;
365  }
366  ::printf( "+++ Copied %8d bytes to %-10s branch %s(%d)\n", num_rd, br_type, name.Data(), out_num_entries );
367  ++out_num_entries;
368  }
369  m_evt_out->SetEntries( br_out->GetEntries() + 1 );
370  }
371  m_evt_out->Write();
372  return cancel();
373 }

◆ openInput()

ExtractStatus RootEventExtractor::openInput ( const char *  name)

Open input file.

Close input file.

Definition at line 208 of file extractEvt.C.

208  {
209  if ( m_in ) closeInput();
210  m_in.reset( TFile::Open( name ) );
211  if ( m_in && !m_in->IsZombie() ) {
212  m_evt_in = (TTree*)m_in->Get( "Event" );
213  m_ref_in = (TTree*)m_in->Get( "Refs" );
214  return EXTRACT_SUCCESS;
215  }
216  return EXTRACT_ERROR;
217 }

◆ openOutput()

ExtractStatus RootEventExtractor::openOutput ( const char *  name,
const char *  option 
)

Open output file.

Close input file.

Definition at line 220 of file extractEvt.C.

220  {
221  if ( m_out ) closeOutput();
222  m_out = TFile::Open( name, option );
223  m_evt_out = m_ref_out = nullptr;
224  return EXTRACT_SUCCESS;
225 }

◆ select()

ExtractStatus RootEventExtractor::select ( int  evt_num)

Add a given entry number to the list of events to be selected to the output file.

Definition at line 202 of file extractEvt.C.

202  {
203  m_eventList.push_back( evt_num );
204  return EXTRACT_SUCCESS;
205 }

Member Data Documentation

◆ m_eventList

std::vector<int> Gaudi::RootEventExtractor::m_eventList
protected

Definition at line 137 of file extractEvt.C.

◆ m_evt_in

TTree* Gaudi::RootEventExtractor::m_evt_in = nullptr
protected

Definition at line 129 of file extractEvt.C.

◆ m_evt_out

TTree* Gaudi::RootEventExtractor::m_evt_out = nullptr
protected

Definition at line 133 of file extractEvt.C.

◆ m_in

std::unique_ptr<TFile> Gaudi::RootEventExtractor::m_in
protected

Definition at line 128 of file extractEvt.C.

◆ m_localDB_id

int Gaudi::RootEventExtractor::m_localDB_id = 0
protected

Definition at line 136 of file extractEvt.C.

◆ m_out

TFile* Gaudi::RootEventExtractor::m_out = nullptr
protected

Definition at line 132 of file extractEvt.C.

◆ m_ref_in

TTree* Gaudi::RootEventExtractor::m_ref_in = nullptr
protected

Definition at line 130 of file extractEvt.C.

◆ m_ref_out

TTree* Gaudi::RootEventExtractor::m_ref_out = nullptr
protected

Definition at line 134 of file extractEvt.C.


The documentation for this struct was generated from the following file:
Gaudi::EXTRACT_SUCCESS
@ EXTRACT_SUCCESS
Definition: extractEvt.C:124
Gaudi::RootEventExtractor::closeInput
ExtractStatus closeInput()
Close input file.
Definition: extractEvt.C:228
Gaudi::EXTRACT_ERROR
@ EXTRACT_ERROR
Definition: extractEvt.C:124
std::strcmp
T strcmp(T... args)
Gaudi::RootEventExtractor::m_evt_out
TTree * m_evt_out
Definition: extractEvt.C:133
std::string
STL class.
Gaudi::RootEventExtractor::m_ref_out
TTree * m_ref_out
Definition: extractEvt.C:134
Gaudi::RootEventExtractor::openInput
ExtractStatus openInput(const char *name)
Open input file.
Definition: extractEvt.C:208
Gaudi::RootEventExtractor::m_localDB_id
int m_localDB_id
Definition: extractEvt.C:136
Gaudi::RootRef::dbase
int dbase
Data members to define object location in the persistent world.
Definition: RootRefs.h:42
Gaudi::RootEventExtractor::m_evt_in
TTree * m_evt_in
Definition: extractEvt.C:129
Gaudi::RootEventExtractor::m_ref_in
TTree * m_ref_in
Definition: extractEvt.C:130
gaudirun.output
output
Definition: gaudirun.py:521
std::unique_ptr::reset
T reset(T... args)
std::vector::clear
T clear(T... args)
Gaudi::RootObjectRefs
Definition: RootRefs.h:68
Gaudi::RootEventExtractor::cancel
ExtractStatus cancel()
Clear the list of event numbers to be extracted from the file.
Definition: extractEvt.C:195
std::vector::push_back
T push_back(T... args)
Gaudi::RootEventExtractor::openOutput
ExtractStatus openOutput(const char *name, const char *option)
Open output file.
Definition: extractEvt.C:220
Gaudi::RootEventExtractor::m_eventList
std::vector< int > m_eventList
Definition: extractEvt.C:137
Gaudi::RootEventExtractor::m_in
std::unique_ptr< TFile > m_in
Definition: extractEvt.C:128
Gaudi::RootRef
Definition: RootRefs.h:40
std::runtime_error
STL class.
Gaudi::RootRef::entry
int entry
Definition: RootRefs.h:42
std::strncmp
T strncmp(T... args)
ConditionsStallTest.name
name
Definition: ConditionsStallTest.py:77
fmt
Definition: MessageSvcSink.cpp:26
Gaudi::RootEventExtractor::closeOutput
ExtractStatus closeOutput()
Close output file.
Definition: extractEvt.C:240
Gaudi::RootObjectRefs::refs
std::vector< RootRef > refs
The references corresponding to the next layer of items in the data store.
Definition: RootRefs.h:72
Gaudi::RootEventExtractor::m_out
TFile * m_out
Definition: extractEvt.C:132
std::next
T next(T... args)