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

Public Member Functions

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

Public Attributes

 ESModel
 forceFullSimConfigForP4
 containerName
 decorateCaloClusterEta
 crackVeto
 enableCleaning
 splitCalibrationAndSmearing
 recalibratePhyslite
 applyIsolationCorrection
 forceFullSimConfigForIso

Detailed Description

the ConfigBlock for the photon four-momentum correction

Definition at line 17 of file PhotonAnalysisConfig.py.

Constructor & Destructor Documentation

◆ __init__()

python.PhotonAnalysisConfig.PhotonCalibrationConfig.__init__ ( self)

Definition at line 20 of file PhotonAnalysisConfig.py.

20 def __init__ (self) :
21 super (PhotonCalibrationConfig, self).__init__ ()
22 self.setBlockName('Photons')
23 self.addOption ('containerName', '', type=str,
24 noneAction='error',
25 info="the name of the output container after calibration.")
26 self.addOption ('ESModel', '', type=str,
27 info="flag of egamma calibration recommendation.")
28 self.addOption ('decorrelationModel', '1NP_v1', type=str,
29 info="egamma energy scale decorrelationModel. The default is 1NP_v1. "
30 "Supported Model: 1NP_v1, FULL_v1.")
31 self.addOption ('postfix', '', type=str,
32 info="a postfix to apply to decorations and algorithm names. "
33 "Typically not needed here since the calibration is common to "
34 "all photons.")
35 self.addOption ('crackVeto', False, type=bool,
36 info="whether to perform LAr crack veto based on the cluster eta, "
37 "i.e. remove photons within 1.37<|eta|<1.52. "
38 "The default is False.")
39 self.addOption ('enableCleaning', True, type=bool,
40 info="whether to enable photon cleaning (DFCommonPhotonsCleaning). "
41 "The default is True.")
42 self.addOption ('cleaningAllowLate', False, type=bool,
43 info="whether to ignore timing information in cleaning "
44 "(DFCommonPhotonsCleaningNoTime). The default is False.")
45 self.addOption ('recomputeIsEM', False, type=bool,
46 info="whether to recompute the photon shower shape fudge "
47 "corrections (sets up an instance of CP::PhotonShowerShapeFudgeAlg). "
48 "The default is False, i.e. to use derivation variables.")
49 self.addOption ('recalibratePhyslite', True, type=bool,
50 info="whether to run the CP::EgammaCalibrationAndSmearingAlg on "
51 "PHYSLITE derivations. The default is True.")
52 self.addOption ('minPt', 10*GeV, type=float,
53 info="the minimum pT cut to apply to calibrated photons. "
54 "The default is 10 GeV.")
55 self.addOption ('maxEta', 2.37, type=float,
56 info="maximum photon |eta| (float). The default is 2.37.")
57 self.addOption ('forceFullSimConfigForP4', False, type=bool,
58 info="whether to force the tool to use the configuration meant for "
59 "full simulation samples for P4 corrections. Only for testing purposes. "
60 "The default is False.")
61 self.addOption ('forceFullSimConfigForIso', False, type=bool,
62 info="whether to force the tool to use the configuration meant for "
63 "full simulation samples for isolation corrections. Only for testing purposes. "
64 "The default is False.")
65 self.addOption ('applyIsolationCorrection', True, type=bool,
66 info="whether to to apply the isolation corrections "
67 "The default is True.")
68 self.addOption ('splitCalibrationAndSmearing', False, type=bool,
69 info="EXPERIMENTAL: This splits the EgammaCalibrationAndSmearingTool "
70 " into two steps. The first step applies a baseline calibration that "
71 "is not affected by systematics. The second step then applies the "
72 "systematics dependent corrections. The net effect is that the "
73 "slower first step only has to be run once, while the second is run "
74 "once per systematic. ATLASG-2358",
75 expertMode=True)
76 self.addOption ('decorateTruth', False, type=bool,
77 info="decorate truth particle information on the reconstructed one")
78 self.addOption ('decorateCaloClusterEta', False, type=bool,
79 info="decorate the calo cluster eta on the reconstructed one")
80 self.addOption ('decorateEmva', False, type=bool,
81 info="decorate E_mva_only on the objects (needed for columnar tools/PHYSLITE)")
82

Member Function Documentation

◆ instanceName()

python.PhotonAnalysisConfig.PhotonCalibrationConfig.instanceName ( self)
Return the instance name for this block

Definition at line 83 of file PhotonAnalysisConfig.py.

83 def instanceName (self) :
84 """Return the instance name for this block"""
85 return self.containerName + self.postfix
86
87

◆ makeAlgs()

python.PhotonAnalysisConfig.PhotonCalibrationConfig.makeAlgs ( self,
config )

Definition at line 125 of file PhotonAnalysisConfig.py.

125 def makeAlgs (self, config) :
126
127 log = logging.getLogger('PhotonCalibrationConfig')
128
129 postfix = self.postfix
130 if postfix != '' and postfix[0] != '_' :
131 postfix = '_' + postfix
132
133 if self.forceFullSimConfigForP4:
134 log.warning("You are running PhotonCalibrationConfig forcing full sim config for P4 corrections")
135 log.warning("This is only intended to be used for testing purposes")
136
137 if config.isPhyslite() :
138 config.setSourceName (self.containerName, "AnalysisPhotons")
139 else :
140 config.setSourceName (self.containerName, "Photons")
141
142 cleaningWP = 'NoTime' if self.cleaningAllowLate else ''
143
144 # Decorate calo cluster eta if required
145 if self.decorateCaloClusterEta:
146 alg = config.createAlgorithm( 'CP::EgammaCaloClusterEtaAlg',
147 'ElectronEgammaCaloClusterEtaAlg',
148 reentrant=True )
149 alg.particles = config.readName(self.containerName)
150 config.addOutputVar (self.containerName, 'caloEta2', 'caloEta2', noSys=True)
151
152 # Set up a shallow copy to decorate
153 if config.wantCopy (self.containerName) :
154 alg = config.createAlgorithm( 'CP::AsgShallowCopyAlg', 'PhotonShallowCopyAlg' )
155 alg.input = config.readName (self.containerName)
156 alg.output = config.copyName (self.containerName)
157
158 # Set up the eta-cut on all photons prior to everything else
159 alg = config.createAlgorithm( 'CP::AsgSelectionAlg', 'PhotonEtaCutAlg' )
160 alg.selectionDecoration = 'selectEta' + postfix + ',as_bits'
161 config.addPrivateTool( 'selectionTool', 'CP::AsgPtEtaSelectionTool' )
162 alg.selectionTool.maxEta = self.maxEta
163 if self.crackVeto:
164 alg.selectionTool.etaGapLow = 1.37
165 alg.selectionTool.etaGapHigh = 1.52
166 alg.selectionTool.useClusterEta = True
167 alg.particles = config.readName (self.containerName)
168 alg.preselection = config.getPreselection (self.containerName, '')
169 config.addSelection (self.containerName, '', alg.selectionDecoration)
170
171 # Setup shower shape fudge
172 if self.recomputeIsEM and config.dataType() is DataType.FullSim:
173 alg = config.createAlgorithm( 'CP::PhotonShowerShapeFudgeAlg',
174 'PhotonShowerShapeFudgeAlg' )
175 config.addPrivateTool( 'showerShapeFudgeTool',
176 'ElectronPhotonVariableCorrectionTool' )
177 if config.geometry is LHCPeriod.Run2:
178 alg.showerShapeFudgeTool.ConfigFile = \
179 'EGammaVariableCorrection/TUNE25/ElPhVariableNominalCorrection.conf'
180 if config.geometry is LHCPeriod.Run3:
181 alg.showerShapeFudgeTool.ConfigFile = \
182 'EGammaVariableCorrection/TUNE23/ElPhVariableNominalCorrection.conf'
183 alg.photons = config.readName (self.containerName)
184 alg.photonsOut = config.copyName (self.containerName)
185 alg.preselection = config.getPreselection (self.containerName, '')
186
187 # Select photons only with good object quality.
188 alg = config.createAlgorithm( 'CP::AsgSelectionAlg', 'PhotonObjectQualityAlg' )
189 alg.selectionDecoration = 'goodOQ,as_bits'
190 config.addPrivateTool( 'selectionTool', 'CP::EgammaIsGoodOQSelectionTool' )
191 alg.selectionTool.Mask = xAOD.EgammaParameters.BADCLUSPHOTON
192 alg.particles = config.readName (self.containerName)
193 alg.preselection = config.getPreselection (self.containerName, '')
194 config.addSelection (self.containerName, '', alg.selectionDecoration)
195
196 # Select clean photons
197 if self.enableCleaning:
198 alg = config.createAlgorithm( 'CP::AsgSelectionAlg', 'PhotonCleaningAlg' )
199 config.addPrivateTool( 'selectionTool', 'CP::AsgFlagSelectionTool' )
200 alg.selectionDecoration = 'isClean,as_bits'
201 alg.selectionTool.selectionFlags = ['DFCommonPhotonsCleaning' + cleaningWP]
202 alg.particles = config.readName (self.containerName)
203 alg.preselection = config.getPreselection (self.containerName, '')
204 config.addSelection (self.containerName, '', alg.selectionDecoration)
205
206 # Change the origin of Photons from (0,0,0) to (0,0,z)
207 # where z comes from the position of a vertex
208 # Default the one tagged as Primary
209 alg = config.createAlgorithm( 'CP::PhotonOriginCorrectionAlg',
210 'PhotonOriginCorrectionAlg',
211 reentrant=True )
212 alg.photons = config.readName (self.containerName)
213 alg.photonsOut = config.copyName (self.containerName)
214 alg.preselection = config.getPreselection (self.containerName, '')
215
216 if not self.splitCalibrationAndSmearing :
217 # Set up the calibration and smearing algorithm:
218 alg = self.makeCalibrationAndSmearingAlg (config, 'PhotonCalibrationAndSmearingAlg')
219 if config.isPhyslite() and not self.recalibratePhyslite :
220 alg.skipNominal = True
221 else:
222 # This splits the EgammaCalibrationAndSmearingTool into two
223 # steps. The first step applies a baseline calibration that
224 # is not affected by systematics. The second step then
225 # applies the systematics dependent corrections. The net
226 # effect is that the slower first step only has to be run
227 # once, while the second is run once per systematic.
228 #
229 # For now (22 May 24) this has to happen in the same job, as
230 # the output of the first step is not part of PHYSLITE, and
231 # even for the nominal the output of the first and second
232 # step are different. In the future the plan is to put both
233 # the output of the first and second step into PHYSLITE,
234 # allowing to skip the first step when running on PHYSLITE.
235 #
236 # WARNING: All of this is experimental, see: ATLASG-2358
237
238 # Set up the calibration algorithm:
239 alg = self.makeCalibrationAndSmearingAlg (config, 'PhotonBaseCalibrationAlg')
240 # turn off systematics for the calibration step
241 alg.noToolSystematics = True
242 # turn off smearing for the calibration step
243 alg.calibrationAndSmearingTool.doSmearing = False
244
245 # Set up the smearing algorithm:
246 alg = self.makeCalibrationAndSmearingAlg (config, 'PhotonCalibrationSystematicsAlg')
247 # turn off scale corrections for the smearing step
248 alg.calibrationAndSmearingTool.doScaleCorrection = False
249 alg.calibrationAndSmearingTool.useMVACalibration = False
250 alg.calibrationAndSmearingTool.decorateEmva = False
251
252 if not self.applyIsolationCorrection:
253 log.warning("You are not applying the isolation corrections")
254 log.warning("This is only intended to be used for testing purposes")
255
256 if self.minPt > 0:
257
258 # Set up the the pt selection
259 alg = config.createAlgorithm( 'CP::AsgSelectionAlg', 'PhotonPtCutAlg' )
260 alg.selectionDecoration = 'selectPt' + postfix + ',as_bits'
261 config.addPrivateTool( 'selectionTool', 'CP::AsgPtEtaSelectionTool' )
262 alg.selectionTool.minPt = self.minPt
263 alg.particles = config.readName (self.containerName)
264 alg.preselection = config.getPreselection (self.containerName, '')
265 config.addSelection (self.containerName, '', alg.selectionDecoration,
266 preselection=True)
267
268 # Set up the isolation correction algorithm.
269 if self.applyIsolationCorrection:
270
271 if self.forceFullSimConfigForIso:
272 log.warning("You are running PhotonCalibrationConfig forcing full sim config for isolation corrections")
273 log.warning("This is only intended to be used for testing purposes")
274
275 alg = config.createAlgorithm( 'CP::EgammaIsolationCorrectionAlg',
276 'PhotonIsolationCorrectionAlg' )
277 config.addPrivateTool( 'isolationCorrectionTool',
278 'CP::IsolationCorrectionTool' )
279 alg.isolationCorrectionTool.IsMC = config.dataType() is not DataType.Data
280 alg.isolationCorrectionTool.AFII_corr = (
281 0 if self.forceFullSimConfigForIso
282 else config.dataType() is DataType.FastSim)
283 alg.isolationCorrectionTool.FixTimingIssueInCore = True
284 alg.egammas = config.readName (self.containerName)
285 alg.egammasOut = config.copyName (self.containerName)
286 alg.preselection = config.getPreselection (self.containerName, '')
287
288 # Additional decorations
289 alg = config.createAlgorithm( 'CP::AsgEnergyDecoratorAlg', 'EnergyDecorator' )
290 alg.particles = config.readName (self.containerName)
291
292 config.addOutputVar (self.containerName, 'pt', 'pt')
293 config.addOutputVar (self.containerName, 'eta', 'eta', noSys=True)
294 config.addOutputVar (self.containerName, 'phi', 'phi', noSys=True)
295 config.addOutputVar (self.containerName, 'e_%SYS%', 'e')
296
297 # decorate truth information on the reconstructed object:
298 if self.decorateTruth and config.dataType() is not DataType.Data:
299 config.addOutputVar (self.containerName, "truthType", "truth_type", noSys=True)
300 config.addOutputVar (self.containerName, "truthOrigin", "truth_origin", noSys=True)
301
302

◆ makeCalibrationAndSmearingAlg()

python.PhotonAnalysisConfig.PhotonCalibrationConfig.makeCalibrationAndSmearingAlg ( self,
config,
name )
Create the calibration and smearing algorithm

Factoring this out into its own function, as we want to
instantiate it in multiple places

Definition at line 88 of file PhotonAnalysisConfig.py.

88 def makeCalibrationAndSmearingAlg (self, config, name) :
89 """Create the calibration and smearing algorithm
90
91 Factoring this out into its own function, as we want to
92 instantiate it in multiple places"""
93 log = logging.getLogger('PhotonCalibrationConfig')
94
95 # Set up the calibration and smearing algorithm:
96 alg = config.createAlgorithm( 'CP::EgammaCalibrationAndSmearingAlg', name )
97 config.addPrivateTool( 'calibrationAndSmearingTool',
98 'CP::EgammaCalibrationAndSmearingTool' )
99 # Set default ESModel per period
100 if self.ESModel:
101 alg.calibrationAndSmearingTool.ESModel = self.ESModel
102 else:
103 if config.geometry() is LHCPeriod.Run2:
104 alg.calibrationAndSmearingTool.ESModel = 'es2023_R22_Run2_v1'
105 elif config.geometry() is LHCPeriod.Run3:
106 alg.calibrationAndSmearingTool.ESModel = 'es2024_Run3_v0'
107 elif config.geometry() is LHCPeriod.Run4:
108 log.warning("No ESModel set for Run4, using Run3 model")
109 alg.calibrationAndSmearingTool.ESModel = 'es2024_Run3_v0'
110 else:
111 raise ValueError (f"Can't set up the ElectronCalibrationConfig with {config.geometry().value}, "
112 "there must be something wrong!")
113
114 alg.calibrationAndSmearingTool.decorrelationModel = self.decorrelationModel
115 alg.calibrationAndSmearingTool.useFastSim = (
116 0 if self.forceFullSimConfigForP4
117 else int( config.dataType() is DataType.FastSim ))
118 alg.calibrationAndSmearingTool.decorateEmva = self.decorateEmva
119 alg.egammas = config.readName (self.containerName)
120 alg.egammasOut = config.copyName (self.containerName)
121 alg.preselection = config.getPreselection (self.containerName, '')
122 return alg
123
124

Member Data Documentation

◆ applyIsolationCorrection

python.PhotonAnalysisConfig.PhotonCalibrationConfig.applyIsolationCorrection

Definition at line 252 of file PhotonAnalysisConfig.py.

◆ containerName

python.PhotonAnalysisConfig.PhotonCalibrationConfig.containerName

Definition at line 138 of file PhotonAnalysisConfig.py.

◆ crackVeto

python.PhotonAnalysisConfig.PhotonCalibrationConfig.crackVeto

Definition at line 163 of file PhotonAnalysisConfig.py.

◆ decorateCaloClusterEta

python.PhotonAnalysisConfig.PhotonCalibrationConfig.decorateCaloClusterEta

Definition at line 145 of file PhotonAnalysisConfig.py.

◆ enableCleaning

python.PhotonAnalysisConfig.PhotonCalibrationConfig.enableCleaning

Definition at line 197 of file PhotonAnalysisConfig.py.

◆ ESModel

python.PhotonAnalysisConfig.PhotonCalibrationConfig.ESModel

Definition at line 100 of file PhotonAnalysisConfig.py.

◆ forceFullSimConfigForIso

python.PhotonAnalysisConfig.PhotonCalibrationConfig.forceFullSimConfigForIso

Definition at line 271 of file PhotonAnalysisConfig.py.

◆ forceFullSimConfigForP4

python.PhotonAnalysisConfig.PhotonCalibrationConfig.forceFullSimConfigForP4

Definition at line 133 of file PhotonAnalysisConfig.py.

◆ recalibratePhyslite

python.PhotonAnalysisConfig.PhotonCalibrationConfig.recalibratePhyslite

Definition at line 219 of file PhotonAnalysisConfig.py.

◆ splitCalibrationAndSmearing

python.PhotonAnalysisConfig.PhotonCalibrationConfig.splitCalibrationAndSmearing

Definition at line 216 of file PhotonAnalysisConfig.py.


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