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