85 """Create the calibration and smearing algorithm
87 Factoring this out into its own function, as we want to
88 instantiate it in multiple places"""
89 log = logging.getLogger(
'PhotonCalibrationConfig')
92 alg = config.createAlgorithm(
'CP::EgammaCalibrationAndSmearingAlg', name )
93 config.addPrivateTool(
'calibrationAndSmearingTool',
94 'CP::EgammaCalibrationAndSmearingTool' )
97 alg.calibrationAndSmearingTool.ESModel = self.
ESModel
99 if config.geometry()
is LHCPeriod.Run2:
100 alg.calibrationAndSmearingTool.ESModel =
'es2023_R22_Run2_v1'
101 elif config.geometry()
is LHCPeriod.Run3:
102 alg.calibrationAndSmearingTool.ESModel =
'es2024_Run3_v0'
103 elif config.geometry()
is LHCPeriod.Run4:
104 log.warning(
"No ESModel set for Run4, using Run3 model")
105 alg.calibrationAndSmearingTool.ESModel =
'es2024_Run3_v0'
107 raise ValueError (f
"Can't set up the ElectronCalibrationConfig with {config.geometry().value}, "
108 "there must be something wrong!")
110 alg.calibrationAndSmearingTool.decorrelationModel = self.decorrelationModel
111 alg.calibrationAndSmearingTool.useFastSim = (
113 else int( config.dataType()
is DataType.FastSim ))
114 alg.calibrationAndSmearingTool.decorateEmva = self.decorateEmva
117 alg.preselection = config.getPreselection (self.
containerName,
'')
123 log = logging.getLogger(
'PhotonCalibrationConfig')
125 postfix = self.postfix
126 if postfix !=
'' and postfix[0] !=
'_' :
127 postfix =
'_' + postfix
130 log.warning(
"You are running PhotonCalibrationConfig forcing full sim config for P4 corrections")
131 log.warning(
"This is only intended to be used for testing purposes")
133 if config.isPhyslite() :
138 cleaningWP =
'NoTime' if self.cleaningAllowLate
else ''
142 alg = config.createAlgorithm(
'CP::EgammaCaloClusterEtaAlg',
143 'ElectronEgammaCaloClusterEtaAlg',
146 config.addOutputVar (self.
containerName,
'caloEta2',
'caloEta2', noSys=
True)
150 alg = config.createAlgorithm(
'CP::AsgShallowCopyAlg',
'PhotonShallowCopyAlg' )
153 alg.outputType =
'xAOD::PhotonContainer'
154 decorationList = [
'DFCommonPhotonsCleaning',
155 'ptcone20_CloseByCorr',
156 'topoetcone20_CloseByCorr',
157 'topoetcone40_CloseByCorr']
159 decorationList += [
'neutralGlobalFELinks',
'chargedGlobalFELinks']
160 if config.dataType()
is not DataType.Data:
161 decorationList += [
'TruthLink']
162 alg.declareDecorations = decorationList
165 alg = config.createAlgorithm(
'CP::AsgSelectionAlg',
'PhotonEtaCutAlg' )
166 alg.selectionDecoration =
'selectEta' + postfix +
',as_bits'
167 config.addPrivateTool(
'selectionTool',
'CP::AsgPtEtaSelectionTool' )
168 alg.selectionTool.maxEta = self.maxEta
170 alg.selectionTool.etaGapLow = 1.37
171 alg.selectionTool.etaGapHigh = 1.52
172 alg.selectionTool.useClusterEta =
True
174 alg.preselection = config.getPreselection (self.
containerName,
'')
175 config.addSelection (self.
containerName,
'', alg.selectionDecoration)
178 if self.recomputeIsEM
and config.dataType()
is DataType.FullSim:
179 alg = config.createAlgorithm(
'CP::PhotonShowerShapeFudgeAlg',
180 'PhotonShowerShapeFudgeAlg' )
181 config.addPrivateTool(
'showerShapeFudgeTool',
182 'ElectronPhotonVariableCorrectionTool' )
183 if config.geometry()
is LHCPeriod.Run2:
184 alg.showerShapeFudgeTool.ConfigFile = \
185 'EGammaVariableCorrection/TUNE25/ElPhVariableNominalCorrection.conf'
186 if config.geometry()
is LHCPeriod.Run3:
187 alg.showerShapeFudgeTool.ConfigFile = \
188 'EGammaVariableCorrection/TUNE23/ElPhVariableNominalCorrection.conf'
191 alg.preselection = config.getPreselection (self.
containerName,
'')
194 alg = config.createAlgorithm(
'CP::AsgSelectionAlg',
'PhotonObjectQualityAlg' )
195 config.setExtraInputs ({(
'xAOD::EventInfo',
'EventInfo.RandomRunNumber')})
196 alg.selectionDecoration =
'goodOQ,as_bits'
197 config.addPrivateTool(
'selectionTool',
'CP::EgammaIsGoodOQSelectionTool' )
198 alg.selectionTool.Mask = xAOD.EgammaParameters.BADCLUSPHOTON
200 alg.preselection = config.getPreselection (self.
containerName,
'')
201 config.addSelection (self.
containerName,
'', alg.selectionDecoration)
205 alg = config.createAlgorithm(
'CP::AsgSelectionAlg',
'PhotonCleaningAlg' )
206 config.addPrivateTool(
'selectionTool',
'CP::AsgFlagSelectionTool' )
207 alg.selectionDecoration =
'isClean,as_bits'
208 alg.selectionTool.selectionFlags = [
'DFCommonPhotonsCleaning' + cleaningWP]
210 alg.preselection = config.getPreselection (self.
containerName,
'')
211 config.addSelection (self.
containerName,
'', alg.selectionDecoration)
216 alg = config.createAlgorithm(
'CP::PhotonOriginCorrectionAlg',
217 'PhotonOriginCorrectionAlg',
221 alg.preselection = config.getPreselection (self.
containerName,
'')
227 alg.skipNominal =
True
248 alg.noToolSystematics =
True
250 alg.calibrationAndSmearingTool.doSmearing =
False
255 alg.calibrationAndSmearingTool.doScaleCorrection =
False
256 alg.calibrationAndSmearingTool.useMVACalibration =
False
257 alg.calibrationAndSmearingTool.decorateEmva =
False
260 log.warning(
"You are not applying the isolation corrections")
261 log.warning(
"This is only intended to be used for testing purposes")
266 alg = config.createAlgorithm(
'CP::AsgSelectionAlg',
'PhotonPtCutAlg' )
267 alg.selectionDecoration =
'selectPt' + postfix +
',as_bits'
268 config.addPrivateTool(
'selectionTool',
'CP::AsgPtEtaSelectionTool' )
269 alg.selectionTool.minPt = self.minPt
271 alg.preselection = config.getPreselection (self.
containerName,
'')
272 config.addSelection (self.
containerName,
'', alg.selectionDecoration,
279 log.warning(
"You are running PhotonCalibrationConfig forcing full sim config for isolation corrections")
280 log.warning(
"This is only intended to be used for testing purposes")
282 alg = config.createAlgorithm(
'CP::EgammaIsolationCorrectionAlg',
283 'PhotonIsolationCorrectionAlg' )
284 config.addPrivateTool(
'isolationCorrectionTool',
285 'CP::IsolationCorrectionTool' )
286 alg.isolationCorrectionTool.IsMC = config.dataType()
is not DataType.Data
287 alg.isolationCorrectionTool.AFII_corr = (
289 else config.dataType()
is DataType.FastSim)
290 alg.isolationCorrectionTool.FixTimingIssueInCore =
True
293 alg.preselection = config.getPreselection (self.
containerName,
'')
296 alg = config.createAlgorithm(
'CP::AsgEnergyDecoratorAlg',
'EnergyDecorator' )
300 config.addOutputVar (self.
containerName,
'eta',
'eta', noSys=
True)
301 config.addOutputVar (self.
containerName,
'phi',
'phi', noSys=
True)
303 config.addOutputVar (self.
containerName,
'caloClusterEnergyReso_%SYS%',
'caloClusterEnergyReso', noSys=
True)
306 if self.decorateTruth
and config.dataType()
is not DataType.Data:
307 config.addOutputVar (self.
containerName,
"truthType",
"truth_type", noSys=
True)
308 config.addOutputVar (self.
containerName,
"truthOrigin",
"truth_origin", noSys=
True)