BDSIM
BDSIM is a Geant4 extension toolkit for simulation of particle transport in accelerator beamlines.
BDSBunchTwiss.cc
1/*
2Beam Delivery Simulation (BDSIM) Copyright (C) Royal Holloway,
3University of London 2001 - 2022.
4
5This file is part of BDSIM.
6
7BDSIM is free software: you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published
9by the Free Software Foundation version 3 of the License.
10
11BDSIM is distributed in the hope that it will be useful, but
12WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with BDSIM. If not, see <http://www.gnu.org/licenses/>.
18*/
19#include "BDSBunchTwiss.hh"
20#include "BDSDebug.hh"
21#include "BDSException.hh"
22#include "BDSUtilities.hh"
23
24#include "parser/beam.h"
25
26#include "globals.hh"
27
28#include "Randomize.hh"
29#include "CLHEP/Matrix/SymMatrix.h"
30#include "CLHEP/Matrix/Vector.h"
31#include "CLHEP/RandomObjects/RandMultiGauss.h"
32#include "CLHEP/Units/PhysicalConstants.h"
33
34#include <cmath>
35#include <vector>
36
37BDSBunchTwiss::BDSBunchTwiss():
38 BDSBunchGaussian("twiss"),
39 betaX(0.0), betaY(0.0),
40 alphaX(0.0), alphaY(0.0),
41 emitX(0.0), emitY(0.0),
42 gammaX(0.0), gammaY(0.0),
43 dispX(0.0), dispY(0.0),
44 dispXP(0.0), dispYP(0.0)
45{;}
46
48 const GMAD::Beam& beam,
49 const BDSBunchType& distrType,
50 G4Transform3D beamlineTransformIn,
51 const G4double beamlineSIn)
52{
53 // Fill means and class BDSBunch::SetOptions
54 BDSBunchGaussian::SetOptions(beamParticle, beam, distrType, beamlineTransformIn, beamlineSIn);
55
56 betaX = beam.betx;
57 betaY = beam.bety;
58 alphaX = beam.alfx;
59 alphaY = beam.alfy;
60
61 G4double ex,ey; // dummy variables we don't need
62 SetEmittances(beamParticle, beam, emitX, emitY, ex, ey);
63
64 dispX = beam.dispx;
65 dispY = beam.dispy;
66 dispXP = beam.dispxp;
67 dispYP = beam.dispyp;
68 gammaX = (1.0+alphaX*alphaX)/betaX;
69 gammaY = (1.0+alphaY*alphaY)/betaY;
70
71 // Fill sigmas
72 //2x2 block in horizontal
73 sigmaGM[0][0] = emitX*betaX + std::pow(dispX*sigmaP,2);
74 sigmaGM[0][1] = -emitX*alphaX + dispX*dispXP*std::pow(sigmaP,2);
75 sigmaGM[1][0] = -emitX*alphaX + dispX*dispXP*std::pow(sigmaP,2);
76 sigmaGM[1][1] = emitX*gammaX + std::pow(dispXP*sigmaP,2);
77
78 //2x2 block in vertical
79 sigmaGM[2][2] = emitY*betaY + std::pow(dispY*sigmaP,2);
80 sigmaGM[2][3] = -emitY*alphaY + dispY*dispYP*std::pow(sigmaP,2);
81 sigmaGM[3][2] = -emitY*alphaY + dispY*dispYP*std::pow(sigmaP,2);;
82 sigmaGM[3][3] = emitY*gammaY + std::pow(dispYP*sigmaP,2);
83
84 //2 2x2 blocks for horizontal-vertical coupling
85 sigmaGM[2][0] = dispX*dispY*std::pow(sigmaP,2);
86 sigmaGM[0][2] = dispX*dispY*std::pow(sigmaP,2);
87 sigmaGM[3][0] = dispX*dispYP*std::pow(sigmaP,2);
88 sigmaGM[0][3] = dispX*dispYP*std::pow(sigmaP,2);
89 sigmaGM[2][1] = dispXP*dispY*std::pow(sigmaP,2);
90 sigmaGM[1][2] = dispXP*dispY*std::pow(sigmaP,2);
91 sigmaGM[3][1] = dispXP*dispYP*std::pow(sigmaP,2);
92 sigmaGM[1][3] = dispXP*dispYP*std::pow(sigmaP,2);
93
94 //2x2 block in longitudinal
95 sigmaGM[4][4] = std::pow(sigmaT,2);
96 sigmaGM[5][5] = std::pow(sigmaE,2);
97
98 //4 2x2 blocks for longitudinal-transverse coupling
99 sigmaGM[0][5] = dispX*std::pow(sigmaP,2);
100 sigmaGM[5][0] = dispX*std::pow(sigmaP,2);
101 sigmaGM[1][5] = dispXP*std::pow(sigmaP,2);
102 sigmaGM[5][1] = dispXP*std::pow(sigmaP,2);
103 sigmaGM[2][5] = dispY*std::pow(sigmaP,2);
104 sigmaGM[5][2] = dispY*std::pow(sigmaP,2);
105 sigmaGM[3][5] = dispYP*std::pow(sigmaP,2);
106 sigmaGM[5][3] = dispYP*std::pow(sigmaP,2);
107
108 // here we force check parameters early (called in factory) so it's before
109 // checking the matrix for +ve definite-ness in CreateMultiGauss to give a
110 // more meaningful error. Also keeps bunch classes overall simpler.
112
113 delete gaussMultiGen;
114 gaussMultiGen = CreateMultiGauss(*CLHEP::HepRandom::getTheEngine(),meansGM,sigmaGM);
115}
116
118{
120 if (emitX <= 0)
121 {throw BDSException(__METHOD_NAME__, "emitx must be finite!");}
122 if (emitY <= 0)
123 {throw BDSException(__METHOD_NAME__, "emity must be finite!");}
124 if (betaX <= 0)
125 {throw BDSException(__METHOD_NAME__, "betx must be finite!");}
126 if (betaY <= 0)
127 {throw BDSException(__METHOD_NAME__, "bety must be finite!");}
128}
Common functionality for a 6D Gaussian distribution.
CLHEP::RandMultiGauss * CreateMultiGauss(CLHEP::HepRandomEngine &anEngine, const CLHEP::HepVector &mu, CLHEP::HepSymMatrix &sigma)
CLHEP::RandMultiGauss * gaussMultiGen
Randon number generator with sigma matrix and mean.
virtual void SetOptions(const BDSParticleDefinition *beamParticle, const GMAD::Beam &beam, const BDSBunchType &distrType, G4Transform3D beamlineTransformIn=G4Transform3D::Identity, const G4double beamlineS=0)
G4double gammaX
Twiss parameters.
G4double betaY
Twiss parameters.
virtual void CheckParameters()
G4double dispY
Twiss parameters.
G4double gammaY
Twiss parameters.
G4double emitY
Twiss parameters.
G4double dispYP
Twiss parameters.
G4double alphaY
Twiss parameters.
G4double dispX
Twiss parameters.
virtual void SetOptions(const BDSParticleDefinition *beamParticle, const GMAD::Beam &beam, const BDSBunchType &distrType, G4Transform3D beamlineTransformIn=G4Transform3D::Identity, const G4double beamlineS=0)
G4double emitX
Twiss parameters.
G4double alphaX
Twiss parameters.
G4double dispXP
Twiss parameters.
G4double betaX
Twiss parameters.
G4double sigmaE
Centre of distributions.
Definition: BDSBunch.hh:173
G4double sigmaP
Centre of distributions.
Definition: BDSBunch.hh:172
G4double sigmaT
Centre of distributions.
Definition: BDSBunch.hh:171
static void SetEmittances(const BDSParticleDefinition *beamParticle, const GMAD::Beam &beam, G4double &emittGeometricX, G4double &emittGeometricY, G4double &emittNormalisedX, G4double &emittNormalisedY)
Definition: BDSBunch.cc:155
virtual void CheckParameters()
Definition: BDSBunch.cc:195
General exception with possible name of object and message.
Definition: BDSException.hh:35
Wrapper for particle definition.
Improve type-safety of native enum data type in C++.
double dispy
initial twiss parameters
Definition: beamBase.h:82
double alfy
initial twiss parameters
Definition: beamBase.h:82
double betx
initial twiss parameters
Definition: beamBase.h:82
double dispxp
initial twiss parameters
Definition: beamBase.h:82
double dispyp
initial twiss parameters
Definition: beamBase.h:82
double dispx
initial twiss parameters
Definition: beamBase.h:82
double alfx
initial twiss parameters
Definition: beamBase.h:82
double bety
initial twiss parameters
Definition: beamBase.h:82
Beam class.
Definition: beam.h:44