16def fromRunArgs(runArgs):
17 from AthenaCommon.Logging import logging
18 logDerivation = logging.getLogger('Derivation')
19 logDerivation.info('****************** STARTING DERIVATION *****************')
20
21 logDerivation.info('**** Transformation run arguments')
22 logDerivation.info(str(runArgs))
23
24 logDerivation.info('**** Setting-up configuration flags')
25 from AthenaConfiguration.AllConfigFlags import initConfigFlags
26 flags = initConfigFlags()
27 flags.Exec.EventPrintoutInterval = 100
28 commonRunArgsToFlags(runArgs, flags)
29
30 flags.Common.ProductionStep = ProductionStep.Derivation
31
32
33 from PerfMonComps.PerfMonConfigHelpers import setPerfmonFlagsFromRunArgs
34 setPerfmonFlagsFromRunArgs(flags, runArgs)
35
36
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')
43
44
45
46
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))
52 else:
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}'])
58 else:
59 flags._set(childStreamFlag, flags._get(childStreamFlag) + [f'DAOD_{child}'])
60 logDerivation.info('Setting up event augmentation as {0} => {1}'.format(child, parent))
61
62
63 formats = []
64 if hasattr(runArgs, 'formats'):
65 formats = runArgs.formats
66 logDerivation.info('Will attempt to make the following derived formats: {0}'.format(formats))
67 else:
68 logDerivation.error('Derivation job started, but with no output formats specified - aborting')
69 raise ValueError('No derived formats specified')
70
71
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')
82 else:
83 flags.Derivation.dynamicConsumers = runArgs.skimmingContainers
84
85
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
93
94
95 if hasattr(runArgs, 'n_folds_NF'):
96 logDerivation.info('Will use %d folds for the e/gamma NF shower shape correction tool', runArgs.n_folds_NF)
97 flags.addFlag('Egamma.NFoldsNF', runArgs.n_folds_NF)
98
99
100
101 from Campaigns.Utils import Campaign, campaign_runs
102 if flags.Input.isMC and flags.Input.MCCampaign is Campaign.Unknown:
103 if flags.Input.RunNumbers:
104 mc_campaign = campaign_runs.get(flags.Input.RunNumbers[0], Campaign.Unknown)
105
106 if mc_campaign is not Campaign.Unknown:
107 flags.Input.MCCampaign = mc_campaign
108 logDerivation.info('Will recover MC campaign to: %s', mc_campaign.value)
109
110
111 if allowedInputTypes[idx] == 'EVNT':
112
113 if hasattr(runArgs, 'runNumber') and flags.Input.MCChannelNumber != runArgs.runNumber:
114 logDerivation.warning('Got different MC channel number (%d) from runNumber than from metadata (%d)', runArgs.runNumber, flags.Input.MCChannelNumber)
115 flags.Input.MCChannelNumber = runArgs.runNumber
116 elif flags.Input.MCChannelNumber == 0 and flags.Input.RunNumbers and flags.Input.RunNumbers[0] != 0:
117 logDerivation.info('Will recover MC channel number to: %d', flags.Input.RunNumbers[0])
118 flags.Input.MCChannelNumber = flags.Input.RunNumbers[0]
119 else:
120 logDerivation.info('MC channel number: %d', flags.Input.MCChannelNumber)
121
122
123 processPreInclude(runArgs, flags)
124
125
126 processPreExec(runArgs, flags)
127
128
129 flags.fillFromArgs()
130
131
132 flags.lock()
133
134
135 from AthenaConfiguration.MainServicesConfig import MainServicesCfg
136 cfg = MainServicesCfg(flags)
137
138
139 from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
140 cfg.merge(PoolReadCfg(flags))
141
142
143 if (allowedInputTypes[idx]=='EVNT'):
144 from AthenaServices.MetaDataSvcConfig import MetaDataSvcCfg
145 cfg.merge(MetaDataSvcCfg(flags, ['IOVDbMetaDataTool']))
146
147 for formatName in formats:
148 derivationConfig = getattr(DerivationConfigList, f'{formatName}Cfg')
149 newcfg = derivationConfig(flags)
150 cfg.merge(newcfg)
151
152
153 if hasattr(runArgs, 'passThrough'):
154 logDerivation.info('Pass-through mode was requested. All events will be written to the output.')
155 for algo in cfg.getEventAlgos():
156 if isinstance(algo, CompFactory.DerivationFramework.DerivationKernel):
157 algo.SkimmingTools = []
158
159
160 from PyUtils.AMITagHelperConfig import AMITagCfg
161 cfg.merge(AMITagCfg(flags, runArgs, fixBroken=True))
162
163
164 if flags.Input.isMC:
165 from GeneratorConfig.Versioning import GeneratorVersioningFixCfg
166 cfg.merge(GeneratorVersioningFixCfg(flags))
167
168
169 if not flags.Input.isMC and flags.Input.DataYear > 0:
170 from EventInfoMgt.TagInfoMgrConfig import TagInfoMgrCfg
171 cfg.merge(TagInfoMgrCfg(flags, tagValuePairs={
172 "data_year": str(flags.Input.DataYear)
173 }))
174 else:
175 from EventInfoMgt.TagInfoMgrConfig import TagInfoMgrCfg
176 cfg.merge(TagInfoMgrCfg(flags))
177
178
179 processPostInclude(runArgs, flags, cfg)
180
181
182 processPostExec(runArgs, flags, cfg)
183
184
185 from AthenaConfiguration.Utils import setupLoggingLevels
186 setupLoggingLevels(flags, cfg)
187
188
189 sc = cfg.run()
190 sys.exit(not sc.isSuccess())