ATLAS Offline Software
Loading...
Searching...
No Matches
python.ElectronAnalysisConfig.ElectronWorkingPointEfficiencyConfig Class Reference
Inheritance diagram for python.ElectronAnalysisConfig.ElectronWorkingPointEfficiencyConfig:
Collaboration diagram for python.ElectronAnalysisConfig.ElectronWorkingPointEfficiencyConfig:

Public Member Functions

 __init__ (self)
 instanceName (self)
 makeAlgs (self, config)

Public Attributes

 forceFullSimConfig
 noEffSF
 saveDetailedSF
 containerName
str identificationWP = 'LooseBLayerLH':
 saveCombinedSF

Detailed Description

the ConfigBlock for the electron working point efficiency computation

Definition at line 633 of file ElectronAnalysisConfig.py.

Constructor & Destructor Documentation

◆ __init__()

python.ElectronAnalysisConfig.ElectronWorkingPointEfficiencyConfig.__init__ ( self)

Definition at line 636 of file ElectronAnalysisConfig.py.

636 def __init__(self) :
637 super (ElectronWorkingPointEfficiencyConfig, self).__init__ ()
638 self.setBlockName('ElectronWorkingPointEfficiency')
639 self.addDependency('ElectronWorkingPointSelection', required=True)
640 self.addDependency('EventSelection', required=False)
641 self.addDependency('EventSelectionMerger', required=False)
642 self.addOption ('containerName', '', type=str,
643 noneAction='error',
644 info="the name of the input container.")
645 self.addOption ('selectionName', '', type=str,
646 noneAction='error',
647 info="the name of the electron selection to define (e.g. `tight` or "
648 "`loose`).")
649 self.addOption ('postfix', None, type=str,
650 info="a postfix to apply to decorations and algorithm names. "
651 "Typically not needed here as `selectionName` is used internally.")
652 self.addOption ('identificationWP', None, type=str,
653 info="the ID WP to use. Supported ID WPs: `TightLH`, "
654 "`MediumLH`, `LooseBLayerLH`, `TightDNN`, `MediumDNN`, `LooseDNN`, "
655 "`TightNoCFDNN`, `MediumNoCFDNN`, `VeryLooseNoCF97DNN`, `NoID`.",
656 expertMode=["NoID"])
657 self.addOption ('isolationWP', None, type=str,
658 info="the isolation WP to use. Supported isolation WPs: "
659 "`HighPtCaloOnly`, `Loose_VarRad`, `Tight_VarRad`, `TightTrackOnly_"
660 "VarRad`, `TightTrackOnly_FixedRad`, `NonIso`.")
661 self.addOption ('noEffSF', False, type=bool,
662 info="disables the calculation of efficiencies and scale factors. "
663 "Experimental! only useful to test a new WP for which scale "
664 "factors are not available.",
665 expertMode=True)
666 self.addOption ('chargeIDSelectionRun2', False, type=bool,
667 info="whether to run the ECIDS tool. Only available for Run 2.")
668 self.addOption ('saveDetailedSF', True, type=bool,
669 info="save all the independent detailed object scale factors.")
670 self.addOption ('saveCombinedSF', False, type=bool,
671 info="save the combined object scale factor.")
672 self.addOption ('forceFullSimConfig', False, type=bool,
673 info="whether to force the tool to use the configuration meant for "
674 "full simulation samples. Only for testing purposes.")
675 self.addOption ('correlationModelId', 'SIMPLIFIED', type=str,
676 info="the correlation model to use for ID scale factors. "
677 "Supported models: `SIMPLIFIED`, `FULL`, `TOTAL`, `TOYS`.")
678 self.addOption ('correlationModelIso', 'SIMPLIFIED', type=str,
679 info="the correlation model to use for isolation scale factors, "
680 "Supported models: `SIMPLIFIED`, `FULL`, `TOTAL`, `TOYS`.")
681 self.addOption ('correlationModelReco', 'SIMPLIFIED', type=str,
682 info="the correlation model to use for reconstruction scale factors. "
683 "Supported models: `SIMPLIFIED`, `FULL`, `TOTAL`, `TOYS`.")
684 self.addOption('addChargeMisIDSF', False, type=bool,
685 info="adds scale factors for charge-misID.")
686

Member Function Documentation

◆ instanceName()

python.ElectronAnalysisConfig.ElectronWorkingPointEfficiencyConfig.instanceName ( self)
Return the instance name for this block

Definition at line 687 of file ElectronAnalysisConfig.py.

687 def instanceName (self) :
688 """Return the instance name for this block"""
689 if self.postfix is not None :
690 return self.containerName + '_' + self.selectionName + self.postfix
691 return self.containerName + '_' + self.selectionName
692

◆ makeAlgs()

python.ElectronAnalysisConfig.ElectronWorkingPointEfficiencyConfig.makeAlgs ( self,
config )

Definition at line 693 of file ElectronAnalysisConfig.py.

693 def makeAlgs (self, config) :
694
695 if self.forceFullSimConfig:
696 warnings.warn_explicit(
697 "You are running ElectronWorkingPointSelectionConfig forcing"
698 " full sim config. This is only intended to be used for"
699 " testing purposes.",
700 TestingOnlyWarning, filename='', lineno=0)
701
702 selectionPostfix = self.selectionName
703 if selectionPostfix != '' and selectionPostfix[0] != '_' :
704 selectionPostfix = '_' + selectionPostfix
705
706 # The setup below is inappropriate for Run 1
707 if config.geometry() is LHCPeriod.Run1:
708 raise ValueError ("Can't set up the ElectronWorkingPointSelectionConfig with %s, there must be something wrong!" % config.geometry().value)
709
710 postfix = self.postfix
711 if postfix is None :
712 postfix = self.selectionName
713 if postfix != '' and postfix[0] != '_' :
714 postfix = '_' + postfix
715
716 correlationModels = ["SIMPLIFIED", "FULL", "TOTAL", "TOYS"]
717 map_file = 'ElectronEfficiencyCorrection/2015_2025/rel22.2/2026_Run2Run3_Recommendation_v2/map1.txt'
718 sfList = []
719 # Set up the RECO electron efficiency correction algorithm:
720 if config.dataType() is not DataType.Data and not self.noEffSF:
721 alg = config.createAlgorithm( 'CP::ElectronEfficiencyCorrectionAlg',
722 'ElectronEfficiencyCorrectionAlgReco' )
723 config.addPrivateTool( 'efficiencyCorrectionTool',
724 'AsgElectronEfficiencyCorrectionTool' )
725 alg.scaleFactorDecoration = 'el_reco_effSF' + selectionPostfix + '_%SYS%'
726 alg.efficiencyCorrectionTool.MapFilePath = map_file
727 alg.efficiencyCorrectionTool.RecoKey = "Reconstruction"
728 if self.correlationModelReco not in correlationModels:
729 raise ValueError('Invalid correlation model for reconstruction efficiency, '
730 f'has to be one of: {", ".join(correlationModels)}')
731 if config.geometry() >= LHCPeriod.Run3 and self.correlationModelReco != "TOTAL":
732 warnings.warn_explicit(
733 "Only TOTAL correlation model is currently supported "
734 "for reconstruction efficiency correction in Run 3.",
735 ElectronEfficiencyCorrelationWarning,
736 filename='', lineno=0)
737 alg.efficiencyCorrectionTool.CorrelationModel = "TOTAL"
738 else:
739 alg.efficiencyCorrectionTool.CorrelationModel = self.correlationModelReco
740 if config.dataType() is DataType.FastSim:
741 alg.efficiencyCorrectionTool.ForceDataType = (
742 PATCore.ParticleDataType.Full if self.forceFullSimConfig
743 else PATCore.ParticleDataType.Fast)
744 elif config.dataType() is DataType.FullSim:
745 alg.efficiencyCorrectionTool.ForceDataType = \
746 PATCore.ParticleDataType.Full
747 alg.outOfValidity = 2 #silent
748 alg.outOfValidityDeco = 'el_reco_bad_eff' + selectionPostfix
749 alg.electrons = config.readName (self.containerName)
750 alg.preselection = config.getPreselection (self.containerName, self.selectionName)
751 if self.saveDetailedSF:
752 config.addOutputVar (self.containerName, alg.scaleFactorDecoration,
753 'reco_effSF' + postfix)
754 sfList += [alg.scaleFactorDecoration]
755
756 # Set up the ID electron efficiency correction algorithm:
757 if config.dataType() is not DataType.Data and not self.noEffSF and self.identificationWP != 'NoID':
758
759 alg = config.createAlgorithm( 'CP::ElectronEfficiencyCorrectionAlg',
760 'ElectronEfficiencyCorrectionAlgID' )
761 config.addPrivateTool( 'efficiencyCorrectionTool',
762 'AsgElectronEfficiencyCorrectionTool' )
763 alg.scaleFactorDecoration = 'el_id_effSF' + selectionPostfix + '_%SYS%'
764 alg.efficiencyCorrectionTool.MapFilePath = map_file
765 alg.efficiencyCorrectionTool.IdKey = self.identificationWP
766 if self.correlationModelId not in correlationModels:
767 raise ValueError('Invalid correlation model for identification efficiency, '
768 f'has to be one of: {", ".join(correlationModels)}')
769 alg.efficiencyCorrectionTool.CorrelationModel = self.correlationModelId
770 if config.dataType() is DataType.FastSim:
771 alg.efficiencyCorrectionTool.ForceDataType = (
772 PATCore.ParticleDataType.Full if self.forceFullSimConfig
773 else PATCore.ParticleDataType.Fast)
774 elif config.dataType() is DataType.FullSim:
775 alg.efficiencyCorrectionTool.ForceDataType = \
776 PATCore.ParticleDataType.Full
777 alg.outOfValidity = 2 #silent
778 alg.outOfValidityDeco = 'el_id_bad_eff' + selectionPostfix
779 alg.electrons = config.readName (self.containerName)
780 alg.preselection = config.getPreselection (self.containerName, self.selectionName)
781 if self.saveDetailedSF:
782 config.addOutputVar (self.containerName, alg.scaleFactorDecoration,
783 'id_effSF' + postfix)
784 sfList += [alg.scaleFactorDecoration]
785
786 # Set up the ISO electron efficiency correction algorithm:
787 if config.dataType() is not DataType.Data and self.isolationWP != 'NonIso' and not self.noEffSF:
788 alg = config.createAlgorithm( 'CP::ElectronEfficiencyCorrectionAlg',
789 'ElectronEfficiencyCorrectionAlgIsol' )
790 config.addPrivateTool( 'efficiencyCorrectionTool',
791 'AsgElectronEfficiencyCorrectionTool' )
792 alg.scaleFactorDecoration = 'el_isol_effSF' + selectionPostfix + '_%SYS%'
793 alg.efficiencyCorrectionTool.MapFilePath = map_file
794 alg.efficiencyCorrectionTool.IdKey = self.identificationWP
795 alg.efficiencyCorrectionTool.IsoKey = self.isolationWP
796 if self.correlationModelIso not in correlationModels:
797 raise ValueError('Invalid correlation model for isolation efficiency, '
798 f'has to be one of: {", ".join(correlationModels)}')
799 if config.geometry() >= LHCPeriod.Run3 and self.correlationModelIso != 'TOTAL':
800 warnings.warn_explicit(
801 "Only TOTAL correlation model is currently supported "
802 "for isolation efficiency correction in Run 3.",
803 ElectronEfficiencyCorrelationWarning,
804 filename='', lineno=0)
805 alg.efficiencyCorrectionTool.CorrelationModel = "TOTAL"
806 else:
807 alg.efficiencyCorrectionTool.CorrelationModel = self.correlationModelIso
808 if config.dataType() is DataType.FastSim:
809 alg.efficiencyCorrectionTool.ForceDataType = (
810 PATCore.ParticleDataType.Full if self.forceFullSimConfig
811 else PATCore.ParticleDataType.Fast)
812 elif config.dataType() is DataType.FullSim:
813 alg.efficiencyCorrectionTool.ForceDataType = \
814 PATCore.ParticleDataType.Full
815 alg.outOfValidity = 2 #silent
816 alg.outOfValidityDeco = 'el_isol_bad_eff' + selectionPostfix
817 alg.electrons = config.readName (self.containerName)
818 alg.preselection = config.getPreselection (self.containerName, self.selectionName)
819 if self.saveDetailedSF:
820 config.addOutputVar (self.containerName, alg.scaleFactorDecoration,
821 'isol_effSF' + postfix, auxType='float')
822 sfList += [alg.scaleFactorDecoration]
823
824 if (self.chargeIDSelectionRun2 and config.geometry() < LHCPeriod.Run3 and
825 config.dataType() is not DataType.Data and not self.noEffSF):
826 alg = config.createAlgorithm( 'CP::ElectronEfficiencyCorrectionAlg',
827 'ElectronEfficiencyCorrectionAlgEcids' )
828 config.addPrivateTool( 'efficiencyCorrectionTool',
829 'AsgElectronEfficiencyCorrectionTool' )
830 alg.scaleFactorDecoration = 'el_ecids_effSF' + selectionPostfix + '_%SYS%'
831 if self.isolationWP != 'Tight_VarRad':
832 raise ValueError('ECIDS SFs are supported only for Tight_VarRad isolation.')
833 if self.identificationWP == 'LooseBLayerLH':
834 ecids_lh = 'loose'
835 elif self.identificationWP == 'MediumLH':
836 ecids_lh = 'medium'
837 elif self.identificationWP == 'TightLH':
838 ecids_lh = 'tight'
839 else:
840 raise ValueError('ECIDS SFs are supported only for ID LooseBLayerLH, MediumLH, or TightLH')
841
842 alg.efficiencyCorrectionTool.CorrelationModel = "TOTAL"
843 alg.efficiencyCorrectionTool.CorrectionFileNameList = \
844 [f'ElectronEfficiencyCorrection/2015_2025/rel22.2/2025_Run2Rel22_Recommendation_v2/ecids/efficiencySF.ChargeID.{ecids_lh}_ECIDS_Tight_VarRad.root']
845 if config.dataType() is DataType.FastSim:
846 alg.efficiencyCorrectionTool.ForceDataType = (
847 PATCore.ParticleDataType.Full if self.forceFullSimConfig
848 else PATCore.ParticleDataType.Fast)
849 elif config.dataType() is DataType.FullSim:
850 alg.efficiencyCorrectionTool.ForceDataType = \
851 PATCore.ParticleDataType.Full
852 alg.outOfValidity = 2 #silent
853 alg.outOfValidityDeco = 'el_ecids_bad_eff' + selectionPostfix
854 alg.electrons = config.readName (self.containerName)
855 alg.preselection = config.getPreselection (self.containerName, self.selectionName)
856 if self.saveDetailedSF:
857 config.addOutputVar (self.containerName, alg.scaleFactorDecoration,
858 'ecids_effSF' + postfix)
859 sfList += [alg.scaleFactorDecoration]
860
861 if self.addChargeMisIDSF and config.dataType() is not DataType.Data and not self.noEffSF and config.geometry() >= LHCPeriod.Run3:
862 warnings.warn_explicit(
863 "Charge mis-ID SFs are only available for Run 2 and will not"
864 " have any effect in Run 3.",
865 Run2OnlyFeatureWarning, filename='', lineno=0)
866
867 elif self.addChargeMisIDSF and config.dataType() is not DataType.Data and not self.noEffSF and config.geometry() < LHCPeriod.Run3:
868 alg = config.createAlgorithm( 'CP::ElectronEfficiencyCorrectionAlg',
869 'ElectronEfficiencyCorrectionAlgMisid' )
870 config.addPrivateTool( 'efficiencyCorrectionTool',
871 'CP::ElectronChargeEfficiencyCorrectionTool' )
872 alg.scaleFactorDecoration = 'el_charge_misid_effSF' + selectionPostfix + '_%SYS%'
873 if self.isolationWP != 'Tight_VarRad':
874 raise ValueError('Charge mis-ID SFs are supported only for Tight_VarRad isolation.')
875 if self.identificationWP == 'LooseBLayerLH':
876 misid_lh = 'LooseAndBLayerLLH'
877 elif self.identificationWP == 'MediumLH':
878 misid_lh = 'MediumLLH'
879 elif self.identificationWP == 'TightLH':
880 misid_lh = 'TightLLH'
881 else:
882 raise ValueError('Charge mis-ID SFs are supported only for ID LooseBLayerLH, MediumLH, or TightLH')
883 misid_suffix = '_ECIDSloose' if self.chargeIDSelectionRun2 else ''
884
885 alg.efficiencyCorrectionTool.CorrectionFileName = \
886 f'ElectronEfficiencyCorrection/2015_2025/rel22.2/2025_Run2Rel22_Recommendation_v2/charge_misID/chargeEfficiencySF.{misid_lh}_d0z0_TightVarRad{misid_suffix}.root'
887 if config.dataType() is DataType.FastSim:
888 alg.efficiencyCorrectionTool.ForceDataType = (
889 PATCore.ParticleDataType.Full if self.forceFullSimConfig
890 else PATCore.ParticleDataType.Fast)
891 elif config.dataType() is DataType.FullSim:
892 alg.efficiencyCorrectionTool.ForceDataType = \
893 PATCore.ParticleDataType.Full
894 alg.outOfValidity = 2 #silent
895 alg.outOfValidityDeco = 'el_misid_bad_eff' + selectionPostfix
896 alg.electrons = config.readName (self.containerName)
897 alg.preselection = config.getPreselection (self.containerName, self.selectionName)
898 if self.saveDetailedSF:
899 config.addOutputVar (self.containerName, alg.scaleFactorDecoration,
900 'charge_misid_effSF' + postfix)
901 sfList += [alg.scaleFactorDecoration]
902
903 if config.dataType() is not DataType.Data and not self.noEffSF and self.saveCombinedSF:
904 alg = config.createAlgorithm( 'CP::AsgObjectScaleFactorAlg',
905 'ElectronCombinedEfficiencyScaleFactorAlg' )
906 alg.particles = config.readName (self.containerName)
907 alg.inScaleFactors = sfList
908 alg.outScaleFactor = 'effSF' + postfix + '_%SYS%'
909 config.addOutputVar (self.containerName, alg.outScaleFactor, 'effSF' + postfix)
910

Member Data Documentation

◆ containerName

python.ElectronAnalysisConfig.ElectronWorkingPointEfficiencyConfig.containerName

Definition at line 752 of file ElectronAnalysisConfig.py.

◆ forceFullSimConfig

python.ElectronAnalysisConfig.ElectronWorkingPointEfficiencyConfig.forceFullSimConfig

Definition at line 695 of file ElectronAnalysisConfig.py.

◆ identificationWP

str python.ElectronAnalysisConfig.ElectronWorkingPointEfficiencyConfig.identificationWP = 'LooseBLayerLH':

Definition at line 833 of file ElectronAnalysisConfig.py.

◆ noEffSF

python.ElectronAnalysisConfig.ElectronWorkingPointEfficiencyConfig.noEffSF

Definition at line 720 of file ElectronAnalysisConfig.py.

◆ saveCombinedSF

python.ElectronAnalysisConfig.ElectronWorkingPointEfficiencyConfig.saveCombinedSF

Definition at line 903 of file ElectronAnalysisConfig.py.

◆ saveDetailedSF

python.ElectronAnalysisConfig.ElectronWorkingPointEfficiencyConfig.saveDetailedSF

Definition at line 751 of file ElectronAnalysisConfig.py.


The documentation for this class was generated from the following file: