1 #ifndef OPAL_Distribution_HH
2 #define OPAL_Distribution_HH
35 #include <gsl/gsl_histogram.h>
36 #include <gsl/gsl_qrng.h>
37 #include <gsl/gsl_rng.h>
39 #ifdef WITH_UNIT_TESTS
40 #include <gtest/gtest_prod.h>
45 template <
class T,
unsigned Dim>
254 size_t numberOfParticles,
255 double current,
const Beamline &bl);
257 std::vector<Distribution *> addedDistributions,
262 std::vector<Distribution *> addedDistributions,
263 size_t &numberOfParticles);
337 void shiftBeam(
double &maxTOrZ,
double &minTOrZ);
346 #ifdef WITH_UNIT_TESTS
347 FRIEND_TEST(GaussTest, FullSigmaTest1);
348 FRIEND_TEST(GaussTest, FullSigmaTest2);
349 FRIEND_TEST(BinomialTest, FullSigmaTest1);
350 FRIEND_TEST(BinomialTest, FullSigmaTest2);
361 void applyEmissionModel(
double lowEnergyLimit,
double &px,
double &py,
double &pz, std::vector<double> &additionalRNs);
362 void applyEmissModelAstra(
double &px,
double &py,
double &pz, std::vector<double> &additionalRNs);
364 void applyEmissModelNonEquil(
double eZ,
double &px,
double &py,
double &pz, std::vector<double> &additionalRNs);
365 void create(
size_t &numberOfParticles,
double massIneV);
379 virtual double get(
double rand) = 0;
391 virtual double get(
double rand);
398 virtual double get(
double rand);
759 #endif // OPAL_Distribution_HH
Vector_t pmean_m
Total thermal momentum.
double getEmissionDeltaT()
std::vector< double > & getBGxDist()
void doRestartOpalCycl(PartBunchBase< double, 3 > *p, size_t Np, int restartStep, const int specifiedNumBunch, H5PartWrapper *h5wrapper)
void printDist(Inform &os, size_t numberOfParticles) const
std::ostream & operator<<(std::ostream &os, const Attribute &attr)
EmissionModelT::EmissionModelT emissionModel_m
Emission Model.
double getLaserEnergy() const
void applyEmissionModel(double lowEnergyLimit, double &px, double &py, double &pz, std::vector< double > &additionalRNs)
void chooseInputMomentumUnits(InputMomentumUnitsT::InputMomentumUnitsT inputMoUnits)
const PartData & getReference() const
Return the embedded CLASSIC PartData.
virtual void update()
Update this object.
std::vector< double > yWrite_m
void doRestartOpalE(EnvelopeBunch *p, size_t Np, int restartStep, H5PartWrapper *h5wrapper)
double getEInitThreshold()
std::vector< size_t > particlesPerDist_m
bool GetPreviousH5Local()
size_t darkCurrentParts_m
std::vector< double > tOrZWrite_m
void adjustPhaseSpace(double massIneV)
void initializeBeam(PartBunchBase< double, 3 > *beam)
double getPercentageEmitted() const
std::vector< double > xDist_m
The base class for all OPAL definitions.
double pTotThermal_m
Random number generator.
std::vector< double > tOrZDist_m
core of the envelope tracker based on Rene Bakkers BET implementation
std::vector< double > pxWrite_m
int getNumberOfEnergyBins()
void createOpalCycl(PartBunchBase< double, 3 > *beam, size_t numberOfParticles, double current, const Beamline &bl)
virtual bool canReplaceBy(Object *object)
Distribution can only be replaced by another distribution.
void createDistributionFromFile(size_t numberOfParticles, double massIneV)
double getFieldFNThreshold()
double tEmission_m
Emission parameters.
double darkInwardMargin_m
Number of dark current particles.
std::string laserProfileFileName_m
std::vector< std::vector< double > > additionalRNs_m
Upper limit on emission energy distribution (eV).
DistrTypeT::DistrTypeT getType() const
void shiftBeam(double &maxTOrZ, double &minTOrZ)
void calcPartPerDist(size_t numberOfParticles)
std::vector< double > & getBGzDist()
void generateBinomial(size_t numberOfParticles)
InputMomentumUnitsT::InputMomentumUnitsT inputMoUnits_m
double emitEnergyUpperLimit_m
Cathode temperature (K).
void createDistributionGauss(size_t numberOfParticles, double massIneV)
double getEmissionTimeShift() const
static Distribution * find(const std::string &name)
void operator=(const Distribution &)=delete
double getEnergyBinDeltaT()
void writeOutFileEmission()
void setFieldEmissionParameters()
std::vector< double > xWrite_m
std::vector< Attribute > itsAttr
The object attributes (see Attribute.hh).
void createBoundaryGeometry(PartBunchBase< double, 3 > *p, BoundaryGeometry &bg)
double getDarkCurrentParticlesInwardMargin()
std::vector< double > & getYDist()
void scaleDistCoordinates()
size_t totalNumberParticles_m
std::vector< Distribution * > addedDistributions_m
Vector of distributions to be added to this distribution.
double getWorkFunctionRf() const
void generateFlattopZ(size_t numberOfParticles)
std::string getTypeofDistribution()
size_t emitParticles(PartBunchBase< double, 3 > *beam, double eZ)
Inform & printInfo(Inform &os) const
bool getBool(const Attribute &attr)
Return logical value.
size_t getMaxFNemissionPartPerTri()
void setupEmissionModelNonEquil()
void setupEnergyBins(double maxTOrZ, double minTOrZ)
void setDistParametersBinomial(double massIneV)
void generateGaussZ(size_t numberOfParticles)
void printDistSurfEmission(Inform &os) const
unsigned int numberOfDistributions_m
and list type for switch statements.
void printEmissionModelNonEquil(Inform &os) const
size_t getNumberOfEmissionSteps()
void createDistributionFlattop(size_t numberOfParticles, double massIneV)
std::vector< double > pzWrite_m
void injectBeam(PartBunchBase< double, 3 > *beam)
void create(size_t &numberOfParticles, double massIneV)
void createPriPart(PartBunchBase< double, 3 > *beam, BoundaryGeometry &bg)
void setupEmissionModelAstra(PartBunchBase< double, 3 > *beam)
void printDistGauss(Inform &os) const
void printDistFromFile(Inform &os) const
LaserProfile * laserProfile_m
double getFNParameterVYZero()
void printDistMatchedGauss(Inform &os) const
virtual void execute()
Execute the command.
void printEnergyBins(Inform &os) const
void generateFlattopLaserProfile(size_t numberOfParticles)
void checkEmissionParameters()
size_t findEBin(double tOrZ)
void generateAstraFlattopT(size_t numberOfParticles)
int getSecondaryEmissionFlag()
PartData particleRefData_m
void setupEmissionModel(PartBunchBase< double, 3 > *beam)
std::vector< double > & getTOrZDist()
double cathodeTemp_m
Cathode material Fermi energy (eV).
double getFNParameterVYSecond()
An abstract sequence of beam line components.
double getFieldEnhancement()
double converteVToBetaGamma(double valueIneV, double massIneV)
double laserEnergy_m
Cathode material work function (eV).
std::string laserImageName_m
void setupParticleBins(double massIneV, PartBunchBase< double, 3 > *beam)
MDependentBehavior(double a)
std::vector< double > pyWrite_m
void generateTransverseGauss(size_t numberOfParticles)
void applyEmissModelNone(double &pz)
void printDistSurfAndCreate(Inform &os) const
gsl_qrng * selectRandomGenerator(std::string, unsigned int dimension)
Select and allocate gsl random number generator.
void generateLongFlattopT(size_t numberOfParticles)
void writeOutFileHeader()
void printEmissionModelNone(Inform &os) const
void setupEmissionModelNone(PartBunchBase< double, 3 > *beam)
size_t getNumberOfParticlesInFile(std::ifstream &inputFile)
double currentEmissionTime_m
The base class for all OPAL objects.
double tRise_m
time binned distribution with thermal energy
void createMatchedGaussDistribution(size_t numberOfParticles, double massIneV)
virtual Distribution * clone(const std::string &name)
Return a clone.
Vector_t get_pmean() const
void doRestartOpalT(PartBunchBase< double, 3 > *p, size_t Np, int restartStep, H5PartWrapper *h5wrapper)
void createOpalE(Beam *beam, std::vector< Distribution * > addedDistributions, EnvelopeBunch *envelopeBunch, double distCenter, double Bz0)
void writeOutFileInjection()
size_t totalNumberEmittedParticles_m
void applyEmissModelAstra(double &px, double &py, double &pz, std::vector< double > &additionalRNs)
size_t getNumberOfDarkCurrentParticles()
std::vector< double > & getXDist()
void shiftDistCoordinates(double massIneV)
void setDistParametersFlattop(double massIneV)
DistrTypeT::DistrTypeT distrTypeT_m
Distribution type. Declared as string.
double cathodeFermiEnergy_m
Laser photon energy (eV).
void applyEmissModelNonEquil(double eZ, double &px, double &py, double &pz, std::vector< double > &additionalRNs)
int getLastEmittedEnergyBin()
MDependentBehavior(const MDependentBehavior &rhs)
void createDistributionBinomial(size_t numberOfParticles, double massIneV)
double getReal(const Attribute &attr)
Return real value.
std::vector< double > & getBGyDist()
void setDistToEmitted(bool emitted)
double tPulseLengthFWHM_m
void printDistFlattop(Inform &os) const
std::vector< double > pzDist_m
std::vector< double > yDist_m
void setNumberOfDistributions(unsigned int n)
void setDistParametersGauss(double massIneV)
std::vector< double > pyDist_m
void generateFlattopT(size_t numberOfParticles)
void checkParticleNumber(size_t &numberOfParticles)
void reflectDistribution(size_t &numberOfParticles)
void printDistBinomial(Inform &os) const
double laserIntensityCut_m
void createOpalT(PartBunchBase< double, 3 > *beam, std::vector< Distribution * > addedDistributions, size_t &numberOfParticles)
double fieldEnhancement_m
Work function of surface material (eV).
void printEmissionModel(Inform &os) const
void printEmissionModelAstra(Inform &os) const
void setEmissionTime(double &maxT, double &minT)
gsl_histogram * energyBinHist_m
Distribution energy bins.
std::vector< double > pxDist_m
double vVThermal_m
Velocity scalar for parallel plate benchmark.
virtual ~BinomialBehaviorSplitter()
SymTenzor< double, 6 > correlationMatrix_m
std::string getString(const Attribute &attr)
Get string value.
size_t getNumOfLocalParticlesToCreate(size_t n)
std::vector< size_t > binWrite_m