@@ -217,6 +217,8 @@ void GeneratorFromO2Kine::closeCurrentFile()
217217 mEventOrder .clear ();
218218 mEventsAvailable = 0 ;
219219 mEventCounter = 0 ;
220+ // the header read from the previous file must not leak into events of the next one
221+ mOrigMCEventHeader .reset ();
220222 if (mCurrentFile ) {
221223 mCurrentFile ->Close ();
222224 delete mCurrentFile ;
@@ -242,44 +244,46 @@ bool GeneratorFromO2Kine::openFile(int index)
242244{
243245 // opens one file of the list, connects the branches to it and fixes the
244246 // order in which its events are going to be served;
245- // any previously open file is closed first, so that we never keep more than
246- // one input file open at a time
247- closeCurrentFile ();
247+ // the file which is currently open is only closed once the new one has been found usable
248+ // In the standard case never more than one input file is open at a time
248249 if (index < 0 || index >= (int )mFileNames .size ()) {
249250 return false ;
250251 }
251252 auto const & name = mFileNames [index];
252253
253- mCurrentFile = TFile::Open (name.c_str ());
254- if (mCurrentFile == nullptr || mCurrentFile ->IsZombie ()) {
254+ std::unique_ptr<TFile> file ( TFile::Open (name.c_str () ));
255+ if (file == nullptr || file ->IsZombie ()) {
255256 LOG (error) << " EventFile " << name << " could not be opened" ;
256- closeCurrentFile ();
257257 return false ;
258258 }
259259 // the kinematics will be stored inside a branch MCTrack
260260 // different events are stored inside different entries
261- auto tree = (TTree*)mCurrentFile ->Get (" o2sim" );
261+ auto tree = (TTree*)file ->Get (" o2sim" );
262262 if (!tree) {
263263 LOG (error) << " EventFile " << name << " does not contain an 'o2sim' tree" ;
264- closeCurrentFile ();
265264 return false ;
266265 }
267- mEventBranch = tree->GetBranch (" MCTrack" );
268- if (!mEventBranch ) {
266+ auto eventBranch = tree->GetBranch (" MCTrack" );
267+ if (!eventBranch ) {
269268 LOG (error) << " No MCTrack branch found in " << name;
270- closeCurrentFile ();
271269 return false ;
272270 }
273- mEventsAvailable = mEventBranch ->GetEntries ();
274- if (mEventsAvailable <= 0 ) {
271+ auto eventsAvailable = eventBranch ->GetEntries ();
272+ if (eventsAvailable <= 0 ) {
275273 LOG (warn) << " EventFile " << name << " does not contain any event" ;
276- closeCurrentFile ();
277274 return false ;
278275 }
279- mMCHeaderBranch = tree->GetBranch (" MCEventHeader." );
280- if (!mMCHeaderBranch ) {
276+ auto mcHeaderBranch = tree->GetBranch (" MCEventHeader." );
277+ if (!mcHeaderBranch ) {
281278 LOG (warn) << " No MCEventHeader branch found in kinematics input file" ;
282279 }
280+
281+ // the new file is good: release the previous one and take over
282+ closeCurrentFile ();
283+ mCurrentFile = file.release ();
284+ mEventBranch = eventBranch;
285+ mEventsAvailable = eventsAvailable;
286+ mMCHeaderBranch = mcHeaderBranch;
283287 establishEventOrder ();
284288 mCurrentFileIndex = index;
285289 mEventCounter = 0 ;
@@ -380,7 +384,8 @@ bool GeneratorFromO2Kine::Init()
380384 }
381385 mCurrentFileIndex = -1 ;
382386 if (!openNextFile (false )) {
383- LOG (error) << " Problem reading events from the given kinematics input" ;
387+ LOG (fatal) << " Problem reading events from the given kinematics input: none of the " << mFileNames .size ()
388+ << " input file(s) can be used" ;
384389 return false ;
385390 }
386391 if (mStartEvent > 0 ) {
@@ -392,7 +397,7 @@ bool GeneratorFromO2Kine::Init()
392397 }
393398 // Simple estimate of events without checking all the files.
394399 // To be discussed if we want instead to do this, or provide an additional file with the pools
395- auto requested = getTotalNEvents ();
400+ auto requested = getExpectedNEvents ();
396401 if (requested > 0 && !mRoundRobin && mEventsAvailable > 0 ) {
397402 auto estimate = (size_t )mEventsAvailable * mFileNames .size ();
398403 if (estimate < requested) {
@@ -422,7 +427,7 @@ bool GeneratorFromO2Kine::importParticles()
422427 // Next file in the list opened when the events of the current one are used up
423428 if (mEventCounter >= mEventsAvailable ) {
424429 if (!openNextFile (mRoundRobin )) {
425- auto requested = getTotalNEvents ();
430+ auto requested = getExpectedNEvents ();
426431 LOG (fatal) << " GeneratorFromO2Kine: ran out of events after " << mEventsServed
427432 << " event(s) from " << mFilesUsed << " input file(s)"
428433 << (requested > 0 ? " (" + std::to_string (requested) + " were requested)" : " " )
@@ -584,7 +589,7 @@ bool GeneratorFromEventPool::Init()
584589 mPoolFilesAvailable = setupFileUniverse (expPath.Data ());
585590
586591 if (mPoolFilesAvailable .size () == 0 ) {
587- LOG (error ) << " No file found that can be used with EventPool generator" ;
592+ LOG (fatal ) << " No file found that can be used with EventPool generator (eventPoolPath: " << mConfig . eventPoolPath << " ) " ;
588593 return false ;
589594 }
590595 LOG (info) << " Found " << mPoolFilesAvailable .size () << " available event pool files" ;
@@ -602,6 +607,8 @@ bool GeneratorFromEventPool::Init()
602607 .rngseed = mConfig .rngseed ,
603608 .randomphi = mConfig .randomphi };
604609 mO2KineGenerator .reset (new GeneratorFromO2Kine (kine_config, mFilesChosen ));
610+ // the internal generator serves the events of this one
611+ mO2KineGenerator ->setExpectedNEvents (getExpectedNEvents ());
605612 return mO2KineGenerator ->Init ();
606613}
607614
0 commit comments