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

Constructor & Destructor Documentation

◆ __init__()

python.ElectronAnalysisConfig.ElectronWorkingPointEfficiencyConfig.__init__ ( self)

Definition at line 650 of file ElectronAnalysisConfig.py.

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

Member Function Documentation

◆ instanceName()

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

Definition at line 710 of file ElectronAnalysisConfig.py.

710 def instanceName (self) :
711 """Return the instance name for this block"""
712 if self.postfix is not None :
713 return self.containerName + '_' + self.selectionName + self.postfix
714 return self.containerName + '_' + self.selectionName
715

◆ makeAlgs()

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

Definition at line 716 of file ElectronAnalysisConfig.py.

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

Member Data Documentation

◆ containerName

python.ElectronAnalysisConfig.ElectronWorkingPointEfficiencyConfig.containerName

Definition at line 777 of file ElectronAnalysisConfig.py.

◆ forceFullSimConfig

python.ElectronAnalysisConfig.ElectronWorkingPointEfficiencyConfig.forceFullSimConfig

Definition at line 718 of file ElectronAnalysisConfig.py.

◆ identificationWP

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

Definition at line 860 of file ElectronAnalysisConfig.py.

◆ noEffSF

python.ElectronAnalysisConfig.ElectronWorkingPointEfficiencyConfig.noEffSF

Definition at line 743 of file ElectronAnalysisConfig.py.

◆ saveCombinedSF

python.ElectronAnalysisConfig.ElectronWorkingPointEfficiencyConfig.saveCombinedSF

Definition at line 930 of file ElectronAnalysisConfig.py.

◆ saveDetailedSF

python.ElectronAnalysisConfig.ElectronWorkingPointEfficiencyConfig.saveDetailedSF

Definition at line 776 of file ElectronAnalysisConfig.py.


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