diff --git a/DDG4/include/DDG4/Geant4Kernel.h b/DDG4/include/DDG4/Geant4Kernel.h index 7495aade654915bf35e74c12a3e7c9d989bef3d8..761cfddda905f4de71d0edc7f4108eaddf465cc9 100644 --- a/DDG4/include/DDG4/Geant4Kernel.h +++ b/DDG4/include/DDG4/Geant4Kernel.h @@ -20,6 +20,13 @@ #include <map> #include <typeinfo> +class DD4hep_End_Of_File : public std::exception { +public: + DD4hep_End_Of_File() : std::exception() {} + virtual const char* what() const noexcept { return "Reached end of input file"; } + +}; + // Forward declarations class G4RunManager; class G4UIdirectory; diff --git a/DDG4/src/Geant4GeneratorAction.cpp b/DDG4/src/Geant4GeneratorAction.cpp index da144575fd6e95c6f96a3d138f5f12687f2e6288..1d9cfce8c92c28328baf5239af39bc670dcab7cf 100644 --- a/DDG4/src/Geant4GeneratorAction.cpp +++ b/DDG4/src/Geant4GeneratorAction.cpp @@ -14,6 +14,7 @@ // Framework include files #include "DD4hep/InstanceCount.h" #include "DDG4/Geant4GeneratorAction.h" +#include "DDG4/Geant4Kernel.h" // Geant4 headers #include "G4Threading.hh" #include "G4AutoLock.hh" diff --git a/DDG4/src/Geant4InputAction.cpp b/DDG4/src/Geant4InputAction.cpp index ae451357fa329f6258a9aebeae58dc6c8c0c3d8a..537696bf90cfd03fb1bb090a991fd7d1372c5cef 100644 --- a/DDG4/src/Geant4InputAction.cpp +++ b/DDG4/src/Geant4InputAction.cpp @@ -17,6 +17,7 @@ #include "DD4hep/Plugins.h" #include "DDG4/Geant4Primary.h" #include "DDG4/Geant4Context.h" +#include "DDG4/Geant4Kernel.h" #include "DDG4/Geant4InputAction.h" #include "G4Event.hh" @@ -174,6 +175,14 @@ int Geant4InputAction::readParticles(int evt_number, } } int status = m_reader->moveToEvent(evid); + if(status == Geant4EventReader::EVENT_READER_EOF ) { + long nEvents = context()->kernel().property("NumEvents").value<long>(); + if(nEvents < 0) { + //context()->kernel().runManager().AbortRun(true); + throw DD4hep_End_Of_File(); + } + } + if ( Geant4EventReader::EVENT_READER_OK != status ) { string msg = issue(evid)+"Error when moving to event - "; if ( status == Geant4EventReader::EVENT_READER_EOF ) msg += " EOF: [end of file]."; @@ -187,6 +196,13 @@ int Geant4InputAction::readParticles(int evt_number, return status; } status = m_reader->readParticles(evid, vertices, particles); + if(status == Geant4EventReader::EVENT_READER_EOF ) { + long nEvents = context()->kernel().property("NumEvents").value<long>(); + if(nEvents < 0) { + //context()->kernel().runManager().AbortRun(true); + throw DD4hep_End_Of_File(); + } + } if ( Geant4EventReader::EVENT_READER_OK != status ) { diff --git a/DDG4/src/Geant4UIManager.cpp b/DDG4/src/Geant4UIManager.cpp index 078c5ba61ddd734f3d2d974eb40fceed4ba50f40..b27b4732626e950de13b58644d3d9bf8179dea20 100644 --- a/DDG4/src/Geant4UIManager.cpp +++ b/DDG4/src/Geant4UIManager.cpp @@ -140,8 +140,14 @@ void Geant4UIManager::start() { // No UI. Pure batch mode: Simply execute requested number of events long numEvent = context()->kernel().property("NumEvents").value<long>(); + if(numEvent < 0) numEvent = std::numeric_limits<int>::max(); printout(INFO,"Geant4UIManager","++ Start run with %d events.",numEvent); - context()->kernel().runManager().BeamOn(numEvent); + try { + context()->kernel().runManager().BeamOn(numEvent); + } catch (DD4hep_End_Of_File& e) { + printout(INFO,"Geant4UIManager","++ End of file reached, ending run..."); + context()->kernel().runManager().RunTermination(); + } } /// Stop and release resources