ATLAS Offline Software
Loading...
Searching...
No Matches
AfterBurner_tf.py
Go to the documentation of this file.
1# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2#
3#! /usr/bin/env python
4
5"""
6Run event simulation and produce an EVNT file.
7"""
8
9import os, sys, time, shutil
10from PyJobTransforms.trfLogger import msg
11from PyJobTransforms.transform import transform
12from PyJobTransforms.trfExe import athenaExecutor
13from PyJobTransforms.trfArgs import addAthenaArguments
14from PyJobTransforms.trfDecorators import stdTrfExceptionHandler, sigUsrStackTrace
15from EvgenJobTransforms.evgenTrfArgs import addStdEvgenArgs
16
17
18
20ListOfDefaultPositionalKeys=['--AMI', '--AMITag', '--DBRelease', '--asetup', '--athena', '--athenaopts', '--autoConfiguration', '--beamType', '--checkEventCount', '--command', '--conditionsTag', '--ecmEnergy', '--eventAcceptanceEfficiency', '--evgenJobOpts', '--execOnly', '--firstEvent', '--geometryVersion', '--ignoreErrors', '--ignoreFilters', '--ignorePatterns', '--inputGenConfFile', '--inputGeneratorFile', '--jobConfig', '--maxEvents', '--omitFileValidation', '--outputEVNTFile', '--postExec', '--postInclude', '--preExec', '--preInclude', '--randomSeed', '--reportName', '--runNumber', '--showGraph', '--showPath', '--showSteps', '--skipEvents', '--uploadtoami', '--validation', '--outputTXTFile']
21
22
23class EvgenExecutor(athenaExecutor):
24 "Specialised trf executor class for event generation jobs"
25
26 def __init__(self, skeleton):
27 athenaExecutor.__init__(self, name="generate", skeletonFile=skeleton, substep="gen2evnt", tryDropAndReload=False, inData=["EVNT_Pre"], outData=["EVNT"])
28
29 def preExecute(self, input=set(), output=set()):
30 "Get input tarball, unpack and set up env if an evgenJobOpts arg was provided."
31
32
33 super(EvgenExecutor, self).preExecute(input, output)
34
35 def expand_if_archive(filename):
36 "Function to expand a file if it is a zip archive or tarball"
37 if ".tar" in filename:
38 import tarfile
39 tf = tarfile.open(filename)
40 tf.extractall()
41 tf.close()
42 elif filename.endswith(".zip"):
43 import zipfile
44 zf = zipfile.ZipFile(filename)
45 zf.extractall()
46 zf.close()
47
48 def get_immediate_subdirectories(a_dir):
49 return [name for name in os.listdir(a_dir)
50 if os.path.isdir(os.path.join(a_dir, name))]
51
52 def mk_jo_proxy(targetbasepath, pkgname, proxypath, addtosearch=True):
53 "Make a JO proxy dir such that the MCxxJobOptions/dddd dirs contents are found via include(MCxxJobOptions/yyyy)"
54 if proxypath:
55 if os.path.exists(proxypath):
56 shutil.rmtree(proxypath)
57 os.mkdir(proxypath)
58 os.environ['LOCAL_INSTALL_DIR'] = (os.environ['JOBOPTSEARCHPATH']).split(":")[0]
59 comdir = os.path.join(targetbasepath, "common")
60 subdirlist = get_immediate_subdirectories(comdir)
61 subdirlist1 = ['common/%s' % item for item in subdirlist]
62 dirlist = ['common','share','gencontrol','susycontrol']
63 for d in (dirlist+subdirlist1):
64 # TODO: we could _maybe_ add the appropriate share/DSIDxxxx/ dir to the path based on the jobConfig arg... too much magic?
65 if (d != 'common/.svn'):
66 dpath = os.path.join(proxypath, d)
67
68 if proxypath:
69 os.mkdir(dpath)
70 os.symlink(os.path.join(targetbasepath, d), os.path.join(dpath, pkgname))
71 if addtosearch:
72 os.environ["JOBOPTSEARCHPATH"] = dpath+":"+os.environ["JOBOPTSEARCHPATH"]
73 os.environ["DATAPATH"] =os.path.join(targetbasepath, d)+":"+os.environ["DATAPATH"]
74
75 os.environ["JOBOPTSEARCHPATH"] = os.environ['LOCAL_INSTALL_DIR']+":"+os.environ["JOBOPTSEARCHPATH"]
76
77
78
79 if "evgenJobOpts" in self._trf.argdict:
80 tarball = self._trf.argdict["evgenJobOpts"].value
81
83 if tarball.startswith("http"):
84 url = tarball
85 tarball = os.basename(tarball)
86 else:
87 url = "http://cern.ch/atlas-computing/links/kitsDirectory/EvgenJobOpts/" + tarball
88
89 if not os.path.exists(tarball):
90 from EvgenJobTransforms.download import downloadUsingProxy
91 status, output = downloadUsingProxy(url)
92 if status != 0:
93 raise EnvironmentError('Error downloading tarball %s. Downloader reports: %s' % (tarball, output))
94 msg.info('Evgen tarball download success: %s', output)
95
96 expand_if_archive(tarball)
97 mk_jo_proxy(os.getcwd(), "MC14JobOptions", "_joproxy14")
98 mk_jo_proxy(os.getcwd(), "MC15JobOptions", "_joproxy15")
99
105
106 else:
107 if os.path.exists("/cvmfs/atlas.cern.ch"):
108 # TODO: Make the package name configurable
109 mk_jo_proxy("/cvmfs/atlas.cern.ch/repo/sw/Generators/MC14JobOptions/latest/", "MC14JobOptions","_joproxy14")
110 mk_jo_proxy("/cvmfs/atlas.cern.ch/repo/sw/Generators/MC15JobOptions/latest/", "MC15JobOptions","_joproxy15")
111 msg.info("No evgenJobOpts tarball specified, using JOBOPTSEARCHPATH = '%s'", os.environ["JOBOPTSEARCHPATH"])
112 elif os.path.exists("/afs/cern.ch/atlas/groups/Generators"):
113 mk_jo_proxy("/afs/cern.ch/atlas/groups/Generators/MC14JobOptions/latest/", "MC14JobOptions","_joproxy14")
114 mk_jo_proxy("/afs/cern.ch/atlas/groups/Generators/MC15JobOptions/latest/", "MC15JobOptions","_joproxy15")
115 msg.info("No evgenJobOpts tarball specified, no cvmfs, using JOBOPTSEARCHPATH = '%s'", os.environ["JOBOPTSEARCHPATH"])
116
117
118 if "inputGeneratorFile" in self._trf.argdict:
119 expand_if_archive(self._trf.argdict["inputGeneratorFile"].value)
120 if "inputGenConfFile" in self._trf.argdict:
121 expand_if_archive(self._trf.argdict["inputGenConfFile"].value)
122
123
125 exeSet = set()
126 exeSet.add(EvgenExecutor("EvgenJobTransforms/skeleton.ABtoEVGEN.py"))
127 exeSet.add(athenaExecutor(name = "AODtoDPD", skeletonFile = "PATJobTransforms/skeleton.AODtoDPD_tf.py",
128 substep = "a2d", inData = ["EVNT"], outData = ["NTUP_TRUTH"], perfMonFile = "ntuple_AODtoDPD.pmon.gz"))
129 trf = transform(executor=exeSet)
130 addAthenaArguments(trf.parser)
131 addStdEvgenArgs(trf.parser)
132 return trf
133
134
135@stdTrfExceptionHandler
136@sigUsrStackTrace
137def main():
138 msg.info("This is %s", sys.argv[0])
139 trf = getTransform()
140 trf.parseCmdLineArgs(sys.argv[1:])
141 trf.execute()
142 trf.generateReport()
143 msg.info("%s stopped at %s, trf exit code %d", sys.argv[0], time.asctime(), trf.exitCode)
144 sys.exit(trf.exitCode)
145
146
147# TODO: Open resulting EVNT file to extract cross-section, generator names+versions, etc. from the HepMC::GenRun or whatever... in an executor postExecute?
148
149
150if __name__ == "__main__":
151 main()
preExecute(self, input=set(), output=set())
STL class.
std::vector< std::string > split(const std::string &s, const std::string &t=":")
Definition hcg.cxx:177
Main package for new style ATLAS job transforms.
Transform execution functions.
Logging configuration for ATLAS job transforms.