18#include "BDSBunchHaloFlatSigma.hh"
20#include "BDSException.hh"
21#include "BDSParticleCoordsFull.hh"
23#include "parser/beam.h"
27#include "CLHEP/Random/RandFlat.h"
28#include "CLHEP/Units/SystemOfUnits.h"
29#include "Randomize.hh"
42 G4double action = aa.action;
43 G4double angle = aa.angle;
44 G4double alpha = tp.alpha;
45 G4double beta = tp.beta;
46 G4double x = std::sqrt(2 * action * beta) * std::cos(angle);
47 G4double xp = (-std::sqrt(2 * action / beta) * (std::sin(angle) + alpha * std::cos(angle)));
52 EllipsePointGenerator::EllipsePointGenerator(G4double actionIn,
60 std::vector<PhaseSpaceCoord> points;
61 points.reserve(npoints);
64 for (G4int i = 0; i <= npoints; ++i)
66 G4double angle = i * CLHEP::twopi / npoints;
67 angles.push_back(angle);
69 points.push_back(PhaseSpaceCoordFromActionAngle(aa, twisspair));
75 std::vector<G4double> cumulativeDistances = CumulativeDistances(points);
76 cumulativeDistances.insert(std::begin(cumulativeDistances), 0);
77 pathLengths = std::move(cumulativeDistances);
83 G4double pathLength = EllipsePerimeter() * G4RandFlat::shoot();
85 G4double angle = PathLengthToAngle(pathLength);
87 return PhaseSpaceCoordFromActionAngle(aa, twisspair);
90 G4double EllipsePointGenerator::PathLengthToAngle(G4double pathLength)
const
93 auto it = std::lower_bound(std::begin(pathLengths), std::end(pathLengths), pathLength);
94 auto n = std::distance(std::begin(pathLengths), it);
99 G4double s0 = *(--it);
100 G4double angle0 = *std::next(std::begin(angles), n - 1);
101 G4double angle1 = *std::next(std::begin(angles), n);
104 G4double angle = angle0 + (pathLength - s0) * ((angle1 - angle0) / (s1 - s0));
109BDSBunchHaloFlatSigma::BDSBunchHaloFlatSigma():
111 alphaX(0.0), alphaY(0.0),
112 betaX(0.0), betaY(0.0),
113 emitX(0.0), emitY(0.0),
114 sigmaX(0.0), sigmaY(0.0),
115 haloNSigmaXInner(0.0), haloNSigmaXOuter(0.0),
116 haloNSigmaYInner(0.0), haloNSigmaYOuter(0.0)
122 G4Transform3D beamlineTransformIn,
123 const G4double beamlineSIn)
147 G4double xsigrange = (haloNSigmaXOuter - haloNSigmaXInner);
148 G4double ysigrange = (haloNSigmaYOuter - haloNSigmaYInner);
149 G4double xnsig = haloNSigmaXInner + G4RandFlat::shoot() * xsigrange;
150 G4double ynsig = haloNSigmaYInner + G4RandFlat::shoot() * ysigrange;
154 G4double csix = std::pow(xnsig *
sigmaX, 2) /
betaX;
155 G4double csiy = std::pow(ynsig *
sigmaY, 2) /
betaY;
157 G4double jx = csix / 2.0;
158 G4double jy = csiy / 2.0;
165 auto xps = epgx.GetRandomPointOnEllipse();
166 auto yps = epgy.GetRandomPointOnEllipse();
168 G4double x = (xps.position +
X0) * CLHEP::m;
169 G4double xp = (xps.momentum +
Xp0) * CLHEP::rad;
170 G4double y = (yps.position +
Y0) * CLHEP::m;
171 G4double yp = (yps.momentum +
Yp0) * CLHEP::rad;
174 G4double weight = 1.0;
184 {
throw BDSException(__METHOD_NAME__,
"emitx must be > 0!");}
186 {
throw BDSException(__METHOD_NAME__,
"emity must be > 0!");}
188 if (haloNSigmaXInner <= 0)
189 {
throw BDSException(__METHOD_NAME__,
"haloNSigmaXInner <= 0");}
191 if (haloNSigmaYInner <= 0)
192 {
throw BDSException(__METHOD_NAME__,
"haloNSigmaYInner <= 0");}
194 if (haloNSigmaXInner > haloNSigmaXOuter)
195 {
throw BDSException(__METHOD_NAME__,
"haloNSigmaXInner cannot be less than haloNSigmaXOuter");}
197 if (haloNSigmaYInner > haloNSigmaYOuter)
198 {
throw BDSException(__METHOD_NAME__,
"haloNSigmaYInner cannot be less than haloNSigmaYOuter");}
G4double alphaX
Twiss parameter.
G4double sigmaY
Twiss parameter.
G4double betaY
Twiss parameter.
virtual void SetOptions(const BDSParticleDefinition *beamParticle, const GMAD::Beam &beam, const BDSBunchType &distrType, G4Transform3D beamlineTransformIn=G4Transform3D::Identity, const G4double beamlineS=0)
G4double sigmaX
Twiss parameter.
G4double emitX
Twiss parameter.
G4double betaX
Twiss parameter.
G4double emitY
Twiss parameter.
virtual BDSParticleCoordsFull GetNextParticleLocal()
G4double alphaY
Twiss parameter.
virtual void CheckParameters()
The base class for bunch distribution generators.
G4double Yp0
Centre of distributions.
G4double T0
Centre of distributions.
G4double S0
Centre of distributions.
G4double X0
Centre of distributions.
G4double Zp0
Centre of distributions.
G4double Xp0
Centre of distributions.
G4double E0
Centre of distributions.
static void SetEmittances(const BDSParticleDefinition *beamParticle, const GMAD::Beam &beam, G4double &emittGeometricX, G4double &emittGeometricY, G4double &emittNormalisedX, G4double &emittNormalisedY)
G4double Y0
Centre of distributions.
virtual void SetOptions(const BDSParticleDefinition *beamParticle, const GMAD::Beam &beam, const BDSBunchType &distrType, G4Transform3D beamlineTransformIn=G4Transform3D::Identity, const G4double beamlineS=0)
static G4double CalculateZp(G4double xp, G4double yp, G4double Zp0)
Calculate zp safely based on other components.
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++.
Class for generating points uniformly on ellipse perimeters via interpolation. Part of implementation...
double alfy
initial twiss parameters
double haloNSigmaYInner
for the halo distribution
double betx
initial twiss parameters
double haloNSigmaXInner
for the halo distribution
double haloNSigmaYOuter
for the halo distribution
double haloNSigmaXOuter
for the halo distribution
double alfx
initial twiss parameters
double bety
initial twiss parameters
Return either G4Tubs or G4CutTubs depending on flat face.
Simple struct for storing action/angle pairs to aid readability. Implementation detail.
Simple struct for storing position/momentum pairs to aid readability. Implementation detail.
Simple struct for storing Twiss alpha/beta pairs to aid readability. Implementation detail.