Skip to content

Commit 2da42d9

Browse files
authored
[MC] Scripts needed to run upcgen as external generator (#1811)
* Adding scripts which are required to use the event generator upcgen in O2 simulations.
1 parent 56e4fc3 commit 2da42d9

File tree

3 files changed

+264
-0
lines changed

3 files changed

+264
-0
lines changed
Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
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+
namespace eventgen {
10+
class GeneratorUPCgen_class : public Generator {
11+
public:
12+
GeneratorUPCgen_class() { mUPCgen = new UpcGenerator(); };
13+
~GeneratorUPCgen_class() = default;
14+
void selectConfiguration(std::string val) { mSelectedConfiguration = val; };
15+
void setLumiFileDirectory(std::string lumiFileDirectory) {
16+
mUPCgen->setLumiFileDirectory(lumiFileDirectory);
17+
};
18+
void setCollisionSystem(float energyCM, int beamZ, int beamA) {
19+
eCM = energyCM;
20+
projZ = beamZ;
21+
projA = beamA;
22+
};
23+
void setSeed(int seed) { mUPCgen->setSeed(seed); }
24+
25+
// predefined generator configurations
26+
const static int nProcess = 5;
27+
const static int nElements = 9;
28+
const struct UpcgenConfig {
29+
std::string pnames[nElements]{"PROC_ID", "LEP_A", "ALP_MASS",
30+
"ALP_WIDTH", "PT_MIN", "ETA_MIN",
31+
"ETA_MAX", "FLUX_POINT", "BREAKUP_MODE"};
32+
const struct definitions {
33+
const char *name;
34+
std::string elements[nElements];
35+
} sets[nProcess] = {
36+
{"kDiElectron",
37+
{"11", "0.0", "0.0", "0.0", "0.0", "-1.0", "1.0", "1", "1"}},
38+
{"kDiMuon",
39+
{"13", "0.0", "0.0", "0.0", "0.0", "-1.0", "1.0", "1", "1"}},
40+
{"kDiTau", {"15", "0.0", "0.0", "0.0", "0.0", "-1.0", "1.0", "1", "1"}},
41+
{"kLightByLight",
42+
{"22", "0.0", "0.0", "0.0", "0.0", "-1.0", "1.0", "1", "1"}},
43+
{"kAxionLike",
44+
{"51", "0.0", "0.0", "0.0", "0.0", "-1.0", "1.0", "1", "1"}}};
45+
} upcgenConfig;
46+
47+
bool Config() {
48+
// select a specific set of parameters
49+
int idx = -1;
50+
for (int i = 0; i < nProcess; ++i) {
51+
if (mSelectedConfiguration.compare(upcgenConfig.sets[i].name) == 0) {
52+
idx = i;
53+
break;
54+
}
55+
}
56+
57+
if (idx == -1) {
58+
std::cout << "UPCGEN process " << mSelectedConfiguration
59+
<< " is not supported" << std::endl;
60+
return false;
61+
}
62+
63+
// new generator
64+
mUPCgen->setDebugLevel(0);
65+
mUPCgen->setNumThreads(1);
66+
67+
// update generator parameters - configure
68+
mUPCgen->setParameterValue("DO_PT_CUT", "1");
69+
mUPCgen->setParameterValue("DO_ETA_CUT", "1");
70+
mUPCgen->setParameterValue("USE_ROOT_OUTPUT", "0");
71+
mUPCgen->setParameterValue("USE_HEPMC_OUTPUT", "0");
72+
73+
for (int i = 0; i < nElements; ++i) {
74+
mUPCgen->setParameterValue(upcgenConfig.pnames[i],
75+
upcgenConfig.sets[idx].elements[i]);
76+
}
77+
78+
return true;
79+
}
80+
81+
bool Init() override {
82+
Generator::Init();
83+
84+
// initialize the generator
85+
mUPCgen->init();
86+
87+
return true;
88+
};
89+
90+
bool generateEvent() override {
91+
if (!mUPCgen) {
92+
std::cout << "GenerateEvent: upcgen class/object not properly constructed"
93+
<< std::endl;
94+
return false;
95+
}
96+
97+
// generate a new event
98+
vector<int> pdgs;
99+
vector<int> statuses;
100+
vector<int> mothers;
101+
vector<TLorentzVector> particles;
102+
// events can be rejected due to applied cuts
103+
bool goon = true;
104+
while (goon) {
105+
auto stat = mUPCgen->generateEvent(pdgs, statuses, mothers, particles);
106+
if (stat == 0) {
107+
nRejected++;
108+
} else {
109+
nAccepted++;
110+
goon = false;
111+
}
112+
}
113+
114+
return true;
115+
};
116+
117+
bool importParticles() override {
118+
std::cout << "\n";
119+
auto upcgenParticles = mUPCgen->getParticles();
120+
for (auto part : upcgenParticles) {
121+
part.Print();
122+
TParticle particle(part.GetPdgCode(), 1, part.GetFirstMother(), -1,
123+
part.GetFirstDaughter(), part.GetLastDaughter(),
124+
part.Px(), part.Py(), part.Pz(), part.Energy(), 0., 0.,
125+
0., 0.);
126+
mParticles.push_back(particle);
127+
o2::mcutils::MCGenHelper::encodeParticleStatusAndTracking(
128+
mParticles.back(), true);
129+
}
130+
return true;
131+
};
132+
133+
long int acceptedEvents() { return nAccepted; }
134+
long int rejectedEvents() { return nRejected; }
135+
double fiducialXSection() {
136+
return mUPCgen->totNuclX() * nAccepted / (nAccepted + nRejected);
137+
}
138+
139+
private:
140+
UpcGenerator *mUPCgen = 0x0;
141+
std::string mSelectedConfiguration = "";
142+
143+
// keep track of the rejected and accepted events
144+
long int nAccepted{0};
145+
long int nRejected{0};
146+
147+
float eCM = 5020;
148+
int projZ = 82;
149+
int projA = 208;
150+
};
151+
152+
} // namespace eventgen
153+
} // namespace o2
154+
155+
FairGenerator *GeneratorUpcgen(std::string configuration = "kDiTau",
156+
std::string lumiFileDirectory = ".",
157+
float energyCM = 5020., int beamZ = 82,
158+
int beamA = 208) {
159+
// create generator
160+
auto gen = new o2::eventgen::GeneratorUPCgen_class();
161+
162+
// set generator parameters
163+
gen->selectConfiguration(configuration);
164+
gen->setLumiFileDirectory(lumiFileDirectory);
165+
gen->setCollisionSystem(energyCM, beamZ, beamA);
166+
167+
// configure the generator
168+
cout << "Upcgen is initialized ...";
169+
gen->Config();
170+
cout << " config done ...";
171+
gen->Init();
172+
cout << " init done!\n";
173+
174+
return gen;
175+
}
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)