160 def makeAlgs (self, config) :
161
162 jetCollectionName=self.jetCollection
163 if(self.jetCollection==
"AnalysisJets") :
164 jetCollectionName="AntiKt4EMPFlowJets"
165 if(self.jetCollection==
"AnalysisLargeRJets") :
166 jetCollectionName="AntiKt10UFOCSSKSoftDropBeta100Zcut10Jets"
167
168 if self.jetInput not in ["EMTopo", "EMPFlow", "HI"]:
169 raise ValueError(
170 "Unsupported input type '{0}' for R=0.4 jets!".format(self.jetInput) )
171
172 if self.jvtWP not in ["FixedEffPt"]:
173 raise ValueError(
174 "Unsupported NNJvt WP '{0}'".format(self.jvtWP) )
175
176 if self.fJvtWP not in ["Loose", "Tight", "Tighter"]:
177 raise ValueError(
178 "Unsupported fJvt WP '{0}'".format(self.fJvtWP) )
179
180 if not config.isPhyslite() or self.recalibratePhyslite:
181
182 alg = config.createAlgorithm( 'CP::JetCalibrationAlg', 'JetCalibrationAlg' )
183 config.addPrivateTool( 'calibrationTool', 'JetCalibrationTool' )
184 alg.calibrationTool.JetCollection = jetCollectionName[:-4]
185
186 if self.jetInput == "EMPFlow":
187 if config.geometry() is LHCPeriod.Run2:
188 configFile = "PreRec_R22_PFlow_ResPU_EtaJES_GSC_February23_230215.config"
189 alg.calibrationTool.CalibArea = "00-04-82"
190 elif config.geometry() >= LHCPeriod.Run3:
191 configFile = "AntiKt4EMPFlow_MC23a_PreRecR22_Phase2_CalibConfig_ResPU_EtaJES_GSC_241208_InSitu.config"
192 alg.calibrationTool.CalibArea = "00-04-83"
193 elif self.jetInput == "HI":
194 if config.geometry() is LHCPeriod.Run2:
195 configFile = "JES_MC16_HI_Jan2021_5TeV.config"
196 if config.geometry() is LHCPeriod.Run3:
197 configFile = "AntiKt4HI_JES_constants_11-05-2024_13p6TeVFinalConfiguration.config"
198 alg.calibrationTool.CalibArea = "00-04-83"
199 else:
200 if config.dataType() is DataType.FastSim:
201 configFile = "JES_MC16Recommendation_AFII_{0}_Apr2019_Rel21.config"
202 else:
203 configFile = "JES_MC16Recommendation_Consolidated_{0}_Apr2019_Rel21.config"
204 configFile = configFile.format(self.jetInput)
205 if self.calibToolCalibArea is not None:
206 alg.calibrationTool.CalibArea = self.calibToolCalibArea
207 if self.calibToolConfigFile is not None:
208 configFile = self.calibToolConfigFile
209 alg.calibrationTool.ConfigFile = configFile
210 if config.dataType() is DataType.Data:
211 if self.jetInput == "HI":
212 if config.geometry() is LHCPeriod.Run2:
213 alg.calibrationTool.CalibSequence = 'EtaJES_Insitu'
214 if config.geometry() is LHCPeriod.Run3:
215 alg.calibrationTool.CalibSequence = 'EtaJES'
216 else:
217 alg.calibrationTool.CalibSequence = 'JetArea_Residual_EtaJES_GSC_Insitu'
218 else:
219 if self.jetInput == "EMPFlow":
220 alg.calibrationTool.CalibSequence = 'JetArea_Residual_EtaJES_GSC'
221 elif self.jetInput == "HI":
222 alg.calibrationTool.CalibSequence = 'EtaJES'
223 else:
224 alg.calibrationTool.CalibSequence = 'JetArea_Residual_EtaJES_GSC_Smear'
225 if self.calibToolCalibSeq is not None:
226 alg.calibrationTool.CalibSequence = self.calibToolCalibSeq
227 alg.calibrationTool.IsData = (config.dataType() is DataType.Data)
228 alg.jets = config.readName (self.containerName)
229 alg.jetsOut = config.copyName (self.containerName)
230
231
232 if self.runJvtUpdate :
233 alg = config.createAlgorithm( 'CP::JvtUpdateAlg', 'JvtUpdateAlg' )
234 config.addPrivateTool( 'jvtTool', 'JetVertexTaggerTool' )
235 alg.jvtTool.JetContainer = self.jetCollection
236 alg.jvtTool.SuppressInputDependence=True
237 alg.jets = config.readName (self.containerName)
238 alg.jetsOut = config.copyName (self.containerName)
239 alg.preselection = config.getPreselection (self.containerName, '')
240
241 if self.runNNJvtUpdate:
242 assert self.jetInput=="EMPFlow", "NN JVT only defined for PFlow jets"
243 alg = config.createAlgorithm( 'CP::JetDecoratorAlg', 'NNJvtUpdateAlg' )
244 config.addPrivateTool( 'decorator', 'JetPileupTag::JetVertexNNTagger' )
245
246 alg.jets = config.readName (self.containerName)
247 alg.jetsOut = config.copyName (self.containerName)
248 alg.decorator.JetContainer = alg.jetsOut.replace ('%SYS%', 'NOSYS')
249 alg.decorator.SuppressInputDependence=True
250 alg.decorator.SuppressOutputDependence=True
251
252
253
254 if self.runJvtSelection :
255 assert self.jetInput=="EMPFlow", "NNJvt WPs and SFs only valid for PFlow jets"
256 alg = config.createAlgorithm('CP::AsgSelectionAlg', 'JvtSelectionAlg')
257 config.addPrivateTool('selectionTool', 'CP::NNJvtSelectionTool')
258 alg.selectionTool.JetContainer = config.readName(self.containerName)
259 alg.selectionTool.JvtMomentName = "NNJvt"
260 alg.selectionTool.WorkingPoint = self.jvtWP
261 alg.selectionTool.MaxPtForJvt = 60*GeV
262 alg.selectionDecoration = "jvt_selection,as_char"
263 alg.particles = config.readName(self.containerName)
264
265 if self.runJvtEfficiency and config.dataType() is not DataType.Data:
266 alg = config.createAlgorithm( 'CP::JvtEfficiencyAlg', 'JvtEfficiencyAlg' )
267 config.addPrivateTool( 'efficiencyTool', 'CP::NNJvtEfficiencyTool' )
268 alg.efficiencyTool.JetContainer = config.readName(self.containerName)
269 alg.efficiencyTool.MaxPtForJvt = 60*GeV
270 alg.efficiencyTool.WorkingPoint = self.jvtWP
271 if config.geometry() is LHCPeriod.Run2:
272 alg.efficiencyTool.SFFile = "JetJvtEfficiency/May2024/NNJvtSFFile_Run2_EMPFlow.root"
273 else:
274 alg.efficiencyTool.SFFile = "JetJvtEfficiency/May2024/NNJvtSFFile_Run3_EMPFlow.root"
275 alg.selection = 'jvt_selection,as_char'
276 alg.scaleFactorDecoration = 'jvt_effSF_%SYS%'
277 alg.outOfValidity = 2
278 alg.outOfValidityDeco = 'no_jvt'
279 alg.skipBadEfficiency = False
280 alg.jets = config.readName (self.containerName)
281 alg.preselection = config.getPreselection (self.containerName, '')
282 config.addOutputVar (self.containerName, alg.scaleFactorDecoration, 'jvtEfficiency')
283 config.addSelection (self.containerName, 'baselineJvt', 'jvt_selection,as_char', preselection=False)
284
285 if self.runFJvtSelection :
286 assert self.jetInput=="EMPFlow", "fJvt WPs and SFs only valid for PFlow jets"
287 alg = config.createAlgorithm('CP::AsgSelectionAlg', 'FJvtSelectionAlg')
288 config.addPrivateTool('selectionTool', 'CP::FJvtSelectionTool')
289 alg.selectionTool.JetContainer = config.readName(self.containerName)
290 alg.selectionTool.JvtMomentName = "DFCommonJets_fJvt"
291 alg.selectionTool.WorkingPoint = self.fJvtWP
292 alg.selectionDecoration = "fjvt_selection,as_char"
293 alg.particles = config.readName(self.containerName)
294
295 if self.runFJvtEfficiency and config.dataType() is not DataType.Data:
296 alg = config.createAlgorithm( 'CP::JvtEfficiencyAlg', 'FJvtEfficiencyAlg' )
297 config.addPrivateTool( 'efficiencyTool', 'CP::FJvtEfficiencyTool' )
298 alg.efficiencyTool.JetContainer = config.readName(self.containerName)
299 alg.efficiencyTool.WorkingPoint = self.fJvtWP
300 if config.geometry() is LHCPeriod.Run2:
301 alg.efficiencyTool.SFFile = "JetJvtEfficiency/May2024/fJvtSFFile_Run2_EMPFlow.root"
302 else:
303 alg.efficiencyTool.SFFile = "JetJvtEfficiency/May2024/fJvtSFFile_Run3_EMPFlow.root"
304 alg.selection = 'fjvt_selection,as_char'
305 alg.scaleFactorDecoration = 'fjvt_effSF_%SYS%'
306 alg.outOfValidity = 2
307 alg.outOfValidityDeco = 'no_fjvt'
308 alg.skipBadEfficiency = False
309 alg.jets = config.readName (self.containerName)
310 alg.preselection = config.getPreselection (self.containerName, '')
311 config.addOutputVar (self.containerName, alg.scaleFactorDecoration, 'fjvtEfficiency')
312 config.addSelection (self.containerName, 'baselineFJvt', 'fjvt_selection,as_char', preselection=False)
313
314
315 alg = config.createAlgorithm( 'CP::AsgEnergyDecoratorAlg', 'AsgEnergyDecoratorAlg' )
316 alg.particles = config.readName (self.containerName)
317
318 config.addOutputVar (self.containerName, 'e_%SYS%', 'e')
319
320