19#include "BDSAcceleratorModel.hh"
20#include "BDSAuxiliaryNavigator.hh"
21#include "BDSBeamline.hh"
23#include "BDSBunchFileBased.hh"
25#include "BDSEventAction.hh"
26#include "BDSEventInfo.hh"
27#include "BDSException.hh"
28#include "BDSGlobalConstants.hh"
29#include "BDSOutput.hh"
30#include "BDSParser.hh"
31#include "BDSRunAction.hh"
32#include "BDSSamplerPlacementRecord.hh"
33#include "BDSSamplerRegistry.hh"
34#include "BDSWarning.hh"
36#include "parser/beamBase.h"
37#include "parser/optionsBase.h"
40#include "G4ParticleTable.hh"
41#include "G4ProcessManager.hh"
42#include "G4ProcessVector.hh"
44#include "G4Version.hh"
46#include "CLHEP/Random/Random.h"
54#if G4VERSION_NUMBER > 1049
55#include "BDSPhysicsUtilities.hh"
56#include "G4Positron.hh"
57#include "G4Electron.hh"
60BDSRunAction::BDSRunAction(
BDSOutput* outputIn,
64 const G4String& trajectorySamplerIDIn):
66 starttime(time(nullptr)),
68 bunchGenerator(bunchGeneratorIn),
69 usingIons(usingIonsIn),
70 cpuStartTime(std::clock_t()),
71 eventAction(eventActionIn),
72 trajectorySamplerID(trajectorySamplerIDIn),
76BDSRunAction::~BDSRunAction()
81void BDSRunAction::BeginOfRunAction(
const G4Run* aRun)
86 BDSAuxiliaryNavigator::ResetNavigatorStates();
99 CLHEP::HepRandom::saveFullState(ss);
104 starttime = time(
nullptr);
108 G4cout << __METHOD_NAME__ <<
"Run " << aRun->GetRunID()
109 <<
" start. Time is " << asctime(localtime(&starttime)) << G4endl;
128#if G4VERSION_NUMBER > 1049
138void BDSRunAction::EndOfRunAction(
const G4Run* aRun)
141 time_t stoptime = time(
nullptr);
144 G4float duration =
static_cast<G4float
>(difftime(stoptime, starttime));
148 auto cpuEndTime = std::clock();
149 G4float durationCPU =
static_cast<G4float
>(cpuEndTime -
cpuStartTime) / CLOCKS_PER_SEC;
153 G4cout << G4endl << __METHOD_NAME__ <<
"Run " << aRun->GetRunID() <<
" end. Time is " << asctime(localtime(&stoptime));
158 unsigned long long int nEventsDistrFileSkipped = 0;
159 unsigned long long int nEventsInOriginalDistrFile = 0;
160 unsigned int distrFileLoopNTimes = 1;
163 nOriginalEvents = beg->NOriginalEvents();
164 nEventsDistrFileSkipped = beg->NEventsInFileSkipped();
165 nEventsInOriginalDistrFile = beg->NEventsInFile();
166 distrFileLoopNTimes = (
unsigned int)beg->DistrFileLoopNTimes();
167 if (nEventsDistrFileSkipped > 0)
168 {G4cout << __METHOD_NAME__ << nEventsDistrFileSkipped <<
" events were skipped as no particles passed the filters in them." << G4endl;}
169 if (nEventsDistrFileSkipped == nEventsInOriginalDistrFile)
171 G4String msg =
"no events were simulated at all as none contained any particles that passed the filters.";
172 BDS::Warning(__METHOD_NAME__, msg);
180 G4cout << __METHOD_NAME__ <<
"Run Duration >> " << (int)duration <<
" s" << G4endl;
185 G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable();
186 G4ParticleTable::G4PTblDicIterator* particleIterator = particleTable->GetIterator();
187 particleIterator->reset();
188 while ((*particleIterator)())
190 G4ParticleDefinition* particle = particleIterator->value();
191 G4cout <<
"Particle: \"" << particle->GetParticleName() <<
"\", defined processes are: " << G4endl;
192 G4ProcessManager* pManager = particle->GetProcessManager();
195 G4ProcessVector* processList = pManager->GetProcessList();
198 for (G4int i = 0; i < (G4int)processList->size(); i++)
199 {G4cout <<
"\"" << (*processList)[i]->GetProcessName() <<
"\"" << G4endl;}
209 std::vector<G4int> samplerIDs;
216 G4bool found =
false;
217 for (
const auto& samplerInfo : *samplerRegistry)
219 if (samplerInfo.UniqueName() == tok)
221 samplerIDs.push_back(i);
228 {
throw BDSException(__METHOD_NAME__,
"Error: sampler \"" + tok +
"\" named in the option storeTrajectorySamplerID was not found.");}
237 G4double maxS = 1*CLHEP::m;
242 for (
const auto& range : sRangeToStore)
244 if (range.first > maxS)
245 {
throw BDSException(__METHOD_NAME__,
"S coordinate " + std::to_string(range.first / CLHEP::m) +
"m in option storeTrajectoryElossSRange is beyond the length of the beam line (2m margin).");}
const BDSBeamline * BeamlineMain() const
Accessor.
A vector of BDSBeamlineElement instances - a beamline.
G4double GetTotalArcLength() const
Get the total ARC length for the beamline - ie the maximum s position.
An intermediate layer for any bunch classes that are file based.
The base class for bunch distribution generators.
virtual void BeginOfRunAction(G4int numberOfEvents, G4bool batchMode)
virtual const BDSParticleDefinition * ParticleDefinition() const
Access the beam particle definition.
Process information at the event level.
void SetSamplerIDsForTrajectories(const std::vector< G4int > &samplerIDsIn)
Update the vector of sampler IDs to match for trajectories.
Interface to store event information use G4 hooks.
void SetStopTime(const time_t &stopTimeIn)
Setters.
void SetStartTime(const time_t &startTimeIn)
Setters.
void SetDurationCPU(G4float durationCPUIn)
Setters.
void SetSeedStateAtStart(const G4String &seedStateAtStartIn)
Setters.
void SetDurationWall(G4float durationWallIn)
Setters.
General exception with possible name of object and message.
static BDSGlobalConstants * Instance()
Access method.
Output base class that defines interface for all output types.
virtual void NewFile()=0
Open a new file. This should call WriteHeader() in it.
virtual void InitialiseGeometryDependent()
void FillRun(const BDSEventInfo *info, unsigned long long int nOriginalEventsIn, unsigned long long int nEventsRequestedIn, unsigned long long int nEventsInOriginalDistrFileIn, unsigned long long int nEventsDistrFileSkippedIn, unsigned int distrFileLoopNTimesIn)
Copy run information to output structure.
void FillParticleData(G4bool writeIons)
Fill the local structure particle data with information. Also calls WriteParticleData().
void FillBeam(const GMAD::BeamBase *beam)
void FillOptions(const GMAD::OptionsBase *options)
virtual void CloseFile()=0
const GMAD::OptionsBase * GetOptionsBase() const
Return bare options base class.
static BDSParser * Instance()
Access method.
const GMAD::BeamBase * GetBeamBase() const
Return bare beam base class.
void SetTrajectorySamplerIDs() const
BDSBunch * bunchGenerator
Cache of bunch generator.
std::clock_t cpuStartTime
Start time of run.
BDSEventAction * eventAction
Event action for updating information at start of run.
G4String trajectorySamplerID
Copy of option.
std::string seedStateAtStart
Seed state at start of the run.
void CheckTrajectoryOptions() const
void PrintAllProcessesForAllParticles() const
const G4bool usingIons
Cache of whether ions are being used (for particle table writing out).
BDSOutput * output
Cache of output instance. Not owned by this class.
unsigned long long int nEventsRequested
Cache of ngenerate.
Associated information for the placement of a sampler.
static BDSSamplerRegistry * Instance()
Accessor for registry.
Options for a beam distribution.
Basic options class independent of Geant4.
void FixGeant105ThreshholdsForBeamParticle(const BDSParticleDefinition *particleDefinition)
Apply FixGeant105ThreshholdsForParticle to the beam particle definition.
void FixGeant105ThreshholdsForParticle(const G4ParticleDefinition *particleDefinition)