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;
1259 while (sampled < ids.size()) {
1261 int i = ids[sampled];
1265 if (
m_Config.fUseEVRejectionCoordinates &&
1269 for (
int i = 0; i < sampled; ++i) {
1270 double r = m_Radii[ids[i]][ids[sampled]];
1307 if (!
m_THM->IsCalculated())
1308 m_THM->CalculatePrimordialDensities();
1313 &&
m_Config.fUseEVRejectionMultiplicity) {
1315 if (m_LastNormWeight > 1.) {
1316 printf(
"**WARNING** Event weight %lf > 1 in Monte Carlo rejection sampling!", m_LastNormWeight);
1321 m_LastLogWeight = 0.;
1322 m_LastNormWeight = 1.0;
1326 ret.
weight = m_LastWeight;
1328 ret.
weight = m_LastNormWeight;
1440 std::vector< std::vector<SimpleParticle> > primParticles(TPS->
Particles().size(), std::vector<SimpleParticle>(0));
1441 std::vector< std::vector<int> > AllParticlesMap(TPS->
Particles().size(), std::vector<int>(0));
1442 for(
int i = 0; i < evtin.
Particles.size(); ++i) {
1446 primParticles[tid].push_back(particle);
1447 AllParticlesMap[tid].push_back(i);
1451 bool flag_repeat =
true;
1452 while (flag_repeat) {
1453 flag_repeat =
false;
1454 for (
int i =
static_cast<int>(primParticles.size()) - 1; i >= 0; --i) {
1456 for (
size_t j = 0; j < primParticles[i].size(); ++j) {
1457 if (!primParticles[i][j].processed) {
1460 primParticles[i][j].processed =
true;
1461 int tid = AllParticlesMap[i][j];
1469 for (
size_t j = 0; j < primParticles[i].size(); ++j) {
1470 if (!primParticles[i][j].processed) {
1474 std::vector<double> Bratios;
1476 if (primParticles[i][j].MotherPDGID != 0 ||
1478 Bratios = TPS->
Particles()[i].BranchingRatiosM(primParticles[i][j].m,
false);
1479 Width = TPS->
Particles()[i].ResonanceWidth();
1482 Bratios = TPS->
Particles()[i].BranchingRatiosM(primParticles[i][j].m,
true);
1483 Width = TPS->
Particles()[i].TotalWidtheBW(primParticles[i][j].m);
1487 for (DecayIndex = 0; DecayIndex < static_cast<int>(Bratios.size()); ++DecayIndex) {
1488 tsum += Bratios[DecayIndex];
1489 if (tsum > DecParam)
break;
1491 if (DecayIndex <
static_cast<int>(TPS->
Particles()[i].Decays().size())) {
1492 std::vector<double> masses(0);
1493 std::vector<long long> pdgids(0);
1494 for (
size_t di = 0; di < TPS->
Particles()[i].Decays()[DecayIndex].mDaughters.size(); di++) {
1495 long long dpdg = TPS->
Particles()[i].Decays()[DecayIndex].mDaughters[di];
1496 if (TPS->
PdgToId(dpdg) == -1) {
1506 pdgids.push_back(dpdg);
1510 double prop_dx = 0., prop_dy = 0., prop_dz = 0., prop_dt = 0.;
1519 if (abs(primParticles[i][j].PDGID) != 311) {
1521 printf(
"**WARNING** Could not find the lifetime for decaying particle %lld. Setting to zero...\n", primParticles[i][j].PDGID);
1529 double vx = primParticles[i][j].px / primParticles[i][j].p0;
1530 double vy = primParticles[i][j].py / primParticles[i][j].p0;
1531 double vz = primParticles[i][j].pz / primParticles[i][j].p0;
1532 double gamma = 1. / sqrt(1. - vx*vx - vy*vy - vz*vz);
1543 for (
size_t ind = 0; ind < decres.size(); ind++) {
1544 decres[ind].processed =
false;
1548 decres[ind].r0 += prop_dt;
1549 decres[ind].rx += prop_dx;
1550 decres[ind].ry += prop_dy;
1551 decres[ind].rz += prop_dz;
1554 if (TPS->
PdgToId(decres[ind].PDGID) != -1) {
1555 int tid = TPS->
PdgToId(decres[ind].PDGID);
1557 primParticles[tid].push_back(dprt);
1559 AllParticlesMap[tid].push_back(
static_cast<int>(ret.
AllParticles.size()) - 1);
1560 ret.
DecayMap.push_back(AllParticlesMap[i][j]);
1565 ret.
DecayMap.push_back(AllParticlesMap[i][j]);
1569 primParticles[i][j].processed =
true;
1573 primParticles[i][j].processed =
true;
1586 std::vector<double> ret =
m_THM->Densities();
1587 for(
size_t i = 0; i < ret.size(); ++i) {
1588 ret[i] *=
m_THM->Volume();
1597 m_THM->SetVolume(V);
1599 m_THM->SetCanonicalVolume(V);
1611 m_MeanCHRMM *= Vmod;
1612 m_MeanACHRMM *= Vmod;
1614 m_MeanACHRM *= Vmod;
1616 for (
int i = 0; i < static_cast<int>(m_Baryons.size()); ++i) m_Baryons[i].first *= Vmod;
1617 for (
int i = 0; i < static_cast<int>(m_AntiBaryons.size()); ++i) m_AntiBaryons[i].first *= Vmod;
1618 for (
int i = 0; i < static_cast<int>(m_StrangeMesons.size()); ++i) m_StrangeMesons[i].first *= Vmod;
1619 for (
int i = 0; i < static_cast<int>(m_AntiStrangeMesons.size()); ++i) m_AntiStrangeMesons[i].first *= Vmod;
1620 for (
int i = 0; i < static_cast<int>(m_ChargeMesons.size()); ++i) m_ChargeMesons[i].first *= Vmod;
1621 for (
int i = 0; i < static_cast<int>(m_AntiChargeMesons.size()); ++i) m_AntiChargeMesons[i].first *= Vmod;
1622 for (
int i = 0; i < static_cast<int>(m_CharmMesons.size()); ++i) m_CharmMesons[i].first *= Vmod;
1623 for (
int i = 0; i < static_cast<int>(m_AntiCharmMesons.size()); ++i) m_AntiCharmMesons[i].first *= Vmod;
1624 for (
int i = 0; i < static_cast<int>(m_CharmAll.size()); ++i) m_CharmAll[i].first *= Vmod;
1625 for (
int i = 0; i < static_cast<int>(m_AntiCharmAll.size()); ++i) m_AntiCharmAll[i].first *= Vmod;
1632 std::vector<double>* densitiesid = NULL;
1633 std::vector<double> tmpdens;
1634 const std::vector<double>& densities =
m_THM->Densities();
1637 densitiesid = &tmpdens;
1644 double V =
m_THM->Volume();
1645 double VVN =
m_THM->Volume();
1647 for (
size_t i = 0; i <
m_THM->TPS()->Particles().size(); ++i)
1654 double logweight = 0.;
1656 double normweight = 1.;
1657 double weightev = 1.;
1658 double VVNev =
m_THM->Volume();
1659 for (
size_t i = 0; i <
m_THM->TPS()->Particles().size(); ++i)
1662 for (
size_t i = 0; i <
m_THM->TPS()->Particles().size(); ++i) {
1663 weight *= pow(VVN /
m_THM->Volume() * densitiesid->operator[](i) / densities[i], totals[i]);
1664 if (densitiesid->operator[](i) > 0. && densities[i] > 0.)
1665 logweight += totals[i] * log(VVN /
m_THM->Volume() * densitiesid->operator[](i) / densities[i]);
1667 weightev *= pow(VVNev / V * densitiesid->operator[](i) / densities[i], densities[i] * V);
1669 if (densitiesid->operator[](i) > 0. && densities[i] > 0.)
1671 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));
1674 m_LastWeight = weight;
1675 m_LastLogWeight = logweight;
1676 m_LastNormWeight = normweight;
1684 double V =
m_THM->Volume();
1687 double logweight = 0.;
1688 double normweight = 1.;
1689 double weightev = 1.;
1691 int Nspecies =
m_THM->TPS()->Particles().size();
1692 for (
size_t i = 0; i < Nspecies; ++i) {
1693 double VVN =
m_THM->Volume();
1695 for (
size_t j = 0; j < Nspecies; ++j)
1698 if (VVN < 0.) { fl =
false;
break; }
1700 double VVNev =
m_THM->Volume();
1701 for (
size_t j = 0; j < Nspecies; ++j)
1704 weight *= pow(VVN /
m_THM->Volume() * densitiesid->operator[](i) / densities[i], totals[i]);
1705 if (densitiesid->operator[](i) > 0. && densities[i] > 0.)
1706 logweight += totals[i] * log(VVN /
m_THM->Volume() * densitiesid->operator[](i) / densities[i]);
1708 weightev *= pow(VVNev /
m_THM->Volume() * densitiesid->operator[](i) / densities[i], densities[i] * V);
1709 if (densitiesid->operator[](i) > 0. && densities[i] > 0.)
1710 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));
1716 m_LastWeight = weight;
1717 m_LastLogWeight = logweight;
1718 m_LastNormWeight = normweight;
1725 double V =
m_THM->Volume();
1728 double logweight = 0.;
1729 double normweight = 1.;
1730 double weightvdw = 1.;
1732 for (
size_t i = 0; i <
m_THM->TPS()->Particles().size(); ++i) {
1733 double VVN =
m_THM->Volume();
1735 for (
size_t j = 0; j <
m_THM->TPS()->Particles().size(); ++j)
1738 if (VVN < 0.) { fl =
false;
break; }
1740 double VVNev =
m_THM->Volume();
1741 for (
size_t j = 0; j <
m_THM->TPS()->Particles().size(); ++j)
1744 weight *= pow(VVN /
m_THM->Volume() * densitiesid->operator[](i) / densities[i], totals[i]);
1745 if (densitiesid->operator[](i) > 0. && densities[i] > 0.)
1746 logweight += totals[i] * log(VVN /
m_THM->Volume() * densitiesid->operator[](i) / densities[i]);
1748 for (
size_t j = 0; j <
m_THM->TPS()->Particles().size(); ++j) {
1750 weight *= exp(aij * totals[j] /
m_THM->Parameters().T /
m_THM->Volume() * totals[i]);
1751 logweight += totals[i] * aij * totals[j] /
m_THM->Parameters().T /
m_THM->Volume();
1754 weightvdw *= pow(VVNev /
m_THM->Volume() * densitiesid->operator[](i) / densities[i], densities[i] * V);
1755 if (densitiesid->operator[](i) > 0. && densities[i] > 0.)
1756 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));
1758 for (
size_t j = 0; j <
m_THM->TPS()->Particles().size(); ++j) {
1760 weightvdw *= exp(aij * densities[j] /
m_THM->Parameters().T * densities[i] * V);
1761 normweight *= exp(aij * totals[j] /
m_THM->Parameters().T /
m_THM->Volume() * totals[i] - aij * densities[j] /
m_THM->Parameters().T * densities[i] * V);
1768 m_LastWeight = weight;
1769 m_LastLogWeight = logweight;
1770 m_LastNormWeight = normweight;
1782 std::vector<double>* densitiesid = NULL;
1783 std::vector<double> tmpdens;
1784 const std::vector<double>& densities =
m_THM->Densities();
1787 densitiesid = &tmpdens;
1794 double V =
m_THM->Volume();
1795 double VVN =
m_THM->Volume();
1797 for (
size_t i = 0; i <
m_THM->TPS()->Particles().size(); ++i)
1804 double logweight = 0.;
1806 double normweight = 1.;
1807 double weightev = 1.;
1808 double VVNev =
m_THM->Volume();
1809 for (
size_t i = 0; i <
m_THM->TPS()->Particles().size(); ++i)
1812 for (
size_t i = 0; i <
m_THM->TPS()->Particles().size(); ++i) {
1813 weight *= pow(VVN /
m_THM->Volume() * densitiesid->operator[](i) / densities[i], totals[i]);
1814 if (densitiesid->operator[](i) > 0. && densities[i] > 0.)
1815 logweight += totals[i] * log(VVN /
m_THM->Volume() * densitiesid->operator[](i) / densities[i]);
1817 weightev *= pow(VVNev / V * densitiesid->operator[](i) / densities[i], densities[i] * V);
1819 if (densitiesid->operator[](i) > 0. && densities[i] > 0.)
1821 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));
1824 m_LastWeight = weight;
1825 m_LastLogWeight = logweight;
1826 m_LastNormWeight = normweight;
1834 double V =
m_THM->Volume();
1837 double logweight = 0.;
1838 double normweight = 1.;
1839 double weightev = 1.;
1841 int Nspecies =
m_THM->TPS()->Particles().size();
1844 std::vector<int> Nscomp(NEVcomp, 0);
1845 std::vector<double> Nevscomp(NEVcomp, 0.);
1846 std::vector<double> bns(NEVcomp, 0.), bnevs(NEVcomp, 0.), dmuTs(NEVcomp, 0.);
1847 const std::vector< std::vector<double> >& virial = model->
VirialMatrix();
1849 for (
size_t icomp = 0; icomp < NEVcomp; ++icomp) {
1851 int Nlocal = indis.size();
1852 for (
size_t ilocal = 0; ilocal < Nlocal; ++ilocal) {
1853 int ip = indis[ilocal];
1854 Nscomp[icomp] += totals[ip];
1855 Nevscomp[icomp] += densities[ip] * V;
1861 for (
size_t j = 0; j < Nspecies; ++j) {
1864 bns[icomp] += virial[j][i1] * totals[j];
1865 bnevs[icomp] += virial[j][i1] * densities[j];
1869 if (bns[icomp] > 1.)
1873 dmuTs[icomp] = log(densities[i1] / densitiesid->operator[](i1) / (1. - bnevs[icomp]));
1876 normweight *= pow((1. - bns[icomp]) / (1. - bnevs[icomp]), Nscomp[icomp]) * exp(-dmuTs[icomp] * (Nscomp[icomp] - Nevscomp[icomp]));
1883 m_LastWeight = normweight;
1884 m_LastLogWeight = log(normweight);
1885 m_LastNormWeight = normweight;
1892 double V =
m_THM->Volume();
1895 double logweight = 0.;
1896 double normweight = 1.;
1897 double weightvdw = 1.;
1900 int Nspecies =
m_THM->TPS()->Particles().size();
1903 std::vector<int> Nscomp(NVDWcomp, 0);
1904 std::vector<double> Nvdwscomp(NVDWcomp, 0.);
1905 std::vector<double> bns(NVDWcomp, 0.), bnvdws(NVDWcomp, 0.), dmuTs(NVDWcomp, 0.), aijs(NVDWcomp, 0.), aijvdws(NVDWcomp, 0.);
1906 const std::vector< std::vector<double> >& virial = model->
VirialMatrix();
1907 const std::vector< std::vector<double> >& attr = model->
AttractionMatrix();
1909 for (
size_t icomp = 0; icomp < NVDWcomp; ++icomp) {
1911 int Nlocal = indis.size();
1912 for (
size_t ilocal = 0; ilocal < Nlocal; ++ilocal) {
1913 int ip = indis[ilocal];
1914 Nscomp[icomp] += totals[ip];
1915 Nvdwscomp[icomp] += densities[ip] * V;
1921 for (
size_t j = 0; j < Nspecies; ++j) {
1924 bns[icomp] += virial[j][i1] * totals[j];
1925 bnvdws[icomp] += virial[j][i1] * densities[j];
1927 aijs[icomp] += attr[i1][j] * totals[j];
1928 aijvdws[icomp] += attr[i1][j] * densities[j];
1935 if (bns[icomp] > 1.)
1939 dmuTs[icomp] = log(densities[i1] / densitiesid->operator[](i1) / (1. - bnvdws[icomp]));
1942 normweight *= pow((1. - bns[icomp]) / (1. - bnvdws[icomp]), Nscomp[icomp])
1943 * exp(-dmuTs[icomp] * (Nscomp[icomp] - Nvdwscomp[icomp]))
1944 * exp(aijs[icomp] * Nscomp[icomp] - aijvdws[icomp] * Nvdwscomp[icomp]);
1950 m_LastWeight = normweight;
1951 m_LastLogWeight = log(normweight);
1952 m_LastNormWeight = normweight;
1959 double V =
m_THM->Volume();
1962 double logweight = 0.;
1963 double normweight = 1.;
1964 double weightvdw = 1.;
1967 int Nspecies =
m_THM->TPS()->Particles().size();
1973 std::vector<int> Nscomp(Nevcomp, 0);
1974 std::vector<double> Nvdwscomp(Nevcomp, 0.);
1977 std::vector<double> ev_favs(Nevcomp, 0.);
1978 for (
size_t icomp = 0; icomp < Nevcomp; ++icomp) {
1979 ev_favs[icomp] = evmod->
f(evindsfrom[icomp]);
1981 std::vector<double> densities_sampled(Nspecies);
1982 for (
size_t j = 0; j < Nspecies; ++j) {
1983 densities_sampled[j] = totals[j] / V;
1986 std::vector<double> ev_fsampled(Nevcomp, 0.);
1987 for (
size_t icomp = 0; icomp < Nevcomp; ++icomp) {
1988 ev_fsampled[icomp] = evmod->
f(evindsfrom[icomp]);
1993 double mf_vav = mfmod->
v();
1995 double mf_vsampled = mfmod->
v();
1998 for (
size_t j = 0; j < Nspecies; ++j) {
1999 int jcomp = evinds[j];
2000 normweight *= pow(ev_fsampled[jcomp] / ev_favs[jcomp], totals[j]);
2003 if (densitiesid->operator[](j))
2004 dmuT = log(densities[j] / densitiesid->operator[](j) / ev_favs[jcomp]);
2005 normweight *= exp(-dmuT * (totals[j] - densities[j] * V));
2008 normweight *= exp(-V * (mf_vsampled - mf_vav) /
m_THM->Parameters().T);
2013 m_LastWeight = normweight;
2014 m_LastLogWeight = log(normweight);
2015 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.