18#include "BDSAcceleratorModel.hh"
19#include "BDSAuxiliaryNavigator.hh"
20#include "BDSBeamline.hh"
22#include "BDSBunchFileBased.hh"
24#include "BDSEventAction.hh"
25#include "BDSEventInfo.hh"
26#include "BDSException.hh"
27#include "BDSGlobalConstants.hh"
28#include "BDSOutput.hh"
29#include "BDSParser.hh"
30#include "BDSRunAction.hh"
31#include "BDSSamplerPlacementRecord.hh"
32#include "BDSSamplerRegistry.hh"
33#include "BDSWarning.hh"
35#include "parser/beamBase.h"
36#include "parser/optionsBase.h"
39#include "G4ParticleTable.hh"
40#include "G4ProcessManager.hh"
41#include "G4ProcessVector.hh"
43#include "G4Version.hh"
45#include "CLHEP/Random/Random.h"
53#if G4VERSION_NUMBER > 1049
54#include "BDSPhysicsUtilities.hh"
55#include "G4Positron.hh"
56#include "G4Electron.hh"
59BDSRunAction::BDSRunAction(
BDSOutput* outputIn,
63 const G4String& trajectorySamplerIDIn):
65 starttime(time(nullptr)),
67 bunchGenerator(bunchGeneratorIn),
68 usingIons(usingIonsIn),
69 cpuStartTime(
std::clock_t()),
70 eventAction(eventActionIn),
71 trajectorySamplerID(trajectorySamplerIDIn),
75BDSRunAction::~BDSRunAction()
80void BDSRunAction::BeginOfRunAction(
const G4Run* aRun)
85 BDSAuxiliaryNavigator::ResetNavigatorStates();
98 CLHEP::HepRandom::saveFullState(ss);
103 starttime = time(
nullptr);
107 G4cout << __METHOD_NAME__ <<
"Run " << aRun->GetRunID()
108 <<
" start. Time is " << asctime(localtime(&starttime)) << G4endl;
127#if G4VERSION_NUMBER > 1049
137void BDSRunAction::EndOfRunAction(
const G4Run* aRun)
140 time_t stoptime = time(
nullptr);
143 G4float duration =
static_cast<G4float
>(difftime(stoptime, starttime));
147 auto cpuEndTime = std::clock();
148 G4float durationCPU =
static_cast<G4float
>(cpuEndTime -
cpuStartTime) / CLOCKS_PER_SEC;
152 G4cout << G4endl << __METHOD_NAME__ <<
"Run " << aRun->GetRunID() <<
" end. Time is " << asctime(localtime(&stoptime));
157 unsigned long long int nEventsDistrFileSkipped = 0;
158 unsigned long long int nEventsInOriginalDistrFile = 0;
159 unsigned int distrFileLoopNTimes = 1;
162 nOriginalEvents = beg->NOriginalEvents();
163 nEventsDistrFileSkipped = beg->NEventsInFileSkipped();
164 nEventsInOriginalDistrFile = beg->NEventsInFile();
165 distrFileLoopNTimes = (
unsigned int)beg->DistrFileLoopNTimes();
166 if (nEventsDistrFileSkipped > 0)
167 {G4cout << __METHOD_NAME__ << nEventsDistrFileSkipped <<
" events were skipped as no particles passed the filters in them." << G4endl;}
168 if (nEventsDistrFileSkipped == nEventsInOriginalDistrFile)
170 G4String msg =
"no events were simulated at all as none contained any particles that passed the filters.";
171 BDS::Warning(__METHOD_NAME__, msg);
179 G4cout << __METHOD_NAME__ <<
"Run Duration >> " << (int)duration <<
" s" << G4endl;
184 G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable();
185 G4ParticleTable::G4PTblDicIterator* particleIterator = particleTable->GetIterator();
186 particleIterator->reset();
187 while ((*particleIterator)())
189 G4ParticleDefinition* particle = particleIterator->value();
190 G4cout <<
"Particle: \"" << particle->GetParticleName() <<
"\", defined processes are: " << G4endl;
191 G4ProcessManager* pManager = particle->GetProcessManager();
194 G4ProcessVector* processList = pManager->GetProcessList();
197 for (G4int i = 0; i < (G4int)processList->size(); i++)
198 {G4cout <<
"\"" << (*processList)[i]->GetProcessName() <<
"\"" << G4endl;}
208 std::vector<G4int> samplerIDs;
215 G4bool found =
false;
216 for (
const auto& samplerInfo : *samplerRegistry)
218 if (samplerInfo.UniqueName() == tok)
220 samplerIDs.push_back(i);
227 {
throw BDSException(__METHOD_NAME__,
"Error: sampler \"" + tok +
"\" named in the option storeTrajectorySamplerID was not found.");}
236 G4double maxS = 1*CLHEP::m;
241 for (
const auto& range : sRangeToStore)
243 if (range.first > maxS)
244 {
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)