BDSIM
BDSIM is a Geant4 extension toolkit for simulation of particle transport in accelerator beamlines.
Loading...
Searching...
No Matches
BDSBunchGaussTwiss.cc
1/*
2Beam Delivery Simulation (BDSIM) Copyright (C) Royal Holloway,
3University of London 2001 - 2024.
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 "BDSBunchGaussTwiss.hh"
20#include "BDSDebug.hh"
21#include "BDSException.hh"
22
23#include "parser/beam.h"
24
25#include "globals.hh"
26
27#include "Randomize.hh"
28#include "CLHEP/RandomObjects/RandMultiGauss.h"
29
30#include <cmath>
31#include <vector>
32
33BDSBunchGaussTwiss::BDSBunchGaussTwiss():
34 BDSBunchGaussBase("gausstwiss"),
35 betaX(0.0), betaY(0.0),
36 alphaX(0.0), alphaY(0.0),
37 emitX(0.0), emitY(0.0),
38 gammaX(0.0), gammaY(0.0),
39 dispX(0.0), dispY(0.0),
40 dispXP(0.0), dispYP(0.0)
41{;}
42
44 const GMAD::Beam& beam,
45 const BDSBunchType& distrType,
46 G4Transform3D beamlineTransformIn,
47 const G4double beamlineSIn)
48{
49 // Fill means and class BDSBunch::SetOptions
50 BDSBunchGaussBase::SetOptions(beamParticle, beam, distrType, beamlineTransformIn, beamlineSIn);
51
52 betaX = beam.betx;
53 betaY = beam.bety;
54 alphaX = beam.alfx;
55 alphaY = beam.alfy;
56
57 G4double ex,ey; // dummy variables we don't need
58 SetEmittances(beamParticle, beam, emitX, emitY, ex, ey);
59
60 dispX = beam.dispx;
61 dispY = beam.dispy;
62 dispXP = beam.dispxp;
63 dispYP = beam.dispyp;
64 gammaX = (1.0+alphaX*alphaX)/betaX;
65 gammaY = (1.0+alphaY*alphaY)/betaY;
66
67 // Fill sigmas
68 //2x2 block in horizontal
69 sigmaGM[0][0] = emitX*betaX + std::pow(dispX*sigmaP,2);
70 sigmaGM[0][1] = -emitX*alphaX + dispX*dispXP*std::pow(sigmaP,2);
71 sigmaGM[1][0] = -emitX*alphaX + dispX*dispXP*std::pow(sigmaP,2);
72 sigmaGM[1][1] = emitX*gammaX + std::pow(dispXP*sigmaP,2);
73
74 //2x2 block in vertical
75 sigmaGM[2][2] = emitY*betaY + std::pow(dispY*sigmaP,2);
76 sigmaGM[2][3] = -emitY*alphaY + dispY*dispYP*std::pow(sigmaP,2);
77 sigmaGM[3][2] = -emitY*alphaY + dispY*dispYP*std::pow(sigmaP,2);;
78 sigmaGM[3][3] = emitY*gammaY + std::pow(dispYP*sigmaP,2);
79
80 //2 2x2 blocks for horizontal-vertical coupling
81 sigmaGM[2][0] = dispX*dispY*std::pow(sigmaP,2);
82 sigmaGM[0][2] = dispX*dispY*std::pow(sigmaP,2);
83 sigmaGM[3][0] = dispX*dispYP*std::pow(sigmaP,2);
84 sigmaGM[0][3] = dispX*dispYP*std::pow(sigmaP,2);
85 sigmaGM[2][1] = dispXP*dispY*std::pow(sigmaP,2);
86 sigmaGM[1][2] = dispXP*dispY*std::pow(sigmaP,2);
87 sigmaGM[3][1] = dispXP*dispYP*std::pow(sigmaP,2);
88 sigmaGM[1][3] = dispXP*dispYP*std::pow(sigmaP,2);
89
90 //2x2 block in longitudinal
91 sigmaGM[4][4] = std::pow(sigmaT,2);
92 sigmaGM[5][5] = std::pow(sigmaE,2);
93
94 //4 2x2 blocks for longitudinal-transverse coupling
95 sigmaGM[0][5] = dispX*std::pow(sigmaP,2);
96 sigmaGM[5][0] = dispX*std::pow(sigmaP,2);
97 sigmaGM[1][5] = dispXP*std::pow(sigmaP,2);
98 sigmaGM[5][1] = dispXP*std::pow(sigmaP,2);
99 sigmaGM[2][5] = dispY*std::pow(sigmaP,2);
100 sigmaGM[5][2] = dispY*std::pow(sigmaP,2);
101 sigmaGM[3][5] = dispYP*std::pow(sigmaP,2);
102 sigmaGM[5][3] = dispYP*std::pow(sigmaP,2);
103
104 // here we force check parameters early (called in factory) so it's before
105 // checking the matrix for +ve definite-ness in CreateMultiGauss to give a
106 // more meaningful error. Also keeps bunch classes overall simpler.
108
109 delete gaussMultiGen;
110 gaussMultiGen = CreateMultiGauss(*CLHEP::HepRandom::getTheEngine(),meansGM,sigmaGM);
111}
112
114{
116 if (emitX <= 0)
117 {throw BDSException(__METHOD_NAME__, "emitx must be finite!");}
118 if (emitY <= 0)
119 {throw BDSException(__METHOD_NAME__, "emity must be finite!");}
120 if (betaX <= 0)
121 {throw BDSException(__METHOD_NAME__, "betx must be finite!");}
122 if (betaY <= 0)
123 {throw BDSException(__METHOD_NAME__, "bety must be finite!");}
124}
Common functionality for a 6D Gaussian distribution.
virtual void SetOptions(const BDSParticleDefinition *beamParticle, const GMAD::Beam &beam, const BDSBunchType &distrType, G4Transform3D beamlineTransformIn=G4Transform3D::Identity, const G4double beamlineS=0)
CLHEP::RandMultiGauss * gaussMultiGen
Randon number generator with sigma matrix and mean.
CLHEP::RandMultiGauss * CreateMultiGauss(CLHEP::HepRandomEngine &anEngine, const CLHEP::HepVector &mu, CLHEP::HepSymMatrix &sigma)
G4double betaX
Twiss parameters.
G4double gammaY
Twiss parameters.
G4double alphaX
Twiss parameters.
G4double emitX
Twiss parameters.
G4double gammaX
Twiss parameters.
G4double dispYP
Twiss parameters.
G4double dispX
Twiss parameters.
G4double emitY
Twiss parameters.
G4double dispY
Twiss parameters.
G4double betaY
Twiss parameters.
G4double alphaY
Twiss parameters.
virtual void CheckParameters()
G4double dispXP
Twiss parameters.
virtual void SetOptions(const BDSParticleDefinition *beamParticle, const GMAD::Beam &beam, const BDSBunchType &distrType, G4Transform3D beamlineTransformIn=G4Transform3D::Identity, const G4double beamlineS=0)
G4double sigmaE
Centre of distributions.
Definition BDSBunch.hh:184
G4double sigmaP
Centre of distributions.
Definition BDSBunch.hh:183
G4double sigmaT
Centre of distributions.
Definition BDSBunch.hh:182
static void SetEmittances(const BDSParticleDefinition *beamParticle, const GMAD::Beam &beam, G4double &emittGeometricX, G4double &emittGeometricY, G4double &emittNormalisedX, G4double &emittNormalisedY)
Definition BDSBunch.cc:175
virtual void CheckParameters()
Definition BDSBunch.cc:223
General exception with possible name of object and message.
Wrapper for particle definition.
Improve type-safety of native enum data type in C++.
double dispy
initial twiss parameters
Definition beamBase.h:90
double alfy
initial twiss parameters
Definition beamBase.h:90
double betx
initial twiss parameters
Definition beamBase.h:90
double dispxp
initial twiss parameters
Definition beamBase.h:90
double dispyp
initial twiss parameters
Definition beamBase.h:90
double dispx
initial twiss parameters
Definition beamBase.h:90
double alfx
initial twiss parameters
Definition beamBase.h:90
double bety
initial twiss parameters
Definition beamBase.h:90
Beam class.
Definition beam.h:44