369 def makeAlgs (self, config) :
371 log = logging.getLogger(
'PhotonWorkingPointConfig')
374 if config.geometry()
is LHCPeriod.Run1:
375 raise ValueError (
"Can't set up the PhotonWorkingPointConfig with %s, there must be something wrong!" % config.geometry().value)
377 if self.forceFullSimConfigForID:
378 log.warning(
"You are running PhotonWorkingPointConfig forcing full sim config for ID")
379 log.warning(
"This is only intended to be used for testing purposes")
381 if self.forceFullSimConfigForIso:
382 log.warning(
"You are running PhotonWorkingPointConfig forcing full sim config for Iso")
383 log.warning(
"This is only intended to be used for testing purposes")
385 postfix = self.postfix
387 postfix = self.selectionName
388 if postfix !=
'' and postfix[0] !=
'_' :
389 postfix =
'_' + postfix
391 if self.qualityWP ==
'Tight' :
392 quality = ROOT.egammaPID.PhotonTight
393 elif self.qualityWP ==
'Medium' :
394 quality = ROOT.egammaPID.PhotonMedium
395 elif self.qualityWP ==
'Loose' :
396 quality = ROOT.egammaPID.PhotonLoose
398 raise Exception (
'unknown photon quality working point "' + self.qualityWP +
'" should be Tight, Medium or Loose')
401 alg = config.createAlgorithm(
'CP::AsgSelectionAlg',
'PhotonIsEMSelectorAlg' )
402 alg.selectionDecoration =
'selectEM' + postfix +
',as_char'
403 if self.recomputeIsEM:
405 config.addPrivateTool(
'selectionTool',
'AsgPhotonIsEMSelector' )
406 alg.selectionTool.isEMMask = quality
407 if config.geometry()
is LHCPeriod.Run2:
408 if self.qualityWP ==
'Tight':
409 alg.selectionTool.ConfigFile =
'ElectronPhotonSelectorTools/offline/mc20_20240510/PhotonIsEMTightSelectorCutDefs_pTdep_mc20_smooth.conf'
410 elif self.qualityWP ==
'Loose':
411 alg.selectionTool.ConfigFile =
'ElectronPhotonSelectorTools/offline/mc15_20150712/PhotonIsEMLooseSelectorCutDefs.conf'
412 elif self.qualityWP ==
'Medium':
413 alg.selectionTool.ConfigFile =
'ElectronPhotonSelectorTools/offline/mc20_20240510/PhotonIsEMMediumSelectorCutDefs_pTdep_smooth.conf'
414 if config.geometry()
is LHCPeriod.Run3:
415 if self.qualityWP ==
'Tight':
416 alg.selectionTool.ConfigFile =
'ElectronPhotonSelectorTools/offline/20180825/PhotonIsEMTightSelectorCutDefs.conf'
417 elif self.qualityWP ==
'Loose':
418 alg.selectionTool.ConfigFile =
'ElectronPhotonSelectorTools/offline/mc15_20150712/PhotonIsEMLooseSelectorCutDefs.conf'
419 elif self.qualityWP ==
'Medium':
420 raise ValueError(
'No Medium menu available for Run-3. Please get in contact with egamma')
423 config.addPrivateTool(
'selectionTool',
'CP::AsgFlagSelectionTool' )
424 dfFlag =
'DFCommonPhotonsIsEM' + self.qualityWP
425 alg.selectionTool.selectionFlags = [ dfFlag ]
426 alg.particles = config.readName (self.containerName)
427 alg.preselection = config.getPreselection (self.containerName, self.selectionName)
428 config.addSelection (self.containerName, self.selectionName, alg.selectionDecoration,
429 preselection=self.addSelectionToPreselection)
432 if self.doFSRSelection :
434 wpFlag = alg.selectionDecoration.split(
",")[0]
435 alg = config.createAlgorithm(
'CP::EgammaFSRForMuonsCollectorAlg',
'EgammaFSRForMuonsCollectorAlg')
436 alg.selectionDecoration = wpFlag
437 alg.ElectronOrPhotonContKey = config.readName (self.containerName)
440 if self.isolationWP !=
'NonIso' :
441 alg = config.createAlgorithm(
'CP::EgammaIsolationSelectionAlg',
442 'PhotonIsolationSelectionAlg' )
443 alg.selectionDecoration =
'isolated' + postfix +
',as_char'
444 config.addPrivateTool(
'selectionTool',
'CP::IsolationSelectionTool' )
445 alg.selectionTool.PhotonWP = self.isolationWP
446 if self.closeByCorrection:
447 alg.selectionTool.IsoDecSuffix =
"CloseByCorr"
449 alg.egammas = config.readName (self.containerName)
450 alg.preselection = config.getPreselection (self.containerName, self.selectionName)
451 config.addSelection (self.containerName, self.selectionName, alg.selectionDecoration,
452 preselection=self.addSelectionToPreselection)
456 if config.dataType()
is not DataType.Data
and not self.noEffSFForID:
457 alg = config.createAlgorithm(
'CP::PhotonEfficiencyCorrectionAlg',
458 'PhotonEfficiencyCorrectionAlgID' )
459 config.addPrivateTool(
'efficiencyCorrectionTool',
460 'AsgPhotonEfficiencyCorrectionTool' )
461 alg.scaleFactorDecoration =
'ph_id_effSF' + postfix +
'_%SYS%'
462 if config.dataType()
is DataType.FastSim:
463 alg.efficiencyCorrectionTool.ForceDataType = (
464 PATCore.ParticleDataType.Full
if self.forceFullSimConfigForID
else
465 PATCore.ParticleDataType.Fast)
466 elif config.dataType()
is DataType.FullSim:
467 alg.efficiencyCorrectionTool.ForceDataType = \
468 PATCore.ParticleDataType.Full
469 if config.geometry() >= LHCPeriod.Run2:
470 alg.efficiencyCorrectionTool.MapFilePath =
'PhotonEfficiencyCorrection/2015_2025/rel22.2/2024_FinalRun2_Recommendation_v1/map1.txt'
471 alg.outOfValidity = 2
472 alg.outOfValidityDeco =
'ph_id_bad_eff' + postfix
473 alg.photons = config.readName (self.containerName)
474 alg.preselection = config.getPreselection (self.containerName, self.selectionName)
475 if self.saveDetailedSF:
476 config.addOutputVar (self.containerName, alg.scaleFactorDecoration,
477 'id_effSF' + postfix)
478 sfList += [alg.scaleFactorDecoration]
481 if config.dataType()
is not DataType.Data
and self.isolationWP !=
'NonIso' and not self.noEffSFForIso:
482 alg = config.createAlgorithm(
'CP::PhotonEfficiencyCorrectionAlg',
483 'PhotonEfficiencyCorrectionAlgIsol' )
484 config.addPrivateTool(
'efficiencyCorrectionTool',
485 'AsgPhotonEfficiencyCorrectionTool' )
486 alg.scaleFactorDecoration =
'ph_isol_effSF' + postfix +
'_%SYS%'
487 if config.dataType()
is DataType.FastSim:
488 alg.efficiencyCorrectionTool.ForceDataType = (
489 PATCore.ParticleDataType.Full
if self.forceFullSimConfigForIso
else
490 PATCore.ParticleDataType.Fast)
491 elif config.dataType()
is DataType.FullSim:
492 alg.efficiencyCorrectionTool.ForceDataType = \
493 PATCore.ParticleDataType.Full
494 alg.efficiencyCorrectionTool.IsoKey = self.isolationWP.
replace(
"FixedCut",
"")
495 if config.geometry() >= LHCPeriod.Run2:
496 alg.efficiencyCorrectionTool.MapFilePath =
'PhotonEfficiencyCorrection/2015_2025/rel22.2/2022_Summer_Prerecom_v1/map1.txt'
497 alg.outOfValidity = 2
498 alg.outOfValidityDeco =
'ph_isol_bad_eff' + postfix
499 alg.photons = config.readName (self.containerName)
500 alg.preselection = config.getPreselection (self.containerName, self.selectionName)
501 if self.saveDetailedSF:
502 config.addOutputVar (self.containerName, alg.scaleFactorDecoration,
503 'isol_effSF' + postfix)
504 sfList += [alg.scaleFactorDecoration]
506 doCombEffSF =
not self.noEffSFForID
or not self.noEffSFForIso
507 if config.dataType()
is not DataType.Data
and doCombEffSF
and self.saveCombinedSF:
508 alg = config.createAlgorithm(
'CP::AsgObjectScaleFactorAlg',
509 'PhotonCombinedEfficiencyScaleFactorAlg' )
510 alg.particles = config.readName (self.containerName)
511 alg.inScaleFactors = sfList
512 alg.outScaleFactor =
'effSF' + postfix +
'_%SYS%'
513 config.addOutputVar (self.containerName, alg.outScaleFactor,
'effSF' + postfix)