diff --git a/Generators/EvgenJobTransforms/python/EvgenConfig.py b/Generators/EvgenJobTransforms/python/EvgenConfig.py index b2c9bb6dcb0768ed161d74dd094f4f9a2ec8d472..e891d6050d9f0402c371cd5e4056385461e1dffd 100644 --- a/Generators/EvgenJobTransforms/python/EvgenConfig.py +++ b/Generators/EvgenJobTransforms/python/EvgenConfig.py @@ -6,7 +6,7 @@ lhefGenerators = ["Lhef", # generic name: prefer to use the names below "aMcAtNlo", "McAtNlo", "Powheg", "PowHel", "MadGraph", "CompHep", "CalcHep", "Whizard", "MCFM", "JHU", "MEtop", "Charybdis", "Charybdis2", - "BlackMax", "QBH", "gg2ww", "gg2zz", "gg2vv", "HvyN", "VBFNLO", "FPMC"] + "BlackMax", "QBH", "gg2ww", "gg2zz", "gg2vv", "HvyN", "VBFNLO", "FPMC", "ProtosLHEF"] ## A more general list of generators which provide partonic input, including non-LHEF ones inputGenerators = lhefGenerators + ["Alpgen", "Protos"] @@ -21,7 +21,7 @@ mainGenerators += ["Pythia8", "Pythia8B"] ## Sherpa family mainGenerators += ["Sherpa"] ## Soft QCD generators -mainGenerators += ["Exhume", "Phojet", "Epos"] +mainGenerators += ["Exhume", "Phojet", "Epos", "QGSJet"] ## ATLAS-specific generators mainGenerators += ["ParticleGenerator", "ParticleGun"] mainGenerators += ["CosmicGenerator", "BeamHaloGenerator"] @@ -47,6 +47,13 @@ notesthepmcGenerators = ["ParticleDecayer", "ParticleGun", "CosmicGenerator", "B notuneGenerators = ["ParticleGenerator", "ParticleGun", "CosmicGenerator", "BeamHaloGenerator", "HepMCAscii"] +def gen_require_steering(gennames): + "Return a boolean of whether this set of generators requires the steering command line flag" + if not "EvtGen" in gennames: return False + if any(("Pythia" in gen and not "Pythia8" in gen) for gen in gennames): return True + if any(("Herwig" in gen and not "Herwigpp" in gen) for gen in gennames): return True + return False + def gen_known(genname): "Return whether a generator name is known" return genname in knownGenerators diff --git a/Generators/EvgenJobTransforms/scripts/Generate_tf.py b/Generators/EvgenJobTransforms/scripts/Generate_tf.py index 0fa10886208c4a55ef9627531a3fca71ad1aa133..4d04bc26a3d03e26318543ac06d540f0760b6651 100755 --- a/Generators/EvgenJobTransforms/scripts/Generate_tf.py +++ b/Generators/EvgenJobTransforms/scripts/Generate_tf.py @@ -109,7 +109,7 @@ class EvgenExecutor(athenaExecutor): expand_if_archive(tarball) if "MC14" in str(joparam): mk_jo_proxy(os.getcwd(), "MC14JobOptions", "_joproxy14") - if "MC15" in str(joparam): + else : mk_jo_proxy(os.getcwd(), "MC15JobOptions", "_joproxy15") ## Source setup script (requires some shenanigans to update the Python env robustly) # TODO: trf framework now bans use of exec()... @@ -123,13 +123,14 @@ class EvgenExecutor(athenaExecutor): # TODO: Make the package name configurable if "MC14" in str(joparam): mk_jo_proxy("/cvmfs/atlas.cern.ch/repo/sw/Generators/MC14JobOptions/latest/", "MC14JobOptions","_joproxy14") - if "MC15" in str(joparam): +# if "MC15" in str(joparam): + else : mk_jo_proxy("/cvmfs/atlas.cern.ch/repo/sw/Generators/MC15JobOptions/latest/", "MC15JobOptions","_joproxy15") msg.info("No evgenJobOpts tarball specified, using JOBOPTSEARCHPATH = '%s'" % os.environ["JOBOPTSEARCHPATH"]) elif os.path.exists("/afs/cern.ch/atlas/groups/Generators"): if "MC14" in str(joparam): mk_jo_proxy("/afs/cern.ch/atlas/groups/Generators/MC14JobOptions/latest/", "MC14JobOptions","_joproxy14") - if "MC15" in str(joparam): + else : mk_jo_proxy("/afs/cern.ch/atlas/groups/Generators/MC15JobOptions/latest/", "MC15JobOptions","_joproxy15") msg.info("No evgenJobOpts tarball specified, no cvmfs, using JOBOPTSEARCHPATH = '%s'" % os.environ["JOBOPTSEARCHPATH"]) diff --git a/Generators/EvgenJobTransforms/share/Generate_ecmenergies.py b/Generators/EvgenJobTransforms/share/Generate_ecmenergies.py index 028499a0b083892b57943a14f059776a658b9d0a..ab0ec39c3e48768dd1759a87557bb9d29e5c31ce 100644 --- a/Generators/EvgenJobTransforms/share/Generate_ecmenergies.py +++ b/Generators/EvgenJobTransforms/share/Generate_ecmenergies.py @@ -36,5 +36,8 @@ elif 'Sherpa' in evgenConfig.generators: elif 'Epos' in evgenConfig.generators: genSeq.Epos.BeamMomentum = -eBeam genSeq.Epos.TargetMomentum = eBeam +elif 'QGSJet' in evgenConfig.generators: + genSeq.QGSJet.BeamMomentum = -eBeam + genSeq.QGSJet.TargetMomentum = eBeam del eCM, eBeam diff --git a/Generators/EvgenJobTransforms/share/Generate_randomseeds.py b/Generators/EvgenJobTransforms/share/Generate_randomseeds.py index 20c1b4f26cf954ee9129d1ce7fc475cb8fae8850..236b38f6f8b46bd7d7ec83db073a18d379e8f3d7 100644 --- a/Generators/EvgenJobTransforms/share/Generate_randomseeds.py +++ b/Generators/EvgenJobTransforms/share/Generate_randomseeds.py @@ -24,6 +24,7 @@ genseeds = { 'Isajet' : ["ISAJET OFFSET {rnd} 1857585203 {rnd}", "ISAJET_INIT 820021 2347532"], 'Phojet' : ["PHOJET OFFSET {rnd} 174947321 {rnd}", "PHOJET_INIT 820021 2347532"], 'Epos' : ["EPOS OFFSET {rnd} {rnd} 31122001", "EPOS_INIT OFFSET {rnd} 820021 2347532"], + 'QGSJet' : ["QGSJet OFFSET {rnd} {rnd} 51122005", "QGSJET_INIT OFFSET {rnd} 820021 2347532"], 'ParticleGun' : ["ParticleGun {rnd} {rnd}"], 'ParticleGenerator' : ["SINGLE LUXURY 2 OFFSET 12345 {rnd} {rnd}"], 'ParticleDecayer' : ["ParticleDecayer LUXURY 2 OFFSET 54321 {rnd} {rnd}"], diff --git a/Generators/EvgenJobTransforms/share/skeleton.ABtoEVGEN.py b/Generators/EvgenJobTransforms/share/skeleton.ABtoEVGEN.py index 2d5ec7b2c334a7dd04ff2bb32b1642a0fb35e9b2..58003da0060be83b8d03f00db090786c79690af8 100644 --- a/Generators/EvgenJobTransforms/share/skeleton.ABtoEVGEN.py +++ b/Generators/EvgenJobTransforms/share/skeleton.ABtoEVGEN.py @@ -406,6 +406,8 @@ elif "Alpgen" in evgenConfig.generators: datFile = "inparmAlpGen.dat" elif "Protos" in evgenConfig.generators: datFile = "protos.dat" +elif "ProtosLHEF" in evgenConfig.generators: + datFile = "protoslhef.dat" elif "AcerMC" in evgenConfig.generators: datFile = "inparmAcerMC.dat" elif "CompHep" in evgenConfig.generators: @@ -439,32 +441,32 @@ def mk_symlink(srcfile, dstfile): evgenLog.debug("Symlinking: %s is already the same as %s" % (dstfile, srcfile)) ## Find and symlink dat and event files, so they are available via the name expected by the generator -if eventsFile or datFile: - if not hasattr(runArgs, "inputGeneratorFile") or runArgs.inputGeneratorFile == "NONE": - raise RuntimeError("%s needs input file (argument inputGeneratorFile)" % runArgs.jobConfig) - if evgenConfig.inputfilecheck and not re.search(evgenConfig.inputfilecheck, runArgs.inputGeneratorFile): - raise RuntimeError("inputGeneratorFile=%s is incompatible with inputfilecheck '%s' in %s" % - (runArgs.inputGeneratorFile, evgenConfig.inputfilecheck, runArgs.jobConfig)) - inputroot = os.path.basename(runArgs.inputGeneratorFile).split("._")[0] - if datFile: - realDatFile = find_unique_file('*%s*.dat' % inputroot) - mk_symlink(realDatFile, datFile) - if eventsFile: - realEventsFile = find_unique_file('*%s.*.ev*ts' % inputroot) - mk_symlink(realEventsFile, eventsFile) -else: - if hasattr(runArgs, "inputGeneratorFile") and runArgs.inputGeneratorFile != "NONE": - raise RuntimeError("inputGeneratorFile arg specified for %s, but generators %s do not require an input file" % - (runArgs.jobConfig, str(gennames))) - if evgenConfig.inputfilecheck: - raise RuntimeError("evgenConfig.inputfilecheck specified in %s, but generators %s do not require an input file" % - (runArgs.jobConfig, str(gennames))) +#if eventsFile or datFile: +# if not hasattr(runArgs, "inputGeneratorFile") or runArgs.inputGeneratorFile == "NONE": +# raise RuntimeError("%s needs input file (argument inputGeneratorFile)" % runArgs.jobConfig) +# if evgenConfig.inputfilecheck and not re.search(evgenConfig.inputfilecheck, runArgs.inputGeneratorFile): +# raise RuntimeError("inputGeneratorFile=%s is incompatible with inputfilecheck '%s' in %s" % +# (runArgs.inputGeneratorFile, evgenConfig.inputfilecheck, runArgs.jobConfig)) +# inputroot = os.path.basename(runArgs.inputGeneratorFile).split("._")[0] +# if datFile: +# realDatFile = find_unique_file('*%s*.dat' % inputroot) +# mk_symlink(realDatFile, datFile) +# if eventsFile: +# realEventsFile = find_unique_file('*%s.*.ev*ts' % inputroot) +# mk_symlink(realEventsFile, eventsFile) +#else: +# if hasattr(runArgs, "inputGeneratorFile") and runArgs.inputGeneratorFile != "NONE": +# raise RuntimeError("inputGeneratorFile arg specified for %s, but generators %s do not require an input file" % +# (runArgs.jobConfig, str(gennames))) +# if evgenConfig.inputfilecheck: +# raise RuntimeError("evgenConfig.inputfilecheck specified in %s, but generators %s do not require an input file" % +# (runArgs.jobConfig, str(gennames))) ## Check conf files, as above but for a different command line arg, and with omission allowed -if hasattr(runArgs, "inputGenConfFile") and runArgs.inputGenConfFile != "NONE": - if evgenConfig.inputconfcheck and not re.search(evgenConfig.inputconfcheck, runArgs.inputGenConfFile): - raise RuntimeError("inputGenConfFile=%s is incompatible with inputconfcheck (%s) in %s" % - (runArgs.inputGenConfFile, evgenConfig.inputconfcheck, runArgs.jobConfig)) +#if hasattr(runArgs, "inputGenConfFile") and runArgs.inputGenConfFile != "NONE": +# if evgenConfig.inputconfcheck and not re.search(evgenConfig.inputconfcheck, runArgs.inputGenConfFile): +# raise RuntimeError("inputGenConfFile=%s is incompatible with inputconfcheck (%s) in %s" % +# (runArgs.inputGenConfFile, evgenConfig.inputconfcheck, runArgs.jobConfig)) ## Do the aux-file copying if evgenConfig.auxfiles: diff --git a/Generators/EvgenJobTransforms/share/skeleton.GENtoEVGEN.py b/Generators/EvgenJobTransforms/share/skeleton.GENtoEVGEN.py index c6c8aef9a8bc96c3e9be0ca62b76662307692f40..76eb7052772475ce8a6b20ef9e6af61d997a21c2 100644 --- a/Generators/EvgenJobTransforms/share/skeleton.GENtoEVGEN.py +++ b/Generators/EvgenJobTransforms/share/skeleton.GENtoEVGEN.py @@ -95,7 +95,7 @@ evgenLog.debug("****************** CONFIGURING EVENT GENERATION **************** ## Functions for operating on generator names ## NOTE: evgenConfig, topSeq, svcMgr, theApp, etc. should NOT be explicitly re-imported in JOs from EvgenJobTransforms.EvgenConfig import evgenConfig -from EvgenJobTransforms.EvgenConfig import gens_known, gens_lhef, gen_sortkey, gens_testhepmc, gens_notune +from EvgenJobTransforms.EvgenConfig import gens_known, gens_lhef, gen_sortkey, gens_testhepmc, gens_notune, gen_require_steering ## Fix non-standard event features from EvgenProdTools.EvgenProdToolsConf import FixHepMC @@ -244,14 +244,21 @@ gennames = sorted(evgenConfig.generators, key=gen_sortkey) ## Check that the actual generators, tune, and main PDF are consistent with the JO name if joparts[0].startswith("MC"): #< if this is an "official" JO genpart = jo_physshortparts[0] +# genpart = genpart.replace("Py8", "Pythia8").replace("MG","MadGraph").replace("Ph","Powheg").replace("Hpp",Herwigpp").replace("Sh","Sherpa").replace("Ag","Alpgen").replace("Py","Pythia").replace("EG","EvtGen").replace("PG","ParticleGun") expectedgenpart = ''.join(gennames) ## We want to record that HERWIG was used in metadata, but in the JO naming we just use a "Jimmy" label expectedgenpart = expectedgenpart.replace("HerwigJimmy", "Jimmy") def _norm(s): # TODO: add EvtGen to this normalization for MC14? return s.replace("Photospp", "").replace("Photos", "").replace("Tauola", "") - if genpart != expectedgenpart and _norm(genpart) != _norm(expectedgenpart): - evgenLog.error("Expected first part of JO name to be '%s' or '%s', but found '%s'" % (_norm(expectedgenpart), expectedgenpart, genpart)) + def _norm2(s): + return s.replace("Py", "Pythia").replace("MG","MadGraph").replace("Ph","Powheg").replace("Hpp","Herwigpp").replace("Sh","Sherpa").replace("Ag","Alpgen").replace("EG","EvtGen").replace("PG","ParticleGun") + + def _short2(s): + return s.replace("Pythia","Py").replace("MadGraph","MG").replace("Powheg","Ph").replace("Herwigpp","Hpp").replace("Sherpa","Sh").replace("Alpgen","Ag").replace("EvtGen","EG").replace("PG","ParticleGun") + + if genpart != expectedgenpart and _norm(genpart) != _norm(expectedgenpart) and _norm2(genpart) != expectedgenpart: + evgenLog.error("Expected first part of JO name to be '%s' or '%s' or '%s', but found '%s'" % (_norm(expectedgenpart), expectedgenpart, _short2(expectedgenpart), genpart)) sys.exit(1) del _norm ## Check if the tune/PDF part is needed, and if so whether it's present @@ -261,6 +268,13 @@ if joparts[0].startswith("MC"): #< if this is an "official" JO " It should contain <generators>_<tune+PDF_<process>. Please rename.") sys.exit(1) +## Check the "--steering=afterburn" command line argument has been set if EvtGen is in the JO name +# Dont't have access to steering flag so check it's effect on output files +if gen_require_steering(gennames): + if hasattr(runArgs, "outputEVNTFile") and not hasattr(runArgs, "outputEVNT_PreFile"): + raise RuntimeError("'EvtGen' found in job options name, please set '--steering=afterburn'") + + ## Check that the evgenConfig.minevents setting is acceptable ## minevents defines the production event sizes and must be sufficiently "round" if evgenConfig.minevents < 1: @@ -414,6 +428,8 @@ elif "Alpgen" in evgenConfig.generators: datFile = "inparmAlpGen.dat" elif "Protos" in evgenConfig.generators: datFile = "protos.dat" +elif "ProtosLHEF" in evgenConfig.generators: + datFile = "protoslhef.dat" elif "AcerMC" in evgenConfig.generators: datFile = "inparmAcerMC.dat" elif "CompHep" in evgenConfig.generators: @@ -423,8 +439,10 @@ elif "CompHep" in evgenConfig.generators: eventsFile = None if "Alpgen" in evgenConfig.generators: eventsFile = "alpgen.unw_events" -elif "Protos" in evgenConfig.generators: # TODO: converting to LHEF +elif "Protos" in evgenConfig.generators: eventsFile = "protos.events" +elif "ProtosLHEF" in evgenConfig.generators: + eventsFile = "protoslhef.events" elif "BeamHaloGenerator" in evgenConfig.generators: eventsFile = "beamhalogen.events" elif "HepMCAscii" in evgenConfig.generators: