376 def makeAlgs (self, config) :
377
378
379 if config.getContainerMeta(self.containerName, 'jetRadius', failOnMiss=True) != 4:
380 return
381
382
383 jetCollectionName = config.getContainerMeta(self.containerName, 'jetCollectionName', failOnMiss=True)
384
385 jetInput = config.getContainerMeta(self.containerName, 'jetInput', failOnMiss=True)
386
387 if jetInput not in ["EMTopo", "EMPFlow", "HI"]:
388 raise ValueError(
389 f"Unsupported input type '{jetInput}' for R=0.4 jets!" )
390
391 if self.jvtWP not in ["FixedEffPt"]:
392 raise ValueError(
393 f"Unsupported NNJvt WP '{self.jvtWP}'" )
394
395 if self.fJvtWP not in ["Loose", "Tight", "Tighter"]:
396 raise ValueError(
397 f"Unsupported fJvt WP '{self.fJvtWP}'" )
398
399 if not config.isPhyslite() or self.recalibratePhyslite:
400
401
402
403
404 calibToolName = 'JetCalibTool_' + jetCollectionName[:-4]
405 calibTool = config.createPublicTool( 'JetCalibrationTool', calibToolName )
406 calibTool.JetCollection = jetCollectionName[:-4]
407
408 if jetInput == "EMPFlow":
409 if config.geometry() is LHCPeriod.Run2:
410 configFile = "PreRec_R22_PFlow_ResPU_EtaJES_GSC_February23_230215.config"
411 calibTool.CalibArea = "00-04-82"
412 elif config.geometry() >= LHCPeriod.Run3:
413 configFile = "AntiKt4EMPFlow_MC23a_PreRecR22_Phase2_CalibConfig_ResPU_EtaJES_GSC_241208_InSitu.config"
414 calibTool.CalibArea = "00-04-83"
415 elif jetInput == "HI":
416 if config.geometry() is LHCPeriod.Run2:
417 configFile = "JES_MC16_HI_Jan2021_5TeV.config"
418 elif config.geometry() is LHCPeriod.Run3:
419 configFile = "AntiKt4HI_MC23_EtaJES_Run3PreRec_Run2VJet_Run3EtaInt_5p36TeV.config"
420 calibTool.CalibArea = "00-04-83"
421 else:
422 raise ValueError(
423 f"Unsupported geometry '{config.geometry()}' for HI jet calibration!")
424 else:
425 if config.dataType() is DataType.FastSim:
426 configFile = f"JES_MC16Recommendation_AFII_{jetInput}_Apr2019_Rel21.config"
427 else:
428 configFile = f"JES_MC16Recommendation_Consolidated_{jetInput}_Apr2019_Rel21.config"
429 if self.calibToolCalibArea is not None:
430 calibTool.CalibArea = self.calibToolCalibArea
431 if self.calibToolConfigFile is not None:
432 configFile = self.calibToolConfigFile
433 calibTool.ConfigFile = configFile
434 if config.dataType() is DataType.Data:
435 if jetInput == "HI":
436 calibTool.CalibSequence = 'EtaJES_Insitu'
437 else:
438 calibTool.CalibSequence = 'JetArea_Residual_EtaJES_GSC_Insitu'
439 else:
440 if jetInput == "EMPFlow":
441 calibTool.CalibSequence = 'JetArea_Residual_EtaJES_GSC'
442 elif jetInput == "HI":
443 calibTool.CalibSequence = 'EtaJES'
444 else:
445 calibTool.CalibSequence = 'JetArea_Residual_EtaJES_GSC_Smear'
446 if self.calibToolCalibSeq is not None:
447 calibTool.CalibSequence = self.calibToolCalibSeq
448 calibTool.IsData = (config.dataType() is DataType.Data)
449
450 alg = config.createAlgorithm( 'CP::JetCalibrationAlg', 'JetCalibrationAlg' )
451 alg.HIsetup = jetInput == "HI"
452 alg.calibrationTool = f'{calibTool.getType()}/{calibTool.getName()}'
453 alg.jets = config.readName (self.containerName)
454 alg.jetsOut = config.copyName (self.containerName)
455
456
457 if self.runUncertainties:
458 alg = config.createAlgorithm( 'CP::JetUncertaintiesAlg', 'JetUncertaintiesAlg' )
459 self.createUncertaintyTool(alg, config, jetCollectionName, doPseudoData=( self.systematicsModelJER in ["Full","All"] ))
460 alg.jets = config.readName (self.containerName)
461 alg.jetsOut = config.copyName (self.containerName)
462 alg.preselection = config.getPreselection (self.containerName, '')
463
464
465 if self.runJvtUpdate :
466 alg = config.createAlgorithm( 'CP::JvtUpdateAlg', 'JvtUpdateAlg' )
467 config.addPrivateTool( 'jvtTool', 'JetVertexTaggerTool' )
468 alg.jvtTool.JetContainer = self.jetCollection
469 alg.jvtTool.SuppressInputDependence=True
470 alg.jets = config.readName (self.containerName)
471 alg.jetsOut = config.copyName (self.containerName)
472 alg.preselection = config.getPreselection (self.containerName, '')
473
474 if self.runNNJvtUpdate:
475 assert jetInput=="EMPFlow", "NN JVT only defined for PFlow jets"
476 alg = config.createAlgorithm( 'CP::JetDecoratorAlg', 'NNJvtUpdateAlg' )
477 config.addPrivateTool( 'decorator', 'JetPileupTag::JetVertexNNTagger' )
478 alg.jets = config.readName (self.containerName)
479 alg.jetsOut = config.copyName (self.containerName)
480
481 alg.decorator.JetContainer = alg.jetsOut.replace ('%SYS%', 'NOSYS')
482 alg.decorator.SuppressInputDependence=True
483 alg.decorator.SuppressOutputDependence=True
484
485
486
487 if self.runJvtSelection :
488 assert jetInput=="EMPFlow", "NNJvt WPs and SFs only valid for PFlow jets"
489 warnings.warn_explicit(
490 "jvtWP, runJvtSelection and runJvtEfficiency"
491 " are deprecated - please use a"
492 " JVTWorkingPoint block instead.",
493 ConfigDeprecationWarning, filename='', lineno=0)
494
495 alg = config.createAlgorithm('CP::AsgSelectionAlg', 'JvtSelectionAlg')
496 config.addPrivateTool('selectionTool', 'CP::NNJvtSelectionTool')
497 alg.selectionTool.JetContainer = config.readName(self.containerName)
498 alg.selectionTool.JvtMomentName = "NNJvt"
499 alg.selectionTool.WorkingPoint = self.jvtWP
500 alg.selectionTool.MaxPtForJvt = 60*GeV
501 alg.selectionDecoration = "jvt_selection,as_char"
502 alg.particles = config.readName(self.containerName)
503
504 if self.runJvtEfficiency and config.dataType() is not DataType.Data:
505 alg = config.createAlgorithm( 'CP::JvtEfficiencyAlg', 'JvtEfficiencyAlg' )
506 config.addPrivateTool( 'efficiencyTool', 'CP::NNJvtEfficiencyTool' )
507 alg.efficiencyTool.JetContainer = config.readName(self.containerName)
508 alg.efficiencyTool.MaxPtForJvt = 60*GeV
509 alg.efficiencyTool.WorkingPoint = self.jvtWP
510 if config.geometry() is LHCPeriod.Run2:
511 alg.efficiencyTool.SFFile = "JetJvtEfficiency/May2024/NNJvtSFFile_Run2_EMPFlow.root"
512 else:
513 alg.efficiencyTool.SFFile = "JetJvtEfficiency/May2024/NNJvtSFFile_Run3_EMPFlow.root"
514 alg.selection = 'jvt_selection,as_char'
515 alg.scaleFactorDecoration = 'jvt_effSF_%SYS%'
516 alg.outOfValidity = 2
517 alg.outOfValidityDeco = 'no_jvt'
518 alg.skipBadEfficiency = False
519 alg.jets = config.readName (self.containerName)
520 alg.preselection = config.getPreselection (self.containerName, '')
521 config.addOutputVar (self.containerName, alg.scaleFactorDecoration, 'jvtEfficiency')
522 config.addSelection (self.containerName, 'baselineJvt', 'jvt_selection,as_char', preselection=False)
523
524 if self.runFJvtSelection :
525 assert jetInput=="EMPFlow", "fJvt WPs and SFs only valid for PFlow jets"
526 warnings.warn_explicit(
527 "fJvtWP, runFJvtSelection and runFJvtEfficiency"
528 " are deprecated - please use a"
529 " FJVTWorkingPoint block instead.",
530 ConfigDeprecationWarning, filename='', lineno=0)
531
532 alg = config.createAlgorithm('CP::AsgSelectionAlg', 'FJvtSelectionAlg')
533 config.addPrivateTool('selectionTool', 'CP::FJvtSelectionTool')
534 alg.selectionTool.JetContainer = config.readName(self.containerName)
535 alg.selectionTool.JvtMomentName = "DFCommonJets_fJvt"
536 alg.selectionTool.WorkingPoint = self.fJvtWP
537 alg.selectionDecoration = "fjvt_selection,as_char"
538 alg.particles = config.readName(self.containerName)
539
540 if self.runFJvtEfficiency and config.dataType() is not DataType.Data:
541 alg = config.createAlgorithm( 'CP::JvtEfficiencyAlg', 'FJvtEfficiencyAlg' )
542 config.addPrivateTool( 'efficiencyTool', 'CP::FJvtEfficiencyTool' )
543 alg.efficiencyTool.JetContainer = config.readName(self.containerName)
544 alg.efficiencyTool.WorkingPoint = self.fJvtWP
545 if config.geometry() is LHCPeriod.Run2:
546 alg.efficiencyTool.SFFile = "JetJvtEfficiency/May2024/fJvtSFFile_Run2_EMPFlow.root"
547 else:
548 alg.efficiencyTool.SFFile = "JetJvtEfficiency/May2024/fJvtSFFile_Run3_EMPFlow.root"
549 alg.selection = 'fjvt_selection,as_char'
550 alg.scaleFactorDecoration = 'fjvt_effSF_%SYS%'
551 alg.outOfValidity = 2
552 alg.outOfValidityDeco = 'no_fjvt'
553 alg.skipBadEfficiency = False
554 alg.jets = config.readName (self.containerName)
555 alg.preselection = config.getPreselection (self.containerName, '')
556 config.addOutputVar (self.containerName, alg.scaleFactorDecoration, 'fjvtEfficiency')
557 config.addSelection (self.containerName, 'baselineFJvt', 'fjvt_selection,as_char', preselection=False)
558
559
560 alg = config.createAlgorithm( 'CP::AsgEnergyDecoratorAlg', 'AsgEnergyDecoratorAlg' )
561 alg.particles = config.readName (self.containerName)
562
563 config.addOutputVar (self.containerName, 'e_%SYS%', 'e')
564
565