From 35ec8259c26297afd77293e0476471657f174a26 Mon Sep 17 00:00:00 2001 From: Matteo Bonanomi Date: Thu, 23 Jun 2022 15:57:38 +0200 Subject: [PATCH] [UL Unblinding] Major update of code. Computation pvalues for SM compatibility (#51) Co-authored-by: Matteo --- .gitignore | 19 ++ coefficients/RunCoefficients.py | 3 +- fit/RunCorrelation.py | 204 ++++++++++++++ fit/RunFiducialXS.py | 40 ++- fit/RunPlotCorrelation.py | 251 +++++++++++++++++ fit/createDatacard.py | 4 +- fit/createXSworkspace.py | 113 ++++---- fit/expected_xsec.py | 2 - fit/impacts.py | 30 ++- fit/latex_names.py | 32 +++ fit/pvalues.py | 386 +++++++++++++++++++++++++++ helperstuff/binning.py | 22 +- inputs/gConstant_HZZ2e2mu_L1.root | Bin 0 -> 23280 bytes inputs/gConstant_HZZ2e2mu_L1Zgs.root | Bin 0 -> 23388 bytes inputs/gConstant_HZZ2e2mu_g2.root | Bin 0 -> 23385 bytes inputs/gConstant_HZZ2e2mu_g4.root | Bin 0 -> 23449 bytes inputs/higgs_xsbr.py | 55 ++++ inputs/observables.py | 122 +++++++++ plotShapes.py | 46 ++-- prepareCards.py | 43 --- templates/RunTemplates.py | 4 +- 21 files changed, 1218 insertions(+), 158 deletions(-) create mode 100644 fit/RunCorrelation.py create mode 100644 fit/RunPlotCorrelation.py create mode 100644 fit/latex_names.py create mode 100644 fit/pvalues.py create mode 100644 inputs/gConstant_HZZ2e2mu_L1.root create mode 100644 inputs/gConstant_HZZ2e2mu_L1Zgs.root create mode 100644 inputs/gConstant_HZZ2e2mu_g2.root create mode 100755 inputs/gConstant_HZZ2e2mu_g4.root create mode 100644 inputs/higgs_xsbr.py create mode 100644 inputs/observables.py delete mode 100644 prepareCards.py diff --git a/.gitignore b/.gitignore index 674cab4..73ea9da 100644 --- a/.gitignore +++ b/.gitignore @@ -138,3 +138,22 @@ dmypy.json cython_debug/ .DS_Store + +# Fiducial measurements inputs +*.* +*/*.* +inputs/inputs_* +inputs/xsec_* +inputs/acc* +combine_files/* +combine_files +datacard +datacard/* +templates/201* +templates/plots/* +coefficients/JES/JESNP* +LHScans/results* +fit/commands* +fit/*.txt +impacts +pvalues/* diff --git a/coefficients/RunCoefficients.py b/coefficients/RunCoefficients.py index 48016f8..a6c5bf6 100644 --- a/coefficients/RunCoefficients.py +++ b/coefficients/RunCoefficients.py @@ -3,7 +3,7 @@ import matplotlib.ticker as ticker import numpy as np import pandas as pd -import uproot3 as uproot +import uproot #3 as uproot from math import sqrt, log import sys,os import optparse @@ -12,7 +12,6 @@ import ROOT import json -# sys.path.append('../inputs/') from observables import observables from binning import binning from paths import path diff --git a/fit/RunCorrelation.py b/fit/RunCorrelation.py new file mode 100644 index 0000000..fc007b3 --- /dev/null +++ b/fit/RunCorrelation.py @@ -0,0 +1,204 @@ +import ROOT +import sys, os, pwd +from subprocess import * +import optparse, shlex, re +import math +import time +from decimal import * +import json +from collections import OrderedDict as od +from collections import defaultdict +import seaborn as sns +import pandas as pd +import matplotlib.pyplot as plt +import numpy as np + + +sys.path.append('../inputs/') +from higgs_xsbr_13TeV import * + +def parseOptions(): + + global opt, args, runAllSteps + + usage = ('usage: %prog [options]\n' + + '%prog -h for help') + parser = optparse.OptionParser(usage) + + # input options + parser.add_option('-d', '--dir', dest='SOURCEDIR',type='string',default='./', help='run from the SOURCEDIR as working area, skip if SOURCEDIR is an empty string') + parser.add_option('', '--asimovModelName',dest='ASIMOVMODEL',type='string',default='SM_125', help='Name of the Asimov Model') + parser.add_option('', '--asimovMass',dest='ASIMOVMASS',type='string',default='125.0', help='Asimov Mass') + parser.add_option('', '--ModelNames',dest='MODELNAMES',type='string',default='SM_125',help='Names of models for unfolding, separated by | . Default is "SM_125"') + parser.add_option('', '--theoryMass',dest='THEORYMASS', type='string',default='125.38', help='Mass value for theory prediction') + parser.add_option('', '--fixMass', dest='FIXMASS', type='string',default='125.0', help='Fix mass, default is a string "125.09" or can be changed to another string, e.g."125.6" or "False"') + parser.add_option('', '--obsName', dest='OBSNAME', type='string',default='', help='Name of the observable, supported: "inclusive", "pT4l", "eta4l", "massZ2", "nJets"') + parser.add_option('', '--obsBins', dest='OBSBINS', type='string',default='', help='Bin boundaries for the diff. measurement separated by "|", e.g. as "|0|50|100|", use the defalut if empty string') + parser.add_option('', '--year', dest='YEAR', type='string',default='', help='Year -> 2016 or 2017 or 2018 or Full') + parser.add_option('', '--ZZfloating',action='store_true', dest='ZZ',default=False, help='Let ZZ normalisation to float') + # Unblind option + parser.add_option('', '--unblind', action='store_true', dest='UNBLIND', default=False, help='Use real data') + # Calculate Systematic Uncertainties + # parser.add_option('', '--calcSys', action='store_true', dest='SYS', default=False, help='Calculate Systematic Uncertainties (in addition to stat+sys)') + + # store options and arguments as global variables + global opt, args + (opt, args) = parser.parse_args() + +# parse the arguments and options +parseOptions() + +# Define function for processing of os command +def processCmd(cmd, quiet = 0): + output = '\n' + p = Popen(cmd, shell=True, stdout=PIPE, stderr=STDOUT, bufsize=-1) + for line in iter(p.stdout.readline, ''): + output=output+str(line) + print line, + p.stdout.close() + if p.wait() != 0: + raise RuntimeError("%r failed, exit status: %d" % (cmd, p.returncode)) + return output + +def RunCombineCorrelation(): + _th_MH = opt.THEORYMASS + + os.chdir('../combine_files/') + # print 'Current directory: combine_files' + + for physicalModel in PhysicalModels: + if physicalModel == 'v2': # In this case implemented for mass4l only + cmd = 'combine -n _'+obsName+'_'+physicalModel+' -M MultiDimFit ../combine_files/SM_125_all_13TeV_xs_'+obsName+'_bin_v2.root -m 125.38 --freezeParameters MH --floatOtherPOIs=1 --saveWorkspace --setParameterRanges r4eBin0=0.0,2.5:r4muBin0=0.0,2.5:r2e2muBin0=0.0,2.5 --redefineSignalPOI r4eBin0,r4muBin0,r2e2muBin0 --algo=singles --cminDefaultMinimizerStrategy 0 --saveInactivePOI=1 --robustHesse 1 --robustHesseSave 1' + if not opt.UNBLIND: + cmd += ' -t -1 --setParameters ' + for channel in ['4e', '4mu', '2e2mu']: + fidxs = 0 + fidxs = higgs_xs['ggH_'+opt.THEORYMASS]*higgs4l_br[opt.THEORYMASS+'_'+channel]*acc['ggH125_'+channel+'_'+obsName+'_genbin0_recobin0'] + fidxs += higgs_xs['VBF_'+opt.THEORYMASS]*higgs4l_br[opt.THEORYMASS+'_'+channel]*acc['VBFH125_'+channel+'_'+obsName+'_genbin0_recobin0'] + fidxs += higgs_xs['WH_'+opt.THEORYMASS]*higgs4l_br[opt.THEORYMASS+'_'+channel]*acc['WH125_'+channel+'_'+obsName+'_genbin0_recobin0'] + fidxs += higgs_xs['ZH_'+opt.THEORYMASS]*higgs4l_br[opt.THEORYMASS+'_'+channel]*acc['ZH125_'+channel+'_'+obsName+'_genbin0_recobin0'] + fidxs += higgs_xs['ttH_'+opt.THEORYMASS]*higgs4l_br[opt.THEORYMASS+'_'+channel]*acc['ttH125_'+channel+'_'+obsName+'_genbin0_recobin0'] + cmd += 'r'+channel+'Bin0='+str(round(fidxs,4))+',' + cmd = cmd[:-1] + print cmd, '\n' + output = processCmd(cmd) + # cmds.append(cmd) + + if physicalModel == 'v4': + # ----- 2e2mu ----- + cmd = 'combine -n _'+obsName+'_'+physicalModel+' -M MultiDimFit ../combine_files/SM_125_all_13TeV_xs_'+obsName+'_bin_v4.root -m 125.38 --freezeParameters MH --floatOtherPOIs=1 --saveWorkspace --algo=singles --cminDefaultMinimizerStrategy 0 --saveInactivePOI=1 --robustHesse 1 --robustHesseSave 1 --setParameterRanges ' + + for obsBin in range(nBins): + cmd += 'r2e2muBin'+str(obsBin)+'=0.0,2.5:r4lBin'+str(obsBin)+'=0.0,2.5:' + + cmd = cmd[:-1] + cmd += ' --redefineSignalPOI ' + + for obsBin in range(nBins): + cmd += 'r2e2muBin'+str(obsBin)+',r4lBin'+str(obsBin)+',' + cmd = cmd[:-1] + + if not opt.UNBLIND: + cmd += ' -t -1 --setParameters ' + for obsBin in range(nBins): + fidxs = 0 + fidxs = higgs_xs['ggH_'+opt.THEORYMASS]*higgs4l_br[opt.THEORYMASS+'_2e2mu']*acc['ggH125_2e2mu_'+obsName+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + fidxs += higgs_xs['VBF_'+opt.THEORYMASS]*higgs4l_br[opt.THEORYMASS+'_2e2mu']*acc['VBFH125_2e2mu_'+obsName+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + fidxs += higgs_xs['WH_'+opt.THEORYMASS]*higgs4l_br[opt.THEORYMASS+'_2e2mu']*acc['WH125_2e2mu_'+obsName+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + fidxs += higgs_xs['ZH_'+opt.THEORYMASS]*higgs4l_br[opt.THEORYMASS+'_2e2mu']*acc['ZH125_2e2mu_'+obsName+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + fidxs += higgs_xs['ttH_'+opt.THEORYMASS]*higgs4l_br[opt.THEORYMASS+'_2e2mu']*acc['ttH125_2e2mu_'+obsName+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + if(not opt.UNBLIND): cmd += 'r2e2muBin'+str(obsBin)+'='+str(round(fidxs,4))+',' + + fidxs = 0 + # 4e + fidxs = higgs_xs['ggH_'+opt.THEORYMASS]*higgs4l_br[opt.THEORYMASS+'_4e']*acc['ggH125_4e_'+obsName+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + fidxs += higgs_xs['VBF_'+opt.THEORYMASS]*higgs4l_br[opt.THEORYMASS+'_4e']*acc['VBFH125_4e_'+obsName+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + fidxs += higgs_xs['WH_'+opt.THEORYMASS]*higgs4l_br[opt.THEORYMASS+'_4e']*acc['WH125_4e_'+obsName+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + fidxs += higgs_xs['ZH_'+opt.THEORYMASS]*higgs4l_br[opt.THEORYMASS+'_4e']*acc['ZH125_4e_'+obsName+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + fidxs += higgs_xs['ttH_'+opt.THEORYMASS]*higgs4l_br[opt.THEORYMASS+'_4e']*acc['ttH125_4e_'+obsName+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + # 4mu + fidxs += higgs_xs['ggH_'+opt.THEORYMASS]*higgs4l_br[opt.THEORYMASS+'_4mu']*acc['ggH125_4mu_'+obsName+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + fidxs += higgs_xs['VBF_'+opt.THEORYMASS]*higgs4l_br[opt.THEORYMASS+'_4mu']*acc['VBFH125_4mu_'+obsName+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + fidxs += higgs_xs['WH_'+opt.THEORYMASS]*higgs4l_br[opt.THEORYMASS+'_4mu']*acc['WH125_4mu_'+obsName+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + fidxs += higgs_xs['ZH_'+opt.THEORYMASS]*higgs4l_br[opt.THEORYMASS+'_4mu']*acc['ZH125_4mu_'+obsName+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + fidxs += higgs_xs['ttH_'+opt.THEORYMASS]*higgs4l_br[opt.THEORYMASS+'_4mu']*acc['ttH125_4mu_'+obsName+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + if(not opt.UNBLIND): cmd += 'r4lBin'+str(obsBin)+'='+str(round(fidxs,4))+',' + cmd = cmd[:-1] + + print cmd, '\n' + output = processCmd(cmd) + # cmds.append(cmd) + + + elif physicalModel == 'v3': + _obsName = {'pT4l': 'PTH', 'rapidity4l': 'YH', 'pTj1': 'PTJET', 'njets_pt30_eta4p7': 'NJ'} + if obsName not in _obsName: + _obsName[obsName] = obsName + fitName = _obsName[obsName] + + cmd = 'combine -n _'+obsName+'_'+physicalModel+' -M MultiDimFit ../combine_files/SM_125_all_13TeV_xs_'+obsName+'_bin_v3.root -m 125.38 --freezeParameters MH --floatOtherPOIs=1 --saveWorkspace --algo=singles --cminDefaultMinimizerStrategy 0 --robustHesse 1 --robustHesseSave 1 --setParameterRanges ' + for obsBin in range(nBins): + cmd += 'r_smH_'+fitName+'_'+str(obsBin)+'=0.0,5.0:' + cmd = cmd[:-1] + cmd += ' --redefineSignalPOI ' + for obsBin in range(nBins): + cmd += 'r_smH_'+fitName+'_'+str(obsBin)+',' + cmd = cmd[:-1] + + if not opt.UNBLIND: + cmd += ' -t -1 --setParameters ' + XH = [] + for obsBin in range(nBins): + # XH.append(0.0) + # for channel in ['4e','4mu','2e2mu']: + # XH_fs = higgs_xs['ggH_'+opt.THEORYMASS]*higgs4l_br[opt.THEORYMASS+'_'+channel]*acc['ggH125_'+channel+'_'+obsName+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + # XH_fs += higgs_xs['VBF_'+opt.THEORYMASS]*higgs4l_br[opt.THEORYMASS+'_'+channel]*acc['VBFH125_'+channel+'_'+obsName+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + # XH_fs += higgs_xs['WH_'+opt.THEORYMASS]*higgs4l_br[opt.THEORYMASS+'_'+channel]*acc['WH125_'+channel+'_'+obsName+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + # XH_fs += higgs_xs['ZH_'+opt.THEORYMASS]*higgs4l_br[opt.THEORYMASS+'_'+channel]*acc['ZH125_'+channel+'_'+obsName+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + # XH_fs += higgs_xs['ttH_'+opt.THEORYMASS]*higgs4l_br[opt.THEORYMASS+'_'+channel]*acc['ttH125_'+channel+'_'+obsName+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + # XH[obsBin]+=XH_fs + # + # _obsxsec = XH[obsBin] + + cmd += 'r_smH_'+fitName+'_'+str(obsBin)+'=1,' + cmd = cmd[:-1] + print cmd, '\n' + output = processCmd(cmd) + # cmds.append(cmd) + + # processCmd('rm ../combine_files/robustHesse_'+obsName+'_'+physicalModel+'.root') + # processCmd('mv robustHesse_'+obsName+'_'+physicalModel+'.root ../combine_files/.') + + +if 'vs' in opt.OBSNAME: + obsName_tmp = opt.OBSNAME.split(' vs ') + obsName = obsName_tmp[0]+'_'+obsName_tmp[1] + doubleDiff = True +else: + obsName = opt.OBSNAME + doubleDiff = False + +DataModelName = 'SM_125' +if obsName.startswith("mass4l"): + PhysicalModels = ['v2','v3'] +elif obsName == 'D0m' or obsName == 'Dcp' or obsName == 'D0hp' or obsName == 'Dint' or obsName == 'DL1' or obsName == 'DL1Zg' or obsName == 'costhetaZ1' or obsName == 'costhetaZ2'or obsName == 'costhetastar' or obsName == 'phi' or obsName == 'phistar' or obsName == 'massZ1' or obsName == 'massZ2': + PhysicalModels = ['v3','v4'] +else: + PhysicalModels = ['v3'] + +# prepare the set of bin boundaries to run over, it is retrieved from inputs file +# _temp = __import__('inputs_sig_'+obsName+'_'+opt.YEAR, globals(), locals(), ['observableBins', 'acc'], -1) +_temp = __import__('inputs_sig_'+obsName+'_'+opt.YEAR, globals(), locals(), ['observableBins'], -1) +observableBins = _temp.observableBins +_temp = __import__('inputs_sig_extrap_'+obsName+'_'+opt.YEAR, globals(), locals(), ['acc'], -1) +acc = _temp.acc +# print 'Running Fiducial XS computation - '+obsName+' - bin boundaries: ', observableBins, '\n' +# print 'Theory xsec and BR at MH = '+_th_MH +# print 'Current directory: python' + +nBins = len(observableBins) +if not doubleDiff: nBins = nBins-1 #in case of 1D measurement the number of bins is -1 the length of the list of bin boundaries + +RunCombineCorrelation() + +sys.path.remove('../inputs/') diff --git a/fit/RunFiducialXS.py b/fit/RunFiducialXS.py index 06cc4ed..55fa4aa 100644 --- a/fit/RunFiducialXS.py +++ b/fit/RunFiducialXS.py @@ -194,6 +194,7 @@ def runv3(years, observableBins, obsName, fitName, physicalModel, fStates=['4e', cmd_t2w += "--PO 'map=.*/%s:%s[1.0,0.0,3.0]' " %(process, POI) print(cmd_t2w) + cmds.append(cmd_t2w) processCmd(cmd_t2w) cmd = 'cp hzz4l_all_13TeV_xs_'+obsName+'_bin_'+physicalModel+'.root ../combine_files/SM_125_all_13TeV_xs_'+obsName+'_bin_'+physicalModel+'.root' @@ -237,7 +238,8 @@ def runv3(years, observableBins, obsName, fitName, physicalModel, fStates=['4e', POI_xs = 'r_smH_%s_%d' %(fitName, i) POI_n = 'r_smH_%d' %i cmd_fit = 'combine -n _%s_zz_norm_0 -M MultiDimFit %s ' %(obsName, 'SM_125_all_13TeV_xs_'+obsName+'_bin_'+physicalModel+'.root') - cmd_fit += '-m 125.38 --freezeParameters MH --saveWorkspace --algo=grid --floatOtherPOIs=1 --points=100 --saveToys --cminDefaultMinimizerStrategy 0 -t -1 --setParameters ' + cmd_fit += '-m 125.38 --freezeParameters MH --saveWorkspace --algo=grid --floatOtherPOIs=1 --points=200 --saveToys --cminDefaultMinimizerStrategy 0 ' + if not opt.UNBLIND: cmd_fit += '-t -1 --saveToys --setParameters %s=1 ' %(POI_xs) cmd_fit_tmp = cmd_fit + '%s=1 -P %s --redefineSignalPOI %s' %(POI_xs, POI, POI) print(cmd_fit_tmp) @@ -247,11 +249,13 @@ def runv3(years, observableBins, obsName, fitName, physicalModel, fStates=['4e', for i in range(nBins): POI = 'r_smH_%s_%d' %(fitName, i) POI_n = 'r_smH_%d' %i - cmd_fit = 'combine -n _%s_%s_NoSys -M MultiDimFit %s ' %(obsName, POI_n, 'SM_125_all_13TeV_xs_'+obsName+'_bin_'+physicalModel+'.root') - cmd_fit += '-m 125.38 --freezeParameters MH --saveWorkspace --algo=grid --floatOtherPOIs=1 --points=200 --freezeNuisanceGroups nuis --cminDefaultMinimizerStrategy 0 ' + cmd_fit = 'combine -n _%s_%s_NoSys -M MultiDimFit %s' %(obsName, POI_n, 'higgsCombine_'+obsName+'_'+POI_n+'.MultiDimFit.mH125.38') + if not opt.UNBLIND: cmd_fit = cmd_fit + '.123456' + cmd_fit += '.root -w w --snapshotName "MultiDimFit" -m 125.38 --freezeParameters MH --saveWorkspace --algo=grid --floatOtherPOIs=1 --points=200 --freezeNuisanceGroups nuis --cminDefaultMinimizerStrategy 0 ' if not opt.UNBLIND: cmd_fit += '-t -1 --saveToys --setParameters %s=1 ' %(POI) cmd_fit_tmp = cmd_fit + '-P %s --setParameterRanges %s=0.0,2.5 --redefineSignalPOI %s' %(POI, POI, POI) + print cmd_fit_tmp processCmd(cmd_fit_tmp) cmds.append(cmd_fit_tmp) @@ -260,8 +264,9 @@ def runv3(years, observableBins, obsName, fitName, physicalModel, fStates=['4e', POI = 'zz_norm_%d' %i POI_xs = 'r_smH_%s_%d' %(fitName, i) POI_n = 'r_smH_%d' %i - cmd_fit = 'combine -n _%s_zz_norm_0_NoSys -M MultiDimFit %s ' %(obsName, 'SM_125_all_13TeV_xs_'+obsName+'_bin_'+physicalModel+'.root') - cmd_fit += '-m 125.38 --freezeParameters MH --saveWorkspace --algo=grid --floatOtherPOIs=1 --points=200 --freezeNuisanceGroups nuis --cminDefaultMinimizerStrategy 0 ' + cmd_fit = 'combine -n _%s_zz_norm_0_NoSys -M MultiDimFit %s' %(obsName, 'higgsCombine_'+obsName+'_'+POI_n+'.MultiDimFit.mH125.38') + if not opt.UNBLIND: cmd = cmd + '.123456' + cmd_fit += '.root -w w --snapshotName "MultiDimFit" -m 125.38 --freezeParameters MH --saveWorkspace --algo=grid --floatOtherPOIs=1 --points=200 --freezeNuisanceGroups nuis --cminDefaultMinimizerStrategy 0 ' if not opt.UNBLIND: cmd_fit += '-t -1 --saveToys --setParameters %s=1 ' %(POI_xs) cmd_fit_tmp = cmd_fit + '-P %s --redefineSignalPOI %s' %(POI, POI) @@ -274,8 +279,9 @@ def runv3(years, observableBins, obsName, fitName, physicalModel, fStates=['4e', POI = 'zz_norm_%d' %i POI_xs = 'r_smH_%s_%d' %(fitName, i) POI_n = 'r_smH_%d' %i - cmd_fit = 'combine -n _%s_zz_norm_0_NoSys -M MultiDimFit %s ' %(obsName, 'SM_125_all_13TeV_xs_'+obsName+'_bin_'+physicalModel+'.root') - cmd_fit += '-m 125.38 --freezeParameters MH --saveWorkspace --algo=grid --floatOtherPOIs=1 --points=100 --saveToys --freezeNuisanceGroups nuis --cminDefaultMinimizerStrategy 0 -t -1 --setParameters ' + cmd_fit = 'combine -n _%s_zz_norm_0_NoSys -M MultiDimFit %s' %(obsName, 'higgsCombine_'+obsName+'_'+POI_n+'.MultiDimFit.mH125.38') + if not opt.UNBLIND: cmd = cmd + '.123456' + cmd_fit += '.root -w w --snapshotName "MultiDimFit" -m 125.38 --freezeParameters MH --saveWorkspace --algo=grid --floatOtherPOIs=1 --points=200 --saveToys --freezeNuisanceGroups nuis --cminDefaultMinimizerStrategy 0 -t -1 --setParameters ' cmd_fit_tmp = cmd_fit + '%s=1 -P %s --redefineSignalPOI %s' %(POI_xs, POI, POI) print(cmd_fit_tmp) @@ -335,6 +341,8 @@ def runFiducialXS(): PhysicalModels = ['v4','v3'] elif 'kL' in obsName: PhysicalModels = ['kLambda'] + elif obsName == 'massZ1_massZ2': + PhysicalModels = ['v4','v3'] else: PhysicalModels = ['v3'] @@ -638,13 +646,18 @@ def runFiducialXS(): elif physicalModel == 'kLambda': #Stat+sys singles - cmd = 'combine SM_125_all_13TeV_xs_'+obsName+'_bin_'+physicalModel+'.root -n _'+obsName+' -M MultiDimFit --algo=singles -P kappa_lambda --redefineSignalPOIs kappa_lambda -m 125.38 --freezeParameters MH,r --saveWorkspace --saveToys --setParameterRanges kappa_lambda=-10,20:r=1,1 --setParameters kappa_lambda=1.0,r=1.0 -t -1 --cminDefaultMinimizerStrategy 0 --robustFit 1' + cmd = 'combine SM_125_all_13TeV_xs_'+obsName+'_bin_'+physicalModel+'.root -n _'+obsName+' -M MultiDimFit --algo=singles -P kappa_lambda --redefineSignalPOIs kappa_lambda -m 125.38 --freezeParameters MH,r --saveWorkspace --setParameterRanges kappa_lambda=-10,20:r=1,1 --cminDefaultMinimizerStrategy 0 --robustFit 1' + if(not opt.UNBLIND): + cmd = cmd + ' -t -1 --saveToys --setParameters kappa_lambda=1.0,r=1.0' output = processCmd(cmd) cmds.append(cmd) print(cmd) #Stat+sys grid - cmd = 'combine SM_125_all_13TeV_xs_'+obsName+'_bin_'+physicalModel+'.root -n _'+obsName+'_grid -M MultiDimFit --algo=grid --points=250 -P kappa_lambda --redefineSignalPOIs kappa_lambda -m 125.38 --freezeParameters MH,r --saveWorkspace --saveToys --setParameterRanges kappa_lambda=-10,20:r=1,1 --setParameters kappa_lambda=1.0,r=1.0 -t -1 --cminDefaultMinimizerStrategy 0 --robustFit 1' + cmd = 'combine SM_125_all_13TeV_xs_'+obsName+'_bin_'+physicalModel+'.root -n _'+obsName+'_grid -M MultiDimFit --algo=grid --points=250 -P kappa_lambda --redefineSignalPOIs kappa_lambda -m 125.38 --freezeParameters MH,r --saveWorkspace --setParameterRanges kappa_lambda=-10,20:r=1,1 --cminDefaultMinimizerStrategy 0 --robustFit 1' + if(not opt.UNBLIND): + cmd = cmd + ' -t -1 --saveToys --setParameters kappa_lambda=1.0,r=1.0' + output = processCmd(cmd) cmds.append(cmd) print(cmd) @@ -652,9 +665,11 @@ def runFiducialXS(): #Stat-only singles cmd = 'combine higgsCombine_'+obsName+'.MultiDimFit.mH125.38' if(not opt.UNBLIND): cmd += '.123456' - cmd += '.root -n _'+obsName+'_NoSys -M MultiDimFit -w w --snapshotName "MultiDimFit" --algo=singles -P kappa_lambda --redefineSignalPOIs kappa_lambda -m 125.38 --saveWorkspace --saveToys --setParameterRanges kappa_lambda=-10,20:r=1,1 --setParameters kappa_lambda=1.0,r=1.0 -t -1 --cminDefaultMinimizerStrategy 0 --robustFit 1 --freezeNuisanceGroups nuis' + cmd += '.root -n _'+obsName+'_NoSys -M MultiDimFit -w w --snapshotName "MultiDimFit" --algo=singles -P kappa_lambda --redefineSignalPOIs kappa_lambda -m 125.38 --saveWorkspace --setParameterRanges kappa_lambda=-10,20:r=1,1 --cminDefaultMinimizerStrategy 0 --robustFit 1 --freezeNuisanceGroups nuis' if (opt.YEAR == 'Full'): cmd += ' --freezeParameters MH,r' else: cmd += ' --freezeParameters MH' + if(not opt.UNBLIND): + cmd = cmd + ' -t -1 --saveToys --setParameters kappa_lambda=1.0,r=1.0' output = processCmd(cmd) cmds.append(cmd) print(cmd) @@ -662,9 +677,12 @@ def runFiducialXS(): #Stat-only grid cmd = 'combine higgsCombine_'+obsName+'_grid.MultiDimFit.mH125.38' if(not opt.UNBLIND): cmd += '.123456' - cmd += '.root -n _'+obsName+'_NoSys_grid -M MultiDimFit -w w --snapshotName "MultiDimFit" --algo=grid --points=250 -P kappa_lambda --redefineSignalPOIs kappa_lambda -m 125.38 --saveWorkspace --saveToys --setParameterRanges kappa_lambda=-10,20:r=1,1 --setParameters kappa_lambda=1.0,r=1.0 -t -1 --cminDefaultMinimizerStrategy 0 --robustFit 1 --freezeNuisanceGroups nuis' + cmd += '.root -n _'+obsName+'_NoSys_grid -M MultiDimFit -w w --snapshotName "MultiDimFit" --algo=grid --points=250 -P kappa_lambda --redefineSignalPOIs kappa_lambda -m 125.38 --saveWorkspace --setParameterRanges kappa_lambda=-10,20:r=1,1 --cminDefaultMinimizerStrategy 0 --robustFit 1 --freezeNuisanceGroups nuis' + if (opt.YEAR == 'Full'): cmd += ' --freezeParameters MH,r' else: cmd += ' --freezeParameters MH' + if(not opt.UNBLIND): + cmd = cmd + ' -t -1 --saveToys --setParameters kappa_lambda=1.0,r=1.0' output = processCmd(cmd) cmds.append(cmd) print(cmd) diff --git a/fit/RunPlotCorrelation.py b/fit/RunPlotCorrelation.py new file mode 100644 index 0000000..1b0cc3e --- /dev/null +++ b/fit/RunPlotCorrelation.py @@ -0,0 +1,251 @@ +import ROOT +import sys, os, pwd +from subprocess import * +import optparse, shlex, re +import math +import time +from decimal import * +import json +from collections import OrderedDict as od +from collections import defaultdict +import seaborn as sns +import pandas as pd +import matplotlib.pyplot as plt +import numpy as np + + +sys.path.append('../inputs/') +from higgs_xsbr_13TeV import * + +def parseOptions(): + + global opt, args, runAllSteps + + usage = ('usage: %prog [options]\n' + + '%prog -h for help') + parser = optparse.OptionParser(usage) + + # input options + parser.add_option('-d', '--dir', dest='SOURCEDIR',type='string',default='./', help='run from the SOURCEDIR as working area, skip if SOURCEDIR is an empty string') + parser.add_option('', '--asimovModelName',dest='ASIMOVMODEL',type='string',default='SM_125', help='Name of the Asimov Model') + parser.add_option('', '--asimovMass',dest='ASIMOVMASS',type='string',default='125.0', help='Asimov Mass') + parser.add_option('', '--ModelNames',dest='MODELNAMES',type='string',default='SM_125',help='Names of models for unfolding, separated by | . Default is "SM_125"') + parser.add_option('', '--theoryMass',dest='THEORYMASS', type='string',default='125.38', help='Mass value for theory prediction') + parser.add_option('', '--fixMass', dest='FIXMASS', type='string',default='125.0', help='Fix mass, default is a string "125.09" or can be changed to another string, e.g."125.6" or "False"') + parser.add_option('', '--obsName', dest='OBSNAME', type='string',default='', help='Name of the observable, supported: "inclusive", "pT4l", "eta4l", "massZ2", "nJets"') + parser.add_option('', '--obsBins', dest='OBSBINS', type='string',default='', help='Bin boundaries for the diff. measurement separated by "|", e.g. as "|0|50|100|", use the defalut if empty string') + parser.add_option('', '--year', dest='YEAR', type='string',default='', help='Year -> 2016 or 2017 or 2018 or Full') + parser.add_option('', '--ZZfloating',action='store_true', dest='ZZ',default=False, help='Let ZZ normalisation to float') + # Unblind option + parser.add_option('', '--unblind', action='store_true', dest='UNBLIND', default=False, help='Use real data') + # Calculate Systematic Uncertainties + # parser.add_option('', '--calcSys', action='store_true', dest='SYS', default=False, help='Calculate Systematic Uncertainties (in addition to stat+sys)') + + # store options and arguments as global variables + global opt, args + (opt, args) = parser.parse_args() + +# parse the arguments and options +parseOptions() + +# Define function for processing of os command +def processCmd(cmd, quiet = 0): + output = '\n' + p = Popen(cmd, shell=True, stdout=PIPE, stderr=STDOUT, bufsize=-1) + for line in iter(p.stdout.readline, ''): + output=output+str(line) + # print line, + p.stdout.close() + if p.wait() != 0: + raise RuntimeError("%r failed, exit status: %d" % (cmd, p.returncode)) + return output + +def PlotCorrelation(): + for physicalModel in PhysicalModels: + pois = [] + pois_plot = [] + if 'mass4l' in obsName and physicalModel == 'v2': + pois = ['r4muBin0', 'r4eBin0', 'r2e2muBin0'] + pois_plot += ['$\sigma_{4\mu}$', '$\sigma_{4e}$', '$\sigma_{2e2\mu}$'] + # elif (obsName == 'massZ1' or obsName == 'massZ2' or obsName == 'costhetastar' or obsName == 'D0m' or obsName == 'Dint' or obsName == 'Dcp' or obsName == 'DL1' or obsName == 'DL1') and physicalModel == 'v4': + elif physicalModel == 'v4': + for obsBin in range(nBins): + pois += ['r4lBin'+str(obsBin)] + pois_plot += ['$\sigma_{4e+4\mu,'+str(obsBin)+'}$'] + for obsBin in range(nBins): + pois += ['r2e2muBin'+str(obsBin)] + pois_plot += ['$\sigma_{2e2\mu,'+str(obsBin)+'}$'] + else: + # pois += ['CMS_eff_e'] + # pois_plot += ['eff_e'] + _obsName = {'pT4l': 'PTH', 'rapidity4l': 'YH', 'pTj1': 'PTJET', 'njets_pt30_eta4p7': 'NJ'} + if obsName not in _obsName: + _obsName[obsName] = obsName + for obsBin in range(nBins): + pois += ['r_smH_'+_obsName[obsName]+'_'+str(obsBin)] + pois_plot += ['r_'+str(obsBin)] + if obsName == 'mass4l_zzfloating': + if physicalModel == 'v3': + pois += ['zz_norm_0'] + pois_plot += ['ZZ'] + else: + pois = ['r4muBin0', 'zz_norm_0', 'r4eBin0', 'r2e2muBin0'] + pois_plot = ['$\sigma_{4\mu}$', 'ZZ', '$\sigma_{4e}$', '$\sigma_{2e2\mu}$'] + + pars = od() + modes = od() + + inFile = ROOT.TFile('../combine_files/robustHesse_'+obsName+'_'+physicalModel+'.root','READ') + theMatrix = inFile.Get('h_correlation') + theList = inFile.Get('floatParsFinal') + + for iPar in range(len(theList)): + print( theList[iPar].GetName() ) + if not (theList[iPar].GetName() in pois): continue + print(iPar, theList[iPar]) + pars[theList[iPar].GetName()] = iPar + + nPars = len(pars.keys()) + print ('Procesing the following %g parameters:'%nPars) + for par in pars.keys(): print (par) + revPars = {i:name for name,i in pars.items()} + + # theHist = ROOT.TH2F('corr', '', nPars, -0.5, nPars-0.5, nPars, -0.5, nPars-0.5) + theMap = {} + for iBin,iPar in enumerate(pars.values()): + for jBin,jPar in enumerate(pars.values()): + proc = theMatrix.GetXaxis().GetBinLabel(iPar+1) + theVal = theMatrix.GetBinContent(iPar+1,jPar+1) + theMap[(revPars[iPar],revPars[jPar])] = theVal + + rows = [] + for i in pois: + row = [] + for j in pois: + row.append(theMap[(i,j)]) + rows.append(row) + #for b in pois: + # rows.append([theMap[i] for i in theMap if i[0]==b]) + + theMap = pd.DataFrame(rows, pois_plot, pois_plot) + print(theMap) + + fig, ax = plt.subplots(figsize = (20, 10)) + ax.text(0., 1.005, r'$\bf{{CMS}}$', fontsize = 35, transform = ax.transAxes) + + ax.text(0.7, 1.005, r'138 fb$^{-1}$ (13 TeV)', fontsize = 20, transform = ax.transAxes) + ax.text(0.63, 0.9, r'H$\rightarrow$ ZZ', fontsize = 25, transform = ax.transAxes) + ax.text(0.55, 0.85, r'm$_{\mathrm{H}}$ = 125.38 GeV', fontsize = 25, transform = ax.transAxes) + + mask = np.zeros_like(theMap) + mask[np.triu_indices_from(mask, k = 1)] = True + + + palette = sns.diverging_palette(240, 10, n=20, as_cmap = True) + + hmap = sns.heatmap(theMap, + mask = mask, + vmin=-1.0, vmax=1.0, + # xticklabels=ticks, + # yticklabels=ticks, + annot = True, + fmt = '.2f', + square = True, + annot_kws={'size': 12, 'weight': 'bold'}, + cmap = palette, + cbar_kws={'pad': .005, 'ticks':np.arange(-1.2, 1.2, 0.2)}) + hmap.figure.axes[-1].tick_params(axis = 'y', labelsize =24, direction='in', length = 10) + + for t in hmap.texts: + if '-0.00' in t.get_text(): + t.set_text('0.00') + + plt.yticks(rotation=0, fontsize = 20) + plt.xticks(fontsize = 20) + + plt.axhline(y=0, color='k',linewidth=2.5) + plt.axhline(y=theMap.shape[1], color='k',linewidth=2.5) + plt.axvline(x=0, color='k',linewidth=2.5) + plt.axvline(x=theMap.shape[0], color='k',linewidth=2.5) + + if opt.UNBLIND: + plt.savefig('/home/llr/cms/bonanomi/fiducial/CMSSW_10_2_13/src/HiggsAnalysis/CombinedLimit/FidJJes/fit/corr_matrix/corr_'+obsName+'_'+physicalModel+'.pdf', bbox_inches='tight') + #plt.savefig('/home/llr/cms/tarabini/CMSSW_10_2_13/src/HiggsAnalysis/FiducialXSFWK/plots/'+obsName+'/data/corr_'+obsName+'_'+physicalModel+'.png') + else: + plt.savefig('/home/llr/cms/bonanomi/fiducial/CMSSW_10_2_13/src/HiggsAnalysis/CombinedLimit/FidJJes/fit/corr_matrix/corr_'+obsName+'_'+physicalModel+'.pdf', bbox_inches='tight') + #plt.savefig('/home/llr/cms/tarabini/CMSSW_10_2_13/src/HiggsAnalysis/FiducialXSFWK/plots/'+obsName+'/asimov/corr_'+obsName+'_'+physicalModel+'.png') + + + # pois_reverse = list(pois) + # pois_reverse.reverse() + # translate = defaultdict(list) + # for p in pois: + # translate[p] = p.replace('','') + # + # for iBin,iPar in enumerate(pois): + # for jBin,jPar in enumerate(pois_reverse): + # theHist.GetXaxis().SetBinLabel(iBin+1, translate[iPar]) + # theHist.GetYaxis().SetBinLabel(jBin+1, translate[jPar]) + # if iBin <= (theHist.GetNbinsX()-1-jBin): theHist.Fill(iBin, jBin, theMap[(iPar,jPar)]) + # + # print ('Final correlation map used is:') + # print (theMap) + # + # ROOT.gStyle.SetNumberContours(500) + # ROOT.gStyle.SetPaintTextFormat('1.2f') + # ROOT.gStyle.SetTextFont(42) + # theHist.GetXaxis().SetTickLength(0.) + # theHist.GetXaxis().SetLabelSize(0.06) + # theHist.GetXaxis().SetLabelFont(42) + # theHist.GetYaxis().SetTickLength(0.) + # theHist.GetYaxis().SetLabelSize(0.06) + # theHist.GetYaxis().SetLabelFont(42) + # theHist.GetZaxis().SetRangeUser(-1.,1.) + # theHist.GetZaxis().SetTickLength(0.) + # theHist.GetZaxis().SetLabelSize(0.03) + # + # theHist.SetStats(0) + # + # theHist.GetXaxis().LabelsOption("h") + # theHist.GetYaxis().SetLabelOffset(0.007) + # theHist.SetMarkerSize(2.5) + # theHist.GetXaxis().SetLabelSize(0.07) + # theHist.GetYaxis().SetLabelSize(0.07) + # + # c1 = ROOT.TCanvas() + # c1.SetLeftMargin(0.2) + # theHist.Draw('colz,text') + # c1.SaveAs('corr_'+obsName+'_'+physicalModel+'.png') + + +obsName = opt.OBSNAME + +DataModelName = 'SM_125' +if obsName.startswith("mass4l"): + PhysicalModels = ['v2','v3'] +elif obsName == 'D0m' or obsName == 'Dcp' or obsName == 'D0hp' or obsName == 'Dint' or obsName == 'DL1' or obsName == 'DL1Zg' or obsName == 'costhetaZ1' or obsName == 'costhetaZ2'or obsName == 'costhetastar' or obsName == 'phi' or obsName == 'phistar' or obsName == 'massZ1' or obsName == 'massZ2': + PhysicalModels = ['v3','v4'] +elif 'kL' in obsName: + PhysicalModels = ['kLambda'] +else: + PhysicalModels = ['v3'] + +# prepare the set of bin boundaries to run over, it is retrieved from inputs file +# _temp = __import__('inputs_sig_'+obsName+'_'+opt.YEAR, globals(), locals(), ['observableBins', 'acc'], -1) +_temp = __import__('inputs_sig_'+obsName+'_'+opt.YEAR, globals(), locals(), ['observableBins', 'acc']) +observableBins = _temp.observableBins +acc = _temp.acc +# print 'Running Fiducial XS computation - '+obsName+' - bin boundaries: ', observableBins, '\n' +# print 'Theory xsec and BR at MH = '+_th_MH +# print 'Current directory: python' + +doubleDiff = False +if type(observableBins) is dict: doubleDiff = True # If binning is a dictionary it is a double differential analysis + +nBins = len(observableBins) +if not doubleDiff: nBins = nBins-1 #in case of 1D measurement the number of bins is -1 the length of the list of bin boundaries + +os.chdir('../combine_files/') +PlotCorrelation() + +sys.path.remove('../inputs/') diff --git a/fit/createDatacard.py b/fit/createDatacard.py index 9b5327b..2198716 100644 --- a/fit/createDatacard.py +++ b/fit/createDatacard.py @@ -282,10 +282,10 @@ def createDatacard(obsName, channel, nBins, obsBin, observableBins, physicalMode # Param if(channelNumber != 2): file.write('CMS_zz4l_mean_m_sig_'+year+' param 0.0 1.0\n') - file.write('CMS_zz4l_sigma_m_sig_'+year+' param 0.0 0.2 [-1,1]\n') + file.write('CMS_zz4l_sigma_m_sig_'+year+' param 0.0 0.03 [-1,1]\n') if(channelNumber != 1): file.write('CMS_zz4l_mean_e_sig_'+year+' param 0.0 1.0\n') - file.write('CMS_zz4l_sigma_e_sig_'+year+' param 0.0 0.2 [-1,1]\n') + file.write('CMS_zz4l_sigma_e_sig_'+year+' param 0.0 0.1 [-1,1]\n') file.write('CMS_zz4l_n_sig_'+str(channelNumber)+'_'+year+' param 0.0 0.05\n') diff --git a/fit/createXSworkspace.py b/fit/createXSworkspace.py index 4a05b67..cae897f 100644 --- a/fit/createXSworkspace.py +++ b/fit/createXSworkspace.py @@ -155,6 +155,7 @@ def createXSworkspace(obsName, channel, nBins, obsBin, observableBins, addfakeH, comb_name = 'fakeH' sig_name = 'trueH' + print os.getcwd() massParaMap = readParam(PARAM_PATH+'/sim_massParam_ggH_105160_'+channel+'_'+year+'_update.txt') if(year == '2018'): @@ -164,10 +165,10 @@ def createXSworkspace(obsName, channel, nBins, obsBin, observableBins, addfakeH, CMS_zz4l_sigma_e_sig_2018 = ROOT.RooRealVar("CMS_zz4l_sigma_e_sig_2018","CMS_zz4l_sigma_e_sig_2018",-10,10) lumi = ROOT.RooRealVar("lumi_132018","lumi_132018", 59.7) if (channel=='2e2mu'): - CMS_zz4l_mean_m_err_3_2018 = ROOT.RooRealVar("CMS_zz4l_mean_m_err_3_2018","CMS_zz4l_mean_m_err_3_2018",0.0004,0.0004,0.0004) - CMS_zz4l_mean_e_err_3_2018 = ROOT.RooRealVar("CMS_zz4l_mean_e_err_3_2018","CMS_zz4l_mean_e_err_3_2018",0.003,0.003,0.003) + CMS_zz4l_mean_m_err_3_2018 = ROOT.RooRealVar("CMS_zz4l_mean_m_err_3_2018","CMS_zz4l_mean_m_err_3_2018",0.0001,0.0001,0.0001) + CMS_zz4l_mean_e_err_3_2018 = ROOT.RooRealVar("CMS_zz4l_mean_e_err_3_2018","CMS_zz4l_mean_e_err_3_2018",0.0006,0.0006,0.0006) CMS_zz4l_n_sig_3_2018 = ROOT.RooRealVar("CMS_zz4l_n_sig_3_2018","CMS_zz4l_n_sig_3_2018",-10,10) - CMS_zz4l_mean_sig_3_centralValue_2e2murecobin2018 = ROOT.RooFormulaVar("CMS_zz4l_mean_sig_3_centralValue_2e2mu" + recobin + "2018","CMS_zz4l_mean_sig_3_centralValue_2e2mu" + recobin + "2018", "(%s)*(TMath::Sqrt((1+@1)*(1+@2)))" %(massParaMap["mean_"+channel+"_"+year]), ROOT.RooArgList(MH,CMS_zz4l_mean_m_sig_2018,CMS_zz4l_mean_e_sig_2018))#,CMS_zz4l_mean_m_err_3_2018,CMS_zz4l_mean_e_err_3_2018)) + CMS_zz4l_mean_sig_3_centralValue_2e2murecobin2018 = ROOT.RooFormulaVar("CMS_zz4l_mean_sig_3_centralValue_2e2mu" + recobin + "2018","CMS_zz4l_mean_sig_3_centralValue_2e2mu" + recobin + "2018", "(%s) + (@0*@1*@3 + @0*@2*@4)/2" %(massParaMap["mean_"+channel+"_"+year]), ROOT.RooArgList(MH,CMS_zz4l_mean_m_sig_2018,CMS_zz4l_mean_e_sig_2018,CMS_zz4l_mean_m_err_3_2018,CMS_zz4l_mean_e_err_3_2018)) CMS_zz4l_mean_sig_NoConv_3_2e2murecobin2018 = ROOT.RooFormulaVar("CMS_zz4l_mean_sig_NoConv_3_2e2murecobin2018","CMS_zz4l_mean_sig_NoConv_3_2e2murecobin2018","@0",ROOT.RooArgList(CMS_zz4l_mean_sig_3_centralValue_2e2murecobin2018)) CMS_zz4l_sigma_sig_3_centralValue_2e2murecobin2018 = ROOT.RooFormulaVar("CMS_zz4l_sigma_sig_3_centralValue_2e2mu" + recobin + "2018","CMS_zz4l_sigma_sig_3_centralValue_2e2mu" + recobin + "2018", "(%s)*(TMath::Sqrt((1+@1)*(1+@2)))" %(massParaMap["sigma_"+channel+"_"+year]),ROOT.RooArgList(MH,CMS_zz4l_sigma_m_sig_2018,CMS_zz4l_sigma_e_sig_2018)) CMS_zz4l_alpha_3_centralValue_2e2murecobin2018 = ROOT.RooFormulaVar("CMS_zz4l_alpha_3_centralValue_2e2mu" + recobin + "2018","CMS_zz4l_alpha_3_centralValue_2e2mu" + recobin + "2018",massParaMap["a1_"+channel+"_"+year],ROOT.RooArgList(MH)) @@ -178,9 +179,9 @@ def createXSworkspace(obsName, channel, nBins, obsBin, observableBins, addfakeH, ggH = ROOT.RooDoubleCB('ggH_' + _obsName[obsName], "DoubleCB", m, CMS_zz4l_mean_sig_3_centralValue_2e2murecobin2018, CMS_zz4l_sigma_sig_3_centralValue_2e2murecobin2018, CMS_zz4l_alpha_3_centralValue_2e2murecobin2018, CMS_zz4l_n_3_centralValue_2e2murecobin2018, CMS_zz4l_alpha2_3_centralValue_2e2murecobin2018, CMS_zz4l_n2_3_centralValue_2e2murecobin2018) xH = ROOT.RooDoubleCB('xH_' + _obsName[obsName], "DoubleCB", m, CMS_zz4l_mean_sig_3_centralValue_2e2murecobin2018, CMS_zz4l_sigma_sig_3_centralValue_2e2murecobin2018, CMS_zz4l_alpha_3_centralValue_2e2murecobin2018, CMS_zz4l_n_3_centralValue_2e2murecobin2018, CMS_zz4l_alpha2_3_centralValue_2e2murecobin2018, CMS_zz4l_n2_3_centralValue_2e2murecobin2018) if (channel=='4e'): - CMS_zz4l_mean_e_err_2_2018 = ROOT.RooRealVar("CMS_zz4l_mean_e_err_2_2018","CMS_zz4l_mean_e_err_2_2018",0.003,0.003,0.003) + CMS_zz4l_mean_e_err_2_2018 = ROOT.RooRealVar("CMS_zz4l_mean_e_err_2_2018","CMS_zz4l_mean_e_err_2_2018",0.0006,0.0006,0.0006) CMS_zz4l_n_sig_2_2018 = ROOT.RooRealVar("CMS_zz4l_n_sig_2_2018","CMS_zz4l_n_sig_2_2018",-10,10) - CMS_zz4l_mean_sig_2_centralValue_4erecobin2018 = ROOT.RooFormulaVar("CMS_zz4l_mean_sig_2_centralValue_4e" + recobin + "2018","CMS_zz4l_mean_sig_2_centralValue_4e" + recobin + "2018", "(%s)*(1+@1)" %(massParaMap["mean_"+channel+"_"+year]), ROOT.RooArgList(MH,CMS_zz4l_mean_e_sig_2018)) + CMS_zz4l_mean_sig_2_centralValue_4erecobin2018 = ROOT.RooFormulaVar("CMS_zz4l_mean_sig_2_centralValue_4e" + recobin + "2018","CMS_zz4l_mean_sig_2_centralValue_4e" + recobin + "2018", "(%s) + @0*@1*@2" %(massParaMap["mean_"+channel+"_"+year]), ROOT.RooArgList(MH,CMS_zz4l_mean_e_sig_2018,CMS_zz4l_mean_e_err_2_2018)) CMS_zz4l_mean_sig_NoConv_2_4erecobin2018 = ROOT.RooFormulaVar("CMS_zz4l_mean_sig_NoConv_2_4erecobin2018","CMS_zz4l_mean_sig_NoConv_2_4erecobin2018","@0",ROOT.RooArgList(CMS_zz4l_mean_sig_2_centralValue_4erecobin2018)) CMS_zz4l_sigma_sig_2_centralValue_4erecobin2018 = ROOT.RooFormulaVar("CMS_zz4l_sigma_sig_2_centralValue_4e" + recobin + "2018","CMS_zz4l_sigma_sig_2_centralValue_4e" + recobin + "2018", "(%s)*(1+@1)" %(massParaMap["sigma_"+channel+"_"+year]),ROOT.RooArgList(MH,CMS_zz4l_sigma_e_sig_2018)) CMS_zz4l_alpha_2_centralValue_4erecobin2018 = ROOT.RooFormulaVar("CMS_zz4l_alpha_2_centralValue_4e" + recobin + "2018","CMS_zz4l_alpha_2_centralValue_4e" + recobin + "2018",massParaMap["a1_"+channel+"_"+year],ROOT.RooArgList(MH)) @@ -191,9 +192,9 @@ def createXSworkspace(obsName, channel, nBins, obsBin, observableBins, addfakeH, ggH = ROOT.RooDoubleCB('ggH_' + _obsName[obsName], "DoubleCB", m, CMS_zz4l_mean_sig_2_centralValue_4erecobin2018, CMS_zz4l_sigma_sig_2_centralValue_4erecobin2018, CMS_zz4l_alpha_2_centralValue_4erecobin2018, CMS_zz4l_n_2_centralValue_4erecobin2018, CMS_zz4l_alpha2_2_centralValue_4erecobin2018, CMS_zz4l_n2_2_centralValue_4erecobin2018) xH = ROOT.RooDoubleCB('xH_' + _obsName[obsName], "DoubleCB", m, CMS_zz4l_mean_sig_2_centralValue_4erecobin2018, CMS_zz4l_sigma_sig_2_centralValue_4erecobin2018, CMS_zz4l_alpha_2_centralValue_4erecobin2018, CMS_zz4l_n_2_centralValue_4erecobin2018, CMS_zz4l_alpha2_2_centralValue_4erecobin2018, CMS_zz4l_n2_2_centralValue_4erecobin2018) if (channel=='4mu'): - CMS_zz4l_mean_m_err_1_2018 = ROOT.RooRealVar("CMS_zz4l_mean_m_err_1_2018","CMS_zz4l_mean_m_err_1_2018",0.0004,0.0004,0.0004) + CMS_zz4l_mean_m_err_1_2018 = ROOT.RooRealVar("CMS_zz4l_mean_m_err_1_2018","CMS_zz4l_mean_m_err_1_2018",0.0001,0.0001,0.0001) CMS_zz4l_n_sig_1_2018 = ROOT.RooRealVar("CMS_zz4l_n_sig_1_2018","CMS_zz4l_n_sig_1_2018",-10,10) - CMS_zz4l_mean_sig_1_centralValue_4murecobin2018 = ROOT.RooFormulaVar("CMS_zz4l_mean_sig_1_centralValue_4mu" + recobin + "2018","CMS_zz4l_mean_sig_1_centralValue_4mu" + recobin + "2018", "(%s)*(1+@1)" %(massParaMap["mean_"+channel+"_"+year]),ROOT.RooArgList(MH,CMS_zz4l_mean_m_sig_2018)) + CMS_zz4l_mean_sig_1_centralValue_4murecobin2018 = ROOT.RooFormulaVar("CMS_zz4l_mean_sig_1_centralValue_4mu" + recobin + "2018","CMS_zz4l_mean_sig_1_centralValue_4mu" + recobin + "2018", "(%s) + @0*@1*@2" %(massParaMap["mean_"+channel+"_"+year]),ROOT.RooArgList(MH,CMS_zz4l_mean_m_sig_2018,CMS_zz4l_mean_m_err_1_2018)) CMS_zz4l_mean_sig_NoConv_1_4murecobin2018 = ROOT.RooFormulaVar("CMS_zz4l_mean_sig_NoConv_1_4murecobin2018","CMS_zz4l_mean_sig_NoConv_1_4murecobin2018","@0",ROOT.RooArgList(CMS_zz4l_mean_sig_1_centralValue_4murecobin2018)) CMS_zz4l_sigma_sig_1_centralValue_4murecobin2018 = ROOT.RooFormulaVar("CMS_zz4l_sigma_sig_1_centralValue_4mu" + recobin + "2018","CMS_zz4l_sigma_sig_1_centralValue_4mu" + recobin + "2018", "(%s)*(1+@1)" %(massParaMap["sigma_"+channel+"_"+year]),ROOT.RooArgList(MH,CMS_zz4l_sigma_m_sig_2018)) CMS_zz4l_alpha_1_centralValue_4murecobin2018 = ROOT.RooFormulaVar("CMS_zz4l_alpha_1_centralValue_4mu" + recobin + "2018","CMS_zz4l_alpha_1_centralValue_4mu" + recobin + "2018",massParaMap["a1_"+channel+"_"+year],ROOT.RooArgList(MH)) @@ -225,10 +226,10 @@ def createXSworkspace(obsName, channel, nBins, obsBin, observableBins, addfakeH, CMS_zz4l_sigma_e_sig_2017 = ROOT.RooRealVar("CMS_zz4l_sigma_e_sig_2017","CMS_zz4l_sigma_e_sig_2017",-10,10) lumi = ROOT.RooRealVar("lumi_132017","lumi_132017", 41.5) if (channel=='2e2mu'): - CMS_zz4l_mean_m_err_3_2017 = ROOT.RooRealVar("CMS_zz4l_mean_m_err_3_2017","CMS_zz4l_mean_m_err_3_2017",0.0004,0.0004,0.0004) - CMS_zz4l_mean_e_err_3_2017 = ROOT.RooRealVar("CMS_zz4l_mean_e_err_3_2017","CMS_zz4l_mean_e_err_3_2017",0.003,0.003,0.003) + CMS_zz4l_mean_m_err_3_2017 = ROOT.RooRealVar("CMS_zz4l_mean_m_err_3_2017","CMS_zz4l_mean_m_err_3_2017",0.0001,0.0001,0.0001) + CMS_zz4l_mean_e_err_3_2017 = ROOT.RooRealVar("CMS_zz4l_mean_e_err_3_2017","CMS_zz4l_mean_e_err_3_2017",0.0006,0.0006,0.0006) CMS_zz4l_n_sig_3_2017 = ROOT.RooRealVar("CMS_zz4l_n_sig_3_2017","CMS_zz4l_n_sig_3_2017",-10,10) - CMS_zz4l_mean_sig_3_centralValue_2e2murecobin2017 = ROOT.RooFormulaVar("CMS_zz4l_mean_sig_3_centralValue_2e2mu" + recobin + "2017","CMS_zz4l_mean_sig_3_centralValue_2e2mu" + recobin + "2017", "(%s)*(TMath::Sqrt((1+@1)*(1+@2)))" %(massParaMap["mean_"+channel+"_"+year]), ROOT.RooArgList(MH,CMS_zz4l_mean_m_sig_2017,CMS_zz4l_mean_e_sig_2017)) + CMS_zz4l_mean_sig_3_centralValue_2e2murecobin2017 = ROOT.RooFormulaVar("CMS_zz4l_mean_sig_3_centralValue_2e2mu" + recobin + "2017","CMS_zz4l_mean_sig_3_centralValue_2e2mu" + recobin + "2017", "(%s) + (@0*@1*@3 + @0*@2*@4)/2" %(massParaMap["mean_"+channel+"_"+year]), ROOT.RooArgList(MH,CMS_zz4l_mean_m_sig_2017,CMS_zz4l_mean_e_sig_2017,CMS_zz4l_mean_m_err_3_2017,CMS_zz4l_mean_e_err_3_2017)) CMS_zz4l_mean_sig_NoConv_3_2e2murecobin2017 = ROOT.RooFormulaVar("CMS_zz4l_mean_sig_NoConv_3_2e2murecobin2017","CMS_zz4l_mean_sig_NoConv_3_2e2murecobin2017","@0",ROOT.RooArgList(CMS_zz4l_mean_sig_3_centralValue_2e2murecobin2017)) CMS_zz4l_sigma_sig_3_centralValue_2e2murecobin2017 = ROOT.RooFormulaVar("CMS_zz4l_sigma_sig_3_centralValue_2e2mu" + recobin + "2017","CMS_zz4l_sigma_sig_3_centralValue_2e2mu" + recobin + "2017", "(%s)*(TMath::Sqrt((1+@1)*(1+@2)))" %(massParaMap["sigma_"+channel+"_"+year]),ROOT.RooArgList(MH,CMS_zz4l_sigma_m_sig_2017,CMS_zz4l_sigma_e_sig_2017)) CMS_zz4l_alpha_3_centralValue_2e2murecobin2017 = ROOT.RooFormulaVar("CMS_zz4l_alpha_3_centralValue_2e2mu" + recobin + "2017","CMS_zz4l_alpha_3_centralValue_2e2mu" + recobin + "2017",massParaMap["a1_"+channel+"_"+year],ROOT.RooArgList(MH)) @@ -240,9 +241,9 @@ def createXSworkspace(obsName, channel, nBins, obsBin, observableBins, addfakeH, xH = ROOT.RooDoubleCB('xH_' + _obsName[obsName], "DoubleCB", m, CMS_zz4l_mean_sig_3_centralValue_2e2murecobin2017, CMS_zz4l_sigma_sig_3_centralValue_2e2murecobin2017, CMS_zz4l_alpha_3_centralValue_2e2murecobin2017, CMS_zz4l_n_3_centralValue_2e2murecobin2017, CMS_zz4l_alpha2_3_centralValue_2e2murecobin2017, CMS_zz4l_n2_3_centralValue_2e2murecobin2017) if (channel=='4e'): - CMS_zz4l_mean_e_err_2_2017 = ROOT.RooRealVar("CMS_zz4l_mean_e_err_2_2017","CMS_zz4l_mean_e_err_2_2017",0.003,0.003,0.003) + CMS_zz4l_mean_e_err_2_2017 = ROOT.RooRealVar("CMS_zz4l_mean_e_err_2_2017","CMS_zz4l_mean_e_err_2_2017",0.0006,0.0006,0.0006) CMS_zz4l_n_sig_2_2017 = ROOT.RooRealVar("CMS_zz4l_n_sig_2_2017","CMS_zz4l_n_sig_2_2017",-10,10) - CMS_zz4l_mean_sig_2_centralValue_4erecobin2017 = ROOT.RooFormulaVar("CMS_zz4l_mean_sig_2_centralValue_4e" + recobin + "2017","CMS_zz4l_mean_sig_2_centralValue_4e" + recobin + "2017", "(%s)*(1+@1)" %(massParaMap["mean_"+channel+"_"+year]), ROOT.RooArgList(MH,CMS_zz4l_mean_e_sig_2017)) + CMS_zz4l_mean_sig_2_centralValue_4erecobin2017 = ROOT.RooFormulaVar("CMS_zz4l_mean_sig_2_centralValue_4e" + recobin + "2017","CMS_zz4l_mean_sig_2_centralValue_4e" + recobin + "2017", "(%s) + @0*@1*@2" %(massParaMap["mean_"+channel+"_"+year]), ROOT.RooArgList(MH,CMS_zz4l_mean_e_sig_2017,CMS_zz4l_mean_e_err_2_2017)) CMS_zz4l_mean_sig_NoConv_2_4erecobin2017 = ROOT.RooFormulaVar("CMS_zz4l_mean_sig_NoConv_2_4erecobin2017","CMS_zz4l_mean_sig_NoConv_2_4erecobin2017","@0",ROOT.RooArgList(CMS_zz4l_mean_sig_2_centralValue_4erecobin2017)) CMS_zz4l_sigma_sig_2_centralValue_4erecobin2017 = ROOT.RooFormulaVar("CMS_zz4l_sigma_sig_2_centralValue_4e" + recobin + "2017","CMS_zz4l_sigma_sig_2_centralValue_4e" + recobin + "2017", "(%s)*(1+@1)" %(massParaMap["sigma_"+channel+"_"+year]),ROOT.RooArgList(MH,CMS_zz4l_sigma_e_sig_2017)) CMS_zz4l_alpha_2_centralValue_4erecobin2017 = ROOT.RooFormulaVar("CMS_zz4l_alpha_2_centralValue_4e" + recobin + "2017","CMS_zz4l_alpha_2_centralValue_4e" + recobin + "2017",massParaMap["a1_"+channel+"_"+year],ROOT.RooArgList(MH)) @@ -254,9 +255,9 @@ def createXSworkspace(obsName, channel, nBins, obsBin, observableBins, addfakeH, xH = ROOT.RooDoubleCB('xH_' + _obsName[obsName], "DoubleCB", m, CMS_zz4l_mean_sig_2_centralValue_4erecobin2017, CMS_zz4l_sigma_sig_2_centralValue_4erecobin2017, CMS_zz4l_alpha_2_centralValue_4erecobin2017, CMS_zz4l_n_2_centralValue_4erecobin2017, CMS_zz4l_alpha2_2_centralValue_4erecobin2017, CMS_zz4l_n2_2_centralValue_4erecobin2017) if (channel=='4mu'): - CMS_zz4l_mean_m_err_1_2017 = ROOT.RooRealVar("CMS_zz4l_mean_m_err_1_2017","CMS_zz4l_mean_m_err_1_2017",0.0004,0.0004,0.0004) + CMS_zz4l_mean_m_err_1_2017 = ROOT.RooRealVar("CMS_zz4l_mean_m_err_1_2017","CMS_zz4l_mean_m_err_1_2017",0.0001,0.0001,0.0001) CMS_zz4l_n_sig_1_2017 = ROOT.RooRealVar("CMS_zz4l_n_sig_1_2017","CMS_zz4l_n_sig_1_2017",-10,10) - CMS_zz4l_mean_sig_1_centralValue_4murecobin2017 = ROOT.RooFormulaVar("CMS_zz4l_mean_sig_1_centralValue_4mu" + recobin + "2017","CMS_zz4l_mean_sig_1_centralValue_4mu" + recobin + "2017", "(%s)*(1+@1)" %(massParaMap["mean_"+channel+"_"+year]),ROOT.RooArgList(MH,CMS_zz4l_mean_m_sig_2017)) + CMS_zz4l_mean_sig_1_centralValue_4murecobin2017 = ROOT.RooFormulaVar("CMS_zz4l_mean_sig_1_centralValue_4mu" + recobin + "2017","CMS_zz4l_mean_sig_1_centralValue_4mu" + recobin + "2017", "(%s) + @0*@1*@2" %(massParaMap["mean_"+channel+"_"+year]),ROOT.RooArgList(MH,CMS_zz4l_mean_m_sig_2017,CMS_zz4l_mean_m_err_1_2017)) CMS_zz4l_mean_sig_NoConv_1_4murecobin2017 = ROOT.RooFormulaVar("CMS_zz4l_mean_sig_NoConv_1_4murecobin2017","CMS_zz4l_mean_sig_NoConv_1_4murecobin2017","@0",ROOT.RooArgList(CMS_zz4l_mean_sig_1_centralValue_4murecobin2017)) CMS_zz4l_sigma_sig_1_centralValue_4murecobin2017 = ROOT.RooFormulaVar("CMS_zz4l_sigma_sig_1_centralValue_4mu" + recobin + "2017","CMS_zz4l_sigma_sig_1_centralValue_4mu" + recobin + "2017", "(%s)*(1+@1)" %(massParaMap["sigma_"+channel+"_"+year]),ROOT.RooArgList(MH,CMS_zz4l_sigma_m_sig_2017)) CMS_zz4l_alpha_1_centralValue_4murecobin2017 = ROOT.RooFormulaVar("CMS_zz4l_alpha_1_centralValue_4mu" + recobin + "2017","CMS_zz4l_alpha_1_centralValue_4mu" + recobin + "2017",massParaMap["a1_"+channel+"_"+year],ROOT.RooArgList(MH)) @@ -288,10 +289,10 @@ def createXSworkspace(obsName, channel, nBins, obsBin, observableBins, addfakeH, CMS_zz4l_sigma_e_sig_2016 = ROOT.RooRealVar("CMS_zz4l_sigma_e_sig_2016","CMS_zz4l_sigma_e_sig_2016",-10,10) lumi = ROOT.RooRealVar("lumi_132016","lumi_132016", 35.9) if (channel=='2e2mu'): - CMS_zz4l_mean_m_err_3_2016 = ROOT.RooRealVar("CMS_zz4l_mean_m_err_3_2016","CMS_zz4l_mean_m_err_3_2016",0.0004,0.0004,0.0004) - CMS_zz4l_mean_e_err_3_2016 = ROOT.RooRealVar("CMS_zz4l_mean_e_err_3_2016","CMS_zz4l_mean_e_err_3_2016",0.003,0.003,0.003) + CMS_zz4l_mean_m_err_3_2016 = ROOT.RooRealVar("CMS_zz4l_mean_m_err_3_2016","CMS_zz4l_mean_m_err_3_2016",0.0001,0.0001,0.0001) + CMS_zz4l_mean_e_err_3_2016 = ROOT.RooRealVar("CMS_zz4l_mean_e_err_3_2016","CMS_zz4l_mean_e_err_3_2016",0.0006,0.0006,0.0006) CMS_zz4l_n_sig_3_2016 = ROOT.RooRealVar("CMS_zz4l_n_sig_3_2016","CMS_zz4l_n_sig_3_2016",-10,10) - CMS_zz4l_mean_sig_3_centralValue_2e2murecobin2016 = ROOT.RooFormulaVar("CMS_zz4l_mean_sig_3_centralValue_2e2mu" + recobin + "2016","CMS_zz4l_mean_sig_3_centralValue_2e2mu" + recobin + "2016", "(%s)*(TMath::Sqrt((1+@1)*(1+@2)))" %(massParaMap["mean_"+channel+"_"+year]), ROOT.RooArgList(MH,CMS_zz4l_mean_m_sig_2016,CMS_zz4l_mean_e_sig_2016)) + CMS_zz4l_mean_sig_3_centralValue_2e2murecobin2016 = ROOT.RooFormulaVar("CMS_zz4l_mean_sig_3_centralValue_2e2mu" + recobin + "2016","CMS_zz4l_mean_sig_3_centralValue_2e2mu" + recobin + "2016", "(%s) + (@0*@1*@3 + @0*@2*@4)/2" %(massParaMap["mean_"+channel+"_"+year]), ROOT.RooArgList(MH,CMS_zz4l_mean_m_sig_2016,CMS_zz4l_mean_e_sig_2016,CMS_zz4l_mean_m_err_3_2016,CMS_zz4l_mean_e_err_3_2016)) CMS_zz4l_mean_sig_NoConv_3_2e2murecobin2016 = ROOT.RooFormulaVar("CMS_zz4l_mean_sig_NoConv_3_2e2murecobin2016","CMS_zz4l_mean_sig_NoConv_3_2e2murecobin2016","@0",ROOT.RooArgList(CMS_zz4l_mean_sig_3_centralValue_2e2murecobin2016)) CMS_zz4l_sigma_sig_3_centralValue_2e2murecobin2016 = ROOT.RooFormulaVar("CMS_zz4l_sigma_sig_3_centralValue_2e2mu" + recobin + "2016","CMS_zz4l_sigma_sig_3_centralValue_2e2mu" + recobin + "2016", "(%s)*(TMath::Sqrt((1+@1)*(1+@2)))" %(massParaMap["sigma_"+channel+"_"+year]),ROOT.RooArgList(MH,CMS_zz4l_sigma_m_sig_2016,CMS_zz4l_sigma_e_sig_2016)) CMS_zz4l_alpha_3_centralValue_2e2murecobin2016 = ROOT.RooFormulaVar("CMS_zz4l_alpha_3_centralValue_2e2mu" + recobin + "2016","CMS_zz4l_alpha_3_centralValue_2e2mu" + recobin + "2016",massParaMap["a1_"+channel+"_"+year],ROOT.RooArgList(MH)) @@ -302,9 +303,9 @@ def createXSworkspace(obsName, channel, nBins, obsBin, observableBins, addfakeH, ggH = ROOT.RooDoubleCB('ggH_' + _obsName[obsName], "DoubleCB", m, CMS_zz4l_mean_sig_3_centralValue_2e2murecobin2016, CMS_zz4l_sigma_sig_3_centralValue_2e2murecobin2016, CMS_zz4l_alpha_3_centralValue_2e2murecobin2016, CMS_zz4l_n_3_centralValue_2e2murecobin2016, CMS_zz4l_alpha2_3_centralValue_2e2murecobin2016, CMS_zz4l_n2_3_centralValue_2e2murecobin2016) xH = ROOT.RooDoubleCB('xH_' + _obsName[obsName], "DoubleCB", m, CMS_zz4l_mean_sig_3_centralValue_2e2murecobin2016, CMS_zz4l_sigma_sig_3_centralValue_2e2murecobin2016, CMS_zz4l_alpha_3_centralValue_2e2murecobin2016, CMS_zz4l_n_3_centralValue_2e2murecobin2016, CMS_zz4l_alpha2_3_centralValue_2e2murecobin2016, CMS_zz4l_n2_3_centralValue_2e2murecobin2016) if (channel=='4e'): - CMS_zz4l_mean_e_err_2_2016 = ROOT.RooRealVar("CMS_zz4l_mean_e_err_2_2016","CMS_zz4l_mean_e_err_2_2016",0.003,0.003,0.003) + CMS_zz4l_mean_e_err_2_2016 = ROOT.RooRealVar("CMS_zz4l_mean_e_err_2_2016","CMS_zz4l_mean_e_err_2_2016",0.0006,0.0006,0.0006) CMS_zz4l_n_sig_2_2016 = ROOT.RooRealVar("CMS_zz4l_n_sig_2_2016","CMS_zz4l_n_sig_2_2016",-10,10) - CMS_zz4l_mean_sig_2_centralValue_4erecobin2016 = ROOT.RooFormulaVar("CMS_zz4l_mean_sig_2_centralValue_4e" + recobin + "2016","CMS_zz4l_mean_sig_2_centralValue_4e" + recobin + "2016", "(%s)*(1+@1)" %(massParaMap["mean_"+channel+"_"+year]), ROOT.RooArgList(MH,CMS_zz4l_mean_e_sig_2016)) + CMS_zz4l_mean_sig_2_centralValue_4erecobin2016 = ROOT.RooFormulaVar("CMS_zz4l_mean_sig_2_centralValue_4e" + recobin + "2016","CMS_zz4l_mean_sig_2_centralValue_4e" + recobin + "2016", "(%s) + @0*@1*@2" %(massParaMap["mean_"+channel+"_"+year]), ROOT.RooArgList(MH,CMS_zz4l_mean_e_sig_2016,CMS_zz4l_mean_e_err_2_2016)) CMS_zz4l_mean_sig_NoConv_2_4erecobin2016 = ROOT.RooFormulaVar("CMS_zz4l_mean_sig_NoConv_2_4erecobin2016","CMS_zz4l_mean_sig_NoConv_2_4erecobin2016","@0",ROOT.RooArgList(CMS_zz4l_mean_sig_2_centralValue_4erecobin2016)) CMS_zz4l_sigma_sig_2_centralValue_4erecobin2016 = ROOT.RooFormulaVar("CMS_zz4l_sigma_sig_2_centralValue_4e" + recobin + "2016","CMS_zz4l_sigma_sig_2_centralValue_4e" + recobin + "2016", "(%s)*(1+@1)" %(massParaMap["sigma_"+channel+"_"+year]),ROOT.RooArgList(MH,CMS_zz4l_sigma_e_sig_2016)) CMS_zz4l_alpha_2_centralValue_4erecobin2016 = ROOT.RooFormulaVar("CMS_zz4l_alpha_2_centralValue_4e" + recobin + "2016","CMS_zz4l_alpha_2_centralValue_4e" + recobin + "2016",massParaMap["a1_"+channel+"_"+year],ROOT.RooArgList(MH)) @@ -315,9 +316,9 @@ def createXSworkspace(obsName, channel, nBins, obsBin, observableBins, addfakeH, ggH = ROOT.RooDoubleCB('ggH_' + _obsName[obsName], "DoubleCB", m, CMS_zz4l_mean_sig_2_centralValue_4erecobin2016, CMS_zz4l_sigma_sig_2_centralValue_4erecobin2016, CMS_zz4l_alpha_2_centralValue_4erecobin2016, CMS_zz4l_n_2_centralValue_4erecobin2016, CMS_zz4l_alpha2_2_centralValue_4erecobin2016, CMS_zz4l_n2_2_centralValue_4erecobin2016) xH = ROOT.RooDoubleCB('xH_' + _obsName[obsName], "DoubleCB", m, CMS_zz4l_mean_sig_2_centralValue_4erecobin2016, CMS_zz4l_sigma_sig_2_centralValue_4erecobin2016, CMS_zz4l_alpha_2_centralValue_4erecobin2016, CMS_zz4l_n_2_centralValue_4erecobin2016, CMS_zz4l_alpha2_2_centralValue_4erecobin2016, CMS_zz4l_n2_2_centralValue_4erecobin2016) if (channel=='4mu'): - CMS_zz4l_mean_m_err_1_2016 = ROOT.RooRealVar("CMS_zz4l_mean_m_err_1_2016","CMS_zz4l_mean_m_err_1_2016",0.0004,0.0004,0.0004) + CMS_zz4l_mean_m_err_1_2016 = ROOT.RooRealVar("CMS_zz4l_mean_m_err_1_2016","CMS_zz4l_mean_m_err_1_2016",0.0001,0.0001,0.0001) CMS_zz4l_n_sig_1_2016 = ROOT.RooRealVar("CMS_zz4l_n_sig_1_2016","CMS_zz4l_n_sig_1_2016",-10,10) - CMS_zz4l_mean_sig_1_centralValue_4murecobin2016 = ROOT.RooFormulaVar("CMS_zz4l_mean_sig_1_centralValue_4mu" + recobin + "2016","CMS_zz4l_mean_sig_1_centralValue_4mu" + recobin + "2016", "(%s)*(1+@1)" %(massParaMap["mean_"+channel+"_"+year]),ROOT.RooArgList(MH,CMS_zz4l_mean_m_sig_2016)) + CMS_zz4l_mean_sig_1_centralValue_4murecobin2016 = ROOT.RooFormulaVar("CMS_zz4l_mean_sig_1_centralValue_4mu" + recobin + "2016","CMS_zz4l_mean_sig_1_centralValue_4mu" + recobin + "2016", "(%s) + @0*@1*@2" %(massParaMap["mean_"+channel+"_"+year]),ROOT.RooArgList(MH,CMS_zz4l_mean_m_sig_2016,CMS_zz4l_mean_m_err_1_2016)) CMS_zz4l_mean_sig_NoConv_1_4murecobin2016 = ROOT.RooFormulaVar("CMS_zz4l_mean_sig_NoConv_1_4murecobin2016","CMS_zz4l_mean_sig_NoConv_1_4murecobin2016","@0",ROOT.RooArgList(CMS_zz4l_mean_sig_1_centralValue_4murecobin2016)) CMS_zz4l_sigma_sig_1_centralValue_4murecobin2016 = ROOT.RooFormulaVar("CMS_zz4l_sigma_sig_1_centralValue_4mu" + recobin + "2016","CMS_zz4l_sigma_sig_1_centralValue_4mu" + recobin + "2016", "(%s)*(1+@1)" %(massParaMap["sigma_"+channel+"_"+year]),ROOT.RooArgList(MH,CMS_zz4l_sigma_m_sig_2016)) CMS_zz4l_alpha_1_centralValue_4murecobin2016 = ROOT.RooFormulaVar("CMS_zz4l_alpha_1_centralValue_4mu" + recobin + "2016","CMS_zz4l_alpha_1_centralValue_4mu" + recobin + "2016",massParaMap["a1_"+channel+"_"+year],ROOT.RooArgList(MH)) @@ -457,18 +458,18 @@ def createXSworkspace(obsName, channel, nBins, obsBin, observableBins, addfakeH, for fState in ['4e','4mu', '2e2mu']: fidxs[fState] = 0; fidxs_ggH[fState] = 0; fidxs_xH[fState] = 0 - fidxs[fState] += higgs_xs['ggH_125.0']*higgs4l_br['125.0_'+fState]*acc['ggH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] - fidxs[fState] += higgs_xs['VBF_125.0']*higgs4l_br['125.0_'+fState]*acc['VBFH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] - fidxs[fState] += higgs_xs['WH_125.0']*higgs4l_br['125.0_'+fState]*acc['WH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] - fidxs[fState] += higgs_xs['ZH_125.0']*higgs4l_br['125.0_'+fState]*acc['ZH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] - fidxs[fState] += higgs_xs['ttH_125.0']*higgs4l_br['125.0_'+fState]*acc['ttH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] - - fidxs_ggH[fState] += higgs_xs['ggH_125.0']*higgs4l_br['125.0_'+fState]*acc['ggH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] - fidxs_xH[fState] += higgs_xs['VBF_125.0']*higgs4l_br['125.0_'+fState]*acc['VBFH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] - fidxs_xH[fState] += higgs_xs['WH_125.0']*higgs4l_br['125.0_'+fState]*acc['WH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] - fidxs_xH[fState] += higgs_xs['ZH_125.0']*higgs4l_br['125.0_'+fState]*acc['ZH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] - fidxs_xH[fState] += higgs_xs['ttH_125.0']*higgs4l_br['125.0_'+fState]*acc['ttH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] - + fidxs[fState] += higgs_xs['ggH_125.38']*higgs4l_br['125.38_'+fState]*acc['ggH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] + fidxs[fState] += higgs_xs['VBF_125.38']*higgs4l_br['125.38_'+fState]*acc['VBFH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] + fidxs[fState] += higgs_xs['WH_125.38']*higgs4l_br['125.38_'+fState]*acc['WH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] + fidxs[fState] += higgs_xs['ZH_125.38']*higgs4l_br['125.38_'+fState]*acc['ZH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] + fidxs[fState] += higgs_xs['ttH_125.38']*higgs4l_br['125.38_'+fState]*acc['ttH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] + + fidxs_ggH[fState] += higgs_xs['ggH_125.38']*higgs4l_br['125.38_'+fState]*acc['ggH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] + fidxs_xH[fState] += higgs_xs['VBF_125.38']*higgs4l_br['125.38_'+fState]*acc['VBFH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] + fidxs_xH[fState] += higgs_xs['WH_125.38']*higgs4l_br['125.38_'+fState]*acc['WH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] + fidxs_xH[fState] += higgs_xs['ZH_125.38']*higgs4l_br['125.38_'+fState]*acc['ZH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] + fidxs_xH[fState] += higgs_xs['ttH_125.38']*higgs4l_br['125.38_'+fState]*acc['ttH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] + ggHName = 'ggH_' + _obsName[obsName] ggHName = ggHName+'_'+_binName ggH_shape[genbin] = ggH.Clone(); @@ -486,8 +487,8 @@ def createXSworkspace(obsName, channel, nBins, obsBin, observableBins, addfakeH, _prodMode = prodMode if prodMode == 'VBFH': _prodMode = 'VBF' - xheff += higgs_xs[_prodMode+'_125.0']*eff[prodMode+"125_"+channel+"_"+obsName+"_genbin"+str(genbin)+"_"+recobin]*acc[prodMode+'125_'+channel+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] - sumxsec += higgs_xs[_prodMode+'_125.0'] + xheff += higgs_xs[_prodMode+'_125.38']*eff[prodMode+"125_"+channel+"_"+obsName+"_genbin"+str(genbin)+"_"+recobin]*acc[prodMode+'125_'+channel+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] + sumxsec += higgs_xs[_prodMode+'_125.38'] fideff_xH[genbin] = xheff/sumxsec xheff = 0.0 @@ -512,22 +513,9 @@ def createXSworkspace(obsName, channel, nBins, obsBin, observableBins, addfakeH, # In these models the xsec is left floting, being directly the POI trueH_norm[genbin] = ROOT.RooFormulaVar(processName+"_norm","@0*@1", ROOT.RooArgList(fideff_var[genbin], lumi) ); if channel == '2e2mu': - rBin_channel['2e2mu'+str(genbin)] = ROOT.RooRealVar("r"+channel+"Bin"+str(genbin),"r"+channel+"Bin"+str(genbin), 1.0, 0.0, 10.0) + rBin_channel['2e2mu'+str(genbin)] = ROOT.RooRealVar("r"+channel+"Bin"+str(genbin),"r"+channel+"Bin"+str(genbin), fidxs['2e2mu'], 0.0, 10.0) trueH_norm_final[genbin] = ROOT.RooFormulaVar(processName+"_"+recobin+"_final","@0*@1*@2", ROOT.RooArgList(rBin_channel['2e2mu'+str(genbin)], fideff_var[genbin],lumi)) else: #4e+4mu - fidxs = {} - for fState in ['4e','4mu']: - fidxs[fState] = 0 - # fidxs[fState] += higgs_xs['ggH_125.0']*higgs4l_br['125.0_'+fState]*acc['ggH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] - # fidxs[fState] += higgs_xs['VBF_125.0']*higgs4l_br['125.0_'+fState]*acc['VBFH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] - # fidxs[fState] += higgs_xs['WH_125.0']*higgs4l_br['125.0_'+fState]*acc['WH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] - # fidxs[fState] += higgs_xs['ZH_125.0']*higgs4l_br['125.0_'+fState]*acc['ZH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] - # fidxs[fState] += higgs_xs['ttH_125.0']*higgs4l_br['125.0_'+fState]*acc['ttH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] - fidxs[fState] += higgs_xs['ggH_125.38']*higgs4l_br['125.38_'+fState]*acc['ggH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] - fidxs[fState] += higgs_xs['VBF_125.38']*higgs4l_br['125.38_'+fState]*acc['VBFH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] - fidxs[fState] += higgs_xs['WH_125.38']*higgs4l_br['125.38_'+fState]*acc['WH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] - fidxs[fState] += higgs_xs['ZH_125.38']*higgs4l_br['125.38_'+fState]*acc['ZH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] - fidxs[fState] += higgs_xs['ttH_125.38']*higgs4l_br['125.38_'+fState]*acc['ttH125_'+fState+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)] fidxs['4l'] = fidxs['4e'] + fidxs['4mu'] fracSM4eBin[str(genbin)] = ROOT.RooRealVar('fracSM4eBin'+str(genbin), 'fracSM4eBin'+str(genbin), fidxs['4e']/fidxs['4l']) fracSM4eBin[str(genbin)].setConstant(True) @@ -557,6 +545,8 @@ def createXSworkspace(obsName, channel, nBins, obsBin, observableBins, addfakeH, C1i_ttH = [0.0530525859571, 0.0472618825815, 0.0392337055167, 0.0278818345971, 0.0141882242091] C1i_VH = [0.0165863149378, 0.012328663897, 0.00774755197694, 0.0034957241269, 0.00024199147094] + #C1i_VBF = [0.009389, 0.007887, 0.006575, 0.5415, 0.004383] + C1i_VBF = [0.0066, 0.0066, 0.0064, 0.0058, 0.0055] for genbin in range(nBins): C1_ggH[str(genbin)] = ROOT.RooRealVar("C1_ggH_"+str(genbin), "C1_ggH_"+str(genbin), 0.0066, 0.0066, 0.0066) @@ -564,7 +554,8 @@ def createXSworkspace(obsName, channel, nBins, obsBin, observableBins, addfakeH, C1_VH[str(genbin)] = ROOT.RooRealVar("C1_VH_"+str(genbin), "C1_VH_"+str(genbin), C1i_VH[genbin], C1i_VH[genbin], C1i_VH[genbin]) - C1_VBFH[str(genbin)] = ROOT.RooRealVar("C1_VBFH_"+str(genbin), "C1_VBFH_"+str(genbin), 0.0063, 0.0063, 0.0063) + #C1_VBFH[str(genbin)] = ROOT.RooRealVar("C1_VBFH_"+str(genbin), "C1_VBFH_"+str(genbin), 0.0063, 0.0063, 0.0063) + C1_VBFH[str(genbin)] = ROOT.RooRealVar("C1_VBFH_"+str(genbin), "C1_VBFH_"+str(genbin), C1i_VBF[genbin],C1i_VBF[genbin],C1i_VBF[genbin]) # hzz4l C1_HZZ[str(genbin)] = ROOT.RooRealVar("C1_HZZ_"+str(genbin), "C1_HZZ_"+str(genbin), 0.0083, 0.0083, 0.0083) @@ -586,15 +577,15 @@ def createXSworkspace(obsName, channel, nBins, obsBin, observableBins, addfakeH, scale_VH[str(genbin)] = ROOT.RooFormulaVar("scale_VH_"+str(genbin), "scale_VH_"+str(genbin),"@0*@1", ROOT.RooArgList(mu_VH[str(genbin)],mu_BR[str(genbin)])) scale_ttH[str(genbin)] = ROOT.RooFormulaVar("scale_ttH_"+str(genbin), "scale_ttH_"+str(genbin),"@0*@1", ROOT.RooArgList(mu_ttH[str(genbin)],mu_BR[str(genbin)])) - fidxs_ggH[str(genbin)] = ROOT.RooRealVar("fidxs_ggH_"+str(genbin), "fidxs_ggH_"+str(genbin), 1.0*higgs_xs['ggH_125.0']*higgs4l_br['125.0_'+channel]*acc['ggH125_'+channel+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)]) + fidxs_ggH[str(genbin)] = ROOT.RooRealVar("fidxs_ggH_"+str(genbin), "fidxs_ggH_"+str(genbin), 1.0*higgs_xs['ggH_125.38']*higgs4l_br['125.38_'+channel]*acc['ggH125_'+channel+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)]) fidxs_ggH[str(genbin)].setConstant(True) - fidxs_VBFH[str(genbin)] = ROOT.RooRealVar("fidxs_VBFH_"+str(genbin), "fidxs_VBFH_"+str(genbin), 1.000*higgs_xs['VBF_125.0']*higgs4l_br['125.0_'+channel]*acc['VBFH125_'+channel+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)]) + fidxs_VBFH[str(genbin)] = ROOT.RooRealVar("fidxs_VBFH_"+str(genbin), "fidxs_VBFH_"+str(genbin), 1.000*higgs_xs['VBF_125.38']*higgs4l_br['125.38_'+channel]*acc['VBFH125_'+channel+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)]) fidxs_VBFH[str(genbin)].setConstant(True) - fidxs_WH[str(genbin)] = ROOT.RooRealVar("fidxs_WH_"+str(genbin), "fidxs_WH_"+str(genbin), 1.000*higgs_xs['WH_125.0']*higgs4l_br['125.0_'+channel]*acc['WH125_'+channel+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)]) + fidxs_WH[str(genbin)] = ROOT.RooRealVar("fidxs_WH_"+str(genbin), "fidxs_WH_"+str(genbin), 1.000*higgs_xs['WH_125.38']*higgs4l_br['125.38_'+channel]*acc['WH125_'+channel+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)]) fidxs_WH[str(genbin)].setConstant(True) - fidxs_ZH[str(genbin)] = ROOT.RooRealVar("fidxs_ZH_"+str(genbin), "fidxs_ZH_"+str(genbin), 1.000*higgs_xs['ZH_125.0']*higgs4l_br['125.0_'+channel]*acc['ZH125_'+channel+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)]) + fidxs_ZH[str(genbin)] = ROOT.RooRealVar("fidxs_ZH_"+str(genbin), "fidxs_ZH_"+str(genbin), 1.000*higgs_xs['ZH_125.38']*higgs4l_br['125.38_'+channel]*acc['ZH125_'+channel+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)]) fidxs_ZH[str(genbin)].setConstant(True) - fidxs_ttH[str(genbin)] = ROOT.RooRealVar("fidxs_ttH_"+str(genbin), "fidxs_ttH_"+str(genbin), 1.000*higgs_xs['ttH_125.0']*higgs4l_br['125.0_'+channel]*acc['ttH125_'+channel+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)]) + fidxs_ttH[str(genbin)] = ROOT.RooRealVar("fidxs_ttH_"+str(genbin), "fidxs_ttH_"+str(genbin), 1.000*higgs_xs['ttH_125.38']*higgs4l_br['125.38_'+channel]*acc['ttH125_'+channel+'_'+obsName+'_genbin'+str(genbin)+'_recobin'+str(genbin)]) fidxs_ttH[str(genbin)].setConstant(True) fidxs_fl[str(genbin)] = ROOT.RooFormulaVar("fidxs_fl_"+str(genbin), "fidxs_fl_"+str(genbin), "(@0*@5+@1*@6+(@2+@3)*@7+@4*@8)", ROOT.RooArgList(fidxs_ggH[str(genbin)], fidxs_VBFH[str(genbin)], fidxs_WH[str(genbin)], fidxs_ZH[str(genbin)], fidxs_ttH[str(genbin)], scale_ggH[str(genbin)], scale_VBFH[str(genbin)], scale_VH[str(genbin)], scale_ttH[str(genbin)])) @@ -730,10 +721,10 @@ def createXSworkspace(obsName, channel, nBins, obsBin, observableBins, addfakeH, template_qqzzName = "XSBackground_qqzz_"+channel+"_"+obsName+"_"+str(trunc(obsBin_low))+"_"+str(trunc(obsBin_high))+".root" template_ggzzName = "XSBackground_ggzz_"+channel+"_"+obsName+"_"+str(trunc(obsBin_low))+"_"+str(trunc(obsBin_high))+".root" template_zjetsName = "XSBackground_ZJetsCR_"+channel+"_"+obsName+"_"+str(trunc(obsBin_low))+"_"+str(trunc(obsBin_high))+".root" - if obsName == 'rapidity4l': - template_qqzzName = "XSBackground_qqzz_"+channel+"_"+obsName+"_"+str(obsBin_low)+"_"+str(obsBin_high)+".root" - template_ggzzName = "XSBackground_ggzz_"+channel+"_"+obsName+"_"+str(obsBin_low)+"_"+str(obsBin_high)+".root" - template_zjetsName = "XSBackground_ZJetsCR_"+channel+"_"+obsName+"_"+str(obsBin_low)+"_"+str(obsBin_high)+".root" + # if obsName == 'rapidity4l': + # template_qqzzName = "XSBackground_qqzz_"+channel+"_"+obsName+"_"+str(obsBin_low)+"_"+str(obsBin_high)+".root" + # template_ggzzName = "XSBackground_ggzz_"+channel+"_"+obsName+"_"+str(obsBin_low)+"_"+str(obsBin_high)+".root" + # template_zjetsName = "XSBackground_ZJetsCR_"+channel+"_"+obsName+"_"+str(obsBin_low)+"_"+str(obsBin_high)+".root" # if (not obsName=="mass4l"): # template_zjetsName = "/eos/user/a/atarabin/CMSSW_10_2_13/src/HiggsAnalysis/FiducialXS/templates/"+year+"/"+obsName+"/XSBackground_ZJetsCR_AllChans_"+obsName+"_"+obsBin_low+"_"+obsBin_high+".root" @@ -755,7 +746,7 @@ def createXSworkspace(obsName, channel, nBins, obsBin, observableBins, addfakeH, if decimal[obsName] and doubleDiff: ggzzTemplate = ggzzTempFile.Get("m4l_"+obsName+"_"+str(obsBin_low)+"_"+str(obsBin_high)+"_"+str(obsBin_2nd_low)+"_"+str(obsBin_2nd_high)) elif decimal[obsName]: ggzzTemplate = ggzzTempFile.Get("m4l_"+obsName+"_"+str(obsBin_low)+"_"+str(obsBin_high)) elif not doubleDiff: ggzzTemplate = ggzzTempFile.Get("m4l_"+obsName+"_"+str(trunc(obsBin_low))+"_"+str(trunc(obsBin_high))) - elif doubleDiff: ggzzTemplate = qqzzTempFile.Get("m4l_"+obsName+"_"+str(trunc(obsBin_low))+"_"+str(trunc(obsBin_high))+"_"+str(trunc(obsBin_2nd_low))+"_"+str(trunc(obsBin_2nd_high))) + elif doubleDiff: ggzzTemplate = ggzzTempFile.Get("m4l_"+obsName+"_"+str(trunc(obsBin_low))+"_"+str(trunc(obsBin_high))+"_"+str(trunc(obsBin_2nd_low))+"_"+str(trunc(obsBin_2nd_high))) # if obsName == 'rapidity4l': ggzzTemplate = ggzzTempFile.Get("m4l_"+obsName+"_"+str(obsBin_low)+"_"+str(obsBin_high)) # elif doubleDiff: ggzzTemplate = ggzzTempFile.Get("m4l_"+obsName+"_"+str(trunc(obsBin_low))+"_"+str(trunc(obsBin_high))+"_"+str(trunc(obsBin_2nd_low))+"_"+str(trunc(obsBin_2nd_high))) print 'ggZZ bins',ggzzTemplate.GetNbinsX(),ggzzTemplate.GetBinLowEdge(1),ggzzTemplate.GetBinLowEdge(ggzzTemplate.GetNbinsX()+1) @@ -764,7 +755,7 @@ def createXSworkspace(obsName, channel, nBins, obsBin, observableBins, addfakeH, if decimal[obsName] and doubleDiff: zjetsTemplate = zjetsTempFile.Get("m4l_"+obsName+"_"+str(obsBin_low)+"_"+str(obsBin_high)+"_"+str(obsBin_2nd_low)+"_"+str(obsBin_2nd_high)) elif decimal[obsName]: zjetsTemplate = zjetsTempFile.Get("m4l_"+obsName+"_"+str(obsBin_low)+"_"+str(obsBin_high)) elif not doubleDiff: zjetsTemplate = zjetsTempFile.Get("m4l_"+obsName+"_"+str(trunc(obsBin_low))+"_"+str(trunc(obsBin_high))) - elif doubleDiff: zjetsTemplate = qqzzTempFile.Get("m4l_"+obsName+"_"+str(trunc(obsBin_low))+"_"+str(trunc(obsBin_high))+"_"+str(trunc(obsBin_2nd_low))+"_"+str(trunc(obsBin_2nd_high))) + elif doubleDiff: zjetsTemplate = zjetsTempFile.Get("m4l_"+obsName+"_"+str(trunc(obsBin_low))+"_"+str(trunc(obsBin_high))+"_"+str(trunc(obsBin_2nd_low))+"_"+str(trunc(obsBin_2nd_high))) # if obsName == 'rapidity4l': zjetsTemplate = zjetsTempFile.Get("m4l_"+obsName+"_"+str(obsBin_low)+"_"+str(obsBin_high)) # elif doubleDiff: zjetsTemplate = zjetsTempFile.Get("m4l_"+obsName+"_"+str(trunc(obsBin_low))+"_"+str(trunc(obsBin_high))+"_"+str(trunc(obsBin_2nd_low))+"_"+str(trunc(obsBin_2nd_high))) print 'zjets bins',zjetsTemplate.GetNbinsX(),zjetsTemplate.GetBinLowEdge(1),zjetsTemplate.GetBinLowEdge(zjetsTemplate.GetNbinsX()+1) diff --git a/fit/expected_xsec.py b/fit/expected_xsec.py index b529d2b..5b5f088 100644 --- a/fit/expected_xsec.py +++ b/fit/expected_xsec.py @@ -7,8 +7,6 @@ from decimal import * import json -sys.path.append('../inputs/') - from higgs_xsbr_13TeV import * from binning import binning diff --git a/fit/impacts.py b/fit/impacts.py index 2cb4a78..ce75ab6 100644 --- a/fit/impacts.py +++ b/fit/impacts.py @@ -271,11 +271,13 @@ def impactPlots(): ### Third step if opt.PHYSICSMODEL=='v3': # for obsBin in range(nBins-1): - cmd = 'combineTool.py -M Impacts -d ../combine_files/SM_125_all_13TeV_xs_'+obsName+'_bin_v3.root -m 125.38 -t -1 --setParameters MH=125.38,'+cmd_BR[:-1]+','+cmd_XSEC+' --redefineSignalPOIs '+cmd_sigma - cmd += ' -o impacts_v3_'+obsName+'_' + cmd = 'combineTool.py -M Impacts -d ../combine_files/SM_125_all_13TeV_xs_'+obsName+'_bin_v3.root -m 125.38 --setParameters MH=125.38,'+cmd_BR[:-1]+','+cmd_XSEC+' --redefineSignalPOIs '+cmd_sigma + #cmd += ' -o impacts_v3_'+obsName+'_' if (not opt.UNBLIND): + cmd += ' -t -1 -o impacts_v3_'+obsName+'_' cmd = cmd + 'asimov.json' elif (opt.UNBLIND): + cmd += ' -o impacts_v3_'+obsName+'_' cmd = cmd + 'data.json' print '---------------------------' print cmd, '\n' @@ -284,7 +286,7 @@ def impactPlots(): output = processCmd(cmd) # plot for obsBin in range(nBins): - cmd = 'plotImpacts.py -i impacts_v3_'+obsName+'_' + cmd = 'plotImpacts.py --blind -i impacts_v3_'+obsName+'_' if (not opt.UNBLIND): cmd = cmd + 'asimov.json -o impacts_v3_'+obsName+'_r_smH_' + obsName_poi + '_' + str(obsBin) +'_asimov --POI r_smH_' + obsName_poi + '_' + str(obsBin) elif (opt.UNBLIND): cmd = cmd + 'data.json -o impacts_v3_'+obsName+'_r_smH_' + obsName_poi + '_' + str(obsBin) +'_data --POI r_smH_' + obsName_poi + '_' + str(obsBin) print '---------------------------' @@ -293,7 +295,7 @@ def impactPlots(): cmds.append(cmd) output = processCmd(cmd) - cmd = 'plotImpacts_skimmed.py -i impacts_v3_'+obsName+'_' + cmd = 'plotImpacts_skimmed.py --blind -i impacts_v3_'+obsName+'_' if (not opt.UNBLIND): cmd = cmd + 'asimov.json -o impacts_skimmed_v3_'+obsName+'_r_smH_' + obsName_poi + '_' + str(obsBin) +'_asimov --POI r_smH_' + obsName_poi + '_' + str(obsBin) elif (opt.UNBLIND): cmd = cmd + 'data.json -o impacts_skimmed_v3_'+obsName+'_r_smH_' + obsName_poi + '_' + str(obsBin) +'_data --POI r_smH_' + obsName_poi + '_' + str(obsBin) print '---------------------------' @@ -305,11 +307,13 @@ def impactPlots(): elif opt.PHYSICSMODEL=='v2': # for obsBin in ['2e2muBin0','4eBin0','4muBin0']: - cmd = 'combineTool.py -M Impacts -d ../combine_files/SM_125_all_13TeV_xs_'+obsName+'_bin_v2.root -m 125.38 -t -1 --setParameters MH=125.38,'+cmd_XSEC+' --redefineSignalPOIs '+cmd_sigma - cmd += ' -o impacts_v2_' + cmd = 'combineTool.py -M Impacts -d ../combine_files/SM_125_all_13TeV_xs_'+obsName+'_bin_v2.root -m 125.38 --setParameters MH=125.38,'+cmd_XSEC+' --redefineSignalPOIs '+cmd_sigma + #cmd += ' -o impacts_v2_' if (not opt.UNBLIND): + cmd += ' -t -1 -o impacts_v2_' cmd = cmd + 'asimov.json' elif (opt.UNBLIND): + cmd += ' -o impacts_v2_' cmd = cmd + 'data.json' print '---------------------------' print cmd, '\n' @@ -318,7 +322,7 @@ def impactPlots(): output = processCmd(cmd) # plot for obsBin in ['2e2muBin0','4eBin0','4muBin0']: - cmd = 'plotImpacts.py -i impacts_v2_' + cmd = 'plotImpacts.py --blind -i impacts_v2_' if (not opt.UNBLIND): cmd = cmd + 'asimov.json -o impacts_v2_'+obsName+'_r'+str(obsBin)+'_asimov --POI r'+str(obsBin) elif (opt.UNBLIND): cmd = cmd + 'data.json -o impacts_v2_'+obsName+'_r'+str(obsBin)+'_data --POI r'+str(obsBin) print '---------------------------' @@ -327,7 +331,7 @@ def impactPlots(): cmds.append(cmd) output = processCmd(cmd) - cmd = 'plotImpacts_skimmed.py -i impacts_v2_' + cmd = 'plotImpacts_skimmed.py --blind -i impacts_v2_' if (not opt.UNBLIND): cmd = cmd + 'asimov.json -o impacts_skimmed_v2_'+obsName+'_r'+str(obsBin)+'_asimov --POI r'+str(obsBin) elif (opt.UNBLIND): cmd = cmd + 'data.json -o impacts_skimmed_v2_'+obsName+'_r'+str(obsBin)+'_data --POI r'+str(obsBin) print '---------------------------' @@ -340,11 +344,13 @@ def impactPlots(): elif opt.PHYSICSMODEL=='v4': for nBin in range(nBins): # for obsBin in ['2e2muBin'+str(nBin),'4lBin'+str(nBin)]: - cmd = 'combineTool.py -M Impacts -d ../combine_files/SM_125_all_13TeV_xs_'+obsName+'_bin_v4.root -m 125.38 -t -1 --cminDefaultMinimizerStrategy 0 --setParameters MH=125.38,'+cmd_XSEC+' --redefineSignalPOIs '+cmd_sigma - cmd += ' -o impacts_v4_' + cmd = 'combineTool.py -M Impacts -d ../combine_files/SM_125_all_13TeV_xs_'+obsName+'_bin_v4.root -m 125.38 --cminDefaultMinimizerStrategy 0 --setParameters MH=125.38,'+cmd_XSEC+' --redefineSignalPOIs '+cmd_sigma + #cmd += ' -o impacts_v4_' if (not opt.UNBLIND): + cmd += ' -t -1 o impacts_v4_' cmd = cmd + 'asimov.json' elif (opt.UNBLIND): + cmd += ' -o impacts_v4_' cmd = cmd + 'data.json' print '---------------------------' print cmd, '\n' @@ -353,7 +359,7 @@ def impactPlots(): output = processCmd(cmd) # plot for obsBin in ['2e2muBin'+str(nBin),'4lBin'+str(nBin)]: - cmd = 'plotImpacts.py -i impacts_v4_' + cmd = 'plotImpacts.py --blind -i impacts_v4_' if (not opt.UNBLIND): cmd = cmd + 'asimov.json -o impacts_v4_'+obsName+'_r'+str(obsBin)+'_asimov --POI r'+str(obsBin) elif (opt.UNBLIND): cmd = cmd + 'data.json -o impacts_v4_'+obsName+'_r'+str(obsBin)+'_data --POI r'+str(obsBin) print '---------------------------' @@ -362,7 +368,7 @@ def impactPlots(): cmds.append(cmd) output = processCmd(cmd) - cmd = 'plotImpacts_skimmed.py -i impacts_v4_' + cmd = 'plotImpacts_skimmed.py --blind -i impacts_v4_' if (not opt.UNBLIND): cmd = cmd + 'asimov.json -o impacts_skimmed_v4_'+obsName+'_r'+str(obsBin)+'_asimov --POI r'+str(obsBin) elif (opt.UNBLIND): cmd = cmd + 'data.json -o impacts_skimmed_v4_'+obsName+'_r'+str(obsBin)+'_data --POI r'+str(obsBin) print '---------------------------' diff --git a/fit/latex_names.py b/fit/latex_names.py new file mode 100644 index 0000000..a1b755f --- /dev/null +++ b/fit/latex_names.py @@ -0,0 +1,32 @@ +latex_names = { + '4l': '$4\ell$', + '2e2mu': '$2e2\mu$', + 'mass4l': '$m_{4l}$', + 'mass4l_zzfloating': '$m_{4l}$', + 'njets_pt30_eta4p7': '$N_{jet}$', + 'pT4l': '$p_{T}^{H}$', + 'rapidity4l': '$|y_{H}|$', + 'costhetaZ1': '$cos(\\theta_{1})$', + 'costhetaZ2': '$cos(\\theta_{2})$', + 'phi': '$\\Phi$', + 'phistar': '$\\Phi^{\\star}$', + 'costhetastar': '$cos(\\theta^{*})$', + 'massZ1': '$m_{Z1}$', + 'massZ2': '$m_{Z2}$', + 'pTj1': '$p_{T}^{(j1, 4.7)}$', + 'pTHj': '$p_{T}^{Hj}$', + 'mHj': '$m_{Hj}$', + 'pTj2': '$p_{T}^{(j2, 4.7)}$', + 'mjj': '$m_{jj}$', + 'absdetajj': '$|\\Delta\\Eta_{jj}|$', + 'dphijj': '$|\\Delta\\Phi_{jj}|$', + 'pTHjj': '$p_{T}^{Hjj}$', + 'TCjmax': '$\\mathrm{T}_{\\mathrm{C},{j}}$', + 'TBjmax': '$\\mathrm{T}_{\\mathrm{B},{j}}$', + 'D0m': '$D_{0m}$', + 'Dcp': '$D_{cp}$', + 'D0hp': '$D_{0h^{+}}$', + 'Dint': '$D_{int}$', + 'DL1': '$D_{\\Lambda1}$', + 'DL1Zg': '$D_{\\Lambda1,Z\\gamma}$', +} diff --git a/fit/pvalues.py b/fit/pvalues.py new file mode 100644 index 0000000..85b5e74 --- /dev/null +++ b/fit/pvalues.py @@ -0,0 +1,386 @@ +import uproot +import binning +import latex_names as tex +import os +from itertools import product +from scipy.stats import chi2 + +th = __import__('higgs_xsbr', globals(), locals(), ['higgs_xs','higgs4l_br','unc_qcd','unc_pdf','unc_acc','unc_br']) + +HCOMB_NAMES = {'pT4l': 'PTH', 'rapidity4l': 'YH', 'pTj1': 'PTJET', 'njets_pt30_eta4p7': 'NJ'} +DECAY_OBS = ['D0m','Dcp','D0hp','Dint','DL1','DL1Zg','costhetaZ1','costhetaZ2','costhetastar','phi','phistar','massZ1','massZ2'] +CHANNELS = ['4l', '2e2mu'] + + + +FITS_PATH = '../combine_files' +PVAL_PATH = '../pvalues' + +def checkDir(folder_path): + isdir = os.path.isdir(folder_path) + if not isdir: + print('Directory {} does not exist. Creating it.' .format(folder_path)) + os.mkdir(folder_path) + +class pvalue(): + def __init__(self, obs, ws): + observable = Observable(obs) + self.obs_name = obs + self.ndof = observable.nr_bins-1 + + self.ws_name = ws + + self.nll = 0.0 + self.pval = 0.0 + + self.chi2pdf = chi2(self.ndof) + + self.get_nll() + self.set_pvalue() + + def get_nll(self): + fname = f'{PVAL_PATH}/higgsCombine{self.ws_name}.MultiDimFit.mH125.38.root'#DataSMCompat_{self.obs_name}.MultiDimFit.mH125.38.root' + if self.obs_name in HCOMB_NAMES: fname = fname.replace(self.obs_name, HCOMB_NAMES[self.obs_name]) + self.nll = uproot.open(fname)['limit'].arrays() + self.nll = self.nll[b'deltaNLL'][1] + + def set_pvalue(self): + _cdf = self.chi2pdf.cdf(2*self.nll) + self.pval = 1 - _cdf + +class Observable(): + def __init__(self, obs): + self.bins = [] + self.bins_centers = [] + self.dsigmas = [] + self.acceptance = {} + self.get_bins(obs) + + self.nr_bins = int(len(self.bins)) + + self.get_bins_centers() + self.set_acceptance(obs) + + def get_bins(self, obs): + self.bins = binning.binning_v2(obs) + + def nr_bins(self): + self.n_bins = len(self.bins) + + def get_bins_centers(self): + bins_centers = [] + dsigmas = [] + for i in range(self.nr_bins-1): + bin_center = (self.bins[i+1] + self.bins[i])*0.5 + dsigma = self.bins[i+1] - self.bins[i] + + if dsigma>100: + dsigma = 50 + bin_center = 250 + + bins_centers.append(bin_center) + dsigmas.append(dsigma) + + self.bins_centers = bins_centers + self.dsigmas = dsigmas + + def set_acceptance(self, obs): + acc = __import__(f'inputs_sig_extrap_{obs}_Full', globals(), locals(), ['acc']) + self.acceptance = acc.acc + +class XSEC(): + def __init__(self, obs, mh): + observable = Observable(obs) + self.obs_name = obs + self.acceptance = observable.acceptance + self.nr_bins = observable.nr_bins-1 + + self.mh = mh + + self.xsec_sm = {} + self.xsec_mh = {} + self.xsec_4l = {} + self.xsec_2e2mu = {} + + self.set_xsec() + self.set_xsec_fs() + self.xsec_fs = self.xsec_4l + self.xsec_fs.update(self.xsec_2e2mu) + + def set_xsec(self): + tmp_xs = {} + tmp_xs_sm = {} + h_mass = self.mh + obs = self.obs_name + for channel in ['4e','4mu','2e2mu']: + for obsBin in range(self.nr_bins): + fidxs_sm = 0 + fidxs_sm += th.higgs_xs['ggH_'+'125.0']*\ + th.higgs4l_br['125.0'+'_'+channel]*\ + self.acceptance['ggH125_'+channel+'_'+obs+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + fidxs_sm += th.higgs_xs['VBF_'+'125.0']*\ + th.higgs4l_br['125.0'+'_'+channel]*\ + self.acceptance['VBFH125_'+channel+'_'+obs+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + fidxs_sm += th.higgs_xs['WH_'+'125.0']*\ + th.higgs4l_br['125.0'+'_'+channel]*\ + self.acceptance['WH125_'+channel+'_'+obs+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + fidxs_sm += th.higgs_xs['ZH_'+'125.0']*\ + th.higgs4l_br['125.0'+'_'+channel]*\ + self.acceptance['ZH125_'+channel+'_'+obs+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + fidxs_sm += th.higgs_xs['ttH_'+'125.0']*\ + th.higgs4l_br['125.0'+'_'+channel]*\ + self.acceptance['ttH125_'+channel+'_'+obs+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + + fidxs = 0 + fidxs += th.higgs_xs['ggH_'+h_mass]*\ + th.higgs4l_br[h_mass+'_'+channel]*\ + self.acceptance['ggH125_'+channel+'_'+obs+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + fidxs += th.higgs_xs['VBF_'+h_mass]*\ + th.higgs4l_br[h_mass+'_'+channel]*\ + self.acceptance['VBFH125_'+channel+'_'+obs+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + fidxs += th.higgs_xs['WH_'+h_mass]*\ + th.higgs4l_br[h_mass+'_'+channel]*\ + self.acceptance['WH125_'+channel+'_'+obs+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + fidxs += th.higgs_xs['ZH_'+h_mass]*\ + th.higgs4l_br[h_mass+'_'+channel]*\ + self.acceptance['ZH125_'+channel+'_'+obs+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + fidxs += th.higgs_xs['ttH_'+h_mass]*\ + th.higgs4l_br[h_mass+'_'+channel]*\ + self.acceptance['ttH125_'+channel+'_'+obs+'_genbin'+str(obsBin)+'_recobin'+str(obsBin)] + + tmp_xs_sm[channel+'_genbin'+str(obsBin)] = fidxs_sm + tmp_xs[channel+'_genbin'+str(obsBin)] = fidxs + + self.xsec_sm = tmp_xs_sm + self.xsec_mh = tmp_xs + + def set_xsec_fs(self): + for obsBin in range(self.nr_bins): + self.xsec_4l['r4lBin'+str(obsBin)] = self.xsec_mh['4e_genbin'+str(obsBin)]+\ + self.xsec_mh['4mu_genbin'+str(obsBin)] + self.xsec_2e2mu['r2e2muBin'+str(obsBin)] = self.xsec_mh['2e2mu_genbin'+str(obsBin)] + +class combineCommand(): + def __init__(self, obs, SM: bool, version: str, channel: str): + observable = Observable(obs) + self.obs_name = obs + self.acceptance = observable.acceptance + self.bins = observable.bins + self.nr_bins = observable.nr_bins-1 + + xsec = XSEC(obs, '125.38') + self.tmp_xs = xsec.xsec_mh + self.tmp_xs_sm = xsec.xsec_sm + self.xsec_fs = xsec.xsec_fs + + self.version = version + self.channel = channel + + self.pois = [] + self.pois_to_float = [] + self.pois_to_freeze = [] + self.kappas = {} + self.ws = '' + self.output = '' + self.command = '' + self.algo = '' + + self.get_ws(obs, SM) + self.get_pois(obs) + self.get_kappas(obs) + self.set_algo(SM) + self.init_command() + self.define_pois() + if SM: self.set_ranges() + self.set_params(SM) + if self.version=='v3': self.set_kappas() + self.freezeParams() + self.replacement_map() + + def get_ws(self, obs, SM): + if SM: + self.ws = f'{FITS_PATH}/SM_125_all_13TeV_xs_{self.obs_name}_bin_{self.version}.root' + self.output = f'bestFit_{self.obs_name}_{self.version}_{self.channel}' + else: + self.ws = f'higgsCombinebestFit_{self.obs_name}_{self.version}_{self.channel}' + self.ws += '.MultiDimFit.mH125.38.root' + self.output = f'DataSMCompat_{self.obs_name}_{self.version}_{self.channel}' + + def set_algo(self, SM): + if SM: + self.algo = 'singles' + else: + self.algo = 'fixed' + + def get_pois(self, obs): + if self.version=='v3': + self.pois = [f'r_smH_{obs}_{j}' for j in range(self.nr_bins)] + elif (self.version=='v4') & (self.channel=='2e2mu'): + self.pois = [f'r2e2muBin{j}' for j in range(self.nr_bins)] + self.pois_to_float = self.pois.copy() + self.pois_to_freeze = [f'r4lBin{j}' for j in range(self.nr_bins)] + self.pois.extend(self.pois_to_freeze) + elif (self.version=='v4') & (self.channel=='4l'): + self.pois = [f'r4lBin{j}' for j in range(self.nr_bins)] + self.pois_to_float = self.pois.copy() + self.pois_to_freeze = [f'r2e2muBin{j}' for j in range(self.nr_bins)] + self.pois.extend(self.pois_to_freeze) + else: + raise Exception(f'PhysicsModel {self.version} is not supported! Only v3 and v4 are.') + + def get_kappas(self, obs): + kappas = [f'K{k}Bin{j}' for k,j in product([1,2],range(self.nr_bins))] + tmp_xs = self.tmp_xs + tmp_xs_sm = self.tmp_xs_sm + + for obsBin in range(self.nr_bins): + fidxs4e = tmp_xs['4e_genbin'+str(obsBin)] + fidxs4mu = tmp_xs['4mu_genbin'+str(obsBin)] + fidxs2e2mu = tmp_xs['2e2mu_genbin'+str(obsBin)] + frac4e = fidxs4e/(fidxs4e+fidxs4mu+fidxs2e2mu) + frac4mu = fidxs4mu/(fidxs4e+fidxs4mu+fidxs2e2mu) + fidxs4e_sm = tmp_xs_sm['4e_genbin'+str(obsBin)] + fidxs4mu_sm = tmp_xs_sm['4mu_genbin'+str(obsBin)] + fidxs2e2mu_sm = tmp_xs_sm['2e2mu_genbin'+str(obsBin)] + frac4e_sm = fidxs4e_sm/(fidxs4e_sm+fidxs4mu_sm+fidxs2e2mu_sm) + frac4mu_sm = fidxs4mu_sm/(fidxs4e_sm+fidxs4mu_sm+fidxs2e2mu_sm) + K1 = frac4e/frac4e_sm + K2 = frac4mu/frac4mu_sm * (1.0-frac4e_sm)/(1.0-frac4e) + + self.kappas[f'K1Bin{obsBin}'] = K1 + self.kappas[f'K2Bin{obsBin}'] = K2 + + def init_command(self): + self.command = f'combine -M MultiDimFit {self.ws} --algo={self.algo} -n {self.output} ' + self.command += '-m 125.38 --saveWorkspace' + + def define_pois(self): + self.command += ' ' + self.command += '--redefineSignalPOIs ' + _pois = self.pois if self.version=='v3' else self.pois_to_float + + for poi in _pois: + self.command += f'{poi},' + self.command = self.command[:-1] + + def set_ranges(self): + self.command += ' ' + self.command += '--setParameterRanges ' + for poi in self.pois: + self.command += f'{poi}=0,5:' + self.command = self.command[:-1] + + def set_params(self, SM): + self.command += ' ' + if SM: + self.command += '--setParameters ' + else: + self.command += '--snapshotName "MultiDimFit" --saveNLL --skipInitialFit ' + self.command += '--X-rtd MINIMIZER_freezeDisassociatedParams --fixedPointPOIs ' + for poi in self.pois: + if self.version=='v3': + self.command += f'{poi}=1,' + elif self.version=='v4': + self.command += f'{poi}={self.xsec_fs[poi]},' + self.command = self.command[:-1] + + def set_kappas(self): + self.command +=',' #reintroduce comma + for kappa in self.kappas: + self.command += f'{kappa}={self.kappas[kappa]},' + self.command = self.command[:-1] + + def freezeParams(self): + self.command += ' --floatOtherPOIs 0 --freezeParameters MH,' + if self.version == 'v4': + for poi in self.pois_to_freeze: + self.command += f'{poi},' + self.command = self.command[:-1] + + def replacement_map(self): + if self.obs_name in HCOMB_NAMES: + self.command = self.command.replace(self.obs_name, HCOMB_NAMES[self.obs_name]) + +class Table(): + def __init__(self, _file): + self.file = _file + + def write_header(self): + self.file.write('\\begin{table*}[hb] \n') + self.file.write('\\centering \n') + self.file.write('\\begin{tabular}{cccc} \n') + self.file.write('\\hline \n') + self.file.write('\\textbf{Observable} & \\textbf{Model} & ') + self.file.write('\\textbf{Final State} & \\textbf{p-value} \\\\ \n') + self.file.write('\\hline \n') + self.file.write('\\hline \n') + + + def write_line(self, _obs, _ver, _fs, _pval): + _pval = str(_pval) + line = _obs+' & '+_ver+' & '+_fs+' & '+_pval+'\\\\' + line = line.replace(_obs, tex.latex_names[_obs]) + line = line.replace(_fs, tex.latex_names[_fs]) + self.file.write(line) + self.file.write('\n') + + + def write_footer(self): + self.file.write('\\hline \n') + self.file.write('\\end{tabular} \n') + self.file.write('\\end{table*}') + +def fill(_file, _obs, _commands): + _file.write(_obs+'\n') + for _cmd in _commands: + _file.write(_cmd+'\n') + _file.write('\n\n\n') + + +if __name__ == '__main__': + + dump_file = open('pval_cmds.txt','w') + + for ver, ch, _obs in product(['v3', 'v4'], CHANNELS, binning.BINS): + if ((ver=='v3') & (ch=='2e2mu')): continue + if ((ver=='v4') & (_obs not in DECAY_OBS)): continue + if 'mass4l' in _obs: continue + if 'vs' in _obs: continue + if 'kL' in _obs: continue + bestFit = combineCommand(_obs, True, ver, ch) + compatibilitySM = combineCommand(_obs, False, ver, ch) + commands = [bestFit.command, compatibilitySM.command] + fill(dump_file, _obs, commands) + fname = f"higgsCombine{compatibilitySM.output}.MultiDimFit.mH125.38.root" + if _obs in HCOMB_NAMES: fname = fname.replace(_obs, HCOMB_NAMES[_obs]) + if (os.path.isfile(fname) | os.path.isfile(f"{PVAL_PATH}/{fname}")): + print(f"................. Skip {_obs}, fit already done") + continue + + os.system(bestFit.command) + os.system(compatibilitySM.command) + + dump_file.close() + + print("\n\n\n") + checkDir(f"{PVAL_PATH}") + os.system(f"mv higgsCombine* {PVAL_PATH}") + + latex_table = open('pval_table.txt', 'w') + table = Table(latex_table) + table.write_header() + + for ver, ch, _obs in product(['v3', 'v4'], CHANNELS, binning.BINS): + if ((ver=='v3') & (ch=='2e2mu')): continue + if ((ver=='v4') & (_obs not in DECAY_OBS)): continue + if 'mass4l' in _obs: continue + if 'vs' in _obs: continue + if 'kL' in _obs: continue + compatibilitySM = combineCommand(_obs, False, ver, ch) + combine_file = compatibilitySM.output + pval = round(pvalue(_obs,combine_file).pval,2) + print(f"{_obs} ({ver}) SM compatibility with p-val ({ch}) = {pval}") + table.write_line(_obs,ver,ch,pval) + table.write_footer() + + latex_table.close() diff --git a/helperstuff/binning.py b/helperstuff/binning.py index 2efea1e..b7d0bab 100644 --- a/helperstuff/binning.py +++ b/helperstuff/binning.py @@ -1,4 +1,4 @@ -list = { +BINS = { 'mass4l': '|105|160|', 'mass4l_zzfloating': '|105|160|', 'njets_pt30_eta4p7': '|0|1|2|3|4|14|', @@ -10,14 +10,16 @@ 'phi': '|-3.14159265359|-2.35619449019|-1.57079632679|-0.785398163397|0.0|0.785398163397|1.57079632679|2.35619449019|3.14159265359|', 'phistar': '|-3.14159265359|-2.35619449019|-1.57079632679|-0.785398163397|0.0|0.785398163397|1.57079632679|2.35619449019|3.14159265359|', 'costhetastar': '|-1.0|-0.75|-0.50|-0.25|0.0|0.25|0.50|0.75|1.0|', -'massZ1': '|40|65|73|80|85|90|120|', -'massZ2': '|12|22|25|28|30|32|35|40|50|65|', +# 'massZ1': '|40|65|73|80|85|90|120|', +'massZ1': '|40|65|75|85|92|120|', +# 'massZ2': '|12|22|25|28|30|32|35|40|50|65|', +'massZ2': '|12|20|25|28|32|40|50|65|', 'pTj1': '|-2|30|55|95|200|1300|', 'pTHj': '|-2|0|30|60|110|1300|', 'mHj': '|-2|110|180|220|300|400|600|3000|', 'pTj2': '|-2|30|40|65|90|1300|', 'mjj': '|-2|0|120|300|1300|', -'absdetajj': '|-100|0|0.7|1.6|3.0|10.0|', +'absdetajj': '|-100|0|1.6|3.0|10.0|', 'dphijj': '|-100|-3.14159265359|-1.5707963267948966|0|1.5707963267948966|3.14159265359|', 'pTHjj': '|-2|0|20|60|1300|', 'TCjmax': '|-2|15|20|30|50|80|1000|', @@ -37,12 +39,12 @@ } def binning(var): - obsBins_input = list[var] + obsBins_input = BINS[var] if not 'vs' in obsBins_input: #It is not a double-differential analysis obs_bins = {0:(obsBins_input.split("|")[1:(len(obsBins_input.split("|"))-1)]),1:['0','inf']}[obsBins_input=='inclusive'] obs_bins = [float(i) for i in obs_bins] #Convert a list of str to a list of float doubleDiff = False - print ('It is a single-differential measurement, binning', obs_bins) + #print ('It is a single-differential measurement, binning', obs_bins) else: #It is a double-differential analysis doubleDiff = True # The structure of obs_bins is: @@ -104,6 +106,10 @@ def binning(var): else: print ('Problem in the definition of the binning') quit() - print ('It is a double-differential measurement, binning for the 1st variable', obs_bins_1st, 'and for the 2nd variable', obs_bins_2nd) - print (obs_bins) + #print ('It is a double-differential measurement, binning for the 1st variable', obs_bins_1st, 'and for the 2nd variable', obs_bins_2nd) + #print (obs_bins) return obs_bins, doubleDiff + +def binning_v2(var): + obs_bins, doubleDiff = binning(var) + return obs_bins diff --git a/inputs/gConstant_HZZ2e2mu_L1.root b/inputs/gConstant_HZZ2e2mu_L1.root new file mode 100644 index 0000000000000000000000000000000000000000..fd2dbbbc6d3116e5967f8d5a5f663e9b631905aa GIT binary patch literal 23280 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 bV)MV%{>!R<5sCh5wJ(Aa@YJ0<8R>rj#CrRo literal 0 HcmV?d00001 diff --git a/inputs/gConstant_HZZ2e2mu_L1Zgs.root b/inputs/gConstant_HZZ2e2mu_L1Zgs.root new file mode 100644 index 0000000000000000000000000000000000000000..6f5ec82b8edaa2b5ec0ab124d7076805d3407fe2 GIT binary patch literal 23388 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 z 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 literal 0 HcmV?d00001 diff --git a/inputs/gConstant_HZZ2e2mu_g4.root b/inputs/gConstant_HZZ2e2mu_g4.root new file mode 100755 index 0000000000000000000000000000000000000000..583f57f2559d056c6783e92e5beb077787a6a5ed GIT binary patch literal 23449 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 literal 0 HcmV?d00001 diff --git a/inputs/higgs_xsbr.py b/inputs/higgs_xsbr.py new file mode 100644 index 0000000..46b769a --- /dev/null +++ b/inputs/higgs_xsbr.py @@ -0,0 +1,55 @@ +higgs4l_br = { +'124.8_2e2mu' : .0000582, +'124.9_emutau' : .000274, +'124.9_4e' : .0000324, +'124.9_4mu' : .0000324, +'124.9_2e2mu' : .0000588, +'125.0_4e' : .00003254, +'125.0_4mu' : .00003254, +'125.0_2e2mu' : .00005897, +'125.0_emutau' : .0002745, +'125.09_4e' : .00003280, +'125.09_4mu' : .00003280, +'125.09_2e2mu' : .00005947, +'125.09_emutau' : .0002768, +'125.1_4e' : .0000330, +'125.1_4mu' : .0000330, +'125.1_2e2mu' : .0000599, +'125.2_4e' : .0000333, +'125.2_4mu' : .0000333, +'125.2_2e2mu' : .0000604, +'125.38_4e' : .00003364, +'125.38_4mu' : .00003364, +'125.38_2e2mu' : .000061048 +} +higgs_xs = { +'ggH_125.0' : 48580, +'VBF_125.0' : 3782, +'WH_125.0' : 1373.0, +'ZH_125.0' : 883.9, +'ttH_125.0' : 507.1, +'ggH_125.09' : 48520, +'VBF_125.09' : 3779, +'WH_125.09' : 1369.0, +'ZH_125.09' : 882.4, +'ttH_125.09' : 506.5, +'ggH_125.38' : 48314, +'VBF_125.38' : 3771, +'WH_125.38' : 1359.0, +'ZH_125.38' : 876.7, +'ttH_125.38' : 503.3 +} +unc_qcd = { + 'VBF_125.38' : 0.002, + 'WH_125.38' : 0.01, + 'ZH_125.38' : 0.031, + 'ttH_125.38': 0.0655 +} +unc_pdf = { + 'VBF_125.38' : 0.021, + 'WH_125.38' : 0.023, + 'ZH_125.38' : 0.025, + 'ttH_125.38': 0.081 +} +unc_acc = 0.02 +unc_br = 0.02 diff --git a/inputs/observables.py b/inputs/observables.py new file mode 100644 index 0000000..a0b8447 --- /dev/null +++ b/inputs/observables.py @@ -0,0 +1,122 @@ +observables = { +'mass4l': + {'obs_reco': 'ZZMass', + 'obs_gen': 'GENmass4l'}, +'mass4l_zzfloating': + {'obs_reco': 'ZZMass', + 'obs_gen': 'GENmass4l'}, +'njets_pt30_eta4p7': + {'obs_reco': 'njets_pt30_eta4p7', + 'obs_gen': 'GENnjets_pt30_eta4p7'}, +'pT4l': + {'obs_reco': 'ZZPt', + 'obs_gen': 'GENpT4l'}, +'pT4l_kL': + {'obs_reco': 'ZZPt', + 'obs_gen': 'GENpT4l'}, +'rapidity4l': + {'obs_reco': 'ZZy', + 'obs_gen': 'GENrapidity4lAbs'}, +'costhetaZ1': + {'obs_reco': 'helcosthetaZ1', + 'obs_gen': 'GENcosTheta1'}, +'costhetaZ2': + {'obs_reco': 'helcosthetaZ2', + 'obs_gen': 'GENcosTheta2'}, +'phi': + {'obs_reco': 'helphi', + 'obs_gen': 'GENPhi'}, +'phistar': + {'obs_reco': 'phistarZ1', + 'obs_gen': 'GENPhi1'}, +'costhetastar': + {'obs_reco': 'costhetastar', + 'obs_gen': 'GENcosThetaStar'}, +'massZ1': + {'obs_reco': 'Z1Mass', + 'obs_gen': 'GENmassZ1'}, +'massZ2': + {'obs_reco': 'Z2Mass', + 'obs_gen': 'GENmassZ2'}, +'pTj1': + {'obs_reco': 'pTj1', + 'obs_gen': 'GENpTj1'}, +'pTHj': + {'obs_reco': 'pTHj', + 'obs_gen': 'GENpTHj'}, +'mHj': + {'obs_reco': 'mHj', + 'obs_gen': 'GENmHj'}, +'pTj2': + {'obs_reco': 'pTj2', + 'obs_gen': 'GENpTj2'}, +'mjj': + {'obs_reco': 'mjj', + 'obs_gen': 'GENmjj'}, +'absdetajj': + {'obs_reco': 'absdetajj', + 'obs_gen': 'GENabsdetajj'}, +'dphijj': + {'obs_reco': 'dphijj', + 'obs_gen': 'GENdphijj'}, +'pTHjj': + {'obs_reco': 'pTHjj', + 'obs_gen': 'GENpTHjj'}, +'TCjmax': { + 'obs_reco': 'TCjmax', + 'obs_gen': 'GENTCjmax'}, +'TBjmax': { + 'obs_reco': 'TBjmax', + 'obs_gen': 'GENTBjmax'}, +'D0m': + {'obs_reco': 'D0m', + 'obs_gen': 'GEN_D0m'}, +'Dcp': + {'obs_reco': 'Dcp', + 'obs_gen': 'GEN_Dcp'}, +'D0hp': + {'obs_reco': 'D0hp', + 'obs_gen': 'GEN_D0hp'}, +'Dcp': + {'obs_reco': 'Dcp', + 'obs_gen': 'GEN_Dcp'}, +'Dint': + {'obs_reco': 'Dint', + 'obs_gen': 'GEN_Dint'}, +'DL1': + {'obs_reco': 'DL1', + 'obs_gen': 'GEN_DL1'}, +'DL1Zg': + {'obs_reco': 'DL1Zg', + 'obs_gen': 'GEN_DL1Zg'}, +'rapidity4l vs pT4l': + {'obs_reco': 'ZZy', + 'obs_reco_2nd': 'ZZPt', + 'obs_gen': 'GENrapidity4lAbs', + 'obs_gen_2nd': 'GENpT4l'}, +'njets_pt30_eta4p7 vs pT4l': + {'obs_reco': 'njets_pt30_eta4p7', + 'obs_reco_2nd': 'ZZPt', + 'obs_gen': 'GENnjets_pt30_eta4p7', + 'obs_gen_2nd': 'GENpT4l'}, +'pTj1 vs pTj2': + {'obs_reco': 'pTj1', + 'obs_reco_2nd': 'pTj2', + 'obs_gen': 'GENpTj1', + 'obs_gen_2nd': 'GENpTj2'}, +'pT4l vs pTHj': + {'obs_reco': 'ZZPt', + 'obs_reco_2nd': 'pTHj', + 'obs_gen': 'GENpT4l', + 'obs_gen_2nd': 'GENpTHj'}, +'massZ1 vs massZ2': + {'obs_reco': 'Z1Mass', + 'obs_reco_2nd': 'Z2Mass', + 'obs_gen': 'GENmassZ1', + 'obs_gen_2nd': 'GENmassZ2'}, +'TCjmax vs pT4l': + {'obs_reco_2nd': 'ZZPt', + 'obs_gen_2nd': 'GENpT4l', + 'obs_reco': 'TCjmax', + 'obs_gen': 'GENTCjmax'}, +} diff --git a/plotShapes.py b/plotShapes.py index 6ad57c5..1fa52c1 100644 --- a/plotShapes.py +++ b/plotShapes.py @@ -29,6 +29,7 @@ def parseOptions(): parser.add_option('', '--year', dest='YEAR', type='string',default='Full', help='Year -> 2016 or 2017 or 2018 or Full') parser.add_option('', '--m4lLower', dest='LOWER_BOUND', type='int',default=105.0, help='Lower bound for m4l') parser.add_option('', '--m4lUpper', dest='UPPER_BOUND', type='int',default=140.0, help='Upper bound for m4l') + parser.add_option('', '--uncBand', dest='UNC_BANDS', action='store_true',default=False, help='Draw uncertainty bands') parser.add_option("-l",action="callback",callback=callback_rootargs) parser.add_option("-q",action="callback",callback=callback_rootargs) parser.add_option("-b",action="callback",callback=callback_rootargs) @@ -352,7 +353,7 @@ def plotAsimov_sim(modelName, physicalModel, obsName, fstate, observableBins, re ##### ------------------------ Data ------------------------ ##### CMS_channel = w.cat("CMS_channel") - mass = w.var("CMS_zz4l_mass").frame(RooFit.Bins(30)) + mass = w.var("CMS_zz4l_mass").frame(RooFit.Bins(35)) if (fstate=="4l"): datacut = '' @@ -366,7 +367,15 @@ def plotAsimov_sim(modelName, physicalModel, obsName, fstate, observableBins, re datacut = datacut.rstrip(" || ") data = data.reduce(RooFit.Cut(datacut)) data.plotOn(mass) - sim.plotOn(mass,RooFit.LineColor(kOrange-3), RooFit.ProjWData(data,True)) + sim.plotOn(mass,RooFit.LineColor(kOrange-3), RooFit.LineWidth(2), RooFit.ProjWData(data,True)) + if opt.UNC_BANDS: + r = sim.fitTo(data, RooFit.Save(True)) + sim.plotOn(mass,RooFit.LineColor(kOrange-3), RooFit.ProjWData(data,True)) + sim.plotOn(mass,RooFit.LineColor(kOrange-3), RooFit.FillColor(ROOT.TColor.GetColorTransparent(kGreen-3,0.5)), RooFit.ProjWData(data,True), RooFit.VisualizeError(r, 2)) + sim.plotOn(mass,RooFit.LineColor(kOrange-3), RooFit.FillColor(ROOT.TColor.GetColorTransparent(kAzure-2,0.5)), RooFit.ProjWData(data,True), RooFit.VisualizeError(r, 1)) + sim.plotOn(mass,RooFit.LineColor(kViolet), RooFit.FillColor(kYellow), RooFit.Components(comp_zx+","+comp_zz), RooFit.ProjWData(data,True), RooFit.VisualizeError(r, 2)) + sim.plotOn(mass,RooFit.LineColor(kOrange-3), RooFit.ProjWData(data,True), RooFit.VisualizeError(r, 1, False), RooFit.DrawOption("L")) + sim.plotOn(mass,RooFit.LineColor(kOrange-3), RooFit.LineWidth(2), RooFit.ProjWData(data,True)) else: datacut = '' for year in ["1", "2", "3"]: @@ -378,7 +387,12 @@ def plotAsimov_sim(modelName, physicalModel, obsName, fstate, observableBins, re datacut = datacut.rstrip(" || ") data = data.reduce(RooFit.Cut(datacut)) data.plotOn(mass) - sim.plotOn(mass,RooFit.LineColor(kOrange-3), RooFit.ProjWData(data,True)) + sim.plotOn(mass,RooFit.LineColor(kOrange-3), RooFit.LineWidth(2), RooFit.ProjWData(data,True))#, RooFit.VisualizeError(r, 1)) + if opt.UNC_BANDS: + r = sim.fitTo(data, RooFit.Save(True)) + sim.plotOn(mass,RooFit.LineColor(kOrange-3), RooFit.FillColor(ROOT.TColor.GetColorTransparent(kGreen-3,0.5)), RooFit.ProjWData(data,True), RooFit.VisualizeError(r, 2)) + sim.plotOn(mass,RooFit.LineColor(kOrange-3), RooFit.FillColor(ROOT.TColor.GetColorTransparent(kAzure-2,0.5)), RooFit.ProjWData(data,True), RooFit.VisualizeError(r, 1)) + sim.plotOn(mass,RooFit.LineColor(kOrange-3), RooFit.LineWidth(2), RooFit.ProjWData(data,True))#, RooFit.VisualizeError(r, 1)) ##### ------------------------ Shapes ------------------------ ##### if (fstate!="4l"): @@ -438,6 +452,14 @@ def plotAsimov_sim(modelName, physicalModel, obsName, fstate, observableBins, re sim.plotOn(mass, RooFit.LineColor(kAzure-3), RooFit.Components(comp_zx+","+comp_zz+","+comp_fake), RooFit.ProjWData(data,True)) sim.plotOn(mass, RooFit.LineColor(kViolet), RooFit.Components(comp_zx+","+comp_zz), RooFit.ProjWData(data,True)) sim.plotOn(mass, RooFit.LineColor(kViolet+2), RooFit.Components(comp_zx), RooFit.ProjWData(data,True)) + + if opt.UNC_BANDS: + sim.plotOn(mass, RooFit.LineColor(kGreen+2), RooFit.FillColor(ROOT.TColor.GetColorTransparent(kGreen+2,0.3)), RooFit.Components(comp_zx+","+comp_zz+","+comp_fake+","+comp_otherfid+","+comp_out), RooFit.ProjWData(data,True), RooFit.VisualizeError(r, 2)) + sim.plotOn(mass, RooFit.LineColor(kOrange-3), RooFit.FillColor(ROOT.TColor.GetColorTransparent(kOrange-3,0.3)), RooFit.LineStyle(2), RooFit.Components(comp_zx+","+comp_zz+","+comp_fake+","+comp_otherfid), RooFit.ProjWData(data,True), RooFit.VisualizeError(r, 2)) + sim.plotOn(mass, RooFit.LineColor(kAzure-3), RooFit.FillColor(ROOT.TColor.GetColorTransparent(kAzure-3,0.3)), RooFit.Components(comp_zx+","+comp_zz+","+comp_fake), RooFit.ProjWData(data,True), RooFit.VisualizeError(r, 2)) + sim.plotOn(mass, RooFit.LineColor(kViolet), RooFit.FillColor(ROOT.TColor.GetColorTransparent(kViolet-2,0.3)), RooFit.Components(comp_zx+","+comp_zz), RooFit.ProjWData(data,True), RooFit.VisualizeError(r, 2)) + sim.plotOn(mass, RooFit.LineColor(kViolet+2), RooFit.FillColor(ROOT.TColor.GetColorTransparent(kViolet+2,0.3)), RooFit.Components(comp_zx), RooFit.ProjWData(data,True), RooFit.VisualizeError(r, 2)) + data.plotOn(mass) @@ -458,19 +480,11 @@ def plotAsimov_sim(modelName, physicalModel, obsName, fstate, observableBins, re dummy.GetYaxis().SetTitle("Events / (1.83 GeV)") dummy.GetXaxis().SetTitle("m_{"+fstate.replace("mu","#mu")+"} [GeV]") if (opt.UNBLIND): - # dummy.SetMaximum(max(1.5*max(n_trueH_asimov[fstate],n_trueH_modelfit[fstate]),1.0)) - if fstate=='4e': dummy.SetMaximum(max(1*max(n_trueH_asimov[fstate],n_trueH_modelfit[fstate]),1.0)) - elif fstate=='4l': dummy.SetMaximum(max(0.2*max(n_trueH_asimov[fstate],n_trueH_modelfit[fstate]),1.0)) - else: dummy.SetMaximum(max(0.5*max(n_trueH_asimov[fstate],n_trueH_modelfit[fstate]),1.0)) - if (obsName=="massZ2" and recobin==0): dummy.SetMaximum(max(3.0*max(n_trueH_asimov[fstate],n_trueH_modelfit[fstate]),3.5)) + dummy.SetMaximum(max(1*max(n_trueH_asimov[fstate],n_trueH_modelfit[fstate]),1.0)) else: - # if fstate=='4e': dummy.SetMaximum(max(1*max(n_trueH_asimov[fstate],n_trueH_modelfit[fstate]),1.0)) - # elif fstate=='4l': dummy.SetMaximum(max(0.2*max(n_trueH_asimov[fstate],n_trueH_modelfit[fstate]),1.0)) - # else: dummy.SetMaximum(max(0.5*max(n_trueH_asimov[fstate],n_trueH_modelfit[fstate]),1.0)) - # if (obsName=="massZ2" and recobin==0): dummy.SetMaximum(max(3.0*max(n_trueH_asimov[fstate],n_trueH_modelfit[fstate]),3.5)) dummy.SetMaximum(max(1*max(n_trueH_asimov[fstate],n_trueH_modelfit[fstate]),1.0)) if (obsName=="massZ2" and recobin==0): dummy.SetMaximum(max(3.0*max(n_trueH_asimov[fstate],n_trueH_modelfit[fstate]),3.5)) - #dummy.SetMaximum(0.5*max(n_trueH_asimov[fstate],n_zz_asimov[fstate],2.5)) + dummy.SetMinimum(0.0) dummy.Draw() @@ -660,9 +674,11 @@ def plotAsimov_sim(modelName, physicalModel, obsName, fstate, observableBins, re else: PhysicalModels = ['v3'] - +nBins = len(observableBins) +if not doubleDiff: nBins = nBins-1 +print nBins fStates = ["4e","4mu","2e2mu","4l"] for fState in fStates: - for recobin in range(len(observableBins)-1): + for recobin in range(nBins): for physicalModel in PhysicalModels: plotAsimov_sim(opt.UNFOLD, physicalModel, obsName, fState, observableBins, recobin) diff --git a/prepareCards.py b/prepareCards.py deleted file mode 100644 index 15cc39e..0000000 --- a/prepareCards.py +++ /dev/null @@ -1,43 +0,0 @@ -import os - -bins = [0.0,0.15,0.3,0.45,0.6,0.75,0.9,1.2,1.6,2.5] -obsName = 'rapidity4l' -fitName = 'YH' - -card_name = 'card_run2_%s.txt' %fitName - -cmd_combCards = 'combineCards.py ' - -for year in [2016, 2017, 2018]: - for cat in ['4e', '4mu', '2e2mu']: - for i in range(len(bins)-1): - low = str(bins[i]).replace('.','p') - high = str(bins[i+1]).replace('.','p') - boundaries = low+'_'+high - dc_name = 'datacard_%d/hzz4l_%sS_13TeV_xs_%s_bin%d_v3.txt ' %(year,cat,obsName,i) - cmd_combCards += 'hzz_%s_%s_cat%s_%d=%s' %(fitName,boundaries,cat,year,dc_name) - -cmd_combCards += '> %s' %card_name -# print(cmd_combCards) - -cmd_t2w = 'text2workspace.py %s -P HiggsAnalysis.CombinedLimit.PhysicsModel:multiSignalModel --PO verbose ' %card_name -cmd_t2w += "--PO 'higgsMassRange=123,127' " - -for i in range(len(bins)-1): - low = str(bins[i]).replace('.','p') - high = str(bins[i+1]).replace('.','p') - boundaries = low+'_'+high - process = 'smH_%s_%s' %(fitName, boundaries) - POI = 'r_smH_%s_%d' %(fitName, i) - cmd_t2w += "--PO 'map=.*/%s:%s[1.0,0.0,3.0]' " %(process, POI) - -# print(cmd_t2w) - -cmd_fit = 'combine -n _%s_Fit -M MultiDimFit %s ' %(fitName, card_name.replace('txt', 'root')) -cmd_fit += '-m 125.38 --freezeParameters MH --saveWorkspace --algo=singles --cminDefaultMinimizerStrategy 0 -t -1 --setParameters ' - -for i in range(len(bins)-1): - POI = 'r_smH_%s_%d' %(fitName, i) - cmd_fit += '%s=1,' %POI - -print(cmd_fit[:-1]) \ No newline at end of file diff --git a/templates/RunTemplates.py b/templates/RunTemplates.py index b5a2ed2..709d79f 100644 --- a/templates/RunTemplates.py +++ b/templates/RunTemplates.py @@ -3,7 +3,7 @@ import os, sys import numpy as np import pandas as pd -import uproot3 as uproot +import uproot#3 as uproot from math import sqrt, log import itertools import optparse @@ -126,7 +126,7 @@ def add_leadjet(pt,eta): # Rapidity def rapidity(p, eta): - return np.log((np.sqrt(125*125 + p*p*np.cosh(eta)*np.cosh(eta))+p*np.sinh(eta))/np.sqrt(125*125+p*p)) + return np.abs(np.log((np.sqrt(125*125 + p*p*np.cosh(eta)*np.cosh(eta))+p*np.sinh(eta))/np.sqrt(125*125+p*p))) def add_rapidity(df): df['ZZy'] = rapidity(df['ZZPt'], df['ZZEta']) return df