import glob, os, re, math import traceback import cPickle from AthenaCommon.Logging import logging evgenLog = logging.getLogger('Generate') evgenLog.info( '****************** STARTING EVENT GENERATION *****************' ) evgenLog.info( str(runArgs) ) from AthenaCommon.AlgSequence import AlgSequence topSequence = AlgSequence() topAlg = topSequence #============================================================== # Job Configuration parameters: #============================================================== ## Pre-exec if hasattr(runArgs,"preExec"): merHitLog.info("transform pre-exec") for cmd in runArgs.preExec: evgenLog.info(cmd) exec(cmd) ## Pre-include if hasattr(runArgs,"preInclude"): for fragment in runArgs.preInclude: include(fragment) #============================================================== # Job definition parameters: #============================================================== # special setup for event generation include( "AthenaCommon/Atlas_Gen.UnixStandardJob.py" ) # remember output level I set evgenMsgLevel = theApp.OutputLevel # other includes needed by the physics file include( "PartPropSvc/PartPropSvc.py" ) from AthenaServices.AthenaServicesConf import AtRndmGenSvc svcMgr += AtRndmGenSvc() from AthenaServices.AthenaServicesConf import AtRanluxGenSvc ServiceMgr += AtRanluxGenSvc() from AthenaCommon.AthenaCommonFlags import jobproperties #Jobs should stop if an include fails. if hasattr(runArgs,"IgnoreConfigError"): jobproperties.AthenaCommonFlags.AllowIgnoreConfigError=runArgs.IgnoreConfigError else: jobproperties.AthenaCommonFlags.AllowIgnoreConfigError=False # compatibility with jets from RecExConfig.RecConfFlags import jobproperties jobproperties.RecConfFlags.AllowBackNavigation = True from JetRec.JetRecFlags import jobproperties as jobpropjet jobpropjet.JetRecFlags.inputFileType = "GEN" if not hasattr(runArgs,"outputEVNTFile"): raise RuntimeError("No output evgen EVNT file provided.") include( "EvgenJobTransforms/Generate_pool_out.py" ) # include physics jobOptions, which also contain the job configuration for fragment in runArgs.jobConfig: include( fragment ) # override message level to what I set svcMgr.MessageSvc.enableSuppression = True svcMgr.MessageSvc.OutputLevel = evgenMsgLevel svcMgr.MessageSvc.defaultLimit = evgenMsgLevel svcMgr.MessageSvc.verboseLimit = evgenMsgLevel svcMgr.MessageSvc.debugLimit = evgenMsgLevel svcMgr.MessageSvc.infoLimit = 100 svcMgr.MessageSvc.warningLimit = 0 svcMgr.MessageSvc.errorLimit = 0 svcMgr.MessageSvc.fatalLimit = 0 from MC11JobOptions.EvgenConfig import evgenConfig # print out options for opt in str(evgenConfig).split(os.linesep): evgenLog.info( opt ) #--------------------------------------------------------------- # add override for an energy different from 14 TeV #--------------------------------------------------------------- if not hasattr(runArgs,"ecmEnergy"): raise RuntimeError("No center of mass energy provided.") if 'Pythia' in evgenConfig.generators: Pythia.PythiaCommand += [ "pyinit win %s" % runArgs.ecmEnergy ] if 'PythiaB' in evgenConfig.generators: tmpPythiaB = topAlg.PythiaB tmpPythiaB.PythiaCommand += [ "pyinit win %s" % runArgs.ecmEnergy ] if 'PythiaRhad' in evgenConfig.generators: tmpPythiaRhad = topAlg.PythiaRhad tmpPythiaRhad.PythiaCommand += [ "pyinit win %s" % runArgs.ecmEnergy ] if 'PythiaChL' in evgenConfig.generators: tmpPythiaChL = topAlg.PythiaChL tmpPythiaChL.PythiaCommand += [ "pyinit win %s" % runArgs.ecmEnergy ] if 'PythiaGS' in evgenConfig.generators: tmpPythiaGS = topAlg.PythiaGS tmpPythiaGS.PythiaCommand += [ "pyinit win %s" % runArgs.ecmEnergy ] if 'PythiaResMod' in evgenConfig.generators: tmpPythiaResMod = topAlg.PythiaResMod tmpPythiaResMod.PythiaCommand += [ "pyinit win %s" % runArgs.ecmEnergy ] if 'PythiaTopMdiff' in evgenConfig.generators: tmpPythiaTopMdiff = topAlg.PythiaTopMdiff tmpPythiaTopMdiff.PythiaCommand += [ "pyinit win %s" % runArgs.ecmEnergy ] if 'Pythia8' in evgenConfig.generators: topAlg.Pythia8_i.CollisionEnergy = runArgs.ecmEnergy if 'Herwig' in evgenConfig.generators: ebeam = runArgs.ecmEnergy*0.5 Herwig.HerwigCommand += ["beam1energy %s" % ebeam, "beam2energy %s" % ebeam] if 'Herwigpp' in evgenConfig.generators: topAlg.Herwigpp.Commands += ["set /Herwig/Generators/LHCGenerator:EventHandler:LuminosityFunction:Energy %s" % runArgs.ecmEnergy] if 'SherpaF' in evgenConfig.generators: eBeam=runArgs.ecmEnergy*0.5 sherpa.Parameters += [ "BEAM_ENERGY_1=%s" % eBeam,"BEAM_ENERGY_2=%s" % eBeam ] if 'SherpaFF' in evgenConfig.generators: eBeam=runArgs.ecmEnergy*0.5 sherpa.Parameters += [ "BEAM_ENERGY_1=%s" % eBeam,"BEAM_ENERGY_2=%s" % eBeam ] #--------------------------------------------------------------- # for Herwigpp add setup for intrinsic kT #--------------------------------------------------------------- #if ('Herwigpp' in evgenConfig.generators) : # intrinsic_pt = 1.85 + runArgs.ecmEnergy*(0.1/4000.0) # topAlg.Herwigpp.Commands += ["set /Herwig/Shower/Evolver:IntrinsicPtGaussian %s*GeV" %(intrinsic_pt)] #--------------------------------------------------------------- # add random seeds depending on used generators #--------------------------------------------------------------- if not hasattr(runArgs,"randomSeed"): raise RuntimeError("No random seed provided.") include( "EvgenJobTransforms/Evgen_randomseeds.py" ) #-------------------------------------------------------------- # Event related parameters #-------------------------------------------------------------- from AthenaCommon.AppMgr import theApp EvtMax=-1 if hasattr(runArgs,"maxEvents"): EvtMax = runArgs.maxEvents if not hasattr(runArgs,"runNumber"): raise RuntimeError("No run number provided.") svcMgr.EventSelector.RunNumber = runArgs.runNumber if not hasattr(runArgs,"firstEvent"): raise RuntimeError("No first number provided.") #modify the first event number to account for efficiency firstEvt = runArgs.firstEvent maxEvts = EvtMax #print "EFF",EvtMax,evgenConfig.efficiency if int(EvtMax) > 0: eff = evgenConfig.efficiency if eff < 1.0: firstEvt = runArgs.firstEvent oldfirstEvt = firstEvt newfirstEvt = int( math.ceil((oldfirstEvt-1)/eff + 0.5) ) +1 firstEvt=newfirstEvt evgenLog.info("Processing first event %d instead of %d to account for filtering efficiency %f" \ % (newfirstEvt, oldfirstEvt, eff ) ) oldEvents = EvtMax newEvents = int( math.ceil(oldEvents/eff) ) maxEvts=newEvents evgenLog.info("Processing %d events instead of %d to account for filtering efficiency %f" % (newEvents, oldEvents, eff ) ) else: evgenLog.info("Processing events with increments of event number at the output writing") svcMgr.EventSelector.FirstEvent = firstEvt theApp.EvtMax = maxEvts # for beam info - available in 15.6.X.Y import EventInfoMgt.EventInfoMgtInit beamEnergy=str(int(runArgs.ecmEnergy*Units.GeV*0.5)) svcMgr.TagInfoMgr.ExtraTagValuePairs += ["beam_energy",beamEnergy ] svcMgr.TagInfoMgr.ExtraTagValuePairs += ["beam_type",'collisions'] #add special config option svcMgr.TagInfoMgr.ExtraTagValuePairs += ["specialConfiguration",evgenConfig.specialConfig ] #------------------------------------------------------------ # TestHepMC (should not be run for certain generators) #------------------------------------------------------------ include( "EvgenJobTransforms/Evgen_TestHepMC.py" ) if runArgs.maxEvents == -1: include( "EvgenJobTransforms/Evgen_CountHepMC.py" ) #------------------------------------------------------------ # Some generators need event weights #------------------------------------------------------------ if evgenConfig.weighting == 1: include( "EvgenJobTransforms/Evgen_EventWeight.py" ) from TruthExamples.TruthExamplesConf import PrintMC topAlg += PrintMC() topAlg.PrintMC.McEventKey = "GEN_EVENT" topAlg.PrintMC.VerboseOutput = TRUE topAlg.PrintMC.PrintStyle = "Barcode" topAlg.PrintMC.FirstEvent = 1 topAlg.PrintMC.LastEvent = 5 #------------------------------------------------------------ # input generator files #------------------------------------------------------------ needsDatFile = { 'McAtNlo' : 'inparmMcAtNlo.dat', 'Alpgen' : 'inparmAlpGen.dat' , 'AcerMC' : 'inparmAcerMC.dat' , 'CompHep' : 'inparmCompHep.dat' , 'LhaExt' : 'lharead_control.dat'} needsConfFile = { 'SherpaF' : 'Run.dat' } needsEventsFile = { 'Alpgen' : 'alpgen.unw_events', 'MadGraph' : 'madgraph.unweighted_events', 'Sherpa' : 'sherpa.evts', 'Lhef' : 'unweighted_events.lhe', 'BeamHaloGenerator' : 'beamhalogen.events'} joFile = runArgs.jobConfig inputbase = evgenConfig.inputfilebase inputconf = evgenConfig.inputconfbase # determine if an input file is needed whoNeedsDatFile = None for gen in evgenConfig.generators: if gen in needsDatFile: whoNeedsDatFile = gen break whoNeedsConfFile = None for gen in evgenConfig.generators: if gen in needsConfFile: whoNeedsConfFile = gen break whoNeedsEventsFile = None for gen in evgenConfig.generators: if gen in needsEventsFile: whoNeedsEventsFile = gen break if whoNeedsEventsFile or whoNeedsDatFile: if not hasattr(runArgs,"inputGeneratorFile"): raise RuntimeError( "%s needs input file (argument inputfilebase=%s)" % (joFile,inputbase) ) if not inputbase: raise RuntimeError("No inputfilebase specified in jobOptions %s" % (joFile) ) if whoNeedsConfFile : if not hasattr(runArgs,"inputGenConfFile"): raise RuntimeError( "%s needs input conf file (argument inputconfbase=%s)" % (joFile,inputconf) ) if not inputconf: raise RuntimeError("No inputconfbase specified in jobOptions %s" % (joFile) ) if hasattr(runArgs,"inputGeneratorFile"): inputArg = runArgs.inputGeneratorFile inputroot = os.path.basename(inputArg).split("._")[0] # prepare input files for generator if needed # if not re.search(inputbase,inputArg): raise RuntimeError( "inputGeneratorFile=%s is incompatible with inputfilebase (%s) in %s" % \ (inputArg, inputbase, joFile ) ) if whoNeedsDatFile: # get *.dat files from input tarball #inputDat = r'.*%s.*\.dat' % inputbase #datFiles = inputArg.filelist( inputDat ) inputDat = '*%s*.dat' % inputroot datFiles=glob.glob(inputDat) print "DAT",datFiles,inputDat # check that I have exactly 1 match if len(datFiles) == 0: raise RuntimeError( "No *%s*.dat file found in %s" % (inputbase,inputArg) ) elif len(datFiles) > 1: raise RuntimeError( "More than 1 *%s*.dat files found in %s" % (inputbase,inputArg) ) datFile = datFiles[0] if whoNeedsEventsFile: inputEvents = '*%s.*.ev*ts' % inputroot eventsFiles = glob.glob( inputEvents ) if len(eventsFiles) == 0: raise RuntimeError( "No *%s*.events|.evts file found in %s" % (inputbase,inputArg) ) elif len(eventsFiles) > 1: raise RuntimeError( "More than 1 *%s*.events files found in %s" % (inputbase,inputArg) ) eventsFile = eventsFiles[0] for gen in evgenConfig.generators: # make symbolic links to *.dat for generators that need it dstfile = needsDatFile.get(gen) if dstfile: if not os.path.exists(dstfile) or not os.path.samefile(dstfile,datFile): evgenLog.info( "Symlinking %s to %s" % (dstfile,datFile) ) if os.path.exists(dstfile): os.remove(dstfile) os.symlink( datFile, dstfile ) else: evgenLog.info( "%s already same as %s" % (dstfile,datFile) ) # make symbolic links to *.events for generators that need it dstfile = needsEventsFile.get(gen) if dstfile: if not os.path.exists(dstfile) or not os.path.samefile(dstfile,eventsFile): evgenLog.info( "Symlinking %s to %s" % (dstfile,eventsFile) ) if os.path.exists(dstfile): os.remove(dstfile) os.symlink( eventsFile, dstfile ) else: evgenLog.info( "%s already same as %s" % (dstfile,eventsFile) ) if hasattr(runArgs,"inputGenConfFile"): inputArg = runArgs.inputGenConfFile inputroot = os.path.basename(inputArg).split("._")[0] # prepare input files for generator if needed # if not re.search(inputconf,inputArg): raise RuntimeError( "inputConfFile=%s is incompatible with inputconfbase (%s) in %s" % \ (inputArg, inputconf, joFile ) ) if whoNeedsConfFile: inputDat = '*%s*.dat' % inputroot confFiles=glob.glob(inputDat) # check that I have exactly 1 match if len(confFiles) == 0: raise RuntimeError( "No *%s*.dat file found in %s" % (inputbase,inputArg) ) elif len(confFiles) > 1: raise RuntimeError( "More than 1 *%s*.dat files found in %s" % (inputbase,inputArg) ) confFile = confFiles[0] for gen in evgenConfig.generators: # make symbolic links to conf *.dat for generators that need it dstfile = needsConfFile.get(gen) if dstfile: if not os.path.exists(dstfile) or not os.path.samefile(dstfile,confFile): evgenLog.info( "Symlinking %s to %s" % (dstfile,confFile) ) if os.path.exists(dstfile): os.remove(dstfile) os.symlink( confFile, dstfile ) else: evgenLog.info( "%s already same as %s" % (dstfile,confFile) ) #auxfile copy if evgenConfig.auxfiles: from PyJobTransformsCore.trfutil import get_files get_files( evgenConfig.auxfiles, keepDir=False, errorIfNotFound=True ) #--------------------------------------------------------------- # dump evgenConfig so it can be recycled in post-run actions #--------------------------------------------------------------- from PyJobTransformsCore.runargs import RunArguments runPars = RunArguments() runPars.minevents=evgenConfig.minevents runPars.maxeventsstrategy=evgenConfig.maxeventsstrategy runPars.efficiency=evgenConfig.efficiency FILE = open("config.pickle", 'w') cPickle.dump(runPars, FILE) FILE.close()