ATLAS Offline Software
Loading...
Searching...
No Matches
jobDefinitions.py
Go to the documentation of this file.
1# Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
2
3import os,glob,shutil,re
4
5def mkGetOpenLoopsJob(options):
6 if not ("getOpenLoops" in options.performOnly or "all" in options.performOnly):
7 return None
8
9 if len(options.Sherpa_i.OpenLoopsLibs) == 0:
10 return None
11
12 # check availability of OL libs in /cvmfs and warn user
13 if not options.OLskipcvmfs:
14 olpath = str(os.environ['OPENLOOPSPATH'])
15 cvmfsInstalledOpenLoopsLibs = glob.glob(olpath + "/proclib/*.so")
16 if not any(not any(x in fil for fil in cvmfsInstalledOpenLoopsLibs) for x in options.Sherpa_i.OpenLoopsLibs):
17 print("You requested the inclusion of OpenLoops libs in the tarball (genSeq.Sherpa_i.OpenLoopsLibs), but all of them are available centrally in /cvmfs. Will continue without including them in the tarball, and you can remove the genSeq.Sherpa_i.OpenLoopsLibs line from your JO.")
18 return None
19
20 # alternatively check wether all needed openLoops libaries are installed
21 installedOpenLoopsLibs = glob.glob("Process/OpenLoops/proclib/*.so")
22 #each string in openLoopsLibs has to be part of one string in installedOpenLoopsLibs
23 if len(options.Sherpa_i.OpenLoopsLibs) == len(installedOpenLoopsLibs) and not any(not any(x in fil for fil in installedOpenLoopsLibs) for x in options.Sherpa_i.OpenLoopsLibs):
24 return None
25
26 #delete openloops folder if it exists
27 if os.path.exists("Process/OpenLoops"):
28 shutil.rmtree("Process/OpenLoops")
29
30 job = options.batchSystemModule.batchJob("0.getOpenLoops", hours=2, nCores=options.ncoresScons, mounts=options.mounts, account=options.account, queue=options.queue, memMB=1, basedir=options.jobOptionDir[0])
31
32 job.cmds += ["source $AtlasSetup/scripts/asetup.sh "+options.athenaVersion]
33 job.cmds += ["set -e"]
34
35 olbranch = options.OLbranch if options.OLbranch is not None else ('OpenLoops-'+os.environ['OPENLOOPSVER'])
36 job.cmds += ["git clone -b "+olbranch+" https://gitlab.com/openloops/OpenLoops.git"]
37
38 job.cmds += ["cd OpenLoops"]
39 job.cmds += ["./scons num_jobs="+str(options.ncoresScons)]
40 job.cmds += ["./openloops libinstall process_repositories="+options.OLprocessrepos+" num_jobs="+str(options.ncoresScons)+" "+' '.join(options.Sherpa_i.OpenLoopsLibs)]
41 job.cmds += ["cd .."]
42
43 job.cmds += ["rm -rf Process/OpenLoops"]
44 job.cmds += ["mkdir -p Process/OpenLoops"]
45 job.cmds += ["mv OpenLoops/proclib OpenLoops/lib Process/OpenLoops/"]
46 job.cmds += ["rm -rf OpenLoops"]
47
48 job.write()
49 job.submit(dryRun=options.dryRun)
50 return job
51
52
53def mkCreateLibsJob(options, prevJob):
54 if not ("createLibs" in options.performOnly or "all" in options.performOnly):
55 return None
56
57 procName = "Process/*.db" if os.environ["SHERPAVER"].startswith('2.') else "Process/*.zip"
58 if len(glob.glob(procName)) > 0:
59 return None
60
61 job = options.batchSystemModule.batchJob("1.createLibs", hours=48, nCores=1, mounts=options.mounts, account=options.account, queue=options.queue, memMB=options.createLibsRAM, basedir=options.jobOptionDir[0])
62
63 if prevJob:
64 job.dependsOnOk.append(prevJob.id)
65
66 job.cmds += ["source $AtlasSetup/scripts/asetup.sh "+options.athenaVersion]
67 job.cmds += ["set -e"]
68
69 if os.environ["SHERPAVER"].startswith('2.'):
70 job.cmds += ["rm -rf Process/Amegic.db Process/Comix.db Process/Sherpa.db Process/Amegic"]
71 job.cmds += ["echo 'genSeq.Sherpa_i.Parameters += [ \"INIT_ONLY=1\", \"EVENTS=0\", \"FRAGMENTATION=Off\", \"MI_HANDLER=None\", \"LOG_FILE=\"]\n' > events.py"]
72 else:
73 job.cmds += ["rm -rf Process/Amegic.zip Process/Comix.zip Process/Sherpa.zip Process/Amegic"]
74 job.cmds += ["echo 'genSeq.Sherpa_i.BaseFragment += \"\"\"\nINIT_ONLY: 1\nEVENTS: 0\nFRAGMENTATION: Off\nMI_HANDLER: None\n\"\"\"' > events.py"]
75
76 job.cmds += ["outputEVNTFile=$(mktemp -u /tmp/XXXXXXXX.pool.root)"]
77 job.cmds += ["returncode=0"]
78 job.cmds += ["Gen_tf.py --ecmEnergy="+str(options.ecm[0]*1000.)+" --maxEvents=1 --firstEvent=1 --randomSeed=10 --jobConfig="+options.jobOptionDir[0]+" --postInclude=events.py --outputEVNTFile=${outputEVNTFile} || returncode=$?"]
79 job.cmds += ["echo Pasting log.generate ==============="]
80 job.cmds += ["cat log.generate"]
81 job.cmds += ["echo Gen_tf exited with return code $returncode"]
82 job.cmds += ["if [ $returncode -eq 251 ]; then"]
83 job.cmds += [" echo 'ERROR: OpenLoops-libary is missing: add missing OpenLoops-libary (see http://openloops.hepforge.org/process_library.php) to variable genSeq.Sherpa_i.OpenLoopsLibs in the jobOption-file, remove Process directory and start again'"]
84 job.cmds += [" exit 1"]
85 job.cmds += ["fi"]
86 job.cmds += ["if [ $returncode -eq 65 ]; then"]
87 job.cmds += [" if grep -q 'Sherpa: Sherpa::InitializeTheRun throws normal exit' log.generate || grep -q 'ERROR Have to compile Amegic libraries' log.generate; then"]
88 job.cmds += [" echo 'Libraries successfully written out. (Ignore errors above.)'"]
89 job.cmds += [" elif grep -q 'INFO Have to compile Amegic libraries' log.generate; then"]
90 job.cmds += [" echo 'Libraries successfully written out with <=2.2.1. (Ignore errors above.)'"]
91 job.cmds += [" else"]
92 job.cmds += [" echo 'ERROR: Gen_tf.py has failed in an unexpected way. This likely means your job options are incorrect. This log file will have more details.'"]
93 job.cmds += [" exit 1"]
94 job.cmds += [" fi"]
95 job.cmds += ["fi"]
96 job.cmds += ["if [ $returncode -ne 0 -a $returncode -ne 251 -a $returncode -ne 65 ]; then"]
97 job.cmds += [" echo 'ERROR: unexpexted error from Gen_tf'"]
98 job.cmds += [" exit 1"]
99 job.cmds += ["fi"]
100
101 job.cmds += ["rm -rf ${outputEVNTFile} _joproxy* AtRndmGenSvc.out AthenaSummary_Generate.txt Generate_messageSvc_jobOptions.py Generate_runathena PoolFileCatalog.xml PoolFileCatalog.xml.BAK TransformTimer_Generate.pickle config.pickle dmesg_trf.txt hostnamelookup.tmp inputDictionary.pickle jobInfo.xml jobInfo_Generate.xml jobReport* last.Generate last.runargs.gpickle runargs.Generate.gpickle runargs.Generate.py metadata_Generate.xml metadata.xml Sherpa_References.tex ntuple.pmon.stream setupevprod.sh share ntuple.pmon.gz testHepMC.root events.py Bdecays0.dat Bs2Jpsiphi.DEC DECAY.DEC G4particle_acceptlist.txt PDGTABLE.MeV pdt.table runargs.generate.py runwrapper.generate.sh eventLoopHeartBeat.txt susyParticlePdgid.txt TestHepMC.root log.generate mem.full.generate mem.summary.generate.json env.txt Run.dat Sherpa.yaml"]
102
103 job.write()
104 job.submit(dryRun=options.dryRun)
105 return job
106
107
108def mkMakelibsJob(options, prevJob):
109 if not ("makelibs" in options.performOnly or "all" in options.performOnly):
110 return None
111
112 if os.path.exists("Process/Amegic/lib"):
113 return None
114
115 job = options.batchSystemModule.batchJob("2.makelibs", hours=48, nCores=options.ncoresMakelibs, mounts=options.mounts, account=options.account, queue=options.queue, memMB=1, basedir=options.jobOptionDir[0])
116
117 if prevJob:
118 job.dependsOnOk.append(prevJob.id)
119
120 job.cmds += ["if ! test -f makelibs; then echo INFO: No makelibs file found; exit 0; fi"]
121
122 job.cmds += ["source $AtlasSetup/scripts/asetup.sh "+options.athenaVersion]
123
124
125 job.cmds += ["wget http://prdownloads.sourceforge.net/scons/scons-local-3.1.2.tar.gz"]
126 job.cmds += ["tar xzf scons-local-*.tar.gz"]
127 job.cmds += ["ln -s scons.py scons"]
128 job.cmds += ["export PATH=$PATH:$PWD"]
129
130 job.cmds += ["set -e"]
131 job.cmds += ["./makelibs -j"+str(options.ncoresMakelibs)]
132 job.cmds += ["rm -rf Process/Amegic/P2_*"]
133
134 job.cmds += ["rm -rf scons*"]
135
136 job.write()
137 job.submit(dryRun=options.dryRun)
138 return job
139
140
141def mkIntegrateJob(options, ecm, prevJob):
142 ecmfolder = "ecm"+('{0:g}'.format(ecm)).replace(".","p")+"TeV"
143
144 if not ("integrate" in options.performOnly or "all" in options.performOnly):
145 return None
146
147 resname = "Results.db" if os.environ["SHERPAVER"].startswith('2.') else "Results.zip"
148 if os.path.isfile(ecmfolder+"/"+resname) and os.path.isfile(ecmfolder+"/3.integrate.log"):
149 return None
150
151 # calculate integration time
152 targetHours = 24
153 targetCores = options.Sherpa_i.NCores
154 if options.maxCores < options.Sherpa_i.NCores:
155 targetHours = int(round(24.*options.Sherpa_i.NCores/options.maxCores))
156 targetCores = options.maxCores
157
158 if options.RAM > 100:
159 options.Sherpa_i.MemoryMB = options.RAM
160 job = options.batchSystemModule.batchJob("3.integrate", hours=targetHours, nCores=targetCores, mounts=options.mounts, account=options.account, queue=options.queue, memMB=options.Sherpa_i.MemoryMB, basedir=options.jobOptionDir[0]+"/"+ecmfolder)
161
162 if prevJob:
163 job.dependsOnOk.append(prevJob.id)
164
165 job.cmds += ["source $AtlasSetup/scripts/asetup.sh "+options.athenaVersion]
166 job.cmds += ["set -e"]
167
168 if os.environ["SHERPAVER"].startswith('3.'):
169 # write base fragment into Base.yaml
170 job.cmds += ["cat > Base.yaml <<EOL"]
171 job.cmds += [options.Sherpa_i.BaseFragment]
172 job.cmds += ["EOL"]
173 # disable ATLAS RNG as integration job runs outside Athena
174 job.cmds += [r"sed '/.*EXTERNAL_RNG.*/d' -i Base.yaml"]
175 #write rundata into Run.dat/Sherpa.yaml file for integration
176 configname = "Run.dat" if os.environ["SHERPAVER"].startswith('2.') else "Sherpa.yaml"
177 job.cmds += ["cat > "+configname+" <<EOL"]
178 job.cmds += [options.Sherpa_i.RunCard]
179 job.cmds += ["EOL"]
180 #append infos in options
181 ecmopt = ["BEAM_ENERGY_1="+str(ecm/2.*1000), "BEAM_ENERGY_2="+str(ecm/2.*1000)] \
182 if os.environ["SHERPAVER"].startswith('2.') else ["BEAM_ENERGIES: "+str(ecm/2.*1000)]
183 ignoreopt = ["RUNDATA","LOG_FILE","NNPDF_GRID_PATH","RESULT_DIRECTORY"]
184 totopt = options.Sherpa_i.Parameters + ecmopt
185 if options.Sherpa_i.PluginCode != "":
186 if os.environ["SHERPAVER"].startswith('2.'):
187 totopt.append("SHERPA_LDADD=Sherpa_iPlugin")
188 else:
189 totopt.append("SHERPA_LDADD: Sherpa_iPlugin")
190 for s in totopt:
191 if not (re.split(r'\W',s)[0] in ignoreopt):
192 if os.environ["SHERPAVER"].startswith('2.'):
193 job.cmds += [r"sed '/.*\}(run).*/i\ \ "+s+"' -i Run.dat"]
194 else:
195 job.cmds += [r"sed '/.*PROCESSES:.*/i"+s+"\\n' -i Sherpa.yaml"]
196
197 olpath = str(os.environ['OPENLOOPSPATH'])
198 lcglayer = olpath[olpath.find("LCG_"):olpath.find("/MCGenerators")]
199 sftlayer = "/cvmfs/sft.cern.ch/lcg/releases/" + lcglayer
200 lcgbase = "_".join(lcglayer.split('_')[:2]) # without postfix
201 sftbase = "/cvmfs/sft.cern.ch/lcg/releases/" + lcgbase
202
203 if not options.sherpaInstallPath:
204 options.sherpaInstallPath = sftlayer+"/MCGenerators/sherpa/${SHERPAVER}.openmpi3/${LCG_PLATFORM}"
205
206
207 LCG_PLATFORM = str(os.environ['LCG_PLATFORM'])
208
209 openmpi_path = ":".join(glob.glob(sftbase+"/openmpi/*/"+LCG_PLATFORM+"/bin"))
210 opal_prefix = ":".join(glob.glob(sftbase+"/openmpi/*/"+LCG_PLATFORM))
211 ld_library_path = ":".join(glob.glob(sftbase+"/openmpi/*/"+LCG_PLATFORM+"/lib"))
212 gccpath = str(os.environ['COMPILER_PATH'])
213
214 job.cmds += ["source "+gccpath+"/setup.sh" ]
215 job.cmds += ["export PATH="+openmpi_path+":$PATH"]
216 job.cmds += ["export LHAPATH=/cvmfs/sft.cern.ch/lcg/external/lhapdfsets/current:/cvmfs/atlas.cern.ch/repo/sw/Generators/lhapdfsets/current/"]
217 job.cmds += ["export OPAL_PREFIX="+opal_prefix]
218 job.cmds += ["export LD_LIBRARY_PATH="+ld_library_path+":" \
219 +sftbase+"/zlib/*/${LCG_PLATFORM}/lib:" \
220 +sftbase+"/sqlite/*/${LCG_PLATFORM}/lib:" \
221 +sftbase+"/HepMC/*/${LCG_PLATFORM}/lib:" \
222 +sftlayer+"/MCGenerators/lhapdf/*/${LCG_PLATFORM}/lib:" \
223 +sftlayer+"/fastjet/*/${LCG_PLATFORM}/lib:" \
224 +olpath+"/lib:"+olpath+"/proclib:" \
225 +options.sherpaInstallPath+"/lib64/SHERPA-MC:" \
226 +options.sherpaInstallPath+"/lib/SHERPA-MC:$LD_LIBRARY_PATH"]
227
228 cmdLineOpts = "EVENTS=0 FRAGMENTATION=Off MI_HANDLER=None"
229 if os.environ["SHERPAVER"].startswith('2.'):
230 cmdLineOpts += " BEAM_ENERGY_1="+str(ecm/2.*1000)+" BEAM_ENERGY_2="+str(ecm/2.*1000)
231 else:
232 cmdLineOpts += " \"RUNDATA: [Base.yaml, Sherpa.yaml]\" BEAM_ENERGIES="+str(ecm/2.*1000)
233 job.cmds += ["mpirun -n {0} ".format(str(targetCores))+options.sherpaInstallPath+"/bin/Sherpa "+cmdLineOpts]
234
235 job.write(extraDirs=[options.jobOptionDir[0]])
236 job.submit(dryRun=options.dryRun)
237 return job
238
239
240
241def mkTarballmakerJob(options, ecm, prevJob):
242 if not ("makeTarball" in options.performOnly or "all" in options.performOnly):
243 return None
244
245 physicsShort = options.mainJOfile.split(".")[1]
246 ecmstring = ('{0:g}'.format(ecm)).replace(".","p")+"TeV"
247 ecmfolder = "ecm"+ecmstring
248 tarballname = "mc_"+ecmstring+"."+physicsShort+".GRID.tar.gz"
249
250 job = options.batchSystemModule.batchJob("4.makeTarball", hours=1, nCores=1, mounts=options.mounts, account=options.account, queue=options.queue, memMB=1, basedir=options.jobOptionDir[0]+"/"+ecmfolder)
251 job.cmds += ["set -e"]
252
253 if prevJob:
254 job.dependsOnOk.append(prevJob.id)
255
256 resname = "Results.db" if os.environ["SHERPAVER"].startswith('2.') else "Results.zip"
257 job.cmds += ["tar czhf "+options.jobOptionDir[0]+"/"+tarballname+" $(ls -d "+resname+" Process 3.integrate.log 2>/dev/null) "+" ".join(options.Sherpa_i.ExtraFiles)]
258 for jodir in options.jobOptionDir[1:]:
259 job.cmds += ["ln -s "+options.jobOptionDir[0]+"/"+tarballname+" "+jodir]
260
261 job.write(useSingularity=False, extraDirs=options.jobOptionDir)
262 job.submit(dryRun=options.dryRun)
263 return job
264
265
266
267
268def mkEvntGenTestJob(options, ecm, jodir, prevJob):
269 if not ("evgen" in options.performOnly or "all" in options.performOnly):
270 return None
271
272 ecmstring = ('{0:g}'.format(ecm)).replace(".","p")+"TeV"
273 ecmfolder = "ecm"+ecmstring
274
275 job = options.batchSystemModule.batchJob("5.EvntGenTest", hours=24, nCores=1, mounts=options.mounts, account=options.account, queue=options.queue, memMB=1, basedir=jodir+"/"+ecmfolder)
276
277 if prevJob:
278 job.dependsOnOk.append(prevJob.id)
279
280 job.cmds += ["source $AtlasSetup/scripts/asetup.sh "+options.athenaVersion]
281 job.cmds += ["set -e"]
282
283 job.cmds += ["rm -rf 5.EvntGenTest"]
284 job.cmds += ["mkdir 5.EvntGenTest"]
285 job.cmds += ["cd 5.EvntGenTest"]
286 if os.environ["SHERPAVER"].startswith('2.'):
287 job.cmds += ["echo 'genSeq.Sherpa_i.Parameters += [ \"LOG_FILE=\" ]' > events.py"]
288 job.cmds += ["outputEVNTFile=$(mktemp -u /tmp/XXXXXXXX.pool.root)"]
289 if os.environ["SHERPAVER"].startswith('2.'):
290 job.cmds += ["Gen_tf.py --ecmEnergy="+str(ecm*1000.)+" --maxEvents=1 --firstEvent=1 --randomSeed=10 --jobConfig="+jodir+" --postInclude=events.py --outputEVNTFile=${outputEVNTFile} --maxEvents="+str(options.nEvts)]
291 else:
292 job.cmds += ["Gen_tf.py --ecmEnergy="+str(ecm*1000.)+" --maxEvents=1 --firstEvent=1 --randomSeed=10 --jobConfig="+jodir+" --outputEVNTFile=${outputEVNTFile} --maxEvents="+str(options.nEvts)]
293 job.cmds += ["cat log.generate"]
294
295
296 job.cmds += ["post_ini_time=$(grep snapshot_post_ini log.generate | awk '{ print $5}')"]
297 job.cmds += ["post_lastevt_time=$(grep snapshot_post_lastevt log.generate | awk '{ print $5}')"]
298 job.cmds += ["nPer12h=$(awk -v a=\"$post_lastevt_time\" -v b=\"$post_ini_time\" 'BEGIN { printf \"%.0f\", "
299 +str(options.nEvts)+"*12*60*60*1000/(a-b) }' </dev/null)"]
300 job.cmds += ["finalEventsPerJob=0"]
301 job.cmds += ["for i in 1 2 5 10 20 50 100 200 500 1000 2000 5000 10000; do if test $nPer12h -gt $i; then finalEventsPerJob=$i; fi; done"]
302 job.cmds += ["echo \"Possible number of events per 12h: ${nPer12h} -> ${finalEventsPerJob} \""]
303 job.cmds += ["if grep -q evgenConfig.nEventsPerJob "+jodir+"/mc.*.py; then"]
304 job.cmds += [r' sed -e "s/evgenConfig.nEventsPerJob.*=.*\‍([0-9]*\‍)/evgenConfig.nEventsPerJob = ${finalEventsPerJob}/g" -i '+jodir+"/mc.*.py"]
305 job.cmds += ["else"]
306 job.cmds += [" echo \"evgenConfig.nEventsPerJob = ${finalEventsPerJob}\" >> "+jodir+"/mc.*.py"]
307 job.cmds += ["fi"]
308
309 # cp log.generate to DSID dir such that commit script can run on it
310 job.cmds += ["cp log.generate ../../"]
311
312 job.cmds += ["cd .."]
313 job.cmds += ["rm -rf 5.EvntGenTest"]
314
315 job.write(extraDirs=[jodir])
316 job.submit(dryRun=options.dryRun)
317 return job
void print(char *figname, TCanvas *c1)
std::string replace(std::string s, const std::string &s2, const std::string &s3)
Definition hcg.cxx:310
mkIntegrateJob(options, ecm, prevJob)
mkTarballmakerJob(options, ecm, prevJob)
mkEvntGenTestJob(options, ecm, jodir, prevJob)