@@ -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 ;
@@ -303,7 +307,7 @@ bool GeneratorFromO2Kine::openNextFile(bool wrapAround)
303307 if (!wrapAround) {
304308 return false ;
305309 }
306- if (trial == 0 ) {
310+ if (next == numFiles ) {
307311 LOG (info) << " Reached the end of the input file list; reusing events from the beginning" ;
308312 }
309313 next = next % numFiles;
@@ -380,19 +384,22 @@ 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 ) {
387- if (mStartEvent < mEventsAvailable ) {
392+ if (mRandomize ) {
393+ LOG (warn) << " Start event " << mStartEvent << " ignored: the events are served in random order (randomize)" ;
394+ } else if (mStartEvent < mEventsAvailable ) {
388395 mEventCounter = mStartEvent ;
389396 } else {
390397 LOG (error) << " start event bigger than available events" ;
391398 }
392399 }
393400 // Simple estimate of events without checking all the files.
394401 // To be discussed if we want instead to do this, or provide an additional file with the pools
395- auto requested = getTotalNEvents ();
402+ auto requested = getExpectedNEvents ();
396403 if (requested > 0 && !mRoundRobin && mEventsAvailable > 0 ) {
397404 auto estimate = (size_t )mEventsAvailable * mFileNames .size ();
398405 if (estimate < requested) {
@@ -422,7 +429,7 @@ bool GeneratorFromO2Kine::importParticles()
422429 // Next file in the list opened when the events of the current one are used up
423430 if (mEventCounter >= mEventsAvailable ) {
424431 if (!openNextFile (mRoundRobin )) {
425- auto requested = getTotalNEvents ();
432+ auto requested = getExpectedNEvents ();
426433 LOG (fatal) << " GeneratorFromO2Kine: ran out of events after " << mEventsServed
427434 << " event(s) from " << mFilesUsed << " input file(s)"
428435 << (requested > 0 ? " (" + std::to_string (requested) + " were requested)" : " " )
@@ -584,7 +591,7 @@ bool GeneratorFromEventPool::Init()
584591 mPoolFilesAvailable = setupFileUniverse (expPath.Data ());
585592
586593 if (mPoolFilesAvailable .size () == 0 ) {
587- LOG (error ) << " No file found that can be used with EventPool generator" ;
594+ LOG (fatal ) << " No file found that can be used with EventPool generator (eventPoolPath: " << mConfig . eventPoolPath << " ) " ;
588595 return false ;
589596 }
590597 LOG (info) << " Found " << mPoolFilesAvailable .size () << " available event pool files" ;
@@ -602,14 +609,18 @@ bool GeneratorFromEventPool::Init()
602609 .rngseed = mConfig .rngseed ,
603610 .randomphi = mConfig .randomphi };
604611 mO2KineGenerator .reset (new GeneratorFromO2Kine (kine_config, mFilesChosen ));
612+ // the internal generator serves the events of this one
613+ mO2KineGenerator ->setExpectedNEvents (getExpectedNEvents ());
605614 return mO2KineGenerator ->Init ();
606615}
607616
608617std::vector<std::string> GeneratorFromEventPool::selectFiles (std::vector<std::string> const & universe)
609618{
610619 // shuffles the whole pool universe so that different jobs go through it in a
611- // different order
620+ // different order. Sorting first as a directory listing (or alien find) gives no fixed order,
621+ // and the same rngseed must give the same order everywhere
612622 auto result = universe;
623+ std::sort (result.begin (), result.end ());
613624 std::shuffle (result.begin (), result.end (), mRandomEngine );
614625 return result;
615626}
0 commit comments