254 from Campaigns.Utils
import Campaign
256 log = logging.getLogger(
"makePileupAnalysisSequence")
259 (
"runNumber",
"unsigned"),
260 (
"eventNumber",
"unsigned_long"),
262 if config.dataType()
is not DataType.Data:
263 eventInfoVar.extend([
264 (
"mcChannelNumber",
"unsigned"),
267 eventInfoVar.extend([
268 (
"averageInteractionsPerCrossing",
"float"),
269 (
"actualInteractionsPerCrossing",
"float"),
275 eventInfoVar.extend([
276 (
"eventTypeBitmask",
"int"),
281 log.info(
"Physlite does not need pileup reweighting. Variables will be copied from input instead.")
283 log.warning(
"writeDetailedPileupValues is set to True, but Physlite does not have these variables. They will not be written to the output.")
285 eventInfoVar.extend([
286 (
"correctedScaledInteractionsPerCrossing",
"float"),
288 for var_name, var_type
in eventInfoVar:
289 config.addOutputVar(
"EventInfo", var_name, var_name, noSys=
True, auxType=var_type)
291 if config.dataType()
is not DataType.Data:
292 config.addOutputVar(
"EventInfo",
"PileupWeight_%SYS%",
"weight_pileup", auxType=
"float")
293 if config.geometry()
is LHCPeriod.Run2:
294 config.addOutputVar(
"EventInfo",
"beamSpotWeight",
"weight_beamspot", noSys=
True, auxType=
"float")
298 if self.
files is None and config.flags
is not None:
299 self.
files = config.flags.Input.Files
301 campaign = self.campaign
303 if self.campaign
is None:
305 if config.campaign()
is not None and config.campaign()
is not Campaign.Unknown:
306 campaign = config.campaign()
307 log.info(
"Auto-configuring campaign for PRW from flags: %s", campaign.value)
308 elif config.dataType()
is DataType.Data:
309 log.info(
"Inferring campaign from data year: %d", config.dataYear())
311 2015: Campaign.MC20a,
312 2016: Campaign.MC20a,
313 2017: Campaign.MC20d,
314 2018: Campaign.MC20e,
315 2022: Campaign.MC23a,
316 2023: Campaign.MC23d,
317 2024: Campaign.MC23e,
318 2025: Campaign.MC23g,
319 2026: Campaign.MC23g,
320 }.
get(config.dataYear(), Campaign.Unknown)
323 if self.
files is not None:
324 from Campaigns.Utils
import getMCCampaign
325 campaign = getMCCampaign(self.
files)
326 if campaign
and campaign
is not Campaign.Unknown:
327 log.info(
"Auto-configuring campaign for PRW from files: %s", campaign.value)
329 log.info(
"Campaign could not be determined.")
333 toolLumicalcFiles = []
337 if (config.dataType()
is not DataType.Data
and
338 config.geometry()
is not LHCPeriod.Run4):
340 if self.userPileupConfigs
is not None and self.userPileupConfigsPerCampaign
is not None:
341 raise ValueError(
"Both userPileupConfigs and userPileupConfigsPerCampaign specified,"
342 " use only one of the options!")
343 if self.userPileupConfigsPerCampaign
is not None:
345 raise Exception(
"userPileupConfigsPerCampaign requires campaign to be configured!")
346 if campaign
is Campaign.Unknown:
347 raise Exception(
"userPileupConfigsPerCampaign used, but campaign = Unknown!")
349 toolConfigFiles = self.userPileupConfigsPerCampaign[campaign.value][:]
350 log.info(
"Using user provided per-campaign PRW configuration")
351 except KeyError
as e:
352 raise KeyError(f
"Unconfigured campaign {e} for userPileupConfigsPerCampaign!")
354 elif self.userPileupConfigs
is not None:
355 toolConfigFiles = self.userPileupConfigs[:]
356 log.info(
"Using user provided PRW configuration")
360 raise ValueError(
"useDefaultConfig requires files to be configured!"
361 " Either pass them as an option or use flags.")
363 from PileupReweighting.AutoconfigurePRW
import getConfigurationFiles
364 if campaign
and campaign
is not Campaign.Unknown:
365 toolConfigFiles = getConfigurationFiles(campaign=campaign,
368 data_type=config.dataType(),
369 GRLSuffixDict=self.GRLSuffixDict)
371 log.info(
"Auto-configuring universal/default PRW config")
373 log.info(
"Auto-configuring per-sample PRW config files based on input files")
375 log.info(
"No campaign specified, no PRW config files configured")
379 if self.userLumicalcFilesPerCampaign
is not None and self.userLumicalcFiles
is not None:
380 raise ValueError(
"Both userLumicalcFiles and userLumicalcFilesPerCampaign specified,"
381 " use only one of the options!")
382 if self.userLumicalcFilesPerCampaign
is not None:
384 raise Exception(
'userLumicalcFilesPerCampaign requires campaign to be configured!')
385 if campaign
is Campaign.Unknown:
386 raise Exception(
'userLumicalcFilesPerCampaign used, but campaign = Unknown!')
388 toolLumicalcFiles = self.userLumicalcFilesPerCampaign[campaign.value][:]
389 log.info(
"Using user-provided per-campaign lumicalc files")
390 except KeyError
as e:
391 raise KeyError(f
"Unconfigured campaign {e} for userLumicalcFilesPerCampaign!")
392 elif self.userLumicalcFiles
is not None:
393 toolLumicalcFiles = self.userLumicalcFiles[:]
394 log.info(
"Using user-provided lumicalc files")
396 if campaign
and campaign
not in {Campaign.Unknown, Campaign.PhaseII}:
397 from PileupReweighting.AutoconfigurePRW
import getLumicalcFiles
398 toolLumicalcFiles = getLumicalcFiles(campaign, self.GRLSuffixDict)
399 log.info(
"Using auto-configured lumicalc files")
401 log.info(
"No campaign specified, no lumicalc files configured for PRW")
404 if config.geometry()
is LHCPeriod.Run4:
405 warnings.warn_explicit(
406 "Pileup reweighting is not yet supported for Run 4 geometry",
407 Run4FallbackWarning, filename=
"", lineno=0)
408 alg = config.createAlgorithm(
"CP::EventDecoratorAlg",
"EventDecoratorAlg")
409 alg.uint32Decorations = {
410 "RandomRunNumber": config.flags.Input.RunNumbers[0]
414 alg = config.createAlgorithm(
"CP::PileupReweightingAlg",
"PileupReweightingAlg")
415 config.addPrivateTool(
"pileupReweightingTool",
"CP::PileupReweightingTool")
416 alg.pileupReweightingTool.ConfigFiles = toolConfigFiles
417 if not toolConfigFiles
and config.dataType()
is not DataType.Data:
418 log.info(
"No PRW config files provided. Disabling reweighting")
420 alg.pileupWeightDecoration =
""
422 alg.pileupWeightDecoration = f
"PileupWeight{self.postfix}_%SYS%"
423 alg.pileupReweightingTool.LumiCalcFiles = toolLumicalcFiles
424 alg.pileupReweightingTool.UnrepresentedDataWarningThreshold = (
425 self.unrepresentedDataWarningThreshold)
430 alg.correctedScaledAverageMuDecoration =
"correctedScaledAverageInteractionsPerCrossing"
431 alg.correctedScaledActualMuDecoration =
"correctedScaledActualInteractionsPerCrossing"
432 alg.correctedAverageMuDecoration =
"correctedUnscaledAverageInteractionsPerCrossing"
433 alg.correctedActualMuDecoration =
"correctedUnscaledActualInteractionsPerCrossing"
435 eventInfoVar.extend([
436 (
"correctedScaledAverageInteractionsPerCrossing",
"float"),
437 (
"correctedScaledActualInteractionsPerCrossing",
"float"),
438 (
"correctedUnscaledAverageInteractionsPerCrossing",
"float"),
439 (
"correctedUnscaledActualInteractionsPerCrossing",
"float"),
442 if campaign
is Campaign.MC20a:
443 config.addOutputVar(
"EventInfo",
"correctedScaledAverageInteractionsPerCrossing",
"correctedScaledInteractionsPerCrossing", noSys=
True, auxType=
"float")
444 elif campaign >= Campaign.MC20d
and config.geometry()
is not LHCPeriod.Run4:
445 config.addOutputVar(
"EventInfo",
"correctedScaledActualInteractionsPerCrossing",
"correctedScaledInteractionsPerCrossing", noSys=
True, auxType=
"float")
447 if campaign
is Campaign.MC20a:
448 alg.correctedScaledAverageMuDecoration =
"correctedScaledInteractionsPerCrossing"
449 elif campaign >= Campaign.MC20d:
450 alg.correctedScaledActualMuDecoration =
"correctedScaledInteractionsPerCrossing"
451 eventInfoVar.extend([
452 (
"correctedScaledInteractionsPerCrossing",
"float"),
456 for var_name, var_type
in eventInfoVar:
457 config.addOutputVar(
"EventInfo", var_name, var_name, noSys=
True, auxType=var_type)
459 if config.dataType()
is not DataType.Data
and config.geometry()
is LHCPeriod.Run2:
460 config.addOutputVar(
"EventInfo",
"beamSpotWeight",
"weight_beamspot", noSys=
True, auxType=
"float")
462 if config.dataType()
is not DataType.Data
and toolConfigFiles:
463 config.addOutputVar(
"EventInfo", f
"PileupWeight{self.postfix}_%SYS%",
464 f
"weight_pileup{self.postfix}", auxType=
"float")