89 """Create the calibration and smearing algorithm
91 Factoring this out into its own function, as we want to
92 instantiate it in multiple places"""
93 log = logging.getLogger(
'PhotonCalibrationConfig')
96 alg = config.createAlgorithm(
'CP::EgammaCalibrationAndSmearingAlg', name )
97 config.addPrivateTool(
'calibrationAndSmearingTool',
98 'CP::EgammaCalibrationAndSmearingTool' )
101 alg.calibrationAndSmearingTool.ESModel = self.
ESModel
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'
111 raise ValueError (f
"Can't set up the ElectronCalibrationConfig with {config.geometry().value}, "
112 "there must be something wrong!")
114 alg.calibrationAndSmearingTool.decorrelationModel = self.decorrelationModel
115 alg.calibrationAndSmearingTool.useFastSim = (
117 else int( config.dataType()
is DataType.FastSim ))
118 alg.calibrationAndSmearingTool.decorateEmva = self.decorateEmva
121 alg.preselection = config.getPreselection (self.
containerName,
'')
127 log = logging.getLogger(
'PhotonCalibrationConfig')
129 postfix = self.postfix
130 if postfix !=
'' and postfix[0] !=
'_' :
131 postfix =
'_' + postfix
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")
137 if config.isPhyslite() :
142 cleaningWP =
'NoTime' if self.cleaningAllowLate
else ''
146 alg = config.createAlgorithm(
'CP::EgammaCaloClusterEtaAlg',
147 'ElectronEgammaCaloClusterEtaAlg',
150 config.addOutputVar (self.
containerName,
'caloEta2',
'caloEta2', noSys=
True)
154 alg = config.createAlgorithm(
'CP::AsgShallowCopyAlg',
'PhotonShallowCopyAlg' )
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
164 alg.selectionTool.etaGapLow = 1.37
165 alg.selectionTool.etaGapHigh = 1.52
166 alg.selectionTool.useClusterEta =
True
168 alg.preselection = config.getPreselection (self.
containerName,
'')
169 config.addSelection (self.
containerName,
'', alg.selectionDecoration)
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'
185 alg.preselection = config.getPreselection (self.
containerName,
'')
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
193 alg.preselection = config.getPreselection (self.
containerName,
'')
194 config.addSelection (self.
containerName,
'', alg.selectionDecoration)
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]
203 alg.preselection = config.getPreselection (self.
containerName,
'')
204 config.addSelection (self.
containerName,
'', alg.selectionDecoration)
209 alg = config.createAlgorithm(
'CP::PhotonOriginCorrectionAlg',
210 'PhotonOriginCorrectionAlg',
214 alg.preselection = config.getPreselection (self.
containerName,
'')
220 alg.skipNominal =
True
241 alg.noToolSystematics =
True
243 alg.calibrationAndSmearingTool.doSmearing =
False
248 alg.calibrationAndSmearingTool.doScaleCorrection =
False
249 alg.calibrationAndSmearingTool.useMVACalibration =
False
250 alg.calibrationAndSmearingTool.decorateEmva =
False
253 log.warning(
"You are not applying the isolation corrections")
254 log.warning(
"This is only intended to be used for testing purposes")
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
264 alg.preselection = config.getPreselection (self.
containerName,
'')
265 config.addSelection (self.
containerName,
'', alg.selectionDecoration,
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")
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 = (
282 else config.dataType()
is DataType.FastSim)
283 alg.isolationCorrectionTool.FixTimingIssueInCore =
True
286 alg.preselection = config.getPreselection (self.
containerName,
'')
289 alg = config.createAlgorithm(
'CP::AsgEnergyDecoratorAlg',
'EnergyDecorator' )
293 config.addOutputVar (self.
containerName,
'eta',
'eta', noSys=
True)
294 config.addOutputVar (self.
containerName,
'phi',
'phi', noSys=
True)
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)