17 from AthenaCommon.Logging
import logging
18 logDerivation = logging.getLogger(
'Derivation')
19 logDerivation.info(
'****************** STARTING DERIVATION *****************')
21 logDerivation.info(
'**** Transformation run arguments')
22 logDerivation.info(
str(runArgs))
24 logDerivation.info(
'**** Setting-up configuration flags')
25 from AthenaConfiguration.AllConfigFlags
import initConfigFlags
27 flags.Exec.EventPrintoutInterval = 100
30 flags.Common.ProductionStep = ProductionStep.Derivation
33 from PerfMonComps.PerfMonConfigHelpers
import setPerfmonFlagsFromRunArgs
37 allowedInputTypes = [
'AOD',
'DAOD_PHYS',
'DAOD_PHYSLITE',
'EVNT' ]
38 availableInputTypes = [ hasattr(runArgs, f
'input{inputType}File')
for inputType
in allowedInputTypes ]
39 if sum(availableInputTypes) != 1:
40 raise ValueError(
'Input must be exactly one of the following types: '+
','.
join(map(str, availableInputTypes)))
41 idx = availableInputTypes.index(
True)
42 flags.Input.Files = getattr(runArgs, f
'input{allowedInputTypes[idx]}File')
47 if hasattr(runArgs,
'augmentations'):
48 for val
in runArgs.augmentations:
49 if ':' not in val
or len(val.split(
':')) != 2:
50 logDerivation.error(
'Derivation job started, but with wrong augmentation syntax - aborting')
51 raise ValueError(
'Invalid augmentation argument: {0}'.
format(val))
53 child, parent = val.split(
':')
54 flags.addFlag(f
'Output.DAOD_{child}ParentStream',f
'DAOD_{parent}')
55 childStreamFlag = f
'Output.DAOD_{parent}ChildStream'
56 if not flags.hasFlag(childStreamFlag):
57 flags.addFlag(childStreamFlag, [f
'DAOD_{child}'])
59 flags._set(childStreamFlag, flags._get(childStreamFlag) + [f
'DAOD_{child}'])
60 logDerivation.info(
'Setting up event augmentation as {0} => {1}'.
format(child, parent))
64 if hasattr(runArgs,
'formats'):
65 formats = runArgs.formats
66 logDerivation.info(
'Will attempt to make the following derived formats: {0}'.
format(formats))
68 logDerivation.error(
'Derivation job started, but with no output formats specified - aborting')
69 raise ValueError(
'No derived formats specified')
72 if hasattr(runArgs,
'skimmingExpression'):
73 if runArgs.skimmingExpression:
74 if not (len(formats)==1
and formats[0]==
'SKIM'):
75 raise ValueError(
'Command-line skimming only available with SKIM format')
76 availableInputTypes = [ hasattr(runArgs, f
'input{inputType}File')
for inputType
in [
'DAOD_PHYS',
'DAOD_PHYSLITE' ] ]
77 if sum(availableInputTypes) != 1:
78 raise ValueError(
'Command-line skimming only available with input types '+
','.
join(map(str, availableInputTypes)))
79 flags.Derivation.skimmingExpression = runArgs.skimmingExpression
80 if not hasattr(runArgs,
'skimmingContainers'):
81 logDerivation.warning(
'All containers used for skimming must be listed with the skimmingContainers option - job likely to fail')
83 flags.Derivation.dynamicConsumers = runArgs.skimmingContainers
86 for runArg
in dir(runArgs):
87 if 'output' in runArg
and 'File' in runArg
and 'Type' not in runArg
and 'NTUP_PHYSVAL' not in runArg:
88 outputFileName = getattr(runArgs, runArg)
89 flagString = f
'Output.{runArg.removeprefix("output")}Name'
90 flags.addFlag(flagString, outputFileName)
91 flags.addFlag(f
'Output.doWrite{runArg.removeprefix("output").removesuffix("File")}',
True)
92 flags.Output.doWriteDAOD =
True
95 from Campaigns.Utils
import Campaign, campaign_runs
96 if flags.Input.isMC
and flags.Input.MCCampaign
is Campaign.Unknown:
97 if flags.Input.RunNumbers:
98 mc_campaign = campaign_runs.get(flags.Input.RunNumbers[0], Campaign.Unknown)
100 if mc_campaign
is not Campaign.Unknown:
101 flags.Input.MCCampaign = mc_campaign
102 logDerivation.info(
'Will recover MC campaign to: %s', mc_campaign.value)
117 from AthenaConfiguration.MainServicesConfig
import MainServicesCfg
121 from AthenaPoolCnvSvc.PoolReadConfig
import PoolReadCfg
125 if (allowedInputTypes[idx]==
'EVNT'):
126 from AthenaServices.MetaDataSvcConfig
import MetaDataSvcCfg
145 def premerge (cfg, newcfg, seqnam):
147 seq = cfg.getSequence(seqnam)
149 newseq = newcfg.getSequence(seqnam)
150 if not newseq:
return
154 from AthenaConfiguration.ComponentAccumulator
import ComponentAccumulator
156 ca.addSequence (CompFactory.AthSequencer (seqnam, Sequential=
True))
159 for a
in seq.Members:
160 ca.addEventAlgo (cfg.popEventAlgo (a.getName(), seqnam), seqnam)
163 cfg.getSequence(
'AthAlgSeq').Members.remove (seq)
169 for formatName
in formats:
170 derivationConfig = getattr(DerivationConfigList, f
'{formatName}Cfg')
171 newcfg = derivationConfig(flags)
172 premerge (cfg, newcfg,
'EventCleanSeq')
173 premerge (cfg, newcfg,
'EventCleanLockSeq')
177 if hasattr(runArgs,
'passThrough'):
178 logDerivation.info(
'Pass-through mode was requested. All events will be written to the output.')
179 for algo
in cfg.getEventAlgos():
180 if isinstance(algo, CompFactory.DerivationFramework.DerivationKernel):
181 algo.SkimmingTools = []
184 if flags.PerfMon.doFullMonMT
or flags.PerfMon.doFastMonMT:
185 from PerfMonComps.PerfMonCompsConfig
import PerfMonMTSvcCfg
189 from PyUtils.AMITagHelperConfig
import AMITagCfg
190 cfg.merge(
AMITagCfg(flags, runArgs, fixBroken=
True))
194 from GeneratorConfig.Versioning
import GeneratorVersioningFixCfg
198 if not flags.Input.isMC
and flags.Input.DataYear > 0:
199 from EventInfoMgt.TagInfoMgrConfig
import TagInfoMgrCfg
201 "data_year":
str(flags.Input.DataYear)
204 from EventInfoMgt.TagInfoMgrConfig
import TagInfoMgrCfg
214 from AthenaConfiguration.Utils
import setupLoggingLevels
219 sys.exit(
not sc.isSuccess())