30 double EventGeneratorBase::m_LastWeight = 1., EventGeneratorBase::m_LastLogWeight = 0., EventGeneratorBase::m_LastNormWeight = 1.;
32 std::vector<double>
LorentzBoost(
const std::vector<double>& fourvector,
double vx,
double vy,
double vz)
34 std::vector<double> ret(4, 0);
35 double v2 = vx * vx + vy * vy + vz * vz;
38 double gamma = 1. / sqrt(1. - v2);
40 const double& r0 = fourvector[0];
41 const double& rx = fourvector[1];
42 const double& ry = fourvector[2];
43 const double& rz = fourvector[3];
45 ret[0] = gamma * r0 - gamma * (vx * rx + vy * ry + vz * rz);
46 ret[1] = -gamma * vx * r0 + (1. + (gamma - 1.) * vx * vx / v2) * rx +
47 (gamma - 1.) * vx * vy / v2 * ry + (gamma - 1.) * vx * vz / v2 * rz;
48 ret[2] = -gamma * vy * r0 + (1. + (gamma - 1.) * vy * vy / v2) * ry +
49 (gamma - 1.) * vy * vx / v2 * rx + (gamma - 1.) * vy * vz / v2 * rz;
50 ret[3] = -gamma * vz * r0 + (1. + (gamma - 1.) * vz * vz / v2) * rz +
51 (gamma - 1.) * vz * vx / v2 * rx + (gamma - 1.) * vz * vy / v2 * ry;
58 m_MeanB(0.), m_MeanAB(0.),
59 m_MeanSM(0.), m_MeanASM(0.),
60 m_MeanCM(0.), m_MeanACM(0.),
61 m_MeanCHRM(0.), m_MeanACHRM(0.),
62 m_MeanCHRMM(0.), m_MeanACHRMM(0.)
80 for (
size_t i = 0; i <
m_BWGens.size(); ++i) {
133 m_THM->FillChemicalPotentials();
137 m_THM->CalculatePrimordialDensities();
148 m_THM->ConstrainMuB(
false);
149 m_THM->ConstrainMuQ(
false);
150 m_THM->ConstrainMuS(
false);
151 m_THM->ConstrainMuC(
false);
154 m_THM->FillChemicalPotentials();
161 for (
size_t i = 0; i <
m_THM->Densities().size(); ++i) {
162 for (
size_t j = 0; j <
m_THM->Densities().size(); ++j) {
204 double left = 0.000, right = 0.900, center;
206 m_THM->SetBaryonChemicalPotential(left);
207 m_THM->SetQoverB(QBrat);
208 m_THM->FixParameters();
209 m_THM->CalculatePrimordialDensities();
212 m_THM->SetBaryonChemicalPotential(right);
213 m_THM->SetQoverB(QBrat);
214 m_THM->FixParameters();
215 m_THM->CalculatePrimordialDensities();
220 while ((right - left) > 0.00001) {
221 center = (left + right) / 2.;
222 m_THM->SetBaryonChemicalPotential(center);
223 m_THM->SetQoverB(QBrat);
224 m_THM->FixParameters();
225 m_THM->CalculatePrimordialDensities();
228 if (valleft*valcenter > 0.) {
234 valright = valcenter;
238 m_THM->SetBaryonChemicalPotential(center);
239 m_THM->SetQoverB(QBrat);
240 m_THM->FixParameters();
246 m_THM->FillChemicalPotentials();
253 m_THM->Parameters().muB,
m_THM->Parameters().muQ,
m_THM->Parameters().muS,
m_THM->Parameters().muC,
255 if (
m_THM->Parameters().muB !=
m_THM->Parameters().muB ||
256 m_THM->Parameters().muQ !=
m_THM->Parameters().muQ ||
257 m_THM->Parameters().muS !=
m_THM->Parameters().muS ||
258 m_THM->Parameters().muC !=
m_THM->Parameters().muC ||
261 printf(
"**WARNING** Could not constrain chemical potentials. Setting all for exactly conserved charges to zero...\n");
263 m_THM->SetBaryonChemicalPotential(0.);
265 m_THM->SetBaryonChemicalPotential(
m_Config.CFOParameters.muB);
268 m_THM->SetElectricChemicalPotential(0.);
270 m_THM->SetElectricChemicalPotential(
m_Config.CFOParameters.muQ);
273 m_THM->SetStrangenessChemicalPotential(0.);
275 m_THM->SetStrangenessChemicalPotential(
m_Config.CFOParameters.muS);
278 m_THM->SetCharmChemicalPotential(0.);
280 m_THM->SetCharmChemicalPotential(
m_Config.CFOParameters.muC);
282 m_THM->FillChemicalPotentials();
304 m_THM->ConstrainMuS(
true);
305 m_THM->ConstrainMuC(
true);
306 m_THM->ConstrainChemicalPotentials();
307 m_THM->FillChemicalPotentials();
313 m_THM->ConstrainMuC(
true);
314 m_THM->ConstrainChemicalPotentials();
315 m_THM->FillChemicalPotentials();
320 m_THM->CalculatePrimordialDensities();
331 if (!
m_THM->IsCalculated()) {
332 m_THM->CalculatePrimordialDensities();
336 m_AntiBaryons.resize(0);
337 m_StrangeMesons.resize(0);
338 m_AntiStrangeMesons.resize(0);
339 m_ChargeMesons.resize(0);
340 m_AntiChargeMesons.resize(0);
341 m_CharmMesons.resize(0);
342 m_AntiCharmMesons.resize(0);
343 m_CharmAll.resize(0);
344 m_AntiCharmAll.resize(0);
356 std::vector<double> yields =
m_THM->Densities();
357 for (
size_t i = 0; i <
m_THM->TPS()->Particles().size(); ++i)
358 yields[i] *=
m_THM->Volume();
360 for (
size_t i = 0; i <
m_THM->TPS()->Particles().size(); ++i) {
361 if (
m_THM->TPS()->Particles()[i].BaryonCharge() == 1) {
362 m_Baryons.push_back(std::make_pair(yields[i], i));
363 m_MeanB += yields[i];
365 else if (
m_THM->TPS()->Particles()[i].BaryonCharge() == -1) {
366 m_AntiBaryons.push_back(std::make_pair(yields[i], i));
367 m_MeanAB += yields[i];
369 else if (
m_THM->TPS()->Particles()[i].BaryonCharge() == 0 &&
m_THM->TPS()->Particles()[i].Strangeness() == 1) {
370 m_StrangeMesons.push_back(std::make_pair(yields[i], i));
371 m_MeanSM += yields[i];
373 else if (
m_THM->TPS()->Particles()[i].BaryonCharge() == 0 &&
m_THM->TPS()->Particles()[i].Strangeness() == -1) {
374 m_AntiStrangeMesons.push_back(std::make_pair(yields[i], i));
375 m_MeanASM += yields[i];
377 else if (
m_THM->TPS()->Particles()[i].BaryonCharge() == 0 &&
m_THM->TPS()->Particles()[i].Strangeness() == 0 &&
m_THM->TPS()->Particles()[i].ElectricCharge() == 1) {
378 m_ChargeMesons.push_back(std::make_pair(yields[i], i));
379 m_MeanCM += yields[i];
381 else if (
m_THM->TPS()->Particles()[i].BaryonCharge() == 0 &&
m_THM->TPS()->Particles()[i].Strangeness() == 0 &&
m_THM->TPS()->Particles()[i].ElectricCharge() == -1) {
382 m_AntiChargeMesons.push_back(std::make_pair(yields[i], i));
383 m_MeanACM += yields[i];
385 else if (
m_THM->TPS()->Particles()[i].BaryonCharge() == 0 &&
m_THM->TPS()->Particles()[i].Strangeness() == 0 &&
m_THM->TPS()->Particles()[i].ElectricCharge() == 0 &&
m_THM->TPS()->Particles()[i].Charm() == 1) {
386 m_CharmMesons.push_back(std::make_pair(yields[i], i));
387 m_MeanCHRMM += yields[i];
389 else if (
m_THM->TPS()->Particles()[i].BaryonCharge() == 0 &&
m_THM->TPS()->Particles()[i].Strangeness() == 0 &&
m_THM->TPS()->Particles()[i].ElectricCharge() == 0 &&
m_THM->TPS()->Particles()[i].Charm() == -1) {
390 m_AntiCharmMesons.push_back(std::make_pair(yields[i], i));
391 m_MeanACHRMM += yields[i];
394 if (
m_THM->TPS()->Particles()[i].Charm() == 1) {
395 m_CharmAll.push_back(std::make_pair(yields[i], i));
396 m_MeanCHRM += yields[i];
398 else if (
m_THM->TPS()->Particles()[i].Charm() == -1) {
399 m_AntiCharmAll.push_back(std::make_pair(yields[i], i));
400 m_MeanACHRM += yields[i];
405 std::sort(m_Baryons.begin(), m_Baryons.end(), std::greater< std::pair<double, int> >());
406 std::sort(m_AntiBaryons.begin(), m_AntiBaryons.end(), std::greater< std::pair<double, int> >());
407 std::sort(m_StrangeMesons.begin(), m_StrangeMesons.end(), std::greater< std::pair<double, int> >());
408 std::sort(m_AntiStrangeMesons.begin(), m_AntiStrangeMesons.end(), std::greater< std::pair<double, int> >());
409 std::sort(m_ChargeMesons.begin(), m_ChargeMesons.end(), std::greater< std::pair<double, int> >());
410 std::sort(m_AntiChargeMesons.begin(), m_AntiChargeMesons.end(), std::greater< std::pair<double, int> >());
411 std::sort(m_CharmMesons.begin(), m_CharmMesons.end(), std::greater< std::pair<double, int> >());
412 std::sort(m_AntiCharmMesons.begin(), m_AntiCharmMesons.end(), std::greater< std::pair<double, int> >());
413 std::sort(m_CharmAll.begin(), m_CharmAll.end(), std::greater< std::pair<double, int> >());
414 std::sort(m_AntiCharmAll.begin(), m_AntiCharmAll.end(), std::greater< std::pair<double, int> >());
416 for (
int i = 1; i < static_cast<int>(m_Baryons.size()); ++i) m_Baryons[i].first += m_Baryons[i - 1].first;
417 for (
int i = 1; i < static_cast<int>(m_AntiBaryons.size()); ++i) m_AntiBaryons[i].first += m_AntiBaryons[i - 1].first;
418 for (
int i = 1; i < static_cast<int>(m_StrangeMesons.size()); ++i) m_StrangeMesons[i].first += m_StrangeMesons[i - 1].first;
419 for (
int i = 1; i < static_cast<int>(m_AntiStrangeMesons.size()); ++i) m_AntiStrangeMesons[i].first += m_AntiStrangeMesons[i - 1].first;
420 for (
int i = 1; i < static_cast<int>(m_ChargeMesons.size()); ++i) m_ChargeMesons[i].first += m_ChargeMesons[i - 1].first;
421 for (
int i = 1; i < static_cast<int>(m_AntiChargeMesons.size()); ++i) m_AntiChargeMesons[i].first += m_AntiChargeMesons[i - 1].first;
422 for (
int i = 1; i < static_cast<int>(m_CharmMesons.size()); ++i) m_CharmMesons[i].first += m_CharmMesons[i - 1].first;
423 for (
int i = 1; i < static_cast<int>(m_AntiCharmMesons.size()); ++i) m_AntiCharmMesons[i].first += m_AntiCharmMesons[i - 1].first;
424 for (
int i = 1; i < static_cast<int>(m_CharmAll.size()); ++i) m_CharmAll[i].first += m_CharmAll[i - 1].first;
425 for (
int i = 1; i < static_cast<int>(m_AntiCharmAll.size()); ++i) m_AntiCharmAll[i].first += m_AntiCharmAll[i - 1].first;
431 if (!
m_THM->IsCalculated())
432 m_THM->CalculatePrimordialDensities();
434 std::vector<int> totals(
m_THM->TPS()->Particles().size());
437 m_LastNormWeight = 1.;
469 if (!
m_THM->IsCalculated())
470 m_THM->CalculatePrimordialDensities();
471 std::vector<int> totals(
m_THM->TPS()->Particles().size(), 0);
473 const std::vector<double>& densities =
m_THM->Densities();
474 for (
size_t i = 0; i <
m_THM->TPS()->Particles().size(); ++i) {
475 double mean = densities[i] *
m_THM->Volume();
485 if (!
m_THM->IsCalculated())
486 m_THM->CalculatePrimordialDensities();
488 std::vector<int> totals(
m_THM->TPS()->Particles().size(), 0);
492 const std::vector<double>& densities =
m_THM->Densities();
495 if (
m_THM->Volume() ==
m_THM->CanonicalVolume()) {
501 else if (
m_THM->Volume() <
m_THM->CanonicalVolume()) {
503 double prob =
m_THM->Volume() /
m_THM->CanonicalVolume();
504 for (
size_t i = 0; i < totalsaux.size(); ++i) {
505 for (
int j = 0; j < totalsaux[i]; ++j) {
515 int multiples =
static_cast<int>(
m_THM->Volume() /
m_THM->CanonicalVolume());
517 for (
int iter = 0; iter < multiples; ++iter) {
519 for (
size_t i = 0; i < totalsaux.size(); ++i)
520 totals[i] += totalsaux[i];
524 double fraction = (
m_THM->Volume() - multiples *
m_THM->CanonicalVolume()) /
m_THM->CanonicalVolume();
526 if (fraction > 0.0) {
528 bool successflag =
false;
530 while (!successflag) {
533 std::vector<int> totalsaux2(
m_THM->TPS()->Particles().size(), 0);
535 for (
size_t i = 0; i < totalsaux.size(); ++i) {
536 if (
m_THM->TPS()->Particles()[i].Strangeness() > 0) {
537 for (
int j = 0; j < totalsaux[i]; ++j) {
540 netS +=
m_THM->TPS()->Particles()[i].Strangeness();
550 for (
size_t i = 0; i < totalsaux.size(); ++i) {
551 if (
m_THM->TPS()->Particles()[i].Strangeness() < 0 && totalsaux[i] > 0) {
557 printf(
"**WARNING** SCE Event generator: Cannot match S- with S+ = 1, discarding subconfiguration...\n");
562 int repeatmax = 10000;
566 for (
size_t i = 0; i < totalsaux.size(); ++i) {
567 if (
m_THM->TPS()->Particles()[i].Strangeness() < 0) {
569 for (
int j = 0; j < totalsaux[i]; ++j) {
572 netS2 +=
m_THM->TPS()->Particles()[i].Strangeness();
578 for (
size_t i = 0; i < totalsaux2.size(); ++i)
579 totals[i] += totalsaux2[i];
584 if (repeat >= repeatmax) {
585 printf(
"**WARNING** SCE event generator: Cannot match S- with S+, too many tries, discarding configuration...\n");
593 for (
size_t i = 0; i <
m_THM->TPS()->Particles().size(); ++i) {
594 if (
m_THM->TPS()->Particles()[i].Strangeness() == 0) {
595 double mean = densities[i] *
m_THM->Volume();
609 if (!
m_THM->IsCalculated())
610 m_THM->CalculatePrimordialDensities();
611 std::vector<int> totals(
m_THM->TPS()->Particles().size(), 0);
613 std::vector< std::pair<double, int> > fStrangeMesonsc = m_StrangeMesons;
614 std::vector< std::pair<double, int> > fAntiStrangeMesonsc = m_AntiStrangeMesons;
616 for (
size_t i = 0; i < fStrangeMesonsc.size(); ++i)
617 fStrangeMesonsc[i].first *= VolumeSC /
m_THM->Volume();
619 for (
size_t i = 0; i < fAntiStrangeMesonsc.size(); ++i)
620 fAntiStrangeMesonsc[i].first *= VolumeSC /
m_THM->Volume();
622 double fMeanSMc = m_MeanSM * VolumeSC /
m_THM->Volume();
623 double fMeanASMc = m_MeanASM * VolumeSC /
m_THM->Volume();
627 const std::vector<double>& densities =
m_THM->Densities();
629 for (
size_t i = 0; i <
m_THM->TPS()->Particles().size(); ++i) totals[i] = 0;
631 for (
size_t i = 0; i <
m_THM->TPS()->Particles().size(); ++i) {
632 if (
m_THM->TPS()->Particles()[i].BaryonCharge() != 0 &&
m_THM->TPS()->Particles()[i].Strangeness() != 0) {
633 double mean = densities[i] * VolumeSC;
636 netS += totals[i] *
m_THM->TPS()->Particles()[i].Strangeness();
642 if (netS != tASM - tSM)
continue;
644 for (
int i = 0; i < tSM; ++i) {
645 std::vector< std::pair<double, int> >::iterator it = lower_bound(fStrangeMesonsc.begin(), fStrangeMesonsc.end(), std::make_pair(fMeanSMc*
RandomGenerators::randgenMT.rand(), 0));
646 int tind = std::distance(fStrangeMesonsc.begin(), it);
647 if (tind < 0) tind = 0;
648 if (tind >=
static_cast<int>(fStrangeMesonsc.size())) tind = fStrangeMesonsc.size() - 1;
649 totals[fStrangeMesonsc[tind].second]++;
651 for (
int i = 0; i < tASM; ++i) {
652 std::vector< std::pair<double, int> >::iterator it = lower_bound(fAntiStrangeMesonsc.begin(), fAntiStrangeMesonsc.end(), std::make_pair(fMeanASMc*
RandomGenerators::randgenMT.rand(), 0));
653 int tind = std::distance(fAntiStrangeMesonsc.begin(), it);
654 if (tind < 0) tind = 0;
655 if (tind >=
static_cast<int>(fAntiStrangeMesonsc.size())) tind = fAntiStrangeMesonsc.size() - 1;
656 totals[fAntiStrangeMesonsc[tind].second]++;
661 for (
size_t i = 0; i < totals.size(); ++i) {
662 finS += totals[i] *
m_THM->TPS()->Particles()[i].Strangeness();
666 throw std::runtime_error(
"**ERROR** EventGeneratorBase::GenerateTotalsSCESubVolume(): Generated strangeness is non-zero!");
676 if (!
m_THM->IsCalculated())
677 m_THM->CalculatePrimordialDensities();
680 for (
size_t i = 0; i <
m_THM->TPS()->Particles().size(); ++i) {
681 if (abs(
m_THM->TPS()->Particles()[i].Charm()) > 1) {
682 throw std::runtime_error(
"CCE Event generator does not support lists with multi-charmed particles");
686 std::vector<int> totals(
m_THM->TPS()->Particles().size(), 0);
689 const std::vector<double>& densities =
m_THM->Densities();
692 if (
m_THM->Volume() ==
m_THM->CanonicalVolume()) {
698 else if (
m_THM->Volume() <
m_THM->CanonicalVolume()) {
700 double prob =
m_THM->Volume() /
m_THM->CanonicalVolume();
701 for (
size_t i = 0; i < totalsaux.size(); ++i) {
702 for (
int j = 0; j < totalsaux[i]; ++j) {
712 int multiples =
static_cast<int>(
m_THM->Volume() /
m_THM->CanonicalVolume());
714 for (
int iter = 0; iter < multiples; ++iter) {
716 for (
size_t i = 0; i < totalsaux.size(); ++i)
717 totals[i] += totalsaux[i];
721 double fraction = (
m_THM->Volume() - multiples *
m_THM->CanonicalVolume()) /
m_THM->CanonicalVolume();
723 if (fraction > 0.0) {
725 bool successflag =
false;
727 while (!successflag) {
730 std::vector<int> totalsaux2(
m_THM->TPS()->Particles().size(), 0);
732 for (
size_t i = 0; i < totalsaux.size(); ++i) {
733 if (
m_THM->TPS()->Particles()[i].Charm() > 0) {
734 for (
int j = 0; j < totalsaux[i]; ++j) {
737 netC +=
m_THM->TPS()->Particles()[i].Charm();
747 for (
size_t i = 0; i < totalsaux.size(); ++i) {
748 if (
m_THM->TPS()->Particles()[i].Charm() < 0 && totalsaux[i] > 0) {
754 printf(
"**WARNING** CCE Event generator: Cannot match C- with C+ = 1, discarding...\n");
759 int repeatmax = 10000;
763 for (
size_t i = 0; i < totalsaux.size(); ++i) {
764 if (
m_THM->TPS()->Particles()[i].Charm() < 0) {
766 for (
int j = 0; j < totalsaux[i]; ++j) {
769 netC2 +=
m_THM->TPS()->Particles()[i].Charm();
775 for (
size_t i = 0; i < totalsaux2.size(); ++i)
776 totals[i] += totalsaux2[i];
781 if (repeat >= repeatmax) {
782 printf(
"**WARNING** CCE event generator: Cannot match S- with S+, too many tries, discarding...\n");
790 for (
size_t i = 0; i <
m_THM->TPS()->Particles().size(); ++i) {
791 if (
m_THM->TPS()->Particles()[i].Charm() == 0) {
792 double mean = densities[i] *
m_THM->Volume();
803 if (!
m_THM->IsCalculated())
804 m_THM->CalculatePrimordialDensities();
806 std::vector<int> totals(
m_THM->TPS()->Particles().size(), 0);
808 std::vector< std::pair<double, int> > fCharmAllc = m_CharmAll;
809 std::vector< std::pair<double, int> > fAntiCharmAllc = m_AntiCharmAll;
811 for (
size_t i = 0; i < fCharmAllc.size(); ++i)
812 fCharmAllc[i].first *= VolumeSC /
m_THM->Volume();
814 for (
size_t i = 0; i < fAntiCharmAllc.size(); ++i)
815 fAntiCharmAllc[i].first *= VolumeSC /
m_THM->Volume();
818 double fMeanCharmc = m_MeanCHRM * VolumeSC /
m_THM->Volume();
819 double fMeanAntiCharmc = m_MeanACHRM * VolumeSC /
m_THM->Volume();
826 while (tC - tAC !=
m_Config.C - netC) {
832 for (
int i = 0; i < tC; ++i) {
833 std::vector< std::pair<double, int> >::iterator it = lower_bound(fCharmAllc.begin(), fCharmAllc.end(), std::make_pair(fMeanCharmc*
RandomGenerators::randgenMT.rand(), 0));
834 int tind = std::distance(fCharmAllc.begin(), it);
835 if (tind < 0) tind = 0;
836 if (tind >=
static_cast<int>(fCharmAllc.size())) tind = fCharmAllc.size() - 1;
837 totals[fCharmAllc[tind].second]++;
839 for (
int i = 0; i < tAC; ++i) {
840 std::vector< std::pair<double, int> >::iterator it = lower_bound(fAntiCharmAllc.begin(), fAntiCharmAllc.end(), std::make_pair(fMeanAntiCharmc*
RandomGenerators::randgenMT.rand(), 0));
841 int tind = std::distance(fAntiCharmAllc.begin(), it);
842 if (tind < 0) tind = 0;
843 if (tind >=
static_cast<int>(fAntiCharmAllc.size())) tind = fAntiCharmAllc.size() - 1;
844 totals[fAntiCharmAllc[tind].second]++;
849 for (
size_t i = 0; i < totals.size(); ++i) {
850 finC += totals[i] *
m_THM->TPS()->Particles()[i].Charm();
854 throw std::runtime_error(
"**ERROR** EventGeneratorBase::GenerateTotalsCCESubVolume(): Generated charm is non-zero!");
868 int Nspecies =
m_THM->TPS()->ComponentsNumber();
869 std::vector<std::vector<double>> radii = std::vector<std::vector<double>>(Nspecies,
870 std::vector<double>(Nspecies, 0.0));
872 for (
int i = 0; i < Nspecies; ++i) {
873 for (
int j = 0; j < Nspecies; ++j) {
885 const std::vector<SimpleParticle>& particles,
887 const std::vector<int>& ids,
888 const std::vector<std::vector<double>>& radii)
895 int idcand =
m_THM->TPS()->PdgToId(cand.
PDGID);
896 for (
int ipart = 0; ipart < particles.size(); ++ipart) {
906 r = radii[idpart][idcand];
909 double b = 0.5 * (
m_Config.bij[idpart][idcand] +
m_Config.bij[idcand][idpart]);
917 if (dist2 <= 4. * r * r)
925 if (!
m_THM->IsCalculated())
926 m_THM->CalculatePrimordialDensities();
927 std::vector<int> totals(
m_THM->TPS()->Particles().size(), 0);
929 const std::vector< std::pair<double, int> >& fBaryonsc = m_Baryons;
930 const std::vector< std::pair<double, int> >& fAntiBaryonsc = m_AntiBaryons;
931 const std::vector< std::pair<double, int> >& fStrangeMesonsc = m_StrangeMesons;
932 const std::vector< std::pair<double, int> >& fAntiStrangeMesonsc = m_AntiStrangeMesons;
933 const std::vector< std::pair<double, int> >& fChargeMesonsc = m_ChargeMesons;
934 const std::vector< std::pair<double, int> >& fAntiChargeMesonsc = m_AntiChargeMesons;
935 const std::vector< std::pair<double, int> >& fCharmMesonsc = m_CharmMesons;
936 const std::vector< std::pair<double, int> >& fAntiCharmMesonsc = m_AntiCharmMesons;
941 int netB = 0, netS = 0, netQ = 0, netC = 0;
942 for (
size_t i = 0; i <
m_THM->TPS()->Particles().size(); ++i) {
943 double mean =
m_THM->Densities()[i] *
m_THM->Volume();
946 netB += totals[i] *
m_THM->TPS()->Particles()[i].BaryonCharge();
947 netS += totals[i] *
m_THM->TPS()->Particles()[i].Strangeness();
948 netQ += totals[i] *
m_THM->TPS()->Particles()[i].ElectricCharge();
949 netC += totals[i] *
m_THM->TPS()->Particles()[i].Charm();
971 const std::vector<double>& densities =
m_THM->Densities();
973 for (
size_t i = 0; i <
m_THM->TPS()->Particles().size(); ++i) totals[i] = 0;
974 int netB = 0, netS = 0, netQ = 0, netC = 0;
978 bool flNuclei =
false;
980 for (
size_t i = 0; i <
m_THM->TPS()->Particles().size(); ++i) {
981 if (abs(
m_THM->TPS()->Particles()[i].BaryonCharge()) > 1) {
983 double mean = densities[i] *
m_THM->Volume();
986 netB += totals[i] *
m_THM->TPS()->Particles()[i].BaryonCharge();
987 netS += totals[i] *
m_THM->TPS()->Particles()[i].Strangeness();
988 netQ += totals[i] *
m_THM->TPS()->Particles()[i].ElectricCharge();
989 netC += totals[i] *
m_THM->TPS()->Particles()[i].Charm();
997 if (flNuclei || !
m_Config.CanonicalB) {
1008 if (nu < 0) nu = -nu;
1009 double a = 2. * sqrt(m_MeanB * m_MeanAB);
1025 for (
int i = 0; i < tB; ++i) {
1026 std::vector< std::pair<double, int> >::const_iterator it = lower_bound(fBaryonsc.begin(), fBaryonsc.end(), std::make_pair(m_MeanB*
RandomGenerators::randgenMT.rand(), 0));
1027 int tind = std::distance(fBaryonsc.begin(), it);
1028 if (tind < 0) tind = 0;
1029 if (tind >=
static_cast<int>(fBaryonsc.size())) tind = fBaryonsc.size() - 1;
1030 totals[fBaryonsc[tind].second]++;
1031 netS +=
m_THM->TPS()->Particles()[fBaryonsc[tind].second].Strangeness();
1032 netQ +=
m_THM->TPS()->Particles()[fBaryonsc[tind].second].ElectricCharge();
1033 netC +=
m_THM->TPS()->Particles()[fBaryonsc[tind].second].Charm();
1035 for (
int i = 0; i < tAB; ++i) {
1036 std::vector< std::pair<double, int> >::const_iterator it = lower_bound(fAntiBaryonsc.begin(), fAntiBaryonsc.end(), std::make_pair(m_MeanAB*
RandomGenerators::randgenMT.rand(), 0));
1037 int tind = std::distance(fAntiBaryonsc.begin(), it);
1038 if (tind < 0) tind = 0;
1039 if (tind >=
static_cast<int>(fAntiBaryonsc.size())) tind = fAntiBaryonsc.size() - 1;
1040 totals[fAntiBaryonsc[tind].second]++;
1041 netS +=
m_THM->TPS()->Particles()[fAntiBaryonsc[tind].second].Strangeness();
1042 netQ +=
m_THM->TPS()->Particles()[fAntiBaryonsc[tind].second].ElectricCharge();
1043 netC +=
m_THM->TPS()->Particles()[fAntiBaryonsc[tind].second].Charm();
1054 for (
int i = 0; i < tSM; ++i) {
1055 std::vector< std::pair<double, int> >::const_iterator it = lower_bound(fStrangeMesonsc.begin(), fStrangeMesonsc.end(), std::make_pair(m_MeanSM*
RandomGenerators::randgenMT.rand(), 0));
1056 int tind = std::distance(fStrangeMesonsc.begin(), it);
1057 if (tind < 0) tind = 0;
1058 if (tind >=
static_cast<int>(fStrangeMesonsc.size())) tind = fStrangeMesonsc.size() - 1;
1059 totals[fStrangeMesonsc[tind].second]++;
1060 netQ +=
m_THM->TPS()->Particles()[fStrangeMesonsc[tind].second].ElectricCharge();
1061 netC +=
m_THM->TPS()->Particles()[fStrangeMesonsc[tind].second].Charm();
1063 for (
int i = 0; i < tASM; ++i) {
1064 std::vector< std::pair<double, int> >::const_iterator it = lower_bound(fAntiStrangeMesonsc.begin(), fAntiStrangeMesonsc.end(), std::make_pair(m_MeanASM*
RandomGenerators::randgenMT.rand(), 0));
1065 int tind = std::distance(fAntiStrangeMesonsc.begin(), it);
1066 if (tind < 0) tind = 0;
1067 if (tind >=
static_cast<int>(fAntiStrangeMesonsc.size())) tind = fAntiStrangeMesonsc.size() - 1;
1068 totals[fAntiStrangeMesonsc[tind].second]++;
1069 netQ +=
m_THM->TPS()->Particles()[fAntiStrangeMesonsc[tind].second].ElectricCharge();
1070 netC +=
m_THM->TPS()->Particles()[fAntiStrangeMesonsc[tind].second].Charm();
1079 for (
int i = 0; i < tCM; ++i) {
1080 std::vector< std::pair<double, int> >::const_iterator it = lower_bound(fChargeMesonsc.begin(), fChargeMesonsc.end(), std::make_pair(m_MeanCM*
RandomGenerators::randgenMT.rand(), 0));
1081 int tind = std::distance(fChargeMesonsc.begin(), it);
1082 if (tind < 0) tind = 0;
1083 if (tind >=
static_cast<int>(fChargeMesonsc.size())) tind = fChargeMesonsc.size() - 1;
1084 totals[fChargeMesonsc[tind].second]++;
1085 netC +=
m_THM->TPS()->Particles()[fChargeMesonsc[tind].second].Charm();
1087 for (
int i = 0; i < tACM; ++i) {
1088 std::vector< std::pair<double, int> >::const_iterator it = lower_bound(fAntiChargeMesonsc.begin(), fAntiChargeMesonsc.end(), std::make_pair(m_MeanACM*
RandomGenerators::randgenMT.rand(), 0));
1089 int tind = std::distance(fAntiChargeMesonsc.begin(), it);
1090 if (tind < 0) tind = 0;
1091 if (tind >=
static_cast<int>(fAntiChargeMesonsc.size())) tind = fAntiChargeMesonsc.size() - 1;
1092 totals[fAntiChargeMesonsc[tind].second]++;
1093 netC +=
m_THM->TPS()->Particles()[fAntiChargeMesonsc[tind].second].Charm();
1100 if (
m_Config.CanonicalC && netC != tACHRNMM - tCHRMM +
m_Config.C)
continue;
1103 for (
int i = 0; i < tCHRMM; ++i) {
1104 std::vector< std::pair<double, int> >::const_iterator it = lower_bound(fCharmMesonsc.begin(), fCharmMesonsc.end(), std::make_pair(m_MeanCHRMM*
RandomGenerators::randgenMT.rand(), 0));
1105 int tind = std::distance(fCharmMesonsc.begin(), it);
1106 if (tind < 0) tind = 0;
1107 if (tind >=
static_cast<int>(fCharmMesonsc.size())) tind = fCharmMesonsc.size() - 1;
1108 totals[fCharmMesonsc[tind].second]++;
1110 for (
int i = 0; i < tACHRNMM; ++i) {
1111 std::vector< std::pair<double, int> >::const_iterator it = lower_bound(fAntiCharmMesonsc.begin(), fAntiCharmMesonsc.end(), std::make_pair(m_MeanACHRMM*
RandomGenerators::randgenMT.rand(), 0));
1112 int tind = std::distance(fAntiCharmMesonsc.begin(), it);
1113 if (tind < 0) tind = 0;
1114 if (tind >=
static_cast<int>(fAntiCharmMesonsc.size())) tind = fAntiCharmMesonsc.size() - 1;
1115 totals[fAntiCharmMesonsc[tind].second]++;
1119 for (
size_t i = 0; i <
m_THM->TPS()->Particles().size(); ++i) {
1120 if (
m_THM->TPS()->Particles()[i].BaryonCharge() == 0
1121 &&
m_THM->TPS()->Particles()[i].Strangeness() == 0
1122 &&
m_THM->TPS()->Particles()[i].ElectricCharge() == 0
1123 &&
m_THM->TPS()->Particles()[i].Charm() == 0) {
1124 double mean = densities[i] *
m_THM->Volume();
1131 int finB = 0, finQ = 0, finS = 0, finC = 0;
1132 for (
size_t i = 0; i < totals.size(); ++i) {
1133 finB += totals[i] *
m_THM->TPS()->Particles()[i].BaryonCharge();
1134 finQ += totals[i] *
m_THM->TPS()->Particles()[i].ElectricCharge();
1135 finS += totals[i] *
m_THM->TPS()->Particles()[i].Strangeness();
1136 finC += totals[i] *
m_THM->TPS()->Particles()[i].Charm();
1140 throw std::runtime_error(
"**ERROR** EventGeneratorBase::GenerateTotalsCE(): Generated baryon number does not match the input!");
1144 throw std::runtime_error(
"**ERROR** EventGeneratorBase::GenerateTotalsCE(): Generated electric charge does not match the input!");
1148 throw std::runtime_error(
"**ERROR** EventGeneratorBase::GenerateTotalsCE(): Generated strangeness does not match the input!");
1152 throw std::runtime_error(
"**ERROR** EventGeneratorBase::GenerateTotalsCE(): Generated charm does not match the input!");
1163 return make_pair(totals, m_LastNormWeight);
1172 double tmass = species.
Mass();
1178 double tmu =
m_THM->FullIdealChemicalPotential(
id);
1179 if (species.
Statistics() == -1 && tmu > tmass) {
1183 std::vector<double> momentum =
m_MomentumGens[id]->GetMomentum(tmass);
1186 momentum[3], momentum[4], momentum[5], momentum[6]);
1191 int id =
m_THM->TPS()->PdgToId(pdgid);
1193 throw std::invalid_argument(
"EventGeneratorBase::SampleParticleByPdg(): The input pdg code does not exist in the particle list!");
1241 std::vector<int> ids;
1242 for (
int i = 0; i <
m_THM->TPS()->Particles().size(); ++i)
1243 for (
int part = 0; part < yields[i]; ++part)
1251 bool flOverlap =
true;
1254 while (sampled < ids.size()) {
1256 int i = ids[sampled];
1260 if (
m_Config.fUseEVRejectionCoordinates &&
1264 for (
int i = 0; i < sampled; ++i) {
1265 double r = m_Radii[ids[i]][ids[sampled]];
1302 if (!
m_THM->IsCalculated())
1303 m_THM->CalculatePrimordialDensities();
1308 &&
m_Config.fUseEVRejectionMultiplicity) {
1310 if (m_LastNormWeight > 1.) {
1311 printf(
"**WARNING** Event weight %lf > 1 in Monte Carlo rejection sampling!", m_LastNormWeight);
1316 m_LastLogWeight = 0.;
1317 m_LastNormWeight = 1.0;
1321 ret.
weight = m_LastWeight;
1323 ret.
weight = m_LastNormWeight;
1435 std::vector< std::vector<SimpleParticle> > primParticles(TPS->
Particles().size(), std::vector<SimpleParticle>(0));
1436 std::vector< std::vector<int> > AllParticlesMap(TPS->
Particles().size(), std::vector<int>(0));
1437 for(
int i = 0; i < evtin.
Particles.size(); ++i) {
1441 primParticles[tid].push_back(particle);
1442 AllParticlesMap[tid].push_back(i);
1446 bool flag_repeat =
true;
1447 while (flag_repeat) {
1448 flag_repeat =
false;
1449 for (
int i =
static_cast<int>(primParticles.size()) - 1; i >= 0; --i) {
1451 for (
size_t j = 0; j < primParticles[i].size(); ++j) {
1452 if (!primParticles[i][j].processed) {
1455 primParticles[i][j].processed =
true;
1456 int tid = AllParticlesMap[i][j];
1464 for (
size_t j = 0; j < primParticles[i].size(); ++j) {
1465 if (!primParticles[i][j].processed) {
1469 std::vector<double> Bratios;
1471 if (primParticles[i][j].MotherPDGID != 0 ||
1473 Bratios = TPS->
Particles()[i].BranchingRatiosM(primParticles[i][j].m,
false);
1474 Width = TPS->
Particles()[i].ResonanceWidth();
1477 Bratios = TPS->
Particles()[i].BranchingRatiosM(primParticles[i][j].m,
true);
1478 Width = TPS->
Particles()[i].TotalWidtheBW(primParticles[i][j].m);
1482 for (DecayIndex = 0; DecayIndex < static_cast<int>(Bratios.size()); ++DecayIndex) {
1483 tsum += Bratios[DecayIndex];
1484 if (tsum > DecParam)
break;
1486 if (DecayIndex <
static_cast<int>(TPS->
Particles()[i].Decays().size())) {
1487 std::vector<double> masses(0);
1488 std::vector<long long> pdgids(0);
1489 for (
size_t di = 0; di < TPS->
Particles()[i].Decays()[DecayIndex].mDaughters.size(); di++) {
1490 long long dpdg = TPS->
Particles()[i].Decays()[DecayIndex].mDaughters[di];
1491 if (TPS->
PdgToId(dpdg) == -1) {
1501 pdgids.push_back(dpdg);
1505 double prop_dx = 0., prop_dy = 0., prop_dz = 0., prop_dt = 0.;
1514 if (abs(primParticles[i][j].PDGID) != 311) {
1516 printf(
"**WARNING** Could not find the lifetime for decaying particle %lld. Setting to zero...\n", primParticles[i][j].PDGID);
1524 double vx = primParticles[i][j].px / primParticles[i][j].p0;
1525 double vy = primParticles[i][j].py / primParticles[i][j].p0;
1526 double vz = primParticles[i][j].pz / primParticles[i][j].p0;
1527 double gamma = 1. / sqrt(1. - vx*vx - vy*vy - vz*vz);
1538 for (
size_t ind = 0; ind < decres.size(); ind++) {
1539 decres[ind].processed =
false;
1543 decres[ind].r0 += prop_dt;
1544 decres[ind].rx += prop_dx;
1545 decres[ind].ry += prop_dy;
1546 decres[ind].rz += prop_dz;
1549 if (TPS->
PdgToId(decres[ind].PDGID) != -1) {
1550 int tid = TPS->
PdgToId(decres[ind].PDGID);
1552 primParticles[tid].push_back(dprt);
1554 AllParticlesMap[tid].push_back(
static_cast<int>(ret.
AllParticles.size()) - 1);
1555 ret.
DecayMap.push_back(AllParticlesMap[i][j]);
1560 ret.
DecayMap.push_back(AllParticlesMap[i][j]);
1564 primParticles[i][j].processed =
true;
1568 primParticles[i][j].processed =
true;
1581 std::vector<double> ret =
m_THM->Densities();
1582 for(
size_t i = 0; i < ret.size(); ++i) {
1583 ret[i] *=
m_THM->Volume();
1592 m_THM->SetVolume(V);
1594 m_THM->SetCanonicalVolume(V);
1606 m_MeanCHRMM *= Vmod;
1607 m_MeanACHRMM *= Vmod;
1609 m_MeanACHRM *= Vmod;
1611 for (
int i = 0; i < static_cast<int>(m_Baryons.size()); ++i) m_Baryons[i].first *= Vmod;
1612 for (
int i = 0; i < static_cast<int>(m_AntiBaryons.size()); ++i) m_AntiBaryons[i].first *= Vmod;
1613 for (
int i = 0; i < static_cast<int>(m_StrangeMesons.size()); ++i) m_StrangeMesons[i].first *= Vmod;
1614 for (
int i = 0; i < static_cast<int>(m_AntiStrangeMesons.size()); ++i) m_AntiStrangeMesons[i].first *= Vmod;
1615 for (
int i = 0; i < static_cast<int>(m_ChargeMesons.size()); ++i) m_ChargeMesons[i].first *= Vmod;
1616 for (
int i = 0; i < static_cast<int>(m_AntiChargeMesons.size()); ++i) m_AntiChargeMesons[i].first *= Vmod;
1617 for (
int i = 0; i < static_cast<int>(m_CharmMesons.size()); ++i) m_CharmMesons[i].first *= Vmod;
1618 for (
int i = 0; i < static_cast<int>(m_AntiCharmMesons.size()); ++i) m_AntiCharmMesons[i].first *= Vmod;
1619 for (
int i = 0; i < static_cast<int>(m_CharmAll.size()); ++i) m_CharmAll[i].first *= Vmod;
1620 for (
int i = 0; i < static_cast<int>(m_AntiCharmAll.size()); ++i) m_AntiCharmAll[i].first *= Vmod;
1627 std::vector<double>* densitiesid = NULL;
1628 std::vector<double> tmpdens;
1629 const std::vector<double>& densities =
m_THM->Densities();
1632 densitiesid = &tmpdens;
1639 double V =
m_THM->Volume();
1640 double VVN =
m_THM->Volume();
1642 for (
size_t i = 0; i <
m_THM->TPS()->Particles().size(); ++i)
1649 double logweight = 0.;
1651 double normweight = 1.;
1652 double weightev = 1.;
1653 double VVNev =
m_THM->Volume();
1654 for (
size_t i = 0; i <
m_THM->TPS()->Particles().size(); ++i)
1657 for (
size_t i = 0; i <
m_THM->TPS()->Particles().size(); ++i) {
1658 weight *= pow(VVN /
m_THM->Volume() * densitiesid->operator[](i) / densities[i], totals[i]);
1659 if (densitiesid->operator[](i) > 0. && densities[i] > 0.)
1660 logweight += totals[i] * log(VVN /
m_THM->Volume() * densitiesid->operator[](i) / densities[i]);
1662 weightev *= pow(VVNev / V * densitiesid->operator[](i) / densities[i], densities[i] * V);
1664 if (densitiesid->operator[](i) > 0. && densities[i] > 0.)
1666 normweight *= pow(VVN / VVNev, totals[i]) * pow(VVNev / V, totals[i] - densities[i] * V) * pow(densitiesid->operator[](i) / densities[i], totals[i] - (densities[i] * V));
1669 m_LastWeight = weight;
1670 m_LastLogWeight = logweight;
1671 m_LastNormWeight = normweight;
1679 double V =
m_THM->Volume();
1682 double logweight = 0.;
1683 double normweight = 1.;
1684 double weightev = 1.;
1686 int Nspecies =
m_THM->TPS()->Particles().size();
1687 for (
size_t i = 0; i < Nspecies; ++i) {
1688 double VVN =
m_THM->Volume();
1690 for (
size_t j = 0; j < Nspecies; ++j)
1693 if (VVN < 0.) { fl =
false;
break; }
1695 double VVNev =
m_THM->Volume();
1696 for (
size_t j = 0; j < Nspecies; ++j)
1699 weight *= pow(VVN /
m_THM->Volume() * densitiesid->operator[](i) / densities[i], totals[i]);
1700 if (densitiesid->operator[](i) > 0. && densities[i] > 0.)
1701 logweight += totals[i] * log(VVN /
m_THM->Volume() * densitiesid->operator[](i) / densities[i]);
1703 weightev *= pow(VVNev /
m_THM->Volume() * densitiesid->operator[](i) / densities[i], densities[i] * V);
1704 if (densitiesid->operator[](i) > 0. && densities[i] > 0.)
1705 normweight *= pow(VVN / VVNev, totals[i]) * pow(VVNev / V, totals[i] - densities[i] * V) * pow(densitiesid->operator[](i) / densities[i], totals[i] - (densities[i] * V));
1711 m_LastWeight = weight;
1712 m_LastLogWeight = logweight;
1713 m_LastNormWeight = normweight;
1720 double V =
m_THM->Volume();
1723 double logweight = 0.;
1724 double normweight = 1.;
1725 double weightvdw = 1.;
1727 for (
size_t i = 0; i <
m_THM->TPS()->Particles().size(); ++i) {
1728 double VVN =
m_THM->Volume();
1730 for (
size_t j = 0; j <
m_THM->TPS()->Particles().size(); ++j)
1733 if (VVN < 0.) { fl =
false;
break; }
1735 double VVNev =
m_THM->Volume();
1736 for (
size_t j = 0; j <
m_THM->TPS()->Particles().size(); ++j)
1739 weight *= pow(VVN /
m_THM->Volume() * densitiesid->operator[](i) / densities[i], totals[i]);
1740 if (densitiesid->operator[](i) > 0. && densities[i] > 0.)
1741 logweight += totals[i] * log(VVN /
m_THM->Volume() * densitiesid->operator[](i) / densities[i]);
1743 for (
size_t j = 0; j <
m_THM->TPS()->Particles().size(); ++j) {
1745 weight *= exp(aij * totals[j] /
m_THM->Parameters().T /
m_THM->Volume() * totals[i]);
1746 logweight += totals[i] * aij * totals[j] /
m_THM->Parameters().T /
m_THM->Volume();
1749 weightvdw *= pow(VVNev /
m_THM->Volume() * densitiesid->operator[](i) / densities[i], densities[i] * V);
1750 if (densitiesid->operator[](i) > 0. && densities[i] > 0.)
1751 normweight *= pow(VVN / VVNev, totals[i]) * pow(VVNev / V, totals[i] - densities[i] * V) * pow(densitiesid->operator[](i) / densities[i], totals[i] - (densities[i] * V));
1753 for (
size_t j = 0; j <
m_THM->TPS()->Particles().size(); ++j) {
1755 weightvdw *= exp(aij * densities[j] /
m_THM->Parameters().T * densities[i] * V);
1756 normweight *= exp(aij * totals[j] /
m_THM->Parameters().T /
m_THM->Volume() * totals[i] - aij * densities[j] /
m_THM->Parameters().T * densities[i] * V);
1763 m_LastWeight = weight;
1764 m_LastLogWeight = logweight;
1765 m_LastNormWeight = normweight;
1777 std::vector<double>* densitiesid = NULL;
1778 std::vector<double> tmpdens;
1779 const std::vector<double>& densities =
m_THM->Densities();
1782 densitiesid = &tmpdens;
1789 double V =
m_THM->Volume();
1790 double VVN =
m_THM->Volume();
1792 for (
size_t i = 0; i <
m_THM->TPS()->Particles().size(); ++i)
1799 double logweight = 0.;
1801 double normweight = 1.;
1802 double weightev = 1.;
1803 double VVNev =
m_THM->Volume();
1804 for (
size_t i = 0; i <
m_THM->TPS()->Particles().size(); ++i)
1807 for (
size_t i = 0; i <
m_THM->TPS()->Particles().size(); ++i) {
1808 weight *= pow(VVN /
m_THM->Volume() * densitiesid->operator[](i) / densities[i], totals[i]);
1809 if (densitiesid->operator[](i) > 0. && densities[i] > 0.)
1810 logweight += totals[i] * log(VVN /
m_THM->Volume() * densitiesid->operator[](i) / densities[i]);
1812 weightev *= pow(VVNev / V * densitiesid->operator[](i) / densities[i], densities[i] * V);
1814 if (densitiesid->operator[](i) > 0. && densities[i] > 0.)
1816 normweight *= pow(VVN / VVNev, totals[i]) * pow(VVNev / V, totals[i] - densities[i] * V) * pow(densitiesid->operator[](i) / densities[i], totals[i] - (densities[i] * V));
1819 m_LastWeight = weight;
1820 m_LastLogWeight = logweight;
1821 m_LastNormWeight = normweight;
1829 double V =
m_THM->Volume();
1832 double logweight = 0.;
1833 double normweight = 1.;
1834 double weightev = 1.;
1836 int Nspecies =
m_THM->TPS()->Particles().size();
1839 std::vector<int> Nscomp(NEVcomp, 0);
1840 std::vector<double> Nevscomp(NEVcomp, 0.);
1841 std::vector<double> bns(NEVcomp, 0.), bnevs(NEVcomp, 0.), dmuTs(NEVcomp, 0.);
1842 const std::vector< std::vector<double> >& virial = model->
VirialMatrix();
1844 for (
size_t icomp = 0; icomp < NEVcomp; ++icomp) {
1846 int Nlocal = indis.size();
1847 for (
size_t ilocal = 0; ilocal < Nlocal; ++ilocal) {
1848 int ip = indis[ilocal];
1849 Nscomp[icomp] += totals[ip];
1850 Nevscomp[icomp] += densities[ip] * V;
1856 for (
size_t j = 0; j < Nspecies; ++j) {
1859 bns[icomp] += virial[j][i1] * totals[j];
1860 bnevs[icomp] += virial[j][i1] * densities[j];
1864 if (bns[icomp] > 1.)
1868 dmuTs[icomp] = log(densities[i1] / densitiesid->operator[](i1) / (1. - bnevs[icomp]));
1871 normweight *= pow((1. - bns[icomp]) / (1. - bnevs[icomp]), Nscomp[icomp]) * exp(-dmuTs[icomp] * (Nscomp[icomp] - Nevscomp[icomp]));
1878 m_LastWeight = normweight;
1879 m_LastLogWeight = log(normweight);
1880 m_LastNormWeight = normweight;
1887 double V =
m_THM->Volume();
1890 double logweight = 0.;
1891 double normweight = 1.;
1892 double weightvdw = 1.;
1895 int Nspecies =
m_THM->TPS()->Particles().size();
1898 std::vector<int> Nscomp(NVDWcomp, 0);
1899 std::vector<double> Nvdwscomp(NVDWcomp, 0.);
1900 std::vector<double> bns(NVDWcomp, 0.), bnvdws(NVDWcomp, 0.), dmuTs(NVDWcomp, 0.), aijs(NVDWcomp, 0.), aijvdws(NVDWcomp, 0.);
1901 const std::vector< std::vector<double> >& virial = model->
VirialMatrix();
1902 const std::vector< std::vector<double> >& attr = model->
AttractionMatrix();
1904 for (
size_t icomp = 0; icomp < NVDWcomp; ++icomp) {
1906 int Nlocal = indis.size();
1907 for (
size_t ilocal = 0; ilocal < Nlocal; ++ilocal) {
1908 int ip = indis[ilocal];
1909 Nscomp[icomp] += totals[ip];
1910 Nvdwscomp[icomp] += densities[ip] * V;
1916 for (
size_t j = 0; j < Nspecies; ++j) {
1919 bns[icomp] += virial[j][i1] * totals[j];
1920 bnvdws[icomp] += virial[j][i1] * densities[j];
1922 aijs[icomp] += attr[i1][j] * totals[j];
1923 aijvdws[icomp] += attr[i1][j] * densities[j];
1930 if (bns[icomp] > 1.)
1934 dmuTs[icomp] = log(densities[i1] / densitiesid->operator[](i1) / (1. - bnvdws[icomp]));
1937 normweight *= pow((1. - bns[icomp]) / (1. - bnvdws[icomp]), Nscomp[icomp])
1938 * exp(-dmuTs[icomp] * (Nscomp[icomp] - Nvdwscomp[icomp]))
1939 * exp(aijs[icomp] * Nscomp[icomp] - aijvdws[icomp] * Nvdwscomp[icomp]);
1945 m_LastWeight = normweight;
1946 m_LastLogWeight = log(normweight);
1947 m_LastNormWeight = normweight;
1954 double V =
m_THM->Volume();
1957 double logweight = 0.;
1958 double normweight = 1.;
1959 double weightvdw = 1.;
1962 int Nspecies =
m_THM->TPS()->Particles().size();
1968 std::vector<int> Nscomp(Nevcomp, 0);
1969 std::vector<double> Nvdwscomp(Nevcomp, 0.);
1972 std::vector<double> ev_favs(Nevcomp, 0.);
1973 for (
size_t icomp = 0; icomp < Nevcomp; ++icomp) {
1974 ev_favs[icomp] = evmod->
f(evindsfrom[icomp]);
1976 std::vector<double> densities_sampled(Nspecies);
1977 for (
size_t j = 0; j < Nspecies; ++j) {
1978 densities_sampled[j] = totals[j] / V;
1981 std::vector<double> ev_fsampled(Nevcomp, 0.);
1982 for (
size_t icomp = 0; icomp < Nevcomp; ++icomp) {
1983 ev_fsampled[icomp] = evmod->
f(evindsfrom[icomp]);
1988 double mf_vav = mfmod->
v();
1990 double mf_vsampled = mfmod->
v();
1993 for (
size_t j = 0; j < Nspecies; ++j) {
1994 int jcomp = evinds[j];
1995 normweight *= pow(ev_fsampled[jcomp] / ev_favs[jcomp], totals[j]);
1998 if (densitiesid->operator[](j))
1999 dmuT = log(densities[j] / densitiesid->operator[](j) / ev_favs[jcomp]);
2000 normweight *= exp(-dmuT * (totals[j] - densities[j] * V));
2003 normweight *= exp(-V * (mf_vsampled - mf_vav) /
m_THM->Parameters().T);
2008 m_LastWeight = normweight;
2009 m_LastLogWeight = log(normweight);
2010 m_LastNormWeight = normweight;
Contains some functions to deal with excluded volumes.
std::vector< std::vector< double > > ComputeEVRadii() const
virtual std::vector< double > GCEMeanYields() const
The grand-canonical mean yields.
virtual SimpleParticle SampleParticleByPdg(long long pdgid) const
Samples the position and momentum of a particle species with given pdg code.
std::vector< RandomGenerators::ThermalBreitWignerGenerator * > m_BWGens
std::vector< int > GenerateTotalsSCESubVolume(double VolumeSC) const
EventGeneratorBase()
Constructor.
static SimpleEvent PerformDecays(const SimpleEvent &evtin, const ThermalParticleSystem *TPS, const DecayerFlags &decayerFlags=DecayerFlags())
Performs decays of all unstable particles until only stable ones left.
virtual std::pair< std::vector< int >, double > SampleYields() const
Samples the primordial yields for each particle species.
virtual SimpleEvent GetEvent(bool PerformDecays=true) const
Generates a single event.
std::vector< RandomGenerators::ParticleMomentumGenerator * > m_MomentumGens
Vector of momentum generators for each particle species.
bool CheckEVOverlap(const std::vector< SimpleParticle > &evt, const SimpleParticle &cand, const std::vector< int > &ids=std::vector< int >(), const std::vector< std::vector< double > > &radii=std::vector< std::vector< double > >()) const
void SetEVUseSPR(bool EVfastmode)
virtual SimpleParticle SampleParticle(int id) const
Samples the position and momentum of a particle species i.
void ClearMomentumGenerators()
Clears the momentum generators for all particles.
void PrepareMultinomials()
EventGeneratorConfiguration m_Config
virtual void SetMomentumGenerators()
Sets the momentum generators for all particles. Overloaded.
std::vector< int > GenerateTotalsCCESubVolume(double VolumeSC) const
virtual void CheckSetParameters()
Sets the hypersurface parameters.
double ComputeWeight(const std::vector< int > &totals) const
std::vector< double > m_DensitiesIdeal
Ideal gas densities used for sampling an interacting HRG.
virtual ~EventGeneratorBase()
Destructor.
virtual SimpleEvent SampleMomenta(const std::vector< int > &yields) const
Samples the momenta of the particles and returns the sampled list of particles as an event.
std::vector< int > GenerateTotalsGCE() const
std::vector< int > GenerateTotalsSCE() const
std::vector< int > GenerateTotalsCE() const
void SetConfiguration(ThermalParticleSystem *TPS, const EventGeneratorConfiguration &config)
Sets the event generator configuration.
double ComputeWeightNew(const std::vector< int > &totals) const
std::vector< int > GenerateTotals() const
std::vector< int > GenerateTotalsCCE() const
virtual SimpleEvent SampleMomentaWithShuffle(const std::vector< int > &yields) const
Samples the momenta of the particles and returns the sampled list of particles as an event.
void SetVolume(double V)
Set system volume.
void RescaleCEMeans(double Vmod)
Rescale the precalculated GCE means.
virtual void SetParameters()
Sets up the event generator ready for production.
Base class implementing the ideal gas.
Class implementing auxiliary functions for the Carnahan-Starling excluded volume model.
Implementation of a crossterms generalized excluded volume model.
Base class for multi-component excluded volume models.
virtual double f(int i) const
Calculates the suppression factor for species i.
virtual const int ComponentsNumber() const
Gets the number of components.
virtual const std::vector< int > & ComponentIndices() const
Gets the component indices.
virtual const std::vector< int > & ComponentIndicesFrom() const
Gets the component indices from.
virtual void SetDensities(const std::vector< double > &n)
Sets the densities of particle species.
Class implementing auxiliary functions for the VDW excluded volume model truncated at n^3....
Class implementing auxiliary functions for the van der Waals excluded volume model.
Class implementing auxiliary functions for the VDW excluded volume model truncated at n^2.
Base class for multi-component mean field models.
virtual void SetDensities(const std::vector< double > &n)
Sets the densities of particle species.
virtual double v() const
Calculates the mean field value.
Implementation of the van der Waals mean field model for multiple components.
@ QvdW
Quantum van der Waals model.
@ DiagonalEV
Diagonal excluded volume model.
@ CrosstermsEV
Crossterms excluded volume model.
const ThermalModelParameters & Parameters() const
Class implementing the crossterms excluded-volume model.
const std::vector< std::vector< int > > & EVComponentIndices() const
Class implementing the diagonal excluded-volume model.
double ExcludedVolume(int i) const
The excluded volume parameter of particle species i.
Class implementing the Ideal HRG model.
Class implementing the quantum real gas HRG model.
ExcludedVolumeModelMultiBase * ExcludedVolumeModel() const
Get the excluded volume model used in the real gas HRG model.
MeanFieldModelMultiBase * MeanFieldModel() const
Get the mean field model used in the real gas HRG model.
Class implementing the quantum van der Waals HRG model.
double AttractionCoefficient(int i, int j) const
QvdW mean field attraction coefficient .
const std::vector< std::vector< int > > & VDWComponentIndices() const
const std::vector< std::vector< double > > & VirialMatrix() const
const std::vector< std::vector< double > > & AttractionMatrix() const
double VirialCoefficient(int i, int j) const
Excluded volume coefficient .
Class containing all information about a particle specie.
long long PdgId() const
Particle's Particle Data Group (PDG) ID number.
int Statistics() const
Particle's statistics.
double Mass() const
Particle's mass [GeV].
ResonanceWidthIntegration GetResonanceWidthIntegrationType() const
Resonance width integration scheme used to treat finite resonance widths.
@ eBW
Energy-dependent Breit-Wigner scheme (eBW)
@ ZeroWidth
Zero-width approximation.
bool ZeroWidthEnforced() const
Whether zero-width approximation is enforced for this particle species.
Class containing the particle list.
ThermalParticle::ResonanceWidthIntegration ResonanceWidthIntegrationType() const
int PdgToId(long long pdgid) const
Transforms PDG ID to a 0-based particle id number.
const std::vector< ThermalParticle > & Particles() const
Returns the vector of all particle species.
const ThermalParticle & ParticleByPDG(long long pdgid) const
ThermalParticle object corresponding to particle species with a provided PDG ID.
double rv(double v)
Computes the radius parameter from a given excluded volume parameter value.
double GetLifetime(long long pdg)
const ThermalParticle & ParticleByPdg(long long pdg)
int PdgToId(long long pdg)
double ParticleDistanceSquared(const SimpleParticle &part1, const SimpleParticle &part2)
Return the square of the distance between particles at equal time.
std::vector< SimpleParticle > ManyBodyDecay(const SimpleParticle &Mother, std::vector< double > masses, std::vector< long long > pdgs)
Samples the decay products of a many-body decay.
int RandomPoisson(double mean)
Generates random integer distributed by Poisson with specified mean Uses randgenMT.
MTRand randgenMT
The Mersenne Twister random number generator.
std::mt19937 rng_std
The Mersenne Twister random number generator from STD library.
constexpr double GeVtoifm()
A constant to transform GeV into fm .
The main namespace where all classes and functions of the Thermal-FIST library reside.
ThermalModelVDW ThermalModelVDWFull
For backward compatibility.
std::vector< double > LorentzBoost(const std::vector< double > &fourvector, double vx, double vy, double vz)
Performs a Lorentz boost on a four-vector.
Flags for performing decays.
Structure containing the thermal event generator configuration.
Ensemble fEnsemble
The statistical ensemble used.
int B
The total values of conserved charges in the CE.
bool fUseEVRejectionMultiplicity
Whether to use rejection sampling instead of importance sampling for the EV multiplicity sampling.
int RealGasExcludedVolumePrescription
The type of generalized excluded volume model prescription.
EventGeneratorConfiguration()
Default configuration.
bool fUseEVUseSPRApproximation
Whether to use the SPR (single-particle rejection) approximation for the EV effects in coordinate spa...
ThermalModelParameters CFOParameters
The chemical freeze-out parameters.
bool CanonicalB
Mixed-canonical configuration (full canonical by default)
@ SCE
Strangeness-canonical.
ModelType fModelType
The type of interaction model.
bool fUsePCE
Whether partial chemical equilibrium (PCE) is used.
bool fUseEVRejectionCoordinates
Whether to use rejection sampling in the coordinate space to model EV effects.
@ DiagonalEV
Diagonal excluded-volume.
@ CrosstermsEV
Crossterms excluded-volume.
@ PointParticle
Ideal gas.
@ QvdW
Quantum van der Waals.
bool fUseGCEConservedCharges
Whether to calculate total conserved charge values from GCE.
static int RandomBesselDevroye1(double a, int nu, MTRand &rangen)
Structure holding information about a single event in the event generator.
double weight
Event weight factor.
std::vector< SimpleParticle > Particles
Vector of all final particles in the event.
double logweight
Log of the event weight factor.
std::vector< SimpleParticle > AllParticles
Vector of all particles which ever appeared in the event (including those that decay and photons/lept...
std::vector< int > DecayMap
std::vector< SimpleParticle > PhotonsLeptons
Vector of all decay photons/leptons.
std::vector< int > DecayMapFinal
Vector for each Particles element pointing to the index of the primordial resonance from which this p...
Structure holding information about a single particle in the event generator.
Structure containing all thermal parameters of the model.
Contains some extra mathematical functions used in the code.