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