Skip to content

Commit 99a45f1

Browse files
committed
MC/PWGEM: add MC files for HFll in OO
1 parent a00eaf1 commit 99a45f1

13 files changed

+967
-0
lines changed
Lines changed: 234 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,234 @@
1+
#include "Pythia8/Pythia.h"
2+
#include "Pythia8/HeavyIons.h"
3+
#include "FairGenerator.h"
4+
#include "FairPrimaryGenerator.h"
5+
#include "Generators/GeneratorPythia8.h"
6+
#include "TRandom3.h"
7+
#include "TParticlePDG.h"
8+
#include "TDatabasePDG.h"
9+
10+
#include <map>
11+
#include <unordered_set>
12+
//#include <utility> // for std::pair
13+
14+
using namespace Pythia8;
15+
16+
class GeneratorPythia8GapTriggeredHFLeptonOO : public o2::eventgen::GeneratorPythia8
17+
{
18+
public:
19+
/// default constructor
20+
GeneratorPythia8GapTriggeredHFLeptonOO() = default;
21+
22+
/// constructor
23+
GeneratorPythia8GapTriggeredHFLeptonOO(TString configsignal, int quarkPdg = 4, int lInputTriggerRatio = 5, int lInputExternalID = 0)
24+
{
25+
26+
lGeneratedEvents = 0;
27+
lInverseTriggerRatio = lInputTriggerRatio;
28+
lExternalID = lInputExternalID;
29+
mQuarkPdg = quarkPdg;
30+
31+
auto seed = (gRandom->TRandom::GetSeed() % 900000000);
32+
33+
int offset = (int)(gRandom->Uniform(lInverseTriggerRatio)); // create offset to mitigate edge effects due to small number of events per job
34+
lGeneratedEvents += offset;
35+
36+
cout << "Initalizing extra PYTHIA object used to generate min-bias events..." << endl;
37+
TString pathconfigMB = gSystem->ExpandPathName("${O2DPG_MC_CONFIG_ROOT}//MC/config/common/pythia8/generator/pythia8_OO_536.cfg");
38+
pythiaObjectMinimumBias.readFile(pathconfigMB.Data());
39+
pythiaObjectMinimumBias.readString("Random:setSeed on");
40+
pythiaObjectMinimumBias.readString("Random:seed " + std::to_string(seed));
41+
pythiaObjectMinimumBias.init();
42+
cout << "Initalization of gap event is complete" << endl;
43+
44+
cout << "Initalizing extra PYTHIA object used to generate signal events..." << endl;
45+
TString pathconfigSignal = gSystem->ExpandPathName(configsignal.Data());
46+
pythiaObjectSignal.readFile(pathconfigSignal.Data());
47+
pythiaObjectSignal.readString("Random:setSeed on");
48+
pythiaObjectSignal.readString("Random:seed " + std::to_string(seed));
49+
pythiaObjectSignal.readString("Beams:idA = 1000080160");
50+
pythiaObjectSignal.readString("Beams:idB = 1000080160");
51+
pythiaObjectSignal.readString("Beams:eCM = 5360.0");
52+
pythiaObjectSignal.readString("Beams:frameType = 1");
53+
pythiaObjectSignal.readString("ParticleDecays:limitTau0 = on");
54+
pythiaObjectSignal.readString("ParticleDecays:tau0Max = 10.");
55+
pythiaObjectSignal.readString("HeavyIon:SigFitNGen = 0");
56+
pythiaObjectSignal.readString("HeavyIon:SigFitDefPar = 2.15,18.42,0.33");
57+
pythiaObjectSignal.init();
58+
cout << "Initalization of signal event is complete" << endl;
59+
60+
// flag the generators using type
61+
// addCocktailConstituent(type, "interesting");
62+
// addCocktailConstitent(0, "minbias");
63+
// Add Sub generators
64+
addSubGenerator(0, "default generator");
65+
addSubGenerator(1, "charm lepton");
66+
addSubGenerator(2, "beauty forced decay");
67+
addSubGenerator(3, "beauty no foced decay");
68+
}
69+
70+
/// Destructor
71+
~GeneratorPythia8GapTriggeredHFLeptonOO() = default;
72+
73+
void addTriggerOnDaughter(int nb, int pdg)
74+
{
75+
mNbDaughter = nb;
76+
mPdgDaughter = pdg;
77+
};
78+
void setQuarkRapidity(float yMin, float yMax)
79+
{
80+
mQuarkRapidityMin = yMin;
81+
mQuarkRapidityMax = yMax;
82+
};
83+
void setDaughterRapidity(float yMin, float yMax)
84+
{
85+
mDaughterRapidityMin = yMin;
86+
mDaughterRapidityMax = yMax;
87+
};
88+
89+
protected:
90+
//__________________________________________________________________
91+
Bool_t generateEvent() override
92+
{
93+
/// reset event
94+
mPythia.event.reset();
95+
96+
// Simple straightforward check to alternate generators
97+
if (lGeneratedEvents % lInverseTriggerRatio == 0) {
98+
// Generate event of interest
99+
Bool_t lGenerationOK = kFALSE;
100+
while (!lGenerationOK) {
101+
if (pythiaObjectSignal.next()) {
102+
lGenerationOK = selectEvent(pythiaObjectSignal.event);
103+
}
104+
}
105+
mPythia.event = pythiaObjectSignal.event;
106+
notifySubGenerator(lExternalID);
107+
} else {
108+
// Generate minimum-bias event
109+
Bool_t lGenerationOK = kFALSE;
110+
while (!lGenerationOK) {
111+
lGenerationOK = pythiaObjectMinimumBias.next();
112+
}
113+
mPythia.event = pythiaObjectMinimumBias.event;
114+
notifySubGenerator(0);
115+
}
116+
117+
lGeneratedEvents++;
118+
// mPythia.next();
119+
120+
return true;
121+
}
122+
123+
bool selectEvent(const Pythia8::Event& event)
124+
{
125+
bool isGoodAtPartonLevel = false, isGoodAtDaughterLevel = (mPdgDaughter != 0) ? false : true;
126+
int nbDaughter = 0;
127+
for (auto iPart{0}; iPart < event.size(); ++iPart) {
128+
// search for Q-Qbar mother with at least one Q in rapidity window
129+
if (!isGoodAtPartonLevel) {
130+
auto daughterList = event[iPart].daughterList();
131+
bool hasQ = false, hasQbar = false, atSelectedY = false;
132+
for (auto iDau : daughterList) {
133+
if (event[iDau].id() == mQuarkPdg) {
134+
hasQ = true;
135+
}
136+
if (event[iDau].id() == -mQuarkPdg) {
137+
hasQbar = true;
138+
}
139+
if ((std::abs(event[iDau].id()) == mQuarkPdg) && (event[iDau].y() > mQuarkRapidityMin) && (event[iDau].y() < mQuarkRapidityMax))
140+
atSelectedY = true;
141+
}
142+
if (hasQ && hasQbar && atSelectedY) {
143+
isGoodAtPartonLevel = true;
144+
}
145+
}
146+
// search for mNbDaughter daughters of type mPdgDaughter in rapidity window
147+
if (!isGoodAtDaughterLevel) {
148+
int id = std::abs(event[iPart].id());
149+
float rap = event[iPart].y();
150+
if (id == mPdgDaughter) {
151+
int motherindexa = event[iPart].mother1();
152+
if (motherindexa > 0) {
153+
int idmother = std::abs(event[motherindexa].id());
154+
if (int(std::abs(idmother) / 100.) == 4 || int(std::abs(idmother) / 1000.) == 4 || int(std::abs(idmother) / 100.) == 5 || int(std::abs(idmother) / 1000.) == 5) {
155+
if (rap > mDaughterRapidityMin && rap < mDaughterRapidityMax) {
156+
nbDaughter++;
157+
if (nbDaughter >= mNbDaughter) isGoodAtDaughterLevel = true;
158+
}
159+
}
160+
}
161+
}
162+
}
163+
// we send the trigger
164+
if (isGoodAtPartonLevel && isGoodAtDaughterLevel) {
165+
return true;
166+
}
167+
}
168+
return false;
169+
};
170+
171+
private:
172+
// Interface to override import particles
173+
Pythia8::Event mOutputEvent;
174+
175+
// Properties of selection
176+
int mQuarkPdg;
177+
float mQuarkRapidityMin;
178+
float mQuarkRapidityMax;
179+
int mPdgDaughter;
180+
int mNbDaughter;
181+
float mDaughterRapidityMin;
182+
float mDaughterRapidityMax;
183+
184+
// Control gap-triggering
185+
Long64_t lGeneratedEvents;
186+
int lInverseTriggerRatio;
187+
// ID for different generators
188+
int lExternalID;
189+
190+
// Base event generators
191+
Pythia8::Pythia pythiaObjectMinimumBias; ///Minimum bias collision generator
192+
Pythia8::Pythia pythiaObjectSignal; ///Signal collision generator
193+
};
194+
195+
// Predefined generators:
196+
197+
// Charm-enriched forced decay
198+
FairGenerator* GeneratorPythia8GapTriggeredCharmLepton(int inputTriggerRatio, int inputExternalID, float yMinQ = -1.5, float yMaxQ = 1.5, float yMinL = -1, float yMaxL = 1)
199+
{
200+
auto myGen = new GeneratorPythia8GapTriggeredHFLeptonOO("${O2DPG_MC_CONFIG_ROOT}/MC/config/PWGEM/pythia8/generator/pythia8_pp_cr2_forceddecayscharm.cfg", 4, inputTriggerRatio, inputExternalID);
201+
auto seed = (gRandom->TRandom::GetSeed() % 900000000);
202+
myGen->readString("Random:setSeed on");
203+
myGen->readString("Random:seed " + std::to_string(seed));
204+
myGen->setQuarkRapidity(yMinQ, yMaxQ);
205+
myGen->addTriggerOnDaughter(2, 11);
206+
myGen->setDaughterRapidity(yMinL, yMaxL);
207+
return myGen;
208+
}
209+
210+
// Beauty-enriched forced decay
211+
FairGenerator* GeneratorPythia8GapTriggeredBeautyForcedDecays(int inputTriggerRatio, int inputExternalID, float yMinQ = -1.5, float yMaxQ = 1.5, float yMinL = -1, float yMaxL = 1)
212+
{
213+
auto myGen = new GeneratorPythia8GapTriggeredHFLeptonOO("${O2DPG_MC_CONFIG_ROOT}/MC/config/PWGEM/pythia8/generator/pythia8_bbbar_forceddecayscharmbeauty.cfg", 5, inputTriggerRatio, inputExternalID);
214+
auto seed = (gRandom->TRandom::GetSeed() % 900000000);
215+
myGen->readString("Random:setSeed on");
216+
myGen->readString("Random:seed " + std::to_string(seed));
217+
myGen->setQuarkRapidity(yMinQ, yMaxQ);
218+
myGen->addTriggerOnDaughter(2, 11);
219+
myGen->setDaughterRapidity(yMinL, yMaxL);
220+
return myGen;
221+
}
222+
223+
// Beauty-enriched no forced decay
224+
FairGenerator* GeneratorPythia8GapTriggeredBeautyNoForcedDecays(int inputTriggerRatio, int inputExternalID, float yMinQ = -1.5, float yMaxQ = 1.5, float yMinL = -1, float yMaxL = 1)
225+
{
226+
auto myGen = new GeneratorPythia8GapTriggeredHFLeptonOO("${O2DPG_MC_CONFIG_ROOT}/MC/config/PWGEM/pythia8/generator/pythia8_bbbar.cfg", 5, inputTriggerRatio, inputExternalID);
227+
auto seed = (gRandom->TRandom::GetSeed() % 900000000);
228+
myGen->readString("Random:setSeed on");
229+
myGen->readString("Random:seed " + std::to_string(seed));
230+
myGen->setQuarkRapidity(yMinQ, yMaxQ);
231+
myGen->addTriggerOnDaughter(2, 11);
232+
myGen->setDaughterRapidity(yMinL, yMaxL);
233+
return myGen;
234+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
[GeneratorExternal]
2+
fileName = ${O2DPG_MC_CONFIG_ROOT}/MC/config/PWGEM/external/generator/Generator_pythia8_GapTriggered_HFLepton_OO.C
3+
funcName = GeneratorPythia8GapTriggeredBeautyForcedDecays(2, 2, 11, -1.5, +1.5, -1.2, +1.2)
4+
5+
[GeneratorPythia8]
6+
config = ${O2DPG_MC_CONFIG_ROOT}/MC/config/PWGEM/pythia8/generator/configPythiaEmpty.cfg
7+
includePartonEvent = true
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
[GeneratorExternal]
2+
fileName = ${O2DPG_MC_CONFIG_ROOT}/MC/config/PWGEM/external/generator/Generator_pythia8_GapTriggered_HFLepton_OO.C
3+
funcName = GeneratorPythia8GapTriggeredBeautyForcedDecays(2, 2, 13, -6, 0, -5, -1)
4+
5+
[GeneratorPythia8]
6+
config = ${O2DPG_MC_CONFIG_ROOT}/MC/config/PWGEM/pythia8/generator/configPythiaEmpty.cfg
7+
includePartonEvent = true
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
[GeneratorExternal]
2+
fileName = ${O2DPG_MC_CONFIG_ROOT}/MC/config/PWGEM/external/generator/Generator_pythia8_GapTriggered_HFLepton_OO.C
3+
funcName = GeneratorPythia8GapTriggeredBeautyNoForcedDecays(2, 3, 11, +1.5, -1.5, -1.2, +1.2)
4+
5+
[GeneratorPythia8]
6+
config = ${O2DPG_MC_CONFIG_ROOT}/MC/config/PWGEM/pythia8/generator/configPythiaEmpty.cfg
7+
includePartonEvent = true
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
[GeneratorExternal]
2+
fileName = ${O2DPG_MC_CONFIG_ROOT}/MC/config/PWGEM/external/generator/Generator_pythia8_GapTriggered_HFLepton_OO.C
3+
funcName = GeneratorPythia8GapTriggeredBeautyNoForcedDecays(2, 3, 13, -6, 0, -5, -1)
4+
5+
[GeneratorPythia8]
6+
config = ${O2DPG_MC_CONFIG_ROOT}/MC/config/PWGEM/pythia8/generator/configPythiaEmpty.cfg
7+
includePartonEvent = true
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
[GeneratorExternal]
2+
fileName = ${O2DPG_MC_CONFIG_ROOT}/MC/config/PWGEM/external/generator/Generator_pythia8_GapTriggered_HFLepton_OO.C
3+
funcName = GeneratorPythia8GapTriggeredCharmLepton(2, 1, 11, -1.5, +1.5, -1.2, +1.2)
4+
5+
[GeneratorPythia8]
6+
config = ${O2DPG_MC_CONFIG_ROOT}/MC/config/PWGEM/pythia8/generator/configPythiaEmpty.cfg
7+
includePartonEvent = true
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
[GeneratorExternal]
2+
fileName = ${O2DPG_MC_CONFIG_ROOT}/MC/config/PWGEM/external/generator/Generator_pythia8_GapTriggered_HFLepton_OO.C
3+
funcName = GeneratorPythia8GapTriggeredCharmLepton(2, 1, 13, -6, 0, -5, -1)
4+
5+
[GeneratorPythia8]
6+
config = ${O2DPG_MC_CONFIG_ROOT}/MC/config/PWGEM/pythia8/generator/configPythiaEmpty.cfg
7+
includePartonEvent = true

0 commit comments

Comments
 (0)