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 659 of file ElectronAnalysisConfig.py.

Constructor & Destructor Documentation

◆ __init__()

python.ElectronAnalysisConfig.ElectronWorkingPointEfficiencyConfig.__init__ ( self)

Definition at line 662 of file ElectronAnalysisConfig.py.

662 def __init__(self) :
663 super (ElectronWorkingPointEfficiencyConfig, self).__init__ ()
664 self.setBlockName('ElectronWorkingPointEfficiency')
665 self.addDependency('ElectronWorkingPointSelection', required=True)
666 self.addDependency('EventSelection', required=False)
667 self.addDependency('EventSelectionMerger', required=False)
668 self.addOption ('containerName', '', type=str,
669 noneAction='error',
670 info="the name of the input container.",
671 meta={'role':'containerRef'})
672 self.addOption ('selectionName', '', type=str,
673 noneAction='error',
674 info="the name of the electron selection to define (e.g. `tight` or "
675 "`loose`).",
676 meta={'role':'selection'})
677 self.addOption ('postfix', None, type=str,
678 info="a postfix to apply to decorations and algorithm names. "
679 "Typically not needed here as `selectionName` is used internally.")
680 self.addOption ('identificationWP', None, type=str,
681 info="the ID WP to use. Supported ID WPs: `TightLH`, "
682 "`MediumLH`, `LooseBLayerLH`, `TightDNN`, `MediumDNN`, `LooseDNN`, "
683 "`TightNoCFDNN`, `MediumNoCFDNN`, `VeryLooseNoCF97DNN`, `NoID`.",
684 expertMode=["NoID"],
685 meta={'choices':(['MediumLH', 'LooseBLayerLH', 'TightDNN', 'MediumDNN', 'LooseDNN',
686 'TightNoCFDNN', 'MediumNoCFDNN', 'VeryLooseNoCF97DNN', 'NoID'],1)})
687 self.addOption ('isolationWP', None, type=str,
688 info="the isolation WP to use. Supported isolation WPs: "
689 "`HighPtCaloOnly`, `Loose_VarRad`, `Tight_VarRad`, `TightTrackOnly_"
690 "VarRad`, `TightTrackOnly_FixedRad`, `NonIso`.",
691 meta={'choices':(['HighPtCaloOnly', 'Loose_VarRad', 'Tight_VarRad', 'TightTrackOnly_VarRad',
692 'TightTrackOnly_FixedRad', 'NonIso'],1)})
693 self.addOption ('noEffSF', False, type=bool,
694 info="disables the calculation of efficiencies and scale factors. "
695 "Experimental! only useful to test a new WP for which scale "
696 "factors are not available.",
697 expertMode=True)
698 self.addOption ('chargeIDSelectionRun2', False, type=bool,
699 info="whether to run the ECIDS tool. Only available for Run 2.")
700 self.addOption ('saveDetailedSF', True, type=bool,
701 info="save all the independent detailed object scale factors.")
702 self.addOption ('saveCombinedSF', False, type=bool,
703 info="save the combined object scale factor.")
704 self.addOption ('forceFullSimConfig', False, type=bool,
705 info="whether to force the tool to use the configuration meant for "
706 "full simulation samples. Only for testing purposes.")
707 self.addOption ('correlationModelId', 'SIMPLIFIED', type=str,
708 info="the correlation model to use for ID scale factors. "
709 "Supported models: `SIMPLIFIED`, `FULL`, `TOTAL`, `TOYS`.",
710 meta={'choices':(['SIMPLIFIED','FULL','TOTAL','TOYS'],1)})
711 self.addOption ('correlationModelIso', 'SIMPLIFIED', type=str,
712 info="the correlation model to use for isolation scale factors, "
713 "Supported models: `SIMPLIFIED`, `FULL`, `TOTAL`, `TOYS`.",
714 meta={'choices':(['SIMPLIFIED','FULL','TOTAL','TOYS'],1)})
715 self.addOption ('correlationModelReco', 'SIMPLIFIED', type=str,
716 info="the correlation model to use for reconstruction scale factors. "
717 "Supported models: `SIMPLIFIED`, `FULL`, `TOTAL`, `TOYS`.",
718 meta={'choices':(['SIMPLIFIED','FULL','TOTAL','TOYS'],1)})
719 self.addOption('addChargeMisIDSF', False, type=bool,
720 info="adds scale factors for charge-misID.")
721

Member Function Documentation

◆ instanceName()

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

Definition at line 722 of file ElectronAnalysisConfig.py.

722 def instanceName (self) :
723 """Return the instance name for this block"""
724 if self.postfix is not None :
725 return self.containerName + '_' + self.selectionName + self.postfix
726 return self.containerName + '_' + self.selectionName
727

◆ makeAlgs()

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

Definition at line 728 of file ElectronAnalysisConfig.py.

728 def makeAlgs (self, config) :
729
730 if self.forceFullSimConfig:
731 warnings.warn_explicit(
732 "You are running ElectronWorkingPointSelectionConfig forcing"
733 " full sim config. This is only intended to be used for"
734 " testing purposes.",
735 TestingOnlyWarning, filename='', lineno=0)
736
737 selectionPostfix = self.selectionName
738 if selectionPostfix != '' and selectionPostfix[0] != '_' :
739 selectionPostfix = '_' + selectionPostfix
740
741 # The setup below is inappropriate for Run 1
742 if config.geometry() is LHCPeriod.Run1:
743 raise ValueError ("Can't set up the ElectronWorkingPointSelectionConfig with %s, there must be something wrong!" % config.geometry().value)
744
745 if self.identificationWP is None:
746 raise ValueError ("ElectronWorkingPointEfficiencyConfig: the identificationWP option must be set")
747
748 postfix = self.postfix
749 if postfix is None :
750 postfix = self.selectionName
751 if postfix != '' and postfix[0] != '_' :
752 postfix = '_' + postfix
753
754 correlationModels = ["SIMPLIFIED", "FULL", "TOTAL", "TOYS"]
755 map_file = 'ElectronEfficiencyCorrection/2015_2025/rel22.2/2026_Run2Run3_Recommendation_v3/map1.txt'
756 sfList = []
757 # Set up the RECO electron efficiency correction algorithm:
758 if config.dataType() is not DataType.Data and not self.noEffSF:
759 alg = config.createAlgorithm( 'CP::ElectronEfficiencyCorrectionAlg',
760 'ElectronEfficiencyCorrectionAlgReco' )
761 config.addPrivateTool( 'efficiencyCorrectionTool',
762 'CP::AsgElectronEfficiencyCorrectionTool' )
763 alg.scaleFactorDecoration = 'el_reco_effSF' + selectionPostfix + '_%SYS%'
764 alg.efficiencyCorrectionTool.MapFilePath = map_file
765 alg.efficiencyCorrectionTool.RecoKey = "Reconstruction"
766 if self.correlationModelReco not in correlationModels:
767 raise ValueError('Invalid correlation model for reconstruction efficiency, '
768 f'has to be one of: {", ".join(correlationModels)}')
769 if config.geometry() >= LHCPeriod.Run3 and self.correlationModelReco != "TOTAL":
770 warnings.warn_explicit(
771 "Only TOTAL correlation model is currently supported "
772 "for reconstruction efficiency correction in Run 3."
773 f"Your choice {self.correlationModelReco} will be "
774 "overwritten with TOTAL",
775 ElectronEfficiencyCorrelationWarning,
776 filename='', lineno=0)
777 alg.efficiencyCorrectionTool.CorrelationModel = "TOTAL"
778 else:
779 alg.efficiencyCorrectionTool.CorrelationModel = self.correlationModelReco
780 if config.dataType() is DataType.FastSim:
781 alg.efficiencyCorrectionTool.ForceDataType = (
782 PATCore.ParticleDataType.Full if self.forceFullSimConfig
783 else PATCore.ParticleDataType.Fast)
784 elif config.dataType() is DataType.FullSim:
785 alg.efficiencyCorrectionTool.ForceDataType = \
786 PATCore.ParticleDataType.Full
787 alg.outOfValidity = 2 #silent
788 alg.outOfValidityDeco = 'el_reco_bad_eff' + selectionPostfix
789 alg.electrons = config.readName (self.containerName)
790 alg.preselection = config.getPreselection (self.containerName, self.selectionName)
791 if self.saveDetailedSF:
792 config.addOutputVar (self.containerName, alg.scaleFactorDecoration,
793 'reco_effSF' + postfix, auxType='float')
794 sfList += [alg.scaleFactorDecoration]
795
796 # Set up the ID electron efficiency correction algorithm:
797 if config.dataType() is not DataType.Data and not self.noEffSF and self.identificationWP != 'NoID':
798
799 alg = config.createAlgorithm( 'CP::ElectronEfficiencyCorrectionAlg',
800 'ElectronEfficiencyCorrectionAlgID' )
801 config.addPrivateTool( 'efficiencyCorrectionTool',
802 'CP::AsgElectronEfficiencyCorrectionTool' )
803 alg.scaleFactorDecoration = 'el_id_effSF' + selectionPostfix + '_%SYS%'
804 alg.efficiencyCorrectionTool.MapFilePath = map_file
805 alg.efficiencyCorrectionTool.IdKey = self.identificationWP
806 if self.correlationModelId not in correlationModels:
807 raise ValueError('Invalid correlation model for identification efficiency, '
808 f'has to be one of: {", ".join(correlationModels)}')
809 alg.efficiencyCorrectionTool.CorrelationModel = self.correlationModelId
810 if config.dataType() is DataType.FastSim:
811 alg.efficiencyCorrectionTool.ForceDataType = (
812 PATCore.ParticleDataType.Full if self.forceFullSimConfig
813 else PATCore.ParticleDataType.Fast)
814 elif config.dataType() is DataType.FullSim:
815 alg.efficiencyCorrectionTool.ForceDataType = \
816 PATCore.ParticleDataType.Full
817 alg.outOfValidity = 2 #silent
818 alg.outOfValidityDeco = 'el_id_bad_eff' + selectionPostfix
819 alg.electrons = config.readName (self.containerName)
820 alg.preselection = config.getPreselection (self.containerName, self.selectionName)
821 if self.saveDetailedSF:
822 config.addOutputVar (self.containerName, alg.scaleFactorDecoration,
823 'id_effSF' + postfix, auxType='float')
824 sfList += [alg.scaleFactorDecoration]
825
826 # Set up the ISO electron efficiency correction algorithm:
827 if config.dataType() is not DataType.Data and self.isolationWP != 'NonIso' and not self.noEffSF:
828 alg = config.createAlgorithm( 'CP::ElectronEfficiencyCorrectionAlg',
829 'ElectronEfficiencyCorrectionAlgIsol' )
830 config.addPrivateTool( 'efficiencyCorrectionTool',
831 'CP::AsgElectronEfficiencyCorrectionTool' )
832 alg.scaleFactorDecoration = 'el_isol_effSF' + selectionPostfix + '_%SYS%'
833 alg.efficiencyCorrectionTool.MapFilePath = map_file
834 alg.efficiencyCorrectionTool.IdKey = self.identificationWP
835 alg.efficiencyCorrectionTool.IsoKey = self.isolationWP
836 if self.correlationModelIso not in correlationModels:
837 raise ValueError('Invalid correlation model for isolation efficiency, '
838 f'has to be one of: {", ".join(correlationModels)}')
839 if config.geometry() >= LHCPeriod.Run3 and self.correlationModelIso != 'TOTAL':
840 warnings.warn_explicit(
841 "Only TOTAL correlation model is currently supported "
842 "for isolation efficiency correction in Run 3."
843 f"Your choice {self.correlationModelIso} will be "
844 "overwritten with TOTAL",
845 ElectronEfficiencyCorrelationWarning,
846 filename='', lineno=0)
847 alg.efficiencyCorrectionTool.CorrelationModel = "TOTAL"
848 else:
849 alg.efficiencyCorrectionTool.CorrelationModel = self.correlationModelIso
850 if config.dataType() is DataType.FastSim:
851 alg.efficiencyCorrectionTool.ForceDataType = (
852 PATCore.ParticleDataType.Full if self.forceFullSimConfig
853 else PATCore.ParticleDataType.Fast)
854 elif config.dataType() is DataType.FullSim:
855 alg.efficiencyCorrectionTool.ForceDataType = \
856 PATCore.ParticleDataType.Full
857 alg.outOfValidity = 2 #silent
858 alg.outOfValidityDeco = 'el_isol_bad_eff' + selectionPostfix
859 alg.electrons = config.readName (self.containerName)
860 alg.preselection = config.getPreselection (self.containerName, self.selectionName)
861 if self.saveDetailedSF:
862 config.addOutputVar (self.containerName, alg.scaleFactorDecoration,
863 'isol_effSF' + postfix, auxType='float')
864 sfList += [alg.scaleFactorDecoration]
865
866 if (self.chargeIDSelectionRun2 and config.geometry() < LHCPeriod.Run3 and
867 config.dataType() is not DataType.Data and not self.noEffSF):
868 alg = config.createAlgorithm( 'CP::ElectronEfficiencyCorrectionAlg',
869 'ElectronEfficiencyCorrectionAlgEcids' )
870 config.addPrivateTool( 'efficiencyCorrectionTool',
871 'CP::AsgElectronEfficiencyCorrectionTool' )
872 alg.scaleFactorDecoration = 'el_ecids_effSF' + selectionPostfix + '_%SYS%'
873 if self.isolationWP != 'Tight_VarRad':
874 raise ValueError('ECIDS SFs are supported only for Tight_VarRad isolation.')
875 if self.identificationWP == 'LooseBLayerLH':
876 ecids_lh = 'loose'
877 elif self.identificationWP == 'MediumLH':
878 ecids_lh = 'medium'
879 elif self.identificationWP == 'TightLH':
880 ecids_lh = 'tight'
881 else:
882 raise ValueError('ECIDS SFs are supported only for ID LooseBLayerLH, MediumLH, or TightLH')
883
884 alg.efficiencyCorrectionTool.CorrelationModel = "TOTAL"
885 alg.efficiencyCorrectionTool.CorrectionFileNameList = \
886 [f'ElectronEfficiencyCorrection/2015_2025/rel22.2/2025_Run2Rel22_Recommendation_v2/ecids/efficiencySF.ChargeID.{ecids_lh}_ECIDS_Tight_VarRad.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_ecids_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 'ecids_effSF' + postfix, auxType='float')
901 sfList += [alg.scaleFactorDecoration]
902
903 if self.addChargeMisIDSF and config.dataType() is not DataType.Data and not self.noEffSF and config.geometry() >= LHCPeriod.Run3:
904 warnings.warn_explicit(
905 "Charge mis-ID SFs are only available for Run 2 and will not"
906 " have any effect in Run 3.",
907 Run2OnlyFeatureWarning, filename='', lineno=0)
908
909 elif self.addChargeMisIDSF and config.dataType() is not DataType.Data and not self.noEffSF and config.geometry() < LHCPeriod.Run3:
910 alg = config.createAlgorithm( 'CP::ElectronEfficiencyCorrectionAlg',
911 'ElectronEfficiencyCorrectionAlgMisid' )
912 config.addPrivateTool( 'efficiencyCorrectionTool',
913 'CP::ElectronChargeEfficiencyCorrectionTool' )
914 alg.scaleFactorDecoration = 'el_charge_misid_effSF' + selectionPostfix + '_%SYS%'
915 if self.isolationWP != 'Tight_VarRad':
916 raise ValueError('Charge mis-ID SFs are supported only for Tight_VarRad isolation.')
917 if self.identificationWP == 'LooseBLayerLH':
918 misid_lh = 'LooseAndBLayerLLH'
919 elif self.identificationWP == 'MediumLH':
920 misid_lh = 'MediumLLH'
921 elif self.identificationWP == 'TightLH':
922 misid_lh = 'TightLLH'
923 else:
924 raise ValueError('Charge mis-ID SFs are supported only for ID LooseBLayerLH, MediumLH, or TightLH')
925 misid_suffix = '_ECIDSloose' if self.chargeIDSelectionRun2 else ''
926
927 alg.efficiencyCorrectionTool.CorrectionFileName = \
928 f'ElectronEfficiencyCorrection/2015_2025/rel22.2/2025_Run2Rel22_Recommendation_v2/charge_misID/chargeEfficiencySF.{misid_lh}_d0z0_TightVarRad{misid_suffix}.root'
929 if config.dataType() is DataType.FastSim:
930 alg.efficiencyCorrectionTool.ForceDataType = (
931 PATCore.ParticleDataType.Full if self.forceFullSimConfig
932 else PATCore.ParticleDataType.Fast)
933 elif config.dataType() is DataType.FullSim:
934 alg.efficiencyCorrectionTool.ForceDataType = \
935 PATCore.ParticleDataType.Full
936 alg.outOfValidity = 2 #silent
937 alg.outOfValidityDeco = 'el_misid_bad_eff' + selectionPostfix
938 alg.electrons = config.readName (self.containerName)
939 alg.preselection = config.getPreselection (self.containerName, self.selectionName)
940 if self.saveDetailedSF:
941 config.addOutputVar (self.containerName, alg.scaleFactorDecoration,
942 'charge_misid_effSF' + postfix, auxType='float')
943 sfList += [alg.scaleFactorDecoration]
944
945 if config.dataType() is not DataType.Data and not self.noEffSF and self.saveCombinedSF:
946 alg = config.createAlgorithm( 'CP::AsgObjectScaleFactorAlg',
947 'ElectronCombinedEfficiencyScaleFactorAlg' )
948 alg.particles = config.readName (self.containerName)
949 alg.inScaleFactors = sfList
950 alg.outScaleFactor = 'effSF' + postfix + '_%SYS%'
951 config.addOutputVar (self.containerName, alg.outScaleFactor, 'effSF' + postfix, auxType='float')
952

Member Data Documentation

◆ containerName

python.ElectronAnalysisConfig.ElectronWorkingPointEfficiencyConfig.containerName

Definition at line 792 of file ElectronAnalysisConfig.py.

◆ forceFullSimConfig

python.ElectronAnalysisConfig.ElectronWorkingPointEfficiencyConfig.forceFullSimConfig

Definition at line 730 of file ElectronAnalysisConfig.py.

◆ identificationWP

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

Definition at line 875 of file ElectronAnalysisConfig.py.

◆ noEffSF

python.ElectronAnalysisConfig.ElectronWorkingPointEfficiencyConfig.noEffSF

Definition at line 758 of file ElectronAnalysisConfig.py.

◆ saveCombinedSF

python.ElectronAnalysisConfig.ElectronWorkingPointEfficiencyConfig.saveCombinedSF

Definition at line 945 of file ElectronAnalysisConfig.py.

◆ saveDetailedSF

python.ElectronAnalysisConfig.ElectronWorkingPointEfficiencyConfig.saveDetailedSF

Definition at line 791 of file ElectronAnalysisConfig.py.


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