Skip to content

Commit acb7c46

Browse files
committed
Fix the mess
1 parent cca6b97 commit acb7c46

File tree

39 files changed

+517
-106
lines changed

39 files changed

+517
-106
lines changed

MC/config/PWGHF/external/generator/generator_pythia8_embed_hf.C

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
using namespace Pythia8;
1212

13+
#include <cmath>
1314
namespace hf_generators
1415
{
1516
enum GenType : int {
@@ -35,7 +36,13 @@ public:
3536
//}
3637

3738
/// Destructor
38-
~GeneratorPythia8EmbedHF() = default;
39+
~GeneratorPythia8EmbedHF() {
40+
// Clean up the internally created HF generator if any
41+
if (mGeneratorEvHF) {
42+
delete mGeneratorEvHF;
43+
mGeneratorEvHF = nullptr;
44+
}
45+
}
3946

4047
/// Init
4148
bool Init() override
@@ -51,29 +58,30 @@ public:
5158
/// \param yHadronMin minimum hadron rapidity
5259
/// \param yHadronMax maximum hadron rapidity
5360
/// \param hadronPdgList list of PDG codes for hadrons to be used in trigger
54-
void setupGeneratorEvHF(int genType, bool usePtHardBins, float yQuarkMin, float yQuarkMax, float yHadronMin, float yHadronMax, std::vector<int> hadronPdgList = {}) {
61+
/// \param quarkPdgList list of PDG codes for quarks to be enriched in the trigger
62+
void setupGeneratorEvHF(int genType, bool usePtHardBins, float yQuarkMin, float yQuarkMax, float yHadronMin, float yHadronMax, std::vector<int> quarkPdgList = {}, std::vector<int> hadronPdgList = {}, std::vector<std::array<int,2>> partPdgToReplaceList = {}, std::vector<float> freqReplaceList = {}) {
5563
mGeneratorEvHF = nullptr;
5664
switch (genType)
5765
{
5866
case hf_generators::GapTriggeredCharm:
5967
LOG(info) << "********** [GeneratorPythia8EmbedHF] configuring GeneratorPythia8GapTriggeredCharm **********";
6068
LOG(info) << "********** Default number of HF signal events to be merged (updated by notifyEmbedding): " << mNumSigEvs;
61-
mGeneratorEvHF = dynamic_cast<GeneratorPythia8GapTriggeredHF*>(GeneratorPythia8GapTriggeredCharm(/*no gap trigger*/1, yQuarkMin, yQuarkMax, yHadronMin, yHadronMax, hadronPdgList));
69+
mGeneratorEvHF = dynamic_cast<GeneratorPythia8GapTriggeredHF*>(GeneratorPythia8GapTriggeredCharm(/*no gap trigger*/1, yQuarkMin, yQuarkMax, yHadronMin, yHadronMax, hadronPdgList, partPdgToReplaceList, freqReplaceList));
6270
break;
6371
case hf_generators::GapTriggeredBeauty:
6472
LOG(info) << "********** [GeneratorPythia8EmbedHF] configuring GeneratorPythia8GapTriggeredBeauty **********";
6573
LOG(info) << "********** Default number of HF signal events to be merged (updated by notifyEmbedding): " << mNumSigEvs;
66-
mGeneratorEvHF = dynamic_cast<GeneratorPythia8GapTriggeredHF*>(GeneratorPythia8GapTriggeredBeauty(/*no gap trigger*/1, yQuarkMin, yQuarkMax, yHadronMin, yHadronMax, hadronPdgList));
74+
mGeneratorEvHF = dynamic_cast<GeneratorPythia8GapTriggeredHF*>(GeneratorPythia8GapTriggeredBeauty(/*no gap trigger*/1, yQuarkMin, yQuarkMax, yHadronMin, yHadronMax, hadronPdgList, partPdgToReplaceList, freqReplaceList));
6775
break;
6876
case hf_generators::GapTriggeredCharmAndBeauty:
6977
LOG(info) << "********** [GeneratorPythia8EmbedHF] configuring GeneratorPythia8GapTriggeredCharmAndBeauty **********";
7078
LOG(info) << "********** Default number of HF signal events to be merged (updated by notifyEmbedding): " << mNumSigEvs;
71-
mGeneratorEvHF = dynamic_cast<GeneratorPythia8GapTriggeredHF*>(GeneratorPythia8GapTriggeredCharmAndBeauty(/*no gap trigger*/1, yQuarkMin, yQuarkMax, yHadronMin, yHadronMax, hadronPdgList));
79+
mGeneratorEvHF = dynamic_cast<GeneratorPythia8GapTriggeredHF*>(GeneratorPythia8GapTriggeredCharmAndBeauty(/*no gap trigger*/1, yQuarkMin, yQuarkMax, yHadronMin, yHadronMax, hadronPdgList, partPdgToReplaceList, freqReplaceList));
7280
break;
7381
case hf_generators::GapHF:
7482
LOG(info) << "********** [GeneratorPythia8EmbedHF] configuring GeneratorPythia8GapHF **********";
7583
LOG(info) << "********** Default number of HF signal events to be merged (updated by notifyEmbedding): " << mNumSigEvs;
76-
mGeneratorEvHF = dynamic_cast<GeneratorPythia8GapTriggeredHF*>(GeneratorPythia8GapHF(/*no gap trigger*/1, yQuarkMin, yQuarkMax, yHadronMin, yHadronMax, hadronPdgList));
84+
mGeneratorEvHF = dynamic_cast<GeneratorPythia8GapTriggeredHF*>(GeneratorPythia8GapTriggeredBeauty(/*no gap trigger*/1, yQuarkMin, yQuarkMax, yHadronMin, yHadronMax, hadronPdgList, partPdgToReplaceList, freqReplaceList));
7785
break;
7886
default:
7987
LOG(fatal) << "********** [GeneratorPythia8EmbedHF] bad configuration, fix it! **********";
@@ -111,7 +119,7 @@ public:
111119
LOG(info) << "[notifyEmbedding] ----- Collision impact parameter: " << x;
112120

113121
/// number of events to be embedded in a background event
114-
mNumSigEvs = 5 + 0.886202881*std::pow(std::max(0.0f, 17.5f - x),1.7);
122+
mNumSigEvs = static_cast<int>(std::lround(5.0 + 0.886202881 * std::pow(std::max(0.0f, 17.5f - x), 1.7)));
115123
LOG(info) << "[notifyEmbedding] ----- generating " << mNumSigEvs << " signal events " << std::endl;
116124
};
117125

@@ -380,34 +388,34 @@ private:
380388
};
381389

382390
// Charm enriched
383-
FairGenerator * GeneratorPythia8EmbedHFCharm(bool usePtHardBins = false, float yQuarkMin = -1.5, float yQuarkMax = 1.5, float yHadronMin = -1.5, float yHadronMax = 1.5, std::vector<int> hadronPdgList = {})
391+
FairGenerator * GeneratorPythia8EmbedHFCharm(bool usePtHardBins = false, float yQuarkMin = -1.5, float yQuarkMax = 1.5, float yHadronMin = -1.5, float yHadronMax = 1.5, std::vector<int> quarkPdgList = {}, std::vector<int> hadronPdgList = {}, std::vector<std::array<int,2>> partPdgToReplaceList = {}, std::vector<float> freqReplaceList = {})
384392
{
385393
auto myGen = new GeneratorPythia8EmbedHF();
386394

387395
/// setup the internal generator for HF events
388-
myGen->setupGeneratorEvHF(hf_generators::GapTriggeredCharm, usePtHardBins, yQuarkMin, yQuarkMax, yHadronMin, yHadronMax, hadronPdgList);
396+
myGen->setupGeneratorEvHF(hf_generators::GapTriggeredCharm, usePtHardBins, yQuarkMin, yQuarkMax, yHadronMin, yHadronMax, quarkPdgList, hadronPdgList, partPdgToReplaceList, freqReplaceList);
389397

390398
return myGen;
391399
}
392400

393401
// Beauty enriched
394-
FairGenerator * GeneratorPythia8EmbedHFBeauty(bool usePtHardBins = false, float yQuarkMin = -1.5, float yQuarkMax = 1.5, float yHadronMin = -1.5, float yHadronMax = 1.5, std::vector<int> hadronPdgList = {})
402+
FairGenerator * GeneratorPythia8EmbedHFBeauty(bool usePtHardBins = false, float yQuarkMin = -1.5, float yQuarkMax = 1.5, float yHadronMin = -1.5, float yHadronMax = 1.5, std::vector<int> quarkPdgList = {}, std::vector<int> hadronPdgList = {}, std::vector<std::array<int,2>> partPdgToReplaceList = {}, std::vector<float> freqReplaceList = {})
395403
{
396404
auto myGen = new GeneratorPythia8EmbedHF();
397405

398406
/// setup the internal generator for HF events
399-
myGen->setupGeneratorEvHF(hf_generators::GapTriggeredBeauty, usePtHardBins, yQuarkMin, yQuarkMax, yHadronMin, yHadronMax, hadronPdgList);
407+
myGen->setupGeneratorEvHF(hf_generators::GapTriggeredBeauty, usePtHardBins, yQuarkMin, yQuarkMax, yHadronMin, yHadronMax, quarkPdgList, hadronPdgList, partPdgToReplaceList, freqReplaceList);
400408

401409
return myGen;
402410
}
403411

404412
// Charm and beauty enriched (with same ratio)
405-
FairGenerator * GeneratorPythia8EmbedHFCharmAndBeauty(bool usePtHardBins = false, float yQuarkMin = -1.5, float yQuarkMax = 1.5, float yHadronMin = -1.5, float yHadronMax = 1.5, std::vector<int> hadronPdgList = {})
413+
FairGenerator * GeneratorPythia8EmbedHFCharmAndBeauty(bool usePtHardBins = false, float yQuarkMin = -1.5, float yQuarkMax = 1.5, float yHadronMin = -1.5, float yHadronMax = 1.5, std::vector<int> quarkPdgList = {}, std::vector<int> hadronPdgList = {}, std::vector<std::array<int,2>> partPdgToReplaceList = {}, std::vector<float> freqReplaceList = {})
406414
{
407415
auto myGen = new GeneratorPythia8EmbedHF();
408416

409417
/// setup the internal generator for HF events
410-
myGen->setupGeneratorEvHF(hf_generators::GapTriggeredCharmAndBeauty, usePtHardBins, yQuarkMin, yQuarkMax, yHadronMin, yHadronMax, hadronPdgList);
418+
myGen->setupGeneratorEvHF(hf_generators::GapTriggeredCharmAndBeauty, usePtHardBins, yQuarkMin, yQuarkMax, yHadronMin, yHadronMax, quarkPdgList, hadronPdgList, partPdgToReplaceList, freqReplaceList);
411419

412420
return myGen;
413421
}

MC/config/PWGHF/external/generator/generator_pythia8_gaptriggered_hf.C

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -258,17 +258,14 @@ protected:
258258

259259
bool replaceParticle(int iPartToReplace, int pdgCodeNew) {
260260

261-
auto mothers = mPythia.event[iPartToReplace].motherList();
262-
263-
std::array<int, 25> pdgDiquarks = {1103, 2101, 2103, 2203, 3101, 3103, 3201, 3203, 3303, 4101, 4103, 4201, 4203, 4301, 4303, 4403, 5101, 5103, 5201, 5203, 5301, 5303, 5401, 5403, 5503};
264-
265-
for (auto const& mother: mothers) {
266-
auto pdgMother = std::abs(mPythia.event[mother].id());
267-
if (pdgMother > 100 && std::find(pdgDiquarks.begin(), pdgDiquarks.end(), pdgMother) == pdgDiquarks.end()) {
268-
return false;
269-
}
261+
// Check status code: particles with status 91-99 come from decays and should not be replaced
262+
int statusMother = std::abs(mPythia.event[iPartToReplace].status());
263+
if (statusMother >= 91 && statusMother <= 99) {
264+
return false;
270265
}
271266

267+
auto mothers = mPythia.event[iPartToReplace].motherList();
268+
272269
int charge = mPythia.event[iPartToReplace].id() / std::abs(mPythia.event[iPartToReplace].id());
273270
float px = mPythia.event[iPartToReplace].px();
274271
float py = mPythia.event[iPartToReplace].py();
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
### The external generator derives from GeneratorPythia8.
2+
[GeneratorExternal]
3+
fileName=${O2DPG_MC_CONFIG_ROOT}/MC/config/PWGHF/external/generator/generator_pythia8_embed_hf.C
4+
funcName=GeneratorPythia8EmbedHFCharmAndBeauty(false, -1.5, 1.5, -1.5, 1.5, std::vector<int>{}, std::vector<int>{}, std::vector<std::array<int,2>>{{423,4132},{423,4232},{4212,4332}}, std::vector<float>{0.5,0.5,1})
5+
6+
[GeneratorPythia8]
7+
config=${O2DPG_MC_CONFIG_ROOT}/MC/config/PWGHF/pythia8/generator/pythia8_charmhadronic_decays_Mode2_hardQCD_5TeV_XicOmegaC.cfg
8+
includePartonEvent=true

MC/config/PWGHF/ini/tests/GeneratorHFTrigger_Bforced.C

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,9 @@ int External()
9090
return 1;
9191
}
9292

93-
float fracForcedDecays = float(nSignalGoodDecay) / nSignals;
94-
if (fracForcedDecays < 0.75) // we put some tolerance (e.g. due to oscillations which might change the final state)
93+
float fracForcedDecays = nSignals ? float(nSignalGoodDecay) / nSignals : 0.0f;
94+
float uncFracForcedDecays = nSignals ? std::sqrt(fracForcedDecays * (1 - fracForcedDecays) / nSignals) / nSignals : 1.0f;
95+
if (std::abs(fracForcedDecays - 0.75) > uncFracForcedDecays) // we put some tolerance (e.g. due to oscillations which might change the final state)
9596
{
9697
std::cerr << "Fraction of signals decaying into the correct channel " << fracForcedDecays << " lower than expected\n";
9798
return 1;

MC/config/PWGHF/ini/tests/GeneratorHFTrigger_LambdaBToNuclei.C

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,9 @@ int External()
4545
std::cout <<"# signal hadrons: " << nSignals << "\n";
4646
std::cout <<"# signal hadrons decaying into nuclei: " << nSignalGoodDecay << "\n";
4747

48-
float fracForcedDecays = float(nSignalGoodDecay) / nSignals;
49-
if (fracForcedDecays < 0.8) // we put some tolerance (lambdaB in MB events do not coalesce)
48+
float fracForcedDecays = nSignals ? float(nSignalGoodDecay) / nSignals : 0.0f;
49+
float uncFracForcedDecays = nSignals ? std::sqrt(fracForcedDecays * (1 - fracForcedDecays) / nSignals) / nSignals : 1.0f;
50+
if (std::abs(fracForcedDecays - 0.8) > uncFracForcedDecays) // we put some tolerance (lambdaB in MB events do not coalesce)
5051
{
5152
std::cerr << "Fraction of signals decaying into nuclei: " << fracForcedDecays << ", lower than expected\n";
5253
return 1;

MC/config/PWGHF/ini/tests/GeneratorHFTrigger_bbbar.C

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,9 @@ int External()
8282
return 1;
8383
}
8484

85-
float fracForcedDecays = float(nSignalGoodDecay) / nSignals;
86-
if (fracForcedDecays < 0.9) // we put some tolerance (e.g. due to oscillations which might change the final state)
85+
float fracForcedDecays = nSignals ? float(nSignalGoodDecay) / nSignals : 0.0f;
86+
float uncFracForcedDecays = nSignals ? std::sqrt(fracForcedDecays * (1 - fracForcedDecays) / nSignals) / nSignals : 1.0f;
87+
if (std::abs(fracForcedDecays - 0.85) > uncFracForcedDecays) // we put some tolerance (e.g. due to oscillations which might change the final state)
8788
{
8889
std::cerr << "Fraction of signals decaying into the correct channel " << fracForcedDecays << " lower than expected\n";
8990
return 1;

MC/config/PWGHF/ini/tests/GeneratorHFTrigger_ccbar.C

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,9 @@ int External()
8282
return 1;
8383
}
8484

85-
float fracForcedDecays = float(nSignalGoodDecay) / nSignals;
86-
if (fracForcedDecays < 0.85) // we put some tolerance (e.g. due to oscillations which might change the final state)
85+
float fracForcedDecays = nSignals ? float(nSignalGoodDecay) / nSignals : 0.0f;
86+
float uncFracForcedDecays = nSignals ? std::sqrt(fracForcedDecays * (1 - fracForcedDecays) / nSignals) / nSignals : 1.0f;
87+
if (std::abs(fracForcedDecays - 0.85) > uncFracForcedDecays) // we put some tolerance (e.g. due to oscillations which might change the final state)
8788
{
8889
std::cerr << "Fraction of signals decaying into the correct channel " << fracForcedDecays << " lower than expected\n";
8990
return 1;

MC/config/PWGHF/ini/tests/GeneratorHF_D2H_bbbar_Bforced_gap5_Mode2.C

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,9 @@ int External() {
105105
return 1;
106106
}
107107

108-
float fracForcedDecays = float(nSignalGoodDecay) / nSignals;
109-
if (fracForcedDecays < 0.85) { // we put some tolerance (e.g. due to oscillations which might change the final state)
108+
float fracForcedDecays = nSignals ? float(nSignalGoodDecay) / nSignals : 0.0f;
109+
float uncFracForcedDecays = nSignals ? std::sqrt(fracForcedDecays * (1 - fracForcedDecays) / nSignals) / nSignals : 1.0f;
110+
if (std::abs(fracForcedDecays - 0.85) > uncFracForcedDecays) { // we put some tolerance (e.g. due to oscillations which might change the final state)
110111
std::cerr << "Fraction of signals decaying into the correct channel " << fracForcedDecays << " lower than expected\n";
111112
return 1;
112113
}

MC/config/PWGHF/ini/tests/GeneratorHF_D2H_bbbar_BtoDK_gap5_Mode2.C

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,9 @@ int External() {
105105
return 1;
106106
}
107107

108-
float fracForcedDecays = float(nSignalGoodDecay) / nSignals;
109-
if (fracForcedDecays < 0.85) { // we put some tolerance (e.g. due to oscillations which might change the final state)
108+
float fracForcedDecays = nSignals ? float(nSignalGoodDecay) / nSignals : 0.0f;
109+
float uncFracForcedDecays = nSignals ? std::sqrt(fracForcedDecays * (1 - fracForcedDecays) / nSignals) / nSignals : 1.0f;
110+
if (std::abs(fracForcedDecays - 0.85) > uncFracForcedDecays) { // we put some tolerance (e.g. due to oscillations which might change the final state)
110111
std::cerr << "Fraction of signals decaying into the correct channel " << fracForcedDecays << " lower than expected\n";
111112
return 1;
112113
}

MC/config/PWGHF/ini/tests/GeneratorHF_D2H_bbbar_Mode2_OmegaC.C

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,9 @@ int External() {
9595
return 1;
9696
}
9797

98-
float fracForcedDecays = float(nSignalGoodDecay) / nSignals;
99-
if (fracForcedDecays < 0.9) { // we put some tolerance (e.g. due to oscillations which might change the final state)
98+
float fracForcedDecays = nSignals ? float(nSignalGoodDecay) / nSignals : 0.0f;
99+
float uncFracForcedDecays = nSignals ? std::sqrt(fracForcedDecays * (1 - fracForcedDecays) / nSignals) / nSignals : 1.0f;
100+
if (std::abs(fracForcedDecays - 0.85) > uncFracForcedDecays) { // we put some tolerance (e.g. due to oscillations which might change the final state)
100101
std::cerr << "Fraction of signals decaying into the correct channel " << fracForcedDecays << " lower than expected\n";
101102
return 1;
102103
}

0 commit comments

Comments
 (0)