26 m_TAG =
"ThermalModelIdeal";
29 m_InteractionModel =
Ideal;
37 m_FluctuationsCalculated =
false;
39 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i) {
48 int NN = m_densities.size();
49 vector<double> tN(NN);
50 for (
int i = 0; i < NN; ++i)
51 tN[i] = m_densities[i];
53 vector<double> chi2s(NN);
54 for (
int i = 0; i < NN; ++i)
55 chi2s[i] = m_TPS->Particles()[i].chiDimensionfull(2, m_Parameters, m_UseWidth, m_Chem[i]);
57 m_PrimCorrel.resize(NN);
58 for (
int i = 0; i < NN; ++i) m_PrimCorrel[i].resize(NN);
59 m_dmusdmu = m_PrimCorrel;
60 m_TotalCorrel = m_PrimCorrel;
62 for (
int i = 0; i < NN; ++i)
63 for (
int j = 0; j < NN; ++j) {
64 m_PrimCorrel[i][j] = 0.;
66 m_dmusdmu[i][j] = (i == j) ? 1. : 0.;
69 for (
int i = 0; i < NN; ++i) {
70 m_wprim[i] = m_PrimCorrel[i][i];
71 if (m_densities[i] > 0.) m_wprim[i] *= m_Parameters.T / m_densities[i];
85 for (
size_t i = 0; i < m_wprim.size(); ++i) {
90 for (
size_t i = 0; i < m_wtot.size(); ++i) {
91 double tmp1 = 0., tmp2 = 0., tmp3 = 0., tmp4 = 0.;
92 tmp2 = m_densities[i] * m_wprim[i];
93 tmp3 = m_densities[i] * m_wprim[i] * m_skewprim[i];
94 tmp4 = m_densities[i] * m_wprim[i] * m_kurtprim[i];
96 for (
size_t r = 0; r < decayContributions.size(); ++r) {
99 tmp2 += m_densities[decayContrib.second] *
100 (m_wprim[decayContrib.second] * decayContrib.first * decayContrib.first
101 + decayCumulantsSingle.first[1]);
103 int rr = decayContrib.second;
104 double ni = decayContrib.first;
105 tmp3 += m_densities[rr] * m_wprim[rr] * (m_skewprim[rr] * ni * ni * ni + 3. * ni * decayCumulantsSingle.first[1]);
106 tmp3 += m_densities[rr] * decayCumulantsSingle.first[2];
108 tmp4 += m_densities[rr] * m_wprim[rr] * (m_kurtprim[rr] * ni * ni * ni * ni
109 + 6. * m_skewprim[rr] * ni * ni * decayCumulantsSingle.first[1]
110 + 3. * decayCumulantsSingle.first[1] * decayCumulantsSingle.first[1]
111 + 4. * ni * decayCumulantsSingle.first[2]);
113 tmp4 += m_densities[rr] * decayCumulantsSingle.first[3];
117 tmp1 = m_densitiestotal[i];
119 m_wtot[i] = tmp2 / tmp1;
120 m_skewtot[i] = tmp3 / tmp2;
121 m_kurttot[i] = tmp4 / tmp2;
124 m_FluctuationsCalculated =
true;
132 vector<double> ret(order + 1, 0.);
135 for (
size_t i = 0; i < m_densities.size(); ++i)
136 ret[0] += chgs[i] * m_densities[i];
140 if (order < 2)
return ret;
142 for (
size_t i = 0; i < m_densities.size(); ++i)
143 ret[1] += chgs[i] * chgs[i] * m_TPS->Particles()[i].chi(2, m_Parameters, m_UseWidth, m_Chem[i]);
145 if (order < 3)
return ret;
147 for (
size_t i = 0; i < m_densities.size(); ++i)
148 ret[2] += chgs[i] * chgs[i] * chgs[i] * m_TPS->Particles()[i].chi(3, m_Parameters, m_UseWidth, m_Chem[i]);
150 if (order < 4)
return ret;
152 for (
size_t i = 0; i < m_densities.size(); ++i)
153 ret[3] += chgs[i] * chgs[i] * chgs[i] * chgs[i] * m_TPS->Particles()[i].chi(4, m_Parameters, m_UseWidth, m_Chem[i]);
159 int order = chgs.size();
162 throw std::invalid_argument(
"Order must be less than or equal to 4");
165 vector<double> ret(order + 1, 0.);
166 vector<double> current_charges(m_densities.size(), 1.);
168 for(
int iord = 0; iord < order; ++iord) {
169 for(
size_t i = 0; i < m_densities.size(); ++i) {
170 current_charges[i] *= chgs[iord][i];
171 ret[iord] += current_charges[i] * m_TPS->Particles()[i].chi(iord + 1, m_Parameters, m_UseWidth, m_Chem[i]);
181 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i) ret += m_TPS->Particles()[i].Density(m_Parameters,
IdealGasFunctions::EnergyDensity, m_UseWidth, m_Chem[i]);
189 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i) ret += m_TPS->Particles()[i].Density(m_Parameters,
IdealGasFunctions::EntropyDensity, m_UseWidth, m_Chem[i]);
196 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i)
197 if (m_TPS->Particles()[i].BaryonCharge() != 0)
204 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i)
205 if (m_TPS->Particles()[i].BaryonCharge() == 0)
213 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i) ret += m_TPS->Particles()[i].Density(m_Parameters,
IdealGasFunctions::Pressure, m_UseWidth, m_Chem[i]);
219 if (!IsTemperatureDerivativesCalculated())
225 for (
int i = 0; i < m_TPS->ComponentsNumber(); ++i)
232 return m_TPS->Particles()[part].ScaledVariance(m_Parameters, m_UseWidth, m_Chem[part]);
236 return m_TPS->Particles()[part].Skewness(m_Parameters, m_UseWidth, m_Chem[part]);
240 return m_TPS->Particles()[part].Kurtosis(m_Parameters, m_UseWidth, m_Chem[part]);
248 int N = m_TPS->ComponentsNumber();
249 m_dndT = vector<double>(N, 0.);
250 m_dmusdT = vector<double>(N, 0.);
251 m_PrimChi2sdT = vector<vector<double>>(N, vector<double>(N, 0.));
253 for (
int i = 0; i < N; ++i) {
259 m_TemperatureDerivativesCalculated =
true;
261 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 std::vector< double > CalculateChargeFluctuations(const std::vector< double > &chgs, int order=4)
Calculates fluctuations (diagonal susceptibilities) of an arbitrary "conserved" charge.
virtual double CalculatePressure()
virtual double ParticleKurtosis(int part)
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 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.