260 def makeAlgs (self, config) :
261
262 from Campaigns.Utils import Campaign
263
264 log = logging.getLogger("makePileupAnalysisSequence")
265
266 eventInfoVar = [
267 ("runNumber", "unsigned"),
268 ("eventNumber", "unsigned_long"),
269 ]
270 if config.dataType() is not DataType.Data:
271 eventInfoVar.extend([
272 ("mcChannelNumber", "unsigned"),
273 ])
274
275 eventInfoVar.extend([
276 ("averageInteractionsPerCrossing", "float"),
277 ("actualInteractionsPerCrossing", "float"),
278 ])
279 if self.writeColumnarToolVariables:
280
281
282
283 eventInfoVar.extend([
284 ("eventTypeBitmask", "int"),
285 ])
286
287 if config.isPhyslite() and not self.alternativeConfig:
288
289 log.info("Physlite does not need pileup reweighting. Variables will be copied from input instead.")
290 if self.writeDetailedPileupValues:
291 log.warning("writeDetailedPileupValues is set to True, but Physlite does not have these variables. They will not be written to the output.")
292
293 eventInfoVar.extend([
294 ("correctedScaledInteractionsPerCrossing", "float"),
295 ])
296 for var_name, var_type in eventInfoVar:
297 config.addOutputVar("EventInfo", var_name, var_name, noSys=True, auxType=var_type)
298
299 if config.dataType() is not DataType.Data:
300 config.addOutputVar("EventInfo", "PileupWeight_%SYS%", "weight_pileup", auxType="float")
301 if config.geometry() is LHCPeriod.Run2:
302 config.addOutputVar("EventInfo", "beamSpotWeight", "weight_beamspot", noSys=True, auxType="float")
303 return
304
305
306 if self.files is None and config.flags is not None:
307 self.files = config.flags.Input.Files
308
309 campaign = self.campaign
310
311 if self.campaign is None:
312
313 if config.campaign() is not None and config.campaign() is not Campaign.Unknown:
314 campaign = config.campaign()
315 log.info("Auto-configuring campaign for PRW from flags: %s", campaign.value)
316 elif config.dataType() is DataType.Data:
317 log.info("Inferring campaign from data year: %d", config.dataYear())
318 campaign = {
319 2015: Campaign.MC20a,
320 2016: Campaign.MC20a,
321 2017: Campaign.MC20d,
322 2018: Campaign.MC20e,
323 2022: Campaign.MC23a,
324 2023: Campaign.MC23d,
325 2024: Campaign.MC23e,
326 2025: Campaign.MC23g,
327 2026: Campaign.MC23g,
328 }.
get(config.dataYear(), Campaign.Unknown)
329 else:
330
331 if self.files is not None:
332 from Campaigns.Utils import getMCCampaign
333 campaign = getMCCampaign(self.files)
334 if campaign and campaign is not Campaign.Unknown:
335 log.info("Auto-configuring campaign for PRW from files: %s", campaign.value)
336 else:
337 log.info("Campaign could not be determined.")
338
339
340 toolConfigFiles = []
341 toolLumicalcFiles = []
342
343
344
345 if (config.dataType() is not DataType.Data and
346 config.geometry() is not LHCPeriod.Run4):
347
348 if self.userPileupConfigs is not None and self.userPileupConfigsPerCampaign is not None:
349 raise ValueError("Both userPileupConfigs and userPileupConfigsPerCampaign specified,"
350 " use only one of the options!")
351 if self.userPileupConfigsPerCampaign is not None:
352 if not campaign:
353 raise Exception("userPileupConfigsPerCampaign requires campaign to be configured!")
354 if campaign is Campaign.Unknown:
355 raise Exception("userPileupConfigsPerCampaign used, but campaign = Unknown!")
356 try:
357 toolConfigFiles = self.userPileupConfigsPerCampaign[campaign.value][:]
358 log.info("Using user provided per-campaign PRW configuration")
359 except KeyError as e:
360 raise KeyError(f"Unconfigured campaign {e} for userPileupConfigsPerCampaign!")
361
362 elif self.userPileupConfigs is not None:
363 toolConfigFiles = self.userPileupConfigs[:]
364 log.info("Using user provided PRW configuration")
365
366 else:
367 if self.useDefaultConfig and self.files is None:
368 raise ValueError("useDefaultConfig requires files to be configured!"
369 " Either pass them as an option or use flags.")
370
371 from PileupReweighting.AutoconfigurePRW import getConfigurationFiles
372 if campaign and campaign is not Campaign.Unknown:
373 toolConfigFiles = getConfigurationFiles(campaign=campaign,
374 files=self.files,
375 useDefaultConfig=self.useDefaultConfig,
376 data_type=config.dataType(),
377 GRLSuffixDict=self.GRLSuffixDict)
378 if self.useDefaultConfig:
379 log.info("Auto-configuring universal/default PRW config")
380 else:
381 log.info("Auto-configuring per-sample PRW config files based on input files")
382 else:
383 log.info("No campaign specified, no PRW config files configured")
384
385
386
387 if self.userLumicalcFilesPerCampaign is not None and self.userLumicalcFiles is not None:
388 raise ValueError("Both userLumicalcFiles and userLumicalcFilesPerCampaign specified,"
389 " use only one of the options!")
390 if self.userLumicalcFilesPerCampaign is not None:
391 if not campaign:
392 raise Exception('userLumicalcFilesPerCampaign requires campaign to be configured!')
393 if campaign is Campaign.Unknown:
394 raise Exception('userLumicalcFilesPerCampaign used, but campaign = Unknown!')
395 try:
396 toolLumicalcFiles = self.userLumicalcFilesPerCampaign[campaign.value][:]
397 log.info("Using user-provided per-campaign lumicalc files")
398 except KeyError as e:
399 raise KeyError(f"Unconfigured campaign {e} for userLumicalcFilesPerCampaign!")
400 elif self.userLumicalcFiles is not None:
401 toolLumicalcFiles = self.userLumicalcFiles[:]
402 log.info("Using user-provided lumicalc files")
403 else:
404 if campaign and campaign not in {Campaign.Unknown, Campaign.PhaseII}:
405 from PileupReweighting.AutoconfigurePRW import getLumicalcFiles
406 toolLumicalcFiles = getLumicalcFiles(campaign, self.GRLSuffixDict)
407 log.info("Using auto-configured lumicalc files")
408 else:
409 log.info("No campaign specified, no lumicalc files configured for PRW")
410
411
412 if config.geometry() is LHCPeriod.Run4:
413 warnings.warn_explicit(
414 "Pileup reweighting is not yet supported for Run 4 geometry",
415 Run4FallbackWarning, filename="", lineno=0)
416 alg = config.createAlgorithm("CP::EventDecoratorAlg", "EventDecoratorAlg")
417 alg.uint32Decorations = {
418 "RandomRunNumber": config.flags.Input.RunNumbers[0]
419 }
420
421 else:
422 alg = config.createAlgorithm("CP::PileupReweightingAlg", "PileupReweightingAlg")
423 config.addPrivateTool("pileupReweightingTool", "CP::PileupReweightingTool")
424 alg.pileupReweightingTool.ConfigFiles = toolConfigFiles
425 if not toolConfigFiles and config.dataType() is not DataType.Data:
426 log.info("No PRW config files provided. Disabling reweighting")
427
428 alg.pileupWeightDecoration = ""
429 else:
430 alg.pileupWeightDecoration = f"PileupWeight{self.postfix}_%SYS%"
431 alg.pileupReweightingTool.LumiCalcFiles = toolLumicalcFiles
432 alg.pileupReweightingTool.UnrepresentedDataWarningThreshold = (
433 self.unrepresentedDataWarningThreshold)
434
435
436 if not self.alternativeConfig:
437 if self.writeDetailedPileupValues:
438 alg.correctedScaledAverageMuDecoration = "correctedScaledAverageInteractionsPerCrossing"
439 alg.correctedScaledActualMuDecoration = "correctedScaledActualInteractionsPerCrossing"
440 alg.correctedAverageMuDecoration = "correctedUnscaledAverageInteractionsPerCrossing"
441 alg.correctedActualMuDecoration = "correctedUnscaledActualInteractionsPerCrossing"
442
443 eventInfoVar.extend([
444 ("correctedScaledAverageInteractionsPerCrossing", "float"),
445 ("correctedScaledActualInteractionsPerCrossing", "float"),
446 ("correctedUnscaledAverageInteractionsPerCrossing", "float"),
447 ("correctedUnscaledActualInteractionsPerCrossing", "float"),
448 ])
449
450 if campaign is Campaign.MC20a:
451 config.addOutputVar("EventInfo", "correctedScaledAverageInteractionsPerCrossing", "correctedScaledInteractionsPerCrossing", noSys=True, auxType="float")
452 elif campaign >= Campaign.MC20d and config.geometry() is not LHCPeriod.Run4:
453 config.addOutputVar("EventInfo", "correctedScaledActualInteractionsPerCrossing", "correctedScaledInteractionsPerCrossing", noSys=True, auxType="float")
454 else:
455 if campaign is Campaign.MC20a:
456 alg.correctedScaledAverageMuDecoration = "correctedScaledInteractionsPerCrossing"
457 elif campaign >= Campaign.MC20d:
458 alg.correctedScaledActualMuDecoration = "correctedScaledInteractionsPerCrossing"
459 eventInfoVar.extend([
460 ("correctedScaledInteractionsPerCrossing", "float"),
461 ])
462
463 if not self.alternativeConfig:
464 for var_name, var_type in eventInfoVar:
465 config.addOutputVar("EventInfo", var_name, var_name, noSys=True, auxType=var_type)
466
467 if config.dataType() is not DataType.Data and config.geometry() is LHCPeriod.Run2:
468 config.addOutputVar("EventInfo", "beamSpotWeight", "weight_beamspot", noSys=True, auxType="float")
469
470 if config.dataType() is not DataType.Data and toolConfigFiles:
471 config.addOutputVar("EventInfo", f"PileupWeight{self.postfix}_%SYS%",
472 f"weight_pileup{self.postfix}", auxType="float")
473
474
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)