Skip to content

Commit d76a7a1

Browse files
committed
Adding scripts which are required to use the event generator upcgen in O2 simulations.
1 parent 82c2c51 commit d76a7a1

File tree

3 files changed

+287
-0
lines changed

3 files changed

+287
-0
lines changed
Lines changed: 198 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
1+
R__LOAD_LIBRARY(libUpcgenlib.so)
2+
R__ADD_INCLUDE_PATH($upcgen_ROOT/include)
3+
4+
#include "UpcGenerator.h"
5+
6+
// usage: o2-sim -n 100 -g external --configKeyValues 'GeneratorExternal.fileName=GeneratorUpcgen.C;GeneratorExternal.funcName=GeneratorUpcgen("kDiTau")'
7+
8+
namespace o2
9+
{
10+
namespace eventgen
11+
{
12+
class GeneratorUPCgen_class : public Generator
13+
{
14+
public:
15+
GeneratorUPCgen_class() {
16+
mUPCgen = new UpcGenerator();
17+
};
18+
~GeneratorUPCgen_class() = default;
19+
void selectConfiguration(std::string val) { mSelectedConfiguration = val; };
20+
void setLumiFileDirectory(std::string lumiFileDirectory) { mUPCgen->setLumiFileDirectory(lumiFileDirectory); };
21+
void setCollisionSystem(float energyCM, int beamZ, int beamA) {
22+
eCM = energyCM;
23+
projZ = beamZ;
24+
projA = beamA;
25+
};
26+
void setSeed(int seed) { mUPCgen->setSeed(seed); }
27+
28+
// predefined generator configurations
29+
const static int nProcess = 5;
30+
const static int nElements = 9;
31+
const struct UpcgenConfig
32+
{
33+
std::string pnames[nElements]{
34+
"PROC_ID",
35+
"LEP_A",
36+
"ALP_MASS",
37+
"ALP_WIDTH",
38+
"PT_MIN",
39+
"ETA_MIN",
40+
"ETA_MAX",
41+
"FLUX_POINT",
42+
"BREAKUP_MODE"
43+
};
44+
const struct definitions {
45+
const char *name;
46+
std::string elements[nElements];
47+
} sets[nProcess] = {
48+
{"kDiElectron", {"11", "0.0", "0.0", "0.0", "0.0", "-1.0", "1.0", "1", "1"}},
49+
{"kDiMuon", {"13", "0.0", "0.0", "0.0", "0.0", "-1.0", "1.0", "1", "1"}},
50+
{"kDiTau", {"15", "0.0", "0.0", "0.0", "0.0", "-1.0", "1.0", "1", "1"}},
51+
{"kLightByLight", {"22", "0.0", "0.0", "0.0", "0.0", "-1.0", "1.0", "1", "1"}},
52+
{"kAxionLike", {"51", "0.0", "0.0", "0.0", "0.0", "-1.0", "1.0", "1", "1"}}
53+
};
54+
} upcgenConfig;
55+
56+
bool Config()
57+
{
58+
// select a specific set of parameters
59+
int idx = -1;
60+
for (int i = 0; i < nProcess; ++i) {
61+
if (mSelectedConfiguration.compare(upcgenConfig.sets[i].name) == 0) {
62+
idx = i;
63+
break;
64+
}
65+
}
66+
67+
if (idx == -1) {
68+
std::cout << "UPCGEN process " << mSelectedConfiguration
69+
<< " is not supported" << std::endl;
70+
return false;
71+
}
72+
73+
// new generator
74+
mUPCgen->setDebugLevel(0);
75+
mUPCgen->setNumThreads(1);
76+
77+
// update generator parameters - configure
78+
mUPCgen->setParameterValue("DO_PT_CUT", "1");
79+
mUPCgen->setParameterValue("DO_ETA_CUT", "1");
80+
mUPCgen->setParameterValue("USE_ROOT_OUTPUT", "0");
81+
mUPCgen->setParameterValue("USE_HEPMC_OUTPUT", "0");
82+
83+
for (int i = 0; i < nElements; ++i) {
84+
mUPCgen->setParameterValue(upcgenConfig.pnames[i], upcgenConfig.sets[idx].elements[i]);
85+
}
86+
87+
return true;
88+
}
89+
90+
bool Init() override
91+
{
92+
Generator::Init();
93+
94+
// initialize the generator
95+
mUPCgen->init();
96+
97+
return true;
98+
};
99+
100+
101+
bool generateEvent() override
102+
{
103+
if (!mUPCgen) {
104+
std::cout
105+
<< "GenerateEvent: upcgen class/object not properly constructed"
106+
<< std::endl;
107+
return false;
108+
}
109+
110+
// generate a new event
111+
vector<int> pdgs;
112+
vector<int> statuses;
113+
vector<int> mothers;
114+
vector<TLorentzVector> particles;
115+
// events can be rejected due to applied cuts
116+
bool goon = true;
117+
while (goon) {
118+
auto stat = mUPCgen->generateEvent(pdgs, statuses, mothers, particles);
119+
if (stat == 0) {
120+
nRejected++;
121+
} else {
122+
nAccepted++;
123+
goon = false;
124+
}
125+
}
126+
127+
return true;
128+
};
129+
130+
bool importParticles() override
131+
{
132+
std::cout << "\n";
133+
auto upcgenParticles = mUPCgen->getParticles();
134+
for (auto part : upcgenParticles) {
135+
part.Print();
136+
TParticle particle(part.GetPdgCode(),
137+
1,
138+
part.GetFirstMother(),
139+
-1,
140+
part.GetFirstDaughter(),
141+
part.GetLastDaughter(),
142+
part.Px(),
143+
part.Py(),
144+
part.Pz(),
145+
part.Energy(),
146+
0., 0., 0., 0.);
147+
mParticles.push_back(particle);
148+
o2::mcutils::MCGenHelper::encodeParticleStatusAndTracking(mParticles.back(), true);
149+
}
150+
return true;
151+
};
152+
153+
long int acceptedEvents() { return nAccepted; }
154+
long int rejectedEvents() { return nRejected; }
155+
double fiducialXSection()
156+
{
157+
return mUPCgen->totNuclX()*nAccepted/(nAccepted+nRejected);
158+
}
159+
160+
private:
161+
UpcGenerator *mUPCgen = 0x0;
162+
std::string mSelectedConfiguration = "";
163+
164+
// keep track of the rejected and accepted events
165+
long int nAccepted{0};
166+
long int nRejected{0};
167+
168+
float eCM = 5020;
169+
int projZ = 82;
170+
int projA = 208;
171+
};
172+
173+
} // namespace eventgen
174+
} // namespace o2
175+
176+
177+
FairGenerator *GeneratorUpcgen(std::string configuration = "kDiTau",
178+
std::string lumiFileDirectory = ".",
179+
float energyCM = 5020.,
180+
int beamZ = 82,
181+
int beamA = 208) {
182+
// create generator
183+
auto gen = new o2::eventgen::GeneratorUPCgen_class();
184+
185+
// set generator parameters
186+
gen->selectConfiguration(configuration);
187+
gen->setLumiFileDirectory(lumiFileDirectory);
188+
gen->setCollisionSystem(energyCM, beamZ, beamA);
189+
190+
// configure the generator
191+
cout << "Upcgen is initialized ...";
192+
gen->Config();
193+
cout << " config done ...";
194+
gen->Init();
195+
cout << " init done!\n";
196+
197+
return gen;
198+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
#! /usr/bin/env python3
2+
3+
### @author: Paul Buehler
4+
### @email: paul.buhler@cern.ch
5+
6+
import argparse
7+
8+
parser = argparse.ArgumentParser(description='Make Upcgen configuration',
9+
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
10+
11+
parser.add_argument('--collType',default='PbPb', choices=['PbPb', 'OO'],
12+
help='Colission system')
13+
14+
parser.add_argument('--eCM', type=float, default='5360',
15+
help='Centre-of-mass energy')
16+
17+
parser.add_argument('--rapidity', default='cent', choices=['cent_eta', 'muon_eta'],
18+
help='Rapidity to select')
19+
20+
parser.add_argument('--process',default=None, choices=['kDiElectron', 'kDiMuon', 'kDiTau', 'kLightByLight', 'kAxionLike'],
21+
help='Process to switch on')
22+
23+
24+
parser.add_argument('--output', default='GenUpcgen.ini',
25+
help='Where to write the configuration')
26+
27+
28+
args = parser.parse_args()
29+
30+
if 'PbPb' in args.collType:
31+
pZ = 82
32+
pA = 208
33+
34+
if 'OO' in args.collType:
35+
pZ = 8
36+
pA = 16
37+
38+
### open output file
39+
fout = open(args.output, 'w')
40+
41+
### Generator
42+
fout.write('[GeneratorExternal] \n')
43+
fout.write('fileName = ${O2DPG_ROOT}/MC/config/PWGUD/external/generator/GeneratorUpcgen.C \n')
44+
fout.write('funcName = GeneratorUpcgen("%s", "%s", %f, %d, %d) \n' % (args.process,"../.",args.eCM,pZ,pA))
45+
46+
###Trigger
47+
fout.write('[TriggerExternal] \n')
48+
fout.write('fileName = ${O2DPG_ROOT}/MC/config/PWGUD/trigger/selectParticlesInAcceptance.C \n')
49+
if args.rapidity == 'cent_rap':
50+
fout.write('funcName = selectMotherPartInAcc(-0.9,0.9) \n')
51+
if args.rapidity == 'muon_rap':
52+
fout.write('funcName = selectMotherPartInAcc(-4.0,-2.5) \n')
53+
if args.rapidity == 'cent_eta':
54+
fout.write('funcName = selectDaughterPartInAcc(-0.95,0.95) \n')
55+
if args.rapidity == 'muon_eta':
56+
fout.write('funcName = selectDaughterPartInAcc(-4.05,-2.45) \n')
57+
58+
### close outout file
59+
fout.close()

MC/run/PWGUD/runUpcgenANCHOR.sh

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Run as: ${O2DPG_ROOT}/GRID/utils/grid_submit.sh --script ./runUpcgenANCHOR.sh --jobname SLtest --outputspec "*.log@disk=1","*.root@disk=2" --packagespec "VO_ALICE@O2sim::v20240626-1" --wait --fetch-output --asuser pbuhler --local
2+
3+
export ALIEN_JDL_LPMANCHORPASSNAME=apass2
4+
export ALIEN_JDL_MCANCHOR=apass2
5+
export ALIEN_JDL_COLLISIONSYSTEM=PbPb
6+
export ALIEN_JDL_CPULIMIT=8
7+
export ALIEN_JDL_LPMPASSNAME=apass2
8+
export ALIEN_JDL_LPMRUNNUMBER=544389
9+
export ALIEN_JDL_LPMPRODUCTIONTYPE=MC
10+
export ALIEN_JDL_LPMINTERACTIONTYPE=PbPb
11+
export ALIEN_JDL_LPMPRODUCTIONTAG=MyPass2Test
12+
export ALIEN_JDL_LPMANCHORRUN=544389
13+
export ALIEN_JDL_LPMANCHORPRODUCTION=LHC23zzi
14+
export ALIEN_JDL_LPMANCHORYEAR=2023
15+
16+
export NTIMEFRAMES=2
17+
export NSIGEVENTS=5
18+
export NBKGEVENTS=1
19+
export SPLITID=2
20+
export PRODSPLIT=100
21+
export CYCLE=0
22+
export ALIEN_PROC_ID=2963436952
23+
24+
25+
#export ALIEN_JDL_ANCHOR_SIM_OPTIONS="-gen external -ini ${PWD}/GenUpcgen.ini --embedding -nb ${NBKGEVENTS} -colBkg PbPb -genBkg pythia8 -procBkg heavy_ion"
26+
27+
${O2DPG_ROOT}/MC/config/PWGUD/ini/makeUpcgenConfig.py --process kDiTau --collType PbPb --eCM 5360 --rapidity cent_eta
28+
export ALIEN_JDL_ANCHOR_SIM_OPTIONS="-gen external -ini ${PWD}/GenUpcgen.ini"
29+
30+
${O2DPG_ROOT}/MC/run/ANCHOR/anchorMC.sh

0 commit comments

Comments
 (0)