18#include "BDSBunchEventGenerator.hh"
20#include "BDSException.hh"
21#include "BDSParticleCoordsFull.hh"
22#include "BDSPhysicsUtilities.hh"
23#include "BDSUtilities.hh"
24#include "BDSWarning.hh"
26#include "parser/beam.h"
28#include "G4ParticleDefinition.hh"
29#include "G4ParticleTable.hh"
31#include "CLHEP/Units/SystemOfUnits.h"
40BDSBunchEventGenerator::BDSBunchEventGenerator():
42 eventGeneratorNEventsSkip(0),
43 eventGeneratorMinX(0),
44 eventGeneratorMaxX(0),
45 eventGeneratorMinY(0),
46 eventGeneratorMaxY(0),
47 eventGeneratorMinZ(0),
48 eventGeneratorMaxZ(0),
49 eventGeneratorMinXp(0),
50 eventGeneratorMaxXp(0),
51 eventGeneratorMinYp(0),
52 eventGeneratorMaxYp(0),
53 eventGeneratorMinZp(0),
54 eventGeneratorMaxZp(0),
55 eventGeneratorMinRp(0),
56 eventGeneratorMaxRp(0),
57 eventGeneratorMinT(0),
58 eventGeneratorMaxT(0),
59 eventGeneratorMinEK(0),
60 eventGeneratorMaxEK(0),
63 testOnParticleType(true),
64 acceptedParticlesString(
"")
67BDSBunchEventGenerator::~BDSBunchEventGenerator()
73 G4Transform3D beamlineTransformIn,
74 const G4double beamlineSIn)
105 {
throw BDSException(__METHOD_NAME__,
"eventGeneratorNEventsSkip < 0");}
107 {
throw BDSException(__METHOD_NAME__,
"eventGeneratorMinX >= eventGeneratorMaxX");}
109 {
throw BDSException(__METHOD_NAME__,
"eventGeneratorMinY >= eventGeneratorMaxY");}
111 {
throw BDSException(__METHOD_NAME__,
"eventGeneratorMinZ >= eventGeneratorMaxZ");}
113 {
throw BDSException(__METHOD_NAME__,
"eventGeneratorMinXp >= eventGeneratorMaxXp");}
115 {
throw BDSException(__METHOD_NAME__,
"eventGeneratorMinYp >= eventGeneratorMaxYp");}
117 {
throw BDSException(__METHOD_NAME__,
"eventGeneratorMinZp >= eventGeneratorMaxZp");}
119 {
throw BDSException(__METHOD_NAME__,
"eventGeneratorMinT >= eventGeneratorMaxT");}
121 {
throw BDSException(__METHOD_NAME__,
"eventGeneratorMinEK >= eventGeneratorMaxEK");}
128 G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable();
129 std::string particleIDStr;
131 while (ss >> particleIDStr)
137 int particleID = std::stoi(particleIDStr);
142 G4ParticleTable::G4PTblEncodingDictionary* encoding = G4ParticleTable::fEncodingDictionary;
143 auto search = encoding->find(particleID);
144 if (search != encoding->end())
147 {
throw BDSException(__METHOD_NAME__,
"PDG ID \"" + particleIDStr +
"\" not found in particle table");}
149 catch (
const std::logic_error&)
151 G4ParticleDefinition* particleDef = particleTable->FindParticle(particleIDStr);
155 throw BDSException(__METHOD_NAME__,
"Particle \"" + particleIDStr +
"\" not found.");
168 G4double kineticEnergy,
184 G4bool allowedParticle =
true;
188 return x && y && z && xp && yp && zp && rp && t && ek && allowedParticle;
194 {
return G4RotationMatrix();}
197 G4RotationMatrix result;
198 result.rotateX(std::asin(-
Yp0));
199 result.rotateY(std::asin(
Xp0));
G4RotationMatrix ReferenceBeamMomentumOffset() const
Get a rotation matrix according to Xp0 and Yp0.
G4double Rp0
Cache of limit.
G4double eventGeneratorMinRp
Cache of limit.
G4int eventGeneratorNEventsSkip
Cache of limit.
G4double eventGeneratorMaxZ
Cache of limit.
std::set< G4int > acceptedParticles
Vector (sorted) of permitted particles.
G4double eventGeneratorMaxXp
Cache of limit.
G4double eventGeneratorMinXp
Cache of limit.
virtual void CheckParameters()
G4String acceptedParticlesString
Cache of string for parsing on first query.
G4double eventGeneratorMaxEK
Cache of limit.
void ParseAcceptedParticleIDs()
G4double eventGeneratorMinY
Cache of limit.
G4double eventGeneratorMaxRp
Cache of limit.
G4double eventGeneratorMaxT
Cache of limit.
G4double eventGeneratorMinT
Cache of limit.
G4double eventGeneratorMaxYp
Cache of limit.
G4double eventGeneratorMinZp
Cache of limit.
G4double eventGeneratorMaxX
Cache of limit.
G4bool firstTime
Flag to prepare acceptedParticles on first call.
G4double eventGeneratorMinZ
Cache of limit.
G4double eventGeneratorMaxY
Cache of limit.
G4bool testOnParticleType
Flag whether to bother applying search.
G4double eventGeneratorMinEK
Cache of limit.
G4double eventGeneratorMinYp
Cache of limit.
G4double eventGeneratorMinX
Cache of limit.
virtual void SetOptions(const BDSParticleDefinition *beamParticle, const GMAD::Beam &beam, const BDSBunchType &distrType, G4Transform3D beamlineTransformIn=G4Transform3D::Identity, G4double beamlineS=0)
Pull out the relevant options and then pass through to BDSBunch::SetOptions().
G4double eventGeneratorMaxZp
Cache of limit.
G4bool AcceptParticle(const BDSParticleCoordsFull &coords, G4double rpOriginal, G4double kineticEnergy, G4int pdgID)
An intermediate layer for any bunch classes that are file based.
virtual void SetOptions(const BDSParticleDefinition *beamParticle, const GMAD::Beam &beam, const BDSBunchType &distrType, G4Transform3D beamlineTransformIn=G4Transform3D::Identity, const G4double beamlineS=0)
Pull out the relevant options and then pass through to BDSBunch::SetOptions().
G4double Yp0
Centre of distributions.
G4double T0
Centre of distributions.
G4double X0
Centre of distributions.
G4double Xp0
Centre of distributions.
G4double Y0
Centre of distributions.
virtual void CheckParameters()
General exception with possible name of object and message.
A set of particle coordinates including energy and weight.
Wrapper for particle definition.
Improve type-safety of native enum data type in C++.
double eventGeneratorMaxYp
fo event generator file filter
double eventGeneratorMaxXp
fo event generator file filter
double eventGeneratorMaxEK
fo event generator file filter
double eventGeneratorMaxZp
fo event generator file filter
double eventGeneratorMinYp
fo event generator file filter
double eventGeneratorMinEK
fo event generator file filter
double eventGeneratorMaxZ
fo event generator file filter
double eventGeneratorMinY
fo event generator file filter
int eventGeneratorNEventsSkip
fo event generator file filter
double eventGeneratorMaxRp
fo event generator file filter
double eventGeneratorMinZ
fo event generator file filter
double eventGeneratorMinXp
fo event generator file filter
double eventGeneratorMinZp
fo event generator file filter
std::string eventGeneratorParticles
fo event generator file filter
double eventGeneratorMaxY
fo event generator file filter
double eventGeneratorMinT
fo event generator file filter
double eventGeneratorMaxT
fo event generator file filter
double eventGeneratorMaxX
fo event generator file filter
double eventGeneratorMinRp
fo event generator file filter
double eventGeneratorMinX
fo event generator file filter
void PrintDefinedParticles()
G4bool IsFinite(G4double value, G4double tolerance=std::numeric_limits< double >::epsilon())