18 #ifndef OPAL_Distribution_HH
19 #define OPAL_Distribution_HH
33 #include <gsl/gsl_histogram.h>
34 #include <gsl/gsl_qrng.h>
35 #include <gsl/gsl_rng.h>
37 #ifdef WITH_UNIT_TESTS
38 #include <gtest/gtest_prod.h>
44 template <
class T,
unsigned Dim>
219 size_t numberOfParticles,
220 double current,
const Beamline &bl);
222 std::vector<Distribution *> addedDistributions,
223 size_t &numberOfParticles);
255 void shiftBeam(
double &maxTOrZ,
double &minTOrZ);
262 #ifdef WITH_UNIT_TESTS
263 FRIEND_TEST(GaussTest, FullSigmaTest1);
264 FRIEND_TEST(GaussTest, FullSigmaTest2);
265 FRIEND_TEST(BinomialTest, FullSigmaTest1);
266 FRIEND_TEST(BinomialTest, FullSigmaTest2);
289 void applyEmissionModel(
double lowEnergyLimit,
double &px,
double &py,
double &pz, std::vector<double> &additionalRNs);
290 void applyEmissModelAstra(
double &px,
double &py,
double &pz, std::vector<double> &additionalRNs);
292 void applyEmissModelNonEquil(
double eZ,
double &px,
double &py,
double &pz, std::vector<double> &additionalRNs);
299 void create(
size_t &numberOfParticles,
double massIneV,
double charge);
312 virtual double get(
double rand) = 0;
324 virtual double get(
double rand);
331 virtual double get(
double rand);
340 double massIneV,
double charge);
352 size_t numberOfParticles,
double massIneV);
Inform & operator<<(Inform &os, const Distribution &d)
std::string getString(const Attribute &attr)
Get string value.
The base class for all OPAL definitions.
The base class for all OPAL objects.
std::vector< Attribute > itsAttr
The object attributes.
An abstract sequence of beam line components.
void shiftDistCoordinates(double massIneV)
static Distribution * find(const std::string &name)
void setDistParametersBinomial(double massIneV)
std::vector< double > & getBGzDist()
std::vector< double > & getTOrZDist()
PartData particleRefData_m
std::vector< double > xWrite_m
Vector_t pmean_m
Total thermal momentum.
void generateFlattopT(size_t numberOfParticles)
double cathodeTemp_m
Cathode material Fermi energy (eV).
void createOpalCycl(PartBunchBase< double, 3 > *beam, size_t numberOfParticles, double current, const Beamline &bl)
void adjustPhaseSpace(double massIneV)
std::vector< double > pxWrite_m
void writeOutFileHeader()
void checkEmissionParameters()
std::vector< double > tOrZDist_m
Vector_t get_pmean() const
double tPulseLengthFWHM_m
EmissionModelT::EmissionModelT emissionModel_m
Emission Model.
int getNumberOfEnergyBins()
virtual void execute()
Execute the command.
gsl_histogram * energyBinHist_m
Distribution energy bins.
void setupEmissionModelAstra(PartBunchBase< double, 3 > *beam)
void printEnergyBins(Inform &os) const
std::vector< std::vector< double > > additionalRNs_m
Upper limit on emission energy distribution (eV).
std::vector< double > pxDist_m
std::vector< double > yWrite_m
double getEmissionDeltaT()
void printDistBinomial(Inform &os) const
double cathodeFermiEnergy_m
Laser photon energy (eV).
Distribution(const Distribution &)=delete
double emitEnergyUpperLimit_m
Cathode temperature (K).
void calcPartPerDist(size_t numberOfParticles)
unsigned int numberOfDistributions_m
and list type for switch statements.
void initializeBeam(PartBunchBase< double, 3 > *beam)
void doRestartOpalT(PartBunchBase< double, 3 > *p, size_t Np, int restartStep, H5PartWrapper *h5wrapper)
void applyEmissModelNonEquil(double eZ, double &px, double &py, double &pz, std::vector< double > &additionalRNs)
std::vector< double > & getBGxDist()
void chooseInputMomentumUnits(InputMomentumUnitsT::InputMomentumUnitsT inputMoUnits)
void createOpalT(PartBunchBase< double, 3 > *beam, std::vector< Distribution * > addedDistributions, size_t &numberOfParticles)
void generateAstraFlattopT(size_t numberOfParticles)
size_t getNumberOfParticlesInFile(std::ifstream &inputFile)
DistrTypeT::DistrTypeT getType() const
DistrTypeT::DistrTypeT distrTypeT_m
Distribution type. Declared as string.
void createDistributionBinomial(size_t numberOfParticles, double massIneV)
void setupEmissionModelNone(PartBunchBase< double, 3 > *beam)
virtual bool canReplaceBy(Object *object)
Distribution can only be replaced by another distribution.
std::vector< Distribution * > addedDistributions_m
Vector of distributions to be added to this distribution.
void doRestartOpalCycl(PartBunchBase< double, 3 > *p, size_t Np, int restartStep, const int specifiedNumBunch, H5PartWrapper *h5wrapper)
std::vector< double > tOrZWrite_m
std::vector< double > & getXDist()
size_t getNumberOfEmissionSteps()
void injectBeam(PartBunchBase< double, 3 > *beam)
std::string laserImageName_m
void operator=(const Distribution &)=delete
void create(size_t &numberOfParticles, double massIneV, double charge)
std::vector< double > pyDist_m
int getLastEmittedEnergyBin()
std::string getTypeofDistribution()
void createDistributionMultiGauss(size_t numberOfParticles, double massIneV)
double laserEnergy_m
Cathode material work function (eV).
void setEmissionTime(double &maxT, double &minT)
void setupEnergyBins(double maxTOrZ, double minTOrZ)
void printEmissionModelNone(Inform &os) const
LaserProfile * laserProfile_m
std::vector< double > yDist_m
void generateFlattopZ(size_t numberOfParticles)
std::vector< size_t > particlesPerDist_m
void setNumberOfDistributions(unsigned int n)
void generateMatchedGauss(const SigmaGenerator::matrix_t &, size_t numberOfParticles, double massIneV)
double getPercentageEmitted() const
double tRise_m
time binned distribution with thermal energy
void setSigmaP_m(double massIneV)
std::string laserProfileFileName_m
std::vector< double > & getYDist()
void printDistFromFile(Inform &os) const
virtual Distribution * clone(const std::string &name)
Return a clone.
double getEmissionTimeShift() const
void printDistMultiGauss(Inform &os) const
void reflectDistribution(size_t &numberOfParticles)
std::vector< double > pzWrite_m
virtual void update()
Update this object.
void generateLongFlattopT(size_t numberOfParticles)
void setDistParametersFlattop(double massIneV)
void printDistFlattop(Inform &os) const
void printDistMatchedGauss(Inform &os) const
static const double percentTEmission_m
void writeOutFileEmission()
void printEmissionModelAstra(Inform &os) const
void printEmissionModelNonEquil(Inform &os) const
void generateBinomial(size_t numberOfParticles)
std::vector< double > & getBGyDist()
void setupParticleBins(double massIneV, PartBunchBase< double, 3 > *beam)
void sampleUniformDisk(gsl_qrng *quasiRandGen2D, double &x1, double &x2)
double currentEmissionTime_m
std::vector< size_t > binWrite_m
double getEnergyBinDeltaT()
void createDistributionFromFile(size_t numberOfParticles, double massIneV)
size_t totalNumberParticles_m
double pTotThermal_m
Random number generator.
void setDistToEmitted(bool emitted)
void setDistParametersMultiGauss(double massIneV)
void createDistributionFlattop(size_t numberOfParticles, double massIneV)
size_t findEBin(double tOrZ)
void scaleDistCoordinates()
std::vector< double > pyWrite_m
SymTenzor< double, 6 > correlationMatrix_m
size_t getNumOfLocalParticlesToCreate(size_t n)
std::vector< double > pzDist_m
double tEmission_m
Emission parameters.
void generateFlattopLaserProfile(size_t numberOfParticles)
gsl_qrng * selectRandomGenerator(std::string, unsigned int dimension)
Select and allocate gsl random number generator.
void generateGaussZ(size_t numberOfParticles)
void printDist(Inform &os, size_t numberOfParticles) const
void applyEmissModelNone(double &pz)
void writeOutFileInjection()
size_t emitParticles(PartBunchBase< double, 3 > *beam, double eZ)
void applyEmissionModel(double lowEnergyLimit, double &px, double &py, double &pz, std::vector< double > &additionalRNs)
void applyEmissModelAstra(double &px, double &py, double &pz, std::vector< double > &additionalRNs)
void setupEmissionModelNonEquil()
void setupEmissionModel(PartBunchBase< double, 3 > *beam)
void printDistGauss(Inform &os) const
InputMomentumUnitsT::InputMomentumUnitsT inputMoUnits_m
void printEmissionModel(Inform &os) const
void setDistParametersGauss(double massIneV)
Inform & printInfo(Inform &os) const
void checkParticleNumber(size_t &numberOfParticles)
void createMatchedGaussDistribution(size_t numberOfParticles, double massIneV, double charge)
void createDistributionGauss(size_t numberOfParticles, double massIneV)
void shiftBeam(double &maxTOrZ, double &minTOrZ)
size_t totalNumberEmittedParticles_m
std::vector< double > xDist_m
double laserIntensityCut_m
void generateTransverseGauss(size_t numberOfParticles)
virtual ~BinomialBehaviorSplitter()
virtual double get(double rand)=0
MDependentBehavior(double a)
MDependentBehavior(const MDependentBehavior &rhs)
virtual double get(double rand)
virtual double get(double rand)
RealDiracMatrix::matrix_t matrix_t
Type for storing maps.