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