diff --git a/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/python/FullCPAlgorithmsTest.py b/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/python/FullCPAlgorithmsTest.py index f9f27f2f53ba0e975bcf7626fb4540ddb33adc2e..9bf2a55abfddfb1e78b3225d50537b8670a5dff2 100644 --- a/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/python/FullCPAlgorithmsTest.py +++ b/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/python/FullCPAlgorithmsTest.py @@ -92,23 +92,23 @@ def makeSequenceOld (dataType, algSeq, vars, forCompare, isPhyslite, noPhysliteB else : input = jetContainer jetSequence = makeJetAnalysisSequence( dataType, jetContainer, - runJvtUpdate = True, - enableCutflow=True, enableKinematicHistograms=True, shallowViewOutput = False, - runGhostMuonAssociation = not isPhyslite) - - if not noPhysliteBroken : - from FTagAnalysisAlgorithms.FTagAnalysisSequence import makeFTagAnalysisSequence - btagger = "MV2c10" - btagWP = "FixedCutBEff_77" - makeFTagAnalysisSequence( jetSequence, dataType, jetContainer, noEfficiency = False, legacyRecommendations = True, - enableCutflow=True, btagger = btagger, btagWP = btagWP ) - vars += [ - 'OutJets_%SYS%.ftag_select_' + btagger + '_' + btagWP + ' -> jet_ftag_select_%SYS%', - ] - if dataType != 'data' : - vars += [ - 'OutJets_%SYS%.ftag_effSF_' + btagger + '_' + btagWP + '_%SYS% -> jet_ftag_eff_%SYS%' - ] + truthJetCollection='AntiKt4TruthDressedWZJets', + enableCutflow=True, enableKinematicHistograms=True, shallowViewOutput = False) + + # FIX ME: f-tag needs an overhaul to run on DAOD_PHYS + # if not noPhysliteBroken : + # from FTagAnalysisAlgorithms.FTagAnalysisSequence import makeFTagAnalysisSequence + # btagger = "MV2c10" + # btagWP = "FixedCutBEff_77" + # makeFTagAnalysisSequence( jetSequence, dataType, jetContainer, noEfficiency = False, legacyRecommendations = True, + # enableCutflow=True, btagger = btagger, btagWP = btagWP ) + # vars += [ + # 'OutJets_%SYS%.ftag_select_' + btagger + '_' + btagWP + ' -> jet_ftag_select_%SYS%', + # ] + # if dataType != 'data' : + # vars += [ + # 'OutJets_%SYS%.ftag_effSF_' + btagger + '_' + btagWP + '_%SYS% -> jet_ftag_eff_%SYS%' + # ] jetSequence.configure( inputName = input, outputName = 'AnaJets_%SYS%' ) @@ -213,7 +213,7 @@ def makeSequenceOld (dataType, algSeq, vars, forCompare, isPhyslite, noPhysliteB input = 'AnalysisPhotons' else : input = 'Photons' - photonSequence = makePhotonAnalysisSequence( dataType, 'Tight.FixedCutTight', postfix = 'tight', + photonSequence = makePhotonAnalysisSequence( dataType, 'Tight.FixedCutTight', postfix = 'tight', ptSelectionOutput=True, recomputeIsEM=False, enableCutflow=True, enableKinematicHistograms=True, shallowViewOutput = False ) photonSequence.configure( inputName = input, outputName = 'AnaPhotons_%SYS%' ) @@ -232,7 +232,9 @@ def makeSequenceOld (dataType, algSeq, vars, forCompare, isPhyslite, noPhysliteB input = 'AnalysisTauJets' else : input = 'TauJets' + # FIX ME: Need to disable truth matching for taus to run on DAOD_PHYS tauSequence = makeTauAnalysisSequence( dataType, 'Tight', postfix = 'tight', + rerunTruthMatching = False, enableCutflow=True, enableKinematicHistograms=True, shallowViewOutput = False ) tauSequence.configure( inputName = input, outputName = 'AnaTauJets_%SYS%' ) @@ -454,7 +456,6 @@ def makeSequenceBlocks (dataType, algSeq, vars, forCompare, isPhyslite, noPhysli configSeq = ConfigSequence () - if not isPhyslite : # Include, and then set up the pileup analysis sequence: prwfiles, lumicalcfiles = pileupConfigFiles(dataType) @@ -506,7 +507,7 @@ def makeSequenceBlocks (dataType, algSeq, vars, forCompare, isPhyslite, noPhysli # Include, and then set up the photon analysis algorithm sequence: from EgammaAnalysisAlgorithms.PhotonAnalysisConfig import makePhotonCalibrationConfig, makePhotonWorkingPointConfig - makePhotonCalibrationConfig (configSeq, 'AnaPhotons', recomputeIsEM=False) + makePhotonCalibrationConfig (configSeq, 'AnaPhotons', recomputeIsEM=False, ptSelectionOutput=True) makePhotonWorkingPointConfig (configSeq, 'AnaPhotons', 'Tight.FixedCutTight', postfix = 'tight', recomputeIsEM=False) vars += [ 'OutPhotons_NOSYS.eta -> ph_eta', 'OutPhotons_NOSYS.phi -> ph_phi', @@ -519,7 +520,7 @@ def makeSequenceBlocks (dataType, algSeq, vars, forCompare, isPhyslite, noPhysli # Include, and then set up the muon analysis algorithm sequence: from MuonAnalysisAlgorithms.MuonAnalysisConfig import makeMuonCalibrationConfig, makeMuonWorkingPointConfig - makeMuonCalibrationConfig (configSeq, 'AnaMuons') + makeMuonCalibrationConfig (configSeq, 'AnaMuons', ptSelectionOutput=True) makeMuonWorkingPointConfig (configSeq, 'AnaMuons', workingPoint='Medium.Iso', postfix='medium') makeMuonWorkingPointConfig (configSeq, 'AnaMuons', workingPoint='Tight.Iso', postfix='tight') vars += [ 'OutMuons_NOSYS.eta -> mu_eta', @@ -536,7 +537,9 @@ def makeSequenceBlocks (dataType, algSeq, vars, forCompare, isPhyslite, noPhysli # Include, and then set up the tau analysis algorithm sequence: from TauAnalysisAlgorithms.TauAnalysisConfig import makeTauCalibrationConfig, makeTauWorkingPointConfig - makeTauCalibrationConfig (configSeq, 'AnaTauJets') + # FIX ME: Need to disable truth matching for taus to run on DAOD_PHYS + makeTauCalibrationConfig (configSeq, 'AnaTauJets', + rerunTruthMatching = False) makeTauWorkingPointConfig (configSeq, 'AnaTauJets', workingPoint='Tight', postfix='tight') vars += [ 'OutTauJets_NOSYS.eta -> tau_eta', 'OutTauJets_NOSYS.phi -> tau_phi', diff --git a/PhysicsAnalysis/Algorithms/AsgAnalysisAlgorithms/python/AsgAnalysisConfig.py b/PhysicsAnalysis/Algorithms/AsgAnalysisAlgorithms/python/AsgAnalysisConfig.py index 3e315940ff69ab0077fb65136a88eab8952243ce..f8eb3d25c47c0f5e6a54d68730342b26f72f06d7 100644 --- a/PhysicsAnalysis/Algorithms/AsgAnalysisAlgorithms/python/AsgAnalysisConfig.py +++ b/PhysicsAnalysis/Algorithms/AsgAnalysisAlgorithms/python/AsgAnalysisConfig.py @@ -9,67 +9,47 @@ class PileupReweightingBlock (ConfigBlock): def __init__ (self) : super (PileupReweightingBlock, self).__init__ () - self.campaign=None - self.files=None - self.useDefaultConfig=False - self.userLumicalcFiles=None - self.userPileupConfigs=None + self.userPileupConfigs=[] + self.userLumicalcFiles=[] + self.autoConfig=False def makeAlgs (self, config) : - from Campaigns.Utils import Campaign - try: from AthenaCommon.Logging import logging except ImportError: import logging - log = logging.getLogger('makePileupAnalysisSequence') - - # TODO: support per-campaign config - - toolConfigFiles = [] - toolLumicalcFiles = [] - campaign = self.campaign - if self.files is not None and (campaign is None or campaign is Campaign.Unknown or self.userPileupConfigs is None): - if campaign is None or campaign is Campaign.Unknown: - from Campaigns.Utils import getMCCampaign - campaign = getMCCampaign(self.files) - if campaign: - log.info(f'Autoconfiguring PRW with campaign: {campaign}') - else: - log.info('Campaign could not be determined.') - - if campaign: - if self.userPileupConfigs is None: - from PileupReweighting.AutoconfigurePRW import getConfigurationFiles - toolConfigFiles = getConfigurationFiles(campaign=campaign, files=self.files, useDefaultConfig=self.useDefaultConfig) - log.info('Setting PRW configuration based on input files') - - if toolConfigFiles: - log.info(f'Using PRW configuration: {", ".join(toolConfigFiles)}') - else: - log.info('Using user provided PRW configuration') - - if self.userPileupConfigs is not None: - toolConfigFiles = self.userPileupConfigs[:] - - if self.userLumicalcFiles is not None: - log.info('Using user-provided lumicalc files') - toolLumicalcFiles = self.userLumicalcFiles[:] + prwlog = logging.getLogger('makePileupAnalysisSequence') + + muMcFiles = self.userPileupConfigs[:] + userLumicalcFiles = self.userLumicalcFiles + if self.autoConfig: + from PileupReweighting.AutoconfigurePRW import getLumiCalcFiles,getMCMuFiles + userLumicalcFiles = getLumiCalcFiles() + if len(muMcFiles)==0: + muMcFiles = getMCMuFiles() + else: + prwlog.warning('Sent autoconfig and self.userPileupConfigs='+str(self.userPileupConfigs)) + prwlog.warning('Ignoring autoconfig and keeping user-specified files') + + if userLumicalcFiles==[]: + muDataFiles = ["GoodRunsLists/data15_13TeV/20170619/PHYS_StandardGRL_All_Good_25ns_276262-284484_OflLumi-13TeV-008.root", + "GoodRunsLists/data16_13TeV/20180129/PHYS_StandardGRL_All_Good_25ns_297730-311481_OflLumi-13TeV-009.root", + "GoodRunsLists/data17_13TeV/20180619/physics_25ns_Triggerno17e33prim.lumicalc.OflLumi-13TeV-010.root", + "GoodRunsLists/data18_13TeV/20190708/ilumicalc_histograms_None_348885-364292_OflLumi-13TeV-010.root" ] else: - from PileupReweighting.AutoconfigurePRW import getLumicalcFiles - toolLumicalcFiles = getLumicalcFiles(campaign) + muDataFiles = userLumicalcFiles[:] # Set up the only algorithm of the sequence: alg = config.createAlgorithm( 'CP::PileupReweightingAlg', 'PileupReweightingAlg' ) config.addPrivateTool( 'pileupReweightingTool', 'CP::PileupReweightingTool' ) - alg.pileupReweightingTool.ConfigFiles = toolConfigFiles - if not toolConfigFiles and config.dataType() != "data": - log.info("No PRW config files provided. Disabling reweighting") + alg.pileupReweightingTool.ConfigFiles = muMcFiles + if not muMcFiles and config.dataType() != "data": + prwlog.info("No PRW config files provided. Disabling reweighting") # Setting the weight decoration to the empty string disables the reweighting alg.pileupWeightDecoration = "" - alg.pileupReweightingTool.LumiCalcFiles = toolLumicalcFiles + alg.pileupReweightingTool.LumiCalcFiles = muDataFiles @@ -123,7 +103,7 @@ class PrimaryVertexBlock (ConfigBlock): class PtEtaSelectionBlock (ConfigBlock): """the ConfigBlock for a pt-eta selection""" - def __init__ (self, containerName, *, postfix, minPt, maxEta, + def __init__ (self, containerName, postfix, minPt, maxEta, selectionDecoration) : super (PtEtaSelectionBlock, self).__init__ () self.containerName = containerName @@ -160,7 +140,7 @@ class PtEtaSelectionBlock (ConfigBlock): class OutputThinningBlock (ConfigBlock): """the ConfigBlock for output thinning""" - def __init__ (self, containerName, *, postfix) : + def __init__ (self, containerName, postfix) : super (OutputThinningBlock, self).__init__ () self.containerName = containerName self.postfix = postfix @@ -199,7 +179,7 @@ class OutputThinningBlock (ConfigBlock): -def makePileupReweightingConfig( seq, campaign=None, files=None, useDefaultConfig=False, userLumicalcFiles=None, userPileupConfigs=None ): +def makePileupReweightingConfig( seq, userPileupConfigs=[], userLumicalcFiles=[] , autoConfig=False ): """Create a PRW analysis config Keyword arguments: @@ -207,11 +187,9 @@ def makePileupReweightingConfig( seq, campaign=None, files=None, useDefaultConfi # TO DO: add explanation of the keyword arguments, left to experts config = PileupReweightingBlock () - config.campaign = campaign - config.files = files - config.useDefaultConfig = useDefaultConfig - config.userLumicalcFiles = userLumicalcFiles config.userPileupConfigs = userPileupConfigs + config.userLumicalcFiles = userLumicalcFiles + config.autoConfig = autoConfig seq.append (config) @@ -246,8 +224,8 @@ def makePrimaryVertexConfig( seq ) : def makePtEtaSelectionConfig( seq, containerName, - *, postfix = '', minPt = None, maxEta = None, - selectionDecoration): + selectionDecoration, + postfix = '', minPt = None, maxEta = None): """Create a pt-eta kinematic selection config Keyword arguments: @@ -269,7 +247,7 @@ def makePtEtaSelectionConfig( seq, containerName, def makeOutputThinningConfig( seq, containerName, - *, postfix = '', selection = None, outputName = None): + postfix = '', selection = None, outputName = None): """Create an output thinning config This will do a consistent selection of output containers (if there diff --git a/PhysicsAnalysis/Algorithms/EgammaAnalysisAlgorithms/python/PhotonAnalysisConfig.py b/PhysicsAnalysis/Algorithms/EgammaAnalysisAlgorithms/python/PhotonAnalysisConfig.py index adec672333b48eecb6efc8854db9efa6e86e8477..cf95c880cbdd5a1f4e3a7a837dfac68d36ba0e43 100644 --- a/PhysicsAnalysis/Algorithms/EgammaAnalysisAlgorithms/python/PhotonAnalysisConfig.py +++ b/PhysicsAnalysis/Algorithms/EgammaAnalysisAlgorithms/python/PhotonAnalysisConfig.py @@ -171,7 +171,7 @@ class PhotonWorkingPointConfig (ConfigBlock) : alg.particles = config.readName (self.containerName) alg.preselection = config.getPreselection (self.containerName, self.selectionName) config.addSelection (self.containerName, self.selectionName, alg.selectionDecoration, - bits=(32 if self.recomputeIsEM else 1)) + bits=(32 if self.recomputeIsEM else 1), preselection=True) # Set up the isolation selection algorithm: if self.isolationWP != 'NonIso' : @@ -183,7 +183,7 @@ class PhotonWorkingPointConfig (ConfigBlock) : alg.egammas = config.readName (self.containerName) alg.preselection = config.getPreselection (self.containerName, self.selectionName) config.addSelection (self.containerName, self.selectionName, alg.selectionDecoration, - bits=1) + bits=1, preselection=True) # Set up an algorithm used for decorating baseline photon selection: alg = config.createAlgorithm( 'CP::AsgSelectionAlg', @@ -201,7 +201,7 @@ class PhotonWorkingPointConfig (ConfigBlock) : alg.scaleFactorDecoration = 'ph_effSF' + self.postfix + '_%SYS%' if config.dataType() == 'afii': alg.efficiencyCorrectionTool.ForceDataType = \ - ROOT.PATCore.ParticleDataType.Full # no AFII ID SFs for now + ROOT.PATCore.ParticleDataType.Fast elif config.dataType() == 'mc': alg.efficiencyCorrectionTool.ForceDataType = \ ROOT.PATCore.ParticleDataType.Full diff --git a/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/python/JetAnalysisConfig.py b/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/python/JetAnalysisConfig.py index 8c5e4faeaaf55527301c544110b3a1bc47ce7d98..b7497e72ff7dd2ac4df6944625562568ddce4956 100644 --- a/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/python/JetAnalysisConfig.py +++ b/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/python/JetAnalysisConfig.py @@ -30,10 +30,33 @@ class PreJetAnalysisConfig (ConfigBlock) : else : config.setSourceName (self.containerName, self.jetCollection) + # Setup the postfix + postfix = self.postfix + if postfix != '': + postfix = "_" + postfix + + # Remove b-tagging calibration from the container name + jetCollection = self.jetCollection + btIndex = jetCollection.find('_BTagging') + if btIndex != -1: + jetCollection = jetCollection[:btIndex] + + # interpret the jet collection + collection_pattern = re.compile( + r"AntiKt(\d+)(EMTopo|EMPFlow|LCTopo|TrackCaloCluster|UFOCSSK)(TrimmedPtFrac5SmallR20|SoftDropBeta100Zcut10)?Jets") + match = collection_pattern.match(jetCollection) + if not match: + raise ValueError( + "Jet collection {0} does not match expected pattern!".format(jetCollection) ) + radius = int(match.group(1) ) + if radius not in [2, 4, 6, 10]: + raise ValueError("Jet collection has an unsupported radius '{0}'!".format(radius) ) + jetInput = match.group(2) + # Relink original jets in case of b-tagging calibration - if self.runOriginalObjectLink : + if btIndex != -1: alg = config.createAlgorithm( 'CP::AsgOriginalObjectLinkAlg', - 'JetOriginalObjectLinkAlg'+self.postfix ) + 'JetOriginalObjectLinkAlg'+postfix ) alg.baseContainerName = self.jetCollection alg.particles = config.readName (self.containerName) if config.wantCopy (self.containerName) : @@ -41,14 +64,32 @@ class PreJetAnalysisConfig (ConfigBlock) : alg.preselection = config.getPreselection (self.containerName, '') # Set up the jet ghost muon association algorithm: - if (self.runGhostMuonAssociation is None and not config.isPhyslite()) or \ - (self.runGhostMuonAssociation is True): + if self.runGhostMuonAssociation: alg = config.createAlgorithm( 'CP::JetGhostMuonAssociationAlg', - 'JetGhostMuonAssociationAlg'+self.postfix ) + 'JetGhostMuonAssociationAlg'+postfix ) alg.jets = config.readName (self.containerName) if config.wantCopy (self.containerName) : alg.jetsOut = config.copyName (self.containerName) + # IsBtag decoration for Jet Flavour Uncertainties + # (https://twiki.cern.ch/twiki/bin/view/AtlasProtected/JetUncertaintiesRel21Summer2018SmallR) + if config.dataType() != 'data' and radius < 10: + # Step 1: pt and eta selection + alg = config.createAlgorithm('CP::AsgSelectionAlg', 'JetIsBtagPtEtaSelectionAlg'+postfix) + config.addPrivateTool('selectionTool', 'CP::AsgPtEtaSelectionTool') + alg.selectionTool.minPt = 20 + alg.selectionTool.maxEta = 2.5 + alg.selectionDecoration = 'kinematicSelectionBtag,as_char' + alg.particles = config.readName (self.containerName) + # Step 2: truth selection using HadronConeExclTruthLabelID + alg = config.createAlgorithm('CP::AsgSelectionAlg', 'JetIsBtagTruthSelectionAlg'+postfix) + alg.preselection = 'kinematicSelectionBtag,as_char' + config.addPrivateTool('selectionTool', 'CP::AsgIntValueSelectionTool') + alg.selectionTool.selectionFlag = 'HadronConeExclTruthLabelID' + alg.selectionTool.acceptedValues = [5] + alg.selectionDecoration = 'IsBjet,as_char' + alg.particles = config.readName (self.containerName) + @@ -62,34 +103,31 @@ class SmallRJetAnalysisConfig (ConfigBlock) : self.jetCollection = jetCollection self.jetInput = jetInput self.postfix = postfix - if self.postfix != '' and self.postfix[0] != '_' : - self.postfix = '_' + self.postfix - self.runJvtUpdate = False - self.runFJvtUpdate = False + self.runJvtUpdate = True + self.runFJvtUpdate = True self.runJvtSelection = True - self.runFJvtSelection = False + self.runFJvtSelection = True self.runJvtEfficiency = True - self.runFJvtEfficiency = False + self.runFJvtEfficiency = True self.reduction = "Global" self.JEROption = "Simple" + self.truthJetCollection = 'AntiKt4TruthDressedWZJets' def makeAlgs (self, config) : - jetCollectionName=self.jetCollection - if(self.jetCollection=="AnalysisJets") : - jetCollectionName="AntiKt4EMPFlowJets" - if(self.jetCollection=="AnalysisLargeRJets") : - jetCollectionName="AntiKt10UFOCSSKSoftDropBeta100Zcut10Jets" + postfix = self.postfix + if postfix != '' and postfix[0] != '_' : + postfix = '_' + postfix if self.jetInput not in ["EMTopo", "EMPFlow"]: raise ValueError( "Unsupported input type '{0}' for R=0.4 jets!".format(self.jetInput) ) # Prepare the jet calibration algorithm - alg = config.createAlgorithm( 'CP::JetCalibrationAlg', 'JetCalibrationAlg'+self.postfix ) + alg = config.createAlgorithm( 'CP::JetCalibrationAlg', 'JetCalibrationAlg'+postfix ) config.addPrivateTool( 'calibrationTool', 'JetCalibrationTool' ) - alg.calibrationTool.JetCollection = jetCollectionName[:-4] + alg.calibrationTool.JetCollection = self.jetCollection[:-4] # Get the correct string to use in the config file name if config.dataType() == 'afii': configFile = "JES_MC16Recommendation_AFII_{0}_Apr2019_Rel21.config" @@ -107,6 +145,7 @@ class SmallRJetAnalysisConfig (ConfigBlock) : alg.calibrationTool.IsData = (config.dataType() == 'data') alg.jets = config.readName (self.containerName) alg.jetsOut = config.copyName (self.containerName) + alg.preselection = config.getPreselection (self.containerName, '') # Jet uncertainties # Prepare the config file @@ -125,9 +164,9 @@ class SmallRJetAnalysisConfig (ConfigBlock) : "Invalid combination of reduction and JEROption settings: " "reduction: {0}, JEROption: {1}".format(self.reduction, self.JEROption) ) - alg = config.createAlgorithm( 'CP::JetUncertaintiesAlg', 'JetUncertaintiesAlg'+self.postfix ) + alg = config.createAlgorithm( 'CP::JetUncertaintiesAlg', 'JetUncertaintiesAlg'+postfix ) config.addPrivateTool( 'uncertaintiesTool', 'JetUncertaintiesTool' ) - alg.uncertaintiesTool.JetDefinition = jetCollectionName[:-4] + alg.uncertaintiesTool.JetDefinition = self.jetCollection[:-4] # Add the correct directory on the front alg.uncertaintiesTool.ConfigFile = "rel21/Fall2018/"+configFile alg.uncertaintiesTool.MCType = "AFII" if config.dataType() == "afii" else "MC16" @@ -138,26 +177,14 @@ class SmallRJetAnalysisConfig (ConfigBlock) : # Set up the JVT update algorithm: if self.runJvtUpdate : - alg = config.createAlgorithm( 'CP::JvtUpdateAlg', 'JvtUpdateAlg'+self.postfix ) + alg = config.createAlgorithm( 'CP::JvtUpdateAlg', 'JvtUpdateAlg'+postfix ) config.addPrivateTool( 'jvtTool', 'JetVertexTaggerTool' ) - alg.jvtTool.JetContainer = self.jetCollection alg.jets = config.readName (self.containerName) alg.jetsOut = config.copyName (self.containerName) alg.preselection = config.getPreselection (self.containerName, '') - if self.runNNJvtUpdate: - assert self.jetInput=="EMPFlow", "NN JVT only defined for PFlow jets" - alg = config.createAlgorithm( 'CP::JetDecoratorAlg', 'NNJvtUpdateAlg'+self.postfix ) - config.addPrivateTool( 'decorator', 'JetPileupTag::JetVertexNNTagger' ) - # Set this actually to the *output* collection - alg.jets = config.readName (self.containerName) - alg.jetsOut = config.copyName (self.containerName) - alg.decorator.JetContainer = alg.jetsOut.replace ('%SYS%', 'NOSYS') - alg.decorator.SuppressInputDependence=True - alg.decorator.SuppressOutputDependence=True - if self.runFJvtUpdate : - alg = config.createAlgorithm( 'CP::JetModifierAlg', 'JetModifierAlg'+self.postfix ) + alg = config.createAlgorithm( 'CP::JetModifierAlg', 'JetModifierAlg'+postfix ) config.addPrivateTool( 'modifierTool', 'JetForwardJvtTool') alg.modifierTool.OutputDec = "passFJVT" #Output decoration # fJVT WPs depend on the MET WP @@ -167,12 +194,11 @@ class SmallRJetAnalysisConfig (ConfigBlock) : alg.modifierTool.ForwardMaxPt = 120.0e3 #Max Pt to define fwdJets for JVT alg.jets = config.readName (self.containerName) alg.jetsOut = config.copyName (self.containerName) - alg.preselection = config.getPreselection (self.containerName, '') # Set up the jet efficiency scale factor calculation algorithm # Change the truthJetCollection property to AntiKt4TruthWZJets if preferred if self.runJvtSelection : - alg = config.createAlgorithm( 'CP::JvtEfficiencyAlg', 'JvtEfficiencyAlg'+self.postfix ) + alg = config.createAlgorithm( 'CP::JvtEfficiencyAlg', 'JvtEfficiencyAlg'+postfix ) config.addPrivateTool( 'efficiencyTool', 'CP::JetJvtEfficiency' ) if self.jetInput == 'EMPFlow': alg.efficiencyTool.SFFile = 'JetJvtEfficiency/Moriond2018/JvtSFFile_EMPFlowJets.root' @@ -181,7 +207,6 @@ class SmallRJetAnalysisConfig (ConfigBlock) : alg.efficiencyTool.SFFile = 'JetJvtEfficiency/Moriond2018/JvtSFFile_EMTopoJets.root' alg.efficiencyTool.MaxPtForJvt = 120e3 alg.efficiencyTool.WorkingPoint = 'Tight' if self.jetInput == 'EMPFlow' else 'Medium' - alg.truthJetCollection = 'AntiKt4TruthDressedWZJets' alg.selection = 'jvt_selection' alg.scaleFactorDecoration = 'jvt_effSF_%SYS%' # Disable scale factor decorations if running on data @@ -189,6 +214,10 @@ class SmallRJetAnalysisConfig (ConfigBlock) : if not self.runJvtEfficiency or config.dataType() == 'data': alg.scaleFactorDecoration = '' alg.truthJetCollection = '' + elif self.truthJetCollection is not None: + alg.truthJetCollection = self.truthJetCollection + else : + alg.truthJetCollection = 'AntiKt4TruthDressedWZJets' alg.outOfValidity = 2 alg.outOfValidityDeco = 'no_jvt' alg.skipBadEfficiency = 0 @@ -204,7 +233,6 @@ class SmallRJetAnalysisConfig (ConfigBlock) : alg.efficiencyTool.SFFile = 'JetJvtEfficiency/May2020/fJvtSFFile.EMtopo.root' alg.efficiencyTool.WorkingPoint = 'Tight' alg.efficiencyTool.UseMuSFFormat = True - alg.truthJetCollection = 'AntiKt4TruthDressedWZJets' alg.dofJVT = True alg.fJVTStatus = 'passFJVT,as_char' alg.selection = 'fjvt_selection' @@ -214,6 +242,10 @@ class SmallRJetAnalysisConfig (ConfigBlock) : if not self.runFJvtEfficiency or config.dataType() == 'data': alg.scaleFactorDecoration = '' alg.truthJetCollection = '' + elif self.truthJetCollection is not None: + alg.truthJetCollection = self.truthJetCollection + else : + alg.truthJetCollection = 'AntiKt4TruthDressedWZJets' alg.outOfValidity = 2 alg.outOfValidityDeco = 'no_fjvt' alg.skipBadEfficiency = 0 @@ -437,10 +469,11 @@ def makeJetAnalysisConfig( seq, containerName, jetCollection, postfix = '', def makeSmallRJetAnalysisConfig( seq, containerName, jetCollection, jetInput, postfix = '', - runJvtUpdate = False, runFJvtUpdate = False, - runJvtSelection = True, runFJvtSelection = False, - runJvtEfficiency = True, runFJvtEfficiency = False, - reduction = "Global", JEROption = "Simple"): + runJvtUpdate = True, runFJvtUpdate = True, + runJvtSelection = True, runFJvtSelection = True, + runJvtEfficiency = True, runFJvtEfficiency = True, + reduction = "Global", JEROption = "Simple", + truthJetCollection = None): """Add algorithms for the R=0.4 jets. Keyword arguments @@ -456,6 +489,7 @@ def makeSmallRJetAnalysisConfig( seq, containerName, jetCollection, runFJvtEfficiency -- Determines whether or not to calculate the forward JVT efficiency reduction -- Which NP reduction scheme should be used (All, Global, Category, Scenario) JEROption -- Which variant of the reduction should be used (All, Full, Simple). Note that not all combinations of reduction and JEROption are valid! + truthJetCollection -- a custom jet collection to use for truth jets """ if jetInput not in ["EMTopo", "EMPFlow"]: @@ -472,6 +506,8 @@ def makeSmallRJetAnalysisConfig( seq, containerName, jetCollection, config.runFJvtEfficiency = runFJvtEfficiency config.reduction = reduction config.JEROption = JEROption + if truthJetCollection is not None : + config.truthJetCollection = truthJetCollection seq.append (config) diff --git a/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/python/JetAnalysisSequence.py b/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/python/JetAnalysisSequence.py index 7df0266191cdbaf0ddfdef042e61d7212435a2af..c9d83f4ca7963b93b19dc6d55a21cd49cb18b061 100644 --- a/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/python/JetAnalysisSequence.py +++ b/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/python/JetAnalysisSequence.py @@ -160,7 +160,8 @@ def makeSmallRJetAnalysisSequence( seq, dataType, jetCollection, runJvtUpdate = True, runFJvtUpdate = True, runJvtSelection = True, runFJvtSelection = True, runJvtEfficiency = True, runFJvtEfficiency = True, - reduction = "Global", JEROption = "Simple"): + reduction = "Global", JEROption = "Simple", + truthJetCollection = None): """Add algorithms for the R=0.4 jets. Keyword arguments @@ -177,6 +178,7 @@ def makeSmallRJetAnalysisSequence( seq, dataType, jetCollection, runFJvtEfficiency -- Determines whether or not to calculate the forward JVT efficiency reduction -- Which NP reduction scheme should be used (All, Global, Category, Scenario) JEROption -- Which variant of the reduction should be used (All, Full, Simple). Note that not all combinations of reduction and JEROption are valid! + truthJetCollection -- a custom jet collection to use for truth jets """ if jetInput not in ["EMTopo", "EMPFlow"]: raise ValueError( @@ -267,6 +269,8 @@ def makeSmallRJetAnalysisSequence( seq, dataType, jetCollection, if not runJvtEfficiency or dataType == 'data': alg.scaleFactorDecoration = '' alg.truthJetCollection = '' + elif truthJetCollection is not None: + alg.truthJetCollection = truthJetCollection alg.outOfValidity = 2 alg.outOfValidityDeco = 'no_jvt' alg.skipBadEfficiency = 0 @@ -291,6 +295,8 @@ def makeSmallRJetAnalysisSequence( seq, dataType, jetCollection, if not runFJvtEfficiency or dataType == 'data': alg.scaleFactorDecoration = '' alg.truthJetCollection = '' + elif truthJetCollection is not None: + alg.truthJetCollection = truthJetCollection alg.outOfValidity = 2 alg.outOfValidityDeco = 'no_fjvt' alg.skipBadEfficiency = 0 diff --git a/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/python/JetJvtAnalysisConfig.py b/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/python/JetJvtAnalysisConfig.py index bc29348785455995ea7d804e9fc26027ff60fffe..e32314cce39d79d6aed07d4bd80b5961ccf05900 100644 --- a/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/python/JetJvtAnalysisConfig.py +++ b/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/python/JetJvtAnalysisConfig.py @@ -15,7 +15,7 @@ class JetJvtAnalysisConfig (ConfigBlock) : self.postfix = postfix if self.postfix != '' and self.postfix[0] != '_' : self.postfix = '_' + self.postfix - self.enableFJvt = False + self.disableFJvt = False self.globalSF = True self.runSelection = True @@ -34,7 +34,7 @@ class JetJvtAnalysisConfig (ConfigBlock) : alg.scaleFactorOutputDecoration = 'jvt_effSF_%SYS%' alg.particles = config.readName (self.containerName) - if self.enableFJvt: + if not self.disableFJvt: alg = config.createAlgorithm( 'CP::AsgEventScaleFactorAlg', 'ForwardJvtEventScaleFactorAlg' ) preselection = config.getPreselection (self.containerName, '') alg.preselection = preselection + '&&no_fjvt' if preselection else 'no_fjvt' @@ -45,27 +45,27 @@ class JetJvtAnalysisConfig (ConfigBlock) : if self.runSelection: config.addSelection (self.containerName, '', 'jvt_selection', bits=1, preselection=False) - if self.enableFJvt : + if not self.disableFJvt : config.addSelection (self.containerName, '', 'fjvt_selection', bits=1, preselection=False) def makeJetJvtAnalysisConfig( seq, containerName, jetCollection, postfix = '', - enableFJvt = False, + disableFJvt = False, globalSF = True, runSelection = True ): """Create a jet JVT analysis algorithm config Keyword arguments: jetCollection -- The jet container to run on - enableFJvt -- Whether to enable forward JVT calculations + disableFJvt -- Whether to disable forward JVT calculations globalSF -- Whether to calculate per event scale factors runSelection -- Whether to run selection """ config = JetJvtAnalysisConfig (containerName, jetCollection, postfix) - config.enableFJvt = enableFJvt + config.disableFJvt = disableFJvt config.globalSF = globalSF config.runSelection = runSelection diff --git a/PhysicsAnalysis/Algorithms/TauAnalysisAlgorithms/python/TauAnalysisConfig.py b/PhysicsAnalysis/Algorithms/TauAnalysisAlgorithms/python/TauAnalysisConfig.py index 57a6c6e24df70edd544335bceb01d6bc132ac7ca..b7fe0165b143b4d24de84075be0401f33686d016 100644 --- a/PhysicsAnalysis/Algorithms/TauAnalysisAlgorithms/python/TauAnalysisConfig.py +++ b/PhysicsAnalysis/Algorithms/TauAnalysisAlgorithms/python/TauAnalysisConfig.py @@ -79,12 +79,12 @@ class TauWorkingPointConfig (ConfigBlock) : # Set up the algorithm selecting taus: alg = config.createAlgorithm( 'CP::AsgSelectionAlg', 'TauSelectionAlg' + self.postfix ) - config.addPrivateTool( 'selectionTool', 'TauAnalysisTools::TauSelectionTool' ) - alg.selectionTool.ConfigPath = inputfile + alg.selectionTool = '%s/%s' % \ + ( selectionTool.getType(), selectionTool.getName() ) alg.selectionDecoration = 'selected_tau' + self.postfix + ',as_bits' alg.particles = config.readName (self.containerName) alg.preselection = config.getPreselection (self.containerName, self.selectionName) - config.addSelection (self.containerName, self.selectionName, alg.selectionDecoration, bits=6) + config.addSelection (self.containerName, self.selectionName, alg.selectionDecoration, bits=6, preselection=True) # Set up an algorithm used for decorating baseline tau selection: alg = config.createAlgorithm( 'CP::AsgSelectionAlg',