Skip to content

Commit 7f11193

Browse files
mcoquet642Maurice Coquet
andauthored
Adding generators for non-prompt charmonia in light ions (#2235)
* Adding generators for non-prompt charmonia in light ions * Adding mid-y and test files --------- Co-authored-by: Maurice Coquet <mcoquet@alicecerno2.cern.ch>
1 parent ccc4ad6 commit 7f11193

12 files changed

+1092
-0
lines changed
Lines changed: 312 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,312 @@
1+
#include "FairGenerator.h"
2+
#include "Generators/GeneratorPythia8.h"
3+
#include "Pythia8/Pythia.h"
4+
#include "TRandom.h"
5+
6+
R__ADD_INCLUDE_PATH($O2DPG_MC_CONFIG_ROOT/MC/config/PWGDQ/EvtGen)
7+
#include "GeneratorEvtGen.C"
8+
9+
#include <string>
10+
11+
using namespace o2::eventgen;
12+
13+
namespace o2
14+
{
15+
namespace eventgen
16+
{
17+
18+
class GeneratorPythia8NonPromptInjectedOOGapTriggeredDQ : public o2::eventgen::GeneratorPythia8 {
19+
public:
20+
21+
/// constructor
22+
GeneratorPythia8NonPromptInjectedOOGapTriggeredDQ(int inputTriggerRatio = 5) {
23+
24+
mGeneratedEvents = 0;
25+
mInverseTriggerRatio = inputTriggerRatio;
26+
// define minimum bias event generator
27+
auto seed = (gRandom->TRandom::GetSeed() % 900000000);
28+
TString pathconfigMB = gSystem->ExpandPathName("${O2DPG_MC_CONFIG_ROOT}/MC/config/common/pythia8/generator/pythia8_OO_536.cfg");
29+
pythiaMBgen.readFile(pathconfigMB.Data());
30+
pythiaMBgen.readString("Random:setSeed on");
31+
pythiaMBgen.readString("Random:seed " + std::to_string(seed));
32+
mConfigMBdecays = "";
33+
mPDG = 5;
34+
mRapidityMin = -1.;
35+
mRapidityMax = 1.;
36+
mHadronMultiplicity = -1;
37+
mHadronRapidityMin = -1.;
38+
mHadronRapidityMax = 1.;
39+
mVerbose = false;
40+
}
41+
42+
/// Destructor
43+
~GeneratorPythia8NonPromptInjectedOOGapTriggeredDQ() = default;
44+
45+
void setPDG(int val) { mPDG = val; };
46+
void addHadronPDGs(int pdg) { mHadronsPDGs.push_back(pdg); };
47+
void setHadronMultiplicity(int val) { mHadronMultiplicity = val; };
48+
void setRapidity(double valMin, double valMax)
49+
{
50+
mRapidityMin = valMin;
51+
mRapidityMax = valMax;
52+
};
53+
54+
void setRapidityHadron(double valMin, double valMax)
55+
{
56+
mHadronRapidityMin = valMin;
57+
mHadronRapidityMax = valMax;
58+
};
59+
60+
void setConfigMBdecays(TString val){mConfigMBdecays = val;}
61+
62+
void setVerbose(bool val) { mVerbose = val; };
63+
64+
protected:
65+
66+
Bool_t generateEvent() override
67+
{
68+
// reset event
69+
bool genOk = false;
70+
if (mGeneratedEvents % mInverseTriggerRatio == 0){
71+
bool ancestor = false;
72+
while (! (genOk && ancestor) ){
73+
/// reset event
74+
mPythia.event.reset();
75+
genOk = GeneratorPythia8::generateEvent();
76+
// find the q-qbar ancestor
77+
ancestor = findHeavyQuarkPair(mPythia.event);
78+
}
79+
} else {
80+
/// reset event
81+
pythiaMBgen.event.reset();
82+
while (!genOk) {
83+
genOk = pythiaMBgen.next();
84+
}
85+
mPythia.event = pythiaMBgen.event;
86+
}
87+
mGeneratedEvents++;
88+
if (mVerbose) mOutputEvent.list();
89+
return true;
90+
}
91+
92+
Bool_t Init() override
93+
{
94+
if(mConfigMBdecays.Contains("cfg")) pythiaMBgen.readFile(mConfigMBdecays.Data());
95+
GeneratorPythia8::Init();
96+
pythiaMBgen.init();
97+
return true;
98+
}
99+
100+
// search for q-qbar mother with at least one q in a selected rapidity window
101+
bool findHeavyQuarkPair(Pythia8::Event& event)
102+
{
103+
int countH[mHadronsPDGs.size()]; for(int ipdg=0; ipdg < mHadronsPDGs.size(); ipdg++) countH[ipdg]=0;
104+
bool hasq = false, hasqbar = false, atSelectedY = false, isOkAtPartonicLevel = false;
105+
for (int ipa = 0; ipa < event.size(); ++ipa) {
106+
107+
if(!isOkAtPartonicLevel){
108+
auto daughterList = event[ipa].daughterList();
109+
hasq = false; hasqbar = false; atSelectedY = false;
110+
for (auto ida : daughterList) {
111+
if (event[ida].id() == mPDG)
112+
hasq = true;
113+
if (event[ida].id() == -mPDG)
114+
hasqbar = true;
115+
if ((event[ida].y() > mRapidityMin) && (event[ida].y() < mRapidityMax))
116+
atSelectedY = true;
117+
}
118+
if (hasq && hasqbar && atSelectedY) isOkAtPartonicLevel = true;
119+
}
120+
121+
if( (mHadronMultiplicity <= 0) && isOkAtPartonicLevel) return true; // no selection at hadron level
122+
123+
/// check at hadron level if needed
124+
int ipdg=0;
125+
for (auto& pdgVal : mHadronsPDGs){
126+
if ( (TMath::Abs(event[ipa].id()) == pdgVal) && (event[ipa].y() > mHadronRapidityMin) && (event[ipa].y() < mHadronRapidityMax) ) countH[ipdg]++;
127+
if(isOkAtPartonicLevel && countH[ipdg] >= mHadronMultiplicity) return true;
128+
ipdg++;
129+
}
130+
}
131+
return false;
132+
};
133+
134+
135+
private:
136+
// Interface to override import particles
137+
Pythia8::Event mOutputEvent;
138+
139+
// Control gap-triggering
140+
unsigned long long mGeneratedEvents;
141+
int mInverseTriggerRatio;
142+
Pythia8::Pythia pythiaMBgen; // minimum bias event
143+
TString mConfigMBdecays;
144+
int mPDG;
145+
std::vector<int> mHadronsPDGs;
146+
int mHadronMultiplicity;
147+
double mRapidityMin;
148+
double mRapidityMax;
149+
double mHadronRapidityMin;
150+
double mHadronRapidityMax;
151+
bool mVerbose;
152+
};
153+
154+
}
155+
156+
}
157+
158+
// Predefined generators:
159+
FairGenerator*
160+
GeneratorBeautyToJpsi_EvtGenMidY_OO(double rapidityMin = -1.5, double rapidityMax = 1.5, bool verbose = false, TString pdgs = "511;521;531;541;5112;5122;5232;5132;5332")
161+
{
162+
auto gen = new o2::eventgen::GeneratorEvtGen<o2::eventgen::GeneratorPythia8NonPromptInjectedOOGapTriggeredDQ>();
163+
gen->setRapidity(rapidityMin, rapidityMax);
164+
gen->setPDG(5);
165+
gen->setRapidityHadron(-1.5,1.5);
166+
gen->setHadronMultiplicity(1);
167+
TString pathO2table = gSystem->ExpandPathName("${O2DPG_MC_CONFIG_ROOT}/MC/config/PWGDQ/pythia8/decayer/switchOffBhadrons.cfg");
168+
gen->readFile(pathO2table.Data());
169+
gen->setConfigMBdecays(pathO2table);
170+
gen->setVerbose(verbose);
171+
172+
std::string spdg;
173+
TObjArray* obj = pdgs.Tokenize(";");
174+
gen->SetSizePdg(obj->GetEntriesFast());
175+
for (int i = 0; i < obj->GetEntriesFast(); i++) {
176+
spdg = obj->At(i)->GetName();
177+
gen->AddPdg(std::stoi(spdg), i);
178+
gen->addHadronPDGs(std::stoi(spdg));
179+
printf("PDG %d \n", std::stoi(spdg));
180+
}
181+
gen->SetForceDecay(kEvtBJpsiDiElectron);
182+
183+
// set random seed
184+
gen->readString("Random:setSeed on");
185+
uint random_seed;
186+
unsigned long long int random_value = 0;
187+
ifstream urandom("/dev/urandom", ios::in|ios::binary);
188+
urandom.read(reinterpret_cast<char*>(&random_value), sizeof(random_seed));
189+
gen->readString(Form("Random:seed = %d", random_value % 900000001));
190+
191+
// print debug
192+
// gen->PrintDebug();
193+
194+
return gen;
195+
}
196+
197+
FairGenerator*
198+
GeneratorBeautyToPsiAndJpsi_EvtGenMidY_OO(double rapidityMin = -1.5, double rapidityMax = 1.5, bool verbose = false, TString pdgs = "511;521;531;541;5112;5122;5232;5132;5332")
199+
{
200+
auto gen = new o2::eventgen::GeneratorEvtGen<o2::eventgen::GeneratorPythia8NonPromptInjectedOOGapTriggeredDQ>();
201+
gen->setRapidity(rapidityMin, rapidityMax);
202+
gen->setPDG(5);
203+
gen->setRapidityHadron(rapidityMin,rapidityMax);
204+
gen->setHadronMultiplicity(1);
205+
TString pathO2table = gSystem->ExpandPathName("${O2DPG_MC_CONFIG_ROOT}/MC/config/PWGDQ/pythia8/decayer/switchOffBhadrons.cfg");
206+
gen->readFile(pathO2table.Data());
207+
gen->setConfigMBdecays(pathO2table);
208+
gen->setVerbose(verbose);
209+
210+
std::string spdg;
211+
TObjArray* obj = pdgs.Tokenize(";");
212+
gen->SetSizePdg(obj->GetEntriesFast());
213+
for (int i = 0; i < obj->GetEntriesFast(); i++) {
214+
spdg = obj->At(i)->GetName();
215+
gen->AddPdg(std::stoi(spdg), i);
216+
printf("PDG %d \n", std::stoi(spdg));
217+
gen->addHadronPDGs(std::stoi(spdg));
218+
}
219+
gen->SetForceDecay(kEvtBPsiAndJpsiDiElectron);
220+
221+
// set random seed
222+
gen->readString("Random:setSeed on");
223+
uint random_seed;
224+
unsigned long long int random_value = 0;
225+
ifstream urandom("/dev/urandom", ios::in|ios::binary);
226+
urandom.read(reinterpret_cast<char*>(&random_value), sizeof(random_seed));
227+
gen->readString(Form("Random:seed = %d", random_value % 900000001));
228+
229+
// print debug
230+
// gen->PrintDebug();
231+
232+
return gen;
233+
}
234+
235+
// Predefined generators:
236+
FairGenerator*
237+
GeneratorBeautyToJpsi_EvtGenFwdY_OO(double rapidityMin = -4.3, double rapidityMax = -2.3, bool verbose = false, TString pdgs = "511;521;531;541;5112;5122;5232;5132;5332")
238+
{
239+
auto gen = new o2::eventgen::GeneratorEvtGen<o2::eventgen::GeneratorPythia8NonPromptInjectedOOGapTriggeredDQ>();
240+
gen->setRapidity(rapidityMin, rapidityMax);
241+
gen->setPDG(5);
242+
gen->setRapidityHadron(rapidityMin,rapidityMax);
243+
gen->setHadronMultiplicity(1);
244+
TString pathO2table = gSystem->ExpandPathName("${O2DPG_MC_CONFIG_ROOT}/MC/config/PWGDQ/pythia8/decayer/switchOffBhadrons.cfg");
245+
gen->readFile(pathO2table.Data());
246+
gen->setConfigMBdecays(pathO2table);
247+
gen->setVerbose(verbose);
248+
249+
std::string spdg;
250+
TObjArray* obj = pdgs.Tokenize(";");
251+
gen->SetSizePdg(obj->GetEntriesFast());
252+
for (int i = 0; i < obj->GetEntriesFast(); i++) {
253+
spdg = obj->At(i)->GetName();
254+
gen->AddPdg(std::stoi(spdg), i);
255+
gen->addHadronPDGs(std::stoi(spdg));
256+
printf("PDG %d \n", std::stoi(spdg));
257+
}
258+
gen->SetForceDecay(kEvtBJpsiDiMuon);
259+
260+
// set random seed
261+
gen->readString("Random:setSeed on");
262+
uint random_seed;
263+
unsigned long long int random_value = 0;
264+
ifstream urandom("/dev/urandom", ios::in|ios::binary);
265+
urandom.read(reinterpret_cast<char*>(&random_value), sizeof(random_seed));
266+
gen->readString(Form("Random:seed = %d", random_value % 900000001));
267+
268+
// print debug
269+
// gen->PrintDebug();
270+
271+
return gen;
272+
}
273+
274+
275+
FairGenerator*
276+
GeneratorBeautyToPsiAndJpsi_EvtGenFwdY_OO(double rapidityMin = -4.3, double rapidityMax = -2.3, bool verbose = false, TString pdgs = "511;521;531;541;5112;5122;5232;5132;5332")
277+
{
278+
auto gen = new o2::eventgen::GeneratorEvtGen<o2::eventgen::GeneratorPythia8NonPromptInjectedOOGapTriggeredDQ>();
279+
gen->setRapidity(rapidityMin, rapidityMax);
280+
gen->setPDG(5);
281+
gen->setRapidityHadron(rapidityMin,rapidityMax);
282+
gen->setHadronMultiplicity(1);
283+
TString pathO2table = gSystem->ExpandPathName("${O2DPG_MC_CONFIG_ROOT}/MC/config/PWGDQ/pythia8/decayer/switchOffBhadrons.cfg");
284+
gen->readFile(pathO2table.Data());
285+
gen->setConfigMBdecays(pathO2table);
286+
gen->setVerbose(verbose);
287+
288+
std::string spdg;
289+
TObjArray* obj = pdgs.Tokenize(";");
290+
gen->SetSizePdg(obj->GetEntriesFast());
291+
for (int i = 0; i < obj->GetEntriesFast(); i++) {
292+
spdg = obj->At(i)->GetName();
293+
gen->AddPdg(std::stoi(spdg), i);
294+
printf("PDG %d \n", std::stoi(spdg));
295+
gen->addHadronPDGs(std::stoi(spdg));
296+
}
297+
gen->SetForceDecay(kEvtBPsiAndJpsiDiMuon);
298+
299+
// set random seed
300+
gen->readString("Random:setSeed on");
301+
uint random_seed;
302+
unsigned long long int random_value = 0;
303+
ifstream urandom("/dev/urandom", ios::in|ios::binary);
304+
urandom.read(reinterpret_cast<char*>(&random_value), sizeof(random_seed));
305+
gen->readString(Form("Random:seed = %d", random_value % 900000001));
306+
307+
// print debug
308+
// gen->PrintDebug();
309+
310+
return gen;
311+
}
312+

0 commit comments

Comments
 (0)