18 #ifndef OPAL_Distribution_HH
19 #define OPAL_Distribution_HH
28 #include <gsl/gsl_histogram.h>
29 #include <gsl/gsl_qrng.h>
30 #include <gsl/gsl_rng.h>
32 #ifdef WITH_UNIT_TESTS
33 #include <gtest/gtest_prod.h>
43 template <
class T,
unsigned Dim>
201 size_t numberOfParticles,
202 double current,
const Beamline &bl);
204 std::vector<Distribution *> addedDistributions,
205 size_t &numberOfParticles);
238 void shiftBeam(
double &maxTOrZ,
double &minTOrZ);
256 #ifdef WITH_UNIT_TESTS
257 FRIEND_TEST(GaussTest, FullSigmaTest1);
258 FRIEND_TEST(GaussTest, FullSigmaTest2);
259 FRIEND_TEST(BinomialTest, FullSigmaTest1);
260 FRIEND_TEST(BinomialTest, FullSigmaTest2);
283 void applyEmissionModel(
double lowEnergyLimit,
double &px,
double &py,
double &pz, std::vector<double> &additionalRNs);
284 void applyEmissModelAstra(
double &px,
double &py,
double &pz, std::vector<double> &additionalRNs);
286 void applyEmissModelNonEquil(
double eZ,
double &px,
double &py,
double &pz, std::vector<double> &additionalRNs);
293 void create(
size_t &numberOfParticles,
double massIneV,
double charge);
307 virtual double get(
double rand) = 0;
319 virtual double get(
double rand);
326 virtual double get(
double rand);
335 double massIneV,
double charge);
347 size_t numberOfParticles,
double massIneV);
520 #endif // OPAL_Distribution_HH
std::string laserProfileFileName_m
double cathodeFermiEnergy_m
Laser photon energy (eV).
boost::numeric::ublas::matrix< double > matrix_t
void applyEmissModelNonEquil(double eZ, double &px, double &py, double &pz, std::vector< double > &additionalRNs)
void setupEnergyBins(double maxTOrZ, double minTOrZ)
std::vector< double > & getBGzDist()
void generateBinomial(size_t numberOfParticles)
double laserEnergy_m
Cathode material work function (eV).
void generateGaussZ(size_t numberOfParticles)
size_t getNumberOfEmissionSteps()
std::vector< double > pyWrite_m
void setDistToEmitted(bool emitted)
The base class for all OPAL objects.
double tPulseLengthFWHM_m
void applyEmissModelNone(double &pz)
double getEnergyBinDeltaT()
void writeOutFileEmission()
void setNumberOfDistributions(unsigned int n)
void reflectDistribution(size_t &numberOfParticles)
void printDistMatchedGauss(Inform &os) const
void printEmissionModel(Inform &os) const
double tRise_m
time binned distribution with thermal energy
std::vector< double > & getYDist()
size_t emitParticles(PartBunchBase< double, 3 > *beam, double eZ)
std::vector< double > & getXDist()
std::ostream & operator<<(std::ostream &os, const Attribute &attr)
void generateAstraFlattopT(size_t numberOfParticles)
DistributionType distrTypeT_m
Distribution type strings.
int getLastEmittedEnergyBin()
void setDistParametersBinomial(double massIneV)
void printEmissionModelNonEquil(Inform &os) const
RealDiracMatrix::matrix_t matrix_t
Type for storing maps.
std::vector< double > & getBGyDist()
std::vector< double > pzWrite_m
MDependentBehavior(const MDependentBehavior &rhs)
void printDistFlattop(Inform &os) const
std::vector< double > pzDist_m
void adjustPhaseSpace(double massIneV)
double getPercentageEmitted() const
MDependentBehavior(double a)
void generateFlattopT(size_t numberOfParticles)
LaserProfile * laserProfile_m
An abstract sequence of beam line components.
void createOpalT(PartBunchBase< double, 3 > *beam, std::vector< Distribution * > addedDistributions, size_t &numberOfParticles)
void generateTransverseGauss(size_t numberOfParticles)
void printEmissionModelAstra(Inform &os) const
void printEnergyBins(Inform &os) const
void chooseInputMomentumUnits(InputMomentumUnits inputMoUnits)
void generateFlattopLaserProfile(size_t numberOfParticles)
size_t getNumberOfParticlesInFile(std::ifstream &inputFile)
std::vector< size_t > binWrite_m
double getEmissionDeltaT()
std::vector< double > & getBGxDist()
void printDist(Inform &os, size_t numberOfParticles) const
InputMomentumUnits inputMoUnits_m
void createDistributionGauss(size_t numberOfParticles, double massIneV)
void writeOutFileInjection()
void createMatchedGaussDistribution(size_t numberOfParticles, double massIneV, double charge)
double getEmissionTimeShift() const
static Distribution * find(const std::string &name)
void operator=(const Distribution &)=delete
size_t totalNumberEmittedParticles_m
void createDistributionMultiGauss(size_t numberOfParticles, double massIneV)
void printDistMultiGauss(Inform &os) const
std::vector< double > xWrite_m
void shiftDistCoordinates(double massIneV)
std::vector< double > tOrZWrite_m
void initializeBeam(PartBunchBase< double, 3 > *beam)
std::string laserImageName_m
void setupParticleBins(double massIneV, PartBunchBase< double, 3 > *beam)
void createDistributionBinomial(size_t numberOfParticles, double massIneV)
void scaleDistCoordinates()
int getNumberOfEnergyBins()
std::vector< double > yDist_m
void generateLongFlattopT(size_t numberOfParticles)
void setDistParametersGauss(double massIneV)
std::vector< std::vector< double > > additionalRNs_m
Upper limit on emission energy distribution (eV).
std::string outFilename_m
void checkFileMomentum(double momentumTol)
void generateMatchedGauss(const SigmaGenerator::matrix_t &, size_t numberOfParticles, double massIneV)
void printDistBinomial(Inform &os) const
double currentEmissionTime_m
void calcPartPerDist(size_t numberOfParticles)
unsigned int numberOfDistributions_m
List of Distribution types.
gsl_histogram * energyBinHist_m
Distribution energy bins.
std::vector< double > pxDist_m
virtual Distribution * clone(const std::string &name)
Return a clone.
void doRestartOpalT(PartBunchBase< double, 3 > *p, size_t Np, int restartStep, H5PartWrapper *h5wrapper)
void injectBeam(PartBunchBase< double, 3 > *beam)
void create(size_t &numberOfParticles, double massIneV, double charge)
size_t getNumOfLocalParticlesToCreate(size_t n)
void applyEmissModelAstra(double &px, double &py, double &pz, std::vector< double > &additionalRNs)
void setupEmissionModelAstra(PartBunchBase< double, 3 > *beam)
void printDistGauss(Inform &os) const
void sampleUniformDisk(gsl_qrng *quasiRandGen2D, double &x1, double &x2)
void setDistParametersFlattop(double massIneV)
std::vector< double > yWrite_m
size_t totalNumberParticles_m
virtual ~BinomialBehaviorSplitter()
void generateFlattopZ(size_t numberOfParticles)
std::vector< double > xDist_m
size_t findEBin(double tOrZ)
std::vector< double > pyDist_m
void checkParticleNumber(size_t &numberOfParticles)
void setupEmissionModelNonEquil()
double laserIntensityCut_m
void createOpalCycl(PartBunchBase< double, 3 > *beam, size_t numberOfParticles, double current, const Beamline &bl)
void setEmissionTime(double &maxT, double &minT)
The base class for all OPAL definitions.
void createDistributionFromFile(size_t numberOfParticles, double massIneV)
void createDistributionFlattop(size_t numberOfParticles, double massIneV)
DistributionType getType() const
void shiftBeam(double &maxTOrZ, double &minTOrZ)
Vector_t pmean_m
Total thermal momentum.
void setDistParametersMultiGauss(double massIneV)
void doRestartOpalCycl(PartBunchBase< double, 3 > *p, size_t Np, int restartStep, const int specifiedNumBunch, H5PartWrapper *h5wrapper)
void setSigmaP_m(double massIneV)
void printDistFromFile(Inform &os) const
double emitEnergyUpperLimit_m
Cathode temperature (K).
void applyEmissionModel(double lowEnergyLimit, double &px, double &py, double &pz, std::vector< double > &additionalRNs)
virtual void update()
Update this object.
virtual void execute()
Execute the command.
gsl_qrng * selectRandomGenerator(std::string, unsigned int dimension)
Select and allocate gsl random number generator.
std::vector< size_t > particlesPerDist_m
void writeOutFileHeader()
EmissionModel emissionModel_m
Emission Model.
void printEmissionModelNone(Inform &os) const
void setupEmissionModelNone(PartBunchBase< double, 3 > *beam)
void checkEmissionParameters()
matrix_t correlationMatrix_m
static const double percentTEmission_m
double pTotThermal_m
Random number generator.
std::vector< double > tOrZDist_m
Vector_t get_pmean() const
PartData particleRefData_m
std::vector< double > pxWrite_m
void setupEmissionModel(PartBunchBase< double, 3 > *beam)
std::vector< double > & getTOrZDist()
double cathodeTemp_m
Cathode material Fermi energy (eV).
std::vector< Distribution * > addedDistributions_m
Vector of distributions to be added to this distribution.
std::string getTypeofDistribution()
virtual bool canReplaceBy(Object *object)
Distribution can only be replaced by another distribution.
Inform & printInfo(Inform &os) const
double tEmission_m
Emission parameters.