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