Extract all previously selected events from the input file and write it to the output.
255 {
256 char text[1024];
257 bool new_output = false;
258 TBranch *br_in, *br_out;
260 throw std::runtime_error( "Input file missing - cannot extract events." );
262 throw std::runtime_error( "Output file missing - cannot extract events." );
263 } else {
269 new_output = true;
270 }
271 }
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();
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 ) {
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 ) {
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 }
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 );
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();
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 ) {
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;
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 }
373}
std::vector< RootRef > refs
The references corresponding to the next layer of items in the data store.
int dbase
Data members to define object location in the persistent world.