286 def makeAlgs (self, config) :
288 jetCollectionName=self.jetCollection
289 if(self.jetCollection==
"AnalysisJets") :
290 jetCollectionName=
"AntiKt4EMPFlowJets"
291 if(self.jetCollection==
"AnalysisLargeRJets") :
292 jetCollectionName=
"AntiKt10UFOCSSKSoftDropBeta100Zcut10Jets"
294 if self.jetInput
not in [
"EMTopo",
"EMPFlow",
"HI"]:
296 "Unsupported input type '{0}' for R=0.4 jets!".
format(self.jetInput) )
298 if self.jvtWP
not in [
"FixedEffPt"]:
300 "Unsupported NNJvt WP '{0}'".
format(self.jvtWP) )
302 if self.fJvtWP
not in [
"Loose",
"Tight",
"Tighter"]:
304 "Unsupported fJvt WP '{0}'".
format(self.fJvtWP) )
306 if not config.isPhyslite()
or self.recalibratePhyslite:
308 alg = config.createAlgorithm(
'CP::JetCalibrationAlg',
'JetCalibrationAlg'+self.containerName )
309 config.addPrivateTool(
'calibrationTool',
'JetCalibrationTool' )
310 alg.calibrationTool.JetCollection = jetCollectionName[:-4]
312 if self.jetInput ==
"EMPFlow":
313 if config.geometry()
is LHCPeriod.Run2:
314 configFile =
"PreRec_R22_PFlow_ResPU_EtaJES_GSC_February23_230215.config"
315 alg.calibrationTool.CalibArea =
"00-04-82"
316 elif config.geometry() >= LHCPeriod.Run3:
317 configFile =
"AntiKt4EMPFlow_MC23a_PreRecR22_Phase2_CalibConfig_ResPU_EtaJES_GSC_241208_InSitu.config"
318 alg.calibrationTool.CalibArea =
"00-04-83"
319 elif self.jetInput ==
"HI":
320 if config.geometry()
is LHCPeriod.Run2:
321 configFile =
"JES_MC16_HI_Jan2021_5TeV.config"
322 if config.geometry()
is LHCPeriod.Run3:
323 configFile =
"AntiKt4HI_JES_constants_11-05-2024_13p6TeVFinalConfiguration.config"
324 alg.calibrationTool.CalibArea =
"00-04-83"
326 if config.dataType()
is DataType.FastSim:
327 configFile =
"JES_MC16Recommendation_AFII_{0}_Apr2019_Rel21.config"
329 configFile =
"JES_MC16Recommendation_Consolidated_{0}_Apr2019_Rel21.config"
330 configFile = configFile.format(self.jetInput)
331 if self.calibToolCalibArea
is not None:
332 alg.calibrationTool.CalibArea = self.calibToolCalibArea
333 if self.calibToolConfigFile
is not None:
334 configFile = self.calibToolConfigFile
335 alg.calibrationTool.ConfigFile = configFile
336 if config.dataType()
is DataType.Data:
337 if self.jetInput ==
"HI":
338 if config.geometry()
is LHCPeriod.Run2:
339 alg.calibrationTool.CalibSequence =
'EtaJES_Insitu'
340 if config.geometry()
is LHCPeriod.Run3:
341 alg.calibrationTool.CalibSequence =
'EtaJES'
343 alg.calibrationTool.CalibSequence =
'JetArea_Residual_EtaJES_GSC_Insitu'
345 if self.jetInput ==
"EMPFlow":
346 alg.calibrationTool.CalibSequence =
'JetArea_Residual_EtaJES_GSC'
347 elif self.jetInput ==
"HI":
348 alg.calibrationTool.CalibSequence =
'EtaJES'
350 alg.calibrationTool.CalibSequence =
'JetArea_Residual_EtaJES_GSC_Smear'
351 if self.calibToolCalibSeq
is not None:
352 alg.calibrationTool.CalibSequence = self.calibToolCalibSeq
353 alg.calibrationTool.IsData = (config.dataType()
is DataType.Data)
354 alg.jets = config.readName (self.containerName)
355 alg.jetsOut = config.copyName (self.containerName)
358 alg = config.createAlgorithm(
'CP::JetUncertaintiesAlg',
'JetUncertaintiesAlg'+self.containerName )
359 self.createUncertaintyTool(alg, config, jetCollectionName, doPseudoData=( self.systematicsModelJER
in [
"Full",
"All"] ))
360 alg.jets = config.readName (self.containerName)
361 alg.jetsOut = config.copyName (self.containerName)
362 alg.preselection = config.getPreselection (self.containerName,
'')
365 if self.runJvtUpdate :
366 alg = config.createAlgorithm(
'CP::JvtUpdateAlg',
'JvtUpdateAlg'+self.containerName )
367 config.addPrivateTool(
'jvtTool',
'JetVertexTaggerTool' )
368 alg.jvtTool.JetContainer = self.jetCollection
369 alg.jvtTool.SuppressInputDependence=
True
370 alg.jets = config.readName (self.containerName)
371 alg.jetsOut = config.copyName (self.containerName)
372 alg.preselection = config.getPreselection (self.containerName,
'')
374 if self.runNNJvtUpdate:
375 assert self.jetInput==
"EMPFlow",
"NN JVT only defined for PFlow jets"
376 alg = config.createAlgorithm(
'CP::JetDecoratorAlg',
'NNJvtUpdateAlg'+self.containerName )
377 config.addPrivateTool(
'decorator',
'JetPileupTag::JetVertexNNTagger' )
379 alg.jets = config.readName (self.containerName)
380 alg.jetsOut = config.copyName (self.containerName)
381 alg.decorator.JetContainer = alg.jetsOut.replace (
'%SYS%',
'NOSYS')
382 alg.decorator.SuppressInputDependence=
True
383 alg.decorator.SuppressOutputDependence=
True
385 if self.runFJvtUpdate :
386 alg = config.createAlgorithm(
'CP::JetModifierAlg',
'JetModifierAlg'+self.containerName )
387 config.addPrivateTool(
'modifierTool',
'JetForwardJvtTool')
388 alg.modifierTool.OutputDec =
"passFJVT_internal"
389 alg.modifierTool.FJVTName =
"fJVT"
392 alg.modifierTool.EtaThresh = 2.5
393 alg.modifierTool.ForwardMaxPt = 120*GeV
394 alg.modifierTool.RenounceOutputs =
True
395 alg.jets = config.readName (self.containerName)
396 alg.jetsOut = config.copyName (self.containerName)
400 if self.runJvtSelection :
401 assert self.jetInput==
"EMPFlow",
"NNJvt WPs and SFs only valid for PFlow jets"
402 alg = config.createAlgorithm(
'CP::AsgSelectionAlg', f
'JvtSelectionAlg{self.containerName}')
403 config.addPrivateTool(
'selectionTool',
'CP::NNJvtSelectionTool')
404 alg.selectionTool.JetContainer = config.readName(self.containerName)
405 alg.selectionTool.WorkingPoint = self.jvtWP
406 alg.selectionTool.MaxPtForJvt = 60*GeV
407 alg.selectionDecoration =
"jvt_selection,as_char"
408 alg.particles = config.readName(self.containerName)
410 if self.runJvtEfficiency
and config.dataType()
is not DataType.Data:
411 alg = config.createAlgorithm(
'CP::JvtEfficiencyAlg',
'JvtEfficiencyAlg'+self.containerName )
412 config.addPrivateTool(
'efficiencyTool',
'CP::NNJvtEfficiencyTool' )
413 alg.efficiencyTool.JetContainer = config.readName(self.containerName)
414 alg.efficiencyTool.MaxPtForJvt = 60*GeV
415 alg.efficiencyTool.WorkingPoint = self.jvtWP
416 if config.geometry()
is LHCPeriod.Run2:
417 alg.efficiencyTool.SFFile =
"JetJvtEfficiency/May2024/NNJvtSFFile_Run2_EMPFlow.root"
419 alg.efficiencyTool.SFFile =
"JetJvtEfficiency/May2024/NNJvtSFFile_Run3_EMPFlow.root"
420 alg.selection =
'jvt_selection,as_char'
421 alg.scaleFactorDecoration =
'jvt_effSF_%SYS%'
422 alg.outOfValidity = 2
423 alg.outOfValidityDeco =
'no_jvt'
424 alg.skipBadEfficiency =
False
425 alg.jets = config.readName (self.containerName)
426 alg.preselection = config.getPreselection (self.containerName,
'')
427 config.addOutputVar (self.containerName, alg.scaleFactorDecoration,
'jvtEfficiency')
428 config.addSelection (self.containerName,
'baselineJvt',
'jvt_selection,as_char', preselection=
False)
430 if self.runFJvtSelection :
431 assert self.jetInput==
"EMPFlow",
"fJvt WPs and SFs only valid for PFlow jets"
432 alg = config.createAlgorithm(
'CP::AsgSelectionAlg', f
'FJvtSelectionAlg{self.containerName}')
433 config.addPrivateTool(
'selectionTool',
'CP::FJvtSelectionTool')
434 alg.selectionTool.JetContainer = config.readName(self.containerName)
435 alg.selectionTool.WorkingPoint = self.fJvtWP
436 alg.selectionDecoration =
"fjvt_selection,as_char"
437 alg.particles = config.readName(self.containerName)
439 if self.runFJvtEfficiency
and config.dataType()
is not DataType.Data:
440 alg = config.createAlgorithm(
'CP::JvtEfficiencyAlg',
'FJvtEfficiencyAlg'+self.containerName )
441 config.addPrivateTool(
'efficiencyTool',
'CP::FJvtEfficiencyTool' )
442 alg.efficiencyTool.JetContainer = config.readName(self.containerName)
443 alg.efficiencyTool.WorkingPoint = self.fJvtWP
444 if config.geometry()
is LHCPeriod.Run2:
445 alg.efficiencyTool.SFFile =
"JetJvtEfficiency/May2024/fJvtSFFile_Run2_EMPFlow.root"
447 alg.efficiencyTool.SFFile =
"JetJvtEfficiency/May2024/fJvtSFFile_Run3_EMPFlow.root"
448 alg.selection =
'fjvt_selection,as_char'
449 alg.scaleFactorDecoration =
'fjvt_effSF_%SYS%'
450 alg.outOfValidity = 2
451 alg.outOfValidityDeco =
'no_fjvt'
452 alg.skipBadEfficiency =
False
453 alg.jets = config.readName (self.containerName)
454 alg.preselection = config.getPreselection (self.containerName,
'')
455 config.addOutputVar (self.containerName, alg.scaleFactorDecoration,
'fjvtEfficiency')
456 config.addSelection (self.containerName,
'baselineFJvt',
'fjvt_selection,as_char', preselection=
False)
459 alg = config.createAlgorithm(
'CP::AsgEnergyDecoratorAlg',
'EnergyDecorator' + self.containerName )
460 alg.particles = config.readName (self.containerName)
462 config.addOutputVar (self.containerName,
'e_%SYS%',
'e')