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