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