diff --git a/Simulation/SimuJobTransforms/python/simTrfArgs.py b/Simulation/SimuJobTransforms/python/simTrfArgs.py index 9090f0f939eac4dcf6648525515f63a996cd0288..658432f740db33b99414c6321a14c252abbf33af 100644 --- a/Simulation/SimuJobTransforms/python/simTrfArgs.py +++ b/Simulation/SimuJobTransforms/python/simTrfArgs.py @@ -7,7 +7,7 @@ import unittest import pickle import os -from PyJobTransforms.trfArgClasses import argFactory, argFile, argInt, argFloat, argString, argSubstep, trfArgParser, argList, argBool, argPOOLFile, argHITSFile, argRDOFile, argSubstepInt, argSubstepBool, argSubstepString +from PyJobTransforms.trfArgClasses import argFactory, argFile, argInt, argFloat, argString, argSubstep, trfArgParser, argList, argBool, argPOOLFile, argEVNT_TRFile, argHITSFile, argRDOFile, argSubstepInt, argSubstepBool, argSubstepString #from PyJobTransforms.trfLogger import stdLogLevels #from PyJobTransforms.trfDecorators import silent #from PyJobTransforms.trfExitCodes import trfExit @@ -136,10 +136,10 @@ def addCosmicsTrfArgs(parser): def addTrackRecordArgs(parser): parser.defineArgGroup('TrackRecords', 'TrackRecord related options') parser.add_argument('--inputEVNT_TRFile', nargs='+', - type=argFactory(argPOOLFile, io='input'), + type=argFactory(argEVNT_TRFile, io='input'), help='Input Track Record file - sometimes used in Cosmic ray or cavern background simulation jobs.', group='TrackRecords') parser.add_argument('--outputEVNT_TRFile', nargs='+', - type=argFactory(argPOOLFile, io='output', type='evnt'), + type=argFactory(argEVNT_TRFile, io='output', type='evnt'), help='Output Track Record file - sometimes used in Cosmic ray or cavern background simulation jobs.', group='TrackRecords') parser.add_argument('--trackRecordType', type=argFactory(argSubstepString), metavar='CONFIGNAME', diff --git a/Simulation/SimuJobTransforms/share/skeleton.EVNT_TRMerge.py b/Simulation/SimuJobTransforms/share/skeleton.EVNT_TRMerge.py new file mode 100644 index 0000000000000000000000000000000000000000..b3b34381f974d6f3a46ae747022e80fb32603f4b --- /dev/null +++ b/Simulation/SimuJobTransforms/share/skeleton.EVNT_TRMerge.py @@ -0,0 +1,167 @@ +#import glob, os, re +import traceback + +from AthenaCommon.Logging import logging +merEvTrLog = logging.getLogger('MergeEVNT_TR') + +merEvTrLog.info( '****************** STARTING HIT MERGING *****************' ) + +merEvTrLog.info( '**** Transformation run arguments' ) +merEvTrLog.info( str(runArgs) ) + +from AthenaCommon.AlgSequence import AlgSequence +topSequence = AlgSequence() + +#============================================================== +# Job definition parameters: +#============================================================== +from AthenaCommon.AthenaCommonFlags import athenaCommonFlags +#Jobs should stop if an include fails. +if hasattr(runArgs,"IgnoreConfigError"): + athenaCommonFlags.AllowIgnoreConfigError=runArgs.IgnoreConfigError +else: + athenaCommonFlags.AllowIgnoreConfigError=False + +from AthenaCommon.AppMgr import theApp +EvtMax=-1 +if hasattr(runArgs,"maxEvents"): + EvtMax = runArgs.maxEvents +theApp.EvtMax = EvtMax + +#-------------------------------------------------------------- +# Peek at input to configure DetFlags +#-------------------------------------------------------------- +if not hasattr(runArgs,"inputEVNT_TRFile"): + raise RuntimeError("No inputEVNT_TRFile provided.") + +#from SimuJobTransforms.HitsFilePeeker import HitsFilePeeker +#HitsFilePeeker(runArgs, merEvTrLog) +from AthenaCommon.DetFlags import DetFlags +DetFlags.geometry.all_setOff() + +#============================================================== +# Job Configuration parameters: +#============================================================== +## Pre-exec +if hasattr(runArgs,"preExec"): + merEvTrLog.info("transform pre-exec") + for cmd in runArgs.preExec: + merEvTrLog.info(cmd) + exec(cmd) + +## Pre-include +if hasattr(runArgs,"preInclude"): + for fragment in runArgs.preInclude: + include(fragment) + +#-------------------------------------------------------------- +# Load POOL support +#-------------------------------------------------------------- +from AthenaCommon.AppMgr import ServiceMgr +from AthenaPoolCnvSvc.AthenaPoolCnvSvcConf import AthenaPoolCnvSvc +ServiceMgr += AthenaPoolCnvSvc() + +import AthenaPoolCnvSvc.ReadAthenaPool + +from CLIDComps.CLIDCompsConf import ClassIDSvc +ServiceMgr += ClassIDSvc() +#include( "PartPropSvc/PartPropSvc.py" ) + +# load all possible converters for EventCheck +#GeoModelSvc = Service( "GeoModelSvc" ) +#GeoModelSvc.IgnoreTagDifference=True + +# set up all detector description stuff +#from AtlasGeoModel import SetGeometryVersion +#from AtlasGeoModel import GeoModelInit + +from AthenaCommon.DetFlags import DetFlags +DetFlags.Print() + +#-------------------------------------------------------------- +# Setup Input +#-------------------------------------------------------------- +In = runArgs.inputEVNT_TRFile +EventSelector = ServiceMgr.EventSelector +EventSelector.InputCollections = In + +# Check collection type +try: + EventSelector.CollectionType = CollType +except: + print "Reading from file" + +SkipEvents=0 +if hasattr(runArgs,"skipEvents"): + SkipEvents = runArgs.skipEvents +ServiceMgr.EventSelector.SkipEvents = SkipEvents + +#-------------------------------------------------------------- +# Setup Output +#-------------------------------------------------------------- +if not hasattr(runArgs,"outputEVNT_TR_MRGFile"): + raise RuntimeError("No outputEVNT_TR_MRGFile provided.") +Out = runArgs.outputEVNT_TR_MRGFile +from AthenaPoolCnvSvc.WriteAthenaPool import AthenaPoolOutputStream +try: + StreamEVGEN = AthenaPoolOutputStream( "StreamEVGEN", Out, True ) +except: + StreamEVGEN = AthenaPoolOutputStream( "StreamEVGEN", "DidNotSetOutputName.root", True ) +StreamEVGEN.TakeItemsFromInput=True +StreamEVGEN.ForceRead=True #force read of output data objs +# The next line is an example on how to exclude clid's if they are causing a problem +#StreamEVGEN.ExcludeList = ['6421#*'] + +# Look for lists of filter algorithms +try: + StreamEVGEN.AcceptAlgs = AcceptList +except: + print "No accept algs indicated in AcceptList" +try: + StreamEVGEN.RequireAlgs = RequireList +except: + print "No accept algs indicated in RequireList" +try: + StreamEVGEN.VetoAlgs = VetoList +except: + print "No accept algs indicated in VetoList" + +# Perfmon +from PerfMonComps.PerfMonFlags import jobproperties as pmon_properties +pmon_properties.PerfMonFlags.doMonitoring=True +pmon_properties.PerfMonFlags.doSemiDetailedMonitoring=True +pmon_properties.PerfMonFlags.OutputFile = "ntuple_EVNT_TRMerge" + +MessageSvc = ServiceMgr.MessageSvc +MessageSvc.OutputLevel = INFO + +StreamEVGEN.ExtendProvenanceRecord = False + +ServiceMgr.AthenaPoolCnvSvc.MaxFileSizes = [ "15000000000" ] + +#-------------------------------------------------------------- +# Ensure IOVDbSvc.GlobalTag is configured +# - protection against bad EVNT_TR file metadata +#-------------------------------------------------------------- +if not hasattr(ServiceMgr,'IOVDbSvc'): + from IOVDbSvc.IOVDbSvcConf import IOVDbSvc + ServiceMgr += IOVDbSvc() +if not hasattr(ServiceMgr.IOVDbSvc, 'GlobalTag') or not ServiceMgr.IOVDbSvc.GlobalTag: + from AthenaCommon.GlobalFlags import globalflags + ServiceMgr.IOVDbSvc.GlobalTag = globalflags.ConditionsTag.get_Value() + +#-------------------------------------------------------------- + +## Post-include +if hasattr(runArgs,"postInclude"): + for fragment in runArgs.postInclude: + include(fragment) + +## Post-exec +if hasattr(runArgs,"postExec"): + merEvTrLog.info("transform post-exec") + for cmd in runArgs.postExec: + merEvTrLog.info(cmd) + exec(cmd) +#-------------------------------------------------------------- +print topSequence diff --git a/Tools/PyJobTransforms/python/trfArgClasses.py b/Tools/PyJobTransforms/python/trfArgClasses.py index b5a93129daf02aaf40e5186325be15fea219d8f2..500b0bac6e71afc08fdf92250da63ce2d8771a60 100644 --- a/Tools/PyJobTransforms/python/trfArgClasses.py +++ b/Tools/PyJobTransforms/python/trfArgClasses.py @@ -1388,6 +1388,45 @@ class argHITSFile(argPOOLFile): self._resetMetadata(inputs + [output]) return myMerger + +class argEVNT_TRFile(argPOOLFile): + + integrityFunction = "returnIntegrityOfPOOLFile" + + ## @brief Method which can be used to merge EVNT_TR files + def selfMerge(self, output, inputs, counter=0, argdict={}): + msg.debug('selfMerge attempted for {0} -> {1} with {2}'.format(inputs, output, argdict)) + + # First do a little sanity check + for fname in inputs: + if fname not in self._value: + raise trfExceptions.TransformMergeException(trfExit.nameToCode('TRF_FILEMERGE_PROBLEM'), + "File {0} is not part of this agument: {1}".format(fname, self)) + + ## @note Modify argdict + mySubstepName = 'EVNT_TRMergeAthenaMP{0}'.format(counter) + myargdict = self._mergeArgs(argdict) + + from PyJobTransforms.trfExe import athenaExecutor, executorConfig + myDataDictionary = {'EVNT_TR' : argEVNT_TRFile(inputs, type=self.type, io='input'), + 'EVNT_TR_MRG' : argEVNT_TRFile(output, type=self.type, io='output')} + myMergeConf = executorConfig(myargdict, myDataDictionary) + myMerger = athenaExecutor(name = mySubstepName, skeletonFile = 'SimuJobTransforms/skeleton.EVNT_TRMerge.py', + conf=myMergeConf, + inData=set(['EVNT_TR']), outData=set(['EVNT_TR_MRG']), disableMP=True) + myMerger.doAll(input=set(['EVNT_TR']), output=set(['EVNT_TR_MRG'])) + + # OK, if we got to here with no exceptions, we're good shape + # Now update our own list of files to reflect the merge + for fname in inputs: + self._value.remove(fname) + self._value.append(output) + + msg.debug('Post self-merge files are: {0}'.format(self._value)) + self._resetMetadata(inputs + [output]) + return myMerger + + class argRDOFile(argPOOLFile): integrityFunction = "returnIntegrityOfPOOLFile"