Skip to content

Commit 594ca8d

Browse files
Merge pull request cms-analysis#13 from emanueledimarco/vbfac-dev
Several updates for VBF AC analysis
2 parents 155b40d + 546af25 commit 594ca8d

31 files changed

+287
-94
lines changed

Background/config_test.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
'inputWSDir':'cards/cards_current/data_Run2', # location of 'allData.root' file
77
'cats':'auto', # auto: automatically inferred from input ws
88
'catOffset':0, # add offset to category numbers (useful for categories from different allData.root files)
9-
'ext':'2022-08-01', # extension to add to output directory
9+
'ext':'2022-11-21', # extension to add to output directory
1010
'year':'combined', # Use combined when merging all years in category (for plots)
1111
'xvar': 'CMS_hgg_mass', # not yet used, should be passed to the C++ macros
1212
'plotdir': 'plots',

Combine/PlotScans.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ def run(cmd):
5151
mainlabel = "Expected"
5252

5353
# add this to distinguish different fits with same POI
54-
_name += opt.ext
54+
_name += "_"+opt.ext
5555

5656
if( _fit.split(":")[0] == "bestfit" ):
5757
for poi in _fitpois:
@@ -67,14 +67,17 @@ def run(cmd):
6767

6868
elif( _fit.split(":")[0] == "profile1D")|( _fit.split(":")[0] == "scan1D" ):
6969
for poi in _fitpois:
70-
mvcmd = "mv higgsCombine_%s_%s.MultiDimFit.mH125.root %s/higgsCombine_%s_%s.root"%(_name,poi,pdir,_name,poi)
71-
run(mvcmd)
72-
if poi=='r':
70+
resfile = "higgsCombine_%s_%s.MultiDimFit.mH125.root"%(_name,poi)
71+
if os.path.isfile(resfile):
72+
print " --> Storing ",_fit.split(":")[0],": %s/higgsCombine_%s_%s.root"%(pdir,_name,poi)
73+
run("mv %s %s/higgsCombine_%s_%s.root"%(resfile,pdir,_name,poi))
74+
if poi in ["r_ggH","r_VBF","r_top","r_VH"]:
7375
translate_json = "pois_mu.json"
74-
elif poi=='x':
75-
if 'ALT0PM' in opt.ext: translate_json = "pois_fa3.json"
76+
elif poi=='CMS_zz4l_fai1':
77+
if 'ALT0M' in opt.ext: translate_json = "pois_fa3.json"
7678
if 'ALT0PH' in opt.ext: translate_json = "pois_fa2.json"
77-
if 'ALTL1' in opt.ext: translate_json = "pois_flambda1.json"
79+
if 'ALT0L1' in opt.ext: translate_json = "pois_flambda1.json"
80+
if 'ALT0L1Zg' in opt.ext: translate_json = "pois_flambda1zgamma.json"
7881
else:
7982
print "Warning: unknown poi. Use r as default"
8083
translate_json = "pois_mu.json"

Combine/RunFits.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ def getPdfIndicesFromJson(pdfjson):
4747
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4848
# Options:
4949
# Expected/Observed
50-
exp_opts = '' if opt.doObserved else '--expectSignal 1 -t -1'
50+
exp_opts = '' if opt.doObserved else '-t -1'
5151

5252
# Common opts for combine jobs
5353
common_opts = opt.commonOpts
@@ -100,7 +100,7 @@ def getPdfIndicesFromJson(pdfjson):
100100

101101
# If ALL in fit_opts: replace by list of constrained nuisances in workspace
102102
if "ALL" in _fit_opts:
103-
fd = ROOT.TFile("Datacard%s_%s.root"%(opt.ext,opt.mode))
103+
fd = ROOT.TFile("Datacard_%s.root"%(opt.ext))
104104
ws = fd.Get("w")
105105
nuisances = ws.obj("ModelConfig").GetNuisanceParameters().contentsString()
106106
_fit_opts = re.sub("ALL",nuisances,_fit_opts)
@@ -118,13 +118,13 @@ def getPdfIndicesFromJson(pdfjson):
118118
else: pdf_opts = getPdfIndicesFromJson("pdfindex%s.json"%opt.ext) if opt.setPdfIndices else ''
119119

120120
# add this to distinguish different fits with same POI
121-
_name += opt.ext
121+
_name += "_"+opt.ext
122122

123123
# File to load workspace
124124
if opt.snapshotWSFile != '': d_opts = '-d %s --snapshotName MultiDimFit'%opt.snapshotWSFile
125125
else:
126126
#d_opts = '-d ../Datacard%s_%s.root'%(opt.ext,opt.mode)
127-
d_opts = '-d %s/src/flashggFinalFit/Combine/Datacard%s_%s.root'%(os.environ['CMSSW_BASE'],opt.ext,opt.mode)
127+
d_opts = '-d %s/src/flashggFinalFit/Combine/Datacard_%s.root'%(os.environ['CMSSW_BASE'],opt.ext)
128128

129129
# If setParameters already in _fit_opts then add to fit opts and set pdfOpts = ''
130130
if( "setParameters" in _fit_opts )&( pdf_opts != '' ):

Combine/RunText2Workspace.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,35 +29,35 @@ def run(cmd):
2929
leave()
3030

3131
print " --> Running text2workspace for model: %s"%opt.mode
32-
print " --> Input: Datacard%s.txt --> Output: Datacard%s_%s.root"%(opt.ext,opt.ext,opt.mode)
32+
print " --> Input: Datacard_%s.txt --> Output: Datacard_%s.root"%(opt.ext,opt.ext)
3333

3434
if not os.path.isdir("./t2w_jobs"): os.system("mkdir ./t2w_jobs")
3535
# Open submission file to write to
36-
fsub = open("./t2w_jobs/t2w_%s%s.sh"%(opt.mode,opt.ext),"w")
36+
fsub = open("./t2w_jobs/t2w_%s.sh"%(opt.ext),"w")
3737
fsub.write("#!/bin/bash\n\n")
3838
fsub.write("cd %s\n\n"%os.environ['PWD'])
3939
fsub.write("eval `scramv1 runtime -sh`\n\n")
40-
fsub.write("text2workspace.py Datacard%s.txt -o Datacard%s_%s.root %s %s"%(opt.ext,opt.ext,opt.mode,opt.common_opts,models[opt.mode]))
40+
fsub.write("text2workspace.py Datacard_%s.txt -o Datacard_%s.root %s %s"%(opt.ext,opt.ext,opt.common_opts,models[opt.mode]))
4141
fsub.close()
4242

4343
# Change permission for file
44-
os.system("chmod 775 ./t2w_jobs/t2w_%s%s.sh"%(opt.mode,opt.ext))
44+
os.system("chmod 775 ./t2w_jobs/t2w_%s.sh"%(opt.ext))
4545

4646
# If using condor then also write submission file
4747
if opt.batch == 'condor':
48-
f_cdr = open("./t2w_jobs/t2w_%s%s.sub"%(opt.mode,opt.ext),"w")
49-
f_cdr.write("executable = %s/src/flashggFinalFit/Combine/t2w_jobs/t2w_%s%s.sh\n"%(os.environ['CMSSW_BASE'],opt.mode,opt.ext))
50-
f_cdr.write("output = %s/src/flashggFinalFit/Combine/t2w_jobs/t2w_%s%s.sh.out\n"%(os.environ['CMSSW_BASE'],opt.mode,opt.ext))
51-
f_cdr.write("error = %s/src/flashggFinalFit/Combine/t2w_jobs/t2w_%s%s.sh.err\n"%(os.environ['CMSSW_BASE'],opt.mode,opt.ext))
52-
f_cdr.write("log = %s/src/flashggFinalFit/Combine/t2w_jobs/t2w_%s%s.sh.log\n"%(os.environ['CMSSW_BASE'],opt.mode,opt.ext))
48+
f_cdr = open("./t2w_jobs/t2w_%s.sub"%(opt.ext),"w")
49+
f_cdr.write("executable = %s/src/flashggFinalFit/Combine/t2w_jobs/t2w_%s.sh\n"%(os.environ['CMSSW_BASE'],opt.ext))
50+
f_cdr.write("output = %s/src/flashggFinalFit/Combine/t2w_jobs/t2w_%s.sh.out\n"%(os.environ['CMSSW_BASE'],opt.ext))
51+
f_cdr.write("error = %s/src/flashggFinalFit/Combine/t2w_jobs/t2w_%s.sh.err\n"%(os.environ['CMSSW_BASE'],opt.ext))
52+
f_cdr.write("log = %s/src/flashggFinalFit/Combine/t2w_jobs/t2w_%s.sh.log\n"%(os.environ['CMSSW_BASE'],opt.ext))
5353
f_cdr.write("+JobFlavour = \"%s\"\n"%opt.queue)
5454
f_cdr.write("RequestCpus = %g\n"%opt.ncpus)
5555
f_cdr.write("queue\n")
5656
f_cdr.close()
5757

5858
# Submit
59-
if opt.batch == "condor": subcmd = "condor_submit ./t2w_jobs/t2w_%s%s.sub"%(opt.mode,opt.ext)
60-
elif opt.batch == 'local': subcmd = "bash ./t2w_jobs/t2w_%s%s.sh"%(opt.mode,opt.ext)
61-
else: subcmd = "qsub -q hep.q -l h_rt=6:0:0 -l h_vmem=24G ./t2w_jobs/t2w_%s%s.sh"%(opt.mode,opt.ext)
59+
if opt.batch == "condor": subcmd = "condor_submit ./t2w_jobs/t2w_%s.sub"%(opt.ext)
60+
elif opt.batch == 'local': subcmd = "bash ./t2w_jobs/t2w_%s.sh"%(opt.ext)
61+
else: subcmd = "qsub -q hep.q -l h_rt=6:0:0 -l h_vmem=24G ./t2w_jobs/t2w_%s.sh"%(opt.ext)
6262
if opt.dryRun: print "[DRY RUN] %s"%subcmd
6363
else: run(subcmd)

Combine/inputs.json

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,38 @@
11
{
2-
"mu_simple":{
3-
"pois":"r_ggH,r_VBF,r_top,r_VH",
4-
"fits":"profile1D:syst:all+scan1D:syst:all+bestfit:syst:all",
5-
"points":"20:1+20:1+:",
6-
"fit_opts":"--setParameters r_ggH=1,r_top=1,r_VH=1 --setParameterRanges r_VBF=0,3:r_ggH=0,3:r_top=-5,5:r_VH=-5,5 --saveSpecifiedNuis all --saveInactivePOI 1 --freezeParameters MH --autoBoundsPOIs 'r_VBF' --autoMaxPOIs 'r_VBF' --fastScan+--setParameters r_ggH=1,r_top=1,r_VH=1 --setParameterRanges r_VBF=0,3:r_ggH=0,3:r_top=-5,5:r_VH=-5,5 --saveSpecifiedNuis all --saveInactivePOI 1 --freezeParameters MH --autoBoundsPOIs 'r_VBF' --autoMaxPOIs 'r_VBF' --fastScan+--setParameters r_ggH=1,r_top=1,r_VH=1 --setParameterRanges r_VBF=0,3:r_ggH=0,3:r_top=-5,5:r_VH=-5,5 --saveSpecifiedNuis all --saveInactivePOI 1 --freezeParameters MH --saveWorkspace"
2+
"xsec":{
3+
"pois":"r_VBF",
4+
"fits":"profile1D:syst:all+bestfit:syst:all",
5+
"points":"20:1+:",
6+
"fit_opts":"--setParameters r_ggH=1,r_top=1,r_VH=1 --setParameterRanges r_VBF=0,3:r_ggH=0.99,1.01:r_top=0.99,1.01:r_VH=0.99,1.01 --saveSpecifiedNuis all --saveInactivePOI 1 --freezeParameters MH,r_ggH,r_top,r_VH --autoBoundsPOIs 'r_VBF' --autoMaxPOIs 'r_VBF' --fastScan+--setParameters r_ggH=1,r_top=1,r_VH=1 --setParameterRanges r_VBF=0,3:r_ggH=0.99,1.01:r_top=0.99,1.01:r_VH=0.99,1.01 --saveSpecifiedNuis all --saveInactivePOI 1 --freezeParameters MH,r_ggH,r_top,r_VH --saveWorkspace"
77
},
88
"cp":{
99
"pois":"x",
1010
"fits":"profile1D:syst:all",
1111
"points":"20:1",
1212
"fit_opts":"--saveSpecifiedNuis all --saveInactivePOI 1 --cminApproxPreFitTolerance=10 --freezeParameters MH --fastScan --setParameters r=1 --setParameterRanges x=0,0.5"
13+
},
14+
"ALT0M":{
15+
"pois":"CMS_zz4l_fai1",
16+
"fits":"profile1D:syst:all",
17+
"points":"200:1",
18+
"fit_opts":"--saveSpecifiedNuis all --saveInactivePOI 1 --cminApproxPreFitTolerance=10 --setParameterRanges CMS_zz4l_fai1=-0.003,0.003 --freezeParameters MH,fa3_ggH,muf --fastScan --setParameters muV=1,muf=1,fa3_ggH=1 --autoMaxPOIs 'CMS_zz4l_fai1' --autoBoundsPOIs 'CMS_zz4l_fai1' "
19+
},
20+
"ALT0PH":{
21+
"pois":"CMS_zz4l_fai1",
22+
"fits":"profile1D:syst:all",
23+
"points":"200:1",
24+
"fit_opts":"--saveSpecifiedNuis all --saveInactivePOI 1 --cminApproxPreFitTolerance=10 --setParameterRanges CMS_zz4l_fai1=-0.003,0.003 --freezeParameters MH,fa3_ggH,muf --fastScan --setParameters muV=1,muf=1,fa3_ggH=1 --autoMaxPOIs 'CMS_zz4l_fai1' --autoBoundsPOIs 'CMS_zz4l_fai1' "
25+
},
26+
"ALT0L1":{
27+
"pois":"CMS_zz4l_fai1",
28+
"fits":"profile1D:syst:all",
29+
"points":"200:1",
30+
"fit_opts":"--saveSpecifiedNuis all --saveInactivePOI 1 --cminApproxPreFitTolerance=10 --setParameterRanges CMS_zz4l_fai1=-0.003,0.003 --freezeParameters MH,fa3_ggH,muf --fastScan --setParameters muV=1,muf=1,fa3_ggH=1 --autoMaxPOIs 'CMS_zz4l_fai1' --autoBoundsPOIs 'CMS_zz4l_fai1' "
31+
},
32+
"ALT0L1Zg":{
33+
"pois":"CMS_zz4l_fai1",
34+
"fits":"profile1D:syst:all",
35+
"points":"200:1",
36+
"fit_opts":"--saveSpecifiedNuis all --saveInactivePOI 1 --cminApproxPreFitTolerance=10 --setParameterRanges CMS_zz4l_fai1=-0.003,0.003 --freezeParameters MH,fa3_ggH,muf --fastScan --setParameters muV=1,muf=1,fa3_ggH=1 --autoMaxPOIs 'CMS_zz4l_fai1' --autoBoundsPOIs 'CMS_zz4l_fai1' "
1337
}
1438
}

Combine/models.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,28 @@
11
models = {
22
"mu_inclusive":"",
33

4-
"mu_simple":"-P HiggsAnalysis.CombinedLimit.PhysicsModel:multiSignalModel \
4+
"xsec":"-P HiggsAnalysis.CombinedLimit.PhysicsModel:multiSignalModel \
55
--PO \"map=.*/ggH.*hgg:r_ggH[1,0,3]\" \
66
--PO \"map=.*/qqH.*hgg:r_VBF[1,0,3]\" \
77
--PO \"map=.*/ttH.*hgg:r_top[1,-1,2]\" \
8-
--PO \"map=.*/vH.*hgg:r_VH[1,-1,2]\"",
8+
--PO \"map=.*/ZH.*hgg:r_VH[1,-1,2]\" \
9+
--PO \"map=.*/WH.*hgg:r_VH[1,-1,2]\"",
910

1011
"cp":"-P HiggsAnalysis.CombinedLimit.HiggsJPC:twoHypothesisHiggs \
1112
--PO=muFloating",
1213

14+
"ALT0M":"-P HiggsAnalysis.CombinedLimit.HiggsSingleAnomalousCoupling:FA3_Interference_JHU_ggHSyst_rw_MengsMuV_HeshyXsec_ggHInt_ggHphase \
15+
--PO altSignal=ALT0M",
16+
17+
"ALT0PH":"-P HiggsAnalysis.CombinedLimit.HiggsSingleAnomalousCoupling:FA3_Interference_JHU_ggHSyst_rw_MengsMuV_HeshyXsec_ggHInt_ggHphase \
18+
--PO altSignal=ALT0PH",
19+
20+
"ALT0L1":"-P HiggsAnalysis.CombinedLimit.HiggsSingleAnomalousCoupling:FA3_Interference_JHU_ggHSyst_rw_MengsMuV_HeshyXsec_ggHInt_ggHphase \
21+
--PO \"altSignal=ALT0L1\"",
22+
23+
"ALT0L1Zg":"-P HiggsAnalysis.CombinedLimit.HiggsSingleAnomalousCoupling:FA3_Interference_JHU_ggHSyst_rw_MengsMuV_HeshyXsec_ggHInt_ggHphase \
24+
--PO altSignal=ALT0L1Zg",
25+
1326
"mu":"-P HiggsAnalysis.CombinedLimit.PhysicsModel:multiSignalModel \
1427
--PO \"map=.*/ggH.*:r_ggH[1,0,2]\" \
1528
--PO \"map=.*/bbH.*:r_ggH[1,0,2]\" \

Combine/run_sequence.sh

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,28 +27,28 @@ esac
2727
shift
2828
done
2929

30+
fits=("xsec" "ALT0L1" "ALT0L1Zg" "ALT0PH" "ALT0M")
31+
3032
if [[ $STEP == "t2w" ]]; then
31-
python RunText2Workspace.py --ext "_xsec" --mode "mu_simple" --batch local
32-
for cpfit in "_VBF_ALTL1" "_VBF_ALT0PH" "_VBF_ALT0PM"
33+
for fit in ${fits[*]}
3334
do
34-
python RunText2Workspace.py --ext $cpfit --mode "cp" --batch local
35+
python RunText2Workspace.py --ext $fit --mode $fit --batch local
3536
done
3637
elif [[ $STEP == "fit" ]]; then
3738
for obs in " " " --doObserved "
3839
do
39-
python RunFits.py --inputJson inputs.json --ext "_xsec" --mode mu_simple --batch local $obs
40-
for cpfit in "_VBF_ALTL1" "_VBF_ALT0PH" "_VBF_ALT0PM"
40+
for fit in ${fits[*]}
4141
do
42-
python RunFits.py --inputJson inputs.json --ext $cpfit --mode cp --batch local $obs
42+
python RunFits.py --inputJson inputs.json --ext $fit --mode $fit --batch local $obs
4343
done
4444
done
4545
elif [[ $STEP == "plot" ]]; then
46-
for obs in " " " --doObserved "
46+
#for obs in " " " --doObserved "
47+
for obs in " "
4748
do
48-
python PlotScans.py --inputJson inputs.json --mode mu_simple --outdir $outdate-fits $obs
49-
for cpfit in "_VBF_ALTL1" "_VBF_ALT0PH" "_VBF_ALT0PM"
49+
for fit in ${fits[*]}
5050
do
51-
python PlotScans.py --inputJson inputs.json --mode cp --ext $cpfit --outdir $outdate-fits
51+
python PlotScans.py --inputJson inputs.json --mode $fit --ext $fit --outdir $outdate-fits $obs
5252
done
5353
done
5454
else

Datacard/run_sequence.sh

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ usage(){
77

88
echo "-h|--help) "
99
echo "-s|--step) "
10+
echo "-d|--dryRun) "
1011
}
1112
# options may be followed by one colon to indicate they have a required argument
12-
if ! options=$(getopt -u -o s:h -l help,step: -- "$@")
13+
if ! options=$(getopt -u -o s:h -l help,step:,dryRun -- "$@")
1314
then
1415
# something went wrong, getopt will put out an error message for us
1516
exit 1
@@ -20,35 +21,49 @@ do
2021
case $1 in
2122
-h|--help) usage; exit 0;;
2223
-s|--step) STEP=$2; shift ;;
24+
-d|--dryRun) DR=$2; shift ;;
2325
(--) shift; break;;
2426
(-*) usage; echo "$0: error - unrecognized option $1" 1>&2; usage >> /dev/stderr; exit 1;;
2527
(*) break;;
2628
esac
2729
shift
2830
done
2931

32+
DROPT=""
33+
if [[ $DR ]]; then
34+
DROPT=" --printOnly "
35+
fi
3036

3137
if [[ $STEP == "yields" ]]; then
3238
# for mu-simple: exclude ALT processes
33-
python RunYields.py --cats "VBFTag_1,VBFTag_3,VBFTag_5,VBFTag_6,VBFTag_7" --inputWSDirMap 2016=cards/cards_current/signal_2016,2017=cards/cards_current/signal_2017,2018=cards/cards_current/signal_2018 --procs "GG2H,TTH,VBF,VH" --mergeYears --doSystematics --ext ${ext}_xsec --batch condor --queue espresso
39+
python RunYields.py --cats "VBFTag_1,VBFTag_3,VBFTag_5,VBFTag_6,VBFTag_7" --inputWSDirMap 2016preVFP=cards/cards_current/signal_2016preVFP,2016postVFP=cards/cards_current/signal_2016postVFP,2017=cards/cards_current/signal_2017,2018=cards/cards_current/signal_2018 --procs "GG2H,TTH,VBF,WH_WM,WH_WP,ZH" --mergeYears --doSystematics --ext ${ext}_xsec --batch condor --queue espresso ${DROPT}
3440

3541
# for the single fai fits: include one ALT sample at a time
36-
for altproc in "VBF_ALTL1" "VBF_ALT0PH" "VBF_ALT0PM"
42+
for altproc in "ALT0L1" "ALT0L1Zg" "ALT0PH" "ALT0M"
43+
# to get the interference correctly need the SM (fa1=0), the pure BSM (fai=1) and the mixed one (fai=0.5)
44+
# temporary approx: only the VBF is BSM
3745
do
38-
python RunYields.py --cats "VBFTag_1,VBFTag_3,VBFTag_5,VBFTag_6,VBFTag_7" --inputWSDirMap 2016=cards/cards_current/signal_2016,2017=cards/cards_current/signal_2017,2018=cards/cards_current/signal_2018 --procs "GG2H,TTH,VBF,VH,$altproc" --mergeYears --doSystematics --ext ${ext}_${altproc} --batch condor --queue espresso
46+
vbfsamples="VBF,VBF_${altproc},VBF_${altproc}f05ph0"
47+
#whaltsamples="WH_ALT0L1f05ph0,WH_ALT0PH,WH_ALT0PHf05ph0" # not all are completed
48+
if [[ $altproc == "ALT0M" ]]; then
49+
zhsamples="ZH" # ZH alternative samples have some missing systematics
50+
else
51+
zhsamples="ZH,ZH_${altproc},ZH_${altproc}f05ph0"
52+
fi
53+
python RunYields.py --cats "VBFTag_1,VBFTag_3,VBFTag_5,VBFTag_6,VBFTag_7" --inputWSDirMap 2016preVFP=cards/cards_current/signal_2016preVFP,2016postVFP=cards/cards_current/signal_2016postVFP,2017=cards/cards_current/signal_2017,2018=cards/cards_current/signal_2018 --procs "GG2H,TTH,WH_WM,WH_WP,$vbfsamples,$zhsamples" --mergeYears --doSystematics --ext ${ext}_${altproc} --batch condor --queue espresso ${DROPT}
3954
done
4055
elif [[ $STEP == "datacards" ]]; then
41-
for fit in "xsec" "VBF_ALTL1" "VBF_ALT0PH" "VBF_ALT0PM"
56+
for fit in "xsec" "ALT0L1" "ALT0L1Zg" "ALT0PH" "ALT0M"
4257
do
43-
python makeDatacard.py --years 2016,2017,2018 --ext ${ext}_${fit} --prune --doSystematics --output "Datacard_${fit}"
58+
python makeDatacard.py --years 2016preVFP,2016postVFP,2017,2018 --ext ${ext}_${fit} --prune --doSystematics --output "Datacard_${fit}"
4459
done
4560
elif [[ $STEP == "links" ]]; then
4661
cd Models
4762
rm signal background
4863
echo "linking Models/signal to ../../Signal/outdir_packaged"
4964
ln -s ../../Signal/outdir_packaged signal
50-
echo "linking Models/background to ../../Background/outdir_2022-08-01"
51-
ln -s ../../Background/outdir_2022-08-01 background
65+
echo "linking Models/background to ../../Background/outdir_2022-11-21"
66+
ln -s ../../Background/outdir_2022-11-21 background
5267
cd -
5368
else
5469
echo "Step $STEP is not one among yields,datacard,links. Exiting."

Datacard/systematics.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,9 @@
7373

7474
experimental_systematics = [
7575
# Updated luminosity partial-correlation scheme: 13/5/21 (recommended simplified nuisances)
76-
{'name':'lumi_13TeV_Uncorrelated','title':'lumi_13TeV_Uncorrelated','type':'constant','prior':'lnN','correlateAcrossYears':0,'value':{'2016':'1.010','2017':'1.020','2018':'1.015'}},
77-
{'name':'lumi_13TeV_Correlated','title':'lumi_13TeV_Correlated','type':'constant','prior':'lnN','correlateAcrossYears':-1,'value':{'2016':'1.006','2017':'1.009','2018':'1.020'}},
78-
{'name':'lumi_13TeV_Correlated_1718','title':'lumi_13TeV_Correlated_1718','type':'constant','prior':'lnN','correlateAcrossYears':-1,'value':{'2016':'-','2017':'1.006','2018':'1.002'}},
76+
{'name':'lumi_13TeV_Uncorrelated','title':'lumi_13TeV_Uncorrelated','type':'constant','prior':'lnN','correlateAcrossYears':0,'value':{'2016preVFP':'1.010','2016postVFP':'1.010','2017':'1.020','2018':'1.015'}},
77+
{'name':'lumi_13TeV_Correlated','title':'lumi_13TeV_Correlated','type':'constant','prior':'lnN','correlateAcrossYears':-1,'value':{'2016preVFP':'1.006','2016postVFP':'1.006','2017':'1.009','2018':'1.020'}},
78+
{'name':'lumi_13TeV_Correlated_1718','title':'lumi_13TeV_Correlated_1718','type':'constant','prior':'lnN','correlateAcrossYears':-1,'value':{'2016preVFP':'-','2016postVFP':'-','2017':'1.006','2018':'1.002'}},
7979
{'name':'LooseMvaSF','title':'CMS_hgg_LooseMvaSF','type':'factory','prior':'lnN','correlateAcrossYears':0},
8080
{'name':'PreselSF','title':'CMS_hgg_PreselSF','type':'factory','prior':'lnN','correlateAcrossYears':0},
8181
{'name':'electronVetoSF','title':'CMS_hgg_electronVetoSF','type':'factory','prior':'lnN','correlateAcrossYears':0},

Datacard/tools/calcSystematics.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ def addConstantSyst(sd,_syst,options):
4242

4343
def getValueFromJson(row,uncertainties,sname):
4444
# uncertainties is a dict of the form proc:{sname:X}
45-
p = re.sub("_2016_%s"%decayMode,"",row['proc'])
45+
p = re.sub("_2016preVFP_%s"%decayMode,"",row['proc'])
46+
p = re.sub("_2016postVFP_%s"%decayMode,"",p)
4647
p = re.sub("_2017_%s"%decayMode,"",p)
4748
p = re.sub("_2018_%s"%decayMode,"",p)
4849
if p in uncertainties:

0 commit comments

Comments
 (0)