BDSIM
BDSIM is a Geant4 extension toolkit for simulation of particle transport in accelerator beamlines.
BDSBunchSigmaMatrix.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 "BDSBunchSigmaMatrix.hh"
20#include "BDSDebug.hh"
21#include "BDSUtilities.hh"
22
23#include "parser/beam.h"
24
25#include "Randomize.hh"
26#include "CLHEP/Matrix/SymMatrix.h"
27#include "CLHEP/Matrix/Vector.h"
28#include "CLHEP/RandomObjects/RandMultiGauss.h"
29#include "CLHEP/Units/PhysicalConstants.h"
30
31BDSBunchSigmaMatrix::BDSBunchSigmaMatrix():
32 BDSBunchGaussian("sigma matrix")
33{;}
34
36 const GMAD::Beam& beam,
37 const BDSBunchType& distrType,
38 G4Transform3D beamlineTransformIn,
39 const G4double beamlineSIn)
40{
41 // Fill means and class BDSBunch::SetOptions
42 BDSBunchGaussian::SetOptions(beamParticle, beam, distrType, beamlineTransformIn, beamlineSIn);
43
44 switch (distrType.underlying())
45 {
46 case BDSBunchType::gaussmatrix:
47 {
48 sigmaGM[0][0] = beam.sigma11;
49 sigmaGM[0][1] = beam.sigma12;
50 sigmaGM[0][2] = beam.sigma13;
51 sigmaGM[0][3] = beam.sigma14;
52 sigmaGM[0][4] = beam.sigma15;
53 sigmaGM[0][5] = beam.sigma16;
54 sigmaGM[1][1] = beam.sigma22;
55 sigmaGM[1][2] = beam.sigma23;
56 sigmaGM[1][3] = beam.sigma24;
57 sigmaGM[1][4] = beam.sigma25;
58 sigmaGM[1][5] = beam.sigma26;
59 sigmaGM[2][2] = beam.sigma33;
60 sigmaGM[2][3] = beam.sigma34;
61 sigmaGM[2][4] = beam.sigma35;
62 sigmaGM[2][5] = beam.sigma36;
63 sigmaGM[3][3] = beam.sigma44;
64 sigmaGM[3][4] = beam.sigma45;
65 sigmaGM[3][5] = beam.sigma46;
66 sigmaGM[4][4] = beam.sigma55;
67 sigmaGM[4][5] = beam.sigma56;
68 sigmaGM[5][5] = beam.sigma66;
69 if (BDS::IsFinite(beam.sigma55))
70 {finiteSigmaT = true;}
71 if (BDS::IsFinite(beam.sigma66))
72 {finiteSigmaE = true;}
73 break;
74 }
75 case BDSBunchType::gauss:
76 {
77 sigmaGM[0][0] = std::pow(beam.sigmaX, 2);
78 sigmaGM[1][1] = std::pow(beam.sigmaXp,2);
79 sigmaGM[2][2] = std::pow(beam.sigmaY, 2);
80 sigmaGM[3][3] = std::pow(beam.sigmaYp,2);
81 sigmaGM[4][4] = std::pow(sigmaT, 2); // these are made slightly finite in BDSBunchGaussian
82 sigmaGM[5][5] = std::pow(sigmaE, 2); // if 0 to ensure +ve definiteness
83 break;
84 }
85 default:
86 {// here to cover compiler warnings - guarantee from our BDSBunchFactory this won't happen
87 break;
88 }
89 }
90#ifdef BDSDEBUG
91 G4cout << "sigmaGM" << sigmaGM << G4endl;
92#endif
93 delete gaussMultiGen;
94 gaussMultiGen = CreateMultiGauss(*CLHEP::HepRandom::getTheEngine(),meansGM,sigmaGM);
95}
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)
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:173
G4bool finiteSigmaE
Flags to ignore random number generator in case of no finite E or T.
Definition: BDSBunch.hh:189
G4double sigmaT
Centre of distributions.
Definition: BDSBunch.hh:171
G4bool finiteSigmaT
Flags to ignore random number generator in case of no finite E or T.
Definition: BDSBunch.hh:190
Wrapper for particle definition.
Improve type-safety of native enum data type in C++.
type underlying() const
return underlying value (can be used in switch statement)
double sigma45
for the gaussian sigma matrix distribution
Definition: beamBase.h:100
double sigma16
for the gaussian sigma matrix distribution
Definition: beamBase.h:97
double sigmaX
for the gaussian beam distribution
Definition: beamBase.h:87
double sigma66
for the gaussian sigma matrix distribution
Definition: beamBase.h:102
double sigma35
for the gaussian sigma matrix distribution
Definition: beamBase.h:99
double sigma44
for the gaussian sigma matrix distribution
Definition: beamBase.h:100
double sigmaXp
for the gaussian beam distribution
Definition: beamBase.h:87
double sigma13
for the gaussian sigma matrix distribution
Definition: beamBase.h:97
double sigma34
for the gaussian sigma matrix distribution
Definition: beamBase.h:99
double sigmaYp
for the gaussian beam distribution
Definition: beamBase.h:87
double sigma12
for the gaussian sigma matrix distribution
Definition: beamBase.h:97
double sigma26
for the gaussian sigma matrix distribution
Definition: beamBase.h:98
double sigma25
for the gaussian sigma matrix distribution
Definition: beamBase.h:98
double sigma36
for the gaussian sigma matrix distribution
Definition: beamBase.h:99
double sigma46
for the gaussian sigma matrix distribution
Definition: beamBase.h:100
double sigma14
for the gaussian sigma matrix distribution
Definition: beamBase.h:97
double sigma23
for the gaussian sigma matrix distribution
Definition: beamBase.h:98
double sigma11
for the gaussian sigma matrix distribution
Definition: beamBase.h:97
double sigma22
for the gaussian sigma matrix distribution
Definition: beamBase.h:98
double sigma33
for the gaussian sigma matrix distribution
Definition: beamBase.h:99
double sigma15
for the gaussian sigma matrix distribution
Definition: beamBase.h:97
double sigma55
for the gaussian sigma matrix distribution
Definition: beamBase.h:101
double sigma56
for the gaussian sigma matrix distribution
Definition: beamBase.h:101
double sigma24
for the gaussian sigma matrix distribution
Definition: beamBase.h:98
double sigmaY
for the gaussian beam distribution
Definition: beamBase.h:87
Beam class.
Definition: beam.h:44
G4bool IsFinite(G4double value, G4double tolerance=std::numeric_limits< double >::epsilon())