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