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