Thermal-FIST 1.5
Package for hadron resonance gas model applications
Loading...
Searching...
No Matches
RandomGenerators.h
Go to the documentation of this file.
1/*
2 * Thermal-FIST package
3 *
4 * Copyright (c) 2015-2019 Volodymyr Vovchenko
5 *
6 * GNU General Public License (GPLv3 or later)
7 */
8#ifndef RANDOMGENERATORS_H
9#define RANDOMGENERATORS_H
10
11#include <cmath>
12
13#include "MersenneTwister.h"
16#include <random>
17
18namespace thermalfist {
19
22 namespace RandomGenerators {
23
25 extern MTRand randgenMT;
26
28 extern std::mt19937 rng_std;
29
31 void SetSeed(const unsigned int seed);
32
36 int RandomPoisson(double mean);
37
42 int RandomPoisson(double mean, MTRand &rangen);
43
46 double SkellamProbability(int k, double mu1, double mu2);
47
48
54 {
55 static double pn(int n, double a, int nu);
56
57 //static double R(double x, int nu) { return xMath::BesselI(nu + 1, x) / xMath::BesselI(nu, x); }
58 static double R(double x, int nu);
59
60 static double mu(double a, int nu) { return a * R(a, nu) / 2; }
61
62 static double chi2(double a, int nu);
63
64 static int m(double a, int nu) { return static_cast<int>((sqrt(a*a+static_cast<double>(nu)*nu) - nu)/2.); }
65
66 static double sig2(double a, int nu);
67
68 static double Q2(double a, int nu);
69
70 static int RandomBesselPoisson(double a, int nu, MTRand &rangen);
71
72 static int RandomBesselPoisson(double a, int nu) { return RandomBesselPoisson(a, nu, randgenMT); }
73
74 static double pmXmOverpm(int X, int tm, double a, int nu);
75
76 static int RandomBesselDevroye1(double a, int nu, MTRand &rangen);
77
78 static int RandomBesselDevroye1(double a, int nu) { return RandomBesselDevroye1(a, nu, randgenMT); }
79
80 static int RandomBesselDevroye2(double a, int nu, MTRand &rangen);
81
82 static int RandomBesselDevroye2(double a, int nu) { return RandomBesselDevroye2(a, nu, randgenMT); }
83
84 static int RandomBesselDevroye3(double a, int nu, MTRand &rangen);
85
86 static int RandomBesselDevroye3(double a, int nu) { return RandomBesselDevroye3(a, nu, randgenMT); }
87
88 static int RandomBesselNormal(double a, int nu, MTRand &rangen);
89
90 static int RandomBesselNormal(double a, int nu) { return RandomBesselNormal(a, nu, randgenMT); }
91
92 static int RandomBesselCombined(double a, int nu, MTRand &rangen);
93
94 static int RandomBesselCombined(double a, int nu) { return RandomBesselCombined(a, nu, randgenMT); }
95 };
96
97
100 {
101 public:
104
107
114 virtual std::vector<double> GetMomentum(double mass = -1.) const = 0;
115 };
116
117
118
127 {
128 public:
137 ThermalMomentumGenerator(double mass = 0.938, int statistics = 0, double T = 0.100, double mu = 0.) :
138 m_Mass(mass), m_T(T), m_Mu(mu), m_Statistics(statistics)
139 {
140 //FixParameters();
141 m_Max = ComputeMaximum(m_Mass);
142 }
143
150 double GetP(double mass = -1.) const;
151
152 private:
154 double g(double x, double mass = -1.) const;
155
156 double ComputeMaximum(double mass) const;
157
158 //void FixParameters();
159
160 double m_Mass, m_T, m_Mu;
161 int m_Statistics;
162
163 double m_Max;
164 };
165
166
167
177 {
178 public:
179
181
189 SiemensRasmussenMomentumGenerator(double T, double beta, double R, double mass) :m_T(T), m_Beta(beta), m_R(R), m_Mass(mass) {
190 m_Gamma = 1. / sqrt(1. - m_Beta * m_Beta);
191 FixParameters();
192 }
193
195
203 void SetParameters(double T, double beta, double R, double mass) {
204 m_T = T;
205 m_Beta = beta;
206 m_R = R;
207 m_Mass = mass;
208 m_Gamma = 1. / sqrt(1. - m_Beta * m_Beta);
209 FixParameters();
210 }
211
212 double GetBeta() const { return m_Beta; }
213 double GetR() const { return m_R; }
214 double GetMass() const { return m_Mass; }
215
216 // Override functions begin
217
218 virtual std::vector<double> GetMomentum(double mass = -1.) const;
219
220 // Override functions end
221
222
223 private:
224 double w(double p) const {
225 return sqrt(p*p + m_Mass * m_Mass);
226 }
227
228 double alpha(double p) const {
229 return m_Gamma * m_Beta * p / m_T;
230 }
231
234 double g(double x, double mass = -1.) const;
235 double g2(double x, double tp, double mass = -1.) const;
236
238 void FixParameters();
239
243 double GetRandom(double mass = -1.) const;
244
245 double m_T;
246 double m_Beta;
247 double m_R;
248 double m_Mass;
249 double m_Gamma;
250 double m_Norm;
251 double m_Max;
252 };
253
254
265 {
266 public:
268
278 SiemensRasmussenMomentumGeneratorGeneralized(double T, double beta, double R, double mass, int statistics = 0, double mu = 0) :
279 SiemensRasmussenMomentumGenerator(T, beta, R, mass),
280 m_Generator(mass, statistics, T, mu)
281 {
282
283 }
284
285 // Override functions begin
286
287 virtual std::vector<double> GetMomentum(double mass = -1.) const;
288
289 // Override functions end
290
291 private:
292 ThermalMomentumGenerator m_Generator;
293 };
294
295
296
305 {
306 public:
318 double Tkin = 0.100, double etamax = 3.0, double mass = 0.938, int statistics = 0, double mu = 0);
319
326
327 double EtaMax() const { return m_EtaMax; }
328 double Mass() const { return m_Mass; }
329
330 // Override functions begin
331
332 virtual std::vector<double> GetMomentum(double mass = -1.) const;
333
334 // Override functions end
335
336 protected:
343 virtual double GetRandomZeta(MTRand& rangen = RandomGenerators::randgenMT) const;
344
345 private:
347 ThermalMomentumGenerator m_Generator;
348 double m_Tkin;
349 double m_EtaMax;
350 double m_Mass;
351 };
352
353
357 {
358 public:
359
361
371 BreitWignerGenerator(double M, double gamma, double mthr) : m_M(M), m_Gamma(gamma), m_Mthr(mthr) { FixParameters(); }
372
374
382 void SetParameters(double M, double gamma, double mthr);
383
384 // Generates random resonance mass m from relativistic Breit-Wigner distribution
392 double GetRandom() const;
393
394 private:
396 double f(double x) const;
397
399 void FixParameters();
400
401 double m_M;
402 double m_Gamma;
403 double m_Mthr;
404 double m_Norm;
405 double m_Max;
406 };
407
408
421 {
422 public:
424
433 ThermalBreitWignerGenerator(ThermalParticle *part, double T, double Mu) : m_part(part), m_T(T), m_Mu(Mu) { FixParameters(); }
434
436
445 void SetParameters(ThermalParticle *part, double T, double Mu);
446
452 double GetRandom() const;
453
454 protected:
456 virtual void FixParameters();
457
459 virtual double f(double M) const;
460
462 double m_T, m_Mu;
463 double m_Xmin, m_Xmax;
464 double m_Max;
465 };
466
467 // Class for generating mass of resonance in accordance with its fixed Breit-Wigner distribution multiplied by the Boltzmann factor
481 {
482 public:
483
485
492 ThermalBreitWignerGenerator(part, T, Mu) {
494 }
495
497
498 protected:
499 virtual void FixParameters();
500
501 virtual double f(double M) const;
502 };
503 }
504
505} // namespace thermalfist
506
507
512
513namespace thermalfist {
514
517 namespace RandomGenerators {
518
519 // Class for generating momentum of particle with mass m in accordance with Schnedermann-Sollfrank-Heinz formula with temperature T, transverse flow beta, and longitudinal flow etamax
530 {
531 public:
533
542 SSHMomentumGenerator(double T, double betas, double etamax, double npow, double mass) :m_T(T), m_BetaS(betas), m_EtaMax(etamax), m_n(npow), m_Mass(mass) {
543 m_distr = SSHDistribution(0, m_Mass, m_T, m_BetaS, m_EtaMax, m_n, false);
544 m_dPt = 0.02;
545 m_dy = 0.05;
546 FixParameters2();
547
548 }
549
551
561 void SetParameters(double T, double betas, double etamax, double npow, double mass) {
562 m_T = T;
563 m_BetaS = betas;
564 m_EtaMax = etamax;
565 m_Mass = mass;
566 m_n = npow;
567 m_distr = SSHDistribution(0, m_Mass, m_T, m_BetaS, m_EtaMax, m_n);
568 m_dPt = 0.02;
569 m_dy = 0.05;
570 FixParameters2();
571 }
572
580 void SetMeanBetaT(double betaT) {
581 m_BetaS = (2. + m_n) / 2. * betaT;
582 m_distr = SSHDistribution(0, m_Mass, m_T, m_BetaS, m_EtaMax, m_n);
583 m_dPt = 0.02;
584 m_dy = 0.05;
585 FixParameters2();
586 }
587
588 double GetTkin() const { return m_T; }
589 double GetBetaSurface() const { return m_BetaS; }
590 double GetMass() const { return m_Mass; }
591 double GetNPow() const { return m_n; }
592 double GetEtaMax() const { return m_EtaMax; }
593
594 // Override functions begin
595
596 std::vector<double> GetMomentum(double mass = -1.) const;
597
598 // Override functions end
599
600 private:
601 double w(double p) const {
602 return sqrt(p * p + m_Mass * m_Mass);
603 }
604
605 double g(double x) const {
606 return m_distr.dndpt(-log(x)) / x;
607 }
608
609 double g2(double x) const {
610 return m_dndpt.f(x);
611 }
612
613 void FixParameters();
614
615 void FixParameters2();
616
617 // Finds the maximum of g(x) using the ternary search
618 void FindMaximumPt();
619
620 void FindMaximumY(double pt);
621
622 void FindMaximumY2(double pt);
623
624 // Generates random pt and y
625 std::pair<double, double> GetRandom(double mass = -1.);
626
627 std::pair<double, double> GetRandom2(double mass = -1.) const;
628
629 double m_T, m_BetaS, m_EtaMax, m_n, m_Mass;
630 double m_MaxY, m_MaxPt;
631 SSHDistribution m_distr;
632 SplineFunction m_dndpt;
633 std::vector<SplineFunction> m_dndy;
634 std::vector<double> m_MaxYs;
635 double m_dPt;
636 double m_dy;
637 };
638
639 }
640
641} // namespace thermalfist
642
644
645#endif
Base class implementing a longitudinally boost-invariant azimuthally symmetric freeze-out parametriza...
virtual std::vector< double > GetMomentum(double mass=-1.) const
BoostInvariantMomentumGenerator(BoostInvariantFreezeoutParametrization *FreezeoutModel=NULL, double Tkin=0.100, double etamax=3.0, double mass=0.938, int statistics=0, double mu=0)
Construct a new BoostInvariantMomentumGenerator object.
virtual double GetRandomZeta(MTRand &rangen=RandomGenerators::randgenMT) const
Samples zeta for use in Monte Carlo event generator.
virtual ~BoostInvariantMomentumGenerator()
BoostInvariantMomentumGenerator desctructor.
void SetParameters(double M, double gamma, double mthr)
Set the Breit-Wigner spectral function parameters.
double GetRandom() const
Samples the resonance mass from a relativistic Breit-Wigner distribution with a constant width.
BreitWignerGenerator(double M, double gamma, double mthr)
Construct a new BreitWignerGenerator object.
virtual std::vector< double > GetMomentum(double mass=-1.) const =0
void SetParameters(double T, double betas, double etamax, double npow, double mass)
Sets the parameters of the distribution.
void SetMeanBetaT(double betaT)
Set the mean transverse flow velocity.
SSHMomentumGenerator(double T, double betas, double etamax, double npow, double mass)
Construct a new SSHGenerator object.
std::vector< double > GetMomentum(double mass=-1.) const
virtual std::vector< double > GetMomentum(double mass=-1.) const
SiemensRasmussenMomentumGeneratorGeneralized(double T, double beta, double R, double mass, int statistics=0, double mu=0)
Construct a new SiemensRasmussenMomentumGeneratorGeneralized object.
void SetParameters(double T, double beta, double R, double mass)
Sets the parameters of the Siemens-Rasmussen distribution.
SiemensRasmussenMomentumGenerator(double T, double beta, double R, double mass)
Construct a new SiemensRasmussenMomentumGenerator object.
virtual std::vector< double > GetMomentum(double mass=-1.) const
virtual void FixParameters()
Computes some auxiliary stuff needed for sampling.
ThermalBreitWignerGenerator(ThermalParticle *part, double T, double Mu)
Construct a new ThermalBreitWignerGenerator object.
void SetParameters(ThermalParticle *part, double T, double Mu)
Sets the parameters of the distribution.
virtual double f(double M) const
Unnormalized resonance mass probability density.
virtual double f(double M) const
Unnormalized resonance mass probability density.
ThermalEnergyBreitWignerGenerator(ThermalParticle *part, double T, double Mu)
Construct a new ThermalEnergyBreitWignerGenerator object.
virtual void FixParameters()
Computes some auxiliary stuff needed for sampling.
Class for generating the absolute values of the momentum of a particle in its local rest frame.
double GetP(double mass=-1.) const
Samples the momentum of a particle.
ThermalMomentumGenerator(double mass=0.938, int statistics=0, double T=0.100, double mu=0.)
Construct a new ThermalMomentumGenerator object.
Class implementing the momentum distribution in the longitudinally symmetric Blast-Wave model.
virtual double dndpt(double pt) const
The pT distribution function.
double f(double arg) const
Class containing all information about a particle specie.
Contains random generator functions used in the Monte Carlo Thermal Event Generator.
double SkellamProbability(int k, double mu1, double mu2)
Probability of a Skellam distributed random variable with Poisson means mu1 and mu2 to have the value...
int RandomPoisson(double mean)
Generates random integer distributed by Poisson with specified mean Uses randgenMT.
MTRand randgenMT
The Mersenne Twister random number generator.
void SetSeed(const unsigned int seed)
Set the seed of the random number generator randgenMT.
std::mt19937 rng_std
The Mersenne Twister random number generator from STD library.
The main namespace where all classes and functions of the Thermal-FIST library reside.
Definition CosmicEoS.h:9
Generator of a random number from the Bessel distribution (a, nu), nu is integer Uses methods from ht...
static int RandomBesselNormal(double a, int nu, MTRand &rangen)
static int RandomBesselDevroye1(double a, int nu, MTRand &rangen)
static int RandomBesselDevroye3(double a, int nu, MTRand &rangen)
static double pmXmOverpm(int X, int tm, double a, int nu)
static int RandomBesselCombined(double a, int nu, MTRand &rangen)
static int RandomBesselPoisson(double a, int nu, MTRand &rangen)
static int RandomBesselDevroye2(double a, int nu, MTRand &rangen)