The Gaudi Framework  master (ff829712)
Loading...
Searching...
No Matches
Gaudi::RootEventExtractor Struct Reference
Collaboration diagram for Gaudi::RootEventExtractor:

Public Member Functions

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

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}
ExtractStatus openOutput(const char *name, const char *option)
Open output file.
Definition extractEvt.C:220
ExtractStatus openInput(const char *name)
Open input file.
Definition extractEvt.C:208

◆ ~RootEventExtractor()

RootEventExtractor::~RootEventExtractor ( )
virtual

Default destructor.

Definition at line 189 of file extractEvt.C.

189 {
190 closeInput();
191 closeOutput();
192}
ExtractStatus closeOutput()
Close output file.
Definition extractEvt.C:240
ExtractStatus closeInput()
Close input file.
Definition extractEvt.C:228

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}
std::vector< int > m_eventList
Definition extractEvt.C:137

◆ 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}
std::unique_ptr< TFile > m_in
Definition extractEvt.C:128

◆ 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}
ExtractStatus cancel()
Clear the list of event numbers to be extracted from the file.
Definition extractEvt.C:195
std::vector< RootRef > refs
The references corresponding to the next layer of items in the data store.
Definition RootRefs.h:71
int dbase
Data members to define object location in the persistent world.
Definition RootRefs.h:41

◆ 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: