OPAL (Object Oriented Parallel Accelerator Library)  2024.1
OPAL
Distribution.h
Go to the documentation of this file.
1 //
2 // Class Distribution
3 // This class defines the initial beam that is injected or emitted into the simulation.
4 //
5 // Copyright (c) 2008 - 2022, Paul Scherrer Institut, Villigen PSI, Switzerland
6 // All rights reserved
7 //
8 // This file is part of OPAL.
9 //
10 // OPAL is free software: you can redistribute it and/or modify
11 // it under the terms of the GNU General Public License as published by
12 // the Free Software Foundation, either version 3 of the License, or
13 // (at your option) any later version.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with OPAL. If not, see <https://www.gnu.org/licenses/>.
17 //
18 #ifndef OPAL_Distribution_HH
19 #define OPAL_Distribution_HH
20 
22 #include "Algorithms/BoostMatrix.h"
23 #include "Algorithms/PartData.h"
24 #include "Algorithms/Vektor.h"
25 #include "Attributes/Attributes.h"
27 
28 #include <gsl/gsl_histogram.h>
29 #include <gsl/gsl_qrng.h>
30 #include <gsl/gsl_rng.h>
31 
32 #ifdef WITH_UNIT_TESTS
33 #include <gtest/gtest_prod.h>
34 #endif
35 
36 #include <fstream>
37 #include <string>
38 #include <vector>
39 
40 class Beam;
41 class Beamline;
42 
43 template <class T, unsigned Dim>
44 class PartBunchBase;
45 
46 class PartBins;
47 class LaserProfile;
48 class H5PartWrapper;
49 
50 enum class DistributionType: short {
51  NODIST = -1,
52  FROMFILE,
53  GAUSS,
54  BINOMIAL,
55  FLATTOP,
56  MULTIGAUSS,
60 };
61 
62 namespace Attrib
63 {
64  namespace Distribution
65  {
66  enum AttributesT {
77  W,
78  FE,
107  MX,
108  MY,
109  MZ,
110  MT,
122  R, // the correlation matrix (a la transport)
139  EX, // below is for the matched distribution
140  EY,
141  ET,
142  SECTOR, // Matched-Gauss: single sector or full machine
143  NSECTORS, // Matched-Gauss: number of sectors to average field
144  NSTEPS, // Matched-Gauss: number of steps for closed orbit finder
145  RGUESS, // Matched-Gauss: guess for closed orbit finder
146  DENERGY, // Matched-Gauss: energy step for closed orbit finder
152  // E2,
153  ID1, // special particle that the user can set
154  ID2, // special particle that the user can set
157  };
158  }
159 
160  namespace Legacy
161  {
162  namespace Distribution
163  {
165  // DESCRIPTION OF THE DISTRIBUTION:
167  // DEBIN,
171  T,
172  PT,
173  // ALPHAX,
174  // ALPHAY,
175  // BETAX,
176  // BETAY,
177  // DX,
178  // DDX,
179  // DY,
180  // DDY,
182  };
183  }
184  }
185 }
186 
187 
188 class Distribution: public Definition {
189 
190 public:
191 
192  Distribution();
193  virtual ~Distribution();
194 
195  virtual bool canReplaceBy(Object *object);
196  virtual Distribution *clone(const std::string &name);
197  virtual void execute();
198  virtual void update();
199  size_t getNumOfLocalParticlesToCreate(size_t n);
201  size_t numberOfParticles,
202  double current, const Beamline &bl);
204  std::vector<Distribution *> addedDistributions,
205  size_t &numberOfParticles);
206  void createOpalT(PartBunchBase<double, 3> *beam, size_t &numberOfParticles);
207  void doRestartOpalT(PartBunchBase<double, 3> *p, size_t Np, int restartStep, H5PartWrapper *h5wrapper);
208  void doRestartOpalCycl(PartBunchBase<double, 3> *p, size_t Np, int restartStep,
209  const int specifiedNumBunch, H5PartWrapper *h5wrapper);
210  size_t emitParticles(PartBunchBase<double, 3> *beam, double eZ);
211  double getPercentageEmitted() const;
212  static Distribution *find(const std::string &name);
213 
214  bool getIfDistEmitting();
216  double getMaxTOrZ();
217  double getMinTOrZ();
218  size_t getNumberOfEmissionSteps();
219  int getNumberOfEnergyBins();
220  double getEmissionDeltaT();
221  double getEnergyBinDeltaT();
222  double getWeight();
223 
224  double getTEmission();
225 
226  Vector_t get_pmean() const;
227 
228  std::string getTypeofDistribution();
229  DistributionType getType() const;
230 
231  Inform &printInfo(Inform &os) const;
232 
233  bool Rebin();
234  void setDistToEmitted(bool emitted);
235  void setDistType();
236  void setSigmaR_m();
237  void setSigmaP_m(double massIneV);
238  void shiftBeam(double &maxTOrZ, double &minTOrZ);
239  double getEmissionTimeShift() const;
240 
242 
243 
244 private:
245  enum class EmissionModel: unsigned short {
246  NONE,
247  ASTRA,
248  NONEQUIL
249  };
250 
251  enum class InputMomentumUnits: unsigned short {
252  NONE,
253  EVOVERC
254  };
255 
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);
261 #endif
262 
263  Distribution(const std::string &name, Distribution *parent);
264 
265  // Not implemented.
266  Distribution(const Distribution &) = delete;
267  void operator=(const Distribution &) = delete;
268 
269  std::vector<double>& getXDist();
270  std::vector<double>& getBGxDist();
271  std::vector<double>& getYDist();
272  std::vector<double>& getBGyDist();
273  std::vector<double>& getTOrZDist();
274  std::vector<double>& getBGzDist();
275  void eraseXDist();
276  void eraseBGxDist();
277  void eraseYDist();
278  void eraseBGyDist();
279  void eraseTOrZDist();
280  void eraseBGzDist();
281 
282  void addDistributions();
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);
285  void applyEmissModelNone(double &pz);
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);
294  void calcPartPerDist(size_t numberOfParticles);
296  void checkIfEmitted();
297  void checkParticleNumber(size_t &numberOfParticles);
298  void checkFileMomentum(double momentumTol);
299  void chooseInputMomentumUnits(InputMomentumUnits inputMoUnits);
300  size_t getNumberOfParticlesInFile(std::ifstream &inputFile);
301 
303  public:
305  { }
306 
307  virtual double get(double rand) = 0;
308  };
309 
311  public:
313  ami_m(rhs.ami_m)
314  {}
315 
317  { ami_m = 1.0 / a; }
318 
319  virtual double get(double rand);
320  private:
321  double ami_m;
322  };
323 
325  public:
326  virtual double get(double rand);
327  };
328 
329  void createDistributionBinomial(size_t numberOfParticles, double massIneV);
330  void createDistributionFlattop(size_t numberOfParticles, double massIneV);
331  void createDistributionMultiGauss(size_t numberOfParticles, double massIneV);
332  void createDistributionFromFile(size_t numberOfParticles, double massIneV);
333  void createDistributionGauss(size_t numberOfParticles, double massIneV);
334  void createMatchedGaussDistribution(size_t numberOfParticles,
335  double massIneV, double charge);
336  void sampleUniformDisk(gsl_qrng* quasiRandGen2D, double& x1, double& x2);
337  void fillEBinHistogram();
338  void fillParticleBins();
339  size_t findEBin(double tOrZ);
340  void generateAstraFlattopT(size_t numberOfParticles);
341  void generateBinomial(size_t numberOfParticles);
342  void generateFlattopLaserProfile(size_t numberOfParticles);
343  void generateFlattopT(size_t numberOfParticles);
344  void generateFlattopZ(size_t numberOfParticles);
345  void generateGaussZ(size_t numberOfParticles);
347  size_t numberOfParticles, double massIneV);
348  void generateLongFlattopT(size_t numberOfParticles);
349  void generateTransverseGauss(size_t numberOfParticles);
352  void printDist(Inform &os, size_t numberOfParticles) const;
353  void printDistBinomial(Inform &os) const;
354  void printDistFlattop(Inform &os) const;
355  void printDistMultiGauss(Inform &os) const;
356  void printDistFromFile(Inform &os) const;
357  void printDistGauss(Inform &os) const;
358  void printDistMatchedGauss(Inform &os) const;
359  void printEmissionModel(Inform &os) const;
360  void printEmissionModelAstra(Inform &os) const;
361  void printEmissionModelNone(Inform &os) const;
362  void printEmissionModelNonEquil(Inform &os) const;
363  void printEnergyBins(Inform &os) const;
364  void adjustPhaseSpace(double massIneV);
365  void reflectDistribution(size_t &numberOfParticles);
366  void scaleDistCoordinates();
368  gsl_qrng* selectRandomGenerator(std::string, unsigned int dimension);
369  void setAttributes();
370  void setDistParametersBinomial(double massIneV);
371  void setDistParametersFlattop(double massIneV);
372  void setDistParametersMultiGauss(double massIneV);
373  void setDistParametersGauss(double massIneV);
374  void setEmissionTime(double &maxT, double &minT);
379  void setupEnergyBins(double maxTOrZ, double minTOrZ);
380  void setupParticleBins(double massIneV, PartBunchBase<double, 3> *beam);
381  void shiftDistCoordinates(double massIneV);
382  void writeOutFileHeader();
383  void writeOutFileEmission();
384  void writeOutFileInjection();
385 
386  std::string distT_m;
388 
390 
391  bool emitting_m;
392 
395 
398  std::vector<Distribution *> addedDistributions_m;
399  std::vector<size_t> particlesPerDist_m;
400 
403 
405  double tEmission_m;
406  static const double percentTEmission_m;
407  double tBin_m;
419  gsl_histogram *energyBinHist_m;
420 
422  gsl_rng *randGen_m;
423 
424  // ASTRA and NONE photo emission model.
425  double pTotThermal_m;
427 
428  // NONEQUIL photo emission model.
430  double laserEnergy_m;
432  double cathodeTemp_m;
434 
435  std::vector<std::vector<double> > additionalRNs_m;
436 
439 
440  // Beam coordinate containers.
441  std::vector<double> xDist_m;
442  std::vector<double> pxDist_m;
443  std::vector<double> yDist_m;
444  std::vector<double> pyDist_m;
445  std::vector<double> tOrZDist_m;
446  std::vector<double> pzDist_m;
447 
448  // Initial coordinates for file write.
449  std::vector<double> xWrite_m;
450  std::vector<double> pxWrite_m;
451  std::vector<double> yWrite_m;
452  std::vector<double> pyWrite_m;
453  std::vector<double> tOrZWrite_m;
454  std::vector<double> pzWrite_m;
455  std::vector<size_t> binWrite_m;
456 
457  // for compatibility reasons
458  double avrgpz_m;
459 
460  //Distribution parameters.
462  double sigmaTRise_m;
463  double sigmaTFall_m;
471 
472  // Parameters multiGauss distribution.
473  double sepPeaks_m;
474  unsigned nPeaks_m;
475 
476  // Laser profile.
478  std::string laserImageName_m;
481 
482  // AAA This is for the matched distribution
483  double I_m;
484  double E_m;
485 
487  double tRise_m;
488  double tFall_m;
489  double sigmaRise_m;
490  double sigmaFall_m;
491  double cutoff_m;
492 
493  std::string outFilename_m;
494 };
495 
496 inline Inform &operator<<(Inform &os, const Distribution &d) {
497  return d.printInfo(os);
498 }
499 
500 inline
502  return pmean_m;
503 }
504 
505 inline
507  return distrTypeT_m;
508 }
509 
510 inline
512  return (double)totalNumberEmittedParticles_m / (double)totalNumberParticles_m;
513 }
514 
515 inline
517  return distT_m;
518 }
519 
520 #endif // OPAL_Distribution_HH
std::string laserProfileFileName_m
Definition: Distribution.h:477
double getMinTOrZ()
double cathodeFermiEnergy_m
Laser photon energy (eV).
Definition: Distribution.h:431
boost::numeric::ublas::matrix< double > matrix_t
Definition: BoostMatrix.h:23
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).
Definition: Distribution.h:430
void generateGaussZ(size_t numberOfParticles)
size_t getNumberOfEmissionSteps()
std::vector< double > pyWrite_m
Definition: Distribution.h:452
void setDistToEmitted(bool emitted)
The base class for all OPAL objects.
Definition: Object.h:48
double tPulseLengthFWHM_m
Definition: Distribution.h:464
void applyEmissModelNone(double &pz)
double getEnergyBinDeltaT()
void writeOutFileEmission()
Vector_t mBinomial_m
Definition: Distribution.h:469
void setNumberOfDistributions(unsigned int n)
Definition: Distribution.h:241
void reflectDistribution(size_t &numberOfParticles)
void printDistMatchedGauss(Inform &os) const
double sigmaTRise_m
Definition: Distribution.h:462
void printEmissionModel(Inform &os) const
double tRise_m
time binned distribution with thermal energy
Definition: Distribution.h:487
std::vector< double > & getYDist()
size_t emitParticles(PartBunchBase< double, 3 > *beam, double eZ)
unsigned nPeaks_m
Definition: Distribution.h:474
std::vector< double > & getXDist()
std::ostream & operator<<(std::ostream &os, const Attribute &attr)
Definition: Attribute.cpp:169
gsl_rng * randGen_m
Definition: Distribution.h:422
void generateAstraFlattopT(size_t numberOfParticles)
DistributionType distrTypeT_m
Distribution type strings.
Definition: Distribution.h:387
void fillParticleBins()
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
Definition: Distribution.h:454
MDependentBehavior(const MDependentBehavior &rhs)
Definition: Distribution.h:312
void printDistFlattop(Inform &os) const
std::vector< double > pzDist_m
Definition: Distribution.h:446
void adjustPhaseSpace(double massIneV)
double getPercentageEmitted() const
Definition: Distribution.h:511
void generateFlattopT(size_t numberOfParticles)
int numberOfEnergyBins_m
Definition: Distribution.h:414
LaserProfile * laserProfile_m
Definition: Distribution.h:480
An abstract sequence of beam line components.
Definition: Beamline.h:34
void setAttributes()
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
Definition: Distribution.h:455
double getEmissionDeltaT()
std::vector< double > & getBGxDist()
Vector_t sigmaP_m
Definition: Distribution.h:466
void printDist(Inform &os, size_t numberOfParticles) const
InputMomentumUnits inputMoUnits_m
Definition: Distribution.h:461
virtual ~Distribution()
void createDistributionGauss(size_t numberOfParticles, double massIneV)
Vector_t sigmaR_m
Definition: Distribution.h:465
void writeOutFileInjection()
void createMatchedGaussDistribution(size_t numberOfParticles, double massIneV, double charge)
void checkIfEmitted()
double getEmissionTimeShift() const
static Distribution * find(const std::string &name)
void operator=(const Distribution &)=delete
size_t totalNumberEmittedParticles_m
Definition: Distribution.h:438
void createDistributionMultiGauss(size_t numberOfParticles, double massIneV)
void printDistMultiGauss(Inform &os) const
std::vector< double > xWrite_m
Definition: Distribution.h:449
void shiftDistCoordinates(double massIneV)
int currentEnergyBin_m
Definition: Distribution.h:412
std::vector< double > tOrZWrite_m
Definition: Distribution.h:453
void initializeBeam(PartBunchBase< double, 3 > *beam)
int numberOfSampleBins_m
Definition: Distribution.h:416
void fillEBinHistogram()
std::string laserImageName_m
Definition: Distribution.h:478
Vector_t cutoffP_m
Definition: Distribution.h:468
void setupParticleBins(double massIneV, PartBunchBase< double, 3 > *beam)
void createDistributionBinomial(size_t numberOfParticles, double massIneV)
void scaleDistCoordinates()
int getNumberOfEnergyBins()
Definition: Inform.h:42
std::vector< double > yDist_m
Definition: Distribution.h:443
void generateLongFlattopT(size_t numberOfParticles)
void setDistParametersGauss(double massIneV)
std::vector< std::vector< double > > additionalRNs_m
Upper limit on emission energy distribution (eV).
Definition: Distribution.h:435
std::string outFilename_m
Definition: Distribution.h:493
void checkFileMomentum(double momentumTol)
double sigmaFall_m
Definition: Distribution.h:490
void generateMatchedGauss(const SigmaGenerator::matrix_t &, size_t numberOfParticles, double massIneV)
void printDistBinomial(Inform &os) const
double currentEmissionTime_m
Definition: Distribution.h:411
void calcPartPerDist(size_t numberOfParticles)
double avrgpz_m
Definition: Distribution.h:458
double sigmaRise_m
Definition: Distribution.h:489
unsigned int numberOfDistributions_m
List of Distribution types.
Definition: Distribution.h:389
gsl_histogram * energyBinHist_m
Distribution energy bins.
Definition: Distribution.h:419
std::vector< double > pxDist_m
Definition: Distribution.h:442
std::string distT_m
Definition: Distribution.h:386
virtual Distribution * clone(const std::string &name)
Return a clone.
DistributionType
Definition: Distribution.h:50
void doRestartOpalT(PartBunchBase< double, 3 > *p, size_t Np, int restartStep, H5PartWrapper *h5wrapper)
void injectBeam(PartBunchBase< double, 3 > *beam)
double tFall_m
Definition: Distribution.h:488
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)
Vector_t cutoffR_m
Definition: Distribution.h:467
void eraseTOrZDist()
void printDistGauss(Inform &os) const
void sampleUniformDisk(gsl_qrng *quasiRandGen2D, double &x1, double &x2)
void setDistParametersFlattop(double massIneV)
std::vector< double > yWrite_m
Definition: Distribution.h:451
size_t totalNumberParticles_m
Definition: Distribution.h:437
const std::string name
void generateFlattopZ(size_t numberOfParticles)
double sigmaTFall_m
Definition: Distribution.h:463
double cathodeWorkFunc_m
Definition: Distribution.h:429
std::vector< double > xDist_m
Definition: Distribution.h:441
double getTEmission()
size_t findEBin(double tOrZ)
std::vector< double > pyDist_m
Definition: Distribution.h:444
void checkParticleNumber(size_t &numberOfParticles)
void setupEmissionModelNonEquil()
double laserIntensityCut_m
Definition: Distribution.h:479
void addDistributions()
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.
Definition: Definition.h:30
void createDistributionFromFile(size_t numberOfParticles, double massIneV)
void createDistributionFlattop(size_t numberOfParticles, double massIneV)
bool getIfDistEmitting()
DistributionType getType() const
Definition: Distribution.h:506
void shiftBeam(double &maxTOrZ, double &minTOrZ)
Vector_t pmean_m
Total thermal momentum.
Definition: Distribution.h:426
void setDistParametersMultiGauss(double massIneV)
void doRestartOpalCycl(PartBunchBase< double, 3 > *p, size_t Np, int restartStep, const int specifiedNumBunch, H5PartWrapper *h5wrapper)
double getMaxTOrZ()
void setSigmaP_m(double massIneV)
void printDistFromFile(Inform &os) const
int currentSampleBin_m
Definition: Distribution.h:413
double emitEnergyUpperLimit_m
Cathode temperature (K).
Definition: Distribution.h:433
double getWeight()
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.
Definition: Beam.h:31
gsl_qrng * selectRandomGenerator(std::string, unsigned int dimension)
Select and allocate gsl random number generator.
std::vector< size_t > particlesPerDist_m
Definition: Distribution.h:399
void writeOutFileHeader()
EmissionModel emissionModel_m
Emission Model.
Definition: Distribution.h:402
void printEmissionModelNone(Inform &os) const
void setupEmissionModelNone(PartBunchBase< double, 3 > *beam)
void checkEmissionParameters()
matrix_t correlationMatrix_m
Definition: Distribution.h:470
static const double percentTEmission_m
Definition: Distribution.h:406
double pTotThermal_m
Random number generator.
Definition: Distribution.h:425
double sepPeaks_m
Definition: Distribution.h:473
std::vector< double > tOrZDist_m
Definition: Distribution.h:445
Vector_t get_pmean() const
Definition: Distribution.h:501
PartData particleRefData_m
Definition: Distribution.h:394
double cutoff_m
Definition: Distribution.h:491
std::vector< double > pxWrite_m
Definition: Distribution.h:450
void setupEmissionModel(PartBunchBase< double, 3 > *beam)
std::vector< double > & getTOrZDist()
double cathodeTemp_m
Cathode material Fermi energy (eV).
Definition: Distribution.h:432
std::vector< Distribution * > addedDistributions_m
Vector of distributions to be added to this distribution.
Definition: Distribution.h:398
PartBins * energyBins_m
Definition: Distribution.h:418
std::string getTypeofDistribution()
Definition: Distribution.h:516
virtual bool canReplaceBy(Object *object)
Distribution can only be replaced by another distribution.
Inform & printInfo(Inform &os) const
double tEmission_m
Emission parameters.
Definition: Distribution.h:405