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