27 m_TAG =
"ThermalModelIdeal";
30 m_InteractionModel =
Ideal;
38 m_FluctuationsCalculated =
false;
40 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
49 int NN = m_densities.size();
50 vector<double> tN(NN);
51 for (
int i = 0; i < NN; ++i)
52 tN[i] = m_densities[i];
54 vector<double> chi2s(NN);
55 for (
int i = 0; i < NN; ++i)
56 chi2s[i] = m_TPS->Particles()[i].chiDimensionfull(2, m_Parameters, m_UseWidth, m_Chem[i]);
58 m_PrimCorrel.resize(NN);
59 for (
int i = 0; i < NN; ++i) m_PrimCorrel[i].resize(NN);
60 m_dmusdmu = m_PrimCorrel;
61 m_TotalCorrel = m_PrimCorrel;
63 for (
int i = 0; i < NN; ++i)
64 for (
int j = 0; j < NN; ++j) {
65 m_PrimCorrel[i][j] = 0.;
67 m_dmusdmu[i][j] = (i == j) ? 1. : 0.;
70 for (
int i = 0; i < NN; ++i) {
71 m_wprim[i] = m_PrimCorrel[i][i];
72 if (m_densities[i] > 0.) m_wprim[i] *= m_Parameters.T / m_densities[i];
74 if (m_wprim[i] != m_wprim[i]) m_wprim[i] = 1.;
77 m_TwoParticleCorrelationsCalculated =
true;
88 for (
size_t i = 0; i < m_wprim.size(); ++i) {
93 for (
size_t i = 0; i < m_wtot.size(); ++i) {
94 double tmp1 = 0., tmp2 = 0., tmp3 = 0., tmp4 = 0.;
95 tmp2 = m_densities[i] * m_wprim[i];
96 tmp3 = m_densities[i] * m_wprim[i] * m_skewprim[i];
97 tmp4 = m_densities[i] * m_wprim[i] * m_kurtprim[i];
99 for (
size_t r = 0; r < decayContributions.size(); ++r) {
102 tmp2 += m_densities[decayContrib.second] *
103 (m_wprim[decayContrib.second] * decayContrib.first * decayContrib.first
104 + decayCumulantsSingle.first[1]);
106 int rr = decayContrib.second;
107 double ni = decayContrib.first;
108 tmp3 += m_densities[rr] * m_wprim[rr] * (m_skewprim[rr] * ni * ni * ni + 3. * ni * decayCumulantsSingle.first[1]);
109 tmp3 += m_densities[rr] * decayCumulantsSingle.first[2];
111 tmp4 += m_densities[rr] * m_wprim[rr] * (m_kurtprim[rr] * ni * ni * ni * ni
112 + 6. * m_skewprim[rr] * ni * ni * decayCumulantsSingle.first[1]
113 + 3. * decayCumulantsSingle.first[1] * decayCumulantsSingle.first[1]
114 + 4. * ni * decayCumulantsSingle.first[2]);
116 tmp4 += m_densities[rr] * decayCumulantsSingle.first[3];
120 tmp1 = m_densitiestotal[i];
123 m_wtot[i] = tmp2 / tmp1;
128 m_skewtot[i] = tmp3 / tmp2;
129 m_kurttot[i] = tmp4 / tmp2;
137 m_FluctuationsCalculated =
true;
146 vector<double> ret(order + 1, 0.);
147 vector<double> current_charges(m_densities.size(), 1.);
149 for(
int iord = 0; iord < order; ++iord) {
150 for(
size_t i = 0; i < m_densities.size(); ++i) {
151 current_charges[i] *= chgs[i];
152 ret[iord] += current_charges[i] * m_TPS->Particles()[i].chiDimensionfull(iord + 1, m_Parameters, m_UseWidth, m_Chem[i]);
160 int order = chgs.size();
163 throw std::invalid_argument(
"Order must be less than or equal to 4");
166 vector<double> ret(order + 1, 0.);
167 vector<double> current_charges(m_densities.size(), 1.);
169 for(
int iord = 0; iord < order; ++iord) {
170 for(
size_t i = 0; i < m_densities.size(); ++i) {
171 current_charges[i] *= chgs[iord][i];
172 ret[iord] += current_charges[i] * m_TPS->Particles()[i].chi(iord + 1, m_Parameters, m_UseWidth, m_Chem[i]);
182 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i) ret += m_TPS->Particles()[i].Density(m_Parameters,
IdealGasFunctions::EnergyDensity, m_UseWidth, m_Chem[i]);
190 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i) ret += m_TPS->Particles()[i].Density(m_Parameters,
IdealGasFunctions::EntropyDensity, m_UseWidth, m_Chem[i]);
197 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i)
198 if (m_TPS->Particles()[i].BaryonCharge() != 0)
205 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i)
206 if (m_TPS->Particles()[i].BaryonCharge() == 0)
214 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i) ret += m_TPS->Particles()[i].Density(m_Parameters,
IdealGasFunctions::Pressure, m_UseWidth, m_Chem[i]);
220 if (!IsTemperatureDerivativesCalculated())
226 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i)
233 if (!IsTemperatureDerivativesCalculated())
239 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i)
246 return m_TPS->Particles()[part].ScaledVariance(m_Parameters, m_UseWidth, m_Chem[part]);
250 return m_TPS->Particles()[part].Skewness(m_Parameters, m_UseWidth, m_Chem[part]);
254 return m_TPS->Particles()[part].Kurtosis(m_Parameters, m_UseWidth, m_Chem[part]);
262 int N = m_TPS->ComponentsNumber();
263 m_dndT = vector<double>(N, 0.);
264 m_dmusdT = vector<double>(N, 0.);
265 m_PrimChi2sdT = vector<vector<double>>(N, vector<double>(N, 0.));
267 for (
int i = 0; i < N; ++i) {
273 m_TemperatureDerivativesCalculated =
true;
275 if (IsSusceptibilitiesCalculated())
map< string, double > params
virtual void CalculateSusceptibilityMatrix()
Calculates the conserved charges susceptibility matrix.
virtual void CalculateParticleChargeCorrelationMatrix()
Calculates the matrix of correlators between primordial (and also final) particle numbers and conserv...
virtual void ValidateCalculation()
Checks whether issues have occured during the calculation of particle densities in the CalculateDensi...
virtual void CalculateProxySusceptibilityMatrix()
Calculates the susceptibility matrix of conserved charges proxies.
ThermalModelBase(ThermalParticleSystem *TPS, const ThermalModelParameters ¶ms=ThermalModelParameters())
Construct a new ThermalModelBase object.
@ GCE
Grand canonical ensemble.
virtual void CalculateTwoParticleFluctuationsDecays()
Computes particle number correlations and fluctuations for all final-state particles which are marked...
virtual void CalculatePrimordialDensities()
Calculates the primordial densities of all species.
virtual double ParticleScaledVariance(int part)
virtual double CalculatePressure()
virtual double ParticleKurtosis(int part)
virtual double CalculateEntropyDensityDerivativeT()
ThermalModelIdeal(ThermalParticleSystem *TPS, const ThermalModelParameters ¶ms=ThermalModelParameters())
Construct a new ThermalModelIdeal object.
virtual void CalculateTwoParticleCorrelations()
Computes the fluctuations and correlations of the primordial particle numbers.
virtual std::vector< double > CalculateChargeFluctuations(const std::vector< double > &chgs, int order=4, bool dimensionfull=false)
Calculates fluctuations (diagonal susceptibilities) of an arbitrary "conserved" charge.
virtual double CalculateEnergyDensity()
virtual double CalculateEntropyDensity()
virtual void CalculateFluctuations()
Computes the fluctuation observables.
virtual double CalculateMesonMatterEntropyDensity()
virtual double CalculateEnergyDensityDerivativeT()
virtual ~ThermalModelIdeal(void)
Destroy the ThermalModelIdeal object.
virtual std::vector< double > CalculateGeneralizedSusceptibilities(const std::vector< std::vector< double > > &chgs)
virtual double CalculateBaryonMatterEntropyDensity()
virtual double ParticleScalarDensity(int part)
virtual double ParticleSkewness(int part)
virtual void CalculateTemperatureDerivatives()
Computes the temperature derivatives of densities, shifted chemical potentials, and primordial hadron...
Class containing the particle list.
std::vector< SingleDecayContribution > DecayContributionsToParticle
A vector of SingleDecayContribution where each element corresponds to a certain resonance species.
std::pair< double, int > SingleDecayContribution
std::pair< std::vector< double >, int > SingleDecayCumulantsContribution
constexpr double GeVtoifm()
A constant to transform GeV into fm .
The main namespace where all classes and functions of the Thermal-FIST library reside.
@ StabilityFlag
Feeddown from all particles marked as unstable.
Structure containing all thermal parameters of the model.
Contains some extra mathematical functions used in the code.