18#ifndef OPAL_Distribution_HH
19#define OPAL_Distribution_HH
33#include "Manager/BaseManager.h"
34#include "Manager/PicManager.h"
41#include <gtest/gtest_prod.h>
63 using Matrix_t = ippl::Vector< ippl::Vector<double, 6>, 6>;
70 void create(
size_t &numberOfParticles,
double massIneV,
double charge, ippl::ParticleAttrib<ippl::Vector<double, 3>>& R, ippl::ParticleAttrib<ippl::Vector<double, 3>>& P, std::shared_ptr<
ParticleContainer<double, 3>> &pc, std::shared_ptr<FieldContainer_t> &fc,
Vector_t<double, 3> nr);
87 ippl::Vector<double, 3>
get_pmean()
const;
88 ippl::Vector<double, 3>
get_xmean()
const;
90 ippl::Vector<double, 3>
getSigmaR()
const;
91 ippl::Vector<double, 3>
getSigmaP()
const;
124#ifdef WITH_UNIT_TESTS
125 FRIEND_TEST(GaussTest, FullSigmaTest1);
126 FRIEND_TEST(GaussTest, FullSigmaTest2);
156 virtual double get(
double rand) = 0;
168 virtual double get(
double rand);
176 virtual double get(
double rand);
179 void createDistributionGauss(
size_t numberOfParticles,
double massIneV, ippl::ParticleAttrib<ippl::Vector<double, 3>>& R, ippl::ParticleAttrib<ippl::Vector<double, 3>>& P, std::shared_ptr<
ParticleContainer<double, 3>> &pc, std::shared_ptr<FieldContainer_t> &fc,
Vector_t<double, 3> nr);
184 void printDist(Inform& os,
size_t numberOfParticles)
const;
396 // Create the particle distribution.
397 // @param numberOfParticles to create
398 // @param massIneV particle charge in eV
399 // @param charge of the particle type in elementary charge
401 void create(size_t& numberOfParticles, double massIneV, double charge);
402 void calcPartPerDist(size_t numberOfParticles);
403 void checkParticleNumber(size_t& numberOfParticles);
405 void chooseInputMomentumUnits(InputMomentumUnits inputMoUnits);
406 size_t getNumberOfParticlesInFile(std::ifstream& inputFile);
408 class BinomialBehaviorSplitter {
410 virtual ~BinomialBehaviorSplitter() {
413 virtual double get(double rand) = 0;
416 class MDependentBehavior : public BinomialBehaviorSplitter {
418 MDependentBehavior(const MDependentBehavior& rhs) : ami_m(rhs.ami_m) {
421 MDependentBehavior(double a) {
425 virtual double get(double rand);
431 class GaussianLikeBehavior : public BinomialBehaviorSplitter {
433 virtual double get(double rand);
436 void createDistributionGauss(size_t numberOfParticles, double massIneV);
438 void initializeBeam(PartBunch_t* beam);
439 void printDist(Inform& os, size_t numberOfParticles) const;
440 void printDistGauss(Inform& os) const;
442 gsl_qrng* selectRandomGenerator(std::string, unsigned int dimension);
444 void setAttributes();
446 void setDistParametersGauss(double massIneV);
454 //private member of Distribution
457 std::string distT_m; /// Distribution type strings.
459 PartData particleRefData_m; /// Reference data for particle type (charge,
462 gsl_rng* randGen_m; /// Random number generator
464 size_t totalNumberParticles_m;
466 ippl::Vector<double, 3> pmean_m, xmean_m, sigmaR_m, sigmaP_m;
468 DistributionType distrTypeT_m;
473inline Inform& operator<<(Inform& os, const Distribution& d) {
474 return d.printInfo(os);
477inline ippl::Vector<double, 3> Distribution::get_pmean() const {
481inline ippl::Vector<double, 3> Distribution::get_xmean() const {
486inline DistributionType Distribution::getType() const {
490inline std::string Distribution::getTypeofDistribution() {
494#endif // OPAL_Distribution_HH
ParticleContainer< double, 3 > ParticleContainer_t
ippl::Vector< T, Dim > Vector_t
Inform & operator<<(Inform &os, const Distribution &d)
FieldContainer< double, 3 > FieldContainer_t
Definition(int size, const char *name, const char *help)
Constructor for exemplars.
Object(int size, const char *name, const char *help)
Constructor for exemplars.
An abstract sequence of beam line components.
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()
DistributionType distrTypeT_m
void setDistParametersMultiVariateGauss()
double getFTOSCAmplitude() const
virtual Distribution * clone(const std::string &name)
Return a clone.
virtual void update()
Update this object.
void printDistMultiVariateGauss(Inform &os) const
ippl::Vector< double, 3 > cutoffP_m
ippl::Vector< double, 3 > getSigmaP() const
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()
void createDistributionGauss(size_t numberOfParticles, double massIneV, ippl::ParticleAttrib< ippl::Vector< double, 3 > > &R, ippl::ParticleAttrib< ippl::Vector< double, 3 > > &P, std::shared_ptr< ParticleContainer< double, 3 > > &pc, std::shared_ptr< FieldContainer_t > &fc, Vector_t< double, 3 > nr)
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
ippl::Vector< ippl::Vector< double, 6 >, 6 > Matrix_t
Inform & printInfo(Inform &os) const
void checkParticleNumber(size_t &numberOfParticles)
void create(size_t &numberOfParticles, double massIneV, double charge, ippl::ParticleAttrib< ippl::Vector< double, 3 > > &R, ippl::ParticleAttrib< ippl::Vector< double, 3 > > &P, std::shared_ptr< ParticleContainer< double, 3 > > &pc, std::shared_ptr< FieldContainer_t > &fc, Vector_t< double, 3 > nr)
Matrix_t correlationMatrix_m
ippl::Vector< double, 3 > getCutoffR() const
void setDistParametersGauss()
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)