OPAL (Object Oriented Parallel Accelerator Library) 2022.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/PartData.h"
23#include "Algorithms/Vektor.h"
24#include "AppTypes/SymTenzor.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
40class Beam;
41class Beamline;
42
43template <class T, unsigned Dim>
44class PartBunchBase;
45
46class PartBins;
47class LaserProfile;
48class H5PartWrapper;
49
50enum class DistributionType: short {
51 NODIST = -1,
53 GAUSS,
55 FLATTOP,
60};
61
62namespace Attrib
63{
64 namespace Distribution
65 {
122 R, // the correlation matrix (a la transport)
139 EX, // below is for the matched distribution
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
156 SIZE
157 };
158 }
159
160 namespace Legacy
161 {
162 namespace Distribution
163 {
165 // DESCRIPTION OF THE DISTRIBUTION:
167 // DEBIN,
173 // ALPHAX,
174 // ALPHAY,
175 // BETAX,
176 // BETAY,
177 // DX,
178 // DDX,
179 // DY,
180 // DDY,
181 SIZE
182 };
183 }
184 }
185}
186
187
189
190public:
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();
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();
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
244private:
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();
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);
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();
385
386 std::string distT_m;
388
390
393
396
398 std::vector<Distribution *> addedDistributions_m;
399 std::vector<size_t> particlesPerDist_m;
400
403
406 static const double percentTEmission_m;
410 double tBin_m;
419 gsl_histogram *energyBinHist_m;
421
422 gsl_rng *randGen_m;
423
424 // ASTRA and NONE photo emission model.
427
428 // NONEQUIL photo emission model.
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.
471
472 // Parameters multiGauss distribution.
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;
491 double cutoff_m;
492
493 std::string outFilename_m;
494};
495
496inline Inform &operator<<(Inform &os, const Distribution &d) {
497 return d.printInfo(os);
498}
499
500inline
502 return pmean_m;
503}
504
505inline
507 return distrTypeT_m;
508}
509
510inline
513}
514
515inline
517 return distT_m;
518}
519
520#endif // OPAL_Distribution_HH
Inform & operator<<(Inform &os, const Distribution &d)
Definition: Distribution.h:496
DistributionType
Definition: Distribution.h:50
std::complex< double > a
const std::string name
The base class for all OPAL definitions.
Definition: Definition.h:30
The base class for all OPAL objects.
Definition: Object.h:48
Particle reference data.
Definition: PartData.h:35
An abstract sequence of beam line components.
Definition: Beamline.h:34
void shiftDistCoordinates(double massIneV)
static Distribution * find(const std::string &name)
void setDistParametersBinomial(double massIneV)
std::vector< double > & getBGzDist()
std::vector< double > & getTOrZDist()
void fillEBinHistogram()
PartData particleRefData_m
Definition: Distribution.h:394
std::vector< double > xWrite_m
Definition: Distribution.h:449
Vector_t pmean_m
Total thermal momentum.
Definition: Distribution.h:426
int currentEnergyBin_m
Definition: Distribution.h:412
void generateFlattopT(size_t numberOfParticles)
double cathodeTemp_m
Cathode material Fermi energy (eV).
Definition: Distribution.h:432
void createOpalCycl(PartBunchBase< double, 3 > *beam, size_t numberOfParticles, double current, const Beamline &bl)
void adjustPhaseSpace(double massIneV)
std::vector< double > pxWrite_m
Definition: Distribution.h:450
void writeOutFileHeader()
double getMaxTOrZ()
void checkEmissionParameters()
double getMinTOrZ()
std::string outFilename_m
Definition: Distribution.h:493
DistributionType getType() const
Definition: Distribution.h:506
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
double sigmaTFall_m
Definition: Distribution.h:463
double tPulseLengthFWHM_m
Definition: Distribution.h:464
double getWeight()
int getNumberOfEnergyBins()
virtual void execute()
Execute the command.
gsl_histogram * energyBinHist_m
Distribution energy bins.
Definition: Distribution.h:419
void setupEmissionModelAstra(PartBunchBase< double, 3 > *beam)
void printEnergyBins(Inform &os) const
std::vector< std::vector< double > > additionalRNs_m
Upper limit on emission energy distribution (eV).
Definition: Distribution.h:435
std::vector< double > pxDist_m
Definition: Distribution.h:442
std::vector< double > yWrite_m
Definition: Distribution.h:451
double getEmissionDeltaT()
void printDistBinomial(Inform &os) const
double cathodeFermiEnergy_m
Laser photon energy (eV).
Definition: Distribution.h:431
Distribution(const Distribution &)=delete
double emitEnergyUpperLimit_m
Cathode temperature (K).
Definition: Distribution.h:433
void calcPartPerDist(size_t numberOfParticles)
unsigned int numberOfDistributions_m
List of Distribution types.
Definition: Distribution.h:389
void addDistributions()
void initializeBeam(PartBunchBase< double, 3 > *beam)
void doRestartOpalT(PartBunchBase< double, 3 > *p, size_t Np, int restartStep, H5PartWrapper *h5wrapper)
void checkIfEmitted()
void applyEmissModelNonEquil(double eZ, double &px, double &py, double &pz, std::vector< double > &additionalRNs)
std::vector< double > & getBGxDist()
Vector_t cutoffR_m
Definition: Distribution.h:467
void createOpalT(PartBunchBase< double, 3 > *beam, std::vector< Distribution * > addedDistributions, size_t &numberOfParticles)
void generateAstraFlattopT(size_t numberOfParticles)
void fillParticleBins()
size_t getNumberOfParticlesInFile(std::ifstream &inputFile)
void createDistributionBinomial(size_t numberOfParticles, double massIneV)
void setupEmissionModelNone(PartBunchBase< double, 3 > *beam)
virtual bool canReplaceBy(Object *object)
Distribution can only be replaced by another distribution.
std::vector< Distribution * > addedDistributions_m
Vector of distributions to be added to this distribution.
Definition: Distribution.h:398
void doRestartOpalCycl(PartBunchBase< double, 3 > *p, size_t Np, int restartStep, const int specifiedNumBunch, H5PartWrapper *h5wrapper)
std::vector< double > tOrZWrite_m
Definition: Distribution.h:453
std::vector< double > & getXDist()
size_t getNumberOfEmissionSteps()
void injectBeam(PartBunchBase< double, 3 > *beam)
double sigmaRise_m
Definition: Distribution.h:489
std::string laserImageName_m
Definition: Distribution.h:478
Vector_t sigmaP_m
Definition: Distribution.h:466
void operator=(const Distribution &)=delete
void create(size_t &numberOfParticles, double massIneV, double charge)
virtual ~Distribution()
std::vector< double > pyDist_m
Definition: Distribution.h:444
int getLastEmittedEnergyBin()
std::string getTypeofDistribution()
Definition: Distribution.h:516
void createDistributionMultiGauss(size_t numberOfParticles, double massIneV)
double laserEnergy_m
Cathode material work function (eV).
Definition: Distribution.h:430
void setEmissionTime(double &maxT, double &minT)
Vector_t mBinomial_m
Definition: Distribution.h:469
gsl_rng * randGen_m
Definition: Distribution.h:422
void setupEnergyBins(double maxTOrZ, double minTOrZ)
void printEmissionModelNone(Inform &os) const
DistributionType distrTypeT_m
Distribution type strings.
Definition: Distribution.h:387
LaserProfile * laserProfile_m
Definition: Distribution.h:480
std::vector< double > yDist_m
Definition: Distribution.h:443
void generateFlattopZ(size_t numberOfParticles)
double cutoff_m
Definition: Distribution.h:491
std::vector< size_t > particlesPerDist_m
Definition: Distribution.h:399
void setNumberOfDistributions(unsigned int n)
Definition: Distribution.h:241
void generateMatchedGauss(const SigmaGenerator::matrix_t &, size_t numberOfParticles, double massIneV)
double getPercentageEmitted() const
Definition: Distribution.h:511
double tRise_m
time binned distribution with thermal energy
Definition: Distribution.h:487
void setSigmaP_m(double massIneV)
std::string laserProfileFileName_m
Definition: Distribution.h:477
std::vector< double > & getYDist()
void printDistFromFile(Inform &os) const
virtual Distribution * clone(const std::string &name)
Return a clone.
double getEmissionTimeShift() const
void printDistMultiGauss(Inform &os) const
void reflectDistribution(size_t &numberOfParticles)
void checkFileMomentum()
std::vector< double > pzWrite_m
Definition: Distribution.h:454
virtual void update()
Update this object.
double sigmaFall_m
Definition: Distribution.h:490
void eraseTOrZDist()
void setAttributes()
void generateLongFlattopT(size_t numberOfParticles)
double cathodeWorkFunc_m
Definition: Distribution.h:429
void setDistParametersFlattop(double massIneV)
double sigmaTRise_m
Definition: Distribution.h:462
void printDistFlattop(Inform &os) const
void printDistMatchedGauss(Inform &os) const
static const double percentTEmission_m
Definition: Distribution.h:406
void writeOutFileEmission()
PartBins * energyBins_m
Definition: Distribution.h:418
void printEmissionModelAstra(Inform &os) const
void printEmissionModelNonEquil(Inform &os) const
void generateBinomial(size_t numberOfParticles)
std::vector< double > & getBGyDist()
void setupParticleBins(double massIneV, PartBunchBase< double, 3 > *beam)
void sampleUniformDisk(gsl_qrng *quasiRandGen2D, double &x1, double &x2)
double currentEmissionTime_m
Definition: Distribution.h:411
std::vector< size_t > binWrite_m
Definition: Distribution.h:455
double getEnergyBinDeltaT()
void createDistributionFromFile(size_t numberOfParticles, double massIneV)
size_t totalNumberParticles_m
Definition: Distribution.h:437
double pTotThermal_m
Random number generator.
Definition: Distribution.h:425
int numberOfSampleBins_m
Definition: Distribution.h:416
void setDistToEmitted(bool emitted)
void setDistParametersMultiGauss(double massIneV)
void createDistributionFlattop(size_t numberOfParticles, double massIneV)
void chooseInputMomentumUnits(InputMomentumUnits inputMoUnits)
size_t findEBin(double tOrZ)
void scaleDistCoordinates()
std::vector< double > pyWrite_m
Definition: Distribution.h:452
SymTenzor< double, 6 > correlationMatrix_m
Definition: Distribution.h:470
size_t getNumOfLocalParticlesToCreate(size_t n)
std::vector< double > pzDist_m
Definition: Distribution.h:446
InputMomentumUnits inputMoUnits_m
Definition: Distribution.h:461
double getTEmission()
double tEmission_m
Emission parameters.
Definition: Distribution.h:405
void generateFlattopLaserProfile(size_t numberOfParticles)
gsl_qrng * selectRandomGenerator(std::string, unsigned int dimension)
Select and allocate gsl random number generator.
void generateGaussZ(size_t numberOfParticles)
void printDist(Inform &os, size_t numberOfParticles) const
bool getIfDistEmitting()
void applyEmissModelNone(double &pz)
void writeOutFileInjection()
std::string distT_m
Definition: Distribution.h:386
size_t emitParticles(PartBunchBase< double, 3 > *beam, double eZ)
void applyEmissionModel(double lowEnergyLimit, double &px, double &py, double &pz, std::vector< double > &additionalRNs)
void applyEmissModelAstra(double &px, double &py, double &pz, std::vector< double > &additionalRNs)
double tFall_m
Definition: Distribution.h:488
void setupEmissionModelNonEquil()
double avrgpz_m
Definition: Distribution.h:458
void setupEmissionModel(PartBunchBase< double, 3 > *beam)
void printDistGauss(Inform &os) const
int currentSampleBin_m
Definition: Distribution.h:413
unsigned nPeaks_m
Definition: Distribution.h:474
void printEmissionModel(Inform &os) const
void setDistParametersGauss(double massIneV)
Vector_t cutoffP_m
Definition: Distribution.h:468
Inform & printInfo(Inform &os) const
void checkParticleNumber(size_t &numberOfParticles)
void createMatchedGaussDistribution(size_t numberOfParticles, double massIneV, double charge)
void createDistributionGauss(size_t numberOfParticles, double massIneV)
void shiftBeam(double &maxTOrZ, double &minTOrZ)
EmissionModel emissionModel_m
Emission Model.
Definition: Distribution.h:402
Vector_t sigmaR_m
Definition: Distribution.h:465
size_t totalNumberEmittedParticles_m
Definition: Distribution.h:438
std::vector< double > xDist_m
Definition: Distribution.h:441
double laserIntensityCut_m
Definition: Distribution.h:479
int numberOfEnergyBins_m
Definition: Distribution.h:414
void generateTransverseGauss(size_t numberOfParticles)
virtual double get(double rand)=0
MDependentBehavior(const MDependentBehavior &rhs)
Definition: Distribution.h:312
virtual double get(double rand)
virtual double get(double rand)
RealDiracMatrix::matrix_t matrix_t
Type for storing maps.
Definition: Beam.h:31
Definition: Inform.h:42