18#ifndef OPAL_Distribution_HH
19#define OPAL_Distribution_HH
33#include "Manager/BaseManager.h"
34#include "Manager/PicManager.h"
39#include "Random/Distribution.h"
40#include "Random/InverseTransformSampling.h"
41#include "Random/NormalDistribution.h"
42#include "Random/Randn.h"
45#include <gtest/gtest_prod.h>
75 using Matrix_t = ippl::Vector<ippl::Vector<double, 6>, 6>;
100 ippl::Vector<double, 3>
get_pmean()
const;
101 ippl::Vector<double, 3>
get_xmean()
const;
103 ippl::Vector<double, 3>
getSigmaR()
const;
104 ippl::Vector<double, 3>
getSigmaP()
const;
140#ifdef WITH_UNIT_TESTS
141 FRIEND_TEST(GaussTest, FullSigmaTest1);
142 FRIEND_TEST(GaussTest, FullSigmaTest2);
171 virtual double get(
double rand) = 0;
180 virtual double get(
double rand);
188 virtual double get(
double rand);
194 void printDist(Inform& os,
size_t numberOfParticles)
const;
380 // Create the particle distribution.
381 // @param numberOfParticles to create
382 // @param massIneV particle charge in eV
383 // @param charge of the particle type in elementary charge
385 void create(size_t& numberOfParticles, double massIneV, double charge);
386 void calcPartPerDist(size_t numberOfParticles);
387 void checkParticleNumber(size_t& numberOfParticles);
389 void chooseInputMomentumUnits(InputMomentumUnits inputMoUnits);
390 size_t getNumberOfParticlesInFile(std::ifstream& inputFile);
392 class BinomialBehaviorSplitter {
394 virtual ~BinomialBehaviorSplitter() {
397 virtual double get(double rand) = 0;
400 class MDependentBehavior : public BinomialBehaviorSplitter {
402 MDependentBehavior(const MDependentBehavior& rhs) : ami_m(rhs.ami_m) {
405 MDependentBehavior(double a) {
409 virtual double get(double rand);
415 class GaussianLikeBehavior : public BinomialBehaviorSplitter {
417 virtual double get(double rand);
420 void createDistributionGauss(size_t numberOfParticles, double massIneV);
422 void initializeBeam(PartBunch_t* beam);
423 void printDist(Inform& os, size_t numberOfParticles) const;
424 void printDistGauss(Inform& os) const;
426 gsl_qrng* selectRandomGenerator(std::string, unsigned int dimension);
428 void setAttributes();
430 void setDistParametersGauss(double massIneV);
438 //private member of Distribution
441 std::string distT_m; /// Distribution type strings.
443 PartData particleRefData_m; /// Reference data for particle type (charge,
446 gsl_rng* randGen_m; /// Random number generator
448 size_t totalNumberParticles_m;
450 ippl::Vector<double, 3> pmean_m, xmean_m, sigmaR_m, sigmaP_m;
452 DistributionType distrTypeT_m;
457inline Inform& operator<<(Inform& os, const Distribution& d) {
458 return d.printInfo(os);
461inline ippl::Vector<double, 3> Distribution::get_pmean() const {
465inline ippl::Vector<double, 3> Distribution::get_xmean() const {
470inline DistributionType Distribution::getType() const {
474inline std::string Distribution::getTypeofDistribution() {
478#endif // OPAL_Distribution_HH
Inform & operator<<(Inform &os, const Distribution &d)
An abstract sequence of beam line components.
The base class for all OPAL definitions.
virtual ~BinomialBehaviorSplitter()
virtual double get(double rand)=0
virtual double get(double rand)
MDependentBehavior(double a)
MDependentBehavior(const MDependentBehavior &rhs)
virtual double get(double rand)
static Distribution * find(const std::string &name)
PartData particleRefData_m
Distribution type strings.
ippl::Vector< double, 3 > sigmaR_m
ippl::Vector< double, 3 > xmean_m
void printDistFlatTop(Inform &os) const
ippl::Vector< double, 3 > sigmaP_m
DistributionType getType() const
double tPulseLengthFWHM_m
virtual void execute()
Execute the command.
double getSigmaTFall() const
double getTEmission() const
Distribution(const Distribution &)=delete
ippl::Vector< double, 3 > getCutoffP() const
void calcPartPerDist(size_t numberOfParticles)
size_t getNumberOfParticlesInFile(std::ifstream &inputFile)
virtual bool canReplaceBy(Object *object)
Distribution can only be replaced by another distribution.
double getTPulseLengthFWHM() const
void operator=(const Distribution &)=delete
ippl::Vector< double, 3 > cutoffR_m
std::string getTypeofDistribution()
std::string getFilename() const
DistributionType distrTypeT_m
size_t getNumParticles() const
void setDistParametersMultiVariateGauss()
double getFTOSCAmplitude() const
void printDistFromFile(Inform &os) const
virtual Distribution * clone(const std::string &name)
Return a clone.
void printDistMultiVariateGauss(Inform &os) const
ippl::Vector< double, 3 > cutoffP_m
ippl::Vector< double, 3 > getSigmaP() const
ippl::Vector< ippl::Vector< double, 6 >, 6 > Matrix_t
size_t totalNumberParticles_m
void chooseInputMomentumUnits(InputMomentumUnits inputMoUnits)
size_t getNumOfLocalParticlesToCreate(size_t n)
ippl::Vector< double, 3 > pmean_m
void setTEmission(double tEmission)
void setDistParametersFlatTop()
ippl::Vector< double, 3 > get_xmean() const
ippl::Vector< double, 3 > get_pmean() const
void printDist(Inform &os, size_t numberOfParticles) const
void setAvrgPz(double avrgpz)
ippl::Vector< double, 3 > getSigmaR() const
double getFTOSCPeriods() const
void printDistGauss(Inform &os) const
double getSigmaTRise() const
Inform & printInfo(Inform &os) const
void checkParticleNumber(size_t &numberOfParticles)
size_t getEmissionSteps() const
Matrix_t correlationMatrix_m
ippl::Vector< double, 3 > getCutoffR() const
void setDistParametersGauss()
The base class for all OPAL objects.
Container for all per-particle (and per-simulation) fields tracked during OPALX tracking.