Thermal-FIST 1.6
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#include <utility>
18
19namespace thermalfist {
20
23 namespace RandomGenerators {
24
26 extern MTRand randgenMT;
27
29 extern std::mt19937 rng_std;
30
32 void SetSeed(const unsigned int seed);
33
37 int RandomPoisson(double mean);
38
43 int RandomPoisson(double mean, MTRand &rangen);
44
47 double SkellamProbability(int k, double mu1, double mu2);
48
49
55 {
56 static double pn(int n, double a, int nu);
57
58 //static double R(double x, int nu) { return xMath::BesselI(nu + 1, x) / xMath::BesselI(nu, x); }
59 static double R(double x, int nu);
60
61 static double mu(double a, int nu) { return a * R(a, nu) / 2; }
62
63 static double chi2(double a, int nu);
64
65 static int m(double a, int nu) { return static_cast<int>((sqrt(a*a+static_cast<double>(nu)*nu) - nu)/2.); }
66
67 static double sig2(double a, int nu);
68
69 static double Q2(double a, int nu);
70
71 static int RandomBesselPoisson(double a, int nu, MTRand &rangen);
72
73 static int RandomBesselPoisson(double a, int nu) { return RandomBesselPoisson(a, nu, randgenMT); }
74
75 static double pmXmOverpm(int X, int tm, double a, int nu);
76
77 static int RandomBesselDevroye1(double a, int nu, MTRand &rangen);
78
79 static int RandomBesselDevroye1(double a, int nu) { return RandomBesselDevroye1(a, nu, randgenMT); }
80
81 static int RandomBesselDevroye2(double a, int nu, MTRand &rangen);
82
83 static int RandomBesselDevroye2(double a, int nu) { return RandomBesselDevroye2(a, nu, randgenMT); }
84
85 static int RandomBesselDevroye3(double a, int nu, MTRand &rangen);
86
87 static int RandomBesselDevroye3(double a, int nu) { return RandomBesselDevroye3(a, nu, randgenMT); }
88
89 static int RandomBesselNormal(double a, int nu, MTRand &rangen);
90
91 static int RandomBesselNormal(double a, int nu) { return RandomBesselNormal(a, nu, randgenMT); }
92
93 static int RandomBesselCombined(double a, int nu, MTRand &rangen);
94
95 static int RandomBesselCombined(double a, int nu) { return RandomBesselCombined(a, nu, randgenMT); }
96 };
97
98
101 {
102 public:
105
108
115 virtual std::vector<double> GetMomentum(double mass = -1.) const = 0;
116 };
117
118
119
128 {
129 public:
138 ThermalMomentumGenerator(double mass = 0.938, int statistics = 0, double T = 0.100, double mu = 0.) :
139 m_Mass(mass), m_T(T), m_Mu(mu), m_Statistics(statistics)
140 {
141 //FixParameters();
142 m_Max = ComputeMaximum(m_Mass);
143 }
144
151 double GetP(double mass = -1.) const;
152
153 private:
155 double g(double x, double mass = -1.) const;
156
157 double ComputeMaximum(double mass) const;
158
159 //void FixParameters();
160
161 double m_Mass, m_T, m_Mu;
162 int m_Statistics;
163
164 double m_Max;
165 };
166
167
168
178 {
179 public:
180
182
190 SiemensRasmussenMomentumGenerator(double T, double beta, double R, double mass) :m_T(T), m_Beta(beta), m_R(R), m_Mass(mass) {
191 m_Gamma = 1. / sqrt(1. - m_Beta * m_Beta);
192 FixParameters();
193 }
194
196
204 void SetParameters(double T, double beta, double R, double mass) {
205 m_T = T;
206 m_Beta = beta;
207 m_R = R;
208 m_Mass = mass;
209 m_Gamma = 1. / sqrt(1. - m_Beta * m_Beta);
210 FixParameters();
211 }
212
213 double GetBeta() const { return m_Beta; }
214 double GetR() const { return m_R; }
215 double GetMass() const { return m_Mass; }
216
217 // Override functions begin
218
219 virtual std::vector<double> GetMomentum(double mass = -1.) const;
220
221 // Override functions end
222
223
224 private:
225 double w(double p) const {
226 return sqrt(p*p + m_Mass * m_Mass);
227 }
228
229 double alpha(double p) const {
230 return m_Gamma * m_Beta * p / m_T;
231 }
232
235 double g(double x, double mass = -1.) const;
236 double g2(double x, double tp, double mass = -1.) const;
237
239 void FixParameters();
240
244 double GetRandom(double mass = -1.) const;
245
246 double m_T;
247 double m_Beta;
248 double m_R;
249 double m_Mass;
250 double m_Gamma;
251 double m_Norm;
252 double m_Max;
253 };
254
255
266 {
267 public:
269
279 SiemensRasmussenMomentumGeneratorGeneralized(double T, double beta, double R, double mass, int statistics = 0, double mu = 0) :
280 SiemensRasmussenMomentumGenerator(T, beta, R, mass),
281 m_Generator(mass, statistics, T, mu)
282 {
283
284 }
285
286 // Override functions begin
287
288 virtual std::vector<double> GetMomentum(double mass = -1.) const;
289
290 // Override functions end
291
292 private:
293 ThermalMomentumGenerator m_Generator;
294 };
295
296
297
306 {
307 public:
319 double Tkin = 0.100, double etamax = 3.0, double mass = 0.938, int statistics = 0, double mu = 0);
320
327
328 double EtaMax() const { return m_EtaMax; }
329 double Mass() const { return m_Mass; }
330
331 // Override functions begin
332
333 virtual std::vector<double> GetMomentum(double mass = -1.) const;
334
335 // Override functions end
336
337 protected:
344 virtual double GetRandomZeta(MTRand& rangen = RandomGenerators::randgenMT) const;
345
346 private:
348 ThermalMomentumGenerator m_Generator;
349 double m_Tkin;
350 double m_EtaMax;
351 double m_Mass;
352 };
353
354
358 {
359 public:
360
362
372 BreitWignerGenerator(double M, double gamma, double mthr) : m_M(M), m_Gamma(gamma), m_Mthr(mthr) { FixParameters(); }
373
375
383 void SetParameters(double M, double gamma, double mthr);
384
385 // Generates random resonance mass m from relativistic Breit-Wigner distribution
393 double GetRandom() const;
394
395 private:
397 double f(double x) const;
398
400 void FixParameters();
401
402 double m_M;
403 double m_Gamma;
404 double m_Mthr;
405 double m_Norm;
406 double m_Max;
407 };
408
409
422 {
423 public:
425
434 ThermalBreitWignerGenerator(ThermalParticle *part, double T, double Mu) : m_part(part), m_T(T), m_Mu(Mu) { FixParameters(); }
435
437
446 void SetParameters(ThermalParticle *part, double T, double Mu);
447
453 double GetRandom() const;
454
455 protected:
457 virtual void FixParameters();
458
460 virtual double f(double M) const;
461
463 double m_T, m_Mu;
464 double m_Xmin, m_Xmax;
465 double m_Max;
466 };
467
468 // Class for generating mass of resonance in accordance with its fixed Breit-Wigner distribution multiplied by the Boltzmann factor
482 {
483 public:
484
486
493 ThermalBreitWignerGenerator(part, T, Mu) {
495 }
496
498
499 protected:
500 virtual void FixParameters();
501
502 virtual double f(double M) const;
503 };
504 }
505
506} // namespace thermalfist
507
508
513
514namespace thermalfist {
515
518 namespace RandomGenerators {
519
520 // 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
531 {
532 public:
534
543 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) {
544 m_distr = SSHDistribution(0, m_Mass, m_T, m_BetaS, m_EtaMax, m_n, false);
545 m_dPt = 0.02;
546 m_dy = 0.05;
547 FixParameters2();
548
549 }
550
552
562 void SetParameters(double T, double betas, double etamax, double npow, double mass) {
563 m_T = T;
564 m_BetaS = betas;
565 m_EtaMax = etamax;
566 m_Mass = mass;
567 m_n = npow;
568 m_distr = SSHDistribution(0, m_Mass, m_T, m_BetaS, m_EtaMax, m_n);
569 m_dPt = 0.02;
570 m_dy = 0.05;
571 FixParameters2();
572 }
573
581 void SetMeanBetaT(double betaT) {
582 m_BetaS = (2. + m_n) / 2. * betaT;
583 m_distr = SSHDistribution(0, m_Mass, m_T, m_BetaS, m_EtaMax, m_n);
584 m_dPt = 0.02;
585 m_dy = 0.05;
586 FixParameters2();
587 }
588
589 double GetTkin() const { return m_T; }
590 double GetBetaSurface() const { return m_BetaS; }
591 double GetMass() const { return m_Mass; }
592 double GetNPow() const { return m_n; }
593 double GetEtaMax() const { return m_EtaMax; }
594
595 // Override functions begin
596
597 std::vector<double> GetMomentum(double mass = -1.) const;
598
599 // Override functions end
600
601 private:
602 double w(double p) const {
603 return sqrt(p * p + m_Mass * m_Mass);
604 }
605
606 double g(double x) const {
607 return m_distr.dndpt(-log(x)) / x;
608 }
609
610 double g2(double x) const {
611 return m_dndpt.f(x);
612 }
613
614 void FixParameters();
615
616 void FixParameters2();
617
618 // Finds the maximum of g(x) using the ternary search
619 void FindMaximumPt();
620
621 void FindMaximumY(double pt);
622
623 void FindMaximumY2(double pt);
624
625 // Generates random pt and y
626 std::pair<double, double> GetRandom(double mass = -1.);
627
628 std::pair<double, double> GetRandom2(double mass = -1.) const;
629
630 double m_T, m_BetaS, m_EtaMax, m_n, m_Mass;
631 double m_MaxY, m_MaxPt;
632 SSHDistribution m_distr;
633 SplineFunction m_dndpt;
634 std::vector<SplineFunction> m_dndy;
635 std::vector<double> m_MaxYs;
636 double m_dPt;
637 double m_dy;
638 };
639
640 }
641
642} // namespace thermalfist
643
645
646#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)