119 log = logging.getLogger(
'OutputAnalysisConfig')
121 containers = dict(self.containers)
122 branchVars =
set(self.vars)
123 metVars =
set(self.metVars)
124 truthMetVars =
set(self.truthMetVars)
125 nonContainers = list(self.nonContainers)
126 commands = list(self.commands)
132 keys_message = [repr(key)
for key
in overlapping_keys]
133 raise KeyError(f
"containersFullMET would overwrite the following container keys: {', '.join(keys_message)}")
138 if config.dataType()
is not DataType.Data:
139 branchVars |=
set(self.varsOnlyForMC)
146 keys_message = [repr(key)
for key
in overlapping_keys]
147 raise KeyError(f
"containersOnlyForMC would overwrite the following container keys: {', '.join(keys_message)}")
155 if container
not in containers:
156 log.warning(
"Skipping unrecognised container prefix '%s' for DSID-filtering in OutputAnalysisConfig...", container)
158 if not filter_dsids (dsid_filters, config):
160 log.info(
"Skipping container prefix '%s' due to DSID filtering...", container)
162 for var
in set(branchVars):
163 var_container = var.split(
'.')[0].
replace(
'_NOSYS',
'').
replace(
'_%SYS%',
'')
164 if var_container == containers[container]:
165 branchVars.remove(var)
166 log.info(
"Skipping branch definition '%s' for excluded container %s...", var, var_container)
168 for var
in set(metVars):
169 var_container = var.split(
'.')[0].
replace(
'_NOSYS',
'').
replace(
'_%SYS%',
'')
170 if var_container == containers[container]:
172 log.info(
"Skipping MET branch definition '%s' for excluded container %s...", var, var_container)
174 for var
in set(truthMetVars):
175 var_container = var.split(
'.')[0].
replace(
'_NOSYS',
'').
replace(
'_%SYS%',
'')
176 if var_container == containers[container]:
177 truthMetVars.remove(var)
178 log.info(
"Skipping truth MET branch definition '%s' for excluded container %s...", var, var_container)
180 containers.pop (container)
184 if not filter_dsids(dsid_filters, config):
186 for var
in set(branchVars):
187 if var_pattern
in var:
188 branchVars.remove(var)
189 log.info(
"Skipping branch definition '%s' due to variable-level DSID filtering...", var)
190 for var
in set(metVars):
191 if var_pattern
in var:
193 log.info(
"Skipping MET branch definition '%s' due to variable-level DSID filtering...", var)
194 for var
in set(truthMetVars):
195 if var_pattern
in var:
196 truthMetVars.remove(var)
197 log.info(
"Skipping truth MET branch definition '%s' due to variable-level DSID filtering...", var)
200 for prefix, container
in containers.items():
201 origName = config.getOutputContainerOrigin(container)
202 if config.getContainerMeta(origName,
"nonContainer",
False):
203 if origName
not in nonContainers:
204 nonContainers.append(origName)
210 for prefix
in containers.keys() :
211 containerName = containers[prefix]
212 outputDict = config.getOutputVars (containerName)
213 for outputName
in outputDict :
214 outputConfig = copy.deepcopy (outputDict[outputName])
215 outputConfig.outputContainerName = config.readName(containerName)
216 outputConfig.prefix = prefix
220 outputConfig.enabled =
True
221 outputConfigs[prefix + outputName] = outputConfig
224 for dsid, dsid_commands
in self.commandsOnlyForDSIDs.items():
225 if filter_dsids([dsid], config):
226 commands += dsid_commands
228 outputConfigsRename = {}
229 for command
in commands :
230 words = command.split (
' ')
231 if len (words) == 0 :
232 raise ValueError (
'received empty command for "commands" option')
233 optional = words[0] ==
'optional'
236 if words[0] ==
'enable' :
237 if len (words) != 2 :
238 raise ValueError (
'enable takes exactly one argument: ' + command)
240 for name
in outputConfigs :
241 if re.match (words[1], name) :
242 outputConfigs[name].enabled =
True
244 if not used
and not optional
and config.dataType()
is not DataType.Data:
245 raise KeyError (
'unknown branch pattern for enable: ' + words[1])
246 elif words[0] ==
'disable' :
247 if len (words) != 2 :
248 raise ValueError (
'disable takes exactly one argument: ' + command)
250 for name
in outputConfigs :
251 if re.match (words[1], name) :
252 outputConfigs[name].enabled =
False
254 if not used
and not optional
and config.dataType()
is not DataType.Data:
255 raise KeyError (
'unknown branch pattern for disable: ' + words[1])
256 elif words[0] ==
'rename' :
257 if len (words) != 3 :
258 raise ValueError (
'rename takes exactly two arguments: ' + command)
260 for name
in outputConfigs :
261 if re.match (words[1], name) :
262 new_name = re.sub (words[1], words[2], name)
263 outputConfigsRename[new_name] = copy.deepcopy(outputConfigs[name])
264 outputConfigs[name].enabled =
False
266 if not used
and not optional
and config.dataType()
is not DataType.Data:
267 raise KeyError (
'unknown branch pattern for rename: ' + words[1])
269 raise KeyError (
'unknown command for "commands" option: ' + words[0])
272 outputConfigs.update(outputConfigsRename)
276 autoTruthMetVars =
set()
277 for outputName, outputConfig
in outputConfigs.items():
278 if outputConfig.enabled :
279 if config.isMetContainer (outputConfig.origContainerName)
and outputConfig.prefix
not in self.
containersFullMET:
280 if "Truth" in outputConfig.origContainerName:
281 myVars = autoTruthMetVars
286 if outputConfig.noSys :
287 outputConfig.outputContainerName = outputConfig.outputContainerName.replace (
'%SYS%',
'NOSYS')
288 outputConfig.variableName = outputConfig.variableName.replace (
'%SYS%',
'NOSYS')
290 outputName +=
"_NOSYS"
292 outputName +=
'_%SYS%'
293 branchDecl = f
"{outputConfig.outputContainerName}.{outputConfig.variableName} -> {outputName}"
294 if outputConfig.auxType
is not None :
295 branchDecl += f
" type={outputConfig.auxType}"
296 if config.isMetContainer (outputConfig.origContainerName)
and outputConfig.prefix
not in self.
containersFullMET:
297 if "Truth" in outputConfig.origContainerName:
298 branchDecl += f
" metTerm={self.truthMetTermName}"
300 branchDecl += f
" metTerm={self.metTermName}"
301 myVars.add(branchDecl)
305 allBranches |= branchVars
306 allBranches |= autoVars
312 allBranches |= userMetVars
313 allBranches |= autoMetVars
315 userTruthMetVars =
set()
316 if config.dataType()
is not DataType.Data:
318 for var
in truthMetVars:
320 allBranches |= userTruthMetVars
321 allBranches |= autoTruthMetVars
325 alg = config.createAlgorithm(
'CP::RNtupleTreeMakerAlg',
'RNtupleMaker')
326 alg.TreeName = self.treeName
327 alg.RootStreamName = self.streamName
328 alg.OutputStreamName = self.streamName
329 alg.NonContainers = list(nonContainers)
330 alg.ApproxZippedClusterSize = self.RNTupleApproxZippedClusterSize
331 alg.MaxUnzippedClusterSize = self.RNTupleMaxUnzippedClusterSize
333 branchList = list(allBranches)
335 branchList_nosys = [branch
for branch
in branchList
if "%SYS%" not in branch]
336 branchList_sys = [branch
for branch
in branchList
if "%SYS%" in branch]
337 alg.Branches = branchList_nosys + branchList_sys
342 treeMaker = config.createAlgorithm(
'CP::TreeMakerAlg',
'TreeMaker' )
343 treeMaker.TreeName = self.treeName
344 treeMaker.RootStreamName = self.streamName
348 if branchVars
or autoVars:
349 self.
createOutputAlgs(config,
'NTupleMaker', branchVars | autoVars, nonContainers)
351 if metVars
or autoMetVars:
352 self.
createOutputAlgs(config,
'MetNTupleMaker', userMetVars | autoMetVars, nonContainers)
354 if config.dataType()
is not DataType.Data
and (truthMetVars
or autoTruthMetVars):
355 self.
createOutputAlgs(config,
'TruthMetNTupleMaker', userTruthMetVars | autoTruthMetVars, nonContainers)
357 treeFiller = config.createAlgorithm(
'CP::TreeFillerAlg',
'TreeFiller' )
358 treeFiller.TreeName = self.treeName
359 treeFiller.RootStreamName = self.streamName