From fcf567d9118c55f351e5ea75898b3e7389259b91 Mon Sep 17 00:00:00 2001 From: Gianfranco de Castro Date: Thu, 14 May 2026 13:27:35 -0500 Subject: [PATCH 01/15] Changes to Combine summarized in Evernote --- .../BinningStudy/background_templates.pdf | Bin 0 -> 26135 bytes .../BinningStudy/background_templates.png | Bin 0 -> 98993 bytes .../ForLimits/BinningStudy/binning_schemes.py | 34 + .../ForLimits/BinningStudy/collect_results.py | 160 + .../BinningStudy/generate_variants_el7.py | 92 + .../BinningStudy/plot_background_templates.py | 150 + .../BinningStudy/run_combine_study.sh | 71 + .../ForLimits/BinningStudy/strip_systs.py | 59 + .../pickle_ggHToSSTodddd.pkl | 163 + .../NuisTabStore_7p4p1/pickle_mfv_neu.pkl | 163 + .../pickle_mfv_stopbbarbbar.pkl | 163 + .../pickle_mfv_stopdbardbar.pkl | 163 + .../NuisTabStore_TrkMvr/pickle_VH.pkl | 125 + .../pickle_ggHToSSTodddd.pkl | 125 + .../NuisTabStore_TrkMvr/pickle_mfv_neu.pkl | 125 + .../pickle_mfv_stopbbarbbar.pkl | 125 + .../pickle_mfv_stopdbardbar.pkl | 125 + .../NuisTabStore_TrkRec/ct_pickle_VH.pkl | 167 + .../NuisTabStore_TrkRec/dn_pickle_VH.pkl | 167 + .../NuisTabStore_TrkRec/up_pickle_VH.pkl | 167 + .../test/ForLimits/getNuisanceFromSig.py | 166 + .../ForLimits/helper_PyStorage_objects.py | 499 ++ .../test/ForLimits/helper_ROOT_functions.py | 56 + .../test/ForLimits/hepdata_ins1861146.json | 1632 ++++++ .../test/ForLimits/limits_config.yaml | 73 + MFVNeutralino/test/ForLimits/makeDatacard.py | 409 ++ .../test/ForLimits/makeLimitsInputROOT.py | 394 ++ .../test/ForLimits/nuisance_configs.py | 30 + .../nuisance_configs_and_functions.py | 205 + MFVNeutralino/test/ForLimits/plotLimits.py | 429 ++ .../test/ForLimits/run_highM_combine_local.sh | 58 + .../ForLimits/run_limits_bjet_allyears.sh | 26 + .../test/ForLimits/script_configs.py | 145 + .../test/ForLimits/sig_and_bkg_configs.py | 59 + MFVNeutralino/test/ForLimits/submitCombine.py | 202 + .../test/ForLimits/turn_7p4p1_to_2darr.py | 78 + .../test/ForLimits/turn_TrkMvr_to_2darr.py | 49 + .../test/ForLimits/turn_TrkRec_to_2darr.py | 92 + .../test/ForLimits/uncerts_trigger.py | 5037 +++++++++++++++++ .../test/ForLimits/uncerts_trigger_patch.py | 55 + .../test/ForLimits/uncerts_trkmvr.py | 120 + .../test/ForLimits/uncerts_trkrec.py | 224 + .../test/MiniTree/studyNewTriggers.cc | 293 + MFVNeutralino/test/histosLepSF.py | 85 + MFVNeutralino/test/minitree_signal_VH.py | 75 + MFVNeutralino/test/minitree_signal_bjet.py | 76 + .../test/minitree_signal_bjet_highM.py | 64 + MFVNeutralino/test/ntuple_highM.py | 56 + .../test/submit_highM_minitrees_allyears.sh | 53 + .../test/submit_leptrigsf_allyears.sh | 44 + .../test/submit_signal_minitrees_allyears.sh | 69 + MFVNeutralino/test/utilities_MCPartial.py | 405 ++ Tools/python/SampleFiles.py | 141 + Tools/python/Samples.py | 29 +- 54 files changed, 13767 insertions(+), 5 deletions(-) create mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/background_templates.pdf create mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/background_templates.png create mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/binning_schemes.py create mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/collect_results.py create mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/generate_variants_el7.py create mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/plot_background_templates.py create mode 100755 MFVNeutralino/test/ForLimits/BinningStudy/run_combine_study.sh create mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/strip_systs.py create mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_ggHToSSTodddd.pkl create mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_neu.pkl create mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_stopbbarbbar.pkl create mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_stopdbardbar.pkl create mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_VH.pkl create mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_ggHToSSTodddd.pkl create mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_neu.pkl create mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_stopbbarbbar.pkl create mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_stopdbardbar.pkl create mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/ct_pickle_VH.pkl create mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/dn_pickle_VH.pkl create mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/up_pickle_VH.pkl create mode 100644 MFVNeutralino/test/ForLimits/getNuisanceFromSig.py create mode 100644 MFVNeutralino/test/ForLimits/helper_PyStorage_objects.py create mode 100644 MFVNeutralino/test/ForLimits/helper_ROOT_functions.py create mode 100644 MFVNeutralino/test/ForLimits/hepdata_ins1861146.json create mode 100644 MFVNeutralino/test/ForLimits/limits_config.yaml create mode 100644 MFVNeutralino/test/ForLimits/makeDatacard.py create mode 100644 MFVNeutralino/test/ForLimits/makeLimitsInputROOT.py create mode 100644 MFVNeutralino/test/ForLimits/nuisance_configs.py create mode 100644 MFVNeutralino/test/ForLimits/nuisance_configs_and_functions.py create mode 100644 MFVNeutralino/test/ForLimits/plotLimits.py create mode 100644 MFVNeutralino/test/ForLimits/run_highM_combine_local.sh create mode 100755 MFVNeutralino/test/ForLimits/run_limits_bjet_allyears.sh create mode 100644 MFVNeutralino/test/ForLimits/script_configs.py create mode 100644 MFVNeutralino/test/ForLimits/sig_and_bkg_configs.py create mode 100644 MFVNeutralino/test/ForLimits/submitCombine.py create mode 100644 MFVNeutralino/test/ForLimits/turn_7p4p1_to_2darr.py create mode 100644 MFVNeutralino/test/ForLimits/turn_TrkMvr_to_2darr.py create mode 100644 MFVNeutralino/test/ForLimits/turn_TrkRec_to_2darr.py create mode 100644 MFVNeutralino/test/ForLimits/uncerts_trigger.py create mode 100644 MFVNeutralino/test/ForLimits/uncerts_trigger_patch.py create mode 100644 MFVNeutralino/test/ForLimits/uncerts_trkmvr.py create mode 100644 MFVNeutralino/test/ForLimits/uncerts_trkrec.py create mode 100644 MFVNeutralino/test/MiniTree/studyNewTriggers.cc create mode 100644 MFVNeutralino/test/histosLepSF.py create mode 100644 MFVNeutralino/test/minitree_signal_VH.py create mode 100644 MFVNeutralino/test/minitree_signal_bjet.py create mode 100644 MFVNeutralino/test/minitree_signal_bjet_highM.py create mode 100644 MFVNeutralino/test/ntuple_highM.py create mode 100644 MFVNeutralino/test/submit_highM_minitrees_allyears.sh create mode 100755 MFVNeutralino/test/submit_leptrigsf_allyears.sh create mode 100755 MFVNeutralino/test/submit_signal_minitrees_allyears.sh create mode 100755 MFVNeutralino/test/utilities_MCPartial.py diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/background_templates.pdf b/MFVNeutralino/test/ForLimits/BinningStudy/background_templates.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b39a4185257391a0e1c1105ab65d75e86e677e4a GIT binary patch literal 26135 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 literal 0 HcmV?d00001 diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/background_templates.png b/MFVNeutralino/test/ForLimits/BinningStudy/background_templates.png new file mode 100644 index 0000000000000000000000000000000000000000..71426dc6c8285cdfb416b63f5342fecca2eb282b GIT binary patch literal 98993 zcmeFZX*|~5`!)O}MVd4h328tfB~zwQ2q9DEO3IL#44EoQNy=EsJSRyZWJ-pjj75M@X zBt-N`1!5==P&Tt*k9m(A0=0d7g=trpzAT2J zrpu$BZO$$m$`|QJrV^)UQ|}(P;hwG_`?oX;*i*k`+rs-cBB##~*XlTdE!x9y@kSCRXkA%vf(? zKC9b;xJq9`^3WspY#U#hGqx?sR>sOlW(_~Ta<*~3;EUBx`MSSEUQSMqSy9;5f8opL z&+Pm6Gi4Mnh%L-db&S>QmPiz`X}_J4!qx6_@T7$W51uV5H6l|^uJ&5A*TPoLW4EQd zD+0a^4XxU{cdv-3Xslg##q`{Gt=;0n{8-HnvUw7m`>GBv!Fx*ML&Ci>Oezi{0Plv>!r!NFnH z^knP4eG9L8?Pn*TYmwypY$_uQr#(`KkI8b-9Yorn@ob!ZzH7`T7Pa+6+`8I6vP z&gajcWAw5u`oFx`)AZCZ&3SucV`F`h$7QY!jDj}p+qk*8dBy{`OWfi!%rC)PtX{pE zVb!Woo1&$3bkebE?2?j3yFT3IkVSMdZQSUKO)OYk_`|SrrB7(+#(d{tK7JiFHSdjk zwb^&$g-}$)!}n%Yy8Q?dg(-V!Vqdo7|r?&>&y!pDCzxYX}1hZvZzLQx;kpzywX>;@C z!otEIGmP16ie`4-VLhDm{E22pR^d9Q)*LIp+qZp!gV*C>>XTGhE`E8ww8X12B_$|C zQL!fWy4zUK^79`a`qtH{iHM1nR#h?L3^A-&@rEqQ{rf40taN{dI~v`qa;XmECC`c1 z`PS3plVjC-w)v@{*wkpL?}{yw?jp2HmYgv$S+aTaX1Qa>x|)r>K0U0sJF5{DQhU?Y z)pdGyFhf1VNCH7u^5)HwCG@MyaJI9PRF#z8;Naiv>^v3+WnZ_qZzqAhdi60) z%?;b7JfFlns-#)B<&Q01IDbCO%=gCPbKcG8#*H`i^=nU@IAPZO zG_rn;-PT4=K7(9u;STrphb)_X($jhIc6HCr$hwcbrWcbJH!AjI#mDst4-Yq}BrARO zDs8&?$&)8XzFdfoJ@e+et*tHjSTZs)`#okI11giuSij~w?cKr2`R(V=+s8wBVwJ-A zL>#`~E||+SsjN%a7ba)Bre-y-eok43*JApM_bUsxlgx1yM{P#~Id2qG@NSg`kwu&a zT5pQICh~ByP{-G=1{4z#=MF9|1!O-459NoH6B1?eLXD!1!@s{tOk># zJ=ZlgHI;t(qAO_LAm`%Z@^&1Hn`l>v3KSeZ`uq2$*w|R|dp6a zQVu)+@*5ekb$x~0xIShU`~<67)FFPEmB z-eaN`e{5B(8W$Z^pXYEvT}_RB_V>_U$`4_56D#(vQXK1g?!pC2-b$O|d2PJ!3RESs zR0RbEJ+62z4W*aJgh=R5I8goFR`jKsnB722c3MT2e$K^v<3IcRxv)b=QOf8jf%EUTqz|cw*Gm3Tu6dE1 zoJ`goB{k>Six=yuvi|ybt+4PPp-B$yk3=1MobvMWZa#aqKktqg>dTn8M%Yb(zB=sf zwU#s{nV#O>cQbVCkG0ZvvpEdhzu1yBkouXQ>O$=dZoF~*`Yi-;>Z3(L-RI}ZB#FV~e_8U!%7$w`nin zw)pgT7nL#>h4@)c#o>^4HKprY3?vANI(%0?V`Ibr=+PrN#C=aUcBu?|u=}Y&-j2tb zsXH!OSsld>G;0zYlT~BK$>v20Zk)I&4%bdRD_tE^P2(Iw()RT#~ z%)aJk;z-|Z?M3xiS(PR*bYWp`#{O`2X69Ptwm8rES-nODC)?jYzmV{JYNC~<9r{wj z;v-kU%%7Fbl1?- z_pU|q5wvR2EW&0-$R@xprYPgA_O>cQgI5k<(=>)^5EnU`Y`R-yI1MFa&2SvqC%?eKBlO50h-7#a4<45maUPRW2fi8^z(CU&%?wslo__XT9o*sEodv@)5H~y>b)t>xILp<~ht1_)xh3xw4IPOJ9XB?OZo{2N9 z4x{xx_2PVho>=OFo}S*Vr-rX?U7q^&ZhT?kkIl^Pbo&S<8NY;toioekpPhNr^PG!| ziwXIEI}VraR=`{RrR~azgkc4~~wmy-*va^&tGg18&dxNgcb{iGk#^ z#R*m?B7{^VSL3XAHL6O5_HFd&JU854So;3G^5-vKZu+j+{P^P_7D<1#2(Mn2LX@@g zJhy69Ul}0Ut%Db8-j1UMIT|VEL`RLHwxuRoH6{g6?0~T4h@0MlaDL;kT7Le5k*j)Q z+_`7X&AHnz4@=BA3*u=#6-sJrRRt}ZlqUune`6K|~E9wVatgcmDh>9LE(D2@4C; z^FJq<2)JM3j{YFw-k9HN6)!$MzO&dJX89u<<=vkDdD-Eq@qjNN2-sKs)j+aJJ=Kxt z(ASgv5+&Rtltn3szi1l8AGx4j#5i9uX>Z8|D=S{>_JY(fAzoe;&y$y5UtMZ3j#{^) zFT?Cv!v>lnphXMiy-Uvt+q6G9AaUTpNz2oZV`8K~rt81dq;*FujQPE5d*y6ta2^?p z*4t$uFY8}J{_l+WN)n2deHtv_aM!N zJF^XPjJ8dWwUnaHlXyPawv_$OHqkgCFMKTKsS7v&v|R2b-CgDW76UbpL^0mR)?=T$Y2c#wNaM8u@;<>!C(63O>gntyG*&cx$K7yZS>#F zUlAp7IV(xRYe9Us%0nOgN0;wrBWXaPy2o03XAZmVIq^tM*Auvg@^)@_r3X-4);Brw z?TuMm{vlLn-&Boc0s$JQ4fhS`@5YjU67eeYTU&0OhLn#aq#ofp(s?8yG4XYI`BH){ zBW$d!0#M*+xaN|=Qwt}X^qG?pmfI-Xp_W6gddH4kpNqr_Tvp``kcq7mY1?oI?P*z= zoMwg*D*`{R!W6AI4JBgRNsWzTAcyO}X4KI>q)3KdmVr8|e%SWB^K^{E& z_AUoG33d5SmRX3X1-`JSbH4|h*Pt)3Xw*l8EnWEarA^1`m}hMf5fN#L!BtTrI}-McF~C#q0IXee|}xfL_BkN8*eu2(ew7!jB791vtPYRCn(ma)(LR((5DqZB5W zQ|s2RxBK~70D1UKXUP@jMyH{cjbUM7KmiA=JBn77WKAaTTS`w~-REXno?QrN9)pmx z7`S@%YLA0oPDdIVjnqgl14F}J8&W;i{Qmu$XPkH6KGLZKxHjBK>JVjNVG*?Ws4yrt zJ~sBuym9w!=0l8VppQieS@pP0O^=!+Bqw)+wOH17bhDI{6gr`J-52Lae*a!ZJrZ+b zlvjlyX zL|Nm6%4%wcRAr&3dZL%j_~ynM`IpvhBR~kLZ6WvfpP@bf{yq(dPm@z}LPE;ipRaii z)WR!n6F;EX&6dqikDfTOdJ~_4pK!a2?BH|Mr)6p`2Q`CBN~FQ7d>ieq)N59MX>AzL zh~9{f0v_A_Bt88Q-}((3=qSH{fKU0JCZC?@YIHlQs;W}bZf^PFLs*}&fE`wUG|=p> z?|W8<{6j;n*)C4bjUXTAr$~T>goFe%!Lp{FU^xKX!_tfj^J`|ROw~hj=EIWu`ue&7 z{>M}-3~!sSn7vyy5@A#HdTwU?5MS`!yHw2ny4Vaflrhf3?PAv?@X~c+wRgoB=9*V$ zg}SEeWuHEC=1M_cD999!S5DJ;Eh!eg{*F&L5j6%%`yA(d>0n76N#wVZ94+` zmGdxdoo5kx2JTA|*Ta^pxlJae;0J^r62bAGo13e9YIs;QrWHg?fN;&O-b~~2><>UG z;+}I`5c2jcG~R&37KX_i-m5Ar6ELN$?N#+Kwo-Ps&;q?)lhd-LOV9MxMCy5EI7Z$u zF)>kc+}>1CH?MsBxD38+H`b#VIe6&k<Yb?hsd1r-*iuyUgS2;Z=o(|G> z@EAC&aJcS9L<9?(Y{8oGiHWk_>hMWP?dv&g11+^39c)^UHR~-|s#d11*}8SBy{*;H z&zaAj)wwGv=b!layEQeneXnsmV(!IVNS`rZ zU5$n?esiCrM~++(SIK|f)7eP@IRp$i4#_Jj#Bbg%>F$T*x$#v&QoVi4Z>@Y?yJCc7Q?~1kAgOKxu+*SA~{hIA^U{F9L`U5ze9c)Uc7;CkVci-SO z4&5>14V-V#Rt>4uGB-E3wYLvyRRHpO-M3ZaBO4_G#9dLZO(;JcP#Wn$m3cxKyz(?H zXAO+&6W5qC3jOYSibZy?4Sb_5LPgN}>lU=U_rD63%Y`QYdQ14@Zj-lk8&7S#V zPq{m)IQImy9@hSupFMxcq9tiewBfFs&8HX1{`~U7Zf@ERJ%2T4 zllGHSG%>d4>cMivhn;BE7{j?Bl%IOW(;w}HhYJb|M<<(&<4r2>Ob=!hXWgN5w6!gX zmk)H546wd9qQXeq&vW`p{?Y_1~QrgI9 zd&M1A{jQ<=XNyT!R7|V(U@Y&rMMT4BnsITF_;Cf}q!cOXZ(M3B!b73*s|Or3iUmV@ zrXI&B96w$PV0s$tDL{G2hYu=N4;n-=%)9&h{ocM+cw$_vwk|{e$q0Z<-`bvG?zLs!$YMCi?HGyWYJjgYNOj zrAs*#rU@(`juyM_lo(API-fRC#ifyou6@q!88}NbgJZ1|U1rQf@ycRN*V`TW_qP20 zgFH?#%7>a?UK)PDq*cbQmwry?I=V65OS&G4Gpp9DX`VKevYO#tp2}*rcN}PeWy0-* z3dmIfmyy$RU{OJd@l&U9z;a#3lWH8%AdD$&wdz~paZHW5>a&~1Nn|i&^4BR9-Ny``kc{Kqh(}dWM3j}!3p+O7Gd>zCUlFw7sYixlUZa>2}L@va?I)H=e5$`_9h6n$r*yQQEy$wXq^2Wp#Vk5 zHS5;%M~}A6jl5Yyc_VA5z7H_Y9?c85SLy?*gFs@`@ zR9ErY&BUT%=18=C!wv4=X}LMvpZ3Iz96m+zUGN^&k?ue#=3vu9*PEh~A55@hnN+S0 z==gjXW%tsruc^;39_9R$he{hzJk{a(Cw-2$<@pF24$-%tKvTvyne;z>>q6^U1KFf10KTuJ>0~g6?lHvg(Z`H@a`oTD8)V~s{=$WB zbN~n4KE?><4|Tr2#(Yf`H1JqJ0a(P-?}Bz&RJRpg-aOt{+dOzbLhs_mea8Z~^9Gh~ zkU5RUcN+Z?HK$`;E|9|u4!t^_KVP5H`nhWTnc>m!;=9xFka6S!JFWazT!)ffFNU`c5y zEt|*0y{fSe_wiMDaRJXcm-mlEHHQ9Z5zQmpBJ{YJ24YNCPL2+^ZYc*H$gw?v&*&KC zB}nHY!+=OJV|ALz!pd*w(Rq3sU1|4=T1gG_Vie4B)P8iiCeMeg+VVHPIR8QB?Af@M zg6_(|cz_e+#kKAp9=+1R0xPZPP2b)BJ&uQzh4%dGYaXe!T1JXS2tFk9)AO^FyWe$S zWjlL&eZd+mxwdT8$;+MWd-l+SnwRS+@~GZ9{U^(qG^q6&CkQ2Cjz2gk24iF6wIItE zebEa8$~ z3YUY(P_V#!$iffIuB*rY=o^FiyH7mgq8Rq<*<&|7awgOjoy%rIyNSIiE%nLB$bhUd z-MQqStid8|osz&J?(&RcM?0C2{S&ISypV;sF zOG%l1-K)iJU8y`Sd17Tp4URMB=Px&9>TzM4rT?W%% z;$^I@`M}{Fm6P*94q<}Y8WMif-+w*2NS#zmsCb)?963^o4lT;Fw`ya6X{;jT{$59T z6#mlcH8m%oD7#7>a^g&IsCaH#E%;Q2$62M)6kH^vJQ?c@e8f0p8(Qxz5^h;vw`YH{ zQ5g~E{q2T#8b8?_T)AI|}mJdDrqanLaxmIo4-a|$Fu71w8(Ys};xA8NoSK4*IN zVj-UFU~VCZ0lju%ur1{0^)W}5kf;ccwvXIfJ5S5bwgSJo78x5+zOOby*e0rC?ukL( zNl7+ceSLpOk>t15ZrOt8_NCYfG1425D%G2s>k!AZ7}#)HF%{ zX7ERZd*O}zxEs3FA?u7>vACg^nyq=7d8^Gh(_i!p!3MyU?Bw9Eo(NMwG=EvB&~ZIS zW5>w#S?ZGV+Nmdx`ams7Qi)&$mE@X_m=p1s&1xSE2}xizYu#*Ed}EzeZ+t-JP#hE@G?g znLU1-wrf6{KX&o`Kh9D9FE%;>wxtZRMGragub~BlAAbYlE7N({2+hmmgjBt39zwb_ z8(m%n-4s3W(My+v+FkotABot}lHM!75Xt2mlEr-?E9QrS=2y{Nb^+ECM4Dk#NRoWv z_yQ7fmp^||ok&myNiSW-7z!0!=aWRlOLCD7D zDcW6owV#xreep$oC9JkzV4ysRnP-=$tXFP5AU8a@B@Qxzh+{vKnDeidzA{(HYBn~m zC#wl;zS77TkWs+-mx1GOJ1hG0Qs4l)UtdLuO~<&{Q^dZ9;reRU$5XQvx3^vcm9yTe zCF_W`_9i}~0zbUvS+sInfC{MYnvE?X3GG`fpuA6yRr8OQuHc6qq!T-ydufOn`S!Yi zNku1GBY;qWcR9+L#wHcFUteFvqL!x3E9!yIxG+1&4{qtW$wL&bE&yVjdqF_IJ19IP zRQ3xCS1R!r`V1HSS&eUng$p~)yFLV)|807-`@W$0IxUOY5uSdq#VxJoB zxbf=MVeoRJKr>@Ct3x?_WoRfre}7qNY3Z5s*Li&K(R_S;Id<-(L+af({8Ky_G7GX3 z1I1h%e~ge9auecR48#i;w*v{1k=pn>LRL=mQo{IAL`aqBp1*$wf9cF$6d0xCH8)Bx zWc}3-nw+bir>7)-=@#^U8tJ^^@3;J-Rud)DLT=j6iL84v35~2*!+7wP|i+;b0 zLV&L*VbduYJMzBCZ?V!Nqm^uLkTh_Z(BhX8&1X0wfc5Yu{=$iqGv|Z+q8L%u-atd6 zKs9QnX|ECz63TTPSa;yS0k9||LoYkxj0)X)BUSK{_;S1R&yH4`2weXSn@vtlP*9L9 zkZ5jxejIWXsZaoIFNwQMV%O}{a3Bl`+a%q$0A0SVs=5lINbJ&2KSX2y0XGZ>V;s5)48yWrzG5?=@V^MQ5okwCN$<*}@ zd(p2k`pWdy0#u?6CypI`n?he?AP#>1jDi=(6E7lB`rW$K72v+Z?fZit?weUz1E4m- z)xioaEkz@FHHl7eNAXQl=qTKOf4P7od*#}-CCIsIpbjT~d|Cn1#jYyLqv0VTK3Kpr z6aDoJYu4O|jAX@!ftNrfCjf+EEc(}!lZlKVN52gW+=RKpePO1rU^RJQx8u4Y&dW%& zR7F5#0F_8ls6YxTD&-*f)~;WF4Tr82%r6p^T=I#?D$!(3J)F^NK0b6X62W&P-F*O| zbORP2$ad924vGD`Uy~ck#@vd;(<=3&#|`bi*F^e5&6Z`LLB)q;-vvt&@em1J{Ok?b z7YE;%TgEU_K0a+3L_Hvh>qxu*VfW9ucAVriaBC!WLiiWvDc;zIj0g7)TS!$txbXds z{c40=raHU3uK^v9a_7_DGgmhOO5oa^yN$fD`VO~|mFI4L4_U39RJ z3D|YXQ6;29XiQd(aC7FN1Gt61Vl{G7CE!14OoG$@;NVptaWie(cH3)VhMs@`q=0K6 z$iIDib7L9;3E-2}^C5h;wf6@89m<3&a5@1~TnFbK4=S4SMu8mJcn8VIAmV^2#B#>{ zww=-iGv6cNyQ93}n>!8a35JU|XzA>}zu#Ke6do3~yZGuj= zEeBnWO^5X?>tl+nCG?^*P(k}YrELaARe9dt-*2|hs9*~K$7?8`0VwLBGXUKEP3f%% zg>Qu-+WK{0Q)Dylt%gc+D(B)>5QQ*FUV~zh`d-TU*EUi$u;Q-~dU#*7qG)4SpF#FW zA1rj}TMaB7fQ5VmFCt!eWPJP$@QUBogXh_Wg>@`j&>NUQhZz|gyZWE^3@;oD-PDqq zgN|tG1rrTQc+qPxL&B1?ALLD0MTLb5IY`7Rh9|#*UnE-wq(&SJ@~P&?xrcx`;gN#^ zr!{DA>@m3!=gi2pH+0=F>cM{*#2=d(PyBFr^SnG!a#&Ez(QL7EaL`aAD99=9!2&!y z$E^$>UM*O9!QhNcELwgm=6$VtTojt15>f_5 zxelISc&bY9>ET(KMq)qoEBdLJTEl^ZrjonB;r`vHZQE8t9fNO=9mPo_`NUDe4ho)Z zYu=4FPq(6Wb$FT79NJ|rUmnR45?=3E5Pee zHd$7!o2X~jZDNJLIS(IZkzt^uvn@VBGg09mIuH~h@4>f*^u#!Yfl@;Kp^s;eD=U`~ zOobx}6qD*Pb!zrSR+b!SxpyyBk+vt^uP4d7Hr3CMfks;Sp(o$|w>OG_UFW=6?ZqL>gr#B8(!N}|i<%PXM$Q+_!6j}u0x zrZ!V$KsvrJUc4ZdHOTJjUz$?X;|0G<96YGuIM8s^sHU}5pJ=!6jM7MdZfUuNe3_c~ z>eA3dWK1aD`}XaVQ&8|D94^I50K+Rd5zt48kfx9;A+Q%bj^Z6m*IS!)witI^w##_=a0L~1soSwiFTO3@LKeQB@s;+PFz-IDBAL~D`r51gJ`&PX%p6ES37;`SCBvDK(TT}kK{)j zTIC^Krn@#@df`>#O=ExB2E7f>_;zs@_M$((4zFcn%Q(>XZ{I_9mgs0tez-4m<`xwV z>lV?=QK>`wtUfi`!fOZ%PQ}mS%syt5)_eAzPLV8GtbaF~d%#t$dFDg}6ed_-ph@V3>w=!5*s;fx zMj4v&IFn^4;pGsY0RgW2-MqOLuA+6692&@#H8zUXDfA?^z`(qH$t=djsroqj*cO0GHOr9fhyKP{D*f1%vm|iT;g<3Y34d{j7;h+0x7}9^t;t2O?kL3_8P?w6WkMLqr`{+v=^JTOa2Gb8>5Q-7uTnC<-r~Dp<~yU_^lA(q#$E(WttY_N`Tz5!Gb#%`Ch*RAv!8@791=pUCRm)EA zQuXT;vCWntn}Q?Afl=Xke`7Md!9bT~=&bQtX!76}gq{=nBfWBTpj-Y%2rD2sQ?Nyi&K=W#Sd_yK^Tj*{Y+6m8whC*aIVpA+HJ? zKbT>$QfsG)Arl8*^A7qj5$ag;dv9N#$%luBC~t6Vg=K$YE)pw7b$SBeBLjs5!wN{e z>bRv@A@>?nt&ZE~>#_C6+}#T*hT{h;r$@e_NN7bYK-7lArM(wLdzD^ttf@BhOh}6j z(1%*`3D#^!uxZ4!PMwB#e_5aWX4$FYguaJCIh?Y!tFSkd>P>z3&10q%|mM)+$!;N&E>ipUu_Dv~M& zqN1Xxn6N;gnk5tnnQQpl=E@NdA2L!3%E}?h?V^* zWFQHR$v5IxOvc8sC@LyqAOK{g+|8*Yx^}%5PtYdPOb?&WD7u|0+#CDkhrVKqoT6D; z2a+ifAmGij8)(>t=^_1LCuY6#iT7$@6r-V_fyX#SVlzJHIV68=QYo*S=YN-1v0>ERfS4a^v}9n_cGXcc~l97kMofwfMDlZP7bFyI(N6VR6tRzM=o1>{N!x z^ck!!yEF_jx(|HHvmO;WPu>idR?%0RYmya={^@1;UuxMh^%udlj;2O9iLtY|bz z3)is5xLy&#lW+r?3T7&4X?r3Z;QfHuD})Z@8gxL8efw4t)irn^|JYJ6Gv8{Z7Ujq^ zTzvfBxuSIa%}B9FurziU3=8hjcgyaFdc)3GT>NBGb>@6_2(gXoHG5ztEq?4AEN_w? zv(z+y3hcNy0Zf*tc}QGP{2jYbAzm~wVqum`vCy?8wC7Z)R)kuT>O7y=<3#Z-4^;;i zowDm83}!o4Wi8!t@W27b3r*4$QI=I{tP;FV1qHv0agHcPHn;jsTY`=Bxq0;;p(O>` z1(0dsp1y0u_*p-adHvyxUiD*%Gp*(pRT;xt+dm{LySl*=U^Ix?3?3>5^p;*Y9JDKl zLVVJy{l5_uAmKL^70Vz-Y!R_#r((c6FgF?$x@|-+MU3@Et~;@sZrcBvMa|owWuBbM zq@_mC-&Hqe7#FXm{-PJh292NjfR#HyXTZ@Rg2oIUP@lOucTlTu=|mTYH+q0wIK&m{ z*gXtPz}&YPuyfApfN8^re9!`%Qc`Rnxn$hj#Nbg-19%HH4QQj6HJd$lS2Cf1Rn%T? zSTHF?Saq+)wzLN8^;KD)hT)0%isVSGbd$JXF7P+>#8x*9n)-Xjt1@RM@G__eUCOwb z+4peFLY{=*y9JiZMN8Pd;&~4r*0+47;>LcgLua#6yn<7&5(7)`zk8S6EBd+D;sVb&_z|`&>o#Vv#TA5L zhf$mmFk@UZ=ywSxYBBf-_BFtIUu29Qq4ET*Tv+;#krM0q{{3u!U2Lw`q9iyMflEJ6 zxkiDLp*lfuS`0jY{(QepyZE&nQ}7(TMg)vV*!8ZWF|# zU+h^}G2f(vTFS)4-g zycK5F`eHAyP!F)0#Mf~K4Y*?wDm}3^QPTjanUDccstJ?7yOmy6A;UNL*v5V$Pi@(M zngSP7mu;z&-6@YWMaVL6YpxG7CzE#U|9y&}$PD8^@L?Dx+7j7;w0O2I=E&H~4K$q~ ztSX7{Oo9F1TW_{U1E&QmOA3(>Q-5o(aL9)G@A5jDJX{hkwm%q7U4w}GCk;s+5y*DxIe7KMW0 zT;A69nO+OzQFe^p0qq4PJHb~0tnjwFS{9XF>zG+DjzQBCUHh%8wu_${b`O(hnEXP+zmofs?!}8w z3aqF&k3YZl!Vg_yyR}#N9WYq06Xs!L;mjerL(0#Htf$bSL$feg+?5z^6x4Xx)s>8i z5se&O=u(RKI$d2&1_Pdo_s8uG$Z<6_B(V78_S*vu3V(oV1c`_Z7o{Bd7X}7~yUkx- z+8AT3Cq~CLH0!-`q$-CGAPrGlF*OFB!tC?2STZ;Wo`KdoMJp|gxS;g%5wumU*_iCX z+yN7r?g2GUw{+>vHImaX34kp<@MVF;;VHM`;f6iMRn;3L+D)}8ow(mE3_29;twF}? zE%<{`FBH4wmX?+@(q!j$?%89hER0FvfSDFd*^rs8smhKHW5VXZ^&*-faryTKG=iol zkC_@q`#XT1RnN0Gol)i4yJE$P&;g7rsVSwUzuyITwGNCsnsg_pjVP3%;~AJw!?~KM zNoJCP|NUl64Es#(Cu{_tGesm2B2O|mO1h58xsR4_{zrBIp>L3y8@VRFh>i+FD1M;n z7&&~vUdMw})tCt&o?f>o+y5wN%zWGgqxr2aR#wF6#|B~|C6y&WxV;4Y>)Oqm_Y_}J zdH_HTp7jojdTDd>W=xe39@z+e?KV++Iw1Du+(NKQf6aW*nMYvV*(T+=4H%o~4ZvV_ zJ#W{7dwXzk5qcUKk0s;95^fXTzP?L|ZU*tR1OzL9M+F4Yp0!Rv2=`9lG%_&^M%MOQ z>C&E_9x@(Hd~GOZN+B7@D4dvWT$nOCA*2QJamU8S>OfAsk36i?J9)FBDdJY?eG{!FE13p#gGAniB(<)q ztIM{ph81yg2C3&1@Q#Ln+nW7+(Vm{3;C4jF)C1u1H^e=WHbHF!f;@nGf0?ADq{RSC z3AUK+!d(R$h@J`o3`69;Gyd_;;r?KYL!aQ7k7zvC=z8AOm-}~pto<| zmLTbM4i5*yL$(1F4lrrsWkZV0g+Ds%yc(M65j+qvZ4xOSJS+-k8J>iAhOQaCK4s*T zAn18`e0=;~P|%LW#N^~96h5?O62_L93x0t~CK@~$cLzH{P9bJAV=*v|eplP|P@W{3 zdE3qsn%hw4fTHAK@Wc4h9qiFrECu=S79Ue$1=6##4-uXm^#bhm4iS+ph=QQv!T$b! z1}`tKM^awfaR7+Ve%b16ei$CPHWfjVqHYXR*J4NV5z;4;uZayJE+gzndjU8zq}Ed2 zU{pCUW|C3(n;9Naf7C=v_kS7HHKs!+=qAakor@Tp{B@sVNyhsaJ8&HmU+Qdh5j zEWke*%JW9c_6^G7Ia}g$i?aMHk|8CpU8|l4u33Zh2M^Q#{l@=Z z4L`sCyB^biQ9BUXH)LX=|4O@FC{OrzoeR^}t-9^HskVS{_#Z@J%Ly@idwb$50Qubw z>0w!N2S(o?1;$0?i2cdxP2LA^2Ac)3+Ad2zbadXW>6vnsyyB117pFl;k((_9&D8$g z;u58vKkJmB52FQM8}D~KD++WKD=-fPJ*|jJPla-VIRPeM97!m6agxvaYc37S9!mQX z5J0_=tZ{wY(P`}7u{2X~{>zsyv4Fr^#9j7dRL{VA#{bqW8Aw`r7o)3cVSKQI8h?9> z04=7Q@SAR{FSZwKMJM+ebdl?Y-c-%{+DaU+F-f>?!kjNfEl1`)ip)mH2B?{F1uww0 zCkXd?+8!0SP_s?$=uzU?$0aUqcZe+pPkt2crn+R+=&_nR?P2`JcT!SP7+GD;MF{gk z#v$1koi;HQsI`CLaQg*&z9yr%gha0tJYFa*oyeJlf`W@HTXM1&m=NWKupql@8=(XU zxQ_KOUY31un@sU3M~ZDk&xU+<^QR~M#slxG0OuZ%MysQx!BnW14t+-D{-9x zCm^w@U^V7Yj6Ao-^<8D6g`t;LZThJfK#Q9$W>O$%Qr=5fYzlF(CQ0P2=J(p@H56$r zfF!F$h2@es+Aiqj+H&|X^*&;W>)VV7HGKLCk}+$$Hw2Rh@?O z7$txPbSJL4cnt#&`ie?&A52bxVAavFze*{aT60boH)hTd7vusO&2&8y1h&r3L}lL( z7cJ`Xi3_u&a-quL`^1VsZX3ZnkauAYudS*oMJqT0-!dUlFnT zV9u?u0l>C;fLp?x;MNynRKrLzQ4%eb`8_m1fHb5OD3Nh2_*EHksIP(ZB94l|L4R~b z-_ZAoH8NYGvCQ?H7X$bpgmq+fMMcF~Fn<3D(ZqfQ&UFpQ@=p(*=89d$$l%H?`ze@C z$z@2mW(3^@mgEY|4(tK~>V31s=L37q>;GIKuu~zkd-#6Gef*qnWA;ib4AmJiN`NZ}Zr>X>=pi;=3{nrCb${!DPL1p#IO)^4 z9R{vl+ybxxE(Id&v^+;rg0Br!_Nh#np@@Wy1E2T+F8@w<&kn*KOtWMe!m=r4a;ux9 zBs>j8b7M;AJ_zqbK99fu3QSzzfhun{$EuErnJa*Zv49rLgD0e=yS;8(_4NflrngwmAd^H-H~xe%Xwkohm{8@s}t9 zWT?Fwv{3XN840lV7}!_XbJvhpvgt4~VN?Inx@+f7iXtAoOX+$a;Y-_(beMJV3z4qK zXDu$4f}Wc&?&MX~yc=nn7#cwzkXON~LOjp;?CC8D!sR*$BXU0o_}d$}_XqEP13Um3 zz7uQ27Hz~^UxO2egckfP#QhG9wjtO3$PpS4FFpv_Nu7j%S8= zB;{)p$J1hT%hR46d>>BXQD`IIzJFhaszuH#5>UNsWct^nMEcN(Lzc_na)DhH{q82> zdw<<)su01iCr{`I;=Le;Aty(BAdNdbb+-(|KK-1PxX!>kKAw}@k%XaeQ6_DJS%k*> zCNO=|Z1xOpSz1r|K+mg~ zKyBEBt}mn+*O~ahVlZbzb-}8mtvHUnwgURSYf)NS+Q`I2$Rg35T53UT5=l1HO6>6A z6}UHMrX!{i8dfN3TiIjD^?sQTpo0sQNuUzp}*0({r2K05mX?giLfcp4>V`#A$< zwD=my^4BEeUGezAjqn^9qft#w}1EOqNAX!@e&tzw)NoS7r;h3+??1%+#Hf%{}nkj z$;o5<`-kAhSGl=pF;|EhqTwh*`?#`76--A}4)k4LTpm-Eg|q30Xbb2)r`)!=H22b8 zy^I-GW6arKb^^A}Uffk$7`pqYZD|Cg!N% z;^tO0SqW2quY32v05@XxoUP=ct#J6)|4H}HvO&;o#N^bNsC?d2=stdEj#&zdVCWPjXL!8>G<&4>M4z#>IllgghsXt|Lmr0Ll zXlpk(sXZ?*q_(XDhh?OV>(KJ~G2ge2c&T0ZK;^E(-97bRHZ?Rf$N}hRRkgo+r`S8! zgg!Q)FX6AV)|E&V%rC=XC3qQ)d@ykN6bflofaLsX73I-CVvtJfF|VFI zcy7Q3k;gMYm`wteJY#}`gIls6KgYZeG0TTqGW8C+KrkLf^0)jdHPCVnU11y?PWEoS zmd8O{;j*%`YI%z2ILpA!W;`z@cCikr6co)|f9}QYVf^LitB2`PdLHIE;It;G|$%(R<+Jf-_PS zG4|-`rPgdr*O<Y=sdBfERNfWApq2oOvoZ#a0gga4=|n(cb`^6Gr&N_VT;dV)Z*{;G=8NkQsHvZ zE~22>-_dh3-0VMF_2C0yBga-Xpg{VOOJ@FT0q?VE-zoOp%J*Y}PVlhcwl*?Wf&XNO zT@aV@h`UWF5YEYdLD0#T2>I>q<0@-eS$V;U^Q#tn{K>hGd$QbL&tTir5<{yre~1A5 z%M>wuc>9*=@5xogwLZKaisReyR?dQWSKd2pQhfFf4!%sj!s)m(g3DO}FPsoow6l^I zo~l7lMU+==V?klurm^ktC1nNA_llNC#Kh&KX>l!k@si@452Y;MTJL2 z@tr+;whU7c`!MPI*v@)&O=_(2u7H*4( zE)ou%4Wn?sz3YwPp0>W&#&7;=s6PHi!3R_!f6V6tVuA{b1ItQY^H*7fSc$OP1nzV| zlDLKGM0GeoaUakUCg5ZH&P+`6SR7F|WZk5}Jw!z#Wx_4E9vXGXU=@fpIW@JrUquTr z!*DZ4-QblqY)H6(E)}fi-C7nfn#5Tj2Nb5)dWA^_({|)eq<6cN!ro5)0#VoXNynII zYR8&cduwbA3?4Q0Cj2%7XG%;ysGU8(ABBe}+Z)wwjM@9H2>s66O8i9S;@4dDqD*`E zJ?cRyiGEHRx)0w!ZgV36zU z+}eu0jIDL55~Mppj%0=L!g}0T`WelNr!fx1r>DU-UvoLg#Z7&R8f@y(Hy$A+^qjtn zMIe=T+jJg`ZpUp;Hp+@N2*Koj6tK4(?JX`|xPyC+K7T${k3MmR8C1}xnCI(d{8S}p z^HeMQ%N>H{EyFN{AL zNy=-H(J?}6hx_qHf4v&6YHj+sxyiW$x4P}}E~W1;T3ooC=RW*3j}tuXZkul0VAqhp z3JC-{#Xj`4e8vYmFhE2mF!3nLMn&$r7bFGilRxZjR)@=y;F7#Mj2xOR_n$8OLY((b zx=(+*F(&Z@VR{o4_#MqbtAP%;L0(tm3-9l9NclxQdbE#zGV!wD!#nT5a4%KcG8ZN3 zkq-v-4%zul>(_H)b_Q-pG>6$Yz9x?6IRWrvSHQx{x}1n7CuJOpHhB^_^ppJP*RptMEcT+afDAM-wb ze0SF!=44uL7%H?QF8s8suBizdY=elI%{K+r3+^%d-YRB!+DM7Z+NM5w>McKh;>6LZ zO@~D1%s#$3HhRm?uTJFQiN`l6;%JW7@tnwn!IVat7<~qXR;B;hW&ZNyR@#TxDv@vF zU?dqkkhF4yyc~einF|;8z(XG|Fa#6B-+K)|UTdtC@kYCMoLq-ywSb=BD3BqHVz{d_ z#EfOv|Dxpfj#)cW=9t4u*d$%biu zS7IbGg2$OZD|0WVrAVX{%DA{M5mu|5TRV%m?zydX{^paLEd;*4`<*k^Vvr-AY{dD8 zUs)B)<){!5YJTc_MA<4_vJIRiEg?}S@6X1HkQGlmo?p?k%Lr=^MNgDwSJI1VGjg7s zVteke7_qb;Ng_{sFQWnQ8)lR^VmTqdv_G4X@0|B6sKfQ_n3~ zEnn0X7SIh5nI#E<-N!kWFTGn3u`I5E+tX=E6KLCmGBL}q>R5)ec#N}-?N`&F$`_Ab zC@xBUJW9v#cG*^h51*Ruql>;iG^lvYtyNWE)pu=-Pis%k4I9z@I3=;XM(W+yQTE}F zO1YoKmDs@f6b`~yk&bMkMHLpOH><@%hh=}6udeA>(*&61j(x@TnvA1T#+>9 zrr)+cb8V-;3_X;>Sx}sg9XobCnNPR_g2nYz{%|9ae~i1l(_iRe*~e z@!USgbG|}>Fl4A*)Y6E}N(vYj1FbbPMf7<-Ga9W0sdyu_tY*AZ)3I|#X4OFP=!jbI z2n*1!28wffjv4PGE^DKizfg=KjET3I)qxsP)@3)5^Ypc*tpxsAKij$uKkM_Bt@U z&SN+GFB(f}BJq5|k)5s44!6-4#7M ziT-Qg{KhG9632X7#3ejmHAvg$oTk z>(sYz-zJMjaBs!V`PUZg#Pme`VHXth_Z?KEnBq`h=Yq^ zv(v@GD@XKp(UWA93WkFBNwK-dFsov%w7ZgsMI2+-^h|HV_L9s?%MSVSD#CG+VfyBb zs+{^C!;%Oi@gDm*j;S>L5i`TPh|A^C|k0+&grcxokN-hyE7J`Ujc@ zv=cUJQ>LP@@WUjxPKzIX645o^O`!nym}iyY)vjH;_j!2%={F<#TP&b;GR)Sd-Pm}+ zHYb=W8EP+dVkZ6BSh5RtQ*=P6w-jsN*v(&@;a=$mJDq(e2f#DCONEvkDeaKM=%aL* zSZRdiANfiVXYofCC4g$$&t5-a(&92RRh^4$W4yo5%NUi{Fyo9sLYxT56H>=nR0-jw zSccLXWG*G*+{WnX55OLFi-$Wqk}F$DA#Uvv&UKU_aIfk9Hl5P@!oTgMHYE+c7kE`} zgs2-u7CHO->s(k;`aj@b{W){maaMrh_1f_=60rmuIu23Sdh#3KtOb&^&L3}IJ`mZ6 zJ3d&lplY~(6w3Mg!Xl86uT6<)uc{i@uFxUdZPcgw@X*l7ymz-n1*m8honr>isiLb4 z$~>C5xP8DNB;RcY%)kCJ;+&}(*dBFL(CUN7p8xZ$XZyCvw-QZbf~(B?B|Ln%s@0)Y zy_X&gC%ZLYn~28-Y)(nNv{j9$`V?QbGt|Au4{KDdU;r(R7B7kRsD5;&m;z!qWu8>P zBK$&;?o34&ngblt>RlKV@|(ABHxQU`eud?#cd02UpDw*XWmtq1*LrEV$8(Qb)x0ya z7RN-6_WgR+W$)hmbjI0{JPEOrA(a8T9{Tgbk(cJ?b{`rC)xN{6BtCN~3}4xJOtBxj zH#+?X;_&-m`jYm|mYw>;9^1=%l!hpOq86zo5%mnh9!Gik@>M^d)~#Ai#(~Uh8CX%o zp)cWST)DAu=iJYx(+8({a_Z+@8^CFyxSj3^*&R#JmzA3F-SbLU%f^x=o_PU4}2IAdXZr(A)~V3o%Ek} zCLS;j00V(hGaB_qO`3=RV^?6{nvm64*4Bgja%Xgfc_ANm7rcVh2OB4i*3f9)qT|4$ z^>6)*)m{e9PrBrgf!hesTJrwDS;PPZE!1e#+BYw@@AR2bso~_f?&oUN1Aks)VUB6@ zv7lhx%dy`5a)zgkSiN~JQJjmG4gfqyHHzz5Gx#Z37`+&T)Z?V21hlnED(2tL^GWbc z$5KY+^sC>THaExJ?949R3CpMc2}e=<_zvd1r&nHjlw6-tc_(k2b^&+5L!@jE{c8QIIRrUdb0*Si-L%57_hQg|!Xkp5pjF1wd za^CacVm*~yV!`FiGaGxB54e8A2KRBjQZ^(KaC>rS*pHL9-x^i>=7a3KzC=ygSG7{Z zy%^j;YpaUw(6Y)Y$1Yqj{}!$5RI|Xz=w|<=y|*8{68Oe5mjbXga3UgEpw$Lu4d;ZBa!m-+ZTk(5?u}gp$7eRvVf2|F=i00$gy?WU%i3`t?Jq<$gR}ip6@cPw(h-N#|((7>%O|LTi;Z(EO7D_g#~L! z3KJWAMUi*@wt(@z2SP(b9nN11N|K;0s)$wJvhy|#TKngpf~o>Ov;q5{vT>s}z>$2B zZKt^~Jx#VGmd*S+)jEH-b?>DmoihhFy=1F$_Ih*?1&c(-c_!Q9^+n@wTV*csQXDaw^m2rz5cTe*DmNhMXb3|2m#Hp+6<}G>e!-ho#KHUGvpk%)& zg-b<8KDCdnYM&rgU$27DdpzX5s4XgzyrcIaR*=}oDmy|Fe)kE#b?X7I{8upVkqRyj z@XIH8BO3qojyUG&*{5mIW{v9wUV%sYne=dbTGzs)^8J9ZhTNzP`FV$d@&aZMpO7#( zrltYbElJVCHq~2167Wr5%S!9PS!h$6mV>C*vY^pceVKdYhMn~7~wu;1aM3< zpzhQGZpAad@{so5FIf4tMiq^{VR7JrFu&hhT@JdgG&^7oJf-My+({n54kzM%QcT(LeQO@(ZgxVT8znIN&1@b;})$pU6-*C=^tpA{2Q?R4{ z0s9iA&^~U=ZyBL2B$4#ULZoysMApY5=84#;UQN$o!M9@H(Y}+Bto5cikf9kkIuAfr z^c*mt1%CKPM566R)w{~E%xLwel?YdPqXvjCsrmMCs*p7Oo@$J%ZO-b7$x}acJwAAD zXl6?PgCD1Dt0(cQEU|+BJiU(^wDO|xF<2=Tv8dE;Yqf9FW?5-it3eeM>7MDs2Gr|r zD{e$$i{M6GF0UaO4`^mNQJvPt`*r{hQh)8mwTd~*jV^&Ew-GOS*;b{W@u zLHyq!CHQWXq}l=4D`Nz{+RpiCqWAExix*b3m*VZ5u6;+53Zre^fMkha!Cu@Y(R!Xe zu4?Dl{%NRTk=mU%9K0ri=`6=>EFyeU{Vc8@2&npVg^5M!+bP>hH?+FUc0o6mmu*<~ zE+Jtmmy%bIQrmYw;FEVJRIZW3kWiTjoQ;cOlCd0ySra5*Y)xOLLwb~A?N62iZ}V&=mlN`Ta3pJ z;UAfrnUc~D0oIh5!BPEl{Jx>$DmA*IbNk(?f~KeRa}qss{EppT+NiVs;-$yK`lN-j zyX4e@X%suH1Pqs(o-Fov1M8MCC)CyahCO6CI^S<`iCeJic?$rM$f~b_I46AHt@h3q zev>UAQUho#@!`s8&KC^mws`KV5jnQ2?2Sw+1BNdRo^2A{%d$Ubcj>o(+H=pwBAz46 z{E)C)Scycd*v(r*Q$~sen!A2B%<7jf*yqJg^McK#AqiaSZLRv`k6(zSXZg(ZkSEWd zkE~MN7cp%cCWvRL6S7A3>h6bBH>kTG5iB#ax6|0ZdLC5T9jy6h14LsxnW&R-liORN zsMMK1+&CiogRk*h_Y0e~)-GDDNwbx!zcerOe6}#0-@diH^jGGt&Cf@s**0yfo5kf& zTi3mI>cuKPj&5Z|87jp1SK&lEVl1BMbEKc+Sn-1|sel2D7Dn}S1m}aBr=2jr7-9KU@506? zr+G&PB&Qx$($joJO(DNlqL_0!ET(})aj%Ui!PZxTNdL73nEIv%&TkEh8t(%qy|6v6kr?Z%qePxi$g|0r>HpKkn3-;>n)T!7-}|FRjru&hrhv?5+CX zk)Gj78YaqgkdU!q!!^=JX1oLB77xaBxBcE+cMy&qlrq7ZeRCL>;7Cklv z_{=$YkF~#MNng&E-!|q|?f;2y-R7o)8Lg(s!zHKoQeo)mGi(3Og^#CMhMvCfMtrf016aYRjg@zs`lIA)LU*wOlD!P$mvwY2;ZLna%3 zuUNf(WBTlfj6K7HS$6SGJB-^qK2Ml)K5d=_t#r;TJGv|66-T(;+5zt!OBz9=k{VIR z%UK;nAND2=ym|<53$X`AbfaS5*Ac#xfoKd?vp+u(KKBrV9+&u$$#%U zoAO}1WSbrT-Zr^pU+p-}>1V#4Ev?>;vr3?{mD@GkeD%yh#9q0NBzx{?aBJ7{E~R(p zd8UZnz{VWzoEaF>d~Z|DFi$h@x+v_g=9h-7UoF zYA*wbTE#N#BAbeFY%1C5P1!0OiM2FHkDot(1iu^FWR6e7Mw~mL1^FG)6UcIQHwpIj ztkMD_9&2%ShJg>BE6o$7YyX^YNCQ0bf zQKKXXX4XYLH_i|kvfij3C4hyhE*WTGcZqi}iWIZD9ge%((>`_{`B!JfGG<;aYN*z3 z=FTA+FJ>Q`e@fD26*n-6L|F{BZkdyq54u6<+dFL#>+l&N#h`p8X>glIGL1RaVKw{U|A5u*Y}J z9iXBtnX!r?xUJoc7n|Q%uf*CNWtSN-B}?gQ!Rqu^8ub`1hHv=|$3?FrOSW^hmL(oB zJ)(G==@o7MU7v))xI=n$K<@ZdaPVi3nftr7uR1zbjoW=An*MJxo4H# zx^hbupY7dNe;GZ_qVQV2<*$@gjChF4cT?<$M?+*CdPLM$rVWYzzFT8jaFO;F3-8kE zih>065-&dk`)5{midaLP) z;c1=nD#|#tCA9B(DPP;#Q75m%DN67AzbH&@tHV5XX>-pR?dpsc`q(E6v++_?2jP7kA(e>(Vm@N?c?T2GzMmnCDA7EAe$JlrC(5r zkj{Wr?SAs)K9nsV;d(sB$F@+}vQ{#rV9Yy{{WEX+;Kt!jl{uZRjPI;Vm9oG&FCwy2Ak+zr^()h7-~-&S(tB@C(^6(^HF#N6lX*TcndWy zszI_~wZ?DABPly1+9M45M-njzmj21&l9)*TsED~}i5|f($XfH_)lk@9Gz{;|Kl_FATeRt7G(F(Jora^4-oxC3OD zu5w6(@%WXkEaiH?<`;Fg?LyS@0ToCSg^XG#ejM?UHs09D?E}q->4j6{$nj!wl&w?y zxYrRD$F^ib8*R>i)k;waUt$H$x$%7|`%$QJ(e7V4Y`g*A+z`o_af!=9RPkQ?=IxL0 z(1@NJF2@8_T;SUU?$1YYZV&mYQRgSYC6cN{^ZT^AmZQfD;8GxpZdh1%{k8W+uEQJp zV1>*1?>vyiQ6sWHew0%08gp3m%IRNaKmZ~=Xzjz)6IW3C;Gk+o547a^IB*-WEJ^BF z$dCWTi=zNl${TJg*#lPVhbZ+Rb2lNzgl zIt($wy*J5GD0q-Be%8Z>^Yuwrw~LSAZKnwNAcUe(vv8>7rYw91mZ4>*a(R`NkbTHN$Dhk>xyLn zzrW-Rdhd|uPd7arA7FB2Z?`X}$8735=!h!G7fCe z_(R*sb;H=&g-daJjF0~{H>!EP3!v!_K{2muD{F!PQ>w=^oI%D+o!y){Cq{?t7}(Yk zqa8U=+Oa5SoYrp4F>q3C4^CaZU-=e(XAtaWtXdclMT0prKkz%wOU)hjB_y&wpkVmq zGz)0*on3Y-YJ%S;EVoZCf8~?nWqfv2<2==T#f??T>f&+SIEGGqIc5knb179@`e7uf z)cZgdhk#a$|Ldir(+zxj!R=LTe+h!TVYoZVz!Zf`Z#}A>BVub|-HBn`^~K8d>dA8_w5g53a3jemfiuT5LXBV9PLR5@;k3d-S0t*O&!=6F zk$;V+&bmZ+I0?zyUBb+WR&6_U==1!7?wS|n9&B7=2R4l*dPa3Ety$P1TxrN$K>=L( zOo4;ckUJo@en_c5;=0IdWbPW}fmt04an3e{$N&U+%oxj;>Z=g@gj*&`&IsW)7oH@B zgzq!w^gQN&h2G{YxuuhZ_5g948DjzuayFdLF*V(|@us+DBeh`EP=M|sqC@99gm?0S zk-)+F&7Ro~qVAbxar?RqTG6b|{cqLP=g)m5!8U0z7BlYuz2yDv=Tz*37llb{u6gD}C}(E`l_PKUNfG zerAMUE{U`=$*+RM7rxG+#v^|L9zYJ3=y#QE_4i}kn?!j1<9wM=#u-pt&%0Q>a+~Vh z3YY#1??v(Fj20od5`Eh`nU*C{sSH~Jcv)2S@k>S)K)8fydFlXp?x(j2^ysY+3%uuT zYPL40c8eXr3&p#JNH!iWtL1aQzEqtfx5wDJ7e|s@`5`B#PkL+Ec+aXDw$j(A=fu;` z%(X&@j!bue+QFYc?MOh=7)+ONxp=WQ{x%a*50xeeRj-*zu^#>N%atRaB1~@oz^*A1 zm6Z9rN)xV`M=hE~ar<49T(5$eFJ>okoV*YRBV};b}=6SEADlc)1NE>jUzrjk6l|1YLkY~bCZdTXEjEO#f5>bUq?nJkhgfi~BJY-^*b&`f=f zbYiky#YLHTWTDo-;;v%9T;5g}D!ym-s~86SKbZxFCEe{oXbG8@oP;O?yw6^2kv(AhrtHhx`p0EQ1KZ%ax za8oztad*i?eHv|UOZ?-xnhJT6bGD*dzgtnkqZ(3>46(*1QVxzP!q1l}*2G!^7 zApph0sc6I5t0F&MA-l-ugcG?b8?&aQhKOuUrXeYMQfXWtx&xJ_M|i*U_poP~{y?rn zxZ3=@Z0@z0R$aLK=lsalxJR^2Br^+t&=ifhb7x~_keRfgvDU%whrHwtH>(4aW@WpGPL~@M+GHZ! zTubwH%a-*-Wp!g?j?rcUy5)-wh$DbP2FDFt8lf`va5t0b)c|za?1d>XX4EqKC~H6q zF28O)s1uO(UhrQ_DBLeE1KLC8fbhuVStd3%qHj;Hj2P~yqI;czP7>WU@62 z$o|IEM)5Q=$v)FN$!I0M9e5xtdw=P7Da=h)Znr`Mmtn(pk=$ts5ciq?a9)0dVglruLcyEgHc=+EZ7zJIi2IX4s%V zpPxGbsrfi&%%fw^(2dsjt#PCbcd@xkSg(waQe);cM?vY`kW6E3c&~C6wTfyqY=H*Udx_!Skcu>`27NK2T`c zba)I9gGox%Pv#foc(hKkkQo5nLo!|7=jQI?Fu}=k8O9zC=uVBY z$=ubDXCVLii)mU^3}J&JHV@x4v&L1fY6Zj&Vei9Fxg`AR<$pggsDyfAX9q zZ$k#>)^1s3I4ylkL{(0Nhxa<)zj%TYvGM}{IOb8Al#5C}mU~lX+Ibe-G{U`pfMhXg zFStCX85+7*Z%JHN43i*}!zAe$k?nmLRP5of;QG|O4AENpZ9u{F>B%yzdg(T`8P5on z1;&VHg-+%8x{lH2RAb|-?@(Aj9T`L^b(}E1pP%6$zQ)y(yFFCb?exWqgF*hJjPNp>9lkx2@&=3${M&D^ooKm0FjV@}z*>se@Jk^sND|4wgty5<%Oos|35>WauozrEvwf}h7+LQFH>ouR= z$$lI+E@`+;uFeYDQYwSQOUV(07RYB1aj<4;Yc;)rd?8Vzy}AwZdE!VtU76|Ux6zJ^ zSzX3B?ha5l97IBL5E+##7Oee{2vP;h)O5G}wDQd>SEqyyu966k8kOzLwbA%Adp!CI z*aS(-FXHgt_!IZ3>SpO` z8plr(Col@1fuMvM)X8i@u8o2-| z-X+)oV?vYJKXn6t{`_fK@`*Y^GB%xcbUC7h>KgC5_?36X=`~e%YDzA7+s>@KqdESG z2UQ!ts`9MqiYKgWK0CVDCY%L15oa(=QUCGNJieBTq)GfAY~_dCCoh-M9kSNnj4s4n)Q)71ya%P8BFsT~Uy~ zr=A>GFwjIJB`tyAJ&CcU+}TO@{sC1H3@rraSZ-4ZP5XDB<$>0}<1E}juBo`jz!-=2 zAJq1AM>3YSucn1Z@OXsc<^zgOd7JQoO}UW?Sa|%@hmdxD>_gxMEn^f8lR&69Fd!Lx zN=@J#Y)T=v`ST=28cp-;e_rtF|9isk<_zCyuo(4fcKJ5Y!>)lAkHZ z%8u&F%FCz@B~zN@CULRSezc9LDQ*EUnU-?Wg?B0Qb`-O4#wPC_;9I>8W8nlKzcxU~G1~L$w3QehhSlpF76L~q`nUYirKIaTZ8zX9 znbFI{*A`$%S3n&eu)2;yoZY3`fW25uF&n8z=DKFxa>_sD{Cc-SmGO%l$O{V$T^tj7`MPJrLuu)Sl>5hWk4hNtlxiC+neOr%*_U$d1B`Q~Lz0 zfsQJk`JOU3n>QgWGbjfXsaNsuKD}%QjTzI0mpk_~b3h@Ke>qG$iWh$6sRxkVGh{L|?SHJlkW_^$V?2 z?oO=C>{!)g6V1R7!c9W+K&}N&W1sqI*K(yTxcNtO-cf@~g-a^X-I6tx_%yP*P_i~4JJFw2QS)rQWQdJ`&Tqvn6sl*AZKNi)Utw0|jLL}#NH~@wF-0EK zPyr--Ri%7}y;=cRDJhh#>0;Ourka_3)oXE#TMw@tt>p6HAvo^!VL@Oqk5rFNSbp^K zo%S)MI~P0dIL8q2UFd5&+&ky1^ADvay(NXDO-Nn~Wo09qPjjKK3)o!tGk}IO#QZ-n(ai+G88FSP_qLnYe!eGWm%OFBSf2N>NeBnQ`^)oJn4LCjRuhFBnw%t$1pj;S;>DaN_o6w) z&8)j`Qdci8c6Y+NE-o4&v$t2W+KoEc1m*>#afamO!pF~ywzkLePS$K)5^;~(Nmnl`yipjVG z+GC^d$5k_`?6_2mr|GL}?oc-AdSuaDm)m$}M9ij0{MO_T6K+%kbSiho^ zv;}wDWLgw*ef6V=DW!iI5nVg=Eaq}VcvsGC`eQrm)_tm1Lzmogzwe73vE-_nZ(8$c z&5xA0D&H>os>!zwIO?cxUxWwiX6}cCC!MLAi&N_+d#JXKgGM>I3@vGJRfs;&HbUK)$XgToJftvaY`$skLQBWq>gw9&+scX%FmB&VTd+Lof^KmP9m?M= zHfnbG_t6;m987;>dSXEqpF^`pwAb-ppXWdS$G^dcW_n&L_tW0eaGKW5H0`<|{nvjp z>J)r8U|>izpVLf-N2xoB0~^f0qWF0e-KPJiKjhHu*L?f``tiShv}F2vv}vHfpTE`C z#KmuRe@09240u$3=zkkb7(+lY(+ z5R2+s{-!rrknlIW5~3-1*Hb%OJ_6a5JPcj*#s}{b6R+y)te()Jb^fAw4|pLCt@r3~ z<WcWUKt5 zSL^LT!>ClX61pYda^|z60o;KirD8AI6@O~Z zZ+!pZgUP#p)V-7s|NB0a`}FH4fr-Q$NaM%jeL8MBzx22N^+aTADFhFp(jjJnPrnb3 znuB>1xlmY8FC;#fQ2o5VWv6+27oIBmwQbwsYJW!^y)Y8jOS{c>$~hbr`sco31-s*_LmS;t(WHXXHa0aYA^X=tz+^6B&Ej=lDX|griuzmZDGWVl zVBj;UvPN@{omR|J0|Va&Yu0K`zqanGqpx4luTNZlpU2}UbXw#>{poZum8aRF=>4N*F=E-`rrJEIUgE2(6;GHdJ%1KEEo*)=QD^ zOhCN_h1`%~OpCYUEr3t!mA-F0~qQfTml@;k7!*Fb20p9(18>c{Pwy z-eXmzYobTPm0$AMM7Qf?@LV5rb5$lB)Yonmh80v=vI#ilDdP5#C2++cS7G(sIH^6S z*aSlv6-SRC026UE+`TIc$3mIzgIe!J>=GoLi^Nu5f?DrPzKq;cRDZ8tF6^g$_m`~H z56M8zDb?*Kemx3mAt@jv_g6p*ZaY;eN2z3H+|=Q*fleYc1$g`oW*j#ZmkCKChK$WHg{Lxi(G781$1Bh;WVNqp8e^sXD~YPLz< z2R~FMhLx)Mca%zn67VCh@;-P}+TnVzOwHhM|L<<6wVFIfCxpj|WBufU>aArz-l}r# z8G!HI`0F2SkHHq^Id;@GB18yUY54MUNx;CNRT^V$rPWi220GLVc6SnrG?8u>+}Q6r zqwn#{6hWmKCA7 zecPVy;gs9g@nh}0uqS_LOZqWj_-nk{k47dIEJI9L)iUTcVy9LLnGiCf$2vM6lun^* zEljagSI#=>KaG4`&e<>LyaD^JxqH!?e}(qdn3Y-7fi7QO(ooF1G{1BqAZ-s zMw8Zx#ZgpH6rp!yB=U&g>;67T_eviG8~H%&^}gCX5!t&0!*uK3T_&`7nk21AL#BEI zq1^CQFBII&rUQN`IfKB;h!;^R=_Ck3gO*4xQ}h;68pD1*%=WFR^lnjO)9O8n2}#5L zxpN+KNdtujG=XTWt*wi8)z$;pE7vGyO`o3n&-zMi1UZ@Ga`?{- z151Ars)&t`?~_HiMBdo5?K9Aka3nn~xwAwo>DJarNsr>Bbk8jUKaPT!Ah#;+t?2K?m|8hm)Q-{g3b8-XET^1g%$ z;5?DvSS0gQ!G|pOEn0ffuRl}inki0=-=T-`OF;QJ95^C82ckNJX6Oti11~ixB8YMMs)J_RY5>XD5W;Va7v*A2!tdP4NJzr&5+RF{UtE)HQ zq8GU+qep+cyW}uCR_-o-+XQe0rOpYt$K#sy{hc{gik^`WhtrZsmFNUJKfDLY9j6r& z0C~(VKQ|-r-mNtNUmP^1;?nV{xYAo35_`kgd+)eBOQK$(C9~Z!==6+v@7LsKga$sp zUV&&N$3BQ-=F7K5iaq2F<=RIPET8{rEDd3MAwAzG9owJS2*6#JdaLd6}8Yo0Qu_$zqEB2xeUpMK%C(j>z@5Sv(tuh{9 zGsPZWTXV!C`h3R5jB1OEkDn}AT8$^#ZK{8EYUm`MZN#$Gt2IP*`xDLJ^wK4hM{Fzp zL&^CDx{8UKp2|G+`D2{u(I)mi-n_nIM}0rk?F#^LI?C}+qY^nr86jRaLuat6-`wylorpOngq>P3)7Rv0cy>uPR=0iq8RApmEE3v5$! z9+K&rQI-#z@fo&!U*wkCLu}C#7=1Kz=g^aT?mNBG+|)?h9JFzT)BMLxOU8ZPYVb%s zI4gVOU46TAr`M>ozPrTa+Qo^Ke2oK4HA#5z|2E#P@RDKzC0eHnlst14J!Sq6pIJD7#?Cmoc_gei6OK#}E?Q7b<$PO%~_oCd)Qy ztk4%Zp}j7{hn1Y=&qBqTzNxP&TO+T@N^hQNgwyzvDy@-RzY{Odu6O8fUA>ixvbkc9 zBq>ye4v1OzTjwDYa_VRwI>F&+nEKD2$gsS26`gWQ3{M)_A5LiNP=C=tJ^9HtHsbIf zjG=u*jcU8GmDhc7ZqV|@oA);`Sn-yV^2JrN0dH_YAsdh~&(u^!hGEZV!6%}%rOEC6E2O%F}4S~>aQ07voGzE-WWD)F7sko15&t?27 zUh>mhOP%H>0ipL0Uk#ex(NU{RGIM=K>yB!Xxu*THq?ziP_fBQC?K11n6Ajdkq&?gJ z{aBdei57|foLya8gLX!CG!oVXOv~}Ll{0q`0OFCGHObb73d*jkRHLq-zOMD002RLF z;KDI*;t7=8Qb))%2dQOxc^XMrmQ>zyy)bL_)%Sw~h7N5D5!v>nQvb&kGRlrWQ08wq zQ+@1Jw4;4Z?)dt);dobfu{wKcYW~_0r{881un(9*UmitcqBmV)23n@2Td0CDxVMdTy?DI^1=HGEW+0l<4dUq_(2TbRi@A63BOF zNu9}vnLcJ_9t5V}mcKxWG;ejr6emmZV>tjJP2*wi>%cello_#n4EnO2Lg8`HI&ZmX zyh5pkg97bAVQJo6w*-$-%NLp--+L%sqHQl+c%HXpe}4;Q7w5kRzMWBNcC6c9K1Yp0 z^N(Jc-TwuxhqRu!a%mtMDS!pNpcDmDMJTx7Q&@&ra!!|zqZR`9JT+|PtjotDytGaP z1@HMG;42&L)FBxa$!(dir+Ir={Jp@1L%WoemC5iV(I6nJi!ewsTfh*`spz9obu{4W z7j?PL7UbIB-rnmZmJ4djLeA3$EzBbvE&{F(#V;f>KoYttFXVHTC@yVq4GQVe~o*kwqlQ>LYAJj_C8TiO_$3sPl@+PL!&s?QXaqD<>n0Oc zNx8)Vk+k*eM7%%oHHY^bEuu{m)SRQ{z>Wz?fB*fE>s9=v)T~!^{Xo3P#=P~Y1QzZ$ zu0qY1q4Ys+;13Nlk&I91dwe;gYp8Z)p#%57>wEI4S>4aK2w3$iMqWutSg_r@qu(ePyTvjlum)z_GVV9KVaL8; z#*ZiU`e9iI*OYmkUR&MzBgw2Y$E1WpW93#TP`oRNDuFTxRf4kIJNp1It>^|nsts1w zEX*r*?8>lNVzq88i`&&8$>-a-^72))`{YE2j|=M%>S%uZ``v{v&Ce?A*S0hHC$8pj z>47mll-9lK&-c*7E^pQ8I1R`Df0)PcTRn@o?33bIE`1Z@RO!LYgS# zw3m!8>M5Kd?XK*ouY-+=1Woop;o@DO|KLW`}Ec-vG$B|M8sI* zD3EKit^XZ#RvT>-4eu~g7LCtyemU(r(fQ9_t-}& zXI@zwNr#|9@Cw;~)utMv>jSG0@@MzHefttapfHQ-b#-)JMn4dZE!RWk=jZ4FKGv%i zmjn#A+Sz&n^uva#($!S!**tf%F&!BnN>_LZ|78=`!~TVEsVEYf0$o4;L!18>WWTUY zPCqVq;uYG5=cffGd^%zjN>?gx0_&A$#?Tdmb#qR>^13}ptNiuLH>q>7qDFeAZqlsZ zPvAkriEY+1J{+xwq&JAa><{hJi!vj>e06l?vEfsI-P=eq!`;~O#QcsU?`l}v+k8sj zbjv?#q*D2t-@R_`uI!%Iev{4|^28E&RUuRXys86pLn=7>4T2ZH{;j1v6Vw3G^h@Go ze*WEi_pFd+h`^YXs_P}?E|zu;CAQ3*aX& z$JX^2ySW)BF?vP~0Yiuo$c9#|+%hFCy*i-V%hD}zGdg|e!aWRL{a$pC0}4AlL_>&TTdGK==+f3>4vef8w7@|pVq`Yy_29c>B@ zw{uJet( zmssw8IkWYe&Q5B6a^S*Uh}`yH(c3xdu9H(`bo4vp6-|GGuR9-BfEky-Cs!HpGko~% zX(K%7r+T8M&A#TkP2<@`RvoJ?Ek7c*wFAHD}RJip1u07Kjx) z1_Wu{Ncc1FQcc6CjTz6l2OqHJ=!hNy84Kzc@}0FzZe>}6gXR%-7cY$8aTp;v2lFJ& zw3>vj2MijZa}!@mY`w3iF?0?2i>4XYXSPTCe=qT}Nt$W1-KN2}yM{guOUAuj?&Q~{ zgoz5D?Y12^>a%EYhh>LEvWCJ)yz77gZ5myEIb)|2t-gAv3gLIr&scxEGzttt;f&J$ z)%TsFQpfc`dXFf3V9M6zEBf8@s=3fVXjp{DNEb(Ay1Uu*O`&azn>TOXrqRS~$4dhX zqcV%akr)UM?^Ko7Po%Z}ypx^hTiaGTnMZ7HP7TqiMY0j?QUXggnF3X0)cNIS=s24L zdfbN-X7uG=v0VlA{)cni{rvf$@;8Vm-ebWR;6hUNH@xsnp*caM6?8LZ_zt};uF0K# z{?Ue&jU&{8Q@uGGF{#M68)0U zV|I3T7W}-&MF*v$Tvq9Ku;K~&@a$bb6w-1%&e_O7nXA9+2zEgx3p%Tyu)d<-emy0# zd|Pr@uJ6eIIwyB#-8H;u7n7VR+vkU-PB&@tyz|-n zk^Q)#5r<8LDoi_^GiuXxZZ*)3G*=5wy2(@+A@F+wag*B;2dO{guh&DqTTE+vjgyQL zN4RNXGwEwL02m0~05yTAdtpe%8g=(+a##owEzlSGfaJ@Qnldt_1veVMGY%L>5cprN zrljw$f>fg`KdYj1R#2u);RBiY7pKaVMtkz0BYz7q<r}nL8Rc(Y`lk1dy>M12z&=lsl3Md1C&45EWzF-~ z$Sm{eAFr#Bj9_tF(br^Co8Q@5&;w4(gr1np(BIhFb2P4Y2-Pk09mdf;v*cX!zJtZE z4p_ryS&xQ<5U7x8NrSbPwmPTbrd)F2Q+S=Zc|xO!v9tu@UkS~X_5xOc=0m5)c&9^b zI4cGnf`CUQ?yotPf_xR;w<*}41mXZ(q5>Yu3uf@dJe!gGy~2_XLLSIO4{(*`v||$I zfqGErEtJB97IqhhcC%))?SBAzNxbdAg*O`^^u5m-l-DQON?`P_?CL!~C-s{&q^f~1 zR3;OFn|5-cUE!G%SKE}fTZU|fBz(%W$T*lX@5uuDzZ&>vuDNxiKxFga=xOiL=?>)2 zYgT(ijczfwP+NslRel|xjg2y>4FW}l&c`=hVfEQm`CSF^4h(}NvWP*Ezdofj;Np{vNaB_ zws_H)iIS9@w$1r|Og}#nGfod;wU46^b4VAieO? zoBH+~XtcPG)%TF*r`85PyC2azkKyis_(DD zIbde+OlRFuGP>h&A?jvw*TdC2_4ohO`J=8Fm&gErL3tt5-sqfrPdOx4z@h{b^`*y} zoy#>G?D1gz@ngqYc58lG+eLq;Xc05n>hze4Z@Km#ADMpW2;-vIxQfU;_s1129zS_9 zktJMMoHKn1W4f~9gG<)f194FbEQbnUSoldjeZK~Uy1gc8d|NqaQ^V|pile3fIsJyN zR9FA*NVp)7KvR)Z1ehwb-Z(@p!NDhAn0LbHWXc5@=!Bk8dzrj~*2FUQ@&5fS2XHE}jC#R!H9{7rgPIss zr{ri21s+3avL7+s9_x7j_9v!aiF2qNNJ&pC$+q14E=<*}`@*_U3 z+D;qqzHv5j4>&gMcSz-V|Mb-iLQ){Hz%p$?lt>{V@>C^!JTy=BV9E);m%sOrnBI<7 zhtV7S;jrL+Z|z=aw-B}GKZq)8zF|dHnIqe+WlJ`a6&!W z7Z~48KGlEy)1~dN#mJxf&p(Hn@jU+LKU3uM|IdGVs}I|(Fz_CSNxE69Rvp3-X0M7} z_1I&@%9Vj{EO3n7VDi+me}9Cp%fHP4e?R*{12y*pA3Cj1X*#hDb1{Q%&iwUfB52l2 zUB>j_G%xy~a{hn*YJ(|zdXsf26ui{-o;F^`WY8ptx2MgoPn6RA^Hy);zl-?nhg!>f zG-%TZ{!4XiOU;JAw`)!f+p>ET`Ks1PV{ zKJ;GG?!fO!BD4!#ySUB7HWKlM9P<*ly5vX!&CB2ew9y^&hfO-0G|cLe##njP|NfKc zFKRokRT(&s4tuvwrnE0yo-7bjQeRl@$*@P7Ad!50jQb?05uGCeb)sOGt6dBWNZn_{ zCkADx-h$UqQgCB@`0`~x;K!#-C#0`5x@Bv?-p3GnCWqvW>@!cwTrQOCz*kZ&f;y55lU(fg-S9Di}-}vrdM6)KxE{U z%;6POG&FlhU8P@Q{vd06D>zI&G0$);iu^1(W+lpF0k|*)NEs)Sbe&OG(D%ydS3=d! zMeFzLUd(JG;U8#Sr)p&swUe0q*&0rZ4PF&3Qf} z1Ta1Dw#FfBL9)@wh?fqh*YPKXS@m_DWJEMG8eJ&p)cLRM6n$I>+yP4jAp4(RUK{su};^TmJ#S{byfpK=mT?+(MjBW`%5puxmkgHsy~$yx&<859)RE zz^^MI(xJb~gn7P~uk`P>xaowa$D-0^0YOQBQ6X4yJ=f9h9>{%I|JdYe{&FXsi z9bXe$bUA6lqEIfZoP4@RGQoh^+gFp7oZUnrN0N1dN41BIa`wM?c+a|$i}ebH%tqrd zutLd-PysrB*XW3+keyUdV#PsY@ul4uV-sLAg@O`S67%1wa-uz?>TZktna3kiYRKYs zi)c{KA4(i}prW2vDs#H;3_AWqmdxL0Mzm;mz#u>D%(=0)$_h%r!Phvkmlu7E7cahq zQ`gy_<}PAv5Q)mo#0`i-chQauU3%Ar_0?_*lP!Uu!+-Qk83D2ca{S`O@-`hZG7b0h zs-Sz6ZD*|JjR^Ss3#b(&Qwkvw*mG_7k9#b#s)2G@KI%4DZQ<$I{l=}jPySF7+2zJy zzp~T^bklrLneI;a-Jv3P)cK`&&7r4mNB?O;!`lR$HNL(!s~+;vk_M!)o*xoexj!*h z9+r4f?8Ch|(RdvKp)P|E6-qzCaYLWJeZAlTTr__u#r`*qbH2k*?O|Cece{7%_VTbs zg|1`O?H9Rg=xP>tG<4=5zr^Jt+I93)X1;4{J{>of2Z<0&aQ5k!XER)oEwQ9HssnQ8Bl@Jbm1>io+^a7r|T zz8U~&;v3-PJ%AWOG;bo?K4?z`WU3B}hEUJNWjX2~sqlU_EuzX0-3}Hn?wp{EO(<_& zkg2WF$ztgu6uYLs)Sgq2a$MuadC=w2*3-B-*>SPC!skm$z1UaI;VTrS0Qi#-7-)$< zqCDb|eHjrIhIrZ;23Le&E>4GgHj9tGKGGw7(BJ)o?%Ua`T#>BU;XUU5h(U>e;Jn`r zQG$!qfg|zb=Icg@d750zn?iGayuGDVS!6NaFukDu+?Y+KVPqqSreEaMv||n7%lgdn zS?Cd#A$K)SkNEFwqd=9PY|Vy1Up4sVt&_}V1xP0m66^OY_w>+@U8OQL{Zn8DR2VGc z$?k`ht{ynF@x!LMD!BTXdW>}B3OFo6e9f1Zc}74UVy=+=0`wk7Vi_F*=z#8edX096 zA~#=M5TZ_{2)Ylx;}h~sXoGii;TF?2?O7*XFZ*%E_7NIiqfFk|8ydE0BqmVsW{I)k z>JXv<6lnY^9W6kSMzUQ{iT!q(?JCRTckqZ|)TTkA2V zN!L^=xcH_^ybzg|&{$8r=P-8-6m=YO`WIv16h$j9iY7FKGL?=6Fi4&~Bvi+HQ6oX9 z8@=DrJH}|(iivYm`|IZT2YRXKj&R#$dN^@=#i@-kz71|%e?E6XV&0e$9rgj{^*sJW z_+ro6!RC>%ys|4Howt2_*jyru?FynQ_*UZoabOVhq6EJda#I0NyJNY+E%oKvAcg5w z)8-1)y1rWm_UY4jSI-G;8r`{fFR=R#U@6>udzfnFuRC(>n`R2(voql`W?aMwLUo#W zhzjHiQW*Lhjg$~B&uqGWV5BaD8M=x#v-r~!i3%`u`v_a3h7&`O&9!iC?^!2poU;0l|s zfz%fwyki|vf?|zNvp@GA)fT}Co-5CKy;F_2bJBU#j)63=oq!vgp_vi$6n2t5T!DO? z8$diVOr0z60X)#bnhffaBYX%eZXT-c*2RB?Lw=yC!W0_*IGr;=UAr$Z%Ikj>buEY- zK+c0I4SjdJsI}(jKfEg=T1N&~@n90Dh;K(ALP2M|>ZQMXVh9+r=Sbff3*V;>_bK|9EolsP;#tcs6{eb^$+TSU|4f<8 z>UA}^A`5k;vo)NF&Hvy`xPYg+Ti*ON$Ljd#MZrT_mTmJj9$47+bekNtdmfOBW?#lc z9&p`N(Y4DJ&Vmo%H$1iZ?9O`9qo}79>)`1R9U2%gyOlUzd3Afy8&fFAVXI(Wh#?7C z)Dr);c7n?zTj_N?!0A~edF&33jsynX(VqK$?%{d)gnx<~g(%HXgY_gP$W_MpgoCi> zQNfPKFI+eb*2sfy05p~IbDyWY$B2`POTdAGd~r|jBr7T4+GV9kL-ieODe*)GrmNx1 z;)GaE)AW;EAlobn*56(Jlz-c;B4skLpy`2s#Zic7LjTw-E&1oVF=T2N|Ze@3}sY)gw)?dZ9&_V#_1zPDFf9F0M`sesEe`;yz) zx>Ym~qZJjo=*6DqQuaI?>8nK$3@x@lv2KZVB6}yph9B4UVnhEP(tDm!HEu7%J20Z1p45~wi+oq9{2vz(hQBkjrPI#B|;lt&U`{oV~k#^5& zdT_aojrwu#aJMnLz))G>^9MdwtULCM-k(FNllAt=r)T&UO^?7$CAc*|0uhXg9Z&WD zLu7a>wo({3iEDb zN3S($sXDSH(v`|tx(i?0Pnutm^1mw%U;b>`ZSms8C>X{jtv)8WE~m$Rm>G#O!ooyT z`g@O)|9hvDJ0x`S>jRJN3dfDgYhMuVFwMu=aZI+|w1f42=FnTE=uaVm4D9SiH=5Xg zMAmLf7_(0w-;sqR*Q;BC*rF6*bm&cVUK6aVa;?BW%<1M)?dL&l;_|I#p4`)01#S@5>4 z1K09>3ADZFRMi~SxaP~M?GX<3gO^6^0Zs_~PE?zo1mAIvh+%i~+Orq=lrsNVLXME} z3N{})5)4gdJ7v^Cz)a9OnTHk7jjk8+nQ zoOy2&t-q~DYSaId-f&-iS*-M&2OeD>xC-oW*7pT$HKCGe1Fg^BmNo%cY!qvy;p(<^ zg%YCv|67zu^Pzv>oL_&B$pdLV5!+0%x$22zA`XWzh|L4aZOMxW&0AvhYhgexQTj~% z=621{q@dN(x6>2z<^ornytn**#x;@6ydctUr~oYhjxalN^&?^imu!fjvDN!$!_RYf z4nqYOII^+d|LhZwI#~TW>^snCCNTc4O{Y#x|4k!JebGxv@%j0A8E@ovOY75${~Nc{ zARO%D4#1W(_M2)-Jc-}UnWpXF^g6pVc$_$Vvr6Mzwl5;4TJvNjlZt|S8LP^A zQ&jHOYu=SVfBFv$>#nNWg7-lvfM4ut_swJKqca>LbJ(Z)^eY7U34sR|4h%ob17JAifp&Stwa?KhfpjF_T4_w9l52nc z-wW(tfz;0EUy3{`CMz1<1HDo~Q~JGIS2~g+M2d1;01R|e1<-5N{g}Uh))P8mm;Z;hH;=2a z?f(9Eh|Kd4A;}bq%*h-oW6G>Zy2udRrI6uy^0+h42RGvlU{ z7nii%(7pmdy|DUdo~O4x?C|xegDVsjXa7;(>bUU1NyI>SKhc)QUDt!jbcM^34RZd* z+yAw;mA$C1#iKfx5h4&slj^}y8ZaPUOTQc}SSjzJ>$HIbzJ77W|614@6+O|HTDHHw z>B@`iegsXnEZ*<3XnJ!UYnnoR6LKyyRlPEMsU^eT zYWoW?`YCACI7KEX`Z_Wxc*x=tAgipHG}J0{~HlRTjH5VDX z3#IW!7n{BANsmso>(b86rRss8_OVTqV=oprYOy2@r$Rg>8S%^LknX-V!8t#=&wo*g zQ|-xqk)ft#*RLuLJ@JypOGf)8r=-Xdhrb(UW@eGIdZ>xjC~IWTX5A{fsFf1RrsWWp zLu%e`-=jCj0=9ja(7%;Vb|{GkVG&gqY7z;Q0#<^L3E2R9p#N!cdZQ;{R+K`aY!-F8j}2wm74w zgLd55-MucxFLNR5JhFldGmDl(Xb`T&$(J^Y_iN5fcM zWQs8D2W=x$`wUP;+7VF!vzR z#;!?Lg0dvye-0>)2Q{NjW;T0O@=OIBk3H!Thj)eajlNx!wzX;S3I9Ywh*Ba2M8-lJ zwFkTdnYy&9I4dYb{iSb8+nA+;qkFYz5qg;<^!9U26PaG=NyN*SL6?h)W4Ho;$r3tlv?YYh&K-#;Yp50lp zilWN~?o&FMN?ft;=X&YyZVnA< zt?C)ejN+gU>{748c&{#R(tH<2RT&4p&~T{bvo^7I-@Xvgl~$ZPcdo*{p0Rh#-dE7j zxOyrs6*yf`N}~Tlur{j=P;XbyTGO;`+sX>%Y~G7SPPl%8A1~}{ zWZoiC%%3u)*7ORd*5{rQm=vOO+^OeO94$FGiOQ<=>(`%-RoyyJv@P)1_AYZ8!4zEU z^i;|le5{nmVXajBybEe93N)fgLH^hq#UTn%YpowNe@6vXbUO=C8xa)`!k!F(zPcsv zYCY#nZ>It->>=TTf)wRJs>jTV3c^J+H*LCc zt7ZM^JBE&^X?^5EDi-?mnKL3GBE}ARN;L)MQW|42kd67`^;ybtq&0vIwF+RN?j^>a z9`TF-R-{TGK}!I*JO1#nRjw16w*HIMlIawnfKXdXx+cyQUpx|9?$wJQG}$9sdmbQi8;k# zM`*ou${BI;r7#6~6A=VGJqL7HR#$|p7(OI`tZ+owGTfXru)=+Pliew2obA(8n4Nv~ z{SMZC$E=1!QIpQh`*Hr_26Mxe1Z$5T58CnnL)<&6@C_Yc?B$gJ)1o~_r2VM)f$1Qe zk+hBhMsmja4)%&d&{t#>Ai={_v0p!H9)YYoGZIBQ(UNdF3h z_5GRxj8eQTyKdcJA8idTf6TUpB|hvck2A8{1^9oY8u z+s`&_$a4+8*izUsE6)AwPmm1i-u<}o+0JdrsT`WasR z@@MUn@dcaA>toNlyl}qZ@9k}B?U0lY3VZc3xmrK3-uCV$Iu>8;N>~4p#KbY_^nh5= z&#SM|Uc1;M_-xm?d)C9fzgeJHdw3&r1-W3b9-w2kH4=betpW@kYr!l6;VVc-aX2;5&- zEJ?iMn%H@lKXVTTtj`$I0hittE`exSgGH0l3gGW&B9+5F0S3GQfxH_rIloUJ5ki zkQlt+M!!9g*9?JL;RN$@`4+nltoQyvvk$F6`aKco-Pcd4FpOXHiHgGv7cRU3&wO@Py*AGYu{R}vS|6MO3N zu`(l|X6}8(wy3GZ7T~x6p~4^XRl}IU4e+cYf-ZxHLyiZbZHH(zwX?o@zEYJSlpQ|a zZ`c<0T_zk9i7|wpE2et<`2Emlghi4^d(P`;BdgVJta<=J&(WQvT%vGJiOk@7g#yPr z=Mn7*chj@-CU0+(pC-Dx#eo|2>UlFG#U%~rM8ReK6-ubEZbLR}tY>cpaZ6Pxw2ykY z2-p#2$;kxG^2@$D6IQ79J6G@R-ElfacB05UhPgOC#gFB|AJ9R&6N|i@DPG8lh)|SJ z(CR0Bgt9gn;st|E-TAllrSE$PQ3AW!s+}jUAub`IEGVsLR-Z26X9v)8@{`LX#780h zgUui8talQ>&vuX+J4@t=HSgPe%j!1|Th*$7zH&7N;JOoxO0Nz;$1_%NdOmk4E!6ex zd`)#!G(Wn@nyH`u08H)S8kjEf<`!Agi)A9ZH*Z(r%^523x; zoA5-Gzl$UXVNn=LCDP24uP#8>pWW3 z6k(4Q?%w%nb;0;&lBA-Ea_3q!6dwG@(C29(WXVJvvzNc5=&|h#+Ql3~bs&5vQpefC`}x%6;J3u{i7R%Tp_Rl&hJI{ls=k1`7= zf#SbHA?rre5HHFrR62;ajbj^6j6q(f8jKBMe9_TRNc*Wwzn0U9v}0+-X}q<7W7K`+ ztkV};S|M002VvaA0Pn$7m1UKA(OQ7?nf>(r8W`ysTAWMuKGA{BY$8L_lX^y5N3?3* zye!4#T{>tdg|*32!Er$}#7gy4@)sdZNQr`)rSwfoDv(=_ z-APUNHo6`{hLRo&yEfwaY!C}`2iXL2DvC|)`WLWB%maKrKDKCJ4uh; zFTg+wJvu&N#?qF?P$#^bG!J`L@ljfzs~N;D>V2wdYm|b64g%bcH4)Wl;oiZUiH{-@ z7yw(E*=rSm8{4NYp)Hsva(UshAD`O5rY)L-t+fV&IVq z+V6dq>}VNkP`OH#`(5h~i>@=-=1o1BDieIQFgJ1$<_k?<3;R!dHqSdTkvjG>kE9hL z3u^dAynAPHJn_x6C9`%+W)uu)t4>WF3jV|g!gp4@?_@ZNLu5IAXC`NZ(sw*Ze5^!5 zfg@I^dQvRdX8_VfH$s>}Gh1ks0zlgTVFIOj#n*_F1xKi<+OlV5 zl%fn&62Xrwa1Vt$_HVjNG5FXA6L#?-|c$P73s_ZVe1FSaPG$!Lm2E@ z2XC+U5~tIPpoKtqIbL=jN1kTj%q0uSiXiKmP)e7_M^d<73TY6N#u=-0tq&)RX;z~= zT|E)^(|NK&@fTo=G~^=wvZ0Yv95(mfEwV~ck&?n0lvTju%T$UgeD9|8QJTqs5d6&&s>!lL!4Avj9mrS z^L!ve#1$|cCN!>ykcV#;%v2#hLEzKY@JNgVzu@7A-cBu*e&}Qi4Uew#@@AojI=MkG zbYzD%V`9#4+Y?2cp-@2kwdx+yia9K2RZI>O!uL$87V-9?mg3aPoQ!_5$M(87&-Ir6 zuM)wJ;anU!w(SCVWIKR++7xx*=)qSL&apG7ld85>Hx<=w{uzN-}H^R6$T4 zRNzeu5cP-pAu;mS)}yN^M~-99n-b^?BL{69`4vp&B`8oyA6=2jI_;dV z=z8qqWlY%JJu+kot>Q_Tga>CA8IVSg-0&3DkgQL;Y3?3? z^ecIRgazcj-fs%|%zZHGM0r-612Ea@q@6;1y|dse)J~ToN=j82mk*^zklz3mj}2L z06ytGgJx3NxkLTKAV?Cy(|y#j`N73wQH&K`ILKYl-z)k2IYLTDl%V}sj-8SQMhmbOO^z$0qZhmNig7`|6mq!& z23FnFnf^UpjYLOIth(#BPilG1TkWQEODe#W5Y}FMO}fH-k%ONwAYIQmY6ava{4n?*d=6(idz3bcz1!#6)B#-2Y(a*MB0pK`bh!QR* zdJm*poq40_`+1IzeR%Q`&QY_$%#P0(6qYF?QOp`APVrI9r_Rw4wBg` zhib7oh>c|MCzstjGNO-3$Z|`k8vfqI+t09BSBUj4Um@n-z&A9FIvV!DE^=~fH&$OC z$FL@d8j>POn-a-U9KjN#^tC+GKn&^R?yxY{ul1wq(?E0!NI@>Uisz>~B4buYJudyh z#?%d|Gl7V!)A0mw9$u?J%1ThFWUPT+4-2&ngi}*aUp<$stVS+X9CiD#1Szs(G3Teb zV4kbdTT1=HH#O)malUXqC%>ID%L^97hz=NFbTs`+#O+!l&oOD1V(1>#DrG;F<*Jab>TOilVMZJo|Ax%GW^2a$E#W0$(+OfXa2H5PkcGigs^a_S~HHJ zrSNZQ7k~BqyUCRL0t2lSWScTg=0cnE0p4p`(*ciRseKBL@4Y(vn(M6>n2B;)Y3Gjv z*WoB;J~*ld-ggBM(UFnVkqrojE5M&LxlhOXxu_|EaJwl zmRHhf-U*I8FI2iiV|?Cs!yhC>Bc`|%JUA-@D_*?{Gh8yvtlJ}l4jqoqz3{S6$~fJ` z)GrI$k67GrNW>7!x00lpm@JN_(-f1VGn-kGO3i1RbHj6V`V|HxBACcdwkYyWTlqq#HxXqJ$9$+c!rnNK+9gm$5`0dsYOA#71v9GLxNTwW;Rw_(C&4dU~H2~-th>eh5S~gWbuYo33fyz6< zUE@i%{Az^5Ty%D-XH{yz2CdaViLake*fC)3c?v?sdUIVj1|HeDcRg=a+P&U&dEOW& zjEj4h8Q0D`=l8XrNYO$~Az?kBO@#%&;wb9!LIp+FWS^nyy3o)T^w>+mPs3yHhjQCg zkyJS#-&Jm|;2CiMv?xH97imMiD=1vXcQz-=Oc`_3Wog?Uv*4kK$49d{=uy(>ZpS1& z0yK4Nf2FBiCmM;gjGe0yh@n#IxpQX&+?p4z`uW*~-KzVv+Em|20piEZAuTO(tiUY; zZBhosykq)X>pbHfA#Qhrp$iHZUvat9Ynn?v@oop#wY+}g#@*A!B10b^c<=0tUW&yV z-^!SC$cb{Sa8lX`kQx7FZ@-FgC<_@CA)Y6GgqR!d=w$7-_042DT*`wfWEKmc3XV1x zH#KR}-qTM3*Kw+s!AIg)Vjk z?|_tuhmc0`kRts_d{rLVu6|wvOsp~=tY6N;B(4L9b-b|fzdG8CAqKYrJf*0Ffp-4! zt&{N5XbqS)Va6P;5!Qexsop+d*@7@jn_!XCZvqqH!-T6(NY1D!ifen&RRhxDBUITUhfnI=VB0JaMbFx(rPyTdAHqf&6~tv&9ccd6!@AQ>~1E*67wv zE@HdYCrW{g-j}j69CMkbXqd<-R~wsp-50izTSYoay5iwUUj!LLPjfs@dG7-ySy*sg z!v#N03N0loVZA!0kwXy0*8`$vKz$Y3JQTf2m?ap*%h^3VW-mQBLTbS|H^QAyfB88- zUxfbzdE*vETOkbEJ0SE*?(Ri{E!ahAyOGMfVDA9jw+TwEC|wJ%igT6R0htmB;SmF2 zDp9KscY|p?gPdqUSIP#O8-=h57x^MpKKW(eC}AMskRN$xVl}Mrp$Fmq>Bh7pLOu{(}UhF3CG~%0@%?HN;#NCdb zKehA#0m7QCSM|5{*71@5RVxEx1{vbwZTif7mS;bI?pc4o3{`Imy%`<5> zL?EFuI$K6Vtz$(+VVpB19mj&=uy!;**Ecej6K*TsEOE((7CxrZ_zDR~rWRvkHeD+W zwWOEI6q+XI#yKxTO~FXiZK}o7J15mY2rSTN`y(_%Q)4@VW*orsWiy4CsFNItT@cm- z^OFU0^$_{7wD4iqweSCfGGp6w~TRwcecaehg&)#M| zi(P@18*4?+Gahoiom0IjfrjsUc@A!V31CV)mnkb@YE5;d^K}2bWv*CssAF9y{MQ5G zkW_{Gl$wG%`zG^;sb1b;r@_a-Q!git=Eh5du7;?VNS-Ne&;gCi8VAMYr{TZ)G&j#T zDpz{?*^3W9x@v6dJ=<2MR>0w__cNjf86Nd8B$@Gi<*}>sv~ttW&v-SLJ0O3ny-U^M ztl14PTngfpIx>5{SY)+%dlq-E*;pzWCW{BnZ!>djxfyQ{t0^j&wx`##QgI z6Li6?z`qC?3VB3AGr&q713Yszd1l?Zp$L3~GvwpbdSZ+*0>a*)3Eo9ATSD1^uP0AU zZ;0}#8usbEcB(_>mxG}OV>0&Fps`U@27G53%D@g${^b;v5$MlDDprO|YOG#4Be%NG zt)F0-a&4a8=R8&_^*YvBcXluP_l|l^iu*7sP>BdS-X)G z461e0J^h!p&Eq3Fe#&YdaIUbjPxa{0!#1H)V7ks%d;fw@yHFNCdj8c35`kMSGq7LJS`n2>daO0j2^^@E2)kVOeg zzbBw*<%Y_ZeV=Rmo9s5o6qg60K>V@0UVByV`$n@`g(B5RzK#!6BdnB$A(8)u2feGu z(x|wXPf^VWp_VF%gj58ffdX5><`7d!tBA5Pm2|$SU^o*NCR}xH-t%08)PX3m?CS^C z!7ETlX4a5y2(LX~LI$KedFdJ=ugrYO|F!>lLd;94&a-*fikG52Dzlh~MpShK=LU`$ z7Z|a^v@Vh+5N;0&qZhWnj5&=`uC?hRqNAQfN9>%QsAu1kLj761=F!u_Px<>5>~Uvf#@T(W7&JBZl{22MQ!Zjp_v=nk1|BhUbX<_a%>f_ToiIR+w_tew~05cAwOHX6vNH z`}ghe|5zv=F=BJVkHzcXHcf6u;hBKUv54JVcAe*7e{BuD0zbq8LJgbCzDREJTZCaF z(o9f@)uuHH4%K=RI&+JkRLg;x;m_5o=m@SPnXz(y6l^1jVWec&aNw|@@kC6oo}4{( zx}m0~!|6#^gOHQ3gWHw4kj@GwB+%tAFA7t?g&a&PH|*_5^O3Tqo*w*IK9A(;!nJE= zSuM{}9tQb9y|SSR!xetNtc=+|GbpYpL{{wG7{r;(cb>!cHD!tM#M7_Hm`UjmZ8=H0x2M*3HHlx)tY`HFKVBacX6kZg;Hb$W>*x&G z-k@Hu7%!`2AW4xMiwaQci&*5?g?*2Em6~z<#0eSRDjaZ%c%>+$DcnJa7^@`pu*qp4 zA;NYdixFM4f~5aj+5F^~_#UcH{`seMdnA3Nd$uW|v5Y|gb>NJGu!#yC@po9<%PuH& za#IPEbcFdP3fGVUB@~q2b_lapRU>{fH&lBwY*KTJjMDC8c!WYP(h|VS7vD5Rhj0b4 zw6Dpuf2_Yz(@rRl{Q0tSZr*{uLP1F2U0Od*kF@hrYD7TN0|8r;Mgp*673%1vls946 zUIh=Zku)3cu3Lzc7FH3KLX?=Lm5jo&w{(h<&`|!k|GC-fS0!6ab%hrvQ4l0vDHA=E zjh}*?$kld#m?fiDc@$*??iFn!f~#`T6ZT9^wF64TomrVF~$v}H?E`<*QGIt0W6k^EB%Gji!!`xh*qLosuEkENZ3^9`>A@O3}w z8Jz?N5^L3%LzWMVDgi}1!QeBvG7)d$Sx3_Cj8f5z230KlN8dT1GgQ6H$cF{rQ%BAv z&>U_uC6O&bZ26bc&zgD>hxj&Pe|KH*dTYWDlV;0RLN9mD#7X_}0-Xw!j78o-drNH> zJuD4$A`wCY)rFK-M>=Jw(PaTRPW>>@suB%x(=y+N9eeL^X~2Y9a%m=GQ&pW>K1y3eY&=)%+$9Bz0>y0i&kzlKuzQ=ywljOZSQup zQ9e7_u;E4b9039^@El?Vi6RAf1*bVDoQOZML<9-5)nA0FD|_OmXRVe(Icr!FN<@^=9dPIgwYJug$+ zx`&O8lnU&qJa_~LhLX*3n4@N}wYSyg3{gbk?yoPP;5-V@da`8UPU-rGFFIV&h3T1BKW^975JEN8(K5I+@~%FX{Tp$^wh=a$5Q8gyi2o6Gx}@;l3xY!}}v_PmEy;!4?%ok+lEVYf5v5zCcy$ zggz!lG7S?0b^t}wGOC`|@hZR3VE(y4i|2{?9ot@#^eXXO$#%ASZRL`R6EQ%T$a-BezoD*@v(UTh|*UtJ%hbx!-fG^rAC!POMkmZ@FQ^9W2U#W;al}`-FjPLck9hg(0Vp z?4b;~yY-$u-WB#LHckE->o8$Q%QBbL`!ydzVkqZKyxicbysw%4UvphH?mrOrTx8&s z`*ey6CZqepxAmwhuM-I#A_j5P(ndRee424U3U%+=RN2x?=ZR1GQseAH)}-Mvk8{_81nA~5l4f1APGL7r7m&-&w4 zVPnndHT}Jds^;#`pA)H9RBPbQjLX+*hK&ebvpi7s2m=EVt&!VQ7v`D?6z9h`mK-*m zT1@zW_+I6Dwf*(*yYyJCO@lMBN;9<#+9+f%<*|)(RB80E)wK%Uir#e*>>Q;`iSLIF z-H@=5A`e~i&8nBO@TZKd%n&em4KTQ=GX^dGz^$mi=+Ii8Db2 zh1{*-F?>?m#S_ZU)nPGyS()!|PbqjIP9k+R z`Zz5g15Jv;8|8d;Fx?AOkMpQsUZ8o5Ea6P0f>Q}wh-+3o>E8}-H@g?wiaHHF@w1eL zFzW0hACZLZqXyS?{)=_`2F$aQm(i3kEdwZXuq$!b1MzRwC}Y!YR5wS9Q9dZ~)cVE# zM8bmWFC@`&s-a4xeVTBfN7I={_vo0%M+ov18Th&Bvr$JMn2yppO9y%M<{xuDMe&D_wr^+!bclf6V zXiYc61*`yLf#6dovsgxe0@pLVK8oA3dSRwpqpOk8nzZ*{4mD4%-KUyWt^vF%$3%U$ zr(wfyxAOmQ;&Om1l5kQ5kljfBNf7Ou#g>g<<6}DU&kUt)o|G`rX(Jx5B~>)=7h4)Q zgiZoEe?3*oOaSi(QL`FAeG&?ja;Hgdjx6y%a&vsmKXY^6GOjP3|It$MOCF9!lKKzYa7+9jb>EB|uSKD!L?2w!^$RB5AM1bYOOtbcKla6@}Bu z@j}DeW;out{#X}qL@&j>n#DC4O-OA-dFXz2$*H_4^3B=K%C3oZwOst>P3-e#lMwrP z&_dp!SnaBA*99Mg|ns3FFt8_xQcQRqHlZ76IV<_38HLNZ0r-tNN;8 z8>ROiBK-Q(%ZO}58G;2Ds?Z6Hc-;JE&6+tp4oJQF6EJu6nO<}mm!D%;Wp}_&etCt6 zj?bOpb0|7)Ot##RYZ=w*l@?j}sP1);NI@=Pk8-t55(d9172xGnE~cb-=@fhW+O6GX zR20lkn*D4dZ}n6C)T7pwyV;1k&AG8zxvIrIV12f;;^wN}*)hbyb-Hy{TK>Rf6W)$K z?&d>xc~habC3WlylX+i2QQotD!Y(JW>5sCZ+zQg{(;HM!nxX2oEgi1rZ%z4Yz`%hA z8`2v$!eNUa4K1YzqMU>Pg*vs1XB0v~Y6n946x|Kd49bFpNYukJy&Ai@6AW&cI4&n}!u}=^owU5y zyfJstso!zVN}iW@5!c`;bmaK>cy}M4R*CEeDtY>|F-T~;Y zjeQD*M-4NRK2{Wh#PkY_ym4cLI^`k#RiL|{dlp@7g#>vtt#T~FYP}U!Bb!=^PsHF} z1m_AFOH4LVokRkT&9mpvgFYvPpNR3AVuS^WQF`a(J^MbC_KzC2)l|3e?eV1BjI$G! z8&RDkrg22gfkQSXYyQ@gmxUKe+pXx9!!9~Oz?z}SA^#Z8W{Iet26QSymWsV$o% zdx9puc|GmnXcT(A&3%$LW&OW*f54>nE}Fq;6Yx+wNLyl-;m@&qD}HB8mef??Caf9x zxM^~^-(G&>ef6HrB+5lA6qeTo@aDC2U<-{Ot1QezWWvh>i7@0s6V1H7y?ZOLXE0{DjDaZ_7%e&J>jQqUTs`zj7bi*}c*-U}6xwf&Y*-keS-6jIMxmiz=#+ z=0Gj!hoIZKz0~&M0Ke898o2o~b8C222>e`Yw^heo7gw1-N;y&K!LkNxmcEF}?D=MO zY~Z;;{Yww%A7aiVQBs}Eg@|%!`%XW9s5NPY|Ha=`&QI%=NXwUXvr)U%a}832znHQ* zZP-`)UFOJU^yl+cHsznvxGI56)t={1pXvltf5c(bOH{p>sw2vuQ%p{m6=~*GWgNeh z?CcObd-joEun5gBj%RUr)GAxAk~c9O{f8_1K4i!g9b*3V#|r|q_j&l8HfWk##%R>* zGRRd?TMd!QCPpxGAu*BvcjXo3Xb?uz%*MwicqzGPpVm3KICX8bte0z(o=d*`sD&~L zV=z@0XH`a(1cYh7UDIz$U;MKSx{<MpR@`$QV(`PtJ^upde(nD2T(1jR(HQ(-ff{9(q@r>U6^ENxBvcM z$ZJV;ftvjquEb&KVx45hB0YnTRqGV2+sbt-`JW)klr#UhO4X`fkSQsXl0RjVoLHUt zGfR0?dnz4aigcHpyITv@q}gXwgiU3tzcf3%`tU)u20{IPt$}%q!vpgiKEQMf#Q6~L zC7s&MA_x-`dYrY*p0FDrl*E0~JqF3`B9Q;DMCm`$i~>rV)LO!Z&uWY|o%k$1(B9^! zs?>H>lB`j^Q!vrk&hgqj^=aN|qLi|6V7p`Bk z{m85kWNHQNBE-$Rs6fFS4~&M_YG+aX8`oCy6_KeArdNECc|`DndDx-V;4!$ zwo+yJyzOoLe{J*kiinuAFA3`T21q=U$;w3iPkPeW)ojgD#Oh|{2dI(?t8Y0Sq@pNW z_MGpu<-;aQ5fy9<5r*m%QI!Rhe~J#`W2?hdhufxut(U-m54;~ZA@GIP{2~)5-%&@e zwt&!dh8UF>R#E&CHxTmQqd!-lH{+xK(W>1P3MTd2t2b}b){;o_k*J{j&unU-XLh47Dj28tz-ER&{?v z(0QN=&I_MxWHoM{v5x4(0-XrVJFTZVTU)Giq+&|ui7)@^ZSXuZgT@^G-uSi5@l z9ou@3{#|38M}G?Ftthcl5~0>xZKLq)fT5w8wze|fF+fqO_q=(>66&cCNAnfQn`O)L zvbYeW-lf$OxRq+6eJ2{g^x*7x-;I!LB`ttxX;hZE#)#!O()Z)?`QB*hEkI6i--u7D zEu?ztI)=6OPn zSNKg$eKIF?tBTjuuWK8+*@u7)!u^^wD5vn%qm{Oml(6k@a3P>ZtGr+uL^$hf0N+$_TBAZSJ4c`m-+kRC#06s17!)Sf$E<2@|yVdUP0_%uQM;g2p~r zljh;kbl8C@Fp-0Tg8>FHggMDm|FzkiY%;n#y{bl3n#cVZ4@`}}a>WiWLM`b27^~K6 z(12BQKAvC=+sy~sqj#Uh)^6CB4#+a^n z=0l0XjKbM+LifcVbf3?QHcz90B9I#sk$}h}U!k)~S2z8ah?GecL5VCN%Cds5VT7xl z^B-p1t(zu&FM8@{X-Jg8ZA<~UNQ&?*BSWDO&LdPjHtSqAmQuDN)Uf=m8S8rnW}aEl zO|#~iusX-*yL^vyijRQV=b-|;0vBmo&YtA0l~k`@%2Lw=G_~2pKKbpe-1esAc7@YO zTjC{JqDM~}525Hg`X})*G`Kd~#^^0N3IvFtokm?T^YQ8G>{255+G!ynAtJ!ckeA*J zHaHy%mbjgc2s-`NN<$#_PUK>R@{imOs`ZDYLhS1N^>wq(%|j354o>$BsC%n}sj)co zDc>vkaI{2vh{DG9p`ou_;HU{gv)#Y8@hrA;H_qCEc~59iL@i7TfdB$y&Ms_AsO>5F zAU#*AkXev35u62tya+yVTX^rJ=ClE?8v1MVH1|yWxp`VHGirF@C7A}UtZw)_TDZ}z zKXiOXIk=1M+O>Py8G!2QoB_!IAN#1J8m(2Cf~(s#4gYopIZkB)U^W8Rqxul+BImCX z_1WH})qoCxhRl+zL{+p_<5f8hLxL)kIs@Xxj<7#6CcxdOuAIYGt^*2Og+9_&E9&g*uR2)72*myISEK%RSM^-Sw+Q) z=D)#_EuB1>k^)!xLF}?#_*gHVD|GhSigt@~CkVnKunCjUMe>wk6sG^J!~rZ;PQlMz zk``keu}tH8+>42|jz7*ayg{@>&ct-I@DEiE9XRxpmculH1Ip@c$l$E-g7shTl5v!+FAM9iaNbVSj|tEa*yk}r>$ zU;2e}iQOUUN>x=%ql8Ptzb?NuFt62OM$4eY-fY1V*k?e@Bq?0j9suA?ZyI*S8iEUXeXPYXXyezSeK=~5ekY=7e-H>4! z$^=K=Dn4FoW0=z)koYv~jI*$c+`CNd`t-?9N>PGxG>Yw6A1)&b0H|Hk-Zg8DH_EPxuE$1m~ zF~O~|s5<|*G7L!VAT-ZpCM+qe)DMZR2m{ZYE2CQJobrDZ+ANu58(mXQEEQ9kcPC?0 zp#eyLsPLxYoW1%m&*W2`1~VG0jGZ{reqz*|210vmseGP>3%P?z@D=2(Yn$jmv469r zCv$fQ5M^A_T$CsrZPNkbGZ0G{h=XSm`oTBXw@pt^Pgl4@lP*25Z^&zhab>k)E028A zWmZ$6{_RzI7t@+{Hz-&hFia@ew63DcKxNs6ecx+R!DUW&U{SbOt1%m*4M2*{yz>6M zzclvjqwA;H;;$oCl-Kq>5$d3MwD?HXD63Dk3KnP?*10u%WF=}0;j|9|`1XICORE6I zz)C_}!Y+S#?A~opeyo?(H^Laz2%n%H{j$s9>4t3qxw9iAld)iAMIzHGbontfz9A~O zp0%39YB~d7nR)e{@}Z2vAlNW}d5yMDEyp(3CCTzOVc9In}&kXV=iW1{ikfcp{{=BFWt3ihGSQk)C@IDgkXo<-AEzL z1RjF`;^X#*#V~)K_KfgZhUW=yo{F|2z0&77>F2t|6lPYG#zdqRs;4bOnjD$pdNS0S z8|m=1Y4YY;y|Z`K&HQ3{AiZqP2+gLbc~B)+g{MoXbiwofO&P=n?}oxp+<93<;c#GN zJ2FOdw z)+M;Q`*GIHnM}sx_bmKnK#T8|gU1Zs^sn=_cDA!Cat`x8{0BjqLakuzy#_AD^T zq^zz=(cQ6#I83T`V*z3ke}M9|b}Pmn`fL9?r_Gr&y*RUlVH?^rh_u$G(G<~9>RI3< z#l=N)l*rBZh7=B`coY`x{)a!?b$Yk*B>nsYOsI7gC@$BtWzLPTq-Yl+0J2oFq;zx` zPx<%grMy#+VHS5$)75K5GO4Fxzf{lp!xjm!qg?TyfBdKY{?7qbN_iY^1ShyQjXsoL zH$tSO?2Ct7Nv>VMl!K^^y|BA=@1x1XZq&+Ph{)m?FV&+}H0V3UD zy!hCW=odTY)vdBu`&8OtTD2cpmkn3=T@R)(m}Xs8p*UJivufCctBW*rkm^FB}RNKw%zU;ff|9<$`U ztGW4_pg~pL^xG7gjewnLv+TzLP0xKG%;UQm%TLAioud3ZY*!oW4CdS>-6eqp4yd(s z0z>KLMnGo9{rhJVUDw{aNCUPs-nG6L$)71e1c$U5xd$On_`U>=ePm>fm4+!DU0;lL zc0OI{($PpAg(9Qs6yrD>o=XMgbFs@QHIdTSNros%Bfy!jFLtgq&PD%m_<#YP$k|QK z&g<=4w^5@bh@dP^qf;*OaGjM=CYaNF?p$5GK!?ys7AMgY2%wIKK!OQcf(k&n{ztykI^7L7=uH1taF69&o_swILs6Q=T)p#!@ZwF=ynXMh#ZrnJ6HZgc&=4YH9meAz$DXw(YG2M)Z2g9X!wWF}U`J!&;)0Q~JuIZ4=n+~7N zGBkSLoiDduPFC-EsokghK3fMsA4YEakuaMk(~L^!WB_|BiOH9=`ob zZ>lwW$<|%bm(p%6jGlR@?7lX}#uM1^J!dHt)s|d!c6a@I=Uhovk8yz)7?6AReNWQb z)@|Dk0j?WKpX|LO*4@E1?le&ENq9c2*|iY6ZGlz;oKxD>E^XUG9K*g0fG1uxslzq%`U5d7UcJHt;s zhV%F)p}`z0G9b)JC?Q7S+knoqcI2LUqu;QX+vCQUO3N>`k<-NQCdPjl?=;lkus__Z zZ4Nv7H?kzCycy7IBE4g`VK~lOP`UvBmB**7ENd{mrc?DuQ~`yC;YOttnZ z7k=XS%Ujc5+?gh6%DSot8|_j*597IcMAooOl-HV)D>*UK`L60&M!SBd+ibRl}`C@=6t>s zy*54IT1rUE)~&DSCUgJQf>f8ymn~NZpL+H9sO<_s+Joa~M+aZFgCrFJb|M#f4rc0M zoAZxCD;M?~GiE#J=c^P<$38E%s+WsbZyg>%HJ3I&QojMc!(OpGu;J$Q>s!)p{>V~m zz1XF$(aw6a}8Ph0BlClroW##9}h-$gz}fUv3{2>qd|w^B>Qj! zT;1;nc8yKOK=@ZsTF0Gna)`WgK0l!WguGqErIWJ%VU70AJLa_fJ+pJp4^FuovFyhT zvAIibh~)UwlH!7SM!Ub=oa1KqAHVcT(*?ToN%|AEqToRU98TnDG&Dbwe8#3Dhl%}IZm(Fv_6s-b!z6r$>ZB<%p$|-`SA_k+LV%WB0?K8RG0JD z^KbWn84A$t@%gUh^gDs8ia&++%Arp1arQ(er|2Gl68!DW#FFr{xo57w-nU#YDaR?C z*6#E#lopjIkktW+_!LFBYf^|;FkvN^{$9!KiY}X-UhZD>dPDcz+u|k&hvk`s+nhf` zG#bS6wKO*7D3p?w{qFwrbgkvo1r3_I<8$tl@dSxqQmZN460-8AQGf3_E3Wabp`k!S zS<1)Wc9W(7o!1h$|zfPY-`$zqbO7A(jBm@ATOR zh5ijS=MZYwH*yN2y1kV_dS>H}PFjvq*I~%iVMzPfzkVNirP0TpU8-p`|9iQ!jvhNs zK0E_+hnCe{G&07#jjY<^)21V5bB);FvJPWf-qvJ{{6LxnhXbcVE{wpxOo#gNEpx5G zlzN_M#19WCW-xmPDB^?gj83aw%L=+DCSXv_42M{vtaF?-ANuij?6w~Ij0Oze-AxpkNo$Vf&YNyGUy(`>PmtXc>&yz$B zEES*rnW{|~QUoGQa;TB=!Bx{|y~tp{(({?-Lo|J&X!?4Ap$JSIhkr>iJOk~EE8_5ibj_H^0%D{ zR7$?T?3KO{w3onn<{=H9{djG|bSzmjGa?@KFWGahCnoAeRpm#4;@<3-airD94n^*X zEC04e-=pGMn924-;AJ1d&J6S@9-UnjLAfNHYQneqV`P!t8y9xZ%Iq)&>R-L zx_x2u4n=p4M$4bRFCyc5Dyk!#h@p#~Ebs&J3zQRUWMovWU+IwpFu&vapFNSkV$u1u zak?Exj~UauxWmBOHHlf+U<7wWbgN?xZAf->&6a+7d&hUQP0n$HlITTz^j~ECiPx^( zVL)3)`^2rKit4r<7X+B-fWV!Y(^YTOzpr8i2|BUorM_Hi2XIS%H;SlZkJ~qg-946W zJHA{|F+O#D>W1;(3TIwlvSfMY>wCuz=&(X74VO(h2YdQ8+4eo$?}9gnPknnk{^WGu zg6)AwK}=(4qk2?8kENsNq!_{fJA$4O+8pk?pj7dI7!G)EGeW|h^g}T6YuwxRGz!1I zy>Eq$+gJP6UfdX`v<;`URVy=SJNHpt_{8LlgPf_&K{W7--v*QasDCT^$!t8%KycLb z`VpryEBwHm>fN40h(|yWL`|U9na1*N9&*Bh+fTpS5~4t2;y!uIiaHgY5?~77CcHg_ z^y2|w#`-;$oX~Y(|9o&Z2H@OQ@Bm;x9LfvU#A^EV>8q~D#ko()JbG5%L816i8B#J& zUw}-ECmkdvTIi>WX!=G+WE8=5XlADGHwf8*yoaOeG<%Y(-a99| zUX`|CDYw!Zy}d<%zw#I%XxlMI@17{zK;_mG&&Q>naIn<$eAeUm#}CAP+-gQ&RREP?!P~D}w{FC&($%^?3mJGy ztK@##!ZQ;(k6JMt9j+rp67iu#wH^)rBgs(c`Q6y>f9A{X1wCQ9ei`+8>I{0;d+ZGF z8)jIkA1Of8*-Ctrwk~I5n(}Or@%8owQ@wY~@}*0cJ?1YpTgt^$n{ss#f3;kFDOYJ2 z<$Hv=HmvOog637_x>V}NK{zm1ax{henkK4vF|TDosesy5$9Ji;|Dvm+(2RqHc=Gvo zIFbirD);qIdv~9S&@W~cyh$CV?{__64coK-f2<5u<({qIC?=_SUD^k{y(A5be3A!d zxbaHX{Dp1-Jza6x?Azt*%310ENB z9QjENnrzrNI)Y}EFyh~DKz&YWvrakCfbSMo?(6-Y0BLMSr_?-MXPriOiA_?7oW#-(l2UfOlJ3F5B4S%XS(=o^2eV7Mpne zdJ1>+R=@N}_mrHwwMS2|U8Ko-_P(m~ch(czCeQlx+&-w*fPL?DBIAjElG}GOE*)Y z>b_pH!vJIt?}N+@T5#|dX88$GU;Umgrsc{C zsnN3Uj6Ax(B6=HcmzO+zN-QAKiTE zS)N;tj_>T;(%C+KelI)3l6y1@O>t0WD2?BesOtZbu+}Y<(MOoG*M70z?R~D$)!b*$ zwl?A~lBVV9$$LXD8^J`R$pt zD7y8L(|s}I_aL6NHvY>t$*tuT}&EV*^Wxj+_Z8X7ec9LuLcr>n5>Arh=+$=HyJN@?l=xkMnGkdX&W#^+!v(#5i z`qogVtIvDc30~G;QY99L#u&Wcn?dnW4A3=}OieItR{Ofu}PZ2Ic63YTDc12lSJdExTW*jo__YdOHaqULJfbDV=CiY7e=Lms+>2&$sITUdAAwjspW9We zEYao3xcOh*hmSlzZo!WumLA6%_WCh(_x$%iBr#h*vWXS@5K}d$JHg}2Hf}h!N8fkn zyN7T19grQ1tE=%3haY^tsl(U}>UwLnF74~`CaNH6;Pab zM4;V}m_6^IJdwO||5y^oF%KU$E-4%cU^Yl($v7T|<$daT?gQjsy3ARl`}g>){8t>` z^u`;n*ex={Kvew~2G_cf@DTr{Cr%KrejCRvkx4ktU{#|z^*n8szU$O_5O+XSvht6G z3UPQ{QvAN;1a=L?hC^%y>ss%F^To!K4g>!vZ5=qk1bx3FvBgUQIm4MUxqZ3LYLip}QrIr7Q47CFDh#|;Mj6g&sQvnTPDqT+T?Tx;hY&N*{@XANVpy4f zEiPao&lpv`RN7OH;55cR?BqUTuF>u@nQK~~>oqhqC3kbRzz-ijoM5=@`(ZdGRSNwt ztaw=bVpfQKP0Vv8K{e#dnCMqa|8B zTggfdnh_&9BmReD1_)wjFEO@4(Ljat@0~YKHfwQSxgH;`Ha+8R-# zEN>81#Y=~xloEb zuSi9{Xg_UoTUA52)Nx2k_${p}UMz;2U+~v4oiw*GcEFO8uB^Sfu*j_!H%Q-v6ggrlc2&|RtV=T-^{ z8TYWEJkej-N7$~@i}}T$uWBY^GL*(t`QIMiz_T~}D0tEN`-TH(g?Fb6wjbs_ncC1U z>CVI=^_%%!&)x`P`7ZF;?VSs{JE!%VKTiurgq{2X@lETX+K=v4ZWLC}})(Kk(<$V+F5+VD{fKp&C#vim*l1FIIL zy>C$*@K;PnOY*i8k%lY7&z&0!QJ`?~Z@WhQ=3Xh_iw*ZJV z905()WNzQ{2hL);2^>L7?hL+E5co?tbSmXTe0e-+#)UnX>Zhi@dlL2hNwXcrr*g{l z<}d; zb4FFjs`!Ndr%O*`OP}Ep)B`be% z!iFnZU@d_42LJYJ0fgkV^&gVlm00mMY|E33FVOUClG3r6^|#(eT>H&k-L|~!z)k>h zl@bjXnt1I)QFjR*B^U*B`;>pBacfcFGp3M@t@j(gAv+Te_2mlOJjY78bE?IH>PjsAR<>^q(=Bq3SerqQuuWZ z1TfTIgEawQUbD?WE<>A2QkXWICgD6--vMlMA_&KN1+~;&qhAjyo4$FI70%)E`lR0x zUmteEV`o;j$ITh>oz0L4R>cQ~ONRH*d-OE!a~$jTe*t4*B{6KFQd*DC=pi1?BYWYb||om4+H?z9uWgqdp9HuBnfK; zW_*%|7|YL!*FZAsO6Zmg!)rZeo&TK3L=e8j*WiW*Q3z`}i?FwM%(3~~ZAD-WQZtH4U*|9uhJ}0NXwgQ_vAja+0W_Rd}cVgfuyf}}O zGZ>Mi%%Ji~e2q-%AGI$Jx|@i2elj+2PG}Xt^6+p0J_C-k9#44Fbuj0Q>mfyK#tn;Zza%!>VmzG}hkLeT0*23>0y(>fC0u6#&(Rr9| z(M5?v*Ur|BtiNFWOQIzuGA!2O;}_Z4mS52c#ipb57GWGG7D3ev zMkG}aKFq_;QX{3S0PM;)opU|>>#dhvJ3ED!Lz1@tiOlJA)Y2wEvO-5K!^xcLVeh85 zH&*vsSL*24>9a8;^t036Nw9TVi4w-jf@82VA$!3e@hfcVh(gT0NA5g`t+DX><35-n z`HIfyt-s#!Kk_E1oqqk51cwe?$Kl6{6x_$ah12PV!Kr1)lRu5-78brp;=|*WBmnq$ zIs;iEU2!6~gBK9s97(Z2dSU~&*|JCb*`cV=pdRen)D%DT!~j2hUF13G9pQWD^}o8_ zom%5xMTrnL2tQkF5`*#X9I)i7gxL5L1hB;sd)DLw-$lbrN*ih*f%R^VN3ilTH)yA7 z!tG31Q}Y3gN?5>%Je+0-&ja!G=zaP4PUz!M6LX7Zz zkC!=HK)lhBjxjtn#t>8|w#8NUAO;a5OW@t^TGshBuoR>KTQ05zM}{3~r+g1%;!7@( z4)O{R43>hxH$wq#%hk_E#3Sa`vVsYUxCpXj@9PBYw%|RisX_onC;^g<0*T$|{b51` z@zsY*lpc3yCmT;gOmdQez3sBgb@laz*p(LE7uR7J%)xRk+b67;$`K2prF1c{=oziD zXbXY8`wL`2C%6V&n2x*7nF!oGPC?x{xAcXfk<5Mch!Cbg)k16d(YB4EeQ%_l8_*(H2yw{43{PaQFa%c%Z0 zOAypHO~KxfB?^o-tEPpk-KO`D|BW`oiqqxcPvlISKgG7SiaDx4c6273j;u9{k;+J4 z(NTM6fD9PU+hMR}-k_DNh6*j%p$&lJ^lGhAPkSe2Bvy||81|+OzvlGUL|zU-oM)xc zdp0bc8U3wVW%QmACx8`QWj19V_x(`G^u#URdYbR*AFi)Z^JJoZMta@Ix|ETKVO-@6 zNDbD3&}%I6FGp)eUT>>-I?Qb6G(&3apD<@LPj3J4WcTdU6Ih*LPt&Je=7|6F#^qjN zO52=-1Y(&ejmF+K-L-S4Po^HOQU}Et)2xZxQdP@3xF{7|$NpRQ5*^v?NQ5h?F`w0SwHkxLDnv(JA#Vv zS)4rG(x=?C`nK?u<)nNajp?f3Pp?Pq1~M^ucL8F;ac7Y72$^bBSJ>DjTH4~)Vron@ z$Q*0a*d~i4Pw2HF)2(^zj`0F?AJBd zp04~&nAW31q!R?j8(8WJl;Ys3>c#p1eN((abp!IExmq0FKS--(iOfMl?8#()7QzUK zOQ@!~oGd3P&BXINVCRnq*YVr+DXGx?8iC?)adlM$tsf*i0mAZ{qp>G%pu<6-wZ#!6 zZ43OeiXjY$z@nFB_8`Cd>SN&dmI@%$7GWqDGW%F5Lg-5j3OfaTEa@8&5LN{N_ioO2(kFncXNDb4XVSJ|l*S7X_|TcDFniwYWe)>% zhwn=U27Wt_?N$a*+Vj?}kJTjetTahFM3DiO-*i8Rx{c}SGsYbM1;&OLE_m;E`}U{D z;q;dQU2H>BQvYXm$~8r~5#mF&;~HQedF*=>D20V;+*kYbv`DkQD)p3vlK#P!7186e z^Bjg5ssWVmNO0^#+5&GqjpMd(sboRWOv&RHP4O_8K?rx?Y5yyrn>L#wVo;iV)SX?@wqT#P2(5Ko?{gI+eWv~{{?#va=o(m z!WYM(!$$iK-~4{GpM8H!LW({XbN=GR8ppNA;?Rg8*q?+0C#9!Y7LE{}4!sfD%8>`? zp0d8uSL|_|qCK{^Y*xn8$RZH`7^`#yQR-;2RSZmAWJW&_Rg{<#Dlq)>R~Syu=wYCz zUD{bY*xS)udu&T^3>q82-8BKrJ_;Y51i$KO?=#yhkhs;L^cv#;eGS!S2Aw2~bP=5U zM*wgy-CvU22Ej_!X*>wS$)hY)Io~mxtZJ6d!W04+@oW!0(^txQ`~xV(p(8zSS06~qrRYK?F`6W_P^QvM>Gl;CXI&VdLIu& z*I(D=0zwevKJpZi0IF<-;hoV8R@`D;>Us{WZ$KQUt6s(cJ$?-NUVGm^q!BeIOWG_* zmxvqP*ONZ> z*I)Y<3~wfbQ7+@TL=I4)#_`^|J0CcvQ<5;J-G zoraAVZ0_KrE;Uz%bbTZMpghMMuyfOhrxjvnv?>s|7<2whG}$Y zimOd3Y_sV0S?qAfXyH-b5~x#H+Jwa=j+^F?kxt(V0kMB|U$mL-yQ((-xi2 zJRl1zqmxIpzCIoYzL2GuXLAw3rh=Oe{DiJ`^GqOdA;)p4@;$-;@FCxwjw&vRX6HX8&XS0ffl&Bw>0N3GQ3OsLIb>fNJd%(kkQ1Z4i9D z8;->v5_Y!CcK9rOsGU`sx7=z!4(rE6RIm;PiK#( zrOsH^^Glk_u8NfR=hvRgw6K4CErT=3e_KAzJqfZh@(b!mWE`fp=xU_I&r5el&*8Rr zHGSx7plA%N>~AKCb!UG9?T(xIea~GPFWq)%*oEF-lH(WXeD=Q z-DiW+aO47=ylU5fiJ}I|7qKk|zyKhV7ESu{u)yI5@xJvRFP+5?rpw^C_}&SUk@gPX z`2NMJ0Dt}ugKb6CLu8)x-$Bjb?4bV(d z-B0I~s@Vq9B;RaZT`F89zOFS+g+1z9SgUSW9FKu0=Xba`Jj_SOhB?~ZWwS79PYH3# zRjdISpqCpzLC`Aj!?-lgoG4<(=t2Zyv{jqo?_kD=Z4&- zm8&^@d>@%Mm)_D@IQ_!HX6wGEuMQGK5L)n)W?(ylYD^i&=Z2PcVst?I-yR+x$ll$o zJwD{kuSkaa5YQ!gqGtYmvvVV-&nfu`Ngb_*vgU(ZnLsLc*dN z9YlspKFu5v3&GlPlK&mibJQ;NNyYuB4H;1}(aW%7R?v=_vv_d?DNDpFDeH#M$^CVb zYi8UDizpiVYHaWw9Z|c21w@7Sm064J;@WJjLXhAn|0RGGg9UK9=kuhv8}JzBSOJ@v z9t;{|$vJU&UCOZxo%zaW-`c1N1Slw}NbTNATCDG162TdqKVXJE;Q-@_r`8|!G+X=z zQV{`u{!C^Jl3iKRth|1eB#X8a{pjF7N>Cub?oQdxg?}J3&u_EP5Y&=Ri^s&*`GW=+ zmm43)L?KAOQj(jRcIQsGR1NH%vRwOj# zrP%6`%;jNm!jcFT>;H4irP_W?e%u7Y>={lsI0@Iu2mx z{}tNCGJl@c@=|4>KVbkgC9XVNIsXbPpZtZPDJcLZLd^qm7VGPGiUnCsW;WxF0LX86 zF7xnViV8ZM?q*oviqnsT7y_BKs>DtQBiubbVC1eTk_3zoapIWETI&DkWx@fG(76=l z^LKC!hYP&2_S2~wcjwL>R^cwireClfam4-Kf=Zm~KW{Kx%)68=_c0ek$#hH%OOQ{KeJ-yt@&-ay>Zo|b_6Fr^*}~^ z^Cm=}N^^ex^!K-u-~^zvR;=@{c~j!#AkoJ9Vzb+WU7_?db}+(2aRER)wAMWx1;=7= zk-(aQe`{Ra1-^rjM73L0^4j;@CXq_QtgGVTw?7*9=b2Zk;$Aa2F5v)>3rYHPWik9B zAUzLs`;HI%I8u;urxRnezxY$f>6*BvEp3F9GuZY3>p=C?hsxnqKT@^Hy#LPFqCQTN zJb<=NfP2*9ciAUoZtQHU%GaA8Qz1l;0kIy9cL+P$1LD{dA2S~BU3M9|iME=QN>+-f zAKvDChhRt6!I>_DB?9t?`1?8E%WOOodMVb||K_Y=n*)jQ8-(>4XWVbxco9gaGwbW) zCc3y+pu<+J`W;wYw@C|-!tcAhOYfA1*;3OaLoB=>A9T~EXo=JdBG!FdM>4>&;MUjl z)n7njpmdmZXif5bo+#6S|Z!jdvR1uWW+1TBkI`8~S@Uszf|c>HAZKE!ish$182h_w`pq!|}Lg zHbwR8E-ugLnnQxlWXp|T7QWm2bj3k;`zc@n_bu_67IdW$^|%DT!MzYzEnsV=0pDE< z)A+~s10A0Pd&#)kU)%vL{1?zXrDQGJ^9g!BT1MED8@L7DbO!lTD0uWa2yOPc(oWM*b|dw7zVTxIOJVKa`Zr_>7<>j^=(}^KNnxEi^zA&QL`E{j>fjPOP*a*Vz z8kA=;zizcz$)TgEcGfZ3FdsdN3yjxGCcP2_Q=2TtL8KYxsv)K$;moW(_Z4b}GH7Ym zbGIXOmxJ1ItxAKc{)J&l7Bi-6SoXkyHRs1Ei%T1AGxc)w1hxfKZGr7UfFK?i2$pMw z4wb%y@PS6i+(M8ystc-MWb*aZyjAD2mtuE%@_!+f(!DLZNGaLTi3MmxL(t2tsr@nT z5m$mEb~qYN?(ysLuUfTk>(&?Vb zc><9HeM{oBfQGlZWNM^JibdpWpE-*xPPkj%ca7+$SRo6F6H3zp#IPB)tFi7e@@kUg zHN$&eHFGDfaT5|fI6OQqQ>bVVk@!rO)n?=*cwxs9%y{x+6;p0*b;K6teJZFBIH^;C<6&8MQa|!9{sxY z_y8ic)_1yoKNbxhv~A-QhEu?~ZQUM=QU;u=^(RjOvp4xLLP;6sEkY1e{SB-T+dAkK z-X7w02o^0-dMkIh*Z-E; znSJ%>hs|+lsyEDd>4m_jfHiLZU7jqBW7CrleusooorZb^P_fz>UYu8|P|%g3@rw)q zk&SrqQRj{fW;#Lh6gl2MKBn#54B+z-A9d1jHcwlV2X#Q%%X7NYM*#Uz%Qs&7NzOE( z#aDDH-os$-I|1_QN)MA?mzGf@_Y7y84&V$opi#qDqzRW!DgFAe87NIW%?B=j z_FMAgW_#qFMcY;`o_`5ln>AZe%RWIh#s?-GL^NLBSDn~z$*1^x8qnc6p+}y7yVWPmsG_*yFCmC zfAhMWIkH(yieGEjM}BRw#B3g@h}C7Y!q0T`fs2O>_o?3cjLoH(nvTc`8U||IQ@K`w zqH;I`Tt~GOnX`Gt*F)8sYlTqNWiM&r^^rQ{!HYb~=huRb&U~@_boz`6bkj!id}S9Pf$S+r*47XL#-b+KxT{2*u8+ zj*ov5r`ophx8>^`qw0Zm`EN6=(fk^7SyWQXkfZBTcZRM0{neL~i&xfF2+1Ah-5D0! zxN%Ln?o>yP?s;8HJMK_#v_|~v%5N~+>|Wq7@7f@A4_l!FEG!mxRV;2~7f8^Il9Y?; z^M=Ta7~Khrql1cesbGC=?2CO+HgTsM8Ym`;$e~TprEsCjj5<-AS<}Dz>q{q;%LIzc z$qb2S$>4@tunoywL4Eg+j?Y3rF%5iY!#2i(@@!C4y+q)kJE6Ha*i}k-(mPi-HxB?} z(Adm}TR(Q;S1jc9eSJ&`>-wS>cI3jadAyGbJe3<2jdt zohOeI*(~bI1DuO`8{Txpv7!j)w3aeSh4YgbthT+}%u5b!H$;DKCQk_fLf_qvHOx-* zwTjK+6;FOYiW=!Lzb+!nncvkA0 zV}p-DPkh>FAu|Su?{kcrJmKDihCnQ?_1vZ~3Qp{Or-9SrOobpd@G)a>2W3PDKT_i} zELm`(+}_Xg){R@prOJ`S45l?z%$Oiq$K4PECFYF6tsaeSB?#zSwkRN^;$sKPa)CT3 zz{j@hJ_H4INX{q}sWE69(#cgrKOw)L+U*AqBH4G3JWcPL?WF_@1j}?e68z$xm?oiD z5E-B;E0OXCdfrH_yRUb(pMta}u`5r&z7I&Yg6c7IPlxXNwO`RNh#6pAZ|2KRuWL5Fba$i!+AVzG@1}t<_1Y*pTOUEP?Z< zDz4onnG;Wa7vLLA>&^6YwnX}hCkLEFbE9gE_5m61u_bx7vbX&)pk`CwdS8h7PJ!1a zFb4r^L*Mi#BxbhYRD>+;p0MGO)-6(n^D;KuyzGd&rp=y^I{>5SXRR0+@VKNg{MIYrN@{Ud>JUqzDVd87fc@~*@I{*8y+G^OM%CNH z?iksQN#+`YDu5I)2_g1`yR@uqY-?U5F^{%otw23UyCR!~`@>&jV};1V(KEE#f9H@(zNLiJmRcmBNv>QQPZ!n5 z){a)(?z}Xn^kC$T%6o6I!AcnsqY-H3r5rj{K8VYF?zF12ND?TWCeK7ajuqEDnW1OU zx~BVX*FsAZfm+AEP;!4<7lp&ro}y>K=q99iq`d667}Sh7aOh&{i))^$=^o_87|{KQ zRPZ=V)3XGcWQ_%;40+Ar-|)NIT2WEafbJl4>Su1`Q{Ql_sL}1ljad|BT<@!#PtcrT zZ;GiInHvvkJPDGr6u|L28SnJ;4nK_a*6*s|E4|h3N+}m#$QU(%ZHY-`cWD3B76K#|KF18HAuWz$*Q=0BD&N=(6-Qo6dX#++sI^tSNq!u zzA*(q$Y6vo`Ek)VDaWy#qcVW;I=|EbJC-zK93#zZMm|_F=SvkWP@hH ztrr>&+7GwIqueODwR~?6lyXvd{u3O4{NU!Bv%0Go0anXn{{hS^P5BS%3yLQCan={x z3RM3;|A+B^4)6cFE>!y%;e@G9vlecaz@Q5fGMglK{!Ts#2kny)Lg{2fxvUJjh?+W4 zZuKZ;vZ-+T8UahQfd?Lm@TtoTcW#mJsaq zWWo?-M-*>yA{>RDDjXIh&^Pp=3ewO7IPO`3j2}fiGRKr$MG zmH6f6E=0j7v@+!aa@wwgLd3b1+palYbl*0TzI8pSQVX2(m3Mfh)HSh(9xTo|bRh!73 zp27%tMoJ!TUS89&zWB7Q_qQ6UG#4GMn`C>tlZ+I;b1yCt1>Ei$W?mU^qNf9a9zRaI zUK3NK{8?_?k5HX>S{dDdqd)M|uc$s%&CH%#4j;3u4#rdZ3e`3S`9{^&OuF<3=Y4=X9ixDUmAHDj5gp4-gvjGXA3;X z=<$QSh&&a>c3!361!Q}&M=ly{p_3P0+gP0b{c%erq&BEO+jm9h6s8s9WxV|y$E>M2 zg`iGkD6Jc@Rnt(GCy)ZkTgyh8&hrwZ+-ZF)zATr|v0~eXMJ=JMQX$0ixWa?%XaA)~ zi*mnv_pW47P-3z>{3Df~Yfj!G(C~qLb;x*uI>(`kRWxrZmLepA+BImQp`Gg;*UfcC zNPuW>(PyGn&{*&ZFY=X)w~!GSM?!}(jyXNgVX{Kg77Q^3MBhQ|*E0O`3L4cy!!IrW za&C(D&IkV?7nwV}rnOhUX;NU3OTq%MFrcSSBdtFgbHdrrzE7P#!}J+5N}xa(STuVlbZp z;nT0UWlz-JS?72*?CXY2FZHL&oXFJNh3*fUyF;Db$Ti;KoOBr9n7RoF(;#Iy$Pgv+JfUY|kMK+)plbbzjN@SlhLq)_bwnOiU|u!*V7mDC z&H4SVxLo4@5|gevo7Ly6eXMZz;!WdsAEN7EL4t_J2XT&}$h$_40~x%}!D-L}p+-sI z3sFeTnoS*t?<4Pzgj7z7Qlj3>M>2W-?%QkaE& zpcFLIOegPIy=BW=551EH23(10p@V&h|M%cpLBZ3<)3d&s{KR9C6rDsOQ~+da@CB%& zb*?}od~h}06~BvzKKOnKtrYSDKCjcr5<1vD?)XY5PYQzT|MNK*^-v~NsP^X82 z_fPi_E7(&h$*=S_ zAx1U3Uws4Lybob^J0T_cPx^(DhZN45NgR)(y*p;Hv`;IZQbY# z8i5%^TL{4F&7jZYCijsx@z}O*;fLD{VhCkv1e24%3_b$k-=IBrO5Ma@v@&nq3P2I` z6BA_;j8?5$bq`RjknV{S1&d8y{#o_%+@qo`IE{q( zeaIgPPqlIX16Od?U{JCu0?e#+k1olR;xR-No$G7IlX3<*y~ZgGE=D~mX+JlpyYXYDn-)hUCHt-Pz?)iRrF z)6!;UbPQgK-%@Dpt1-)rjJG`Q-#4-hW1C2-1X#mKUK{j5OA4|Db21^L`83oY z0{N{9&NNu~ZL@;6VlQB0wDbBgA^l2PB1@8X_&`F7VedSI_jpGQ-(dJOpjmnrvIA*7 zx-=vAWeF_dX7^tC#S^XU9&&f9r!d%Ni5fjE~_K!s2>O3|H%U2#hh`=Suy3^7Pzff8Ce$|SS)ZVo?l!QJgD6OY;*w-j9i zjJyr#WkRz9wO<6{M3G@4JZPB|PVi8G4NQ>i_@TgN7(SulVT>Q`i6;vdCgsOe!TutI zAdryzCP&onZry%+;Vz3vz9yu=F+scW_(TMGj?WV0;SmelgLzERF_^-ofK`MP3>I#}I!!p_UGjVVG10wNqDNnz4Kzt?T7_pN2M&r{ z6(NBPfC;n~Fe8DEMJ2*7prE0iOZtR>V+qg(s&8A=F`STJ+YexgG#z9si5j%|?W3#2 zc(C-~B%}sj^bk(zz(urRPqe;E%;T}2fBAE$YboJ|(!T%ZPP*jUOqgNd*e3TxmJqW@ zXm=N{uom-Kfp>n(`sNwe;i`2SjuAi}15x6U$dJN6MyS0*?uOrl(pxdGUrSRA+g-ff z5u9Aj?mPLWrixX=Yg$Ctw?Bx^8Qv)8Tkm^6_#E3y4%;?-hWW~Btn3F+;*dP1s;0eD&va` zhEWF{M}udrhhC!Q##l6{HYlqe)87U;f$+=>4?REdITE|+lq*Ezg%BvF)|!+g%Ot*T zpqZP+c;qgAa0%Ce;ZO*l(6(*w&VXjHE>l+Z!3OT?+kWozUy`*gU>OSOgtFB{rdR;0 zu)C;mwxT9mn_HD^jV5LUL(|zjqVI>P#rdwP<~e6NS`?YwXc2Tk?JV^U3&|`NPx&OQ zcq?Fq5Q}^+gs)`t%nLBAX#l%w1pelYn~RHJl4bk1(O6Ht!}qs6kw~k5(%5wmhu%)1 zjT>L@YN&U#pnSJ~09XA6Xk|P%IznUw;aI8H_pQ2exEtO|oFcF5^F*{aMt3)+S(XSF zA~pz#i`P_Yqmn8>I=j(Fj z*6z1%(6Mf`ld7>)Z;8yQTAzzHhC)OWE5~-a)C$xi?Mo6z9wRo?FM5=WeRD=eupMD+ zg?ndt?XFImDG$@`07SsYK(Q3&;aH3?XH3sshxPdVdg(vuwIKB5 zBcEMPV>uQ&1~{UXyuI(C_{*_xmTAZkpvGRX9K@omQfN|i}?_XIU4$j znCB(6gA?tX>Pohw62?+x9mo{82F{*A769>cEFNMA-v!9)ru4aU3uO&2x4^&{ahl++ zgSleeCxPu0_1S()fbQI)y{6ir0H;znTsUIa<^mlJ0WP9`s*T={>`sv(-VZUnhkU*P zJ|Za>hvDS7%@qCV{=3mNFu(n3eSW-Z5H_$G0?0iuf1TfKA&Ebju^Imq0PNx#N~G=| z34i{zEp`cZ$^PRtVm$5@I42dE)@?7!?@`CkH^_zWR6Nz$TT*|XbMaW-P>pMZ0S1!c zf$iLx@TOm@v?Wi7J%3lDKv!!1Q3I)lljqR)TL?RWb}lLJqDOH1x{Ev!H~_H*378>r z0n$MI=Cp?(0bC&?@DY6i7SdHl1n+h?Qha1kLm0wa!a&0$7 z@d)y87YXOm6C3~e#PG0fGip(Mq*S^NeH=p2eC45svh=yqi@JWWsmHp}8Zf1=(Q(Zg zEdGl^qOQC0qt~FP3?D0PtT);|&a~oLriY%$lG)wpTv?~AjT&8eR>tO*(lA}>YJ8*H zRU|(&$bDq+g=JH5W_cZDS=NQ{&(_RynXAc{_oB4XZXS9$2AqQvqly4%> z`T$!Y8(X1udoAi?V;Mm(L{k23DkF!<##@nDfirrAJ5ave-@{-u*N4^IMO@s`pTBPg zh|d}MP%Kmrj~8Jw!RJmSEw}lo?1bbyn8yIo-B~L95t!-jXAue*i| zbUamXcMAq89f50JDTY&$vlWw%?4%k8aNesjJwW{<#R^x_O$I%J_GbWRir5!3#7+Y9 zU zx>v;q>*k?xVHDm2=pvYM6L#xHeA4K!un!x4QH;G0!7RErI@JWm#o6|yK}DI$S8E`o z*1IcrygP5a8wvHhK}~ zvr@1m2-_fB^q6hi3(8nASV6n4g$&KU_M!X$$+jOT4E3DBWI*G@toG#Yo8)qWieiCv z0SZ_94`92!drGcW7r%#N1D_$Pz-AC)f!Pm4%w>v$r_JFC0fp&o;_mLQilppl+!^&c z2Wj#4w=On(VMytmO`^ee{k&^~+Oy4otmfz@TC_FWAGgz)I9M}7(a(B~r|E0$sL1xD zNb{pxw>xee|I`INl>!db8Dgt;m;SzQpGTs$0Lpz?CQf`=(RX=i>?76fuxlmtE;%R@ zK9o}VWXQM9ksEX923f1Ges7k*BG#fy#kxy=1w)AWl)ZZ;jI`b#VV{_Z!9T9p*pDHs zF@h%=nUC}W`?Tp7gW)`Zs?(FBUZ%Fd9s-AfXLD;Y^#@}0k&_J%#y}$bfqm&awCLQ1 z_aU&#GBERS@AEIGQj)0zUTAK1j`z6ER-l5YO)_~jN~hiR_gC=TH0~D4>_dn(6wAEf z<7ja=`^(z6_GfF_?baR~8@YD<`r59$%+z$YI@?VLS?ASAeclja;A7JEmUqy$D#DZ|6PEvg^44(eXHdKGT2L#kn?3&w3r zc+;ls;&n#d=F+O0hS&LNlL+CfHt&VA?5ph&18Q^vf-3+0^* z6D^_|U&ls-+#RBD+AxEV0r~wN294GL}T}Gt3Z2uU1QgH zvO^83lhB2NT38p}w>l%SgBA<=iIEQm2pFg7XrxL+!yi2Ow$KCt5a(g?j!+a+dvlO% zfA3fV)rCZwTx`Sal!ts_=ufU;@6SXL>&3Seri1CJaIb?4O6;3*GVx&sA$~L=ZQFQm zi8R$O7z)82-}33TcWi{;$Z%+5?bVv;{Dt1H>S`P6fphiv&9O^BAXW{JJxZZNt!Ah8 z9Q`LH+81Jxg)x=Ba;JwFQh9(fo?fn~TbzJwScy?>wMf+JDYOv@ny}3TIR8!-ciup@GV<29cfO?$Kv@*MnsLZ0(xXx}Xt7ayjf&r&q0_f#vrgOXq6} zkBC~=k%+C^j8E28(|?Q!S=RU|Fb~Y2Y#!T4C4)H){-64aWj77l4dfIQlx~QxI#QS6 zn*{M0&RVid**6dr&*-_2K4Rpizv9yjiKCbWSqR5sVFF^2OynIraG>Me7Sy*TUphU)uRzTc z3x=On^Tgr^IEiZHAjUi(?%XE`ac%Ay+?tDHq{Ku{)LU~7k|EPRG)v(7K22sK$kqU7 z*lXSK^);@+KBy`GD?9r>+R%lQ%v(;rgVsOE9{9NPyRoLn{tJe8*}$)8Mz#Ng2Pj5X zAG)U}EfyTsgu`z;zYopXsI0YV*!u4u!iR*!#H!ug-SOju z_r7~_zXIb_kc!g{v#dIY+RqN8)q3mp%rYSqs4KJ;t6K6z*aZat&b<{#!a&gT@CVdg z*0o7|vA{*B+SB-GPAIm&P4n7V*mj2S(Jg5Jd?V+t3*g*%(G?w>S*|E38c;_Wi7dG} z(Q%qb7DQf1(lLs5Ms<5MPV~2?=vyF7htR53S;-Vb%02om&nFhwb;>RBhuh6(7dqz5aqo?Qp^#}8Z1E$> zu#Re>F#ic3%|ysofVg;S3`LJD404xO+jSQnO>;Z+$Sh|G~$qDo~M>qc1xoF z|6aQWyPmXE$ZE!*H`m{r)h(4Jz$@tYf;M~};7uj*D~9(%s-@6Q4Uc#$-keGt#!2~m zuAz#$gTpQmwO}YTZWi8u$eaLLjsgUS(p{q~B+)DGt7g;|Og&me zPapP0G-N|Lcv{sXckyr{3v93-gh9^c57(kfCCd?rIE_GZc=ZE49|24V=kvhLdXW5K z_!0|!h0DtsP#5svlgB+Fg=kX##Y2=SB6k%);3FK>Pt2C2hS(ub(qkDUAtoIz%>Xe_0L=zBa-c_`KvMs7gouV={)DlgZA5KthiEAXcnKDjBS__.txt filename stem +SIGNAL_POINTS = [ + # Lepton-triggered + ("VH_tau1mm_M55", "lep"), + ("VH_tau10mm_M55", "lep"), + # Displacement-triggered + ("ggHToSSTodddd_tau1mm_M55", "bjet"), + ("mfv_stopdbardbar_tau001000um_M0200", "bjet"), + ("mfv_stopdbardbar_tau000300um_M0400", "bjet"), + ("mfv_neu_tau001000um_M0400", "bjet"), +] + +YEARS = ["20161", "20162", "2017", "2018"] diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/collect_results.py b/MFVNeutralino/test/ForLimits/BinningStudy/collect_results.py new file mode 100644 index 000000000..43056c709 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/BinningStudy/collect_results.py @@ -0,0 +1,160 @@ +# Usage: python collect_results.py +import os, sys + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from binning_schemes import SCHEMES + +try: + import ROOT + ROOT.gROOT.SetBatch(True) + HAS_ROOT = True +except ImportError: + HAS_ROOT = False + +HERE = os.path.dirname(os.path.abspath(__file__)) +OUT_BASE = os.path.join(HERE, "combine_output") + +SCHEMES_ORDER = list(SCHEMES.keys()) +SCHEME_LABELS = {k: v["label"] for k, v in SCHEMES.items()} + +SIG_LABELS = { + "VH_tau1mm_M55": "VH tau=1mm M=55 (lep)", + "VH_tau10mm_M55": "VH tau=10mm M=55 (lep)", + "ggHToSSTodddd_tau1mm_M55": "ggH tau=1mm M=55 (bjet)", + "mfv_stopdbardbar_tau001000um_M0200": "stop d d-bar tau=1mm M=200 (bjet)", + "mfv_stopdbardbar_tau000300um_M0400": "stop d d-bar tau=0.3mm M=400 (bjet)", + "mfv_neu_tau001000um_M0400": "neu tau=1mm M=400 (bjet)", +} + + +def read_grid_sigma_r(path): + """Return sigma_r from MultiDimFit --algo grid output. + + Reads the NLL profile, finds the best-fit r, then interpolates the + crossings of deltaNLL = 0.5 on each side to get the 68% CI. + Returns the average half-width as sigma_r, or None on failure. + """ + if not HAS_ROOT or not os.path.exists(path): + return None + f = ROOT.TFile.Open(path) + if not f or f.IsZombie(): + return None + t = f.Get("limit") + if not t or t.GetEntries() < 3: + f.Close() + return None + + pts = sorted((ev.r, ev.deltaNLL) for ev in t) + f.Close() + + best_r, best_dnll = min(pts, key=lambda x: x[1]) + + # Shift so minimum is at 0 + pts = [(r, d - best_dnll) for r, d in pts] + + # Interpolate 68% crossing (deltaNLL = 0.5) on each side + def interp_crossing(pairs): + for i in range(len(pairs) - 1): + r0, d0 = pairs[i] + r1, d1 = pairs[i+1] + if d0 <= 0.5 <= d1 and abs(d1 - d0) > 1e-10: + return r0 + (0.5 - d0) * (r1 - r0) / (d1 - d0) + return None + + # left side: scan outward from best_r downward + left = sorted([(r, d) for r, d in pts if r <= best_r], reverse=True) + # right side: scan outward from best_r upward + right = sorted([(r, d) for r, d in pts if r >= best_r]) + + lo = interp_crossing(left) + hi = interp_crossing(right) + + if lo is None or hi is None: + return None + return 0.5 * (hi - lo) + + +def read_asymptotic(path): + """Return expected 95% CL UL (median quantile) or None.""" + if not HAS_ROOT or not os.path.exists(path): + return None + f = ROOT.TFile.Open(path) + if not f or f.IsZombie(): + return None + t = f.Get("limit") + if not t: + f.Close() + return None + exp = None + for ev in t: + if abs(ev.quantileExpected - 0.5) < 0.01: + exp = ev.limit + break + f.Close() + return exp + + +def collect(): + results = {} # [scheme][sig] = {"sigma_r": ..., "exp_ul": ...} + for scheme in SCHEMES_ORDER: + scheme_dir = os.path.join(OUT_BASE, scheme) + if not os.path.isdir(scheme_dir): + continue + results[scheme] = {} + for sig_id in SIG_LABELS: + sig_dir = os.path.join(scheme_dir, sig_id) + # MultiDimFit grid scan + grid_pat = os.path.join(sig_dir, + "higgsCombine%s_%s.MultiDimFit.mH120.root" % (scheme, sig_id)) + sr = read_grid_sigma_r(grid_pat) + # AsymptoticLimits + al_pat = os.path.join(sig_dir, + "higgsCombine%s_%s.AsymptoticLimits.mH120.root" % (scheme, sig_id)) + al = read_asymptotic(al_pat) + results[scheme][sig_id] = {"sigma_r": sr, "al": al} + return results + + +def print_table(results, metric, title): + print("\n" + "="*80) + print(title) + print("="*80) + + sigs = list(SIG_LABELS.keys()) + schemes = [s for s in SCHEMES_ORDER if s in results] + + print("%-26s" % "Scheme", end="") + for s in sigs: + lbl = SIG_LABELS[s].split("(")[0].strip()[:18] + print(" %-18s" % lbl, end="") + print() + print("-" * (26 + 20 * len(sigs))) + + for scheme in schemes: + print("%-26s" % SCHEME_LABELS.get(scheme, scheme), end="") + for sig in sigs: + d = results[scheme].get(sig, {}) + if metric == "sigma_r": + sr = d.get("sigma_r") + val = "%6.4f" % sr if sr is not None else " -- " + else: + al = d.get("al") + val = "%6.3f" % al if al is not None else " -- " + print(" %-18s" % val, end="") + print() + + +def main(): + results = collect() + if not results: + print("No results found in %s" % OUT_BASE) + sys.exit(1) + + print_table(results, "sigma_r", + "sigma_r (68% CI half-width on r, Asimov injection r=1, stat-only)") + print_table(results, "exp_ul", + "Expected 95% CL upper limit on r (stat-only)") + + +if __name__ == "__main__": + main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/generate_variants_el7.py b/MFVNeutralino/test/ForLimits/BinningStudy/generate_variants_el7.py new file mode 100644 index 000000000..659a7220f --- /dev/null +++ b/MFVNeutralino/test/ForLimits/BinningStudy/generate_variants_el7.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Run inside el7 apptainer + CMSSW_10_6_48 cmsenv. +# For each binning scheme: backs up limits_config.yaml, writes a modified +# version redirecting outputs to BinningStudy/, runs makeLimitsInputROOT.py, +# then restores the original yaml (even on error). +from __future__ import print_function +import os, sys, shutil, subprocess + +try: + import yaml +except ImportError: + print("ERROR: yaml not available - run inside CMSSW cmsenv.") + sys.exit(1) + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from binning_schemes import SCHEMES + +HERE = os.path.dirname(os.path.abspath(__file__)) +FORLIM = os.path.dirname(HERE) +YAML = os.path.join(FORLIM, "limits_config.yaml") +YAML_BAK = YAML + ".study_backup" + +YEARS = ["20161", "20162", "2017", "2018"] +CHANNELS = ["lep", "bjet"] + + +def write_study_yaml(scheme_name, scheme_info): + with open(YAML_BAK) as f: + cfg = yaml.safe_load(f) + + nbins = scheme_info["nbins"] + bins = scheme_info["bins"] + cfg["bins"] = bins + cfg["nbins"] = nbins + cfg["observations"] = {yr: [0]*nbins for yr in YEARS} + + # Redirect outputs -- never touch nominal Datacards/ or LimitsInput/ + root_base = os.path.join(HERE, "root_output", scheme_name) + dc_base = os.path.join(HERE, "datacards", scheme_name) + for ch in CHANNELS: + for d in [os.path.join(root_base, ch), os.path.join(dc_base, ch)]: + if not os.path.exists(d): + os.makedirs(d) + cfg["root_output"][ch]["folder"] = os.path.join(root_base, ch) + "/" + cfg["datacard_output"][ch]["folder"] = os.path.join(dc_base, ch) + "/" + + with open(YAML, "w") as f: + yaml.safe_dump(cfg, f, default_flow_style=False) + + +def restore_yaml(): + if os.path.exists(YAML_BAK): + shutil.copy2(YAML_BAK, YAML) + os.remove(YAML_BAK) + + +def run_pipeline(scheme_name): + script = os.path.join(FORLIM, "makeLimitsInputROOT.py") + for ch in CHANNELS: + cmd = [sys.executable, script, "--year", "all", "--channel", ch] + print("\n>>> %s" % " ".join(cmd)) + ret = subprocess.call(cmd, cwd=FORLIM) + if ret != 0: + print("WARNING: exit %d for %s %s" % (ret, scheme_name, ch)) + + +def main(): + schemes_to_run = sys.argv[1:] if len(sys.argv) > 1 else sorted(SCHEMES.keys()) + + for name in schemes_to_run: + if name not in SCHEMES: + print("Unknown scheme:", name); continue + + print("\n" + "="*60) + print("SCHEME: %s bins=%s" % (name, SCHEMES[name]["bins"])) + print("="*60) + + # Always work from a clean backup + shutil.copy2(YAML, YAML_BAK) + try: + write_study_yaml(name, SCHEMES[name]) + run_pipeline(name) + finally: + restore_yaml() + print("Restored limits_config.yaml for scheme: %s" % name) + + print("\nAll schemes done. Nominal limits_config.yaml and Datacards/ untouched.") + + +if __name__ == "__main__": + main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/plot_background_templates.py b/MFVNeutralino/test/ForLimits/BinningStudy/plot_background_templates.py new file mode 100644 index 000000000..94edc0f3f --- /dev/null +++ b/MFVNeutralino/test/ForLimits/BinningStudy/plot_background_templates.py @@ -0,0 +1,150 @@ +# Plot normalized background and signal shapes from 3bin_nom datacards. +# Reads yields from text datacards (no ROOT); sums all 4 years. +# Run after generate_variants_el7.py and strip_systs.py have produced +# BinningStudy/datacards/3bin_nom/. + +import os, re +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import matplotlib.patches as mpatches +import numpy as np + +HERE = os.path.dirname(os.path.abspath(__file__)) +DC_BASE = os.path.join(HERE, "datacards", "3bin_nom") + +# Nominal 3-bin edges (mm/sigma) +BIN_EDGES = [0.0, 0.8, 1.6, 4.0] +BIN_CTRS = [0.4, 1.2, 2.8] + +YEARS = ["20161", "20162", "2017", "2018"] + + +def read_yields(channel, sig_id): + """Return (bkg_yields, sig_yields) summed over all years as numpy arrays.""" + bkg_total = None + sig_total = None + for yr in YEARS: + path = os.path.join(DC_BASE, channel, + "Datacard_%s_%s_%s_statonly.txt" % (channel, sig_id, yr)) + if not os.path.exists(path): + continue + with open(path) as f: + lines = f.readlines() + rate_lines = [l for l in lines if l.startswith("rate")] + if len(rate_lines) < 1: + continue + vals = list(map(float, rate_lines[0].split()[1:])) + nbins = len(vals) // 2 + # makeDatacard.py writes signal first, then background in the rate line + sig = np.array(vals[:nbins]) + bkg = np.array(vals[nbins:]) + if bkg_total is None: + bkg_total = bkg.copy() + sig_total = sig.copy() + else: + bkg_total += bkg + sig_total += sig + return bkg_total, sig_total + + +def plot_channel(ax, channel, signals, colors, labels, title): + """Plot background + signals for one channel.""" + first_bkg = None + for sig_id, color, label in zip(signals, colors, labels): + bkg, sig = read_yields(channel, sig_id) + if bkg is None: + print("WARNING: no data for %s / %s" % (channel, sig_id)) + continue + if first_bkg is None: + first_bkg = bkg + + # Normalize signal to unit area + sig_norm = sig / sig.sum() if sig.sum() > 0 else sig + + # Plot as step histogram + ax.step(BIN_EDGES[:-1] + [BIN_EDGES[-1]], + list(sig_norm) + [0], + where='post', color=color, lw=2, label=label) + + # Background (use last read, they should all be the same shape) + if first_bkg is not None: + bkg_norm = first_bkg / first_bkg.sum() if first_bkg.sum() > 0 else first_bkg + ax.step(BIN_EDGES[:-1] + [BIN_EDGES[-1]], + list(bkg_norm) + [0], + where='post', color='black', lw=2.5, ls='--', label='Background') + + # Bin boundary lines + for edge in BIN_EDGES[1:-1]: + ax.axvline(edge, color='gray', lw=1.5, ls=':', alpha=0.8) + + # Bin edge labels at top (use axes fraction coordinates) + for i, (lo, hi) in enumerate(zip(BIN_EDGES[:-1], BIN_EDGES[1:])): + hi_str = "%.1f" % hi if hi < 3.5 else r"$\infty$" + x_frac = (BIN_CTRS[i] - BIN_EDGES[0]) / (BIN_EDGES[-1] - BIN_EDGES[0]) + ax.text(x_frac, 1.01, "[%.1f, %s]" % (lo, hi_str), + ha='center', va='bottom', fontsize=8, color='gray', + transform=ax.transAxes) + + ax.set_xlim(BIN_EDGES[0], BIN_EDGES[-1]) + ax.set_ylim(bottom=0) + ax.set_xlabel(r"Displacement significance $\sigma_{sv}$ (mm/$\sigma$)", fontsize=11) + ax.set_ylabel("Normalized yield (arb.)", fontsize=11) + ax.set_title(title, fontsize=12) + ax.legend(fontsize=9, loc='upper right') + ax.set_xticks(BIN_EDGES) + ax.tick_params(axis='both', labelsize=9) + + +def main(): + fig, axes = plt.subplots(1, 2, figsize=(12, 5)) + fig.suptitle( + "Background template and signal shapes -- nominal 3-bin scheme\n" + "Dashed vertical lines: bin boundaries at 0.8 and 1.6 $\\sigma_{sv}$", + fontsize=11 + ) + + # Bjet channel: use signals with contrasting lifetime shapes + plot_channel( + axes[0], + channel="bjet", + signals=[ + "mfv_neu_tau001000um_M0400", + "mfv_stopdbardbar_tau000300um_M0400", + ], + colors=["royalblue", "tomato"], + labels=[ + r"$\tilde{g}\tilde{g}$, $\tau=1$ mm, $M=400$ GeV", + r"$\tilde{t}\tilde{t}^*$, $\tau=0.3$ mm, $M=400$ GeV", + ], + title="Bjet channel (displaced jet + b-tag trigger)", + ) + + # Lepton channel + plot_channel( + axes[1], + channel="lep", + signals=[ + "VH_tau1mm_M55", + "VH_tau10mm_M55", + ], + colors=["royalblue", "tomato"], + labels=[ + r"VH $\to$ SS, $\tau=1$ mm, $m_S=55$ GeV", + r"VH $\to$ SS, $\tau=10$ mm, $m_S=55$ GeV", + ], + title="Lepton channel (lepton trigger)", + ) + + plt.tight_layout() + out = os.path.join(HERE, "background_templates.pdf") + fig.savefig(out, bbox_inches="tight") + print("Saved: %s" % out) + + out_png = os.path.join(HERE, "background_templates.png") + fig.savefig(out_png, bbox_inches="tight", dpi=150) + print("Saved: %s" % out_png) + + +if __name__ == "__main__": + main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/run_combine_study.sh b/MFVNeutralino/test/ForLimits/BinningStudy/run_combine_study.sh new file mode 100755 index 000000000..cd4c51c80 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/BinningStudy/run_combine_study.sh @@ -0,0 +1,71 @@ +#!/bin/bash +# Run inside CMSSW_14_1_0_pre4 with cmsenv already sourced. +# For each scheme x signal point: combineCards + FitDiagnostics + AsymptoticLimits (stat-only datacards). +set -e + +HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +DATACARD_BASE="${HERE}/datacards" +OUT_BASE="${HERE}/combine_output" + +YEARS="20161 20162 2017 2018" + +declare -A SIG_CHANNEL +SIG_CHANNEL["VH_tau1mm_M55"]="lep" +SIG_CHANNEL["VH_tau10mm_M55"]="lep" +SIG_CHANNEL["ggHToSSTodddd_tau1mm_M55"]="bjet" +SIG_CHANNEL["mfv_stopdbardbar_tau001000um_M0200"]="bjet" +SIG_CHANNEL["mfv_stopdbardbar_tau000300um_M0400"]="bjet" +SIG_CHANNEL["mfv_neu_tau001000um_M0400"]="bjet" + +for SCHEME in $(ls "${DATACARD_BASE}"); do + echo "" + echo "===============================" + echo "SCHEME: ${SCHEME}" + echo "===============================" + + for SIG_ID in "${!SIG_CHANNEL[@]}"; do + CH="${SIG_CHANNEL[$SIG_ID]}" + WORK_DIR="${OUT_BASE}/${SCHEME}/${SIG_ID}" + mkdir -p "${WORK_DIR}" + cd "${WORK_DIR}" + + # Build card_args: one card per year, named _= + CARD_ARGS="" + MISSING=0 + for YR in ${YEARS}; do + CARD="${DATACARD_BASE}/${SCHEME}/${CH}/Datacard_${CH}_${SIG_ID}_${YR}_statonly.txt" + if [ ! -f "${CARD}" ]; then + echo " SKIP (missing card): ${CARD}" + MISSING=1 + break + fi + CARD_ARGS="${CARD_ARGS} ${CH}_${YR}=${CARD}" + done + [ "${MISSING}" -eq 1 ] && continue + + COMBINED="combined_${SIG_ID}.txt" + + echo " Combining: ${SIG_ID}" + combineCards.py ${CARD_ARGS} > "${COMBINED}" 2>/dev/null + + echo " MultiDimFit grid scan (signal injection r=1)" + combine -M MultiDimFit --algo grid \ + --name "${SCHEME}_${SIG_ID}" \ + "${COMBINED}" \ + -t -1 --expectSignal 1 \ + --rMin 0.5 --rMax 1.5 --points 200 \ + -v 0 2>/dev/null || echo " WARNING: MultiDimFit failed" + + echo " AsymptoticLimits (expectSignal=0)" + combine -M AsymptoticLimits \ + --name "${SCHEME}_${SIG_ID}" \ + "${COMBINED}" \ + --expectSignal 0 \ + -v 0 2>/dev/null || echo " WARNING: AsymptoticLimits failed" + + cd "${HERE}" + done +done + +echo "" +echo "Combine study complete." diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/strip_systs.py b/MFVNeutralino/test/ForLimits/BinningStudy/strip_systs.py new file mode 100644 index 000000000..5ccb9bb20 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/BinningStudy/strip_systs.py @@ -0,0 +1,59 @@ +# Strip nuisance lines from datacards; write _statonly.txt alongside each. +# Usage: python strip_systs.py [scheme1 scheme2 ...] (default: all schemes) +import os, sys, glob + +HERE = os.path.dirname(os.path.abspath(__file__)) + + +def strip_one(src_path, dst_path): + with open(src_path) as f: + lines = f.readlines() + + out = [] + past_rate = False + for line in lines: + stripped = line.strip() + if stripped.startswith("rate ") or stripped.startswith("rate\t"): + out.append(line) + past_rate = True + continue + if past_rate: + continue # drop all nuisance lines + # Fix kmax line to 0 (no nuisances) + if stripped.startswith("kmax"): + out.append("kmax 0 number of nuisance parameters\n") + else: + out.append(line) + + with open(dst_path, "w") as f: + f.writelines(out) + + +def strip_scheme(scheme_dir): + n = 0 + for ch in ("lep", "bjet"): + ch_dir = os.path.join(scheme_dir, ch) + if not os.path.isdir(ch_dir): + continue + for fn in glob.glob(os.path.join(ch_dir, "Datacard_*.txt")): + if fn.endswith("_statonly.txt"): + continue + dst = fn.replace(".txt", "_statonly.txt") + strip_one(fn, dst) + n += 1 + return n + + +def main(): + datacards_dir = os.path.join(HERE, "datacards") + schemes = sys.argv[1:] if len(sys.argv) > 1 else sorted(os.listdir(datacards_dir)) + for name in schemes: + d = os.path.join(datacards_dir, name) + if not os.path.isdir(d): + continue + n = strip_scheme(d) + print("%-12s stripped %d datacards" % (name, n)) + + +if __name__ == "__main__": + main() diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_ggHToSSTodddd.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_ggHToSSTodddd.pkl new file mode 100644 index 000000000..4d1686421 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_ggHToSSTodddd.pkl @@ -0,0 +1,163 @@ +(dp0 +S'perc' +p1 +I00 +sS'y_vals' +p2 +cnumpy.core.multiarray +_reconstruct +p3 +(cnumpy +ndarray +p4 +(I0 +tp5 +S'b' +p6 +tp7 +Rp8 +(I1 +(I1 +tp9 +cnumpy +dtype +p10 +(S'f8' +p11 +I0 +I1 +tp12 +Rp13 +(I3 +S'<' +p14 +NNNI-1 +I-1 +I0 +tp15 +bI00 +S'\x00\x00\x00\x00\x00\x80K@' +p16 +tp17 +bsS'dtype' +p18 +c__builtin__ +float +p19 +sS'x_unit' +p20 +S'mm' +p21 +sS'arr_len' +p22 +I0 +sS'years' +p23 +c__builtin__ +set +p24 +((lp25 +S'2017' +p26 +aS'2016' +p27 +aS'2016APV' +p28 +aS'2018' +p29 +atp30 +Rp31 +sS'y_unit' +p32 +S'GeV' +p33 +sg29 +g3 +(g4 +(I0 +tp34 +g6 +tp35 +Rp36 +(I1 +(I3 +I1 +tp37 +g13 +I00 +S'[\xb1\xbf\xec\x9e<\xbc?\xbc\x05\x12\x14?\xc6\xac?\xb57\xf8\xc2d\xaa\xc0?' +p38 +tp39 +bsS'x_vals' +p40 +g3 +(g4 +(I0 +tp41 +g6 +tp42 +Rp43 +(I1 +(I3 +tp44 +g13 +I00 +S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00Y@' +p45 +tp46 +bsg26 +g3 +(g4 +(I0 +tp47 +g6 +tp48 +Rp49 +(I1 +(I3 +I1 +tp50 +g13 +I00 +S'\xfb:p\xce\x88\xd2\xbe?D\x8bl\xe7\xfb\xa9\xb1?\xc7):\x92\xcb\x7f\xc0?' +p51 +tp52 +bsg27 +g3 +(g4 +(I0 +tp53 +g6 +tp54 +Rp55 +(I1 +(I3 +I1 +tp56 +g13 +I00 +S'\xfa~j\xbct\x93\xa8?\x92\xcb\x7fH\xbf}\xad?\x00\x00\x00\x00\x00\x00\xf8\x7f' +p57 +tp58 +bsS'proc' +p59 +S'ggHToSSTodddd' +p60 +sg28 +g3 +(g4 +(I0 +tp61 +g6 +tp62 +Rp63 +(I1 +(I3 +I1 +tp64 +g13 +I00 +S'\x90\xa0\xf81\xe6\xae\xc5?d;\xdfO\x8d\x97\xce?\xf2\xd2Mb\x10X\xeb?' +p65 +tp66 +bs. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_neu.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_neu.pkl new file mode 100644 index 000000000..4f002eeff --- /dev/null +++ b/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_neu.pkl @@ -0,0 +1,163 @@ +(dp0 +S'perc' +p1 +I00 +sS'y_vals' +p2 +cnumpy.core.multiarray +_reconstruct +p3 +(cnumpy +ndarray +p4 +(I0 +tp5 +S'b' +p6 +tp7 +Rp8 +(I1 +(I8 +tp9 +cnumpy +dtype +p10 +(S'f8' +p11 +I0 +I1 +tp12 +Rp13 +(I3 +S'<' +p14 +NNNI-1 +I-1 +I0 +tp15 +bI00 +S'\x00\x00\x00\x00\x00\x00i@\x00\x00\x00\x00\x00\xc0r@\x00\x00\x00\x00\x00\x00y@\x00\x00\x00\x00\x00\xc0\x82@\x00\x00\x00\x00\x00\x00\x89@\x00\x00\x00\x00\x00\xc0\x92@\x00\x00\x00\x00\x00\x00\x99@\x00\x00\x00\x00\x00p\xa7@' +p16 +tp17 +bsS'dtype' +p18 +c__builtin__ +float +p19 +sS'x_unit' +p20 +S'mm' +p21 +sS'arr_len' +p22 +I0 +sS'years' +p23 +c__builtin__ +set +p24 +((lp25 +S'2017' +p26 +aS'2016' +p27 +aS'2016APV' +p28 +aS'2018' +p29 +atp30 +Rp31 +sS'y_unit' +p32 +S'GeV' +p33 +sg29 +g3 +(g4 +(I0 +tp34 +g6 +tp35 +Rp36 +(I1 +(I5 +I8 +tp37 +g13 +I00 +S'a\xc3\xd3+e\x19\xb2?\xd9\xce\xf7S\xe3\xa5\x9b?c\xeeZB>\xe8\x99?\xaa\xf1\xd2Mb\x10\x98?Zd;\xdfO\x8d\x97?V}\xae\xb6b\x7f\x99?\x82sF\x94\xf6\x06\x9f?J\x0c\x02+\x87\x16\xa9?\xf2\xb0Pk\x9aw\xac?\xa4p=\n\xd7\xa3\xa0?\x13a\xc3\xd3+e\x99?\x13a\xc3\xd3+e\x99?\xcb\xa1E\xb6\xf3\xfd\x94?\xcb\xa1E\xb6\xf3\xfd\x94?j\xbct\x93\x18\x04\x96?\xa85\xcd;N\xd1\xa1?\xf2\xb0Pk\x9aw\xac?\xd0D\xd8\xf0\xf4J\xa9?\x1c\xeb\xe26\x1a\xc0\x9b?Dio\xf0\x85\xc9\x94?a2U0*\xa9\x93?\xb1\xbf\xec\x9e<,\x94?+\x87\x16\xd9\xce\xf7\x93?Q\xda\x1b|a2\x95?c\xeeZB>\xe8\xa9?EGr\xf9\x0f\xe9\xa7?h\x91\xed|?5\x9e?\xdeq\x8a\x8e\xe4\xf2\x7f?\xfa~j\xbct\x93x?\xed\r\xbe0\x99*x?\xed\r\xbe0\x99*x?Q\xda\x1b|a2\x95?\xff!\xfd\xf6u\xe0\xac?\xd6\xc5m4\x80\xb7\xb0?\xd7\x12\xf2A\xcff\xa5?\t\x1b\x9e^)\xcb\x80?\xc7\xba\xb8\x8d\x06\xf0v?\xa1g\xb3\xeas\xb5u?\xa1g\xb3\xeas\xb5u?\xd4+e\x19\xe2Xw?' +p38 +tp39 +bsS'x_vals' +p40 +g3 +(g4 +(I0 +tp41 +g6 +tp42 +Rp43 +(I1 +(I5 +tp44 +g13 +I00 +S'\x9a\x99\x99\x99\x99\x99\xb9?333333\xd3?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00>@' +p45 +tp46 +bsg26 +g3 +(g4 +(I0 +tp47 +g6 +tp48 +Rp49 +(I1 +(I5 +I8 +tp50 +g13 +I00 +S'\xa4p=\n\xd7\xa3\xb0?\xc9v\xbe\x9f\x1a/\x9d?\xb3{\xf2\xb0Pk\x9a?\xbaI\x0c\x02+\x87\x96?\xbaI\x0c\x02+\x87\x96?Q\xda\x1b|a2\x95?\x0e\xbe0\x99*\x18\x95?\xfee\xf7\xe4a\xa1\x96?\x18&S\x05\xa3\x92\xaa?aTR\'\xa0\x89\xa0?\x15\x8cJ\xea\x044\xa1?^K\xc8\x07=\x9b\x95?Q\xda\x1b|a2\x95?\xbe0\x99*\x18\x95\x94?\x01M\x84\rO\xaf\x94?\xf1\xf4JY\x868\x96?\x18&S\x05\xa3\x92\xaa?\x1f\xf4lV}\xae\xa6?\x15\x8cJ\xea\x044\xa1?tF\x94\xf6\x06_\x98?\n\xd7\xa3p=\n\x97?j\xbct\x93\x18\x04\x96?\x1b/\xdd$\x06\x81\x95?\xf1\xf4JY\x868\x96?\xd5\th"lx\xaa?+\x87\x16\xd9\xce\xf7\xa3?\xb3{\xf2\xb0Pk\x9a?\t\x1b\x9e^)\xcb\x80?\x13a\xc3\xd3+ey?_\x07\xce\x19Q\xda{?\x82\xe2\xc7\x98\xbb\x96\x80?"\xfd\xf6u\xe0\x9c\x81?vO\x1e\x16jM\xa3?M\xf3\x8eSt$\xa7?X9\xb4\xc8v\xbe\x9f?\xdb\xf9~j\xbct\x83?\x13a\xc3\xd3+ey?_\x07\xce\x19Q\xda{?\xc7\xba\xb8\x8d\x06\xf0v? \xd2o_\x07\xcey?' +p51 +tp52 +bsg27 +g3 +(g4 +(I0 +tp53 +g6 +tp54 +Rp55 +(I1 +(I5 +I8 +tp56 +g13 +I00 +S'{\x14\xaeG\xe1z\x94?\xa1g\xb3\xeas\xb5\x95?Dio\xf0\x85\xc9\x94?\x0e\xbe0\x99*\x18\x95?\x88\x85Z\xd3\xbc\xe3\x94?Dio\xf0\x85\xc9\x94?\x01M\x84\rO\xaf\x94?%u\x02\x9a\x08\x1b\x9e?J\x0c\x02+\x87\x16\x99?\xfa~j\xbct\x93\x98?\n\xd7\xa3p=\n\x97?\xcb\xa1E\xb6\xf3\xfd\x94?\x01M\x84\rO\xaf\x94?\xbe0\x99*\x18\x95\x94?\xbe0\x99*\x18\x95\x94?\xe2X\x17\xb7\xd1\x00\x9e?-C\x1c\xeb\xe26\x9a?\xe0\x9c\x11\xa5\xbd\xc1\x97?\x1b/\xdd$\x06\x81\x95?\xb5\xa6y\xc7):\x92?\x01M\x84\rO\xaf\x94?\x88\x85Z\xd3\xbc\xe3\x94?\x88\x85Z\xd3\xbc\xe3\x94?\x9d\x80&\xc2\x86\xa7\x97?\n\xd7\xa3p=\n\xa7?7\x1a\xc0[ A\xa1?\xc5\x8f1w-!\x8f?lxz\xa5,C|?9\xb4\xc8v\xbe\x9fz? \xd2o_\x07\xcey?\xb8\x1e\x85\xebQ\xb8~?U\xc1\xa8\xa4N@\x83?\x03\t\x8a\x1fc\xee\xaa?\xb3{\xf2\xb0Pk\xaa?\x0e\xbe0\x99*\x18\x95? \xd2o_\x07\xcey?\xed\r\xbe0\x99*x?\xc7\xba\xb8\x8d\x06\xf0v?\xc7\xba\xb8\x8d\x06\xf0v?lxz\xa5,C|?' +p57 +tp58 +bsS'proc' +p59 +S'mfv_neu' +p60 +sg28 +g3 +(g4 +(I0 +tp61 +g6 +tp62 +Rp63 +(I1 +(I5 +I8 +tp64 +g13 +I00 +S'\xbe0\x99*\x18\x95\xa4?333333\xa3?Dio\xf0\x85\xc9\x94?\xe4\x83\x9e\xcd\xaa\xcf\x95?\xfa~j\xbct\x93\x98?\'\xa0\x89\xb0\xe1\xe9\x95?{\x14\xaeG\xe1z\x94?y\xe9&1\x08\xac\x9c?\x84\x9e\xcd\xaa\xcf\xd5\xa6?\xbaI\x0c\x02+\x87\xa6?2\xe6\xae%\xe4\x83\x9e?A\x82\xe2\xc7\x98\xbb\x96?\xae\xd8_vO\x1e\x96?^K\xc8\x07=\x9b\x95?\'\xa0\x89\xb0\xe1\xe9\x95?y\xe9&1\x08\xac\x9c?\x95\xd4\th"l\xb8?\xcc\xee\xc9\xc3B\xad\xb9?\xc1\xca\xa1E\xb6\xf3\xad?\x1e\x16jM\xf3\x8e\xa3?\xef\xc9\xc3B\xadi\x9e?S\x96!\x8euq\x9b?\xc0\xec\x9e<,\xd4\x9a?y\xe9&1\x08\xac\x9c?6<\xbdR\x96!\xc6?\xac\x8b\xdbh\x00o\xc1?\x0b\xb5\xa6y\xc7)\xba?\xdf\xe0\x0b\x93\xa9\x82\xb1?Tt$\x97\xff\x90\xae?EGr\xf9\x0f\xe9\xa7?tF\x94\xf6\x06_\xa8?\x1e\xa7\xe8H.\xff\xb1?\xbct\x93\x18\x04V\xc6?_\x07\xce\x19Q\xda\xc3?\x02\x9a\x08\x1b\x9e^\xb9?t$\x97\xff\x90~\xab?\xd4+e\x19\xe2X\xa7?EGr\xf9\x0f\xe9\xa7?\x93\x18\x04V\x0e-\xa2?\xb1\xbf\xec\x9e<,\xa4?' +p65 +tp66 +bs. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_stopbbarbbar.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_stopbbarbbar.pkl new file mode 100644 index 000000000..8cbbedfea --- /dev/null +++ b/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_stopbbarbbar.pkl @@ -0,0 +1,163 @@ +(dp0 +S'perc' +p1 +I00 +sS'y_vals' +p2 +cnumpy.core.multiarray +_reconstruct +p3 +(cnumpy +ndarray +p4 +(I0 +tp5 +S'b' +p6 +tp7 +Rp8 +(I1 +(I8 +tp9 +cnumpy +dtype +p10 +(S'f8' +p11 +I0 +I1 +tp12 +Rp13 +(I3 +S'<' +p14 +NNNI-1 +I-1 +I0 +tp15 +bI00 +S'\x00\x00\x00\x00\x00\x00i@\x00\x00\x00\x00\x00\xc0r@\x00\x00\x00\x00\x00\x00y@\x00\x00\x00\x00\x00\xc0\x82@\x00\x00\x00\x00\x00\x00\x89@\x00\x00\x00\x00\x00\xc0\x92@\x00\x00\x00\x00\x00\x00\x99@\x00\x00\x00\x00\x00p\xa7@' +p16 +tp17 +bsS'dtype' +p18 +c__builtin__ +float +p19 +sS'x_unit' +p20 +S'mm' +p21 +sS'arr_len' +p22 +I0 +sS'years' +p23 +c__builtin__ +set +p24 +((lp25 +S'2017' +p26 +aS'2016' +p27 +aS'2016APV' +p28 +aS'2018' +p29 +atp30 +Rp31 +sS'y_unit' +p32 +S'GeV' +p33 +sg29 +g3 +(g4 +(I0 +tp34 +g6 +tp35 +Rp36 +(I1 +(I5 +I8 +tp37 +g13 +I00 +S"vq\x1b\r\xe0-\xb0?\xbb'\x0f\x0b\xb5\xa6\xa9?;\xdfO\x8d\x97n\xa2?\xa85\xcd;N\xd1\xa1?\xfd\x87\xf4\xdb\xd7\x81\xa3?(~\x8c\xb9k\t\xa9?\xce\x88\xd2\xde\xe0\x0b\xb3?\xa5,C\x1c\xeb\xe2\xb6?\n\xd7\xa3p=\n\xa7?\xb1\xe1\xe9\x95\xb2\x0c\xa1? \xd2o_\x07\xce\x99?\xed\r\xbe0\x99*\x98?V}\xae\xb6b\x7f\x99?%u\x02\x9a\x08\x1b\x9e?\x9c\xc4 \xb0rh\xa1?\xa9\x13\xd0D\xd8\xf0\xa4?'\xa0\x89\xb0\xe1\xe9\xa5?aTR'\xa0\x89\xa0?Dio\xf0\x85\xc9\x94?\xe8j+\xf6\x97\xdd\x93?\xdf\xe0\x0b\x93\xa9\x82\x91?U\xc1\xa8\xa4N@\x93?Dio\xf0\x85\xc9\x94?\x07\xf0\x16HP\xfc\x98?\xdf\xe0\x0b\x93\xa9\x82\xa1?\xdf\xe0\x0b\x93\xa9\x82\xa1?\xc2\x17&S\x05\xa3\x92?\x9f<,\xd4\x9a\xe6}?\x9f<,\xd4\x9a\xe6}?lxz\xa5,C|?_\x07\xce\x19Q\xda{?F%u\x02\x9a\x08{?\x7f\xd9=yX\xa8\xa5?R\xb8\x1e\x85\xebQ\xa8?\xf6\x97\xdd\x93\x87\x85\x9a?\x9f<,\xd4\x9a\xe6}?y\xe9&1\x08\xac|?\x07\xf0\x16HP\xfcx? \xd2o_\x07\xcey?\xfa~j\xbct\x93x?" +p38 +tp39 +bsS'x_vals' +p40 +g3 +(g4 +(I0 +tp41 +g6 +tp42 +Rp43 +(I1 +(I5 +tp44 +g13 +I00 +S'\x9a\x99\x99\x99\x99\x99\xb9?333333\xd3?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00>@' +p45 +tp46 +bsg26 +g3 +(g4 +(I0 +tp47 +g6 +tp48 +Rp49 +(I1 +(I5 +I8 +tp50 +g13 +I00 +S'\x8d(\xed\r\xbe0\x99?\x07\xf0\x16HP\xfc\x98?\x84\x9e\xcd\xaa\xcf\xd5\x96?=\x9bU\x9f\xab\xad\x98?\x91\x0fz6\xab>\x97?j\xbct\x93\x18\x04\x96?j\xbct\x93\x18\x04\x96?f\xf7\xe4a\xa1\xd6\xa4?\r\xe0-\x90\xa0\xf8\xa1?\x1c\xeb\xe26\x1a\xc0\x9b?Zd;\xdfO\x8d\x97?\xa1g\xb3\xeas\xb5\x95?\xd7\x12\xf2A\xcff\x95?\x1b/\xdd$\x06\x81\x95?\x0e\xbe0\x99*\x18\x95?+\x87\x16\xd9\xce\xf7\xa3?\xd74\xef8EG\xa2?"\xfd\xf6u\xe0\x9c\xa1?\xa3#\xb9\xfc\x87\xf4\x9b?\xed\r\xbe0\x99*\x98?\xbaI\x0c\x02+\x87\x96?j\xbct\x93\x18\x04\x96?j\xbct\x93\x18\x04\x96?+\x87\x16\xd9\xce\xf7\xa3?\xe0\xbe\x0e\x9c3\xa2\xa4?r\x8a\x8e\xe4\xf2\x1f\xa2?\x91\x0fz6\xab>\x97?\xc5\xfe\xb2{\xf2\xb0\x90?K\xc8\x07=\x9bU\x8f?\x8d(\xed\r\xbe0\x89?\xa85\xcd;N\xd1\x81?\xa85\xcd;N\xd1\x91?\xdb\xf9~j\xbct\xa3?\x01M\x84\rO\xaf\xa4?\xd0D\xd8\xf0\xf4J\x99?\x82\xe2\xc7\x98\xbb\x96\x90?\x86Z\xd3\xbc\xe3\x14\x8d?A\x82\xe2\xc7\x98\xbb\x86?\x0e\xbe0\x99*\x18\x85?\xa6\nF%u\x02\x8a?' +p51 +tp52 +bsg27 +g3 +(g4 +(I0 +tp53 +g6 +tp54 +Rp55 +(I1 +(I5 +I8 +tp56 +g13 +I00 +S'\xc3\xd3+e\x19\xe2\x98?=\x9bU\x9f\xab\xad\x98?\x1b/\xdd$\x06\x81\x95?\xbe0\x99*\x18\x95\x94?{\x14\xaeG\xe1z\x94?\xc7\xba\xb8\x8d\x06\xf0\x96?\r\xe0-\x90\xa0\xf8\xa1?\xbc\x05\x12\x14?\xc6\xbc?\xd4+e\x19\xe2X\x97?M\xf3\x8eSt$\x97?\xd7\x12\xf2A\xcff\x95?\xbe0\x99*\x18\x95\x94?\x88\x85Z\xd3\xbc\xe3\x94?=\x9bU\x9f\xab\xad\x98?=\x9bU\x9f\xab\xad\x98?\xa5N@\x13a\xc3\xb3?\x10z6\xab>W\x9b?\xa1g\xb3\xeas\xb5\x95?L7\x89A`\xe5\x90?U\xc1\xa8\xa4N@\x93?\xdb\xf9~j\xbct\x93?\x88\x85Z\xd3\xbc\xe3\x94?0*\xa9\x13\xd0D\x98?j\xbct\x93\x18\x04\xa6?\x8d(\xed\r\xbe0\xa9?{\x14\xaeG\xe1z\x94?\xed\r\xbe0\x99*\x88?\xac\xad\xd8_vO~?\xdeq\x8a\x8e\xe4\xf2\x7f?\xc5\x8f1w-!\x7f?\xce\x88\xd2\xde\xe0\x0b\x83?K\xc8\x07=\x9bU\x8f?\x07\xf0\x16HP\xfc\xa8?\x92\xcb\x7fH\xbf}\x9d?\x86Z\xd3\xbc\xe3\x14\x8d?\xfc\xa9\xf1\xd2Mb\x80?\x13a\xc3\xd3+ey?S\x96!\x8euq{?\x9f<,\xd4\x9a\xe6}?\xbaI\x0c\x02+\x87\x86?' +p57 +tp58 +bsS'proc' +p59 +S'mfv_stopbbarbbar' +p60 +sg28 +g3 +(g4 +(I0 +tp61 +g6 +tp62 +Rp63 +(I1 +(I5 +I8 +tp64 +g13 +I00 +S'{\x14\xaeG\xe1z\x94?\xa1g\xb3\xeas\xb5\x95?\x88\x85Z\xd3\xbc\xe3\x94?\x88\x85Z\xd3\xbc\xe3\x94?\x1b/\xdd$\x06\x81\x95?\xbaI\x0c\x02+\x87\x96?_)\xcb\x10\xc7\xba\xa8?\xb8\x1e\x85\xebQ\xb8\xbe?\xe7\x8c(\xed\r\xbe\xa0?_\x07\xce\x19Q\xda\x9b?M\xf3\x8eSt$\x97?\x84\x9e\xcd\xaa\xcf\xd5\x96?\xa1g\xb3\xeas\xb5\x95?\x1b/\xdd$\x06\x81\x95?9\xb4\xc8v\xbe\x9f\x9a?aTR\'\xa0\x89\xb0?\xbe\xc1\x17&S\x05\xb3?\xe7\x8c(\xed\r\xbe\xb0?\xa6\nF%u\x02\xaa?\xc3\xf5(\\\x8f\xc2\xa5?\xf0\x16HP\xfc\x18\xa3?;\xdfO\x8d\x97n\xa2??\xc6\xdc\xb5\x84|\xa0?aTR\'\xa0\x89\xb0?\x8fSt$\x97\xff\xc8?\xca\xc3B\xadi\xde\xc1?\xa6\x9b\xc4 \xb0r\xc0?\xe5\xd0"\xdb\xf9~\xba?\xf2\xd2Mb\x10X\xb9?\x17HP\xfc\x18s\xb7?(~\x8c\xb9k\t\xb9?C\x1c\xeb\xe26\x1a\xc0?\xf6(\\\x8f\xc2\xf5\xc8?\xbe\xc1\x17&S\x05\xc3?C\xadi\xdeq\x8a\xbe?\xf6(\\\x8f\xc2\xf5\xb8?\xcff\xd5\xe7j+\xb6?\xbe\xc1\x17&S\x05\xb3?\xe4\x14\x1d\xc9\xe5?\xb4?\x95\xd4\th"l\xb8?' +p65 +tp66 +bs. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_stopdbardbar.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_stopdbardbar.pkl new file mode 100644 index 000000000..8cdda2161 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_stopdbardbar.pkl @@ -0,0 +1,163 @@ +(dp0 +S'perc' +p1 +I00 +sS'y_vals' +p2 +cnumpy.core.multiarray +_reconstruct +p3 +(cnumpy +ndarray +p4 +(I0 +tp5 +S'b' +p6 +tp7 +Rp8 +(I1 +(I8 +tp9 +cnumpy +dtype +p10 +(S'f8' +p11 +I0 +I1 +tp12 +Rp13 +(I3 +S'<' +p14 +NNNI-1 +I-1 +I0 +tp15 +bI00 +S'\x00\x00\x00\x00\x00\x00i@\x00\x00\x00\x00\x00\xc0r@\x00\x00\x00\x00\x00\x00y@\x00\x00\x00\x00\x00\xc0\x82@\x00\x00\x00\x00\x00\x00\x89@\x00\x00\x00\x00\x00\xc0\x92@\x00\x00\x00\x00\x00\x00\x99@\x00\x00\x00\x00\x00p\xa7@' +p16 +tp17 +bsS'dtype' +p18 +c__builtin__ +float +p19 +sS'x_unit' +p20 +S'mm' +p21 +sS'arr_len' +p22 +I0 +sS'years' +p23 +c__builtin__ +set +p24 +((lp25 +S'2017' +p26 +aS'2016' +p27 +aS'2016APV' +p28 +aS'2018' +p29 +atp30 +Rp31 +sS'y_unit' +p32 +S'GeV' +p33 +sg29 +g3 +(g4 +(I0 +tp34 +g6 +tp35 +Rp36 +(I1 +(I5 +I8 +tp37 +g13 +I00 +S"0\xbb'\x0f\x0b\xb5\xb6?\xa5\xbd\xc1\x17&S\xb5?\x1aQ\xda\x1b|a\xb2?\xe4\x14\x1d\xc9\xe5?\xb4?\xc2\x86\xa7W\xca2\xb4?\xf1c\xcc]K\xc8\xb7?\xd4+e\x19\xe2X\xb7?\xd4+e\x19\xe2X\xb7?\xc6m4\x80\xb7@\xb2?lxz\xa5,C\xac?\xdc\xd7\x81sF\x94\xa6?^K\xc8\x07=\x9b\xa5?\xa1g\xb3\xeas\xb5\xa5?\xcc\x7fH\xbf}\x1d\xa8?\x96\xb2\x0cq\xac\x8b\xab?\x96\xb2\x0cq\xac\x8b\xab?\x07\xf0\x16HP\xfc\xa8?\x12\xa5\xbd\xc1\x17&\xa3?\xa3#\xb9\xfc\x87\xf4\x9b?tF\x94\xf6\x06_\x98?\n\xd7\xa3p=\n\x97?\x07\xf0\x16HP\xfc\x98?\x8d(\xed\r\xbe0\x99?M\xf3\x8eSt$\x97?<\xbdR\x96!\x8e\xa5?/n\xa3\x01\xbc\x05\xa2?\x19\x04V\x0e-\xb2\x8d?\x8fSt$\x97\xff\x80?y\xe9&1\x08\xac|?\xdeq\x8a\x8e\xe4\xf2\x7f?\x9f<,\xd4\x9a\xe6}?\xc2\x17&S\x05\xa3\x82?K\xc8\x07=\x9bU\xaf?5\xef8EGr\xa9?5\xef8EGr\xa9?\x9f<,\xd4\x9a\xe6}?y\xe9&1\x08\xac|?\x13a\xc3\xd3+ey?9\xb4\xc8v\xbe\x9fz?_\x07\xce\x19Q\xda{?" +p38 +tp39 +bsS'x_vals' +p40 +g3 +(g4 +(I0 +tp41 +g6 +tp42 +Rp43 +(I1 +(I5 +tp44 +g13 +I00 +S'\x9a\x99\x99\x99\x99\x99\xb9?333333\xd3?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00>@' +p45 +tp46 +bsg26 +g3 +(g4 +(I0 +tp47 +g6 +tp48 +Rp49 +(I1 +(I5 +I8 +tp50 +g13 +I00 +S"\xa0\x1a/\xdd$\x06\xb1?\x03\t\x8a\x1fc\xee\xaa?\n\xd7\xa3p=\n\xa7?\xecQ\xb8\x1e\x85\xeb\xa1?\xd2\x00\xde\x02\t\x8a\x9f?tF\x94\xf6\x06_\x98?\xcc]K\xc8\x07=\x9b?9\xb4\xc8v\xbe\x9f\xaa?}\xae\xb6b\x7f\xd9\xad?\x06\x12\x14?\xc6\xdc\xa5?aTR'\xa0\x89\xa0?9\xb4\xc8v\xbe\x9f\x9a?c\xeeZB>\xe8\x99?A\x82\xe2\xc7\x98\xbb\x96?\x13a\xc3\xd3+e\x99?\xa2E\xb6\xf3\xfd\xd4\xa8?\xf3\x8eSt$\x97\xaf?\xaa\xf1\xd2Mb\x10\xa8?D\x8bl\xe7\xfb\xa9\xa1?D\x8bl\xe7\xfb\xa9\xa1?S\x96!\x8euq\x9b?\xbaI\x0c\x02+\x87\x96?\x8d(\xed\r\xbe0\x99?\x1b\r\xe0-\x90\xa0\xa8?\x12\xa5\xbd\xc1\x17&\xa3??\xc6\xdc\xb5\x84|\xa0?j\xbct\x93\x18\x04\x96?\x9f<,\xd4\x9a\xe6\x8d?\x9f<,\xd4\x9a\xe6\x8d?\xb5\xa6y\xc7):\x82?\x82\xe2\xc7\x98\xbb\x96\x80?\x01M\x84\rO\xaf\x94?\x9a\x99\x99\x99\x99\x99\xa9?\xa9\x13\xd0D\xd8\xf0\xa4?\xd4+e\x19\xe2X\x97?\xc5\xfe\xb2{\xf2\xb0\x90?2\xe6\xae%\xe4\x83\x8e?A\x82\xe2\xc7\x98\xbb\x86?4\x116<\xbdR\x86?tF\x94\xf6\x06_\x88?" +p51 +tp52 +bsg27 +g3 +(g4 +(I0 +tp53 +g6 +tp54 +Rp55 +(I1 +(I5 +I8 +tp56 +g13 +I00 +S'Zd;\xdfO\x8d\x97?\x94\xf6\x06_\x98L\x95?\x84\x9e\xcd\xaa\xcf\xd5\x96?4\x116<\xbdR\x96?\xae\xd8_vO\x1e\x96?aTR\'\xa0\x89\xa0?r\x8a\x8e\xe4\xf2\x1f\xb2?M\x84\rO\xaf\x94\xcd? \xd2o_\x07\xce\x99?\xd4+e\x19\xe2X\x97?\xae\xd8_vO\x1e\x96?\xae\xd8_vO\x1e\x96?j\xbct\x93\x18\x04\x96?\xaa\xf1\xd2Mb\x10\x98?\x1aQ\xda\x1b|a\xa2?\xe2X\x17\xb7\xd1\x00\xbe?\x07\xf0\x16HP\xfc\x98?\xbe0\x99*\x18\x95\x94?"\xfd\xf6u\xe0\x9c\x91?{\x14\xaeG\xe1z\x94?\xa5N@\x13a\xc3\x93?\xe0\x9c\x11\xa5\xbd\xc1\x97?\x07\xf0\x16HP\xfc\x98?\xf3\x8eSt$\x97\xaf?K\xc8\x07=\x9bU\x9f?\xdb\xf9~j\xbct\x93?\x1b/\xdd$\x06\x81\x85?{\x14\xaeG\xe1z\x84?vq\x1b\r\xe0-\x80?\xb5\xa6y\xc7):\x82?\x94\xf6\x06_\x98L\x85?\xf3\x8eSt$\x97\xaf?\xab\xcf\xd5V\xec/\xab?lxz\xa5,C\x9c?{\x14\xaeG\xe1z\x84?y\xe9&1\x08\xac|?lxz\xa5,C|?\x92\xcb\x7fH\xbf}}?\xb8\x1e\x85\xebQ\xb8~?g\xd5\xe7j+\xf6\x87?' +p57 +tp58 +bsS'proc' +p59 +S'mfv_stopdbardbar' +p60 +sg28 +g3 +(g4 +(I0 +tp61 +g6 +tp62 +Rp63 +(I1 +(I5 +I8 +tp64 +g13 +I00 +S'{\x14\xaeG\xe1z\x94?\x01M\x84\rO\xaf\x94?\xae\xd8_vO\x1e\x96?M\xf3\x8eSt$\x97?4\x116<\xbdR\x96?\x9bU\x9f\xab\xad\xd8\x9f?\x0eO\xaf\x94e\x88\xb3?U0*\xa9\x13\xd0\xcc?\x15\x8cJ\xea\x044\xa1?\xbc\x05\x12\x14?\xc6\x9c?\xf6\x97\xdd\x93\x87\x85\x9a?\xfa~j\xbct\x93\x98?\x91\x0fz6\xab>\x97?\xc7\xba\xb8\x8d\x06\xf0\x96?\xdb\xf9~j\xbct\xa3?\x8a\xb0\xe1\xe9\x95\xb2\xbc?\xa9\xa4N@\x13a\xb3?\x00o\x81\x04\xc5\x8f\xb1?mV}\xae\xb6b\xbf?\x91\xed|?5^\xaa?4\x116<\xbdR\xa6?\x1e\x16jM\xf3\x8e\xa3?sh\x91\xed|?\xa5?333333\xb3?\x7f\xfb:p\xce\x88\xc2?\x8fSt$\x97\xff\xc0?mV}\xae\xb6b\xbf?\x92\xcb\x7fH\xbf}\xbd?\xd9_vO\x1e\x16\xba?\x0f\x9c3\xa2\xb47\xb8?h"lxz\xa5\xbc?\xee\xeb\xc09#J\xc3?\xaf\x94e\x88c]\xc4?\xa4p=\n\xd7\xa3\xc0?\x14?\xc6\xdc\xb5\x84\xbc?\x9e\xef\xa7\xc6K7\xb9?U0*\xa9\x13\xd0\xb4?\xe4\x83\x9e\xcd\xaa\xcf\xb5?\x7f\xd9=yX\xa8\xb5?\x88c]\xdcF\x03\xb8?' +p65 +tp66 +bs. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_VH.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_VH.pkl new file mode 100644 index 000000000..7cc2e0941 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_VH.pkl @@ -0,0 +1,125 @@ +(dp0 +S'perc' +p1 +I01 +sS'y_vals' +p2 +cnumpy.core.multiarray +_reconstruct +p3 +(cnumpy +ndarray +p4 +(I0 +tp5 +S'b' +p6 +tp7 +Rp8 +(I1 +(I3 +tp9 +cnumpy +dtype +p10 +(S'f8' +p11 +I0 +I1 +tp12 +Rp13 +(I3 +S'<' +p14 +NNNI-1 +I-1 +I0 +tp15 +bI00 +S'\x00\x00\x00\x00\x00\x00.@\x00\x00\x00\x00\x00\x00D@\x00\x00\x00\x00\x00\x80K@' +p16 +tp17 +bsS'dtype' +p18 +c__builtin__ +float +p19 +sS'x_unit' +p20 +S'mm' +p21 +sS'arr_len' +p22 +I0 +sS'years' +p23 +c__builtin__ +set +p24 +((lp25 +S'2017-8' +p26 +aS'20161-2' +p27 +atp28 +Rp29 +sS'y_unit' +p30 +S'GeV' +p31 +sg27 +g3 +(g4 +(I0 +tp32 +g6 +tp33 +Rp34 +(I1 +(I6 +I3 +tp35 +g13 +I00 +S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?;\x01M\x84\rO\xe3?\xffC\xfa\xed\xeb\xc0\xd9?\x00\x00\x00\x00\x00\x00\xf0?J{\x83/L\xa6\xd2?\x0f\x9c3\xa2\xb47\xd0?\x00\x00\x00\x00\x00\x00\xf0?\xe3X\x17\xb7\xd1\x00\xce?\xcf\x88\xd2\xde\xe0\x0b\xc3?\x00\x00\x00\x00\x00\x00\xf0?\x91~\xfb:p\xce\xc8?\x8cJ\xea\x044\x11\xc6?\x00\x00\x00\x00\x00\x00\xf0?\x10\xe9\xb7\xaf\x03\xe7\xcc?\xfee\xf7\xe4a\xa1\xc6?' +p36 +tp37 +bsS'x_vals' +p38 +g3 +(g4 +(I0 +tp39 +g6 +tp40 +Rp41 +(I1 +(I6 +tp42 +g13 +I00 +S'\x9a\x99\x99\x99\x99\x99\xb9?333333\xd3?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x08@\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00>@' +p43 +tp44 +bsg26 +g3 +(g4 +(I0 +tp45 +g6 +tp46 +Rp47 +(I1 +(I6 +I3 +tp48 +g13 +I00 +S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xb1Pk\x9aw\x9c\xd2?!\x1f\xf4lV}\xd6?,\xf6\x97\xdd\x93\x87\xe9?h"lxz\xa5\xcc?C>\xe8\xd9\xac\xfa\xcc?\xda=yX\xa85\xe5?-\xb2\x9d\xef\xa7\xc6\xcb?hDio\xf0\x85\xc9?\xbe\xc1\x17&S\x05\xdb?\xcd;N\xd1\x91\\\xce?\xff\xb2{\xf2\xb0P\xcb?\xe7?\xa4\xdf\xbe\x0e\xdc? \xd2o_\x07\xce\xd1?\xc0[ A\xf1c\xcc?' +p49 +tp50 +bsS'proc' +p51 +S'VH' +p52 +s. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_ggHToSSTodddd.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_ggHToSSTodddd.pkl new file mode 100644 index 000000000..009a71d91 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_ggHToSSTodddd.pkl @@ -0,0 +1,125 @@ +(dp0 +S'perc' +p1 +I01 +sS'y_vals' +p2 +cnumpy.core.multiarray +_reconstruct +p3 +(cnumpy +ndarray +p4 +(I0 +tp5 +S'b' +p6 +tp7 +Rp8 +(I1 +(I3 +tp9 +cnumpy +dtype +p10 +(S'f8' +p11 +I0 +I1 +tp12 +Rp13 +(I3 +S'<' +p14 +NNNI-1 +I-1 +I0 +tp15 +bI00 +S'\x00\x00\x00\x00\x00\x00.@\x00\x00\x00\x00\x00\x00D@\x00\x00\x00\x00\x00\x80K@' +p16 +tp17 +bsS'dtype' +p18 +c__builtin__ +float +p19 +sS'x_unit' +p20 +S'mm' +p21 +sS'arr_len' +p22 +I0 +sS'years' +p23 +c__builtin__ +set +p24 +((lp25 +S'2017-8' +p26 +aS'20161-2' +p27 +atp28 +Rp29 +sS'y_unit' +p30 +S'GeV' +p31 +sg27 +g3 +(g4 +(I0 +tp32 +g6 +tp33 +Rp34 +(I1 +(I4 +I3 +tp35 +g13 +I00 +S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?h"lxz\xa5\xe4?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?9EGr\xf9\x0f\xe1?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?9EGr\xf9\x0f\xe1?' +p36 +tp37 +bsS'x_vals' +p38 +g3 +(g4 +(I0 +tp39 +g6 +tp40 +Rp41 +(I1 +(I4 +tp42 +g13 +I00 +S'\x9a\x99\x99\x99\x99\x99\xb9?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00Y@' +p43 +tp44 +bsg26 +g3 +(g4 +(I0 +tp45 +g6 +tp46 +Rp47 +(I1 +(I4 +I3 +tp48 +g13 +I00 +S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x18&S\x05\xa3\x92\xda?C\x1c\xeb\xe26\x1a\xd0?\x00\x00\x00\x00\x00\x00\xf0?(\xa0\x89\xb0\xe1\xe9\xd5?d;\xdfO\x8d\x97\xce?\x00\x00\x00\x00\x00\x00\xf0?(\xa0\x89\xb0\xe1\xe9\xd5?d;\xdfO\x8d\x97\xce?' +p49 +tp50 +bsS'proc' +p51 +S'ggHToSSTodddd' +p52 +s. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_neu.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_neu.pkl new file mode 100644 index 000000000..41d57579c --- /dev/null +++ b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_neu.pkl @@ -0,0 +1,125 @@ +(dp0 +S'perc' +p1 +I01 +sS'y_vals' +p2 +cnumpy.core.multiarray +_reconstruct +p3 +(cnumpy +ndarray +p4 +(I0 +tp5 +S'b' +p6 +tp7 +Rp8 +(I1 +(I3 +tp9 +cnumpy +dtype +p10 +(S'f8' +p11 +I0 +I1 +tp12 +Rp13 +(I3 +S'<' +p14 +NNNI-1 +I-1 +I0 +tp15 +bI00 +S'\x00\x00\x00\x00\x00\x00i@\x00\x00\x00\x00\x00\x00y@\x00\x00\x00\x00\x00\x00\x89@' +p16 +tp17 +bsS'dtype' +p18 +c__builtin__ +float +p19 +sS'x_unit' +p20 +S'mm' +p21 +sS'arr_len' +p22 +I0 +sS'years' +p23 +c__builtin__ +set +p24 +((lp25 +S'2017-8' +p26 +aS'20161-2' +p27 +atp28 +Rp29 +sS'y_unit' +p30 +S'GeV' +p31 +sg27 +g3 +(g4 +(I0 +tp32 +g6 +tp33 +Rp34 +(I1 +(I5 +I3 +tp35 +g13 +I00 +S'\xeeZB>\xe8\xd9\xdc?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x18\x95\xd4\th"\xcc?\xe8\xfb\xa9\xf1\xd2M\xd2?\xed\r\xbe0\x99*\xd8?(\xa0\x89\xb0\xe1\xe9\xc5?\xb8\x1e\x85\xebQ\xb8\xce?\x9a\x99\x99\x99\x99\x99\xc9?\x08\xce\x19Q\xda\x1b\xbc?)\\\x8f\xc2\xf5(\xbc?)\\\x8f\xc2\xf5(\xbc?\xfee\xf7\xe4a\xa1\xc6?\n\xd7\xa3p=\n\xc7?\n\xd7\xa3p=\n\xc7?' +p36 +tp37 +bsS'x_vals' +p38 +g3 +(g4 +(I0 +tp39 +g6 +tp40 +Rp41 +(I1 +(I5 +tp42 +g13 +I00 +S'\x9a\x99\x99\x99\x99\x99\xb9?333333\xd3?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00>@' +p43 +tp44 +bsg26 +g3 +(g4 +(I0 +tp45 +g6 +tp46 +Rp47 +(I1 +(I5 +I3 +tp48 +g13 +I00 +S"\xa1g\xb3\xeas\xb5\xe1?\xc3d\xaa`TR\xe7?\x01M\x84\rO\xaf\xec?\xaf%\xe4\x83\x9e\xcd\xd2?'S\x05\xa3\x92:\xd9?%\xe4\x83\x9e\xcd\xaa\xdf?\xfa\xa0g\xb3\xeas\xc5?\xb8\x1e\x85\xebQ\xb8\xce?\x9a\x99\x99\x99\x99\x99\xc9?\xc2\x17&S\x05\xa3\xb2?{\x14\xaeG\xe1z\xb4?\xb8\x1e\x85\xebQ\xb8\xae?\xf8\xc2d\xaa`T\xb2?{\x14\xaeG\xe1z\xb4?\xb8\x1e\x85\xebQ\xb8\xae?" +p49 +tp50 +bsS'proc' +p51 +S'mfv_neu' +p52 +s. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_stopbbarbbar.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_stopbbarbbar.pkl new file mode 100644 index 000000000..df7e4b991 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_stopbbarbbar.pkl @@ -0,0 +1,125 @@ +(dp0 +S'perc' +p1 +I01 +sS'y_vals' +p2 +cnumpy.core.multiarray +_reconstruct +p3 +(cnumpy +ndarray +p4 +(I0 +tp5 +S'b' +p6 +tp7 +Rp8 +(I1 +(I3 +tp9 +cnumpy +dtype +p10 +(S'f8' +p11 +I0 +I1 +tp12 +Rp13 +(I3 +S'<' +p14 +NNNI-1 +I-1 +I0 +tp15 +bI00 +S'\x00\x00\x00\x00\x00\x00i@\x00\x00\x00\x00\x00\x00y@\x00\x00\x00\x00\x00\x00\x89@' +p16 +tp17 +bsS'dtype' +p18 +c__builtin__ +float +p19 +sS'x_unit' +p20 +S'mm' +p21 +sS'arr_len' +p22 +I0 +sS'years' +p23 +c__builtin__ +set +p24 +((lp25 +S'2017-8' +p26 +aS'20161-2' +p27 +atp28 +Rp29 +sS'y_unit' +p30 +S'GeV' +p31 +sg27 +g3 +(g4 +(I0 +tp32 +g6 +tp33 +Rp34 +(I1 +(I5 +I3 +tp35 +g13 +I00 +S'\xc1\xa8\xa4N@\x13\xe5?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xd6\xc5m4\x80\xb7\xe0?\xc0[ A\xf1c\xcc?@' +p43 +tp44 +bsg26 +g3 +(g4 +(I0 +tp45 +g6 +tp46 +Rp47 +(I1 +(I5 +I3 +tp48 +g13 +I00 +S'\x88\xf4\xdb\xd7\x81s\xee?L7\x89A`\xe5\xec?\nF%u\x02\x9a\xe8?.\xff!\xfd\xf6u\xd8?\x9f\xab\xad\xd8_v\xcf?\xaf%\xe4\x83\x9e\xcd\xd2?\xf7\x06_\x98L\x15\xd4?\x05\xc5\x8f1w-\xc1?)\\\x8f\xc2\xf5(\xac?5^\xbaI\x0c\x02\xd3?\xf6\x97\xdd\x93\x87\x85\xba?\xe8j+\xf6\x97\xdd\xa3?\xc5\xb1.n\xa3\x01\xd4?\xe0\x9c\x11\xa5\xbd\xc1\xb7?\xdc\xb5\x84|\xd0\xb3\xa9?' +p49 +tp50 +bsS'proc' +p51 +S'mfv_stopbbarbbar' +p52 +s. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_stopdbardbar.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_stopdbardbar.pkl new file mode 100644 index 000000000..c90f43658 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_stopdbardbar.pkl @@ -0,0 +1,125 @@ +(dp0 +S'perc' +p1 +I01 +sS'y_vals' +p2 +cnumpy.core.multiarray +_reconstruct +p3 +(cnumpy +ndarray +p4 +(I0 +tp5 +S'b' +p6 +tp7 +Rp8 +(I1 +(I3 +tp9 +cnumpy +dtype +p10 +(S'f8' +p11 +I0 +I1 +tp12 +Rp13 +(I3 +S'<' +p14 +NNNI-1 +I-1 +I0 +tp15 +bI00 +S'\x00\x00\x00\x00\x00\x00i@\x00\x00\x00\x00\x00\x00y@\x00\x00\x00\x00\x00\x00\x89@' +p16 +tp17 +bsS'dtype' +p18 +c__builtin__ +float +p19 +sS'x_unit' +p20 +S'mm' +p21 +sS'arr_len' +p22 +I0 +sS'years' +p23 +c__builtin__ +set +p24 +((lp25 +S'2017-8' +p26 +aS'20161-2' +p27 +atp28 +Rp29 +sS'y_unit' +p30 +S'GeV' +p31 +sg27 +g3 +(g4 +(I0 +tp32 +g6 +tp33 +Rp34 +(I1 +(I5 +I3 +tp35 +g13 +I00 +S'3\xc4\xb1.n\xa3\xd1?_)\xcb\x10\xc7\xba\xe8?\x80H\xbf}\x1d8\xeb?1\x08\xac\x1cZd\xbb?\xa3#\xb9\xfc\x87\xf4\xd3?D\x8bl\xe7\xfb\xa9\xd9?\xfd\x87\xf4\xdb\xd7\x81\xb3?\x18&S\x05\xa3\x92\xba?\xb8\x1e\x85\xebQ\xb8\xbe?n\xa3\x01\xbc\x05\x12\xb4?\xdc\xb5\x84|\xd0\xb3\xa9?\xb5\xa6y\xc7):\xa2?\x81sF\x94\xf6\x06\xbf?>\x9bU\x9f\xab\xad\xa8?X\xa85\xcd;N\xa1?' +p36 +tp37 +bsS'x_vals' +p38 +g3 +(g4 +(I0 +tp39 +g6 +tp40 +Rp41 +(I1 +(I5 +tp42 +g13 +I00 +S'\x9a\x99\x99\x99\x99\x99\xb9?333333\xd3?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00>@' +p43 +tp44 +bsg26 +g3 +(g4 +(I0 +tp45 +g6 +tp46 +Rp47 +(I1 +(I5 +I3 +tp48 +g13 +I00 +S'\xa2\xb47\xf8\xc2d\xd2?j\xdeq\x8a\x8e\xe4\xe2?\x17\xd9\xce\xf7S\xe3\xe1?1*\xa9\x13\xd0D\xb8?\x13a\xc3\xd3+e\xc9?\x9f\xcd\xaa\xcf\xd5V\xcc?\xb3{\xf2\xb0Pk\xaa?1*\xa9\x13\xd0D\xa8?\x0e\xbe0\x99*\x18\xa5?333333\xb3?\xcd]K\xc8\x07=\x9b?\x83\xe2\xc7\x98\xbb\x96\x90?\x80\xb7@\x82\xe2\xc7\xb8?\x9f<,\xd4\x9a\xe6\x9d?\xc2\x17&S\x05\xa3\x92?' +p49 +tp50 +bsS'proc' +p51 +S'mfv_stopdbardbar' +p52 +s. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/ct_pickle_VH.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/ct_pickle_VH.pkl new file mode 100644 index 000000000..c0d82064d --- /dev/null +++ b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/ct_pickle_VH.pkl @@ -0,0 +1,167 @@ +(dp0 +S'perc' +p1 +I00 +sS'y_vals' +p2 +cnumpy.core.multiarray +_reconstruct +p3 +(cnumpy +ndarray +p4 +(I0 +tp5 +S'b' +p6 +tp7 +Rp8 +(I1 +(I3 +tp9 +cnumpy +dtype +p10 +(S'f8' +p11 +I0 +I1 +tp12 +Rp13 +(I3 +S'<' +p14 +NNNI-1 +I-1 +I0 +tp15 +bI00 +S'\x00\x00\x00\x00\x00\x00.@\x00\x00\x00\x00\x00\x00D@\x00\x00\x00\x00\x00\x80K@' +p16 +tp17 +bsS'dtype' +p18 +c__builtin__ +float +p19 +sS'20162' +p20 +g3 +(g4 +(I0 +tp21 +g6 +tp22 +Rp23 +(I1 +(I6 +I3 +I3 +tp24 +g13 +I00 +S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xc3(\x08\x1e\xdf^\xee?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xc3(\x08\x1e\xdf^\xee?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xc3(\x08\x1e\xdf^\xee?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xd9\n\x9a\x96X\x99\xed?\x15\x1a\x88e3\x07\xeb?\xder\xf5c\x93\xfc\xed?\xd9\n\x9a\x96X\x99\xed?\x15\x1a\x88e3\x07\xeb?\xder\xf5c\x93\xfc\xed?\xd9\n\x9a\x96X\x99\xed?\x15\x1a\x88e3\x07\xeb?\xder\xf5c\x93\xfc\xed?\x1c}\xcc\x07\x04\xba\xec?\xfaE\t\xfa\x0b\xbd\xe8?\xe6\x94\x80\x98\x84\x0b\xe9?\x1c}\xcc\x07\x04\xba\xec?\xfaE\t\xfa\x0b\xbd\xe8?\xe6\x94\x80\x98\x84\x0b\xe9?\x1c}\xcc\x07\x04\xba\xec?\xfaE\t\xfa\x0b\xbd\xe8?\xe6\x94\x80\x98\x84\x0b\xe9?\xd8\xd8%\xaa\xb7\x86\xea?%\xcc\xb4\xfd+\xab\xe7?3\x18#\x12\x85\x16\xe6?\xd8\xd8%\xaa\xb7\x86\xea?%\xcc\xb4\xfd+\xab\xe7?3\x18#\x12\x85\x16\xe6?\xd8\xd8%\xaa\xb7\x86\xea?%\xcc\xb4\xfd+\xab\xe7?3\x18#\x12\x85\x16\xe6?z\xa6\x97\x18\xcb\xf4\xe8?["\x17\x9c\xc1_\xe6?\xa3"N\'\xd9\xea\xe5?z\xa6\x97\x18\xcb\xf4\xe8?["\x17\x9c\xc1_\xe6?\xa3"N\'\xd9\xea\xe5?z\xa6\x97\x18\xcb\xf4\xe8?["\x17\x9c\xc1_\xe6?\xa3"N\'\xd9\xea\xe5?' +p25 +tp26 +bsS'x_unit' +p27 +S'mm' +p28 +sS'arr_len' +p29 +I3 +sS'years' +p30 +c__builtin__ +set +p31 +((lp32 +S'20161' +p33 +ag20 +aS'2017' +p34 +aS'2018' +p35 +atp36 +Rp37 +sS'y_unit' +p38 +S'GeV' +p39 +sg35 +g3 +(g4 +(I0 +tp40 +g6 +tp41 +Rp42 +(I1 +(I6 +I3 +I3 +tp43 +g13 +I00 +S'\xcb\x12\x9de\x16\xa1\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xcb\x12\x9de\x16\xa1\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xcb\x12\x9de\x16\xa1\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x8c\xf2\xcc\xcbaw\xee?\xd5w~Q\x82\xfe\xef?\x00\x00\x00\x00\x00\x00\xf0?\x8c\xf2\xcc\xcbaw\xee?\xd5w~Q\x82\xfe\xef?\x00\x00\x00\x00\x00\x00\xf0?\x8c\xf2\xcc\xcbaw\xee?\xd5w~Q\x82\xfe\xef?\x00\x00\x00\x00\x00\x00\xf0?\xec1\x91\xd2l\x1e\xee?/\xfdKR\x99b\xec?\xc2\x87\x12-y<\xe5?\xec1\x91\xd2l\x1e\xee?/\xfdKR\x99b\xec?\xc2\x87\x12-y<\xe5?\xec1\x91\xd2l\x1e\xee?/\xfdKR\x99b\xec?\xc2\x87\x12-y<\xe5?\x00VG\x8et\x06\xed?\x1f\xf2\x96\xab\x1f\x1b\xeb?\xd0\xf2<\xb8;\xeb\xe9?\x00VG\x8et\x06\xed?\x1f\xf2\x96\xab\x1f\x1b\xeb?\xd0\xf2<\xb8;\xeb\xe9?\x00VG\x8et\x06\xed?\x1f\xf2\x96\xab\x1f\x1b\xeb?\xd0\xf2<\xb8;\xeb\xe9?\xa5\xa1F!\xc9,\xec?Z\xd6\xfdc!\xba\xe9?\x84\xf4\x149D\xdc\xe7?\xa5\xa1F!\xc9,\xec?Z\xd6\xfdc!\xba\xe9?\x84\xf4\x149D\xdc\xe7?\xa5\xa1F!\xc9,\xec?Z\xd6\xfdc!\xba\xe9?\x84\xf4\x149D\xdc\xe7?\x17b\xf5G\x18\x86\xeb?\x85\xb2\xf0\xf5\xb5.\xea?\xce\x89=\xb4\x8f\x15\xe7?\x17b\xf5G\x18\x86\xeb?\x85\xb2\xf0\xf5\xb5.\xea?\xce\x89=\xb4\x8f\x15\xe7?\x17b\xf5G\x18\x86\xeb?\x85\xb2\xf0\xf5\xb5.\xea?\xce\x89=\xb4\x8f\x15\xe7?' +p44 +tp45 +bsg33 +g3 +(g4 +(I0 +tp46 +g6 +tp47 +Rp48 +(I1 +(I6 +I3 +I3 +tp49 +g13 +I00 +S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xf3\x8eSt$\x97\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xf3\x8eSt$\x97\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xf3\x8eSt$\x97\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xc7,{\x12\xd8\x9c\xed?8\x84*5{\xa0\xec?\x92@\x83M\x9d\xc7\xe7?\xc7,{\x12\xd8\x9c\xed?8\x84*5{\xa0\xec?\x92@\x83M\x9d\xc7\xe7?\xc7,{\x12\xd8\x9c\xed?8\x84*5{\xa0\xec?\x92@\x83M\x9d\xc7\xe7??V\xf0\xdb\x10\xe3\xec?\xe2?\xdd@\x81w\xe9?\xdaY\xf4N\x05\xdc\xe6??V\xf0\xdb\x10\xe3\xec?\xe2?\xdd@\x81w\xe9?\xdaY\xf4N\x05\xdc\xe6??V\xf0\xdb\x10\xe3\xec?\xe2?\xdd@\x81w\xe9?\xdaY\xf4N\x05\xdc\xe6?\xe9\x0f\xcd<\xb9\xa6\xec?3\xc5\x1c\x04\x1d\xad\xe7?\xf9\xf4\xd8\x96\x01\xe7\xe5?\xe9\x0f\xcd<\xb9\xa6\xec?3\xc5\x1c\x04\x1d\xad\xe7?\xf9\xf4\xd8\x96\x01\xe7\xe5?\xe9\x0f\xcd<\xb9\xa6\xec?3\xc5\x1c\x04\x1d\xad\xe7?\xf9\xf4\xd8\x96\x01\xe7\xe5?5E\x80\xd3\xbbx\xec??\x8b\xa5H\xbe\x12\xe7?\x160\x81[ws\xe5?5E\x80\xd3\xbbx\xec??\x8b\xa5H\xbe\x12\xe7?\x160\x81[ws\xe5?5E\x80\xd3\xbbx\xec??\x8b\xa5H\xbe\x12\xe7?\x160\x81[ws\xe5?' +p50 +tp51 +bsS'x_vals' +p52 +g3 +(g4 +(I0 +tp53 +g6 +tp54 +Rp55 +(I1 +(I6 +tp56 +g13 +I00 +S'\x9a\x99\x99\x99\x99\x99\xb9?333333\xd3?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x08@\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00>@' +p57 +tp58 +bsg34 +g3 +(g4 +(I0 +tp59 +g6 +tp60 +Rp61 +(I1 +(I6 +I3 +I3 +tp62 +g13 +I00 +S'F(\xb6\x82\xa6\xa5\xec?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?F(\xb6\x82\xa6\xa5\xec?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?F(\xb6\x82\xa6\xa5\xec?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x83\x89?\x8a:s\xee?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x83\x89?\x8a:s\xee?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x83\x89?\x8a:s\xee?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xf6\xebNw\x9e\xf8\xed?G\xad0}\xaf!\xed?\xd2\x8b\xda\xfd*@\xec?\xf6\xebNw\x9e\xf8\xed?G\xad0}\xaf!\xed?\xd2\x8b\xda\xfd*@\xec?\xf6\xebNw\x9e\xf8\xed?G\xad0}\xaf!\xed?\xd2\x8b\xda\xfd*@\xec?\x9f<,\xd4\x9af\xed?\xc6\xfbq\xfb\xe5\x93\xea?\xd9$?\xe2W\xac\xe9?\x9f<,\xd4\x9af\xed?\xc6\xfbq\xfb\xe5\x93\xea?\xd9$?\xe2W\xac\xe9?\x9f<,\xd4\x9af\xed?\xc6\xfbq\xfb\xe5\x93\xea?\xd9$?\xe2W\xac\xe9?\xe6\\\x8a\xab\xca\xbe\xec?t~\x8a\xe3\xc0+\xe9?\xc1\xe0\x9a;\xfa_\xe7?\xe6\\\x8a\xab\xca\xbe\xec?t~\x8a\xe3\xc0+\xe9?\xc1\xe0\x9a;\xfa_\xe7?\xe6\\\x8a\xab\xca\xbe\xec?t~\x8a\xe3\xc0+\xe9?\xc1\xe0\x9a;\xfa_\xe7?\xea\xb0\xc2-\x1fI\xeb?\x90kC\xc58\x7f\xe8?\xd0%\x1cz\x8b\x07\xe8?\xea\xb0\xc2-\x1fI\xeb?\x90kC\xc58\x7f\xe8?\xd0%\x1cz\x8b\x07\xe8?\xea\xb0\xc2-\x1fI\xeb?\x90kC\xc58\x7f\xe8?\xd0%\x1cz\x8b\x07\xe8?' +p63 +tp64 +bsS'proc' +p65 +S'VH' +p66 +s. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/dn_pickle_VH.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/dn_pickle_VH.pkl new file mode 100644 index 000000000..5623c66da --- /dev/null +++ b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/dn_pickle_VH.pkl @@ -0,0 +1,167 @@ +(dp0 +S'perc' +p1 +I00 +sS'y_vals' +p2 +cnumpy.core.multiarray +_reconstruct +p3 +(cnumpy +ndarray +p4 +(I0 +tp5 +S'b' +p6 +tp7 +Rp8 +(I1 +(I3 +tp9 +cnumpy +dtype +p10 +(S'f8' +p11 +I0 +I1 +tp12 +Rp13 +(I3 +S'<' +p14 +NNNI-1 +I-1 +I0 +tp15 +bI00 +S'\x00\x00\x00\x00\x00\x00.@\x00\x00\x00\x00\x00\x00D@\x00\x00\x00\x00\x00\x80K@' +p16 +tp17 +bsS'dtype' +p18 +c__builtin__ +float +p19 +sS'20162' +p20 +g3 +(g4 +(I0 +tp21 +g6 +tp22 +Rp23 +(I1 +(I6 +I3 +I3 +tp24 +g13 +I00 +S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xd8\xd8%\xaa\xb7\x06\xf0?\xd7Q\xd5\x04Qw\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xd8\xd8%\xaa\xb7\x06\xf0?\xd7Q\xd5\x04Qw\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xd8\xd8%\xaa\xb7\x06\xf0?\xd7Q\xd5\x04Qw\xf0?\x00\x00\x00\x00\x00\x00\xf0?M2r\x16\xf64\xf0?Ae\xfc\xfb\x8c\x8b\xf0?\xfe\xb7\x92\x1d\x1b\x01\xf1?M2r\x16\xf64\xf0?Ae\xfc\xfb\x8c\x8b\xf0?\xfe\xb7\x92\x1d\x1b\x01\xf1?M2r\x16\xf64\xf0?Ae\xfc\xfb\x8c\x8b\xf0?\xfe\xb7\x92\x1d\x1b\x01\xf1?\xe4I\xd25\x93o\xf0?l&\xdfls\xe3\xf0?B\xb2\x80\t\xdc\xba\xf0?\xe4I\xd25\x93o\xf0?l&\xdfls\xe3\xf0?B\xb2\x80\t\xdc\xba\xf0?\xe4I\xd25\x93o\xf0?l&\xdfls\xe3\xf0?B\xb2\x80\t\xdc\xba\xf0?9\xd1\xaeB\xca\xcf\xf1?{\xf7\xc7{\xd5J\xf1? \x0c<\xf7\x1e\xae\xf1?9\xd1\xaeB\xca\xcf\xf1?{\xf7\xc7{\xd5J\xf1? \x0c<\xf7\x1e\xae\xf1?9\xd1\xaeB\xca\xcf\xf1?{\xf7\xc7{\xd5J\xf1? \x0c<\xf7\x1e\xae\xf1?' +p25 +tp26 +bsS'x_unit' +p27 +S'mm' +p28 +sS'arr_len' +p29 +I3 +sS'years' +p30 +c__builtin__ +set +p31 +((lp32 +S'20161' +p33 +ag20 +aS'2017' +p34 +aS'2018' +p35 +atp36 +Rp37 +sS'y_unit' +p38 +S'GeV' +p39 +sg35 +g3 +(g4 +(I0 +tp40 +g6 +tp41 +Rp42 +(I1 +(I6 +I3 +I3 +tp43 +g13 +I00 +S"\xe2X\x17\xb7\xd1\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xe2X\x17\xb7\xd1\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xe2X\x17\xb7\xd1\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xcb\xf6!o\xb9\xfa\xef?\xedG\x8a\xc8\xb0\n\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xcb\xf6!o\xb9\xfa\xef?\xedG\x8a\xc8\xb0\n\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xcb\xf6!o\xb9\xfa\xef?\xedG\x8a\xc8\xb0\n\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xc0\t\x85\x088\x04\xf0?\n\xbf\xd4\xcf\x9b\n\xf0?}\xe8\x82\xfa\x969\xf0?\xc0\t\x85\x088\x04\xf0?\n\xbf\xd4\xcf\x9b\n\xf0?}\xe8\x82\xfa\x969\xf0?\xc0\t\x85\x088\x04\xf0?\n\xbf\xd4\xcf\x9b\n\xf0?}\xe8\x82\xfa\x969\xf0?\x1an\xc0\xe7\x87\x11\xf0?\xad4)\x05\xdd^\xf0?g'\x83\xa3\xe4U\xf0?\x1an\xc0\xe7\x87\x11\xf0?\xad4)\x05\xdd^\xf0?g'\x83\xa3\xe4U\xf0?\x1an\xc0\xe7\x87\x11\xf0?\xad4)\x05\xdd^\xf0?g'\x83\xa3\xe4U\xf0?\x8a\x1fc\xeeZB\xf0?\x12\xbd\x8cb\xb9\xa5\xf0?\xc8\x0cT\xc6\xbfO\xf0?\x8a\x1fc\xeeZB\xf0?\x12\xbd\x8cb\xb9\xa5\xf0?\xc8\x0cT\xc6\xbfO\xf0?\x8a\x1fc\xeeZB\xf0?\x12\xbd\x8cb\xb9\xa5\xf0?\xc8\x0cT\xc6\xbfO\xf0?\x17\x0e\x84d\x01\x13\xf0?R\xf2\xea\x1c\x032\xf0?\xdflsczB\xf0?\x17\x0e\x84d\x01\x13\xf0?R\xf2\xea\x1c\x032\xf0?\xdflsczB\xf0?\x17\x0e\x84d\x01\x13\xf0?R\xf2\xea\x1c\x032\xf0?\xdflsczB\xf0?" +p44 +tp45 +bsg33 +g3 +(g4 +(I0 +tp46 +g6 +tp47 +Rp48 +(I1 +(I6 +I3 +I3 +tp49 +g13 +I00 +S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x9e\xef\xa7\xc6K7\xf0?\xd4\xb7\xcc\xe9\xb2\x18\xf0?\x0eO\xaf\x94e\x08\xf1?\x9e\xef\xa7\xc6K7\xf0?\xd4\xb7\xcc\xe9\xb2\x18\xf0?\x0eO\xaf\x94e\x08\xf1?\x9e\xef\xa7\xc6K7\xf0?\xd4\xb7\xcc\xe9\xb2\x18\xf0?\x0eO\xaf\x94e\x08\xf1?\xbe\x87K\x8e;%\xf0?\x94M\xb9\xc2\xbb\\\xf0?\x15\x1d\xc9\xe5?$\xf1?\xbe\x87K\x8e;%\xf0?\x94M\xb9\xc2\xbb\\\xf0?\x15\x1d\xc9\xe5?$\xf1?\xbe\x87K\x8e;%\xf0?\x94M\xb9\xc2\xbb\\\xf0?\x15\x1d\xc9\xe5?$\xf1?\xed\xbb"\xf8\xdfJ\xf0?\xb1\x16\x9f\x02`\xbc\xf0?\xa8W\xca2\xc4\xb1\xf0?\xed\xbb"\xf8\xdfJ\xf0?\xb1\x16\x9f\x02`\xbc\xf0?\xa8W\xca2\xc4\xb1\xf0?\xed\xbb"\xf8\xdfJ\xf0?\xb1\x16\x9f\x02`\xbc\xf0?\xa8W\xca2\xc4\xb1\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x8f\xaa&\x88\xba\x0f\xf1?\x19\x90\xbd\xde\xfdq\xf1?\x00\x00\x00\x00\x00\x00\xf0?\x8f\xaa&\x88\xba\x0f\xf1?\x19\x90\xbd\xde\xfdq\xf1?\x00\x00\x00\x00\x00\x00\xf0?\x8f\xaa&\x88\xba\x0f\xf1?\x19\x90\xbd\xde\xfdq\xf1?' +p50 +tp51 +bsS'x_vals' +p52 +g3 +(g4 +(I0 +tp53 +g6 +tp54 +Rp55 +(I1 +(I6 +tp56 +g13 +I00 +S'\x9a\x99\x99\x99\x99\x99\xb9?333333\xd3?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x08@\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00>@' +p57 +tp58 +bsg34 +g3 +(g4 +(I0 +tp59 +g6 +tp60 +Rp61 +(I1 +(I6 +I3 +I3 +tp62 +g13 +I00 +S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?ywd\xac6\xff\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?ywd\xac6\xff\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?ywd\xac6\xff\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?o\xbb\xd0\\\xa7\x11\xf0?\xb6\xbeHh\xcb9\xf0?\xe3p\xe6Ws\x00\xf0?o\xbb\xd0\\\xa7\x11\xf0?\xb6\xbeHh\xcb9\xf0?\xe3p\xe6Ws\x00\xf0?o\xbb\xd0\\\xa7\x11\xf0?\xb6\xbeHh\xcb9\xf0?\xe3p\xe6Ws\x00\xf0?\x05\x17+j0\r\xf0?\xd0D\xd8\xf0\xf4J\xf0?\xdb\xc4\xc9\xfd\x0eE\xf0?\x05\x17+j0\r\xf0?\xd0D\xd8\xf0\xf4J\xf0?\xdb\xc4\xc9\xfd\x0eE\xf0?\x05\x17+j0\r\xf0?\xd0D\xd8\xf0\xf4J\xf0?\xdb\xc4\xc9\xfd\x0eE\xf0?^\xbaI\x0c\x02+\xf0?\xcb\x84_\xea\xe7M\xf0?\xe6"\xbe\x13\xb3^\xf0?^\xbaI\x0c\x02+\xf0?\xcb\x84_\xea\xe7M\xf0?\xe6"\xbe\x13\xb3^\xf0?^\xbaI\x0c\x02+\xf0?\xcb\x84_\xea\xe7M\xf0?\xe6"\xbe\x13\xb3^\xf0?W!\xe5\'\xd5>\xf0?\xfa\xb86T\x8cs\xf0?\x02\xf1\xba~\xc1n\xf0?W!\xe5\'\xd5>\xf0?\xfa\xb86T\x8cs\xf0?\x02\xf1\xba~\xc1n\xf0?W!\xe5\'\xd5>\xf0?\xfa\xb86T\x8cs\xf0?\x02\xf1\xba~\xc1n\xf0?' +p63 +tp64 +bsS'proc' +p65 +S'VH' +p66 +s. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/up_pickle_VH.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/up_pickle_VH.pkl new file mode 100644 index 000000000..4c52e61b8 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/up_pickle_VH.pkl @@ -0,0 +1,167 @@ +(dp0 +S'perc' +p1 +I00 +sS'y_vals' +p2 +cnumpy.core.multiarray +_reconstruct +p3 +(cnumpy +ndarray +p4 +(I0 +tp5 +S'b' +p6 +tp7 +Rp8 +(I1 +(I3 +tp9 +cnumpy +dtype +p10 +(S'f8' +p11 +I0 +I1 +tp12 +Rp13 +(I3 +S'<' +p14 +NNNI-1 +I-1 +I0 +tp15 +bI00 +S'\x00\x00\x00\x00\x00\x00.@\x00\x00\x00\x00\x00\x00D@\x00\x00\x00\x00\x00\x80K@' +p16 +tp17 +bsS'dtype' +p18 +c__builtin__ +float +p19 +sS'20162' +p20 +g3 +(g4 +(I0 +tp21 +g6 +tp22 +Rp23 +(I1 +(I6 +I3 +I3 +tp24 +g13 +I00 +S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?Ii6\x8f\xc3`\xef?l\xce\xc13\xa1\xc9\xee?\x00\x00\x00\x00\x00\x00\xf0?Ii6\x8f\xc3`\xef?l\xce\xc13\xa1\xc9\xee?\x00\x00\x00\x00\x00\x00\xf0?Ii6\x8f\xc3`\xef?l\xce\xc13\xa1\xc9\xee?\x00\x00\x00\x00\x00\x00\xf0?8\x82T\x8a\x1d\x8d\xef?0b\x9f\x00\x8a\x91\xee?{\xbb%9`W\xef?8\x82T\x8a\x1d\x8d\xef?0b\x9f\x00\x8a\x91\xee?{\xbb%9`W\xef?8\x82T\x8a\x1d\x8d\xef?0b\x9f\x00\x8a\x91\xee?{\xbb%9`W\xef?\xff\xe8\x9b4\r\x8a\xef?\x97Tm7\xc17\xef?W\n\x81\\\xe2H\xee?\xff\xe8\x9b4\r\x8a\xef?\x97Tm7\xc17\xef?W\n\x81\\\xe2H\xee?\xff\xe8\x9b4\r\x8a\xef?\x97Tm7\xc17\xef?W\n\x81\\\xe2H\xee?\x94O\x8fm\x19p\xef?\xbc\xb3v\xdb\x85f\xee?s\x9c\xdb\x84{e\xef?\x94O\x8fm\x19p\xef?\xbc\xb3v\xdb\x85f\xee?s\x9c\xdb\x84{e\xef?\x94O\x8fm\x19p\xef?\xbc\xb3v\xdb\x85f\xee?s\x9c\xdb\x84{e\xef?' +p25 +tp26 +bsS'x_unit' +p27 +S'mm' +p28 +sS'arr_len' +p29 +I3 +sS'years' +p30 +c__builtin__ +set +p31 +((lp32 +S'20161' +p33 +ag20 +aS'2017' +p34 +aS'2018' +p35 +atp36 +Rp37 +sS'y_unit' +p38 +S'GeV' +p39 +sg35 +g3 +(g4 +(I0 +tp40 +g6 +tp41 +Rp42 +(I1 +(I6 +I3 +I3 +tp43 +g13 +I00 +S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?F"4\x82\x8d\xeb\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?F"4\x82\x8d\xeb\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?F"4\x82\x8d\xeb\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xa6\x81\x1f\xd5\xb0\xdf\xef?\xf8l\x1d\x1c\xec\xcd\xef?\x17\xd7\xf8L\xf6\xcf\xed?\xa6\x81\x1f\xd5\xb0\xdf\xef?\xf8l\x1d\x1c\xec\xcd\xef?\x17\xd7\xf8L\xf6\xcf\xed?\xa6\x81\x1f\xd5\xb0\xdf\xef?\xf8l\x1d\x1c\xec\xcd\xef?\x17\xd7\xf8L\xf6\xcf\xed?\x96\xe8,\xb3\x08\xc5\xef?\xc9\xaa\x087\x19U\xef?\x83P\xde\xc7\xd1\x1c\xef?\x96\xe8,\xb3\x08\xc5\xef?\xc9\xaa\x087\x19U\xef?\x83P\xde\xc7\xd1\x1c\xef?\x96\xe8,\xb3\x08\xc5\xef?\xc9\xaa\x087\x19U\xef?\x83P\xde\xc7\xd1\x1c\xef?\x85B\x04\x1cB\x95\xef?\xab\x933\x14w<\xef?\xf2\xb3\x91\xeb\xa6\x14\xef?\x85B\x04\x1cB\x95\xef?\xab\x933\x14w<\xef?\xf2\xb3\x91\xeb\xa6\x14\xef?\x85B\x04\x1cB\x95\xef?\xab\x933\x14w<\xef?\xf2\xb3\x91\xeb\xa6\x14\xef?/\xf9\x9f\xfc\xdd\xbb\xef?\n\xf7\xca\xbcU\xd7\xee?C\x8f\x18=\xb7P\xee?/\xf9\x9f\xfc\xdd\xbb\xef?\n\xf7\xca\xbcU\xd7\xee?C\x8f\x18=\xb7P\xee?/\xf9\x9f\xfc\xdd\xbb\xef?\n\xf7\xca\xbcU\xd7\xee?C\x8f\x18=\xb7P\xee?' +p44 +tp45 +bsg33 +g3 +(g4 +(I0 +tp46 +g6 +tp47 +Rp48 +(I1 +(I6 +I3 +I3 +tp49 +g13 +I00 +S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?dY0\xf1G\xd1\xef?rP\xc2L\xdb?\xef?\x00\x00\x00\x00\x00\x00\xf0?dY0\xf1G\xd1\xef?rP\xc2L\xdb?\xef?\x00\x00\x00\x00\x00\x00\xf0?dY0\xf1G\xd1\xef?rP\xc2L\xdb?\xef?\x00\x00\x00\x00\x00\x00\xf0??\xfdg\xcd\x8f?\xef?\xa6\xb5il\xaf\x85\xee?\xa6|\x08\xaaF/\xee??\xfdg\xcd\x8f?\xef?\xa6\xb5il\xaf\x85\xee?\xa6|\x08\xaaF/\xee??\xfdg\xcd\x8f?\xef?\xa6\xb5il\xaf\x85\xee?\xa6|\x08\xaaF/\xee?=d\xca\x87\xa0\xea\xee?z\xe29[@\xe8\xed?k\x10\xe6v/w\xee?=d\xca\x87\xa0\xea\xee?z\xe29[@\xe8\xed?k\x10\xe6v/w\xee?=d\xca\x87\xa0\xea\xee?z\xe29[@\xe8\xed?k\x10\xe6v/w\xee?\t\xa4\xc4\xae\xed\xed\xed?\xcd!\xa9\x85\x92\xc9\xee?\xba\xda\x8a\xfdew\xee?\t\xa4\xc4\xae\xed\xed\xed?\xcd!\xa9\x85\x92\xc9\xee?\xba\xda\x8a\xfdew\xee?\t\xa4\xc4\xae\xed\xed\xed?\xcd!\xa9\x85\x92\xc9\xee?\xba\xda\x8a\xfdew\xee?' +p50 +tp51 +bsS'x_vals' +p52 +g3 +(g4 +(I0 +tp53 +g6 +tp54 +Rp55 +(I1 +(I6 +tp56 +g13 +I00 +S'\x9a\x99\x99\x99\x99\x99\xb9?333333\xd3?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x08@\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00>@' +p57 +tp58 +bsg34 +g3 +(g4 +(I0 +tp59 +g6 +tp60 +Rp61 +(I1 +(I6 +I3 +I3 +tp62 +g13 +I00 +S'od\x1e\xf9\x83\x01\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?od\x1e\xf9\x83\x01\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?od\x1e\xf9\x83\x01\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xe3\x88\xb5\xf8\x14\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xe3\x88\xb5\xf8\x14\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xe3\x88\xb5\xf8\x14\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xbd\x8f\xa39\xb2\xf2\xef?\xa8\x8eUJ\xcf\xf4\xef?YLl>\xae\x8d\xef?\xbd\x8f\xa39\xb2\xf2\xef?\xa8\x8eUJ\xcf\xf4\xef?YLl>\xae\x8d\xef?\xbd\x8f\xa39\xb2\xf2\xef?\xa8\x8eUJ\xcf\xf4\xef?YLl>\xae\x8d\xef?S\x92u8\xba\xca\xef?Jz\x18Z\x9d\x1c\xef?\x0e\xd9@\xba\xd84\xef?S\x92u8\xba\xca\xef?Jz\x18Z\x9d\x1c\xef?\x0e\xd9@\xba\xd84\xef?S\x92u8\xba\xca\xef?Jz\x18Z\x9d\x1c\xef?\x0e\xd9@\xba\xd84\xef?\xb8\x03u\xca\xa3\x9b\xef?\xa5\x82\x8a\xaa_i\xef?\xdd^\xd2\x18\xad#\xef?\xb8\x03u\xca\xa3\x9b\xef?\xa5\x82\x8a\xaa_i\xef?\xdd^\xd2\x18\xad#\xef?\xb8\x03u\xca\xa3\x9b\xef?\xa5\x82\x8a\xaa_i\xef?\xdd^\xd2\x18\xad#\xef?\x9b\xffW\x1d9R\xef?\xf7\xaf\xac4)\x85\xee?U\xa4\xc2\xd8B\x90\xee?\x9b\xffW\x1d9R\xef?\xf7\xaf\xac4)\x85\xee?U\xa4\xc2\xd8B\x90\xee?\x9b\xffW\x1d9R\xef?\xf7\xaf\xac4)\x85\xee?U\xa4\xc2\xd8B\x90\xee?' +p63 +tp64 +bsS'proc' +p65 +S'VH' +p66 +s. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/getNuisanceFromSig.py b/MFVNeutralino/test/ForLimits/getNuisanceFromSig.py new file mode 100644 index 000000000..19d33de4b --- /dev/null +++ b/MFVNeutralino/test/ForLimits/getNuisanceFromSig.py @@ -0,0 +1,166 @@ +import numpy as np + +import script_configs as config +import helper_PyStorage_objects as sth +import nuisance_configs_and_functions as nsfc + + +# --------------------------------------------------------------------------- +# Nuisance tag sets +# --------------------------------------------------------------------------- +nuis_allsigs = set([ + "mc_stat", # MC Gamma-N + "reco_effi", # Reconstruction efficiency + "vtx_reco_TM", # TrackMover + "pileup", # Pileup + "int_lumi", +]) + +# lep_effi is NOT included here -- it is added conditionally per signal below. +nuis_lep = set() + +nuis_bjet = set([ + "disp_kine", # Displacement trigger kinematic filters + "bjet_filt", # B-Jet filters + "disp_filt", # Displaced jet track filters + "disp_tres", # Track resolution, displaced filters + "bjet_inef", # Inefficiencies in offline b jet selection + "btag_scfa", # B-tag scale factors + "JES", # Jet Energy Scale + "JER", # Jet Energy Resolution + "calo_inef", +]) + +# Replacements merge groups of nuisances into a single combined uncertainty +nuis_replacements = { + "all": {}, + "bjet": { + frozenset(["trig_JESR_btag"]): set([ + "disp_kine", + "bjet_filt", + "disp_filt", + "disp_tres", + "bjet_inef", + "btag_scfa", + "JES", + "JER", + ]), + }, + "lep": {}, +} + +# Background systematics are disabled until CRs are unblinded and real uncertainties measured. +nuis_bkg = set() +nuis_bkg_replacements = {} + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + +def replace_all_ones(new_nuis): + """Drop a nuisance list if every entry is all 1.0s (no effect on the limit).""" + for nuis in new_nuis: + if not np.prod(nuis.nuis_val == np.ones_like(nuis.nuis_val)): + return new_nuis + return [] + + +def get_nuis_fromname(nuis_name, siginfo, nuis_ls, debug_mode=False): + """Dispatch to the appropriate nuisance-building function and append to nuis_ls.""" + new_nuis = [] + + if nuis_name == "mc_stat": new_nuis = nsfc.get_mc_stat("mc_stat", siginfo, debug_mode=debug_mode) + elif nuis_name == "reco_effi": new_nuis = nsfc.get_reco_effi("tk_reco_eff", siginfo, debug_mode=debug_mode) + elif nuis_name == "vtx_reco_TM": new_nuis = nsfc.get_vtx_reco_TM("vtx_reco_TM", siginfo, debug_mode=debug_mode) + elif nuis_name == "pileup": new_nuis = nsfc.get_pileup("CMS_pileup", siginfo, debug_mode=debug_mode) + elif nuis_name == "int_lumi": new_nuis = nsfc.get_int_lumi("lumi", siginfo, debug_mode=debug_mode) + elif nuis_name == "lep_effi": new_nuis = nsfc.get_lep_effi("CMS_eff_", siginfo, debug_mode=debug_mode) + elif nuis_name == "trig_JESR_btag": new_nuis = nsfc.get_trig_JESR_btag("disp_trig_uncerts", siginfo, debug_mode=debug_mode) + elif nuis_name == "calo_inef": new_nuis = nsfc.get_calo_inef("calo_ineff", siginfo, debug_mode=debug_mode) + else: + print("Error: nuisance name not implemented for", nuis_name) + + new_nuis = replace_all_ones(new_nuis) + nuis_ls += new_nuis + + +def get_bkg_nuis_fromname(nuis_name, nuis_bkg_ls, debug_mode=False): + new_nuis = [] + + if nuis_name == "bkg_jet_ang": new_nuis = nsfc.get_bkg_jet_ang("dphiVV", debug_mode=debug_mode) + elif nuis_name == "bkg_vtx_arbi": new_nuis = nsfc.get_bkg_vtx_arbi("vtx_pair_eff_NtkSeeds", debug_mode=debug_mode) + elif nuis_name == "bkg_vtx_refi": new_nuis = nsfc.get_bkg_vtx_refi("vtx_pair_eff_MC", debug_mode=debug_mode) + elif nuis_name == "pileup": new_nuis = nsfc.get_bkg_pileup("CMS_pileup", debug_mode=debug_mode) + elif nuis_name == "sig_cont": new_nuis = nsfc.get_bkg_sig_cont(nuis_name, debug_mode=debug_mode) + elif nuis_name == "bkg_norm": new_nuis = nsfc.get_bkg_bkg_norm("bkg_norm", debug_mode=debug_mode) + elif nuis_name == "n2v_unc": new_nuis = nsfc.get_bkg_n2v_unc("num_vtx_pair_unc", debug_mode=debug_mode) + else: + raise Exception("Error: background nuisance name not implemented for " + nuis_name) + + new_nuis = replace_all_ones(new_nuis) + nuis_bkg_ls += new_nuis + + +# --------------------------------------------------------------------------- +# Main public interface +# --------------------------------------------------------------------------- + +def get_nuis_fromsig(siginfo, nuis_ls, debug_mode=False): + """Build the nuisance list for one signal hypothesis. + + lep_effi is only added for processes that have a lepton in the hard scatter + (VH, ttH). Pure SUSY signals fired by the lepton trigger do not receive it. + """ + trig_type = siginfo.trig_type + + nuis_set = nuis_allsigs.copy() + if trig_type == "lep": + nuis_set.update(nuis_lep) + # Only VH and ttH carry a lepton reco efficiency uncertainty + if siginfo.proc in config.lep_reco_effi_sigs: + nuis_set.add("lep_effi") + elif trig_type == "bjet": + nuis_set.update(nuis_bjet) + else: + print("FAIL: please make sure the input SignalROOTInfo object has a trig_type identified") + return + + for repl in nuis_replacements["all"]: + nuis_set.update(repl) + nuis_set = nuis_set.difference(nuis_replacements["all"][repl]) + for repl in nuis_replacements[trig_type]: + nuis_set.update(repl) + nuis_set = nuis_set.difference(nuis_replacements[trig_type][repl]) + + if debug_mode: + print("\n" + siginfo.return_nuis_key()) + print("Nuisances identified:", nuis_set, "\n") + + for nuis in sorted(nuis_set): + get_nuis_fromname(nuis, siginfo, nuis_ls, debug_mode=debug_mode) + + if debug_mode: + print("Nuisances that produced a SIG Nuisance object:") + for nuis in nuis_ls: + nuis.print_diagnostics() + + +def get_nuis_frombkg(nuis_bkg_ls, debug_mode=False): + """Build the nuisance list for the background estimate.""" + nuis_set = nuis_bkg.copy() + + for repl in nuis_bkg_replacements: + nuis_set.update(repl) + nuis_set = nuis_set.difference(nuis_bkg_replacements[repl]) + + if debug_mode: + print("Nuisances identified:", nuis_set, "\n") + + for nuis in sorted(nuis_set): + get_bkg_nuis_fromname(nuis, nuis_bkg_ls, debug_mode=debug_mode) + + if debug_mode: + print("Nuisances that produced a BKG Nuisance object:") + for nuis in nuis_bkg_ls: + nuis.print_diagnostics() diff --git a/MFVNeutralino/test/ForLimits/helper_PyStorage_objects.py b/MFVNeutralino/test/ForLimits/helper_PyStorage_objects.py new file mode 100644 index 000000000..80e136c60 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/helper_PyStorage_objects.py @@ -0,0 +1,499 @@ +import ROOT +import numpy as np +import os +import pickle + +import JMTucker.Tools.Samples as Samples +from JMTucker.Tools.Sample import MCSample, nevents_from_file +from JMTucker.Tools.ROOTTools import lerp, bilerp + +import helper_ROOT_functions as ROOThelper +import script_configs as config +import sig_and_bkg_configs as sb_conf + +nbins = config.datacard["nbins"] +prt_dt = sb_conf.printout_flags["PyStorage"] + + +class SignalROOTInfo(object): + """Extract process name, lifetime, mass, year from a MiniTree filename.""" + + def __init__(self, full_fn, root_exists=False, nbins=3): + self.full_fn = full_fn + bn = os.path.basename(full_fn) + if bn.startswith("minitree"): + # File lives inside condor_/ -- use the directory name for parsing + dirn = os.path.basename(os.path.dirname(full_fn)) + self.fn = dirn.replace("condor_", "", 1) + ".root" + else: + self.fn = bn + + success = self.get_processtag() + if success: + self.get_type() + self.get_lifetime() + self.get_mass() + self.get_year() + self.nbins = nbins + + self.root_exists = root_exists + if root_exists: + self.sample_file = ROOT.TFile.Open(self.full_fn) + self.nevents = nevents_from_file(self.sample_file) + try: + self.mcsample = eval("Samples." + self.return_nuis_key()) + Samples._set_signal_stuff(self.mcsample) + except Exception: + raise ValueError("No Samples.py entry") + + def get_processtag(self): + name_start = self.fn.split("tau")[0] + success = True + if name_start == self.fn: + print("Unable to extract signal process tag. Is the name of the form __tau__ ?") + print("Error reported for", self.full_fn) + success = False + self.proc = name_start[:-1] + return success + + def get_type(self): + if (self.proc in config.sig["bjet_sigs"]) and (self.proc in config.sig["lep_sigs"]): + if prt_dt["sig_type_conflict"]: + print("Note: this signal can be bjet or lep. Setting to match script_config.") + self.trig_type = config.sig["type"] + elif self.proc in config.sig["bjet_sigs"]: + self.trig_type = "bjet" + elif self.proc in config.sig["lep_sigs"]: + self.trig_type = "lep" + else: + print("Signal " + self.fn + " not found in either bjet or lep lists.") + self.trig_type = "none" + + def get_lifetime(self): + self.lifetime = self.fn.split("tau")[1].split("_")[0] + + def get_mass(self): + self.mass = self.fn.split("tau")[1].split("_")[1][1:] + + def get_year(self): + self.year = self.return_nuis_key().split("_")[-1] + + def return_nuis_key(self): + return self.fn.replace(".root", "").replace(".ROOT", "") + + def return_lifetime_in_unit(self, unit=None): + if unit is None: + return self.lifetime + return ROOThelper.convert_units(to_unit=unit, from_expr=self.lifetime) + + def return_mass_as_int(self): + return int(self.mass) + + def return_name2details(self, lifetime_unit="mm"): + return [self.proc, self.return_lifetime_in_unit(unit=lifetime_unit), self.mass, self.year] + + def print_diagnostics(self, lifetime_unit="mm"): + print("Full filename:", self.full_fn) + print("Trigger type:", self.trig_type) + print("Process, lifetime, mass, year", self.return_name2details(lifetime_unit=lifetime_unit)) + + def get_sumw(self): + if self.root_exists: + return self.mcsample.sumw(self.sample_file) + raise NotImplementedError() + + def get_ngen(self): + if self.root_exists: + return self.nevents + raise NotImplementedError() + + def get_xsec(self): + if self.root_exists: + return self.mcsample.xsec + raise NotImplementedError() + + +class SigRInf_Grp(object): + """Group of SignalROOTInfo objects that behave as one (e.g., VH = ZH + WH+ + WH-).""" + + def __init__(self, full_fn_ls, root_exists=False, nbins=3, overwrite_proc=None): + assert len(full_fn_ls) > 0 + self.sig_ls = [SignalROOTInfo(fn, root_exists=root_exists, nbins=nbins) + for fn in full_fn_ls] + + self.proc = overwrite_proc if overwrite_proc is not None else self.sig_ls[0].proc + + for s in self.sig_ls: + assert s.trig_type == self.trig_type + + for item in ("fn", "full_fn"): + old_val = getattr(self.sig_ls[0], item) + setattr(self, item, old_val.replace(self.sig_ls[0].proc, self.proc)) + + def return_nuis_key(self): + return self.sig_ls[0].return_nuis_key().replace(self.sig_ls[0].proc, self.proc) + + def return_name2details(self, lifetime_unit="mm"): + ls = self.sig_ls[0].return_name2details(lifetime_unit=lifetime_unit) + ls[0] = ls[0].replace(self.sig_ls[0].proc, self.proc) + return ls + + def print_diagnostics(self, lifetime_unit="mm"): + if len(self.sig_ls) > 1: + print("Overriding process name:", self.proc) + for s in self.sig_ls: + s.print_diagnostics(lifetime_unit=lifetime_unit) + + def get_sumw(self): + return sum(s.get_sumw() for s in self.sig_ls) + + def get_ngen(self): + return sum(s.get_ngen() for s in self.sig_ls) + + def get_xsec(self): + return sum(s.get_xsec() for s in self.sig_ls) + + def __getattr__(self, name): + """Delegate unknown attributes to the first list item.""" + if name in {}: + return + result = getattr(self.sig_ls[0], name) + if isinstance(result, str): + result = result.replace(self.sig_ls[0].proc, self.proc) + return result + + +class NuisanceInfo(object): + """Store information for one nuisance parameter line on a combine datacard. + + Convention: store e.g. 1.01 (not 0.01) for a ~1% fluctuation. + """ + + def __init__(self, nuis_name, nuis_val, make_updn, sep_yrs, corr, + nuis_type="lnN", nbins=3, ana_spec=False, add_era_tags=True, extra_info=None): + if extra_info is None: + extra_info = [] + + try: + test = float(nuis_val[0]) + self.nuis_val = np.array(nuis_val, dtype=float) + except Exception: + try: + self.nuis_val = float(nuis_val) * np.ones(nbins) + except Exception: + raise Exception("Unable to parse nuis_val") + + # Resize nuis_val to match nbins when the array length doesn't match. + # Shorter: pad with 1.0 (no effect) -- happens when nuisance tables + # were built for fewer bins than the current scheme. + # Longer: truncate -- happens when a hardcoded per-bin array (e.g. + # pileup [1.03, 1.04, 1.06]) is used with a coarser binning. + if len(self.nuis_val) != nbins: + if len(self.nuis_val) < nbins: + self.nuis_val = np.concatenate( + [self.nuis_val, np.ones(nbins - len(self.nuis_val))]) + else: + self.nuis_val = self.nuis_val[:nbins] + + if np.any(self.nuis_val < 0): + raise Exception("Nuisance must be >=0. Also remember 1 (not 0) is the central value") + + if (make_updn is True and nuis_type != "shape") or (make_updn is not True and nuis_type == "shape"): + raise Exception("If make_updn is True, nuis_type must be shape (and vice versa)") + if nuis_type == "shape": + if corr is False: + raise Exception("Shape uncertainties should be initiated as bin-correlated") + corr = True + if nuis_type == "GammaN" and corr is True: + print("Warning: GammaN pipeline assumes corr=False. Please double-check the input") + + self.nuis_name = nuis_name + self.make_updn = bool(make_updn) + self.sep_yrs = sep_yrs + self.corr = corr + self.nuis_type = nuis_type + self.nbins = int(nbins) + self.add_anaID = ana_spec + self.add_era_tags = add_era_tags + self.extra_info = extra_info + + if corr is False: + if len(self.nuis_val) != nbins: + raise Exception("Length of array must equal nbins") + + def print_diagnostics(self): + msg = ("Nuisance name %s Is shape? %s Year-Sep %s Correlation %s" + " Contents %s Type %s Bins %s" % ( + self.nuis_name, self.make_updn, self.sep_yrs, self.corr, + self.nuis_val, self.nuis_type, self.nbins)) + if self.extra_info: + msg += " Notes: %s" % self.extra_info + print(msg) + + +class NuisanceTable(object): + """2-D (lifetime x mass) nuisance table with bilinear interpolation. + + Values are always stored as fractions (not percent); set as_percent=True + if the input data is in percent. + """ + + def __init__(self, proc="", x_vals=None, x_unit=None, y_vals=None, y_unit=None, + as_percent=None, + years=None, + nbin_len=False, dtype=float, pickle_loc=None, + make_pickle_fn=True, trig_for_pickle=None): + if years is None: + years = set(["20161", "20162", "2017", "2018"]) + + if pickle_loc is None: + if any(v is None for v in [proc, x_vals, x_unit, y_vals, y_unit, as_percent]): + raise Exception("Missing inputs") + self.arr_len = nbins if nbin_len else 0 + self.nuis_dict = {} + try: + self.nuis_dict.update({ + "proc": str(proc), + "x_vals": np.sort(np.array(x_vals, dtype=float)), + "y_vals": np.sort(np.array(y_vals, dtype=float)), + "x_unit": str(x_unit), + "y_unit": str(y_unit), + "perc": as_percent, + "years": years, + "arr_len": self.arr_len, + "dtype": dtype, + }) + except Exception: + raise Exception("Error: input cannot be converted into arrays/strings") + self.proc = str(proc) + self.perc = as_percent + + for y in years: + if self.arr_len == 0: + arr = np.empty((len(self.nuis_dict["x_vals"]), len(self.nuis_dict["y_vals"])), dtype=dtype) + else: + arr = np.empty((len(self.nuis_dict["x_vals"]), len(self.nuis_dict["y_vals"]), self.arr_len), dtype=dtype) + arr.fill(np.nan) + self.nuis_dict[y] = arr + else: + pickle_loc_tosearch = pickle_loc + try: + if make_pickle_fn: + pickle_loc_tosearch += "_" + proc + ".pkl" + with open(pickle_loc_tosearch, "rb") as fh: + use_dict = pickle.load(fh) + except Exception: + could_find = False + for alias in config.sig["aliases"][trig_for_pickle][proc]: + try: + pickle_loc_tosearch = pickle_loc + if make_pickle_fn: + pickle_loc_tosearch += "_" + alias + ".pkl" + with open(pickle_loc_tosearch, "rb") as fh: + use_dict = pickle.load(fh) + could_find = True + print("Warning: redirected pickle name to " + alias) + break + except Exception: + pass + if not could_find: + raise Exception("Did not find any valid pickle to read, for " + proc) + + self.nuis_dict = use_dict + self.proc = self.nuis_dict["proc"] + self.perc = self.nuis_dict["perc"] + self.arr_len = self.nuis_dict["arr_len"] + + def add_entry(self, proc, x_val, y_val, year, val, x_unit=None, y_unit=None, debug_mode=False): + if proc != self.proc: + return + if year not in self.nuis_dict["years"]: + raise Exception("Queried year %s not in entries" % year) + + tau = x_val if x_unit is None else ROOThelper.convert_units(to_unit=self.nuis_dict["x_unit"], from_num=x_val, from_unit=x_unit) + mass = y_val if y_unit is None else ROOThelper.convert_units(to_unit=self.nuis_dict["y_unit"], from_num=y_val, from_unit=y_unit) + + x_ind = np.where(self.nuis_dict["x_vals"] == tau)[0][0] + y_ind = np.where(self.nuis_dict["y_vals"] == float(mass))[0][0] + + to_fill = val * 0.01 if self.perc else val + if np.prod(np.isfinite(self.nuis_dict[year][x_ind, y_ind])): + raise Exception("Overwriting non-nan value") + self.nuis_dict[year][x_ind, y_ind] = to_fill + if debug_mode: + print("Filled", x_ind, ",", y_ind, "of", year) + + def add_entry_from_fn(self, file_info, val, debug_mode=False): + try: + new_sig = SignalROOTInfo(file_info) + except Exception: + new_sig = file_info + proc, tau, mass, yr = new_sig.return_name2details(lifetime_unit=self.nuis_dict["x_unit"]) + self.add_entry(proc=proc, x_val=tau, y_val=mass, year=yr, val=val, debug_mode=debug_mode) + + def add_dictionary(self, in_dict, debug_mode=False): + for k in in_dict.keys(): + self.add_entry_from_fn(k, in_dict[k], debug_mode=debug_mode) + + def add_array(self, proc, x_vals, y_vals, year, val_arr, x_unit=None, y_unit=None, debug_mode=False): + if len(x_vals) != len(self.nuis_dict["x_vals"]) or len(y_vals) != len(self.nuis_dict["y_vals"]): + raise Exception("Input array dimensions incompatible.") + val_arr = np.array(val_arr) + if val_arr.shape != self.nuis_dict[year].shape: + raise Exception("Bad array dimensions, or wrong year.") + for i in xrange(len(x_vals)): + for j in xrange(len(y_vals)): + self.add_entry(proc, x_vals[i], y_vals[j], year, val_arr[i, j], + x_unit=x_unit, y_unit=y_unit, debug_mode=debug_mode) + + def get_point(self, year, x_val, y_val, x_unit=None, y_unit=None, use_log=False, debug_mode=False): + """Interpolate the table at (x_val, y_val). Returns None if outside grid.""" + if year not in self.nuis_dict["years"]: + raise Exception("%s not in list of years." % year) + + if x_unit is None: + x_unit = self.nuis_dict["x_unit"] + if y_unit is None: + y_unit = self.nuis_dict["y_unit"] + x_val, y_val = float(x_val), float(y_val) + + xy_vals = [x_val, y_val] + xy_units = [x_unit, y_unit] + dict_unit_k = ["x_unit", "y_unit"] + dict_vals_k = ["x_vals", "y_vals"] + s_ind = [] + vsu_ls = [] + + for i in xrange(len(xy_vals)): + su = self.nuis_dict[dict_unit_k[i]] + ua = self.nuis_dict[dict_vals_k[i]] + vsu = ROOThelper.convert_units(su, from_num=xy_vals[i], from_unit=xy_units[i]) + vsu_ls.append(vsu) + + if vsu in ua: + s_ind.append([np.where(ua == vsu)[0][0]]) + else: + if vsu < ua[0] or vsu > ua[-1]: + print("Warning: requested", vsu, su, "is outside the storage grid.") + print("Extrapolation from 2D array not implemented. Ending function.") + return None + low_ele = np.where(ua < vsu)[0][-1] + upp_ele = np.where(ua > vsu)[0][0] + s_ind.append([low_ele, upp_ele]) + + if debug_mode: + print("Searching coordinates:", s_ind, "corresponding to", vsu_ls, "(in same units as grid)") + + interp_q = 0.0 + + if len(s_ind[0]) == 1 and len(s_ind[1]) == 1: + interp_q = self.nuis_dict[year][s_ind[0][0], s_ind[1][0]] + if debug_mode: + print("Extracted", interp_q) + + elif len(s_ind[0]) == 1 and len(s_ind[1]) != 1: + if use_log: + y, y0, y1 = np.log([vsu_ls[1], self.nuis_dict["y_vals"][s_ind[1][0]], self.nuis_dict["y_vals"][s_ind[1][1]]]) + else: + y, y0, y1 = vsu_ls[1], self.nuis_dict["y_vals"][s_ind[1][0]], self.nuis_dict["y_vals"][s_ind[1][1]] + q0 = self.nuis_dict[year][s_ind[0][0], s_ind[1][0]] + q1 = self.nuis_dict[year][s_ind[0][0], s_ind[1][1]] + interp_q = lerp(y, y0, y1, q0, q1) + if debug_mode: + print("Interpolated y-axis", y0, y1, "with nuis", q0, q1, "to get y=", y, "as", interp_q) + + elif len(s_ind[0]) != 1 and len(s_ind[1]) == 1: + if use_log: + x, x0, x1 = np.log([vsu_ls[0], self.nuis_dict["x_vals"][s_ind[0][0]], self.nuis_dict["x_vals"][s_ind[0][1]]]) + else: + x, x0, x1 = vsu_ls[0], self.nuis_dict["x_vals"][s_ind[0][0]], self.nuis_dict["x_vals"][s_ind[0][1]] + q0 = self.nuis_dict[year][s_ind[0][0], s_ind[1][0]] + q1 = self.nuis_dict[year][s_ind[0][1], s_ind[1][0]] + interp_q = lerp(x, x0, x1, q0, q1) + if debug_mode: + print("Interpolated x-axis", x0, x1, "with nuis", q0, q1, "to get x=", x, "as", interp_q) + + elif len(s_ind[0]) != 1 and len(s_ind[1]) != 1: + if use_log: + x, x1, x2 = np.log([vsu_ls[0], self.nuis_dict["x_vals"][s_ind[0][0]], self.nuis_dict["x_vals"][s_ind[0][1]]]) + y, y1, y2 = np.log([vsu_ls[1], self.nuis_dict["y_vals"][s_ind[1][0]], self.nuis_dict["y_vals"][s_ind[1][1]]]) + else: + x, x1, x2 = vsu_ls[0], self.nuis_dict["x_vals"][s_ind[0][0]], self.nuis_dict["x_vals"][s_ind[0][1]] + y, y1, y2 = vsu_ls[1], self.nuis_dict["y_vals"][s_ind[1][0]], self.nuis_dict["y_vals"][s_ind[1][1]] + q11 = self.nuis_dict[year][s_ind[0][0], s_ind[1][0]] + q12 = self.nuis_dict[year][s_ind[0][0], s_ind[1][1]] + q21 = self.nuis_dict[year][s_ind[0][1], s_ind[1][0]] + q22 = self.nuis_dict[year][s_ind[0][1], s_ind[1][1]] + points = [(x1, y1, q11), (x1, y2, q12), (x2, y1, q21), (x2, y2, q22)] + interp_q = bilerp(x, y, points) + if debug_mode: + print("Interpolated nuis", interp_q, "from nuis", [q11, q12, q21, q22], + "at x's", [x1, x2], "and y's", [y1, y2]) + else: + raise Exception("Error: coordinate list is not 1x1-2x2") + + if self.arr_len == 0: + if not np.isfinite(interp_q): + print("Warning: unable to interpolate, likely missing grid value. Exiting code.") + return None + return interp_q + + def get_point_from_fn(self, file_info, overrides=None, use_log=False, debug_mode=False): + try: + new_sig = SignalROOTInfo(file_info) + except Exception: + new_sig = file_info + proc, tau, mass, yr = new_sig.return_name2details(lifetime_unit=self.nuis_dict["x_unit"]) + if proc != self.proc: + return None + if overrides is not None: + for k in overrides: + if k == "yr": + yr = overrides[k] + return self.get_point(yr, tau, mass, use_log=use_log, debug_mode=debug_mode) + + def print_diagnostics(self): + print(self.nuis_dict) + + def save_pickle(self, to_fn_prefix, tag_proc=True, to_fn_suffix=".pkl", debug_mode=False): + out_fn = to_fn_prefix + if tag_proc: + out_fn += "_" + self.proc + out_fn += to_fn_suffix + with open(out_fn, "wb") as fh: + pickle.dump(self.nuis_dict, fh) + if debug_mode: + print("Saved pickle:", out_fn) + + def pretty_print_diagnostics(self): + str_out = str(self.nuis_dict).replace(", '", """,\n '""") + temp_yr_dict = {"years": self.nuis_dict["years"]} + str_yr_replace = str(temp_yr_dict)[1:-1] + str_out = str_out.replace( + str_yr_replace.replace(", '", """,\n '"""), + str_yr_replace) + return str_out + + +def collect_xyvals_from_namearr(p, fns, x_unit, y_unit, debug_mode=False, **kwargs): + """Scan filenames and return sorted lists of unique x (lifetime) and y (mass) values.""" + x_vals = [] + y_vals = [] + + for k in fns: + new_sig = SignalROOTInfo(k, **kwargs) + proc, tau, mass, _ = new_sig.return_name2details(lifetime_unit=x_unit) + if proc != p: + continue + for val, ls in [(tau, x_vals), (mass, y_vals)]: + if val not in ls: + ls.append(val) + + x_vals.sort() + y_vals.sort() + + if debug_mode: + print("Identified x-s:", x_vals, "in", x_unit) + print("Identified y-s:", y_vals) + + return x_vals, y_vals diff --git a/MFVNeutralino/test/ForLimits/helper_ROOT_functions.py b/MFVNeutralino/test/ForLimits/helper_ROOT_functions.py new file mode 100644 index 000000000..2fc8d0ab3 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/helper_ROOT_functions.py @@ -0,0 +1,56 @@ +from __future__ import division +from __future__ import absolute_import + +import ROOT + +import sig_and_bkg_configs as sb_conf + + +def search_dict_w_startkey(dt, p): + """Look up p in dt; fall back to prefix-matched entry in dt['index_start'], then dt['others'].""" + if p in dt.keys(): + return dt[p] + else: + for st in dt["index_start"].keys(): + str_loc = p.find(st) + if str_loc == 0: + return dt["index_start"][st] + return dt["others"] + + +def mult_hist_w_array(h, arr): + """Multiply each bin content and error of h by the corresponding element of arr.""" + if (h.GetNbinsX() != len(arr)): + raise Exception("Bad multiplicative array dimensions for ROOT histogram") + for i in range(h.GetNbinsX()): + h.SetBinContent(i+1, h.GetBinContent(i+1) * arr[i]) + h.SetBinError(i+1, h.GetBinError(i+1) * arr[i]) + return + + +def convert_units(to_unit, from_num=None, from_unit=None, from_expr=None): + """Convert a displacement value between mm and um. + + from_expr: if given, interprets the last 2 chars as the unit (filename convention). + """ + if "eV" in to_unit and "eV" in from_unit: + return from_num + + if from_expr is not None: + from_num = float(from_expr[:-2]) + from_unit = from_expr[-2:] + + num_asfloat = float(from_num) + if from_unit == "mm": + num_in_mm = num_asfloat + elif from_unit == "um": + num_in_mm = num_asfloat * 1e-3 + else: + raise Exception("Unit input %s not recognized" % from_unit) + + if to_unit == "mm": + return num_in_mm + elif to_unit == "um": + return num_in_mm * 1e3 + else: + raise Exception("Unit requested %s not recognized" % to_unit) diff --git a/MFVNeutralino/test/ForLimits/hepdata_ins1861146.json b/MFVNeutralino/test/ForLimits/hepdata_ins1861146.json new file mode 100644 index 000000000..67f81bd80 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/hepdata_ins1861146.json @@ -0,0 +1,1632 @@ +{ + "mfv_neu": { + "ctau_mm": [ + 0.15, + 0.25, + 0.35, + 0.45, + 0.55, + 0.65, + 0.75, + 0.85, + 0.95, + 1.5, + 2.5, + 3.5, + 5.5, + 8.5, + 11.5, + 14.5, + 17.5, + 20.5, + 23.5, + 26.5, + 29.5, + 32.5, + 35.5, + 38.5, + 41.5, + 44.5, + 47.5, + 50.5, + 53.5, + 56.5, + 59.5, + 62.5, + 65.5, + 68.5, + 71.5, + 74.5, + 77.5, + 80.5, + 83.5, + 86.5, + 89.5, + 92.5, + 95.5, + 98.5 + ], + "mass_gev": [ + 350, + 450, + 550, + 700, + 900, + 1100, + 1300, + 1500, + 1700, + 1900, + 2100, + 2300, + 2500, + 2700, + 2900 + ], + "obs": [ + [ + 0.0023, + 0.0005, + 0.0004, + 0.0011, + 0.0033, + 0.0108, + 0.0363, + 0.107, + 0.3024, + 0.7908, + 2.5189, + 6.5765, + 17.6484, + 49.4568, + 146.2079 + ], + [ + 0.0004, + 0.0001, + 0.0001, + 0.0002, + 0.0006, + 0.0023, + 0.0069, + 0.022, + 0.0654, + 0.1909, + 0.5395, + 1.5219, + 4.0772, + 11.4791, + 30.7851 + ], + [ + 0.0003, + 0.0001, + 0.0, + 0.0001, + 0.0003, + 0.0011, + 0.0037, + 0.0116, + 0.0347, + 0.0964, + 0.2823, + 0.7905, + 2.1214, + 6.0115, + 16.8267 + ], + [ + 0.0002, + 0.0, + 0.0, + 0.0001, + 0.0002, + 0.0007, + 0.0025, + 0.008, + 0.0239, + 0.0683, + 0.1946, + 0.5447, + 1.4966, + 4.1518, + 11.4277 + ], + [ + 0.0002, + 0.0, + 0.0, + 0.0001, + 0.0002, + 0.0006, + 0.0019, + 0.0061, + 0.0187, + 0.0546, + 0.1509, + 0.4197, + 1.1493, + 3.2638, + 9.2558 + ], + [ + 0.0001, + 0.0, + 0.0, + 0.0001, + 0.0001, + 0.0005, + 0.0016, + 0.0052, + 0.0155, + 0.0451, + 0.1308, + 0.3495, + 0.9806, + 2.7072, + 7.475 + ], + [ + 0.0001, + 0.0, + 0.0, + 0.0, + 0.0001, + 0.0004, + 0.0014, + 0.0044, + 0.0136, + 0.0396, + 0.1139, + 0.3072, + 0.8488, + 2.3701, + 6.5966 + ], + [ + 0.0001, + 0.0, + 0.0, + 0.0, + 0.0001, + 0.0004, + 0.0013, + 0.004, + 0.012, + 0.0356, + 0.1017, + 0.2851, + 0.7852, + 2.138, + 5.9559 + ], + [ + 0.0001, + 0.0, + 0.0, + 0.0, + 0.0001, + 0.0003, + 0.0011, + 0.0037, + 0.0111, + 0.0331, + 0.0936, + 0.2588, + 0.7104, + 1.9261, + 5.4748 + ], + [ + 0.0001, + 0.0, + 0.0, + 0.0, + 0.0001, + 0.0003, + 0.0011, + 0.0034, + 0.0102, + 0.0297, + 0.0852, + 0.235, + 0.662, + 1.8173, + 5.0672 + ], + [ + 0.0001, + 0.0, + 0.0, + 0.0, + 0.0001, + 0.0002, + 0.0008, + 0.0024, + 0.0073, + 0.0214, + 0.0615, + 0.1667, + 0.4638, + 1.2925, + 3.5819 + ], + [ + 0.0001, + 0.0, + 0.0, + 0.0, + 0.0001, + 0.0002, + 0.0007, + 0.0021, + 0.0063, + 0.0187, + 0.0534, + 0.1502, + 0.4119, + 1.1405, + 3.1056 + ], + [ + 0.0001, + 0.0, + 0.0, + 0.0, + 0.0001, + 0.0002, + 0.0006, + 0.0019, + 0.0059, + 0.0176, + 0.0494, + 0.1378, + 0.3828, + 1.038, + 2.9046 + ], + [ + 0.0001, + 0.0, + 0.0, + 0.0, + 0.0001, + 0.0002, + 0.0006, + 0.0018, + 0.0054, + 0.0158, + 0.0452, + 0.1276, + 0.3477, + 0.9658, + 2.6227 + ], + [ + 0.0001, + 0.0, + 0.0, + 0.0, + 0.0001, + 0.0002, + 0.0006, + 0.0018, + 0.0054, + 0.0156, + 0.044, + 0.1224, + 0.339, + 0.9309, + 2.5318 + ], + [ + 0.0001, + 0.0, + 0.0, + 0.0, + 0.0001, + 0.0002, + 0.0006, + 0.0018, + 0.0055, + 0.0159, + 0.0451, + 0.1249, + 0.3467, + 0.953, + 2.5474 + ], + [ + 0.0001, + 0.0, + 0.0, + 0.0, + 0.0001, + 0.0002, + 0.0006, + 0.0019, + 0.0057, + 0.0168, + 0.0466, + 0.129, + 0.3555, + 0.9589, + 2.6454 + ], + [ + 0.0002, + 0.0, + 0.0, + 0.0, + 0.0001, + 0.0002, + 0.0006, + 0.002, + 0.006, + 0.0174, + 0.0486, + 0.1352, + 0.3658, + 0.9997, + 2.7158 + ], + [ + 0.0002, + 0.0, + 0.0, + 0.0, + 0.0001, + 0.0002, + 0.0007, + 0.0021, + 0.0063, + 0.0183, + 0.0514, + 0.1416, + 0.3808, + 1.0477, + 2.8331 + ], + [ + 0.0002, + 0.0, + 0.0, + 0.0, + 0.0001, + 0.0002, + 0.0007, + 0.0022, + 0.0067, + 0.0194, + 0.0542, + 0.1474, + 0.403, + 1.097, + 2.9498 + ], + [ + 0.0002, + 0.0, + 0.0, + 0.0, + 0.0001, + 0.0002, + 0.0008, + 0.0024, + 0.0074, + 0.0204, + 0.0572, + 0.1584, + 0.4213, + 1.1618, + 3.1043 + ], + [ + 0.0002, + 0.0001, + 0.0, + 0.0001, + 0.0001, + 0.0003, + 0.0008, + 0.0025, + 0.0076, + 0.0216, + 0.0599, + 0.1642, + 0.4387, + 1.1932, + 3.2955 + ], + [ + 0.0003, + 0.0001, + 0.0, + 0.0001, + 0.0001, + 0.0003, + 0.0009, + 0.0027, + 0.0079, + 0.0228, + 0.0642, + 0.1752, + 0.4701, + 1.2679, + 3.4347 + ], + [ + 0.0003, + 0.0001, + 0.0, + 0.0001, + 0.0001, + 0.0003, + 0.0009, + 0.0028, + 0.0082, + 0.0245, + 0.0658, + 0.1799, + 0.4895, + 1.3216, + 3.525 + ], + [ + 0.0003, + 0.0001, + 0.0, + 0.0001, + 0.0001, + 0.0003, + 0.001, + 0.003, + 0.0087, + 0.0257, + 0.0699, + 0.1893, + 0.514, + 1.3858, + 3.6946 + ], + [ + 0.0003, + 0.0001, + 0.0, + 0.0001, + 0.0001, + 0.0003, + 0.001, + 0.0032, + 0.0093, + 0.0266, + 0.0731, + 0.2024, + 0.5424, + 1.4363, + 3.8794 + ], + [ + 0.0007, + 0.0001, + 0.0, + 0.0001, + 0.0001, + 0.0004, + 0.0011, + 0.0034, + 0.0098, + 0.028, + 0.0779, + 0.2103, + 0.5757, + 1.5022, + 4.0534 + ], + [ + 0.0005, + 0.0001, + 0.0, + 0.0001, + 0.0001, + 0.0004, + 0.0012, + 0.0035, + 0.0104, + 0.0293, + 0.0814, + 0.2214, + 0.5932, + 1.6077, + 4.2198 + ], + [ + 0.0005, + 0.0001, + 0.0001, + 0.0001, + 0.0001, + 0.0004, + 0.0012, + 0.0037, + 0.0107, + 0.0306, + 0.0847, + 0.2322, + 0.6123, + 1.6605, + 4.4299 + ], + [ + 0.0006, + 0.0001, + 0.0001, + 0.0001, + 0.0002, + 0.0004, + 0.0013, + 0.0039, + 0.0115, + 0.0314, + 0.0875, + 0.2419, + 0.6444, + 1.71, + 4.6546 + ], + [ + 0.0007, + 0.0001, + 0.0001, + 0.0001, + 0.0002, + 0.0004, + 0.0013, + 0.0041, + 0.0122, + 0.0338, + 0.0943, + 0.2512, + 0.6772, + 1.7995, + 4.8511 + ], + [ + 0.0006, + 0.0001, + 0.0001, + 0.0001, + 0.0002, + 0.0005, + 0.0014, + 0.0042, + 0.0123, + 0.0352, + 0.0954, + 0.2654, + 0.6957, + 1.9064, + 5.0833 + ], + [ + 0.0007, + 0.0002, + 0.0001, + 0.0001, + 0.0002, + 0.0005, + 0.0015, + 0.0045, + 0.0131, + 0.0368, + 0.1008, + 0.2736, + 0.7128, + 1.9355, + 5.1402 + ], + [ + 0.0012, + 0.0001, + 0.0001, + 0.0001, + 0.0002, + 0.0005, + 0.0015, + 0.0047, + 0.0135, + 0.0381, + 0.1046, + 0.2843, + 0.759, + 2.0412, + 5.3415 + ], + [ + 0.0008, + 0.0002, + 0.0001, + 0.0001, + 0.0002, + 0.0005, + 0.0016, + 0.005, + 0.0141, + 0.0397, + 0.1065, + 0.2972, + 0.794, + 2.0883, + 5.6087 + ], + [ + 0.0008, + 0.0002, + 0.0001, + 0.0002, + 0.0002, + 0.0005, + 0.0017, + 0.005, + 0.0148, + 0.0427, + 0.1155, + 0.3107, + 0.8211, + 2.1322, + 5.8978 + ], + [ + 0.0015, + 0.0002, + 0.0001, + 0.0002, + 0.0002, + 0.0006, + 0.0018, + 0.0053, + 0.0153, + 0.0429, + 0.1193, + 0.3187, + 0.8341, + 2.2998, + 6.0017 + ], + [ + 0.001, + 0.0002, + 0.0001, + 0.0002, + 0.0002, + 0.0006, + 0.0018, + 0.0055, + 0.016, + 0.0456, + 0.1192, + 0.3361, + 0.8817, + 2.3006, + 6.1454 + ], + [ + 0.0009, + 0.0002, + 0.0001, + 0.0002, + 0.0003, + 0.0006, + 0.0019, + 0.0056, + 0.0164, + 0.0465, + 0.1239, + 0.3449, + 0.918, + 2.4506, + 6.42 + ], + [ + 0.0011, + 0.0002, + 0.0001, + 0.0002, + 0.0003, + 0.0007, + 0.002, + 0.0059, + 0.0172, + 0.048, + 0.1329, + 0.3481, + 0.9633, + 2.5333, + 6.561 + ], + [ + 0.0009, + 0.0002, + 0.0001, + 0.0002, + 0.0003, + 0.0007, + 0.0021, + 0.006, + 0.0179, + 0.0489, + 0.1378, + 0.3682, + 0.9848, + 2.5581, + 6.8761 + ], + [ + 0.0017, + 0.0002, + 0.0001, + 0.0002, + 0.0003, + 0.0007, + 0.0021, + 0.0063, + 0.0195, + 0.0521, + 0.1424, + 0.3826, + 1.0536, + 2.6632, + 6.9958 + ], + [ + 0.0011, + 0.0002, + 0.0001, + 0.0002, + 0.0003, + 0.0007, + 0.0022, + 0.0068, + 0.0187, + 0.0539, + 0.1466, + 0.3959, + 1.0287, + 2.7401, + 7.2035 + ], + [ + 0.0015, + 0.0003, + 0.0001, + 0.0002, + 0.0003, + 0.0007, + 0.0023, + 0.0069, + 0.0198, + 0.0557, + 0.1509, + 0.4123, + 1.0795, + 2.7907, + 7.3866 + ] + ] + }, + "mfv_stopdbardbar": { + "ctau_mm": [ + 0.15, + 0.25, + 0.35, + 0.45, + 0.55, + 0.65, + 0.75, + 0.85, + 0.95, + 1.5, + 2.5, + 3.5, + 5.5, + 8.5, + 11.5, + 14.5, + 17.5, + 20.5, + 23.5, + 26.5, + 29.5, + 32.5, + 35.5, + 38.5, + 41.5, + 44.5, + 47.5, + 50.5, + 53.5, + 56.5, + 59.5, + 62.5, + 65.5, + 68.5, + 71.5, + 74.5, + 77.5, + 80.5, + 83.5, + 86.5, + 89.5, + 92.5, + 95.5, + 98.5 + ], + "mass_gev": [ + 350, + 450, + 550, + 700, + 900, + 1100, + 1300, + 1500, + 1700, + 1900, + 2100, + 2300, + 2500, + 2700, + 2900 + ], + "obs": [ + [ + 0.0047, + 0.0071, + 0.0126, + 0.0408, + 0.1545, + 0.567, + 1.9469, + 5.8514, + 17.5616, + 50.3837, + 138.2284, + 421.1301, + 1245.6, + 3334.5821, + 10788.3333 + ], + [ + 0.0016, + 0.002, + 0.0031, + 0.0094, + 0.0353, + 0.1263, + 0.4353, + 1.456, + 4.3196, + 12.3097, + 35.8159, + 103.1644, + 293.83, + 826.7147, + 2492.25 + ], + [ + 0.0008, + 0.0011, + 0.0017, + 0.005, + 0.0184, + 0.0671, + 0.2404, + 0.7617, + 2.3371, + 6.8516, + 19.7611, + 56.3048, + 162.72, + 458.3285, + 1294.9167 + ], + [ + 0.0006, + 0.0009, + 0.0013, + 0.0035, + 0.0127, + 0.048, + 0.1655, + 0.5344, + 1.6588, + 4.8682, + 14.0723, + 41.7397, + 116.19, + 332.9971, + 941.8333 + ], + [ + 0.0005, + 0.0007, + 0.001, + 0.0027, + 0.0098, + 0.0377, + 0.1327, + 0.4311, + 1.308, + 3.9593, + 11.2766, + 32.8562, + 93.487, + 266.1037, + 764.4667 + ], + [ + 0.0004, + 0.0006, + 0.0008, + 0.0024, + 0.0082, + 0.0314, + 0.1085, + 0.3606, + 1.1175, + 3.3338, + 9.8221, + 26.925, + 79.001, + 230.2651, + 651.8667 + ], + [ + 0.0004, + 0.0005, + 0.0008, + 0.0021, + 0.0072, + 0.0277, + 0.0952, + 0.3171, + 0.9786, + 2.9513, + 8.5365, + 25.3784, + 70.768, + 203.2392, + 573.8333 + ], + [ + 0.0004, + 0.0005, + 0.0007, + 0.0019, + 0.0064, + 0.0244, + 0.0865, + 0.2877, + 0.9009, + 2.671, + 7.8526, + 22.5798, + 64.708, + 183.8703, + 536.3333 + ], + [ + 0.0003, + 0.0004, + 0.0007, + 0.0017, + 0.006, + 0.0231, + 0.0798, + 0.26, + 0.8272, + 2.4459, + 7.2394, + 20.7791, + 59.695, + 171.147, + 486.2917 + ], + [ + 0.0003, + 0.0004, + 0.0006, + 0.0016, + 0.0056, + 0.0213, + 0.0736, + 0.2435, + 0.7761, + 2.3131, + 6.7937, + 19.4503, + 56.077, + 160.683, + 453.1 + ], + [ + 0.0003, + 0.0003, + 0.0005, + 0.0012, + 0.0039, + 0.015, + 0.0533, + 0.1792, + 0.5603, + 1.702, + 5.0653, + 14.6356, + 41.475, + 118.8098, + 337.5083 + ], + [ + 0.0002, + 0.0003, + 0.0004, + 0.0011, + 0.0035, + 0.0134, + 0.0473, + 0.158, + 0.4996, + 1.5176, + 4.4497, + 12.899, + 37.203, + 108.5476, + 307.6333 + ], + [ + 0.0002, + 0.0003, + 0.0004, + 0.001, + 0.0033, + 0.0124, + 0.0451, + 0.148, + 0.4636, + 1.4185, + 4.2323, + 12.3014, + 34.69, + 100.196, + 292.5 + ], + [ + 0.0003, + 0.0003, + 0.0004, + 0.001, + 0.0031, + 0.0117, + 0.0421, + 0.1389, + 0.4445, + 1.333, + 3.9352, + 11.5103, + 33.158, + 96.0259, + 270.4583 + ], + [ + 0.0004, + 0.0004, + 0.0005, + 0.0011, + 0.0032, + 0.0118, + 0.0424, + 0.1397, + 0.4426, + 1.3257, + 3.9789, + 11.3572, + 33.341, + 94.3314, + 269.9833 + ], + [ + 0.0005, + 0.0005, + 0.0006, + 0.0012, + 0.0034, + 0.0127, + 0.0443, + 0.1492, + 0.4654, + 1.4212, + 4.2282, + 12.2301, + 34.848, + 99.268, + 284.2333 + ], + [ + 0.0006, + 0.0006, + 0.0006, + 0.0014, + 0.0037, + 0.0134, + 0.048, + 0.1591, + 0.4962, + 1.5105, + 4.4615, + 13.0959, + 37.103, + 106.0231, + 299.6333 + ], + [ + 0.0008, + 0.0007, + 0.0007, + 0.0015, + 0.004, + 0.0143, + 0.0505, + 0.1691, + 0.5427, + 1.6186, + 4.8105, + 13.712, + 39.446, + 114.317, + 318.775 + ], + [ + 0.0009, + 0.0008, + 0.0008, + 0.0016, + 0.0042, + 0.0158, + 0.0548, + 0.1826, + 0.573, + 1.7567, + 5.2207, + 15.0918, + 42.335, + 121.0432, + 349.55 + ], + [ + 0.0011, + 0.001, + 0.0009, + 0.0018, + 0.0047, + 0.0167, + 0.0576, + 0.1957, + 0.625, + 1.8638, + 5.6332, + 16.124, + 47.37, + 130.5677, + 371.925 + ], + [ + 0.0012, + 0.0011, + 0.0011, + 0.002, + 0.0053, + 0.0182, + 0.064, + 0.2087, + 0.7001, + 2.0147, + 5.9594, + 17.4973, + 49.464, + 140.9337, + 397.2667 + ], + [ + 0.0016, + 0.0012, + 0.0013, + 0.0022, + 0.0055, + 0.0195, + 0.0695, + 0.2268, + 0.7149, + 2.1366, + 6.4479, + 18.311, + 54.048, + 149.4236, + 419.675 + ], + [ + 0.0018, + 0.0013, + 0.0013, + 0.0024, + 0.0058, + 0.0215, + 0.0728, + 0.244, + 0.7574, + 2.3532, + 6.9009, + 20.063, + 57.383, + 164.5014, + 456.5417 + ], + [ + 0.0017, + 0.0017, + 0.0015, + 0.0026, + 0.0065, + 0.0218, + 0.078, + 0.2584, + 0.8191, + 2.5097, + 7.367, + 21.0592, + 61.396, + 175.1902, + 490.9083 + ], + [ + 0.0018, + 0.0018, + 0.0016, + 0.0029, + 0.0067, + 0.0238, + 0.0853, + 0.2786, + 0.8591, + 2.6386, + 7.9052, + 22.6397, + 65.771, + 184.3919, + 539.5583 + ], + [ + 0.0027, + 0.0019, + 0.0017, + 0.0031, + 0.0074, + 0.0255, + 0.0871, + 0.2965, + 0.9217, + 2.9171, + 8.4326, + 24.2884, + 70.99, + 194.3026, + 566.4083 + ], + [ + 0.0026, + 0.0019, + 0.0019, + 0.0034, + 0.0077, + 0.0269, + 0.0956, + 0.3105, + 0.9984, + 2.9889, + 9.0421, + 26.3024, + 74.34, + 213.879, + 586.85 + ], + [ + 0.0033, + 0.0024, + 0.0021, + 0.0037, + 0.0083, + 0.0288, + 0.0987, + 0.3354, + 1.0526, + 3.1541, + 9.4329, + 26.8589, + 79.22, + 225.0865, + 642.7 + ], + [ + 0.003, + 0.0022, + 0.0021, + 0.004, + 0.0086, + 0.0302, + 0.1078, + 0.3479, + 1.1133, + 3.4436, + 9.9209, + 29.1253, + 82.798, + 236.2622, + 668.2417 + ], + [ + 0.0031, + 0.0029, + 0.0023, + 0.0042, + 0.0095, + 0.0323, + 0.1115, + 0.365, + 1.1917, + 3.4969, + 10.6094, + 31.0962, + 89.257, + 249.2767, + 709.7917 + ], + [ + 0.0054, + 0.0026, + 0.0027, + 0.0045, + 0.0099, + 0.0341, + 0.1176, + 0.3853, + 1.225, + 3.8043, + 10.8823, + 32.0712, + 94.911, + 270.8703, + 735.0333 + ], + [ + 0.0047, + 0.003, + 0.0029, + 0.0048, + 0.0102, + 0.0351, + 0.1232, + 0.4055, + 1.3376, + 3.9264, + 11.7226, + 34.0147, + 97.716, + 283.389, + 782.05 + ], + [ + 0.0046, + 0.0039, + 0.0028, + 0.005, + 0.0114, + 0.0375, + 0.134, + 0.4317, + 1.3618, + 4.1957, + 12.38, + 35.2158, + 104.55, + 288.3573, + 848.0 + ], + [ + 0.0047, + 0.0034, + 0.0033, + 0.0055, + 0.012, + 0.0395, + 0.1397, + 0.4533, + 1.4205, + 4.3345, + 12.8974, + 37.7192, + 110.12, + 310.7781, + 867.6667 + ], + [ + 0.0058, + 0.0045, + 0.0034, + 0.0055, + 0.0123, + 0.0418, + 0.14, + 0.4686, + 1.4639, + 4.6267, + 13.8963, + 38.9897, + 113.31, + 329.1931, + 949.0 + ], + [ + 0.0065, + 0.004, + 0.0039, + 0.0063, + 0.0128, + 0.0437, + 0.153, + 0.4911, + 1.5899, + 4.6953, + 14.5023, + 42.0411, + 120.52, + 349.4524, + 975.0 + ], + [ + 0.0056, + 0.005, + 0.0043, + 0.0066, + 0.0133, + 0.046, + 0.1566, + 0.5154, + 1.5815, + 5.0764, + 14.5152, + 44.089, + 127.58, + 358.2421, + 1013.0 + ], + [ + 0.0056, + 0.0042, + 0.0043, + 0.0066, + 0.0139, + 0.0471, + 0.1623, + 0.5382, + 1.7229, + 5.3078, + 15.8333, + 44.7295, + 132.78, + 379.2507, + 1083.0 + ], + [ + 0.0059, + 0.0048, + 0.0042, + 0.0066, + 0.0148, + 0.0506, + 0.1703, + 0.5517, + 1.7943, + 5.3965, + 16.542, + 47.2123, + 137.36, + 392.1037, + 1090.25 + ], + [ + 0.0053, + 0.0061, + 0.0044, + 0.0073, + 0.0156, + 0.0522, + 0.1754, + 0.5739, + 1.8188, + 5.7376, + 17.3625, + 49.9247, + 147.86, + 407.8674, + 1163.8333 + ], + [ + 0.0082, + 0.0056, + 0.0053, + 0.0074, + 0.0158, + 0.0544, + 0.188, + 0.6208, + 1.9318, + 6.0298, + 17.5338, + 51.4349, + 151.69, + 442.7954, + 1214.6667 + ], + [ + 0.0046, + 0.0067, + 0.005, + 0.0083, + 0.0166, + 0.0573, + 0.195, + 0.6425, + 2.0649, + 6.1376, + 18.5396, + 55.4486, + 155.71, + 449.9424, + 1230.25 + ], + [ + 0.0127, + 0.0073, + 0.0054, + 0.0088, + 0.0176, + 0.0597, + 0.1996, + 0.6666, + 2.152, + 6.5752, + 19.5023, + 55.5171, + 162.56, + 467.8386, + 1302.9167 + ], + [ + 0.0089, + 0.0074, + 0.0056, + 0.0093, + 0.0186, + 0.0641, + 0.2016, + 0.6783, + 2.1117, + 6.9519, + 20.366, + 59.476, + 171.25, + 490.0, + 1341.3333 + ] + ] + } +} \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/limits_config.yaml b/MFVNeutralino/test/ForLimits/limits_config.yaml new file mode 100644 index 000000000..528e01594 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/limits_config.yaml @@ -0,0 +1,73 @@ +# ============================================================ +# Limit framework configuration +# Edit paths and runtime settings here. Physics configuration +# (signal groupings, nuisance definitions) lives in script_configs.py. +# ============================================================ + +# Runtime: override with --year and --channel CLI flags +year: "2018" # one of: 20161, 20162, 2017, 2018 +channel: "lep" # "lep" or "bjet" +debug: true # verbose output while running + +# ---- Binning ------------------------------------------------- +# Units: cm. Three bins matching AN Figure 49: [0, 0.8, 1.6, 4.0] cm +bins: [0., 0.8, 1.6, 4.0] +nbins: 3 + +# ---- Input signal MiniTree paths ---------------------------- +# Folder should contain files named like: {process}_tau{ct}_{year}.root +signal: + lep: + folder: "/uscms/home/gdecastr/nobackup/crabdirs/MiniTree_tag001Lepm_VH/" + file_key: "condor_*tau*/minitree_0.root" + bjet: + folder: "/uscms/home/gdecastr/nobackup/crabdirs/MiniTree_tag001BvetoLHTm_bjet/" + file_key: "condor_*tau*/minitree_0.root" + +# ---- Input background paths --------------------------------- +# Local copies of the MC Run 2 background templates (copied from alecduqu's One2Two). +# Per-year files (2v_from_jets_{year}_5track_default_*.root) are also present in +# BackgroundTemplates/{lep,bjet}/ for reference; only the run2-combined files are +# currently used (no {year} placeholder in filename → .format(year) is a no-op). +# TODO: replace with data-driven per-year estimates when available after unblinding. +background: + lep: + folder: "/uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648/src/JMTucker/MFVNeutralino/test/ForLimits/BackgroundTemplates/lep/" + filename: "2v_from_jets_run2_5track_default_ULV30Lepm.root" + bjet: + folder: "/uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648/src/JMTucker/MFVNeutralino/test/ForLimits/BackgroundTemplates/bjet/" + filename: "2v_from_jets_run2_5track_default_ULV30BvetoLHTm.root" + +# ---- Output paths ------------------------------------------- +# root_output: the intermediate ROOT file holding histograms +# datacard_output: the final .txt combine datacards +root_output: + lep: + folder: "/uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648/src/JMTucker/MFVNeutralino/test/ForLimits/LimitsInput/lep/" + bjet: + folder: "/uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648/src/JMTucker/MFVNeutralino/test/ForLimits/LimitsInput/bjet/" + filename: "limitsinput" + +datacard_output: + lep: + folder: "/uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648/src/JMTucker/MFVNeutralino/test/ForLimits/Datacards/lep/" + bjet: + folder: "/uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648/src/JMTucker/MFVNeutralino/test/ForLimits/Datacards/bjet/" + prefix: "Datacard_" + suffix: ".txt" + +# ---- Nuisance table paths (relative to ForLimits/ directory) ---- +nuisance_tables: + vtx_reco_TM: "NuisTabStore_TrkMvr/pickle" + disp_trig_uncerts: "NuisTabStore_7p4p1/pickle" + tk_reco_eff: + base: "NuisTabStore_TrkRec/" + up_prefix: "up_pickle" + dn_prefix: "dn_pickle" + +# ---- Observed events (set to 0 for blind analysis) ----------- +observations: + "20161": [0, 0, 0] + "20162": [0, 0, 0] + "2017": [0, 0, 0] + "2018": [0, 0, 0] diff --git a/MFVNeutralino/test/ForLimits/makeDatacard.py b/MFVNeutralino/test/ForLimits/makeDatacard.py new file mode 100644 index 000000000..76abeb90e --- /dev/null +++ b/MFVNeutralino/test/ForLimits/makeDatacard.py @@ -0,0 +1,409 @@ +import ROOT +import numpy as np + +import script_configs as config +import nuisance_configs as ns_conf +import helper_PyStorage_objects as sth + +# Hard codes +n_proc = 2 + +# Module-level globals -- updated per year via _init_for_year() +year = config.datacard["year"] +year_id = config.datacard["year_key"].index(year) +nbins = config.datacard["nbins"] +bins = np.array(config.datacard["bins"]) +sig_type = config.sig["type"] + +year_to_tag = config.datacard["year_to_tag"] +year_tag = year_to_tag[year] + + +def _init_for_year(yr): + global year, year_id, nbins, bins, sig_type, year_to_tag, year_tag + year = yr + year_id = config.datacard["year_key"].index(yr) + nbins = config.datacard["nbins"] + bins = np.array(config.datacard["bins"]) + sig_type = config.sig["type"] + year_to_tag = config.datacard["year_to_tag"] + year_tag = year_to_tag[yr] + + +# --------------------------------------------------------------------------- +# Short helpers +# --------------------------------------------------------------------------- + +def pad(some_str, n, align_left=True): + """Pad any given string to n characters (does not truncate); always adds one space.""" + if len(some_str) >= n - 1: + return (some_str + " ") if align_left else (" " + some_str) + elif align_left: + return some_str + (n - len(some_str)) * " " + else: + return (n - len(some_str)) * " " + some_str + + +# Name helpers reference year_tag as a global -- picked up at call time +sig_nm = lambda sid: " " + "sig" + year_tag + sid +bkg_nm = lambda: " " + "bkg" + year_tag +b_nm = lambda bn: " " + "b" + year_tag + bn + + +def return_sep(): + return " " + + +def make_nuis_dcnm(nuis, siggrp, force_no_CADItag=False): + """Return the datacard name(s) for a nuisance. + + Correlated -> single string; un-correlated -> list of per-bin strings. + """ + nuis_rootname = nuis.nuis_name + if not force_no_CADItag: + if nuis.add_anaID: + nuis_rootname = ns_conf.nuis_names["CMS-CADI-tag"] + nuis_rootname + if nuis.add_era_tags: + nuis_rootname = nuis_rootname + "_" + if nuis.sep_yrs: + nuis_rootname += year_tag + else: + nuis_rootname += ns_conf.nuis_names["Run2-key"] + + if nuis.corr is True: + return nuis_rootname + elif nuis.corr is False: + return [nuis_rootname + "b" + str(i + 1) for i in range(nbins)] + else: + raise Exception("Unable to interpret nuisance for name->datacard conversion:", nuis.nuis_name) + + +def return_newline(): + return """ +________ +""" + + +def turn_info_to_line(ns_name, ns_type, strls, write_sig): + """Build one datacard line string.""" + if len(strls) != nbins: + raise Exception("Bad line input.") + new_line = "\n" + nuis_seg = "" + dash = pad("-", 7, False) + + for i in range(nbins): + nuis_seg += dash if strls[i] is None else pad(str(strls[i]), 7, False) + + new_line += pad(ns_name, 30) + pad(ns_type, 5) + if write_sig is True: + new_line += nuis_seg + return_sep() + "DASH3" + elif write_sig is False: + new_line += "DASH3" + return_sep() + nuis_seg + else: + raise Exception("Specify whether to write signal or bkg") + return new_line + + +def turn_info_to_nlines(ns_names, ns_type, strls, write_sig): + """Build per-bin datacard lines (un-correlated nuisances).""" + if len(strls) != nbins or len(ns_names) != nbins: + raise Exception("Bad line input.") + new_lines = "" + for i in range(nbins): + in_strls = [None if j != i else strls[i] for j in range(nbins)] + new_lines += turn_info_to_line(ns_names[i], ns_type, in_strls, write_sig) + return new_lines + + +def return_no_dashes(template): + new_template = template + for d in range(4): + new_template = new_template.replace("DASH%i" % d, d * pad("-", 7, False)) + return new_template + + +# --------------------------------------------------------------------------- +# Long functions +# --------------------------------------------------------------------------- + +def add_ijkmax(template, nuis_ls, nuis_bkg_ls, siggrp): + new_template = template + "\nimax " + str(nbins) + "\njmax 1\nkmax " + + k_ct = 0 + for nuis in nuis_ls + nuis_bkg_ls: + if nuis.nuis_type == "special": + if nuis.extra_info[0] == "updn_pair": + if nuis.extra_info[1] == "dn": + continue + if nuis.corr is True: + k_ct += 1 + elif nuis.corr is False: + k_ct += nbins + else: + print("Warning: unable to count k due to bad nuisance object:", nuis.nuis_name) + + new_template += str(k_ct) + return new_template + + +def add_observations(template, f, siggrp, sig_id): + new_template = template + pad("bin", 12) + for i in range(nbins): + new_template += b_nm(str(i)) + + new_template += "\n" + pad("observation", 12) + h_obs = ROOT.TH1D(f.Get("h_observed_%s" % year)) + for i in range(nbins): + new_template += pad(str(int(h_obs.GetBinContent(i + 1))), 7, False) + h_obs.Delete() + return new_template + + +def add_central_vals(template, f, sig_norm_ls, siggrp, sig_id): + """Build the bin/process/rate block; fills sig_norm_ls in place for Gamma-N.""" + new_template = template + pad("bin", 12) + for j in range(n_proc): + for i in range(nbins): + new_template += b_nm(str(i)) + if j != n_proc - 1: + new_template += return_sep() + + new_template += "\n" + pad("process", 12) + nbins * sig_nm(sig_id) + return_sep() + nbins * bkg_nm() + new_template += "\n" + pad("process", 12) + nbins * pad("0", 7, False) + return_sep() + nbins * pad("1", 7, False) + + h_sig = f.Get(sig_nm(sig_id).replace(" ", "")) + h_bkg = f.Get(bkg_nm().replace(" ", "")) + to_write = [h_sig, h_bkg] + + new_template += "\n" + pad("rate", 12) + for j in range(n_proc): + for i in range(nbins): + new_template += pad(str(to_write[j].GetBinContent(i + 1)), 3, False) + if j == 0: + sig_norm_ls.append(to_write[j].GetBinContent(i + 1)) + if j != n_proc - 1: + new_template += return_sep() + + h_sig.Delete() + h_bkg.Delete() + return new_template, sig_norm_ls + + +def return_lnN_corr(f, ns_ls, siggrp, write_sig): + new_lines = "" + for nuis in ns_ls: + try: + if nuis.nuis_type != "lnN": + continue + if nuis.corr is not True: + continue + except Exception: + raise Exception("Failure: Nuisance object not complete") + dc_name = make_nuis_dcnm(nuis, siggrp) + new_lines += turn_info_to_line(dc_name, "lnN", nuis.nuis_val, write_sig) + new_lines += "\n" + return new_lines + + +def return_lnN_uncorr(f, ns_ls, siggrp, write_sig): + new_lines = "" + for nuis in ns_ls: + try: + if nuis.nuis_type != "lnN": + continue + if nuis.corr is not False: + continue + except Exception: + raise Exception("Failure: Nuisance object not complete") + dc_names = make_nuis_dcnm(nuis, siggrp) + new_lines += turn_info_to_nlines(dc_names, "lnN", nuis.nuis_val, write_sig) + new_lines += "\n" + return new_lines + + +def return_shape_lines(f, ns_ls, siggrp, sig_id, write_sig=True): + """Write shape systematics as lnN lines using Up/Down histogram ratios.""" + new_lines = "" + for nuis in ns_ls: + if nuis.nuis_type != "shape": + continue + + dc_name = make_nuis_dcnm(nuis, siggrp) + process_htag = (sig_nm(sig_id) if write_sig else bkg_nm()).replace(" ", "") + + hname_up = process_htag + "_" + dc_name + "Up" + hname_dn = process_htag + "_" + dc_name + "Down" + + h_central = f.Get(process_htag) + h_shape_up = f.Get(hname_up) + h_shape_dn = f.Get(hname_dn) + + strls = [] + for i in range(nbins): + try: + strls.append( + str(h_shape_dn.GetBinContent(i + 1) / h_central.GetBinContent(i + 1)) + + "/" + + str(h_shape_up.GetBinContent(i + 1) / h_central.GetBinContent(i + 1)) + ) + except Exception: + strls.append("1.0/1.0") + print("Warning: division by 0 in up/down variations. Filling 1.0 for", + siggrp.fn, "bin", i) + + new_lines += turn_info_to_line(dc_name, "lnN", strls, write_sig) + + new_lines += "\n" + return new_lines + + +def return_special_lines(f, ns_ls, sig_norm_ls, siggrp, sig_id, write_sig=True): + """Handle GammaN, updn_pair, and anti-lnN nuisance types.""" + new_lines = "" + + for nuis in ns_ls: + try: + if nuis.nuis_type in ("lnN", "shape"): + continue + except Exception: + raise Exception("Failure: Nuisance object not complete") + + if nuis.nuis_type == "GammaN": + if not write_sig: + raise Exception("GammaN not implemented for background") + + dc_names = make_nuis_dcnm(nuis, siggrp) + sig_cts_hname = "h_sig%s_ngen_perbin_%s" % (sig_id, year) + h_sig_cts = f.Get(sig_cts_hname) + + # Precompute per-event weight fallback (AN formula): + # w = Lumi x XSection / Generated_MC_Events_Pre-Cuts + # Used when a bin has zero unweighted events. + _h_ngen = f.Get("h_sig%s_ngen_total_%s" % (sig_id, year)) + _h_sigyield = f.Get("h_sig%s_sigyield_total_%s" % (sig_id, year)) + _ngen_total = _h_ngen.GetBinContent(1) if _h_ngen else 0.0 + _sigyield_total = _h_sigyield.GetBinContent(1) if _h_sigyield else 0.0 + _w_precut = (_sigyield_total / _ngen_total) if _ngen_total > 0 else 0.0 + + for i in range(nbins): + strls = [] + for j in range(nbins): + if j != i: + strls.append(None) + else: + count = h_sig_cts.GetBinContent(j + 1) + if count > 0: + kappa = sig_norm_ls[j] / count + else: + # Fall back to pre-cut weight estimate per AN: + # w = Lumi x XSection / Generated_MC_Events_Pre-Cuts + kappa = _w_precut + strls.append(kappa) + new_lines += turn_info_to_line( + dc_names[i], + "gmN " + pad(str(int(h_sig_cts.GetBinContent(i + 1))), 5), + strls, write_sig + ) + continue + + elif nuis.nuis_type == "special": + if nuis.extra_info[0] == "updn_pair": + if nuis.extra_info[1] == "up": + pair_found = False + for n2 in ns_ls: + if (n2.nuis_name == nuis.nuis_name and + n2.nuis_type == nuis.nuis_type and + n2.extra_info[1] == "dn"): + npair = n2 + pair_found = True + break + if not pair_found: + raise Exception("updn_pair UP has no corresponding DOWN") + + strls = [str(n2.nuis_val[i]) + "/" + str(nuis.nuis_val[i]) + for i in range(nbins)] + if nuis.corr is True: + new_lines += turn_info_to_line(make_nuis_dcnm(nuis, siggrp), "lnN", strls, write_sig) + else: + new_lines += turn_info_to_nlines(make_nuis_dcnm(nuis, siggrp), "lnN", strls, write_sig) + elif nuis.extra_info[1] != "dn": + raise Exception("Bad extra_info field, use up or dn") + + if nuis.extra_info[0] == "anti-lnN": + if nuis.corr is not True: + raise Exception("Anti-correlated lnN does not support un-correlated bins") + dc_name = make_nuis_dcnm(nuis, siggrp) + strls = [str(nuis.nuis_val[i]) + "/" + str(1 / nuis.nuis_val[i]) + for i in range(nbins)] + new_lines += turn_info_to_line(dc_name, "lnN", strls, write_sig) + + else: + print("Warning: nuisance", nuis.nuis_name, "has not been interpreted as a datacard line") + if write_sig: + print(" Generated when evaluating signal") + else: + print(" Generated when evaluating background") + continue + + new_lines += "\n" + return new_lines + + +# --------------------------------------------------------------------------- +# Main entry point +# --------------------------------------------------------------------------- + +def make_datacard(f, nuis_ls, nuis_bkg_ls, siggrp, sig_id, debug_mode=False): + """Write a combine .txt datacard to disk for one signal hypothesis.""" + sig_name = "sig" + year_tag + sig_id + if debug_mode: + print("\nSearching for signal named", sig_name) + + template = ( + "# sample id in ROOT file " + sig_id + "\n" + "# filename = " + siggrp.fn + "\n" + "# total sig rate = FIXME, not implemented" + ) + + template = add_ijkmax(template=template, nuis_ls=nuis_ls, nuis_bkg_ls=nuis_bkg_ls, siggrp=siggrp) + template += return_newline() + + template = add_observations(template=template, f=f, siggrp=siggrp, sig_id=sig_id) + template += return_newline() + + sig_norm_ls = [] + template, sig_norm_ls = add_central_vals(template=template, f=f, sig_norm_ls=sig_norm_ls, + siggrp=siggrp, sig_id=sig_id) + template += return_newline() + + # Signal nuisances + template += return_lnN_corr(f=f, ns_ls=nuis_ls, siggrp=siggrp, write_sig=True) + template += return_lnN_uncorr(f=f, ns_ls=nuis_ls, siggrp=siggrp, write_sig=True) + template += return_shape_lines(f=f, ns_ls=nuis_ls, siggrp=siggrp, sig_id=sig_id, write_sig=True) + template += return_special_lines(f=f, ns_ls=nuis_ls, sig_norm_ls=sig_norm_ls, + siggrp=siggrp, sig_id=sig_id, write_sig=True) + + # Background nuisances + template += return_lnN_corr(f=f, ns_ls=nuis_bkg_ls, siggrp=siggrp, write_sig=False) + template += return_lnN_uncorr(f=f, ns_ls=nuis_bkg_ls, siggrp=siggrp, write_sig=False) + template += return_special_lines(f=f, ns_ls=nuis_bkg_ls, sig_norm_ls=sig_norm_ls, + siggrp=siggrp, sig_id=sig_id, write_sig=False) + + template = return_no_dashes(template) + + if debug_mode: + print("Printing DATACARD:\n") + print(template) + + dc_dict = config.datacard_out_loc + out_dc_fn = (dc_dict[sig_type]["out_folder"] + dc_dict["out_fn_prefix"] + + siggrp.trig_type + "_" + siggrp.return_nuis_key()) + if config.debug_settings["scale_bkg_fake"]: + out_dc_fn += "_fakebkg" + out_dc_fn += dc_dict["out_fn_suffix"] + + if debug_mode: + print("Writing datacard to:", out_dc_fn) + with open(out_dc_fn, "w") as datacard: + datacard.write(template) diff --git a/MFVNeutralino/test/ForLimits/makeLimitsInputROOT.py b/MFVNeutralino/test/ForLimits/makeLimitsInputROOT.py new file mode 100644 index 000000000..db67a7afc --- /dev/null +++ b/MFVNeutralino/test/ForLimits/makeLimitsInputROOT.py @@ -0,0 +1,394 @@ +import argparse +import os +import sys +from glob import glob + +import ROOT +import numpy as np + +from JMTucker.Tools.ROOTTools import to_TH1D, move_overflow_into_last_bin + +import script_configs as config +import sig_and_bkg_configs as sb_conf +import getNuisanceFromSig as getns +import makeDatacard as mkdat +import nuisance_configs_and_functions as nsfc +import helper_PyStorage_objects as sth +import helper_ROOT_functions as ROOThelper +from makeDatacard import make_nuis_dcnm as mk_dcnm + + +# --------------------------------------------------------------------------- +# CLI arguments -- override limits_config.yaml at runtime +# --------------------------------------------------------------------------- +def _parse_args(): + p = argparse.ArgumentParser(description="Build limits input ROOT file and datacards") + p.add_argument("--year", default=None, help="Year to process: 20161/20162/2017/2018/all") + p.add_argument("--channel", default=None, choices=["lep", "bjet"], help="Trigger channel") + p.add_argument("--debug", action="store_true", default=None, help="Verbose output") + p.add_argument("--no-debug", dest="debug", action="store_false") + return p.parse_args() + + +def _apply_args(args): + """Push CLI overrides back into config dicts so the rest of the code is unchanged.""" + if args.year and args.year != "all": + config.datacard["year"] = args.year + if args.channel: + config.sig["type"] = args.channel + if args.debug is not None: + config.debug_settings["enabled"] = args.debug + + +# --------------------------------------------------------------------------- +# Module-level globals (set per-year run inside run_one_year) +# --------------------------------------------------------------------------- +debug = None +sig_type = None +year = None +year_id = None +year_tag = None +nbins = None +bins = None +print_mapping = True + + +def _init_globals(yr): + global debug, sig_type, year, year_id, year_tag, nbins, bins + debug = config.debug_settings["enabled"] + sig_type = config.sig["type"] + year = yr + year_id = config.datacard["year_key"].index(yr) + year_tag = config.datacard["year_to_tag"][yr] + nbins = config.datacard["nbins"] + bins = np.array(config.datacard["bins"]) + mkdat._init_for_year(yr) + nsfc._init_for_year(yr) + + +# --------------------------------------------------------------------------- +# Config sanity check +# --------------------------------------------------------------------------- +def check_config(yr): + if yr not in config.datacard["year_key"]: + raise ValueError("year %s not in year_key" % yr) + if len(config.datacard["bins"]) != config.datacard["nbins"] + 1: + raise ValueError("nbins must equal len(bins)-1") + if config.sig["type"] not in ("lep", "bjet"): + raise ValueError("channel must be 'lep' or 'bjet'") + if len(config.obs[yr]) != config.datacard["nbins"]: + raise ValueError("len(observations[year]) must equal nbins") + if config.debug_settings["scale_bkg_fake"]: + print("WARNING: scale_bkg_fake is True -- background will be artificially scaled") + + +# --------------------------------------------------------------------------- +# Background +# --------------------------------------------------------------------------- +def make_bkg(f): + bkg_fn = os.path.join( + config.bkg[sig_type]["folder"], + config.bkg[sig_type]["fn"].format(year) + ) + if debug: + print("Opening bkg file:", bkg_fn) + bkg_f = ROOT.TFile.Open(bkg_fn) + + new_bkg_hs = [] + + h_int_lumi = ROOT.TH1D("h_int_lumi_%s" % year, "", 1, 0, 1) + h_int_lumi.SetBinContent(1, sb_conf.template_norms["lumi"][sig_type][year_id]) + if debug: + print("Lumi:", sb_conf.template_norms["lumi"][sig_type][year_id]) + new_bkg_hs.append(h_int_lumi) + + h_observed = ROOT.TH1D("h_observed_%s" % year, "", nbins, bins) + for i, v in enumerate(config.obs[year]): + h_observed.SetBinContent(i+1, v) + if debug: + print(" observed bin %d = %d" % (i, v)) + new_bkg_hs.append(h_observed) + + # Full Run 2 MC background -- shape normalized to per-year n2v from sig_and_bkg_configs.py + h_bkg_sumdbv = to_TH1D(bkg_f.Get("h_c1v_sumdbv_w_errorbars"), "h_bkg_sumdbv_%s" % year) + scale_num = sb_conf.template_norms["n2v"][sig_type][year_id] + scale_den = h_bkg_sumdbv.Integral() + h_bkg_sumdbv.Scale(scale_num / scale_den) + if debug: + print("Bkg Sum_dBV rescaled %.3g -> %.3g" % (scale_den, scale_num)) + + if config.debug_settings["scale_bkg_fake"]: + h_bkg_sumdbv.Scale(config.debug_settings["bkg_fake_sf"]) + print("WARNING: scaled bkg by fake factor", config.debug_settings["bkg_fake_sf"]) + + h_bkg_sumdbv_rebin = h_bkg_sumdbv.Rebin(nbins, "bkg" + year_tag, bins) + move_overflow_into_last_bin(h_bkg_sumdbv_rebin) + new_bkg_hs.append(h_bkg_sumdbv_rebin) + + f.cd() + for h in new_bkg_hs: + h.SetTitle("") + h.Write() + if debug: + print(" wrote:", h.GetName()) + + print("BACKGROUND processing complete") + + +# --------------------------------------------------------------------------- +# Signal +# --------------------------------------------------------------------------- +def make_sigs(f, sig_nums, sig_scales): + sig_fn_syntax = config.sig[sig_type]["folder"] + config.sig[sig_type]["file_key"] + candidate_files = sorted(glob(sig_fn_syntax)) + sig_id = 0 + + for cand in candidate_files: + cand_id = os.path.basename(cand) + if cand_id.startswith("minitree"): + cand_id = os.path.basename(os.path.dirname(cand)) + if cand_id.find(year) == -1: + continue + generated_siggrp = False + try: + siginfo = sth.SignalROOTInfo(cand, root_exists=True, nbins=nbins) + in_cluster = False + for sc, members in config.sig["sig_grps"].items(): + if siginfo.proc in members: + in_cluster = True + if siginfo.proc == members[0]: + sig_str_ls = [cand.replace(siginfo.proc, p) for p in members] + print("Found cluster", sc, ":", sig_str_ls) + siggrp = sth.SigRInf_Grp(sig_str_ls, root_exists=True, nbins=nbins, overwrite_proc=sc) + generated_siggrp = True + break + if not in_cluster: + siggrp = sth.SigRInf_Grp([cand], root_exists=True, nbins=nbins, overwrite_proc=None) + generated_siggrp = True + except ValueError as e: + if str(e) == "No Samples.py entry": + print("Signal not in Samples.py, skipping:", os.path.basename(cand)) + else: + raise + if not generated_siggrp: + continue + if siggrp.trig_type != sig_type: + continue + if debug: + print("Queued signal #%d: %s (%s)" % (sig_id, os.path.basename(cand), siggrp.trig_type)) + sig_nums[siggrp] = str(sig_id) + sig_id += 1 + siggrp.print_diagnostics() + + if print_mapping: + print("\nSignal mapping:") + for k, v in sig_nums.items(): + print(" %s : %s" % (k.fn, v)) + + n = lambda sid, x: "h_sig%s_%s_%s" % (sid, x, year) + + for siggrp, sig_id in sig_nums.items(): + if debug: + print("\nProcessing cluster:", siggrp.fn) + + sumw = 0.0 + ngen = 0 + sum_sigyield = 0.0 + scales = [] + + ROOT.TH1.AddDirectory(1) + h_sumdbv_tot = ROOT.TH1D(n(sig_id, "sumdbv"), "", 800, 0, 8) + h_sumdbv_nw_tot = ROOT.TH1D(n(sig_id, "sumdbv") + "_nw", "", 800, 0, 8) + + for sig in siggrp.sig_ls: + if debug: + print(" sub-sig:", sig.fn) + t = ROOT.TChain("mfvMiniTree/t") + t.Add(sig.full_fn) + + this_sumw = sig.get_sumw() + this_ngen = sig.get_ngen() + this_xsec = sig.get_xsec() + this_sigyield = this_xsec * sb_conf.template_norms["lumi"][sig.trig_type][year_id] + this_scale = this_sigyield / this_sumw + scales.append(this_scale) + if debug: + print(" xsec=%.3g sumw=%.3g yield=%.3g scale=%.3g" % ( + this_xsec, this_sumw, this_sigyield, this_scale)) + + ROOT.TH1.AddDirectory(1) + h_child = ROOT.TH1D(n(sig_id, "child_sumdbv"), "", 800, 0, 8) + h_child_nw = ROOT.TH1D(n(sig_id, "child_sumdbv") + "_nw", "", 800, 0, 8) + + t.Draw("sumdbv>>%s" % n(sig_id, "child_sumdbv"), "weight*(nvtx>=2)") + t.Draw("sumdbv>>%s" % (n(sig_id, "child_sumdbv") + "_nw"), "1.0*(nvtx>=2)") + + ROOT.TH1.AddDirectory(0) + h_child.SetDirectory(0) + h_child_nw.SetDirectory(0) + h_child.Scale(this_scale) + + h_sumdbv_tot.Add(h_child) + h_sumdbv_nw_tot.Add(h_child_nw) + + sumw += this_sumw + ngen += this_ngen + sum_sigyield += this_sigyield + t.Reset() + h_child = ROOT.TH1D() + h_child_nw = ROOT.TH1D() + + sig_scales[siggrp] = scales + + h_sig = h_sumdbv_tot.Rebin(nbins, "sig" + year_tag + sig_id, bins) + move_overflow_into_last_bin(h_sig) + + h_sig_nw = h_sumdbv_nw_tot.Rebin(nbins, n(sig_id, "ngen_perbin"), bins) + move_overflow_into_last_bin(h_sig_nw) + + h_sumw_hist = ROOT.TH1D(n(sig_id, "sumw"), "", 1, 0, 1) + h_ngen_hist = ROOT.TH1D(n(sig_id, "ngen_total"), "", 1, 0, 1) + h_sigyield_hist = ROOT.TH1D(n(sig_id, "sigyield_total"), "", 1, 0, 1) + h_sumw_hist.SetBinContent(1, sumw) + h_ngen_hist.SetBinContent(1, ngen) + h_sigyield_hist.SetBinContent(1, sum_sigyield) + + f.cd() + for h in [h_sig, h_sig_nw, h_sumw_hist, h_ngen_hist, h_sigyield_hist]: + h.SetTitle(siggrp.proc + "_" + year) + h.Write() + if debug: + print(" wrote:", h.GetName()) + + print("SIGNAL processing complete") + + +# --------------------------------------------------------------------------- +# Shape systematics (up/down histograms) +# --------------------------------------------------------------------------- +def write_sig_updown(f, nuis_ls, siggrp, sig_scales, sig_id): + scales = sig_scales[siggrp] + if debug: + print("\nShape systematics for:", siggrp.fn, "scales:", scales) + + for nuis in nuis_ls: + if not nuis.make_updn: + continue + + nname = mk_dcnm(nuis, siggrp) + nname_dict = mk_dcnm(nuis, siggrp, force_no_CADItag=True) + + hname_up = "sig" + year_tag + sig_id + "_" + nname + "Up" + hname_dn = "sig" + year_tag + sig_id + "_" + nname + "Down" + + ROOT.TH1.AddDirectory(1) + h_up_tot = ROOT.TH1D(hname_up + "_orig", "", 800, 0, 8) + h_dn_tot = ROOT.TH1D(hname_dn + "_orig", "", 800, 0, 8) + + for i, sig in enumerate(siggrp.sig_ls): + t = ROOT.TChain("mfvMiniTree/t") + t.Add(sig.full_fn) + + ROOT.TH1.AddDirectory(1) + h_up = ROOT.TH1D(hname_up + "_child_orig", "", 800, 0, 8) + h_dn = ROOT.TH1D(hname_dn + "_child_orig", "", 800, 0, 8) + + wt_up, wt_dn = sb_conf.updn_wt_dict[nname_dict] + t.Draw("sumdbv>>%s" % (hname_up + "_child_orig"), + "weight*(nvtx>=2)".replace("weight", wt_up)) + t.Draw("sumdbv>>%s" % (hname_dn + "_child_orig"), + "weight*(nvtx>=2)".replace("weight", wt_dn)) + + h_up.Scale(scales[i]) + h_dn.Scale(scales[i]) + h_up_tot.Add(h_up) + h_dn_tot.Add(h_dn) + + t.Reset() + h_up = ROOT.TH1D() + h_dn = ROOT.TH1D() + + ROOT.TH1.AddDirectory(0) + h_sig_up = h_up_tot.Rebin(nbins, hname_up, bins) + h_sig_dn = h_dn_tot.Rebin(nbins, hname_dn, bins) + + for h in [h_sig_up, h_sig_dn]: + move_overflow_into_last_bin(h) + h.SetDirectory(0) + + f.cd() + for h in [h_sig_up, h_sig_dn]: + h.SetTitle(siggrp.proc + "_" + year) + h.Write() + if debug: + print(" wrote:", h.GetName()) + + h_up_tot = ROOT.TH1D() + h_dn_tot = ROOT.TH1D() + h_sig_up = ROOT.TH1D() + h_sig_dn = ROOT.TH1D() + + +# --------------------------------------------------------------------------- +# Main pipeline for one year +# --------------------------------------------------------------------------- +def run_one_year(yr): + _init_globals(yr) + check_config(yr) + + if debug: + print("\n=== Year: %s Channel: %s ===" % (yr, sig_type)) + + out_fn = config.output[sig_type]["out_folder"] + config.output["out_fn"] + out_fn += "_%s_%s" % (sig_type, yr) + if config.debug_settings["scale_bkg_fake"]: + out_fn += "_fakebkg" + out_fn += ".root" + + if debug: + print("Output ROOT file:", out_fn) + + ROOT.TH1.AddDirectory(0) + f = ROOT.TFile(out_fn, "recreate") + + if debug: + print("\n--- Background ---") + make_bkg(f) + + sig_nums = {} + sig_scales = {} + + if debug: + print("\n--- Signal ---") + make_sigs(f, sig_nums, sig_scales) + + if debug: + print("\n--- Background nuisances ---") + nuis_bkg_ls = [] + getns.get_nuis_frombkg(nuis_bkg_ls, debug_mode=debug) + + if debug: + print("\n--- Signal nuisances + datacards ---") + for siggrp, s_id in sig_nums.items(): + nuis_ls = [] + getns.get_nuis_fromsig(siggrp, nuis_ls, debug_mode=debug) + write_sig_updown(f=f, nuis_ls=nuis_ls, siggrp=siggrp, + sig_scales=sig_scales, sig_id=s_id) + mkdat.make_datacard(f=f, nuis_ls=nuis_ls, nuis_bkg_ls=nuis_bkg_ls, + siggrp=siggrp, sig_id=s_id, debug_mode=debug) + + f.Close() + print("Done: %s year=%s" % (sig_type, yr)) + + +# --------------------------------------------------------------------------- +# Entry point +# --------------------------------------------------------------------------- +if __name__ == "__main__": + args = _parse_args() + _apply_args(args) + + years_to_run = config.datacard["year_key"] if (args.year == "all") else [config.datacard["year"]] + + for yr in years_to_run: + run_one_year(yr) diff --git a/MFVNeutralino/test/ForLimits/nuisance_configs.py b/MFVNeutralino/test/ForLimits/nuisance_configs.py new file mode 100644 index 000000000..dc1e28bc9 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/nuisance_configs.py @@ -0,0 +1,30 @@ +""" +Nuisance naming and pickle-path configuration. +Paths are resolved via script_configs -> limits_config.yaml (see nuisance_tables section). +""" +import script_configs as config + +_ntpaths = config.nuisance_table_paths + +nuis_names = { + "CMS-CADI-tag": "CMS_EXO24035_", + "Run2-key": "13TeV", +} + +pickle_prefixes = { + "vtx_reco_TM": _ntpaths["vtx_reco_TM"], + "disp_trig_uncerts": _ntpaths["disp_trig_uncerts"], +} + +pickle_triple_prefixes = { + "tk_reco_eff": { + "base": _ntpaths["tk_reco_eff"]["base"], + "up": _ntpaths["tk_reco_eff"]["up_prefix"], + "dn": _ntpaths["tk_reco_eff"]["dn_prefix"], + }, +} + +year_remaps = { + "vtx_reco_TM": {"20161": "20161-2", "20162": "20161-2", "2017": "2017-8", "2018": "2017-8"}, + "disp_trig_uncerts": {"20161": "2016", "20162": "2016APV", "2017": "2017", "2018": "2018"}, +} diff --git a/MFVNeutralino/test/ForLimits/nuisance_configs_and_functions.py b/MFVNeutralino/test/ForLimits/nuisance_configs_and_functions.py new file mode 100644 index 000000000..1ea029c33 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/nuisance_configs_and_functions.py @@ -0,0 +1,205 @@ +import numpy as np + +import helper_PyStorage_objects as sth +import nuisance_configs as ns_conf +import sig_and_bkg_configs as sb_conf +import script_configs as config + + +# Module-level globals -- updated per year via _init_for_year() +year = config.datacard["year"] +year_id = config.datacard["year_key"].index(year) +sig_type = config.sig["type"] +nbins = config.datacard["nbins"] + + +def _init_for_year(yr): + global year, year_id, sig_type, nbins + year = yr + year_id = config.datacard["year_key"].index(yr) + sig_type = config.sig["type"] + nbins = config.datacard["nbins"] + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + +def interp_pickle_triple(nn): + """Given nuisance name (e.g. 'tk_reco_eff'), return (up_path, dn_path).""" + loc_dict = ns_conf.pickle_triple_prefixes[nn] + base = loc_dict["base"] + return base + loc_dict["up"], base + loc_dict["dn"] + + +def make_anticorr_bkg(val, dp=4, in_is_b1=True): + """Anti-correlate bin 1 vs. bins 2+3 for a background nuisance. + + val: 1+x (e.g. 1.1 for 10%). in_is_b1: whether val is the bin-1 direction. + """ + out_arr = val * np.ones(nbins) if in_is_b1 else (1.0 / val) * np.ones(nbins) + out_arr[1:] = 1.0 / out_arr[1:] + if dp is not None: + out_arr = np.round(out_arr, decimals=int(dp)) + return out_arr + + +# --------------------------------------------------------------------------- +# Signal nuisances +# --------------------------------------------------------------------------- + +def get_mc_stat(nuis_name, siginfo, debug_mode=False): + nuis = sth.NuisanceInfo(nuis_name, 1.2, make_updn=False, sep_yrs=True, corr=False, + nuis_type="GammaN", nbins=siginfo.nbins, ana_spec=True) + return [nuis] + + +def get_reco_effi(nuis_name, siginfo, debug_mode=False): + """Track reconstruction efficiency uncertainty. + + Currently only VH has a dedicated table; other processes fall back to 1.0 + (which is then filtered out by replace_all_ones in getNuisanceFromSig). + """ + pickle_locs = interp_pickle_triple(nuis_name) + + # TODO: replace "VH" with siginfo.proc once tables exist for all processes + up_ntab = sth.NuisanceTable(proc="VH", pickle_loc=pickle_locs[0]) + up_arr = up_ntab.get_point_from_fn(siginfo.fn.replace(siginfo.proc, "VH")) + if up_arr is None: + up_arr = [1.0] * siginfo.nbins + + dn_ntab = sth.NuisanceTable(proc="VH", pickle_loc=pickle_locs[1]) + dn_arr = dn_ntab.get_point_from_fn(siginfo.fn.replace(siginfo.proc, "VH")) + if dn_arr is None: + dn_arr = [1.0] * siginfo.nbins + + if debug_mode: + print("Identified trk-reco fractional uncertainties:", up_arr, dn_arr) + + up_nuis = sth.NuisanceInfo(nuis_name, up_arr, make_updn=False, sep_yrs=False, corr=True, + nuis_type="special", nbins=siginfo.nbins, ana_spec=True, + extra_info=["updn_pair", "up"]) + dn_nuis = sth.NuisanceInfo(nuis_name, dn_arr, make_updn=False, sep_yrs=False, corr=True, + nuis_type="special", nbins=siginfo.nbins, ana_spec=True, + extra_info=["updn_pair", "dn"]) + return [up_nuis, dn_nuis] + + +def get_vtx_reco_TM(nuis_name, siginfo, debug_mode=False): + ntab = sth.NuisanceTable(proc=siginfo.proc, pickle_loc=ns_conf.pickle_prefixes[nuis_name], + trig_for_pickle=siginfo.trig_type) + frac_unc = ntab.get_point_from_fn(siginfo, overrides={"yr": ns_conf.year_remaps[nuis_name][siginfo.year]}) + + if debug_mode: + print("Identified TM fractional uncertainty:", frac_unc) + if frac_unc is None: + print("Warning: vtx_reco_TM value not found. Writing fake value.") + frac_unc = 1.0 + frac_unc = np.round(frac_unc, 7) + + return [sth.NuisanceInfo(nuis_name, 1 + frac_unc, make_updn=False, sep_yrs=False, corr=True, + nbins=siginfo.nbins, ana_spec=True)] + + +def get_pileup(nuis_name, siginfo, debug_mode=False): + if siginfo.trig_type == "lep": + nuis = sth.NuisanceInfo(nuis_name, [1.03, 1.04, 1.06], make_updn=False, + sep_yrs=False, corr=True, nbins=siginfo.nbins) + elif siginfo.trig_type == "bjet": + nuis = sth.NuisanceInfo(nuis_name, 1.03, make_updn=False, + sep_yrs=False, corr=True, nbins=siginfo.nbins) + else: + raise Exception("Could not add pileup") + return [nuis] + + +def get_int_lumi(nuis_name, siginfo, debug_mode=False): + lumi_components = sb_conf.lumi_lit_corrs + year_tosearch = "2016" if year in ("20161", "20162") else year + + out_ls = [] + for comp_name in sorted(lumi_components): + val = lumi_components[comp_name][year_tosearch] + if val is None: + continue + nuis = sth.NuisanceInfo(comp_name, val, make_updn=False, sep_yrs=False, + corr=True, nbins=siginfo.nbins, add_era_tags=False) + out_ls.append(nuis) + return out_ls + + +def get_lep_effi(nuis_name, siginfo, debug_mode=False): + """Lepton reconstruction efficiency (electron ID only; muon not yet implemented).""" + nuis_e_id = sth.NuisanceInfo(nuis_name + "e_id", 1 + 0.01, make_updn=False, + sep_yrs=False, corr=True, nbins=siginfo.nbins, ana_spec=False) + return [nuis_e_id] + + +def get_trig_JESR_btag(nuis_name, siginfo, debug_mode=False): + ntab = sth.NuisanceTable(proc=siginfo.proc, pickle_loc=ns_conf.pickle_prefixes[nuis_name], + trig_for_pickle=siginfo.trig_type) + frac_unc = ntab.get_point_from_fn(siginfo, overrides={"yr": ns_conf.year_remaps[nuis_name][siginfo.year]}) + + if debug_mode: + print("Identified b-tag fractional uncertainty:", frac_unc) + if frac_unc is None: + print("Warning: trig_JESR_btag value not found. Writing arbitrary value.") + return [sth.NuisanceInfo(nuis_name + "_fake", 1 + 0.1, make_updn=False, + sep_yrs=False, corr=True, nbins=siginfo.nbins, ana_spec=True)] + return [sth.NuisanceInfo(nuis_name, 1 + frac_unc, make_updn=False, + sep_yrs=False, corr=True, nbins=siginfo.nbins, ana_spec=True)] + + +def get_calo_inef(nuis_name, siginfo, debug_mode=False): + if ("2016" in siginfo.year and siginfo.return_mass_as_int() <= 300 + and siginfo.return_lifetime_in_unit(unit="mm") >= 10): + frac_unc = 0.05 + else: + frac_unc = 0.01 + return [sth.NuisanceInfo(nuis_name, 1 + frac_unc, make_updn=False, + sep_yrs=True, corr=True, nbins=siginfo.nbins, ana_spec=True)] + + +# --------------------------------------------------------------------------- +# Background nuisances +# --------------------------------------------------------------------------- + +def get_bkg_jet_ang(nuis_name, debug_mode=False): + return [sth.NuisanceInfo(nuis_name, make_anticorr_bkg(1.06), make_updn=False, + sep_yrs=False, corr=True, nbins=nbins, ana_spec=True)] + + +def get_bkg_vtx_arbi(nuis_name, debug_mode=False): + return [sth.NuisanceInfo(nuis_name, make_anticorr_bkg(1.37), make_updn=False, + sep_yrs=False, corr=True, nbins=nbins, ana_spec=True)] + + +def get_bkg_vtx_refi(nuis_name, debug_mode=False): + return [sth.NuisanceInfo(nuis_name, make_anticorr_bkg(1.1), make_updn=False, + sep_yrs=False, corr=True, nbins=nbins, ana_spec=True)] + + +def get_bkg_pileup(nuis_name, debug_mode=False): + return [sth.NuisanceInfo(nuis_name, 1.0001, make_updn=False, + sep_yrs=False, corr=True, nbins=nbins)] + + +def get_bkg_sig_cont(nuis_name, debug_mode=False): + up_nuis = sth.NuisanceInfo(nuis_name, 1.05, make_updn=False, sep_yrs=False, corr=True, + nuis_type="special", nbins=nbins, ana_spec=True, + extra_info=["updn_pair", "up"]) + dn_nuis = sth.NuisanceInfo(nuis_name, 1.00, make_updn=False, sep_yrs=False, corr=True, + nuis_type="special", nbins=nbins, ana_spec=True, + extra_info=["updn_pair", "dn"]) + return [up_nuis, dn_nuis] + + +def get_bkg_bkg_norm(nuis_name, debug_mode=False): + return [sth.NuisanceInfo(nuis_name, 1.15, make_updn=False, + sep_yrs=False, corr=True, nbins=nbins, ana_spec=True)] + + +def get_bkg_n2v_unc(nuis_name, debug_mode=False): + frac_unc = sb_conf.n2v_uncs[sig_type][year_id] / sb_conf.template_norms["n2v"][sig_type][year_id] + return [sth.NuisanceInfo(nuis_name, 1 + frac_unc, make_updn=False, + sep_yrs=True, corr=True, nbins=nbins, ana_spec=True)] diff --git a/MFVNeutralino/test/ForLimits/plotLimits.py b/MFVNeutralino/test/ForLimits/plotLimits.py new file mode 100644 index 000000000..45c142033 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/plotLimits.py @@ -0,0 +1,429 @@ +#!/usr/bin/env python3 +""" +Plot 95% CL upper limits on signal strength r = sigma/sigma_theory. + +Reads CombineOutput//higgsCombine.AsymptoticLimits.mH120.root +for all available hypotheses and produces per-process plots. + +Output (in LimitPlots/): + _1D.pdf -- ctau [mm] vs r upper limit, one curve per mass + _2D.pdf -- ctau vs mass 2D color map + r=1 exclusion contour + +HepData reference (ins1861146, old high-HT displaced vertex analysis): + Only shown for SUSY signals. Load from hepdata_ins1861146.json if present. + Template: {"mfv_neu": {"ctau_mm": [c1,...], "mass_gev": [m1,...], + "obs": [[r_c1m1, r_c1m2,...], [r_c2m1,...],...] }} + where obs[i][j] = observed limit at ctau_mm[i], mass_gev[j]. + +Usage + python3 plotLimits.py [--subset VH,mfv_neu] [--out-dir LimitPlots] +""" +import os +import sys +import json +import argparse +import numpy as np + +import ROOT +ROOT.gROOT.SetBatch(True) +ROOT.gStyle.SetOptStat(0) + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import matplotlib.colors as mcolors + +try: + import mplhep as hep + hep.style.use("CMS") + _HAS_MPLHEP = True +except ImportError: + _HAS_MPLHEP = False + +try: + from scipy.interpolate import RectBivariateSpline + _HAS_SCIPY = True +except ImportError: + _HAS_SCIPY = False + print("Warning: scipy not available; 2D plots will show grid points only") + +HERE = os.path.dirname(os.path.abspath(__file__)) +COMBINE_OUT = os.path.join(HERE, "CombineOutput") +HEPDATA_JSON = os.path.join(HERE, "hepdata_ins1861146.json") +PLOT_DIR = os.path.join(HERE, "LimitPlots") + +HEPDATA_PROCS = {"mfv_neu", "mfv_stopdbardbar", "mfv_stopbbarbbar"} + +PROC_LABELS = { + "VH": r"WH + ZH (incl. gg), H$\to$SS$\to$dddd", + "ggZHToSSTobbbb": r"ggZH, H$\to$SS$\to$bbbb", + "ggHToSSTodddd": r"ggH, H$\to$SS$\to$dddd", + "ttHToLLPs_bbbb": r"ttH, H$\to$SS$\to$bbbb", + "ttHToLLPs_dddd": r"ttH, H$\to$SS$\to$dddd", + "mfv_neu": r"RPV SUSY, $\tilde{g}\to qqq$", + "mfv_stopdbardbar": r"RPV SUSY, $\tilde{t}\to\bar{d}\bar{d}$", + "mfv_stopbbarbbar": r"RPV SUSY, $\tilde{t}\to\bar{b}\bar{b}$", +} + +_COLORS = ["#e41a1c", "#377eb8", "#4daf4a", "#984ea3", "#ff7f00", "#a65628"] + +_RUN2_LUMI = r"137.9 fb$^{-1}$ (13 TeV)" + +# Per-process normalization footnote shown in the plot annotation box. +# H->SS processes: BR(H->SS)=1% is folded into xsec. +# ggH additionally has a mass-dependent gen-level filter efficiency in xsec. +_NORM_NOTE = r"$\sigma \times \mathcal{B}(H{\to}SS)=1\%$" +_NORM_NOTE_FILTER = r"$\sigma \times \mathcal{B}(H{\to}SS)=1\%$, gen. filter eff." +_PROC_NORM_NOTES = { + "VH": _NORM_NOTE, + "ggZHToSSTobbbb": _NORM_NOTE, + "ggHToSSTodddd": _NORM_NOTE_FILTER, + "ttHToLLPs_bbbb": _NORM_NOTE, + "ttHToLLPs_dddd": _NORM_NOTE, +} + + +def ctau_to_mm(s): + """'300um' -> 0.3, '1mm' -> 1.0, '10mm' -> 10.0""" + if s.endswith("um"): + return float(s[:-2]) * 1e-3 + if s.endswith("mm"): + return float(s[:-2]) + if s.endswith("cm"): + return float(s[:-2]) * 10.0 + return float(s) + + +def parse_sig_id(sig_id): + """'VH_tau1mm_M15' -> ('VH', '1mm', '15')""" + parts = sig_id.split("_tau") + if len(parts) != 2: + return None, None, None + proc = parts[0] + sub = parts[1].split("_", 1) + if len(sub) < 2: + return None, None, None + ctau = sub[0] + mass = sub[1].lstrip("M").lstrip("0") or "0" + return proc, ctau, mass + + +def read_limits(sig_id): + """Return {key: r_value} or None. Keys: obs, exp, dn1, up1, dn2, up2.""" + fn = os.path.join(COMBINE_OUT, sig_id, + "higgsCombine%s.AsymptoticLimits.mH120.root" % sig_id) + if not os.path.exists(fn): + return None + try: + f = ROOT.TFile.Open(fn) + if not f or f.IsZombie(): + return None + t = f.Get("limit") + if not t: + f.Close() + return None + quant_map = { + -1.0: "obs", + 0.025: "dn2", + 0.16: "dn1", + 0.5: "exp", + 0.84: "up1", + 0.975: "up2", + } + result = {} + for _ in t: + q = round(float(t.quantileExpected), 3) + for qref, key in quant_map.items(): + if abs(q - qref) < 0.01: + result[key] = float(t.limit) + f.Close() + return result if "exp" in result else None + except Exception as exc: + print("Could not read %s: %s" % (fn, exc)) + return None + + +def collect_all(): + """Return {proc -> {mass_str -> {ctau_mm_float -> {obs/exp/...}}}}""" + data = {} + if not os.path.isdir(COMBINE_OUT): + return data + for sig_id in sorted(os.listdir(COMBINE_OUT)): + if not os.path.isdir(os.path.join(COMBINE_OUT, sig_id)): + continue + proc, ctau_str, mass = parse_sig_id(sig_id) + if proc is None: + continue + ctau_mm = ctau_to_mm(ctau_str) + if ctau_mm <= 0: + continue # skip prompt (ctau=0) signals -- not meaningful for dv limits + lims = read_limits(sig_id) + if lims is None: + continue + data.setdefault(proc, {}).setdefault(mass, {})[ctau_mm] = lims + return data + + +def load_hepdata(): + if not os.path.exists(HEPDATA_JSON): + return {} + with open(HEPDATA_JSON) as fh: + return json.load(fh) + + +def plot_1d(proc, mass_data, out_dir, hepdata): + fig, ax = plt.subplots(figsize=(8, 6)) + + masses = sorted(mass_data.keys(), key=lambda m: int(m) if m.isdigit() else 0) + + for i, mass in enumerate(masses): + cdict = mass_data[mass] + ctaus = sorted(cdict.keys()) + if not ctaus: + continue + exp = [cdict[c]["exp"] for c in ctaus] + dn1 = [cdict[c]["dn1"] for c in ctaus] + up1 = [cdict[c]["up1"] for c in ctaus] + dn2 = [cdict[c].get("dn2", cdict[c]["dn1"]) for c in ctaus] + up2 = [cdict[c].get("up2", cdict[c]["up1"]) for c in ctaus] + + col = _COLORS[i % len(_COLORS)] + ax.fill_between(ctaus, dn2, up2, alpha=0.15, color=col, edgecolor="none") + ax.fill_between(ctaus, dn1, up1, alpha=0.35, color=col, edgecolor="none") + ax.plot(ctaus, exp, color=col, lw=2, ls="--", + label="m = %s GeV (exp)" % mass) + + if "obs" in cdict[ctaus[0]]: + obs = [cdict[c]["obs"] for c in ctaus] + ax.plot(ctaus, obs, color=col, lw=2, ls="-", + label="m = %s GeV (obs)" % mass) + + ax.axhline(1.0, color="black", lw=1.2, ls=":", zorder=3) + + ax.set_xscale("log") + ax.set_yscale("log") + ax.set_xlabel(r"$c\tau$ [mm]") + ax.set_ylabel("95% CL upper limit on $r$") + ax.legend(fontsize=9, ncol=2) + ax.grid(True, which="both", ls=":", alpha=0.4) + + if _HAS_MPLHEP: + hep.cms.label("Preliminary", data=False, ax=ax, fontsize=12, + rlabel=_RUN2_LUMI) + + _proc_label = PROC_LABELS.get(proc, proc) + _norm = _PROC_NORM_NOTES.get(proc, "") + _annot = _proc_label + ("\n" + _norm if _norm else "") + ax.text(0.0, -0.13, _annot, + transform=ax.transAxes, fontsize=10, ha="left", va="top", + clip_on=False) + + plt.tight_layout() + out_fn = os.path.join(out_dir, "%s_1D.pdf" % proc) + fig.savefig(out_fn, bbox_inches="tight") + plt.close(fig) + print(" 1D -> %s" % out_fn) + + +def _interp_grid(log_ctaus, mass_vals, grid, fine_lct, fine_mass): + if not _HAS_SCIPY: + return None + g = grid.copy() + if np.all(np.isnan(g)): + return None + # fill missing cells with a large cap so contour at r=1 can still be drawn + cap = max(200.0, float(np.nanmax(g)) * 2.0) + g[np.isnan(g) | (g <= 0)] = cap + sp = RectBivariateSpline(log_ctaus, mass_vals, np.log10(g), kx=1, ky=1) + return 10.0 ** sp(fine_lct, fine_mass) + + +def plot_2d(proc, mass_data, out_dir, hepdata): + masses = sorted(mass_data.keys(), key=lambda m: int(m) if m.isdigit() else 0) + ctaus_all = sorted(set(c for md in mass_data.values() for c in md.keys())) + + if len(masses) < 2 or len(ctaus_all) < 2: + print(" Skipping 2D for %s: need at least 2x2 grid" % proc) + return + + mass_vals = np.array([int(m) for m in masses], dtype=float) + ctau_vals = np.array(ctaus_all, dtype=float) + + grid_exp = np.full((len(ctau_vals), len(mass_vals)), np.nan) + grid_obs = np.full((len(ctau_vals), len(mass_vals)), np.nan) + + for j, mass in enumerate(masses): + for i, ctau in enumerate(ctau_vals): + if ctau in mass_data[mass]: + ent = mass_data[mass][ctau] + grid_exp[i, j] = ent["exp"] + if "obs" in ent: + grid_obs[i, j] = ent["obs"] + + log_ctaus = np.log10(ctau_vals) + # Extend 0.7 decades left of the first data point so the contour closes + log_ctau_lo = log_ctaus[0] - 0.7 + fine_lct = np.linspace(log_ctau_lo, log_ctaus[-1], 200) + fine_mass = np.linspace(mass_vals[0], mass_vals[-1], 200) + fine_ctau = 10.0 ** fine_lct + + fine_exp = _interp_grid(log_ctaus, mass_vals, grid_exp, fine_lct, fine_mass) + fine_obs = _interp_grid(log_ctaus, mass_vals, grid_obs, fine_lct, fine_mass) + + fig, ax = plt.subplots(figsize=(9, 6)) + + # Diverging log-scale colormap centred at r=1: blue=excluded, red=not excluded + vmin, vmax = 0.05, 200.0 + n_half = 30 + levels = np.concatenate([ + np.logspace(np.log10(vmin), 0, n_half + 1)[:-1], + np.logspace(0, np.log10(vmax), n_half + 1), + ]) + norm = mcolors.LogNorm(vmin=vmin, vmax=vmax) + cmap = plt.get_cmap("RdBu_r") # blue=low r (excluded), red=high r (not excluded) + + _nice_ticks = [t for t in [0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 50, 100, 200] + if vmin <= t <= vmax] + + if fine_exp is not None: + cf = ax.contourf(fine_ctau, fine_mass, fine_exp.T, + levels=levels, norm=norm, cmap=cmap, extend="both") + cbar = plt.colorbar(cf, ax=ax, pad=0.02) + cbar.set_label("95% CL upper limit on $r$") + cbar.set_ticks(_nice_ticks) + cbar.set_ticklabels(["%g" % t for t in _nice_ticks]) + cbar.ax.axhline(y=1.0, color="black", lw=1.0, ls="--") + + # expected: dashed; observed: solid (CMS convention) + ax.contour(fine_ctau, fine_mass, fine_exp.T, levels=[1.0], + colors=["black"], linewidths=[2.5], linestyles=["dashed"]) + ax.plot([], [], color="black", lw=2.5, ls="--", label="Exp. excl. ($r=1$)") + + if fine_obs is not None: + ax.contour(fine_ctau, fine_mass, fine_obs.T, levels=[1.0], + colors=["black"], linewidths=[2.5], linestyles=["solid"]) + ax.plot([], [], color="black", lw=2.5, ls="-", label="Obs. excl. ($r=1$)") + else: + xs, ys, cs = [], [], [] + for j, mass in enumerate(masses): + for i, ctau in enumerate(ctau_vals): + if not np.isnan(grid_exp[i, j]): + xs.append(ctau) + ys.append(mass_vals[j]) + cs.append(np.clip(grid_exp[i, j], vmin, vmax)) + if xs: + sc = ax.scatter(xs, ys, c=cs, s=300, zorder=5, + norm=norm, cmap=cmap, + edgecolors="black", linewidths=0.5) + cbar = plt.colorbar(sc, ax=ax, pad=0.02) + cbar.set_label("95% CL upper limit on $r$") + cbar.set_ticks(_nice_ticks) + cbar.set_ticklabels(["%g" % t for t in _nice_ticks]) + cbar.ax.axhline(y=1.0, color="black", lw=1.0, ls="--") + + for j, mass in enumerate(masses): + for i, ctau in enumerate(ctau_vals): + ax.scatter(ctau, mass_vals[j], color="black", s=20, zorder=6) + + if proc in HEPDATA_PROCS and proc in hepdata: + hd = hepdata[proc] + hd_ctaus = np.array(hd["ctau_mm"], dtype=float) + hd_masses = np.array(hd["mass_gev"], dtype=float) + hd_obs = np.array(hd["obs"], dtype=float) + if _HAS_SCIPY and len(hd_ctaus) >= 2 and len(hd_masses) >= 2: + hd_fine_lct = np.linspace(np.log10(hd_ctaus[0]), + np.log10(hd_ctaus[-1]), 200) + hd_fine_mass = np.linspace(hd_masses[0], hd_masses[-1], 200) + sp_hd = RectBivariateSpline(np.log10(hd_ctaus), hd_masses, + np.log10(hd_obs + 1e-9), kx=1, ky=1) + hd_fine_obs = 10.0 ** sp_hd(hd_fine_lct, hd_fine_mass) + ax.contour(10.0 ** hd_fine_lct, hd_fine_mass, hd_fine_obs.T, + levels=[1.0], colors=["gray"], + linewidths=[2.0], linestyles=["dotted"]) + ax.plot([], [], color="gray", lw=2.0, ls="dotted", + label="CMS-EXO-19-013 obs.") + + # y-axis: for SUSY+HepData extend to 2500 GeV so the old exclusion line + # is visible; otherwise auto-scale. + y_pad = max(3.0, (mass_vals[-1] - mass_vals[0]) * 0.08) + if proc in HEPDATA_PROCS and proc in hepdata: + y_top = max(mass_vals[-1] + y_pad, 2500.) + else: + y_top = mass_vals[-1] + y_pad + ax.set_ylim(mass_vals[0] - y_pad, y_top) + + ax.set_xscale("log") + # x-axis: extend left to show exclusion closure, right with small padding + ax.set_xlim(10.0 ** log_ctau_lo, 10.0 ** (log_ctaus[-1] + 0.25)) + ax.set_xlabel(r"$c\tau$ [mm]") + ax.set_ylabel("Mass [GeV]") + ax.legend(fontsize=11, loc="upper right", framealpha=0.92, edgecolor="0.7") + ax.grid(True, which="both", ls=":", alpha=0.3) + + if _HAS_MPLHEP: + hep.cms.label("Preliminary", data=False, ax=ax, fontsize=12, + rlabel=_RUN2_LUMI) + + _proc_label = PROC_LABELS.get(proc, proc) + _norm = _PROC_NORM_NOTES.get(proc, "") + _annot = _proc_label + ("\n" + _norm if _norm else "") + ax.text(0.0, -0.13, _annot, + transform=ax.transAxes, fontsize=10, ha="left", va="top", + clip_on=False) + + plt.tight_layout() + out_fn = os.path.join(out_dir, "%s_2D.pdf" % proc) + fig.savefig(out_fn, bbox_inches="tight") + plt.close(fig) + print(" 2D -> %s" % out_fn) + + +def main(): + global COMBINE_OUT + ap = argparse.ArgumentParser(description=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter) + ap.add_argument("--out-dir", default=PLOT_DIR) + ap.add_argument("--combine-out", default=COMBINE_OUT) + ap.add_argument("--subset", default=None, + help="Comma-separated process names to plot") + args = ap.parse_args() + + COMBINE_OUT = args.combine_out + + if not os.path.isdir(COMBINE_OUT): + print("CombineOutput not found: %s" % COMBINE_OUT) + sys.exit(1) + + os.makedirs(args.out_dir, exist_ok=True) + + subset = set(args.subset.split(",")) if args.subset else None + hepdata = load_hepdata() + if hepdata: + print("Loaded HepData reference for: %s" % ", ".join(sorted(hepdata))) + else: + print("No HepData reference found at %s (skipping overlay)" % HEPDATA_JSON) + + data = collect_all() + if not data: + print("No limit results found in %s" % COMBINE_OUT) + sys.exit(0) + + # ggZH is always grouped into VH; never plot it standalone + _skip_procs = {"ggZHToSSTodddd", "ggZHToSSTobbbb"} + + for proc in sorted(data): + if proc in _skip_procs: + continue + if subset and proc not in subset: + continue + n_masses = len(data[proc]) + n_pts = sum(len(v) for v in data[proc].values()) + print("\n%s: %d masses, %d total hypotheses" % (proc, n_masses, n_pts)) + plot_1d(proc, data[proc], args.out_dir, hepdata) + plot_2d(proc, data[proc], args.out_dir, hepdata) + + print("\nDone. Plots saved to %s" % args.out_dir) + + +if __name__ == "__main__": + main() diff --git a/MFVNeutralino/test/ForLimits/run_highM_combine_local.sh b/MFVNeutralino/test/ForLimits/run_highM_combine_local.sh new file mode 100644 index 000000000..62e1cc754 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/run_highM_combine_local.sh @@ -0,0 +1,58 @@ +#!/bin/bash +# Run all highM Combine jobs directly on an el9 node (bypasses Condor container issue). +# Usage: bash run_highM_combine_local.sh [nparallel] +# nparallel: number of simultaneous combine processes (default 8) +set -e + +CMSSW14=/uscms/home/gdecastr/nobackup/work/CMSSW_14_1_0_pre4/src +FORLIM=/uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648/src/JMTucker/MFVNeutralino/test/ForLimits +NPAR=${1:-8} + +source /cvmfs/cms.cern.ch/cmsset_default.sh +cd "$CMSSW14" +eval $(scramv1 runtime -sh) + +run_one() { + local sig_id="$1" + local work_dir="$FORLIM/CombineOutput/$sig_id" + local card_dir_bjet="$FORLIM/Datacards/bjet" + local out_fn="$work_dir/higgsCombine${sig_id}.AsymptoticLimits.mH120.root" + + if [ -f "$out_fn" ]; then + echo "SKIP (already done): $sig_id" + return 0 + fi + + mkdir -p "$work_dir" + cd "$work_dir" + + # Build combineCards argument from available bjet datacards for this sig_id + local card_args="" + for year in 20161 20162 2017 2018; do + local fn="$card_dir_bjet/Datacard_bjet_${sig_id}_${year}.txt" + if [ -f "$fn" ]; then + card_args="$card_args bjet_${year}=$fn" + fi + done + + echo "=== $sig_id ===" + combineCards.py $card_args > "combined_${sig_id}.txt" 2>/dev/null + combine -M AsymptoticLimits --name "$sig_id" "combined_${sig_id}.txt" -v 1 \ + > "$work_dir/combine.log" 2>&1 + echo "DONE: $sig_id" +} +export -f run_one +export FORLIM + +# Collect all highM hypotheses (M1200, M1600, M3000) for the three SUSY processes +SIG_IDS=$(ls "$FORLIM/Datacards/bjet/" \ + | grep -E "Datacard_bjet_(mfv_neu|mfv_stopbbarbbar|mfv_stopdbardbar)_tau.*_M(1[26][0-9][0-9]|3000)_[0-9]" \ + | sed 's/Datacard_bjet_//' \ + | sed 's/_[0-9]\{4,5\}\.txt//' \ + | sort -u) + +echo "Running $(echo "$SIG_IDS" | wc -l) hypotheses with $NPAR parallel jobs..." +echo "$SIG_IDS" | xargs -P "$NPAR" -I{} bash -c 'run_one "$@"' _ {} + +echo "" +echo "=== All highM Combine jobs complete. ===" diff --git a/MFVNeutralino/test/ForLimits/run_limits_bjet_allyears.sh b/MFVNeutralino/test/ForLimits/run_limits_bjet_allyears.sh new file mode 100755 index 000000000..42d9774c4 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/run_limits_bjet_allyears.sh @@ -0,0 +1,26 @@ +#!/bin/bash +# Run makeLimitsInputROOT.py for bjet channel, all 4 years. +# Run inside el7 apptainer with CMSSW_10_6_48 sourced. +# Usage: +# apptainer exec ... bash run_limits_bjet_allyears.sh +# or interactively inside the apptainer: +# bash run_limits_bjet_allyears.sh + +set -e + +CMSSW_SRC=/uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648/src +FORLIMITS=${CMSSW_SRC}/JMTucker/MFVNeutralino/test/ForLimits + +echo "=== Setting up CMSSW ===" +source /cvmfs/cms.cern.ch/cmsset_default.sh +cd ${CMSSW_SRC} +eval $(scramv1 runtime -sh) +echo "CMSSW_BASE=${CMSSW_BASE}" + +echo "" +echo "=== Running makeLimitsInputROOT.py (bjet, all years) ===" +cd ${FORLIMITS} +python makeLimitsInputROOT.py --year all --channel bjet + +echo "" +echo "=== Done! ===" diff --git a/MFVNeutralino/test/ForLimits/script_configs.py b/MFVNeutralino/test/ForLimits/script_configs.py new file mode 100644 index 000000000..f01c13724 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/script_configs.py @@ -0,0 +1,145 @@ +# Runtime paths and settings come from limits_config.yaml. +# Physics configuration (signal groupings, nuisance lists) lives here. +import os +import yaml + +# -------------------------------------------------------------------------- +# Load YAML config +# -------------------------------------------------------------------------- +_here = os.path.dirname(os.path.abspath(__file__)) +_yaml_path = os.path.join(_here, "limits_config.yaml") + +with open(_yaml_path) as _f: + _cfg = yaml.safe_load(_f) + +def _abs(rel): + """Resolve a path relative to the ForLimits directory.""" + return os.path.join(_here, rel) + +# -------------------------------------------------------------------------- +# Datacard settings +# -------------------------------------------------------------------------- +_year_to_tag = { + "20161": "2016preAPV", + "20162": "2016postAPV", + "2017": "2017", + "2018": "2018", +} + +datacard = { + "year": _cfg["year"], + "year_key": ["20161", "20162", "2017", "2018"], + "year_to_tag": _year_to_tag, + "bins": _cfg["bins"], + "nbins": _cfg["nbins"], +} + +# -------------------------------------------------------------------------- +# Signal configuration +# -------------------------------------------------------------------------- +# Signals that fire the lepton trigger. +# mfv_neu is NOT in the lepton channel -- it has no lepton in the hard scatter. +_lep_sigs = [ + "WminusHToSSTodddd", "WplusHToSSTodddd", "ZHToSSTodddd", + "ggZHToSSTobbbb", "ggZHToSSTodddd", + "ttHToLLPs_bbbb", "ttHToLLPs_dddd", +] + +# Signals that fire the displaced (b-jet) trigger +_bjet_sigs = [ + "ggHToSSTodddd", "mfv_neu", + "mfv_stopbbarbbar", "mfv_stopdbardbar", + "ttHToLLPs_bbbb", "ttHToLLPs_dddd", +] + +# Lepton-triggered signals that require a lepton reco efficiency nuisance. +# VH (ZH/WH/ggZH) and ttH have a lepton in the hard scatter; SUSY signals do not. +lep_reco_effi_sigs = frozenset([ + "WminusHToSSTodddd", "WplusHToSSTodddd", "ZHToSSTodddd", + "ggZHToSSTobbbb", "ggZHToSSTodddd", + "ttHToLLPs_bbbb", "ttHToLLPs_dddd", +]) + +sig = { + "type": _cfg["channel"], + "lep": _cfg["signal"]["lep"], + "bjet": _cfg["signal"]["bjet"], + "lep_sigs": _lep_sigs, + "bjet_sigs": _bjet_sigs, + # VH = ZH + WH+ + WH- summed (same lifetime/mass grid, different xsec) + "sig_grps": { + "VH": ["ZHToSSTodddd", "WminusHToSSTodddd", "WplusHToSSTodddd", "ggZHToSSTodddd"], + }, + # Nuisance aliases: use when a dedicated table doesn't exist for a process + "aliases": { + "bjet": { + "ttHToLLPs_bbbb": {"ggHToSSTodddd"}, + "ttHToLLPs_dddd": {"ggHToSSTodddd"}, + }, + "lep": { + "ttHToLLPs_bbbb": {"VH"}, + "ttHToLLPs_dddd": {"VH"}, + "ggZHToSSTobbbb": {"VH"}, + "ggZHToSSTodddd": {"VH"}, + "WminusHToSSTodddd": {"VH"}, + "WplusHToSSTodddd": {"VH"}, + "ZHToSSTodddd": {"VH"}, + }, + }, +} + +# -------------------------------------------------------------------------- +# Background configuration +# -------------------------------------------------------------------------- +bkg = { + "lep": _cfg["background"]["lep"], + "bjet": _cfg["background"]["bjet"], +} +# Rename YAML key "filename" -> "fn" to preserve the existing interface +bkg["lep"]["fn"] = bkg["lep"].pop("filename", bkg["lep"].get("fn", "")) +bkg["bjet"]["fn"] = bkg["bjet"].pop("filename", bkg["bjet"].get("fn", "")) + +# -------------------------------------------------------------------------- +# Output paths +# root_output : intermediate ROOT file with signal/bkg histograms +# datacard_out_loc : final combine .txt datacard files +# -------------------------------------------------------------------------- +output = { + "lep": {"out_folder": _cfg["root_output"]["lep"]["folder"]}, + "bjet": {"out_folder": _cfg["root_output"]["bjet"]["folder"]}, + "out_fn": _cfg["root_output"]["filename"], +} + +datacard_out_loc = { + "lep": {"out_folder": _cfg["datacard_output"]["lep"]["folder"]}, + "bjet": {"out_folder": _cfg["datacard_output"]["bjet"]["folder"]}, + "out_fn_prefix": _cfg["datacard_output"]["prefix"], + "out_fn_suffix": _cfg["datacard_output"]["suffix"], +} + +# -------------------------------------------------------------------------- +# Observed events (kept at 0 for blind analysis) +# -------------------------------------------------------------------------- +obs = {k: list(v) for k, v in _cfg["observations"].items()} + +# -------------------------------------------------------------------------- +# Nuisance table paths (absolute, resolved relative to ForLimits/) +# -------------------------------------------------------------------------- +nuisance_table_paths = { + "vtx_reco_TM": _abs(_cfg["nuisance_tables"]["vtx_reco_TM"]), + "disp_trig_uncerts": _abs(_cfg["nuisance_tables"]["disp_trig_uncerts"]), + "tk_reco_eff": { + "base": _abs(_cfg["nuisance_tables"]["tk_reco_eff"]["base"]), + "up_prefix": _cfg["nuisance_tables"]["tk_reco_eff"]["up_prefix"], + "dn_prefix": _cfg["nuisance_tables"]["tk_reco_eff"]["dn_prefix"], + }, +} + +# -------------------------------------------------------------------------- +# Debug settings +# -------------------------------------------------------------------------- +debug_settings = { + "enabled": _cfg.get("debug", True), + "scale_bkg_fake": False, # set True only for explicit testing; never in production + "bkg_fake_sf": 100, +} diff --git a/MFVNeutralino/test/ForLimits/sig_and_bkg_configs.py b/MFVNeutralino/test/ForLimits/sig_and_bkg_configs.py new file mode 100644 index 000000000..f80da93a2 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/sig_and_bkg_configs.py @@ -0,0 +1,59 @@ +import JMTucker.MFVNeutralino.AnalysisConstants as ac + + +template_norms = { + "n1v": { + "lep": [52.19, 77.35, 442.23, 694.77], + "bjet": [1004.1395, 434.13558, 187.79967, 276.98182], + }, + "n2v": { + "lep": [0.001, 0.012, 0.002, 0.034], # 0.001 (20161) is a placeholder -- update when lepton bkg estimate for 20161 is available + "bjet": [0.258, 0.062, 0.078, 0.122], + }, + "lumi": { + "lep": [ + ac.scaled_int_lumi_20161, + ac.scaled_int_lumi_20162, + ac.scaled_int_lumi_2017, + ac.scaled_int_lumi_2018], + "bjet": [ + ac.scaled_int_lumi_20161, + ac.scaled_int_lumi_20162, + ac.scaled_int_lumi_2017, + ac.scaled_int_lumi_2018], + }, + "old_lumis": [19664., 16978., 40610., 59683.], # Derived from AnalysisConstants.h. I feel like if these != new lumis, we need corrections. +} + + +# n2v_uncs: excluded from datacards until real uncertainties are measured. +# Replace the placeholder values below and uncomment to re-enable; +# also add "n2v_unc" back to nuis_bkg in getNuisanceFromSig.py. +# +# n2v_uncs = { +# "lep": [0.0001, 0.0001, 0.0001, 0.0001], +# "bjet": [0.0001, 0.0001, 0.0001, 0.0001], +# } +n2v_uncs = None # sentinel; code must not use this until real values are filled + + +lumi_lit_corrs = { + "lumi_13TeV_1516_l": {"2016": 1.0118, "2017": None, "2018": None}, + "lumi_13TeV_151617_l": {"2016": 1.0004, "2017": 1.0055, "2018": None}, + "lumi_13TeV_15161718_l": {"2016": 1.0035, "2017": 1.0061, "2018": 1.0084}, +} + + +updn_wt_dict = { + "fake_fact_CMS_eff_lep": ["weight*fac_weight_up", "weight*fac_weight_dn"], + "fake_fact_CMS_pileup": ["weight*fac_weight_up", "weight*fac_weight_dn"], +} + + +printout_flags = { # Convention: True for printing statements, False for silence + "PyStorage": { + "sig_type_conflict": False, + }, +} + + diff --git a/MFVNeutralino/test/ForLimits/submitCombine.py b/MFVNeutralino/test/ForLimits/submitCombine.py new file mode 100644 index 000000000..ac6222c9e --- /dev/null +++ b/MFVNeutralino/test/ForLimits/submitCombine.py @@ -0,0 +1,202 @@ +#!/usr/bin/env python +""" +Discover all signal datacards under ForLimits/Datacards/, group them by +(proc, ctau, mass), and submit one Condor job per hypothesis that: + 1. combineCards.py -- merges per-year/per-channel cards into one Run-2 card + 2. combine -M AsymptoticLimits -- 95% CL expected/observed limits + 3. combine -M FitDiagnostics -- best-fit signal strength + s+b shapes + +Prerequisites + - makeLimitsInputROOT.py must have been run for all years + channels so that + Datacards/{lep,bjet}/Datacard_*.txt files exist. + - CMSSW_14_1_0_pre4 + Combine must be installed. Set CMSSW_14_BASE below. + To install from scratch (run outside apptainer, on LPC EL9 node): + cmsrel CMSSW_14_1_0_pre4 + cd CMSSW_14_1_0_pre4/src && cmsenv + git clone https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit.git HiggsAnalysis/CombinedLimit + scram b -j8 + +Usage + python submitCombine.py # all signals + python submitCombine.py --subset VH,mfv_neu # selected processes + python submitCombine.py --dry-run # list jobs without submitting +""" +import os +import sys +import glob +import stat +import argparse +import subprocess + +# ============================================================================= +# --- SET THIS AFTER INSTALLING CMSSW_14_1_0_pre4 ---------------------------- +CMSSW_14_BASE = "/uscms/home/gdecastr/nobackup/work/CMSSW_14_1_0_pre4" +# ============================================================================= + +HERE = os.path.dirname(os.path.abspath(__file__)) +DATACARD_DIR = os.path.join(HERE, "Datacards") +COMBINE_OUT = os.path.join(HERE, "CombineOutput") +CONDOR_DIR = os.path.join(HERE, "CombineCondor") + +YEARS = ("20161", "20162", "2017", "2018") +CHANNELS = ("lep", "bjet") + +# --------------------------------------------------------------------------- +# Per-job shell script +# --------------------------------------------------------------------------- +_JOB_SH = """\ +#!/bin/bash +set -e +source /cvmfs/cms.cern.ch/cmsset_default.sh +cd {cmssw_src} +eval $(scramv1 runtime -sh) +mkdir -p {work_dir} +cd {work_dir} + +echo "=== combineCards: {sig_id} ===" +combineCards.py {card_args} > combined_{sig_id}.txt + +echo "=== AsymptoticLimits ===" +combine -M AsymptoticLimits \\ + --name {sig_id} \\ + combined_{sig_id}.txt \\ + -v 1 + +echo "=== FitDiagnostics ===" +combine -M FitDiagnostics \\ + --name {sig_id} \\ + combined_{sig_id}.txt \\ + --saveShapes --saveWithUncertainties \\ + -v 1 + +echo "=== Done: {sig_id} ===" +""" + +# --------------------------------------------------------------------------- +# Condor JDL +# --------------------------------------------------------------------------- +_JDL = """\ +universe = vanilla +executable = {job_sh} +output = {log_pfx}.out +error = {log_pfx}.err +log = {log_pfx}.log +request_cpus = 1 +request_memory = 2000MB ++DesiredOS = "EL9" +should_transfer_files = YES +when_to_transfer_output = ON_EXIT +transfer_output_files = "" +queue 1 +""" + + +def _makedirs(path): + if not os.path.exists(path): + os.makedirs(path) + + +def find_hypotheses(): + """Return {sig_base: {ch_year: card_path}} for every available datacard. + + sig_base = "_tau_M" (no year suffix). + ch_year = "lep_2018", "bjet_20161", etc. + """ + hyps = {} + for ch in CHANNELS: + ch_dir = os.path.join(DATACARD_DIR, ch) + if not os.path.isdir(ch_dir): + continue + prefix = "Datacard_%s_" % ch + for fn in sorted(glob.glob(os.path.join(ch_dir, prefix + "*.txt"))): + bn = os.path.basename(fn).replace(".txt", "") + rest = bn[len(prefix):] # "VH_tau1mm_M15_2018" + parts = rest.rsplit("_", 1) + if len(parts) != 2: + continue + sig_base, year = parts + if year not in YEARS: + continue + hyps.setdefault(sig_base, {}) + hyps[sig_base]["%s_%s" % (ch, year)] = fn + return hyps + + +def _write_job(sig_id, cards, dry_run): + work_dir = os.path.join(COMBINE_OUT, sig_id) + condor_dir = os.path.join(CONDOR_DIR, sig_id) + _makedirs(work_dir) + _makedirs(condor_dir) + + card_args = " ".join("%s=%s" % (k, v) for k, v in sorted(cards.items())) + cmssw_src = os.path.join(CMSSW_14_BASE, "src") + + job_sh = os.path.join(condor_dir, "run.sh") + with open(job_sh, "w") as fh: + fh.write(_JOB_SH.format( + cmssw_src = cmssw_src, + work_dir = work_dir, + card_args = card_args, + sig_id = sig_id, + )) + os.chmod(job_sh, stat.S_IRWXU | stat.S_IRGRP | stat.S_IXGRP | stat.S_IROTH | stat.S_IXOTH) + + log_pfx = os.path.join(condor_dir, "job") + jdl_fn = os.path.join(condor_dir, "submit.jdl") + with open(jdl_fn, "w") as fh: + fh.write(_JDL.format(job_sh=job_sh, log_pfx=log_pfx)) + + if not dry_run: + ret = subprocess.call("condor_submit " + jdl_fn, shell=True) + if ret != 0: + print("WARNING: condor_submit returned %d for %s" % (ret, sig_id)) + else: + print(" [dry-run] %s (%d cards: %s)" % (sig_id, len(cards), ", ".join(sorted(cards)))) + + +def main(): + ap = argparse.ArgumentParser(description=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter) + ap.add_argument("--subset", default=None, + help="Comma-separated process names to include, e.g. VH,mfv_neu") + ap.add_argument("--dry-run", action="store_true", + help="Write job files but do not call condor_submit") + ap.add_argument("--skip-existing", action="store_true", + help="Skip hypotheses that already have AsymptoticLimits output") + args = ap.parse_args() + + if "CHANGEME" in CMSSW_14_BASE and not args.dry_run: + print("ERROR: set CMSSW_14_BASE in submitCombine.py before submitting.") + sys.exit(1) + + subset = set(args.subset.split(",")) if args.subset else None + hyps = find_hypotheses() + + if not hyps: + print("No datacards found under %s" % DATACARD_DIR) + sys.exit(1) + + n = 0 + n_skip = 0 + for sig_id in sorted(hyps): + proc = sig_id.split("_tau")[0] + if subset and proc not in subset: + continue + if args.skip_existing: + out_fn = os.path.join(COMBINE_OUT, sig_id, + "higgsCombine%s.AsymptoticLimits.mH120.root" % sig_id) + if os.path.exists(out_fn): + n_skip += 1 + continue + _write_job(sig_id, hyps[sig_id], args.dry_run) + n += 1 + + if n_skip: + print("Skipped %d already-completed hypotheses (--skip-existing)" % n_skip) + + status = "queued (dry-run, job files written)" if args.dry_run else "submitted to Condor" + print("\n%d hypotheses %s" % (n, status)) + + +if __name__ == "__main__": + main() diff --git a/MFVNeutralino/test/ForLimits/turn_7p4p1_to_2darr.py b/MFVNeutralino/test/ForLimits/turn_7p4p1_to_2darr.py new file mode 100644 index 000000000..419dc6118 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/turn_7p4p1_to_2darr.py @@ -0,0 +1,78 @@ +from __future__ import absolute_import +import numpy as np + +import script_configs as config # everything hard-coded goes into config +import helper_PyStorage_objects as sth +import uncerts_trigger as trig_unc # Python dictionaries +import uncerts_trigger_patch as trig_unc_patch # Extrapolation pack +import nuisance_configs as ns_conf + + +""" +-Make nuisance tables for 4 processes (based on total_uncerts of trigger_uncerts, which is the 7.4.1 summary.) +-Save information as pickles (check pickles can be re-read) +""" + + +proc_nm = set([ + "mfv_neu", + "mfv_stopbbarbbar", + "mfv_stopdbardbar", + "ggHToSSTodddd",]) +is_percent = False +x_unit = "mm" +y_unit = "GeV" + +# output_str = """""" # Defunct method: write output to .txt +# save_loc = "7p4p1_trigger_unc.txt" # For manual +pickle_prefix = ns_conf.pickle_prefixes["disp_trig_uncerts"] + + + +for p in proc_nm: + + x_vals = [] + y_vals = [] + + x_vals, y_vals = sth.collect_xyvals_from_namearr(p, trig_unc.total_uncerts.keys(), x_unit, y_unit, debug_mode=True, nbins=3) + + + ntab = sth.NuisanceTable(p, x_vals, x_unit, y_vals, y_unit, as_percent=is_percent, years=set(["2016", "2016APV", "2017", "2018"])) + ntab.add_dictionary(trig_unc.total_uncerts, debug_mode=False) + ntab.add_dictionary(trig_unc_patch.total_uncerts_patch, debug_mode=False) + + + # Mess around with object + ntab.get_point("2017", x_val=1.01, y_val=401, x_unit="mm", use_log=False, debug_mode=True) + + point_from_fn = ntab.get_point_from_fn("mfv_neu_tau010000um_M0400_2018", debug_mode=True) + print "Searching mfv_neu_tau010000um_M0400_2018 returned", point_from_fn + + + if False: + print "\nSummary of", p + print ntab.pretty_print_diagnostics() + print "\n\n" + + ntab.save_pickle(pickle_prefix) + + # output_str += str(ntab.proc) + " = " + ntab.pretty_print_diagnostics() + "\n\n\n" + + +# Check if pickling is right +for p in proc_nm: + ntab = sth.NuisanceTable(proc=p, pickle_loc=pickle_prefix) + print "Successfully reconstructed:", ntab.proc + + if True: + print "\nSummary of", p + print ntab.pretty_print_diagnostics() + print "\n\n" + + + +#out_file = open(save_loc, "w") +#out_file.write(output_str) +#out_file.close() + + diff --git a/MFVNeutralino/test/ForLimits/turn_TrkMvr_to_2darr.py b/MFVNeutralino/test/ForLimits/turn_TrkMvr_to_2darr.py new file mode 100644 index 000000000..c167f1f23 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/turn_TrkMvr_to_2darr.py @@ -0,0 +1,49 @@ +from __future__ import absolute_import +import numpy as np + +import script_configs as config +import helper_PyStorage_objects as sth +import uncerts_trkmvr as TM_unc +import nuisance_configs as ns_conf + + + +proc_nm = set([ + "VH", + "mfv_neu", + "mfv_stopbbarbbar", + "mfv_stopdbardbar", + "ggHToSSTodddd",]) +is_percent = True + +pickle_prefix = ns_conf.pickle_prefixes["vtx_reco_TM"] + + + +for p in proc_nm: + + arr_1612 = np.array(TM_unc.TM_Tables[p]["20161-2"].T) + arr_178 = np.array(TM_unc.TM_Tables[p]["2017-8"].T) + + x_vals = TM_unc.TM_Tables[p]["x_vals"] + y_vals = TM_unc.TM_Tables[p]["y_vals"] + + x_unit = TM_unc.TM_Tables[p]["x_unit"] + y_unit = TM_unc.TM_Tables[p]["y_unit"] + + + ntab = sth.NuisanceTable(p, x_vals, x_unit, y_vals, y_unit, as_percent=is_percent, years=set(["20161-2", "2017-8"])) + + ntab.add_array(p, x_vals, y_vals, "20161-2", arr_1612, x_unit=x_unit, y_unit=y_unit, debug_mode=False) + ntab.add_array(p, x_vals, y_vals, "2017-8", arr_178, x_unit=x_unit, y_unit=y_unit, debug_mode=False) + + + ntab.save_pickle(pickle_prefix) + + + if True: + print "\nSummary of", p + print ntab.pretty_print_diagnostics() + print "\n\n" + + diff --git a/MFVNeutralino/test/ForLimits/turn_TrkRec_to_2darr.py b/MFVNeutralino/test/ForLimits/turn_TrkRec_to_2darr.py new file mode 100644 index 000000000..34325180b --- /dev/null +++ b/MFVNeutralino/test/ForLimits/turn_TrkRec_to_2darr.py @@ -0,0 +1,92 @@ +from __future__ import absolute_import +import numpy as np + +import script_configs as config # everything hard-coded goes into config +import helper_PyStorage_objects as sth +import uncerts_trkrec as tkrc_unc # Python dictionaries +import nuisance_configs as ns_conf + + +""" +-Make nuisance tables, for central/up/down +-Save information as pickles (check pickles can be re-read) +""" + + +proc_nm = set([ + "VH",]) +is_percent = False +x_unit = "mm" +y_unit = "GeV" + +prefix_dict = ns_conf.pickle_triple_prefixes["tk_reco_eff"] +pickle_prefix_base = prefix_dict["base"] + +pickle_prefix_ct = pickle_prefix_base + prefix_dict["central"] +pickle_prefix_up = pickle_prefix_base + prefix_dict["up"] +pickle_prefix_dn = pickle_prefix_base + prefix_dict["dn"] + + + +for p in proc_nm: + + x_vals = [] + y_vals = [] + + x_vals, y_vals = sth.collect_xyvals_from_namearr(p, tkrc_unc.trkdisp_central.keys(), x_unit, y_unit, debug_mode=True) + + + ct_ntab = sth.NuisanceTable(p, x_vals, x_unit, y_vals, y_unit, as_percent=is_percent, years=set(["20161", "20162", "2017", "2018"]), nbin_len=True) + ct_ntab.add_dictionary(tkrc_unc.trkdisp_central, debug_mode=False) + + up_ntab = sth.NuisanceTable(p, x_vals, x_unit, y_vals, y_unit, as_percent=is_percent, years=set(["20161", "20162", "2017", "2018"]), nbin_len=True) + up_ntab.add_dictionary(tkrc_unc.trkdisp_up, debug_mode=False) + + dn_ntab = sth.NuisanceTable(p, x_vals, x_unit, y_vals, y_unit, as_percent=is_percent, years=set(["20161", "20162", "2017", "2018"]), nbin_len=True) + dn_ntab.add_dictionary(tkrc_unc.trkdisp_dn, debug_mode=False) + + + # Mess around with object + ct_ntab.get_point("2017", x_val=1, y_val=40, x_unit="mm", use_log=False, debug_mode=True) + + point_from_fn = ct_ntab.get_point_from_fn("VH_tau1mm_M040_2018", debug_mode=True) + print "Searching VH_tau1mm_M040_2018 returned", point_from_fn + + point_from_fn = up_ntab.get_point_from_fn("VH_tau1mm_M040_2018", debug_mode=True) + print "Searching VH_tau1mm_M040_2018 returned", point_from_fn + + point_from_fn = dn_ntab.get_point_from_fn("VH_tau1mm_M040_2018", debug_mode=True) + print "Searching VH_tau1mm_M040_2018 returned", point_from_fn + + + if True: + print "\nSummary of", p + print ct_ntab.pretty_print_diagnostics() + print up_ntab.pretty_print_diagnostics() + print dn_ntab.pretty_print_diagnostics() + print "\n\n" + + ct_ntab.save_pickle(pickle_prefix_ct) + up_ntab.save_pickle(pickle_prefix_up) + dn_ntab.save_pickle(pickle_prefix_dn) + + # output_str += str(ntab.proc) + " = " + ntab.pretty_print_diagnostics() + "\n\n\n" + + +# Check if pickling is right +for p in proc_nm: + ct_ntab = sth.NuisanceTable(proc=p, pickle_loc=pickle_prefix_ct) + print "Successfully reconstructed:", ct_ntab.proc + + if False: + print "\nSummary of", p + print ct_ntab.pretty_print_diagnostics() + print "\n\n" + + + +#out_file = open(save_loc, "w") +#out_file.write(output_str) +#out_file.close() + + diff --git a/MFVNeutralino/test/ForLimits/uncerts_trigger.py b/MFVNeutralino/test/ForLimits/uncerts_trigger.py new file mode 100644 index 000000000..4712e05d0 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/uncerts_trigger.py @@ -0,0 +1,5037 @@ +tracking_hlt_uncerts = { +"ggHToSSTodddd_tau1mm_M55_2018": 0.0030, +"ggHToSSTodddd_tau10mm_M55_2018": 0.0017, +"ggHToSSTodddd_tau100mm_M55_2018": 0.0000, +"ggHToSSTodddd_tau1mm_M55_2017": 0.0182, +"ggHToSSTodddd_tau10mm_M55_2017": 0.0185, +"ggHToSSTodddd_tau100mm_M55_2017": 0.0000, +"ggHToSSTodddd_tau1mm_M55_2016": 0.0078, +"ggHToSSTodddd_tau10mm_M55_2016": 0.0030, +"ggHToSSTodddd_tau1mm_M55_2016APV": 0.1429, +"ggHToSSTodddd_tau10mm_M55_2016APV": 0.2141, +"ggHToSSTodddd_tau100mm_M55_2016APV": 0.7763, +"mfv_neu_tau000100um_M0200_2018": 0.0000, +"mfv_neu_tau000300um_M0200_2018": 0.0009, +"mfv_neu_tau010000um_M0200_2018": 0.0011, +"mfv_neu_tau030000um_M0200_2018": 0.0042, +"mfv_neu_tau000100um_M0300_2018": 0.0005, +"mfv_neu_tau000300um_M0300_2018": 0.0003, +"mfv_neu_tau001000um_M0300_2018": 0.0018, +"mfv_neu_tau010000um_M0300_2018": 0.0019, +"mfv_neu_tau030000um_M0300_2018": 0.0013, +"mfv_neu_tau000100um_M0400_2018": 0.0000, +"mfv_neu_tau000300um_M0400_2018": 0.0002, +"mfv_neu_tau001000um_M0400_2018": 0.0058, +"mfv_neu_tau010000um_M0400_2018": 0.0004, +"mfv_neu_tau030000um_M0400_2018": 0.0020, +"mfv_neu_tau000100um_M0600_2018": 0.0001, +"mfv_neu_tau001000um_M0600_2018": 0.0086, +"mfv_neu_tau010000um_M0600_2018": 0.0005, +"mfv_neu_tau030000um_M0600_2018": 0.0011, +"mfv_neu_tau000100um_M0800_2018": 0.0001, +"mfv_neu_tau000300um_M0800_2018": 0.0001, +"mfv_neu_tau001000um_M0800_2018": 0.0083, +"mfv_neu_tau010000um_M0800_2018": 0.0004, +"mfv_neu_tau030000um_M0800_2018": 0.0007, +"mfv_neu_tau000100um_M1200_2018": 0.0001, +"mfv_neu_tau000300um_M1200_2018": 0.0000, +"mfv_neu_tau001000um_M1200_2018": 0.0086, +"mfv_neu_tau010000um_M1200_2018": 0.0003, +"mfv_neu_tau030000um_M1200_2018": 0.0004, +"mfv_neu_tau000100um_M1600_2018": 0.0001, +"mfv_neu_tau000300um_M1600_2018": 0.0001, +"mfv_neu_tau001000um_M1600_2018": 0.0078, +"mfv_neu_tau010000um_M1600_2018": 0.0003, +"mfv_neu_tau030000um_M1600_2018": 0.0004, +"mfv_neu_tau000300um_M3000_2018": 0.0002, +"mfv_neu_tau001000um_M3000_2018": 0.0002, +"mfv_neu_tau030000um_M3000_2018": 0.0004, +"mfv_stopdbardbar_tau000100um_M0200_2018": 0.0010, +"mfv_stopdbardbar_tau000300um_M0200_2018": 0.0023, +"mfv_stopdbardbar_tau001000um_M0200_2018": 0.0005, +"mfv_stopdbardbar_tau010000um_M0200_2018": 0.0031, +"mfv_stopdbardbar_tau030000um_M0200_2018": 0.0069, +"mfv_stopdbardbar_tau000100um_M0300_2018": 0.0003, +"mfv_stopdbardbar_tau000300um_M0300_2018": 0.0005, +"mfv_stopdbardbar_tau001000um_M0300_2018": 0.0023, +"mfv_stopdbardbar_tau010000um_M0300_2018": 0.0041, +"mfv_stopdbardbar_tau030000um_M0300_2018": 0.0050, +"mfv_stopdbardbar_tau000100um_M0400_2018": 0.0011, +"mfv_stopdbardbar_tau000300um_M0400_2018": 0.0005, +"mfv_stopdbardbar_tau001000um_M0400_2018": 0.0034, +"mfv_stopdbardbar_tau010000um_M0400_2018": 0.0031, +"mfv_stopdbardbar_tau000100um_M0600_2018": 0.0007, +"mfv_stopdbardbar_tau000300um_M0600_2018": 0.0006, +"mfv_stopdbardbar_tau001000um_M0600_2018": 0.0052, +"mfv_stopdbardbar_tau010000um_M0600_2018": 0.0034, +"mfv_stopdbardbar_tau030000um_M0600_2018": 0.0028, +"mfv_stopdbardbar_tau000100um_M0800_2018": 0.0006, +"mfv_stopdbardbar_tau000300um_M0800_2018": 0.0005, +"mfv_stopdbardbar_tau001000um_M0800_2018": 0.0046, +"mfv_stopdbardbar_tau010000um_M0800_2018": 0.0019, +"mfv_stopdbardbar_tau030000um_M0800_2018": 0.0034, +"mfv_stopdbardbar_tau000100um_M1200_2018": 0.0012, +"mfv_stopdbardbar_tau000300um_M1200_2018": 0.0004, +"mfv_stopdbardbar_tau001000um_M1200_2018": 0.0047, +"mfv_stopdbardbar_tau010000um_M1200_2018": 0.0024, +"mfv_stopdbardbar_tau030000um_M1200_2018": 0.0017, +"mfv_stopdbardbar_tau000100um_M1600_2018": 0.0010, +"mfv_stopdbardbar_tau000300um_M1600_2018": 0.0008, +"mfv_stopdbardbar_tau001000um_M1600_2018": 0.0031, +"mfv_stopdbardbar_tau010000um_M1600_2018": 0.0026, +"mfv_stopdbardbar_tau030000um_M1600_2018": 0.0027, +"mfv_stopdbardbar_tau001000um_M3000_2018": 0.0046, +"mfv_stopdbardbar_tau010000um_M3000_2018": 0.0025, +"mfv_stopdbardbar_tau030000um_M3000_2018": 0.0023, +"mfv_stopbbarbbar_tau000100um_M0200_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0200_2018": 0.0015, +"mfv_stopbbarbbar_tau001000um_M0200_2018": 0.0017, +"mfv_stopbbarbbar_tau010000um_M0200_2018": 0.0042, +"mfv_stopbbarbbar_tau030000um_M0200_2018": 0.0012, +"mfv_stopbbarbbar_tau000100um_M0300_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2018": 0.0003, +"mfv_stopbbarbbar_tau001000um_M0300_2018": 0.0029, +"mfv_stopbbarbbar_tau010000um_M0300_2018": 0.0033, +"mfv_stopbbarbbar_tau030000um_M0300_2018": 0.0018, +"mfv_stopbbarbbar_tau000100um_M0400_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2018": 0.0002, +"mfv_stopbbarbbar_tau001000um_M0400_2018": 0.0021, +"mfv_stopbbarbbar_tau010000um_M0400_2018": 0.0043, +"mfv_stopbbarbbar_tau030000um_M0400_2018": 0.0034, +"mfv_stopbbarbbar_tau000100um_M0600_2018": 0.0001, +"mfv_stopbbarbbar_tau000300um_M0600_2018": 0.0001, +"mfv_stopbbarbbar_tau001000um_M0600_2018": 0.0036, +"mfv_stopbbarbbar_tau010000um_M0600_2018": 0.0011, +"mfv_stopbbarbbar_tau030000um_M0600_2018": 0.0026, +"mfv_stopbbarbbar_tau000100um_M0800_2018": 0.0004, +"mfv_stopbbarbbar_tau000300um_M0800_2018": 0.0003, +"mfv_stopbbarbbar_tau001000um_M0800_2018": 0.0026, +"mfv_stopbbarbbar_tau010000um_M0800_2018": 0.0023, +"mfv_stopbbarbbar_tau030000um_M0800_2018": 0.0030, +"mfv_stopbbarbbar_tau000100um_M1200_2018": 0.0001, +"mfv_stopbbarbbar_tau000300um_M1200_2018": 0.0002, +"mfv_stopbbarbbar_tau001000um_M1200_2018": 0.0035, +"mfv_stopbbarbbar_tau010000um_M1200_2018": 0.0012, +"mfv_stopbbarbbar_tau030000um_M1200_2018": 0.0018, +"mfv_stopbbarbbar_tau000100um_M1600_2018": 0.0003, +"mfv_stopbbarbbar_tau000300um_M1600_2018": 0.0002, +"mfv_stopbbarbbar_tau001000um_M1600_2018": 0.0033, +"mfv_stopbbarbbar_tau010000um_M1600_2018": 0.0012, +"mfv_stopbbarbbar_tau030000um_M1600_2018": 0.0025, +"mfv_stopbbarbbar_tau001000um_M3000_2018": 0.0030, +"mfv_stopbbarbbar_tau010000um_M3000_2018": 0.0008, +"mfv_stopbbarbbar_tau030000um_M3000_2018": 0.0018, +"mfv_neu_tau000100um_M0200_2017": 0.0000, +"mfv_neu_tau000300um_M0200_2017": 0.0014, +"mfv_neu_tau010000um_M0200_2017": 0.0000, +"mfv_neu_tau030000um_M0200_2017": 0.0001, +"mfv_neu_tau000100um_M0300_2017": 0.0012, +"mfv_neu_tau000300um_M0300_2017": 0.0014, +"mfv_neu_tau001000um_M0300_2017": 0.0044, +"mfv_neu_tau010000um_M0300_2017": 0.0026, +"mfv_neu_tau030000um_M0300_2017": 0.0044, +"mfv_neu_tau000100um_M0400_2017": 0.0008, +"mfv_neu_tau001000um_M0400_2017": 0.0033, +"mfv_neu_tau010000um_M0400_2017": 0.0053, +"mfv_neu_tau030000um_M0400_2017": 0.0062, +"mfv_neu_tau000100um_M0600_2017": 0.0010, +"mfv_neu_tau000300um_M0600_2017": 0.0007, +"mfv_neu_tau001000um_M0600_2017": 0.0022, +"mfv_neu_tau010000um_M0600_2017": 0.0011, +"mfv_neu_tau030000um_M0600_2017": 0.0049, +"mfv_neu_tau000300um_M0800_2017": 0.0005, +"mfv_neu_tau001000um_M0800_2017": 0.0019, +"mfv_neu_tau010000um_M0800_2017": 0.0002, +"mfv_neu_tau030000um_M0800_2017": 0.0020, +"mfv_neu_tau000100um_M1200_2017": 0.0002, +"mfv_neu_tau000300um_M1200_2017": 0.0001, +"mfv_neu_tau001000um_M1200_2017": 0.0012, +"mfv_neu_tau010000um_M1200_2017": 0.0024, +"mfv_neu_tau000100um_M1600_2017": 0.0005, +"mfv_neu_tau000300um_M1600_2017": 0.0002, +"mfv_neu_tau001000um_M1600_2017": 0.0011, +"mfv_neu_tau010000um_M1600_2017": 0.0045, +"mfv_neu_tau030000um_M1600_2017": 0.0002, +"mfv_neu_tau001000um_M3000_2017": 0.0007, +"mfv_neu_tau010000um_M3000_2017": 0.0021, +"mfv_neu_tau030000um_M3000_2017": 0.0011, +"mfv_stopdbardbar_tau000100um_M0200_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2017": 0.0027, +"mfv_stopdbardbar_tau001000um_M0200_2017": 0.0060, +"mfv_stopdbardbar_tau010000um_M0200_2017": 0.0091, +"mfv_stopdbardbar_tau030000um_M0200_2017": 0.0092, +"mfv_stopdbardbar_tau000100um_M0300_2017": 0.0015, +"mfv_stopdbardbar_tau000300um_M0300_2017": 0.0021, +"mfv_stopdbardbar_tau001000um_M0300_2017": 0.0054, +"mfv_stopdbardbar_tau010000um_M0300_2017": 0.0156, +"mfv_stopdbardbar_tau030000um_M0300_2017": 0.0165, +"mfv_stopdbardbar_tau000100um_M0400_2017": 0.0012, +"mfv_stopdbardbar_tau000300um_M0400_2017": 0.0022, +"mfv_stopdbardbar_tau001000um_M0400_2017": 0.0044, +"mfv_stopdbardbar_tau010000um_M0400_2017": 0.0152, +"mfv_stopdbardbar_tau030000um_M0400_2017": 0.0168, +"mfv_stopdbardbar_tau000100um_M0600_2017": 0.0021, +"mfv_stopdbardbar_tau000300um_M0600_2017": 0.0021, +"mfv_stopdbardbar_tau010000um_M0600_2017": 0.0109, +"mfv_stopdbardbar_tau030000um_M0600_2017": 0.0135, +"mfv_stopdbardbar_tau000100um_M0800_2017": 0.0010, +"mfv_stopdbardbar_tau000300um_M0800_2017": 0.0015, +"mfv_stopdbardbar_tau001000um_M0800_2017": 0.0029, +"mfv_stopdbardbar_tau010000um_M0800_2017": 0.0106, +"mfv_stopdbardbar_tau030000um_M0800_2017": 0.0126, +"mfv_stopdbardbar_tau000100um_M1200_2017": 0.0011, +"mfv_stopdbardbar_tau000300um_M1200_2017": 0.0012, +"mfv_stopdbardbar_tau001000um_M1200_2017": 0.0021, +"mfv_stopdbardbar_tau010000um_M1200_2017": 0.0049, +"mfv_stopdbardbar_tau030000um_M1200_2017": 0.0083, +"mfv_stopdbardbar_tau001000um_M1600_2017": 0.0024, +"mfv_stopdbardbar_tau010000um_M1600_2017": 0.0035, +"mfv_stopdbardbar_tau030000um_M1600_2017": 0.0087, +"mfv_stopdbardbar_tau001000um_M3000_2017": 0.0015, +"mfv_stopdbardbar_tau010000um_M3000_2017": 0.0012, +"mfv_stopdbardbar_tau030000um_M3000_2017": 0.0054, +"mfv_stopbbarbbar_tau000100um_M0200_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0200_2017": 0.0008, +"mfv_stopbbarbbar_tau001000um_M0200_2017": 0.0019, +"mfv_stopbbarbbar_tau010000um_M0200_2017": 0.0138, +"mfv_stopbbarbbar_tau030000um_M0200_2017": 0.0108, +"mfv_stopbbarbbar_tau000100um_M0300_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2017": 0.0010, +"mfv_stopbbarbbar_tau001000um_M0300_2017": 0.0032, +"mfv_stopbbarbbar_tau010000um_M0300_2017": 0.0157, +"mfv_stopbbarbbar_tau030000um_M0300_2017": 0.0195, +"mfv_stopbbarbbar_tau000100um_M0400_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2017": 0.0007, +"mfv_stopbbarbbar_tau001000um_M0400_2017": 0.0023, +"mfv_stopbbarbbar_tau010000um_M0400_2017": 0.0159, +"mfv_stopbbarbbar_tau030000um_M0400_2017": 0.0164, +"mfv_stopbbarbbar_tau000100um_M0600_2017": 0.0029, +"mfv_stopbbarbbar_tau000300um_M0600_2017": 0.0008, +"mfv_stopbbarbbar_tau001000um_M0600_2017": 0.0021, +"mfv_stopbbarbbar_tau010000um_M0600_2017": 0.0125, +"mfv_stopbbarbbar_tau030000um_M0600_2017": 0.0139, +"mfv_stopbbarbbar_tau000100um_M0800_2017": 0.0009, +"mfv_stopbbarbbar_tau000300um_M0800_2017": 0.0006, +"mfv_stopbbarbbar_tau001000um_M0800_2017": 0.0020, +"mfv_stopbbarbbar_tau010000um_M0800_2017": 0.0118, +"mfv_stopbbarbbar_tau030000um_M0800_2017": 0.0117, +"mfv_stopbbarbbar_tau000100um_M1200_2017": 0.0002, +"mfv_stopbbarbbar_tau000300um_M1200_2017": 0.0004, +"mfv_stopbbarbbar_tau001000um_M1200_2017": 0.0019, +"mfv_stopbbarbbar_tau010000um_M1200_2017": 0.0078, +"mfv_stopbbarbbar_tau030000um_M1200_2017": 0.0086, +"mfv_stopbbarbbar_tau000300um_M1600_2017": 0.0005, +"mfv_stopbbarbbar_tau001000um_M1600_2017": 0.0017, +"mfv_stopbbarbbar_tau010000um_M1600_2017": 0.0048, +"mfv_stopbbarbbar_tau030000um_M1600_2017": 0.0078, +"mfv_stopbbarbbar_tau001000um_M3000_2017": 0.0012, +"mfv_stopbbarbbar_tau010000um_M3000_2017": 0.0002, +"mfv_stopbbarbbar_tau030000um_M3000_2017": 0.0058, +"mfv_neu_tau000100um_M0200_2016": 0.0000, +"mfv_neu_tau000300um_M0200_2016": 0.0031, +"mfv_neu_tau001000um_M0200_2016": 0.0043, +"mfv_neu_tau010000um_M0200_2016": 0.0007, +"mfv_neu_tau030000um_M0200_2016": 0.0063, +"mfv_neu_tau000100um_M0300_2016": 0.0000, +"mfv_neu_tau000300um_M0300_2016": 0.0031, +"mfv_neu_tau001000um_M0300_2016": 0.0058, +"mfv_neu_tau010000um_M0300_2016": 0.0018, +"mfv_neu_tau030000um_M0300_2016": 0.0077, +"mfv_neu_tau000100um_M0400_2016": 0.0000, +"mfv_neu_tau000300um_M0400_2016": 0.0020, +"mfv_neu_tau001000um_M0400_2016": 0.0029, +"mfv_neu_tau010000um_M0400_2016": 0.0030, +"mfv_neu_tau030000um_M0400_2016": 0.0052, +"mfv_neu_tau000100um_M0600_2016": 0.0007, +"mfv_neu_tau000300um_M0600_2016": 0.0005, +"mfv_neu_tau001000um_M0600_2016": 0.0057, +"mfv_neu_tau010000um_M0600_2016": 0.0009, +"mfv_neu_tau030000um_M0600_2016": 0.0002, +"mfv_neu_tau000100um_M0800_2016": 0.0004, +"mfv_neu_tau000300um_M0800_2016": 0.0001, +"mfv_neu_tau001000um_M0800_2016": 0.0006, +"mfv_neu_tau010000um_M0800_2016": 0.0010, +"mfv_neu_tau030000um_M0800_2016": 0.0005, +"mfv_neu_tau000100um_M1200_2016": 0.0002, +"mfv_neu_tau000300um_M1200_2016": 0.0001, +"mfv_neu_tau001000um_M1200_2016": 0.0004, +"mfv_neu_tau010000um_M1200_2016": 0.0008, +"mfv_neu_tau030000um_M1200_2016": 0.0000, +"mfv_neu_tau000100um_M1600_2016": 0.0000, +"mfv_neu_tau000300um_M1600_2016": 0.0001, +"mfv_neu_tau001000um_M1600_2016": 0.0005, +"mfv_neu_tau010000um_M1600_2016": 0.0023, +"mfv_neu_tau030000um_M1600_2016": 0.0000, +"mfv_neu_tau000300um_M3000_2016": 0.0000, +"mfv_neu_tau001000um_M3000_2016": 0.0003, +"mfv_neu_tau010000um_M3000_2016": 0.0004, +"mfv_neu_tau030000um_M3000_2016": 0.0006, +"mfv_stopdbardbar_tau000100um_M0200_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2016": 0.0006, +"mfv_stopdbardbar_tau001000um_M0200_2016": 0.0035, +"mfv_stopdbardbar_tau010000um_M0200_2016": 0.0068, +"mfv_stopdbardbar_tau030000um_M0200_2016": 0.0073, +"mfv_stopdbardbar_tau000100um_M0300_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0300_2016": 0.0005, +"mfv_stopdbardbar_tau001000um_M0300_2016": 0.0039, +"mfv_stopdbardbar_tau010000um_M0300_2016": 0.0062, +"mfv_stopdbardbar_tau030000um_M0300_2016": 0.0100, +"mfv_stopdbardbar_tau000100um_M0400_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0400_2016": 0.0002, +"mfv_stopdbardbar_tau001000um_M0400_2016": 0.0016, +"mfv_stopdbardbar_tau010000um_M0400_2016": 0.0034, +"mfv_stopdbardbar_tau030000um_M0400_2016": 0.0045, +"mfv_stopdbardbar_tau000100um_M0600_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0600_2016": 0.0003, +"mfv_stopdbardbar_tau001000um_M0600_2016": 0.0062, +"mfv_stopdbardbar_tau010000um_M0600_2016": 0.0047, +"mfv_stopdbardbar_tau030000um_M0600_2016": 0.0030, +"mfv_stopdbardbar_tau000100um_M0800_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0800_2016": 0.0005, +"mfv_stopdbardbar_tau001000um_M0800_2016": 0.0052, +"mfv_stopdbardbar_tau010000um_M0800_2016": 0.0008, +"mfv_stopdbardbar_tau030000um_M0800_2016": 0.0024, +"mfv_stopdbardbar_tau000100um_M1200_2016": 0.0022, +"mfv_stopdbardbar_tau000300um_M1200_2016": 0.0002, +"mfv_stopdbardbar_tau001000um_M1200_2016": 0.0008, +"mfv_stopdbardbar_tau010000um_M1200_2016": 0.0024, +"mfv_stopdbardbar_tau030000um_M1200_2016": 0.0024, +"mfv_stopdbardbar_tau000100um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M1600_2016": 0.0002, +"mfv_stopdbardbar_tau001000um_M1600_2016": 0.0047, +"mfv_stopdbardbar_tau010000um_M1600_2016": 0.0011, +"mfv_stopdbardbar_tau030000um_M1600_2016": 0.0015, +"mfv_stopdbardbar_tau000300um_M3000_2016": 0.0003, +"mfv_stopdbardbar_tau001000um_M3000_2016": 0.0042, +"mfv_stopdbardbar_tau030000um_M3000_2016": 0.0022, +"mfv_stopbbarbbar_tau000300um_M0200_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0200_2016": 0.0023, +"mfv_stopbbarbbar_tau010000um_M0200_2016": 0.0143, +"mfv_stopbbarbbar_tau030000um_M0200_2016": 0.0234, +"mfv_stopbbarbbar_tau000100um_M0300_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2016": 0.0004, +"mfv_stopbbarbbar_tau001000um_M0300_2016": 0.0020, +"mfv_stopbbarbbar_tau010000um_M0300_2016": 0.0067, +"mfv_stopbbarbbar_tau030000um_M0300_2016": 0.0082, +"mfv_stopbbarbbar_tau000100um_M0400_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2016": 0.0001, +"mfv_stopbbarbbar_tau001000um_M0400_2016": 0.0006, +"mfv_stopbbarbbar_tau010000um_M0400_2016": 0.0050, +"mfv_stopbbarbbar_tau030000um_M0400_2016": 0.0077, +"mfv_stopbbarbbar_tau000100um_M0600_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0600_2016": 0.0001, +"mfv_stopbbarbbar_tau001000um_M0600_2016": 0.0018, +"mfv_stopbbarbbar_tau010000um_M0600_2016": 0.0009, +"mfv_stopbbarbbar_tau030000um_M0600_2016": 0.0039, +"mfv_stopbbarbbar_tau000100um_M0800_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0800_2016": 0.0002, +"mfv_stopbbarbbar_tau001000um_M0800_2016": 0.0055, +"mfv_stopbbarbbar_tau010000um_M0800_2016": 0.0031, +"mfv_stopbbarbbar_tau030000um_M0800_2016": 0.0018, +"mfv_stopbbarbbar_tau000100um_M1200_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1200_2016": 0.0058, +"mfv_stopbbarbbar_tau010000um_M1200_2016": 0.0016, +"mfv_stopbbarbbar_tau030000um_M1200_2016": 0.0009, +"mfv_stopbbarbbar_tau000100um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1600_2016": 0.0003, +"mfv_stopbbarbbar_tau001000um_M1600_2016": 0.0067, +"mfv_stopbbarbbar_tau010000um_M1600_2016": 0.0004, +"mfv_stopbbarbbar_tau030000um_M1600_2016": 0.0024, +"mfv_stopbbarbbar_tau000300um_M3000_2016": 0.0001, +"mfv_stopbbarbbar_tau001000um_M3000_2016": 0.0043, +"mfv_stopbbarbbar_tau010000um_M3000_2016": 0.0000, +"mfv_stopbbarbbar_tau030000um_M3000_2016": 0.0010, +"mfv_neu_tau000100um_M0200_2016APV": 0.0000, +"mfv_neu_tau000300um_M0200_2016APV": 0.0225, +"mfv_neu_tau001000um_M0200_2016APV": 0.0776, +"mfv_neu_tau010000um_M0200_2016APV": 0.1577, +"mfv_neu_tau030000um_M0200_2016APV": 0.1574, +"mfv_neu_tau000100um_M0300_2016APV": 0.0100, +"mfv_neu_tau000300um_M0300_2016APV": 0.0249, +"mfv_neu_tau001000um_M0300_2016APV": 0.0844, +"mfv_neu_tau010000um_M0300_2016APV": 0.1256, +"mfv_neu_tau030000um_M0300_2016APV": 0.1422, +"mfv_neu_tau000100um_M0400_2016APV": 0.0000, +"mfv_neu_tau000300um_M0400_2016APV": 0.0102, +"mfv_neu_tau001000um_M0400_2016APV": 0.0412, +"mfv_neu_tau010000um_M0400_2016APV": 0.0932, +"mfv_neu_tau030000um_M0400_2016APV": 0.0927, +"mfv_neu_tau000100um_M0600_2016APV": 0.0014, +"mfv_neu_tau000300um_M0600_2016APV": 0.0023, +"mfv_neu_tau001000um_M0600_2016APV": 0.0189, +"mfv_neu_tau010000um_M0600_2016APV": 0.0554, +"mfv_neu_tau030000um_M0600_2016APV": 0.0450, +"mfv_neu_tau000100um_M0800_2016APV": 0.0041, +"mfv_neu_tau000300um_M0800_2016APV": 0.0016, +"mfv_neu_tau001000um_M0800_2016APV": 0.0102, +"mfv_neu_tau010000um_M0800_2016APV": 0.0436, +"mfv_neu_tau030000um_M0800_2016APV": 0.0343, +"mfv_neu_tau000100um_M1200_2016APV": 0.0014, +"mfv_neu_tau000300um_M1200_2016APV": 0.0012, +"mfv_neu_tau001000um_M1200_2016APV": 0.0069, +"mfv_neu_tau010000um_M1200_2016APV": 0.0291, +"mfv_neu_tau000100um_M1600_2016APV": 0.0000, +"mfv_neu_tau000300um_M1600_2016APV": 0.0014, +"mfv_neu_tau001000um_M1600_2016APV": 0.0062, +"mfv_neu_tau010000um_M1600_2016APV": 0.0300, +"mfv_neu_tau030000um_M1600_2016APV": 0.0346, +"mfv_neu_tau001000um_M3000_2016APV": 0.0042, +"mfv_neu_tau010000um_M3000_2016APV": 0.0320, +"mfv_neu_tau030000um_M3000_2016APV": 0.0375, +"mfv_stopdbardbar_tau000100um_M0200_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2016APV": 0.0123, +"mfv_stopdbardbar_tau001000um_M0200_2016APV": 0.0571, +"mfv_stopdbardbar_tau010000um_M0200_2016APV": 0.1297, +"mfv_stopdbardbar_tau030000um_M0200_2016APV": 0.1454, +"mfv_stopdbardbar_tau000100um_M0300_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0300_2016APV": 0.0078, +"mfv_stopdbardbar_tau001000um_M0300_2016APV": 0.0491, +"mfv_stopdbardbar_tau010000um_M0300_2016APV": 0.1239, +"mfv_stopdbardbar_tau030000um_M0300_2016APV": 0.1235, +"mfv_stopdbardbar_tau000100um_M0400_2016APV": 0.0015, +"mfv_stopdbardbar_tau000300um_M0400_2016APV": 0.0058, +"mfv_stopdbardbar_tau010000um_M0400_2016APV": 0.1129, +"mfv_stopdbardbar_tau030000um_M0400_2016APV": 0.1060, +"mfv_stopdbardbar_tau000100um_M0600_2016APV": 0.0023, +"mfv_stopdbardbar_tau000300um_M0600_2016APV": 0.0037, +"mfv_stopdbardbar_tau001000um_M0600_2016APV": 0.0323, +"mfv_stopdbardbar_tau010000um_M0600_2016APV": 0.1030, +"mfv_stopdbardbar_tau030000um_M0600_2016APV": 0.0913, +"mfv_stopdbardbar_tau000100um_M0800_2016APV": 0.0018, +"mfv_stopdbardbar_tau000300um_M0800_2016APV": 0.0025, +"mfv_stopdbardbar_tau001000um_M0800_2016APV": 0.0233, +"mfv_stopdbardbar_tau010000um_M0800_2016APV": 0.0887, +"mfv_stopdbardbar_tau030000um_M0800_2016APV": 0.0743, +"mfv_stopdbardbar_tau000100um_M1200_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M1200_2016APV": 0.0010, +"mfv_stopdbardbar_tau001000um_M1200_2016APV": 0.0161, +"mfv_stopdbardbar_tau010000um_M1200_2016APV": 0.0766, +"mfv_stopdbardbar_tau030000um_M1200_2016APV": 0.0740, +"mfv_stopdbardbar_tau000100um_M1600_2016APV": 0.0021, +"mfv_stopdbardbar_tau000300um_M1600_2016APV": 0.0012, +"mfv_stopdbardbar_tau001000um_M1600_2016APV": 0.0141, +"mfv_stopdbardbar_tau010000um_M1600_2016APV": 0.0791, +"mfv_stopdbardbar_tau030000um_M1600_2016APV": 0.0653, +"mfv_stopdbardbar_tau000300um_M3000_2016APV": 0.0011, +"mfv_stopdbardbar_tau001000um_M3000_2016APV": 0.0092, +"mfv_stopdbardbar_tau010000um_M3000_2016APV": 0.0691, +"mfv_stopdbardbar_tau030000um_M3000_2016APV": 0.0879, +"mfv_stopbbarbbar_tau000100um_M0200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0200_2016APV": 0.0114, +"mfv_stopbbarbbar_tau001000um_M0200_2016APV": 0.0524, +"mfv_stopbbarbbar_tau010000um_M0200_2016APV": 0.1656, +"mfv_stopbbarbbar_tau030000um_M0200_2016APV": 0.1609, +"mfv_stopbbarbbar_tau000100um_M0300_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2016APV": 0.0073, +"mfv_stopbbarbbar_tau001000um_M0300_2016APV": 0.0455, +"mfv_stopbbarbbar_tau010000um_M0300_2016APV": 0.1321, +"mfv_stopbbarbbar_tau030000um_M0300_2016APV": 0.1408, +"mfv_stopbbarbbar_tau000100um_M0400_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2016APV": 0.0026, +"mfv_stopbbarbbar_tau001000um_M0400_2016APV": 0.0315, +"mfv_stopbbarbbar_tau010000um_M0400_2016APV": 0.1184, +"mfv_stopbbarbbar_tau030000um_M0400_2016APV": 0.1130, +"mfv_stopbbarbbar_tau000100um_M0600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0600_2016APV": 0.0022, +"mfv_stopbbarbbar_tau001000um_M0600_2016APV": 0.0233, +"mfv_stopbbarbbar_tau010000um_M0600_2016APV": 0.0930, +"mfv_stopbbarbbar_tau030000um_M0600_2016APV": 0.0908, +"mfv_stopbbarbbar_tau000100um_M0800_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0800_2016APV": 0.0011, +"mfv_stopbbarbbar_tau001000um_M0800_2016APV": 0.0177, +"mfv_stopbbarbbar_tau010000um_M0800_2016APV": 0.0862, +"mfv_stopbbarbbar_tau030000um_M0800_2016APV": 0.0781, +"mfv_stopbbarbbar_tau000100um_M1200_2016APV": 0.0008, +"mfv_stopbbarbbar_tau000300um_M1200_2016APV": 0.0007, +"mfv_stopbbarbbar_tau001000um_M1200_2016APV": 0.0144, +"mfv_stopbbarbbar_tau010000um_M1200_2016APV": 0.0759, +"mfv_stopbbarbbar_tau030000um_M1200_2016APV": 0.0636, +"mfv_stopbbarbbar_tau000100um_M1600_2016APV": 0.0009, +"mfv_stopbbarbbar_tau000300um_M1600_2016APV": 0.0016, +"mfv_stopbbarbbar_tau001000um_M1600_2016APV": 0.0103, +"mfv_stopbbarbbar_tau010000um_M1600_2016APV": 0.0696, +"mfv_stopbbarbbar_tau030000um_M1600_2016APV": 0.0656, +"mfv_stopbbarbbar_tau001000um_M3000_2016APV": 0.0071, +"mfv_stopbbarbbar_tau010000um_M3000_2016APV": 0.0597, +"mfv_stopbbarbbar_tau030000um_M3000_2016APV": 0.0896, +} + +dijet_kine_uncerts = { +"ggHToSSTodddd_tau1mm_M55_2018": 0.0008, +"ggHToSSTodddd_tau10mm_M55_2018": 0.0025, +"ggHToSSTodddd_tau100mm_M55_2018": 0.0038, +"ggHToSSTodddd_tau1mm_M55_2017": 0.0004, +"ggHToSSTodddd_tau10mm_M55_2017": 0.0019, +"ggHToSSTodddd_tau100mm_M55_2017": 0.0014, +"ggHToSSTodddd_tau1mm_M55_2016": 0.0078, +"ggHToSSTodddd_tau10mm_M55_2016": 0.0241, +"ggHToSSTodddd_tau1mm_M55_2016APV": 0.0094, +"ggHToSSTodddd_tau10mm_M55_2016APV": 0.0232, +"ggHToSSTodddd_tau100mm_M55_2016APV": 0.0288, +"mfv_neu_tau000100um_M0200_2018": 0.0000, +"mfv_neu_tau000300um_M0200_2018": 0.0001, +"mfv_neu_tau010000um_M0200_2018": 0.0038, +"mfv_neu_tau030000um_M0200_2018": 0.0039, +"mfv_neu_tau000100um_M0300_2018": 0.0000, +"mfv_neu_tau000300um_M0300_2018": 0.0000, +"mfv_neu_tau001000um_M0300_2018": 0.0002, +"mfv_neu_tau010000um_M0300_2018": 0.0040, +"mfv_neu_tau030000um_M0300_2018": 0.0028, +"mfv_neu_tau000100um_M0400_2018": 0.0000, +"mfv_neu_tau000300um_M0400_2018": 0.0000, +"mfv_neu_tau001000um_M0400_2018": 0.0009, +"mfv_neu_tau010000um_M0400_2018": 0.0021, +"mfv_neu_tau030000um_M0400_2018": 0.0013, +"mfv_neu_tau000100um_M0600_2018": 0.0000, +"mfv_neu_tau001000um_M0600_2018": 0.0001, +"mfv_neu_tau010000um_M0600_2018": 0.0004, +"mfv_neu_tau030000um_M0600_2018": 0.0001, +"mfv_neu_tau000100um_M0800_2018": 0.0000, +"mfv_neu_tau000300um_M0800_2018": 0.0000, +"mfv_neu_tau001000um_M0800_2018": 0.0000, +"mfv_neu_tau010000um_M0800_2018": 0.0001, +"mfv_neu_tau030000um_M0800_2018": 0.0000, +"mfv_neu_tau000100um_M1200_2018": 0.0000, +"mfv_neu_tau000300um_M1200_2018": 0.0000, +"mfv_neu_tau001000um_M1200_2018": 0.0000, +"mfv_neu_tau010000um_M1200_2018": 0.0000, +"mfv_neu_tau030000um_M1200_2018": 0.0000, +"mfv_neu_tau000100um_M1600_2018": 0.0000, +"mfv_neu_tau000300um_M1600_2018": 0.0000, +"mfv_neu_tau001000um_M1600_2018": 0.0000, +"mfv_neu_tau010000um_M1600_2018": 0.0000, +"mfv_neu_tau030000um_M1600_2018": 0.0000, +"mfv_neu_tau000300um_M3000_2018": 0.0000, +"mfv_neu_tau001000um_M3000_2018": 0.0000, +"mfv_neu_tau030000um_M3000_2018": 0.0000, +"mfv_stopdbardbar_tau000100um_M0200_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2018": 0.0001, +"mfv_stopdbardbar_tau001000um_M0200_2018": 0.0003, +"mfv_stopdbardbar_tau010000um_M0200_2018": 0.0012, +"mfv_stopdbardbar_tau030000um_M0200_2018": 0.0013, +"mfv_stopdbardbar_tau000100um_M0300_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M0300_2018": 0.0000, +"mfv_stopdbardbar_tau001000um_M0300_2018": 0.0002, +"mfv_stopdbardbar_tau010000um_M0300_2018": 0.0007, +"mfv_stopdbardbar_tau030000um_M0300_2018": 0.0017, +"mfv_stopdbardbar_tau000100um_M0400_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M0400_2018": 0.0000, +"mfv_stopdbardbar_tau001000um_M0400_2018": 0.0001, +"mfv_stopdbardbar_tau010000um_M0400_2018": 0.0003, +"mfv_stopdbardbar_tau000100um_M0600_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M0600_2018": 0.0000, +"mfv_stopdbardbar_tau001000um_M0600_2018": 0.0000, +"mfv_stopdbardbar_tau010000um_M0600_2018": 0.0002, +"mfv_stopdbardbar_tau030000um_M0600_2018": 0.0001, +"mfv_stopdbardbar_tau000100um_M0800_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M0800_2018": 0.0000, +"mfv_stopdbardbar_tau001000um_M0800_2018": 0.0001, +"mfv_stopdbardbar_tau010000um_M0800_2018": 0.0001, +"mfv_stopdbardbar_tau030000um_M0800_2018": 0.0002, +"mfv_stopdbardbar_tau000100um_M1200_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M1200_2018": 0.0000, +"mfv_stopdbardbar_tau001000um_M1200_2018": 0.0001, +"mfv_stopdbardbar_tau010000um_M1200_2018": 0.0001, +"mfv_stopdbardbar_tau030000um_M1200_2018": 0.0002, +"mfv_stopdbardbar_tau000100um_M1600_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M1600_2018": 0.0000, +"mfv_stopdbardbar_tau001000um_M1600_2018": 0.0000, +"mfv_stopdbardbar_tau010000um_M1600_2018": 0.0002, +"mfv_stopdbardbar_tau030000um_M1600_2018": 0.0000, +"mfv_stopdbardbar_tau001000um_M3000_2018": 0.0000, +"mfv_stopdbardbar_tau010000um_M3000_2018": 0.0000, +"mfv_stopdbardbar_tau030000um_M3000_2018": 0.0001, +"mfv_stopbbarbbar_tau000100um_M0200_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0200_2018": 0.0002, +"mfv_stopbbarbbar_tau001000um_M0200_2018": 0.0014, +"mfv_stopbbarbbar_tau010000um_M0200_2018": 0.0033, +"mfv_stopbbarbbar_tau030000um_M0200_2018": 0.0019, +"mfv_stopbbarbbar_tau000100um_M0300_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0300_2018": 0.0016, +"mfv_stopbbarbbar_tau010000um_M0300_2018": 0.0037, +"mfv_stopbbarbbar_tau030000um_M0300_2018": 0.0023, +"mfv_stopbbarbbar_tau000100um_M0400_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0400_2018": 0.0010, +"mfv_stopbbarbbar_tau010000um_M0400_2018": 0.0014, +"mfv_stopbbarbbar_tau030000um_M0400_2018": 0.0013, +"mfv_stopbbarbbar_tau000100um_M0600_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0600_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0600_2018": 0.0002, +"mfv_stopbbarbbar_tau010000um_M0600_2018": 0.0007, +"mfv_stopbbarbbar_tau030000um_M0600_2018": 0.0004, +"mfv_stopbbarbbar_tau000100um_M0800_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0800_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0800_2018": 0.0001, +"mfv_stopbbarbbar_tau010000um_M0800_2018": 0.0004, +"mfv_stopbbarbbar_tau030000um_M0800_2018": 0.0002, +"mfv_stopbbarbbar_tau000100um_M1200_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1200_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1200_2018": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1200_2018": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1200_2018": 0.0000, +"mfv_stopbbarbbar_tau000100um_M1600_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1600_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1600_2018": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1600_2018": 0.0001, +"mfv_stopbbarbbar_tau030000um_M1600_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M3000_2018": 0.0000, +"mfv_stopbbarbbar_tau010000um_M3000_2018": 0.0000, +"mfv_stopbbarbbar_tau030000um_M3000_2018": 0.0000, +"mfv_neu_tau000100um_M0200_2017": 0.0000, +"mfv_neu_tau000300um_M0200_2017": 0.0000, +"mfv_neu_tau010000um_M0200_2017": 0.0057, +"mfv_neu_tau030000um_M0200_2017": 0.0037, +"mfv_neu_tau000100um_M0300_2017": 0.0000, +"mfv_neu_tau000300um_M0300_2017": 0.0000, +"mfv_neu_tau001000um_M0300_2017": 0.0002, +"mfv_neu_tau010000um_M0300_2017": 0.0026, +"mfv_neu_tau030000um_M0300_2017": 0.0020, +"mfv_neu_tau000100um_M0400_2017": 0.0000, +"mfv_neu_tau001000um_M0400_2017": 0.0001, +"mfv_neu_tau010000um_M0400_2017": 0.0015, +"mfv_neu_tau030000um_M0400_2017": 0.0013, +"mfv_neu_tau000100um_M0600_2017": 0.0000, +"mfv_neu_tau000300um_M0600_2017": 0.0000, +"mfv_neu_tau001000um_M0600_2017": 0.0000, +"mfv_neu_tau010000um_M0600_2017": 0.0003, +"mfv_neu_tau030000um_M0600_2017": 0.0003, +"mfv_neu_tau000300um_M0800_2017": 0.0000, +"mfv_neu_tau001000um_M0800_2017": 0.0000, +"mfv_neu_tau010000um_M0800_2017": 0.0000, +"mfv_neu_tau030000um_M0800_2017": 0.0000, +"mfv_neu_tau000100um_M1200_2017": 0.0000, +"mfv_neu_tau000300um_M1200_2017": 0.0000, +"mfv_neu_tau001000um_M1200_2017": 0.0000, +"mfv_neu_tau010000um_M1200_2017": 0.0000, +"mfv_neu_tau000100um_M1600_2017": 0.0000, +"mfv_neu_tau000300um_M1600_2017": 0.0000, +"mfv_neu_tau001000um_M1600_2017": 0.0000, +"mfv_neu_tau010000um_M1600_2017": 0.0000, +"mfv_neu_tau030000um_M1600_2017": 0.0000, +"mfv_neu_tau001000um_M3000_2017": 0.0000, +"mfv_neu_tau010000um_M3000_2017": 0.0000, +"mfv_neu_tau030000um_M3000_2017": 0.0000, +"mfv_stopdbardbar_tau000100um_M0200_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M0200_2017": 0.0003, +"mfv_stopdbardbar_tau010000um_M0200_2017": 0.0004, +"mfv_stopdbardbar_tau030000um_M0200_2017": 0.0010, +"mfv_stopdbardbar_tau000100um_M0300_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M0300_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M0300_2017": 0.0000, +"mfv_stopdbardbar_tau010000um_M0300_2017": 0.0004, +"mfv_stopdbardbar_tau030000um_M0300_2017": 0.0007, +"mfv_stopdbardbar_tau000100um_M0400_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M0400_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M0400_2017": 0.0000, +"mfv_stopdbardbar_tau010000um_M0400_2017": 0.0003, +"mfv_stopdbardbar_tau030000um_M0400_2017": 0.0005, +"mfv_stopdbardbar_tau000100um_M0600_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M0600_2017": 0.0000, +"mfv_stopdbardbar_tau010000um_M0600_2017": 0.0001, +"mfv_stopdbardbar_tau030000um_M0600_2017": 0.0001, +"mfv_stopdbardbar_tau000100um_M0800_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M0800_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M0800_2017": 0.0000, +"mfv_stopdbardbar_tau010000um_M0800_2017": 0.0001, +"mfv_stopdbardbar_tau030000um_M0800_2017": 0.0000, +"mfv_stopdbardbar_tau000100um_M1200_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M1200_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M1200_2017": 0.0000, +"mfv_stopdbardbar_tau010000um_M1200_2017": 0.0000, +"mfv_stopdbardbar_tau030000um_M1200_2017": 0.0001, +"mfv_stopdbardbar_tau001000um_M1600_2017": 0.0000, +"mfv_stopdbardbar_tau010000um_M1600_2017": 0.0001, +"mfv_stopdbardbar_tau030000um_M1600_2017": 0.0001, +"mfv_stopdbardbar_tau001000um_M3000_2017": 0.0000, +"mfv_stopdbardbar_tau010000um_M3000_2017": 0.0004, +"mfv_stopdbardbar_tau030000um_M3000_2017": 0.0000, +"mfv_stopbbarbbar_tau000100um_M0200_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0200_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0200_2017": 0.0002, +"mfv_stopbbarbbar_tau010000um_M0200_2017": 0.0015, +"mfv_stopbbarbbar_tau030000um_M0200_2017": 0.0015, +"mfv_stopbbarbbar_tau000100um_M0300_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0300_2017": 0.0002, +"mfv_stopbbarbbar_tau010000um_M0300_2017": 0.0021, +"mfv_stopbbarbbar_tau030000um_M0300_2017": 0.0016, +"mfv_stopbbarbbar_tau000100um_M0400_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0400_2017": 0.0001, +"mfv_stopbbarbbar_tau010000um_M0400_2017": 0.0012, +"mfv_stopbbarbbar_tau030000um_M0400_2017": 0.0012, +"mfv_stopbbarbbar_tau000100um_M0600_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0600_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0600_2017": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0600_2017": 0.0006, +"mfv_stopbbarbbar_tau030000um_M0600_2017": 0.0004, +"mfv_stopbbarbbar_tau000100um_M0800_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0800_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0800_2017": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0800_2017": 0.0003, +"mfv_stopbbarbbar_tau030000um_M0800_2017": 0.0002, +"mfv_stopbbarbbar_tau000100um_M1200_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1200_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1200_2017": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1200_2017": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1200_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1600_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1600_2017": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1600_2017": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1600_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M3000_2017": 0.0000, +"mfv_stopbbarbbar_tau010000um_M3000_2017": 0.0000, +"mfv_stopbbarbbar_tau030000um_M3000_2017": 0.0001, +"mfv_neu_tau000100um_M0200_2016": 0.0000, +"mfv_neu_tau000300um_M0200_2016": 0.0001, +"mfv_neu_tau001000um_M0200_2016": 0.0016, +"mfv_neu_tau010000um_M0200_2016": 0.0051, +"mfv_neu_tau030000um_M0200_2016": 0.0088, +"mfv_neu_tau000100um_M0300_2016": 0.0000, +"mfv_neu_tau000300um_M0300_2016": 0.0001, +"mfv_neu_tau001000um_M0300_2016": 0.0009, +"mfv_neu_tau010000um_M0300_2016": 0.0025, +"mfv_neu_tau030000um_M0300_2016": 0.0019, +"mfv_neu_tau000100um_M0400_2016": 0.0000, +"mfv_neu_tau000300um_M0400_2016": 0.0000, +"mfv_neu_tau001000um_M0400_2016": 0.0001, +"mfv_neu_tau010000um_M0400_2016": 0.0009, +"mfv_neu_tau030000um_M0400_2016": 0.0008, +"mfv_neu_tau000100um_M0600_2016": 0.0000, +"mfv_neu_tau000300um_M0600_2016": 0.0000, +"mfv_neu_tau001000um_M0600_2016": 0.0000, +"mfv_neu_tau010000um_M0600_2016": 0.0004, +"mfv_neu_tau030000um_M0600_2016": 0.0001, +"mfv_neu_tau000100um_M0800_2016": 0.0000, +"mfv_neu_tau000300um_M0800_2016": 0.0000, +"mfv_neu_tau001000um_M0800_2016": 0.0000, +"mfv_neu_tau010000um_M0800_2016": 0.0000, +"mfv_neu_tau030000um_M0800_2016": 0.0001, +"mfv_neu_tau000100um_M1200_2016": 0.0000, +"mfv_neu_tau000300um_M1200_2016": 0.0000, +"mfv_neu_tau001000um_M1200_2016": 0.0000, +"mfv_neu_tau010000um_M1200_2016": 0.0000, +"mfv_neu_tau030000um_M1200_2016": 0.0000, +"mfv_neu_tau000100um_M1600_2016": 0.0000, +"mfv_neu_tau000300um_M1600_2016": 0.0000, +"mfv_neu_tau001000um_M1600_2016": 0.0000, +"mfv_neu_tau010000um_M1600_2016": 0.0000, +"mfv_neu_tau030000um_M1600_2016": 0.0000, +"mfv_neu_tau000300um_M3000_2016": 0.0000, +"mfv_neu_tau001000um_M3000_2016": 0.0000, +"mfv_neu_tau010000um_M3000_2016": 0.0000, +"mfv_neu_tau030000um_M3000_2016": 0.0000, +"mfv_stopdbardbar_tau000100um_M0200_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2016": 0.0001, +"mfv_stopdbardbar_tau001000um_M0200_2016": 0.0015, +"mfv_stopdbardbar_tau010000um_M0200_2016": 0.0050, +"mfv_stopdbardbar_tau030000um_M0200_2016": 0.0041, +"mfv_stopdbardbar_tau000100um_M0300_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0300_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M0300_2016": 0.0008, +"mfv_stopdbardbar_tau010000um_M0300_2016": 0.0026, +"mfv_stopdbardbar_tau030000um_M0300_2016": 0.0027, +"mfv_stopdbardbar_tau000100um_M0400_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0400_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M0400_2016": 0.0005, +"mfv_stopdbardbar_tau010000um_M0400_2016": 0.0014, +"mfv_stopdbardbar_tau030000um_M0400_2016": 0.0014, +"mfv_stopdbardbar_tau000100um_M0600_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0600_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M0600_2016": 0.0001, +"mfv_stopdbardbar_tau010000um_M0600_2016": 0.0002, +"mfv_stopdbardbar_tau030000um_M0600_2016": 0.0003, +"mfv_stopdbardbar_tau000100um_M0800_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0800_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M0800_2016": 0.0001, +"mfv_stopdbardbar_tau010000um_M0800_2016": 0.0001, +"mfv_stopdbardbar_tau030000um_M0800_2016": 0.0006, +"mfv_stopdbardbar_tau000100um_M1200_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M1200_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M1200_2016": 0.0000, +"mfv_stopdbardbar_tau010000um_M1200_2016": 0.0004, +"mfv_stopdbardbar_tau030000um_M1200_2016": 0.0001, +"mfv_stopdbardbar_tau000100um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau010000um_M1600_2016": 0.0001, +"mfv_stopdbardbar_tau030000um_M1600_2016": 0.0001, +"mfv_stopdbardbar_tau000300um_M3000_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M3000_2016": 0.0001, +"mfv_stopdbardbar_tau030000um_M3000_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0200_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0200_2016": 0.0017, +"mfv_stopbbarbbar_tau010000um_M0200_2016": 0.0086, +"mfv_stopbbarbbar_tau030000um_M0200_2016": 0.0073, +"mfv_stopbbarbbar_tau000100um_M0300_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0300_2016": 0.0010, +"mfv_stopbbarbbar_tau010000um_M0300_2016": 0.0039, +"mfv_stopbbarbbar_tau030000um_M0300_2016": 0.0028, +"mfv_stopbbarbbar_tau000100um_M0400_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0400_2016": 0.0009, +"mfv_stopbbarbbar_tau010000um_M0400_2016": 0.0032, +"mfv_stopbbarbbar_tau030000um_M0400_2016": 0.0027, +"mfv_stopbbarbbar_tau000100um_M0600_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0600_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0600_2016": 0.0003, +"mfv_stopbbarbbar_tau010000um_M0600_2016": 0.0005, +"mfv_stopbbarbbar_tau030000um_M0600_2016": 0.0005, +"mfv_stopbbarbbar_tau000100um_M0800_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0800_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0800_2016": 0.0002, +"mfv_stopbbarbbar_tau010000um_M0800_2016": 0.0003, +"mfv_stopbbarbbar_tau030000um_M0800_2016": 0.0002, +"mfv_stopbbarbbar_tau000100um_M1200_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1200_2016": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1200_2016": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1200_2016": 0.0001, +"mfv_stopbbarbbar_tau000100um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1600_2016": 0.0005, +"mfv_stopbbarbbar_tau030000um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M3000_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M3000_2016": 0.0000, +"mfv_stopbbarbbar_tau010000um_M3000_2016": 0.0001, +"mfv_stopbbarbbar_tau030000um_M3000_2016": 0.0002, +"mfv_neu_tau000100um_M0200_2016APV": 0.0000, +"mfv_neu_tau000300um_M0200_2016APV": 0.0003, +"mfv_neu_tau001000um_M0200_2016APV": 0.0009, +"mfv_neu_tau010000um_M0200_2016APV": 0.0073, +"mfv_neu_tau030000um_M0200_2016APV": 0.0050, +"mfv_neu_tau000100um_M0300_2016APV": 0.0001, +"mfv_neu_tau000300um_M0300_2016APV": 0.0001, +"mfv_neu_tau001000um_M0300_2016APV": 0.0008, +"mfv_neu_tau010000um_M0300_2016APV": 0.0021, +"mfv_neu_tau030000um_M0300_2016APV": 0.0013, +"mfv_neu_tau000100um_M0400_2016APV": 0.0000, +"mfv_neu_tau000300um_M0400_2016APV": 0.0000, +"mfv_neu_tau001000um_M0400_2016APV": 0.0001, +"mfv_neu_tau010000um_M0400_2016APV": 0.0008, +"mfv_neu_tau030000um_M0400_2016APV": 0.0009, +"mfv_neu_tau000100um_M0600_2016APV": 0.0000, +"mfv_neu_tau000300um_M0600_2016APV": 0.0000, +"mfv_neu_tau001000um_M0600_2016APV": 0.0000, +"mfv_neu_tau010000um_M0600_2016APV": 0.0003, +"mfv_neu_tau030000um_M0600_2016APV": 0.0003, +"mfv_neu_tau000100um_M0800_2016APV": 0.0000, +"mfv_neu_tau000300um_M0800_2016APV": 0.0000, +"mfv_neu_tau001000um_M0800_2016APV": 0.0000, +"mfv_neu_tau010000um_M0800_2016APV": 0.0000, +"mfv_neu_tau030000um_M0800_2016APV": 0.0001, +"mfv_neu_tau000100um_M1200_2016APV": 0.0000, +"mfv_neu_tau000300um_M1200_2016APV": 0.0000, +"mfv_neu_tau001000um_M1200_2016APV": 0.0000, +"mfv_neu_tau010000um_M1200_2016APV": 0.0001, +"mfv_neu_tau000100um_M1600_2016APV": 0.0000, +"mfv_neu_tau000300um_M1600_2016APV": 0.0000, +"mfv_neu_tau001000um_M1600_2016APV": 0.0000, +"mfv_neu_tau010000um_M1600_2016APV": 0.0000, +"mfv_neu_tau030000um_M1600_2016APV": 0.0000, +"mfv_neu_tau001000um_M3000_2016APV": 0.0000, +"mfv_neu_tau010000um_M3000_2016APV": 0.0000, +"mfv_neu_tau030000um_M3000_2016APV": 0.0000, +"mfv_stopdbardbar_tau000100um_M0200_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2016APV": 0.0001, +"mfv_stopdbardbar_tau001000um_M0200_2016APV": 0.0005, +"mfv_stopdbardbar_tau010000um_M0200_2016APV": 0.0051, +"mfv_stopdbardbar_tau030000um_M0200_2016APV": 0.0048, +"mfv_stopdbardbar_tau000100um_M0300_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0300_2016APV": 0.0001, +"mfv_stopdbardbar_tau001000um_M0300_2016APV": 0.0006, +"mfv_stopdbardbar_tau010000um_M0300_2016APV": 0.0021, +"mfv_stopdbardbar_tau030000um_M0300_2016APV": 0.0025, +"mfv_stopdbardbar_tau000100um_M0400_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0400_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M0400_2016APV": 0.0016, +"mfv_stopdbardbar_tau030000um_M0400_2016APV": 0.0020, +"mfv_stopdbardbar_tau000100um_M0600_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0600_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M0600_2016APV": 0.0001, +"mfv_stopdbardbar_tau010000um_M0600_2016APV": 0.0004, +"mfv_stopdbardbar_tau030000um_M0600_2016APV": 0.0007, +"mfv_stopdbardbar_tau000100um_M0800_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0800_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M0800_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M0800_2016APV": 0.0001, +"mfv_stopdbardbar_tau030000um_M0800_2016APV": 0.0003, +"mfv_stopdbardbar_tau000100um_M1200_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M1200_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M1200_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M1200_2016APV": 0.0000, +"mfv_stopdbardbar_tau030000um_M1200_2016APV": 0.0001, +"mfv_stopdbardbar_tau000100um_M1600_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M1600_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M1600_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M1600_2016APV": 0.0001, +"mfv_stopdbardbar_tau030000um_M1600_2016APV": 0.0001, +"mfv_stopdbardbar_tau000300um_M3000_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M3000_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M3000_2016APV": 0.0000, +"mfv_stopdbardbar_tau030000um_M3000_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000100um_M0200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0200_2016APV": 0.0001, +"mfv_stopbbarbbar_tau001000um_M0200_2016APV": 0.0007, +"mfv_stopbbarbbar_tau010000um_M0200_2016APV": 0.0024, +"mfv_stopbbarbbar_tau030000um_M0200_2016APV": 0.0084, +"mfv_stopbbarbbar_tau000100um_M0300_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2016APV": 0.0001, +"mfv_stopbbarbbar_tau001000um_M0300_2016APV": 0.0005, +"mfv_stopbbarbbar_tau010000um_M0300_2016APV": 0.0028, +"mfv_stopbbarbbar_tau030000um_M0300_2016APV": 0.0023, +"mfv_stopbbarbbar_tau000100um_M0400_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0400_2016APV": 0.0002, +"mfv_stopbbarbbar_tau010000um_M0400_2016APV": 0.0012, +"mfv_stopbbarbbar_tau030000um_M0400_2016APV": 0.0014, +"mfv_stopbbarbbar_tau000100um_M0600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0600_2016APV": 0.0005, +"mfv_stopbbarbbar_tau030000um_M0600_2016APV": 0.0006, +"mfv_stopbbarbbar_tau000100um_M0800_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0800_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0800_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0800_2016APV": 0.0002, +"mfv_stopbbarbbar_tau030000um_M0800_2016APV": 0.0005, +"mfv_stopbbarbbar_tau000100um_M1200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1200_2016APV": 0.0001, +"mfv_stopbbarbbar_tau030000um_M1200_2016APV": 0.0002, +"mfv_stopbbarbbar_tau000100um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M3000_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M3000_2016APV": 0.0001, +"mfv_stopbbarbbar_tau030000um_M3000_2016APV": 0.0001, +} + +bjet_signal_uncerts = { +"ggHToSSTodddd_tau1mm_M55_2018": 0.0228, +"ggHToSSTodddd_tau10mm_M55_2018": 0.0084, +"ggHToSSTodddd_tau100mm_M55_2018": 0.0000, +"ggHToSSTodddd_tau1mm_M55_2017": 0.0310, +"ggHToSSTodddd_tau10mm_M55_2017": 0.0109, +"ggHToSSTodddd_tau100mm_M55_2017": 0.0243, +"ggHToSSTodddd_tau1mm_M55_2016": 0.0035, +"ggHToSSTodddd_tau10mm_M55_2016": 0.0000, +"ggHToSSTodddd_tau1mm_M55_2016APV": 0.0000, +"ggHToSSTodddd_tau10mm_M55_2016APV": 0.0000, +"ggHToSSTodddd_tau100mm_M55_2016APV": 0.0731, +"mfv_neu_tau000100um_M0200_2018": 0.0145, +"mfv_neu_tau000300um_M0200_2018": 0.0157, +"mfv_neu_tau010000um_M0200_2018": 0.0042, +"mfv_neu_tau030000um_M0200_2018": 0.0000, +"mfv_neu_tau000100um_M0300_2018": 0.0083, +"mfv_neu_tau000300um_M0300_2018": 0.0097, +"mfv_neu_tau001000um_M0300_2018": 0.0074, +"mfv_neu_tau010000um_M0300_2018": 0.0013, +"mfv_neu_tau030000um_M0300_2018": 0.0007, +"mfv_neu_tau000100um_M0400_2018": 0.0072, +"mfv_neu_tau000300um_M0400_2018": 0.0058, +"mfv_neu_tau001000um_M0400_2018": 0.0043, +"mfv_neu_tau010000um_M0400_2018": 0.0010, +"mfv_neu_tau030000um_M0400_2018": 0.0008, +"mfv_neu_tau000100um_M0600_2018": 0.0010, +"mfv_neu_tau001000um_M0600_2018": 0.0015, +"mfv_neu_tau010000um_M0600_2018": 0.0003, +"mfv_neu_tau030000um_M0600_2018": 0.0001, +"mfv_neu_tau000100um_M0800_2018": 0.0007, +"mfv_neu_tau000300um_M0800_2018": 0.0012, +"mfv_neu_tau001000um_M0800_2018": 0.0004, +"mfv_neu_tau010000um_M0800_2018": 0.0001, +"mfv_neu_tau030000um_M0800_2018": 0.0001, +"mfv_neu_tau000100um_M1200_2018": 0.0004, +"mfv_neu_tau000300um_M1200_2018": 0.0000, +"mfv_neu_tau001000um_M1200_2018": 0.0003, +"mfv_neu_tau010000um_M1200_2018": 0.0000, +"mfv_neu_tau030000um_M1200_2018": 0.0000, +"mfv_neu_tau000100um_M1600_2018": 0.0008, +"mfv_neu_tau000300um_M1600_2018": 0.0002, +"mfv_neu_tau001000um_M1600_2018": 0.0002, +"mfv_neu_tau010000um_M1600_2018": 0.0000, +"mfv_neu_tau030000um_M1600_2018": 0.0000, +"mfv_neu_tau000300um_M3000_2018": 0.0000, +"mfv_neu_tau001000um_M3000_2018": 0.0004, +"mfv_neu_tau030000um_M3000_2018": 0.0000, +"mfv_stopdbardbar_tau000100um_M0200_2018": 0.0414, +"mfv_stopdbardbar_tau000300um_M0200_2018": 0.0394, +"mfv_stopdbardbar_tau001000um_M0200_2018": 0.0180, +"mfv_stopdbardbar_tau010000um_M0200_2018": 0.0054, +"mfv_stopdbardbar_tau030000um_M0200_2018": 0.0050, +"mfv_stopdbardbar_tau000100um_M0300_2018": 0.0241, +"mfv_stopdbardbar_tau000300um_M0300_2018": 0.0306, +"mfv_stopdbardbar_tau001000um_M0300_2018": 0.0143, +"mfv_stopdbardbar_tau010000um_M0300_2018": 0.0024, +"mfv_stopdbardbar_tau030000um_M0300_2018": 0.0012, +"mfv_stopdbardbar_tau000100um_M0400_2018": 0.0205, +"mfv_stopdbardbar_tau000300um_M0400_2018": 0.0207, +"mfv_stopdbardbar_tau001000um_M0400_2018": 0.0114, +"mfv_stopdbardbar_tau010000um_M0400_2018": 0.0015, +"mfv_stopdbardbar_tau000100um_M0600_2018": 0.0156, +"mfv_stopdbardbar_tau000300um_M0600_2018": 0.0117, +"mfv_stopdbardbar_tau001000um_M0600_2018": 0.0063, +"mfv_stopdbardbar_tau010000um_M0600_2018": 0.0010, +"mfv_stopdbardbar_tau030000um_M0600_2018": 0.0004, +"mfv_stopdbardbar_tau000100um_M0800_2018": 0.0102, +"mfv_stopdbardbar_tau000300um_M0800_2018": 0.0104, +"mfv_stopdbardbar_tau001000um_M0800_2018": 0.0047, +"mfv_stopdbardbar_tau010000um_M0800_2018": 0.0005, +"mfv_stopdbardbar_tau030000um_M0800_2018": 0.0001, +"mfv_stopdbardbar_tau000100um_M1200_2018": 0.0111, +"mfv_stopdbardbar_tau000300um_M1200_2018": 0.0085, +"mfv_stopdbardbar_tau001000um_M1200_2018": 0.0051, +"mfv_stopdbardbar_tau010000um_M1200_2018": 0.0003, +"mfv_stopdbardbar_tau030000um_M1200_2018": 0.0001, +"mfv_stopdbardbar_tau000100um_M1600_2018": 0.0091, +"mfv_stopdbardbar_tau000300um_M1600_2018": 0.0074, +"mfv_stopdbardbar_tau001000um_M1600_2018": 0.0047, +"mfv_stopdbardbar_tau010000um_M1600_2018": 0.0004, +"mfv_stopdbardbar_tau030000um_M1600_2018": 0.0002, +"mfv_stopdbardbar_tau001000um_M3000_2018": 0.0035, +"mfv_stopdbardbar_tau010000um_M3000_2018": 0.0002, +"mfv_stopdbardbar_tau030000um_M3000_2018": 0.0001, +"mfv_stopbbarbbar_tau000100um_M0200_2018": 0.0291, +"mfv_stopbbarbbar_tau000300um_M0200_2018": 0.0244, +"mfv_stopbbarbbar_tau001000um_M0200_2018": 0.0066, +"mfv_stopbbarbbar_tau010000um_M0200_2018": 0.0029, +"mfv_stopbbarbbar_tau030000um_M0200_2018": 0.0000, +"mfv_stopbbarbbar_tau000100um_M0300_2018": 0.0338, +"mfv_stopbbarbbar_tau000300um_M0300_2018": 0.0176, +"mfv_stopbbarbbar_tau001000um_M0300_2018": 0.0079, +"mfv_stopbbarbbar_tau010000um_M0300_2018": 0.0026, +"mfv_stopbbarbbar_tau030000um_M0300_2018": 0.0025, +"mfv_stopbbarbbar_tau000100um_M0400_2018": 0.0124, +"mfv_stopbbarbbar_tau000300um_M0400_2018": 0.0096, +"mfv_stopbbarbbar_tau001000um_M0400_2018": 0.0056, +"mfv_stopbbarbbar_tau010000um_M0400_2018": 0.0017, +"mfv_stopbbarbbar_tau030000um_M0400_2018": 0.0007, +"mfv_stopbbarbbar_tau000100um_M0600_2018": 0.0044, +"mfv_stopbbarbbar_tau000300um_M0600_2018": 0.0058, +"mfv_stopbbarbbar_tau001000um_M0600_2018": 0.0043, +"mfv_stopbbarbbar_tau010000um_M0600_2018": 0.0004, +"mfv_stopbbarbbar_tau030000um_M0600_2018": 0.0003, +"mfv_stopbbarbbar_tau000100um_M0800_2018": 0.0043, +"mfv_stopbbarbbar_tau000300um_M0800_2018": 0.0041, +"mfv_stopbbarbbar_tau001000um_M0800_2018": 0.0027, +"mfv_stopbbarbbar_tau010000um_M0800_2018": 0.0003, +"mfv_stopbbarbbar_tau030000um_M0800_2018": 0.0002, +"mfv_stopbbarbbar_tau000100um_M1200_2018": 0.0044, +"mfv_stopbbarbbar_tau000300um_M1200_2018": 0.0032, +"mfv_stopbbarbbar_tau001000um_M1200_2018": 0.0025, +"mfv_stopbbarbbar_tau010000um_M1200_2018": 0.0004, +"mfv_stopbbarbbar_tau030000um_M1200_2018": 0.0002, +"mfv_stopbbarbbar_tau000100um_M1600_2018": 0.0019, +"mfv_stopbbarbbar_tau000300um_M1600_2018": 0.0037, +"mfv_stopbbarbbar_tau001000um_M1600_2018": 0.0025, +"mfv_stopbbarbbar_tau010000um_M1600_2018": 0.0002, +"mfv_stopbbarbbar_tau030000um_M1600_2018": 0.0001, +"mfv_stopbbarbbar_tau001000um_M3000_2018": 0.0020, +"mfv_stopbbarbbar_tau010000um_M3000_2018": 0.0002, +"mfv_stopbbarbbar_tau030000um_M3000_2018": 0.0001, +"mfv_neu_tau000100um_M0200_2017": 0.0312, +"mfv_neu_tau000300um_M0200_2017": 0.0257, +"mfv_neu_tau010000um_M0200_2017": 0.0083, +"mfv_neu_tau030000um_M0200_2017": 0.0073, +"mfv_neu_tau000100um_M0300_2017": 0.0075, +"mfv_neu_tau000300um_M0300_2017": 0.0113, +"mfv_neu_tau001000um_M0300_2017": 0.0092, +"mfv_neu_tau010000um_M0300_2017": 0.0037, +"mfv_neu_tau030000um_M0300_2017": 0.0025, +"mfv_neu_tau000100um_M0400_2017": 0.0070, +"mfv_neu_tau001000um_M0400_2017": 0.0063, +"mfv_neu_tau010000um_M0400_2017": 0.0016, +"mfv_neu_tau030000um_M0400_2017": 0.0013, +"mfv_neu_tau000100um_M0600_2017": 0.0015, +"mfv_neu_tau000300um_M0600_2017": 0.0015, +"mfv_neu_tau001000um_M0600_2017": 0.0017, +"mfv_neu_tau010000um_M0600_2017": 0.0004, +"mfv_neu_tau030000um_M0600_2017": 0.0002, +"mfv_neu_tau000300um_M0800_2017": 0.0003, +"mfv_neu_tau001000um_M0800_2017": 0.0008, +"mfv_neu_tau010000um_M0800_2017": 0.0001, +"mfv_neu_tau030000um_M0800_2017": 0.0000, +"mfv_neu_tau000100um_M1200_2017": 0.0000, +"mfv_neu_tau000300um_M1200_2017": 0.0001, +"mfv_neu_tau001000um_M1200_2017": 0.0003, +"mfv_neu_tau010000um_M1200_2017": 0.0000, +"mfv_neu_tau000100um_M1600_2017": 0.0000, +"mfv_neu_tau000300um_M1600_2017": 0.0000, +"mfv_neu_tau001000um_M1600_2017": 0.0001, +"mfv_neu_tau010000um_M1600_2017": 0.0000, +"mfv_neu_tau030000um_M1600_2017": 0.0000, +"mfv_neu_tau001000um_M3000_2017": 0.0001, +"mfv_neu_tau010000um_M3000_2017": 0.0000, +"mfv_neu_tau030000um_M3000_2017": 0.0000, +"mfv_stopdbardbar_tau000100um_M0200_2017": 0.0275, +"mfv_stopdbardbar_tau000300um_M0200_2017": 0.0269, +"mfv_stopdbardbar_tau001000um_M0200_2017": 0.0196, +"mfv_stopdbardbar_tau010000um_M0200_2017": 0.0081, +"mfv_stopdbardbar_tau030000um_M0200_2017": 0.0035, +"mfv_stopdbardbar_tau000100um_M0300_2017": 0.0182, +"mfv_stopdbardbar_tau000300um_M0300_2017": 0.0187, +"mfv_stopdbardbar_tau001000um_M0300_2017": 0.0179, +"mfv_stopdbardbar_tau010000um_M0300_2017": 0.0043, +"mfv_stopdbardbar_tau030000um_M0300_2017": 0.0023, +"mfv_stopdbardbar_tau000100um_M0400_2017": 0.0148, +"mfv_stopdbardbar_tau000300um_M0400_2017": 0.0112, +"mfv_stopdbardbar_tau001000um_M0400_2017": 0.0116, +"mfv_stopdbardbar_tau010000um_M0400_2017": 0.0020, +"mfv_stopdbardbar_tau030000um_M0400_2017": 0.0008, +"mfv_stopdbardbar_tau000100um_M0600_2017": 0.0068, +"mfv_stopdbardbar_tau000300um_M0600_2017": 0.0064, +"mfv_stopdbardbar_tau010000um_M0600_2017": 0.0005, +"mfv_stopdbardbar_tau030000um_M0600_2017": 0.0004, +"mfv_stopdbardbar_tau000100um_M0800_2017": 0.0060, +"mfv_stopdbardbar_tau000300um_M0800_2017": 0.0040, +"mfv_stopdbardbar_tau001000um_M0800_2017": 0.0035, +"mfv_stopdbardbar_tau010000um_M0800_2017": 0.0005, +"mfv_stopdbardbar_tau030000um_M0800_2017": 0.0002, +"mfv_stopdbardbar_tau000100um_M1200_2017": 0.0037, +"mfv_stopdbardbar_tau000300um_M1200_2017": 0.0022, +"mfv_stopdbardbar_tau001000um_M1200_2017": 0.0029, +"mfv_stopdbardbar_tau010000um_M1200_2017": 0.0003, +"mfv_stopdbardbar_tau030000um_M1200_2017": 0.0002, +"mfv_stopdbardbar_tau001000um_M1600_2017": 0.0018, +"mfv_stopdbardbar_tau010000um_M1600_2017": 0.0005, +"mfv_stopdbardbar_tau030000um_M1600_2017": 0.0001, +"mfv_stopdbardbar_tau001000um_M3000_2017": 0.0012, +"mfv_stopdbardbar_tau010000um_M3000_2017": 0.0003, +"mfv_stopdbardbar_tau030000um_M3000_2017": 0.0000, +"mfv_stopbbarbbar_tau000100um_M0200_2017": 0.0103, +"mfv_stopbbarbbar_tau000300um_M0200_2017": 0.0223, +"mfv_stopbbarbbar_tau001000um_M0200_2017": 0.0112, +"mfv_stopbbarbbar_tau010000um_M0200_2017": 0.0105, +"mfv_stopbbarbbar_tau030000um_M0200_2017": 0.0064, +"mfv_stopbbarbbar_tau000100um_M0300_2017": 0.0093, +"mfv_stopbbarbbar_tau000300um_M0300_2017": 0.0111, +"mfv_stopbbarbbar_tau001000um_M0300_2017": 0.0173, +"mfv_stopbbarbbar_tau010000um_M0300_2017": 0.0043, +"mfv_stopbbarbbar_tau030000um_M0300_2017": 0.0033, +"mfv_stopbbarbbar_tau000100um_M0400_2017": 0.0060, +"mfv_stopbbarbbar_tau000300um_M0400_2017": 0.0069, +"mfv_stopbbarbbar_tau001000um_M0400_2017": 0.0098, +"mfv_stopbbarbbar_tau010000um_M0400_2017": 0.0021, +"mfv_stopbbarbbar_tau030000um_M0400_2017": 0.0009, +"mfv_stopbbarbbar_tau000100um_M0600_2017": 0.0044, +"mfv_stopbbarbbar_tau000300um_M0600_2017": 0.0018, +"mfv_stopbbarbbar_tau001000um_M0600_2017": 0.0036, +"mfv_stopbbarbbar_tau010000um_M0600_2017": 0.0005, +"mfv_stopbbarbbar_tau030000um_M0600_2017": 0.0002, +"mfv_stopbbarbbar_tau000100um_M0800_2017": 0.0018, +"mfv_stopbbarbbar_tau000300um_M0800_2017": 0.0015, +"mfv_stopbbarbbar_tau001000um_M0800_2017": 0.0029, +"mfv_stopbbarbbar_tau010000um_M0800_2017": 0.0005, +"mfv_stopbbarbbar_tau030000um_M0800_2017": 0.0002, +"mfv_stopbbarbbar_tau000100um_M1200_2017": 0.0005, +"mfv_stopbbarbbar_tau000300um_M1200_2017": 0.0014, +"mfv_stopbbarbbar_tau001000um_M1200_2017": 0.0012, +"mfv_stopbbarbbar_tau010000um_M1200_2017": 0.0003, +"mfv_stopbbarbbar_tau030000um_M1200_2017": 0.0001, +"mfv_stopbbarbbar_tau000300um_M1600_2017": 0.0010, +"mfv_stopbbarbbar_tau001000um_M1600_2017": 0.0009, +"mfv_stopbbarbbar_tau010000um_M1600_2017": 0.0002, +"mfv_stopbbarbbar_tau030000um_M1600_2017": 0.0001, +"mfv_stopbbarbbar_tau001000um_M3000_2017": 0.0009, +"mfv_stopbbarbbar_tau010000um_M3000_2017": 0.0001, +"mfv_stopbbarbbar_tau030000um_M3000_2017": 0.0001, +"mfv_neu_tau000100um_M0200_2016": 0.0000, +"mfv_neu_tau000300um_M0200_2016": 0.0000, +"mfv_neu_tau001000um_M0200_2016": 0.0000, +"mfv_neu_tau010000um_M0200_2016": 0.0000, +"mfv_neu_tau030000um_M0200_2016": 0.0000, +"mfv_neu_tau000100um_M0300_2016": 0.0000, +"mfv_neu_tau000300um_M0300_2016": 0.0000, +"mfv_neu_tau001000um_M0300_2016": 0.0000, +"mfv_neu_tau010000um_M0300_2016": 0.0004, +"mfv_neu_tau030000um_M0300_2016": 0.0003, +"mfv_neu_tau000100um_M0400_2016": 0.0000, +"mfv_neu_tau000300um_M0400_2016": 0.0000, +"mfv_neu_tau001000um_M0400_2016": 0.0003, +"mfv_neu_tau010000um_M0400_2016": 0.0001, +"mfv_neu_tau030000um_M0400_2016": 0.0001, +"mfv_neu_tau000100um_M0600_2016": 0.0000, +"mfv_neu_tau000300um_M0600_2016": 0.0000, +"mfv_neu_tau001000um_M0600_2016": 0.0000, +"mfv_neu_tau010000um_M0600_2016": 0.0001, +"mfv_neu_tau030000um_M0600_2016": 0.0001, +"mfv_neu_tau000100um_M0800_2016": 0.0000, +"mfv_neu_tau000300um_M0800_2016": 0.0000, +"mfv_neu_tau001000um_M0800_2016": 0.0000, +"mfv_neu_tau010000um_M0800_2016": 0.0000, +"mfv_neu_tau030000um_M0800_2016": 0.0000, +"mfv_neu_tau000100um_M1200_2016": 0.0000, +"mfv_neu_tau000300um_M1200_2016": 0.0000, +"mfv_neu_tau001000um_M1200_2016": 0.0000, +"mfv_neu_tau010000um_M1200_2016": 0.0000, +"mfv_neu_tau030000um_M1200_2016": 0.0000, +"mfv_neu_tau000100um_M1600_2016": 0.0000, +"mfv_neu_tau000300um_M1600_2016": 0.0000, +"mfv_neu_tau001000um_M1600_2016": 0.0000, +"mfv_neu_tau010000um_M1600_2016": 0.0000, +"mfv_neu_tau030000um_M1600_2016": 0.0000, +"mfv_neu_tau000300um_M3000_2016": 0.0000, +"mfv_neu_tau001000um_M3000_2016": 0.0000, +"mfv_neu_tau010000um_M3000_2016": 0.0000, +"mfv_neu_tau030000um_M3000_2016": 0.0000, +"mfv_stopdbardbar_tau000100um_M0200_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2016": 0.0006, +"mfv_stopdbardbar_tau001000um_M0200_2016": 0.0008, +"mfv_stopdbardbar_tau010000um_M0200_2016": 0.0011, +"mfv_stopdbardbar_tau030000um_M0200_2016": 0.0000, +"mfv_stopdbardbar_tau000100um_M0300_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0300_2016": 0.0003, +"mfv_stopdbardbar_tau001000um_M0300_2016": 0.0006, +"mfv_stopdbardbar_tau010000um_M0300_2016": 0.0000, +"mfv_stopdbardbar_tau030000um_M0300_2016": 0.0002, +"mfv_stopdbardbar_tau000100um_M0400_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0400_2016": 0.0002, +"mfv_stopdbardbar_tau001000um_M0400_2016": 0.0001, +"mfv_stopdbardbar_tau010000um_M0400_2016": 0.0001, +"mfv_stopdbardbar_tau030000um_M0400_2016": 0.0001, +"mfv_stopdbardbar_tau000100um_M0600_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0600_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M0600_2016": 0.0000, +"mfv_stopdbardbar_tau010000um_M0600_2016": 0.0001, +"mfv_stopdbardbar_tau030000um_M0600_2016": 0.0000, +"mfv_stopdbardbar_tau000100um_M0800_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0800_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M0800_2016": 0.0001, +"mfv_stopdbardbar_tau010000um_M0800_2016": 0.0001, +"mfv_stopdbardbar_tau030000um_M0800_2016": 0.0000, +"mfv_stopdbardbar_tau000100um_M1200_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M1200_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M1200_2016": 0.0002, +"mfv_stopdbardbar_tau010000um_M1200_2016": 0.0000, +"mfv_stopdbardbar_tau030000um_M1200_2016": 0.0000, +"mfv_stopdbardbar_tau000100um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau010000um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau030000um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M3000_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M3000_2016": 0.0000, +"mfv_stopdbardbar_tau030000um_M3000_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0200_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0200_2016": 0.0015, +"mfv_stopbbarbbar_tau010000um_M0200_2016": 0.0000, +"mfv_stopbbarbbar_tau030000um_M0200_2016": 0.0000, +"mfv_stopbbarbbar_tau000100um_M0300_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0300_2016": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0300_2016": 0.0009, +"mfv_stopbbarbbar_tau030000um_M0300_2016": 0.0000, +"mfv_stopbbarbbar_tau000100um_M0400_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0400_2016": 0.0005, +"mfv_stopbbarbbar_tau010000um_M0400_2016": 0.0002, +"mfv_stopbbarbbar_tau030000um_M0400_2016": 0.0002, +"mfv_stopbbarbbar_tau000100um_M0600_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0600_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0600_2016": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0600_2016": 0.0000, +"mfv_stopbbarbbar_tau030000um_M0600_2016": 0.0000, +"mfv_stopbbarbbar_tau000100um_M0800_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0800_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0800_2016": 0.0002, +"mfv_stopbbarbbar_tau010000um_M0800_2016": 0.0000, +"mfv_stopbbarbbar_tau030000um_M0800_2016": 0.0000, +"mfv_stopbbarbbar_tau000100um_M1200_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1200_2016": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1200_2016": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1200_2016": 0.0000, +"mfv_stopbbarbbar_tau000100um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M3000_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M3000_2016": 0.0000, +"mfv_stopbbarbbar_tau010000um_M3000_2016": 0.0000, +"mfv_stopbbarbbar_tau030000um_M3000_2016": 0.0000, +"mfv_neu_tau000100um_M0200_2016APV": 0.0000, +"mfv_neu_tau000300um_M0200_2016APV": 0.0000, +"mfv_neu_tau001000um_M0200_2016APV": 0.0000, +"mfv_neu_tau010000um_M0200_2016APV": 0.0000, +"mfv_neu_tau030000um_M0200_2016APV": 0.0000, +"mfv_neu_tau000100um_M0300_2016APV": 0.0000, +"mfv_neu_tau000300um_M0300_2016APV": 0.0000, +"mfv_neu_tau001000um_M0300_2016APV": 0.0000, +"mfv_neu_tau010000um_M0300_2016APV": 0.0007, +"mfv_neu_tau030000um_M0300_2016APV": 0.0000, +"mfv_neu_tau000100um_M0400_2016APV": 0.0000, +"mfv_neu_tau000300um_M0400_2016APV": 0.0000, +"mfv_neu_tau001000um_M0400_2016APV": 0.0005, +"mfv_neu_tau010000um_M0400_2016APV": 0.0006, +"mfv_neu_tau030000um_M0400_2016APV": 0.0003, +"mfv_neu_tau000100um_M0600_2016APV": 0.0000, +"mfv_neu_tau000300um_M0600_2016APV": 0.0000, +"mfv_neu_tau001000um_M0600_2016APV": 0.0003, +"mfv_neu_tau010000um_M0600_2016APV": 0.0002, +"mfv_neu_tau030000um_M0600_2016APV": 0.0006, +"mfv_neu_tau000100um_M0800_2016APV": 0.0000, +"mfv_neu_tau000300um_M0800_2016APV": 0.0000, +"mfv_neu_tau001000um_M0800_2016APV": 0.0000, +"mfv_neu_tau010000um_M0800_2016APV": 0.0002, +"mfv_neu_tau030000um_M0800_2016APV": 0.0000, +"mfv_neu_tau000100um_M1200_2016APV": 0.0000, +"mfv_neu_tau000300um_M1200_2016APV": 0.0000, +"mfv_neu_tau001000um_M1200_2016APV": 0.0000, +"mfv_neu_tau010000um_M1200_2016APV": 0.0000, +"mfv_neu_tau000100um_M1600_2016APV": 0.0000, +"mfv_neu_tau000300um_M1600_2016APV": 0.0000, +"mfv_neu_tau001000um_M1600_2016APV": 0.0000, +"mfv_neu_tau010000um_M1600_2016APV": 0.0000, +"mfv_neu_tau030000um_M1600_2016APV": 0.0000, +"mfv_neu_tau001000um_M3000_2016APV": 0.0000, +"mfv_neu_tau010000um_M3000_2016APV": 0.0000, +"mfv_neu_tau030000um_M3000_2016APV": 0.0000, +"mfv_stopdbardbar_tau000100um_M0200_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2016APV": 0.0007, +"mfv_stopdbardbar_tau001000um_M0200_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M0200_2016APV": 0.0000, +"mfv_stopdbardbar_tau030000um_M0200_2016APV": 0.0000, +"mfv_stopdbardbar_tau000100um_M0300_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0300_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M0300_2016APV": 0.0002, +"mfv_stopdbardbar_tau010000um_M0300_2016APV": 0.0000, +"mfv_stopdbardbar_tau030000um_M0300_2016APV": 0.0000, +"mfv_stopdbardbar_tau000100um_M0400_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0400_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M0400_2016APV": 0.0004, +"mfv_stopdbardbar_tau030000um_M0400_2016APV": 0.0003, +"mfv_stopdbardbar_tau000100um_M0600_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0600_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M0600_2016APV": 0.0002, +"mfv_stopdbardbar_tau010000um_M0600_2016APV": 0.0004, +"mfv_stopdbardbar_tau030000um_M0600_2016APV": 0.0000, +"mfv_stopdbardbar_tau000100um_M0800_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0800_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M0800_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M0800_2016APV": 0.0000, +"mfv_stopdbardbar_tau030000um_M0800_2016APV": 0.0000, +"mfv_stopdbardbar_tau000100um_M1200_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M1200_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M1200_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M1200_2016APV": 0.0000, +"mfv_stopdbardbar_tau030000um_M1200_2016APV": 0.0004, +"mfv_stopdbardbar_tau000100um_M1600_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M1600_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M1600_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M1600_2016APV": 0.0000, +"mfv_stopdbardbar_tau030000um_M1600_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M3000_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M3000_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M3000_2016APV": 0.0000, +"mfv_stopdbardbar_tau030000um_M3000_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000100um_M0200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau030000um_M0200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000100um_M0300_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0300_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0300_2016APV": 0.0005, +"mfv_stopbbarbbar_tau030000um_M0300_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000100um_M0400_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0400_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0400_2016APV": 0.0000, +"mfv_stopbbarbbar_tau030000um_M0400_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000100um_M0600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau030000um_M0600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000100um_M0800_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0800_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0800_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0800_2016APV": 0.0000, +"mfv_stopbbarbbar_tau030000um_M0800_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000100um_M1200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000100um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M3000_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M3000_2016APV": 0.0000, +"mfv_stopbbarbbar_tau030000um_M3000_2016APV": 0.0000, +} + +bjet_sf_avg_uncerts = { +"ggHToSSTodddd_tau1mm_M55_2018": 0.0197, +"ggHToSSTodddd_tau10mm_M55_2018": 0.0102, +"ggHToSSTodddd_tau100mm_M55_2018": 0.0000, +"ggHToSSTodddd_tau1mm_M55_2017": 0.0153, +"ggHToSSTodddd_tau10mm_M55_2017": 0.0055, +"ggHToSSTodddd_tau100mm_M55_2017": 0.0000, +"ggHToSSTodddd_tau1mm_M55_2016": 0.0210, +"ggHToSSTodddd_tau10mm_M55_2016": 0.0062, +"ggHToSSTodddd_tau1mm_M55_2016APV": 0.0096, +"ggHToSSTodddd_tau10mm_M55_2016APV": 0.0074, +"ggHToSSTodddd_tau100mm_M55_2016APV": 0.0000, +"mfv_neu_tau000100um_M0200_2018": 0.0056, +"mfv_neu_tau000300um_M0200_2018": 0.0039, +"mfv_neu_tau010000um_M0200_2018": 0.0031, +"mfv_neu_tau030000um_M0200_2018": 0.0021, +"mfv_neu_tau000100um_M0300_2018": 0.0008, +"mfv_neu_tau000300um_M0300_2018": 0.0014, +"mfv_neu_tau001000um_M0300_2018": 0.0012, +"mfv_neu_tau010000um_M0300_2018": 0.0006, +"mfv_neu_tau030000um_M0300_2018": 0.0007, +"mfv_neu_tau000100um_M0400_2018": 0.0004, +"mfv_neu_tau000300um_M0400_2018": 0.0008, +"mfv_neu_tau001000um_M0400_2018": 0.0007, +"mfv_neu_tau010000um_M0400_2018": 0.0003, +"mfv_neu_tau030000um_M0400_2018": 0.0002, +"mfv_neu_tau000100um_M0600_2018": 0.0007, +"mfv_neu_tau001000um_M0600_2018": 0.0003, +"mfv_neu_tau010000um_M0600_2018": 0.0001, +"mfv_neu_tau030000um_M0600_2018": 0.0001, +"mfv_neu_tau000100um_M0800_2018": 0.0004, +"mfv_neu_tau000300um_M0800_2018": 0.0001, +"mfv_neu_tau001000um_M0800_2018": 0.0001, +"mfv_neu_tau010000um_M0800_2018": 0.0000, +"mfv_neu_tau030000um_M0800_2018": 0.0000, +"mfv_neu_tau000100um_M1200_2018": 0.0003, +"mfv_neu_tau000300um_M1200_2018": 0.0002, +"mfv_neu_tau001000um_M1200_2018": 0.0000, +"mfv_neu_tau010000um_M1200_2018": 0.0000, +"mfv_neu_tau030000um_M1200_2018": 0.0000, +"mfv_neu_tau000100um_M1600_2018": 0.0011, +"mfv_neu_tau000300um_M1600_2018": 0.0003, +"mfv_neu_tau001000um_M1600_2018": 0.0002, +"mfv_neu_tau010000um_M1600_2018": 0.0000, +"mfv_neu_tau030000um_M1600_2018": 0.0000, +"mfv_neu_tau000300um_M3000_2018": 0.0012, +"mfv_neu_tau001000um_M3000_2018": 0.0006, +"mfv_neu_tau030000um_M3000_2018": 0.0000, +"mfv_stopdbardbar_tau000100um_M0200_2018": 0.0049, +"mfv_stopdbardbar_tau000300um_M0200_2018": 0.0066, +"mfv_stopdbardbar_tau001000um_M0200_2018": 0.0069, +"mfv_stopdbardbar_tau010000um_M0200_2018": 0.0051, +"mfv_stopdbardbar_tau030000um_M0200_2018": 0.0016, +"mfv_stopdbardbar_tau000100um_M0300_2018": 0.0070, +"mfv_stopdbardbar_tau000300um_M0300_2018": 0.0062, +"mfv_stopdbardbar_tau001000um_M0300_2018": 0.0046, +"mfv_stopdbardbar_tau010000um_M0300_2018": 0.0021, +"mfv_stopdbardbar_tau030000um_M0300_2018": 0.0008, +"mfv_stopdbardbar_tau000100um_M0400_2018": 0.0099, +"mfv_stopdbardbar_tau000300um_M0400_2018": 0.0062, +"mfv_stopdbardbar_tau001000um_M0400_2018": 0.0044, +"mfv_stopdbardbar_tau010000um_M0400_2018": 0.0009, +"mfv_stopdbardbar_tau000100um_M0600_2018": 0.0150, +"mfv_stopdbardbar_tau000300um_M0600_2018": 0.0079, +"mfv_stopdbardbar_tau001000um_M0600_2018": 0.0040, +"mfv_stopdbardbar_tau010000um_M0600_2018": 0.0006, +"mfv_stopdbardbar_tau030000um_M0600_2018": 0.0003, +"mfv_stopdbardbar_tau000100um_M0800_2018": 0.0133, +"mfv_stopdbardbar_tau000300um_M0800_2018": 0.0085, +"mfv_stopdbardbar_tau001000um_M0800_2018": 0.0048, +"mfv_stopdbardbar_tau010000um_M0800_2018": 0.0005, +"mfv_stopdbardbar_tau030000um_M0800_2018": 0.0002, +"mfv_stopdbardbar_tau000100um_M1200_2018": 0.0191, +"mfv_stopdbardbar_tau000300um_M1200_2018": 0.0108, +"mfv_stopdbardbar_tau001000um_M1200_2018": 0.0060, +"mfv_stopdbardbar_tau010000um_M1200_2018": 0.0007, +"mfv_stopdbardbar_tau030000um_M1200_2018": 0.0004, +"mfv_stopdbardbar_tau000100um_M1600_2018": 0.0196, +"mfv_stopdbardbar_tau000300um_M1600_2018": 0.0131, +"mfv_stopdbardbar_tau001000um_M1600_2018": 0.0077, +"mfv_stopdbardbar_tau010000um_M1600_2018": 0.0008, +"mfv_stopdbardbar_tau030000um_M1600_2018": 0.0003, +"mfv_stopdbardbar_tau001000um_M3000_2018": 0.0075, +"mfv_stopdbardbar_tau010000um_M3000_2018": 0.0006, +"mfv_stopdbardbar_tau030000um_M3000_2018": 0.0002, +"mfv_stopbbarbbar_tau000100um_M0200_2018": 0.0072, +"mfv_stopbbarbbar_tau000300um_M0200_2018": 0.0063, +"mfv_stopbbarbbar_tau001000um_M0200_2018": 0.0088, +"mfv_stopbbarbbar_tau010000um_M0200_2018": 0.0045, +"mfv_stopbbarbbar_tau030000um_M0200_2018": 0.0006, +"mfv_stopbbarbbar_tau000100um_M0300_2018": 0.0056, +"mfv_stopbbarbbar_tau000300um_M0300_2018": 0.0038, +"mfv_stopbbarbbar_tau001000um_M0300_2018": 0.0051, +"mfv_stopbbarbbar_tau010000um_M0300_2018": 0.0019, +"mfv_stopbbarbbar_tau030000um_M0300_2018": 0.0010, +"mfv_stopbbarbbar_tau000100um_M0400_2018": 0.0035, +"mfv_stopbbarbbar_tau000300um_M0400_2018": 0.0029, +"mfv_stopbbarbbar_tau001000um_M0400_2018": 0.0022, +"mfv_stopbbarbbar_tau010000um_M0400_2018": 0.0010, +"mfv_stopbbarbbar_tau030000um_M0400_2018": 0.0004, +"mfv_stopbbarbbar_tau000100um_M0600_2018": 0.0011, +"mfv_stopbbarbbar_tau000300um_M0600_2018": 0.0023, +"mfv_stopbbarbbar_tau001000um_M0600_2018": 0.0011, +"mfv_stopbbarbbar_tau010000um_M0600_2018": 0.0004, +"mfv_stopbbarbbar_tau030000um_M0600_2018": 0.0002, +"mfv_stopbbarbbar_tau000100um_M0800_2018": 0.0052, +"mfv_stopbbarbbar_tau000300um_M0800_2018": 0.0018, +"mfv_stopbbarbbar_tau001000um_M0800_2018": 0.0012, +"mfv_stopbbarbbar_tau010000um_M0800_2018": 0.0004, +"mfv_stopbbarbbar_tau030000um_M0800_2018": 0.0002, +"mfv_stopbbarbbar_tau000100um_M1200_2018": 0.0083, +"mfv_stopbbarbbar_tau000300um_M1200_2018": 0.0042, +"mfv_stopbbarbbar_tau001000um_M1200_2018": 0.0016, +"mfv_stopbbarbbar_tau010000um_M1200_2018": 0.0004, +"mfv_stopbbarbbar_tau030000um_M1200_2018": 0.0002, +"mfv_stopbbarbbar_tau000100um_M1600_2018": 0.0087, +"mfv_stopbbarbbar_tau000300um_M1600_2018": 0.0068, +"mfv_stopbbarbbar_tau001000um_M1600_2018": 0.0032, +"mfv_stopbbarbbar_tau010000um_M1600_2018": 0.0005, +"mfv_stopbbarbbar_tau030000um_M1600_2018": 0.0003, +"mfv_stopbbarbbar_tau001000um_M3000_2018": 0.0061, +"mfv_stopbbarbbar_tau010000um_M3000_2018": 0.0008, +"mfv_stopbbarbbar_tau030000um_M3000_2018": 0.0002, +"mfv_neu_tau000100um_M0200_2017": 0.0063, +"mfv_neu_tau000300um_M0200_2017": 0.0039, +"mfv_neu_tau010000um_M0200_2017": 0.0009, +"mfv_neu_tau030000um_M0200_2017": 0.0024, +"mfv_neu_tau000100um_M0300_2017": 0.0000, +"mfv_neu_tau000300um_M0300_2017": 0.0005, +"mfv_neu_tau001000um_M0300_2017": 0.0011, +"mfv_neu_tau010000um_M0300_2017": 0.0003, +"mfv_neu_tau030000um_M0300_2017": 0.0003, +"mfv_neu_tau000100um_M0400_2017": 0.0004, +"mfv_neu_tau001000um_M0400_2017": 0.0005, +"mfv_neu_tau010000um_M0400_2017": 0.0002, +"mfv_neu_tau030000um_M0400_2017": 0.0001, +"mfv_neu_tau000100um_M0600_2017": 0.0000, +"mfv_neu_tau000300um_M0600_2017": 0.0002, +"mfv_neu_tau001000um_M0600_2017": 0.0004, +"mfv_neu_tau010000um_M0600_2017": 0.0000, +"mfv_neu_tau030000um_M0600_2017": 0.0001, +"mfv_neu_tau000300um_M0800_2017": 0.0001, +"mfv_neu_tau001000um_M0800_2017": 0.0001, +"mfv_neu_tau010000um_M0800_2017": 0.0000, +"mfv_neu_tau030000um_M0800_2017": 0.0000, +"mfv_neu_tau000100um_M1200_2017": 0.0000, +"mfv_neu_tau000300um_M1200_2017": 0.0001, +"mfv_neu_tau001000um_M1200_2017": 0.0000, +"mfv_neu_tau010000um_M1200_2017": 0.0000, +"mfv_neu_tau000100um_M1600_2017": 0.0002, +"mfv_neu_tau000300um_M1600_2017": 0.0001, +"mfv_neu_tau001000um_M1600_2017": 0.0001, +"mfv_neu_tau010000um_M1600_2017": 0.0000, +"mfv_neu_tau030000um_M1600_2017": 0.0000, +"mfv_neu_tau001000um_M3000_2017": 0.0000, +"mfv_neu_tau010000um_M3000_2017": 0.0000, +"mfv_neu_tau030000um_M3000_2017": 0.0000, +"mfv_stopdbardbar_tau000100um_M0200_2017": 0.0039, +"mfv_stopdbardbar_tau000300um_M0200_2017": 0.0051, +"mfv_stopdbardbar_tau001000um_M0200_2017": 0.0059, +"mfv_stopdbardbar_tau010000um_M0200_2017": 0.0030, +"mfv_stopdbardbar_tau030000um_M0200_2017": 0.0036, +"mfv_stopdbardbar_tau000100um_M0300_2017": 0.0037, +"mfv_stopdbardbar_tau000300um_M0300_2017": 0.0037, +"mfv_stopdbardbar_tau001000um_M0300_2017": 0.0047, +"mfv_stopdbardbar_tau010000um_M0300_2017": 0.0012, +"mfv_stopdbardbar_tau030000um_M0300_2017": 0.0006, +"mfv_stopdbardbar_tau000100um_M0400_2017": 0.0023, +"mfv_stopdbardbar_tau000300um_M0400_2017": 0.0033, +"mfv_stopdbardbar_tau001000um_M0400_2017": 0.0037, +"mfv_stopdbardbar_tau010000um_M0400_2017": 0.0005, +"mfv_stopdbardbar_tau030000um_M0400_2017": 0.0003, +"mfv_stopdbardbar_tau000100um_M0600_2017": 0.0033, +"mfv_stopdbardbar_tau000300um_M0600_2017": 0.0032, +"mfv_stopdbardbar_tau010000um_M0600_2017": 0.0003, +"mfv_stopdbardbar_tau030000um_M0600_2017": 0.0002, +"mfv_stopdbardbar_tau000100um_M0800_2017": 0.0045, +"mfv_stopdbardbar_tau000300um_M0800_2017": 0.0034, +"mfv_stopdbardbar_tau001000um_M0800_2017": 0.0026, +"mfv_stopdbardbar_tau010000um_M0800_2017": 0.0002, +"mfv_stopdbardbar_tau030000um_M0800_2017": 0.0001, +"mfv_stopdbardbar_tau000100um_M1200_2017": 0.0075, +"mfv_stopdbardbar_tau000300um_M1200_2017": 0.0027, +"mfv_stopdbardbar_tau001000um_M1200_2017": 0.0023, +"mfv_stopdbardbar_tau010000um_M1200_2017": 0.0002, +"mfv_stopdbardbar_tau030000um_M1200_2017": 0.0002, +"mfv_stopdbardbar_tau001000um_M1600_2017": 0.0015, +"mfv_stopdbardbar_tau010000um_M1600_2017": 0.0003, +"mfv_stopdbardbar_tau030000um_M1600_2017": 0.0001, +"mfv_stopdbardbar_tau001000um_M3000_2017": 0.0020, +"mfv_stopdbardbar_tau010000um_M3000_2017": 0.0003, +"mfv_stopdbardbar_tau030000um_M3000_2017": 0.0001, +"mfv_stopbbarbbar_tau000100um_M0200_2017": 0.0033, +"mfv_stopbbarbbar_tau000300um_M0200_2017": 0.0057, +"mfv_stopbbarbbar_tau001000um_M0200_2017": 0.0074, +"mfv_stopbbarbbar_tau010000um_M0200_2017": 0.0042, +"mfv_stopbbarbbar_tau030000um_M0200_2017": 0.0026, +"mfv_stopbbarbbar_tau000100um_M0300_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2017": 0.0021, +"mfv_stopbbarbbar_tau001000um_M0300_2017": 0.0028, +"mfv_stopbbarbbar_tau010000um_M0300_2017": 0.0011, +"mfv_stopbbarbbar_tau030000um_M0300_2017": 0.0005, +"mfv_stopbbarbbar_tau000100um_M0400_2017": 0.0006, +"mfv_stopbbarbbar_tau000300um_M0400_2017": 0.0014, +"mfv_stopbbarbbar_tau001000um_M0400_2017": 0.0015, +"mfv_stopbbarbbar_tau010000um_M0400_2017": 0.0005, +"mfv_stopbbarbbar_tau030000um_M0400_2017": 0.0002, +"mfv_stopbbarbbar_tau000100um_M0600_2017": 0.0006, +"mfv_stopbbarbbar_tau000300um_M0600_2017": 0.0005, +"mfv_stopbbarbbar_tau001000um_M0600_2017": 0.0008, +"mfv_stopbbarbbar_tau010000um_M0600_2017": 0.0001, +"mfv_stopbbarbbar_tau030000um_M0600_2017": 0.0001, +"mfv_stopbbarbbar_tau000100um_M0800_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0800_2017": 0.0004, +"mfv_stopbbarbbar_tau001000um_M0800_2017": 0.0008, +"mfv_stopbbarbbar_tau010000um_M0800_2017": 0.0001, +"mfv_stopbbarbbar_tau030000um_M0800_2017": 0.0000, +"mfv_stopbbarbbar_tau000100um_M1200_2017": 0.0007, +"mfv_stopbbarbbar_tau000300um_M1200_2017": 0.0005, +"mfv_stopbbarbbar_tau001000um_M1200_2017": 0.0006, +"mfv_stopbbarbbar_tau010000um_M1200_2017": 0.0001, +"mfv_stopbbarbbar_tau030000um_M1200_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1600_2017": 0.0008, +"mfv_stopbbarbbar_tau001000um_M1600_2017": 0.0003, +"mfv_stopbbarbbar_tau010000um_M1600_2017": 0.0001, +"mfv_stopbbarbbar_tau030000um_M1600_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M3000_2017": 0.0009, +"mfv_stopbbarbbar_tau010000um_M3000_2017": 0.0001, +"mfv_stopbbarbbar_tau030000um_M3000_2017": 0.0000, +"mfv_neu_tau000100um_M0200_2016": 0.0000, +"mfv_neu_tau000300um_M0200_2016": 0.0068, +"mfv_neu_tau001000um_M0200_2016": 0.0078, +"mfv_neu_tau010000um_M0200_2016": 0.0058, +"mfv_neu_tau030000um_M0200_2016": 0.0017, +"mfv_neu_tau000100um_M0300_2016": 0.0071, +"mfv_neu_tau000300um_M0300_2016": 0.0078, +"mfv_neu_tau001000um_M0300_2016": 0.0062, +"mfv_neu_tau010000um_M0300_2016": 0.0008, +"mfv_neu_tau030000um_M0300_2016": 0.0004, +"mfv_neu_tau000100um_M0400_2016": 0.0034, +"mfv_neu_tau000300um_M0400_2016": 0.0054, +"mfv_neu_tau001000um_M0400_2016": 0.0039, +"mfv_neu_tau010000um_M0400_2016": 0.0004, +"mfv_neu_tau030000um_M0400_2016": 0.0003, +"mfv_neu_tau000100um_M0600_2016": 0.0000, +"mfv_neu_tau000300um_M0600_2016": 0.0014, +"mfv_neu_tau001000um_M0600_2016": 0.0009, +"mfv_neu_tau010000um_M0600_2016": 0.0002, +"mfv_neu_tau030000um_M0600_2016": 0.0002, +"mfv_neu_tau000100um_M0800_2016": 0.0011, +"mfv_neu_tau000300um_M0800_2016": 0.0011, +"mfv_neu_tau001000um_M0800_2016": 0.0003, +"mfv_neu_tau010000um_M0800_2016": 0.0001, +"mfv_neu_tau030000um_M0800_2016": 0.0000, +"mfv_neu_tau000100um_M1200_2016": 0.0000, +"mfv_neu_tau000300um_M1200_2016": 0.0004, +"mfv_neu_tau001000um_M1200_2016": 0.0004, +"mfv_neu_tau010000um_M1200_2016": 0.0000, +"mfv_neu_tau030000um_M1200_2016": 0.0000, +"mfv_neu_tau000100um_M1600_2016": 0.0000, +"mfv_neu_tau000300um_M1600_2016": 0.0000, +"mfv_neu_tau001000um_M1600_2016": 0.0000, +"mfv_neu_tau010000um_M1600_2016": 0.0000, +"mfv_neu_tau030000um_M1600_2016": 0.0000, +"mfv_neu_tau000300um_M3000_2016": 0.0000, +"mfv_neu_tau001000um_M3000_2016": 0.0001, +"mfv_neu_tau010000um_M3000_2016": 0.0000, +"mfv_neu_tau030000um_M3000_2016": 0.0000, +"mfv_stopdbardbar_tau000100um_M0200_2016": 0.0114, +"mfv_stopdbardbar_tau000300um_M0200_2016": 0.0142, +"mfv_stopdbardbar_tau001000um_M0200_2016": 0.0109, +"mfv_stopdbardbar_tau010000um_M0200_2016": 0.0028, +"mfv_stopdbardbar_tau030000um_M0200_2016": 0.0020, +"mfv_stopdbardbar_tau000100um_M0300_2016": 0.0057, +"mfv_stopdbardbar_tau000300um_M0300_2016": 0.0102, +"mfv_stopdbardbar_tau001000um_M0300_2016": 0.0060, +"mfv_stopdbardbar_tau010000um_M0300_2016": 0.0020, +"mfv_stopdbardbar_tau030000um_M0300_2016": 0.0010, +"mfv_stopdbardbar_tau000100um_M0400_2016": 0.0100, +"mfv_stopdbardbar_tau000300um_M0400_2016": 0.0077, +"mfv_stopdbardbar_tau001000um_M0400_2016": 0.0045, +"mfv_stopdbardbar_tau010000um_M0400_2016": 0.0010, +"mfv_stopdbardbar_tau030000um_M0400_2016": 0.0003, +"mfv_stopdbardbar_tau000100um_M0600_2016": 0.0077, +"mfv_stopdbardbar_tau000300um_M0600_2016": 0.0074, +"mfv_stopdbardbar_tau001000um_M0600_2016": 0.0033, +"mfv_stopdbardbar_tau010000um_M0600_2016": 0.0006, +"mfv_stopdbardbar_tau030000um_M0600_2016": 0.0002, +"mfv_stopdbardbar_tau000100um_M0800_2016": 0.0081, +"mfv_stopdbardbar_tau000300um_M0800_2016": 0.0061, +"mfv_stopdbardbar_tau001000um_M0800_2016": 0.0024, +"mfv_stopdbardbar_tau010000um_M0800_2016": 0.0003, +"mfv_stopdbardbar_tau030000um_M0800_2016": 0.0003, +"mfv_stopdbardbar_tau000100um_M1200_2016": 0.0144, +"mfv_stopdbardbar_tau000300um_M1200_2016": 0.0061, +"mfv_stopdbardbar_tau001000um_M1200_2016": 0.0033, +"mfv_stopdbardbar_tau010000um_M1200_2016": 0.0005, +"mfv_stopdbardbar_tau030000um_M1200_2016": 0.0002, +"mfv_stopdbardbar_tau000100um_M1600_2016": 0.0084, +"mfv_stopdbardbar_tau000300um_M1600_2016": 0.0075, +"mfv_stopdbardbar_tau001000um_M1600_2016": 0.0031, +"mfv_stopdbardbar_tau010000um_M1600_2016": 0.0005, +"mfv_stopdbardbar_tau030000um_M1600_2016": 0.0002, +"mfv_stopdbardbar_tau000300um_M3000_2016": 0.0057, +"mfv_stopdbardbar_tau001000um_M3000_2016": 0.0041, +"mfv_stopdbardbar_tau030000um_M3000_2016": 0.0003, +"mfv_stopbbarbbar_tau000300um_M0200_2016": 0.0109, +"mfv_stopbbarbbar_tau001000um_M0200_2016": 0.0148, +"mfv_stopbbarbbar_tau010000um_M0200_2016": 0.0095, +"mfv_stopbbarbbar_tau030000um_M0200_2016": 0.0046, +"mfv_stopbbarbbar_tau000100um_M0300_2016": 0.0135, +"mfv_stopbbarbbar_tau000300um_M0300_2016": 0.0099, +"mfv_stopbbarbbar_tau001000um_M0300_2016": 0.0079, +"mfv_stopbbarbbar_tau010000um_M0300_2016": 0.0013, +"mfv_stopbbarbbar_tau030000um_M0300_2016": 0.0013, +"mfv_stopbbarbbar_tau000100um_M0400_2016": 0.0068, +"mfv_stopbbarbbar_tau000300um_M0400_2016": 0.0055, +"mfv_stopbbarbbar_tau001000um_M0400_2016": 0.0029, +"mfv_stopbbarbbar_tau010000um_M0400_2016": 0.0006, +"mfv_stopbbarbbar_tau030000um_M0400_2016": 0.0005, +"mfv_stopbbarbbar_tau000100um_M0600_2016": 0.0020, +"mfv_stopbbarbbar_tau000300um_M0600_2016": 0.0017, +"mfv_stopbbarbbar_tau001000um_M0600_2016": 0.0017, +"mfv_stopbbarbbar_tau010000um_M0600_2016": 0.0002, +"mfv_stopbbarbbar_tau030000um_M0600_2016": 0.0002, +"mfv_stopbbarbbar_tau000100um_M0800_2016": 0.0011, +"mfv_stopbbarbbar_tau000300um_M0800_2016": 0.0025, +"mfv_stopbbarbbar_tau001000um_M0800_2016": 0.0006, +"mfv_stopbbarbbar_tau010000um_M0800_2016": 0.0002, +"mfv_stopbbarbbar_tau030000um_M0800_2016": 0.0001, +"mfv_stopbbarbbar_tau000100um_M1200_2016": 0.0007, +"mfv_stopbbarbbar_tau001000um_M1200_2016": 0.0009, +"mfv_stopbbarbbar_tau010000um_M1200_2016": 0.0001, +"mfv_stopbbarbbar_tau030000um_M1200_2016": 0.0001, +"mfv_stopbbarbbar_tau000100um_M1600_2016": 0.0014, +"mfv_stopbbarbbar_tau000300um_M1600_2016": 0.0031, +"mfv_stopbbarbbar_tau001000um_M1600_2016": 0.0012, +"mfv_stopbbarbbar_tau010000um_M1600_2016": 0.0002, +"mfv_stopbbarbbar_tau030000um_M1600_2016": 0.0001, +"mfv_stopbbarbbar_tau000300um_M3000_2016": 0.0022, +"mfv_stopbbarbbar_tau001000um_M3000_2016": 0.0024, +"mfv_stopbbarbbar_tau010000um_M3000_2016": 0.0004, +"mfv_stopbbarbbar_tau030000um_M3000_2016": 0.0002, +"mfv_neu_tau000100um_M0200_2016APV": 0.0349, +"mfv_neu_tau000300um_M0200_2016APV": 0.0069, +"mfv_neu_tau001000um_M0200_2016APV": 0.0029, +"mfv_neu_tau010000um_M0200_2016APV": 0.0011, +"mfv_neu_tau030000um_M0200_2016APV": 0.0013, +"mfv_neu_tau000100um_M0300_2016APV": 0.0000, +"mfv_neu_tau000300um_M0300_2016APV": 0.0038, +"mfv_neu_tau001000um_M0300_2016APV": 0.0027, +"mfv_neu_tau010000um_M0300_2016APV": 0.0006, +"mfv_neu_tau030000um_M0300_2016APV": 0.0008, +"mfv_neu_tau000100um_M0400_2016APV": 0.0035, +"mfv_neu_tau000300um_M0400_2016APV": 0.0017, +"mfv_neu_tau001000um_M0400_2016APV": 0.0018, +"mfv_neu_tau010000um_M0400_2016APV": 0.0005, +"mfv_neu_tau030000um_M0400_2016APV": 0.0005, +"mfv_neu_tau000100um_M0600_2016APV": 0.0000, +"mfv_neu_tau000300um_M0600_2016APV": 0.0004, +"mfv_neu_tau001000um_M0600_2016APV": 0.0013, +"mfv_neu_tau010000um_M0600_2016APV": 0.0000, +"mfv_neu_tau030000um_M0600_2016APV": 0.0004, +"mfv_neu_tau000100um_M0800_2016APV": 0.0000, +"mfv_neu_tau000300um_M0800_2016APV": 0.0003, +"mfv_neu_tau001000um_M0800_2016APV": 0.0004, +"mfv_neu_tau010000um_M0800_2016APV": 0.0001, +"mfv_neu_tau030000um_M0800_2016APV": 0.0002, +"mfv_neu_tau000100um_M1200_2016APV": 0.0000, +"mfv_neu_tau000300um_M1200_2016APV": 0.0000, +"mfv_neu_tau001000um_M1200_2016APV": 0.0003, +"mfv_neu_tau010000um_M1200_2016APV": 0.0002, +"mfv_neu_tau000100um_M1600_2016APV": 0.0000, +"mfv_neu_tau000300um_M1600_2016APV": 0.0000, +"mfv_neu_tau001000um_M1600_2016APV": 0.0001, +"mfv_neu_tau010000um_M1600_2016APV": 0.0000, +"mfv_neu_tau030000um_M1600_2016APV": 0.0000, +"mfv_neu_tau001000um_M3000_2016APV": 0.0000, +"mfv_neu_tau010000um_M3000_2016APV": 0.0000, +"mfv_neu_tau030000um_M3000_2016APV": 0.0000, +"mfv_stopdbardbar_tau000100um_M0200_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2016APV": 0.0080, +"mfv_stopdbardbar_tau001000um_M0200_2016APV": 0.0070, +"mfv_stopdbardbar_tau010000um_M0200_2016APV": 0.0035, +"mfv_stopdbardbar_tau030000um_M0200_2016APV": 0.0009, +"mfv_stopdbardbar_tau000100um_M0300_2016APV": 0.0028, +"mfv_stopdbardbar_tau000300um_M0300_2016APV": 0.0039, +"mfv_stopdbardbar_tau001000um_M0300_2016APV": 0.0048, +"mfv_stopdbardbar_tau010000um_M0300_2016APV": 0.0019, +"mfv_stopdbardbar_tau030000um_M0300_2016APV": 0.0008, +"mfv_stopdbardbar_tau000100um_M0400_2016APV": 0.0019, +"mfv_stopdbardbar_tau000300um_M0400_2016APV": 0.0026, +"mfv_stopdbardbar_tau010000um_M0400_2016APV": 0.0015, +"mfv_stopdbardbar_tau030000um_M0400_2016APV": 0.0007, +"mfv_stopdbardbar_tau000100um_M0600_2016APV": 0.0031, +"mfv_stopdbardbar_tau000300um_M0600_2016APV": 0.0032, +"mfv_stopdbardbar_tau001000um_M0600_2016APV": 0.0027, +"mfv_stopdbardbar_tau010000um_M0600_2016APV": 0.0008, +"mfv_stopdbardbar_tau030000um_M0600_2016APV": 0.0007, +"mfv_stopdbardbar_tau000100um_M0800_2016APV": 0.0016, +"mfv_stopdbardbar_tau000300um_M0800_2016APV": 0.0025, +"mfv_stopdbardbar_tau001000um_M0800_2016APV": 0.0021, +"mfv_stopdbardbar_tau010000um_M0800_2016APV": 0.0011, +"mfv_stopdbardbar_tau030000um_M0800_2016APV": 0.0006, +"mfv_stopdbardbar_tau000100um_M1200_2016APV": 0.0030, +"mfv_stopdbardbar_tau000300um_M1200_2016APV": 0.0031, +"mfv_stopdbardbar_tau001000um_M1200_2016APV": 0.0018, +"mfv_stopdbardbar_tau010000um_M1200_2016APV": 0.0005, +"mfv_stopdbardbar_tau030000um_M1200_2016APV": 0.0006, +"mfv_stopdbardbar_tau000100um_M1600_2016APV": 0.0048, +"mfv_stopdbardbar_tau000300um_M1600_2016APV": 0.0023, +"mfv_stopdbardbar_tau001000um_M1600_2016APV": 0.0010, +"mfv_stopdbardbar_tau010000um_M1600_2016APV": 0.0005, +"mfv_stopdbardbar_tau030000um_M1600_2016APV": 0.0004, +"mfv_stopdbardbar_tau000300um_M3000_2016APV": 0.0012, +"mfv_stopdbardbar_tau001000um_M3000_2016APV": 0.0011, +"mfv_stopdbardbar_tau010000um_M3000_2016APV": 0.0007, +"mfv_stopdbardbar_tau030000um_M3000_2016APV": 0.0001, +"mfv_stopbbarbbar_tau000100um_M0200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0200_2016APV": 0.0050, +"mfv_stopbbarbbar_tau001000um_M0200_2016APV": 0.0103, +"mfv_stopbbarbbar_tau010000um_M0200_2016APV": 0.0039, +"mfv_stopbbarbbar_tau030000um_M0200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000100um_M0300_2016APV": 0.0071, +"mfv_stopbbarbbar_tau000300um_M0300_2016APV": 0.0026, +"mfv_stopbbarbbar_tau001000um_M0300_2016APV": 0.0050, +"mfv_stopbbarbbar_tau010000um_M0300_2016APV": 0.0009, +"mfv_stopbbarbbar_tau030000um_M0300_2016APV": 0.0023, +"mfv_stopbbarbbar_tau000100um_M0400_2016APV": 0.0042, +"mfv_stopbbarbbar_tau000300um_M0400_2016APV": 0.0014, +"mfv_stopbbarbbar_tau001000um_M0400_2016APV": 0.0026, +"mfv_stopbbarbbar_tau010000um_M0400_2016APV": 0.0011, +"mfv_stopbbarbbar_tau030000um_M0400_2016APV": 0.0007, +"mfv_stopbbarbbar_tau000100um_M0600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0600_2016APV": 0.0009, +"mfv_stopbbarbbar_tau010000um_M0600_2016APV": 0.0003, +"mfv_stopbbarbbar_tau030000um_M0600_2016APV": 0.0002, +"mfv_stopbbarbbar_tau000100um_M0800_2016APV": 0.0015, +"mfv_stopbbarbbar_tau000300um_M0800_2016APV": 0.0007, +"mfv_stopbbarbbar_tau001000um_M0800_2016APV": 0.0013, +"mfv_stopbbarbbar_tau010000um_M0800_2016APV": 0.0006, +"mfv_stopbbarbbar_tau030000um_M0800_2016APV": 0.0001, +"mfv_stopbbarbbar_tau000100um_M1200_2016APV": 0.0009, +"mfv_stopbbarbbar_tau000300um_M1200_2016APV": 0.0003, +"mfv_stopbbarbbar_tau001000um_M1200_2016APV": 0.0008, +"mfv_stopbbarbbar_tau010000um_M1200_2016APV": 0.0003, +"mfv_stopbbarbbar_tau030000um_M1200_2016APV": 0.0005, +"mfv_stopbbarbbar_tau000100um_M1600_2016APV": 0.0008, +"mfv_stopbbarbbar_tau000300um_M1600_2016APV": 0.0005, +"mfv_stopbbarbbar_tau001000um_M1600_2016APV": 0.0003, +"mfv_stopbbarbbar_tau010000um_M1600_2016APV": 0.0004, +"mfv_stopbbarbbar_tau030000um_M1600_2016APV": 0.0002, +"mfv_stopbbarbbar_tau001000um_M3000_2016APV": 0.0006, +"mfv_stopbbarbbar_tau010000um_M3000_2016APV": 0.0003, +"mfv_stopbbarbbar_tau030000um_M3000_2016APV": 0.0000, +} + +bjet_hlt_uncerts = { +"ggHToSSTodddd_tau1mm_M55_2018": 0.1006, +"ggHToSSTodddd_tau10mm_M55_2018": 0.0305, +"ggHToSSTodddd_tau100mm_M55_2018": 0.0220, +"ggHToSSTodddd_tau1mm_M55_2017": 0.0944, +"ggHToSSTodddd_tau10mm_M55_2017": 0.0442, +"ggHToSSTodddd_tau100mm_M55_2017": 0.0830, +"ggHToSSTodddd_tau1mm_M55_2016": 0.0074, +"ggHToSSTodddd_tau10mm_M55_2016": 0.0191, +"ggHToSSTodddd_tau1mm_M55_2016APV": 0.0002, +"ggHToSSTodddd_tau10mm_M55_2016APV": 0.0137, +"ggHToSSTodddd_tau100mm_M55_2016APV": 0.0000, +"mfv_neu_tau000100um_M0200_2018": 0.0660, +"mfv_neu_tau000300um_M0200_2018": 0.0482, +"mfv_neu_tau010000um_M0200_2018": 0.0267, +"mfv_neu_tau030000um_M0200_2018": 0.0222, +"mfv_neu_tau000100um_M0300_2018": 0.0153, +"mfv_neu_tau000300um_M0300_2018": 0.0233, +"mfv_neu_tau001000um_M0300_2018": 0.0425, +"mfv_neu_tau010000um_M0300_2018": 0.0177, +"mfv_neu_tau030000um_M0300_2018": 0.0157, +"mfv_neu_tau000100um_M0400_2018": 0.0137, +"mfv_neu_tau000300um_M0400_2018": 0.0131, +"mfv_neu_tau001000um_M0400_2018": 0.0153, +"mfv_neu_tau010000um_M0400_2018": 0.0091, +"mfv_neu_tau030000um_M0400_2018": 0.0064, +"mfv_neu_tau000100um_M0600_2018": 0.0121, +"mfv_neu_tau001000um_M0600_2018": 0.0039, +"mfv_neu_tau010000um_M0600_2018": 0.0015, +"mfv_neu_tau030000um_M0600_2018": 0.0008, +"mfv_neu_tau000100um_M0800_2018": 0.0111, +"mfv_neu_tau000300um_M0800_2018": 0.0041, +"mfv_neu_tau001000um_M0800_2018": 0.0019, +"mfv_neu_tau010000um_M0800_2018": 0.0006, +"mfv_neu_tau030000um_M0800_2018": 0.0004, +"mfv_neu_tau000100um_M1200_2018": 0.0147, +"mfv_neu_tau000300um_M1200_2018": 0.0044, +"mfv_neu_tau001000um_M1200_2018": 0.0013, +"mfv_neu_tau010000um_M1200_2018": 0.0003, +"mfv_neu_tau030000um_M1200_2018": 0.0001, +"mfv_neu_tau000100um_M1600_2018": 0.0226, +"mfv_neu_tau000300um_M1600_2018": 0.0078, +"mfv_neu_tau001000um_M1600_2018": 0.0018, +"mfv_neu_tau010000um_M1600_2018": 0.0003, +"mfv_neu_tau030000um_M1600_2018": 0.0001, +"mfv_neu_tau000300um_M3000_2018": 0.0282, +"mfv_neu_tau001000um_M3000_2018": 0.0051, +"mfv_neu_tau030000um_M3000_2018": 0.0007, +"mfv_stopdbardbar_tau000100um_M0200_2018": 0.0745, +"mfv_stopdbardbar_tau000300um_M0200_2018": 0.0528, +"mfv_stopdbardbar_tau001000um_M0200_2018": 0.0399, +"mfv_stopdbardbar_tau010000um_M0200_2018": 0.0128, +"mfv_stopdbardbar_tau030000um_M0200_2018": 0.0097, +"mfv_stopdbardbar_tau000100um_M0300_2018": 0.0766, +"mfv_stopdbardbar_tau000300um_M0300_2018": 0.0402, +"mfv_stopdbardbar_tau001000um_M0300_2018": 0.0275, +"mfv_stopdbardbar_tau010000um_M0300_2018": 0.0074, +"mfv_stopdbardbar_tau030000um_M0300_2018": 0.0024, +"mfv_stopdbardbar_tau000100um_M0400_2018": 0.0639, +"mfv_stopdbardbar_tau000300um_M0400_2018": 0.0322, +"mfv_stopdbardbar_tau001000um_M0400_2018": 0.0148, +"mfv_stopdbardbar_tau010000um_M0400_2018": 0.0017, +"mfv_stopdbardbar_tau000100um_M0600_2018": 0.0727, +"mfv_stopdbardbar_tau000300um_M0600_2018": 0.0337, +"mfv_stopdbardbar_tau001000um_M0600_2018": 0.0103, +"mfv_stopdbardbar_tau010000um_M0600_2018": 0.0011, +"mfv_stopdbardbar_tau030000um_M0600_2018": 0.0006, +"mfv_stopdbardbar_tau000100um_M0800_2018": 0.0738, +"mfv_stopdbardbar_tau000300um_M0800_2018": 0.0344, +"mfv_stopdbardbar_tau001000um_M0800_2018": 0.0099, +"mfv_stopdbardbar_tau010000um_M0800_2018": 0.0007, +"mfv_stopdbardbar_tau030000um_M0800_2018": 0.0008, +"mfv_stopdbardbar_tau000100um_M1200_2018": 0.0866, +"mfv_stopdbardbar_tau000300um_M1200_2018": 0.0399, +"mfv_stopdbardbar_tau001000um_M1200_2018": 0.0111, +"mfv_stopdbardbar_tau010000um_M1200_2018": 0.0009, +"mfv_stopdbardbar_tau030000um_M1200_2018": 0.0006, +"mfv_stopdbardbar_tau000100um_M1600_2018": 0.0852, +"mfv_stopdbardbar_tau000300um_M1600_2018": 0.0466, +"mfv_stopdbardbar_tau001000um_M1600_2018": 0.0129, +"mfv_stopdbardbar_tau010000um_M1600_2018": 0.0002, +"mfv_stopdbardbar_tau030000um_M1600_2018": 0.0004, +"mfv_stopdbardbar_tau001000um_M3000_2018": 0.0058, +"mfv_stopdbardbar_tau010000um_M3000_2018": 0.0016, +"mfv_stopdbardbar_tau030000um_M3000_2018": 0.0010, +"mfv_stopbbarbbar_tau000100um_M0200_2018": 0.0520, +"mfv_stopbbarbbar_tau000300um_M0200_2018": 0.0293, +"mfv_stopbbarbbar_tau001000um_M0200_2018": 0.0343, +"mfv_stopbbarbbar_tau010000um_M0200_2018": 0.0111, +"mfv_stopbbarbbar_tau030000um_M0200_2018": 0.0024, +"mfv_stopbbarbbar_tau000100um_M0300_2018": 0.0306, +"mfv_stopbbarbbar_tau000300um_M0300_2018": 0.0192, +"mfv_stopbbarbbar_tau001000um_M0300_2018": 0.0225, +"mfv_stopbbarbbar_tau010000um_M0300_2018": 0.0102, +"mfv_stopbbarbbar_tau030000um_M0300_2018": 0.0071, +"mfv_stopbbarbbar_tau000100um_M0400_2018": 0.0271, +"mfv_stopbbarbbar_tau000300um_M0400_2018": 0.0113, +"mfv_stopbbarbbar_tau001000um_M0400_2018": 0.0095, +"mfv_stopbbarbbar_tau010000um_M0400_2018": 0.0038, +"mfv_stopbbarbbar_tau030000um_M0400_2018": 0.0025, +"mfv_stopbbarbbar_tau000100um_M0600_2018": 0.0279, +"mfv_stopbbarbbar_tau000300um_M0600_2018": 0.0107, +"mfv_stopbbarbbar_tau001000um_M0600_2018": 0.0072, +"mfv_stopbbarbbar_tau010000um_M0600_2018": 0.0008, +"mfv_stopbbarbbar_tau030000um_M0600_2018": 0.0004, +"mfv_stopbbarbbar_tau000100um_M0800_2018": 0.0312, +"mfv_stopbbarbbar_tau000300um_M0800_2018": 0.0136, +"mfv_stopbbarbbar_tau001000um_M0800_2018": 0.0037, +"mfv_stopbbarbbar_tau010000um_M0800_2018": 0.0011, +"mfv_stopbbarbbar_tau030000um_M0800_2018": 0.0007, +"mfv_stopbbarbbar_tau000100um_M1200_2018": 0.0435, +"mfv_stopbbarbbar_tau000300um_M1200_2018": 0.0207, +"mfv_stopbbarbbar_tau001000um_M1200_2018": 0.0051, +"mfv_stopbbarbbar_tau010000um_M1200_2018": 0.0007, +"mfv_stopbbarbbar_tau030000um_M1200_2018": 0.0005, +"mfv_stopbbarbbar_tau000100um_M1600_2018": 0.0709, +"mfv_stopbbarbbar_tau000300um_M1600_2018": 0.0262, +"mfv_stopbbarbbar_tau001000um_M1600_2018": 0.0076, +"mfv_stopbbarbbar_tau010000um_M1600_2018": 0.0006, +"mfv_stopbbarbbar_tau030000um_M1600_2018": 0.0002, +"mfv_stopbbarbbar_tau001000um_M3000_2018": 0.0137, +"mfv_stopbbarbbar_tau010000um_M3000_2018": 0.0003, +"mfv_stopbbarbbar_tau030000um_M3000_2018": 0.0004, +"mfv_neu_tau000100um_M0200_2017": 0.0530, +"mfv_neu_tau000300um_M0200_2017": 0.0384, +"mfv_neu_tau010000um_M0200_2017": 0.0367, +"mfv_neu_tau030000um_M0200_2017": 0.0111, +"mfv_neu_tau000100um_M0300_2017": 0.0170, +"mfv_neu_tau000300um_M0300_2017": 0.0208, +"mfv_neu_tau001000um_M0300_2017": 0.0337, +"mfv_neu_tau010000um_M0300_2017": 0.0225, +"mfv_neu_tau030000um_M0300_2017": 0.0199, +"mfv_neu_tau000100um_M0400_2017": 0.0131, +"mfv_neu_tau001000um_M0400_2017": 0.0226, +"mfv_neu_tau010000um_M0400_2017": 0.0089, +"mfv_neu_tau030000um_M0400_2017": 0.0063, +"mfv_neu_tau000100um_M0600_2017": 0.0061, +"mfv_neu_tau000300um_M0600_2017": 0.0039, +"mfv_neu_tau001000um_M0600_2017": 0.0090, +"mfv_neu_tau010000um_M0600_2017": 0.0017, +"mfv_neu_tau030000um_M0600_2017": 0.0015, +"mfv_neu_tau000300um_M0800_2017": 0.0028, +"mfv_neu_tau001000um_M0800_2017": 0.0063, +"mfv_neu_tau010000um_M0800_2017": 0.0010, +"mfv_neu_tau030000um_M0800_2017": 0.0006, +"mfv_neu_tau000100um_M1200_2017": 0.0046, +"mfv_neu_tau000300um_M1200_2017": 0.0010, +"mfv_neu_tau001000um_M1200_2017": 0.0045, +"mfv_neu_tau010000um_M1200_2017": 0.0010, +"mfv_neu_tau000100um_M1600_2017": 0.0021, +"mfv_neu_tau000300um_M1600_2017": 0.0002, +"mfv_neu_tau001000um_M1600_2017": 0.0022, +"mfv_neu_tau010000um_M1600_2017": 0.0009, +"mfv_neu_tau030000um_M1600_2017": 0.0004, +"mfv_neu_tau001000um_M3000_2017": 0.0068, +"mfv_neu_tau010000um_M3000_2017": 0.0030, +"mfv_neu_tau030000um_M3000_2017": 0.0011, +"mfv_stopdbardbar_tau000100um_M0200_2017": 0.0571, +"mfv_stopdbardbar_tau000300um_M0200_2017": 0.0441, +"mfv_stopdbardbar_tau001000um_M0200_2017": 0.0490, +"mfv_stopdbardbar_tau010000um_M0200_2017": 0.0172, +"mfv_stopdbardbar_tau030000um_M0200_2017": 0.0159, +"mfv_stopdbardbar_tau000100um_M0300_2017": 0.0432, +"mfv_stopdbardbar_tau000300um_M0300_2017": 0.0298, +"mfv_stopdbardbar_tau001000um_M0300_2017": 0.0324, +"mfv_stopdbardbar_tau010000um_M0300_2017": 0.0086, +"mfv_stopdbardbar_tau030000um_M0300_2017": 0.0040, +"mfv_stopdbardbar_tau000100um_M0400_2017": 0.0360, +"mfv_stopdbardbar_tau000300um_M0400_2017": 0.0194, +"mfv_stopdbardbar_tau001000um_M0400_2017": 0.0206, +"mfv_stopdbardbar_tau010000um_M0400_2017": 0.0031, +"mfv_stopdbardbar_tau030000um_M0400_2017": 0.0017, +"mfv_stopdbardbar_tau000100um_M0600_2017": 0.0251, +"mfv_stopdbardbar_tau000300um_M0600_2017": 0.0112, +"mfv_stopdbardbar_tau010000um_M0600_2017": 0.0019, +"mfv_stopdbardbar_tau030000um_M0600_2017": 0.0013, +"mfv_stopdbardbar_tau000100um_M0800_2017": 0.0208, +"mfv_stopdbardbar_tau000300um_M0800_2017": 0.0119, +"mfv_stopdbardbar_tau001000um_M0800_2017": 0.0137, +"mfv_stopdbardbar_tau010000um_M0800_2017": 0.0016, +"mfv_stopdbardbar_tau030000um_M0800_2017": 0.0009, +"mfv_stopdbardbar_tau000100um_M1200_2017": 0.0066, +"mfv_stopdbardbar_tau000300um_M1200_2017": 0.0055, +"mfv_stopdbardbar_tau001000um_M1200_2017": 0.0029, +"mfv_stopdbardbar_tau010000um_M1200_2017": 0.0009, +"mfv_stopdbardbar_tau030000um_M1200_2017": 0.0008, +"mfv_stopdbardbar_tau001000um_M1600_2017": 0.0103, +"mfv_stopdbardbar_tau010000um_M1600_2017": 0.0002, +"mfv_stopdbardbar_tau030000um_M1600_2017": 0.0003, +"mfv_stopdbardbar_tau001000um_M3000_2017": 0.0421, +"mfv_stopdbardbar_tau010000um_M3000_2017": 0.0154, +"mfv_stopdbardbar_tau030000um_M3000_2017": 0.0046, +"mfv_stopbbarbbar_tau000100um_M0200_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0200_2017": 0.0159, +"mfv_stopbbarbbar_tau001000um_M0200_2017": 0.0243, +"mfv_stopbbarbbar_tau010000um_M0200_2017": 0.0100, +"mfv_stopbbarbbar_tau030000um_M0200_2017": 0.0139, +"mfv_stopbbarbbar_tau000100um_M0300_2017": 0.0103, +"mfv_stopbbarbbar_tau000300um_M0300_2017": 0.0125, +"mfv_stopbbarbbar_tau001000um_M0300_2017": 0.0180, +"mfv_stopbbarbbar_tau010000um_M0300_2017": 0.0110, +"mfv_stopbbarbbar_tau030000um_M0300_2017": 0.0066, +"mfv_stopbbarbbar_tau000100um_M0400_2017": 0.0077, +"mfv_stopbbarbbar_tau000300um_M0400_2017": 0.0071, +"mfv_stopbbarbbar_tau001000um_M0400_2017": 0.0130, +"mfv_stopbbarbbar_tau010000um_M0400_2017": 0.0031, +"mfv_stopbbarbbar_tau030000um_M0400_2017": 0.0020, +"mfv_stopbbarbbar_tau000100um_M0600_2017": 0.0056, +"mfv_stopbbarbbar_tau000300um_M0600_2017": 0.0037, +"mfv_stopbbarbbar_tau001000um_M0600_2017": 0.0090, +"mfv_stopbbarbbar_tau010000um_M0600_2017": 0.0019, +"mfv_stopbbarbbar_tau030000um_M0600_2017": 0.0009, +"mfv_stopbbarbbar_tau000100um_M0800_2017": 0.0084, +"mfv_stopbbarbbar_tau000300um_M0800_2017": 0.0035, +"mfv_stopbbarbbar_tau001000um_M0800_2017": 0.0046, +"mfv_stopbbarbbar_tau010000um_M0800_2017": 0.0020, +"mfv_stopbbarbbar_tau030000um_M0800_2017": 0.0013, +"mfv_stopbbarbbar_tau000100um_M1200_2017": 0.0073, +"mfv_stopbbarbbar_tau000300um_M1200_2017": 0.0044, +"mfv_stopbbarbbar_tau001000um_M1200_2017": 0.0016, +"mfv_stopbbarbbar_tau010000um_M1200_2017": 0.0019, +"mfv_stopbbarbbar_tau030000um_M1200_2017": 0.0010, +"mfv_stopbbarbbar_tau000300um_M1600_2017": 0.0025, +"mfv_stopbbarbbar_tau001000um_M1600_2017": 0.0034, +"mfv_stopbbarbbar_tau010000um_M1600_2017": 0.0004, +"mfv_stopbbarbbar_tau030000um_M1600_2017": 0.0008, +"mfv_stopbbarbbar_tau001000um_M3000_2017": 0.0322, +"mfv_stopbbarbbar_tau010000um_M3000_2017": 0.0108, +"mfv_stopbbarbbar_tau030000um_M3000_2017": 0.0050, +"mfv_neu_tau000100um_M0200_2016": 0.0000, +"mfv_neu_tau000300um_M0200_2016": 0.0031, +"mfv_neu_tau001000um_M0200_2016": 0.0000, +"mfv_neu_tau010000um_M0200_2016": 0.0066, +"mfv_neu_tau030000um_M0200_2016": 0.0000, +"mfv_neu_tau000100um_M0300_2016": 0.0000, +"mfv_neu_tau000300um_M0300_2016": 0.0000, +"mfv_neu_tau001000um_M0300_2016": 0.0013, +"mfv_neu_tau010000um_M0300_2016": 0.0016, +"mfv_neu_tau030000um_M0300_2016": 0.0010, +"mfv_neu_tau000100um_M0400_2016": 0.0000, +"mfv_neu_tau000300um_M0400_2016": 0.0010, +"mfv_neu_tau001000um_M0400_2016": 0.0031, +"mfv_neu_tau010000um_M0400_2016": 0.0019, +"mfv_neu_tau030000um_M0400_2016": 0.0010, +"mfv_neu_tau000100um_M0600_2016": 0.0000, +"mfv_neu_tau000300um_M0600_2016": 0.0000, +"mfv_neu_tau001000um_M0600_2016": 0.0016, +"mfv_neu_tau010000um_M0600_2016": 0.0014, +"mfv_neu_tau030000um_M0600_2016": 0.0012, +"mfv_neu_tau000100um_M0800_2016": 0.0000, +"mfv_neu_tau000300um_M0800_2016": 0.0004, +"mfv_neu_tau001000um_M0800_2016": 0.0023, +"mfv_neu_tau010000um_M0800_2016": 0.0010, +"mfv_neu_tau030000um_M0800_2016": 0.0008, +"mfv_neu_tau000100um_M1200_2016": 0.0014, +"mfv_neu_tau000300um_M1200_2016": 0.0000, +"mfv_neu_tau001000um_M1200_2016": 0.0034, +"mfv_neu_tau010000um_M1200_2016": 0.0009, +"mfv_neu_tau030000um_M1200_2016": 0.0005, +"mfv_neu_tau000100um_M1600_2016": 0.0025, +"mfv_neu_tau000300um_M1600_2016": 0.0000, +"mfv_neu_tau001000um_M1600_2016": 0.0026, +"mfv_neu_tau010000um_M1600_2016": 0.0014, +"mfv_neu_tau030000um_M1600_2016": 0.0006, +"mfv_neu_tau000300um_M3000_2016": 0.0214, +"mfv_neu_tau001000um_M3000_2016": 0.0113, +"mfv_neu_tau010000um_M3000_2016": 0.0045, +"mfv_neu_tau030000um_M3000_2016": 0.0018, +"mfv_stopdbardbar_tau000100um_M0200_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2016": 0.0006, +"mfv_stopdbardbar_tau001000um_M0200_2016": 0.0017, +"mfv_stopdbardbar_tau010000um_M0200_2016": 0.0035, +"mfv_stopdbardbar_tau030000um_M0200_2016": 0.0011, +"mfv_stopdbardbar_tau000100um_M0300_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0300_2016": 0.0015, +"mfv_stopdbardbar_tau001000um_M0300_2016": 0.0040, +"mfv_stopdbardbar_tau010000um_M0300_2016": 0.0023, +"mfv_stopdbardbar_tau030000um_M0300_2016": 0.0020, +"mfv_stopdbardbar_tau000100um_M0400_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0400_2016": 0.0011, +"mfv_stopdbardbar_tau001000um_M0400_2016": 0.0036, +"mfv_stopdbardbar_tau010000um_M0400_2016": 0.0026, +"mfv_stopdbardbar_tau030000um_M0400_2016": 0.0009, +"mfv_stopdbardbar_tau000100um_M0600_2016": 0.0039, +"mfv_stopdbardbar_tau000300um_M0600_2016": 0.0014, +"mfv_stopdbardbar_tau001000um_M0600_2016": 0.0027, +"mfv_stopdbardbar_tau010000um_M0600_2016": 0.0022, +"mfv_stopdbardbar_tau030000um_M0600_2016": 0.0009, +"mfv_stopdbardbar_tau000100um_M0800_2016": 0.0012, +"mfv_stopdbardbar_tau000300um_M0800_2016": 0.0024, +"mfv_stopdbardbar_tau001000um_M0800_2016": 0.0037, +"mfv_stopdbardbar_tau010000um_M0800_2016": 0.0021, +"mfv_stopdbardbar_tau030000um_M0800_2016": 0.0011, +"mfv_stopdbardbar_tau000100um_M1200_2016": 0.0169, +"mfv_stopdbardbar_tau000300um_M1200_2016": 0.0104, +"mfv_stopdbardbar_tau001000um_M1200_2016": 0.0107, +"mfv_stopdbardbar_tau010000um_M1200_2016": 0.0031, +"mfv_stopdbardbar_tau030000um_M1200_2016": 0.0016, +"mfv_stopdbardbar_tau000100um_M1600_2016": 0.0674, +"mfv_stopdbardbar_tau000300um_M1600_2016": 0.0287, +"mfv_stopdbardbar_tau001000um_M1600_2016": 0.0125, +"mfv_stopdbardbar_tau010000um_M1600_2016": 0.0050, +"mfv_stopdbardbar_tau030000um_M1600_2016": 0.0023, +"mfv_stopdbardbar_tau000300um_M3000_2016": 0.1150, +"mfv_stopdbardbar_tau001000um_M3000_2016": 0.0551, +"mfv_stopdbardbar_tau030000um_M3000_2016": 0.0056, +"mfv_stopbbarbbar_tau000300um_M0200_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0200_2016": 0.0052, +"mfv_stopbbarbbar_tau010000um_M0200_2016": 0.0015, +"mfv_stopbbarbbar_tau030000um_M0200_2016": 0.0000, +"mfv_stopbbarbbar_tau000100um_M0300_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0300_2016": 0.0026, +"mfv_stopbbarbbar_tau010000um_M0300_2016": 0.0030, +"mfv_stopbbarbbar_tau030000um_M0300_2016": 0.0034, +"mfv_stopbbarbbar_tau000100um_M0400_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2016": 0.0004, +"mfv_stopbbarbbar_tau001000um_M0400_2016": 0.0035, +"mfv_stopbbarbbar_tau010000um_M0400_2016": 0.0018, +"mfv_stopbbarbbar_tau030000um_M0400_2016": 0.0016, +"mfv_stopbbarbbar_tau000100um_M0600_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0600_2016": 0.0008, +"mfv_stopbbarbbar_tau001000um_M0600_2016": 0.0018, +"mfv_stopbbarbbar_tau010000um_M0600_2016": 0.0017, +"mfv_stopbbarbbar_tau030000um_M0600_2016": 0.0014, +"mfv_stopbbarbbar_tau000100um_M0800_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0800_2016": 0.0009, +"mfv_stopbbarbbar_tau001000um_M0800_2016": 0.0013, +"mfv_stopbbarbbar_tau010000um_M0800_2016": 0.0013, +"mfv_stopbbarbbar_tau030000um_M0800_2016": 0.0006, +"mfv_stopbbarbbar_tau000100um_M1200_2016": 0.0101, +"mfv_stopbbarbbar_tau001000um_M1200_2016": 0.0039, +"mfv_stopbbarbbar_tau010000um_M1200_2016": 0.0020, +"mfv_stopbbarbbar_tau030000um_M1200_2016": 0.0014, +"mfv_stopbbarbbar_tau000100um_M1600_2016": 0.0288, +"mfv_stopbbarbbar_tau000300um_M1600_2016": 0.0125, +"mfv_stopbbarbbar_tau001000um_M1600_2016": 0.0092, +"mfv_stopbbarbbar_tau010000um_M1600_2016": 0.0042, +"mfv_stopbbarbbar_tau030000um_M1600_2016": 0.0018, +"mfv_stopbbarbbar_tau000300um_M3000_2016": 0.0744, +"mfv_stopbbarbbar_tau001000um_M3000_2016": 0.0351, +"mfv_stopbbarbbar_tau010000um_M3000_2016": 0.0105, +"mfv_stopbbarbbar_tau030000um_M3000_2016": 0.0058, +"mfv_neu_tau000100um_M0200_2016APV": 0.0000, +"mfv_neu_tau000300um_M0200_2016APV": 0.0000, +"mfv_neu_tau001000um_M0200_2016APV": 0.0024, +"mfv_neu_tau010000um_M0200_2016APV": 0.0023, +"mfv_neu_tau030000um_M0200_2016APV": 0.0070, +"mfv_neu_tau000100um_M0300_2016APV": 0.0000, +"mfv_neu_tau000300um_M0300_2016APV": 0.0010, +"mfv_neu_tau001000um_M0300_2016APV": 0.0033, +"mfv_neu_tau010000um_M0300_2016APV": 0.0052, +"mfv_neu_tau030000um_M0300_2016APV": 0.0056, +"mfv_neu_tau000100um_M0400_2016APV": 0.0000, +"mfv_neu_tau000300um_M0400_2016APV": 0.0013, +"mfv_neu_tau001000um_M0400_2016APV": 0.0016, +"mfv_neu_tau010000um_M0400_2016APV": 0.0061, +"mfv_neu_tau030000um_M0400_2016APV": 0.0039, +"mfv_neu_tau000100um_M0600_2016APV": 0.0000, +"mfv_neu_tau000300um_M0600_2016APV": 0.0005, +"mfv_neu_tau001000um_M0600_2016APV": 0.0042, +"mfv_neu_tau010000um_M0600_2016APV": 0.0102, +"mfv_neu_tau030000um_M0600_2016APV": 0.0062, +"mfv_neu_tau000100um_M0800_2016APV": 0.0000, +"mfv_neu_tau000300um_M0800_2016APV": 0.0000, +"mfv_neu_tau001000um_M0800_2016APV": 0.0028, +"mfv_neu_tau010000um_M0800_2016APV": 0.0118, +"mfv_neu_tau030000um_M0800_2016APV": 0.0096, +"mfv_neu_tau000100um_M1200_2016APV": 0.0000, +"mfv_neu_tau000300um_M1200_2016APV": 0.0008, +"mfv_neu_tau001000um_M1200_2016APV": 0.0037, +"mfv_neu_tau010000um_M1200_2016APV": 0.0139, +"mfv_neu_tau000100um_M1600_2016APV": 0.0013, +"mfv_neu_tau000300um_M1600_2016APV": 0.0004, +"mfv_neu_tau001000um_M1600_2016APV": 0.0045, +"mfv_neu_tau010000um_M1600_2016APV": 0.0135, +"mfv_neu_tau030000um_M1600_2016APV": 0.0005, +"mfv_neu_tau001000um_M3000_2016APV": 0.0132, +"mfv_neu_tau010000um_M3000_2016APV": 0.0361, +"mfv_neu_tau030000um_M3000_2016APV": 0.0013, +"mfv_stopdbardbar_tau000100um_M0200_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2016APV": 0.0022, +"mfv_stopdbardbar_tau001000um_M0200_2016APV": 0.0021, +"mfv_stopdbardbar_tau010000um_M0200_2016APV": 0.0040, +"mfv_stopdbardbar_tau030000um_M0200_2016APV": 0.0055, +"mfv_stopdbardbar_tau000100um_M0300_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0300_2016APV": 0.0020, +"mfv_stopdbardbar_tau001000um_M0300_2016APV": 0.0069, +"mfv_stopdbardbar_tau010000um_M0300_2016APV": 0.0057, +"mfv_stopdbardbar_tau030000um_M0300_2016APV": 0.0032, +"mfv_stopdbardbar_tau000100um_M0400_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0400_2016APV": 0.0023, +"mfv_stopdbardbar_tau010000um_M0400_2016APV": 0.0069, +"mfv_stopdbardbar_tau030000um_M0400_2016APV": 0.0035, +"mfv_stopdbardbar_tau000100um_M0600_2016APV": 0.0019, +"mfv_stopdbardbar_tau000300um_M0600_2016APV": 0.0020, +"mfv_stopdbardbar_tau001000um_M0600_2016APV": 0.0041, +"mfv_stopdbardbar_tau010000um_M0600_2016APV": 0.0092, +"mfv_stopdbardbar_tau030000um_M0600_2016APV": 0.0048, +"mfv_stopdbardbar_tau000100um_M0800_2016APV": 0.0013, +"mfv_stopdbardbar_tau000300um_M0800_2016APV": 0.0024, +"mfv_stopdbardbar_tau001000um_M0800_2016APV": 0.0068, +"mfv_stopdbardbar_tau010000um_M0800_2016APV": 0.0096, +"mfv_stopdbardbar_tau030000um_M0800_2016APV": 0.0043, +"mfv_stopdbardbar_tau000100um_M1200_2016APV": 0.0236, +"mfv_stopdbardbar_tau000300um_M1200_2016APV": 0.0068, +"mfv_stopdbardbar_tau001000um_M1200_2016APV": 0.0106, +"mfv_stopdbardbar_tau010000um_M1200_2016APV": 0.0152, +"mfv_stopdbardbar_tau030000um_M1200_2016APV": 0.0093, +"mfv_stopdbardbar_tau000100um_M1600_2016APV": 0.0713, +"mfv_stopdbardbar_tau000300um_M1600_2016APV": 0.0309, +"mfv_stopdbardbar_tau001000um_M1600_2016APV": 0.0193, +"mfv_stopdbardbar_tau010000um_M1600_2016APV": 0.0312, +"mfv_stopdbardbar_tau030000um_M1600_2016APV": 0.0182, +"mfv_stopdbardbar_tau000300um_M3000_2016APV": 0.1091, +"mfv_stopdbardbar_tau001000um_M3000_2016APV": 0.0628, +"mfv_stopdbardbar_tau010000um_M3000_2016APV": 0.0808, +"mfv_stopdbardbar_tau030000um_M3000_2016APV": 0.0058, +"mfv_stopbbarbbar_tau000100um_M0200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0200_2016APV": 0.0046, +"mfv_stopbbarbbar_tau010000um_M0200_2016APV": 0.0091, +"mfv_stopbbarbbar_tau030000um_M0200_2016APV": 0.0196, +"mfv_stopbbarbbar_tau000100um_M0300_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2016APV": 0.0011, +"mfv_stopbbarbbar_tau001000um_M0300_2016APV": 0.0071, +"mfv_stopbbarbbar_tau010000um_M0300_2016APV": 0.0030, +"mfv_stopbbarbbar_tau030000um_M0300_2016APV": 0.0023, +"mfv_stopbbarbbar_tau000100um_M0400_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0400_2016APV": 0.0041, +"mfv_stopbbarbbar_tau010000um_M0400_2016APV": 0.0073, +"mfv_stopbbarbbar_tau030000um_M0400_2016APV": 0.0046, +"mfv_stopbbarbbar_tau000100um_M0600_2016APV": 0.0042, +"mfv_stopbbarbbar_tau000300um_M0600_2016APV": 0.0017, +"mfv_stopbbarbbar_tau001000um_M0600_2016APV": 0.0035, +"mfv_stopbbarbbar_tau010000um_M0600_2016APV": 0.0069, +"mfv_stopbbarbbar_tau030000um_M0600_2016APV": 0.0048, +"mfv_stopbbarbbar_tau000100um_M0800_2016APV": 0.0063, +"mfv_stopbbarbbar_tau000300um_M0800_2016APV": 0.0023, +"mfv_stopbbarbbar_tau001000um_M0800_2016APV": 0.0034, +"mfv_stopbbarbbar_tau010000um_M0800_2016APV": 0.0090, +"mfv_stopbbarbbar_tau030000um_M0800_2016APV": 0.0065, +"mfv_stopbbarbbar_tau000100um_M1200_2016APV": 0.0073, +"mfv_stopbbarbbar_tau000300um_M1200_2016APV": 0.0038, +"mfv_stopbbarbbar_tau001000um_M1200_2016APV": 0.0092, +"mfv_stopbbarbbar_tau010000um_M1200_2016APV": 0.0120, +"mfv_stopbbarbbar_tau030000um_M1200_2016APV": 0.0085, +"mfv_stopbbarbbar_tau000100um_M1600_2016APV": 0.0429, +"mfv_stopbbarbbar_tau000300um_M1600_2016APV": 0.0142, +"mfv_stopbbarbbar_tau001000um_M1600_2016APV": 0.0099, +"mfv_stopbbarbbar_tau010000um_M1600_2016APV": 0.0262, +"mfv_stopbbarbbar_tau030000um_M1600_2016APV": 0.0119, +"mfv_stopbbarbbar_tau001000um_M3000_2016APV": 0.0540, +"mfv_stopbbarbbar_tau010000um_M3000_2016APV": 0.0650, +"mfv_stopbbarbbar_tau030000um_M3000_2016APV": 0.0052, +} + +jer_dn_uncerts = { +"ggHToSSTodddd_tau1mm_M55_2018": 0.0003, +"ggHToSSTodddd_tau10mm_M55_2018": 0.0050, +"ggHToSSTodddd_tau100mm_M55_2018": 0.0349, +"ggHToSSTodddd_tau1mm_M55_2017": 0.0001, +"ggHToSSTodddd_tau10mm_M55_2017": 0.0011, +"ggHToSSTodddd_tau100mm_M55_2017": 0.0200, +"ggHToSSTodddd_tau1mm_M55_2016": 0.0009, +"ggHToSSTodddd_tau10mm_M55_2016": 0.0016, +"ggHToSSTodddd_tau1mm_M55_2016APV": 0.0013, +"ggHToSSTodddd_tau10mm_M55_2016APV": 0.0040, +"ggHToSSTodddd_tau100mm_M55_2016APV": 0.0000, +"mfv_neu_tau000100um_M0200_2018": 0.0000, +"mfv_neu_tau000300um_M0200_2018": 0.0001, +"mfv_neu_tau010000um_M0200_2018": 0.0019, +"mfv_neu_tau030000um_M0200_2018": 0.0129, +"mfv_neu_tau000100um_M0300_2018": 0.0000, +"mfv_neu_tau000300um_M0300_2018": 0.0001, +"mfv_neu_tau001000um_M0300_2018": 0.0005, +"mfv_neu_tau010000um_M0300_2018": 0.0098, +"mfv_neu_tau030000um_M0300_2018": 0.0140, +"mfv_neu_tau000100um_M0400_2018": 0.0000, +"mfv_neu_tau000300um_M0400_2018": 0.0000, +"mfv_neu_tau001000um_M0400_2018": 0.0028, +"mfv_neu_tau010000um_M0400_2018": 0.0073, +"mfv_neu_tau030000um_M0400_2018": 0.0119, +"mfv_neu_tau000100um_M0600_2018": 0.0000, +"mfv_neu_tau001000um_M0600_2018": 0.0007, +"mfv_neu_tau010000um_M0600_2018": 0.0012, +"mfv_neu_tau030000um_M0600_2018": 0.0023, +"mfv_neu_tau000100um_M0800_2018": 0.0000, +"mfv_neu_tau000300um_M0800_2018": 0.0000, +"mfv_neu_tau001000um_M0800_2018": 0.0001, +"mfv_neu_tau010000um_M0800_2018": 0.0000, +"mfv_neu_tau030000um_M0800_2018": 0.0002, +"mfv_neu_tau000100um_M1200_2018": 0.0000, +"mfv_neu_tau000300um_M1200_2018": 0.0000, +"mfv_neu_tau001000um_M1200_2018": 0.0000, +"mfv_neu_tau010000um_M1200_2018": 0.0000, +"mfv_neu_tau030000um_M1200_2018": 0.0001, +"mfv_neu_tau000100um_M1600_2018": 0.0000, +"mfv_neu_tau000300um_M1600_2018": 0.0000, +"mfv_neu_tau001000um_M1600_2018": 0.0001, +"mfv_neu_tau010000um_M1600_2018": 0.0000, +"mfv_neu_tau030000um_M1600_2018": 0.0000, +"mfv_neu_tau000300um_M3000_2018": 0.0000, +"mfv_neu_tau001000um_M3000_2018": 0.0000, +"mfv_neu_tau030000um_M3000_2018": 0.0000, +"mfv_stopdbardbar_tau000100um_M0200_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2018": 0.0004, +"mfv_stopdbardbar_tau001000um_M0200_2018": 0.0023, +"mfv_stopdbardbar_tau010000um_M0200_2018": 0.0089, +"mfv_stopdbardbar_tau030000um_M0200_2018": 0.0103, +"mfv_stopdbardbar_tau000100um_M0300_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M0300_2018": 0.0001, +"mfv_stopdbardbar_tau001000um_M0300_2018": 0.0022, +"mfv_stopdbardbar_tau010000um_M0300_2018": 0.0081, +"mfv_stopdbardbar_tau030000um_M0300_2018": 0.0083, +"mfv_stopdbardbar_tau000100um_M0400_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M0400_2018": 0.0000, +"mfv_stopdbardbar_tau001000um_M0400_2018": 0.0013, +"mfv_stopdbardbar_tau010000um_M0400_2018": 0.0044, +"mfv_stopdbardbar_tau000100um_M0600_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M0600_2018": 0.0000, +"mfv_stopdbardbar_tau001000um_M0600_2018": 0.0004, +"mfv_stopdbardbar_tau010000um_M0600_2018": 0.0005, +"mfv_stopdbardbar_tau030000um_M0600_2018": 0.0011, +"mfv_stopdbardbar_tau000100um_M0800_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M0800_2018": 0.0000, +"mfv_stopdbardbar_tau001000um_M0800_2018": 0.0002, +"mfv_stopdbardbar_tau010000um_M0800_2018": 0.0002, +"mfv_stopdbardbar_tau030000um_M0800_2018": 0.0003, +"mfv_stopdbardbar_tau000100um_M1200_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M1200_2018": 0.0000, +"mfv_stopdbardbar_tau001000um_M1200_2018": 0.0001, +"mfv_stopdbardbar_tau010000um_M1200_2018": 0.0001, +"mfv_stopdbardbar_tau030000um_M1200_2018": 0.0000, +"mfv_stopdbardbar_tau000100um_M1600_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M1600_2018": 0.0000, +"mfv_stopdbardbar_tau001000um_M1600_2018": 0.0001, +"mfv_stopdbardbar_tau010000um_M1600_2018": 0.0003, +"mfv_stopdbardbar_tau030000um_M1600_2018": 0.0001, +"mfv_stopdbardbar_tau001000um_M3000_2018": 0.0002, +"mfv_stopdbardbar_tau010000um_M3000_2018": 0.0000, +"mfv_stopdbardbar_tau030000um_M3000_2018": 0.0000, +"mfv_stopbbarbbar_tau000100um_M0200_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0200_2018": 0.0005, +"mfv_stopbbarbbar_tau001000um_M0200_2018": 0.0056, +"mfv_stopbbarbbar_tau010000um_M0200_2018": 0.0050, +"mfv_stopbbarbbar_tau030000um_M0200_2018": 0.0168, +"mfv_stopbbarbbar_tau000100um_M0300_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0300_2018": 0.0025, +"mfv_stopbbarbbar_tau010000um_M0300_2018": 0.0104, +"mfv_stopbbarbbar_tau030000um_M0300_2018": 0.0183, +"mfv_stopbbarbbar_tau000100um_M0400_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0400_2018": 0.0009, +"mfv_stopbbarbbar_tau010000um_M0400_2018": 0.0064, +"mfv_stopbbarbbar_tau030000um_M0400_2018": 0.0107, +"mfv_stopbbarbbar_tau000100um_M0600_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0600_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0600_2018": 0.0003, +"mfv_stopbbarbbar_tau010000um_M0600_2018": 0.0011, +"mfv_stopbbarbbar_tau030000um_M0600_2018": 0.0016, +"mfv_stopbbarbbar_tau000100um_M0800_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0800_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0800_2018": 0.0001, +"mfv_stopbbarbbar_tau010000um_M0800_2018": 0.0004, +"mfv_stopbbarbbar_tau030000um_M0800_2018": 0.0005, +"mfv_stopbbarbbar_tau000100um_M1200_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1200_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1200_2018": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1200_2018": 0.0002, +"mfv_stopbbarbbar_tau030000um_M1200_2018": 0.0002, +"mfv_stopbbarbbar_tau000100um_M1600_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1600_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1600_2018": 0.0002, +"mfv_stopbbarbbar_tau010000um_M1600_2018": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1600_2018": 0.0001, +"mfv_stopbbarbbar_tau001000um_M3000_2018": 0.0001, +"mfv_stopbbarbbar_tau010000um_M3000_2018": 0.0002, +"mfv_stopbbarbbar_tau030000um_M3000_2018": 0.0001, +"mfv_neu_tau000100um_M0200_2017": 0.0000, +"mfv_neu_tau000300um_M0200_2017": 0.0000, +"mfv_neu_tau010000um_M0200_2017": 0.0013, +"mfv_neu_tau030000um_M0200_2017": 0.0029, +"mfv_neu_tau000100um_M0300_2017": 0.0000, +"mfv_neu_tau000300um_M0300_2017": 0.0000, +"mfv_neu_tau001000um_M0300_2017": 0.0003, +"mfv_neu_tau010000um_M0300_2017": 0.0085, +"mfv_neu_tau030000um_M0300_2017": 0.0079, +"mfv_neu_tau000100um_M0400_2017": 0.0000, +"mfv_neu_tau001000um_M0400_2017": 0.0001, +"mfv_neu_tau010000um_M0400_2017": 0.0061, +"mfv_neu_tau030000um_M0400_2017": 0.0085, +"mfv_neu_tau000100um_M0600_2017": 0.0000, +"mfv_neu_tau000300um_M0600_2017": 0.0000, +"mfv_neu_tau001000um_M0600_2017": 0.0000, +"mfv_neu_tau010000um_M0600_2017": 0.0011, +"mfv_neu_tau030000um_M0600_2017": 0.0021, +"mfv_neu_tau000300um_M0800_2017": 0.0000, +"mfv_neu_tau001000um_M0800_2017": 0.0000, +"mfv_neu_tau010000um_M0800_2017": 0.0004, +"mfv_neu_tau030000um_M0800_2017": 0.0003, +"mfv_neu_tau000100um_M1200_2017": 0.0000, +"mfv_neu_tau000300um_M1200_2017": 0.0000, +"mfv_neu_tau001000um_M1200_2017": 0.0000, +"mfv_neu_tau010000um_M1200_2017": 0.0000, +"mfv_neu_tau000100um_M1600_2017": 0.0000, +"mfv_neu_tau000300um_M1600_2017": 0.0000, +"mfv_neu_tau001000um_M1600_2017": 0.0000, +"mfv_neu_tau010000um_M1600_2017": 0.0000, +"mfv_neu_tau030000um_M1600_2017": 0.0000, +"mfv_neu_tau001000um_M3000_2017": 0.0000, +"mfv_neu_tau010000um_M3000_2017": 0.0000, +"mfv_neu_tau030000um_M3000_2017": 0.0000, +"mfv_stopdbardbar_tau000100um_M0200_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M0200_2017": 0.0000, +"mfv_stopdbardbar_tau010000um_M0200_2017": 0.0042, +"mfv_stopdbardbar_tau030000um_M0200_2017": 0.0057, +"mfv_stopdbardbar_tau000100um_M0300_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M0300_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M0300_2017": 0.0004, +"mfv_stopdbardbar_tau010000um_M0300_2017": 0.0029, +"mfv_stopdbardbar_tau030000um_M0300_2017": 0.0084, +"mfv_stopdbardbar_tau000100um_M0400_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M0400_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M0400_2017": 0.0001, +"mfv_stopdbardbar_tau010000um_M0400_2017": 0.0021, +"mfv_stopdbardbar_tau030000um_M0400_2017": 0.0031, +"mfv_stopdbardbar_tau000100um_M0600_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M0600_2017": 0.0000, +"mfv_stopdbardbar_tau010000um_M0600_2017": 0.0005, +"mfv_stopdbardbar_tau030000um_M0600_2017": 0.0005, +"mfv_stopdbardbar_tau000100um_M0800_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M0800_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M0800_2017": 0.0000, +"mfv_stopdbardbar_tau010000um_M0800_2017": 0.0002, +"mfv_stopdbardbar_tau030000um_M0800_2017": 0.0002, +"mfv_stopdbardbar_tau000100um_M1200_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M1200_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M1200_2017": 0.0000, +"mfv_stopdbardbar_tau010000um_M1200_2017": 0.0001, +"mfv_stopdbardbar_tau030000um_M1200_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M1600_2017": 0.0000, +"mfv_stopdbardbar_tau010000um_M1600_2017": 0.0001, +"mfv_stopdbardbar_tau030000um_M1600_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M3000_2017": 0.0000, +"mfv_stopdbardbar_tau010000um_M3000_2017": 0.0000, +"mfv_stopdbardbar_tau030000um_M3000_2017": 0.0000, +"mfv_stopbbarbbar_tau000100um_M0200_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0200_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0200_2017": 0.0006, +"mfv_stopbbarbbar_tau010000um_M0200_2017": 0.0031, +"mfv_stopbbarbbar_tau030000um_M0200_2017": 0.0090, +"mfv_stopbbarbbar_tau000100um_M0300_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0300_2017": 0.0002, +"mfv_stopbbarbbar_tau010000um_M0300_2017": 0.0064, +"mfv_stopbbarbbar_tau030000um_M0300_2017": 0.0060, +"mfv_stopbbarbbar_tau000100um_M0400_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0400_2017": 0.0001, +"mfv_stopbbarbbar_tau010000um_M0400_2017": 0.0027, +"mfv_stopbbarbbar_tau030000um_M0400_2017": 0.0056, +"mfv_stopbbarbbar_tau000100um_M0600_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0600_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0600_2017": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0600_2017": 0.0001, +"mfv_stopbbarbbar_tau030000um_M0600_2017": 0.0000, +"mfv_stopbbarbbar_tau000100um_M0800_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0800_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0800_2017": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0800_2017": 0.0001, +"mfv_stopbbarbbar_tau030000um_M0800_2017": 0.0000, +"mfv_stopbbarbbar_tau000100um_M1200_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1200_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1200_2017": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1200_2017": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1200_2017": 0.0001, +"mfv_stopbbarbbar_tau000300um_M1600_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1600_2017": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1600_2017": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1600_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M3000_2017": 0.0000, +"mfv_stopbbarbbar_tau010000um_M3000_2017": 0.0000, +"mfv_stopbbarbbar_tau030000um_M3000_2017": 0.0000, +"mfv_neu_tau000100um_M0200_2016": 0.0000, +"mfv_neu_tau000300um_M0200_2016": 0.0001, +"mfv_neu_tau001000um_M0200_2016": 0.0007, +"mfv_neu_tau010000um_M0200_2016": 0.0029, +"mfv_neu_tau030000um_M0200_2016": 0.0072, +"mfv_neu_tau000100um_M0300_2016": 0.0000, +"mfv_neu_tau000300um_M0300_2016": 0.0000, +"mfv_neu_tau001000um_M0300_2016": 0.0016, +"mfv_neu_tau010000um_M0300_2016": 0.0053, +"mfv_neu_tau030000um_M0300_2016": 0.0084, +"mfv_neu_tau000100um_M0400_2016": 0.0000, +"mfv_neu_tau000300um_M0400_2016": 0.0000, +"mfv_neu_tau001000um_M0400_2016": 0.0000, +"mfv_neu_tau010000um_M0400_2016": 0.0034, +"mfv_neu_tau030000um_M0400_2016": 0.0033, +"mfv_neu_tau000100um_M0600_2016": 0.0000, +"mfv_neu_tau000300um_M0600_2016": 0.0000, +"mfv_neu_tau001000um_M0600_2016": 0.0001, +"mfv_neu_tau010000um_M0600_2016": 0.0006, +"mfv_neu_tau030000um_M0600_2016": 0.0002, +"mfv_neu_tau000100um_M0800_2016": 0.0000, +"mfv_neu_tau000300um_M0800_2016": 0.0000, +"mfv_neu_tau001000um_M0800_2016": 0.0000, +"mfv_neu_tau010000um_M0800_2016": 0.0000, +"mfv_neu_tau030000um_M0800_2016": 0.0002, +"mfv_neu_tau000100um_M1200_2016": 0.0000, +"mfv_neu_tau000300um_M1200_2016": 0.0000, +"mfv_neu_tau001000um_M1200_2016": 0.0000, +"mfv_neu_tau010000um_M1200_2016": 0.0000, +"mfv_neu_tau030000um_M1200_2016": 0.0000, +"mfv_neu_tau000100um_M1600_2016": 0.0000, +"mfv_neu_tau000300um_M1600_2016": 0.0000, +"mfv_neu_tau001000um_M1600_2016": 0.0000, +"mfv_neu_tau010000um_M1600_2016": 0.0000, +"mfv_neu_tau030000um_M1600_2016": 0.0000, +"mfv_neu_tau000300um_M3000_2016": 0.0000, +"mfv_neu_tau001000um_M3000_2016": 0.0000, +"mfv_neu_tau010000um_M3000_2016": 0.0000, +"mfv_neu_tau030000um_M3000_2016": 0.0000, +"mfv_stopdbardbar_tau000100um_M0200_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M0200_2016": 0.0000, +"mfv_stopdbardbar_tau010000um_M0200_2016": 0.0019, +"mfv_stopdbardbar_tau030000um_M0200_2016": 0.0039, +"mfv_stopdbardbar_tau000100um_M0300_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0300_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M0300_2016": 0.0001, +"mfv_stopdbardbar_tau010000um_M0300_2016": 0.0036, +"mfv_stopdbardbar_tau030000um_M0300_2016": 0.0056, +"mfv_stopdbardbar_tau000100um_M0400_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0400_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M0400_2016": 0.0001, +"mfv_stopdbardbar_tau010000um_M0400_2016": 0.0010, +"mfv_stopdbardbar_tau030000um_M0400_2016": 0.0012, +"mfv_stopdbardbar_tau000100um_M0600_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0600_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M0600_2016": 0.0001, +"mfv_stopdbardbar_tau010000um_M0600_2016": 0.0005, +"mfv_stopdbardbar_tau030000um_M0600_2016": 0.0000, +"mfv_stopdbardbar_tau000100um_M0800_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0800_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M0800_2016": 0.0000, +"mfv_stopdbardbar_tau010000um_M0800_2016": 0.0003, +"mfv_stopdbardbar_tau030000um_M0800_2016": 0.0002, +"mfv_stopdbardbar_tau000100um_M1200_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M1200_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M1200_2016": 0.0000, +"mfv_stopdbardbar_tau010000um_M1200_2016": 0.0000, +"mfv_stopdbardbar_tau030000um_M1200_2016": 0.0000, +"mfv_stopdbardbar_tau000100um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau010000um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau030000um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M3000_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M3000_2016": 0.0000, +"mfv_stopdbardbar_tau030000um_M3000_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0200_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0200_2016": 0.0006, +"mfv_stopbbarbbar_tau010000um_M0200_2016": 0.0000, +"mfv_stopbbarbbar_tau030000um_M0200_2016": 0.0124, +"mfv_stopbbarbbar_tau000100um_M0300_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0300_2016": 0.0006, +"mfv_stopbbarbbar_tau010000um_M0300_2016": 0.0047, +"mfv_stopbbarbbar_tau030000um_M0300_2016": 0.0046, +"mfv_stopbbarbbar_tau000100um_M0400_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0400_2016": 0.0001, +"mfv_stopbbarbbar_tau010000um_M0400_2016": 0.0012, +"mfv_stopbbarbbar_tau030000um_M0400_2016": 0.0029, +"mfv_stopbbarbbar_tau000100um_M0600_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0600_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0600_2016": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0600_2016": 0.0002, +"mfv_stopbbarbbar_tau030000um_M0600_2016": 0.0000, +"mfv_stopbbarbbar_tau000100um_M0800_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0800_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0800_2016": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0800_2016": 0.0000, +"mfv_stopbbarbbar_tau030000um_M0800_2016": 0.0000, +"mfv_stopbbarbbar_tau000100um_M1200_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1200_2016": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1200_2016": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1200_2016": 0.0000, +"mfv_stopbbarbbar_tau000100um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M3000_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M3000_2016": 0.0000, +"mfv_stopbbarbbar_tau010000um_M3000_2016": 0.0000, +"mfv_stopbbarbbar_tau030000um_M3000_2016": 0.0000, +"mfv_neu_tau000100um_M0200_2016APV": 0.0000, +"mfv_neu_tau000300um_M0200_2016APV": 0.0000, +"mfv_neu_tau001000um_M0200_2016APV": 0.0009, +"mfv_neu_tau010000um_M0200_2016APV": 0.0039, +"mfv_neu_tau030000um_M0200_2016APV": 0.0032, +"mfv_neu_tau000100um_M0300_2016APV": 0.0000, +"mfv_neu_tau000300um_M0300_2016APV": 0.0001, +"mfv_neu_tau001000um_M0300_2016APV": 0.0004, +"mfv_neu_tau010000um_M0300_2016APV": 0.0002, +"mfv_neu_tau030000um_M0300_2016APV": 0.0060, +"mfv_neu_tau000100um_M0400_2016APV": 0.0000, +"mfv_neu_tau000300um_M0400_2016APV": 0.0000, +"mfv_neu_tau001000um_M0400_2016APV": 0.0000, +"mfv_neu_tau010000um_M0400_2016APV": 0.0019, +"mfv_neu_tau030000um_M0400_2016APV": 0.0032, +"mfv_neu_tau000100um_M0600_2016APV": 0.0000, +"mfv_neu_tau000300um_M0600_2016APV": 0.0000, +"mfv_neu_tau001000um_M0600_2016APV": 0.0000, +"mfv_neu_tau010000um_M0600_2016APV": 0.0007, +"mfv_neu_tau030000um_M0600_2016APV": 0.0006, +"mfv_neu_tau000100um_M0800_2016APV": 0.0000, +"mfv_neu_tau000300um_M0800_2016APV": 0.0000, +"mfv_neu_tau001000um_M0800_2016APV": 0.0000, +"mfv_neu_tau010000um_M0800_2016APV": 0.0000, +"mfv_neu_tau030000um_M0800_2016APV": 0.0002, +"mfv_neu_tau000100um_M1200_2016APV": 0.0000, +"mfv_neu_tau000300um_M1200_2016APV": 0.0000, +"mfv_neu_tau001000um_M1200_2016APV": 0.0000, +"mfv_neu_tau010000um_M1200_2016APV": 0.0000, +"mfv_neu_tau000100um_M1600_2016APV": 0.0000, +"mfv_neu_tau000300um_M1600_2016APV": 0.0000, +"mfv_neu_tau001000um_M1600_2016APV": 0.0000, +"mfv_neu_tau010000um_M1600_2016APV": 0.0000, +"mfv_neu_tau030000um_M1600_2016APV": 0.0000, +"mfv_neu_tau001000um_M3000_2016APV": 0.0000, +"mfv_neu_tau010000um_M3000_2016APV": 0.0000, +"mfv_neu_tau030000um_M3000_2016APV": 0.0000, +"mfv_stopdbardbar_tau000100um_M0200_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M0200_2016APV": 0.0004, +"mfv_stopdbardbar_tau010000um_M0200_2016APV": 0.0071, +"mfv_stopdbardbar_tau030000um_M0200_2016APV": 0.0093, +"mfv_stopdbardbar_tau000100um_M0300_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0300_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M0300_2016APV": 0.0001, +"mfv_stopdbardbar_tau010000um_M0300_2016APV": 0.0028, +"mfv_stopdbardbar_tau030000um_M0300_2016APV": 0.0032, +"mfv_stopdbardbar_tau000100um_M0400_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0400_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M0400_2016APV": 0.0008, +"mfv_stopdbardbar_tau030000um_M0400_2016APV": 0.0011, +"mfv_stopdbardbar_tau000100um_M0600_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0600_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M0600_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M0600_2016APV": 0.0005, +"mfv_stopdbardbar_tau030000um_M0600_2016APV": 0.0004, +"mfv_stopdbardbar_tau000100um_M0800_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0800_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M0800_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M0800_2016APV": 0.0000, +"mfv_stopdbardbar_tau030000um_M0800_2016APV": 0.0000, +"mfv_stopdbardbar_tau000100um_M1200_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M1200_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M1200_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M1200_2016APV": 0.0000, +"mfv_stopdbardbar_tau030000um_M1200_2016APV": 0.0000, +"mfv_stopdbardbar_tau000100um_M1600_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M1600_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M1600_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M1600_2016APV": 0.0000, +"mfv_stopdbardbar_tau030000um_M1600_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M3000_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M3000_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M3000_2016APV": 0.0000, +"mfv_stopdbardbar_tau030000um_M3000_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000100um_M0200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0200_2016APV": 0.0014, +"mfv_stopbbarbbar_tau030000um_M0200_2016APV": 0.0039, +"mfv_stopbbarbbar_tau000100um_M0300_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0300_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0300_2016APV": 0.0044, +"mfv_stopbbarbbar_tau030000um_M0300_2016APV": 0.0041, +"mfv_stopbbarbbar_tau000100um_M0400_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0400_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0400_2016APV": 0.0014, +"mfv_stopbbarbbar_tau030000um_M0400_2016APV": 0.0018, +"mfv_stopbbarbbar_tau000100um_M0600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau030000um_M0600_2016APV": 0.0006, +"mfv_stopbbarbbar_tau000100um_M0800_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0800_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0800_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0800_2016APV": 0.0000, +"mfv_stopbbarbbar_tau030000um_M0800_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000100um_M1200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1200_2016APV": 0.0001, +"mfv_stopbbarbbar_tau030000um_M1200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000100um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M3000_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M3000_2016APV": 0.0000, +"mfv_stopbbarbbar_tau030000um_M3000_2016APV": 0.0000, +} + +jer_up_uncerts = { +"ggHToSSTodddd_tau1mm_M55_2018": 0.0001, +"ggHToSSTodddd_tau10mm_M55_2018": 0.0030, +"ggHToSSTodddd_tau100mm_M55_2018": 0.0610, +"ggHToSSTodddd_tau1mm_M55_2017": 0.0001, +"ggHToSSTodddd_tau10mm_M55_2017": 0.0017, +"ggHToSSTodddd_tau100mm_M55_2017": 0.0200, +"ggHToSSTodddd_tau1mm_M55_2016": 0.0017, +"ggHToSSTodddd_tau10mm_M55_2016": 0.0091, +"ggHToSSTodddd_tau1mm_M55_2016APV": 0.0020, +"ggHToSSTodddd_tau10mm_M55_2016APV": 0.0010, +"ggHToSSTodddd_tau100mm_M55_2016APV": 0.0000, +"mfv_neu_tau000100um_M0200_2018": 0.0000, +"mfv_neu_tau000300um_M0200_2018": 0.0002, +"mfv_neu_tau010000um_M0200_2018": 0.0042, +"mfv_neu_tau030000um_M0200_2018": 0.0145, +"mfv_neu_tau000100um_M0300_2018": 0.0000, +"mfv_neu_tau000300um_M0300_2018": 0.0001, +"mfv_neu_tau001000um_M0300_2018": 0.0008, +"mfv_neu_tau010000um_M0300_2018": 0.0172, +"mfv_neu_tau030000um_M0300_2018": 0.0213, +"mfv_neu_tau000100um_M0400_2018": 0.0000, +"mfv_neu_tau000300um_M0400_2018": 0.0000, +"mfv_neu_tau001000um_M0400_2018": 0.0040, +"mfv_neu_tau010000um_M0400_2018": 0.0118, +"mfv_neu_tau030000um_M0400_2018": 0.0182, +"mfv_neu_tau000100um_M0600_2018": 0.0000, +"mfv_neu_tau001000um_M0600_2018": 0.0012, +"mfv_neu_tau010000um_M0600_2018": 0.0018, +"mfv_neu_tau030000um_M0600_2018": 0.0029, +"mfv_neu_tau000100um_M0800_2018": 0.0000, +"mfv_neu_tau000300um_M0800_2018": 0.0000, +"mfv_neu_tau001000um_M0800_2018": 0.0002, +"mfv_neu_tau010000um_M0800_2018": 0.0001, +"mfv_neu_tau030000um_M0800_2018": 0.0006, +"mfv_neu_tau000100um_M1200_2018": 0.0000, +"mfv_neu_tau000300um_M1200_2018": 0.0000, +"mfv_neu_tau001000um_M1200_2018": 0.0000, +"mfv_neu_tau010000um_M1200_2018": 0.0000, +"mfv_neu_tau030000um_M1200_2018": 0.0000, +"mfv_neu_tau000100um_M1600_2018": 0.0000, +"mfv_neu_tau000300um_M1600_2018": 0.0000, +"mfv_neu_tau001000um_M1600_2018": 0.0001, +"mfv_neu_tau010000um_M1600_2018": 0.0000, +"mfv_neu_tau030000um_M1600_2018": 0.0000, +"mfv_neu_tau000300um_M3000_2018": 0.0000, +"mfv_neu_tau001000um_M3000_2018": 0.0000, +"mfv_neu_tau030000um_M3000_2018": 0.0000, +"mfv_stopdbardbar_tau000100um_M0200_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2018": 0.0007, +"mfv_stopdbardbar_tau001000um_M0200_2018": 0.0041, +"mfv_stopdbardbar_tau010000um_M0200_2018": 0.0099, +"mfv_stopdbardbar_tau030000um_M0200_2018": 0.0208, +"mfv_stopdbardbar_tau000100um_M0300_2018": 0.0001, +"mfv_stopdbardbar_tau000300um_M0300_2018": 0.0001, +"mfv_stopdbardbar_tau001000um_M0300_2018": 0.0039, +"mfv_stopdbardbar_tau010000um_M0300_2018": 0.0125, +"mfv_stopdbardbar_tau030000um_M0300_2018": 0.0138, +"mfv_stopdbardbar_tau000100um_M0400_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M0400_2018": 0.0001, +"mfv_stopdbardbar_tau001000um_M0400_2018": 0.0020, +"mfv_stopdbardbar_tau010000um_M0400_2018": 0.0071, +"mfv_stopdbardbar_tau000100um_M0600_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M0600_2018": 0.0000, +"mfv_stopdbardbar_tau001000um_M0600_2018": 0.0008, +"mfv_stopdbardbar_tau010000um_M0600_2018": 0.0005, +"mfv_stopdbardbar_tau030000um_M0600_2018": 0.0013, +"mfv_stopdbardbar_tau000100um_M0800_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M0800_2018": 0.0000, +"mfv_stopdbardbar_tau001000um_M0800_2018": 0.0002, +"mfv_stopdbardbar_tau010000um_M0800_2018": 0.0003, +"mfv_stopdbardbar_tau030000um_M0800_2018": 0.0007, +"mfv_stopdbardbar_tau000100um_M1200_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M1200_2018": 0.0000, +"mfv_stopdbardbar_tau001000um_M1200_2018": 0.0001, +"mfv_stopdbardbar_tau010000um_M1200_2018": 0.0001, +"mfv_stopdbardbar_tau030000um_M1200_2018": 0.0000, +"mfv_stopdbardbar_tau000100um_M1600_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M1600_2018": 0.0000, +"mfv_stopdbardbar_tau001000um_M1600_2018": 0.0002, +"mfv_stopdbardbar_tau010000um_M1600_2018": 0.0003, +"mfv_stopdbardbar_tau030000um_M1600_2018": 0.0001, +"mfv_stopdbardbar_tau001000um_M3000_2018": 0.0001, +"mfv_stopdbardbar_tau010000um_M3000_2018": 0.0000, +"mfv_stopdbardbar_tau030000um_M3000_2018": 0.0000, +"mfv_stopbbarbbar_tau000100um_M0200_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0200_2018": 0.0008, +"mfv_stopbbarbbar_tau001000um_M0200_2018": 0.0073, +"mfv_stopbbarbbar_tau010000um_M0200_2018": 0.0121, +"mfv_stopbbarbbar_tau030000um_M0200_2018": 0.0174, +"mfv_stopbbarbbar_tau000100um_M0300_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2018": 0.0001, +"mfv_stopbbarbbar_tau001000um_M0300_2018": 0.0040, +"mfv_stopbbarbbar_tau010000um_M0300_2018": 0.0149, +"mfv_stopbbarbbar_tau030000um_M0300_2018": 0.0232, +"mfv_stopbbarbbar_tau000100um_M0400_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0400_2018": 0.0012, +"mfv_stopbbarbbar_tau010000um_M0400_2018": 0.0088, +"mfv_stopbbarbbar_tau030000um_M0400_2018": 0.0167, +"mfv_stopbbarbbar_tau000100um_M0600_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0600_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0600_2018": 0.0004, +"mfv_stopbbarbbar_tau010000um_M0600_2018": 0.0015, +"mfv_stopbbarbbar_tau030000um_M0600_2018": 0.0026, +"mfv_stopbbarbbar_tau000100um_M0800_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0800_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0800_2018": 0.0002, +"mfv_stopbbarbbar_tau010000um_M0800_2018": 0.0003, +"mfv_stopbbarbbar_tau030000um_M0800_2018": 0.0007, +"mfv_stopbbarbbar_tau000100um_M1200_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1200_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1200_2018": 0.0001, +"mfv_stopbbarbbar_tau010000um_M1200_2018": 0.0003, +"mfv_stopbbarbbar_tau030000um_M1200_2018": 0.0001, +"mfv_stopbbarbbar_tau000100um_M1600_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1600_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1600_2018": 0.0003, +"mfv_stopbbarbbar_tau010000um_M1600_2018": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1600_2018": 0.0002, +"mfv_stopbbarbbar_tau001000um_M3000_2018": 0.0002, +"mfv_stopbbarbbar_tau010000um_M3000_2018": 0.0002, +"mfv_stopbbarbbar_tau030000um_M3000_2018": 0.0001, +"mfv_neu_tau000100um_M0200_2017": 0.0000, +"mfv_neu_tau000300um_M0200_2017": 0.0000, +"mfv_neu_tau010000um_M0200_2017": 0.0042, +"mfv_neu_tau030000um_M0200_2017": 0.0137, +"mfv_neu_tau000100um_M0300_2017": 0.0000, +"mfv_neu_tau000300um_M0300_2017": 0.0000, +"mfv_neu_tau001000um_M0300_2017": 0.0007, +"mfv_neu_tau010000um_M0300_2017": 0.0130, +"mfv_neu_tau030000um_M0300_2017": 0.0156, +"mfv_neu_tau000100um_M0400_2017": 0.0000, +"mfv_neu_tau001000um_M0400_2017": 0.0002, +"mfv_neu_tau010000um_M0400_2017": 0.0130, +"mfv_neu_tau030000um_M0400_2017": 0.0166, +"mfv_neu_tau000100um_M0600_2017": 0.0000, +"mfv_neu_tau000300um_M0600_2017": 0.0000, +"mfv_neu_tau001000um_M0600_2017": 0.0000, +"mfv_neu_tau010000um_M0600_2017": 0.0023, +"mfv_neu_tau030000um_M0600_2017": 0.0043, +"mfv_neu_tau000300um_M0800_2017": 0.0000, +"mfv_neu_tau001000um_M0800_2017": 0.0000, +"mfv_neu_tau010000um_M0800_2017": 0.0004, +"mfv_neu_tau030000um_M0800_2017": 0.0005, +"mfv_neu_tau000100um_M1200_2017": 0.0000, +"mfv_neu_tau000300um_M1200_2017": 0.0000, +"mfv_neu_tau001000um_M1200_2017": 0.0000, +"mfv_neu_tau010000um_M1200_2017": 0.0000, +"mfv_neu_tau000100um_M1600_2017": 0.0000, +"mfv_neu_tau000300um_M1600_2017": 0.0000, +"mfv_neu_tau001000um_M1600_2017": 0.0000, +"mfv_neu_tau010000um_M1600_2017": 0.0000, +"mfv_neu_tau030000um_M1600_2017": 0.0000, +"mfv_neu_tau001000um_M3000_2017": 0.0000, +"mfv_neu_tau010000um_M3000_2017": 0.0000, +"mfv_neu_tau030000um_M3000_2017": 0.0002, +"mfv_stopdbardbar_tau000100um_M0200_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2017": 0.0001, +"mfv_stopdbardbar_tau001000um_M0200_2017": 0.0018, +"mfv_stopdbardbar_tau010000um_M0200_2017": 0.0073, +"mfv_stopdbardbar_tau030000um_M0200_2017": 0.0048, +"mfv_stopdbardbar_tau000100um_M0300_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M0300_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M0300_2017": 0.0008, +"mfv_stopdbardbar_tau010000um_M0300_2017": 0.0082, +"mfv_stopdbardbar_tau030000um_M0300_2017": 0.0167, +"mfv_stopdbardbar_tau000100um_M0400_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M0400_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M0400_2017": 0.0002, +"mfv_stopdbardbar_tau010000um_M0400_2017": 0.0058, +"mfv_stopdbardbar_tau030000um_M0400_2017": 0.0077, +"mfv_stopdbardbar_tau000100um_M0600_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M0600_2017": 0.0000, +"mfv_stopdbardbar_tau010000um_M0600_2017": 0.0012, +"mfv_stopdbardbar_tau030000um_M0600_2017": 0.0012, +"mfv_stopdbardbar_tau000100um_M0800_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M0800_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M0800_2017": 0.0000, +"mfv_stopdbardbar_tau010000um_M0800_2017": 0.0005, +"mfv_stopdbardbar_tau030000um_M0800_2017": 0.0004, +"mfv_stopdbardbar_tau000100um_M1200_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M1200_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M1200_2017": 0.0000, +"mfv_stopdbardbar_tau010000um_M1200_2017": 0.0001, +"mfv_stopdbardbar_tau030000um_M1200_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M1600_2017": 0.0000, +"mfv_stopdbardbar_tau010000um_M1600_2017": 0.0001, +"mfv_stopdbardbar_tau030000um_M1600_2017": 0.0002, +"mfv_stopdbardbar_tau001000um_M3000_2017": 0.0000, +"mfv_stopdbardbar_tau010000um_M3000_2017": 0.0000, +"mfv_stopdbardbar_tau030000um_M3000_2017": 0.0000, +"mfv_stopbbarbbar_tau000100um_M0200_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0200_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0200_2017": 0.0010, +"mfv_stopbbarbbar_tau010000um_M0200_2017": 0.0075, +"mfv_stopbbarbbar_tau030000um_M0200_2017": 0.0199, +"mfv_stopbbarbbar_tau000100um_M0300_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0300_2017": 0.0006, +"mfv_stopbbarbbar_tau010000um_M0300_2017": 0.0123, +"mfv_stopbbarbbar_tau030000um_M0300_2017": 0.0172, +"mfv_stopbbarbbar_tau000100um_M0400_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0400_2017": 0.0002, +"mfv_stopbbarbbar_tau010000um_M0400_2017": 0.0071, +"mfv_stopbbarbbar_tau030000um_M0400_2017": 0.0119, +"mfv_stopbbarbbar_tau000100um_M0600_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0600_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0600_2017": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0600_2017": 0.0014, +"mfv_stopbbarbbar_tau030000um_M0600_2017": 0.0005, +"mfv_stopbbarbbar_tau000100um_M0800_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0800_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0800_2017": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0800_2017": 0.0003, +"mfv_stopbbarbbar_tau030000um_M0800_2017": 0.0002, +"mfv_stopbbarbbar_tau000100um_M1200_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1200_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1200_2017": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1200_2017": 0.0001, +"mfv_stopbbarbbar_tau030000um_M1200_2017": 0.0004, +"mfv_stopbbarbbar_tau000300um_M1600_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1600_2017": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1600_2017": 0.0001, +"mfv_stopbbarbbar_tau030000um_M1600_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M3000_2017": 0.0000, +"mfv_stopbbarbbar_tau010000um_M3000_2017": 0.0000, +"mfv_stopbbarbbar_tau030000um_M3000_2017": 0.0000, +"mfv_neu_tau000100um_M0200_2016": 0.0000, +"mfv_neu_tau000300um_M0200_2016": 0.0001, +"mfv_neu_tau001000um_M0200_2016": 0.0013, +"mfv_neu_tau010000um_M0200_2016": 0.0021, +"mfv_neu_tau030000um_M0200_2016": 0.0089, +"mfv_neu_tau000100um_M0300_2016": 0.0000, +"mfv_neu_tau000300um_M0300_2016": 0.0000, +"mfv_neu_tau001000um_M0300_2016": 0.0030, +"mfv_neu_tau010000um_M0300_2016": 0.0105, +"mfv_neu_tau030000um_M0300_2016": 0.0131, +"mfv_neu_tau000100um_M0400_2016": 0.0000, +"mfv_neu_tau000300um_M0400_2016": 0.0000, +"mfv_neu_tau001000um_M0400_2016": 0.0002, +"mfv_neu_tau010000um_M0400_2016": 0.0065, +"mfv_neu_tau030000um_M0400_2016": 0.0080, +"mfv_neu_tau000100um_M0600_2016": 0.0000, +"mfv_neu_tau000300um_M0600_2016": 0.0000, +"mfv_neu_tau001000um_M0600_2016": 0.0005, +"mfv_neu_tau010000um_M0600_2016": 0.0005, +"mfv_neu_tau030000um_M0600_2016": 0.0003, +"mfv_neu_tau000100um_M0800_2016": 0.0000, +"mfv_neu_tau000300um_M0800_2016": 0.0000, +"mfv_neu_tau001000um_M0800_2016": 0.0000, +"mfv_neu_tau010000um_M0800_2016": 0.0000, +"mfv_neu_tau030000um_M0800_2016": 0.0002, +"mfv_neu_tau000100um_M1200_2016": 0.0000, +"mfv_neu_tau000300um_M1200_2016": 0.0000, +"mfv_neu_tau001000um_M1200_2016": 0.0000, +"mfv_neu_tau010000um_M1200_2016": 0.0000, +"mfv_neu_tau030000um_M1200_2016": 0.0000, +"mfv_neu_tau000100um_M1600_2016": 0.0000, +"mfv_neu_tau000300um_M1600_2016": 0.0000, +"mfv_neu_tau001000um_M1600_2016": 0.0000, +"mfv_neu_tau010000um_M1600_2016": 0.0000, +"mfv_neu_tau030000um_M1600_2016": 0.0000, +"mfv_neu_tau000300um_M3000_2016": 0.0000, +"mfv_neu_tau001000um_M3000_2016": 0.0000, +"mfv_neu_tau010000um_M3000_2016": 0.0000, +"mfv_neu_tau030000um_M3000_2016": 0.0000, +"mfv_stopdbardbar_tau000100um_M0200_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M0200_2016": 0.0006, +"mfv_stopdbardbar_tau010000um_M0200_2016": 0.0081, +"mfv_stopdbardbar_tau030000um_M0200_2016": 0.0028, +"mfv_stopdbardbar_tau000100um_M0300_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0300_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M0300_2016": 0.0004, +"mfv_stopdbardbar_tau010000um_M0300_2016": 0.0050, +"mfv_stopdbardbar_tau030000um_M0300_2016": 0.0110, +"mfv_stopdbardbar_tau000100um_M0400_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0400_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M0400_2016": 0.0002, +"mfv_stopdbardbar_tau010000um_M0400_2016": 0.0019, +"mfv_stopdbardbar_tau030000um_M0400_2016": 0.0033, +"mfv_stopdbardbar_tau000100um_M0600_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0600_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M0600_2016": 0.0001, +"mfv_stopdbardbar_tau010000um_M0600_2016": 0.0010, +"mfv_stopdbardbar_tau030000um_M0600_2016": 0.0002, +"mfv_stopdbardbar_tau000100um_M0800_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0800_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M0800_2016": 0.0000, +"mfv_stopdbardbar_tau010000um_M0800_2016": 0.0005, +"mfv_stopdbardbar_tau030000um_M0800_2016": 0.0002, +"mfv_stopdbardbar_tau000100um_M1200_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M1200_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M1200_2016": 0.0000, +"mfv_stopdbardbar_tau010000um_M1200_2016": 0.0001, +"mfv_stopdbardbar_tau030000um_M1200_2016": 0.0000, +"mfv_stopdbardbar_tau000100um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau010000um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau030000um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M3000_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M3000_2016": 0.0000, +"mfv_stopdbardbar_tau030000um_M3000_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0200_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0200_2016": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0200_2016": 0.0016, +"mfv_stopbbarbbar_tau030000um_M0200_2016": 0.0047, +"mfv_stopbbarbbar_tau000100um_M0300_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0300_2016": 0.0005, +"mfv_stopbbarbbar_tau010000um_M0300_2016": 0.0077, +"mfv_stopbbarbbar_tau030000um_M0300_2016": 0.0114, +"mfv_stopbbarbbar_tau000100um_M0400_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0400_2016": 0.0001, +"mfv_stopbbarbbar_tau010000um_M0400_2016": 0.0041, +"mfv_stopbbarbbar_tau030000um_M0400_2016": 0.0066, +"mfv_stopbbarbbar_tau000100um_M0600_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0600_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0600_2016": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0600_2016": 0.0002, +"mfv_stopbbarbbar_tau030000um_M0600_2016": 0.0009, +"mfv_stopbbarbbar_tau000100um_M0800_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0800_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0800_2016": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0800_2016": 0.0000, +"mfv_stopbbarbbar_tau030000um_M0800_2016": 0.0002, +"mfv_stopbbarbbar_tau000100um_M1200_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1200_2016": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1200_2016": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1200_2016": 0.0000, +"mfv_stopbbarbbar_tau000100um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M3000_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M3000_2016": 0.0000, +"mfv_stopbbarbbar_tau010000um_M3000_2016": 0.0000, +"mfv_stopbbarbbar_tau030000um_M3000_2016": 0.0000, +"mfv_neu_tau000100um_M0200_2016APV": 0.0000, +"mfv_neu_tau000300um_M0200_2016APV": 0.0000, +"mfv_neu_tau001000um_M0200_2016APV": 0.0005, +"mfv_neu_tau010000um_M0200_2016APV": 0.0055, +"mfv_neu_tau030000um_M0200_2016APV": 0.0009, +"mfv_neu_tau000100um_M0300_2016APV": 0.0000, +"mfv_neu_tau000300um_M0300_2016APV": 0.0003, +"mfv_neu_tau001000um_M0300_2016APV": 0.0004, +"mfv_neu_tau010000um_M0300_2016APV": 0.0037, +"mfv_neu_tau030000um_M0300_2016APV": 0.0139, +"mfv_neu_tau000100um_M0400_2016APV": 0.0000, +"mfv_neu_tau000300um_M0400_2016APV": 0.0000, +"mfv_neu_tau001000um_M0400_2016APV": 0.0004, +"mfv_neu_tau010000um_M0400_2016APV": 0.0041, +"mfv_neu_tau030000um_M0400_2016APV": 0.0054, +"mfv_neu_tau000100um_M0600_2016APV": 0.0000, +"mfv_neu_tau000300um_M0600_2016APV": 0.0000, +"mfv_neu_tau001000um_M0600_2016APV": 0.0000, +"mfv_neu_tau010000um_M0600_2016APV": 0.0016, +"mfv_neu_tau030000um_M0600_2016APV": 0.0008, +"mfv_neu_tau000100um_M0800_2016APV": 0.0000, +"mfv_neu_tau000300um_M0800_2016APV": 0.0000, +"mfv_neu_tau001000um_M0800_2016APV": 0.0000, +"mfv_neu_tau010000um_M0800_2016APV": 0.0000, +"mfv_neu_tau030000um_M0800_2016APV": 0.0002, +"mfv_neu_tau000100um_M1200_2016APV": 0.0000, +"mfv_neu_tau000300um_M1200_2016APV": 0.0000, +"mfv_neu_tau001000um_M1200_2016APV": 0.0000, +"mfv_neu_tau010000um_M1200_2016APV": 0.0000, +"mfv_neu_tau000100um_M1600_2016APV": 0.0000, +"mfv_neu_tau000300um_M1600_2016APV": 0.0000, +"mfv_neu_tau001000um_M1600_2016APV": 0.0000, +"mfv_neu_tau010000um_M1600_2016APV": 0.0000, +"mfv_neu_tau030000um_M1600_2016APV": 0.0000, +"mfv_neu_tau001000um_M3000_2016APV": 0.0000, +"mfv_neu_tau010000um_M3000_2016APV": 0.0000, +"mfv_neu_tau030000um_M3000_2016APV": 0.0000, +"mfv_stopdbardbar_tau000100um_M0200_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M0200_2016APV": 0.0004, +"mfv_stopdbardbar_tau010000um_M0200_2016APV": 0.0065, +"mfv_stopdbardbar_tau030000um_M0200_2016APV": 0.0061, +"mfv_stopdbardbar_tau000100um_M0300_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0300_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M0300_2016APV": 0.0002, +"mfv_stopdbardbar_tau010000um_M0300_2016APV": 0.0044, +"mfv_stopdbardbar_tau030000um_M0300_2016APV": 0.0058, +"mfv_stopdbardbar_tau000100um_M0400_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0400_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M0400_2016APV": 0.0012, +"mfv_stopdbardbar_tau030000um_M0400_2016APV": 0.0024, +"mfv_stopdbardbar_tau000100um_M0600_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0600_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M0600_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M0600_2016APV": 0.0004, +"mfv_stopdbardbar_tau030000um_M0600_2016APV": 0.0009, +"mfv_stopdbardbar_tau000100um_M0800_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0800_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M0800_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M0800_2016APV": 0.0001, +"mfv_stopdbardbar_tau030000um_M0800_2016APV": 0.0001, +"mfv_stopdbardbar_tau000100um_M1200_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M1200_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M1200_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M1200_2016APV": 0.0000, +"mfv_stopdbardbar_tau030000um_M1200_2016APV": 0.0000, +"mfv_stopdbardbar_tau000100um_M1600_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M1600_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M1600_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M1600_2016APV": 0.0000, +"mfv_stopdbardbar_tau030000um_M1600_2016APV": 0.0001, +"mfv_stopdbardbar_tau000300um_M3000_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M3000_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M3000_2016APV": 0.0000, +"mfv_stopdbardbar_tau030000um_M3000_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000100um_M0200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0200_2016APV": 0.0003, +"mfv_stopbbarbbar_tau010000um_M0200_2016APV": 0.0066, +"mfv_stopbbarbbar_tau030000um_M0200_2016APV": 0.0089, +"mfv_stopbbarbbar_tau000100um_M0300_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0300_2016APV": 0.0001, +"mfv_stopbbarbbar_tau010000um_M0300_2016APV": 0.0080, +"mfv_stopbbarbbar_tau030000um_M0300_2016APV": 0.0131, +"mfv_stopbbarbbar_tau000100um_M0400_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0400_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0400_2016APV": 0.0031, +"mfv_stopbbarbbar_tau030000um_M0400_2016APV": 0.0035, +"mfv_stopbbarbbar_tau000100um_M0600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0600_2016APV": 0.0002, +"mfv_stopbbarbbar_tau030000um_M0600_2016APV": 0.0006, +"mfv_stopbbarbbar_tau000100um_M0800_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0800_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0800_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0800_2016APV": 0.0000, +"mfv_stopbbarbbar_tau030000um_M0800_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000100um_M1200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000100um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M3000_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M3000_2016APV": 0.0000, +"mfv_stopbbarbbar_tau030000um_M3000_2016APV": 0.0000, +} + +jes_dn_uncerts = { +"ggHToSSTodddd_tau1mm_M55_2018": 0.0090, +"ggHToSSTodddd_tau10mm_M55_2018": 0.0391, +"ggHToSSTodddd_tau100mm_M55_2018": 0.2186, +"ggHToSSTodddd_tau1mm_M55_2017": 0.0032, +"ggHToSSTodddd_tau10mm_M55_2017": 0.0229, +"ggHToSSTodddd_tau100mm_M55_2017": 0.0212, +"ggHToSSTodddd_tau1mm_M55_2016": 0.0048, +"ggHToSSTodddd_tau10mm_M55_2016": 0.0341, +"ggHToSSTodddd_tau1mm_M55_2016APV": 0.0023, +"ggHToSSTodddd_tau10mm_M55_2016APV": 0.0437, +"ggHToSSTodddd_tau100mm_M55_2016APV": 0.0877, +"mfv_neu_tau000100um_M0200_2018": 0.0000, +"mfv_neu_tau000300um_M0200_2018": 0.0003, +"mfv_neu_tau010000um_M0200_2018": 0.0319, +"mfv_neu_tau030000um_M0200_2018": 0.0444, +"mfv_neu_tau000100um_M0300_2018": 0.0000, +"mfv_neu_tau000300um_M0300_2018": 0.0001, +"mfv_neu_tau001000um_M0300_2018": 0.0010, +"mfv_neu_tau010000um_M0300_2018": 0.0349, +"mfv_neu_tau030000um_M0300_2018": 0.0601, +"mfv_neu_tau000100um_M0400_2018": 0.0000, +"mfv_neu_tau000300um_M0400_2018": 0.0000, +"mfv_neu_tau001000um_M0400_2018": 0.0046, +"mfv_neu_tau010000um_M0400_2018": 0.0244, +"mfv_neu_tau030000um_M0400_2018": 0.0372, +"mfv_neu_tau000100um_M0600_2018": 0.0000, +"mfv_neu_tau001000um_M0600_2018": 0.0008, +"mfv_neu_tau010000um_M0600_2018": 0.0031, +"mfv_neu_tau030000um_M0600_2018": 0.0050, +"mfv_neu_tau000100um_M0800_2018": 0.0000, +"mfv_neu_tau000300um_M0800_2018": 0.0000, +"mfv_neu_tau001000um_M0800_2018": 0.0001, +"mfv_neu_tau010000um_M0800_2018": 0.0003, +"mfv_neu_tau030000um_M0800_2018": 0.0008, +"mfv_neu_tau000100um_M1200_2018": 0.0000, +"mfv_neu_tau000300um_M1200_2018": 0.0000, +"mfv_neu_tau001000um_M1200_2018": 0.0000, +"mfv_neu_tau010000um_M1200_2018": 0.0000, +"mfv_neu_tau030000um_M1200_2018": 0.0002, +"mfv_neu_tau000100um_M1600_2018": 0.0000, +"mfv_neu_tau000300um_M1600_2018": 0.0000, +"mfv_neu_tau001000um_M1600_2018": 0.0001, +"mfv_neu_tau010000um_M1600_2018": 0.0000, +"mfv_neu_tau030000um_M1600_2018": 0.0000, +"mfv_neu_tau000300um_M3000_2018": 0.0000, +"mfv_neu_tau001000um_M3000_2018": 0.0000, +"mfv_neu_tau030000um_M3000_2018": 0.0000, +"mfv_stopdbardbar_tau000100um_M0200_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2018": 0.0009, +"mfv_stopdbardbar_tau001000um_M0200_2018": 0.0064, +"mfv_stopdbardbar_tau010000um_M0200_2018": 0.0369, +"mfv_stopdbardbar_tau030000um_M0200_2018": 0.0651, +"mfv_stopdbardbar_tau000100um_M0300_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M0300_2018": 0.0001, +"mfv_stopdbardbar_tau001000um_M0300_2018": 0.0039, +"mfv_stopdbardbar_tau010000um_M0300_2018": 0.0301, +"mfv_stopdbardbar_tau030000um_M0300_2018": 0.0493, +"mfv_stopdbardbar_tau000100um_M0400_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M0400_2018": 0.0000, +"mfv_stopdbardbar_tau001000um_M0400_2018": 0.0018, +"mfv_stopdbardbar_tau010000um_M0400_2018": 0.0105, +"mfv_stopdbardbar_tau000100um_M0600_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M0600_2018": 0.0000, +"mfv_stopdbardbar_tau001000um_M0600_2018": 0.0004, +"mfv_stopdbardbar_tau010000um_M0600_2018": 0.0016, +"mfv_stopdbardbar_tau030000um_M0600_2018": 0.0020, +"mfv_stopdbardbar_tau000100um_M0800_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M0800_2018": 0.0000, +"mfv_stopdbardbar_tau001000um_M0800_2018": 0.0001, +"mfv_stopdbardbar_tau010000um_M0800_2018": 0.0003, +"mfv_stopdbardbar_tau030000um_M0800_2018": 0.0004, +"mfv_stopdbardbar_tau000100um_M1200_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M1200_2018": 0.0000, +"mfv_stopdbardbar_tau001000um_M1200_2018": 0.0001, +"mfv_stopdbardbar_tau010000um_M1200_2018": 0.0001, +"mfv_stopdbardbar_tau030000um_M1200_2018": 0.0000, +"mfv_stopdbardbar_tau000100um_M1600_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M1600_2018": 0.0000, +"mfv_stopdbardbar_tau001000um_M1600_2018": 0.0001, +"mfv_stopdbardbar_tau010000um_M1600_2018": 0.0001, +"mfv_stopdbardbar_tau030000um_M1600_2018": 0.0001, +"mfv_stopdbardbar_tau001000um_M3000_2018": 0.0000, +"mfv_stopdbardbar_tau010000um_M3000_2018": 0.0000, +"mfv_stopdbardbar_tau030000um_M3000_2018": 0.0000, +"mfv_stopbbarbbar_tau000100um_M0200_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0200_2018": 0.0010, +"mfv_stopbbarbbar_tau001000um_M0200_2018": 0.0093, +"mfv_stopbbarbbar_tau010000um_M0200_2018": 0.0213, +"mfv_stopbbarbbar_tau030000um_M0200_2018": 0.0243, +"mfv_stopbbarbbar_tau000100um_M0300_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0300_2018": 0.0048, +"mfv_stopbbarbbar_tau010000um_M0300_2018": 0.0248, +"mfv_stopbbarbbar_tau030000um_M0300_2018": 0.0378, +"mfv_stopbbarbbar_tau000100um_M0400_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0400_2018": 0.0018, +"mfv_stopbbarbbar_tau010000um_M0400_2018": 0.0121, +"mfv_stopbbarbbar_tau030000um_M0400_2018": 0.0201, +"mfv_stopbbarbbar_tau000100um_M0600_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0600_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0600_2018": 0.0003, +"mfv_stopbbarbbar_tau010000um_M0600_2018": 0.0020, +"mfv_stopbbarbbar_tau030000um_M0600_2018": 0.0028, +"mfv_stopbbarbbar_tau000100um_M0800_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0800_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0800_2018": 0.0001, +"mfv_stopbbarbbar_tau010000um_M0800_2018": 0.0005, +"mfv_stopbbarbbar_tau030000um_M0800_2018": 0.0007, +"mfv_stopbbarbbar_tau000100um_M1200_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1200_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1200_2018": 0.0001, +"mfv_stopbbarbbar_tau010000um_M1200_2018": 0.0002, +"mfv_stopbbarbbar_tau030000um_M1200_2018": 0.0001, +"mfv_stopbbarbbar_tau000100um_M1600_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1600_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1600_2018": 0.0002, +"mfv_stopbbarbbar_tau010000um_M1600_2018": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1600_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M3000_2018": 0.0001, +"mfv_stopbbarbbar_tau010000um_M3000_2018": 0.0002, +"mfv_stopbbarbbar_tau030000um_M3000_2018": 0.0000, +"mfv_neu_tau000100um_M0200_2017": 0.0000, +"mfv_neu_tau000300um_M0200_2017": 0.0000, +"mfv_neu_tau010000um_M0200_2017": 0.0276, +"mfv_neu_tau030000um_M0200_2017": 0.0329, +"mfv_neu_tau000100um_M0300_2017": 0.0000, +"mfv_neu_tau000300um_M0300_2017": 0.0000, +"mfv_neu_tau001000um_M0300_2017": 0.0008, +"mfv_neu_tau010000um_M0300_2017": 0.0238, +"mfv_neu_tau030000um_M0300_2017": 0.0324, +"mfv_neu_tau000100um_M0400_2017": 0.0000, +"mfv_neu_tau001000um_M0400_2017": 0.0002, +"mfv_neu_tau010000um_M0400_2017": 0.0176, +"mfv_neu_tau030000um_M0400_2017": 0.0252, +"mfv_neu_tau000100um_M0600_2017": 0.0000, +"mfv_neu_tau000300um_M0600_2017": 0.0000, +"mfv_neu_tau001000um_M0600_2017": 0.0000, +"mfv_neu_tau010000um_M0600_2017": 0.0017, +"mfv_neu_tau030000um_M0600_2017": 0.0031, +"mfv_neu_tau000300um_M0800_2017": 0.0000, +"mfv_neu_tau001000um_M0800_2017": 0.0000, +"mfv_neu_tau010000um_M0800_2017": 0.0007, +"mfv_neu_tau030000um_M0800_2017": 0.0006, +"mfv_neu_tau000100um_M1200_2017": 0.0000, +"mfv_neu_tau000300um_M1200_2017": 0.0000, +"mfv_neu_tau001000um_M1200_2017": 0.0000, +"mfv_neu_tau010000um_M1200_2017": 0.0000, +"mfv_neu_tau000100um_M1600_2017": 0.0000, +"mfv_neu_tau000300um_M1600_2017": 0.0000, +"mfv_neu_tau001000um_M1600_2017": 0.0000, +"mfv_neu_tau010000um_M1600_2017": 0.0000, +"mfv_neu_tau030000um_M1600_2017": 0.0000, +"mfv_neu_tau001000um_M3000_2017": 0.0000, +"mfv_neu_tau010000um_M3000_2017": 0.0000, +"mfv_neu_tau030000um_M3000_2017": 0.0002, +"mfv_stopdbardbar_tau000100um_M0200_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2017": 0.0001, +"mfv_stopdbardbar_tau001000um_M0200_2017": 0.0025, +"mfv_stopdbardbar_tau010000um_M0200_2017": 0.0237, +"mfv_stopdbardbar_tau030000um_M0200_2017": 0.0382, +"mfv_stopdbardbar_tau000100um_M0300_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M0300_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M0300_2017": 0.0006, +"mfv_stopdbardbar_tau010000um_M0300_2017": 0.0146, +"mfv_stopdbardbar_tau030000um_M0300_2017": 0.0330, +"mfv_stopdbardbar_tau000100um_M0400_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M0400_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M0400_2017": 0.0002, +"mfv_stopdbardbar_tau010000um_M0400_2017": 0.0067, +"mfv_stopdbardbar_tau030000um_M0400_2017": 0.0102, +"mfv_stopdbardbar_tau000100um_M0600_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M0600_2017": 0.0000, +"mfv_stopdbardbar_tau010000um_M0600_2017": 0.0012, +"mfv_stopdbardbar_tau030000um_M0600_2017": 0.0017, +"mfv_stopdbardbar_tau000100um_M0800_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M0800_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M0800_2017": 0.0000, +"mfv_stopdbardbar_tau010000um_M0800_2017": 0.0003, +"mfv_stopdbardbar_tau030000um_M0800_2017": 0.0002, +"mfv_stopdbardbar_tau000100um_M1200_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M1200_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M1200_2017": 0.0000, +"mfv_stopdbardbar_tau010000um_M1200_2017": 0.0000, +"mfv_stopdbardbar_tau030000um_M1200_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M1600_2017": 0.0000, +"mfv_stopdbardbar_tau010000um_M1600_2017": 0.0001, +"mfv_stopdbardbar_tau030000um_M1600_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M3000_2017": 0.0000, +"mfv_stopdbardbar_tau010000um_M3000_2017": 0.0000, +"mfv_stopdbardbar_tau030000um_M3000_2017": 0.0000, +"mfv_stopbbarbbar_tau000100um_M0200_2017": 0.0001, +"mfv_stopbbarbbar_tau000300um_M0200_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0200_2017": 0.0007, +"mfv_stopbbarbbar_tau010000um_M0200_2017": 0.0214, +"mfv_stopbbarbbar_tau030000um_M0200_2017": 0.0223, +"mfv_stopbbarbbar_tau000100um_M0300_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0300_2017": 0.0005, +"mfv_stopbbarbbar_tau010000um_M0300_2017": 0.0157, +"mfv_stopbbarbbar_tau030000um_M0300_2017": 0.0258, +"mfv_stopbbarbbar_tau000100um_M0400_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0400_2017": 0.0001, +"mfv_stopbbarbbar_tau010000um_M0400_2017": 0.0066, +"mfv_stopbbarbbar_tau030000um_M0400_2017": 0.0101, +"mfv_stopbbarbbar_tau000100um_M0600_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0600_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0600_2017": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0600_2017": 0.0012, +"mfv_stopbbarbbar_tau030000um_M0600_2017": 0.0007, +"mfv_stopbbarbbar_tau000100um_M0800_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0800_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0800_2017": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0800_2017": 0.0001, +"mfv_stopbbarbbar_tau030000um_M0800_2017": 0.0002, +"mfv_stopbbarbbar_tau000100um_M1200_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1200_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1200_2017": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1200_2017": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1200_2017": 0.0001, +"mfv_stopbbarbbar_tau000300um_M1600_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1600_2017": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1600_2017": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1600_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M3000_2017": 0.0000, +"mfv_stopbbarbbar_tau010000um_M3000_2017": 0.0000, +"mfv_stopbbarbbar_tau030000um_M3000_2017": 0.0000, +"mfv_neu_tau000100um_M0200_2016": 0.0000, +"mfv_neu_tau000300um_M0200_2016": 0.0003, +"mfv_neu_tau001000um_M0200_2016": 0.0003, +"mfv_neu_tau010000um_M0200_2016": 0.0321, +"mfv_neu_tau030000um_M0200_2016": 0.0493, +"mfv_neu_tau000100um_M0300_2016": 0.0000, +"mfv_neu_tau000300um_M0300_2016": 0.0000, +"mfv_neu_tau001000um_M0300_2016": 0.0048, +"mfv_neu_tau010000um_M0300_2016": 0.0297, +"mfv_neu_tau030000um_M0300_2016": 0.0478, +"mfv_neu_tau000100um_M0400_2016": 0.0000, +"mfv_neu_tau000300um_M0400_2016": 0.0000, +"mfv_neu_tau001000um_M0400_2016": 0.0005, +"mfv_neu_tau010000um_M0400_2016": 0.0129, +"mfv_neu_tau030000um_M0400_2016": 0.0177, +"mfv_neu_tau000100um_M0600_2016": 0.0000, +"mfv_neu_tau000300um_M0600_2016": 0.0000, +"mfv_neu_tau001000um_M0600_2016": 0.0004, +"mfv_neu_tau010000um_M0600_2016": 0.0009, +"mfv_neu_tau030000um_M0600_2016": 0.0014, +"mfv_neu_tau000100um_M0800_2016": 0.0000, +"mfv_neu_tau000300um_M0800_2016": 0.0000, +"mfv_neu_tau001000um_M0800_2016": 0.0000, +"mfv_neu_tau010000um_M0800_2016": 0.0000, +"mfv_neu_tau030000um_M0800_2016": 0.0002, +"mfv_neu_tau000100um_M1200_2016": 0.0000, +"mfv_neu_tau000300um_M1200_2016": 0.0000, +"mfv_neu_tau001000um_M1200_2016": 0.0000, +"mfv_neu_tau010000um_M1200_2016": 0.0000, +"mfv_neu_tau030000um_M1200_2016": 0.0000, +"mfv_neu_tau000100um_M1600_2016": 0.0000, +"mfv_neu_tau000300um_M1600_2016": 0.0000, +"mfv_neu_tau001000um_M1600_2016": 0.0000, +"mfv_neu_tau010000um_M1600_2016": 0.0000, +"mfv_neu_tau030000um_M1600_2016": 0.0000, +"mfv_neu_tau000300um_M3000_2016": 0.0000, +"mfv_neu_tau001000um_M3000_2016": 0.0000, +"mfv_neu_tau010000um_M3000_2016": 0.0000, +"mfv_neu_tau030000um_M3000_2016": 0.0000, +"mfv_stopdbardbar_tau000100um_M0200_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M0200_2016": 0.0024, +"mfv_stopdbardbar_tau010000um_M0200_2016": 0.0245, +"mfv_stopdbardbar_tau030000um_M0200_2016": 0.0463, +"mfv_stopdbardbar_tau000100um_M0300_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0300_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M0300_2016": 0.0008, +"mfv_stopdbardbar_tau010000um_M0300_2016": 0.0141, +"mfv_stopdbardbar_tau030000um_M0300_2016": 0.0211, +"mfv_stopdbardbar_tau000100um_M0400_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0400_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M0400_2016": 0.0004, +"mfv_stopdbardbar_tau010000um_M0400_2016": 0.0026, +"mfv_stopdbardbar_tau030000um_M0400_2016": 0.0047, +"mfv_stopdbardbar_tau000100um_M0600_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0600_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M0600_2016": 0.0001, +"mfv_stopdbardbar_tau010000um_M0600_2016": 0.0005, +"mfv_stopdbardbar_tau030000um_M0600_2016": 0.0010, +"mfv_stopdbardbar_tau000100um_M0800_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0800_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M0800_2016": 0.0001, +"mfv_stopdbardbar_tau010000um_M0800_2016": 0.0002, +"mfv_stopdbardbar_tau030000um_M0800_2016": 0.0002, +"mfv_stopdbardbar_tau000100um_M1200_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M1200_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M1200_2016": 0.0000, +"mfv_stopdbardbar_tau010000um_M1200_2016": 0.0000, +"mfv_stopdbardbar_tau030000um_M1200_2016": 0.0000, +"mfv_stopdbardbar_tau000100um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau010000um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau030000um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M3000_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M3000_2016": 0.0000, +"mfv_stopdbardbar_tau030000um_M3000_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0200_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0200_2016": 0.0006, +"mfv_stopbbarbbar_tau010000um_M0200_2016": 0.0251, +"mfv_stopbbarbbar_tau030000um_M0200_2016": 0.0273, +"mfv_stopbbarbbar_tau000100um_M0300_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0300_2016": 0.0002, +"mfv_stopbbarbbar_tau010000um_M0300_2016": 0.0137, +"mfv_stopbbarbbar_tau030000um_M0300_2016": 0.0243, +"mfv_stopbbarbbar_tau000100um_M0400_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0400_2016": 0.0001, +"mfv_stopbbarbbar_tau010000um_M0400_2016": 0.0032, +"mfv_stopbbarbbar_tau030000um_M0400_2016": 0.0068, +"mfv_stopbbarbbar_tau000100um_M0600_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0600_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0600_2016": 0.0001, +"mfv_stopbbarbbar_tau010000um_M0600_2016": 0.0002, +"mfv_stopbbarbbar_tau030000um_M0600_2016": 0.0011, +"mfv_stopbbarbbar_tau000100um_M0800_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0800_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0800_2016": 0.0001, +"mfv_stopbbarbbar_tau010000um_M0800_2016": 0.0002, +"mfv_stopbbarbbar_tau030000um_M0800_2016": 0.0000, +"mfv_stopbbarbbar_tau000100um_M1200_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1200_2016": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1200_2016": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1200_2016": 0.0000, +"mfv_stopbbarbbar_tau000100um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M3000_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M3000_2016": 0.0000, +"mfv_stopbbarbbar_tau010000um_M3000_2016": 0.0000, +"mfv_stopbbarbbar_tau030000um_M3000_2016": 0.0000, +"mfv_neu_tau000100um_M0200_2016APV": 0.0000, +"mfv_neu_tau000300um_M0200_2016APV": 0.0000, +"mfv_neu_tau001000um_M0200_2016APV": 0.0045, +"mfv_neu_tau010000um_M0200_2016APV": 0.0321, +"mfv_neu_tau030000um_M0200_2016APV": 0.0270, +"mfv_neu_tau000100um_M0300_2016APV": 0.0000, +"mfv_neu_tau000300um_M0300_2016APV": 0.0003, +"mfv_neu_tau001000um_M0300_2016APV": 0.0044, +"mfv_neu_tau010000um_M0300_2016APV": 0.0283, +"mfv_neu_tau030000um_M0300_2016APV": 0.0430, +"mfv_neu_tau000100um_M0400_2016APV": 0.0000, +"mfv_neu_tau000300um_M0400_2016APV": 0.0000, +"mfv_neu_tau001000um_M0400_2016APV": 0.0006, +"mfv_neu_tau010000um_M0400_2016APV": 0.0098, +"mfv_neu_tau030000um_M0400_2016APV": 0.0145, +"mfv_neu_tau000100um_M0600_2016APV": 0.0000, +"mfv_neu_tau000300um_M0600_2016APV": 0.0000, +"mfv_neu_tau001000um_M0600_2016APV": 0.0000, +"mfv_neu_tau010000um_M0600_2016APV": 0.0022, +"mfv_neu_tau030000um_M0600_2016APV": 0.0029, +"mfv_neu_tau000100um_M0800_2016APV": 0.0000, +"mfv_neu_tau000300um_M0800_2016APV": 0.0000, +"mfv_neu_tau001000um_M0800_2016APV": 0.0000, +"mfv_neu_tau010000um_M0800_2016APV": 0.0004, +"mfv_neu_tau030000um_M0800_2016APV": 0.0003, +"mfv_neu_tau000100um_M1200_2016APV": 0.0000, +"mfv_neu_tau000300um_M1200_2016APV": 0.0000, +"mfv_neu_tau001000um_M1200_2016APV": 0.0000, +"mfv_neu_tau010000um_M1200_2016APV": 0.0000, +"mfv_neu_tau000100um_M1600_2016APV": 0.0000, +"mfv_neu_tau000300um_M1600_2016APV": 0.0000, +"mfv_neu_tau001000um_M1600_2016APV": 0.0000, +"mfv_neu_tau010000um_M1600_2016APV": 0.0000, +"mfv_neu_tau030000um_M1600_2016APV": 0.0000, +"mfv_neu_tau001000um_M3000_2016APV": 0.0000, +"mfv_neu_tau010000um_M3000_2016APV": 0.0000, +"mfv_neu_tau030000um_M3000_2016APV": 0.0000, +"mfv_stopdbardbar_tau000100um_M0200_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M0200_2016APV": 0.0015, +"mfv_stopdbardbar_tau010000um_M0200_2016APV": 0.0218, +"mfv_stopdbardbar_tau030000um_M0200_2016APV": 0.0428, +"mfv_stopdbardbar_tau000100um_M0300_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0300_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M0300_2016APV": 0.0003, +"mfv_stopdbardbar_tau010000um_M0300_2016APV": 0.0110, +"mfv_stopdbardbar_tau030000um_M0300_2016APV": 0.0159, +"mfv_stopdbardbar_tau000100um_M0400_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0400_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M0400_2016APV": 0.0026, +"mfv_stopdbardbar_tau030000um_M0400_2016APV": 0.0055, +"mfv_stopdbardbar_tau000100um_M0600_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0600_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M0600_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M0600_2016APV": 0.0007, +"mfv_stopdbardbar_tau030000um_M0600_2016APV": 0.0013, +"mfv_stopdbardbar_tau000100um_M0800_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0800_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M0800_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M0800_2016APV": 0.0001, +"mfv_stopdbardbar_tau030000um_M0800_2016APV": 0.0000, +"mfv_stopdbardbar_tau000100um_M1200_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M1200_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M1200_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M1200_2016APV": 0.0001, +"mfv_stopdbardbar_tau030000um_M1200_2016APV": 0.0000, +"mfv_stopdbardbar_tau000100um_M1600_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M1600_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M1600_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M1600_2016APV": 0.0000, +"mfv_stopdbardbar_tau030000um_M1600_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M3000_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M3000_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M3000_2016APV": 0.0000, +"mfv_stopdbardbar_tau030000um_M3000_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000100um_M0200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0200_2016APV": 0.0012, +"mfv_stopbbarbbar_tau010000um_M0200_2016APV": 0.0280, +"mfv_stopbbarbbar_tau030000um_M0200_2016APV": 0.0181, +"mfv_stopbbarbbar_tau000100um_M0300_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0300_2016APV": 0.0002, +"mfv_stopbbarbbar_tau010000um_M0300_2016APV": 0.0109, +"mfv_stopbbarbbar_tau030000um_M0300_2016APV": 0.0267, +"mfv_stopbbarbbar_tau000100um_M0400_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0400_2016APV": 0.0001, +"mfv_stopbbarbbar_tau010000um_M0400_2016APV": 0.0036, +"mfv_stopbbarbbar_tau030000um_M0400_2016APV": 0.0047, +"mfv_stopbbarbbar_tau000100um_M0600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0600_2016APV": 0.0004, +"mfv_stopbbarbbar_tau030000um_M0600_2016APV": 0.0009, +"mfv_stopbbarbbar_tau000100um_M0800_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0800_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0800_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0800_2016APV": 0.0000, +"mfv_stopbbarbbar_tau030000um_M0800_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000100um_M1200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000100um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M3000_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M3000_2016APV": 0.0000, +"mfv_stopbbarbbar_tau030000um_M3000_2016APV": 0.0000, +} + +jes_up_uncerts = { +"ggHToSSTodddd_tau1mm_M55_2018": 0.0084, +"ggHToSSTodddd_tau10mm_M55_2018": 0.0370, +"ggHToSSTodddd_tau100mm_M55_2018": 0.0169, +"ggHToSSTodddd_tau1mm_M55_2017": 0.0042, +"ggHToSSTodddd_tau10mm_M55_2017": 0.0195, +"ggHToSSTodddd_tau100mm_M55_2017": 0.0450, +"ggHToSSTodddd_tau1mm_M55_2016": 0.0059, +"ggHToSSTodddd_tau10mm_M55_2016": 0.0303, +"ggHToSSTodddd_tau1mm_M55_2016APV": 0.0044, +"ggHToSSTodddd_tau10mm_M55_2016APV": 0.0302, +"ggHToSSTodddd_tau100mm_M55_2016APV": 0.0860, +"mfv_neu_tau000100um_M0200_2018": 0.0000, +"mfv_neu_tau000300um_M0200_2018": 0.0002, +"mfv_neu_tau010000um_M0200_2018": 0.0422, +"mfv_neu_tau030000um_M0200_2018": 0.0437, +"mfv_neu_tau000100um_M0300_2018": 0.0000, +"mfv_neu_tau000300um_M0300_2018": 0.0001, +"mfv_neu_tau001000um_M0300_2018": 0.0011, +"mfv_neu_tau010000um_M0300_2018": 0.0402, +"mfv_neu_tau030000um_M0300_2018": 0.0579, +"mfv_neu_tau000100um_M0400_2018": 0.0000, +"mfv_neu_tau000300um_M0400_2018": 0.0000, +"mfv_neu_tau001000um_M0400_2018": 0.0038, +"mfv_neu_tau010000um_M0400_2018": 0.0233, +"mfv_neu_tau030000um_M0400_2018": 0.0371, +"mfv_neu_tau000100um_M0600_2018": 0.0000, +"mfv_neu_tau001000um_M0600_2018": 0.0006, +"mfv_neu_tau010000um_M0600_2018": 0.0037, +"mfv_neu_tau030000um_M0600_2018": 0.0046, +"mfv_neu_tau000100um_M0800_2018": 0.0000, +"mfv_neu_tau000300um_M0800_2018": 0.0000, +"mfv_neu_tau001000um_M0800_2018": 0.0001, +"mfv_neu_tau010000um_M0800_2018": 0.0004, +"mfv_neu_tau030000um_M0800_2018": 0.0011, +"mfv_neu_tau000100um_M1200_2018": 0.0000, +"mfv_neu_tau000300um_M1200_2018": 0.0000, +"mfv_neu_tau001000um_M1200_2018": 0.0001, +"mfv_neu_tau010000um_M1200_2018": 0.0000, +"mfv_neu_tau030000um_M1200_2018": 0.0001, +"mfv_neu_tau000100um_M1600_2018": 0.0000, +"mfv_neu_tau000300um_M1600_2018": 0.0000, +"mfv_neu_tau001000um_M1600_2018": 0.0000, +"mfv_neu_tau010000um_M1600_2018": 0.0000, +"mfv_neu_tau030000um_M1600_2018": 0.0000, +"mfv_neu_tau000300um_M3000_2018": 0.0000, +"mfv_neu_tau001000um_M3000_2018": 0.0000, +"mfv_neu_tau030000um_M3000_2018": 0.0000, +"mfv_stopdbardbar_tau000100um_M0200_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2018": 0.0010, +"mfv_stopdbardbar_tau001000um_M0200_2018": 0.0066, +"mfv_stopdbardbar_tau010000um_M0200_2018": 0.0340, +"mfv_stopdbardbar_tau030000um_M0200_2018": 0.0465, +"mfv_stopdbardbar_tau000100um_M0300_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M0300_2018": 0.0001, +"mfv_stopdbardbar_tau001000um_M0300_2018": 0.0038, +"mfv_stopdbardbar_tau010000um_M0300_2018": 0.0303, +"mfv_stopdbardbar_tau030000um_M0300_2018": 0.0454, +"mfv_stopdbardbar_tau000100um_M0400_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M0400_2018": 0.0000, +"mfv_stopdbardbar_tau001000um_M0400_2018": 0.0015, +"mfv_stopdbardbar_tau010000um_M0400_2018": 0.0095, +"mfv_stopdbardbar_tau000100um_M0600_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M0600_2018": 0.0000, +"mfv_stopdbardbar_tau001000um_M0600_2018": 0.0006, +"mfv_stopdbardbar_tau010000um_M0600_2018": 0.0017, +"mfv_stopdbardbar_tau030000um_M0600_2018": 0.0021, +"mfv_stopdbardbar_tau000100um_M0800_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M0800_2018": 0.0000, +"mfv_stopdbardbar_tau001000um_M0800_2018": 0.0002, +"mfv_stopdbardbar_tau010000um_M0800_2018": 0.0005, +"mfv_stopdbardbar_tau030000um_M0800_2018": 0.0002, +"mfv_stopdbardbar_tau000100um_M1200_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M1200_2018": 0.0000, +"mfv_stopdbardbar_tau001000um_M1200_2018": 0.0000, +"mfv_stopdbardbar_tau010000um_M1200_2018": 0.0000, +"mfv_stopdbardbar_tau030000um_M1200_2018": 0.0001, +"mfv_stopdbardbar_tau000100um_M1600_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M1600_2018": 0.0000, +"mfv_stopdbardbar_tau001000um_M1600_2018": 0.0000, +"mfv_stopdbardbar_tau010000um_M1600_2018": 0.0001, +"mfv_stopdbardbar_tau030000um_M1600_2018": 0.0001, +"mfv_stopdbardbar_tau001000um_M3000_2018": 0.0001, +"mfv_stopdbardbar_tau010000um_M3000_2018": 0.0000, +"mfv_stopdbardbar_tau030000um_M3000_2018": 0.0000, +"mfv_stopbbarbbar_tau000100um_M0200_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0200_2018": 0.0010, +"mfv_stopbbarbbar_tau001000um_M0200_2018": 0.0057, +"mfv_stopbbarbbar_tau010000um_M0200_2018": 0.0299, +"mfv_stopbbarbbar_tau030000um_M0200_2018": 0.0508, +"mfv_stopbbarbbar_tau000100um_M0300_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0300_2018": 0.0040, +"mfv_stopbbarbbar_tau010000um_M0300_2018": 0.0279, +"mfv_stopbbarbbar_tau030000um_M0300_2018": 0.0434, +"mfv_stopbbarbbar_tau000100um_M0400_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0400_2018": 0.0014, +"mfv_stopbbarbbar_tau010000um_M0400_2018": 0.0120, +"mfv_stopbbarbbar_tau030000um_M0400_2018": 0.0201, +"mfv_stopbbarbbar_tau000100um_M0600_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0600_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0600_2018": 0.0004, +"mfv_stopbbarbbar_tau010000um_M0600_2018": 0.0017, +"mfv_stopbbarbbar_tau030000um_M0600_2018": 0.0023, +"mfv_stopbbarbbar_tau000100um_M0800_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0800_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0800_2018": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0800_2018": 0.0003, +"mfv_stopbbarbbar_tau030000um_M0800_2018": 0.0002, +"mfv_stopbbarbbar_tau000100um_M1200_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1200_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1200_2018": 0.0001, +"mfv_stopbbarbbar_tau010000um_M1200_2018": 0.0001, +"mfv_stopbbarbbar_tau030000um_M1200_2018": 0.0001, +"mfv_stopbbarbbar_tau000100um_M1600_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1600_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1600_2018": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1600_2018": 0.0001, +"mfv_stopbbarbbar_tau030000um_M1600_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M3000_2018": 0.0000, +"mfv_stopbbarbbar_tau010000um_M3000_2018": 0.0001, +"mfv_stopbbarbbar_tau030000um_M3000_2018": 0.0000, +"mfv_neu_tau000100um_M0200_2017": 0.0000, +"mfv_neu_tau000300um_M0200_2017": 0.0000, +"mfv_neu_tau010000um_M0200_2017": 0.0235, +"mfv_neu_tau030000um_M0200_2017": 0.0284, +"mfv_neu_tau000100um_M0300_2017": 0.0000, +"mfv_neu_tau000300um_M0300_2017": 0.0000, +"mfv_neu_tau001000um_M0300_2017": 0.0007, +"mfv_neu_tau010000um_M0300_2017": 0.0229, +"mfv_neu_tau030000um_M0300_2017": 0.0358, +"mfv_neu_tau000100um_M0400_2017": 0.0000, +"mfv_neu_tau001000um_M0400_2017": 0.0002, +"mfv_neu_tau010000um_M0400_2017": 0.0159, +"mfv_neu_tau030000um_M0400_2017": 0.0234, +"mfv_neu_tau000100um_M0600_2017": 0.0000, +"mfv_neu_tau000300um_M0600_2017": 0.0000, +"mfv_neu_tau001000um_M0600_2017": 0.0000, +"mfv_neu_tau010000um_M0600_2017": 0.0016, +"mfv_neu_tau030000um_M0600_2017": 0.0019, +"mfv_neu_tau000300um_M0800_2017": 0.0000, +"mfv_neu_tau001000um_M0800_2017": 0.0000, +"mfv_neu_tau010000um_M0800_2017": 0.0002, +"mfv_neu_tau030000um_M0800_2017": 0.0002, +"mfv_neu_tau000100um_M1200_2017": 0.0000, +"mfv_neu_tau000300um_M1200_2017": 0.0000, +"mfv_neu_tau001000um_M1200_2017": 0.0000, +"mfv_neu_tau010000um_M1200_2017": 0.0000, +"mfv_neu_tau000100um_M1600_2017": 0.0000, +"mfv_neu_tau000300um_M1600_2017": 0.0000, +"mfv_neu_tau001000um_M1600_2017": 0.0000, +"mfv_neu_tau010000um_M1600_2017": 0.0000, +"mfv_neu_tau030000um_M1600_2017": 0.0000, +"mfv_neu_tau001000um_M3000_2017": 0.0000, +"mfv_neu_tau010000um_M3000_2017": 0.0000, +"mfv_neu_tau030000um_M3000_2017": 0.0000, +"mfv_stopdbardbar_tau000100um_M0200_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2017": 0.0001, +"mfv_stopdbardbar_tau001000um_M0200_2017": 0.0028, +"mfv_stopdbardbar_tau010000um_M0200_2017": 0.0198, +"mfv_stopdbardbar_tau030000um_M0200_2017": 0.0388, +"mfv_stopdbardbar_tau000100um_M0300_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M0300_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M0300_2017": 0.0006, +"mfv_stopdbardbar_tau010000um_M0300_2017": 0.0184, +"mfv_stopdbardbar_tau030000um_M0300_2017": 0.0306, +"mfv_stopdbardbar_tau000100um_M0400_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M0400_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M0400_2017": 0.0002, +"mfv_stopdbardbar_tau010000um_M0400_2017": 0.0055, +"mfv_stopdbardbar_tau030000um_M0400_2017": 0.0101, +"mfv_stopdbardbar_tau000100um_M0600_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M0600_2017": 0.0000, +"mfv_stopdbardbar_tau010000um_M0600_2017": 0.0004, +"mfv_stopdbardbar_tau030000um_M0600_2017": 0.0013, +"mfv_stopdbardbar_tau000100um_M0800_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M0800_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M0800_2017": 0.0000, +"mfv_stopdbardbar_tau010000um_M0800_2017": 0.0001, +"mfv_stopdbardbar_tau030000um_M0800_2017": 0.0003, +"mfv_stopdbardbar_tau000100um_M1200_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M1200_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M1200_2017": 0.0000, +"mfv_stopdbardbar_tau010000um_M1200_2017": 0.0001, +"mfv_stopdbardbar_tau030000um_M1200_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M1600_2017": 0.0000, +"mfv_stopdbardbar_tau010000um_M1600_2017": 0.0001, +"mfv_stopdbardbar_tau030000um_M1600_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M3000_2017": 0.0000, +"mfv_stopdbardbar_tau010000um_M3000_2017": 0.0000, +"mfv_stopdbardbar_tau030000um_M3000_2017": 0.0000, +"mfv_stopbbarbbar_tau000100um_M0200_2017": 0.0001, +"mfv_stopbbarbbar_tau000300um_M0200_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0200_2017": 0.0006, +"mfv_stopbbarbbar_tau010000um_M0200_2017": 0.0262, +"mfv_stopbbarbbar_tau030000um_M0200_2017": 0.0205, +"mfv_stopbbarbbar_tau000100um_M0300_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0300_2017": 0.0004, +"mfv_stopbbarbbar_tau010000um_M0300_2017": 0.0154, +"mfv_stopbbarbbar_tau030000um_M0300_2017": 0.0262, +"mfv_stopbbarbbar_tau000100um_M0400_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0400_2017": 0.0001, +"mfv_stopbbarbbar_tau010000um_M0400_2017": 0.0054, +"mfv_stopbbarbbar_tau030000um_M0400_2017": 0.0117, +"mfv_stopbbarbbar_tau000100um_M0600_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0600_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0600_2017": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0600_2017": 0.0009, +"mfv_stopbbarbbar_tau030000um_M0600_2017": 0.0018, +"mfv_stopbbarbbar_tau000100um_M0800_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0800_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0800_2017": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0800_2017": 0.0001, +"mfv_stopbbarbbar_tau030000um_M0800_2017": 0.0001, +"mfv_stopbbarbbar_tau000100um_M1200_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1200_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1200_2017": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1200_2017": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1200_2017": 0.0001, +"mfv_stopbbarbbar_tau000300um_M1600_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1600_2017": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1600_2017": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1600_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M3000_2017": 0.0000, +"mfv_stopbbarbbar_tau010000um_M3000_2017": 0.0000, +"mfv_stopbbarbbar_tau030000um_M3000_2017": 0.0000, +"mfv_neu_tau000100um_M0200_2016": 0.0000, +"mfv_neu_tau000300um_M0200_2016": 0.0000, +"mfv_neu_tau001000um_M0200_2016": 0.0021, +"mfv_neu_tau010000um_M0200_2016": 0.0504, +"mfv_neu_tau030000um_M0200_2016": 0.0442, +"mfv_neu_tau000100um_M0300_2016": 0.0000, +"mfv_neu_tau000300um_M0300_2016": 0.0001, +"mfv_neu_tau001000um_M0300_2016": 0.0066, +"mfv_neu_tau010000um_M0300_2016": 0.0338, +"mfv_neu_tau030000um_M0300_2016": 0.0501, +"mfv_neu_tau000100um_M0400_2016": 0.0000, +"mfv_neu_tau000300um_M0400_2016": 0.0000, +"mfv_neu_tau001000um_M0400_2016": 0.0005, +"mfv_neu_tau010000um_M0400_2016": 0.0105, +"mfv_neu_tau030000um_M0400_2016": 0.0176, +"mfv_neu_tau000100um_M0600_2016": 0.0000, +"mfv_neu_tau000300um_M0600_2016": 0.0000, +"mfv_neu_tau001000um_M0600_2016": 0.0001, +"mfv_neu_tau010000um_M0600_2016": 0.0012, +"mfv_neu_tau030000um_M0600_2016": 0.0011, +"mfv_neu_tau000100um_M0800_2016": 0.0000, +"mfv_neu_tau000300um_M0800_2016": 0.0000, +"mfv_neu_tau001000um_M0800_2016": 0.0000, +"mfv_neu_tau010000um_M0800_2016": 0.0002, +"mfv_neu_tau030000um_M0800_2016": 0.0002, +"mfv_neu_tau000100um_M1200_2016": 0.0000, +"mfv_neu_tau000300um_M1200_2016": 0.0000, +"mfv_neu_tau001000um_M1200_2016": 0.0000, +"mfv_neu_tau010000um_M1200_2016": 0.0000, +"mfv_neu_tau030000um_M1200_2016": 0.0000, +"mfv_neu_tau000100um_M1600_2016": 0.0000, +"mfv_neu_tau000300um_M1600_2016": 0.0000, +"mfv_neu_tau001000um_M1600_2016": 0.0000, +"mfv_neu_tau010000um_M1600_2016": 0.0000, +"mfv_neu_tau030000um_M1600_2016": 0.0000, +"mfv_neu_tau000300um_M3000_2016": 0.0000, +"mfv_neu_tau001000um_M3000_2016": 0.0000, +"mfv_neu_tau010000um_M3000_2016": 0.0000, +"mfv_neu_tau030000um_M3000_2016": 0.0000, +"mfv_stopdbardbar_tau000100um_M0200_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M0200_2016": 0.0027, +"mfv_stopdbardbar_tau010000um_M0200_2016": 0.0241, +"mfv_stopdbardbar_tau030000um_M0200_2016": 0.0567, +"mfv_stopdbardbar_tau000100um_M0300_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0300_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M0300_2016": 0.0007, +"mfv_stopdbardbar_tau010000um_M0300_2016": 0.0136, +"mfv_stopdbardbar_tau030000um_M0300_2016": 0.0223, +"mfv_stopdbardbar_tau000100um_M0400_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0400_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M0400_2016": 0.0005, +"mfv_stopdbardbar_tau010000um_M0400_2016": 0.0033, +"mfv_stopdbardbar_tau030000um_M0400_2016": 0.0058, +"mfv_stopdbardbar_tau000100um_M0600_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0600_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M0600_2016": 0.0001, +"mfv_stopdbardbar_tau010000um_M0600_2016": 0.0006, +"mfv_stopdbardbar_tau030000um_M0600_2016": 0.0010, +"mfv_stopdbardbar_tau000100um_M0800_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0800_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M0800_2016": 0.0000, +"mfv_stopdbardbar_tau010000um_M0800_2016": 0.0001, +"mfv_stopdbardbar_tau030000um_M0800_2016": 0.0000, +"mfv_stopdbardbar_tau000100um_M1200_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M1200_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M1200_2016": 0.0000, +"mfv_stopdbardbar_tau010000um_M1200_2016": 0.0001, +"mfv_stopdbardbar_tau030000um_M1200_2016": 0.0000, +"mfv_stopdbardbar_tau000100um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau010000um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau030000um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M3000_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M3000_2016": 0.0000, +"mfv_stopdbardbar_tau030000um_M3000_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0200_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0200_2016": 0.0019, +"mfv_stopbbarbbar_tau010000um_M0200_2016": 0.0446, +"mfv_stopbbarbbar_tau030000um_M0200_2016": 0.0367, +"mfv_stopbbarbbar_tau000100um_M0300_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0300_2016": 0.0008, +"mfv_stopbbarbbar_tau010000um_M0300_2016": 0.0138, +"mfv_stopbbarbbar_tau030000um_M0300_2016": 0.0236, +"mfv_stopbbarbbar_tau000100um_M0400_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0400_2016": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0400_2016": 0.0042, +"mfv_stopbbarbbar_tau030000um_M0400_2016": 0.0063, +"mfv_stopbbarbbar_tau000100um_M0600_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0600_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0600_2016": 0.0001, +"mfv_stopbbarbbar_tau010000um_M0600_2016": 0.0009, +"mfv_stopbbarbbar_tau030000um_M0600_2016": 0.0012, +"mfv_stopbbarbbar_tau000100um_M0800_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0800_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0800_2016": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0800_2016": 0.0002, +"mfv_stopbbarbbar_tau030000um_M0800_2016": 0.0000, +"mfv_stopbbarbbar_tau000100um_M1200_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1200_2016": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1200_2016": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1200_2016": 0.0000, +"mfv_stopbbarbbar_tau000100um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M3000_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M3000_2016": 0.0000, +"mfv_stopbbarbbar_tau010000um_M3000_2016": 0.0000, +"mfv_stopbbarbbar_tau030000um_M3000_2016": 0.0000, +"mfv_neu_tau000100um_M0200_2016APV": 0.0000, +"mfv_neu_tau000300um_M0200_2016APV": 0.0001, +"mfv_neu_tau001000um_M0200_2016APV": 0.0036, +"mfv_neu_tau010000um_M0200_2016APV": 0.0312, +"mfv_neu_tau030000um_M0200_2016APV": 0.0647, +"mfv_neu_tau000100um_M0300_2016APV": 0.0000, +"mfv_neu_tau000300um_M0300_2016APV": 0.0003, +"mfv_neu_tau001000um_M0300_2016APV": 0.0029, +"mfv_neu_tau010000um_M0300_2016APV": 0.0311, +"mfv_neu_tau030000um_M0300_2016APV": 0.0424, +"mfv_neu_tau000100um_M0400_2016APV": 0.0000, +"mfv_neu_tau000300um_M0400_2016APV": 0.0000, +"mfv_neu_tau001000um_M0400_2016APV": 0.0004, +"mfv_neu_tau010000um_M0400_2016APV": 0.0105, +"mfv_neu_tau030000um_M0400_2016APV": 0.0172, +"mfv_neu_tau000100um_M0600_2016APV": 0.0000, +"mfv_neu_tau000300um_M0600_2016APV": 0.0000, +"mfv_neu_tau001000um_M0600_2016APV": 0.0000, +"mfv_neu_tau010000um_M0600_2016APV": 0.0015, +"mfv_neu_tau030000um_M0600_2016APV": 0.0020, +"mfv_neu_tau000100um_M0800_2016APV": 0.0000, +"mfv_neu_tau000300um_M0800_2016APV": 0.0000, +"mfv_neu_tau001000um_M0800_2016APV": 0.0000, +"mfv_neu_tau010000um_M0800_2016APV": 0.0002, +"mfv_neu_tau030000um_M0800_2016APV": 0.0003, +"mfv_neu_tau000100um_M1200_2016APV": 0.0000, +"mfv_neu_tau000300um_M1200_2016APV": 0.0000, +"mfv_neu_tau001000um_M1200_2016APV": 0.0000, +"mfv_neu_tau010000um_M1200_2016APV": 0.0000, +"mfv_neu_tau000100um_M1600_2016APV": 0.0000, +"mfv_neu_tau000300um_M1600_2016APV": 0.0000, +"mfv_neu_tau001000um_M1600_2016APV": 0.0000, +"mfv_neu_tau010000um_M1600_2016APV": 0.0000, +"mfv_neu_tau030000um_M1600_2016APV": 0.0000, +"mfv_neu_tau001000um_M3000_2016APV": 0.0000, +"mfv_neu_tau010000um_M3000_2016APV": 0.0000, +"mfv_neu_tau030000um_M3000_2016APV": 0.0000, +"mfv_stopdbardbar_tau000100um_M0200_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M0200_2016APV": 0.0014, +"mfv_stopdbardbar_tau010000um_M0200_2016APV": 0.0230, +"mfv_stopdbardbar_tau030000um_M0200_2016APV": 0.0360, +"mfv_stopdbardbar_tau000100um_M0300_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0300_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M0300_2016APV": 0.0004, +"mfv_stopdbardbar_tau010000um_M0300_2016APV": 0.0099, +"mfv_stopdbardbar_tau030000um_M0300_2016APV": 0.0207, +"mfv_stopdbardbar_tau000100um_M0400_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0400_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M0400_2016APV": 0.0030, +"mfv_stopdbardbar_tau030000um_M0400_2016APV": 0.0054, +"mfv_stopdbardbar_tau000100um_M0600_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0600_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M0600_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M0600_2016APV": 0.0007, +"mfv_stopdbardbar_tau030000um_M0600_2016APV": 0.0007, +"mfv_stopdbardbar_tau000100um_M0800_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0800_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M0800_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M0800_2016APV": 0.0001, +"mfv_stopdbardbar_tau030000um_M0800_2016APV": 0.0000, +"mfv_stopdbardbar_tau000100um_M1200_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M1200_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M1200_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M1200_2016APV": 0.0000, +"mfv_stopdbardbar_tau030000um_M1200_2016APV": 0.0001, +"mfv_stopdbardbar_tau000100um_M1600_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M1600_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M1600_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M1600_2016APV": 0.0000, +"mfv_stopdbardbar_tau030000um_M1600_2016APV": 0.0001, +"mfv_stopdbardbar_tau000300um_M3000_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M3000_2016APV": 0.0000, +"mfv_stopdbardbar_tau010000um_M3000_2016APV": 0.0000, +"mfv_stopdbardbar_tau030000um_M3000_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000100um_M0200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0200_2016APV": 0.0001, +"mfv_stopbbarbbar_tau001000um_M0200_2016APV": 0.0007, +"mfv_stopbbarbbar_tau010000um_M0200_2016APV": 0.0264, +"mfv_stopbbarbbar_tau030000um_M0200_2016APV": 0.0535, +"mfv_stopbbarbbar_tau000100um_M0300_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0300_2016APV": 0.0002, +"mfv_stopbbarbbar_tau010000um_M0300_2016APV": 0.0067, +"mfv_stopbbarbbar_tau030000um_M0300_2016APV": 0.0300, +"mfv_stopbbarbbar_tau000100um_M0400_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0400_2016APV": 0.0001, +"mfv_stopbbarbbar_tau010000um_M0400_2016APV": 0.0038, +"mfv_stopbbarbbar_tau030000um_M0400_2016APV": 0.0060, +"mfv_stopbbarbbar_tau000100um_M0600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0600_2016APV": 0.0009, +"mfv_stopbbarbbar_tau030000um_M0600_2016APV": 0.0013, +"mfv_stopbbarbbar_tau000100um_M0800_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0800_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0800_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0800_2016APV": 0.0000, +"mfv_stopbbarbbar_tau030000um_M0800_2016APV": 0.0005, +"mfv_stopbbarbbar_tau000100um_M1200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1200_2016APV": 0.0001, +"mfv_stopbbarbbar_tau030000um_M1200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000100um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau030000um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M3000_2016APV": 0.0000, +"mfv_stopbbarbbar_tau010000um_M3000_2016APV": 0.0000, +"mfv_stopbbarbbar_tau030000um_M3000_2016APV": 0.0000, +} + +tracking_count_uncerts = { +"ggHToSSTodddd_tau1mm_M55_2018": 0.0018, +"ggHToSSTodddd_tau10mm_M55_2018": 0.0056, +"ggHToSSTodddd_tau100mm_M55_2018": 0.0000, +"ggHToSSTodddd_tau1mm_M55_2017": 0.0021, +"ggHToSSTodddd_tau10mm_M55_2017": 0.0032, +"ggHToSSTodddd_tau100mm_M55_2017": 0.0360, +"ggHToSSTodddd_tau1mm_M55_2016": 0.0174, +"ggHToSSTodddd_tau10mm_M55_2016": 0.0107, +"ggHToSSTodddd_tau1mm_M55_2016APV": 0.0514, +"ggHToSSTodddd_tau10mm_M55_2016APV": 0.0433, +"ggHToSSTodddd_tau100mm_M55_2016APV": 0.0000, +"mfv_neu_tau000100um_M0200_2018": 0.0000, +"mfv_neu_tau000300um_M0200_2018": 0.0003, +"mfv_neu_tau010000um_M0200_2018": 0.0036, +"mfv_neu_tau030000um_M0200_2018": 0.0068, +"mfv_neu_tau000100um_M0300_2018": 0.0000, +"mfv_neu_tau000300um_M0300_2018": 0.0001, +"mfv_neu_tau001000um_M0300_2018": 0.0010, +"mfv_neu_tau010000um_M0300_2018": 0.0017, +"mfv_neu_tau030000um_M0300_2018": 0.0022, +"mfv_neu_tau000100um_M0400_2018": 0.0000, +"mfv_neu_tau000300um_M0400_2018": 0.0000, +"mfv_neu_tau001000um_M0400_2018": 0.0011, +"mfv_neu_tau010000um_M0400_2018": 0.0002, +"mfv_neu_tau030000um_M0400_2018": 0.0004, +"mfv_neu_tau000100um_M0600_2018": 0.0000, +"mfv_neu_tau001000um_M0600_2018": 0.0021, +"mfv_neu_tau010000um_M0600_2018": 0.0001, +"mfv_neu_tau030000um_M0600_2018": 0.0009, +"mfv_neu_tau000100um_M0800_2018": 0.0000, +"mfv_neu_tau000300um_M0800_2018": 0.0000, +"mfv_neu_tau001000um_M0800_2018": 0.0020, +"mfv_neu_tau010000um_M0800_2018": 0.0004, +"mfv_neu_tau030000um_M0800_2018": 0.0003, +"mfv_neu_tau000100um_M1200_2018": 0.0000, +"mfv_neu_tau000300um_M1200_2018": 0.0000, +"mfv_neu_tau001000um_M1200_2018": 0.0022, +"mfv_neu_tau010000um_M1200_2018": 0.0004, +"mfv_neu_tau030000um_M1200_2018": 0.0003, +"mfv_neu_tau000100um_M1600_2018": 0.0000, +"mfv_neu_tau000300um_M1600_2018": 0.0000, +"mfv_neu_tau001000um_M1600_2018": 0.0005, +"mfv_neu_tau010000um_M1600_2018": 0.0005, +"mfv_neu_tau030000um_M1600_2018": 0.0001, +"mfv_neu_tau000300um_M3000_2018": 0.0000, +"mfv_neu_tau001000um_M3000_2018": 0.0000, +"mfv_neu_tau030000um_M3000_2018": 0.0001, +"mfv_stopdbardbar_tau000100um_M0200_2018": 0.0001, +"mfv_stopdbardbar_tau000300um_M0200_2018": 0.0006, +"mfv_stopdbardbar_tau001000um_M0200_2018": 0.0005, +"mfv_stopdbardbar_tau010000um_M0200_2018": 0.0002, +"mfv_stopdbardbar_tau030000um_M0200_2018": 0.0010, +"mfv_stopdbardbar_tau000100um_M0300_2018": 0.0000, +"mfv_stopdbardbar_tau000300um_M0300_2018": 0.0001, +"mfv_stopdbardbar_tau001000um_M0300_2018": 0.0004, +"mfv_stopdbardbar_tau010000um_M0300_2018": 0.0017, +"mfv_stopdbardbar_tau030000um_M0300_2018": 0.0007, +"mfv_stopdbardbar_tau000100um_M0400_2018": 0.0003, +"mfv_stopdbardbar_tau000300um_M0400_2018": 0.0001, +"mfv_stopdbardbar_tau001000um_M0400_2018": 0.0005, +"mfv_stopdbardbar_tau010000um_M0400_2018": 0.0009, +"mfv_stopdbardbar_tau000100um_M0600_2018": 0.0004, +"mfv_stopdbardbar_tau000300um_M0600_2018": 0.0000, +"mfv_stopdbardbar_tau001000um_M0600_2018": 0.0016, +"mfv_stopdbardbar_tau010000um_M0600_2018": 0.0011, +"mfv_stopdbardbar_tau030000um_M0600_2018": 0.0017, +"mfv_stopdbardbar_tau000100um_M0800_2018": 0.0003, +"mfv_stopdbardbar_tau000300um_M0800_2018": 0.0001, +"mfv_stopdbardbar_tau001000um_M0800_2018": 0.0001, +"mfv_stopdbardbar_tau010000um_M0800_2018": 0.0005, +"mfv_stopdbardbar_tau030000um_M0800_2018": 0.0003, +"mfv_stopdbardbar_tau000100um_M1200_2018": 0.0005, +"mfv_stopdbardbar_tau000300um_M1200_2018": 0.0000, +"mfv_stopdbardbar_tau001000um_M1200_2018": 0.0016, +"mfv_stopdbardbar_tau010000um_M1200_2018": 0.0024, +"mfv_stopdbardbar_tau030000um_M1200_2018": 0.0003, +"mfv_stopdbardbar_tau000100um_M1600_2018": 0.0003, +"mfv_stopdbardbar_tau000300um_M1600_2018": 0.0003, +"mfv_stopdbardbar_tau001000um_M1600_2018": 0.0009, +"mfv_stopdbardbar_tau010000um_M1600_2018": 0.0008, +"mfv_stopdbardbar_tau030000um_M1600_2018": 0.0007, +"mfv_stopdbardbar_tau001000um_M3000_2018": 0.0010, +"mfv_stopdbardbar_tau010000um_M3000_2018": 0.0041, +"mfv_stopdbardbar_tau030000um_M3000_2018": 0.0017, +"mfv_stopbbarbbar_tau000100um_M0200_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0200_2018": 0.0011, +"mfv_stopbbarbbar_tau001000um_M0200_2018": 0.0004, +"mfv_stopbbarbbar_tau010000um_M0200_2018": 0.0039, +"mfv_stopbbarbbar_tau030000um_M0200_2018": 0.0001, +"mfv_stopbbarbbar_tau000100um_M0300_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0300_2018": 0.0004, +"mfv_stopbbarbbar_tau010000um_M0300_2018": 0.0004, +"mfv_stopbbarbbar_tau030000um_M0300_2018": 0.0001, +"mfv_stopbbarbbar_tau000100um_M0400_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0400_2018": 0.0005, +"mfv_stopbbarbbar_tau010000um_M0400_2018": 0.0003, +"mfv_stopbbarbbar_tau030000um_M0400_2018": 0.0006, +"mfv_stopbbarbbar_tau000100um_M0600_2018": 0.0001, +"mfv_stopbbarbbar_tau000300um_M0600_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0600_2018": 0.0004, +"mfv_stopbbarbbar_tau010000um_M0600_2018": 0.0002, +"mfv_stopbbarbbar_tau030000um_M0600_2018": 0.0007, +"mfv_stopbbarbbar_tau000100um_M0800_2018": 0.0001, +"mfv_stopbbarbbar_tau000300um_M0800_2018": 0.0001, +"mfv_stopbbarbbar_tau001000um_M0800_2018": 0.0009, +"mfv_stopbbarbbar_tau010000um_M0800_2018": 0.0008, +"mfv_stopbbarbbar_tau030000um_M0800_2018": 0.0015, +"mfv_stopbbarbbar_tau000100um_M1200_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1200_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1200_2018": 0.0008, +"mfv_stopbbarbbar_tau010000um_M1200_2018": 0.0007, +"mfv_stopbbarbbar_tau030000um_M1200_2018": 0.0006, +"mfv_stopbbarbbar_tau000100um_M1600_2018": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1600_2018": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1600_2018": 0.0008, +"mfv_stopbbarbbar_tau010000um_M1600_2018": 0.0002, +"mfv_stopbbarbbar_tau030000um_M1600_2018": 0.0009, +"mfv_stopbbarbbar_tau001000um_M3000_2018": 0.0005, +"mfv_stopbbarbbar_tau010000um_M3000_2018": 0.0005, +"mfv_stopbbarbbar_tau030000um_M3000_2018": 0.0004, +"mfv_neu_tau000100um_M0200_2017": 0.0000, +"mfv_neu_tau000300um_M0200_2017": 0.0002, +"mfv_neu_tau010000um_M0200_2017": 0.0001, +"mfv_neu_tau030000um_M0200_2017": 0.0026, +"mfv_neu_tau000100um_M0300_2017": 0.0001, +"mfv_neu_tau000300um_M0300_2017": 0.0001, +"mfv_neu_tau001000um_M0300_2017": 0.0003, +"mfv_neu_tau010000um_M0300_2017": 0.0026, +"mfv_neu_tau030000um_M0300_2017": 0.0029, +"mfv_neu_tau000100um_M0400_2017": 0.0000, +"mfv_neu_tau001000um_M0400_2017": 0.0000, +"mfv_neu_tau010000um_M0400_2017": 0.0029, +"mfv_neu_tau030000um_M0400_2017": 0.0019, +"mfv_neu_tau000100um_M0600_2017": 0.0000, +"mfv_neu_tau000300um_M0600_2017": 0.0000, +"mfv_neu_tau001000um_M0600_2017": 0.0000, +"mfv_neu_tau010000um_M0600_2017": 0.0029, +"mfv_neu_tau030000um_M0600_2017": 0.0009, +"mfv_neu_tau000300um_M0800_2017": 0.0000, +"mfv_neu_tau001000um_M0800_2017": 0.0001, +"mfv_neu_tau010000um_M0800_2017": 0.0003, +"mfv_neu_tau030000um_M0800_2017": 0.0012, +"mfv_neu_tau000100um_M1200_2017": 0.0000, +"mfv_neu_tau000300um_M1200_2017": 0.0000, +"mfv_neu_tau001000um_M1200_2017": 0.0001, +"mfv_neu_tau010000um_M1200_2017": 0.0010, +"mfv_neu_tau000100um_M1600_2017": 0.0000, +"mfv_neu_tau000300um_M1600_2017": 0.0000, +"mfv_neu_tau001000um_M1600_2017": 0.0000, +"mfv_neu_tau010000um_M1600_2017": 0.0014, +"mfv_neu_tau030000um_M1600_2017": 0.0011, +"mfv_neu_tau001000um_M3000_2017": 0.0000, +"mfv_neu_tau010000um_M3000_2017": 0.0014, +"mfv_neu_tau030000um_M3000_2017": 0.0009, +"mfv_stopdbardbar_tau000100um_M0200_2017": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2017": 0.0003, +"mfv_stopdbardbar_tau001000um_M0200_2017": 0.0016, +"mfv_stopdbardbar_tau010000um_M0200_2017": 0.0001, +"mfv_stopdbardbar_tau030000um_M0200_2017": 0.0101, +"mfv_stopdbardbar_tau000100um_M0300_2017": 0.0004, +"mfv_stopdbardbar_tau000300um_M0300_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M0300_2017": 0.0013, +"mfv_stopdbardbar_tau010000um_M0300_2017": 0.0041, +"mfv_stopdbardbar_tau030000um_M0300_2017": 0.0023, +"mfv_stopdbardbar_tau000100um_M0400_2017": 0.0001, +"mfv_stopdbardbar_tau000300um_M0400_2017": 0.0001, +"mfv_stopdbardbar_tau001000um_M0400_2017": 0.0000, +"mfv_stopdbardbar_tau010000um_M0400_2017": 0.0003, +"mfv_stopdbardbar_tau030000um_M0400_2017": 0.0010, +"mfv_stopdbardbar_tau000100um_M0600_2017": 0.0002, +"mfv_stopdbardbar_tau000300um_M0600_2017": 0.0002, +"mfv_stopdbardbar_tau010000um_M0600_2017": 0.0018, +"mfv_stopdbardbar_tau030000um_M0600_2017": 0.0032, +"mfv_stopdbardbar_tau000100um_M0800_2017": 0.0001, +"mfv_stopdbardbar_tau000300um_M0800_2017": 0.0001, +"mfv_stopdbardbar_tau001000um_M0800_2017": 0.0006, +"mfv_stopdbardbar_tau010000um_M0800_2017": 0.0042, +"mfv_stopdbardbar_tau030000um_M0800_2017": 0.0020, +"mfv_stopdbardbar_tau000100um_M1200_2017": 0.0001, +"mfv_stopdbardbar_tau000300um_M1200_2017": 0.0000, +"mfv_stopdbardbar_tau001000um_M1200_2017": 0.0004, +"mfv_stopdbardbar_tau010000um_M1200_2017": 0.0014, +"mfv_stopdbardbar_tau030000um_M1200_2017": 0.0027, +"mfv_stopdbardbar_tau001000um_M1600_2017": 0.0003, +"mfv_stopdbardbar_tau010000um_M1600_2017": 0.0016, +"mfv_stopdbardbar_tau030000um_M1600_2017": 0.0008, +"mfv_stopdbardbar_tau001000um_M3000_2017": 0.0001, +"mfv_stopdbardbar_tau010000um_M3000_2017": 0.0005, +"mfv_stopdbardbar_tau030000um_M3000_2017": 0.0006, +"mfv_stopbbarbbar_tau000100um_M0200_2017": 0.0021, +"mfv_stopbbarbbar_tau000300um_M0200_2017": 0.0002, +"mfv_stopbbarbbar_tau001000um_M0200_2017": 0.0008, +"mfv_stopbbarbbar_tau010000um_M0200_2017": 0.0068, +"mfv_stopbbarbbar_tau030000um_M0200_2017": 0.0005, +"mfv_stopbbarbbar_tau000100um_M0300_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2017": 0.0001, +"mfv_stopbbarbbar_tau001000um_M0300_2017": 0.0001, +"mfv_stopbbarbbar_tau010000um_M0300_2017": 0.0069, +"mfv_stopbbarbbar_tau030000um_M0300_2017": 0.0050, +"mfv_stopbbarbbar_tau000100um_M0400_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2017": 0.0001, +"mfv_stopbbarbbar_tau001000um_M0400_2017": 0.0006, +"mfv_stopbbarbbar_tau010000um_M0400_2017": 0.0020, +"mfv_stopbbarbbar_tau030000um_M0400_2017": 0.0038, +"mfv_stopbbarbbar_tau000100um_M0600_2017": 0.0001, +"mfv_stopbbarbbar_tau000300um_M0600_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0600_2017": 0.0004, +"mfv_stopbbarbbar_tau010000um_M0600_2017": 0.0016, +"mfv_stopbbarbbar_tau030000um_M0600_2017": 0.0024, +"mfv_stopbbarbbar_tau000100um_M0800_2017": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0800_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0800_2017": 0.0000, +"mfv_stopbbarbbar_tau010000um_M0800_2017": 0.0003, +"mfv_stopbbarbbar_tau030000um_M0800_2017": 0.0002, +"mfv_stopbbarbbar_tau000100um_M1200_2017": 0.0001, +"mfv_stopbbarbbar_tau000300um_M1200_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1200_2017": 0.0002, +"mfv_stopbbarbbar_tau010000um_M1200_2017": 0.0032, +"mfv_stopbbarbbar_tau030000um_M1200_2017": 0.0008, +"mfv_stopbbarbbar_tau000300um_M1600_2017": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1600_2017": 0.0000, +"mfv_stopbbarbbar_tau010000um_M1600_2017": 0.0006, +"mfv_stopbbarbbar_tau030000um_M1600_2017": 0.0003, +"mfv_stopbbarbbar_tau001000um_M3000_2017": 0.0001, +"mfv_stopbbarbbar_tau010000um_M3000_2017": 0.0045, +"mfv_stopbbarbbar_tau030000um_M3000_2017": 0.0011, +"mfv_neu_tau000100um_M0200_2016": 0.0000, +"mfv_neu_tau000300um_M0200_2016": 0.0017, +"mfv_neu_tau001000um_M0200_2016": 0.0057, +"mfv_neu_tau010000um_M0200_2016": 0.0049, +"mfv_neu_tau030000um_M0200_2016": 0.0161, +"mfv_neu_tau000100um_M0300_2016": 0.0000, +"mfv_neu_tau000300um_M0300_2016": 0.0003, +"mfv_neu_tau001000um_M0300_2016": 0.0080, +"mfv_neu_tau010000um_M0300_2016": 0.0000, +"mfv_neu_tau030000um_M0300_2016": 0.0059, +"mfv_neu_tau000100um_M0400_2016": 0.0000, +"mfv_neu_tau000300um_M0400_2016": 0.0006, +"mfv_neu_tau001000um_M0400_2016": 0.0004, +"mfv_neu_tau010000um_M0400_2016": 0.0016, +"mfv_neu_tau030000um_M0400_2016": 0.0028, +"mfv_neu_tau000100um_M0600_2016": 0.0000, +"mfv_neu_tau000300um_M0600_2016": 0.0001, +"mfv_neu_tau001000um_M0600_2016": 0.0040, +"mfv_neu_tau010000um_M0600_2016": 0.0002, +"mfv_neu_tau030000um_M0600_2016": 0.0003, +"mfv_neu_tau000100um_M0800_2016": 0.0000, +"mfv_neu_tau000300um_M0800_2016": 0.0000, +"mfv_neu_tau001000um_M0800_2016": 0.0001, +"mfv_neu_tau010000um_M0800_2016": 0.0008, +"mfv_neu_tau030000um_M0800_2016": 0.0009, +"mfv_neu_tau000100um_M1200_2016": 0.0001, +"mfv_neu_tau000300um_M1200_2016": 0.0000, +"mfv_neu_tau001000um_M1200_2016": 0.0000, +"mfv_neu_tau010000um_M1200_2016": 0.0003, +"mfv_neu_tau030000um_M1200_2016": 0.0004, +"mfv_neu_tau000100um_M1600_2016": 0.0000, +"mfv_neu_tau000300um_M1600_2016": 0.0000, +"mfv_neu_tau001000um_M1600_2016": 0.0001, +"mfv_neu_tau010000um_M1600_2016": 0.0019, +"mfv_neu_tau030000um_M1600_2016": 0.0002, +"mfv_neu_tau000300um_M3000_2016": 0.0000, +"mfv_neu_tau001000um_M3000_2016": 0.0000, +"mfv_neu_tau010000um_M3000_2016": 0.0005, +"mfv_neu_tau030000um_M3000_2016": 0.0006, +"mfv_stopdbardbar_tau000100um_M0200_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2016": 0.0006, +"mfv_stopdbardbar_tau001000um_M0200_2016": 0.0051, +"mfv_stopdbardbar_tau010000um_M0200_2016": 0.0072, +"mfv_stopdbardbar_tau030000um_M0200_2016": 0.0010, +"mfv_stopdbardbar_tau000100um_M0300_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0300_2016": 0.0001, +"mfv_stopdbardbar_tau001000um_M0300_2016": 0.0020, +"mfv_stopdbardbar_tau010000um_M0300_2016": 0.0016, +"mfv_stopdbardbar_tau030000um_M0300_2016": 0.0046, +"mfv_stopdbardbar_tau000100um_M0400_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0400_2016": 0.0001, +"mfv_stopdbardbar_tau001000um_M0400_2016": 0.0019, +"mfv_stopdbardbar_tau010000um_M0400_2016": 0.0025, +"mfv_stopdbardbar_tau030000um_M0400_2016": 0.0004, +"mfv_stopdbardbar_tau000100um_M0600_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0600_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M0600_2016": 0.0005, +"mfv_stopdbardbar_tau010000um_M0600_2016": 0.0026, +"mfv_stopdbardbar_tau030000um_M0600_2016": 0.0003, +"mfv_stopdbardbar_tau000100um_M0800_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M0800_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M0800_2016": 0.0001, +"mfv_stopdbardbar_tau010000um_M0800_2016": 0.0020, +"mfv_stopdbardbar_tau030000um_M0800_2016": 0.0008, +"mfv_stopdbardbar_tau000100um_M1200_2016": 0.0010, +"mfv_stopdbardbar_tau000300um_M1200_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M1200_2016": 0.0002, +"mfv_stopdbardbar_tau010000um_M1200_2016": 0.0004, +"mfv_stopdbardbar_tau030000um_M1200_2016": 0.0002, +"mfv_stopdbardbar_tau000100um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau000300um_M1600_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M1600_2016": 0.0005, +"mfv_stopdbardbar_tau010000um_M1600_2016": 0.0017, +"mfv_stopdbardbar_tau030000um_M1600_2016": 0.0008, +"mfv_stopdbardbar_tau000300um_M3000_2016": 0.0000, +"mfv_stopdbardbar_tau001000um_M3000_2016": 0.0006, +"mfv_stopdbardbar_tau030000um_M3000_2016": 0.0028, +"mfv_stopbbarbbar_tau000300um_M0200_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0200_2016": 0.0048, +"mfv_stopbbarbbar_tau010000um_M0200_2016": 0.0173, +"mfv_stopbbarbbar_tau030000um_M0200_2016": 0.0181, +"mfv_stopbbarbbar_tau000100um_M0300_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2016": 0.0002, +"mfv_stopbbarbbar_tau001000um_M0300_2016": 0.0048, +"mfv_stopbbarbbar_tau010000um_M0300_2016": 0.0010, +"mfv_stopbbarbbar_tau030000um_M0300_2016": 0.0000, +"mfv_stopbbarbbar_tau000100um_M0400_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2016": 0.0001, +"mfv_stopbbarbbar_tau001000um_M0400_2016": 0.0020, +"mfv_stopbbarbbar_tau010000um_M0400_2016": 0.0026, +"mfv_stopbbarbbar_tau030000um_M0400_2016": 0.0014, +"mfv_stopbbarbbar_tau000100um_M0600_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0600_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M0600_2016": 0.0053, +"mfv_stopbbarbbar_tau010000um_M0600_2016": 0.0014, +"mfv_stopbbarbbar_tau030000um_M0600_2016": 0.0006, +"mfv_stopbbarbbar_tau000100um_M0800_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0800_2016": 0.0001, +"mfv_stopbbarbbar_tau001000um_M0800_2016": 0.0016, +"mfv_stopbbarbbar_tau010000um_M0800_2016": 0.0002, +"mfv_stopbbarbbar_tau030000um_M0800_2016": 0.0008, +"mfv_stopbbarbbar_tau000100um_M1200_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1200_2016": 0.0018, +"mfv_stopbbarbbar_tau010000um_M1200_2016": 0.0005, +"mfv_stopbbarbbar_tau030000um_M1200_2016": 0.0013, +"mfv_stopbbarbbar_tau000100um_M1600_2016": 0.0000, +"mfv_stopbbarbbar_tau000300um_M1600_2016": 0.0002, +"mfv_stopbbarbbar_tau001000um_M1600_2016": 0.0003, +"mfv_stopbbarbbar_tau010000um_M1600_2016": 0.0007, +"mfv_stopbbarbbar_tau030000um_M1600_2016": 0.0005, +"mfv_stopbbarbbar_tau000300um_M3000_2016": 0.0000, +"mfv_stopbbarbbar_tau001000um_M3000_2016": 0.0012, +"mfv_stopbbarbbar_tau010000um_M3000_2016": 0.0012, +"mfv_stopbbarbbar_tau030000um_M3000_2016": 0.0016, +"mfv_neu_tau000100um_M0200_2016APV": 0.0000, +"mfv_neu_tau000300um_M0200_2016APV": 0.0089, +"mfv_neu_tau001000um_M0200_2016APV": 0.0168, +"mfv_neu_tau010000um_M0200_2016APV": 0.0377, +"mfv_neu_tau030000um_M0200_2016APV": 0.0296, +"mfv_neu_tau000100um_M0300_2016APV": 0.0151, +"mfv_neu_tau000300um_M0300_2016APV": 0.0019, +"mfv_neu_tau001000um_M0300_2016APV": 0.0073, +"mfv_neu_tau010000um_M0300_2016APV": 0.0079, +"mfv_neu_tau030000um_M0300_2016APV": 0.0080, +"mfv_neu_tau000100um_M0400_2016APV": 0.0000, +"mfv_neu_tau000300um_M0400_2016APV": 0.0008, +"mfv_neu_tau001000um_M0400_2016APV": 0.0002, +"mfv_neu_tau010000um_M0400_2016APV": 0.0007, +"mfv_neu_tau030000um_M0400_2016APV": 0.0026, +"mfv_neu_tau000100um_M0600_2016APV": 0.0001, +"mfv_neu_tau000300um_M0600_2016APV": 0.0002, +"mfv_neu_tau001000um_M0600_2016APV": 0.0021, +"mfv_neu_tau010000um_M0600_2016APV": 0.0007, +"mfv_neu_tau030000um_M0600_2016APV": 0.0078, +"mfv_neu_tau000100um_M0800_2016APV": 0.0005, +"mfv_neu_tau000300um_M0800_2016APV": 0.0004, +"mfv_neu_tau001000um_M0800_2016APV": 0.0010, +"mfv_neu_tau010000um_M0800_2016APV": 0.0090, +"mfv_neu_tau030000um_M0800_2016APV": 0.0030, +"mfv_neu_tau000100um_M1200_2016APV": 0.0005, +"mfv_neu_tau000300um_M1200_2016APV": 0.0000, +"mfv_neu_tau001000um_M1200_2016APV": 0.0008, +"mfv_neu_tau010000um_M1200_2016APV": 0.0002, +"mfv_neu_tau000100um_M1600_2016APV": 0.0000, +"mfv_neu_tau000300um_M1600_2016APV": 0.0003, +"mfv_neu_tau001000um_M1600_2016APV": 0.0004, +"mfv_neu_tau010000um_M1600_2016APV": 0.0001, +"mfv_neu_tau030000um_M1600_2016APV": 0.0016, +"mfv_neu_tau001000um_M3000_2016APV": 0.0001, +"mfv_neu_tau010000um_M3000_2016APV": 0.0017, +"mfv_neu_tau030000um_M3000_2016APV": 0.0037, +"mfv_stopdbardbar_tau000100um_M0200_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0200_2016APV": 0.0017, +"mfv_stopdbardbar_tau001000um_M0200_2016APV": 0.0029, +"mfv_stopdbardbar_tau010000um_M0200_2016APV": 0.0372, +"mfv_stopdbardbar_tau030000um_M0200_2016APV": 0.0218, +"mfv_stopdbardbar_tau000100um_M0300_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M0300_2016APV": 0.0012, +"mfv_stopdbardbar_tau001000um_M0300_2016APV": 0.0022, +"mfv_stopdbardbar_tau010000um_M0300_2016APV": 0.0020, +"mfv_stopdbardbar_tau030000um_M0300_2016APV": 0.0061, +"mfv_stopdbardbar_tau000100um_M0400_2016APV": 0.0003, +"mfv_stopdbardbar_tau000300um_M0400_2016APV": 0.0002, +"mfv_stopdbardbar_tau010000um_M0400_2016APV": 0.0053, +"mfv_stopdbardbar_tau030000um_M0400_2016APV": 0.0059, +"mfv_stopdbardbar_tau000100um_M0600_2016APV": 0.0004, +"mfv_stopdbardbar_tau000300um_M0600_2016APV": 0.0007, +"mfv_stopdbardbar_tau001000um_M0600_2016APV": 0.0023, +"mfv_stopdbardbar_tau010000um_M0600_2016APV": 0.0053, +"mfv_stopdbardbar_tau030000um_M0600_2016APV": 0.0096, +"mfv_stopdbardbar_tau000100um_M0800_2016APV": 0.0001, +"mfv_stopdbardbar_tau000300um_M0800_2016APV": 0.0000, +"mfv_stopdbardbar_tau001000um_M0800_2016APV": 0.0009, +"mfv_stopdbardbar_tau010000um_M0800_2016APV": 0.0069, +"mfv_stopdbardbar_tau030000um_M0800_2016APV": 0.0053, +"mfv_stopdbardbar_tau000100um_M1200_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M1200_2016APV": 0.0002, +"mfv_stopdbardbar_tau001000um_M1200_2016APV": 0.0008, +"mfv_stopdbardbar_tau010000um_M1200_2016APV": 0.0003, +"mfv_stopdbardbar_tau030000um_M1200_2016APV": 0.0032, +"mfv_stopdbardbar_tau000100um_M1600_2016APV": 0.0003, +"mfv_stopdbardbar_tau000300um_M1600_2016APV": 0.0001, +"mfv_stopdbardbar_tau001000um_M1600_2016APV": 0.0008, +"mfv_stopdbardbar_tau010000um_M1600_2016APV": 0.0012, +"mfv_stopdbardbar_tau030000um_M1600_2016APV": 0.0000, +"mfv_stopdbardbar_tau000300um_M3000_2016APV": 0.0002, +"mfv_stopdbardbar_tau001000um_M3000_2016APV": 0.0002, +"mfv_stopdbardbar_tau010000um_M3000_2016APV": 0.0009, +"mfv_stopdbardbar_tau030000um_M3000_2016APV": 0.0002, +"mfv_stopbbarbbar_tau000100um_M0200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0200_2016APV": 0.0051, +"mfv_stopbbarbbar_tau001000um_M0200_2016APV": 0.0123, +"mfv_stopbbarbbar_tau010000um_M0200_2016APV": 0.0739, +"mfv_stopbbarbbar_tau030000um_M0200_2016APV": 0.0589, +"mfv_stopbbarbbar_tau000100um_M0300_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0300_2016APV": 0.0003, +"mfv_stopbbarbbar_tau001000um_M0300_2016APV": 0.0037, +"mfv_stopbbarbbar_tau010000um_M0300_2016APV": 0.0076, +"mfv_stopbbarbbar_tau030000um_M0300_2016APV": 0.0081, +"mfv_stopbbarbbar_tau000100um_M0400_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0400_2016APV": 0.0001, +"mfv_stopbbarbbar_tau001000um_M0400_2016APV": 0.0038, +"mfv_stopbbarbbar_tau010000um_M0400_2016APV": 0.0016, +"mfv_stopbbarbbar_tau030000um_M0400_2016APV": 0.0052, +"mfv_stopbbarbbar_tau000100um_M0600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0600_2016APV": 0.0004, +"mfv_stopbbarbbar_tau001000um_M0600_2016APV": 0.0008, +"mfv_stopbbarbbar_tau010000um_M0600_2016APV": 0.0010, +"mfv_stopbbarbbar_tau030000um_M0600_2016APV": 0.0020, +"mfv_stopbbarbbar_tau000100um_M0800_2016APV": 0.0000, +"mfv_stopbbarbbar_tau000300um_M0800_2016APV": 0.0001, +"mfv_stopbbarbbar_tau001000um_M0800_2016APV": 0.0009, +"mfv_stopbbarbbar_tau010000um_M0800_2016APV": 0.0071, +"mfv_stopbbarbbar_tau030000um_M0800_2016APV": 0.0005, +"mfv_stopbbarbbar_tau000100um_M1200_2016APV": 0.0001, +"mfv_stopbbarbbar_tau000300um_M1200_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1200_2016APV": 0.0016, +"mfv_stopbbarbbar_tau010000um_M1200_2016APV": 0.0057, +"mfv_stopbbarbbar_tau030000um_M1200_2016APV": 0.0039, +"mfv_stopbbarbbar_tau000100um_M1600_2016APV": 0.0001, +"mfv_stopbbarbbar_tau000300um_M1600_2016APV": 0.0000, +"mfv_stopbbarbbar_tau001000um_M1600_2016APV": 0.0005, +"mfv_stopbbarbbar_tau010000um_M1600_2016APV": 0.0018, +"mfv_stopbbarbbar_tau030000um_M1600_2016APV": 0.0006, +"mfv_stopbbarbbar_tau001000um_M3000_2016APV": 0.0005, +"mfv_stopbbarbbar_tau010000um_M3000_2016APV": 0.0025, +"mfv_stopbbarbbar_tau030000um_M3000_2016APV": 0.0084, +} + +total_uncerts = { +"ggHToSSTodddd_tau1mm_M55_2018": 0.1103, +"ggHToSSTodddd_tau10mm_M55_2018": 0.0562, +"ggHToSSTodddd_tau100mm_M55_2018": 0.1302, +"ggHToSSTodddd_tau1mm_M55_2017": 0.1204, +"ggHToSSTodddd_tau10mm_M55_2017": 0.0690, +"ggHToSSTodddd_tau100mm_M55_2017": 0.1289, +"ggHToSSTodddd_tau1mm_M55_2016": 0.0480, +"ggHToSSTodddd_tau10mm_M55_2016": 0.0576, +"ggHToSSTodddd_tau1mm_M55_2016APV": 0.1694, +"ggHToSSTodddd_tau10mm_M55_2016APV": 0.2390, +"ggHToSSTodddd_tau100mm_M55_2016APV": 0.8545, +"mfv_neu_tau000100um_M0200_2018": 0.0707, +"mfv_neu_tau000300um_M0200_2018": 0.0556, +"mfv_neu_tau010000um_M0200_2018": 0.0506, +"mfv_neu_tau030000um_M0200_2018": 0.0564, +"mfv_neu_tau000100um_M0300_2018": 0.0270, +"mfv_neu_tau000300um_M0300_2018": 0.0325, +"mfv_neu_tau001000um_M0300_2018": 0.0494, +"mfv_neu_tau010000um_M0300_2018": 0.0467, +"mfv_neu_tau030000um_M0300_2018": 0.0653, +"mfv_neu_tau000100um_M0400_2018": 0.0253, +"mfv_neu_tau000300um_M0400_2018": 0.0248, +"mfv_neu_tau001000um_M0400_2018": 0.0271, +"mfv_neu_tau010000um_M0400_2018": 0.0295, +"mfv_neu_tau030000um_M0400_2018": 0.0418, +"mfv_neu_tau000100um_M0600_2018": 0.0235, +"mfv_neu_tau001000um_M0600_2018": 0.0203, +"mfv_neu_tau010000um_M0600_2018": 0.0078, +"mfv_neu_tau030000um_M0600_2018": 0.0082, +"mfv_neu_tau000100um_M0800_2018": 0.0230, +"mfv_neu_tau000300um_M0800_2018": 0.0205, +"mfv_neu_tau001000um_M0800_2018": 0.0192, +"mfv_neu_tau010000um_M0800_2018": 0.0060, +"mfv_neu_tau030000um_M0800_2018": 0.0056, +"mfv_neu_tau000100um_M1200_2018": 0.0249, +"mfv_neu_tau000300um_M1200_2018": 0.0205, +"mfv_neu_tau001000um_M1200_2018": 0.0197, +"mfv_neu_tau010000um_M1200_2018": 0.0059, +"mfv_neu_tau030000um_M1200_2018": 0.0053, +"mfv_neu_tau000100um_M1600_2018": 0.0303, +"mfv_neu_tau000300um_M1600_2018": 0.0215, +"mfv_neu_tau001000um_M1600_2018": 0.0195, +"mfv_neu_tau010000um_M1600_2018": 0.0059, +"mfv_neu_tau030000um_M1600_2018": 0.0053, +"mfv_neu_tau000300um_M3000_2018": 0.0348, +"mfv_neu_tau001000um_M3000_2018": 0.0207, +"mfv_neu_tau030000um_M3000_2018": 0.0057, +"mfv_stopdbardbar_tau000100um_M0200_2018": 0.0887, +"mfv_stopdbardbar_tau000300um_M0200_2018": 0.0713, +"mfv_stopdbardbar_tau001000um_M0200_2018": 0.0488, +"mfv_stopdbardbar_tau010000um_M0200_2018": 0.0421, +"mfv_stopdbardbar_tau030000um_M0200_2018": 0.0612, +"mfv_stopdbardbar_tau000100um_M0300_2018": 0.0833, +"mfv_stopdbardbar_tau000300um_M0300_2018": 0.0552, +"mfv_stopdbardbar_tau001000um_M0300_2018": 0.0374, +"mfv_stopdbardbar_tau010000um_M0300_2018": 0.0352, +"mfv_stopdbardbar_tau030000um_M0300_2018": 0.0497, +"mfv_stopdbardbar_tau000100um_M0400_2018": 0.0718, +"mfv_stopdbardbar_tau000300um_M0400_2018": 0.0441, +"mfv_stopdbardbar_tau001000um_M0400_2018": 0.0273, +"mfv_stopdbardbar_tau010000um_M0400_2018": 0.0145, +"mfv_stopdbardbar_tau000100um_M0600_2018": 0.0791, +"mfv_stopdbardbar_tau000300um_M0600_2018": 0.0422, +"mfv_stopdbardbar_tau001000um_M0600_2018": 0.0238, +"mfv_stopdbardbar_tau010000um_M0600_2018": 0.0083, +"mfv_stopdbardbar_tau030000um_M0600_2018": 0.0073, +"mfv_stopdbardbar_tau000100um_M0800_2018": 0.0789, +"mfv_stopdbardbar_tau000300um_M0800_2018": 0.0424, +"mfv_stopdbardbar_tau001000um_M0800_2018": 0.0225, +"mfv_stopdbardbar_tau010000um_M0800_2018": 0.0070, +"mfv_stopdbardbar_tau030000um_M0800_2018": 0.0070, +"mfv_stopdbardbar_tau000100um_M1200_2018": 0.0929, +"mfv_stopdbardbar_tau000300um_M1200_2018": 0.0471, +"mfv_stopdbardbar_tau001000um_M1200_2018": 0.0244, +"mfv_stopdbardbar_tau010000um_M1200_2018": 0.0078, +"mfv_stopdbardbar_tau030000um_M1200_2018": 0.0062, +"mfv_stopdbardbar_tau000100um_M1600_2018": 0.0912, +"mfv_stopdbardbar_tau000300um_M1600_2018": 0.0538, +"mfv_stopdbardbar_tau001000um_M1600_2018": 0.0246, +"mfv_stopdbardbar_tau010000um_M1600_2018": 0.0073, +"mfv_stopdbardbar_tau030000um_M1600_2018": 0.0065, +"mfv_stopdbardbar_tau001000um_M3000_2018": 0.0226, +"mfv_stopdbardbar_tau010000um_M3000_2018": 0.0091, +"mfv_stopdbardbar_tau030000um_M3000_2018": 0.0068, +"mfv_stopbbarbbar_tau000100um_M0200_2018": 0.0632, +"mfv_stopbbarbbar_tau000300um_M0200_2018": 0.0450, +"mfv_stopbbarbbar_tau001000um_M0200_2018": 0.0428, +"mfv_stopbbarbbar_tau010000um_M0200_2018": 0.0342, +"mfv_stopbbarbbar_tau030000um_M0200_2018": 0.0423, +"mfv_stopbbarbbar_tau000100um_M0300_2018": 0.0501, +"mfv_stopbbarbbar_tau000300um_M0300_2018": 0.0333, +"mfv_stopbbarbbar_tau001000um_M0300_2018": 0.0323, +"mfv_stopbbarbbar_tau010000um_M0300_2018": 0.0342, +"mfv_stopbbarbbar_tau030000um_M0300_2018": 0.0475, +"mfv_stopbbarbbar_tau000100um_M0400_2018": 0.0360, +"mfv_stopbbarbbar_tau000300um_M0400_2018": 0.0252, +"mfv_stopbbarbbar_tau001000um_M0400_2018": 0.0203, +"mfv_stopbbarbbar_tau010000um_M0400_2018": 0.0182, +"mfv_stopbbarbbar_tau030000um_M0400_2018": 0.0259, +"mfv_stopbbarbbar_tau000100um_M0600_2018": 0.0348, +"mfv_stopbbarbbar_tau000300um_M0600_2018": 0.0236, +"mfv_stopbbarbbar_tau001000um_M0600_2018": 0.0194, +"mfv_stopbbarbbar_tau010000um_M0600_2018": 0.0073, +"mfv_stopbbarbbar_tau030000um_M0600_2018": 0.0073, +"mfv_stopbbarbbar_tau000100um_M0800_2018": 0.0381, +"mfv_stopbbarbbar_tau000300um_M0800_2018": 0.0249, +"mfv_stopbbarbbar_tau001000um_M0800_2018": 0.0171, +"mfv_stopbbarbbar_tau010000um_M0800_2018": 0.0073, +"mfv_stopbbarbbar_tau030000um_M0800_2018": 0.0070, +"mfv_stopbbarbbar_tau000100um_M1200_2018": 0.0489, +"mfv_stopbbarbbar_tau000300um_M1200_2018": 0.0294, +"mfv_stopbbarbbar_tau001000um_M1200_2018": 0.0188, +"mfv_stopbbarbbar_tau010000um_M1200_2018": 0.0069, +"mfv_stopbbarbbar_tau030000um_M1200_2018": 0.0061, +"mfv_stopbbarbbar_tau000100um_M1600_2018": 0.0744, +"mfv_stopbbarbbar_tau000300um_M1600_2018": 0.0340, +"mfv_stopbbarbbar_tau001000um_M1600_2018": 0.0203, +"mfv_stopbbarbbar_tau010000um_M1600_2018": 0.0068, +"mfv_stopbbarbbar_tau030000um_M1600_2018": 0.0063, +"mfv_stopbbarbbar_tau001000um_M3000_2018": 0.0244, +"mfv_stopbbarbbar_tau010000um_M3000_2018": 0.0066, +"mfv_stopbbarbbar_tau030000um_M3000_2018": 0.0060, +"mfv_neu_tau000100um_M0200_2017": 0.0650, +"mfv_neu_tau000300um_M0200_2017": 0.0519, +"mfv_neu_tau010000um_M0200_2017": 0.0517, +"mfv_neu_tau030000um_M0200_2017": 0.0377, +"mfv_neu_tau000100um_M0300_2017": 0.0285, +"mfv_neu_tau000300um_M0300_2017": 0.0323, +"mfv_neu_tau001000um_M0300_2017": 0.0443, +"mfv_neu_tau010000um_M0300_2017": 0.0390, +"mfv_neu_tau030000um_M0300_2017": 0.0452, +"mfv_neu_tau000100um_M0400_2017": 0.0258, +"mfv_neu_tau001000um_M0400_2017": 0.0336, +"mfv_neu_tau010000um_M0400_2017": 0.0258, +"mfv_neu_tau030000um_M0400_2017": 0.0310, +"mfv_neu_tau000100um_M0600_2017": 0.0220, +"mfv_neu_tau000300um_M0600_2017": 0.0211, +"mfv_neu_tau001000um_M0600_2017": 0.0238, +"mfv_neu_tau010000um_M0600_2017": 0.0082, +"mfv_neu_tau030000um_M0600_2017": 0.0095, +"mfv_neu_tau000300um_M0800_2017": 0.0207, +"mfv_neu_tau001000um_M0800_2017": 0.0225, +"mfv_neu_tau010000um_M0800_2017": 0.0062, +"mfv_neu_tau030000um_M0800_2017": 0.0062, +"mfv_neu_tau000100um_M1200_2017": 0.0207, +"mfv_neu_tau000300um_M1200_2017": 0.0201, +"mfv_neu_tau001000um_M1200_2017": 0.0215, +"mfv_neu_tau010000um_M1200_2017": 0.0068, +"mfv_neu_tau000100um_M1600_2017": 0.0206, +"mfv_neu_tau000300um_M1600_2017": 0.0202, +"mfv_neu_tau001000um_M1600_2017": 0.0210, +"mfv_neu_tau010000um_M1600_2017": 0.0081, +"mfv_neu_tau030000um_M1600_2017": 0.0056, +"mfv_neu_tau001000um_M3000_2017": 0.0217, +"mfv_neu_tau010000um_M3000_2017": 0.0086, +"mfv_neu_tau030000um_M3000_2017": 0.0063, +"mfv_stopdbardbar_tau000100um_M0200_2017": 0.0665, +"mfv_stopdbardbar_tau000300um_M0200_2017": 0.0583, +"mfv_stopdbardbar_tau001000um_M0200_2017": 0.0617, +"mfv_stopdbardbar_tau010000um_M0200_2017": 0.0374, +"mfv_stopdbardbar_tau030000um_M0200_2017": 0.0500, +"mfv_stopdbardbar_tau000100um_M0300_2017": 0.0526, +"mfv_stopdbardbar_tau000300um_M0300_2017": 0.0427, +"mfv_stopdbardbar_tau001000um_M0300_2017": 0.0470, +"mfv_stopdbardbar_tau010000um_M0300_2017": 0.0322, +"mfv_stopdbardbar_tau030000um_M0300_2017": 0.0409, +"mfv_stopdbardbar_tau000100um_M0400_2017": 0.0450, +"mfv_stopdbardbar_tau000300um_M0400_2017": 0.0323, +"mfv_stopdbardbar_tau001000um_M0400_2017": 0.0345, +"mfv_stopdbardbar_tau010000um_M0400_2017": 0.0215, +"mfv_stopdbardbar_tau030000um_M0400_2017": 0.0228, +"mfv_stopdbardbar_tau000100um_M0600_2017": 0.0350, +"mfv_stopdbardbar_tau000300um_M0600_2017": 0.0260, +"mfv_stopdbardbar_tau010000um_M0600_2017": 0.0146, +"mfv_stopdbardbar_tau030000um_M0600_2017": 0.0163, +"mfv_stopdbardbar_tau000100um_M0800_2017": 0.0308, +"mfv_stopdbardbar_tau000300um_M0800_2017": 0.0253, +"mfv_stopdbardbar_tau001000um_M0800_2017": 0.0268, +"mfv_stopdbardbar_tau010000um_M0800_2017": 0.0146, +"mfv_stopdbardbar_tau030000um_M0800_2017": 0.0149, +"mfv_stopdbardbar_tau000100um_M1200_2017": 0.0238, +"mfv_stopdbardbar_tau000300um_M1200_2017": 0.0222, +"mfv_stopdbardbar_tau001000um_M1200_2017": 0.0220, +"mfv_stopdbardbar_tau010000um_M1200_2017": 0.0089, +"mfv_stopdbardbar_tau030000um_M1200_2017": 0.0111, +"mfv_stopdbardbar_tau001000um_M1600_2017": 0.0246, +"mfv_stopdbardbar_tau010000um_M1600_2017": 0.0081, +"mfv_stopdbardbar_tau030000um_M1600_2017": 0.0109, +"mfv_stopdbardbar_tau001000um_M3000_2017": 0.0481, +"mfv_stopdbardbar_tau010000um_M3000_2017": 0.0202, +"mfv_stopdbardbar_tau030000um_M3000_2017": 0.0119, +"mfv_stopbbarbbar_tau000100um_M0200_2017": 0.0246, +"mfv_stopbbarbbar_tau000300um_M0200_2017": 0.0351, +"mfv_stopbbarbbar_tau001000um_M0200_2017": 0.0357, +"mfv_stopbbarbbar_tau010000um_M0200_2017": 0.0403, +"mfv_stopbbarbbar_tau030000um_M0200_2017": 0.0380, +"mfv_stopbbarbbar_tau000100um_M0300_2017": 0.0244, +"mfv_stopbbarbbar_tau000300um_M0300_2017": 0.0271, +"mfv_stopbbarbbar_tau001000um_M0300_2017": 0.0344, +"mfv_stopbbarbbar_tau010000um_M0300_2017": 0.0354, +"mfv_stopbbarbbar_tau030000um_M0300_2017": 0.0404, +"mfv_stopbbarbbar_tau000100um_M0400_2017": 0.0223, +"mfv_stopbbarbbar_tau000300um_M0400_2017": 0.0230, +"mfv_stopbbarbbar_tau001000um_M0400_2017": 0.0273, +"mfv_stopbbarbbar_tau010000um_M0400_2017": 0.0227, +"mfv_stopbbarbbar_tau030000um_M0400_2017": 0.0247, +"mfv_stopbbarbbar_tau000100um_M0600_2017": 0.0241, +"mfv_stopbbarbbar_tau000300um_M0600_2017": 0.0212, +"mfv_stopbbarbbar_tau001000um_M0600_2017": 0.0236, +"mfv_stopbbarbbar_tau010000um_M0600_2017": 0.0163, +"mfv_stopbbarbbar_tau030000um_M0600_2017": 0.0162, +"mfv_stopbbarbbar_tau000100um_M0800_2017": 0.0227, +"mfv_stopbbarbbar_tau000300um_M0800_2017": 0.0209, +"mfv_stopbbarbbar_tau001000um_M0800_2017": 0.0220, +"mfv_stopbbarbbar_tau010000um_M0800_2017": 0.0153, +"mfv_stopbbarbbar_tau030000um_M0800_2017": 0.0142, +"mfv_stopbbarbbar_tau000100um_M1200_2017": 0.0215, +"mfv_stopbbarbbar_tau000300um_M1200_2017": 0.0210, +"mfv_stopbbarbbar_tau001000um_M1200_2017": 0.0215, +"mfv_stopbbarbbar_tau010000um_M1200_2017": 0.0123, +"mfv_stopbbarbbar_tau030000um_M1200_2017": 0.0111, +"mfv_stopbbarbbar_tau000300um_M1600_2017": 0.0206, +"mfv_stopbbarbbar_tau001000um_M1600_2017": 0.0215, +"mfv_stopbbarbbar_tau010000um_M1600_2017": 0.0087, +"mfv_stopbbarbbar_tau030000um_M1600_2017": 0.0103, +"mfv_stopbbarbbar_tau001000um_M3000_2017": 0.0390, +"mfv_stopbbarbbar_tau010000um_M3000_2017": 0.0174, +"mfv_stopbbarbbar_tau030000um_M3000_2017": 0.0127, +"mfv_neu_tau000100um_M0200_2016": 0.0200, +"mfv_neu_tau000300um_M0200_2016": 0.0245, +"mfv_neu_tau001000um_M0200_2016": 0.0256, +"mfv_neu_tau010000um_M0200_2016": 0.0450, +"mfv_neu_tau030000um_M0200_2016": 0.0526, +"mfv_neu_tau000100um_M0300_2016": 0.0212, +"mfv_neu_tau000300um_M0300_2016": 0.0240, +"mfv_neu_tau001000um_M0300_2016": 0.0232, +"mfv_neu_tau010000um_M0300_2016": 0.0337, +"mfv_neu_tau030000um_M0300_2016": 0.0516, +"mfv_neu_tau000100um_M0400_2016": 0.0203, +"mfv_neu_tau000300um_M0400_2016": 0.0225, +"mfv_neu_tau001000um_M0400_2016": 0.0210, +"mfv_neu_tau010000um_M0400_2016": 0.0152, +"mfv_neu_tau030000um_M0400_2016": 0.0206, +"mfv_neu_tau000100um_M0600_2016": 0.0206, +"mfv_neu_tau000300um_M0600_2016": 0.0205, +"mfv_neu_tau001000um_M0600_2016": 0.0178, +"mfv_neu_tau010000um_M0600_2016": 0.0069, +"mfv_neu_tau030000um_M0600_2016": 0.0063, +"mfv_neu_tau000100um_M0800_2016": 0.0204, +"mfv_neu_tau000300um_M0800_2016": 0.0202, +"mfv_neu_tau001000um_M0800_2016": 0.0202, +"mfv_neu_tau010000um_M0800_2016": 0.0065, +"mfv_neu_tau030000um_M0800_2016": 0.0059, +"mfv_neu_tau000100um_M1200_2016": 0.0203, +"mfv_neu_tau000300um_M1200_2016": 0.0201, +"mfv_neu_tau001000um_M1200_2016": 0.0204, +"mfv_neu_tau010000um_M1200_2016": 0.0063, +"mfv_neu_tau030000um_M1200_2016": 0.0056, +"mfv_neu_tau000100um_M1600_2016": 0.0202, +"mfv_neu_tau000300um_M1600_2016": 0.0201, +"mfv_neu_tau001000um_M1600_2016": 0.0204, +"mfv_neu_tau010000um_M1600_2016": 0.0075, +"mfv_neu_tau030000um_M1600_2016": 0.0056, +"mfv_neu_tau000300um_M3000_2016": 0.0293, +"mfv_neu_tau001000um_M3000_2016": 0.0231, +"mfv_neu_tau010000um_M3000_2016": 0.0094, +"mfv_neu_tau030000um_M3000_2016": 0.0069, +"mfv_stopdbardbar_tau000100um_M0200_2016": 0.0230, +"mfv_stopdbardbar_tau000300um_M0200_2016": 0.0252, +"mfv_stopdbardbar_tau001000um_M0200_2016": 0.0244, +"mfv_stopdbardbar_tau010000um_M0200_2016": 0.0306, +"mfv_stopdbardbar_tau030000um_M0200_2016": 0.0531, +"mfv_stopdbardbar_tau000100um_M0300_2016": 0.0208, +"mfv_stopdbardbar_tau000300um_M0300_2016": 0.0228, +"mfv_stopdbardbar_tau001000um_M0300_2016": 0.0201, +"mfv_stopdbardbar_tau010000um_M0300_2016": 0.0190, +"mfv_stopdbardbar_tau030000um_M0300_2016": 0.0276, +"mfv_stopdbardbar_tau000100um_M0400_2016": 0.0223, +"mfv_stopdbardbar_tau000300um_M0400_2016": 0.0216, +"mfv_stopdbardbar_tau001000um_M0400_2016": 0.0172, +"mfv_stopdbardbar_tau010000um_M0400_2016": 0.0105, +"mfv_stopdbardbar_tau030000um_M0400_2016": 0.0100, +"mfv_stopdbardbar_tau000100um_M0600_2016": 0.0218, +"mfv_stopdbardbar_tau000300um_M0600_2016": 0.0216, +"mfv_stopdbardbar_tau001000um_M0600_2016": 0.0200, +"mfv_stopdbardbar_tau010000um_M0600_2016": 0.0100, +"mfv_stopdbardbar_tau030000um_M0600_2016": 0.0070, +"mfv_stopdbardbar_tau000100um_M0800_2016": 0.0216, +"mfv_stopdbardbar_tau000300um_M0800_2016": 0.0215, +"mfv_stopdbardbar_tau001000um_M0800_2016": 0.0193, +"mfv_stopdbardbar_tau010000um_M0800_2016": 0.0079, +"mfv_stopdbardbar_tau030000um_M0800_2016": 0.0069, +"mfv_stopdbardbar_tau000100um_M1200_2016": 0.0323, +"mfv_stopdbardbar_tau000300um_M1200_2016": 0.0235, +"mfv_stopdbardbar_tau001000um_M1200_2016": 0.0232, +"mfv_stopdbardbar_tau010000um_M1200_2016": 0.0089, +"mfv_stopdbardbar_tau030000um_M1200_2016": 0.0072, +"mfv_stopdbardbar_tau000100um_M1600_2016": 0.0708, +"mfv_stopdbardbar_tau000300um_M1600_2016": 0.0359, +"mfv_stopdbardbar_tau001000um_M1600_2016": 0.0244, +"mfv_stopdbardbar_tau010000um_M1600_2016": 0.0104, +"mfv_stopdbardbar_tau030000um_M1600_2016": 0.0075, +"mfv_stopdbardbar_tau000300um_M3000_2016": 0.1172, +"mfv_stopdbardbar_tau001000um_M3000_2016": 0.0617, +"mfv_stopdbardbar_tau030000um_M3000_2016": 0.0117, +"mfv_stopbbarbbar_tau000300um_M0200_2016": 0.0228, +"mfv_stopbbarbbar_tau001000um_M0200_2016": 0.0267, +"mfv_stopbbarbbar_tau010000um_M0200_2016": 0.0492, +"mfv_stopbbarbbar_tau030000um_M0200_2016": 0.0488, +"mfv_stopbbarbbar_tau000100um_M0300_2016": 0.0241, +"mfv_stopbbarbbar_tau000300um_M0300_2016": 0.0226, +"mfv_stopbbarbbar_tau001000um_M0300_2016": 0.0212, +"mfv_stopbbarbbar_tau010000um_M0300_2016": 0.0200, +"mfv_stopbbarbbar_tau030000um_M0300_2016": 0.0288, +"mfv_stopbbarbbar_tau000100um_M0400_2016": 0.0210, +"mfv_stopbbarbbar_tau000300um_M0400_2016": 0.0209, +"mfv_stopbbarbbar_tau001000um_M0400_2016": 0.0165, +"mfv_stopbbarbbar_tau010000um_M0400_2016": 0.0118, +"mfv_stopbbarbbar_tau030000um_M0400_2016": 0.0142, +"mfv_stopbbarbbar_tau000100um_M0600_2016": 0.0201, +"mfv_stopbbarbbar_tau000300um_M0600_2016": 0.0201, +"mfv_stopbbarbbar_tau001000um_M0600_2016": 0.0188, +"mfv_stopbbarbbar_tau010000um_M0600_2016": 0.0074, +"mfv_stopbbarbbar_tau030000um_M0600_2016": 0.0080, +"mfv_stopbbarbbar_tau000100um_M0800_2016": 0.0200, +"mfv_stopbbarbbar_tau000300um_M0800_2016": 0.0204, +"mfv_stopbbarbbar_tau001000um_M0800_2016": 0.0190, +"mfv_stopbbarbbar_tau010000um_M0800_2016": 0.0078, +"mfv_stopbbarbbar_tau030000um_M0800_2016": 0.0062, +"mfv_stopbbarbbar_tau000100um_M1200_2016": 0.0224, +"mfv_stopbbarbbar_tau001000um_M1200_2016": 0.0204, +"mfv_stopbbarbbar_tau010000um_M1200_2016": 0.0076, +"mfv_stopbbarbbar_tau030000um_M1200_2016": 0.0067, +"mfv_stopbbarbbar_tau000100um_M1600_2016": 0.0351, +"mfv_stopbbarbbar_tau000300um_M1600_2016": 0.0241, +"mfv_stopbbarbbar_tau001000um_M1600_2016": 0.0237, +"mfv_stopbbarbbar_tau010000um_M1600_2016": 0.0093, +"mfv_stopbbarbbar_tau030000um_M1600_2016": 0.0073, +"mfv_stopbbarbbar_tau000300um_M3000_2016": 0.0772, +"mfv_stopbbarbbar_tau001000um_M3000_2016": 0.0430, +"mfv_stopbbarbbar_tau010000um_M3000_2016": 0.0153, +"mfv_stopbbarbbar_tau030000um_M3000_2016": 0.0110, +"mfv_neu_tau000100um_M0200_2016APV": 0.0402, +"mfv_neu_tau000300um_M0200_2016APV": 0.0446, +"mfv_neu_tau001000um_M0200_2016APV": 0.0954, +"mfv_neu_tau010000um_M0200_2016APV": 0.1729, +"mfv_neu_tau030000um_M0200_2016APV": 0.1745, +"mfv_neu_tau000100um_M0300_2016APV": 0.0375, +"mfv_neu_tau000300um_M0300_2016APV": 0.0440, +"mfv_neu_tau001000um_M0300_2016APV": 0.1003, +"mfv_neu_tau010000um_M0300_2016APV": 0.1362, +"mfv_neu_tau030000um_M0300_2016APV": 0.1551, +"mfv_neu_tau000100um_M0400_2016APV": 0.0203, +"mfv_neu_tau000300um_M0400_2016APV": 0.0298, +"mfv_neu_tau001000um_M0400_2016APV": 0.0585, +"mfv_neu_tau010000um_M0400_2016APV": 0.1022, +"mfv_neu_tau030000um_M0400_2016APV": 0.0991, +"mfv_neu_tau000100um_M0600_2016APV": 0.0213, +"mfv_neu_tau000300um_M0600_2016APV": 0.0222, +"mfv_neu_tau001000um_M0600_2016APV": 0.0382, +"mfv_neu_tau010000um_M0600_2016APV": 0.0684, +"mfv_neu_tau030000um_M0600_2016APV": 0.0537, +"mfv_neu_tau000100um_M0800_2016APV": 0.0240, +"mfv_neu_tau000300um_M0800_2016APV": 0.0216, +"mfv_neu_tau001000um_M0800_2016APV": 0.0297, +"mfv_neu_tau010000um_M0800_2016APV": 0.0597, +"mfv_neu_tau030000um_M0800_2016APV": 0.0456, +"mfv_neu_tau000100um_M1200_2016APV": 0.0214, +"mfv_neu_tau000300um_M1200_2016APV": 0.0211, +"mfv_neu_tau001000um_M1200_2016APV": 0.0268, +"mfv_neu_tau010000um_M1200_2016APV": 0.0467, +"mfv_neu_tau000100um_M1600_2016APV": 0.0200, +"mfv_neu_tau000300um_M1600_2016APV": 0.0214, +"mfv_neu_tau001000um_M1600_2016APV": 0.0262, +"mfv_neu_tau010000um_M1600_2016APV": 0.0476, +"mfv_neu_tau030000um_M1600_2016APV": 0.0355, +"mfv_neu_tau001000um_M3000_2016APV": 0.0280, +"mfv_neu_tau010000um_M3000_2016APV": 0.0703, +"mfv_neu_tau030000um_M3000_2016APV": 0.0394, +"mfv_stopdbardbar_tau000100um_M0200_2016APV": 0.0200, +"mfv_stopdbardbar_tau000300um_M0200_2016APV": 0.0336, +"mfv_stopdbardbar_tau001000um_M0200_2016APV": 0.0757, +"mfv_stopdbardbar_tau010000um_M0200_2016APV": 0.1448, +"mfv_stopdbardbar_tau030000um_M0200_2016APV": 0.1591, +"mfv_stopdbardbar_tau000100um_M0300_2016APV": 0.0202, +"mfv_stopdbardbar_tau000300um_M0300_2016APV": 0.0281, +"mfv_stopdbardbar_tau001000um_M0300_2016APV": 0.0686, +"mfv_stopdbardbar_tau010000um_M0300_2016APV": 0.1328, +"mfv_stopdbardbar_tau030000um_M0300_2016APV": 0.1300, +"mfv_stopdbardbar_tau000100um_M0400_2016APV": 0.0216, +"mfv_stopdbardbar_tau000300um_M0400_2016APV": 0.0259, +"mfv_stopdbardbar_tau010000um_M0400_2016APV": 0.1226, +"mfv_stopdbardbar_tau030000um_M0400_2016APV": 0.1114, +"mfv_stopdbardbar_tau000100um_M0600_2016APV": 0.0226, +"mfv_stopdbardbar_tau000300um_M0600_2016APV": 0.0240, +"mfv_stopdbardbar_tau001000um_M0600_2016APV": 0.0515, +"mfv_stopdbardbar_tau010000um_M0600_2016APV": 0.1152, +"mfv_stopdbardbar_tau030000um_M0600_2016APV": 0.0985, +"mfv_stopdbardbar_tau000100um_M0800_2016APV": 0.0218, +"mfv_stopdbardbar_tau000300um_M0800_2016APV": 0.0227, +"mfv_stopdbardbar_tau001000um_M0800_2016APV": 0.0436, +"mfv_stopdbardbar_tau010000um_M0800_2016APV": 0.1019, +"mfv_stopdbardbar_tau030000um_M0800_2016APV": 0.0813, +"mfv_stopdbardbar_tau000100um_M1200_2016APV": 0.0311, +"mfv_stopdbardbar_tau000300um_M1200_2016APV": 0.0224, +"mfv_stopdbardbar_tau001000um_M1200_2016APV": 0.0382, +"mfv_stopdbardbar_tau010000um_M1200_2016APV": 0.0946, +"mfv_stopdbardbar_tau030000um_M1200_2016APV": 0.0852, +"mfv_stopdbardbar_tau000100um_M1600_2016APV": 0.0763, +"mfv_stopdbardbar_tau000300um_M1600_2016APV": 0.0380, +"mfv_stopdbardbar_tau001000um_M1600_2016APV": 0.0415, +"mfv_stopdbardbar_tau010000um_M1600_2016APV": 0.1119, +"mfv_stopdbardbar_tau030000um_M1600_2016APV": 0.0846, +"mfv_stopdbardbar_tau000300um_M3000_2016APV": 0.1121, +"mfv_stopdbardbar_tau001000um_M3000_2016APV": 0.0750, +"mfv_stopdbardbar_tau010000um_M3000_2016APV": 0.1507, +"mfv_stopdbardbar_tau030000um_M3000_2016APV": 0.0938, +"mfv_stopbbarbbar_tau000100um_M0200_2016APV": 0.0200, +"mfv_stopbbarbbar_tau000300um_M0200_2016APV": 0.0327, +"mfv_stopbbarbbar_tau001000um_M0200_2016APV": 0.0743, +"mfv_stopbbarbbar_tau010000um_M0200_2016APV": 0.1953, +"mfv_stopbbarbbar_tau030000um_M0200_2016APV": 0.1950, +"mfv_stopbbarbbar_tau000100um_M0300_2016APV": 0.0212, +"mfv_stopbbarbbar_tau000300um_M0300_2016APV": 0.0272, +"mfv_stopbbarbbar_tau001000um_M0300_2016APV": 0.0654, +"mfv_stopbbarbbar_tau010000um_M0300_2016APV": 0.1396, +"mfv_stopbbarbbar_tau030000um_M0300_2016APV": 0.1486, +"mfv_stopbbarbbar_tau000100um_M0400_2016APV": 0.0204, +"mfv_stopbbarbbar_tau000300um_M0400_2016APV": 0.0226, +"mfv_stopbbarbbar_tau001000um_M0400_2016APV": 0.0508, +"mfv_stopbbarbbar_tau010000um_M0400_2016APV": 0.1285, +"mfv_stopbbarbbar_tau030000um_M0400_2016APV": 0.1193, +"mfv_stopbbarbbar_tau000100um_M0600_2016APV": 0.0204, +"mfv_stopbbarbbar_tau000300um_M0600_2016APV": 0.0223, +"mfv_stopbbarbbar_tau001000um_M0600_2016APV": 0.0425, +"mfv_stopbbarbbar_tau010000um_M0600_2016APV": 0.1035, +"mfv_stopbbarbbar_tau030000um_M0600_2016APV": 0.0975, +"mfv_stopbbarbbar_tau000100um_M0800_2016APV": 0.0210, +"mfv_stopbbarbbar_tau000300um_M0800_2016APV": 0.0212, +"mfv_stopbbarbbar_tau001000um_M0800_2016APV": 0.0373, +"mfv_stopbbarbbar_tau010000um_M0800_2016APV": 0.0990, +"mfv_stopbbarbbar_tau030000um_M0800_2016APV": 0.0866, +"mfv_stopbbarbbar_tau000100um_M1200_2016APV": 0.0220, +"mfv_stopbbarbbar_tau000300um_M1200_2016APV": 0.0210, +"mfv_stopbbarbbar_tau001000um_M1200_2016APV": 0.0360, +"mfv_stopbbarbbar_tau010000um_M1200_2016APV": 0.0916, +"mfv_stopbbarbbar_tau030000um_M1200_2016APV": 0.0743, +"mfv_stopbbarbbar_tau000100um_M1600_2016APV": 0.0483, +"mfv_stopbbarbbar_tau000300um_M1600_2016APV": 0.0260, +"mfv_stopbbarbbar_tau001000um_M1600_2016APV": 0.0322, +"mfv_stopbbarbbar_tau010000um_M1600_2016APV": 0.0978, +"mfv_stopbbarbbar_tau030000um_M1600_2016APV": 0.0791, +"mfv_stopbbarbbar_tau001000um_M3000_2016APV": 0.0646, +"mfv_stopbbarbbar_tau010000um_M3000_2016APV": 0.1258, +"mfv_stopbbarbbar_tau030000um_M3000_2016APV": 0.0954, +} diff --git a/MFVNeutralino/test/ForLimits/uncerts_trigger_patch.py b/MFVNeutralino/test/ForLimits/uncerts_trigger_patch.py new file mode 100644 index 000000000..2a570079f --- /dev/null +++ b/MFVNeutralino/test/ForLimits/uncerts_trigger_patch.py @@ -0,0 +1,55 @@ +total_uncerts_patch = { + + # 2016 + "mfv_stopbbarbbar_tau000100um_M0200_2016": 0.0243, + "mfv_stopbbarbbar_tau000300um_M1200_2016": 0.0241, + "mfv_stopbbarbbar_tau000100um_M3000_2016": 0.1124, + # 2016APV + "mfv_stopbbarbbar_tau000100um_M3000_2016APV": 0.1200, + "mfv_stopbbarbbar_tau000300um_M3000_2016APV": 0.0646, + # 2017 + "mfv_stopbbarbbar_tau000100um_M1600_2017": 0.0215, + "mfv_stopbbarbbar_tau000100um_M3000_2017": 0.0407, + "mfv_stopbbarbbar_tau000300um_M3000_2017": 0.0390, + # 2018 + "mfv_stopbbarbbar_tau000100um_M3000_2018": 0.0894, + "mfv_stopbbarbbar_tau000300um_M3000_2018": 0.0409, + + + # 2016 + "mfv_stopdbardbar_tau000100um_M3000_2016": 0.2311, + "mfv_stopdbardbar_tau010000um_M3000_2016": 0.0617, + # 2016APV + "mfv_stopdbardbar_tau001000um_M0400_2016APV": 0.1226, + "mfv_stopdbardbar_tau000100um_M3000_2016APV": 0.2251, + # 2017 + "mfv_stopdbardbar_tau001000um_M0600_2017": 0.0345, + "mfv_stopdbardbar_tau000100um_M1600_2017": 0.0266, + "mfv_stopdbardbar_tau000300um_M1600_2017": 0.0248, + "mfv_stopdbardbar_tau000100um_M3000_2017": 0.0520, + "mfv_stopdbardbar_tau000300um_M3000_2017": 0.0485, + # 2018 + "mfv_stopdbardbar_tau030000um_M0400_2018": 0.0497, + "mfv_stopdbardbar_tau000100um_M3000_2018": 0.0912, + "mfv_stopdbardbar_tau000300um_M3000_2018": 0.0538, + + + # 2016 + "mfv_neu_tau000100um_M3000_2016": 0.0294, + # 2016APV + "mfv_neu_tau030000um_M1200_2016APV": 0.0467, + "mfv_neu_tau000100um_M3000_2016APV": 0.0280, + "mfv_neu_tau000300um_M3000_2016APV": 0.0280, + # 2017 + "mfv_neu_tau001000um_M0200_2017": 0.0519, + "mfv_neu_tau000300um_M0400_2017": 0.0336, + "mfv_neu_tau000100um_M0800_2017": 0.0220, + "mfv_neu_tau030000um_M1200_2017": 0.0068, + "mfv_neu_tau000100um_M3000_2017": 0.0221, + "mfv_neu_tau000300um_M3000_2017": 0.0217, + # 2018 + "mfv_neu_tau001000um_M0200_2018": 0.0556, + "mfv_neu_tau000300um_M0600_2018": 0.0248, + "mfv_neu_tau000100um_M3000_2018": 0.0490, + "mfv_neu_tau010000um_M3000_2018": 0.0207, +} diff --git a/MFVNeutralino/test/ForLimits/uncerts_trkmvr.py b/MFVNeutralino/test/ForLimits/uncerts_trkmvr.py new file mode 100644 index 000000000..e023897f8 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/uncerts_trkmvr.py @@ -0,0 +1,120 @@ +from __future__ import absolute_import +import numpy as np + +""" +Need transposing +""" + + +#from __future__ import absolute_import +TM_Tables = { + + "VH" : { #FIXME, what's the name + + "20161-2" : np.array([[100, 100, 100, 100, 100, 100], + [100, 60.34, 29.14, 23.44, 19.38, 22.58], + [100, 40.24, 25.34, 14.88, 17.24, 17.68]]), + + "2017-8" : np.array([[100, 100, 79.78, 66.28, 42.22, 43.84], + [100, 29.08, 22.38, 21.7, 23.72, 27.82], + [100, 35.14, 22.64, 19.94, 21.34, 22.18]]), + + "x_vals" : [0.1, 0.3, 1., 3., 10., 30.], + "x_unit" : "mm", + + "y_vals" : [15, 40, 55], + "y_unit" : "GeV", + + }, + + + + + + "ggHToSSTodddd" : { + + "20161-2" : np.array([[100, 100, 100, 100], + [100, 100, 100, 100], + [100, 64.52, 53.32, 53.32]]), + + "2017-8" : np.array([[100, 100, 100, 100], + [100, 41.52, 34.24, 34.24], + [100, 25.16, 23.9, 23.9]]), + + "x_vals" : [0.1, 1., 10., 100.], + "x_unit" : "mm", + + "y_vals" : [15, 40, 55], + "y_unit" : "GeV", + + }, + + + + + + "mfv_stopdbardbar" : { + + "20161-2" : np.array([[27.56, 10.7, 7.62, 7.84, 12.12], + [77.28, 31.18, 10.38, 5.02, 4.82], + [85.06, 40.1, 12, 3.56, 3.38]]), + + "2017-8" : np.array([[28.74, 9.48, 5.16, 7.5, 9.68], + [59.04, 19.84, 4.74, 2.66, 2.92], + [55.9, 22.14, 4.12, 1.62, 1.82]]), + + "x_vals" : [0.1, 0.3, 1., 10., 30.], + "x_unit" : "mm", + + "y_vals" : [200, 400, 800], + "y_unit" : "GeV", + + }, + + + + + + "mfv_stopbbarbbar" : { + + "20161-2" : np.array([[65.86, 52.24, 43.4, 53.18, 39.26], + [100, 22.18, 23.62, 32.76, 35.82], + [100, 31.24, 13.74, 17.58, 16.84]]), + + "2017-8" : np.array([[95.16, 38.22, 31.38, 29.7, 31.26], + [90.3, 24.58, 13.42, 10.36, 9.28], + [76.88, 29.38, 5.5, 3.88, 5.02]]), + + "x_vals" : [0.1, 0.3, 1., 10., 30.], + "x_unit" : "mm", + + "y_vals" : [200, 400, 800], + "y_unit" : "GeV", + + }, + + + + + + "mfv_neu" : { + + "20161-2" : np.array([[45.08, 21.98, 17.12, 10.98, 17.68], + [100, 28.6, 24.0, 11.0, 18.0], + [100, 37.76, 20.0, 11.0, 18.0]]), + + "2017-8" : np.array([[55.34, 29.38, 16.76, 7.28, 7.16], + [72.88, 39.42, 24, 8, 8], + [89.64, 49.48, 20, 6, 6]]), + + "x_vals" : [0.1, 0.3, 1., 10., 30.], + "x_unit" : "mm", + + "y_vals" : [200, 400, 800], + "y_unit" : "GeV", + + }, + +} + + diff --git a/MFVNeutralino/test/ForLimits/uncerts_trkrec.py b/MFVNeutralino/test/ForLimits/uncerts_trkrec.py new file mode 100644 index 000000000..bae78651f --- /dev/null +++ b/MFVNeutralino/test/ForLimits/uncerts_trkrec.py @@ -0,0 +1,224 @@ +trkdisp_central = { + 'VH_tau100um_M15_20161': [1, 1, 1], + 'VH_tau100um_M40_20161': [1, 1, 1], + 'VH_tau100um_M55_20161': [1, 1, 1], + 'VH_tau300um_M15_20161': [0.9872, 1, 1], + 'VH_tau300um_M40_20161': [0.9872, 1, 1], + 'VH_tau300um_M55_20161': [0.9872, 1, 1], + 'VH_tau1mm_M15_20161': [0.925396, 0.89459, 0.743117], + 'VH_tau1mm_M40_20161': [0.925396, 0.89459, 0.743117], + 'VH_tau1mm_M55_20161': [0.925396, 0.89459, 0.743117], + 'VH_tau3mm_M15_20161': [0.902718, 0.795838, 0.714358], + 'VH_tau3mm_M40_20161': [0.902718, 0.795838, 0.714358], + 'VH_tau3mm_M55_20161': [0.902718, 0.795838, 0.714358], + 'VH_tau10mm_M15_20161': [0.895352, 0.739882, 0.684449], + 'VH_tau10mm_M40_20161': [0.895352, 0.739882, 0.684449], + 'VH_tau10mm_M55_20161': [0.895352, 0.739882, 0.684449], + 'VH_tau30mm_M15_20161': [0.889738, 0.721038, 0.670345], + 'VH_tau30mm_M40_20161': [0.889738, 0.721038, 0.670345], + 'VH_tau30mm_M55_20161': [0.889738, 0.721038, 0.670345], + 'VH_tau100um_M15_20162': [1, 1, 1], + 'VH_tau100um_M40_20162': [1, 1, 1], + 'VH_tau100um_M55_20162': [1, 1, 1], + 'VH_tau300um_M15_20162': [0.949081, 1, 1], + 'VH_tau300um_M40_20162': [0.949081, 1, 1], + 'VH_tau300um_M55_20162': [0.949081, 1, 1], + 'VH_tau1mm_M15_20162': [0.924969, 0.844629, 0.937082], + 'VH_tau1mm_M40_20162': [0.924969, 0.844629, 0.937082], + 'VH_tau1mm_M55_20162': [0.924969, 0.844629, 0.937082], + 'VH_tau3mm_M15_20162': [0.897707, 0.773077, 0.782656], + 'VH_tau3mm_M40_20162': [0.897707, 0.773077, 0.782656], + 'VH_tau3mm_M55_20162': [0.897707, 0.773077, 0.782656], + 'VH_tau10mm_M15_20162': [0.828945, 0.739645, 0.690249], + 'VH_tau10mm_M40_20162': [0.828945, 0.739645, 0.690249], + 'VH_tau10mm_M55_20162': [0.828945, 0.739645, 0.690249], + 'VH_tau30mm_M15_20162': [0.779882, 0.699189, 0.684918], + 'VH_tau30mm_M40_20162': [0.779882, 0.699189, 0.684918], + 'VH_tau30mm_M55_20162': [0.779882, 0.699189, 0.684918], + 'VH_tau100um_M15_2017': [0.895221, 1, 1], + 'VH_tau100um_M40_2017': [0.895221, 1, 1], + 'VH_tau100um_M55_2017': [0.895221, 1, 1], + 'VH_tau300um_M15_2017': [0.951566, 1, 1], + 'VH_tau300um_M40_2017': [0.951566, 1, 1], + 'VH_tau300um_M55_2017': [0.951566, 1, 1], + 'VH_tau1mm_M15_2017': [0.936599, 0.910362, 0.882833], + 'VH_tau1mm_M40_2017': [0.936599, 0.910362, 0.882833], + 'VH_tau1mm_M55_2017': [0.936599, 0.910362, 0.882833], + 'VH_tau3mm_M15_2017': [0.918775, 0.830554, 0.802288], + 'VH_tau3mm_M40_2017': [0.918775, 0.830554, 0.802288], + 'VH_tau3mm_M55_2017': [0.918775, 0.830554, 0.802288], + 'VH_tau10mm_M15_2017': [0.89829, 0.786591, 0.730466], + 'VH_tau10mm_M40_2017': [0.89829, 0.786591, 0.730466], + 'VH_tau10mm_M55_2017': [0.89829, 0.786591, 0.730466], + 'VH_tau30mm_M15_2017': [0.852676, 0.76553, 0.750921], + 'VH_tau30mm_M40_2017': [0.852676, 0.76553, 0.750921], + 'VH_tau30mm_M55_2017': [0.852676, 0.76553, 0.750921], + 'VH_tau100um_M15_2018': [0.988414, 1, 1], + 'VH_tau100um_M40_2018': [0.988414, 1, 1], + 'VH_tau100um_M55_2018': [0.988414, 1, 1], + 'VH_tau300um_M15_2018': [0.952073, 0.999818, 1], + 'VH_tau300um_M40_2018': [0.952073, 0.999818, 1], + 'VH_tau300um_M55_2018': [0.952073, 0.999818, 1], + 'VH_tau1mm_M15_2018': [0.941214, 0.887036, 0.663632], + 'VH_tau1mm_M40_2018': [0.941214, 0.887036, 0.663632], + 'VH_tau1mm_M55_2018': [0.941214, 0.887036, 0.663632], + 'VH_tau3mm_M15_2018': [0.907038, 0.847061, 0.809965], + 'VH_tau3mm_M40_2018': [0.907038, 0.847061, 0.809965], + 'VH_tau3mm_M55_2018': [0.907038, 0.847061, 0.809965], + 'VH_tau10mm_M15_2018': [0.880467, 0.803971, 0.745638], + 'VH_tau10mm_M40_2018': [0.880467, 0.803971, 0.745638], + 'VH_tau10mm_M55_2018': [0.880467, 0.803971, 0.745638], + 'VH_tau30mm_M15_2018': [0.860119, 0.818202, 0.721382], + 'VH_tau30mm_M40_2018': [0.860119, 0.818202, 0.721382], + 'VH_tau30mm_M55_2018': [0.860119, 0.818202, 0.721382], +} + +trkdisp_up = { + 'VH_tau100um_M15_20161': [1, 1, 1], + 'VH_tau100um_M40_20161': [1, 1, 1], + 'VH_tau100um_M55_20161': [1, 1, 1], + 'VH_tau300um_M15_20161': [1, 1, 1], + 'VH_tau300um_M40_20161': [1, 1, 1], + 'VH_tau300um_M55_20161': [1, 1, 1], + 'VH_tau1mm_M15_20161': [0.994297, 0.976545, 1], + 'VH_tau1mm_M40_20161': [0.994297, 0.976545, 1], + 'VH_tau1mm_M55_20161': [0.994297, 0.976545, 1], + 'VH_tau3mm_M15_20161': [0.976509, 0.953819, 0.943271], + 'VH_tau3mm_M40_20161': [0.976509, 0.953819, 0.943271], + 'VH_tau3mm_M55_20161': [0.976509, 0.953819, 0.943271], + 'VH_tau10mm_M15_20161': [0.966141, 0.934601, 0.952049], + 'VH_tau10mm_M40_20161': [0.966141, 0.934601, 0.952049], + 'VH_tau10mm_M55_20161': [0.966141, 0.934601, 0.952049], + 'VH_tau30mm_M15_20161': [0.935294, 0.962106, 0.952075], + 'VH_tau30mm_M40_20161': [0.935294, 0.962106, 0.952075], + 'VH_tau30mm_M55_20161': [0.935294, 0.962106, 0.952075], + 'VH_tau100um_M15_20162': [1, 1, 1], + 'VH_tau100um_M40_20162': [1, 1, 1], + 'VH_tau100um_M55_20162': [1, 1, 1], + 'VH_tau300um_M15_20162': [1, 1, 1], + 'VH_tau300um_M40_20162': [1, 1, 1], + 'VH_tau300um_M55_20162': [1, 1, 1], + 'VH_tau1mm_M15_20162': [0.980562, 0.962113, 1], + 'VH_tau1mm_M40_20162': [0.980562, 0.962113, 1], + 'VH_tau1mm_M55_20162': [0.980562, 0.962113, 1], + 'VH_tau3mm_M15_20162': [0.985976, 0.955266, 0.979416], + 'VH_tau3mm_M40_20162': [0.985976, 0.955266, 0.979416], + 'VH_tau3mm_M55_20162': [0.985976, 0.955266, 0.979416], + 'VH_tau10mm_M15_20162': [0.985602, 0.975556, 0.946397], + 'VH_tau10mm_M40_20162': [0.985602, 0.975556, 0.946397], + 'VH_tau10mm_M55_20162': [0.985602, 0.975556, 0.946397], + 'VH_tau30mm_M15_20162': [0.982434, 0.950015, 0.981138], + 'VH_tau30mm_M40_20162': [0.982434, 0.950015, 0.981138], + 'VH_tau30mm_M55_20162': [0.982434, 0.950015, 0.981138], + 'VH_tau100um_M15_2017': [1.00037, 1, 1], + 'VH_tau100um_M40_2017': [1.00037, 1, 1], + 'VH_tau100um_M55_2017': [1.00037, 1, 1], + 'VH_tau300um_M15_2017': [1.00002, 1, 1], + 'VH_tau300um_M40_2017': [1.00002, 1, 1], + 'VH_tau300um_M55_2017': [1.00002, 1, 1], + 'VH_tau1mm_M15_2017': [0.998376, 0.998634, 0.986045], + 'VH_tau1mm_M40_2017': [0.998376, 0.998634, 0.986045], + 'VH_tau1mm_M55_2017': [0.998376, 0.998634, 0.986045], + 'VH_tau3mm_M15_2017': [0.993497, 0.972243, 0.975201], + 'VH_tau3mm_M40_2017': [0.993497, 0.972243, 0.975201], + 'VH_tau3mm_M55_2017': [0.993497, 0.972243, 0.975201], + 'VH_tau10mm_M15_2017': [0.987749, 0.981613, 0.973105], + 'VH_tau10mm_M40_2017': [0.987749, 0.981613, 0.973105], + 'VH_tau10mm_M55_2017': [0.987749, 0.981613, 0.973105], + 'VH_tau30mm_M15_2017': [0.978787, 0.953755, 0.95511], + 'VH_tau30mm_M40_2017': [0.978787, 0.953755, 0.95511], + 'VH_tau30mm_M55_2017': [0.978787, 0.953755, 0.95511], + 'VH_tau100um_M15_2018': [1, 1, 1], + 'VH_tau100um_M40_2018': [1, 1, 1], + 'VH_tau100um_M55_2018': [1, 1, 1], + 'VH_tau300um_M15_2018': [0.997504, 1, 1], + 'VH_tau300um_M40_2018': [0.997504, 1, 1], + 'VH_tau300um_M55_2018': [0.997504, 1, 1], + 'VH_tau1mm_M15_2018': [0.996056, 0.993887, 0.931636], + 'VH_tau1mm_M40_2018': [0.996056, 0.993887, 0.931636], + 'VH_tau1mm_M55_2018': [0.996056, 0.993887, 0.931636], + 'VH_tau3mm_M15_2018': [0.992802, 0.979138, 0.972268], + 'VH_tau3mm_M40_2018': [0.992802, 0.979138, 0.972268], + 'VH_tau3mm_M55_2018': [0.992802, 0.979138, 0.972268], + 'VH_tau10mm_M15_2018': [0.98697, 0.976131, 0.971271], + 'VH_tau10mm_M40_2018': [0.98697, 0.976131, 0.971271], + 'VH_tau10mm_M55_2018': [0.98697, 0.976131, 0.971271], + 'VH_tau30mm_M15_2018': [0.991683, 0.963786, 0.947353], + 'VH_tau30mm_M40_2018': [0.991683, 0.963786, 0.947353], + 'VH_tau30mm_M55_2018': [0.991683, 0.963786, 0.947353], +} + +trkdisp_dn = { + 'VH_tau100um_M15_20161': [1, 1, 1], + 'VH_tau100um_M40_20161': [1, 1, 1], + 'VH_tau100um_M55_20161': [1, 1, 1], + 'VH_tau300um_M15_20161': [1, 1, 1], + 'VH_tau300um_M40_20161': [1, 1, 1], + 'VH_tau300um_M55_20161': [1, 1, 1], + 'VH_tau1mm_M15_20161': [1.0135, 1.00603, 1.06455], + 'VH_tau1mm_M40_20161': [1.0135, 1.00603, 1.06455], + 'VH_tau1mm_M55_20161': [1.0135, 1.00603, 1.06455], + 'VH_tau3mm_M15_20161': [1.00909, 1.02264, 1.07135], + 'VH_tau3mm_M40_20161': [1.00909, 1.02264, 1.07135], + 'VH_tau3mm_M55_20161': [1.00909, 1.02264, 1.07135], + 'VH_tau10mm_M15_20161': [1.01828, 1.04599, 1.0434], + 'VH_tau10mm_M40_20161': [1.01828, 1.04599, 1.0434], + 'VH_tau10mm_M55_20161': [1.01828, 1.04599, 1.0434], + 'VH_tau30mm_M15_20161': [1, 1.06634, 1.09033], + 'VH_tau30mm_M40_20161': [1, 1.06634, 1.09033], + 'VH_tau30mm_M55_20161': [1, 1.06634, 1.09033], + 'VH_tau100um_M15_20162': [1, 1, 1], + 'VH_tau100um_M40_20162': [1, 1, 1], + 'VH_tau100um_M55_20162': [1, 1, 1], + 'VH_tau300um_M15_20162': [1, 1, 1], + 'VH_tau300um_M40_20162': [1, 1, 1], + 'VH_tau300um_M55_20162': [1, 1, 1], + 'VH_tau1mm_M15_20162': [1.00164, 1.02913, 1], + 'VH_tau1mm_M40_20162': [1.00164, 1.02913, 1], + 'VH_tau1mm_M55_20162': [1.00164, 1.02913, 1], + 'VH_tau3mm_M15_20162': [1.01293, 1.03407, 1.06277], + 'VH_tau3mm_M40_20162': [1.01293, 1.03407, 1.06277], + 'VH_tau3mm_M55_20162': [1.01293, 1.03407, 1.06277], + 'VH_tau10mm_M15_20162': [1.02724, 1.05553, 1.04562], + 'VH_tau10mm_M40_20162': [1.02724, 1.05553, 1.04562], + 'VH_tau10mm_M55_20162': [1.02724, 1.05553, 1.04562], + 'VH_tau30mm_M15_20162': [1.11323, 1.08077, 1.10501], + 'VH_tau30mm_M40_20162': [1.11323, 1.08077, 1.10501], + 'VH_tau30mm_M55_20162': [1.11323, 1.08077, 1.10501], + 'VH_tau100um_M15_2017': [1, 1, 1], + 'VH_tau100um_M40_2017': [1, 1, 1], + 'VH_tau100um_M55_2017': [1, 1, 1], + 'VH_tau300um_M15_2017': [0.999904, 1, 1], + 'VH_tau300um_M40_2017': [0.999904, 1, 1], + 'VH_tau300um_M55_2017': [0.999904, 1, 1], + 'VH_tau1mm_M15_2017': [1.00431, 1.01411, 1.00011], + 'VH_tau1mm_M40_2017': [1.00431, 1.01411, 1.00011], + 'VH_tau1mm_M55_2017': [1.00431, 1.01411, 1.00011], + 'VH_tau3mm_M15_2017': [1.00322, 1.0183, 1.01686], + 'VH_tau3mm_M40_2017': [1.00322, 1.0183, 1.01686], + 'VH_tau3mm_M55_2017': [1.00322, 1.0183, 1.01686], + 'VH_tau10mm_M15_2017': [1.0105, 1.01902, 1.02312], + 'VH_tau10mm_M40_2017': [1.0105, 1.01902, 1.02312], + 'VH_tau10mm_M55_2017': [1.0105, 1.01902, 1.02312], + 'VH_tau30mm_M15_2017': [1.01534, 1.02821, 1.02704], + 'VH_tau30mm_M40_2017': [1.01534, 1.02821, 1.02704], + 'VH_tau30mm_M55_2017': [1.01534, 1.02821, 1.02704], + 'VH_tau100um_M15_2018': [1.0002, 1, 1], + 'VH_tau100um_M40_2018': [1.0002, 1, 1], + 'VH_tau100um_M55_2018': [1.0002, 1, 1], + 'VH_tau300um_M15_2018': [0.999356, 1.00261, 1], + 'VH_tau300um_M40_2018': [0.999356, 1.00261, 1], + 'VH_tau300um_M55_2018': [0.999356, 1.00261, 1], + 'VH_tau1mm_M15_2018': [1.00103, 1.00259, 1.01406], + 'VH_tau1mm_M40_2018': [1.00103, 1.00259, 1.01406], + 'VH_tau1mm_M55_2018': [1.00103, 1.00259, 1.01406], + 'VH_tau3mm_M15_2018': [1.00428, 1.02316, 1.02097], + 'VH_tau3mm_M40_2018': [1.00428, 1.02316, 1.02097], + 'VH_tau3mm_M55_2018': [1.00428, 1.02316, 1.02097], + 'VH_tau10mm_M15_2018': [1.0162, 1.04046, 1.01947], + 'VH_tau10mm_M40_2018': [1.0162, 1.04046, 1.01947], + 'VH_tau10mm_M55_2018': [1.0162, 1.04046, 1.01947], + 'VH_tau30mm_M15_2018': [1.00464, 1.01221, 1.01623], + 'VH_tau30mm_M40_2018': [1.00464, 1.01221, 1.01623], + 'VH_tau30mm_M55_2018': [1.00464, 1.01221, 1.01623], +} diff --git a/MFVNeutralino/test/MiniTree/studyNewTriggers.cc b/MFVNeutralino/test/MiniTree/studyNewTriggers.cc new file mode 100644 index 000000000..3d5e5e0c2 --- /dev/null +++ b/MFVNeutralino/test/MiniTree/studyNewTriggers.cc @@ -0,0 +1,293 @@ +#include +#include "TCanvas.h" +#include "TFile.h" +#include "TH2.h" +#include "TTree.h" +#include "TVector2.h" +#include "JMTucker/Tools/interface/Utilities.h" +#include "JMTucker/MFVNeutralino/interface/MiniNtuple.h" +#include "JMTucker/MFVNeutralinoFormats/interface/Event.h" + +const bool prints = false; + +TH1D* h_MET = 0; +TH1D* h_nvtx = 0; +TH1D* h_dbv = 0; + +// FIXME probably put all of these into a map +TH1D* h_dbv_all = 0; +TH1D* h_dbv_all_coarse = 0; +TH1D* h_dbv_HT = 0; +TH1D* h_dbv_HT_coarse = 0; +TH1D* h_dbv_Bjet = 0; +TH1D* h_dbv_Bjet_coarse = 0; +TH1D* h_dbv_DisplacedDijet = 0; +TH1D* h_dbv_DisplacedDijet_coarse = 0; +TH1D* h_dbv_MET = 0; +TH1D* h_dbv_MET_coarse = 0; +TH1D* h_dbv_passHT_failBjet = 0; +TH1D* h_dbv_passHT_failBjet_coarse = 0; +TH1D* h_dbv_failHT_passBjet = 0; +TH1D* h_dbv_failHT_passBjet_coarse = 0; +TH1D* h_dbv_passDisplacedDijet_failBjet = 0; +TH1D* h_dbv_passDisplacedDijet_failBjet_coarse = 0; +TH1D* h_dbv_failDisplacedDijet_passBjet = 0; +TH1D* h_dbv_failDisplacedDijet_passBjet_coarse = 0; + +TH1D* h_dvv_all = 0; +TH1D* h_dvv_all_coarse = 0; +TH1D* h_dvv_HT = 0; +TH1D* h_dvv_HT_coarse = 0; +TH1D* h_dvv_Bjet = 0; +TH1D* h_dvv_Bjet_coarse = 0; +TH1D* h_dvv_DisplacedDijet = 0; +TH1D* h_dvv_DisplacedDijet_coarse = 0; +TH1D* h_dvv_MET = 0; +TH1D* h_dvv_MET_coarse = 0; +TH1D* h_dvv_passHT_failBjet = 0; +TH1D* h_dvv_passHT_failBjet_coarse = 0; +TH1D* h_dvv_failHT_passBjet = 0; +TH1D* h_dvv_failHT_passBjet_coarse = 0; +TH1D* h_dvv_passDisplacedDijet_failBjet = 0; +TH1D* h_dvv_passDisplacedDijet_failBjet_coarse = 0; +TH1D* h_dvv_failDisplacedDijet_passBjet = 0; +TH1D* h_dvv_failDisplacedDijet_passBjet_coarse = 0; + +bool pass_hlt(const mfv::MiniNtuple& nt, size_t i){ + return bool((nt.pass_hlt >> i) & 1); +} + +// analyze method is a callback passed to MiniNtuple::loop from main that is called once per tree entry +bool analyze(long long j, long long je, const mfv::MiniNtuple& nt) { + if (prints) std::cout << "Entry " << j << "\n"; + + bool passesHTTrigger = nt.satisfiesTriggerAndOffline(mfv::b_HLT_PFHT1050); + + // pt requirements: go 40 GeV above threshold based on https://twiki.cern.ch/twiki/bin/view/CMSPublic/HLTplots2018DataJets + // HT requirements: go 150 GeV above threshold based on what we've done with the HT1050 trigger + // + // should think about whether we can be more aggressive with the offline HT threshold + // e.g. from https://twiki.cern.ch/twiki/pub/CMSPublic/HighLevelTriggerRunIIResults/SUSY2015_trig-Ele15_HT350__var-HT.png + // it looks like the HT350 leg is 95% efficient already at ~400 GeV + bool passesBjetTrigger = nt.satisfiesTriggerAndOffline(mfv::b_HLT_DoublePFJets100MaxDeta1p6_DoubleCaloBTagCSV_p33) || nt.satisfiesTriggerAndOffline(mfv::b_HLT_PFHT300PT30_QuadPFJet_75_60_45_40_TriplePFBTagCSV_3p0); + + + bool passesDisplacedDijetTrigger = nt.satisfiesTriggerAndOffline(mfv::b_HLT_HT430_DisplacedDijet40_DisplacedTrack) || nt.satisfiesTriggerAndOffline(mfv::b_HLT_HT650_DisplacedDijet60_Inclusive); + + bool passesMETTrigger = pass_hlt(nt, mfv::b_HLT_PFMETNoMu120_PFMHTNoMu120_IDTight); // 25-01-21_edit + + double w = nt.weight; // modify as needed before filling hists + + // minitree is stupid and doesn't store past the first two vertices + // can tighten cuts, but you won't ever be able to pull out the vertices past 2 in 3-vertex events + // on background this should be negliglble, but this attempts to handle it as best as we can at this point + + //Fill MET + h_MET->Fill(nt.met,w); + + std::vector dbvs; + const int ivtxe = std::min(int(nt.nvtx), 2); + + for (int ivtx = 0; ivtx < ivtxe; ++ivtx) { + int ntracks = 0; + bool genmatch = false; + double dbv = 0; + + if (ivtx == 0) { + ntracks = nt.ntk0; + genmatch = nt.genmatch0; + dbv = hypot(nt.x0, nt.y0); + } + else { + ntracks = nt.ntk1; + genmatch = nt.genmatch1; + dbv = hypot(nt.x1, nt.y1); + } + + if (dbv > 0.01) dbvs.push_back(dbv); + } + + int nvtx = dbvs.size(); + if (nt.nvtx > 2) // deal with the aforementioned stupidity + nvtx += int(nt.nvtx) - 2; + h_nvtx->Fill(nvtx, w); + + if (dbvs.size() == 1){ + h_dbv->Fill(dbvs[0], w); + + h_dbv_all->Fill(dbvs[0], w); + h_dbv_all_coarse->Fill(dbvs[0], w); + + // HT trigger + if(passesHTTrigger){ + h_dbv_HT->Fill(dbvs[0], w); + h_dbv_HT_coarse->Fill(dbvs[0], w); + } + // Bjet trigger + if(passesBjetTrigger){ + h_dbv_Bjet->Fill(dbvs[0], w); + h_dbv_Bjet_coarse->Fill(dbvs[0], w); + } + // Displaced Dijet trigger + if(passesDisplacedDijetTrigger){ + h_dbv_DisplacedDijet->Fill(dbvs[0], w); + h_dbv_DisplacedDijet_coarse->Fill(dbvs[0], w); + } + // MET trigger + if(passesMETTrigger && nt.njets >= 2 ){ + h_dbv_MET->Fill(dbvs[0], w); + h_dbv_MET_coarse->Fill(dbvs[0], w); + } + // pass HT trigger fail Bjet trigger (to study the shape differences) + if(passesHTTrigger && !passesBjetTrigger && nt.njets >= 4 && nt.ht() > 1200){ + h_dbv_passHT_failBjet->Fill(dbvs[0], w); + h_dbv_passHT_failBjet_coarse->Fill(dbvs[0], w); + // pass DisplacedDijet trigger fail Bjet trigger (to study the shape differences) + if(passesDisplacedDijetTrigger && !passesBjetTrigger){ + h_dbv_passDisplacedDijet_failBjet->Fill(dbvs[0], w); + h_dbv_passDisplacedDijet_failBjet_coarse->Fill(dbvs[0], w); + } + // pass Bjet trigger fail DisplacedDijet trigger (to study the shape differences) + if(!passesDisplacedDijetTrigger && passesBjetTrigger){ + h_dbv_failDisplacedDijet_passBjet->Fill(dbvs[0], w); + h_dbv_failDisplacedDijet_passBjet_coarse->Fill(dbvs[0], w); + } + } + else if (dbvs.size() == 2){ + double dvv = hypot(nt.x0 - nt.x1, nt.y0 - nt.y1); + h_dvv_all->Fill(dvv, w); + h_dvv_all_coarse->Fill(dvv, w); + + // HT trigger + if(passesHTTrigger){ + h_dvv_HT->Fill(dvv, w); + h_dvv_HT_coarse->Fill(dvv, w); + } + // Bjet trigger + if(passesBjetTrigger){ + h_dvv_Bjet->Fill(dvv, w); + h_dvv_Bjet_coarse->Fill(dvv, w); + } + // Displaced Dijet trigger + if(passesDisplacedDijetTrigger){ + h_dvv_DisplacedDijet->Fill(dvv, w); + h_dvv_DisplacedDijet_coarse->Fill(dvv, w); + } + // MET trigger + if(passesMETTrigger && nt.njets >= 2 ){ + h_dvv_MET->Fill(dvv, w); + h_dvv_MET_coarse->Fill(dvv, w); + } + // pass HT trigger fail Bjet trigger (to study the shape differences) + if(passesHTTrigger && !passesBjetTrigger && nt.njets >= 4 && nt.ht() > 1200){ + h_dvv_passHT_failBjet->Fill(dvv, w); + h_dvv_passHT_failBjet_coarse->Fill(dvv, w); + // pass DisplacedDijet trigger fail Bjet trigger (to study the shape differences) + if(passesDisplacedDijetTrigger && !passesBjetTrigger){ + h_dvv_passDisplacedDijet_failBjet->Fill(dvv, w); + h_dvv_passDisplacedDijet_failBjet_coarse->Fill(dvv, w); + } + // pass Bjet trigger fail DisplacedDijet trigger (to study the shape differences) + if(!passesDisplacedDijetTrigger && passesBjetTrigger){ + h_dvv_failDisplacedDijet_passBjet->Fill(dvv, w); + h_dvv_failDisplacedDijet_passBjet_coarse->Fill(dvv, w); + } + } + + return true; +} + +int main(int argc, char** argv) { + if (argc < 4) { + fprintf(stderr, "usage: %s in_fn out_fn ntk\n", argv[0]); + return 1; + } + + // get args, can add any options you want + + const char* fn = argv[1]; + const char* out_fn = argv[2]; + const int ntk = atoi(argv[3]); + + if (!(ntk == 3 || ntk == 4 || ntk == 7 || ntk == 5)) { + fprintf(stderr, "ntk must be one of 3,4,7,5\n"); + return 1; + } + + TFile* in_f = TFile::Open(fn); + TFile out_f(out_fn, "recreate"); + + // setup root + TH1::SetDefaultSumw2(); + + // copy the normalization hist--if you don't read the whole tree by returning false in analyze above, you're screwed + out_f.mkdir("mfvWeight")->cd(); + in_f->Get("mfvWeight/h_sums")->Clone("h_sums"); + out_f.cd(); + + // also copy this hist if it is present (in an ntuple rather than a MiniTree) + if(in_f->GetDirectory("mcStat")){ + out_f.mkdir("mcStat")->cd(); + in_f->Get("mcStat/h_sums")->Clone("h_sums"); + out_f.cd(); + } + + // book hists + h_MET = new TH1D("h_MET", ";MET (GeV);Events",200,0,2000); + h_nvtx = new TH1D("h_nvtx", ";# of vertices;Events", 10, 0, 10); + h_dbv = new TH1D("h_dbv", ";d_{BV} (cm);Events/20 #mum", 1250, 0, 2.5); + + h_dbv_all = new TH1D("h_dbv_all", ";d_{BV} (cm);Events/1000 #mum", 50, 0, 5.); + h_dbv_all_coarse = new TH1D("h_dbv_all_coarse", ";d_{BV} (cm);Events/100 #mum", 40, 0, 0.4); + h_dbv_HT = new TH1D("h_dbv_HT", ";d_{BV} (cm);Events/1000 #mum", 50, 0, 5.); + h_dbv_HT_coarse = new TH1D("h_dbv_HT_coarse", ";d_{BV} (cm);Events/100 #mum", 40, 0, 0.4); + h_dbv_Bjet = new TH1D("h_dbv_Bjet", ";d_{BV} (cm);Events/1000 #mum", 50, 0, 5.); + h_dbv_Bjet_coarse = new TH1D("h_dbv_Bjet_coarse", ";d_{BV} (cm);Events/100 #mum", 40, 0, 0.4); + h_dbv_DisplacedDijet = new TH1D("h_dbv_DisplacedDijet", ";d_{BV} (cm);Events/1000 #mum", 50, 0, 5.); + h_dbv_DisplacedDijet_coarse = new TH1D("h_dbv_DisplacedDijet_coarse", ";d_{BV} (cm);Events/100 #mum", 40, 0, 0.4); + h_dbv_MET = new TH1D("h_dbv_MET", ";d_{BV} (cm);Events/1000 #mum", 50, 0, 5.); + h_dbv_MET_coarse = new TH1D("h_dbv_MET_coarse", ";d_{BV} (cm);Events/100 #mum", 40, 0, 0.4); + h_dbv_passHT_failBjet = new TH1D("h_dbv_passHT_failBjet", ";d_{BV} (cm);Events/1000 #mum", 50, 0, 5.); + h_dbv_passHT_failBjet_coarse = new TH1D("h_dbv_passHT_failBjet_coarse", ";d_{BV} (cm);Events/100 #mum", 40, 0, 0.4); + h_dbv_failHT_passBjet = new TH1D("h_dbv_failHT_passBjet", ";d_{BV} (cm);Events/1000 #mum", 50, 0, 5.); + h_dbv_failHT_passBjet_coarse = new TH1D("h_dbv_failHT_passBjet_coarse", ";d_{BV} (cm);Events/100 #mum", 40, 0, 0.4); + h_dbv_passDisplacedDijet_failBjet = new TH1D("h_dbv_passDisplacedDijet_failBjet", ";d_{BV} (cm);Events/1000 #mum", 50, 0, 5.); + h_dbv_passDisplacedDijet_failBjet_coarse = new TH1D("h_dbv_passDisplacedDijet_failBjet_coarse", ";d_{BV} (cm);Events/100 #mum", 40, 0, 0.4); + h_dbv_failDisplacedDijet_passBjet = new TH1D("h_dbv_failDisplacedDijet_passBjet", ";d_{BV} (cm);Events/1000 #mum", 50, 0, 5.); + h_dbv_failDisplacedDijet_passBjet_coarse = new TH1D("h_dbv_failDisplacedDijet_passBjet_coarse", ";d_{BV} (cm);Events/100 #mum", 40, 0, 0.4); + + h_dvv_all = new TH1D("h_dvv_all", ";d_{VV} (cm);Events/1000 #mum", 50, 0, 5.); + h_dvv_all_coarse = new TH1D("h_dvv_all_coarse", ";d_{VV} (cm);Events/100 #mum", 40, 0, 0.4); + h_dvv_HT = new TH1D("h_dvv_HT", ";d_{VV} (cm);Events/1000 #mum", 50, 0, 5.); + h_dvv_HT_coarse = new TH1D("h_dvv_HT_coarse", ";d_{VV} (cm);Events/100 #mum", 40, 0, 0.4); + h_dvv_Bjet = new TH1D("h_dvv_Bjet", ";d_{VV} (cm);Events/1000 #mum", 50, 0, 5.); + h_dvv_Bjet_coarse = new TH1D("h_dvv_Bjet_coarse", ";d_{VV} (cm);Events/100 #mum", 40, 0, 0.4); + h_dvv_DisplacedDijet = new TH1D("h_dvv_DisplacedDijet", ";d_{VV} (cm);Events/1000 #mum", 50, 0, 5.); + h_dvv_DisplacedDijet_coarse = new TH1D("h_dvv_DisplacedDijet_coarse", ";d_{VV} (cm);Events/100 #mum", 40, 0, 0.4); + h_dvv_MET = new TH1D("h_dvv_MET", ";d_{VV} (cm);Events/1000 #mum", 50, 0, 5.); + h_dvv_MET_coarse = new TH1D("h_dvv_MET_coarse", ";d_{VV} (cm);Events/100 #mum", 40, 0, 0.4); + h_dvv_passHT_failBjet = new TH1D("h_dvv_passHT_failBjet", ";d_{VV} (cm);Events/1000 #mum", 50, 0, 5.); + h_dvv_passHT_failBjet_coarse = new TH1D("h_dvv_passHT_failBjet_coarse", ";d_{VV} (cm);Events/100 #mum", 40, 0, 0.4); + h_dvv_failHT_passBjet = new TH1D("h_dvv_failHT_passBjet", ";d_{VV} (cm);Events/1000 #mum", 50, 0, 5.); + h_dvv_failHT_passBjet_coarse = new TH1D("h_dvv_failHT_passBjet_coarse", ";d_{VV} (cm);Events/100 #mum", 40, 0, 0.4); + h_dvv_passDisplacedDijet_failBjet = new TH1D("h_dvv_passDisplacedDijet_failBjet", ";d_{VV} (cm);Events/1000 #mum", 50, 0, 5.); + h_dvv_passDisplacedDijet_failBjet_coarse = new TH1D("h_dvv_passDisplacedDijet_failBjet_coarse", ";d_{VV} (cm);Events/100 #mum", 40, 0, 0.4); + h_dvv_failDisplacedDijet_passBjet = new TH1D("h_dvv_failDisplacedDijet_passBjet", ";d_{VV} (cm);Events/1000 #mum", 50, 0, 5.); + h_dvv_failDisplacedDijet_passBjet_coarse = new TH1D("h_dvv_failDisplacedDijet_passBjet_coarse", ";d_{VV} (cm);Events/100 #mum", 40, 0, 0.4); + + const char* tree_path = + ntk == 3 ? "mfvMiniTreeNtk3/t" : + ntk == 4 ? "mfvMiniTreeNtk4/t" : + ntk == 7 ? "mfvMiniTreeNtk3or4/t" : + ntk == 5 ? "mfvMiniTree/t" : 0; + if (prints) printf("fn %s out_fn %s ntk %i path %s\n", tree_path); + + mfv::loop(fn, tree_path, analyze); + + out_f.cd(); + + // can do post loop processing of hists here + + out_f.Write(); + out_f.Close(); +} diff --git a/MFVNeutralino/test/histosLepSF.py b/MFVNeutralino/test/histosLepSF.py new file mode 100644 index 000000000..a501c0220 --- /dev/null +++ b/MFVNeutralino/test/histosLepSF.py @@ -0,0 +1,85 @@ +from JMTucker.Tools.BasicAnalyzer_cfg import * + +is_mc = True + +from JMTucker.MFVNeutralino.NtupleCommon import ntuple_version_use as version, dataset + +input_files(process, '/uscms/home/pkotamni/work/CMSSW_10_6_27/src/JMTucker/MFVNeutralino/test/ntuple.root') +tfileservice(process, 'histos.root') +cmssw_from_argv(process) + +process.load('JMTucker.MFVNeutralino.VertexSelector_cfi') +process.load('JMTucker.MFVNeutralino.WeightProducer_cfi') +process.load('JMTucker.MFVNeutralino.VertexHistos_cfi') +process.load('JMTucker.MFVNeutralino.AnalysisCuts_cfi') + +# Enable per-flavor trigger SF variation weights +process.mfvWeight.produce_variation_weights = cms.bool(True) + +# common: vertex selection + nominal weight computation +common = cms.Sequence(process.mfvSelectedVerticesSeq * process.mfvWeight) + +# ntk>=5, >=2 tight vertices (standard FullSel) +process.mfvAnalysisCutsFullSel = process.mfvAnalysisCuts.clone() + +# Five weight variations: nominal + mu trig up/down + el trig up/down +variations = [ + ('Nominal', cms.InputTag('mfvWeight')), + ('MuTrigUp', cms.InputTag('mfvWeight', 'weightMuTrigUp')), + ('MuTrigDown', cms.InputTag('mfvWeight', 'weightMuTrigDown')), + ('ElTrigUp', cms.InputTag('mfvWeight', 'weightElTrigUp')), + ('ElTrigDown', cms.InputTag('mfvWeight', 'weightElTrigDown')), +] + +for var_name, weight_tag in variations: + histo = process.mfvVertexHistos.clone(weight_src = weight_tag) + histo_name = 'mfvVertexHistosFullSel' + var_name + setattr(process, histo_name, histo) + path = cms.Path(common * process.mfvAnalysisCutsFullSel * getattr(process, histo_name)) + setattr(process, 'pFullSel' + var_name, path) + +if __name__ == '__main__' and hasattr(sys, 'argv') and 'submit' in sys.argv: + from JMTucker.Tools.MetaSubmitter import * + from JMTucker.Tools.Samples import * + from JMTucker.Tools.Year import year + + all_lep_for_year = { + 20161: all_lep_signal_samples_20161, + 20162: all_lep_signal_samples_20162, + 2017: all_lep_signal_samples_2017, + 2018: all_lep_signal_samples_2018, + }[year] + + # Benchmark signal points: VH (ZH+WH+ggZH) M55 1mm/10mm/300um, M40 1mm + ttH dddd M55 10mm + benchmark_pats = [ + 'ZHToSSTodddd_tau1mm_M55', + 'ZHToSSTodddd_tau10mm_M55', + 'ZHToSSTodddd_tau300um_M55', + 'ZHToSSTodddd_tau1mm_M40', + 'WplusHToSSTodddd_tau1mm_M55', + 'WplusHToSSTodddd_tau10mm_M55', + 'WplusHToSSTodddd_tau300um_M55', + 'WplusHToSSTodddd_tau1mm_M40', + 'WminusHToSSTodddd_tau1mm_M55', + 'WminusHToSSTodddd_tau10mm_M55', + 'WminusHToSSTodddd_tau300um_M55', + 'WminusHToSSTodddd_tau1mm_M40', + 'ggZHToSSTodddd_tau1mm_M55', + 'ggZHToSSTodddd_tau10mm_M55', + 'ggZHToSSTodddd_tau300um_M55', + 'ggZHToSSTodddd_tau1mm_M40', + 'ttHToLLPs_dddd_tau10mm_M55', + ] + + samples = [s for s in all_lep_for_year if any(pat in s.name for pat in benchmark_pats)] + + pset_modifier = chain_modifiers(is_mc_modifier, per_sample_pileup_weights_modifier(), ttH_duplicate_check_modifier) + + set_splitting(samples, dataset, 'histos', data_json=json_path('ana_run2.json')) + + cs = CondorSubmitter('LepTrigSF_' + version, + ex = year, + dataset = dataset, + pset_modifier = pset_modifier, + ) + cs.submit_all(samples) diff --git a/MFVNeutralino/test/minitree_signal_VH.py b/MFVNeutralino/test/minitree_signal_VH.py new file mode 100644 index 000000000..56a108fb2 --- /dev/null +++ b/MFVNeutralino/test/minitree_signal_VH.py @@ -0,0 +1,75 @@ +# Dedicated MiniTree submission for lepton-channel VH signals. +# +# Prerequisites before running: +# 1. NtupleCommon.py must have: +# use_Lepton_triggers = True +# use_btag_vetoLepHT_triggers = False +# (this is the current default, so no change should be needed) +# +# 2. Year.h must have the correct year defined, e.g.: +# #define MFVNEUTRALINO_2018 +# Then rebuild: scram b -j8 +# Repeat for each year before re-submitting. +# +# To submit (after setting year and rebuilding): +# python minitree_signal_VH.py submit +# +# Samples submitted: ZH + WH+ + WH- + ggZH_bbbb + ggZH_dddd +# Dataset: ntuple_tag001lepm + +from JMTucker.Tools.BasicAnalyzer_cfg import * + +is_mc = True + +from JMTucker.MFVNeutralino.NtupleCommon import ( + ntuple_version_use as version, + dataset, + use_btag_vetoLepHT_triggers, + use_Lepton_triggers, +) + +if not use_Lepton_triggers: + raise RuntimeError( + 'minitree_signal_VH.py requires use_Lepton_triggers = True in NtupleCommon.py' + ) + +# Use an ntuple from the lepton dataset as a local test file +input_files(process, '/store/group/lpclonglived/joeyr/ZH_HToSSTodddd_ZToLL_MH-125_MS-55_ctauS-1_TuneCP5_13TeV-powheg-pythia8/NtupleOnnormdzULV30Lepm_2018/0000/ntuple_1.root') +tfileservice(process, 'minitree.root') +cmssw_from_argv(process) + +process.load('JMTucker.MFVNeutralino.MiniTree_cff') + +if not is_mc: + del process.pMiniTreeNtk4 + del process.pMiniTreeNtk3or4 + del process.pMiniTree + + +if __name__ == '__main__' and hasattr(sys, 'argv') and 'submit' in sys.argv: + from JMTucker.Tools.MetaSubmitter import * + import JMTucker.Tools.Samples as Samples + from JMTucker.Tools.Year import year + + yr = str(year) + + attr = 'all_lep_signal_samples_%s' % yr + samples = getattr(Samples, attr) + samples = [s for s in samples if s.has_dataset(dataset)] + print('Submitting %d lep-channel samples for year %s' % (len(samples), yr)) + + pset_modifier = chain_modifiers( + is_mc_modifier, + per_sample_pileup_weights_modifier(), + ttH_duplicate_check_modifier, + ) + + set_splitting(samples, dataset, 'minitree', data_json=json_path('ana_run2.json')) + + cs = CondorSubmitter( + 'MiniTree' + version + '_VH', + ex=year, + dataset=dataset, + pset_modifier=pset_modifier, + ) + cs.submit_all(samples) diff --git a/MFVNeutralino/test/minitree_signal_bjet.py b/MFVNeutralino/test/minitree_signal_bjet.py new file mode 100644 index 000000000..b43c4fc5d --- /dev/null +++ b/MFVNeutralino/test/minitree_signal_bjet.py @@ -0,0 +1,76 @@ +# Dedicated MiniTree submission for displaced-trigger bjet-channel signals. +# +# Prerequisites before running: +# 1. NtupleCommon.py must have: +# use_btag_vetoLepHT_triggers = True +# use_Lepton_triggers = False +# Edit NtupleCommon.py and rebuild: scram b -j8 +# Remember to restore NtupleCommon.py to use_Lepton_triggers = True afterwards. +# +# 2. Year.h must have the correct year defined, e.g.: +# #define MFVNEUTRALINO_2018 +# Then rebuild: scram b -j8 +# Repeat for each year before re-submitting. +# +# To submit (after setting year and rebuilding): +# python minitree_signal_bjet.py submit +# +# Samples submitted: mfv_neu (neutralino/gluino) + mfv_stopdbardbar + ggH +# Dataset: ntuple_tag001bvetolhtm + +from JMTucker.Tools.BasicAnalyzer_cfg import * + +is_mc = True + +from JMTucker.MFVNeutralino.NtupleCommon import ( + ntuple_version_use as version, + dataset, + use_btag_vetoLepHT_triggers, + use_Lepton_triggers, +) + +if not use_btag_vetoLepHT_triggers: + raise RuntimeError( + 'minitree_signal_bjet.py requires use_btag_vetoLepHT_triggers = True in NtupleCommon.py' + ) + +# Use an ntuple from the bjet dataset as a local test file +input_files(process, '/store/group/lpclonglived/joeyr/mfv_neu_tau01000um_M0400_2018/NtupleOnnormdzULV30BvetoLHTm_2018/0000/ntuple_1.root') +tfileservice(process, 'minitree.root') +cmssw_from_argv(process) + +process.load('JMTucker.MFVNeutralino.MiniTree_cff') + +if not is_mc: + del process.pMiniTreeNtk4 + del process.pMiniTreeNtk3or4 + del process.pMiniTree + + +if __name__ == '__main__' and hasattr(sys, 'argv') and 'submit' in sys.argv: + from JMTucker.Tools.MetaSubmitter import * + import JMTucker.Tools.Samples as Samples + from JMTucker.Tools.Year import year + + yr = str(year) + + attr = 'all_bjet_signal_samples_%s' % yr + samples = getattr(Samples, attr) + samples = [s for s in samples if s.has_dataset(dataset)] + print('Submitting %d bjet-channel samples for year %s' % (len(samples), yr)) + + pset_modifier = chain_modifiers( + is_mc_modifier, + per_sample_pileup_weights_modifier(), + ttH_duplicate_check_modifier, + ) + + set_splitting(samples, dataset, 'minitree', data_json=json_path('ana_run2_displacement_trigger.json')) + + cs = CondorSubmitter( + 'MiniTree' + version + '_bjet', + ex=year, + dataset=dataset, + pset_modifier=pset_modifier, + ) + cs.submit_all(samples) diff --git a/MFVNeutralino/test/minitree_signal_bjet_highM.py b/MFVNeutralino/test/minitree_signal_bjet_highM.py new file mode 100644 index 000000000..e6b2382dc --- /dev/null +++ b/MFVNeutralino/test/minitree_signal_bjet_highM.py @@ -0,0 +1,64 @@ +# Bjet-channel MiniTree submission for high-M signal samples only. +# Submits mfv_signal_highM + mfv_stopdbardbar_highM + mfv_stopbbarbbar_highM. +# Same prerequisites as minitree_signal_bjet.py: +# NtupleCommon.py: use_btag_vetoLepHT_triggers = True +# Year.h: correct year defined, then scram b + +from JMTucker.Tools.BasicAnalyzer_cfg import * + +is_mc = True + +from JMTucker.MFVNeutralino.NtupleCommon import ( + ntuple_version_use as version, + dataset, + use_btag_vetoLepHT_triggers, + use_Lepton_triggers, +) + +if not use_btag_vetoLepHT_triggers: + raise RuntimeError( + 'minitree_signal_bjet_highM.py requires use_btag_vetoLepHT_triggers = True in NtupleCommon.py' + ) + +input_files(process, '/store/group/lpclonglived/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1200_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_Table28Validation_CorrectedBvetoLHTm_NoEF_2018/260216_200739/0000/ntuple_0.root') +tfileservice(process, 'minitree.root') +cmssw_from_argv(process) + +process.load('JMTucker.MFVNeutralino.MiniTree_cff') + +if not is_mc: + del process.pMiniTreeNtk4 + del process.pMiniTreeNtk3or4 + del process.pMiniTree + + +if __name__ == '__main__' and hasattr(sys, 'argv') and 'submit' in sys.argv: + from JMTucker.Tools.MetaSubmitter import * + import JMTucker.Tools.Samples as Samples + from JMTucker.Tools.Year import year + + yr = str(year) + + highm_dataset = dataset + '_highM' # 'ntuple_tag001bvetolhtm_highM' + + samples = (getattr(Samples, 'mfv_signal_highM_samples_%s' % yr) + + getattr(Samples, 'mfv_stopdbardbar_highM_samples_%s' % yr) + + getattr(Samples, 'mfv_stopbbarbbar_highM_samples_%s' % yr)) + samples = [s for s in samples if s.has_dataset(highm_dataset)] + print('Submitting %d high-M bjet-channel samples for year %s' % (len(samples), yr)) + + pset_modifier = chain_modifiers( + is_mc_modifier, + per_sample_pileup_weights_modifier(), + ttH_duplicate_check_modifier, + ) + + set_splitting(samples, highm_dataset, 'minitree', data_json=json_path('ana_run2_displacement_trigger.json')) + + cs = CondorSubmitter( + 'MiniTree' + version + '_bjet', + ex=year, + dataset=highm_dataset, + pset_modifier=pset_modifier, + ) + cs.submit_all(samples) diff --git a/MFVNeutralino/test/ntuple_highM.py b/MFVNeutralino/test/ntuple_highM.py new file mode 100644 index 000000000..1d1430ec1 --- /dev/null +++ b/MFVNeutralino/test/ntuple_highM.py @@ -0,0 +1,56 @@ +# Ntuple production for high-M bjet-channel signal samples. +# Submits mfv_signal_highM + mfv_stopdbardbar_highM + mfv_stopbbarbbar_highM for one year. +# Prerequisites: +# NtupleCommon.py: use_btag_vetoLepHT_triggers = True +# Year.h: correct year #define, then scram b inside el7 + +import FWCore.ParameterSet.Config as cms +from JMTucker.Tools.general import named_product +from JMTucker.MFVNeutralino.NtupleCommon import * +from JMTucker.Tools.Year import year + +if not use_btag_vetoLepHT_triggers: + raise RuntimeError('ntuple_highM.py requires use_btag_vetoLepHT_triggers = True in NtupleCommon.py') + +settings = NtupleSettings() +settings.is_mc = True +settings.is_miniaod = True +settings.run_n_tk_seeds = False +settings.minitree_only = False +settings.prepare_vis = False +settings.keep_all = False +settings.keep_gen = False +settings.keep_tk = False +settings.event_filter = 'bjets OR displaced dijet veto leptons and HT' +settings.randpars_filter = False + +process = ntuple_process(settings) +dataset = 'miniaod' if settings.is_miniaod else 'main' +input_files(process, '/uscms/home/joeyr/nobackup/13DF01B3-1BC9-0246-8C88-DF26E2F16793.root') +cmssw_from_argv(process) + +if __name__ == '__main__' and hasattr(sys, 'argv') and 'submit' in sys.argv: + from JMTucker.Tools.MetaSubmitter import * + + yr = str(year) + + samples = (getattr(Samples, 'mfv_signal_highM_samples_%s' % yr) + + getattr(Samples, 'mfv_stopdbardbar_highM_samples_%s' % yr) + + getattr(Samples, 'mfv_stopbbarbbar_highM_samples_%s' % yr)) + samples = [s for s in samples if s.has_dataset(dataset)] + print 'Submitting %d high-M bjet-channel ntuple samples for year %s' % (len(samples), yr) + + json_filename = 'ana_run2_displacement_trigger.json' + set_splitting(samples, dataset, 'ntuple', data_json=json_path(json_filename)) + + ms = MetaSubmitter(settings.batch_name() + '_highM', dataset=dataset) + ms.common.pset_modifier = chain_modifiers(is_mc_modifier, era_modifier, npu_filter_modifier(settings.is_miniaod), signals_no_event_filter_modifier, ttH_duplicate_check_modifier) + ms.crab.crab_cfg_Data_outLFNDirBase = '/store/group/lpcdisplacedvertices/gdecastr/' + ms.condor.stageout_files = 'all' + ms.condor.local_stage = True + ms.condor.stageout_path = ( + 'root://cmseos.fnal.gov//store/group/lpcdisplacedvertices/gdecastr' + '/$(&1 | grep -E "^(Building|Compiling|Linking|ERROR|error:|Warning|scram)" | head -20 || true + echo "scram b done" + + # Submit + cd ${TEST_DIR} + python minitree_signal_bjet_highM.py submit + echo "Submitted for year $YEAR" +done + +# Restore Year.h to 2018 and rebuild once more +echo "" +echo "=== Restoring Year.h to 2018 ===" +sed -i "s/^#define MFVNEUTRALINO_[0-9]\{4,5\}$/#define MFVNEUTRALINO_2018/" ${YEAR_H} +grep "^#define MFVNEUTRALINO_[0-9]" ${YEAR_H} +cd ${CMSSW_SRC} +scram b -j8 2>&1 | grep -E "^(Building|Done|ERROR)" | head -5 || true + +echo "" +echo "=== All done! High-M MiniTree jobs submitted for all 4 years. ===" diff --git a/MFVNeutralino/test/submit_leptrigsf_allyears.sh b/MFVNeutralino/test/submit_leptrigsf_allyears.sh new file mode 100755 index 000000000..b4d773252 --- /dev/null +++ b/MFVNeutralino/test/submit_leptrigsf_allyears.sh @@ -0,0 +1,44 @@ +#!/bin/bash +# Submit histosLepSF.py for all four Run-II years. +# Run this script from inside the CMSSW el7 apptainer after cmsenv. +# It uses $CMSSW_BASE automatically, so works with any CMSSW installation. +# source /uscms/home/joeyr/setup_cmssw-el7_apptainer.sh +# cd $CMSSW_BASE/src && cmsenv +# cd JMTucker/MFVNeutralino/test +# bash submit_leptrigsf_allyears.sh + +set -e + +if [ -z "$CMSSW_BASE" ]; then + echo "ERROR: CMSSW_BASE not set. Run cmsenv first." + exit 1 +fi + +YEAR_H=${CMSSW_BASE}/src/JMTucker/Tools/interface/Year.h +CMSSW_SRC=${CMSSW_BASE}/src +SCRIPT_DIR=${CMSSW_BASE}/src/JMTucker/MFVNeutralino/test + +for YEAR in 20161 20162 2017 2018; do + echo "============================================" + echo " Year: ${YEAR}" + echo "============================================" + + # Swap the active year define in Year.h + # Use [0-9]+ (one-or-more) and $ (end-of-line) so we only match the + # single-token active-year line and never corrupt MFVNEUTRALINO_YEARS etc. + sed -i -E "s|^#define MFVNEUTRALINO_[0-9]+$|#define MFVNEUTRALINO_${YEAR}|" ${YEAR_H} + echo "Year.h set to MFVNEUTRALINO_${YEAR}:" + grep "^#define MFVNEUTRALINO_[0-9]" ${YEAR_H} + + # Recompile + cd ${CMSSW_SRC} + scram b -j8 2>&1 | tail -5 + + # Submit + cd ${SCRIPT_DIR} + python histosLepSF.py submit + echo "Submitted year ${YEAR}" + echo "" +done + +echo "All four years submitted." diff --git a/MFVNeutralino/test/submit_signal_minitrees_allyears.sh b/MFVNeutralino/test/submit_signal_minitrees_allyears.sh new file mode 100755 index 000000000..181f73ae1 --- /dev/null +++ b/MFVNeutralino/test/submit_signal_minitrees_allyears.sh @@ -0,0 +1,69 @@ +#!/bin/bash +# ============================================================ +# Submit signal MiniTrees for all four Run 2 years. +# +# OVERVIEW +# -------- +# Two scripts are provided: +# minitree_signal_VH.py -- lepton channel: ZH + WH+ + WH- + ggZH_bbbb + ggZH_dddd +# minitree_signal_bjet.py -- bjet channel: mfv_neu + mfv_stopdbardbar + ggH +# +# They must be submitted year by year because: +# (a) Year.h embeds the year at compile time (MFVNEUTRALINO_YEAR macro). +# (b) NtupleCommon.py must have the correct trigger scheme set. +# +# MANUAL STEPS BEFORE EACH YEAR +# ------------------------------ +# +# --- Lepton channel (run once per year) --- +# 1. Edit JMTucker/Tools/interface/Year.h: +# Change #define MFVNEUTRALINO_XXXX +# to #define MFVNEUTRALINO_ +# Valid values: MFVNEUTRALINO_20161, MFVNEUTRALINO_20162, +# MFVNEUTRALINO_2017, MFVNEUTRALINO_2018 +# +# 2. Verify NtupleCommon.py has: +# use_Lepton_triggers = True +# use_btag_vetoLepHT_triggers = False +# (this is the default; no change should be needed) +# +# 3. scram b -j8 +# +# 4. cmsenv (re-source the environment after rebuild) +# +# 5. cd test/ +# python minitree_signal_VH.py submit +# +# --- Bjet channel (run once per year) --- +# 1. Edit Year.h as above for the desired year. +# +# 2. Edit NtupleCommon.py: +# use_btag_vetoLepHT_triggers = True # change this +# use_Lepton_triggers = False # change this +# +# 3. scram b -j8 +# +# 4. cmsenv +# +# 5. cd test/ +# python minitree_signal_bjet.py submit +# +# 6. After submission, restore NtupleCommon.py: +# use_Lepton_triggers = True +# use_btag_vetoLepHT_triggers = False +# and rebuild: scram b -j8 +# +# REMINDER: The CRAB/Condor jobs will pick up the year from the compiled +# MFVNEUTRALINO_YEAR macro. If you forget to rebuild, all jobs will run +# with the wrong year settings. +# +# SUBMISSION ORDER (suggested: 2018 first, as it has the most statistics) +# 2018, 2017, 20162, 20161 +# ============================================================ + +echo "This script documents the manual steps required." +echo "Edit Year.h and NtupleCommon.py per the instructions above," +echo "then run scram b and submit each script individually." +echo "" +echo "Lepton channel VH: python minitree_signal_VH.py submit" +echo "Bjet channel signals: python minitree_signal_bjet.py submit" diff --git a/MFVNeutralino/test/utilities_MCPartial.py b/MFVNeutralino/test/utilities_MCPartial.py new file mode 100755 index 000000000..e3b4244ce --- /dev/null +++ b/MFVNeutralino/test/utilities_MCPartial.py @@ -0,0 +1,405 @@ +#!/usr/bin/env python + +from JMTucker.MFVNeutralino.UtilitiesBase import * + +#### + +_qcdlepenrich = bool_from_argv('qcdlepenrich') +_leptonpresel = bool_from_argv('leptonpresel') +_btagpresel = bool_from_argv('btagpresel') +_metpresel = bool_from_argv('metpresel') +_presel_s = '_qcdlepenrich' if _qcdlepenrich else '_leptonpresel' if _leptonpresel else '_metpresel' if _metpresel else '_btagpresel' if _btagpresel else '' + +#### + +def cmd_hadd_vertexer_histos(): + ntuple = sys.argv[2] + print(ntuple) + samples = Samples.registry.from_argv( + #Samples.qcd_samples_2017 + Samples.met_samples_2017 + Samples.Zvv_samples_2017 + Samples.mfv_splitSUSY_samples_M2000_2017 + + Samples.met_samples_2017 + #Samples.WplusHToSSTodddd_samples_2017 + Samples.met_samples_2017 + Samples.qcd_lep_samples_2017 + Samples.leptonic_samples_2017 + Samples.diboson_samples_2017 + #Samples.data_samples_2015 + \ + #Samples.ttbar_samples_2015 + Samples.qcd_samples_2015 + Samples.qcd_samples_ext_2015 + \ + #Samples.data_samples + \ + #Samples.ttbar_samples + Samples.qcd_samples + Samples.qcd_samples_ext + ) + for s in samples: + s.set_curr_dataset(ntuple) + hadd(s.name + '.root', ['root://cmseos.fnal.gov/' + fn.replace('ntuple', 'vertex_histos') for fn in s.filenames]) + +def cmd_report_data(): + for ds, ex in ('SingleMuon', '_mu'), ('JetHT', ''), ('SingleElectron', '_ele'), ('MET', '_met'): + maod = 'miniaod' if 'miniaod' in sys.argv else '' + pc = '' + if '10pc' in sys.argv: + pc = '10pc' + ex += '_10pc' + elif '1pc' in sys.argv: + pc = '1pc' + ex += '_1pc' + + for year in 2017, 2018: + if not glob('*%s%i*' % (ds, year)): + continue + + os.system('mreport c*_%s%i* %s %s' % (ds, year, pc, maod)) + json_fn = 'processedLumis.json' + if not os.path.isfile(json_fn): + raise IOError('something went wrong with mreport?') + + print 'jsondiff' + avail_fn = json_path('ana_avail_%i%s.json' % (year, ex)) + ok = False + if not os.path.isfile(avail_fn): + if raw_input('no file %s, enter y to create it: ' % avail_fn)[0] == 'y': + shutil.copy(json_fn, avail_fn) + ok = True + else: + os.system('compareJSON.py --diff %s %s' % (json_fn, avail_fn)) + if raw_input('enter y if ok: ') == 'y': + ok = True + if ok: + os.rename('processedLumis.json', 'dataok_%i.json' % year) + else: + bad_fn = '%s.bad.%i' % (json_fn, int(time())) + print 'saving %s as %s' % (json_fn, bad_fn) + os.rename(json_fn, bad_fn) + +def cmd_hadd_data(): + permissive = bool_from_argv('permissive') + for ds in 'SingleMuon', 'JetHT', 'ZeroBias', 'SingleElectron', 'MET', 'BTagCSV', 'DisplacedJet', 'EGamma': + print ds + files = set(glob(ds + '*.root')) + if not files: + print 'no files for this ds' + continue + + have = [] + if ds == 'DisplacedJet': + year_eras = [ + #('20161', 'BCDEF'), #FIXME B2->B #HERE SingleMuon BCDEF + #('20162', 'FGH'), + ('2017', 'CDE'), + #('2018', 'ABCD'), + ] + elif ds == 'SingleMuon': + year_eras = [ + #('20161', 'BCDEF'), #FIXME B2->B #HERE SingleMuon BCDEF + #('20162', 'FGH'), + ('2017', 'BCDEF'), #B + #('2018', 'ABCD'), + ] + else: + year_eras = [ + #('20161', 'BCDEF'), #FIXME B2->B #HERE SingleMuon BCDEF + #('20162', 'FGH'), + ('2017', 'BCDEF'), + #('2018', 'ABCD'), + ] + + for year, eras in year_eras: + files = [f for x in eras for f in glob('%s%s%s.root' % (ds, year, x))] + ok = len(files) == len(eras) + if not ok: + print 'some files missing for %s %s: only have %r' % (ds, year, files) + if ok or permissive: + hadd_or_merge('%s%s.root' % (ds, year), files) + have.append(year) + + if '2017' in have and '2018' in have: + hadd_or_merge(ds + '2017p8.root', ['%s%s.root' % (ds, year) for year in '2017', '2018']) + +cmd_merge_data = cmd_hadd_data + +def _mc_parts(): + for year in [2017,2018]: + if year == 2017: + #for base in 'dyjetstollM50', 'wjetstolnu': + base = 'qcdht0500' + elif year == 2018: + base == 'qcdht0200' + a = '%s_%s.root' % (base, year) + b = '%sext_%s.root' % (base, year) + c = '%ssum_%s.root' % (base, year) + yield (year,base), (a,b,c) + +def cmd_hadd_mc_sums(): + for (year,base), (a,b,c) in _mc_parts(): + if not os.path.isfile(a) or not os.path.isfile(b): + print 'skipping', year, base, 'because at least one input file missing' + elif os.path.isfile(c): + print 'skipping', year, base, 'because', c, 'already exists' + else: + hadd_or_merge(c, [a, b]) + +cmd_merge_mc_sums = cmd_hadd_mc_sums + +def cmd_rm_mc_parts(): + for (year,base), (a,b,c) in _mc_parts(): + if os.path.isfile(c): + for y in a,b: + if os.path.isfile(y): + print y + os.remove(y) + +def _background_samples(trigeff=False, year=2017, bkg_tag='ttbar'): + if _qcdlepenrich: + x = ['qcdmupt15'] + x += ['qcdempt%03i' % x for x in [15,20,30,50,80,120,170]] + x += ['qcdbctoept%03i' % x for x in [15,20,30,80,170,250]] + elif _leptonpresel or trigeff: #FIXME + if bkg_tag == 'wjetstolnu': + x = ['wjetstolnu_0j'] + x += ['wjetstolnu_1j'] + x += ['wjetstolnu_2j'] + elif bkg_tag == 'dyjets': + x = ['dyjetstollM10', 'dyjetstollM50'] + elif bkg_tag == 'qcd': + x = [] + if not trigeff: + x = [] + x += ['qcdempt%03i' % x for x in [20,30,50,80,120,170,300]] #15 + x += ['qcdbctoept%03i' % x for x in [15,20,30,80,170,250]] + elif bkg_tag == 'qcdmupt5': + x = [] + if not trigeff: + x = [] + x += ['qcdpt%02imupt5' % x for x in [15,20,30,50,80]] + x += ['qcdpt%03imupt5' % x for x in [120,170,300,470,600,800]] + x += ['qcdpt1000mupt5'] + elif bkg_tag == 'diboson': + x = ['ww', 'wz', 'zz',] + else: + x = ['ttbar',] + elif _btagpresel: + x = [] + if bkg_tag == 'qcd': + x += ['qcdht%04i' % x for x in [ 200, 300, 500, 700, 1000, 1500, 2000]] + else : + x += ['ttbar',] + elif _metpresel: + x = ['ttbar', 'wjetstolnu'] + x += ['qcdht%04i' % x for x in [200, 300, 500, 700, 1000, 1500, 2000]] + x += ['zjetstonunuht%04i' % x for x in [100, 200, 400, 600, 800, 1200, 2500]] + if year==2017: + x += ['qcdht0200', 'qcdht0500sum'] + elif year==2018: + x += ['qcdht0200sum', 'qcdht0500'] + else: + x = ['qcdht%04i' % x for x in [700, 1000, 1500, 2000]] + x += ['ttbarht%04i' % x for x in [600, 800, 1200, 2500]] + return x + +def cmd_merge_background(permissive=bool_from_argv('permissive'), year_to_use=2017): #HERE + cwd = os.getcwd() + ok = True + if year_to_use==-1: + for year_s, scale in [('_2017', -AnalysisConstants.int_lumi_2017 * AnalysisConstants.scale_factor_2017), + ('_2018', -AnalysisConstants.int_lumi_2018 * AnalysisConstants.scale_factor_2018)]: + + year = int(year_s[1:]) + print 'scaling to', year, scale + + files = _background_samples(year=year) + files = ['%s%s.root' % (x, year_s) for x in files] + files2 = [] + for fn in files: + if not os.path.isfile(fn): + msg = '%s not found' % fn + if permissive: + print msg + else: + raise RuntimeError(msg) + else: + files2.append(fn) + if files2: + cmd = 'samples merge %f background%s%s.root ' % (scale, _presel_s, year_s) + cmd += ' '.join(files2) + print cmd + if os.system(cmd) != 0: + ok = False + if ok: + cmd = 'hadd.py background_2017p8.root background%s2017.root background%s2018.root' %(_presel_s) + print cmd + os.system(cmd) + + else: + if year_to_use==2017: + year_s = '_2017' + scale = -AnalysisConstants.int_lumi_2017 * AnalysisConstants.scale_factor_2017 + elif year_to_use==2018: + year_s = '_2018' + scale = -AnalysisConstants.int_lumi_2018 * AnalysisConstants.scale_factor_2018 + elif year_to_use==20162: + year_s = '_20162' + scale = -AnalysisConstants.int_lumi_20162 * AnalysisConstants.scale_factor_20162 + elif year_to_use==20161: + year_s = '_20161' + scale = -AnalysisConstants.int_lumi_20161 * AnalysisConstants.scale_factor_20161 + else: + raise RuntimeError("Year {0} not available!".format(year_to_use)) + + year = int(year_s[1:]) + print 'scaling to', year, scale + + for bkg_tag in ['wjetstolnu', 'ttbar']: #FIXME + files = _background_samples(year=year, bkg_tag=bkg_tag) + files = ['%s%s.root' % (x, year_s) for x in files] + files2 = [] + for fn in files: + if not os.path.isfile(fn): + msg = '%s not found' % fn + if permissive: + print msg + else: + raise RuntimeError(msg) + else: + files2.append(fn) + if files2: + cmd = 'samples merge %f %s%s%s.root ' % (scale,bkg_tag,_presel_s, year_s) + cmd += ' '.join(files2) + print("scale is "+str(scale)) + print cmd + if os.system(cmd) != 0: + ok = False + if ok: + print ("{0} {1} merged!".format(year, bkg_tag)) + + cmd = 'hadd.py background_leptonpresel_2017.root wjetstolnu_leptonpresel_2017.root ttbar_leptonpresel_2017.root' + print cmd + os.system(cmd) + + #only work for 2017 data now + #if ok: + # cmd = 'hadd.py background%s_2017p8.root background%s_2017.root background%s_2018.root' % (_presel_s, _presel_s, _presel_s) + # print cmd + # os.system(cmd) + +def cmd_effsprint(year_to_use=2017): + if year_to_use==-1: + for year in 2017, 2018: + background_fns = ' '.join('%s_%s.root' % (x, year) for x in _background_samples(year=year)) + todo = [('background', background_fns), ('signals', 'mfv*%s.root' % year)] + def do(cmd, outfn): + cmd = 'python %s %s %s' % (cmssw_base('src/JMTucker/MFVNeutralino/test/effsprint.py'), cmd, year) + print cmd + os.system('%s | tee %s' % (cmd, outfn)) + print + for which, which_files in todo: + for ntk in 3,4,'3or4',5: + for vtx in 1,2: + cmd = 'ntk%s' % ntk + if which == 'background': + cmd += ' sum' + if vtx == 1: + cmd += ' one' + cmd += ' ' + which_files + outfn = 'effsprint_%s%s_%s_ntk%s_%iv' % (which, _presel_s, year, ntk, vtx) + do(cmd, outfn) + do('presel sum ' + background_fns, 'effsprint_presel_%s' % year) + do('nocuts sum ' + background_fns, 'effsprint_nocuts_%s' % year) + else: + if year_to_use!=2017 and year_to_use!=2018: + raise RuntimeError("Year {0} not available!".format(year_to_use)) + year = year_to_use + background_fns = ' '.join('%s_%s.root' % (x, year) for x in _background_samples(year=year)) + todo = [('background', background_fns), ('signals', 'mfv*%s.root' % year)] + def do(cmd, outfn): + cmd = 'python %s %s %s' % (cmssw_base('src/JMTucker/MFVNeutralino/test/effsprint.py'), cmd, year) + print cmd + os.system('%s | tee %s' % (cmd, outfn)) + print + for which, which_files in todo: + for ntk in 3,4,'3or4',5: + for vtx in 1,2: + cmd = 'ntk%s' % ntk + if which == 'background': + cmd += ' sum' + if vtx == 1: + cmd += ' one' + cmd += ' ' + which_files + outfn = 'effsprint_%s%s_%s_ntk%s_%iv' % (which, _presel_s, year, ntk, vtx) + do(cmd, outfn) + + do('presel sum ' + background_fns, 'effsprint_presel_%s' % year) + do('nocuts sum ' + background_fns, 'effsprint_nocuts_%s' % year) + + +def cmd_histos(): + #cmd_report_data() + #cmd_hadd_data() + cmd_merge_background() + #cmd_effsprint() + +def cmd_presel(): + cmd_report_data() + cmd_hadd_data() + cmd_merge_background() + +def cmd_vpeffs(): + cmd_report_data() + cmd_hadd_data() + cmd_merge_background() + +def cmd_minitree(): + cmd_report_data() + cmd_hadd_data() + +def cmd_trackermapperhists(): + cmd_hadd_data() + cmd_merge_background() + +def cmd_trackmover(): + cmd_report_data() + cmd_hadd_data() + +def cmd_trackmoverhists(): + cmd_hadd_data() + cmd_merge_background() + +def cmd_k0hists(): + cmd_hadd_data() + cmd_merge_background(True) + +def cmd_trigeff(): + cmd_hadd_mc_sums() + if glob('*SingleMuon*') or glob('*SingleElectron*'): + cmd_report_data() + cmd_hadd_data() + cmd_trigeff_merge() + +def cmd_trigeff_merge(): + permissive = bool_from_argv('permissive') + print colors.yellow('using *_2017* for 2018') + for year_s, scale in ('_2017', -AnalysisConstants.int_lumi_2017), ('_2018', -AnalysisConstants.int_lumi_2018): + for wqcd_s in '', '_wqcd': + files = _background_samples(trigeff=True) + #if not wqcd_s: + # files.remove('qcdmupt15') + files = ['%s%s.root' % (x, '_2017') for x in files] + files2 = [] + for fn in files: + if not os.path.isfile(fn): + msg = '%s not found' % fn + if permissive: + print msg + else: + raise RuntimeError(msg) + else: + files2.append(fn) + + if files2: + out_fn = 'background%s%s.root' % (wqcd_s, year_s) + if os.path.exists(out_fn): + print colors.yellow('skipping %s because it exists' % out_fn) + else: + cmd = 'samples merge %f %s %s' % (scale, out_fn, ' '.join(files2)) + print cmd + os.system(cmd) + +#### + +if __name__ == '__main__': + main(locals()) + diff --git a/Tools/python/SampleFiles.py b/Tools/python/SampleFiles.py index 106695b9e..6a7534555 100644 --- a/Tools/python/SampleFiles.py +++ b/Tools/python/SampleFiles.py @@ -1140,6 +1140,146 @@ def who(name, ds): 'ttHToLLPs_dddd_tau10mm_M55_2018': _fromnum0("/store/user/joeyr/ttHToLLPs_dddd_tau10mm_M55_2018/Ntuple_tagTestFixTrigThresholdsBvetoLHTm_2018/260409_112745", 30), }) +_add_ds("ntuple_tag001bvetolhtm_highM", { + # High-mass signal ntuples (M=1200,1600,3000 GeV). Tag: Ntuple_tag001BvetoLHTm_highM. + # Submitted 2026-05-08. M3000 at long lifetimes hit 3-day wall time; those entries are omitted. + 'mfv_neu_tau000100um_M1200_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1200_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182554", 14), + 'mfv_neu_tau000100um_M1200_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1200_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182247", 14), + 'mfv_neu_tau000100um_M1200_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1200_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_181936", 27), + 'mfv_neu_tau000100um_M1200_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1200_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181617", 27), + 'mfv_neu_tau000100um_M1600_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1600_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182559", 14), + 'mfv_neu_tau000100um_M1600_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1600_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182252", 14), + 'mfv_neu_tau000100um_M1600_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1600_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_181941", 27), + 'mfv_neu_tau000100um_M1600_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1600_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181622", 27), + 'mfv_neu_tau000100um_M3000_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-3000_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182604", 14), + 'mfv_neu_tau000100um_M3000_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-3000_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182257", 14), + 'mfv_neu_tau000100um_M3000_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-3000_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_181946", 27), + 'mfv_neu_tau000100um_M3000_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-3000_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181627", 27), + 'mfv_neu_tau000300um_M1200_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1200_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182555", 5), + 'mfv_neu_tau000300um_M1200_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1200_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182248", 5), + 'mfv_neu_tau000300um_M1200_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1200_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_181937", 9), + 'mfv_neu_tau000300um_M1200_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1200_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181618", 9), + 'mfv_neu_tau000300um_M1600_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1600_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182600", 4), + 'mfv_neu_tau000300um_M1600_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1600_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182253", 4), + 'mfv_neu_tau000300um_M1600_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1600_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_181942", 8), + 'mfv_neu_tau000300um_M1600_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1600_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181623", 8), + 'mfv_neu_tau000300um_M3000_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-3000_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182605", 4), + 'mfv_neu_tau000300um_M3000_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-3000_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182258", 4), + 'mfv_neu_tau000300um_M3000_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-3000_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_181947", 8), + 'mfv_neu_tau000300um_M3000_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-3000_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181628", 8), + 'mfv_neu_tau001000um_M1200_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1200_CTau-1mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182556", 2), + 'mfv_neu_tau001000um_M1200_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1200_CTau-1mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182249", 2), + 'mfv_neu_tau001000um_M1200_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1200_CTau-1mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_181938", 3), + 'mfv_neu_tau001000um_M1200_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1200_CTau-1mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181619", 3), + 'mfv_neu_tau001000um_M1600_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1600_CTau-1mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182601", 2), + 'mfv_neu_tau001000um_M1600_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1600_CTau-1mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182254", 2), + 'mfv_neu_tau001000um_M1600_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1600_CTau-1mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_181943", 3), + 'mfv_neu_tau001000um_M1600_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1600_CTau-1mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181624", 3), + 'mfv_neu_tau010000um_M1200_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1200_CTau-10mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182557", 1), + 'mfv_neu_tau010000um_M1200_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1200_CTau-10mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182250", 1), + 'mfv_neu_tau010000um_M1200_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1200_CTau-10mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_181939", 2), + 'mfv_neu_tau010000um_M1200_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1200_CTau-10mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181620", 2), + 'mfv_neu_tau010000um_M1600_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1600_CTau-10mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182602", 1), + 'mfv_neu_tau010000um_M1600_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1600_CTau-10mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182255", 1), + 'mfv_neu_tau010000um_M1600_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1600_CTau-10mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_181944", 2), + 'mfv_neu_tau010000um_M1600_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1600_CTau-10mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181625", 2), + 'mfv_neu_tau030000um_M1600_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1600_CTau-30mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182603", 2), + 'mfv_neu_tau030000um_M1600_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1600_CTau-30mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182256", 2), + 'mfv_neu_tau030000um_M1600_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1600_CTau-30mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_181945", 3), + 'mfv_neu_tau030000um_M1600_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1600_CTau-30mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181626", 3), + 'mfv_stopbbarbbar_tau000100um_M1200_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1200_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182624", 14), + 'mfv_stopbbarbbar_tau000100um_M1200_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1200_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182317", 14), + 'mfv_stopbbarbbar_tau000100um_M1200_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1200_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_182006", 27), + 'mfv_stopbbarbbar_tau000100um_M1200_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1200_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181647", 27), + 'mfv_stopbbarbbar_tau000100um_M1600_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1600_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182629", 13), + 'mfv_stopbbarbbar_tau000100um_M1600_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1600_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182322", 14), + 'mfv_stopbbarbbar_tau000100um_M1600_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1600_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_182011", 26), + 'mfv_stopbbarbbar_tau000100um_M1600_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1600_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181652", 27), + 'mfv_stopbbarbbar_tau000100um_M3000_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-3000_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182634", 14), + 'mfv_stopbbarbbar_tau000100um_M3000_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-3000_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182327", 14), + 'mfv_stopbbarbbar_tau000100um_M3000_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-3000_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_182016", 27), + 'mfv_stopbbarbbar_tau000100um_M3000_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-3000_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181657", 27), + 'mfv_stopbbarbbar_tau000300um_M1200_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1200_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182625", 7), + 'mfv_stopbbarbbar_tau000300um_M1200_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1200_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182318", 7), + 'mfv_stopbbarbbar_tau000300um_M1200_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1200_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_182007", 14), + 'mfv_stopbbarbbar_tau000300um_M1200_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1200_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181648", 14), + 'mfv_stopbbarbbar_tau000300um_M1600_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1600_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182630", 6), + 'mfv_stopbbarbbar_tau000300um_M1600_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1600_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182323", 6), + 'mfv_stopbbarbbar_tau000300um_M1600_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1600_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_182012", 12), + 'mfv_stopbbarbbar_tau000300um_M1600_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1600_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181653", 12), + 'mfv_stopbbarbbar_tau000300um_M3000_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-3000_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182635", 6), + 'mfv_stopbbarbbar_tau000300um_M3000_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-3000_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182328", 6), + 'mfv_stopbbarbbar_tau000300um_M3000_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-3000_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_182017", 12), + 'mfv_stopbbarbbar_tau000300um_M3000_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-3000_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181658", 12), + 'mfv_stopbbarbbar_tau001000um_M1200_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1200_CTau-1mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182626", 2), + 'mfv_stopbbarbbar_tau001000um_M1200_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1200_CTau-1mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182319", 2), + 'mfv_stopbbarbbar_tau001000um_M1200_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1200_CTau-1mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_182008", 4), + 'mfv_stopbbarbbar_tau001000um_M1200_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1200_CTau-1mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181649", 4), + 'mfv_stopbbarbbar_tau001000um_M1600_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1600_CTau-1mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182631", 2), + 'mfv_stopbbarbbar_tau001000um_M1600_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1600_CTau-1mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182324", 2), + 'mfv_stopbbarbbar_tau001000um_M1600_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1600_CTau-1mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_182013", 4), + 'mfv_stopbbarbbar_tau001000um_M1600_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1600_CTau-1mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181654", 4), + 'mfv_stopbbarbbar_tau010000um_M1600_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1600_CTau-10mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182632", 2), + 'mfv_stopbbarbbar_tau010000um_M1600_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1600_CTau-10mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182325", 2), + 'mfv_stopbbarbbar_tau010000um_M1600_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1600_CTau-10mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_182014", 2), + 'mfv_stopbbarbbar_tau010000um_M1600_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1600_CTau-10mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181655", 2), + 'mfv_stopbbarbbar_tau030000um_M1200_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1200_CTau-30mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182628", 2), + 'mfv_stopbbarbbar_tau030000um_M1200_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1200_CTau-30mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182321", 2), + 'mfv_stopbbarbbar_tau030000um_M1200_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1200_CTau-30mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_182010", 4), + 'mfv_stopbbarbbar_tau030000um_M1200_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1200_CTau-30mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181651", 4), + 'mfv_stopbbarbbar_tau030000um_M1600_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1600_CTau-30mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182633", 2), + 'mfv_stopbbarbbar_tau030000um_M1600_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1600_CTau-30mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182326", 2), + 'mfv_stopbbarbbar_tau030000um_M1600_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1600_CTau-30mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_182015", 4), + 'mfv_stopbbarbbar_tau030000um_M1600_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Bbar2B_M-1600_CTau-30mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181656", 4), + 'mfv_stopdbardbar_tau000100um_M1200_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1200_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182609", 14), + 'mfv_stopdbardbar_tau000100um_M1200_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1200_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182302", 14), + 'mfv_stopdbardbar_tau000100um_M1200_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1200_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_181951", 27), + 'mfv_stopdbardbar_tau000100um_M1200_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1200_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181632", 27), + 'mfv_stopdbardbar_tau000100um_M1600_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1600_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182614", 14), + 'mfv_stopdbardbar_tau000100um_M1600_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1600_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182307", 14), + 'mfv_stopdbardbar_tau000100um_M1600_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1600_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_181956", 27), + 'mfv_stopdbardbar_tau000100um_M1600_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1600_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181637", 27), + 'mfv_stopdbardbar_tau000100um_M3000_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-3000_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182619", 14), + 'mfv_stopdbardbar_tau000100um_M3000_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-3000_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182312", 14), + 'mfv_stopdbardbar_tau000100um_M3000_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-3000_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_182001", 27), + 'mfv_stopdbardbar_tau000100um_M3000_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-3000_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181642", 27), + 'mfv_stopdbardbar_tau000300um_M1200_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1200_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182610", 7), + 'mfv_stopdbardbar_tau000300um_M1200_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1200_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182303", 7), + 'mfv_stopdbardbar_tau000300um_M1200_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1200_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_181952", 14), + 'mfv_stopdbardbar_tau000300um_M1200_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1200_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181633", 14), + 'mfv_stopdbardbar_tau000300um_M1600_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1600_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182615", 6), + 'mfv_stopdbardbar_tau000300um_M1600_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1600_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182308", 6), + 'mfv_stopdbardbar_tau000300um_M1600_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1600_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_181957", 27), + 'mfv_stopdbardbar_tau000300um_M1600_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1600_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181638", 12), + 'mfv_stopdbardbar_tau000300um_M3000_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-3000_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182620", 6), + 'mfv_stopdbardbar_tau000300um_M3000_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-3000_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182313", 6), + 'mfv_stopdbardbar_tau000300um_M3000_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-3000_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_182002", 12), + 'mfv_stopdbardbar_tau000300um_M3000_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-3000_CTau-300um_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181643", 12), + 'mfv_stopdbardbar_tau001000um_M1200_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1200_CTau-1mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182611", 2), + 'mfv_stopdbardbar_tau001000um_M1200_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1200_CTau-1mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182304", 2), + 'mfv_stopdbardbar_tau001000um_M1200_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1200_CTau-1mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_181953", 4), + 'mfv_stopdbardbar_tau001000um_M1200_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1200_CTau-1mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181634", 4), + 'mfv_stopdbardbar_tau001000um_M1600_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1600_CTau-1mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182616", 2), + 'mfv_stopdbardbar_tau001000um_M1600_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1600_CTau-1mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182309", 2), + 'mfv_stopdbardbar_tau001000um_M1600_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1600_CTau-1mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_181958", 4), + 'mfv_stopdbardbar_tau001000um_M1600_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1600_CTau-1mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181639", 4), + 'mfv_stopdbardbar_tau010000um_M1200_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1200_CTau-10mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182612", 2), + 'mfv_stopdbardbar_tau010000um_M1200_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1200_CTau-10mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182305", 2), + 'mfv_stopdbardbar_tau010000um_M1200_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1200_CTau-10mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_181954", 2), + 'mfv_stopdbardbar_tau010000um_M1200_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1200_CTau-10mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181635", 2), + 'mfv_stopdbardbar_tau010000um_M1600_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1600_CTau-10mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182617", 2), + 'mfv_stopdbardbar_tau010000um_M1600_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1600_CTau-10mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182310", 2), + 'mfv_stopdbardbar_tau010000um_M1600_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1600_CTau-10mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_181959", 2), + 'mfv_stopdbardbar_tau010000um_M1600_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1600_CTau-10mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181640", 2), + 'mfv_stopdbardbar_tau030000um_M1200_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1200_CTau-30mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182613", 2), + 'mfv_stopdbardbar_tau030000um_M1200_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1200_CTau-30mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182306", 2), + 'mfv_stopdbardbar_tau030000um_M1200_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1200_CTau-30mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_181955", 4), + 'mfv_stopdbardbar_tau030000um_M1200_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1200_CTau-30mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181636", 4), + 'mfv_stopdbardbar_tau030000um_M1600_20161': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1600_CTau-30mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20161/260508_182618", 2), + 'mfv_stopdbardbar_tau030000um_M1600_20162': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1600_CTau-30mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_20162/260508_182311", 2), + 'mfv_stopdbardbar_tau030000um_M1600_2017': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1600_CTau-30mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2017/260508_182000", 4), + 'mfv_stopdbardbar_tau030000um_M1600_2018': _fromnum0("/store/group/lpcdisplacedvertices/gdecastr/StopStopbarTo2Dbar2D_M-1600_CTau-30mm_TuneCP5_13TeV-pythia8/Ntuple_tag001BvetoLHTm_highM_2018/260508_181641", 4), +}) _add_ds("NtupleLepton_SF_corrections_trkineffLepm", { @@ -4329,6 +4469,7 @@ def who(name, ds): }) + ################################################################################ if __name__ == '__main__': diff --git a/Tools/python/Samples.py b/Tools/python/Samples.py index 5b7102e23..745054da2 100644 --- a/Tools/python/Samples.py +++ b/Tools/python/Samples.py @@ -82,7 +82,7 @@ def _set_signal_stuff(sample): sample.mass = _mass(sample) sample.latex = _latex(sample) #sample.xsec = 1e-3 - br_h_llps = 1.0 + br_h_llps = 0.01 if (sample.name.startswith('WplusH')): sample.xsec = 3*(9.426e-02)*br_h_llps# Higgs 125, once for each lepton flavor - https://twiki.cern.ch/twiki/bin/view/LHCPhysics/CERNYellowReportPageAt13TeV#WHlH_l_e_or_Process elif (sample.name.startswith('WminusH')): @@ -621,7 +621,7 @@ def _set_signal_stuff(sample): #MCSample('ggZHToSSTodddd_tau1000mm_M55_20161', '/ggZH_HToSSTodddd_ZToLL_MH-125_MS-55_ctauS-1000_TuneCP5_13TeV-powheg-pythia8/RunIISummer20UL16MiniAODAPVv2-106X_mcRun2_asymptotic_preVFP_v11-v2/MINIAODSIM', 24999), ] -all_bjet_signal_samples_20161 = mfv_signal_samples_20161 + mfv_stopdbardbar_samples_20161 + mfv_stopbbarbbar_samples_20161 + ggHToSSTodddd_samples_20161 + ttHToLLPs_bbbb_samples_20161 + ttHToLLPs_dddd_samples_20161 +all_bjet_signal_samples_20161 = mfv_signal_samples_20161 + mfv_stopdbardbar_samples_20161 + mfv_stopbbarbbar_samples_20161 + ggHToSSTodddd_samples_20161 + ttHToLLPs_bbbb_samples_20161 + ttHToLLPs_dddd_samples_20161 + mfv_signal_highM_samples_20161 + mfv_stopdbardbar_highM_samples_20161 + mfv_stopbbarbbar_highM_samples_20161 all_lep_signal_samples_20161 = ZHToSSTodddd_samples_20161 + WplusHToSSTodddd_samples_20161 + WminusHToSSTodddd_samples_20161 + ttHToLLPs_bbbb_samples_20161 + ttHToLLPs_dddd_samples_20161 + ggZHToSSTobbbb_samples_20161 + ggZHToSSTodddd_samples_20161 all_signal_samples_20161 = list(set(all_bjet_signal_samples_20161 + all_lep_signal_samples_20161)) # the list and set are needed to get the unique entries, to avoid double counting later on @@ -1139,7 +1139,7 @@ def _set_signal_stuff(sample): #MCSample('ggZHToSSTodddd_tau1000mm_M55_20162', '/ggZH_HToSSTodddd_ZToLL_MH-125_MS-55_ctauS-1000_TuneCP5_13TeV-powheg-pythia8/RunIISummer20UL16MiniAODv2-106X_mcRun2_asymptotic_v17-v2/MINIAODSIM', 25000), ] -all_bjet_signal_samples_20162 = mfv_signal_samples_20162 + mfv_stopdbardbar_samples_20162 + mfv_stopbbarbbar_samples_20162 + ggHToSSTodddd_samples_20162 + ttHToLLPs_bbbb_samples_20162 + ttHToLLPs_dddd_samples_20162 +all_bjet_signal_samples_20162 = mfv_signal_samples_20162 + mfv_stopdbardbar_samples_20162 + mfv_stopbbarbbar_samples_20162 + ggHToSSTodddd_samples_20162 + ttHToLLPs_bbbb_samples_20162 + ttHToLLPs_dddd_samples_20162 + mfv_signal_highM_samples_20162 + mfv_stopdbardbar_highM_samples_20162 + mfv_stopbbarbbar_highM_samples_20162 all_lep_signal_samples_20162 = ZHToSSTodddd_samples_20162 + WplusHToSSTodddd_samples_20162 + WminusHToSSTodddd_samples_20162 + ttHToLLPs_bbbb_samples_20162 + ttHToLLPs_dddd_samples_20162 + ggZHToSSTobbbb_samples_20162 + ggZHToSSTodddd_samples_20162 all_signal_samples_20162 = list(set(all_bjet_signal_samples_20162 + all_lep_signal_samples_20162)) # the list and set are needed to get the unique entries, to avoid double counting later on @@ -1763,7 +1763,7 @@ def _set_signal_stuff(sample): #MCSample('ggZHToSSTodddd_tau1000mm_M55_2017', '/ggZH_HToSSTodddd_ZToLL_MH-125_MS-55_ctauS-1000_TuneCP5_13TeV-powheg-pythia8/RunIISummer20UL17MiniAODv2-106X_mc2017_realistic_v9-v2/MINIAODSIM', 49999), ] -all_bjet_signal_samples_2017 = mfv_signal_samples_2017 + mfv_stopdbardbar_samples_2017 + mfv_stopbbarbbar_samples_2017 + ggHToSSTodddd_samples_2017 + ttHToLLPs_bbbb_samples_2017 + ttHToLLPs_dddd_samples_2017 +all_bjet_signal_samples_2017 = mfv_signal_samples_2017 + mfv_stopdbardbar_samples_2017 + mfv_stopbbarbbar_samples_2017 + ggHToSSTodddd_samples_2017 + ttHToLLPs_bbbb_samples_2017 + ttHToLLPs_dddd_samples_2017 + mfv_signal_highM_samples_2017 + mfv_stopdbardbar_highM_samples_2017 + mfv_stopbbarbbar_highM_samples_2017 all_lep_signal_samples_2017 = ZHToSSTodddd_samples_2017 + WplusHToSSTodddd_samples_2017 + WminusHToSSTodddd_samples_2017 + ttHToLLPs_bbbb_samples_2017 + ttHToLLPs_dddd_samples_2017 + ggZHToSSTobbbb_samples_2017 + ggZHToSSTodddd_samples_2017 all_signal_samples_2017 = list(set(all_bjet_signal_samples_2017 + all_lep_signal_samples_2017)) # the list and set are needed to get the unique entries, to avoid double counting later on @@ -2323,7 +2323,7 @@ def _set_signal_stuff(sample): #MCSample('ggZHToSSTodddd_tau1000mm_M55_2018', '/ggZH_HToSSTodddd_ZToLL_MH-125_MS-55_ctauS-1000_TuneCP5_13TeV-powheg-pythia8/RunIISummer20UL18MiniAODv2-106X_upgrade2018_realistic_v16_L1v1-v2/MINIAODSIM', 50000), ] -all_bjet_signal_samples_2018 = mfv_signal_samples_2018 + mfv_stopdbardbar_samples_2018 + mfv_stopbbarbbar_samples_2018 + ggHToSSTodddd_samples_2018 + ttHToLLPs_bbbb_samples_2018 + ttHToLLPs_dddd_samples_2018 +all_bjet_signal_samples_2018 = mfv_signal_samples_2018 + mfv_stopdbardbar_samples_2018 + mfv_stopbbarbbar_samples_2018 + ggHToSSTodddd_samples_2018 + ttHToLLPs_bbbb_samples_2018 + ttHToLLPs_dddd_samples_2018 + mfv_signal_highM_samples_2018 + mfv_stopdbardbar_highM_samples_2018 + mfv_stopbbarbbar_highM_samples_2018 all_lep_signal_samples_2018 = ZHToSSTodddd_samples_2018 + WplusHToSSTodddd_samples_2018 + WminusHToSSTodddd_samples_2018 + ttHToLLPs_bbbb_samples_2018 + ttHToLLPs_dddd_samples_2018 + ggZHToSSTobbbb_samples_2018 + ggZHToSSTodddd_samples_2018 all_signal_samples_2018 = list(set(all_bjet_signal_samples_2018 + all_lep_signal_samples_2018)) # the list and set are needed to get the unique entries, to avoid double counting later on @@ -2758,6 +2758,11 @@ def _set_signal_stuff(sample): sample.add_dataset('miniaod', sample.dataset, sample.nevents_orig) for sample in mfv_signal_samples_2018 + mfv_stopdbardbar_samples_2018 + mfv_stopbbarbbar_samples_2018: sample.add_dataset('miniaod', sample.dataset, sample.nevents_orig) +for sample in (mfv_signal_highM_samples_20161 + mfv_stopdbardbar_highM_samples_20161 + mfv_stopbbarbbar_highM_samples_20161 + + mfv_signal_highM_samples_20162 + mfv_stopdbardbar_highM_samples_20162 + mfv_stopbbarbbar_highM_samples_20162 + + mfv_signal_highM_samples_2017 + mfv_stopdbardbar_highM_samples_2017 + mfv_stopbbarbbar_highM_samples_2017 + + mfv_signal_highM_samples_2018 + mfv_stopdbardbar_highM_samples_2018 + mfv_stopbbarbbar_highM_samples_2018): + sample.add_dataset('miniaod', sample.dataset, sample.nevents_orig) for sample in mfv_stoplb_samples_20161 : sample.add_dataset('miniaod', sample.dataset, sample.nevents_orig) for sample in mfv_stopld_samples_20161 : @@ -2813,6 +2818,20 @@ def _set_signal_stuff(sample): for x in qcdht0100_20161, qcdht0200_20161, qcdht0300_20161, qcdht0500_20161, qcdht0700_20161, qcdht1000_20161, qcdht1500_20161, qcdht2000_20161, ttbar_20161, mfv_neu_tau000100um_M0200_20161, mfv_neu_tau000300um_M0200_20161, mfv_neu_tau001000um_M0200_20161, mfv_neu_tau010000um_M0200_20161, mfv_neu_tau030000um_M0200_20161, mfv_neu_tau000100um_M0300_20161, mfv_neu_tau000300um_M0300_20161, mfv_neu_tau001000um_M0300_20161, mfv_neu_tau010000um_M0300_20161, mfv_neu_tau030000um_M0300_20161, mfv_neu_tau000100um_M0400_20161, mfv_neu_tau000300um_M0400_20161, mfv_neu_tau001000um_M0400_20161, mfv_neu_tau010000um_M0400_20161, mfv_neu_tau030000um_M0400_20161, mfv_neu_tau000100um_M0600_20161, mfv_neu_tau000300um_M0600_20161, mfv_neu_tau001000um_M0600_20161, mfv_neu_tau010000um_M0600_20161, mfv_neu_tau030000um_M0600_20161, mfv_neu_tau000100um_M0800_20161, mfv_neu_tau000300um_M0800_20161, mfv_neu_tau001000um_M0800_20161, mfv_neu_tau010000um_M0800_20161, mfv_neu_tau030000um_M0800_20161, mfv_stopdbardbar_tau000100um_M0200_20161, mfv_stopdbardbar_tau000300um_M0200_20161, mfv_stopdbardbar_tau001000um_M0200_20161, mfv_stopdbardbar_tau010000um_M0200_20161, mfv_stopdbardbar_tau030000um_M0200_20161, mfv_stopdbardbar_tau000100um_M0300_20161, mfv_stopdbardbar_tau000300um_M0300_20161, mfv_stopdbardbar_tau001000um_M0300_20161, mfv_stopdbardbar_tau010000um_M0300_20161, mfv_stopdbardbar_tau030000um_M0300_20161, mfv_stopdbardbar_tau000100um_M0400_20161, mfv_stopdbardbar_tau000300um_M0400_20161, mfv_stopdbardbar_tau001000um_M0400_20161, mfv_stopdbardbar_tau010000um_M0400_20161, mfv_stopdbardbar_tau030000um_M0400_20161, mfv_stopdbardbar_tau000100um_M0600_20161, mfv_stopdbardbar_tau000300um_M0600_20161, mfv_stopdbardbar_tau001000um_M0600_20161, mfv_stopdbardbar_tau010000um_M0600_20161, mfv_stopdbardbar_tau030000um_M0600_20161, mfv_stopdbardbar_tau000100um_M0800_20161, mfv_stopdbardbar_tau000300um_M0800_20161, mfv_stopdbardbar_tau001000um_M0800_20161, mfv_stopdbardbar_tau010000um_M0800_20161, mfv_stopdbardbar_tau030000um_M0800_20161, mfv_stopbbarbbar_tau000100um_M0200_20161, mfv_stopbbarbbar_tau000300um_M0200_20161, mfv_stopbbarbbar_tau001000um_M0200_20161, mfv_stopbbarbbar_tau010000um_M0200_20161, mfv_stopbbarbbar_tau030000um_M0200_20161, mfv_stopbbarbbar_tau000100um_M0300_20161, mfv_stopbbarbbar_tau000300um_M0300_20161, mfv_stopbbarbbar_tau001000um_M0300_20161, mfv_stopbbarbbar_tau010000um_M0300_20161, mfv_stopbbarbbar_tau030000um_M0300_20161, mfv_stopbbarbbar_tau000100um_M0400_20161, mfv_stopbbarbbar_tau000300um_M0400_20161, mfv_stopbbarbbar_tau001000um_M0400_20161, mfv_stopbbarbbar_tau010000um_M0400_20161, mfv_stopbbarbbar_tau030000um_M0400_20161, mfv_stopbbarbbar_tau000100um_M0600_20161, mfv_stopbbarbbar_tau000300um_M0600_20161, mfv_stopbbarbbar_tau001000um_M0600_20161, mfv_stopbbarbbar_tau010000um_M0600_20161, mfv_stopbbarbbar_tau030000um_M0600_20161, mfv_stopbbarbbar_tau000100um_M0800_20161, mfv_stopbbarbbar_tau000300um_M0800_20161, mfv_stopbbarbbar_tau001000um_M0800_20161, mfv_stopbbarbbar_tau010000um_M0800_20161, mfv_stopbbarbbar_tau030000um_M0800_20161, ggHToSSTodddd_tau100um_M15_20161, ggHToSSTodddd_tau1mm_M15_20161, ggHToSSTodddd_tau10mm_M15_20161, ggHToSSTodddd_tau100mm_M15_20161, ggHToSSTodddd_tau100um_M40_20161, ggHToSSTodddd_tau1mm_M40_20161, ggHToSSTodddd_tau10mm_M40_20161, ggHToSSTodddd_tau100mm_M40_20161, ggHToSSTodddd_tau100um_M55_20161, ggHToSSTodddd_tau1mm_M55_20161, ggHToSSTodddd_tau10mm_M55_20161, ggHToSSTodddd_tau100mm_M55_20161, qcdht0100_20162, qcdht0200_20162, qcdht0300_20162, qcdht0500_20162, qcdht0700_20162, qcdht1000_20162, qcdht1500_20162, qcdht2000_20162, ttbar_20162, mfv_neu_tau000100um_M0200_20162, mfv_neu_tau000300um_M0200_20162, mfv_neu_tau001000um_M0200_20162, mfv_neu_tau010000um_M0200_20162, mfv_neu_tau030000um_M0200_20162, mfv_neu_tau000100um_M0300_20162, mfv_neu_tau000300um_M0300_20162, mfv_neu_tau001000um_M0300_20162, mfv_neu_tau010000um_M0300_20162, mfv_neu_tau030000um_M0300_20162, mfv_neu_tau000100um_M0400_20162, mfv_neu_tau000300um_M0400_20162, mfv_neu_tau001000um_M0400_20162, mfv_neu_tau010000um_M0400_20162, mfv_neu_tau030000um_M0400_20162, mfv_neu_tau000100um_M0600_20162, mfv_neu_tau000300um_M0600_20162, mfv_neu_tau001000um_M0600_20162, mfv_neu_tau010000um_M0600_20162, mfv_neu_tau030000um_M0600_20162, mfv_neu_tau000100um_M0800_20162, mfv_neu_tau000300um_M0800_20162, mfv_neu_tau001000um_M0800_20162, mfv_neu_tau010000um_M0800_20162, mfv_neu_tau030000um_M0800_20162, mfv_stopdbardbar_tau000100um_M0200_20162, mfv_stopdbardbar_tau000300um_M0200_20162, mfv_stopdbardbar_tau001000um_M0200_20162, mfv_stopdbardbar_tau010000um_M0200_20162, mfv_stopdbardbar_tau030000um_M0200_20162, mfv_stopdbardbar_tau000100um_M0300_20162, mfv_stopdbardbar_tau000300um_M0300_20162, mfv_stopdbardbar_tau001000um_M0300_20162, mfv_stopdbardbar_tau010000um_M0300_20162, mfv_stopdbardbar_tau030000um_M0300_20162, mfv_stopdbardbar_tau000100um_M0400_20162, mfv_stopdbardbar_tau000300um_M0400_20162, mfv_stopdbardbar_tau001000um_M0400_20162, mfv_stopdbardbar_tau010000um_M0400_20162, mfv_stopdbardbar_tau030000um_M0400_20162, mfv_stopdbardbar_tau000100um_M0600_20162, mfv_stopdbardbar_tau000300um_M0600_20162, mfv_stopdbardbar_tau001000um_M0600_20162, mfv_stopdbardbar_tau010000um_M0600_20162, mfv_stopdbardbar_tau030000um_M0600_20162, mfv_stopdbardbar_tau000100um_M0800_20162, mfv_stopdbardbar_tau000300um_M0800_20162, mfv_stopdbardbar_tau001000um_M0800_20162, mfv_stopdbardbar_tau010000um_M0800_20162, mfv_stopdbardbar_tau030000um_M0800_20162, mfv_stopbbarbbar_tau000100um_M0200_20162, mfv_stopbbarbbar_tau000300um_M0200_20162, mfv_stopbbarbbar_tau001000um_M0200_20162, mfv_stopbbarbbar_tau010000um_M0200_20162, mfv_stopbbarbbar_tau030000um_M0200_20162, mfv_stopbbarbbar_tau000100um_M0300_20162, mfv_stopbbarbbar_tau000300um_M0300_20162, mfv_stopbbarbbar_tau001000um_M0300_20162, mfv_stopbbarbbar_tau010000um_M0300_20162, mfv_stopbbarbbar_tau030000um_M0300_20162, mfv_stopbbarbbar_tau000100um_M0400_20162, mfv_stopbbarbbar_tau000300um_M0400_20162, mfv_stopbbarbbar_tau001000um_M0400_20162, mfv_stopbbarbbar_tau010000um_M0400_20162, mfv_stopbbarbbar_tau030000um_M0400_20162, mfv_stopbbarbbar_tau000100um_M0600_20162, mfv_stopbbarbbar_tau000300um_M0600_20162, mfv_stopbbarbbar_tau001000um_M0600_20162, mfv_stopbbarbbar_tau010000um_M0600_20162, mfv_stopbbarbbar_tau030000um_M0600_20162, mfv_stopbbarbbar_tau000100um_M0800_20162, mfv_stopbbarbbar_tau000300um_M0800_20162, mfv_stopbbarbbar_tau001000um_M0800_20162, mfv_stopbbarbbar_tau010000um_M0800_20162, mfv_stopbbarbbar_tau030000um_M0800_20162, ggHToSSTodddd_tau100um_M15_20162, ggHToSSTodddd_tau1mm_M15_20162, ggHToSSTodddd_tau10mm_M15_20162, ggHToSSTodddd_tau100mm_M15_20162, ggHToSSTodddd_tau100um_M40_20162, ggHToSSTodddd_tau1mm_M40_20162, ggHToSSTodddd_tau10mm_M40_20162, ggHToSSTodddd_tau100mm_M40_20162, ggHToSSTodddd_tau100um_M55_20162, ggHToSSTodddd_tau1mm_M55_20162, ggHToSSTodddd_tau10mm_M55_20162, ggHToSSTodddd_tau100mm_M55_20162, qcdht0200_2017, qcdht0300_2017, qcdht0500_2017, qcdht0700_2017, qcdht1000_2017, qcdht1500_2017, qcdht2000_2017, ttbar_2017, mfv_neu_tau000100um_M0200_2017, mfv_neu_tau000300um_M0200_2017, mfv_neu_tau001000um_M0200_2017, mfv_neu_tau010000um_M0200_2017, mfv_neu_tau030000um_M0200_2017, mfv_neu_tau000100um_M0300_2017, mfv_neu_tau000300um_M0300_2017, mfv_neu_tau001000um_M0300_2017, mfv_neu_tau010000um_M0300_2017, mfv_neu_tau030000um_M0300_2017, mfv_neu_tau000100um_M0400_2017, mfv_neu_tau000300um_M0400_2017, mfv_neu_tau001000um_M0400_2017, mfv_neu_tau010000um_M0400_2017, mfv_neu_tau030000um_M0400_2017, mfv_neu_tau000100um_M0600_2017, mfv_neu_tau000300um_M0600_2017, mfv_neu_tau001000um_M0600_2017, mfv_neu_tau010000um_M0600_2017, mfv_neu_tau030000um_M0600_2017, mfv_neu_tau000100um_M0800_2017, mfv_neu_tau000300um_M0800_2017, mfv_neu_tau001000um_M0800_2017, mfv_neu_tau010000um_M0800_2017, mfv_neu_tau030000um_M0800_2017, mfv_stopdbardbar_tau000100um_M0200_2017, mfv_stopdbardbar_tau000300um_M0200_2017, mfv_stopdbardbar_tau001000um_M0200_2017, mfv_stopdbardbar_tau010000um_M0200_2017, mfv_stopdbardbar_tau030000um_M0200_2017, mfv_stopdbardbar_tau000100um_M0300_2017, mfv_stopdbardbar_tau000300um_M0300_2017, mfv_stopdbardbar_tau001000um_M0300_2017, mfv_stopdbardbar_tau010000um_M0300_2017, mfv_stopdbardbar_tau030000um_M0300_2017, mfv_stopdbardbar_tau000100um_M0400_2017, mfv_stopdbardbar_tau000300um_M0400_2017, mfv_stopdbardbar_tau001000um_M0400_2017, mfv_stopdbardbar_tau010000um_M0400_2017, mfv_stopdbardbar_tau030000um_M0400_2017, mfv_stopdbardbar_tau000100um_M0600_2017, mfv_stopdbardbar_tau000300um_M0600_2017, mfv_stopdbardbar_tau001000um_M0600_2017, mfv_stopdbardbar_tau010000um_M0600_2017, mfv_stopdbardbar_tau030000um_M0600_2017, mfv_stopdbardbar_tau000100um_M0800_2017, mfv_stopdbardbar_tau000300um_M0800_2017, mfv_stopdbardbar_tau001000um_M0800_2017, mfv_stopdbardbar_tau010000um_M0800_2017, mfv_stopdbardbar_tau030000um_M0800_2017, mfv_stopbbarbbar_tau000100um_M0200_2017, mfv_stopbbarbbar_tau000300um_M0200_2017, mfv_stopbbarbbar_tau001000um_M0200_2017, mfv_stopbbarbbar_tau010000um_M0200_2017, mfv_stopbbarbbar_tau030000um_M0200_2017, mfv_stopbbarbbar_tau000100um_M0300_2017, mfv_stopbbarbbar_tau000300um_M0300_2017, mfv_stopbbarbbar_tau001000um_M0300_2017, mfv_stopbbarbbar_tau010000um_M0300_2017, mfv_stopbbarbbar_tau030000um_M0300_2017, mfv_stopbbarbbar_tau000100um_M0400_2017, mfv_stopbbarbbar_tau000300um_M0400_2017, mfv_stopbbarbbar_tau001000um_M0400_2017, mfv_stopbbarbbar_tau010000um_M0400_2017, mfv_stopbbarbbar_tau030000um_M0400_2017, mfv_stopbbarbbar_tau000100um_M0600_2017, mfv_stopbbarbbar_tau000300um_M0600_2017, mfv_stopbbarbbar_tau001000um_M0600_2017, mfv_stopbbarbbar_tau010000um_M0600_2017, mfv_stopbbarbbar_tau030000um_M0600_2017, mfv_stopbbarbbar_tau000100um_M0800_2017, mfv_stopbbarbbar_tau000300um_M0800_2017, mfv_stopbbarbbar_tau001000um_M0800_2017, mfv_stopbbarbbar_tau010000um_M0800_2017, mfv_stopbbarbbar_tau030000um_M0800_2017, ggHToSSTodddd_tau100um_M15_2017, ggHToSSTodddd_tau1mm_M15_2017, ggHToSSTodddd_tau10mm_M15_2017, ggHToSSTodddd_tau100mm_M15_2017, ggHToSSTodddd_tau100um_M40_2017, ggHToSSTodddd_tau1mm_M40_2017, ggHToSSTodddd_tau10mm_M40_2017, ggHToSSTodddd_tau100mm_M40_2017, ggHToSSTodddd_tau100um_M55_2017, ggHToSSTodddd_tau1mm_M55_2017, ggHToSSTodddd_tau10mm_M55_2017, ggHToSSTodddd_tau100mm_M55_2017, qcdht0200_2018, qcdht0300_2018, qcdht0500_2018, qcdht0700_2018, qcdht1000_2018, qcdht1500_2018, qcdht2000_2018, ttbar_2018, mfv_neu_tau000100um_M0200_2018, mfv_neu_tau000300um_M0200_2018, mfv_neu_tau001000um_M0200_2018, mfv_neu_tau010000um_M0200_2018, mfv_neu_tau030000um_M0200_2018, mfv_neu_tau000100um_M0300_2018, mfv_neu_tau000300um_M0300_2018, mfv_neu_tau001000um_M0300_2018, mfv_neu_tau010000um_M0300_2018, mfv_neu_tau030000um_M0300_2018, mfv_neu_tau000100um_M0400_2018, mfv_neu_tau000300um_M0400_2018, mfv_neu_tau001000um_M0400_2018, mfv_neu_tau010000um_M0400_2018, mfv_neu_tau030000um_M0400_2018, mfv_neu_tau000100um_M0600_2018, mfv_neu_tau001000um_M0600_2018, mfv_neu_tau000300um_M0600_2018, mfv_neu_tau010000um_M0600_2018, mfv_neu_tau030000um_M0600_2018, mfv_neu_tau000100um_M0800_2018, mfv_neu_tau000300um_M0800_2018, mfv_neu_tau001000um_M0800_2018, mfv_neu_tau010000um_M0800_2018, mfv_neu_tau030000um_M0800_2018, mfv_stopdbardbar_tau000100um_M0200_2018, mfv_stopdbardbar_tau000300um_M0200_2018, mfv_stopdbardbar_tau001000um_M0200_2018, mfv_stopdbardbar_tau010000um_M0200_2018, mfv_stopdbardbar_tau030000um_M0200_2018, mfv_stopdbardbar_tau000100um_M0300_2018, mfv_stopdbardbar_tau000300um_M0300_2018, mfv_stopdbardbar_tau001000um_M0300_2018, mfv_stopdbardbar_tau010000um_M0300_2018, mfv_stopdbardbar_tau030000um_M0300_2018, mfv_stopdbardbar_tau000100um_M0400_2018, mfv_stopdbardbar_tau000300um_M0400_2018, mfv_stopdbardbar_tau001000um_M0400_2018, mfv_stopdbardbar_tau010000um_M0400_2018, mfv_stopdbardbar_tau030000um_M0400_2018, mfv_stopdbardbar_tau000100um_M0600_2018, mfv_stopdbardbar_tau000300um_M0600_2018, mfv_stopdbardbar_tau001000um_M0600_2018, mfv_stopdbardbar_tau010000um_M0600_2018, mfv_stopdbardbar_tau030000um_M0600_2018, mfv_stopdbardbar_tau000100um_M0800_2018, mfv_stopdbardbar_tau000300um_M0800_2018, mfv_stopdbardbar_tau001000um_M0800_2018, mfv_stopdbardbar_tau010000um_M0800_2018, mfv_stopdbardbar_tau030000um_M0800_2018, mfv_stopbbarbbar_tau000100um_M0200_2018, mfv_stopbbarbbar_tau000300um_M0200_2018, mfv_stopbbarbbar_tau001000um_M0200_2018, mfv_stopbbarbbar_tau010000um_M0200_2018, mfv_stopbbarbbar_tau030000um_M0200_2018, mfv_stopbbarbbar_tau000100um_M0300_2018, mfv_stopbbarbbar_tau000300um_M0300_2018, mfv_stopbbarbbar_tau001000um_M0300_2018, mfv_stopbbarbbar_tau010000um_M0300_2018, mfv_stopbbarbbar_tau030000um_M0300_2018, mfv_stopbbarbbar_tau000100um_M0400_2018, mfv_stopbbarbbar_tau000300um_M0400_2018, mfv_stopbbarbbar_tau001000um_M0400_2018, mfv_stopbbarbbar_tau010000um_M0400_2018, mfv_stopbbarbbar_tau030000um_M0400_2018, mfv_stopbbarbbar_tau000100um_M0600_2018, mfv_stopbbarbbar_tau000300um_M0600_2018, mfv_stopbbarbbar_tau001000um_M0600_2018, mfv_stopbbarbbar_tau010000um_M0600_2018, mfv_stopbbarbbar_tau030000um_M0600_2018, mfv_stopbbarbbar_tau000100um_M0800_2018, mfv_stopbbarbbar_tau000300um_M0800_2018, mfv_stopbbarbbar_tau001000um_M0800_2018, mfv_stopbbarbbar_tau010000um_M0800_2018, mfv_stopbbarbbar_tau030000um_M0800_2018, ggHToSSTodddd_tau100um_M15_2018, ggHToSSTodddd_tau1mm_M15_2018, ggHToSSTodddd_tau10mm_M15_2018, ggHToSSTodddd_tau100mm_M15_2018, ggHToSSTodddd_tau100um_M40_2018, ggHToSSTodddd_tau1mm_M40_2018, ggHToSSTodddd_tau10mm_M40_2018, ggHToSSTodddd_tau100mm_M40_2018, ggHToSSTodddd_tau100um_M55_2018, ggHToSSTodddd_tau1mm_M55_2018, ggHToSSTodddd_tau10mm_M55_2018, ggHToSSTodddd_tau100mm_M55_2018, ttHToLLPs_bbbb_tau10mm_M55_20161, ttHToLLPs_dddd_tau10mm_M55_20161, ttHToLLPs_bbbb_tau10mm_M55_20162, ttHToLLPs_dddd_tau10mm_M55_20162, ttHToLLPs_bbbb_tau10mm_M55_2017, ttHToLLPs_dddd_tau10mm_M55_2017, ttHToLLPs_bbbb_tau10mm_M55_2018, ttHToLLPs_dddd_tau10mm_M55_2018: x.add_dataset("ntuple_tag001bvetolhtm") +for x in (mfv_signal_highM_samples_20161 + mfv_stopdbardbar_highM_samples_20161 + mfv_stopbbarbbar_highM_samples_20161 + + mfv_signal_highM_samples_20162 + mfv_stopdbardbar_highM_samples_20162 + mfv_stopbbarbbar_highM_samples_20162 + + mfv_signal_highM_samples_2017 + mfv_stopdbardbar_highM_samples_2017 + mfv_stopbbarbbar_highM_samples_2017 + + mfv_signal_highM_samples_2018 + mfv_stopdbardbar_highM_samples_2018 + mfv_stopbbarbbar_highM_samples_2018): + x.add_dataset("ntuple_tag001bvetolhtm") + +import JMTucker.Tools.SampleFiles as _SFmod +for x in (mfv_signal_highM_samples_20161 + mfv_stopdbardbar_highM_samples_20161 + mfv_stopbbarbbar_highM_samples_20161 + + mfv_signal_highM_samples_20162 + mfv_stopdbardbar_highM_samples_20162 + mfv_stopbbarbbar_highM_samples_20162 + + mfv_signal_highM_samples_2017 + mfv_stopdbardbar_highM_samples_2017 + mfv_stopbbarbbar_highM_samples_2017 + + mfv_signal_highM_samples_2018 + mfv_stopdbardbar_highM_samples_2018 + mfv_stopbbarbbar_highM_samples_2018): + if _SFmod.get(x.name, "ntuple_tag001bvetolhtm_highM") is not None: + x.add_dataset("ntuple_tag001bvetolhtm_highM") + #for x in all_signal_samples_20161 + all_signal_samples_20162 + all_signal_samples_2017 + all_signal_samples_2018: #for x in ggHToSSTodddd_tau1mm_M55_20161, mfv_neu_tau001000um_M0400_20161, mfv_stopdbardbar_tau001000um_M0200_20161, mfv_stopdbardbar_tau000300um_M0400_20161, ggHToSSTodddd_tau1mm_M55_20162, mfv_neu_tau001000um_M0400_20162, mfv_stopdbardbar_tau001000um_M0200_20162, mfv_stopdbardbar_tau000300um_M0400_20162, ggHToSSTodddd_tau1mm_M55_2017, mfv_neu_tau001000um_M0400_2017, mfv_stopdbardbar_tau001000um_M0200_2017, mfv_stopdbardbar_tau000300um_M0400_2017, ggHToSSTodddd_tau1mm_M55_2018, mfv_neu_tau001000um_M0400_2018, mfv_stopdbardbar_tau001000um_M0200_2018, mfv_stopdbardbar_tau000300um_M0400_2018 From 34de65647459e2a9c7b2defc4a3c345c4fa98110 Mon Sep 17 00:00:00 2001 From: Gianfranco de Castro Date: Thu, 14 May 2026 13:35:39 -0500 Subject: [PATCH 02/15] Remove binary/output files and MiniTree scripts; add make_combine_tarball.sh; fix submitCombine to workspace approach - Untrack pkl, png, pdf output files (now covered by .gitignore) - Untrack MiniTree submission scripts not intended for this PR - Add make_combine_tarball.sh for one-time Combine environment setup - Update submitCombine.py: pre-convert datacards to RooStats workspaces locally so worker nodes run combine in pure C++ without NFS access --- MFVNeutralino/test/.gitignore | 3 + .../BinningStudy/background_templates.pdf | Bin 26135 -> 0 bytes .../BinningStudy/background_templates.png | Bin 98993 -> 0 bytes .../pickle_ggHToSSTodddd.pkl | 163 ------- .../NuisTabStore_7p4p1/pickle_mfv_neu.pkl | 163 ------- .../pickle_mfv_stopbbarbbar.pkl | 163 ------- .../pickle_mfv_stopdbardbar.pkl | 163 ------- .../NuisTabStore_TrkMvr/pickle_VH.pkl | 125 ------ .../pickle_ggHToSSTodddd.pkl | 125 ------ .../NuisTabStore_TrkMvr/pickle_mfv_neu.pkl | 125 ------ .../pickle_mfv_stopbbarbbar.pkl | 125 ------ .../pickle_mfv_stopdbardbar.pkl | 125 ------ .../NuisTabStore_TrkRec/ct_pickle_VH.pkl | 167 -------- .../NuisTabStore_TrkRec/dn_pickle_VH.pkl | 167 -------- .../NuisTabStore_TrkRec/up_pickle_VH.pkl | 167 -------- .../test/ForLimits/make_combine_tarball.sh | 50 +++ MFVNeutralino/test/ForLimits/submitCombine.py | 118 +++-- .../test/MiniTree/studyNewTriggers.cc | 293 ------------- MFVNeutralino/test/histosLepSF.py | 85 ---- MFVNeutralino/test/minitree_signal_VH.py | 75 ---- MFVNeutralino/test/minitree_signal_bjet.py | 76 ---- .../test/minitree_signal_bjet_highM.py | 64 --- MFVNeutralino/test/ntuple_highM.py | 56 --- .../test/submit_highM_minitrees_allyears.sh | 53 --- .../test/submit_leptrigsf_allyears.sh | 44 -- .../test/submit_signal_minitrees_allyears.sh | 69 --- MFVNeutralino/test/utilities_MCPartial.py | 405 ------------------ 27 files changed, 137 insertions(+), 3032 deletions(-) delete mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/background_templates.pdf delete mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/background_templates.png delete mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_ggHToSSTodddd.pkl delete mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_neu.pkl delete mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_stopbbarbbar.pkl delete mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_stopdbardbar.pkl delete mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_VH.pkl delete mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_ggHToSSTodddd.pkl delete mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_neu.pkl delete mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_stopbbarbbar.pkl delete mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_stopdbardbar.pkl delete mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/ct_pickle_VH.pkl delete mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/dn_pickle_VH.pkl delete mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/up_pickle_VH.pkl create mode 100644 MFVNeutralino/test/ForLimits/make_combine_tarball.sh delete mode 100644 MFVNeutralino/test/MiniTree/studyNewTriggers.cc delete mode 100644 MFVNeutralino/test/histosLepSF.py delete mode 100644 MFVNeutralino/test/minitree_signal_VH.py delete mode 100644 MFVNeutralino/test/minitree_signal_bjet.py delete mode 100644 MFVNeutralino/test/minitree_signal_bjet_highM.py delete mode 100644 MFVNeutralino/test/ntuple_highM.py delete mode 100644 MFVNeutralino/test/submit_highM_minitrees_allyears.sh delete mode 100755 MFVNeutralino/test/submit_leptrigsf_allyears.sh delete mode 100755 MFVNeutralino/test/submit_signal_minitrees_allyears.sh delete mode 100755 MFVNeutralino/test/utilities_MCPartial.py diff --git a/MFVNeutralino/test/.gitignore b/MFVNeutralino/test/.gitignore index f94ebdfdb..c8ebb1f20 100644 --- a/MFVNeutralino/test/.gitignore +++ b/MFVNeutralino/test/.gitignore @@ -1,4 +1,7 @@ *.root +*.pkl +*.png +*.pdf out.* crab crab.cfg diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/background_templates.pdf b/MFVNeutralino/test/ForLimits/BinningStudy/background_templates.pdf deleted file mode 100644 index b39a4185257391a0e1c1105ab65d75e86e677e4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26135 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 diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/background_templates.png b/MFVNeutralino/test/ForLimits/BinningStudy/background_templates.png deleted file mode 100644 index 71426dc6c8285cdfb416b63f5342fecca2eb282b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98993 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\xe8\x99?\xaa\xf1\xd2Mb\x10\x98?Zd;\xdfO\x8d\x97?V}\xae\xb6b\x7f\x99?\x82sF\x94\xf6\x06\x9f?J\x0c\x02+\x87\x16\xa9?\xf2\xb0Pk\x9aw\xac?\xa4p=\n\xd7\xa3\xa0?\x13a\xc3\xd3+e\x99?\x13a\xc3\xd3+e\x99?\xcb\xa1E\xb6\xf3\xfd\x94?\xcb\xa1E\xb6\xf3\xfd\x94?j\xbct\x93\x18\x04\x96?\xa85\xcd;N\xd1\xa1?\xf2\xb0Pk\x9aw\xac?\xd0D\xd8\xf0\xf4J\xa9?\x1c\xeb\xe26\x1a\xc0\x9b?Dio\xf0\x85\xc9\x94?a2U0*\xa9\x93?\xb1\xbf\xec\x9e<,\x94?+\x87\x16\xd9\xce\xf7\x93?Q\xda\x1b|a2\x95?c\xeeZB>\xe8\xa9?EGr\xf9\x0f\xe9\xa7?h\x91\xed|?5\x9e?\xdeq\x8a\x8e\xe4\xf2\x7f?\xfa~j\xbct\x93x?\xed\r\xbe0\x99*x?\xed\r\xbe0\x99*x?Q\xda\x1b|a2\x95?\xff!\xfd\xf6u\xe0\xac?\xd6\xc5m4\x80\xb7\xb0?\xd7\x12\xf2A\xcff\xa5?\t\x1b\x9e^)\xcb\x80?\xc7\xba\xb8\x8d\x06\xf0v?\xa1g\xb3\xeas\xb5u?\xa1g\xb3\xeas\xb5u?\xd4+e\x19\xe2Xw?' -p38 -tp39 -bsS'x_vals' -p40 -g3 -(g4 -(I0 -tp41 -g6 -tp42 -Rp43 -(I1 -(I5 -tp44 -g13 -I00 -S'\x9a\x99\x99\x99\x99\x99\xb9?333333\xd3?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00>@' -p45 -tp46 -bsg26 -g3 -(g4 -(I0 -tp47 -g6 -tp48 -Rp49 -(I1 -(I5 -I8 -tp50 -g13 -I00 -S'\xa4p=\n\xd7\xa3\xb0?\xc9v\xbe\x9f\x1a/\x9d?\xb3{\xf2\xb0Pk\x9a?\xbaI\x0c\x02+\x87\x96?\xbaI\x0c\x02+\x87\x96?Q\xda\x1b|a2\x95?\x0e\xbe0\x99*\x18\x95?\xfee\xf7\xe4a\xa1\x96?\x18&S\x05\xa3\x92\xaa?aTR\'\xa0\x89\xa0?\x15\x8cJ\xea\x044\xa1?^K\xc8\x07=\x9b\x95?Q\xda\x1b|a2\x95?\xbe0\x99*\x18\x95\x94?\x01M\x84\rO\xaf\x94?\xf1\xf4JY\x868\x96?\x18&S\x05\xa3\x92\xaa?\x1f\xf4lV}\xae\xa6?\x15\x8cJ\xea\x044\xa1?tF\x94\xf6\x06_\x98?\n\xd7\xa3p=\n\x97?j\xbct\x93\x18\x04\x96?\x1b/\xdd$\x06\x81\x95?\xf1\xf4JY\x868\x96?\xd5\th"lx\xaa?+\x87\x16\xd9\xce\xf7\xa3?\xb3{\xf2\xb0Pk\x9a?\t\x1b\x9e^)\xcb\x80?\x13a\xc3\xd3+ey?_\x07\xce\x19Q\xda{?\x82\xe2\xc7\x98\xbb\x96\x80?"\xfd\xf6u\xe0\x9c\x81?vO\x1e\x16jM\xa3?M\xf3\x8eSt$\xa7?X9\xb4\xc8v\xbe\x9f?\xdb\xf9~j\xbct\x83?\x13a\xc3\xd3+ey?_\x07\xce\x19Q\xda{?\xc7\xba\xb8\x8d\x06\xf0v? \xd2o_\x07\xcey?' -p51 -tp52 -bsg27 -g3 -(g4 -(I0 -tp53 -g6 -tp54 -Rp55 -(I1 -(I5 -I8 -tp56 -g13 -I00 -S'{\x14\xaeG\xe1z\x94?\xa1g\xb3\xeas\xb5\x95?Dio\xf0\x85\xc9\x94?\x0e\xbe0\x99*\x18\x95?\x88\x85Z\xd3\xbc\xe3\x94?Dio\xf0\x85\xc9\x94?\x01M\x84\rO\xaf\x94?%u\x02\x9a\x08\x1b\x9e?J\x0c\x02+\x87\x16\x99?\xfa~j\xbct\x93\x98?\n\xd7\xa3p=\n\x97?\xcb\xa1E\xb6\xf3\xfd\x94?\x01M\x84\rO\xaf\x94?\xbe0\x99*\x18\x95\x94?\xbe0\x99*\x18\x95\x94?\xe2X\x17\xb7\xd1\x00\x9e?-C\x1c\xeb\xe26\x9a?\xe0\x9c\x11\xa5\xbd\xc1\x97?\x1b/\xdd$\x06\x81\x95?\xb5\xa6y\xc7):\x92?\x01M\x84\rO\xaf\x94?\x88\x85Z\xd3\xbc\xe3\x94?\x88\x85Z\xd3\xbc\xe3\x94?\x9d\x80&\xc2\x86\xa7\x97?\n\xd7\xa3p=\n\xa7?7\x1a\xc0[ A\xa1?\xc5\x8f1w-!\x8f?lxz\xa5,C|?9\xb4\xc8v\xbe\x9fz? \xd2o_\x07\xcey?\xb8\x1e\x85\xebQ\xb8~?U\xc1\xa8\xa4N@\x83?\x03\t\x8a\x1fc\xee\xaa?\xb3{\xf2\xb0Pk\xaa?\x0e\xbe0\x99*\x18\x95? \xd2o_\x07\xcey?\xed\r\xbe0\x99*x?\xc7\xba\xb8\x8d\x06\xf0v?\xc7\xba\xb8\x8d\x06\xf0v?lxz\xa5,C|?' -p57 -tp58 -bsS'proc' -p59 -S'mfv_neu' -p60 -sg28 -g3 -(g4 -(I0 -tp61 -g6 -tp62 -Rp63 -(I1 -(I5 -I8 -tp64 -g13 -I00 -S'\xbe0\x99*\x18\x95\xa4?333333\xa3?Dio\xf0\x85\xc9\x94?\xe4\x83\x9e\xcd\xaa\xcf\x95?\xfa~j\xbct\x93\x98?\'\xa0\x89\xb0\xe1\xe9\x95?{\x14\xaeG\xe1z\x94?y\xe9&1\x08\xac\x9c?\x84\x9e\xcd\xaa\xcf\xd5\xa6?\xbaI\x0c\x02+\x87\xa6?2\xe6\xae%\xe4\x83\x9e?A\x82\xe2\xc7\x98\xbb\x96?\xae\xd8_vO\x1e\x96?^K\xc8\x07=\x9b\x95?\'\xa0\x89\xb0\xe1\xe9\x95?y\xe9&1\x08\xac\x9c?\x95\xd4\th"l\xb8?\xcc\xee\xc9\xc3B\xad\xb9?\xc1\xca\xa1E\xb6\xf3\xad?\x1e\x16jM\xf3\x8e\xa3?\xef\xc9\xc3B\xadi\x9e?S\x96!\x8euq\x9b?\xc0\xec\x9e<,\xd4\x9a?y\xe9&1\x08\xac\x9c?6<\xbdR\x96!\xc6?\xac\x8b\xdbh\x00o\xc1?\x0b\xb5\xa6y\xc7)\xba?\xdf\xe0\x0b\x93\xa9\x82\xb1?Tt$\x97\xff\x90\xae?EGr\xf9\x0f\xe9\xa7?tF\x94\xf6\x06_\xa8?\x1e\xa7\xe8H.\xff\xb1?\xbct\x93\x18\x04V\xc6?_\x07\xce\x19Q\xda\xc3?\x02\x9a\x08\x1b\x9e^\xb9?t$\x97\xff\x90~\xab?\xd4+e\x19\xe2X\xa7?EGr\xf9\x0f\xe9\xa7?\x93\x18\x04V\x0e-\xa2?\xb1\xbf\xec\x9e<,\xa4?' -p65 -tp66 -bs. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_stopbbarbbar.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_stopbbarbbar.pkl deleted file mode 100644 index 8cbbedfea..000000000 --- a/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_stopbbarbbar.pkl +++ /dev/null @@ -1,163 +0,0 @@ -(dp0 -S'perc' -p1 -I00 -sS'y_vals' -p2 -cnumpy.core.multiarray -_reconstruct -p3 -(cnumpy -ndarray -p4 -(I0 -tp5 -S'b' -p6 -tp7 -Rp8 -(I1 -(I8 -tp9 -cnumpy -dtype -p10 -(S'f8' -p11 -I0 -I1 -tp12 -Rp13 -(I3 -S'<' -p14 -NNNI-1 -I-1 -I0 -tp15 -bI00 -S'\x00\x00\x00\x00\x00\x00i@\x00\x00\x00\x00\x00\xc0r@\x00\x00\x00\x00\x00\x00y@\x00\x00\x00\x00\x00\xc0\x82@\x00\x00\x00\x00\x00\x00\x89@\x00\x00\x00\x00\x00\xc0\x92@\x00\x00\x00\x00\x00\x00\x99@\x00\x00\x00\x00\x00p\xa7@' -p16 -tp17 -bsS'dtype' -p18 -c__builtin__ -float -p19 -sS'x_unit' -p20 -S'mm' -p21 -sS'arr_len' -p22 -I0 -sS'years' -p23 -c__builtin__ -set -p24 -((lp25 -S'2017' -p26 -aS'2016' -p27 -aS'2016APV' -p28 -aS'2018' -p29 -atp30 -Rp31 -sS'y_unit' -p32 -S'GeV' -p33 -sg29 -g3 -(g4 -(I0 -tp34 -g6 -tp35 -Rp36 -(I1 -(I5 -I8 -tp37 -g13 -I00 -S"vq\x1b\r\xe0-\xb0?\xbb'\x0f\x0b\xb5\xa6\xa9?;\xdfO\x8d\x97n\xa2?\xa85\xcd;N\xd1\xa1?\xfd\x87\xf4\xdb\xd7\x81\xa3?(~\x8c\xb9k\t\xa9?\xce\x88\xd2\xde\xe0\x0b\xb3?\xa5,C\x1c\xeb\xe2\xb6?\n\xd7\xa3p=\n\xa7?\xb1\xe1\xe9\x95\xb2\x0c\xa1? \xd2o_\x07\xce\x99?\xed\r\xbe0\x99*\x98?V}\xae\xb6b\x7f\x99?%u\x02\x9a\x08\x1b\x9e?\x9c\xc4 \xb0rh\xa1?\xa9\x13\xd0D\xd8\xf0\xa4?'\xa0\x89\xb0\xe1\xe9\xa5?aTR'\xa0\x89\xa0?Dio\xf0\x85\xc9\x94?\xe8j+\xf6\x97\xdd\x93?\xdf\xe0\x0b\x93\xa9\x82\x91?U\xc1\xa8\xa4N@\x93?Dio\xf0\x85\xc9\x94?\x07\xf0\x16HP\xfc\x98?\xdf\xe0\x0b\x93\xa9\x82\xa1?\xdf\xe0\x0b\x93\xa9\x82\xa1?\xc2\x17&S\x05\xa3\x92?\x9f<,\xd4\x9a\xe6}?\x9f<,\xd4\x9a\xe6}?lxz\xa5,C|?_\x07\xce\x19Q\xda{?F%u\x02\x9a\x08{?\x7f\xd9=yX\xa8\xa5?R\xb8\x1e\x85\xebQ\xa8?\xf6\x97\xdd\x93\x87\x85\x9a?\x9f<,\xd4\x9a\xe6}?y\xe9&1\x08\xac|?\x07\xf0\x16HP\xfcx? \xd2o_\x07\xcey?\xfa~j\xbct\x93x?" -p38 -tp39 -bsS'x_vals' -p40 -g3 -(g4 -(I0 -tp41 -g6 -tp42 -Rp43 -(I1 -(I5 -tp44 -g13 -I00 -S'\x9a\x99\x99\x99\x99\x99\xb9?333333\xd3?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00>@' -p45 -tp46 -bsg26 -g3 -(g4 -(I0 -tp47 -g6 -tp48 -Rp49 -(I1 -(I5 -I8 -tp50 -g13 -I00 -S'\x8d(\xed\r\xbe0\x99?\x07\xf0\x16HP\xfc\x98?\x84\x9e\xcd\xaa\xcf\xd5\x96?=\x9bU\x9f\xab\xad\x98?\x91\x0fz6\xab>\x97?j\xbct\x93\x18\x04\x96?j\xbct\x93\x18\x04\x96?f\xf7\xe4a\xa1\xd6\xa4?\r\xe0-\x90\xa0\xf8\xa1?\x1c\xeb\xe26\x1a\xc0\x9b?Zd;\xdfO\x8d\x97?\xa1g\xb3\xeas\xb5\x95?\xd7\x12\xf2A\xcff\x95?\x1b/\xdd$\x06\x81\x95?\x0e\xbe0\x99*\x18\x95?+\x87\x16\xd9\xce\xf7\xa3?\xd74\xef8EG\xa2?"\xfd\xf6u\xe0\x9c\xa1?\xa3#\xb9\xfc\x87\xf4\x9b?\xed\r\xbe0\x99*\x98?\xbaI\x0c\x02+\x87\x96?j\xbct\x93\x18\x04\x96?j\xbct\x93\x18\x04\x96?+\x87\x16\xd9\xce\xf7\xa3?\xe0\xbe\x0e\x9c3\xa2\xa4?r\x8a\x8e\xe4\xf2\x1f\xa2?\x91\x0fz6\xab>\x97?\xc5\xfe\xb2{\xf2\xb0\x90?K\xc8\x07=\x9bU\x8f?\x8d(\xed\r\xbe0\x89?\xa85\xcd;N\xd1\x81?\xa85\xcd;N\xd1\x91?\xdb\xf9~j\xbct\xa3?\x01M\x84\rO\xaf\xa4?\xd0D\xd8\xf0\xf4J\x99?\x82\xe2\xc7\x98\xbb\x96\x90?\x86Z\xd3\xbc\xe3\x14\x8d?A\x82\xe2\xc7\x98\xbb\x86?\x0e\xbe0\x99*\x18\x85?\xa6\nF%u\x02\x8a?' -p51 -tp52 -bsg27 -g3 -(g4 -(I0 -tp53 -g6 -tp54 -Rp55 -(I1 -(I5 -I8 -tp56 -g13 -I00 -S'\xc3\xd3+e\x19\xe2\x98?=\x9bU\x9f\xab\xad\x98?\x1b/\xdd$\x06\x81\x95?\xbe0\x99*\x18\x95\x94?{\x14\xaeG\xe1z\x94?\xc7\xba\xb8\x8d\x06\xf0\x96?\r\xe0-\x90\xa0\xf8\xa1?\xbc\x05\x12\x14?\xc6\xbc?\xd4+e\x19\xe2X\x97?M\xf3\x8eSt$\x97?\xd7\x12\xf2A\xcff\x95?\xbe0\x99*\x18\x95\x94?\x88\x85Z\xd3\xbc\xe3\x94?=\x9bU\x9f\xab\xad\x98?=\x9bU\x9f\xab\xad\x98?\xa5N@\x13a\xc3\xb3?\x10z6\xab>W\x9b?\xa1g\xb3\xeas\xb5\x95?L7\x89A`\xe5\x90?U\xc1\xa8\xa4N@\x93?\xdb\xf9~j\xbct\x93?\x88\x85Z\xd3\xbc\xe3\x94?0*\xa9\x13\xd0D\x98?j\xbct\x93\x18\x04\xa6?\x8d(\xed\r\xbe0\xa9?{\x14\xaeG\xe1z\x94?\xed\r\xbe0\x99*\x88?\xac\xad\xd8_vO~?\xdeq\x8a\x8e\xe4\xf2\x7f?\xc5\x8f1w-!\x7f?\xce\x88\xd2\xde\xe0\x0b\x83?K\xc8\x07=\x9bU\x8f?\x07\xf0\x16HP\xfc\xa8?\x92\xcb\x7fH\xbf}\x9d?\x86Z\xd3\xbc\xe3\x14\x8d?\xfc\xa9\xf1\xd2Mb\x80?\x13a\xc3\xd3+ey?S\x96!\x8euq{?\x9f<,\xd4\x9a\xe6}?\xbaI\x0c\x02+\x87\x86?' -p57 -tp58 -bsS'proc' -p59 -S'mfv_stopbbarbbar' -p60 -sg28 -g3 -(g4 -(I0 -tp61 -g6 -tp62 -Rp63 -(I1 -(I5 -I8 -tp64 -g13 -I00 -S'{\x14\xaeG\xe1z\x94?\xa1g\xb3\xeas\xb5\x95?\x88\x85Z\xd3\xbc\xe3\x94?\x88\x85Z\xd3\xbc\xe3\x94?\x1b/\xdd$\x06\x81\x95?\xbaI\x0c\x02+\x87\x96?_)\xcb\x10\xc7\xba\xa8?\xb8\x1e\x85\xebQ\xb8\xbe?\xe7\x8c(\xed\r\xbe\xa0?_\x07\xce\x19Q\xda\x9b?M\xf3\x8eSt$\x97?\x84\x9e\xcd\xaa\xcf\xd5\x96?\xa1g\xb3\xeas\xb5\x95?\x1b/\xdd$\x06\x81\x95?9\xb4\xc8v\xbe\x9f\x9a?aTR\'\xa0\x89\xb0?\xbe\xc1\x17&S\x05\xb3?\xe7\x8c(\xed\r\xbe\xb0?\xa6\nF%u\x02\xaa?\xc3\xf5(\\\x8f\xc2\xa5?\xf0\x16HP\xfc\x18\xa3?;\xdfO\x8d\x97n\xa2??\xc6\xdc\xb5\x84|\xa0?aTR\'\xa0\x89\xb0?\x8fSt$\x97\xff\xc8?\xca\xc3B\xadi\xde\xc1?\xa6\x9b\xc4 \xb0r\xc0?\xe5\xd0"\xdb\xf9~\xba?\xf2\xd2Mb\x10X\xb9?\x17HP\xfc\x18s\xb7?(~\x8c\xb9k\t\xb9?C\x1c\xeb\xe26\x1a\xc0?\xf6(\\\x8f\xc2\xf5\xc8?\xbe\xc1\x17&S\x05\xc3?C\xadi\xdeq\x8a\xbe?\xf6(\\\x8f\xc2\xf5\xb8?\xcff\xd5\xe7j+\xb6?\xbe\xc1\x17&S\x05\xb3?\xe4\x14\x1d\xc9\xe5?\xb4?\x95\xd4\th"l\xb8?' -p65 -tp66 -bs. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_stopdbardbar.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_stopdbardbar.pkl deleted file mode 100644 index 8cdda2161..000000000 --- a/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_stopdbardbar.pkl +++ /dev/null @@ -1,163 +0,0 @@ -(dp0 -S'perc' -p1 -I00 -sS'y_vals' -p2 -cnumpy.core.multiarray -_reconstruct -p3 -(cnumpy -ndarray -p4 -(I0 -tp5 -S'b' -p6 -tp7 -Rp8 -(I1 -(I8 -tp9 -cnumpy -dtype -p10 -(S'f8' -p11 -I0 -I1 -tp12 -Rp13 -(I3 -S'<' -p14 -NNNI-1 -I-1 -I0 -tp15 -bI00 -S'\x00\x00\x00\x00\x00\x00i@\x00\x00\x00\x00\x00\xc0r@\x00\x00\x00\x00\x00\x00y@\x00\x00\x00\x00\x00\xc0\x82@\x00\x00\x00\x00\x00\x00\x89@\x00\x00\x00\x00\x00\xc0\x92@\x00\x00\x00\x00\x00\x00\x99@\x00\x00\x00\x00\x00p\xa7@' -p16 -tp17 -bsS'dtype' -p18 -c__builtin__ -float -p19 -sS'x_unit' -p20 -S'mm' -p21 -sS'arr_len' -p22 -I0 -sS'years' -p23 -c__builtin__ -set -p24 -((lp25 -S'2017' -p26 -aS'2016' -p27 -aS'2016APV' -p28 -aS'2018' -p29 -atp30 -Rp31 -sS'y_unit' -p32 -S'GeV' -p33 -sg29 -g3 -(g4 -(I0 -tp34 -g6 -tp35 -Rp36 -(I1 -(I5 -I8 -tp37 -g13 -I00 -S"0\xbb'\x0f\x0b\xb5\xb6?\xa5\xbd\xc1\x17&S\xb5?\x1aQ\xda\x1b|a\xb2?\xe4\x14\x1d\xc9\xe5?\xb4?\xc2\x86\xa7W\xca2\xb4?\xf1c\xcc]K\xc8\xb7?\xd4+e\x19\xe2X\xb7?\xd4+e\x19\xe2X\xb7?\xc6m4\x80\xb7@\xb2?lxz\xa5,C\xac?\xdc\xd7\x81sF\x94\xa6?^K\xc8\x07=\x9b\xa5?\xa1g\xb3\xeas\xb5\xa5?\xcc\x7fH\xbf}\x1d\xa8?\x96\xb2\x0cq\xac\x8b\xab?\x96\xb2\x0cq\xac\x8b\xab?\x07\xf0\x16HP\xfc\xa8?\x12\xa5\xbd\xc1\x17&\xa3?\xa3#\xb9\xfc\x87\xf4\x9b?tF\x94\xf6\x06_\x98?\n\xd7\xa3p=\n\x97?\x07\xf0\x16HP\xfc\x98?\x8d(\xed\r\xbe0\x99?M\xf3\x8eSt$\x97?<\xbdR\x96!\x8e\xa5?/n\xa3\x01\xbc\x05\xa2?\x19\x04V\x0e-\xb2\x8d?\x8fSt$\x97\xff\x80?y\xe9&1\x08\xac|?\xdeq\x8a\x8e\xe4\xf2\x7f?\x9f<,\xd4\x9a\xe6}?\xc2\x17&S\x05\xa3\x82?K\xc8\x07=\x9bU\xaf?5\xef8EGr\xa9?5\xef8EGr\xa9?\x9f<,\xd4\x9a\xe6}?y\xe9&1\x08\xac|?\x13a\xc3\xd3+ey?9\xb4\xc8v\xbe\x9fz?_\x07\xce\x19Q\xda{?" -p38 -tp39 -bsS'x_vals' -p40 -g3 -(g4 -(I0 -tp41 -g6 -tp42 -Rp43 -(I1 -(I5 -tp44 -g13 -I00 -S'\x9a\x99\x99\x99\x99\x99\xb9?333333\xd3?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00>@' -p45 -tp46 -bsg26 -g3 -(g4 -(I0 -tp47 -g6 -tp48 -Rp49 -(I1 -(I5 -I8 -tp50 -g13 -I00 -S"\xa0\x1a/\xdd$\x06\xb1?\x03\t\x8a\x1fc\xee\xaa?\n\xd7\xa3p=\n\xa7?\xecQ\xb8\x1e\x85\xeb\xa1?\xd2\x00\xde\x02\t\x8a\x9f?tF\x94\xf6\x06_\x98?\xcc]K\xc8\x07=\x9b?9\xb4\xc8v\xbe\x9f\xaa?}\xae\xb6b\x7f\xd9\xad?\x06\x12\x14?\xc6\xdc\xa5?aTR'\xa0\x89\xa0?9\xb4\xc8v\xbe\x9f\x9a?c\xeeZB>\xe8\x99?A\x82\xe2\xc7\x98\xbb\x96?\x13a\xc3\xd3+e\x99?\xa2E\xb6\xf3\xfd\xd4\xa8?\xf3\x8eSt$\x97\xaf?\xaa\xf1\xd2Mb\x10\xa8?D\x8bl\xe7\xfb\xa9\xa1?D\x8bl\xe7\xfb\xa9\xa1?S\x96!\x8euq\x9b?\xbaI\x0c\x02+\x87\x96?\x8d(\xed\r\xbe0\x99?\x1b\r\xe0-\x90\xa0\xa8?\x12\xa5\xbd\xc1\x17&\xa3??\xc6\xdc\xb5\x84|\xa0?j\xbct\x93\x18\x04\x96?\x9f<,\xd4\x9a\xe6\x8d?\x9f<,\xd4\x9a\xe6\x8d?\xb5\xa6y\xc7):\x82?\x82\xe2\xc7\x98\xbb\x96\x80?\x01M\x84\rO\xaf\x94?\x9a\x99\x99\x99\x99\x99\xa9?\xa9\x13\xd0D\xd8\xf0\xa4?\xd4+e\x19\xe2X\x97?\xc5\xfe\xb2{\xf2\xb0\x90?2\xe6\xae%\xe4\x83\x8e?A\x82\xe2\xc7\x98\xbb\x86?4\x116<\xbdR\x86?tF\x94\xf6\x06_\x88?" -p51 -tp52 -bsg27 -g3 -(g4 -(I0 -tp53 -g6 -tp54 -Rp55 -(I1 -(I5 -I8 -tp56 -g13 -I00 -S'Zd;\xdfO\x8d\x97?\x94\xf6\x06_\x98L\x95?\x84\x9e\xcd\xaa\xcf\xd5\x96?4\x116<\xbdR\x96?\xae\xd8_vO\x1e\x96?aTR\'\xa0\x89\xa0?r\x8a\x8e\xe4\xf2\x1f\xb2?M\x84\rO\xaf\x94\xcd? \xd2o_\x07\xce\x99?\xd4+e\x19\xe2X\x97?\xae\xd8_vO\x1e\x96?\xae\xd8_vO\x1e\x96?j\xbct\x93\x18\x04\x96?\xaa\xf1\xd2Mb\x10\x98?\x1aQ\xda\x1b|a\xa2?\xe2X\x17\xb7\xd1\x00\xbe?\x07\xf0\x16HP\xfc\x98?\xbe0\x99*\x18\x95\x94?"\xfd\xf6u\xe0\x9c\x91?{\x14\xaeG\xe1z\x94?\xa5N@\x13a\xc3\x93?\xe0\x9c\x11\xa5\xbd\xc1\x97?\x07\xf0\x16HP\xfc\x98?\xf3\x8eSt$\x97\xaf?K\xc8\x07=\x9bU\x9f?\xdb\xf9~j\xbct\x93?\x1b/\xdd$\x06\x81\x85?{\x14\xaeG\xe1z\x84?vq\x1b\r\xe0-\x80?\xb5\xa6y\xc7):\x82?\x94\xf6\x06_\x98L\x85?\xf3\x8eSt$\x97\xaf?\xab\xcf\xd5V\xec/\xab?lxz\xa5,C\x9c?{\x14\xaeG\xe1z\x84?y\xe9&1\x08\xac|?lxz\xa5,C|?\x92\xcb\x7fH\xbf}}?\xb8\x1e\x85\xebQ\xb8~?g\xd5\xe7j+\xf6\x87?' -p57 -tp58 -bsS'proc' -p59 -S'mfv_stopdbardbar' -p60 -sg28 -g3 -(g4 -(I0 -tp61 -g6 -tp62 -Rp63 -(I1 -(I5 -I8 -tp64 -g13 -I00 -S'{\x14\xaeG\xe1z\x94?\x01M\x84\rO\xaf\x94?\xae\xd8_vO\x1e\x96?M\xf3\x8eSt$\x97?4\x116<\xbdR\x96?\x9bU\x9f\xab\xad\xd8\x9f?\x0eO\xaf\x94e\x88\xb3?U0*\xa9\x13\xd0\xcc?\x15\x8cJ\xea\x044\xa1?\xbc\x05\x12\x14?\xc6\x9c?\xf6\x97\xdd\x93\x87\x85\x9a?\xfa~j\xbct\x93\x98?\x91\x0fz6\xab>\x97?\xc7\xba\xb8\x8d\x06\xf0\x96?\xdb\xf9~j\xbct\xa3?\x8a\xb0\xe1\xe9\x95\xb2\xbc?\xa9\xa4N@\x13a\xb3?\x00o\x81\x04\xc5\x8f\xb1?mV}\xae\xb6b\xbf?\x91\xed|?5^\xaa?4\x116<\xbdR\xa6?\x1e\x16jM\xf3\x8e\xa3?sh\x91\xed|?\xa5?333333\xb3?\x7f\xfb:p\xce\x88\xc2?\x8fSt$\x97\xff\xc0?mV}\xae\xb6b\xbf?\x92\xcb\x7fH\xbf}\xbd?\xd9_vO\x1e\x16\xba?\x0f\x9c3\xa2\xb47\xb8?h"lxz\xa5\xbc?\xee\xeb\xc09#J\xc3?\xaf\x94e\x88c]\xc4?\xa4p=\n\xd7\xa3\xc0?\x14?\xc6\xdc\xb5\x84\xbc?\x9e\xef\xa7\xc6K7\xb9?U0*\xa9\x13\xd0\xb4?\xe4\x83\x9e\xcd\xaa\xcf\xb5?\x7f\xd9=yX\xa8\xb5?\x88c]\xdcF\x03\xb8?' -p65 -tp66 -bs. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_VH.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_VH.pkl deleted file mode 100644 index 7cc2e0941..000000000 --- a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_VH.pkl +++ /dev/null @@ -1,125 +0,0 @@ -(dp0 -S'perc' -p1 -I01 -sS'y_vals' -p2 -cnumpy.core.multiarray -_reconstruct -p3 -(cnumpy -ndarray -p4 -(I0 -tp5 -S'b' -p6 -tp7 -Rp8 -(I1 -(I3 -tp9 -cnumpy -dtype -p10 -(S'f8' -p11 -I0 -I1 -tp12 -Rp13 -(I3 -S'<' -p14 -NNNI-1 -I-1 -I0 -tp15 -bI00 -S'\x00\x00\x00\x00\x00\x00.@\x00\x00\x00\x00\x00\x00D@\x00\x00\x00\x00\x00\x80K@' -p16 -tp17 -bsS'dtype' -p18 -c__builtin__ -float -p19 -sS'x_unit' -p20 -S'mm' -p21 -sS'arr_len' -p22 -I0 -sS'years' -p23 -c__builtin__ -set -p24 -((lp25 -S'2017-8' -p26 -aS'20161-2' -p27 -atp28 -Rp29 -sS'y_unit' -p30 -S'GeV' -p31 -sg27 -g3 -(g4 -(I0 -tp32 -g6 -tp33 -Rp34 -(I1 -(I6 -I3 -tp35 -g13 -I00 -S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?;\x01M\x84\rO\xe3?\xffC\xfa\xed\xeb\xc0\xd9?\x00\x00\x00\x00\x00\x00\xf0?J{\x83/L\xa6\xd2?\x0f\x9c3\xa2\xb47\xd0?\x00\x00\x00\x00\x00\x00\xf0?\xe3X\x17\xb7\xd1\x00\xce?\xcf\x88\xd2\xde\xe0\x0b\xc3?\x00\x00\x00\x00\x00\x00\xf0?\x91~\xfb:p\xce\xc8?\x8cJ\xea\x044\x11\xc6?\x00\x00\x00\x00\x00\x00\xf0?\x10\xe9\xb7\xaf\x03\xe7\xcc?\xfee\xf7\xe4a\xa1\xc6?' -p36 -tp37 -bsS'x_vals' -p38 -g3 -(g4 -(I0 -tp39 -g6 -tp40 -Rp41 -(I1 -(I6 -tp42 -g13 -I00 -S'\x9a\x99\x99\x99\x99\x99\xb9?333333\xd3?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x08@\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00>@' -p43 -tp44 -bsg26 -g3 -(g4 -(I0 -tp45 -g6 -tp46 -Rp47 -(I1 -(I6 -I3 -tp48 -g13 -I00 -S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xb1Pk\x9aw\x9c\xd2?!\x1f\xf4lV}\xd6?,\xf6\x97\xdd\x93\x87\xe9?h"lxz\xa5\xcc?C>\xe8\xd9\xac\xfa\xcc?\xda=yX\xa85\xe5?-\xb2\x9d\xef\xa7\xc6\xcb?hDio\xf0\x85\xc9?\xbe\xc1\x17&S\x05\xdb?\xcd;N\xd1\x91\\\xce?\xff\xb2{\xf2\xb0P\xcb?\xe7?\xa4\xdf\xbe\x0e\xdc? \xd2o_\x07\xce\xd1?\xc0[ A\xf1c\xcc?' -p49 -tp50 -bsS'proc' -p51 -S'VH' -p52 -s. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_ggHToSSTodddd.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_ggHToSSTodddd.pkl deleted file mode 100644 index 009a71d91..000000000 --- a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_ggHToSSTodddd.pkl +++ /dev/null @@ -1,125 +0,0 @@ -(dp0 -S'perc' -p1 -I01 -sS'y_vals' -p2 -cnumpy.core.multiarray -_reconstruct -p3 -(cnumpy -ndarray -p4 -(I0 -tp5 -S'b' -p6 -tp7 -Rp8 -(I1 -(I3 -tp9 -cnumpy -dtype -p10 -(S'f8' -p11 -I0 -I1 -tp12 -Rp13 -(I3 -S'<' -p14 -NNNI-1 -I-1 -I0 -tp15 -bI00 -S'\x00\x00\x00\x00\x00\x00.@\x00\x00\x00\x00\x00\x00D@\x00\x00\x00\x00\x00\x80K@' -p16 -tp17 -bsS'dtype' -p18 -c__builtin__ -float -p19 -sS'x_unit' -p20 -S'mm' -p21 -sS'arr_len' -p22 -I0 -sS'years' -p23 -c__builtin__ -set -p24 -((lp25 -S'2017-8' -p26 -aS'20161-2' -p27 -atp28 -Rp29 -sS'y_unit' -p30 -S'GeV' -p31 -sg27 -g3 -(g4 -(I0 -tp32 -g6 -tp33 -Rp34 -(I1 -(I4 -I3 -tp35 -g13 -I00 -S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?h"lxz\xa5\xe4?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?9EGr\xf9\x0f\xe1?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?9EGr\xf9\x0f\xe1?' -p36 -tp37 -bsS'x_vals' -p38 -g3 -(g4 -(I0 -tp39 -g6 -tp40 -Rp41 -(I1 -(I4 -tp42 -g13 -I00 -S'\x9a\x99\x99\x99\x99\x99\xb9?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00Y@' -p43 -tp44 -bsg26 -g3 -(g4 -(I0 -tp45 -g6 -tp46 -Rp47 -(I1 -(I4 -I3 -tp48 -g13 -I00 -S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x18&S\x05\xa3\x92\xda?C\x1c\xeb\xe26\x1a\xd0?\x00\x00\x00\x00\x00\x00\xf0?(\xa0\x89\xb0\xe1\xe9\xd5?d;\xdfO\x8d\x97\xce?\x00\x00\x00\x00\x00\x00\xf0?(\xa0\x89\xb0\xe1\xe9\xd5?d;\xdfO\x8d\x97\xce?' -p49 -tp50 -bsS'proc' -p51 -S'ggHToSSTodddd' -p52 -s. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_neu.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_neu.pkl deleted file mode 100644 index 41d57579c..000000000 --- a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_neu.pkl +++ /dev/null @@ -1,125 +0,0 @@ -(dp0 -S'perc' -p1 -I01 -sS'y_vals' -p2 -cnumpy.core.multiarray -_reconstruct -p3 -(cnumpy -ndarray -p4 -(I0 -tp5 -S'b' -p6 -tp7 -Rp8 -(I1 -(I3 -tp9 -cnumpy -dtype -p10 -(S'f8' -p11 -I0 -I1 -tp12 -Rp13 -(I3 -S'<' -p14 -NNNI-1 -I-1 -I0 -tp15 -bI00 -S'\x00\x00\x00\x00\x00\x00i@\x00\x00\x00\x00\x00\x00y@\x00\x00\x00\x00\x00\x00\x89@' -p16 -tp17 -bsS'dtype' -p18 -c__builtin__ -float -p19 -sS'x_unit' -p20 -S'mm' -p21 -sS'arr_len' -p22 -I0 -sS'years' -p23 -c__builtin__ -set -p24 -((lp25 -S'2017-8' -p26 -aS'20161-2' -p27 -atp28 -Rp29 -sS'y_unit' -p30 -S'GeV' -p31 -sg27 -g3 -(g4 -(I0 -tp32 -g6 -tp33 -Rp34 -(I1 -(I5 -I3 -tp35 -g13 -I00 -S'\xeeZB>\xe8\xd9\xdc?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x18\x95\xd4\th"\xcc?\xe8\xfb\xa9\xf1\xd2M\xd2?\xed\r\xbe0\x99*\xd8?(\xa0\x89\xb0\xe1\xe9\xc5?\xb8\x1e\x85\xebQ\xb8\xce?\x9a\x99\x99\x99\x99\x99\xc9?\x08\xce\x19Q\xda\x1b\xbc?)\\\x8f\xc2\xf5(\xbc?)\\\x8f\xc2\xf5(\xbc?\xfee\xf7\xe4a\xa1\xc6?\n\xd7\xa3p=\n\xc7?\n\xd7\xa3p=\n\xc7?' -p36 -tp37 -bsS'x_vals' -p38 -g3 -(g4 -(I0 -tp39 -g6 -tp40 -Rp41 -(I1 -(I5 -tp42 -g13 -I00 -S'\x9a\x99\x99\x99\x99\x99\xb9?333333\xd3?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00>@' -p43 -tp44 -bsg26 -g3 -(g4 -(I0 -tp45 -g6 -tp46 -Rp47 -(I1 -(I5 -I3 -tp48 -g13 -I00 -S"\xa1g\xb3\xeas\xb5\xe1?\xc3d\xaa`TR\xe7?\x01M\x84\rO\xaf\xec?\xaf%\xe4\x83\x9e\xcd\xd2?'S\x05\xa3\x92:\xd9?%\xe4\x83\x9e\xcd\xaa\xdf?\xfa\xa0g\xb3\xeas\xc5?\xb8\x1e\x85\xebQ\xb8\xce?\x9a\x99\x99\x99\x99\x99\xc9?\xc2\x17&S\x05\xa3\xb2?{\x14\xaeG\xe1z\xb4?\xb8\x1e\x85\xebQ\xb8\xae?\xf8\xc2d\xaa`T\xb2?{\x14\xaeG\xe1z\xb4?\xb8\x1e\x85\xebQ\xb8\xae?" -p49 -tp50 -bsS'proc' -p51 -S'mfv_neu' -p52 -s. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_stopbbarbbar.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_stopbbarbbar.pkl deleted file mode 100644 index df7e4b991..000000000 --- a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_stopbbarbbar.pkl +++ /dev/null @@ -1,125 +0,0 @@ -(dp0 -S'perc' -p1 -I01 -sS'y_vals' -p2 -cnumpy.core.multiarray -_reconstruct -p3 -(cnumpy -ndarray -p4 -(I0 -tp5 -S'b' -p6 -tp7 -Rp8 -(I1 -(I3 -tp9 -cnumpy -dtype -p10 -(S'f8' -p11 -I0 -I1 -tp12 -Rp13 -(I3 -S'<' -p14 -NNNI-1 -I-1 -I0 -tp15 -bI00 -S'\x00\x00\x00\x00\x00\x00i@\x00\x00\x00\x00\x00\x00y@\x00\x00\x00\x00\x00\x00\x89@' -p16 -tp17 -bsS'dtype' -p18 -c__builtin__ -float -p19 -sS'x_unit' -p20 -S'mm' -p21 -sS'arr_len' -p22 -I0 -sS'years' -p23 -c__builtin__ -set -p24 -((lp25 -S'2017-8' -p26 -aS'20161-2' -p27 -atp28 -Rp29 -sS'y_unit' -p30 -S'GeV' -p31 -sg27 -g3 -(g4 -(I0 -tp32 -g6 -tp33 -Rp34 -(I1 -(I5 -I3 -tp35 -g13 -I00 -S'\xc1\xa8\xa4N@\x13\xe5?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xd6\xc5m4\x80\xb7\xe0?\xc0[ A\xf1c\xcc?@' -p43 -tp44 -bsg26 -g3 -(g4 -(I0 -tp45 -g6 -tp46 -Rp47 -(I1 -(I5 -I3 -tp48 -g13 -I00 -S'\x88\xf4\xdb\xd7\x81s\xee?L7\x89A`\xe5\xec?\nF%u\x02\x9a\xe8?.\xff!\xfd\xf6u\xd8?\x9f\xab\xad\xd8_v\xcf?\xaf%\xe4\x83\x9e\xcd\xd2?\xf7\x06_\x98L\x15\xd4?\x05\xc5\x8f1w-\xc1?)\\\x8f\xc2\xf5(\xac?5^\xbaI\x0c\x02\xd3?\xf6\x97\xdd\x93\x87\x85\xba?\xe8j+\xf6\x97\xdd\xa3?\xc5\xb1.n\xa3\x01\xd4?\xe0\x9c\x11\xa5\xbd\xc1\xb7?\xdc\xb5\x84|\xd0\xb3\xa9?' -p49 -tp50 -bsS'proc' -p51 -S'mfv_stopbbarbbar' -p52 -s. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_stopdbardbar.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_stopdbardbar.pkl deleted file mode 100644 index c90f43658..000000000 --- a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_stopdbardbar.pkl +++ /dev/null @@ -1,125 +0,0 @@ -(dp0 -S'perc' -p1 -I01 -sS'y_vals' -p2 -cnumpy.core.multiarray -_reconstruct -p3 -(cnumpy -ndarray -p4 -(I0 -tp5 -S'b' -p6 -tp7 -Rp8 -(I1 -(I3 -tp9 -cnumpy -dtype -p10 -(S'f8' -p11 -I0 -I1 -tp12 -Rp13 -(I3 -S'<' -p14 -NNNI-1 -I-1 -I0 -tp15 -bI00 -S'\x00\x00\x00\x00\x00\x00i@\x00\x00\x00\x00\x00\x00y@\x00\x00\x00\x00\x00\x00\x89@' -p16 -tp17 -bsS'dtype' -p18 -c__builtin__ -float -p19 -sS'x_unit' -p20 -S'mm' -p21 -sS'arr_len' -p22 -I0 -sS'years' -p23 -c__builtin__ -set -p24 -((lp25 -S'2017-8' -p26 -aS'20161-2' -p27 -atp28 -Rp29 -sS'y_unit' -p30 -S'GeV' -p31 -sg27 -g3 -(g4 -(I0 -tp32 -g6 -tp33 -Rp34 -(I1 -(I5 -I3 -tp35 -g13 -I00 -S'3\xc4\xb1.n\xa3\xd1?_)\xcb\x10\xc7\xba\xe8?\x80H\xbf}\x1d8\xeb?1\x08\xac\x1cZd\xbb?\xa3#\xb9\xfc\x87\xf4\xd3?D\x8bl\xe7\xfb\xa9\xd9?\xfd\x87\xf4\xdb\xd7\x81\xb3?\x18&S\x05\xa3\x92\xba?\xb8\x1e\x85\xebQ\xb8\xbe?n\xa3\x01\xbc\x05\x12\xb4?\xdc\xb5\x84|\xd0\xb3\xa9?\xb5\xa6y\xc7):\xa2?\x81sF\x94\xf6\x06\xbf?>\x9bU\x9f\xab\xad\xa8?X\xa85\xcd;N\xa1?' -p36 -tp37 -bsS'x_vals' -p38 -g3 -(g4 -(I0 -tp39 -g6 -tp40 -Rp41 -(I1 -(I5 -tp42 -g13 -I00 -S'\x9a\x99\x99\x99\x99\x99\xb9?333333\xd3?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00>@' -p43 -tp44 -bsg26 -g3 -(g4 -(I0 -tp45 -g6 -tp46 -Rp47 -(I1 -(I5 -I3 -tp48 -g13 -I00 -S'\xa2\xb47\xf8\xc2d\xd2?j\xdeq\x8a\x8e\xe4\xe2?\x17\xd9\xce\xf7S\xe3\xe1?1*\xa9\x13\xd0D\xb8?\x13a\xc3\xd3+e\xc9?\x9f\xcd\xaa\xcf\xd5V\xcc?\xb3{\xf2\xb0Pk\xaa?1*\xa9\x13\xd0D\xa8?\x0e\xbe0\x99*\x18\xa5?333333\xb3?\xcd]K\xc8\x07=\x9b?\x83\xe2\xc7\x98\xbb\x96\x90?\x80\xb7@\x82\xe2\xc7\xb8?\x9f<,\xd4\x9a\xe6\x9d?\xc2\x17&S\x05\xa3\x92?' -p49 -tp50 -bsS'proc' -p51 -S'mfv_stopdbardbar' -p52 -s. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/ct_pickle_VH.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/ct_pickle_VH.pkl deleted file mode 100644 index c0d82064d..000000000 --- a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/ct_pickle_VH.pkl +++ /dev/null @@ -1,167 +0,0 @@ -(dp0 -S'perc' -p1 -I00 -sS'y_vals' -p2 -cnumpy.core.multiarray -_reconstruct -p3 -(cnumpy -ndarray -p4 -(I0 -tp5 -S'b' -p6 -tp7 -Rp8 -(I1 -(I3 -tp9 -cnumpy -dtype -p10 -(S'f8' -p11 -I0 -I1 -tp12 -Rp13 -(I3 -S'<' -p14 -NNNI-1 -I-1 -I0 -tp15 -bI00 -S'\x00\x00\x00\x00\x00\x00.@\x00\x00\x00\x00\x00\x00D@\x00\x00\x00\x00\x00\x80K@' -p16 -tp17 -bsS'dtype' -p18 -c__builtin__ -float -p19 -sS'20162' -p20 -g3 -(g4 -(I0 -tp21 -g6 -tp22 -Rp23 -(I1 -(I6 -I3 -I3 -tp24 -g13 -I00 -S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xc3(\x08\x1e\xdf^\xee?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xc3(\x08\x1e\xdf^\xee?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xc3(\x08\x1e\xdf^\xee?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xd9\n\x9a\x96X\x99\xed?\x15\x1a\x88e3\x07\xeb?\xder\xf5c\x93\xfc\xed?\xd9\n\x9a\x96X\x99\xed?\x15\x1a\x88e3\x07\xeb?\xder\xf5c\x93\xfc\xed?\xd9\n\x9a\x96X\x99\xed?\x15\x1a\x88e3\x07\xeb?\xder\xf5c\x93\xfc\xed?\x1c}\xcc\x07\x04\xba\xec?\xfaE\t\xfa\x0b\xbd\xe8?\xe6\x94\x80\x98\x84\x0b\xe9?\x1c}\xcc\x07\x04\xba\xec?\xfaE\t\xfa\x0b\xbd\xe8?\xe6\x94\x80\x98\x84\x0b\xe9?\x1c}\xcc\x07\x04\xba\xec?\xfaE\t\xfa\x0b\xbd\xe8?\xe6\x94\x80\x98\x84\x0b\xe9?\xd8\xd8%\xaa\xb7\x86\xea?%\xcc\xb4\xfd+\xab\xe7?3\x18#\x12\x85\x16\xe6?\xd8\xd8%\xaa\xb7\x86\xea?%\xcc\xb4\xfd+\xab\xe7?3\x18#\x12\x85\x16\xe6?\xd8\xd8%\xaa\xb7\x86\xea?%\xcc\xb4\xfd+\xab\xe7?3\x18#\x12\x85\x16\xe6?z\xa6\x97\x18\xcb\xf4\xe8?["\x17\x9c\xc1_\xe6?\xa3"N\'\xd9\xea\xe5?z\xa6\x97\x18\xcb\xf4\xe8?["\x17\x9c\xc1_\xe6?\xa3"N\'\xd9\xea\xe5?z\xa6\x97\x18\xcb\xf4\xe8?["\x17\x9c\xc1_\xe6?\xa3"N\'\xd9\xea\xe5?' -p25 -tp26 -bsS'x_unit' -p27 -S'mm' -p28 -sS'arr_len' -p29 -I3 -sS'years' -p30 -c__builtin__ -set -p31 -((lp32 -S'20161' -p33 -ag20 -aS'2017' -p34 -aS'2018' -p35 -atp36 -Rp37 -sS'y_unit' -p38 -S'GeV' -p39 -sg35 -g3 -(g4 -(I0 -tp40 -g6 -tp41 -Rp42 -(I1 -(I6 -I3 -I3 -tp43 -g13 -I00 -S'\xcb\x12\x9de\x16\xa1\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xcb\x12\x9de\x16\xa1\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xcb\x12\x9de\x16\xa1\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x8c\xf2\xcc\xcbaw\xee?\xd5w~Q\x82\xfe\xef?\x00\x00\x00\x00\x00\x00\xf0?\x8c\xf2\xcc\xcbaw\xee?\xd5w~Q\x82\xfe\xef?\x00\x00\x00\x00\x00\x00\xf0?\x8c\xf2\xcc\xcbaw\xee?\xd5w~Q\x82\xfe\xef?\x00\x00\x00\x00\x00\x00\xf0?\xec1\x91\xd2l\x1e\xee?/\xfdKR\x99b\xec?\xc2\x87\x12-y<\xe5?\xec1\x91\xd2l\x1e\xee?/\xfdKR\x99b\xec?\xc2\x87\x12-y<\xe5?\xec1\x91\xd2l\x1e\xee?/\xfdKR\x99b\xec?\xc2\x87\x12-y<\xe5?\x00VG\x8et\x06\xed?\x1f\xf2\x96\xab\x1f\x1b\xeb?\xd0\xf2<\xb8;\xeb\xe9?\x00VG\x8et\x06\xed?\x1f\xf2\x96\xab\x1f\x1b\xeb?\xd0\xf2<\xb8;\xeb\xe9?\x00VG\x8et\x06\xed?\x1f\xf2\x96\xab\x1f\x1b\xeb?\xd0\xf2<\xb8;\xeb\xe9?\xa5\xa1F!\xc9,\xec?Z\xd6\xfdc!\xba\xe9?\x84\xf4\x149D\xdc\xe7?\xa5\xa1F!\xc9,\xec?Z\xd6\xfdc!\xba\xe9?\x84\xf4\x149D\xdc\xe7?\xa5\xa1F!\xc9,\xec?Z\xd6\xfdc!\xba\xe9?\x84\xf4\x149D\xdc\xe7?\x17b\xf5G\x18\x86\xeb?\x85\xb2\xf0\xf5\xb5.\xea?\xce\x89=\xb4\x8f\x15\xe7?\x17b\xf5G\x18\x86\xeb?\x85\xb2\xf0\xf5\xb5.\xea?\xce\x89=\xb4\x8f\x15\xe7?\x17b\xf5G\x18\x86\xeb?\x85\xb2\xf0\xf5\xb5.\xea?\xce\x89=\xb4\x8f\x15\xe7?' -p44 -tp45 -bsg33 -g3 -(g4 -(I0 -tp46 -g6 -tp47 -Rp48 -(I1 -(I6 -I3 -I3 -tp49 -g13 -I00 -S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xf3\x8eSt$\x97\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xf3\x8eSt$\x97\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xf3\x8eSt$\x97\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xc7,{\x12\xd8\x9c\xed?8\x84*5{\xa0\xec?\x92@\x83M\x9d\xc7\xe7?\xc7,{\x12\xd8\x9c\xed?8\x84*5{\xa0\xec?\x92@\x83M\x9d\xc7\xe7?\xc7,{\x12\xd8\x9c\xed?8\x84*5{\xa0\xec?\x92@\x83M\x9d\xc7\xe7??V\xf0\xdb\x10\xe3\xec?\xe2?\xdd@\x81w\xe9?\xdaY\xf4N\x05\xdc\xe6??V\xf0\xdb\x10\xe3\xec?\xe2?\xdd@\x81w\xe9?\xdaY\xf4N\x05\xdc\xe6??V\xf0\xdb\x10\xe3\xec?\xe2?\xdd@\x81w\xe9?\xdaY\xf4N\x05\xdc\xe6?\xe9\x0f\xcd<\xb9\xa6\xec?3\xc5\x1c\x04\x1d\xad\xe7?\xf9\xf4\xd8\x96\x01\xe7\xe5?\xe9\x0f\xcd<\xb9\xa6\xec?3\xc5\x1c\x04\x1d\xad\xe7?\xf9\xf4\xd8\x96\x01\xe7\xe5?\xe9\x0f\xcd<\xb9\xa6\xec?3\xc5\x1c\x04\x1d\xad\xe7?\xf9\xf4\xd8\x96\x01\xe7\xe5?5E\x80\xd3\xbbx\xec??\x8b\xa5H\xbe\x12\xe7?\x160\x81[ws\xe5?5E\x80\xd3\xbbx\xec??\x8b\xa5H\xbe\x12\xe7?\x160\x81[ws\xe5?5E\x80\xd3\xbbx\xec??\x8b\xa5H\xbe\x12\xe7?\x160\x81[ws\xe5?' -p50 -tp51 -bsS'x_vals' -p52 -g3 -(g4 -(I0 -tp53 -g6 -tp54 -Rp55 -(I1 -(I6 -tp56 -g13 -I00 -S'\x9a\x99\x99\x99\x99\x99\xb9?333333\xd3?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x08@\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00>@' -p57 -tp58 -bsg34 -g3 -(g4 -(I0 -tp59 -g6 -tp60 -Rp61 -(I1 -(I6 -I3 -I3 -tp62 -g13 -I00 -S'F(\xb6\x82\xa6\xa5\xec?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?F(\xb6\x82\xa6\xa5\xec?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?F(\xb6\x82\xa6\xa5\xec?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x83\x89?\x8a:s\xee?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x83\x89?\x8a:s\xee?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x83\x89?\x8a:s\xee?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xf6\xebNw\x9e\xf8\xed?G\xad0}\xaf!\xed?\xd2\x8b\xda\xfd*@\xec?\xf6\xebNw\x9e\xf8\xed?G\xad0}\xaf!\xed?\xd2\x8b\xda\xfd*@\xec?\xf6\xebNw\x9e\xf8\xed?G\xad0}\xaf!\xed?\xd2\x8b\xda\xfd*@\xec?\x9f<,\xd4\x9af\xed?\xc6\xfbq\xfb\xe5\x93\xea?\xd9$?\xe2W\xac\xe9?\x9f<,\xd4\x9af\xed?\xc6\xfbq\xfb\xe5\x93\xea?\xd9$?\xe2W\xac\xe9?\x9f<,\xd4\x9af\xed?\xc6\xfbq\xfb\xe5\x93\xea?\xd9$?\xe2W\xac\xe9?\xe6\\\x8a\xab\xca\xbe\xec?t~\x8a\xe3\xc0+\xe9?\xc1\xe0\x9a;\xfa_\xe7?\xe6\\\x8a\xab\xca\xbe\xec?t~\x8a\xe3\xc0+\xe9?\xc1\xe0\x9a;\xfa_\xe7?\xe6\\\x8a\xab\xca\xbe\xec?t~\x8a\xe3\xc0+\xe9?\xc1\xe0\x9a;\xfa_\xe7?\xea\xb0\xc2-\x1fI\xeb?\x90kC\xc58\x7f\xe8?\xd0%\x1cz\x8b\x07\xe8?\xea\xb0\xc2-\x1fI\xeb?\x90kC\xc58\x7f\xe8?\xd0%\x1cz\x8b\x07\xe8?\xea\xb0\xc2-\x1fI\xeb?\x90kC\xc58\x7f\xe8?\xd0%\x1cz\x8b\x07\xe8?' -p63 -tp64 -bsS'proc' -p65 -S'VH' -p66 -s. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/dn_pickle_VH.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/dn_pickle_VH.pkl deleted file mode 100644 index 5623c66da..000000000 --- a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/dn_pickle_VH.pkl +++ /dev/null @@ -1,167 +0,0 @@ -(dp0 -S'perc' -p1 -I00 -sS'y_vals' -p2 -cnumpy.core.multiarray -_reconstruct -p3 -(cnumpy -ndarray -p4 -(I0 -tp5 -S'b' -p6 -tp7 -Rp8 -(I1 -(I3 -tp9 -cnumpy -dtype -p10 -(S'f8' -p11 -I0 -I1 -tp12 -Rp13 -(I3 -S'<' -p14 -NNNI-1 -I-1 -I0 -tp15 -bI00 -S'\x00\x00\x00\x00\x00\x00.@\x00\x00\x00\x00\x00\x00D@\x00\x00\x00\x00\x00\x80K@' -p16 -tp17 -bsS'dtype' -p18 -c__builtin__ -float -p19 -sS'20162' -p20 -g3 -(g4 -(I0 -tp21 -g6 -tp22 -Rp23 -(I1 -(I6 -I3 -I3 -tp24 -g13 -I00 -S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xd8\xd8%\xaa\xb7\x06\xf0?\xd7Q\xd5\x04Qw\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xd8\xd8%\xaa\xb7\x06\xf0?\xd7Q\xd5\x04Qw\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xd8\xd8%\xaa\xb7\x06\xf0?\xd7Q\xd5\x04Qw\xf0?\x00\x00\x00\x00\x00\x00\xf0?M2r\x16\xf64\xf0?Ae\xfc\xfb\x8c\x8b\xf0?\xfe\xb7\x92\x1d\x1b\x01\xf1?M2r\x16\xf64\xf0?Ae\xfc\xfb\x8c\x8b\xf0?\xfe\xb7\x92\x1d\x1b\x01\xf1?M2r\x16\xf64\xf0?Ae\xfc\xfb\x8c\x8b\xf0?\xfe\xb7\x92\x1d\x1b\x01\xf1?\xe4I\xd25\x93o\xf0?l&\xdfls\xe3\xf0?B\xb2\x80\t\xdc\xba\xf0?\xe4I\xd25\x93o\xf0?l&\xdfls\xe3\xf0?B\xb2\x80\t\xdc\xba\xf0?\xe4I\xd25\x93o\xf0?l&\xdfls\xe3\xf0?B\xb2\x80\t\xdc\xba\xf0?9\xd1\xaeB\xca\xcf\xf1?{\xf7\xc7{\xd5J\xf1? \x0c<\xf7\x1e\xae\xf1?9\xd1\xaeB\xca\xcf\xf1?{\xf7\xc7{\xd5J\xf1? \x0c<\xf7\x1e\xae\xf1?9\xd1\xaeB\xca\xcf\xf1?{\xf7\xc7{\xd5J\xf1? \x0c<\xf7\x1e\xae\xf1?' -p25 -tp26 -bsS'x_unit' -p27 -S'mm' -p28 -sS'arr_len' -p29 -I3 -sS'years' -p30 -c__builtin__ -set -p31 -((lp32 -S'20161' -p33 -ag20 -aS'2017' -p34 -aS'2018' -p35 -atp36 -Rp37 -sS'y_unit' -p38 -S'GeV' -p39 -sg35 -g3 -(g4 -(I0 -tp40 -g6 -tp41 -Rp42 -(I1 -(I6 -I3 -I3 -tp43 -g13 -I00 -S"\xe2X\x17\xb7\xd1\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xe2X\x17\xb7\xd1\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xe2X\x17\xb7\xd1\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xcb\xf6!o\xb9\xfa\xef?\xedG\x8a\xc8\xb0\n\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xcb\xf6!o\xb9\xfa\xef?\xedG\x8a\xc8\xb0\n\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xcb\xf6!o\xb9\xfa\xef?\xedG\x8a\xc8\xb0\n\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xc0\t\x85\x088\x04\xf0?\n\xbf\xd4\xcf\x9b\n\xf0?}\xe8\x82\xfa\x969\xf0?\xc0\t\x85\x088\x04\xf0?\n\xbf\xd4\xcf\x9b\n\xf0?}\xe8\x82\xfa\x969\xf0?\xc0\t\x85\x088\x04\xf0?\n\xbf\xd4\xcf\x9b\n\xf0?}\xe8\x82\xfa\x969\xf0?\x1an\xc0\xe7\x87\x11\xf0?\xad4)\x05\xdd^\xf0?g'\x83\xa3\xe4U\xf0?\x1an\xc0\xe7\x87\x11\xf0?\xad4)\x05\xdd^\xf0?g'\x83\xa3\xe4U\xf0?\x1an\xc0\xe7\x87\x11\xf0?\xad4)\x05\xdd^\xf0?g'\x83\xa3\xe4U\xf0?\x8a\x1fc\xeeZB\xf0?\x12\xbd\x8cb\xb9\xa5\xf0?\xc8\x0cT\xc6\xbfO\xf0?\x8a\x1fc\xeeZB\xf0?\x12\xbd\x8cb\xb9\xa5\xf0?\xc8\x0cT\xc6\xbfO\xf0?\x8a\x1fc\xeeZB\xf0?\x12\xbd\x8cb\xb9\xa5\xf0?\xc8\x0cT\xc6\xbfO\xf0?\x17\x0e\x84d\x01\x13\xf0?R\xf2\xea\x1c\x032\xf0?\xdflsczB\xf0?\x17\x0e\x84d\x01\x13\xf0?R\xf2\xea\x1c\x032\xf0?\xdflsczB\xf0?\x17\x0e\x84d\x01\x13\xf0?R\xf2\xea\x1c\x032\xf0?\xdflsczB\xf0?" -p44 -tp45 -bsg33 -g3 -(g4 -(I0 -tp46 -g6 -tp47 -Rp48 -(I1 -(I6 -I3 -I3 -tp49 -g13 -I00 -S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x9e\xef\xa7\xc6K7\xf0?\xd4\xb7\xcc\xe9\xb2\x18\xf0?\x0eO\xaf\x94e\x08\xf1?\x9e\xef\xa7\xc6K7\xf0?\xd4\xb7\xcc\xe9\xb2\x18\xf0?\x0eO\xaf\x94e\x08\xf1?\x9e\xef\xa7\xc6K7\xf0?\xd4\xb7\xcc\xe9\xb2\x18\xf0?\x0eO\xaf\x94e\x08\xf1?\xbe\x87K\x8e;%\xf0?\x94M\xb9\xc2\xbb\\\xf0?\x15\x1d\xc9\xe5?$\xf1?\xbe\x87K\x8e;%\xf0?\x94M\xb9\xc2\xbb\\\xf0?\x15\x1d\xc9\xe5?$\xf1?\xbe\x87K\x8e;%\xf0?\x94M\xb9\xc2\xbb\\\xf0?\x15\x1d\xc9\xe5?$\xf1?\xed\xbb"\xf8\xdfJ\xf0?\xb1\x16\x9f\x02`\xbc\xf0?\xa8W\xca2\xc4\xb1\xf0?\xed\xbb"\xf8\xdfJ\xf0?\xb1\x16\x9f\x02`\xbc\xf0?\xa8W\xca2\xc4\xb1\xf0?\xed\xbb"\xf8\xdfJ\xf0?\xb1\x16\x9f\x02`\xbc\xf0?\xa8W\xca2\xc4\xb1\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x8f\xaa&\x88\xba\x0f\xf1?\x19\x90\xbd\xde\xfdq\xf1?\x00\x00\x00\x00\x00\x00\xf0?\x8f\xaa&\x88\xba\x0f\xf1?\x19\x90\xbd\xde\xfdq\xf1?\x00\x00\x00\x00\x00\x00\xf0?\x8f\xaa&\x88\xba\x0f\xf1?\x19\x90\xbd\xde\xfdq\xf1?' -p50 -tp51 -bsS'x_vals' -p52 -g3 -(g4 -(I0 -tp53 -g6 -tp54 -Rp55 -(I1 -(I6 -tp56 -g13 -I00 -S'\x9a\x99\x99\x99\x99\x99\xb9?333333\xd3?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x08@\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00>@' -p57 -tp58 -bsg34 -g3 -(g4 -(I0 -tp59 -g6 -tp60 -Rp61 -(I1 -(I6 -I3 -I3 -tp62 -g13 -I00 -S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?ywd\xac6\xff\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?ywd\xac6\xff\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?ywd\xac6\xff\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?o\xbb\xd0\\\xa7\x11\xf0?\xb6\xbeHh\xcb9\xf0?\xe3p\xe6Ws\x00\xf0?o\xbb\xd0\\\xa7\x11\xf0?\xb6\xbeHh\xcb9\xf0?\xe3p\xe6Ws\x00\xf0?o\xbb\xd0\\\xa7\x11\xf0?\xb6\xbeHh\xcb9\xf0?\xe3p\xe6Ws\x00\xf0?\x05\x17+j0\r\xf0?\xd0D\xd8\xf0\xf4J\xf0?\xdb\xc4\xc9\xfd\x0eE\xf0?\x05\x17+j0\r\xf0?\xd0D\xd8\xf0\xf4J\xf0?\xdb\xc4\xc9\xfd\x0eE\xf0?\x05\x17+j0\r\xf0?\xd0D\xd8\xf0\xf4J\xf0?\xdb\xc4\xc9\xfd\x0eE\xf0?^\xbaI\x0c\x02+\xf0?\xcb\x84_\xea\xe7M\xf0?\xe6"\xbe\x13\xb3^\xf0?^\xbaI\x0c\x02+\xf0?\xcb\x84_\xea\xe7M\xf0?\xe6"\xbe\x13\xb3^\xf0?^\xbaI\x0c\x02+\xf0?\xcb\x84_\xea\xe7M\xf0?\xe6"\xbe\x13\xb3^\xf0?W!\xe5\'\xd5>\xf0?\xfa\xb86T\x8cs\xf0?\x02\xf1\xba~\xc1n\xf0?W!\xe5\'\xd5>\xf0?\xfa\xb86T\x8cs\xf0?\x02\xf1\xba~\xc1n\xf0?W!\xe5\'\xd5>\xf0?\xfa\xb86T\x8cs\xf0?\x02\xf1\xba~\xc1n\xf0?' -p63 -tp64 -bsS'proc' -p65 -S'VH' -p66 -s. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/up_pickle_VH.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/up_pickle_VH.pkl deleted file mode 100644 index 4c52e61b8..000000000 --- a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/up_pickle_VH.pkl +++ /dev/null @@ -1,167 +0,0 @@ -(dp0 -S'perc' -p1 -I00 -sS'y_vals' -p2 -cnumpy.core.multiarray -_reconstruct -p3 -(cnumpy -ndarray -p4 -(I0 -tp5 -S'b' -p6 -tp7 -Rp8 -(I1 -(I3 -tp9 -cnumpy -dtype -p10 -(S'f8' -p11 -I0 -I1 -tp12 -Rp13 -(I3 -S'<' -p14 -NNNI-1 -I-1 -I0 -tp15 -bI00 -S'\x00\x00\x00\x00\x00\x00.@\x00\x00\x00\x00\x00\x00D@\x00\x00\x00\x00\x00\x80K@' -p16 -tp17 -bsS'dtype' -p18 -c__builtin__ -float -p19 -sS'20162' -p20 -g3 -(g4 -(I0 -tp21 -g6 -tp22 -Rp23 -(I1 -(I6 -I3 -I3 -tp24 -g13 -I00 -S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?Ii6\x8f\xc3`\xef?l\xce\xc13\xa1\xc9\xee?\x00\x00\x00\x00\x00\x00\xf0?Ii6\x8f\xc3`\xef?l\xce\xc13\xa1\xc9\xee?\x00\x00\x00\x00\x00\x00\xf0?Ii6\x8f\xc3`\xef?l\xce\xc13\xa1\xc9\xee?\x00\x00\x00\x00\x00\x00\xf0?8\x82T\x8a\x1d\x8d\xef?0b\x9f\x00\x8a\x91\xee?{\xbb%9`W\xef?8\x82T\x8a\x1d\x8d\xef?0b\x9f\x00\x8a\x91\xee?{\xbb%9`W\xef?8\x82T\x8a\x1d\x8d\xef?0b\x9f\x00\x8a\x91\xee?{\xbb%9`W\xef?\xff\xe8\x9b4\r\x8a\xef?\x97Tm7\xc17\xef?W\n\x81\\\xe2H\xee?\xff\xe8\x9b4\r\x8a\xef?\x97Tm7\xc17\xef?W\n\x81\\\xe2H\xee?\xff\xe8\x9b4\r\x8a\xef?\x97Tm7\xc17\xef?W\n\x81\\\xe2H\xee?\x94O\x8fm\x19p\xef?\xbc\xb3v\xdb\x85f\xee?s\x9c\xdb\x84{e\xef?\x94O\x8fm\x19p\xef?\xbc\xb3v\xdb\x85f\xee?s\x9c\xdb\x84{e\xef?\x94O\x8fm\x19p\xef?\xbc\xb3v\xdb\x85f\xee?s\x9c\xdb\x84{e\xef?' -p25 -tp26 -bsS'x_unit' -p27 -S'mm' -p28 -sS'arr_len' -p29 -I3 -sS'years' -p30 -c__builtin__ -set -p31 -((lp32 -S'20161' -p33 -ag20 -aS'2017' -p34 -aS'2018' -p35 -atp36 -Rp37 -sS'y_unit' -p38 -S'GeV' -p39 -sg35 -g3 -(g4 -(I0 -tp40 -g6 -tp41 -Rp42 -(I1 -(I6 -I3 -I3 -tp43 -g13 -I00 -S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?F"4\x82\x8d\xeb\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?F"4\x82\x8d\xeb\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?F"4\x82\x8d\xeb\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xa6\x81\x1f\xd5\xb0\xdf\xef?\xf8l\x1d\x1c\xec\xcd\xef?\x17\xd7\xf8L\xf6\xcf\xed?\xa6\x81\x1f\xd5\xb0\xdf\xef?\xf8l\x1d\x1c\xec\xcd\xef?\x17\xd7\xf8L\xf6\xcf\xed?\xa6\x81\x1f\xd5\xb0\xdf\xef?\xf8l\x1d\x1c\xec\xcd\xef?\x17\xd7\xf8L\xf6\xcf\xed?\x96\xe8,\xb3\x08\xc5\xef?\xc9\xaa\x087\x19U\xef?\x83P\xde\xc7\xd1\x1c\xef?\x96\xe8,\xb3\x08\xc5\xef?\xc9\xaa\x087\x19U\xef?\x83P\xde\xc7\xd1\x1c\xef?\x96\xe8,\xb3\x08\xc5\xef?\xc9\xaa\x087\x19U\xef?\x83P\xde\xc7\xd1\x1c\xef?\x85B\x04\x1cB\x95\xef?\xab\x933\x14w<\xef?\xf2\xb3\x91\xeb\xa6\x14\xef?\x85B\x04\x1cB\x95\xef?\xab\x933\x14w<\xef?\xf2\xb3\x91\xeb\xa6\x14\xef?\x85B\x04\x1cB\x95\xef?\xab\x933\x14w<\xef?\xf2\xb3\x91\xeb\xa6\x14\xef?/\xf9\x9f\xfc\xdd\xbb\xef?\n\xf7\xca\xbcU\xd7\xee?C\x8f\x18=\xb7P\xee?/\xf9\x9f\xfc\xdd\xbb\xef?\n\xf7\xca\xbcU\xd7\xee?C\x8f\x18=\xb7P\xee?/\xf9\x9f\xfc\xdd\xbb\xef?\n\xf7\xca\xbcU\xd7\xee?C\x8f\x18=\xb7P\xee?' -p44 -tp45 -bsg33 -g3 -(g4 -(I0 -tp46 -g6 -tp47 -Rp48 -(I1 -(I6 -I3 -I3 -tp49 -g13 -I00 -S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?dY0\xf1G\xd1\xef?rP\xc2L\xdb?\xef?\x00\x00\x00\x00\x00\x00\xf0?dY0\xf1G\xd1\xef?rP\xc2L\xdb?\xef?\x00\x00\x00\x00\x00\x00\xf0?dY0\xf1G\xd1\xef?rP\xc2L\xdb?\xef?\x00\x00\x00\x00\x00\x00\xf0??\xfdg\xcd\x8f?\xef?\xa6\xb5il\xaf\x85\xee?\xa6|\x08\xaaF/\xee??\xfdg\xcd\x8f?\xef?\xa6\xb5il\xaf\x85\xee?\xa6|\x08\xaaF/\xee??\xfdg\xcd\x8f?\xef?\xa6\xb5il\xaf\x85\xee?\xa6|\x08\xaaF/\xee?=d\xca\x87\xa0\xea\xee?z\xe29[@\xe8\xed?k\x10\xe6v/w\xee?=d\xca\x87\xa0\xea\xee?z\xe29[@\xe8\xed?k\x10\xe6v/w\xee?=d\xca\x87\xa0\xea\xee?z\xe29[@\xe8\xed?k\x10\xe6v/w\xee?\t\xa4\xc4\xae\xed\xed\xed?\xcd!\xa9\x85\x92\xc9\xee?\xba\xda\x8a\xfdew\xee?\t\xa4\xc4\xae\xed\xed\xed?\xcd!\xa9\x85\x92\xc9\xee?\xba\xda\x8a\xfdew\xee?\t\xa4\xc4\xae\xed\xed\xed?\xcd!\xa9\x85\x92\xc9\xee?\xba\xda\x8a\xfdew\xee?' -p50 -tp51 -bsS'x_vals' -p52 -g3 -(g4 -(I0 -tp53 -g6 -tp54 -Rp55 -(I1 -(I6 -tp56 -g13 -I00 -S'\x9a\x99\x99\x99\x99\x99\xb9?333333\xd3?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x08@\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00>@' -p57 -tp58 -bsg34 -g3 -(g4 -(I0 -tp59 -g6 -tp60 -Rp61 -(I1 -(I6 -I3 -I3 -tp62 -g13 -I00 -S'od\x1e\xf9\x83\x01\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?od\x1e\xf9\x83\x01\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?od\x1e\xf9\x83\x01\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xe3\x88\xb5\xf8\x14\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xe3\x88\xb5\xf8\x14\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xe3\x88\xb5\xf8\x14\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xbd\x8f\xa39\xb2\xf2\xef?\xa8\x8eUJ\xcf\xf4\xef?YLl>\xae\x8d\xef?\xbd\x8f\xa39\xb2\xf2\xef?\xa8\x8eUJ\xcf\xf4\xef?YLl>\xae\x8d\xef?\xbd\x8f\xa39\xb2\xf2\xef?\xa8\x8eUJ\xcf\xf4\xef?YLl>\xae\x8d\xef?S\x92u8\xba\xca\xef?Jz\x18Z\x9d\x1c\xef?\x0e\xd9@\xba\xd84\xef?S\x92u8\xba\xca\xef?Jz\x18Z\x9d\x1c\xef?\x0e\xd9@\xba\xd84\xef?S\x92u8\xba\xca\xef?Jz\x18Z\x9d\x1c\xef?\x0e\xd9@\xba\xd84\xef?\xb8\x03u\xca\xa3\x9b\xef?\xa5\x82\x8a\xaa_i\xef?\xdd^\xd2\x18\xad#\xef?\xb8\x03u\xca\xa3\x9b\xef?\xa5\x82\x8a\xaa_i\xef?\xdd^\xd2\x18\xad#\xef?\xb8\x03u\xca\xa3\x9b\xef?\xa5\x82\x8a\xaa_i\xef?\xdd^\xd2\x18\xad#\xef?\x9b\xffW\x1d9R\xef?\xf7\xaf\xac4)\x85\xee?U\xa4\xc2\xd8B\x90\xee?\x9b\xffW\x1d9R\xef?\xf7\xaf\xac4)\x85\xee?U\xa4\xc2\xd8B\x90\xee?\x9b\xffW\x1d9R\xef?\xf7\xaf\xac4)\x85\xee?U\xa4\xc2\xd8B\x90\xee?' -p63 -tp64 -bsS'proc' -p65 -S'VH' -p66 -s. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/make_combine_tarball.sh b/MFVNeutralino/test/ForLimits/make_combine_tarball.sh new file mode 100644 index 000000000..cca8d815b --- /dev/null +++ b/MFVNeutralino/test/ForLimits/make_combine_tarball.sh @@ -0,0 +1,50 @@ +#!/bin/bash +# Build combine_env.tar.gz for shipping to Condor worker nodes. +# +# Run this once after building CMSSW_14_1_0_pre4 + HiggsAnalysis/CombinedLimit. +# The tarball is placed at $CMSSW_BASE/../combine_env.tar.gz (one level above +# the CMSSW installation), which is where submitCombine.py expects it by default. +# +# Prerequisites: source CMSSW_14_1_0_pre4 cmsenv before running this script. +# source /cvmfs/cms.cern.ch/cmsset_default.sh +# cd /src && cmsenv && cd - +# bash make_combine_tarball.sh +set -e + +if [ -z "$CMSSW_BASE" ]; then + echo "ERROR: CMSSW_BASE not set -- source cmsenv first" + exit 1 +fi + +ARCH=$(ls "$CMSSW_BASE/bin") +OUT="$(dirname "$CMSSW_BASE")/combine_env.tar.gz" +TMPDIR=$(mktemp -d) +trap "rm -rf $TMPDIR" EXIT + +mkdir -p "$TMPDIR/combine_env/bin" +mkdir -p "$TMPDIR/combine_env/lib" +mkdir -p "$TMPDIR/combine_env/python/HiggsAnalysis/CombinedLimit" +mkdir -p "$TMPDIR/combine_env/src/HiggsAnalysis/CombinedLimit/python" + +# Binaries +cp "$CMSSW_BASE/bin/$ARCH/combine" "$TMPDIR/combine_env/bin/" +cp "$CMSSW_BASE/bin/$ARCH/text2workspace.py" "$TMPDIR/combine_env/bin/" + +# Library + ROOT dictionary files +cp "$CMSSW_BASE/lib/$ARCH/libHiggsAnalysisCombinedLimit.so" "$TMPDIR/combine_env/lib/" +cp "$CMSSW_BASE/lib/$ARCH/HiggsAnalysisCombinedLimit_xr_rdict.pcm" "$TMPDIR/combine_env/lib/" +cp "$CMSSW_BASE/lib/$ARCH/HiggsAnalysisCombinedLimit_xr.rootmap" "$TMPDIR/combine_env/lib/" + +# Python modules (CMSSW src/ layout required by CombinedLimit/__init__.py) +cp "$CMSSW_BASE/src/HiggsAnalysis/CombinedLimit/python/"*.py \ + "$TMPDIR/combine_env/src/HiggsAnalysis/CombinedLimit/python/" + +# Python namespace stubs (used at import time to locate the src/ tree) +# The CombinedLimit __init__.py is installed to $CMSSW_BASE/python/ by scram b, +# not in src/ -- it contains the CMSSW path-resolution logic. +cp "$CMSSW_BASE/python/HiggsAnalysis/CombinedLimit/__init__.py" \ + "$TMPDIR/combine_env/python/HiggsAnalysis/CombinedLimit/__init__.py" +echo "# Namespace package" > "$TMPDIR/combine_env/python/HiggsAnalysis/__init__.py" + +tar -czf "$OUT" -C "$TMPDIR" combine_env +echo "Written: $OUT ($(du -sh "$OUT" | cut -f1))" diff --git a/MFVNeutralino/test/ForLimits/submitCombine.py b/MFVNeutralino/test/ForLimits/submitCombine.py index ac6222c9e..55f2d5d2b 100644 --- a/MFVNeutralino/test/ForLimits/submitCombine.py +++ b/MFVNeutralino/test/ForLimits/submitCombine.py @@ -1,16 +1,21 @@ #!/usr/bin/env python """ Discover all signal datacards under ForLimits/Datacards/, group them by -(proc, ctau, mass), and submit one Condor job per hypothesis that: - 1. combineCards.py -- merges per-year/per-channel cards into one Run-2 card - 2. combine -M AsymptoticLimits -- 95% CL expected/observed limits - 3. combine -M FitDiagnostics -- best-fit signal strength + s+b shapes +(proc, ctau, mass), and submit one Condor job per hypothesis that runs: + 1. combine -M AsymptoticLimits -- 95% CL expected/observed limits + 2. combine -M FitDiagnostics -- best-fit signal strength + s+b shapes + +Cards are merged locally by combineCards.py before submission (requires the +CMSSW_14_1_0_pre4 environment to be active when running this script). +The combine binary and libHiggsAnalysisCombinedLimit.so are shipped via +transfer_input_files so worker nodes do not need /uscms/home or /uscms_data. Prerequisites - makeLimitsInputROOT.py must have been run for all years + channels so that Datacards/{lep,bjet}/Datacard_*.txt files exist. - - CMSSW_14_1_0_pre4 + Combine must be installed. Set CMSSW_14_BASE below. - To install from scratch (run outside apptainer, on LPC EL9 node): + - Run this script with CMSSW_14_1_0_pre4 + Combine sourced (cmsenv). + combineCards.py and the combine binary must be in PATH. + To install from scratch (on LPC EL9 node, outside apptainer): cmsrel CMSSW_14_1_0_pre4 cd CMSSW_14_1_0_pre4/src && cmsenv git clone https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit.git HiggsAnalysis/CombinedLimit @@ -20,6 +25,7 @@ python submitCombine.py # all signals python submitCombine.py --subset VH,mfv_neu # selected processes python submitCombine.py --dry-run # list jobs without submitting + python submitCombine.py --skip-existing # skip already-completed jobs """ import os import sys @@ -28,56 +34,73 @@ import argparse import subprocess -# ============================================================================= -# --- SET THIS AFTER INSTALLING CMSSW_14_1_0_pre4 ---------------------------- -CMSSW_14_BASE = "/uscms/home/gdecastr/nobackup/work/CMSSW_14_1_0_pre4" -# ============================================================================= - HERE = os.path.dirname(os.path.abspath(__file__)) DATACARD_DIR = os.path.join(HERE, "Datacards") COMBINE_OUT = os.path.join(HERE, "CombineOutput") CONDOR_DIR = os.path.join(HERE, "CombineCondor") +# Tarball of user-built Combine files: binary, library, .pcm/.rootmap. +# Expected at $CMSSW_BASE/../combine_env.tar.gz (one level above the CMSSW installation). +# Override by setting the COMBINE_TARBALL environment variable. +COMBINE_TARBALL = os.environ.get( + "COMBINE_TARBALL", + os.path.join(os.path.dirname(os.environ.get("CMSSW_BASE", "")), "combine_env.tar.gz"), +) +# CMSSW_14_1_0 (final release) is in CVMFS and has the same ABI as pre4. +# Worker nodes only bind /cvmfs, so we set up the environment from there. +CVMFS_CMSSW14 = "/cvmfs/cms.cern.ch/el9_amd64_gcc12/cms/cmssw/CMSSW_14_1_0/src" + YEARS = ("20161", "20162", "2017", "2018") CHANNELS = ("lep", "bjet") # --------------------------------------------------------------------------- # Per-job shell script +# Cards are pre-merged locally; this script only runs combine. +# CMSSW_14_1_0 from CVMFS sets up ROOT/RooFit; the shipped .so provides Combine. # --------------------------------------------------------------------------- _JOB_SH = """\ #!/bin/bash set -e source /cvmfs/cms.cern.ch/cmsset_default.sh -cd {cmssw_src} +cd {cvmfs_cmssw14} eval $(scramv1 runtime -sh) -mkdir -p {work_dir} -cd {work_dir} +cd /srv +tar xf combine_env.tar.gz +export PATH=/srv/combine_env/bin:$PATH +export LD_LIBRARY_PATH=/srv/combine_env/lib:$LD_LIBRARY_PATH -echo "=== combineCards: {sig_id} ===" -combineCards.py {card_args} > combined_{sig_id}.txt - -echo "=== AsymptoticLimits ===" +echo "=== AsymptoticLimits: {sig_id} ===" combine -M AsymptoticLimits \\ --name {sig_id} \\ - combined_{sig_id}.txt \\ + workspace_{sig_id}.root \\ -v 1 -echo "=== FitDiagnostics ===" +# FitDiagnostics is best-effort; failure does not abort the job. +set +e +echo "=== FitDiagnostics: {sig_id} ===" combine -M FitDiagnostics \\ --name {sig_id} \\ - combined_{sig_id}.txt \\ + workspace_{sig_id}.root \\ --saveShapes --saveWithUncertainties \\ -v 1 +FD_STATUS=$? +set -e +if [ $FD_STATUS -ne 0 ]; then + echo "WARNING: FitDiagnostics failed (status $FD_STATUS) -- AsymptoticLimits result is still valid" +fi echo "=== Done: {sig_id} ===" """ # --------------------------------------------------------------------------- # Condor JDL +# transfer_input_files ships combine + the one user-built .so + the merged card. +# initialdir directs returned output files straight into CombineOutput/sig_id/. # --------------------------------------------------------------------------- _JDL = """\ universe = vanilla executable = {job_sh} +initialdir = {work_dir} output = {log_pfx}.out error = {log_pfx}.err log = {log_pfx}.log @@ -86,7 +109,8 @@ +DesiredOS = "EL9" should_transfer_files = YES when_to_transfer_output = ON_EXIT -transfer_output_files = "" +transfer_input_files = {combine_tarball},{workspace} +transfer_output_files = higgsCombine{sig_id}.AsymptoticLimits.mH120.root queue 1 """ @@ -128,23 +152,42 @@ def _write_job(sig_id, cards, dry_run): _makedirs(work_dir) _makedirs(condor_dir) - card_args = " ".join("%s=%s" % (k, v) for k, v in sorted(cards.items())) - cmssw_src = os.path.join(CMSSW_14_BASE, "src") + # Pre-merge cards locally (runs on submit node where NFS is available). + card_args = " ".join("%s=%s" % (k, v) for k, v in sorted(cards.items())) + combined_card = os.path.join(condor_dir, "combined_%s.txt" % sig_id) + workspace = os.path.join(condor_dir, "workspace_%s.root" % sig_id) + if not dry_run: + ret = subprocess.call("combineCards.py %s > %s" % (card_args, combined_card), shell=True) + if ret != 0: + print("WARNING: combineCards.py failed for %s -- skipping" % sig_id) + return False + # Convert to RooStats workspace locally (requires CMSSW_14_1_0_pre4 Python). + # Worker nodes run combine on the workspace in pure C++ -- no Python needed there. + ret = subprocess.call( + "text2workspace.py %s -m 125 -o %s" % (combined_card, workspace), shell=True) + if ret != 0: + print("WARNING: text2workspace.py failed for %s -- skipping" % sig_id) + return False job_sh = os.path.join(condor_dir, "run.sh") with open(job_sh, "w") as fh: fh.write(_JOB_SH.format( - cmssw_src = cmssw_src, - work_dir = work_dir, - card_args = card_args, - sig_id = sig_id, + cvmfs_cmssw14 = CVMFS_CMSSW14, + sig_id = sig_id, )) os.chmod(job_sh, stat.S_IRWXU | stat.S_IRGRP | stat.S_IXGRP | stat.S_IROTH | stat.S_IXOTH) log_pfx = os.path.join(condor_dir, "job") jdl_fn = os.path.join(condor_dir, "submit.jdl") with open(jdl_fn, "w") as fh: - fh.write(_JDL.format(job_sh=job_sh, log_pfx=log_pfx)) + fh.write(_JDL.format( + job_sh = job_sh, + work_dir = work_dir, + log_pfx = log_pfx, + combine_tarball = COMBINE_TARBALL, + workspace = workspace, + sig_id = sig_id, + )) if not dry_run: ret = subprocess.call("condor_submit " + jdl_fn, shell=True) @@ -165,9 +208,16 @@ def main(): help="Skip hypotheses that already have AsymptoticLimits output") args = ap.parse_args() - if "CHANGEME" in CMSSW_14_BASE and not args.dry_run: - print("ERROR: set CMSSW_14_BASE in submitCombine.py before submitting.") - sys.exit(1) + if not args.dry_run: + for path in (COMBINE_TARBALL, CVMFS_CMSSW14): + if not os.path.exists(path): + print("ERROR: required path not found: %s" % path) + sys.exit(1) + import shutil + for tool in ("combineCards.py", "text2workspace.py"): + if not shutil.which(tool): + print("ERROR: %s not in PATH -- source CMSSW_14_1_0_pre4 cmsenv first" % tool) + sys.exit(1) subset = set(args.subset.split(",")) if args.subset else None hyps = find_hypotheses() @@ -188,8 +238,8 @@ def main(): if os.path.exists(out_fn): n_skip += 1 continue - _write_job(sig_id, hyps[sig_id], args.dry_run) - n += 1 + if _write_job(sig_id, hyps[sig_id], args.dry_run) is not False: + n += 1 if n_skip: print("Skipped %d already-completed hypotheses (--skip-existing)" % n_skip) diff --git a/MFVNeutralino/test/MiniTree/studyNewTriggers.cc b/MFVNeutralino/test/MiniTree/studyNewTriggers.cc deleted file mode 100644 index 3d5e5e0c2..000000000 --- a/MFVNeutralino/test/MiniTree/studyNewTriggers.cc +++ /dev/null @@ -1,293 +0,0 @@ -#include -#include "TCanvas.h" -#include "TFile.h" -#include "TH2.h" -#include "TTree.h" -#include "TVector2.h" -#include "JMTucker/Tools/interface/Utilities.h" -#include "JMTucker/MFVNeutralino/interface/MiniNtuple.h" -#include "JMTucker/MFVNeutralinoFormats/interface/Event.h" - -const bool prints = false; - -TH1D* h_MET = 0; -TH1D* h_nvtx = 0; -TH1D* h_dbv = 0; - -// FIXME probably put all of these into a map -TH1D* h_dbv_all = 0; -TH1D* h_dbv_all_coarse = 0; -TH1D* h_dbv_HT = 0; -TH1D* h_dbv_HT_coarse = 0; -TH1D* h_dbv_Bjet = 0; -TH1D* h_dbv_Bjet_coarse = 0; -TH1D* h_dbv_DisplacedDijet = 0; -TH1D* h_dbv_DisplacedDijet_coarse = 0; -TH1D* h_dbv_MET = 0; -TH1D* h_dbv_MET_coarse = 0; -TH1D* h_dbv_passHT_failBjet = 0; -TH1D* h_dbv_passHT_failBjet_coarse = 0; -TH1D* h_dbv_failHT_passBjet = 0; -TH1D* h_dbv_failHT_passBjet_coarse = 0; -TH1D* h_dbv_passDisplacedDijet_failBjet = 0; -TH1D* h_dbv_passDisplacedDijet_failBjet_coarse = 0; -TH1D* h_dbv_failDisplacedDijet_passBjet = 0; -TH1D* h_dbv_failDisplacedDijet_passBjet_coarse = 0; - -TH1D* h_dvv_all = 0; -TH1D* h_dvv_all_coarse = 0; -TH1D* h_dvv_HT = 0; -TH1D* h_dvv_HT_coarse = 0; -TH1D* h_dvv_Bjet = 0; -TH1D* h_dvv_Bjet_coarse = 0; -TH1D* h_dvv_DisplacedDijet = 0; -TH1D* h_dvv_DisplacedDijet_coarse = 0; -TH1D* h_dvv_MET = 0; -TH1D* h_dvv_MET_coarse = 0; -TH1D* h_dvv_passHT_failBjet = 0; -TH1D* h_dvv_passHT_failBjet_coarse = 0; -TH1D* h_dvv_failHT_passBjet = 0; -TH1D* h_dvv_failHT_passBjet_coarse = 0; -TH1D* h_dvv_passDisplacedDijet_failBjet = 0; -TH1D* h_dvv_passDisplacedDijet_failBjet_coarse = 0; -TH1D* h_dvv_failDisplacedDijet_passBjet = 0; -TH1D* h_dvv_failDisplacedDijet_passBjet_coarse = 0; - -bool pass_hlt(const mfv::MiniNtuple& nt, size_t i){ - return bool((nt.pass_hlt >> i) & 1); -} - -// analyze method is a callback passed to MiniNtuple::loop from main that is called once per tree entry -bool analyze(long long j, long long je, const mfv::MiniNtuple& nt) { - if (prints) std::cout << "Entry " << j << "\n"; - - bool passesHTTrigger = nt.satisfiesTriggerAndOffline(mfv::b_HLT_PFHT1050); - - // pt requirements: go 40 GeV above threshold based on https://twiki.cern.ch/twiki/bin/view/CMSPublic/HLTplots2018DataJets - // HT requirements: go 150 GeV above threshold based on what we've done with the HT1050 trigger - // - // should think about whether we can be more aggressive with the offline HT threshold - // e.g. from https://twiki.cern.ch/twiki/pub/CMSPublic/HighLevelTriggerRunIIResults/SUSY2015_trig-Ele15_HT350__var-HT.png - // it looks like the HT350 leg is 95% efficient already at ~400 GeV - bool passesBjetTrigger = nt.satisfiesTriggerAndOffline(mfv::b_HLT_DoublePFJets100MaxDeta1p6_DoubleCaloBTagCSV_p33) || nt.satisfiesTriggerAndOffline(mfv::b_HLT_PFHT300PT30_QuadPFJet_75_60_45_40_TriplePFBTagCSV_3p0); - - - bool passesDisplacedDijetTrigger = nt.satisfiesTriggerAndOffline(mfv::b_HLT_HT430_DisplacedDijet40_DisplacedTrack) || nt.satisfiesTriggerAndOffline(mfv::b_HLT_HT650_DisplacedDijet60_Inclusive); - - bool passesMETTrigger = pass_hlt(nt, mfv::b_HLT_PFMETNoMu120_PFMHTNoMu120_IDTight); // 25-01-21_edit - - double w = nt.weight; // modify as needed before filling hists - - // minitree is stupid and doesn't store past the first two vertices - // can tighten cuts, but you won't ever be able to pull out the vertices past 2 in 3-vertex events - // on background this should be negliglble, but this attempts to handle it as best as we can at this point - - //Fill MET - h_MET->Fill(nt.met,w); - - std::vector dbvs; - const int ivtxe = std::min(int(nt.nvtx), 2); - - for (int ivtx = 0; ivtx < ivtxe; ++ivtx) { - int ntracks = 0; - bool genmatch = false; - double dbv = 0; - - if (ivtx == 0) { - ntracks = nt.ntk0; - genmatch = nt.genmatch0; - dbv = hypot(nt.x0, nt.y0); - } - else { - ntracks = nt.ntk1; - genmatch = nt.genmatch1; - dbv = hypot(nt.x1, nt.y1); - } - - if (dbv > 0.01) dbvs.push_back(dbv); - } - - int nvtx = dbvs.size(); - if (nt.nvtx > 2) // deal with the aforementioned stupidity - nvtx += int(nt.nvtx) - 2; - h_nvtx->Fill(nvtx, w); - - if (dbvs.size() == 1){ - h_dbv->Fill(dbvs[0], w); - - h_dbv_all->Fill(dbvs[0], w); - h_dbv_all_coarse->Fill(dbvs[0], w); - - // HT trigger - if(passesHTTrigger){ - h_dbv_HT->Fill(dbvs[0], w); - h_dbv_HT_coarse->Fill(dbvs[0], w); - } - // Bjet trigger - if(passesBjetTrigger){ - h_dbv_Bjet->Fill(dbvs[0], w); - h_dbv_Bjet_coarse->Fill(dbvs[0], w); - } - // Displaced Dijet trigger - if(passesDisplacedDijetTrigger){ - h_dbv_DisplacedDijet->Fill(dbvs[0], w); - h_dbv_DisplacedDijet_coarse->Fill(dbvs[0], w); - } - // MET trigger - if(passesMETTrigger && nt.njets >= 2 ){ - h_dbv_MET->Fill(dbvs[0], w); - h_dbv_MET_coarse->Fill(dbvs[0], w); - } - // pass HT trigger fail Bjet trigger (to study the shape differences) - if(passesHTTrigger && !passesBjetTrigger && nt.njets >= 4 && nt.ht() > 1200){ - h_dbv_passHT_failBjet->Fill(dbvs[0], w); - h_dbv_passHT_failBjet_coarse->Fill(dbvs[0], w); - // pass DisplacedDijet trigger fail Bjet trigger (to study the shape differences) - if(passesDisplacedDijetTrigger && !passesBjetTrigger){ - h_dbv_passDisplacedDijet_failBjet->Fill(dbvs[0], w); - h_dbv_passDisplacedDijet_failBjet_coarse->Fill(dbvs[0], w); - } - // pass Bjet trigger fail DisplacedDijet trigger (to study the shape differences) - if(!passesDisplacedDijetTrigger && passesBjetTrigger){ - h_dbv_failDisplacedDijet_passBjet->Fill(dbvs[0], w); - h_dbv_failDisplacedDijet_passBjet_coarse->Fill(dbvs[0], w); - } - } - else if (dbvs.size() == 2){ - double dvv = hypot(nt.x0 - nt.x1, nt.y0 - nt.y1); - h_dvv_all->Fill(dvv, w); - h_dvv_all_coarse->Fill(dvv, w); - - // HT trigger - if(passesHTTrigger){ - h_dvv_HT->Fill(dvv, w); - h_dvv_HT_coarse->Fill(dvv, w); - } - // Bjet trigger - if(passesBjetTrigger){ - h_dvv_Bjet->Fill(dvv, w); - h_dvv_Bjet_coarse->Fill(dvv, w); - } - // Displaced Dijet trigger - if(passesDisplacedDijetTrigger){ - h_dvv_DisplacedDijet->Fill(dvv, w); - h_dvv_DisplacedDijet_coarse->Fill(dvv, w); - } - // MET trigger - if(passesMETTrigger && nt.njets >= 2 ){ - h_dvv_MET->Fill(dvv, w); - h_dvv_MET_coarse->Fill(dvv, w); - } - // pass HT trigger fail Bjet trigger (to study the shape differences) - if(passesHTTrigger && !passesBjetTrigger && nt.njets >= 4 && nt.ht() > 1200){ - h_dvv_passHT_failBjet->Fill(dvv, w); - h_dvv_passHT_failBjet_coarse->Fill(dvv, w); - // pass DisplacedDijet trigger fail Bjet trigger (to study the shape differences) - if(passesDisplacedDijetTrigger && !passesBjetTrigger){ - h_dvv_passDisplacedDijet_failBjet->Fill(dvv, w); - h_dvv_passDisplacedDijet_failBjet_coarse->Fill(dvv, w); - } - // pass Bjet trigger fail DisplacedDijet trigger (to study the shape differences) - if(!passesDisplacedDijetTrigger && passesBjetTrigger){ - h_dvv_failDisplacedDijet_passBjet->Fill(dvv, w); - h_dvv_failDisplacedDijet_passBjet_coarse->Fill(dvv, w); - } - } - - return true; -} - -int main(int argc, char** argv) { - if (argc < 4) { - fprintf(stderr, "usage: %s in_fn out_fn ntk\n", argv[0]); - return 1; - } - - // get args, can add any options you want - - const char* fn = argv[1]; - const char* out_fn = argv[2]; - const int ntk = atoi(argv[3]); - - if (!(ntk == 3 || ntk == 4 || ntk == 7 || ntk == 5)) { - fprintf(stderr, "ntk must be one of 3,4,7,5\n"); - return 1; - } - - TFile* in_f = TFile::Open(fn); - TFile out_f(out_fn, "recreate"); - - // setup root - TH1::SetDefaultSumw2(); - - // copy the normalization hist--if you don't read the whole tree by returning false in analyze above, you're screwed - out_f.mkdir("mfvWeight")->cd(); - in_f->Get("mfvWeight/h_sums")->Clone("h_sums"); - out_f.cd(); - - // also copy this hist if it is present (in an ntuple rather than a MiniTree) - if(in_f->GetDirectory("mcStat")){ - out_f.mkdir("mcStat")->cd(); - in_f->Get("mcStat/h_sums")->Clone("h_sums"); - out_f.cd(); - } - - // book hists - h_MET = new TH1D("h_MET", ";MET (GeV);Events",200,0,2000); - h_nvtx = new TH1D("h_nvtx", ";# of vertices;Events", 10, 0, 10); - h_dbv = new TH1D("h_dbv", ";d_{BV} (cm);Events/20 #mum", 1250, 0, 2.5); - - h_dbv_all = new TH1D("h_dbv_all", ";d_{BV} (cm);Events/1000 #mum", 50, 0, 5.); - h_dbv_all_coarse = new TH1D("h_dbv_all_coarse", ";d_{BV} (cm);Events/100 #mum", 40, 0, 0.4); - h_dbv_HT = new TH1D("h_dbv_HT", ";d_{BV} (cm);Events/1000 #mum", 50, 0, 5.); - h_dbv_HT_coarse = new TH1D("h_dbv_HT_coarse", ";d_{BV} (cm);Events/100 #mum", 40, 0, 0.4); - h_dbv_Bjet = new TH1D("h_dbv_Bjet", ";d_{BV} (cm);Events/1000 #mum", 50, 0, 5.); - h_dbv_Bjet_coarse = new TH1D("h_dbv_Bjet_coarse", ";d_{BV} (cm);Events/100 #mum", 40, 0, 0.4); - h_dbv_DisplacedDijet = new TH1D("h_dbv_DisplacedDijet", ";d_{BV} (cm);Events/1000 #mum", 50, 0, 5.); - h_dbv_DisplacedDijet_coarse = new TH1D("h_dbv_DisplacedDijet_coarse", ";d_{BV} (cm);Events/100 #mum", 40, 0, 0.4); - h_dbv_MET = new TH1D("h_dbv_MET", ";d_{BV} (cm);Events/1000 #mum", 50, 0, 5.); - h_dbv_MET_coarse = new TH1D("h_dbv_MET_coarse", ";d_{BV} (cm);Events/100 #mum", 40, 0, 0.4); - h_dbv_passHT_failBjet = new TH1D("h_dbv_passHT_failBjet", ";d_{BV} (cm);Events/1000 #mum", 50, 0, 5.); - h_dbv_passHT_failBjet_coarse = new TH1D("h_dbv_passHT_failBjet_coarse", ";d_{BV} (cm);Events/100 #mum", 40, 0, 0.4); - h_dbv_failHT_passBjet = new TH1D("h_dbv_failHT_passBjet", ";d_{BV} (cm);Events/1000 #mum", 50, 0, 5.); - h_dbv_failHT_passBjet_coarse = new TH1D("h_dbv_failHT_passBjet_coarse", ";d_{BV} (cm);Events/100 #mum", 40, 0, 0.4); - h_dbv_passDisplacedDijet_failBjet = new TH1D("h_dbv_passDisplacedDijet_failBjet", ";d_{BV} (cm);Events/1000 #mum", 50, 0, 5.); - h_dbv_passDisplacedDijet_failBjet_coarse = new TH1D("h_dbv_passDisplacedDijet_failBjet_coarse", ";d_{BV} (cm);Events/100 #mum", 40, 0, 0.4); - h_dbv_failDisplacedDijet_passBjet = new TH1D("h_dbv_failDisplacedDijet_passBjet", ";d_{BV} (cm);Events/1000 #mum", 50, 0, 5.); - h_dbv_failDisplacedDijet_passBjet_coarse = new TH1D("h_dbv_failDisplacedDijet_passBjet_coarse", ";d_{BV} (cm);Events/100 #mum", 40, 0, 0.4); - - h_dvv_all = new TH1D("h_dvv_all", ";d_{VV} (cm);Events/1000 #mum", 50, 0, 5.); - h_dvv_all_coarse = new TH1D("h_dvv_all_coarse", ";d_{VV} (cm);Events/100 #mum", 40, 0, 0.4); - h_dvv_HT = new TH1D("h_dvv_HT", ";d_{VV} (cm);Events/1000 #mum", 50, 0, 5.); - h_dvv_HT_coarse = new TH1D("h_dvv_HT_coarse", ";d_{VV} (cm);Events/100 #mum", 40, 0, 0.4); - h_dvv_Bjet = new TH1D("h_dvv_Bjet", ";d_{VV} (cm);Events/1000 #mum", 50, 0, 5.); - h_dvv_Bjet_coarse = new TH1D("h_dvv_Bjet_coarse", ";d_{VV} (cm);Events/100 #mum", 40, 0, 0.4); - h_dvv_DisplacedDijet = new TH1D("h_dvv_DisplacedDijet", ";d_{VV} (cm);Events/1000 #mum", 50, 0, 5.); - h_dvv_DisplacedDijet_coarse = new TH1D("h_dvv_DisplacedDijet_coarse", ";d_{VV} (cm);Events/100 #mum", 40, 0, 0.4); - h_dvv_MET = new TH1D("h_dvv_MET", ";d_{VV} (cm);Events/1000 #mum", 50, 0, 5.); - h_dvv_MET_coarse = new TH1D("h_dvv_MET_coarse", ";d_{VV} (cm);Events/100 #mum", 40, 0, 0.4); - h_dvv_passHT_failBjet = new TH1D("h_dvv_passHT_failBjet", ";d_{VV} (cm);Events/1000 #mum", 50, 0, 5.); - h_dvv_passHT_failBjet_coarse = new TH1D("h_dvv_passHT_failBjet_coarse", ";d_{VV} (cm);Events/100 #mum", 40, 0, 0.4); - h_dvv_failHT_passBjet = new TH1D("h_dvv_failHT_passBjet", ";d_{VV} (cm);Events/1000 #mum", 50, 0, 5.); - h_dvv_failHT_passBjet_coarse = new TH1D("h_dvv_failHT_passBjet_coarse", ";d_{VV} (cm);Events/100 #mum", 40, 0, 0.4); - h_dvv_passDisplacedDijet_failBjet = new TH1D("h_dvv_passDisplacedDijet_failBjet", ";d_{VV} (cm);Events/1000 #mum", 50, 0, 5.); - h_dvv_passDisplacedDijet_failBjet_coarse = new TH1D("h_dvv_passDisplacedDijet_failBjet_coarse", ";d_{VV} (cm);Events/100 #mum", 40, 0, 0.4); - h_dvv_failDisplacedDijet_passBjet = new TH1D("h_dvv_failDisplacedDijet_passBjet", ";d_{VV} (cm);Events/1000 #mum", 50, 0, 5.); - h_dvv_failDisplacedDijet_passBjet_coarse = new TH1D("h_dvv_failDisplacedDijet_passBjet_coarse", ";d_{VV} (cm);Events/100 #mum", 40, 0, 0.4); - - const char* tree_path = - ntk == 3 ? "mfvMiniTreeNtk3/t" : - ntk == 4 ? "mfvMiniTreeNtk4/t" : - ntk == 7 ? "mfvMiniTreeNtk3or4/t" : - ntk == 5 ? "mfvMiniTree/t" : 0; - if (prints) printf("fn %s out_fn %s ntk %i path %s\n", tree_path); - - mfv::loop(fn, tree_path, analyze); - - out_f.cd(); - - // can do post loop processing of hists here - - out_f.Write(); - out_f.Close(); -} diff --git a/MFVNeutralino/test/histosLepSF.py b/MFVNeutralino/test/histosLepSF.py deleted file mode 100644 index a501c0220..000000000 --- a/MFVNeutralino/test/histosLepSF.py +++ /dev/null @@ -1,85 +0,0 @@ -from JMTucker.Tools.BasicAnalyzer_cfg import * - -is_mc = True - -from JMTucker.MFVNeutralino.NtupleCommon import ntuple_version_use as version, dataset - -input_files(process, '/uscms/home/pkotamni/work/CMSSW_10_6_27/src/JMTucker/MFVNeutralino/test/ntuple.root') -tfileservice(process, 'histos.root') -cmssw_from_argv(process) - -process.load('JMTucker.MFVNeutralino.VertexSelector_cfi') -process.load('JMTucker.MFVNeutralino.WeightProducer_cfi') -process.load('JMTucker.MFVNeutralino.VertexHistos_cfi') -process.load('JMTucker.MFVNeutralino.AnalysisCuts_cfi') - -# Enable per-flavor trigger SF variation weights -process.mfvWeight.produce_variation_weights = cms.bool(True) - -# common: vertex selection + nominal weight computation -common = cms.Sequence(process.mfvSelectedVerticesSeq * process.mfvWeight) - -# ntk>=5, >=2 tight vertices (standard FullSel) -process.mfvAnalysisCutsFullSel = process.mfvAnalysisCuts.clone() - -# Five weight variations: nominal + mu trig up/down + el trig up/down -variations = [ - ('Nominal', cms.InputTag('mfvWeight')), - ('MuTrigUp', cms.InputTag('mfvWeight', 'weightMuTrigUp')), - ('MuTrigDown', cms.InputTag('mfvWeight', 'weightMuTrigDown')), - ('ElTrigUp', cms.InputTag('mfvWeight', 'weightElTrigUp')), - ('ElTrigDown', cms.InputTag('mfvWeight', 'weightElTrigDown')), -] - -for var_name, weight_tag in variations: - histo = process.mfvVertexHistos.clone(weight_src = weight_tag) - histo_name = 'mfvVertexHistosFullSel' + var_name - setattr(process, histo_name, histo) - path = cms.Path(common * process.mfvAnalysisCutsFullSel * getattr(process, histo_name)) - setattr(process, 'pFullSel' + var_name, path) - -if __name__ == '__main__' and hasattr(sys, 'argv') and 'submit' in sys.argv: - from JMTucker.Tools.MetaSubmitter import * - from JMTucker.Tools.Samples import * - from JMTucker.Tools.Year import year - - all_lep_for_year = { - 20161: all_lep_signal_samples_20161, - 20162: all_lep_signal_samples_20162, - 2017: all_lep_signal_samples_2017, - 2018: all_lep_signal_samples_2018, - }[year] - - # Benchmark signal points: VH (ZH+WH+ggZH) M55 1mm/10mm/300um, M40 1mm + ttH dddd M55 10mm - benchmark_pats = [ - 'ZHToSSTodddd_tau1mm_M55', - 'ZHToSSTodddd_tau10mm_M55', - 'ZHToSSTodddd_tau300um_M55', - 'ZHToSSTodddd_tau1mm_M40', - 'WplusHToSSTodddd_tau1mm_M55', - 'WplusHToSSTodddd_tau10mm_M55', - 'WplusHToSSTodddd_tau300um_M55', - 'WplusHToSSTodddd_tau1mm_M40', - 'WminusHToSSTodddd_tau1mm_M55', - 'WminusHToSSTodddd_tau10mm_M55', - 'WminusHToSSTodddd_tau300um_M55', - 'WminusHToSSTodddd_tau1mm_M40', - 'ggZHToSSTodddd_tau1mm_M55', - 'ggZHToSSTodddd_tau10mm_M55', - 'ggZHToSSTodddd_tau300um_M55', - 'ggZHToSSTodddd_tau1mm_M40', - 'ttHToLLPs_dddd_tau10mm_M55', - ] - - samples = [s for s in all_lep_for_year if any(pat in s.name for pat in benchmark_pats)] - - pset_modifier = chain_modifiers(is_mc_modifier, per_sample_pileup_weights_modifier(), ttH_duplicate_check_modifier) - - set_splitting(samples, dataset, 'histos', data_json=json_path('ana_run2.json')) - - cs = CondorSubmitter('LepTrigSF_' + version, - ex = year, - dataset = dataset, - pset_modifier = pset_modifier, - ) - cs.submit_all(samples) diff --git a/MFVNeutralino/test/minitree_signal_VH.py b/MFVNeutralino/test/minitree_signal_VH.py deleted file mode 100644 index 56a108fb2..000000000 --- a/MFVNeutralino/test/minitree_signal_VH.py +++ /dev/null @@ -1,75 +0,0 @@ -# Dedicated MiniTree submission for lepton-channel VH signals. -# -# Prerequisites before running: -# 1. NtupleCommon.py must have: -# use_Lepton_triggers = True -# use_btag_vetoLepHT_triggers = False -# (this is the current default, so no change should be needed) -# -# 2. Year.h must have the correct year defined, e.g.: -# #define MFVNEUTRALINO_2018 -# Then rebuild: scram b -j8 -# Repeat for each year before re-submitting. -# -# To submit (after setting year and rebuilding): -# python minitree_signal_VH.py submit -# -# Samples submitted: ZH + WH+ + WH- + ggZH_bbbb + ggZH_dddd -# Dataset: ntuple_tag001lepm - -from JMTucker.Tools.BasicAnalyzer_cfg import * - -is_mc = True - -from JMTucker.MFVNeutralino.NtupleCommon import ( - ntuple_version_use as version, - dataset, - use_btag_vetoLepHT_triggers, - use_Lepton_triggers, -) - -if not use_Lepton_triggers: - raise RuntimeError( - 'minitree_signal_VH.py requires use_Lepton_triggers = True in NtupleCommon.py' - ) - -# Use an ntuple from the lepton dataset as a local test file -input_files(process, '/store/group/lpclonglived/joeyr/ZH_HToSSTodddd_ZToLL_MH-125_MS-55_ctauS-1_TuneCP5_13TeV-powheg-pythia8/NtupleOnnormdzULV30Lepm_2018/0000/ntuple_1.root') -tfileservice(process, 'minitree.root') -cmssw_from_argv(process) - -process.load('JMTucker.MFVNeutralino.MiniTree_cff') - -if not is_mc: - del process.pMiniTreeNtk4 - del process.pMiniTreeNtk3or4 - del process.pMiniTree - - -if __name__ == '__main__' and hasattr(sys, 'argv') and 'submit' in sys.argv: - from JMTucker.Tools.MetaSubmitter import * - import JMTucker.Tools.Samples as Samples - from JMTucker.Tools.Year import year - - yr = str(year) - - attr = 'all_lep_signal_samples_%s' % yr - samples = getattr(Samples, attr) - samples = [s for s in samples if s.has_dataset(dataset)] - print('Submitting %d lep-channel samples for year %s' % (len(samples), yr)) - - pset_modifier = chain_modifiers( - is_mc_modifier, - per_sample_pileup_weights_modifier(), - ttH_duplicate_check_modifier, - ) - - set_splitting(samples, dataset, 'minitree', data_json=json_path('ana_run2.json')) - - cs = CondorSubmitter( - 'MiniTree' + version + '_VH', - ex=year, - dataset=dataset, - pset_modifier=pset_modifier, - ) - cs.submit_all(samples) diff --git a/MFVNeutralino/test/minitree_signal_bjet.py b/MFVNeutralino/test/minitree_signal_bjet.py deleted file mode 100644 index b43c4fc5d..000000000 --- a/MFVNeutralino/test/minitree_signal_bjet.py +++ /dev/null @@ -1,76 +0,0 @@ -# Dedicated MiniTree submission for displaced-trigger bjet-channel signals. -# -# Prerequisites before running: -# 1. NtupleCommon.py must have: -# use_btag_vetoLepHT_triggers = True -# use_Lepton_triggers = False -# Edit NtupleCommon.py and rebuild: scram b -j8 -# Remember to restore NtupleCommon.py to use_Lepton_triggers = True afterwards. -# -# 2. Year.h must have the correct year defined, e.g.: -# #define MFVNEUTRALINO_2018 -# Then rebuild: scram b -j8 -# Repeat for each year before re-submitting. -# -# To submit (after setting year and rebuilding): -# python minitree_signal_bjet.py submit -# -# Samples submitted: mfv_neu (neutralino/gluino) + mfv_stopdbardbar + ggH -# Dataset: ntuple_tag001bvetolhtm - -from JMTucker.Tools.BasicAnalyzer_cfg import * - -is_mc = True - -from JMTucker.MFVNeutralino.NtupleCommon import ( - ntuple_version_use as version, - dataset, - use_btag_vetoLepHT_triggers, - use_Lepton_triggers, -) - -if not use_btag_vetoLepHT_triggers: - raise RuntimeError( - 'minitree_signal_bjet.py requires use_btag_vetoLepHT_triggers = True in NtupleCommon.py' - ) - -# Use an ntuple from the bjet dataset as a local test file -input_files(process, '/store/group/lpclonglived/joeyr/mfv_neu_tau01000um_M0400_2018/NtupleOnnormdzULV30BvetoLHTm_2018/0000/ntuple_1.root') -tfileservice(process, 'minitree.root') -cmssw_from_argv(process) - -process.load('JMTucker.MFVNeutralino.MiniTree_cff') - -if not is_mc: - del process.pMiniTreeNtk4 - del process.pMiniTreeNtk3or4 - del process.pMiniTree - - -if __name__ == '__main__' and hasattr(sys, 'argv') and 'submit' in sys.argv: - from JMTucker.Tools.MetaSubmitter import * - import JMTucker.Tools.Samples as Samples - from JMTucker.Tools.Year import year - - yr = str(year) - - attr = 'all_bjet_signal_samples_%s' % yr - samples = getattr(Samples, attr) - samples = [s for s in samples if s.has_dataset(dataset)] - print('Submitting %d bjet-channel samples for year %s' % (len(samples), yr)) - - pset_modifier = chain_modifiers( - is_mc_modifier, - per_sample_pileup_weights_modifier(), - ttH_duplicate_check_modifier, - ) - - set_splitting(samples, dataset, 'minitree', data_json=json_path('ana_run2_displacement_trigger.json')) - - cs = CondorSubmitter( - 'MiniTree' + version + '_bjet', - ex=year, - dataset=dataset, - pset_modifier=pset_modifier, - ) - cs.submit_all(samples) diff --git a/MFVNeutralino/test/minitree_signal_bjet_highM.py b/MFVNeutralino/test/minitree_signal_bjet_highM.py deleted file mode 100644 index e6b2382dc..000000000 --- a/MFVNeutralino/test/minitree_signal_bjet_highM.py +++ /dev/null @@ -1,64 +0,0 @@ -# Bjet-channel MiniTree submission for high-M signal samples only. -# Submits mfv_signal_highM + mfv_stopdbardbar_highM + mfv_stopbbarbbar_highM. -# Same prerequisites as minitree_signal_bjet.py: -# NtupleCommon.py: use_btag_vetoLepHT_triggers = True -# Year.h: correct year defined, then scram b - -from JMTucker.Tools.BasicAnalyzer_cfg import * - -is_mc = True - -from JMTucker.MFVNeutralino.NtupleCommon import ( - ntuple_version_use as version, - dataset, - use_btag_vetoLepHT_triggers, - use_Lepton_triggers, -) - -if not use_btag_vetoLepHT_triggers: - raise RuntimeError( - 'minitree_signal_bjet_highM.py requires use_btag_vetoLepHT_triggers = True in NtupleCommon.py' - ) - -input_files(process, '/store/group/lpclonglived/gdecastr/GluinoGluinoToNeutralinoNeutralinoTo2T2B2S_M-1200_CTau-100um_TuneCP5_13TeV-pythia8/Ntuple_Table28Validation_CorrectedBvetoLHTm_NoEF_2018/260216_200739/0000/ntuple_0.root') -tfileservice(process, 'minitree.root') -cmssw_from_argv(process) - -process.load('JMTucker.MFVNeutralino.MiniTree_cff') - -if not is_mc: - del process.pMiniTreeNtk4 - del process.pMiniTreeNtk3or4 - del process.pMiniTree - - -if __name__ == '__main__' and hasattr(sys, 'argv') and 'submit' in sys.argv: - from JMTucker.Tools.MetaSubmitter import * - import JMTucker.Tools.Samples as Samples - from JMTucker.Tools.Year import year - - yr = str(year) - - highm_dataset = dataset + '_highM' # 'ntuple_tag001bvetolhtm_highM' - - samples = (getattr(Samples, 'mfv_signal_highM_samples_%s' % yr) + - getattr(Samples, 'mfv_stopdbardbar_highM_samples_%s' % yr) + - getattr(Samples, 'mfv_stopbbarbbar_highM_samples_%s' % yr)) - samples = [s for s in samples if s.has_dataset(highm_dataset)] - print('Submitting %d high-M bjet-channel samples for year %s' % (len(samples), yr)) - - pset_modifier = chain_modifiers( - is_mc_modifier, - per_sample_pileup_weights_modifier(), - ttH_duplicate_check_modifier, - ) - - set_splitting(samples, highm_dataset, 'minitree', data_json=json_path('ana_run2_displacement_trigger.json')) - - cs = CondorSubmitter( - 'MiniTree' + version + '_bjet', - ex=year, - dataset=highm_dataset, - pset_modifier=pset_modifier, - ) - cs.submit_all(samples) diff --git a/MFVNeutralino/test/ntuple_highM.py b/MFVNeutralino/test/ntuple_highM.py deleted file mode 100644 index 1d1430ec1..000000000 --- a/MFVNeutralino/test/ntuple_highM.py +++ /dev/null @@ -1,56 +0,0 @@ -# Ntuple production for high-M bjet-channel signal samples. -# Submits mfv_signal_highM + mfv_stopdbardbar_highM + mfv_stopbbarbbar_highM for one year. -# Prerequisites: -# NtupleCommon.py: use_btag_vetoLepHT_triggers = True -# Year.h: correct year #define, then scram b inside el7 - -import FWCore.ParameterSet.Config as cms -from JMTucker.Tools.general import named_product -from JMTucker.MFVNeutralino.NtupleCommon import * -from JMTucker.Tools.Year import year - -if not use_btag_vetoLepHT_triggers: - raise RuntimeError('ntuple_highM.py requires use_btag_vetoLepHT_triggers = True in NtupleCommon.py') - -settings = NtupleSettings() -settings.is_mc = True -settings.is_miniaod = True -settings.run_n_tk_seeds = False -settings.minitree_only = False -settings.prepare_vis = False -settings.keep_all = False -settings.keep_gen = False -settings.keep_tk = False -settings.event_filter = 'bjets OR displaced dijet veto leptons and HT' -settings.randpars_filter = False - -process = ntuple_process(settings) -dataset = 'miniaod' if settings.is_miniaod else 'main' -input_files(process, '/uscms/home/joeyr/nobackup/13DF01B3-1BC9-0246-8C88-DF26E2F16793.root') -cmssw_from_argv(process) - -if __name__ == '__main__' and hasattr(sys, 'argv') and 'submit' in sys.argv: - from JMTucker.Tools.MetaSubmitter import * - - yr = str(year) - - samples = (getattr(Samples, 'mfv_signal_highM_samples_%s' % yr) + - getattr(Samples, 'mfv_stopdbardbar_highM_samples_%s' % yr) + - getattr(Samples, 'mfv_stopbbarbbar_highM_samples_%s' % yr)) - samples = [s for s in samples if s.has_dataset(dataset)] - print 'Submitting %d high-M bjet-channel ntuple samples for year %s' % (len(samples), yr) - - json_filename = 'ana_run2_displacement_trigger.json' - set_splitting(samples, dataset, 'ntuple', data_json=json_path(json_filename)) - - ms = MetaSubmitter(settings.batch_name() + '_highM', dataset=dataset) - ms.common.pset_modifier = chain_modifiers(is_mc_modifier, era_modifier, npu_filter_modifier(settings.is_miniaod), signals_no_event_filter_modifier, ttH_duplicate_check_modifier) - ms.crab.crab_cfg_Data_outLFNDirBase = '/store/group/lpcdisplacedvertices/gdecastr/' - ms.condor.stageout_files = 'all' - ms.condor.local_stage = True - ms.condor.stageout_path = ( - 'root://cmseos.fnal.gov//store/group/lpcdisplacedvertices/gdecastr' - '/$(&1 | grep -E "^(Building|Compiling|Linking|ERROR|error:|Warning|scram)" | head -20 || true - echo "scram b done" - - # Submit - cd ${TEST_DIR} - python minitree_signal_bjet_highM.py submit - echo "Submitted for year $YEAR" -done - -# Restore Year.h to 2018 and rebuild once more -echo "" -echo "=== Restoring Year.h to 2018 ===" -sed -i "s/^#define MFVNEUTRALINO_[0-9]\{4,5\}$/#define MFVNEUTRALINO_2018/" ${YEAR_H} -grep "^#define MFVNEUTRALINO_[0-9]" ${YEAR_H} -cd ${CMSSW_SRC} -scram b -j8 2>&1 | grep -E "^(Building|Done|ERROR)" | head -5 || true - -echo "" -echo "=== All done! High-M MiniTree jobs submitted for all 4 years. ===" diff --git a/MFVNeutralino/test/submit_leptrigsf_allyears.sh b/MFVNeutralino/test/submit_leptrigsf_allyears.sh deleted file mode 100755 index b4d773252..000000000 --- a/MFVNeutralino/test/submit_leptrigsf_allyears.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/bash -# Submit histosLepSF.py for all four Run-II years. -# Run this script from inside the CMSSW el7 apptainer after cmsenv. -# It uses $CMSSW_BASE automatically, so works with any CMSSW installation. -# source /uscms/home/joeyr/setup_cmssw-el7_apptainer.sh -# cd $CMSSW_BASE/src && cmsenv -# cd JMTucker/MFVNeutralino/test -# bash submit_leptrigsf_allyears.sh - -set -e - -if [ -z "$CMSSW_BASE" ]; then - echo "ERROR: CMSSW_BASE not set. Run cmsenv first." - exit 1 -fi - -YEAR_H=${CMSSW_BASE}/src/JMTucker/Tools/interface/Year.h -CMSSW_SRC=${CMSSW_BASE}/src -SCRIPT_DIR=${CMSSW_BASE}/src/JMTucker/MFVNeutralino/test - -for YEAR in 20161 20162 2017 2018; do - echo "============================================" - echo " Year: ${YEAR}" - echo "============================================" - - # Swap the active year define in Year.h - # Use [0-9]+ (one-or-more) and $ (end-of-line) so we only match the - # single-token active-year line and never corrupt MFVNEUTRALINO_YEARS etc. - sed -i -E "s|^#define MFVNEUTRALINO_[0-9]+$|#define MFVNEUTRALINO_${YEAR}|" ${YEAR_H} - echo "Year.h set to MFVNEUTRALINO_${YEAR}:" - grep "^#define MFVNEUTRALINO_[0-9]" ${YEAR_H} - - # Recompile - cd ${CMSSW_SRC} - scram b -j8 2>&1 | tail -5 - - # Submit - cd ${SCRIPT_DIR} - python histosLepSF.py submit - echo "Submitted year ${YEAR}" - echo "" -done - -echo "All four years submitted." diff --git a/MFVNeutralino/test/submit_signal_minitrees_allyears.sh b/MFVNeutralino/test/submit_signal_minitrees_allyears.sh deleted file mode 100755 index 181f73ae1..000000000 --- a/MFVNeutralino/test/submit_signal_minitrees_allyears.sh +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/bash -# ============================================================ -# Submit signal MiniTrees for all four Run 2 years. -# -# OVERVIEW -# -------- -# Two scripts are provided: -# minitree_signal_VH.py -- lepton channel: ZH + WH+ + WH- + ggZH_bbbb + ggZH_dddd -# minitree_signal_bjet.py -- bjet channel: mfv_neu + mfv_stopdbardbar + ggH -# -# They must be submitted year by year because: -# (a) Year.h embeds the year at compile time (MFVNEUTRALINO_YEAR macro). -# (b) NtupleCommon.py must have the correct trigger scheme set. -# -# MANUAL STEPS BEFORE EACH YEAR -# ------------------------------ -# -# --- Lepton channel (run once per year) --- -# 1. Edit JMTucker/Tools/interface/Year.h: -# Change #define MFVNEUTRALINO_XXXX -# to #define MFVNEUTRALINO_ -# Valid values: MFVNEUTRALINO_20161, MFVNEUTRALINO_20162, -# MFVNEUTRALINO_2017, MFVNEUTRALINO_2018 -# -# 2. Verify NtupleCommon.py has: -# use_Lepton_triggers = True -# use_btag_vetoLepHT_triggers = False -# (this is the default; no change should be needed) -# -# 3. scram b -j8 -# -# 4. cmsenv (re-source the environment after rebuild) -# -# 5. cd test/ -# python minitree_signal_VH.py submit -# -# --- Bjet channel (run once per year) --- -# 1. Edit Year.h as above for the desired year. -# -# 2. Edit NtupleCommon.py: -# use_btag_vetoLepHT_triggers = True # change this -# use_Lepton_triggers = False # change this -# -# 3. scram b -j8 -# -# 4. cmsenv -# -# 5. cd test/ -# python minitree_signal_bjet.py submit -# -# 6. After submission, restore NtupleCommon.py: -# use_Lepton_triggers = True -# use_btag_vetoLepHT_triggers = False -# and rebuild: scram b -j8 -# -# REMINDER: The CRAB/Condor jobs will pick up the year from the compiled -# MFVNEUTRALINO_YEAR macro. If you forget to rebuild, all jobs will run -# with the wrong year settings. -# -# SUBMISSION ORDER (suggested: 2018 first, as it has the most statistics) -# 2018, 2017, 20162, 20161 -# ============================================================ - -echo "This script documents the manual steps required." -echo "Edit Year.h and NtupleCommon.py per the instructions above," -echo "then run scram b and submit each script individually." -echo "" -echo "Lepton channel VH: python minitree_signal_VH.py submit" -echo "Bjet channel signals: python minitree_signal_bjet.py submit" diff --git a/MFVNeutralino/test/utilities_MCPartial.py b/MFVNeutralino/test/utilities_MCPartial.py deleted file mode 100755 index e3b4244ce..000000000 --- a/MFVNeutralino/test/utilities_MCPartial.py +++ /dev/null @@ -1,405 +0,0 @@ -#!/usr/bin/env python - -from JMTucker.MFVNeutralino.UtilitiesBase import * - -#### - -_qcdlepenrich = bool_from_argv('qcdlepenrich') -_leptonpresel = bool_from_argv('leptonpresel') -_btagpresel = bool_from_argv('btagpresel') -_metpresel = bool_from_argv('metpresel') -_presel_s = '_qcdlepenrich' if _qcdlepenrich else '_leptonpresel' if _leptonpresel else '_metpresel' if _metpresel else '_btagpresel' if _btagpresel else '' - -#### - -def cmd_hadd_vertexer_histos(): - ntuple = sys.argv[2] - print(ntuple) - samples = Samples.registry.from_argv( - #Samples.qcd_samples_2017 + Samples.met_samples_2017 + Samples.Zvv_samples_2017 + Samples.mfv_splitSUSY_samples_M2000_2017 + - Samples.met_samples_2017 - #Samples.WplusHToSSTodddd_samples_2017 + Samples.met_samples_2017 + Samples.qcd_lep_samples_2017 + Samples.leptonic_samples_2017 + Samples.diboson_samples_2017 - #Samples.data_samples_2015 + \ - #Samples.ttbar_samples_2015 + Samples.qcd_samples_2015 + Samples.qcd_samples_ext_2015 + \ - #Samples.data_samples + \ - #Samples.ttbar_samples + Samples.qcd_samples + Samples.qcd_samples_ext - ) - for s in samples: - s.set_curr_dataset(ntuple) - hadd(s.name + '.root', ['root://cmseos.fnal.gov/' + fn.replace('ntuple', 'vertex_histos') for fn in s.filenames]) - -def cmd_report_data(): - for ds, ex in ('SingleMuon', '_mu'), ('JetHT', ''), ('SingleElectron', '_ele'), ('MET', '_met'): - maod = 'miniaod' if 'miniaod' in sys.argv else '' - pc = '' - if '10pc' in sys.argv: - pc = '10pc' - ex += '_10pc' - elif '1pc' in sys.argv: - pc = '1pc' - ex += '_1pc' - - for year in 2017, 2018: - if not glob('*%s%i*' % (ds, year)): - continue - - os.system('mreport c*_%s%i* %s %s' % (ds, year, pc, maod)) - json_fn = 'processedLumis.json' - if not os.path.isfile(json_fn): - raise IOError('something went wrong with mreport?') - - print 'jsondiff' - avail_fn = json_path('ana_avail_%i%s.json' % (year, ex)) - ok = False - if not os.path.isfile(avail_fn): - if raw_input('no file %s, enter y to create it: ' % avail_fn)[0] == 'y': - shutil.copy(json_fn, avail_fn) - ok = True - else: - os.system('compareJSON.py --diff %s %s' % (json_fn, avail_fn)) - if raw_input('enter y if ok: ') == 'y': - ok = True - if ok: - os.rename('processedLumis.json', 'dataok_%i.json' % year) - else: - bad_fn = '%s.bad.%i' % (json_fn, int(time())) - print 'saving %s as %s' % (json_fn, bad_fn) - os.rename(json_fn, bad_fn) - -def cmd_hadd_data(): - permissive = bool_from_argv('permissive') - for ds in 'SingleMuon', 'JetHT', 'ZeroBias', 'SingleElectron', 'MET', 'BTagCSV', 'DisplacedJet', 'EGamma': - print ds - files = set(glob(ds + '*.root')) - if not files: - print 'no files for this ds' - continue - - have = [] - if ds == 'DisplacedJet': - year_eras = [ - #('20161', 'BCDEF'), #FIXME B2->B #HERE SingleMuon BCDEF - #('20162', 'FGH'), - ('2017', 'CDE'), - #('2018', 'ABCD'), - ] - elif ds == 'SingleMuon': - year_eras = [ - #('20161', 'BCDEF'), #FIXME B2->B #HERE SingleMuon BCDEF - #('20162', 'FGH'), - ('2017', 'BCDEF'), #B - #('2018', 'ABCD'), - ] - else: - year_eras = [ - #('20161', 'BCDEF'), #FIXME B2->B #HERE SingleMuon BCDEF - #('20162', 'FGH'), - ('2017', 'BCDEF'), - #('2018', 'ABCD'), - ] - - for year, eras in year_eras: - files = [f for x in eras for f in glob('%s%s%s.root' % (ds, year, x))] - ok = len(files) == len(eras) - if not ok: - print 'some files missing for %s %s: only have %r' % (ds, year, files) - if ok or permissive: - hadd_or_merge('%s%s.root' % (ds, year), files) - have.append(year) - - if '2017' in have and '2018' in have: - hadd_or_merge(ds + '2017p8.root', ['%s%s.root' % (ds, year) for year in '2017', '2018']) - -cmd_merge_data = cmd_hadd_data - -def _mc_parts(): - for year in [2017,2018]: - if year == 2017: - #for base in 'dyjetstollM50', 'wjetstolnu': - base = 'qcdht0500' - elif year == 2018: - base == 'qcdht0200' - a = '%s_%s.root' % (base, year) - b = '%sext_%s.root' % (base, year) - c = '%ssum_%s.root' % (base, year) - yield (year,base), (a,b,c) - -def cmd_hadd_mc_sums(): - for (year,base), (a,b,c) in _mc_parts(): - if not os.path.isfile(a) or not os.path.isfile(b): - print 'skipping', year, base, 'because at least one input file missing' - elif os.path.isfile(c): - print 'skipping', year, base, 'because', c, 'already exists' - else: - hadd_or_merge(c, [a, b]) - -cmd_merge_mc_sums = cmd_hadd_mc_sums - -def cmd_rm_mc_parts(): - for (year,base), (a,b,c) in _mc_parts(): - if os.path.isfile(c): - for y in a,b: - if os.path.isfile(y): - print y - os.remove(y) - -def _background_samples(trigeff=False, year=2017, bkg_tag='ttbar'): - if _qcdlepenrich: - x = ['qcdmupt15'] - x += ['qcdempt%03i' % x for x in [15,20,30,50,80,120,170]] - x += ['qcdbctoept%03i' % x for x in [15,20,30,80,170,250]] - elif _leptonpresel or trigeff: #FIXME - if bkg_tag == 'wjetstolnu': - x = ['wjetstolnu_0j'] - x += ['wjetstolnu_1j'] - x += ['wjetstolnu_2j'] - elif bkg_tag == 'dyjets': - x = ['dyjetstollM10', 'dyjetstollM50'] - elif bkg_tag == 'qcd': - x = [] - if not trigeff: - x = [] - x += ['qcdempt%03i' % x for x in [20,30,50,80,120,170,300]] #15 - x += ['qcdbctoept%03i' % x for x in [15,20,30,80,170,250]] - elif bkg_tag == 'qcdmupt5': - x = [] - if not trigeff: - x = [] - x += ['qcdpt%02imupt5' % x for x in [15,20,30,50,80]] - x += ['qcdpt%03imupt5' % x for x in [120,170,300,470,600,800]] - x += ['qcdpt1000mupt5'] - elif bkg_tag == 'diboson': - x = ['ww', 'wz', 'zz',] - else: - x = ['ttbar',] - elif _btagpresel: - x = [] - if bkg_tag == 'qcd': - x += ['qcdht%04i' % x for x in [ 200, 300, 500, 700, 1000, 1500, 2000]] - else : - x += ['ttbar',] - elif _metpresel: - x = ['ttbar', 'wjetstolnu'] - x += ['qcdht%04i' % x for x in [200, 300, 500, 700, 1000, 1500, 2000]] - x += ['zjetstonunuht%04i' % x for x in [100, 200, 400, 600, 800, 1200, 2500]] - if year==2017: - x += ['qcdht0200', 'qcdht0500sum'] - elif year==2018: - x += ['qcdht0200sum', 'qcdht0500'] - else: - x = ['qcdht%04i' % x for x in [700, 1000, 1500, 2000]] - x += ['ttbarht%04i' % x for x in [600, 800, 1200, 2500]] - return x - -def cmd_merge_background(permissive=bool_from_argv('permissive'), year_to_use=2017): #HERE - cwd = os.getcwd() - ok = True - if year_to_use==-1: - for year_s, scale in [('_2017', -AnalysisConstants.int_lumi_2017 * AnalysisConstants.scale_factor_2017), - ('_2018', -AnalysisConstants.int_lumi_2018 * AnalysisConstants.scale_factor_2018)]: - - year = int(year_s[1:]) - print 'scaling to', year, scale - - files = _background_samples(year=year) - files = ['%s%s.root' % (x, year_s) for x in files] - files2 = [] - for fn in files: - if not os.path.isfile(fn): - msg = '%s not found' % fn - if permissive: - print msg - else: - raise RuntimeError(msg) - else: - files2.append(fn) - if files2: - cmd = 'samples merge %f background%s%s.root ' % (scale, _presel_s, year_s) - cmd += ' '.join(files2) - print cmd - if os.system(cmd) != 0: - ok = False - if ok: - cmd = 'hadd.py background_2017p8.root background%s2017.root background%s2018.root' %(_presel_s) - print cmd - os.system(cmd) - - else: - if year_to_use==2017: - year_s = '_2017' - scale = -AnalysisConstants.int_lumi_2017 * AnalysisConstants.scale_factor_2017 - elif year_to_use==2018: - year_s = '_2018' - scale = -AnalysisConstants.int_lumi_2018 * AnalysisConstants.scale_factor_2018 - elif year_to_use==20162: - year_s = '_20162' - scale = -AnalysisConstants.int_lumi_20162 * AnalysisConstants.scale_factor_20162 - elif year_to_use==20161: - year_s = '_20161' - scale = -AnalysisConstants.int_lumi_20161 * AnalysisConstants.scale_factor_20161 - else: - raise RuntimeError("Year {0} not available!".format(year_to_use)) - - year = int(year_s[1:]) - print 'scaling to', year, scale - - for bkg_tag in ['wjetstolnu', 'ttbar']: #FIXME - files = _background_samples(year=year, bkg_tag=bkg_tag) - files = ['%s%s.root' % (x, year_s) for x in files] - files2 = [] - for fn in files: - if not os.path.isfile(fn): - msg = '%s not found' % fn - if permissive: - print msg - else: - raise RuntimeError(msg) - else: - files2.append(fn) - if files2: - cmd = 'samples merge %f %s%s%s.root ' % (scale,bkg_tag,_presel_s, year_s) - cmd += ' '.join(files2) - print("scale is "+str(scale)) - print cmd - if os.system(cmd) != 0: - ok = False - if ok: - print ("{0} {1} merged!".format(year, bkg_tag)) - - cmd = 'hadd.py background_leptonpresel_2017.root wjetstolnu_leptonpresel_2017.root ttbar_leptonpresel_2017.root' - print cmd - os.system(cmd) - - #only work for 2017 data now - #if ok: - # cmd = 'hadd.py background%s_2017p8.root background%s_2017.root background%s_2018.root' % (_presel_s, _presel_s, _presel_s) - # print cmd - # os.system(cmd) - -def cmd_effsprint(year_to_use=2017): - if year_to_use==-1: - for year in 2017, 2018: - background_fns = ' '.join('%s_%s.root' % (x, year) for x in _background_samples(year=year)) - todo = [('background', background_fns), ('signals', 'mfv*%s.root' % year)] - def do(cmd, outfn): - cmd = 'python %s %s %s' % (cmssw_base('src/JMTucker/MFVNeutralino/test/effsprint.py'), cmd, year) - print cmd - os.system('%s | tee %s' % (cmd, outfn)) - print - for which, which_files in todo: - for ntk in 3,4,'3or4',5: - for vtx in 1,2: - cmd = 'ntk%s' % ntk - if which == 'background': - cmd += ' sum' - if vtx == 1: - cmd += ' one' - cmd += ' ' + which_files - outfn = 'effsprint_%s%s_%s_ntk%s_%iv' % (which, _presel_s, year, ntk, vtx) - do(cmd, outfn) - do('presel sum ' + background_fns, 'effsprint_presel_%s' % year) - do('nocuts sum ' + background_fns, 'effsprint_nocuts_%s' % year) - else: - if year_to_use!=2017 and year_to_use!=2018: - raise RuntimeError("Year {0} not available!".format(year_to_use)) - year = year_to_use - background_fns = ' '.join('%s_%s.root' % (x, year) for x in _background_samples(year=year)) - todo = [('background', background_fns), ('signals', 'mfv*%s.root' % year)] - def do(cmd, outfn): - cmd = 'python %s %s %s' % (cmssw_base('src/JMTucker/MFVNeutralino/test/effsprint.py'), cmd, year) - print cmd - os.system('%s | tee %s' % (cmd, outfn)) - print - for which, which_files in todo: - for ntk in 3,4,'3or4',5: - for vtx in 1,2: - cmd = 'ntk%s' % ntk - if which == 'background': - cmd += ' sum' - if vtx == 1: - cmd += ' one' - cmd += ' ' + which_files - outfn = 'effsprint_%s%s_%s_ntk%s_%iv' % (which, _presel_s, year, ntk, vtx) - do(cmd, outfn) - - do('presel sum ' + background_fns, 'effsprint_presel_%s' % year) - do('nocuts sum ' + background_fns, 'effsprint_nocuts_%s' % year) - - -def cmd_histos(): - #cmd_report_data() - #cmd_hadd_data() - cmd_merge_background() - #cmd_effsprint() - -def cmd_presel(): - cmd_report_data() - cmd_hadd_data() - cmd_merge_background() - -def cmd_vpeffs(): - cmd_report_data() - cmd_hadd_data() - cmd_merge_background() - -def cmd_minitree(): - cmd_report_data() - cmd_hadd_data() - -def cmd_trackermapperhists(): - cmd_hadd_data() - cmd_merge_background() - -def cmd_trackmover(): - cmd_report_data() - cmd_hadd_data() - -def cmd_trackmoverhists(): - cmd_hadd_data() - cmd_merge_background() - -def cmd_k0hists(): - cmd_hadd_data() - cmd_merge_background(True) - -def cmd_trigeff(): - cmd_hadd_mc_sums() - if glob('*SingleMuon*') or glob('*SingleElectron*'): - cmd_report_data() - cmd_hadd_data() - cmd_trigeff_merge() - -def cmd_trigeff_merge(): - permissive = bool_from_argv('permissive') - print colors.yellow('using *_2017* for 2018') - for year_s, scale in ('_2017', -AnalysisConstants.int_lumi_2017), ('_2018', -AnalysisConstants.int_lumi_2018): - for wqcd_s in '', '_wqcd': - files = _background_samples(trigeff=True) - #if not wqcd_s: - # files.remove('qcdmupt15') - files = ['%s%s.root' % (x, '_2017') for x in files] - files2 = [] - for fn in files: - if not os.path.isfile(fn): - msg = '%s not found' % fn - if permissive: - print msg - else: - raise RuntimeError(msg) - else: - files2.append(fn) - - if files2: - out_fn = 'background%s%s.root' % (wqcd_s, year_s) - if os.path.exists(out_fn): - print colors.yellow('skipping %s because it exists' % out_fn) - else: - cmd = 'samples merge %f %s %s' % (scale, out_fn, ' '.join(files2)) - print cmd - os.system(cmd) - -#### - -if __name__ == '__main__': - main(locals()) - From 9f6224278c23194c09a80924e39842061e9a6b4f Mon Sep 17 00:00:00 2001 From: Gianfranco de Castro <37059445+Gianco99@users.noreply.github.com> Date: Thu, 14 May 2026 14:51:45 -0400 Subject: [PATCH 03/15] Delete MFVNeutralino/test/ForLimits/run_highM_combine_local.sh --- .../test/ForLimits/run_highM_combine_local.sh | 58 ------------------- 1 file changed, 58 deletions(-) delete mode 100644 MFVNeutralino/test/ForLimits/run_highM_combine_local.sh diff --git a/MFVNeutralino/test/ForLimits/run_highM_combine_local.sh b/MFVNeutralino/test/ForLimits/run_highM_combine_local.sh deleted file mode 100644 index 62e1cc754..000000000 --- a/MFVNeutralino/test/ForLimits/run_highM_combine_local.sh +++ /dev/null @@ -1,58 +0,0 @@ -#!/bin/bash -# Run all highM Combine jobs directly on an el9 node (bypasses Condor container issue). -# Usage: bash run_highM_combine_local.sh [nparallel] -# nparallel: number of simultaneous combine processes (default 8) -set -e - -CMSSW14=/uscms/home/gdecastr/nobackup/work/CMSSW_14_1_0_pre4/src -FORLIM=/uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648/src/JMTucker/MFVNeutralino/test/ForLimits -NPAR=${1:-8} - -source /cvmfs/cms.cern.ch/cmsset_default.sh -cd "$CMSSW14" -eval $(scramv1 runtime -sh) - -run_one() { - local sig_id="$1" - local work_dir="$FORLIM/CombineOutput/$sig_id" - local card_dir_bjet="$FORLIM/Datacards/bjet" - local out_fn="$work_dir/higgsCombine${sig_id}.AsymptoticLimits.mH120.root" - - if [ -f "$out_fn" ]; then - echo "SKIP (already done): $sig_id" - return 0 - fi - - mkdir -p "$work_dir" - cd "$work_dir" - - # Build combineCards argument from available bjet datacards for this sig_id - local card_args="" - for year in 20161 20162 2017 2018; do - local fn="$card_dir_bjet/Datacard_bjet_${sig_id}_${year}.txt" - if [ -f "$fn" ]; then - card_args="$card_args bjet_${year}=$fn" - fi - done - - echo "=== $sig_id ===" - combineCards.py $card_args > "combined_${sig_id}.txt" 2>/dev/null - combine -M AsymptoticLimits --name "$sig_id" "combined_${sig_id}.txt" -v 1 \ - > "$work_dir/combine.log" 2>&1 - echo "DONE: $sig_id" -} -export -f run_one -export FORLIM - -# Collect all highM hypotheses (M1200, M1600, M3000) for the three SUSY processes -SIG_IDS=$(ls "$FORLIM/Datacards/bjet/" \ - | grep -E "Datacard_bjet_(mfv_neu|mfv_stopbbarbbar|mfv_stopdbardbar)_tau.*_M(1[26][0-9][0-9]|3000)_[0-9]" \ - | sed 's/Datacard_bjet_//' \ - | sed 's/_[0-9]\{4,5\}\.txt//' \ - | sort -u) - -echo "Running $(echo "$SIG_IDS" | wc -l) hypotheses with $NPAR parallel jobs..." -echo "$SIG_IDS" | xargs -P "$NPAR" -I{} bash -c 'run_one "$@"' _ {} - -echo "" -echo "=== All highM Combine jobs complete. ===" From c05dca74e78a8204f1806f7689e73cda5145eda2 Mon Sep 17 00:00:00 2001 From: Gianfranco de Castro Date: Thu, 14 May 2026 14:07:11 -0500 Subject: [PATCH 04/15] small changes --- MFVNeutralino/test/.gitignore | 8 ++++++++ MFVNeutralino/test/ForLimits/helper_PyStorage_objects.py | 2 -- MFVNeutralino/test/ForLimits/submitCombine.py | 4 +++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/MFVNeutralino/test/.gitignore b/MFVNeutralino/test/.gitignore index c8ebb1f20..dcbb589ae 100644 --- a/MFVNeutralino/test/.gitignore +++ b/MFVNeutralino/test/.gitignore @@ -9,3 +9,11 @@ plots events_to_debug temp *.haddlog +ForLimits/Datacards/ +ForLimits/LimitsInput/ +ForLimits/CombineOutput/ +ForLimits/CombineCondor/ +ForLimits/LimitPlots/ +ForLimits/BinningStudy/datacards/ +ForLimits/BinningStudy/combine_output/ +ForLimits/BinningStudy/generate_variants.log diff --git a/MFVNeutralino/test/ForLimits/helper_PyStorage_objects.py b/MFVNeutralino/test/ForLimits/helper_PyStorage_objects.py index 80e136c60..38994077c 100644 --- a/MFVNeutralino/test/ForLimits/helper_PyStorage_objects.py +++ b/MFVNeutralino/test/ForLimits/helper_PyStorage_objects.py @@ -155,8 +155,6 @@ def get_xsec(self): def __getattr__(self, name): """Delegate unknown attributes to the first list item.""" - if name in {}: - return result = getattr(self.sig_ls[0], name) if isinstance(result, str): result = result.replace(self.sig_ls[0].proc, self.proc) diff --git a/MFVNeutralino/test/ForLimits/submitCombine.py b/MFVNeutralino/test/ForLimits/submitCombine.py index 55f2d5d2b..b5feb70d6 100644 --- a/MFVNeutralino/test/ForLimits/submitCombine.py +++ b/MFVNeutralino/test/ForLimits/submitCombine.py @@ -87,6 +87,7 @@ set -e if [ $FD_STATUS -ne 0 ]; then echo "WARNING: FitDiagnostics failed (status $FD_STATUS) -- AsymptoticLimits result is still valid" + touch higgsCombine{sig_id}.FitDiagnostics.mH120.root fitDiagnostics{sig_id}.root fi echo "=== Done: {sig_id} ===" @@ -110,7 +111,7 @@ should_transfer_files = YES when_to_transfer_output = ON_EXIT transfer_input_files = {combine_tarball},{workspace} -transfer_output_files = higgsCombine{sig_id}.AsymptoticLimits.mH120.root +transfer_output_files = higgsCombine{sig_id}.AsymptoticLimits.mH120.root,higgsCombine{sig_id}.FitDiagnostics.mH120.root,fitDiagnostics{sig_id}.root queue 1 """ @@ -193,6 +194,7 @@ def _write_job(sig_id, cards, dry_run): ret = subprocess.call("condor_submit " + jdl_fn, shell=True) if ret != 0: print("WARNING: condor_submit returned %d for %s" % (ret, sig_id)) + return False else: print(" [dry-run] %s (%d cards: %s)" % (sig_id, len(cards), ", ".join(sorted(cards)))) From c49f52eedf94109722f638d5d37b1e1801e6db69 Mon Sep 17 00:00:00 2001 From: Gianfranco de Castro Date: Thu, 14 May 2026 20:37:43 -0500 Subject: [PATCH 05/15] Restoring some of Yuqing's comments --- .../ForLimits/helper_PyStorage_objects.py | 33 +++++++++++++++++-- MFVNeutralino/test/ForLimits/makeDatacard.py | 12 +++++++ .../test/ForLimits/nuisance_configs.py | 8 +++-- .../nuisance_configs_and_functions.py | 14 ++++++++ 4 files changed, 63 insertions(+), 4 deletions(-) diff --git a/MFVNeutralino/test/ForLimits/helper_PyStorage_objects.py b/MFVNeutralino/test/ForLimits/helper_PyStorage_objects.py index 38994077c..e57f3df27 100644 --- a/MFVNeutralino/test/ForLimits/helper_PyStorage_objects.py +++ b/MFVNeutralino/test/ForLimits/helper_PyStorage_objects.py @@ -11,12 +11,27 @@ import script_configs as config import sig_and_bkg_configs as sb_conf +""" +DEFINITION: SignalROOTInfo +-Store filename, extract information from filename + +DEFINITION: NuisanceInfo +-Store information to write a nuisance parameter + +DEFINITION: NuisanceTable +""" + nbins = config.datacard["nbins"] prt_dt = sb_conf.printout_flags["PyStorage"] class SignalROOTInfo(object): - """Extract process name, lifetime, mass, year from a MiniTree filename.""" + """ + Based on a ROOT MiniTree filename, extract information like process name, lifetime. + -INPUTS- + full_fn: full filename + root_exists: Boolean. If True, it'll make an accompanying ROOT.TFile() and MCSample() + """ def __init__(self, full_fn, root_exists=False, nbins=3): self.full_fn = full_fn @@ -47,6 +62,9 @@ def __init__(self, full_fn, root_exists=False, nbins=3): raise ValueError("No Samples.py entry") def get_processtag(self): + """ + Get the process tag, e.g. mfv_stopdbardbar + """ name_start = self.fn.split("tau")[0] success = True if name_start == self.fn: @@ -82,6 +100,7 @@ def return_nuis_key(self): return self.fn.replace(".root", "").replace(".ROOT", "") def return_lifetime_in_unit(self, unit=None): + """Returns original string if unit=None, else converts into whatever unit is inputted""" if unit is None: return self.lifetime return ROOThelper.convert_units(to_unit=unit, from_expr=self.lifetime) @@ -90,6 +109,7 @@ def return_mass_as_int(self): return int(self.mass) def return_name2details(self, lifetime_unit="mm"): + """This function is constructed to resemble name2details of the old code""" return [self.proc, self.return_lifetime_in_unit(unit=lifetime_unit), self.mass, self.year] def print_diagnostics(self, lifetime_unit="mm"): @@ -114,7 +134,15 @@ def get_xsec(self): class SigRInf_Grp(object): - """Group of SignalROOTInfo objects that behave as one (e.g., VH = ZH + WH+ + WH-).""" + """ + Make a cluster of SignalROOTInfo objects, that behave like the first object of the group but with + + This code defaults most things to the first item of the list. So it will fail if full_fn_ls entries don't have matching lifetime/mass/year etc. + + -INPUTS- + full_fn: ls-like, full filenames + root_exists: Boolean. Should it search for the ROOT and MCSample()? + """ def __init__(self, full_fn_ls, root_exists=False, nbins=3, overwrite_proc=None): assert len(full_fn_ls) > 0 @@ -131,6 +159,7 @@ def __init__(self, full_fn_ls, root_exists=False, nbins=3, overwrite_proc=None): setattr(self, item, old_val.replace(self.sig_ls[0].proc, self.proc)) def return_nuis_key(self): + """Defining explicitly because it's not forwarded by getattribute""" return self.sig_ls[0].return_nuis_key().replace(self.sig_ls[0].proc, self.proc) def return_name2details(self, lifetime_unit="mm"): diff --git a/MFVNeutralino/test/ForLimits/makeDatacard.py b/MFVNeutralino/test/ForLimits/makeDatacard.py index 76abeb90e..6919d92a6 100644 --- a/MFVNeutralino/test/ForLimits/makeDatacard.py +++ b/MFVNeutralino/test/ForLimits/makeDatacard.py @@ -5,6 +5,18 @@ import nuisance_configs as ns_conf import helper_PyStorage_objects as sth +""" +Naming conventions (Note: apparently if I put template as an input, the function refuses to change template, idk why) + return_XX : it will give something back, append to template + add_XX: overwrite template with the return value + replace_XX: like add + write_XX: overwrite template (apparently this can't be done) + +The only stuff that are hard-coded are: +-Sig and bkg are called 0 and 1 +-Sig and bkg are written in this order +""" + # Hard codes n_proc = 2 diff --git a/MFVNeutralino/test/ForLimits/nuisance_configs.py b/MFVNeutralino/test/ForLimits/nuisance_configs.py index dc1e28bc9..844f9a01c 100644 --- a/MFVNeutralino/test/ForLimits/nuisance_configs.py +++ b/MFVNeutralino/test/ForLimits/nuisance_configs.py @@ -1,6 +1,10 @@ """ -Nuisance naming and pickle-path configuration. -Paths are resolved via script_configs -> limits_config.yaml (see nuisance_tables section). +A place to store the messy dictionaries required to make nuisance_configs_and_functions.py work. + +nuis_names: nuisance naming + +pickle_prefixes: where to find nuisance table storage +year_remaps: some filenames are provided with a different convention to our 20161-2018 conventions """ import script_configs as config diff --git a/MFVNeutralino/test/ForLimits/nuisance_configs_and_functions.py b/MFVNeutralino/test/ForLimits/nuisance_configs_and_functions.py index 1ea029c33..b84972d79 100644 --- a/MFVNeutralino/test/ForLimits/nuisance_configs_and_functions.py +++ b/MFVNeutralino/test/ForLimits/nuisance_configs_and_functions.py @@ -6,6 +6,20 @@ import script_configs as config +""" +This file is called by getNuisanceFromSig.py + +-INPUTS- +nuis_name: string. It becomes the nuisance name, and indexes dictionaries. + +Required inputs for NuisanceInfo: +nuis_name: string +nuis_val: float or array-like, values (meaningless for shape uncertainties) +make_updn: Boolean, is this a shape uncertainty? +sep_yrs: Boolean, should this nuisance be combined across the different years or not? +corr: Boolean, are the N bins correlated? +""" + # Module-level globals -- updated per year via _init_for_year() year = config.datacard["year"] year_id = config.datacard["year_key"].index(year) From d12840d8530f538d541d79a32619e2aeae1c1bbe Mon Sep 17 00:00:00 2001 From: Gianfranco de Castro Date: Sun, 17 May 2026 19:01:32 -0500 Subject: [PATCH 06/15] Removing binning study --- .../ForLimits/BinningStudy/binning_schemes.py | 34 ---- .../ForLimits/BinningStudy/collect_results.py | 160 ------------------ .../BinningStudy/generate_variants_el7.py | 92 ---------- .../BinningStudy/plot_background_templates.py | 150 ---------------- .../BinningStudy/run_combine_study.sh | 71 -------- .../ForLimits/BinningStudy/strip_systs.py | 59 ------- 6 files changed, 566 deletions(-) delete mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/binning_schemes.py delete mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/collect_results.py delete mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/generate_variants_el7.py delete mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/plot_background_templates.py delete mode 100755 MFVNeutralino/test/ForLimits/BinningStudy/run_combine_study.sh delete mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/strip_systs.py diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/binning_schemes.py b/MFVNeutralino/test/ForLimits/BinningStudy/binning_schemes.py deleted file mode 100644 index 5ba39c43c..000000000 --- a/MFVNeutralino/test/ForLimits/BinningStudy/binning_schemes.py +++ /dev/null @@ -1,34 +0,0 @@ -"""Central definition of all binning schemes and study signal points.""" - -SCHEMES = { - "2bin": {"bins": [0., 1.6, 4.0], "nbins": 2, - "label": "2-bin [0, 1.6, 4.0]"}, - "3bin_nom": {"bins": [0., 0.8, 1.6, 4.0], "nbins": 3, - "label": "3-bin nominal [0, 0.8, 1.6, 4.0]"}, - "3bin_v1": {"bins": [0., 0.4, 1.6, 4.0], "nbins": 3, - "label": "3-bin v1 [0, 0.4, 1.6, 4.0]"}, - "3bin_v2": {"bins": [0., 0.8, 2.5, 4.0], "nbins": 3, - "label": "3-bin v2 [0, 0.8, 2.5, 4.0]"}, - "3bin_v3": {"bins": [0., 1.0, 2.0, 4.0], "nbins": 3, - "label": "3-bin v3 [0, 1.0, 2.0, 4.0]"}, - "3bin_v4": {"bins": [0., 0.5, 1.0, 4.0], "nbins": 3, - "label": "3-bin v4 [0, 0.5, 1.0, 4.0]"}, - "4bin_v1": {"bins": [0., 0.4, 0.8, 1.6, 4.0], "nbins": 4, - "label": "4-bin v1 [0, 0.4, 0.8, 1.6, 4.0]"}, - "4bin_v2": {"bins": [0., 0.8, 1.2, 1.6, 4.0], "nbins": 4, - "label": "4-bin v2 [0, 0.8, 1.2, 1.6, 4.0]"}, -} - -# (sig_id, channel) — sig_id matches Datacard___.txt filename stem -SIGNAL_POINTS = [ - # Lepton-triggered - ("VH_tau1mm_M55", "lep"), - ("VH_tau10mm_M55", "lep"), - # Displacement-triggered - ("ggHToSSTodddd_tau1mm_M55", "bjet"), - ("mfv_stopdbardbar_tau001000um_M0200", "bjet"), - ("mfv_stopdbardbar_tau000300um_M0400", "bjet"), - ("mfv_neu_tau001000um_M0400", "bjet"), -] - -YEARS = ["20161", "20162", "2017", "2018"] diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/collect_results.py b/MFVNeutralino/test/ForLimits/BinningStudy/collect_results.py deleted file mode 100644 index 43056c709..000000000 --- a/MFVNeutralino/test/ForLimits/BinningStudy/collect_results.py +++ /dev/null @@ -1,160 +0,0 @@ -# Usage: python collect_results.py -import os, sys - -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from binning_schemes import SCHEMES - -try: - import ROOT - ROOT.gROOT.SetBatch(True) - HAS_ROOT = True -except ImportError: - HAS_ROOT = False - -HERE = os.path.dirname(os.path.abspath(__file__)) -OUT_BASE = os.path.join(HERE, "combine_output") - -SCHEMES_ORDER = list(SCHEMES.keys()) -SCHEME_LABELS = {k: v["label"] for k, v in SCHEMES.items()} - -SIG_LABELS = { - "VH_tau1mm_M55": "VH tau=1mm M=55 (lep)", - "VH_tau10mm_M55": "VH tau=10mm M=55 (lep)", - "ggHToSSTodddd_tau1mm_M55": "ggH tau=1mm M=55 (bjet)", - "mfv_stopdbardbar_tau001000um_M0200": "stop d d-bar tau=1mm M=200 (bjet)", - "mfv_stopdbardbar_tau000300um_M0400": "stop d d-bar tau=0.3mm M=400 (bjet)", - "mfv_neu_tau001000um_M0400": "neu tau=1mm M=400 (bjet)", -} - - -def read_grid_sigma_r(path): - """Return sigma_r from MultiDimFit --algo grid output. - - Reads the NLL profile, finds the best-fit r, then interpolates the - crossings of deltaNLL = 0.5 on each side to get the 68% CI. - Returns the average half-width as sigma_r, or None on failure. - """ - if not HAS_ROOT or not os.path.exists(path): - return None - f = ROOT.TFile.Open(path) - if not f or f.IsZombie(): - return None - t = f.Get("limit") - if not t or t.GetEntries() < 3: - f.Close() - return None - - pts = sorted((ev.r, ev.deltaNLL) for ev in t) - f.Close() - - best_r, best_dnll = min(pts, key=lambda x: x[1]) - - # Shift so minimum is at 0 - pts = [(r, d - best_dnll) for r, d in pts] - - # Interpolate 68% crossing (deltaNLL = 0.5) on each side - def interp_crossing(pairs): - for i in range(len(pairs) - 1): - r0, d0 = pairs[i] - r1, d1 = pairs[i+1] - if d0 <= 0.5 <= d1 and abs(d1 - d0) > 1e-10: - return r0 + (0.5 - d0) * (r1 - r0) / (d1 - d0) - return None - - # left side: scan outward from best_r downward - left = sorted([(r, d) for r, d in pts if r <= best_r], reverse=True) - # right side: scan outward from best_r upward - right = sorted([(r, d) for r, d in pts if r >= best_r]) - - lo = interp_crossing(left) - hi = interp_crossing(right) - - if lo is None or hi is None: - return None - return 0.5 * (hi - lo) - - -def read_asymptotic(path): - """Return expected 95% CL UL (median quantile) or None.""" - if not HAS_ROOT or not os.path.exists(path): - return None - f = ROOT.TFile.Open(path) - if not f or f.IsZombie(): - return None - t = f.Get("limit") - if not t: - f.Close() - return None - exp = None - for ev in t: - if abs(ev.quantileExpected - 0.5) < 0.01: - exp = ev.limit - break - f.Close() - return exp - - -def collect(): - results = {} # [scheme][sig] = {"sigma_r": ..., "exp_ul": ...} - for scheme in SCHEMES_ORDER: - scheme_dir = os.path.join(OUT_BASE, scheme) - if not os.path.isdir(scheme_dir): - continue - results[scheme] = {} - for sig_id in SIG_LABELS: - sig_dir = os.path.join(scheme_dir, sig_id) - # MultiDimFit grid scan - grid_pat = os.path.join(sig_dir, - "higgsCombine%s_%s.MultiDimFit.mH120.root" % (scheme, sig_id)) - sr = read_grid_sigma_r(grid_pat) - # AsymptoticLimits - al_pat = os.path.join(sig_dir, - "higgsCombine%s_%s.AsymptoticLimits.mH120.root" % (scheme, sig_id)) - al = read_asymptotic(al_pat) - results[scheme][sig_id] = {"sigma_r": sr, "al": al} - return results - - -def print_table(results, metric, title): - print("\n" + "="*80) - print(title) - print("="*80) - - sigs = list(SIG_LABELS.keys()) - schemes = [s for s in SCHEMES_ORDER if s in results] - - print("%-26s" % "Scheme", end="") - for s in sigs: - lbl = SIG_LABELS[s].split("(")[0].strip()[:18] - print(" %-18s" % lbl, end="") - print() - print("-" * (26 + 20 * len(sigs))) - - for scheme in schemes: - print("%-26s" % SCHEME_LABELS.get(scheme, scheme), end="") - for sig in sigs: - d = results[scheme].get(sig, {}) - if metric == "sigma_r": - sr = d.get("sigma_r") - val = "%6.4f" % sr if sr is not None else " -- " - else: - al = d.get("al") - val = "%6.3f" % al if al is not None else " -- " - print(" %-18s" % val, end="") - print() - - -def main(): - results = collect() - if not results: - print("No results found in %s" % OUT_BASE) - sys.exit(1) - - print_table(results, "sigma_r", - "sigma_r (68% CI half-width on r, Asimov injection r=1, stat-only)") - print_table(results, "exp_ul", - "Expected 95% CL upper limit on r (stat-only)") - - -if __name__ == "__main__": - main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/generate_variants_el7.py b/MFVNeutralino/test/ForLimits/BinningStudy/generate_variants_el7.py deleted file mode 100644 index 659a7220f..000000000 --- a/MFVNeutralino/test/ForLimits/BinningStudy/generate_variants_el7.py +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# Run inside el7 apptainer + CMSSW_10_6_48 cmsenv. -# For each binning scheme: backs up limits_config.yaml, writes a modified -# version redirecting outputs to BinningStudy/, runs makeLimitsInputROOT.py, -# then restores the original yaml (even on error). -from __future__ import print_function -import os, sys, shutil, subprocess - -try: - import yaml -except ImportError: - print("ERROR: yaml not available - run inside CMSSW cmsenv.") - sys.exit(1) - -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from binning_schemes import SCHEMES - -HERE = os.path.dirname(os.path.abspath(__file__)) -FORLIM = os.path.dirname(HERE) -YAML = os.path.join(FORLIM, "limits_config.yaml") -YAML_BAK = YAML + ".study_backup" - -YEARS = ["20161", "20162", "2017", "2018"] -CHANNELS = ["lep", "bjet"] - - -def write_study_yaml(scheme_name, scheme_info): - with open(YAML_BAK) as f: - cfg = yaml.safe_load(f) - - nbins = scheme_info["nbins"] - bins = scheme_info["bins"] - cfg["bins"] = bins - cfg["nbins"] = nbins - cfg["observations"] = {yr: [0]*nbins for yr in YEARS} - - # Redirect outputs -- never touch nominal Datacards/ or LimitsInput/ - root_base = os.path.join(HERE, "root_output", scheme_name) - dc_base = os.path.join(HERE, "datacards", scheme_name) - for ch in CHANNELS: - for d in [os.path.join(root_base, ch), os.path.join(dc_base, ch)]: - if not os.path.exists(d): - os.makedirs(d) - cfg["root_output"][ch]["folder"] = os.path.join(root_base, ch) + "/" - cfg["datacard_output"][ch]["folder"] = os.path.join(dc_base, ch) + "/" - - with open(YAML, "w") as f: - yaml.safe_dump(cfg, f, default_flow_style=False) - - -def restore_yaml(): - if os.path.exists(YAML_BAK): - shutil.copy2(YAML_BAK, YAML) - os.remove(YAML_BAK) - - -def run_pipeline(scheme_name): - script = os.path.join(FORLIM, "makeLimitsInputROOT.py") - for ch in CHANNELS: - cmd = [sys.executable, script, "--year", "all", "--channel", ch] - print("\n>>> %s" % " ".join(cmd)) - ret = subprocess.call(cmd, cwd=FORLIM) - if ret != 0: - print("WARNING: exit %d for %s %s" % (ret, scheme_name, ch)) - - -def main(): - schemes_to_run = sys.argv[1:] if len(sys.argv) > 1 else sorted(SCHEMES.keys()) - - for name in schemes_to_run: - if name not in SCHEMES: - print("Unknown scheme:", name); continue - - print("\n" + "="*60) - print("SCHEME: %s bins=%s" % (name, SCHEMES[name]["bins"])) - print("="*60) - - # Always work from a clean backup - shutil.copy2(YAML, YAML_BAK) - try: - write_study_yaml(name, SCHEMES[name]) - run_pipeline(name) - finally: - restore_yaml() - print("Restored limits_config.yaml for scheme: %s" % name) - - print("\nAll schemes done. Nominal limits_config.yaml and Datacards/ untouched.") - - -if __name__ == "__main__": - main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/plot_background_templates.py b/MFVNeutralino/test/ForLimits/BinningStudy/plot_background_templates.py deleted file mode 100644 index 94edc0f3f..000000000 --- a/MFVNeutralino/test/ForLimits/BinningStudy/plot_background_templates.py +++ /dev/null @@ -1,150 +0,0 @@ -# Plot normalized background and signal shapes from 3bin_nom datacards. -# Reads yields from text datacards (no ROOT); sums all 4 years. -# Run after generate_variants_el7.py and strip_systs.py have produced -# BinningStudy/datacards/3bin_nom/. - -import os, re -import matplotlib -matplotlib.use("Agg") -import matplotlib.pyplot as plt -import matplotlib.patches as mpatches -import numpy as np - -HERE = os.path.dirname(os.path.abspath(__file__)) -DC_BASE = os.path.join(HERE, "datacards", "3bin_nom") - -# Nominal 3-bin edges (mm/sigma) -BIN_EDGES = [0.0, 0.8, 1.6, 4.0] -BIN_CTRS = [0.4, 1.2, 2.8] - -YEARS = ["20161", "20162", "2017", "2018"] - - -def read_yields(channel, sig_id): - """Return (bkg_yields, sig_yields) summed over all years as numpy arrays.""" - bkg_total = None - sig_total = None - for yr in YEARS: - path = os.path.join(DC_BASE, channel, - "Datacard_%s_%s_%s_statonly.txt" % (channel, sig_id, yr)) - if not os.path.exists(path): - continue - with open(path) as f: - lines = f.readlines() - rate_lines = [l for l in lines if l.startswith("rate")] - if len(rate_lines) < 1: - continue - vals = list(map(float, rate_lines[0].split()[1:])) - nbins = len(vals) // 2 - # makeDatacard.py writes signal first, then background in the rate line - sig = np.array(vals[:nbins]) - bkg = np.array(vals[nbins:]) - if bkg_total is None: - bkg_total = bkg.copy() - sig_total = sig.copy() - else: - bkg_total += bkg - sig_total += sig - return bkg_total, sig_total - - -def plot_channel(ax, channel, signals, colors, labels, title): - """Plot background + signals for one channel.""" - first_bkg = None - for sig_id, color, label in zip(signals, colors, labels): - bkg, sig = read_yields(channel, sig_id) - if bkg is None: - print("WARNING: no data for %s / %s" % (channel, sig_id)) - continue - if first_bkg is None: - first_bkg = bkg - - # Normalize signal to unit area - sig_norm = sig / sig.sum() if sig.sum() > 0 else sig - - # Plot as step histogram - ax.step(BIN_EDGES[:-1] + [BIN_EDGES[-1]], - list(sig_norm) + [0], - where='post', color=color, lw=2, label=label) - - # Background (use last read, they should all be the same shape) - if first_bkg is not None: - bkg_norm = first_bkg / first_bkg.sum() if first_bkg.sum() > 0 else first_bkg - ax.step(BIN_EDGES[:-1] + [BIN_EDGES[-1]], - list(bkg_norm) + [0], - where='post', color='black', lw=2.5, ls='--', label='Background') - - # Bin boundary lines - for edge in BIN_EDGES[1:-1]: - ax.axvline(edge, color='gray', lw=1.5, ls=':', alpha=0.8) - - # Bin edge labels at top (use axes fraction coordinates) - for i, (lo, hi) in enumerate(zip(BIN_EDGES[:-1], BIN_EDGES[1:])): - hi_str = "%.1f" % hi if hi < 3.5 else r"$\infty$" - x_frac = (BIN_CTRS[i] - BIN_EDGES[0]) / (BIN_EDGES[-1] - BIN_EDGES[0]) - ax.text(x_frac, 1.01, "[%.1f, %s]" % (lo, hi_str), - ha='center', va='bottom', fontsize=8, color='gray', - transform=ax.transAxes) - - ax.set_xlim(BIN_EDGES[0], BIN_EDGES[-1]) - ax.set_ylim(bottom=0) - ax.set_xlabel(r"Displacement significance $\sigma_{sv}$ (mm/$\sigma$)", fontsize=11) - ax.set_ylabel("Normalized yield (arb.)", fontsize=11) - ax.set_title(title, fontsize=12) - ax.legend(fontsize=9, loc='upper right') - ax.set_xticks(BIN_EDGES) - ax.tick_params(axis='both', labelsize=9) - - -def main(): - fig, axes = plt.subplots(1, 2, figsize=(12, 5)) - fig.suptitle( - "Background template and signal shapes -- nominal 3-bin scheme\n" - "Dashed vertical lines: bin boundaries at 0.8 and 1.6 $\\sigma_{sv}$", - fontsize=11 - ) - - # Bjet channel: use signals with contrasting lifetime shapes - plot_channel( - axes[0], - channel="bjet", - signals=[ - "mfv_neu_tau001000um_M0400", - "mfv_stopdbardbar_tau000300um_M0400", - ], - colors=["royalblue", "tomato"], - labels=[ - r"$\tilde{g}\tilde{g}$, $\tau=1$ mm, $M=400$ GeV", - r"$\tilde{t}\tilde{t}^*$, $\tau=0.3$ mm, $M=400$ GeV", - ], - title="Bjet channel (displaced jet + b-tag trigger)", - ) - - # Lepton channel - plot_channel( - axes[1], - channel="lep", - signals=[ - "VH_tau1mm_M55", - "VH_tau10mm_M55", - ], - colors=["royalblue", "tomato"], - labels=[ - r"VH $\to$ SS, $\tau=1$ mm, $m_S=55$ GeV", - r"VH $\to$ SS, $\tau=10$ mm, $m_S=55$ GeV", - ], - title="Lepton channel (lepton trigger)", - ) - - plt.tight_layout() - out = os.path.join(HERE, "background_templates.pdf") - fig.savefig(out, bbox_inches="tight") - print("Saved: %s" % out) - - out_png = os.path.join(HERE, "background_templates.png") - fig.savefig(out_png, bbox_inches="tight", dpi=150) - print("Saved: %s" % out_png) - - -if __name__ == "__main__": - main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/run_combine_study.sh b/MFVNeutralino/test/ForLimits/BinningStudy/run_combine_study.sh deleted file mode 100755 index cd4c51c80..000000000 --- a/MFVNeutralino/test/ForLimits/BinningStudy/run_combine_study.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/bin/bash -# Run inside CMSSW_14_1_0_pre4 with cmsenv already sourced. -# For each scheme x signal point: combineCards + FitDiagnostics + AsymptoticLimits (stat-only datacards). -set -e - -HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -DATACARD_BASE="${HERE}/datacards" -OUT_BASE="${HERE}/combine_output" - -YEARS="20161 20162 2017 2018" - -declare -A SIG_CHANNEL -SIG_CHANNEL["VH_tau1mm_M55"]="lep" -SIG_CHANNEL["VH_tau10mm_M55"]="lep" -SIG_CHANNEL["ggHToSSTodddd_tau1mm_M55"]="bjet" -SIG_CHANNEL["mfv_stopdbardbar_tau001000um_M0200"]="bjet" -SIG_CHANNEL["mfv_stopdbardbar_tau000300um_M0400"]="bjet" -SIG_CHANNEL["mfv_neu_tau001000um_M0400"]="bjet" - -for SCHEME in $(ls "${DATACARD_BASE}"); do - echo "" - echo "===============================" - echo "SCHEME: ${SCHEME}" - echo "===============================" - - for SIG_ID in "${!SIG_CHANNEL[@]}"; do - CH="${SIG_CHANNEL[$SIG_ID]}" - WORK_DIR="${OUT_BASE}/${SCHEME}/${SIG_ID}" - mkdir -p "${WORK_DIR}" - cd "${WORK_DIR}" - - # Build card_args: one card per year, named _= - CARD_ARGS="" - MISSING=0 - for YR in ${YEARS}; do - CARD="${DATACARD_BASE}/${SCHEME}/${CH}/Datacard_${CH}_${SIG_ID}_${YR}_statonly.txt" - if [ ! -f "${CARD}" ]; then - echo " SKIP (missing card): ${CARD}" - MISSING=1 - break - fi - CARD_ARGS="${CARD_ARGS} ${CH}_${YR}=${CARD}" - done - [ "${MISSING}" -eq 1 ] && continue - - COMBINED="combined_${SIG_ID}.txt" - - echo " Combining: ${SIG_ID}" - combineCards.py ${CARD_ARGS} > "${COMBINED}" 2>/dev/null - - echo " MultiDimFit grid scan (signal injection r=1)" - combine -M MultiDimFit --algo grid \ - --name "${SCHEME}_${SIG_ID}" \ - "${COMBINED}" \ - -t -1 --expectSignal 1 \ - --rMin 0.5 --rMax 1.5 --points 200 \ - -v 0 2>/dev/null || echo " WARNING: MultiDimFit failed" - - echo " AsymptoticLimits (expectSignal=0)" - combine -M AsymptoticLimits \ - --name "${SCHEME}_${SIG_ID}" \ - "${COMBINED}" \ - --expectSignal 0 \ - -v 0 2>/dev/null || echo " WARNING: AsymptoticLimits failed" - - cd "${HERE}" - done -done - -echo "" -echo "Combine study complete." diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/strip_systs.py b/MFVNeutralino/test/ForLimits/BinningStudy/strip_systs.py deleted file mode 100644 index 5ccb9bb20..000000000 --- a/MFVNeutralino/test/ForLimits/BinningStudy/strip_systs.py +++ /dev/null @@ -1,59 +0,0 @@ -# Strip nuisance lines from datacards; write _statonly.txt alongside each. -# Usage: python strip_systs.py [scheme1 scheme2 ...] (default: all schemes) -import os, sys, glob - -HERE = os.path.dirname(os.path.abspath(__file__)) - - -def strip_one(src_path, dst_path): - with open(src_path) as f: - lines = f.readlines() - - out = [] - past_rate = False - for line in lines: - stripped = line.strip() - if stripped.startswith("rate ") or stripped.startswith("rate\t"): - out.append(line) - past_rate = True - continue - if past_rate: - continue # drop all nuisance lines - # Fix kmax line to 0 (no nuisances) - if stripped.startswith("kmax"): - out.append("kmax 0 number of nuisance parameters\n") - else: - out.append(line) - - with open(dst_path, "w") as f: - f.writelines(out) - - -def strip_scheme(scheme_dir): - n = 0 - for ch in ("lep", "bjet"): - ch_dir = os.path.join(scheme_dir, ch) - if not os.path.isdir(ch_dir): - continue - for fn in glob.glob(os.path.join(ch_dir, "Datacard_*.txt")): - if fn.endswith("_statonly.txt"): - continue - dst = fn.replace(".txt", "_statonly.txt") - strip_one(fn, dst) - n += 1 - return n - - -def main(): - datacards_dir = os.path.join(HERE, "datacards") - schemes = sys.argv[1:] if len(sys.argv) > 1 else sorted(os.listdir(datacards_dir)) - for name in schemes: - d = os.path.join(datacards_dir, name) - if not os.path.isdir(d): - continue - n = strip_scheme(d) - print("%-12s stripped %d datacards" % (name, n)) - - -if __name__ == "__main__": - main() From 5b5ccdea5a7255933f5dde3000fc424fcdff13a2 Mon Sep 17 00:00:00 2001 From: Gianfranco de Castro Date: Mon, 18 May 2026 15:26:58 -0500 Subject: [PATCH 07/15] Latest plotting changes --- MFVNeutralino/test/ForLimits/plotLimits.py | 599 +++++++++++++++++---- 1 file changed, 502 insertions(+), 97 deletions(-) diff --git a/MFVNeutralino/test/ForLimits/plotLimits.py b/MFVNeutralino/test/ForLimits/plotLimits.py index 45c142033..6587aaf2f 100644 --- a/MFVNeutralino/test/ForLimits/plotLimits.py +++ b/MFVNeutralino/test/ForLimits/plotLimits.py @@ -1,16 +1,21 @@ #!/usr/bin/env python3 """ -Plot 95% CL upper limits on signal strength r = sigma/sigma_theory. +Plot 95% CL upper limits on sigma x B^2 [fb]. Reads CombineOutput//higgsCombine.AsymptoticLimits.mH120.root for all available hypotheses and produces per-process plots. Output (in LimitPlots/): - _1D.pdf -- ctau [mm] vs r upper limit, one curve per mass - _2D.pdf -- ctau vs mass 2D color map + r=1 exclusion contour + _1D.pdf -- ctau on x, one curve per mass + _1D_vsmass.pdf -- mass on x, all ctau values overlaid + _1D_vsmass__vs_.pdf -- mass on x, one plot per adjacent ctau pair + _2D.pdf -- ctau vs mass 2D color map + r=1 exclusion contour + _1D_hepcomp_MvsM.pdf -- ctau on x, Low-HT vs High-HT (HepData) per mass pair + _1D_hepcomp_vsmass_vs.pdf -- mass on x, Low-HT vs High-HT per ctau pair HepData reference (ins1861146, old high-HT displaced vertex analysis): - Only shown for SUSY signals. Load from hepdata_ins1861146.json if present. + Only used for comparison 1D plots (never shown on 2D plots). + Load from hepdata_ins1861146.json if present. Template: {"mfv_neu": {"ctau_mm": [c1,...], "mass_gev": [m1,...], "obs": [[r_c1m1, r_c1m2,...], [r_c2m1,...],...] }} where obs[i][j] = observed limit at ctau_mm[i], mass_gev[j]. @@ -51,8 +56,16 @@ COMBINE_OUT = os.path.join(HERE, "CombineOutput") HEPDATA_JSON = os.path.join(HERE, "hepdata_ins1861146.json") PLOT_DIR = os.path.join(HERE, "LimitPlots") +_ONE2TWO = os.path.join(HERE, "..", "One2Two") + +# Theory XS CSV files (SUSY XS WG, NNLO_approx+NNLL) used to convert HepData +# from r = σ×B²/σ_theory (how it is stored) to σ×B² in fb (our r units, σ_ref=1fb). +_HEPDATA_THEORY_CSV = { + "mfv_neu": os.path.join(_ONE2TWO, "gluglu.csv"), + "mfv_stopdbardbar": os.path.join(_ONE2TWO, "stopstop.csv"), + "mfv_stopbbarbbar": os.path.join(_ONE2TWO, "stopstop.csv"), +} -HEPDATA_PROCS = {"mfv_neu", "mfv_stopdbardbar", "mfv_stopbbarbbar"} PROC_LABELS = { "VH": r"WH + ZH (incl. gg), H$\to$SS$\to$dddd", @@ -65,6 +78,47 @@ "mfv_stopbbarbbar": r"RPV SUSY, $\tilde{t}\to\bar{b}\bar{b}$", } +_SUSY_PROCS = {"mfv_neu", "mfv_stopdbardbar", "mfv_stopbbarbbar"} + +# Fixed 2D colorbar scale (vmin, vref, vmax) in fb, keyed by process. +# vref is the neutral-color pivot (white on RdBu_r) and the colorbar reference line. +# For SUSY: pivot near the expected exclusion boundary (~1-100 fb for M~1-2 TeV). +# Falls back to automatic geometric-mean computation for unspecified processes. +_2D_VSCALE = { + "mfv_neu": (0.1, 10.0, 1e5), + "mfv_stopdbardbar": (0.1, 10.0, 1e5), + "mfv_stopbbarbbar": (0.1, 10.0, 1e5), +} + +# H→SS reference cross sections: σ_SM_H [pb] × BR(H→SS=1%) × filter_eff × 1000 → fb +# From Samples.py _set_signal_stuff (13 TeV, mH=125 GeV, CERN YR4). +# VH combines WplusH + WminusH + qqZH + ggZH (all filter_eff=1 in Samples.py). +_BR_HSS = 0.01 +_HIGGS_SIGMA_REF_FB = { + "VH": (3*9.426e-02 + 3*5.983e-02 + 3*2.568e-02 + 3*4.14e-03) * _BR_HSS * 1000, + "ggZHToSSTobbbb": 3 * 4.14e-03 * _BR_HSS * 1000, + "ttHToLLPs_bbbb": 0.5071 * _BR_HSS * 1000, + "ttHToLLPs_dddd": 0.5071 * _BR_HSS * 1000, +} +# ggH has a mass-dependent generator-level filter efficiency (constant across ctau). +_GGHSS_FILTER_EFF = {"15": 0.106, "40": 0.085, "55": 0.082} +_GGHSS_BASE_SIGMA_FB = 48.58 * _BR_HSS * 1000 # 485.8 fb before filter_eff + + +def _sig_scale_fb(proc, mass=None): + """σ_ref [fb] used in the Combine datacard for this (proc, mass) hypothesis. + + For SUSY σ_ref = 1 fb, so r already equals σ×B² [fb]. + For H→SS σ_ref = σ_SM_H × BR(H→SS=1%) × filter_eff, so multiply r by this + to obtain σ×B² [fb]. + """ + if proc in _SUSY_PROCS: + return 1.0 + if proc == "ggHToSSTodddd": + return _GGHSS_BASE_SIGMA_FB # filter_eff cancels: σ×BR = r × σ_SM × 0.01 + return _HIGGS_SIGMA_REF_FB.get(proc, 1.0) + + _COLORS = ["#e41a1c", "#377eb8", "#4daf4a", "#984ea3", "#ff7f00", "#a65628"] _RUN2_LUMI = r"137.9 fb$^{-1}$ (13 TeV)" @@ -73,16 +127,19 @@ # H->SS processes: BR(H->SS)=1% is folded into xsec. # ggH additionally has a mass-dependent gen-level filter efficiency in xsec. _NORM_NOTE = r"$\sigma \times \mathcal{B}(H{\to}SS)=1\%$" -_NORM_NOTE_FILTER = r"$\sigma \times \mathcal{B}(H{\to}SS)=1\%$, gen. filter eff." _PROC_NORM_NOTES = { "VH": _NORM_NOTE, "ggZHToSSTobbbb": _NORM_NOTE, - "ggHToSSTodddd": _NORM_NOTE_FILTER, + "ggHToSSTodddd": _NORM_NOTE, "ttHToLLPs_bbbb": _NORM_NOTE, "ttHToLLPs_dddd": _NORM_NOTE, } +# --------------------------------------------------------------------------- +# Parsing / I/O +# --------------------------------------------------------------------------- + def ctau_to_mm(s): """'300um' -> 0.3, '1mm' -> 1.0, '10mm' -> 10.0""" if s.endswith("um"): @@ -164,28 +221,206 @@ def collect_all(): return data +def _load_theory_xsec_csv(csv_path): + """Return (mass_arr, xsec_fb_arr) from a SUSY XS WG CSV (cols: mass_GeV, xs_pb, unc_pct).""" + rows = [eval(l.strip()) for l in open(csv_path) if l.strip()] + masses = np.array([r[0] for r in rows], dtype=float) + xsec_fb = np.array([r[1] for r in rows], dtype=float) * 1000.0 # pb -> fb + return masses, xsec_fb + + +def _interp_theory_xsec_fb(mass_gev, masses, xsec_fb): + """Log-log interpolation/extrapolation of theory XS in fb at mass_gev.""" + lm = np.log(masses) + lxs = np.log(xsec_fb) + return float(np.exp(np.interp(np.log(float(mass_gev)), lm, lxs))) + + +def _hepdata_r_to_sigxb2_fb(hd_proc, csv_path): + """Convert HepData obs from r=σ×B²/σ_theory to σ×B² in fb using the theory XS CSV.""" + masses_csv, xsec_fb_csv = _load_theory_xsec_csv(csv_path) + hd_masses = hd_proc["mass_gev"] + obs_raw = np.array(hd_proc["obs"]) # shape: (n_ctau, n_mass) + xs_col = np.array([_interp_theory_xsec_fb(m, masses_csv, xsec_fb_csv) + for m in hd_masses]) + obs_fb = obs_raw * xs_col[np.newaxis, :] # broadcast over ctau axis + return { + "ctau_mm": hd_proc["ctau_mm"], + "mass_gev": hd_proc["mass_gev"], + "obs": obs_fb.tolist(), + } + + def load_hepdata(): + """Load HepData JSON and convert SUSY proc obs from r to σ×B² in fb.""" if not os.path.exists(HEPDATA_JSON): return {} with open(HEPDATA_JSON) as fh: - return json.load(fh) + raw = json.load(fh) + out = {} + for proc, hd_proc in raw.items(): + csv_path = _HEPDATA_THEORY_CSV.get(proc) + if csv_path and os.path.exists(csv_path): + out[proc] = _hepdata_r_to_sigxb2_fb(hd_proc, csv_path) + elif csv_path: + print("Warning: theory XS CSV not found for %s; HepData comparison skipped" % proc) + else: + out[proc] = hd_proc + return out + + +# --------------------------------------------------------------------------- +# Shared helpers +# --------------------------------------------------------------------------- + +def _format_ctau(ctau_mm): + """Format a ctau float for labels and filenames, e.g. 0.3 -> '0.3mm'.""" + if ctau_mm < 1.0: + s = "%.3g" % ctau_mm + else: + s = "%.4g" % ctau_mm + return s + "mm" + + +def _pair_list(items): + """Non-overlapping adjacent pairs from a sorted list: (0,1), (2,3), ...""" + return list(zip(items[0::2], items[1::2])) + + +def _invert_mass_data(mass_data): + """Return {ctau_mm -> {mass_str -> limits}} from the standard mass-keyed dict.""" + ctau_data = {} + for mass, cdict in mass_data.items(): + for ctau, lims in cdict.items(): + ctau_data.setdefault(ctau, {})[mass] = lims + return ctau_data + + +def _sorted_masses(mass_data): + return sorted(mass_data.keys(), key=lambda m: int(m) if m.isdigit() else 0) + + +def _hepdata_slice_at_mass(hd, mass_gev): + """Interpolate HepData in mass; return (ctau_arr, r_arr) or (None, None).""" + hd_ctaus = np.array(hd["ctau_mm"]) + hd_masses = np.array(hd["mass_gev"]) + hd_obs = np.array(hd["obs"]) # shape: (n_ctau, n_mass) + if mass_gev < hd_masses[0] or mass_gev > hd_masses[-1]: + return None, None + r = np.array([np.interp(mass_gev, hd_masses, hd_obs[i, :]) + for i in range(len(hd_ctaus))]) + return hd_ctaus, r + + +def _hepdata_slice_at_ctau(hd, ctau_mm): + """Interpolate HepData in log(ctau); return (mass_arr, r_arr) or (None, None). + + ctau grids are log-spaced, so interpolation must be done in log space to avoid + large biases between grid points (e.g. between 1 mm and 10 mm). + """ + hd_ctaus = np.array(hd["ctau_mm"]) + hd_masses = np.array(hd["mass_gev"]) + hd_obs = np.array(hd["obs"]) # shape: (n_ctau, n_mass) + if ctau_mm < hd_ctaus[0] or ctau_mm > hd_ctaus[-1]: + return None, None + log_ctaus = np.log(hd_ctaus) + r = np.array([np.interp(np.log(ctau_mm), log_ctaus, hd_obs[:, j]) + for j in range(len(hd_masses))]) + return hd_masses, r + + +def _draw_ref_curve_vsmass(ax, proc): + """Draw σ_ref curve vs mass (theory for SUSY, SM benchmark for H→SS). Returns True if drawn.""" + if proc in _SUSY_PROCS: + csv_path = _HEPDATA_THEORY_CSV.get(proc) + if not csv_path or not os.path.exists(csv_path): + return False + masses_csv, xsec_fb_csv = _load_theory_xsec_csv(csv_path) + ax.plot(masses_csv, xsec_fb_csv, color="black", lw=1.5, ls="--", + label=r"Theory $\sigma\mathcal{B}^{2}$", zorder=3) + return True + if proc == "ggHToSSTodddd": + ax.axhline(_GGHSS_BASE_SIGMA_FB, color="black", lw=1.5, ls="--", + label=r"SM $\sigma\mathcal{B}(H{\to}SS{=}1\%)$", zorder=3) + return True + scale = _HIGGS_SIGMA_REF_FB.get(proc) + if scale is not None: + ax.axhline(scale, color="black", lw=1.5, ls="--", + label=r"SM $\sigma\mathcal{B}(H{\to}SS{=}1\%)$", zorder=3) + return True + return False + + +def _draw_ref_lines_ctau(ax, proc, masses_sorted, color_list): + """Draw σ_ref horizontal lines per mass (theory XS for SUSY, SM benchmark for H→SS).""" + if proc in _SUSY_PROCS: + csv_path = _HEPDATA_THEORY_CSV.get(proc) + if not csv_path or not os.path.exists(csv_path): + return False + masses_csv, xsec_fb_csv = _load_theory_xsec_csv(csv_path) + for i, mass in enumerate(masses_sorted): + xs = _interp_theory_xsec_fb(int(mass), masses_csv, xsec_fb_csv) + ax.axhline(xs, color=color_list[i % len(color_list)], lw=1.0, ls=":", alpha=0.6, zorder=2) + return True + if proc == "ggHToSSTodddd": + ax.axhline(_GGHSS_BASE_SIGMA_FB, color="black", lw=1.5, ls="--", + label=r"SM $\sigma\mathcal{B}(H{\to}SS{=}1\%)$", zorder=3) + return True + scale = _HIGGS_SIGMA_REF_FB.get(proc) + if scale is not None: + ax.axhline(scale, color="black", lw=1.5, ls="--", + label=r"SM $\sigma\mathcal{B}(H{\to}SS{=}1\%)$", zorder=3) + return True + return False + + +def _annotate_proc(ax, proc): + _proc_label = PROC_LABELS.get(proc, proc) + _norm = _PROC_NORM_NOTES.get(proc, "") + _annot = _proc_label + ("\n" + _norm if _norm else "") + ax.text(0.0, -0.13, _annot, + transform=ax.transAxes, fontsize=10, ha="left", va="top", clip_on=False) + + +def _ylabel(proc): + """Y-axis label: σ×B² [fb] for SUSY (both sparticles decay); σ×BR(H→SS) [fb] for H→SS.""" + if proc in _SUSY_PROCS: + return r"95% CL upper limit on $\sigma\mathcal{B}^{2}$ [fb]" + return r"95% CL upper limit on $\sigma\mathcal{B}(H{\to}SS)$ [fb]" +def _cms_label(ax): + if _HAS_MPLHEP: + hep.cms.label("Preliminary", data=False, ax=ax, fontsize=12, rlabel=_RUN2_LUMI) + + +def _save(fig, out_fn): + plt.tight_layout() + fig.savefig(out_fn, bbox_inches="tight") + plt.close(fig) + print(" -> %s" % out_fn) + + +# --------------------------------------------------------------------------- +# 1D: ctau on x-axis, one curve per mass (original plot) +# --------------------------------------------------------------------------- + def plot_1d(proc, mass_data, out_dir, hepdata): fig, ax = plt.subplots(figsize=(8, 6)) - masses = sorted(mass_data.keys(), key=lambda m: int(m) if m.isdigit() else 0) + masses = _sorted_masses(mass_data) for i, mass in enumerate(masses): + scale = _sig_scale_fb(proc, mass) cdict = mass_data[mass] ctaus = sorted(cdict.keys()) if not ctaus: continue - exp = [cdict[c]["exp"] for c in ctaus] - dn1 = [cdict[c]["dn1"] for c in ctaus] - up1 = [cdict[c]["up1"] for c in ctaus] - dn2 = [cdict[c].get("dn2", cdict[c]["dn1"]) for c in ctaus] - up2 = [cdict[c].get("up2", cdict[c]["up1"]) for c in ctaus] + exp = [cdict[c]["exp"] * scale for c in ctaus] + dn1 = [cdict[c]["dn1"] * scale for c in ctaus] + up1 = [cdict[c]["up1"] * scale for c in ctaus] + dn2 = [cdict[c].get("dn2", cdict[c]["dn1"]) * scale for c in ctaus] + up2 = [cdict[c].get("up2", cdict[c]["up1"]) * scale for c in ctaus] col = _COLORS[i % len(_COLORS)] ax.fill_between(ctaus, dn2, up2, alpha=0.15, color=col, edgecolor="none") @@ -194,35 +429,193 @@ def plot_1d(proc, mass_data, out_dir, hepdata): label="m = %s GeV (exp)" % mass) if "obs" in cdict[ctaus[0]]: - obs = [cdict[c]["obs"] for c in ctaus] + obs = [cdict[c]["obs"] * scale for c in ctaus] ax.plot(ctaus, obs, color=col, lw=2, ls="-", label="m = %s GeV (obs)" % mass) - ax.axhline(1.0, color="black", lw=1.2, ls=":", zorder=3) - + if not _draw_ref_lines_ctau(ax, proc, masses, _COLORS): + ax.axhline(1.0, color="black", lw=1.2, ls=":", zorder=3) ax.set_xscale("log") ax.set_yscale("log") ax.set_xlabel(r"$c\tau$ [mm]") - ax.set_ylabel("95% CL upper limit on $r$") + ax.set_ylabel(_ylabel(proc)) ax.legend(fontsize=9, ncol=2) ax.grid(True, which="both", ls=":", alpha=0.4) + _cms_label(ax) + _annotate_proc(ax, proc) + _save(fig, os.path.join(out_dir, "%s_1D.pdf" % proc)) - if _HAS_MPLHEP: - hep.cms.label("Preliminary", data=False, ax=ax, fontsize=12, - rlabel=_RUN2_LUMI) - _proc_label = PROC_LABELS.get(proc, proc) - _norm = _PROC_NORM_NOTES.get(proc, "") - _annot = _proc_label + ("\n" + _norm if _norm else "") - ax.text(0.0, -0.13, _annot, - transform=ax.transAxes, fontsize=10, ha="left", va="top", - clip_on=False) +# --------------------------------------------------------------------------- +# 1D: mass on x-axis, ctau as overlaid lines — all ctau in one plot +# --------------------------------------------------------------------------- - plt.tight_layout() - out_fn = os.path.join(out_dir, "%s_1D.pdf" % proc) - fig.savefig(out_fn, bbox_inches="tight") - plt.close(fig) - print(" 1D -> %s" % out_fn) +def plot_1d_vs_mass_all(proc, mass_data, out_dir): + ctau_data = _invert_mass_data(mass_data) + ctaus_sorted = sorted(ctau_data.keys()) + + fig, ax = plt.subplots(figsize=(8, 6)) + + for i, ctau in enumerate(ctaus_sorted): + mdict = ctau_data[ctau] + masses = _sorted_masses(mdict) + mass_vals = [int(m) for m in masses] + scales = [_sig_scale_fb(proc, m) for m in masses] + + exp = [mdict[m]["exp"] * s for m, s in zip(masses, scales)] + dn1 = [mdict[m]["dn1"] * s for m, s in zip(masses, scales)] + up1 = [mdict[m]["up1"] * s for m, s in zip(masses, scales)] + dn2 = [mdict[m].get("dn2", mdict[m]["dn1"]) * s for m, s in zip(masses, scales)] + up2 = [mdict[m].get("up2", mdict[m]["up1"]) * s for m, s in zip(masses, scales)] + + col = _COLORS[i % len(_COLORS)] + lbl = _format_ctau(ctau) + ax.fill_between(mass_vals, dn2, up2, alpha=0.15, color=col, edgecolor="none") + ax.fill_between(mass_vals, dn1, up1, alpha=0.35, color=col, edgecolor="none") + ax.plot(mass_vals, exp, color=col, lw=2, ls="--", + label=r"$c\tau$ = %s (exp)" % lbl) + + has_obs = "obs" in mdict[masses[0]] + if has_obs: + obs = [mdict[m]["obs"] * s for m, s in zip(masses, scales)] + ax.plot(mass_vals, obs, color=col, lw=2, ls="-", + label=r"$c\tau$ = %s (obs)" % lbl) + + if not _draw_ref_curve_vsmass(ax, proc): + ax.axhline(1.0, color="black", lw=1.2, ls=":", zorder=3) + ax.set_yscale("log") + ax.set_xlabel("Mass [GeV]") + ax.set_ylabel(_ylabel(proc)) + ax.legend(fontsize=9, ncol=2) + ax.grid(True, which="both", ls=":", alpha=0.4) + _cms_label(ax) + _annotate_proc(ax, proc) + _save(fig, os.path.join(out_dir, "%s_1D_vsmass.pdf" % proc)) + + +# --------------------------------------------------------------------------- +# 1D: mass on x-axis, one plot per adjacent ctau pair (+ optional HepData) +# --------------------------------------------------------------------------- + +def _draw_lowht_pair(ax, proc, ctau_data, c1, c2): + """Draw Low-HT exp+bands+obs for two ctau values, scaled to σ×B² [fb].""" + for i, ctau in enumerate([c1, c2]): + mdict = ctau_data[ctau] + masses = _sorted_masses(mdict) + mass_vals = [int(m) for m in masses] + scales = [_sig_scale_fb(proc, m) for m in masses] + exp = [mdict[m]["exp"] * s for m, s in zip(masses, scales)] + dn1 = [mdict[m]["dn1"] * s for m, s in zip(masses, scales)] + up1 = [mdict[m]["up1"] * s for m, s in zip(masses, scales)] + dn2 = [mdict[m].get("dn2", mdict[m]["dn1"]) * s for m, s in zip(masses, scales)] + up2 = [mdict[m].get("up2", mdict[m]["up1"]) * s for m, s in zip(masses, scales)] + col = _COLORS[i] + lbl = _format_ctau(ctau) + ax.fill_between(mass_vals, dn2, up2, alpha=0.15, color=col, edgecolor="none") + ax.fill_between(mass_vals, dn1, up1, alpha=0.35, color=col, edgecolor="none") + ax.plot(mass_vals, exp, color=col, lw=2, ls="--", + label=r"$c\tau$ = %s Low-HT exp." % lbl) + if "obs" in mdict[masses[0]]: + obs = [mdict[m]["obs"] * s for m, s in zip(masses, scales)] + ax.plot(mass_vals, obs, color=col, lw=2, ls="-", + label=r"$c\tau$ = %s Low-HT obs." % lbl) + + +def _draw_hepdata_pair(ax, hd, c1, c2): + """Overlay High-HT (HepData EXO-19-013) obs lines for two ctau values.""" + for i, ctau in enumerate([c1, c2]): + hd_masses_sl, hd_r_sl = _hepdata_slice_at_ctau(hd, ctau) + if hd_masses_sl is None: + continue + # Mask out zero/non-positive entries (JSON stores 0 for very strong exclusions) + hd_masses_sl = np.array(hd_masses_sl) + hd_r_sl = np.array(hd_r_sl) + keep = hd_r_sl > 0 + if not np.any(keep): + continue + col = _COLORS[i + 2] + lbl = _format_ctau(ctau) + ax.plot(hd_masses_sl[keep], hd_r_sl[keep], color=col, lw=2, ls="-", + label=r"$c\tau$ = %s High-HT obs. (EXO-19-013)" % lbl) + + +def plot_1d_vs_mass_pairs(proc, mass_data, out_dir, hepdata=None): + ctau_data = _invert_mass_data(mass_data) + ctaus_sorted = sorted(ctau_data.keys()) + pairs = _pair_list(ctaus_sorted) + hd = hepdata.get(proc) if hepdata else None + + for c1, c2 in pairs: + fig, ax = plt.subplots(figsize=(8, 6)) + _draw_lowht_pair(ax, proc, ctau_data, c1, c2) + if hd: + _draw_hepdata_pair(ax, hd, c1, c2) + if not _draw_ref_curve_vsmass(ax, proc): + ax.axhline(1.0, color="black", lw=1.2, ls=":", zorder=3) + ax.set_yscale("log") + ax.set_xlabel("Mass [GeV]") + ax.set_ylabel(_ylabel(proc)) + ax.legend(fontsize=9) + ax.grid(True, which="both", ls=":", alpha=0.4) + _cms_label(ax) + _annotate_proc(ax, proc) + tag = "%s_vs_%s" % (_format_ctau(c1), _format_ctau(c2)) + _save(fig, os.path.join(out_dir, "%s_1D_vsmass_%s.pdf" % (proc, tag))) + + +# --------------------------------------------------------------------------- +# 1D: mass on x-axis, two user-specified ctau values +# --------------------------------------------------------------------------- + +def plot_1d_vs_mass_ctau_pair(proc, mass_data, out_dir, c1_mm, c2_mm, hepdata=None): + """One plot with exactly two ctau values (specified in mm) overlaid.""" + ctau_data = _invert_mass_data(mass_data) + available = sorted(ctau_data.keys()) + def _nearest(target): + return min(available, key=lambda c: abs(c - target)) + c1 = _nearest(c1_mm) + c2 = _nearest(c2_mm) + if c1 == c2: + print(" Skipping specific pair for %s: c1=c2=%s" % (proc, c1)) + return + hd = hepdata.get(proc) if hepdata else None + + fig, ax = plt.subplots(figsize=(8, 6)) + _draw_lowht_pair(ax, proc, ctau_data, c1, c2) + if hd: + _draw_hepdata_pair(ax, hd, c1, c2) + if not _draw_ref_curve_vsmass(ax, proc): + ax.axhline(1.0, color="black", lw=1.2, ls=":", zorder=3) + ax.set_yscale("log") + ax.set_xlabel("Mass [GeV]") + ax.set_ylabel(_ylabel(proc)) + ax.legend(fontsize=9) + ax.grid(True, which="both", ls=":", alpha=0.4) + _cms_label(ax) + _annotate_proc(ax, proc) + tag = "%s_vs_%s" % (_format_ctau(c1), _format_ctau(c2)) + _save(fig, os.path.join(out_dir, "%s_1D_vsmass_%s.pdf" % (proc, tag))) + + +# --------------------------------------------------------------------------- +# 2D: ctau vs mass color map + r=1 contour (no HepData overlay) +# --------------------------------------------------------------------------- + +def _excl_thresholds_2d(proc, masses, mass_vals): + """Return σ×B² [fb] exclusion threshold per mass column for the 2D contour. + + For SUSY: threshold = σ_theory_NLO(mass) from CSV. The r=1 Combine contour + marks σ×B²=1 fb (arbitrary σ_ref), NOT the theory exclusion boundary. + For H→SS: threshold = σ_ref_fb(proc, mass) = σ_SM × BR(1%) × filter_eff, + so r=1 Combine contour IS the SM exclusion boundary — no correction needed. + """ + if proc in _SUSY_PROCS: + csv_path = _HEPDATA_THEORY_CSV.get(proc) + if csv_path and os.path.exists(csv_path): + masses_csv, xsec_fb_csv = _load_theory_xsec_csv(csv_path) + return np.array([_interp_theory_xsec_fb(m, masses_csv, xsec_fb_csv) + for m in mass_vals]) + return np.array([_sig_scale_fb(proc, m) for m in masses]) def _interp_grid(log_ctaus, mass_vals, grid, fine_lct, fine_mass): @@ -239,8 +632,18 @@ def _interp_grid(log_ctaus, mass_vals, grid, fine_lct, fine_mass): def plot_2d(proc, mass_data, out_dir, hepdata): - masses = sorted(mass_data.keys(), key=lambda m: int(m) if m.isdigit() else 0) - ctaus_all = sorted(set(c for md in mass_data.values() for c in md.keys())) + masses = _sorted_masses(mass_data) + + # Build a clean rectangular grid: + # - Drop masses with very few ctau points (e.g. M3000 with only 2 after wall-time failures). + # - Allow masses missing at most 1 ctau relative to the best-covered mass, so that + # partially-complete high-mass points (M1200, M1600) are kept and the exclusion + # contour remains visible. The intersection then eliminates any residual holes. + ctau_counts = {m: len(mass_data[m]) for m in masses} + max_n = max(ctau_counts.values()) + min_n = max(3, max_n - 1) + masses = [m for m in masses if ctau_counts[m] >= min_n] + ctaus_all = sorted(set.intersection(*[set(mass_data[m].keys()) for m in masses])) if len(masses) < 2 or len(ctaus_all) < 2: print(" Skipping 2D for %s: need at least 2x2 grid" % proc) @@ -270,113 +673,110 @@ def plot_2d(proc, mass_data, out_dir, hepdata): fine_exp = _interp_grid(log_ctaus, mass_vals, grid_exp, fine_lct, fine_mass) fine_obs = _interp_grid(log_ctaus, mass_vals, grid_obs, fine_lct, fine_mass) + # Per-mass scale factors: σ_ref [fb] used in the datacard for each mass column. + # For SUSY scale=1, so the raw Combine r grid is already in σ×B² [fb]. + scales = np.array([_sig_scale_fb(proc, m) for m in masses]) + scale_fine = np.interp(fine_mass, mass_vals, scales) + + # Scaled grids for the colour map (σ×B² [fb]). + grid_exp_s = grid_exp * scales[np.newaxis, :] + grid_obs_s = grid_obs * scales[np.newaxis, :] + fine_exp_s = fine_exp * scale_fine[np.newaxis, :] if fine_exp is not None else None + fine_obs_s = fine_obs * scale_fine[np.newaxis, :] if fine_obs is not None else None + + # Exclusion threshold per mass: σ×B² [fb] value at which r=1 boundary is physical. + # For SUSY this is σ_theory_NLO(mass); for H→SS it equals σ_ref_fb (= scales). + thresholds = _excl_thresholds_2d(proc, masses, mass_vals) + thresh_fine = np.interp(fine_mass, mass_vals, thresholds) + + # Ratio grids: σ×B²_limit / threshold. Contour at 1.0 = genuine exclusion boundary. + ratio_exp = grid_exp_s / thresholds[np.newaxis, :] + ratio_obs = grid_obs_s / thresholds[np.newaxis, :] + fine_ratio_exp = _interp_grid(log_ctaus, mass_vals, ratio_exp, fine_lct, fine_mass) + fine_ratio_obs = _interp_grid(log_ctaus, mass_vals, ratio_obs, fine_lct, fine_mass) + + # Colormap scale: use hardcoded (vmin, vref, vmax) if available, else auto from thresholds. + if proc in _2D_VSCALE: + vmin, vref, vmax = _2D_VSCALE[proc] + else: + vref = float(np.exp(np.mean(np.log(thresholds[thresholds > 0])))) + vmin = vref * 0.05 + vmax = vref * 200.0 + fig, ax = plt.subplots(figsize=(9, 6)) - # Diverging log-scale colormap centred at r=1: blue=excluded, red=not excluded - vmin, vmax = 0.05, 200.0 + # Diverging log-scale colormap centred at the exclusion threshold. n_half = 30 levels = np.concatenate([ - np.logspace(np.log10(vmin), 0, n_half + 1)[:-1], - np.logspace(0, np.log10(vmax), n_half + 1), + np.logspace(np.log10(vmin), np.log10(vref), n_half + 1)[:-1], + np.logspace(np.log10(vref), np.log10(vmax), n_half + 1), ]) norm = mcolors.LogNorm(vmin=vmin, vmax=vmax) - cmap = plt.get_cmap("RdBu_r") # blue=low r (excluded), red=high r (not excluded) + cmap = plt.get_cmap("RdBu_r") # blue=excluded, red=not excluded - _nice_ticks = [t for t in [0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 50, 100, 200] - if vmin <= t <= vmax] + _all_nice = [0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, + 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, + 10000, 20000, 50000, 100000] + _nice_ticks = [t for t in _all_nice if vmin <= t <= vmax] - if fine_exp is not None: - cf = ax.contourf(fine_ctau, fine_mass, fine_exp.T, + if fine_exp_s is not None: + cf = ax.contourf(fine_ctau, fine_mass, fine_exp_s.T, levels=levels, norm=norm, cmap=cmap, extend="both") cbar = plt.colorbar(cf, ax=ax, pad=0.02) - cbar.set_label("95% CL upper limit on $r$") + cbar.set_label(_ylabel(proc)) cbar.set_ticks(_nice_ticks) cbar.set_ticklabels(["%g" % t for t in _nice_ticks]) - cbar.ax.axhline(y=1.0, color="black", lw=1.0, ls="--") + cbar.ax.axhline(y=vref, color="black", lw=1.0, ls="--") - # expected: dashed; observed: solid (CMS convention) - ax.contour(fine_ctau, fine_mass, fine_exp.T, levels=[1.0], + # Exclusion contours on the ratio grid (= 1.0 where limit = theory/SM benchmark) + ax.contour(fine_ctau, fine_mass, fine_ratio_exp.T, levels=[1.0], colors=["black"], linewidths=[2.5], linestyles=["dashed"]) - ax.plot([], [], color="black", lw=2.5, ls="--", label="Exp. excl. ($r=1$)") + ax.plot([], [], color="black", lw=2.5, ls="--", label="Exp. excl.") - if fine_obs is not None: - ax.contour(fine_ctau, fine_mass, fine_obs.T, levels=[1.0], + if fine_ratio_obs is not None: + ax.contour(fine_ctau, fine_mass, fine_ratio_obs.T, levels=[1.0], colors=["black"], linewidths=[2.5], linestyles=["solid"]) - ax.plot([], [], color="black", lw=2.5, ls="-", label="Obs. excl. ($r=1$)") + ax.plot([], [], color="black", lw=2.5, ls="-", label="Obs. excl.") else: xs, ys, cs = [], [], [] for j, mass in enumerate(masses): for i, ctau in enumerate(ctau_vals): - if not np.isnan(grid_exp[i, j]): + if not np.isnan(grid_exp_s[i, j]): xs.append(ctau) ys.append(mass_vals[j]) - cs.append(np.clip(grid_exp[i, j], vmin, vmax)) + cs.append(np.clip(grid_exp_s[i, j], vmin, vmax)) if xs: sc = ax.scatter(xs, ys, c=cs, s=300, zorder=5, norm=norm, cmap=cmap, edgecolors="black", linewidths=0.5) cbar = plt.colorbar(sc, ax=ax, pad=0.02) - cbar.set_label("95% CL upper limit on $r$") + cbar.set_label(_ylabel(proc)) cbar.set_ticks(_nice_ticks) cbar.set_ticklabels(["%g" % t for t in _nice_ticks]) - cbar.ax.axhline(y=1.0, color="black", lw=1.0, ls="--") + cbar.ax.axhline(y=vref, color="black", lw=1.0, ls="--") for j, mass in enumerate(masses): for i, ctau in enumerate(ctau_vals): ax.scatter(ctau, mass_vals[j], color="black", s=20, zorder=6) - if proc in HEPDATA_PROCS and proc in hepdata: - hd = hepdata[proc] - hd_ctaus = np.array(hd["ctau_mm"], dtype=float) - hd_masses = np.array(hd["mass_gev"], dtype=float) - hd_obs = np.array(hd["obs"], dtype=float) - if _HAS_SCIPY and len(hd_ctaus) >= 2 and len(hd_masses) >= 2: - hd_fine_lct = np.linspace(np.log10(hd_ctaus[0]), - np.log10(hd_ctaus[-1]), 200) - hd_fine_mass = np.linspace(hd_masses[0], hd_masses[-1], 200) - sp_hd = RectBivariateSpline(np.log10(hd_ctaus), hd_masses, - np.log10(hd_obs + 1e-9), kx=1, ky=1) - hd_fine_obs = 10.0 ** sp_hd(hd_fine_lct, hd_fine_mass) - ax.contour(10.0 ** hd_fine_lct, hd_fine_mass, hd_fine_obs.T, - levels=[1.0], colors=["gray"], - linewidths=[2.0], linestyles=["dotted"]) - ax.plot([], [], color="gray", lw=2.0, ls="dotted", - label="CMS-EXO-19-013 obs.") - - # y-axis: for SUSY+HepData extend to 2500 GeV so the old exclusion line - # is visible; otherwise auto-scale. y_pad = max(3.0, (mass_vals[-1] - mass_vals[0]) * 0.08) - if proc in HEPDATA_PROCS and proc in hepdata: - y_top = max(mass_vals[-1] + y_pad, 2500.) - else: - y_top = mass_vals[-1] + y_pad - ax.set_ylim(mass_vals[0] - y_pad, y_top) - + ax.set_ylim(mass_vals[0] - y_pad, mass_vals[-1] + y_pad) ax.set_xscale("log") - # x-axis: extend left to show exclusion closure, right with small padding ax.set_xlim(10.0 ** log_ctau_lo, 10.0 ** (log_ctaus[-1] + 0.25)) ax.set_xlabel(r"$c\tau$ [mm]") ax.set_ylabel("Mass [GeV]") ax.legend(fontsize=11, loc="upper right", framealpha=0.92, edgecolor="0.7") ax.grid(True, which="both", ls=":", alpha=0.3) + _cms_label(ax) + _annotate_proc(ax, proc) + _save(fig, os.path.join(out_dir, "%s_2D.pdf" % proc)) - if _HAS_MPLHEP: - hep.cms.label("Preliminary", data=False, ax=ax, fontsize=12, - rlabel=_RUN2_LUMI) - _proc_label = PROC_LABELS.get(proc, proc) - _norm = _PROC_NORM_NOTES.get(proc, "") - _annot = _proc_label + ("\n" + _norm if _norm else "") - ax.text(0.0, -0.13, _annot, - transform=ax.transAxes, fontsize=10, ha="left", va="top", - clip_on=False) - plt.tight_layout() - out_fn = os.path.join(out_dir, "%s_2D.pdf" % proc) - fig.savefig(out_fn, bbox_inches="tight") - plt.close(fig) - print(" 2D -> %s" % out_fn) +# --------------------------------------------------------------------------- +# Entry point +# --------------------------------------------------------------------------- def main(): global COMBINE_OUT @@ -401,7 +801,7 @@ def main(): if hepdata: print("Loaded HepData reference for: %s" % ", ".join(sorted(hepdata))) else: - print("No HepData reference found at %s (skipping overlay)" % HEPDATA_JSON) + print("No HepData reference found at %s (comparison plots skipped)" % HEPDATA_JSON) data = collect_all() if not data: @@ -419,7 +819,12 @@ def main(): n_masses = len(data[proc]) n_pts = sum(len(v) for v in data[proc].values()) print("\n%s: %d masses, %d total hypotheses" % (proc, n_masses, n_pts)) + plot_1d(proc, data[proc], args.out_dir, hepdata) + plot_1d_vs_mass_all(proc, data[proc], args.out_dir) + plot_1d_vs_mass_pairs(proc, data[proc], args.out_dir, hepdata) + if proc in ("ggHToSSTodddd", "VH"): + plot_1d_vs_mass_ctau_pair(proc, data[proc], args.out_dir, 1.0, 10.0) plot_2d(proc, data[proc], args.out_dir, hepdata) print("\nDone. Plots saved to %s" % args.out_dir) From 54889d5ff10e36892c734fb81cf8bfd05a2412f0 Mon Sep 17 00:00:00 2001 From: Gianfranco de Castro Date: Tue, 19 May 2026 12:51:42 -0500 Subject: [PATCH 08/15] Updated plotting --- MFVNeutralino/test/ForLimits/plotLimits.py | 195 +++---- .../test/One2Two/higgsino_C1C1N1N2.csv | 231 ++++++++ MFVNeutralino/test/One2Two/higgsino_N2N1.csv | 518 ++---------------- 3 files changed, 367 insertions(+), 577 deletions(-) create mode 100644 MFVNeutralino/test/One2Two/higgsino_C1C1N1N2.csv diff --git a/MFVNeutralino/test/ForLimits/plotLimits.py b/MFVNeutralino/test/ForLimits/plotLimits.py index 6587aaf2f..a5dbd6505 100644 --- a/MFVNeutralino/test/ForLimits/plotLimits.py +++ b/MFVNeutralino/test/ForLimits/plotLimits.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 """ -Plot 95% CL upper limits on sigma x B^2 [fb]. +Plot 95% CL upper limits on sigma x B^2 [fb] (SUSY) or BR(H->SS) (Higgs). Reads CombineOutput//higgsCombine.AsymptoticLimits.mH120.root for all available hypotheses and produces per-process plots. @@ -66,6 +66,15 @@ "mfv_stopbbarbbar": os.path.join(_ONE2TWO, "stopstop.csv"), } +# Additional theory curves drawn on top of the primary one (keyed by process). +# For mfv_neu: EWK Higgsino N2N1 (Ñ₂χ̃₁⁰, aNNLO-NNLL, fully degenerate, 13 TeV). +# Only N2N1 is relevant: both final-state particles are neutral, matching the +# neutral LLP produced in the gluino signal MC. C1C1/N2C1 involve charginos +# which are themselves long-lived in the degenerate limit (different topology). +_EXTRA_THEORY_CSV = { + "mfv_neu": os.path.join(_ONE2TWO, "higgsino_N2N1.csv"), +} + PROC_LABELS = { "VH": r"WH + ZH (incl. gg), H$\to$SS$\to$dddd", @@ -85,38 +94,32 @@ # For SUSY: pivot near the expected exclusion boundary (~1-100 fb for M~1-2 TeV). # Falls back to automatic geometric-mean computation for unspecified processes. _2D_VSCALE = { - "mfv_neu": (0.1, 10.0, 1e5), - "mfv_stopdbardbar": (0.1, 10.0, 1e5), - "mfv_stopbbarbbar": (0.1, 10.0, 1e5), + "mfv_neu": (0.1, 10.0, 1e5), + "mfv_stopdbardbar": (0.1, 10.0, 1e5), + "mfv_stopbbarbbar": (0.1, 10.0, 1e5), + # Higgs: pivot at SM benchmark BR=1%; range covers 0.1%-100% (well beyond any limit) + "VH": (1e-3, 0.01, 1.0), + "ggZHToSSTobbbb": (1e-3, 0.01, 1.0), + "ggHToSSTodddd": (1e-3, 0.01, 1.0), + "ttHToLLPs_bbbb": (1e-3, 0.01, 1.0), + "ttHToLLPs_dddd": (1e-3, 0.01, 1.0), } -# H→SS reference cross sections: σ_SM_H [pb] × BR(H→SS=1%) × filter_eff × 1000 → fb -# From Samples.py _set_signal_stuff (13 TeV, mH=125 GeV, CERN YR4). -# VH combines WplusH + WminusH + qqZH + ggZH (all filter_eff=1 in Samples.py). +# BR(H→SS) benchmark used as datacard normalization and as reference line on plots. _BR_HSS = 0.01 -_HIGGS_SIGMA_REF_FB = { - "VH": (3*9.426e-02 + 3*5.983e-02 + 3*2.568e-02 + 3*4.14e-03) * _BR_HSS * 1000, - "ggZHToSSTobbbb": 3 * 4.14e-03 * _BR_HSS * 1000, - "ttHToLLPs_bbbb": 0.5071 * _BR_HSS * 1000, - "ttHToLLPs_dddd": 0.5071 * _BR_HSS * 1000, -} -# ggH has a mass-dependent generator-level filter efficiency (constant across ctau). -_GGHSS_FILTER_EFF = {"15": 0.106, "40": 0.085, "55": 0.082} -_GGHSS_BASE_SIGMA_FB = 48.58 * _BR_HSS * 1000 # 485.8 fb before filter_eff def _sig_scale_fb(proc, mass=None): - """σ_ref [fb] used in the Combine datacard for this (proc, mass) hypothesis. + """Scale factor to convert Combine r to physical units. - For SUSY σ_ref = 1 fb, so r already equals σ×B² [fb]. - For H→SS σ_ref = σ_SM_H × BR(H→SS=1%) × filter_eff, so multiply r by this - to obtain σ×B² [fb]. + SUSY: σ_ref = 1 fb → r = σ×B² [fb] → return 1.0. + H→SS: σ_ref = σ_SM_H × BR(H→SS=1%) [× filter_eff, which cancels]. + r = σ(H)×BR(H→SS) / (σ_SM × 0.01), so BR(H→SS) = r × 0.01. + σ_SM cancels regardless of production mode → return _BR_HSS for all Higgs. """ if proc in _SUSY_PROCS: return 1.0 - if proc == "ggHToSSTodddd": - return _GGHSS_BASE_SIGMA_FB # filter_eff cancels: σ×BR = r × σ_SM × 0.01 - return _HIGGS_SIGMA_REF_FB.get(proc, 1.0) + return _BR_HSS _COLORS = ["#e41a1c", "#377eb8", "#4daf4a", "#984ea3", "#ff7f00", "#a65628"] @@ -124,16 +127,7 @@ def _sig_scale_fb(proc, mass=None): _RUN2_LUMI = r"137.9 fb$^{-1}$ (13 TeV)" # Per-process normalization footnote shown in the plot annotation box. -# H->SS processes: BR(H->SS)=1% is folded into xsec. -# ggH additionally has a mass-dependent gen-level filter efficiency in xsec. -_NORM_NOTE = r"$\sigma \times \mathcal{B}(H{\to}SS)=1\%$" -_PROC_NORM_NOTES = { - "VH": _NORM_NOTE, - "ggZHToSSTobbbb": _NORM_NOTE, - "ggHToSSTodddd": _NORM_NOTE, - "ttHToLLPs_bbbb": _NORM_NOTE, - "ttHToLLPs_dddd": _NORM_NOTE, -} +_PROC_NORM_NOTES = {} # --------------------------------------------------------------------------- @@ -330,48 +324,37 @@ def _hepdata_slice_at_ctau(hd, ctau_mm): def _draw_ref_curve_vsmass(ax, proc): - """Draw σ_ref curve vs mass (theory for SUSY, SM benchmark for H→SS). Returns True if drawn.""" + """Draw theory/benchmark reference curves vs mass. Returns True if anything drawn.""" if proc in _SUSY_PROCS: csv_path = _HEPDATA_THEORY_CSV.get(proc) if not csv_path or not os.path.exists(csv_path): return False masses_csv, xsec_fb_csv = _load_theory_xsec_csv(csv_path) + label = r"$\tilde{g}\tilde{g}$ NLO+NNLL" if proc == "mfv_neu" else r"Theory $\sigma\mathcal{B}^{2}$" ax.plot(masses_csv, xsec_fb_csv, color="black", lw=1.5, ls="--", - label=r"Theory $\sigma\mathcal{B}^{2}$", zorder=3) - return True - if proc == "ggHToSSTodddd": - ax.axhline(_GGHSS_BASE_SIGMA_FB, color="black", lw=1.5, ls="--", - label=r"SM $\sigma\mathcal{B}(H{\to}SS{=}1\%)$", zorder=3) + label=label, zorder=3) + extra_path = _EXTRA_THEORY_CSV.get(proc) + if extra_path and os.path.exists(extra_path): + em, exs = _load_theory_xsec_csv(extra_path) + ax.plot(em, exs, color="dimgray", lw=1.5, ls=":", + label=r"$\tilde{\chi}^{0}_{1}\tilde{\chi}^{0}_{2}$ aNNLO-NNLL", zorder=3) return True - scale = _HIGGS_SIGMA_REF_FB.get(proc) - if scale is not None: - ax.axhline(scale, color="black", lw=1.5, ls="--", - label=r"SM $\sigma\mathcal{B}(H{\to}SS{=}1\%)$", zorder=3) + # Higgs: reference line at BR benchmark + if proc not in _SUSY_PROCS: + ax.axhline(_BR_HSS, color="black", lw=1.5, ls="--", + label=r"$\mathcal{B}(H{\to}SS) = 1\%$", zorder=3) return True return False def _draw_ref_lines_ctau(ax, proc, masses_sorted, color_list): - """Draw σ_ref horizontal lines per mass (theory XS for SUSY, SM benchmark for H→SS).""" + """Draw theory/benchmark reference lines on ctau plots. Returns True if anything drawn.""" if proc in _SUSY_PROCS: - csv_path = _HEPDATA_THEORY_CSV.get(proc) - if not csv_path or not os.path.exists(csv_path): - return False - masses_csv, xsec_fb_csv = _load_theory_xsec_csv(csv_path) - for i, mass in enumerate(masses_sorted): - xs = _interp_theory_xsec_fb(int(mass), masses_csv, xsec_fb_csv) - ax.axhline(xs, color=color_list[i % len(color_list)], lw=1.0, ls=":", alpha=0.6, zorder=2) - return True - if proc == "ggHToSSTodddd": - ax.axhline(_GGHSS_BASE_SIGMA_FB, color="black", lw=1.5, ls="--", - label=r"SM $\sigma\mathcal{B}(H{\to}SS{=}1\%)$", zorder=3) - return True - scale = _HIGGS_SIGMA_REF_FB.get(proc) - if scale is not None: - ax.axhline(scale, color="black", lw=1.5, ls="--", - label=r"SM $\sigma\mathcal{B}(H{\to}SS{=}1\%)$", zorder=3) - return True - return False + return False # theory curve shown on vsmass plots; per-mass lines clutter ctau plots + # Higgs: single benchmark line at BR = 1% + ax.axhline(_BR_HSS, color="black", lw=1.5, ls="--", + label=r"$\mathcal{B}(H{\to}SS) = 1\%$", zorder=3) + return True def _annotate_proc(ax, proc): @@ -383,10 +366,15 @@ def _annotate_proc(ax, proc): def _ylabel(proc): - """Y-axis label: σ×B² [fb] for SUSY (both sparticles decay); σ×BR(H→SS) [fb] for H→SS.""" if proc in _SUSY_PROCS: return r"95% CL upper limit on $\sigma\mathcal{B}^{2}$ [fb]" - return r"95% CL upper limit on $\sigma\mathcal{B}(H{\to}SS)$ [fb]" + return r"95% CL upper limit on $\mathcal{B}(H{\to}SS)$" + + +def _mass_xlabel(proc): + if proc == "mfv_neu": + return r"Neutralino mass [GeV]" + return "Mass [GeV]" def _cms_label(ax): @@ -434,7 +422,7 @@ def plot_1d(proc, mass_data, out_dir, hepdata): label="m = %s GeV (obs)" % mass) if not _draw_ref_lines_ctau(ax, proc, masses, _COLORS): - ax.axhline(1.0, color="black", lw=1.2, ls=":", zorder=3) + pass ax.set_xscale("log") ax.set_yscale("log") ax.set_xlabel(r"$c\tau$ [mm]") @@ -482,9 +470,9 @@ def plot_1d_vs_mass_all(proc, mass_data, out_dir): label=r"$c\tau$ = %s (obs)" % lbl) if not _draw_ref_curve_vsmass(ax, proc): - ax.axhline(1.0, color="black", lw=1.2, ls=":", zorder=3) + pass ax.set_yscale("log") - ax.set_xlabel("Mass [GeV]") + ax.set_xlabel(_mass_xlabel(proc)) ax.set_ylabel(_ylabel(proc)) ax.legend(fontsize=9, ncol=2) ax.grid(True, which="both", ls=":", alpha=0.4) @@ -551,9 +539,9 @@ def plot_1d_vs_mass_pairs(proc, mass_data, out_dir, hepdata=None): if hd: _draw_hepdata_pair(ax, hd, c1, c2) if not _draw_ref_curve_vsmass(ax, proc): - ax.axhline(1.0, color="black", lw=1.2, ls=":", zorder=3) + pass ax.set_yscale("log") - ax.set_xlabel("Mass [GeV]") + ax.set_xlabel(_mass_xlabel(proc)) ax.set_ylabel(_ylabel(proc)) ax.legend(fontsize=9) ax.grid(True, which="both", ls=":", alpha=0.4) @@ -585,9 +573,9 @@ def _nearest(target): if hd: _draw_hepdata_pair(ax, hd, c1, c2) if not _draw_ref_curve_vsmass(ax, proc): - ax.axhline(1.0, color="black", lw=1.2, ls=":", zorder=3) + pass ax.set_yscale("log") - ax.set_xlabel("Mass [GeV]") + ax.set_xlabel(_mass_xlabel(proc)) ax.set_ylabel(_ylabel(proc)) ax.legend(fontsize=9) ax.grid(True, which="both", ls=":", alpha=0.4) @@ -601,16 +589,17 @@ def _nearest(target): # 2D: ctau vs mass color map + r=1 contour (no HepData overlay) # --------------------------------------------------------------------------- -def _excl_thresholds_2d(proc, masses, mass_vals): +def _excl_thresholds_2d(proc, masses, mass_vals, theory_csv=None): """Return σ×B² [fb] exclusion threshold per mass column for the 2D contour. For SUSY: threshold = σ_theory_NLO(mass) from CSV. The r=1 Combine contour marks σ×B²=1 fb (arbitrary σ_ref), NOT the theory exclusion boundary. For H→SS: threshold = σ_ref_fb(proc, mass) = σ_SM × BR(1%) × filter_eff, so r=1 Combine contour IS the SM exclusion boundary — no correction needed. + theory_csv overrides the default CSV for SUSY (used for EWK variant plots). """ if proc in _SUSY_PROCS: - csv_path = _HEPDATA_THEORY_CSV.get(proc) + csv_path = theory_csv if theory_csv is not None else _HEPDATA_THEORY_CSV.get(proc) if csv_path and os.path.exists(csv_path): masses_csv, xsec_fb_csv = _load_theory_xsec_csv(csv_path) return np.array([_interp_theory_xsec_fb(m, masses_csv, xsec_fb_csv) @@ -631,19 +620,19 @@ def _interp_grid(log_ctaus, mass_vals, grid, fine_lct, fine_mass): return 10.0 ** sp(fine_lct, fine_mass) -def plot_2d(proc, mass_data, out_dir, hepdata): +def plot_2d(proc, mass_data, out_dir, hepdata, theory_csv=None, fname_suffix=""): masses = _sorted_masses(mass_data) - # Build a clean rectangular grid: - # - Drop masses with very few ctau points (e.g. M3000 with only 2 after wall-time failures). - # - Allow masses missing at most 1 ctau relative to the best-covered mass, so that - # partially-complete high-mass points (M1200, M1600) are kept and the exclusion - # contour remains visible. The intersection then eliminates any residual holes. + # Build a rectangular grid (NaN for missing cells, capped in _interp_grid). + # SUSY: drop masses with >1 missing ctau (e.g. M3000 hit wall time, only 2 jobs done). + # Higgs: only 3 mass points total so keep any mass with >=2 valid ctau. + # Use the union of all ctau values so no mass is excluded for lacking a corner point; + # missing (ctau, mass) cells are left as NaN and capped to "not excluded" during interpolation. ctau_counts = {m: len(mass_data[m]) for m in masses} max_n = max(ctau_counts.values()) - min_n = max(3, max_n - 1) + min_n = max(3, max_n - 1) if proc in _SUSY_PROCS else 2 masses = [m for m in masses if ctau_counts[m] >= min_n] - ctaus_all = sorted(set.intersection(*[set(mass_data[m].keys()) for m in masses])) + ctaus_all = sorted(set.union(*[set(mass_data[m].keys()) for m in masses])) if len(masses) < 2 or len(ctaus_all) < 2: print(" Skipping 2D for %s: need at least 2x2 grid" % proc) @@ -686,7 +675,7 @@ def plot_2d(proc, mass_data, out_dir, hepdata): # Exclusion threshold per mass: σ×B² [fb] value at which r=1 boundary is physical. # For SUSY this is σ_theory_NLO(mass); for H→SS it equals σ_ref_fb (= scales). - thresholds = _excl_thresholds_2d(proc, masses, mass_vals) + thresholds = _excl_thresholds_2d(proc, masses, mass_vals, theory_csv=theory_csv) thresh_fine = np.interp(fine_mass, mass_vals, thresholds) # Ratio grids: σ×B²_limit / threshold. Contour at 1.0 = genuine exclusion boundary. @@ -695,35 +684,42 @@ def plot_2d(proc, mass_data, out_dir, hepdata): fine_ratio_exp = _interp_grid(log_ctaus, mass_vals, ratio_exp, fine_lct, fine_mass) fine_ratio_obs = _interp_grid(log_ctaus, mass_vals, ratio_obs, fine_lct, fine_mass) - # Colormap scale: use hardcoded (vmin, vref, vmax) if available, else auto from thresholds. - if proc in _2D_VSCALE: - vmin, vref, vmax = _2D_VSCALE[proc] + # Colormap: SUSY uses ratio = σ×B²_limit / σ_theory (pivot=1 = exclusion boundary). + # Higgs uses absolute BR limit (pivot at benchmark BR=1%). + if proc in _SUSY_PROCS: + cmap_data_exp = fine_ratio_exp + cmap_data_obs = fine_ratio_obs + vmin, vref, vmax = 0.01, 1.0, 100.0 + cbar_label = r"$\sigma\mathcal{B}^{2}\ /\ \sigma_\mathrm{theory}$" else: - vref = float(np.exp(np.mean(np.log(thresholds[thresholds > 0])))) - vmin = vref * 0.05 - vmax = vref * 200.0 + cmap_data_exp = fine_exp_s + cmap_data_obs = fine_obs_s + vmin, vref, vmax = _2D_VSCALE.get(proc, (None, None, None)) + if vref is None: + vref = float(np.exp(np.mean(np.log(thresholds[thresholds > 0])))) + vmin, vmax = vref * 0.05, vref * 200.0 + cbar_label = _ylabel(proc) fig, ax = plt.subplots(figsize=(9, 6)) - # Diverging log-scale colormap centred at the exclusion threshold. n_half = 30 levels = np.concatenate([ np.logspace(np.log10(vmin), np.log10(vref), n_half + 1)[:-1], np.logspace(np.log10(vref), np.log10(vmax), n_half + 1), ]) norm = mcolors.LogNorm(vmin=vmin, vmax=vmax) - cmap = plt.get_cmap("RdBu_r") # blue=excluded, red=not excluded + cmap = plt.get_cmap("RdBu_r") # blue=excluded (ratio<1), red=not excluded _all_nice = [0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 50000, 100000] _nice_ticks = [t for t in _all_nice if vmin <= t <= vmax] - if fine_exp_s is not None: - cf = ax.contourf(fine_ctau, fine_mass, fine_exp_s.T, + if cmap_data_exp is not None: + cf = ax.contourf(fine_ctau, fine_mass, cmap_data_exp.T, levels=levels, norm=norm, cmap=cmap, extend="both") cbar = plt.colorbar(cf, ax=ax, pad=0.02) - cbar.set_label(_ylabel(proc)) + cbar.set_label(cbar_label) cbar.set_ticks(_nice_ticks) cbar.set_ticklabels(["%g" % t for t in _nice_ticks]) cbar.ax.axhline(y=vref, color="black", lw=1.0, ls="--") @@ -738,19 +734,20 @@ def plot_2d(proc, mass_data, out_dir, hepdata): colors=["black"], linewidths=[2.5], linestyles=["solid"]) ax.plot([], [], color="black", lw=2.5, ls="-", label="Obs. excl.") else: + grid_cmap = ratio_exp if proc in _SUSY_PROCS else grid_exp_s xs, ys, cs = [], [], [] for j, mass in enumerate(masses): for i, ctau in enumerate(ctau_vals): - if not np.isnan(grid_exp_s[i, j]): + if not np.isnan(grid_cmap[i, j]): xs.append(ctau) ys.append(mass_vals[j]) - cs.append(np.clip(grid_exp_s[i, j], vmin, vmax)) + cs.append(np.clip(grid_cmap[i, j], vmin, vmax)) if xs: sc = ax.scatter(xs, ys, c=cs, s=300, zorder=5, norm=norm, cmap=cmap, edgecolors="black", linewidths=0.5) cbar = plt.colorbar(sc, ax=ax, pad=0.02) - cbar.set_label(_ylabel(proc)) + cbar.set_label(cbar_label) cbar.set_ticks(_nice_ticks) cbar.set_ticklabels(["%g" % t for t in _nice_ticks]) cbar.ax.axhline(y=vref, color="black", lw=1.0, ls="--") @@ -769,7 +766,7 @@ def plot_2d(proc, mass_data, out_dir, hepdata): ax.grid(True, which="both", ls=":", alpha=0.3) _cms_label(ax) _annotate_proc(ax, proc) - _save(fig, os.path.join(out_dir, "%s_2D.pdf" % proc)) + _save(fig, os.path.join(out_dir, "%s_2D%s.pdf" % (proc, fname_suffix))) @@ -826,6 +823,10 @@ def main(): if proc in ("ggHToSSTodddd", "VH"): plot_1d_vs_mass_ctau_pair(proc, data[proc], args.out_dir, 1.0, 10.0) plot_2d(proc, data[proc], args.out_dir, hepdata) + if proc == "mfv_neu" and "mfv_neu" in _EXTRA_THEORY_CSV: + plot_2d(proc, data[proc], args.out_dir, hepdata, + theory_csv=_EXTRA_THEORY_CSV["mfv_neu"], + fname_suffix="_ewk") print("\nDone. Plots saved to %s" % args.out_dir) diff --git a/MFVNeutralino/test/One2Two/higgsino_C1C1N1N2.csv b/MFVNeutralino/test/One2Two/higgsino_C1C1N1N2.csv new file mode 100644 index 000000000..a40553b14 --- /dev/null +++ b/MFVNeutralino/test/One2Two/higgsino_C1C1N1N2.csv @@ -0,0 +1,231 @@ +100,6.16068,3.6816 +105,5.24852,3.7278 +110,4.48704,3.7762 +115,3.84797,3.8263 +120,3.30921,3.878 +125,2.85328,3.9311 +130,2.46516,3.9856 +135,2.13478,4.0413 +140,1.8528,4.0981 +145,1.61156,4.156 +150,1.40473,4.215 +155,1.25615,4.2838 +160,1.1252,4.35 +165,1.0095,4.4135 +170,0.907021,4.4744 +175,0.81608,4.5328 +180,0.734678,4.5889 +185,0.662239,4.6429 +190,0.597675,4.6948 +195,0.540045,4.7448 +200,0.488534,4.7925 +205,0.445524,4.8404 +210,0.40715,4.8869 +215,0.372824,4.934 +220,0.342043,4.9814 +225,0.314376,5.0288 +230,0.289222,5.076 +235,0.266528,5.1231 +240,0.24601,5.1701 +245,0.227422,5.217 +250,0.210554,5.2617 +255,0.195086,5.3105 +260,0.181005,5.3572 +265,0.168164,5.4037 +270,0.156434,5.4502 +275,0.145701,5.4967 +280,0.135783,5.543 +285,0.126687,5.5893 +290,0.118332,5.6355 +295,0.110647,5.6817 +300,0.103568,5.7276 +305,0.0969759,5.7625 +310,0.0908916,5.7977 +315,0.0852694,5.833 +320,0.0800682,5.8681 +325,0.0752509,5.9032 +330,0.0707431,5.9382 +335,0.0665614,5.9731 +340,0.0626779,6.008 +345,0.059068,6.0428 +350,0.0557085,6.0777 +355,0.0525559,6.1122 +360,0.0496178,6.1468 +365,0.0468774,6.1814 +370,0.0443191,6.2159 +375,0.0419288,6.2503 +380,0.0396752,6.2847 +385,0.037567,6.319 +390,0.0355931,6.3533 +395,0.0337438,6.3876 +400,0.0320096,6.4208 +405,0.0303704,6.4614 +410,0.0288286,6.4908 +415,0.0273817,6.52 +420,0.0260198,6.5491 +425,0.02474,6.578 +430,0.0235227,6.6069 +435,0.022378,6.6355 +440,0.0212982,6.6641 +445,0.0202814,6.6924 +450,0.0193233,6.7454 +455,0.0184109,6.7489 +460,0.0175505,6.777 +465,0.0167385,6.8048 +470,0.0159703,6.8327 +475,0.0152446,6.8603 +480,0.0145502,6.888 +485,0.0138938,6.9154 +490,0.0132718,6.9428 +495,0.0126833,6.97 +500,0.0121238,6.9991 +505,0.0115915,7.0243 +510,0.0110852,7.0513 +515,0.0106054,7.0781 +520,0.0101496,7.105 +525,0.00971723,7.1317 +530,0.00930322,7.1584 +535,0.0089103,7.1849 +540,0.00853651,7.2114 +545,0.00818144,7.2377 +550,0.00784332,7.2283 +555,0.0075204,7.2903 +560,0.00721271,7.3164 +565,0.00692004,7.3425 +570,0.00664101,7.3685 +575,0.00637538,7.3944 +580,0.00612042,7.4202 +585,0.00587761,7.4459 +590,0.00564583,7.4717 +595,0.00542492,7.4973 +600,0.00521403,7.5429 +605,0.00501002,7.5734 +610,0.00481483,7.5867 +615,0.00462863,7.6008 +620,0.00445063,7.6157 +625,0.00428072,7.6314 +630,0.00411787,7.6479 +635,0.00396231,7.6651 +640,0.00381345,7.6831 +645,0.00367117,7.7019 +650,0.0035354,7.7569 +655,0.00340473,7.7415 +660,0.00327997,7.7624 +665,0.00316059,7.7839 +670,0.00304614,7.8062 +675,0.00293657,7.8291 +680,0.00282874,7.8527 +685,0.00272554,7.8769 +690,0.00262661,7.9018 +695,0.00253187,7.9272 +700,0.00244094,7.9639 +705,0.00235393,7.9801 +710,0.00227037,8.0074 +715,0.00219028,8.0353 +720,0.00211337,8.0639 +725,0.00203963,8.0929 +730,0.00196976,8.1226 +735,0.0019027,8.1528 +740,0.00183821,8.1836 +745,0.00177628,8.2148 +750,0.00171649,8.1879 +755,0.00165669,8.279 +760,0.00159904,8.3119 +765,0.00154371,8.3453 +770,0.00149053,8.3792 +775,0.00143948,8.4135 +780,0.00139148,8.4484 +785,0.00134535,8.4837 +790,0.00130093,8.5196 +795,0.00125822,8.5559 +800,0.00121718,8.6253 +805,0.00117321,8.5404 +810,0.00113578,8.5652 +815,0.00109967,8.5899 +820,0.0010648,8.6146 +825,0.00103116,8.6394 +830,0.000997862,8.6643 +835,0.000965757,8.6891 +840,0.00093476,8.7139 +845,0.000904866,8.7386 +850,0.000873386,8.5742 +855,0.000848597,8.7881 +860,0.000822114,8.8128 +865,0.000796545,8.8375 +870,0.000771826,8.8622 +875,0.000747955,8.8868 +880,0.000724056,8.9115 +885,0.000701,8.936 +890,0.000678729,8.9606 +895,0.000657236,8.9852 +900,0.000634464,9.1244 +905,0.000617084,9.0343 +910,0.000598328,9.0588 +915,0.000580199,9.0833 +920,0.000562655,9.1078 +925,0.000545696,9.1323 +930,0.000528719,9.1568 +935,0.000512321,9.1812 +940,0.000496465,9.2056 +945,0.000481147,9.23 +950,0.00046526,9.1954 +955,0.000451689,9.2787 +960,0.000437535,9.3031 +965,0.000423866,9.3274 +970,0.000410651,9.3518 +975,0.000397887,9.3762 +980,0.000386642,9.4007 +985,0.00037575,9.4251 +990,0.000365184,9.4496 +995,0.000354949,9.474 +1000,0.000346585,9.5428 +1005,0.00033554,9.4921 +1010,0.000325759,9.5133 +1015,0.000316293,9.5344 +1020,0.00030712,9.5555 +1025,0.00029824,9.5765 +1030,0.000289931,9.5976 +1035,0.000281877,9.6186 +1040,0.000274061,9.6396 +1045,0.000266485,9.6606 +1050,0.000258619,9.676 +1055,0.000251319,9.7025 +1060,0.000243758,9.7235 +1065,0.000236447,9.7444 +1070,0.00022937,9.7653 +1075,0.000222525,9.7862 +1080,0.000215129,9.8071 +1085,0.000208006,9.828 +1090,0.000201137,9.8488 +1095,0.000194519,9.8696 +1100,0.000187731,9.6414 +1105,0.000183426,9.9113 +1110,0.000178843,9.9321 +1115,0.000174387,9.9528 +1120,0.00017005,9.9736 +1125,0.000165834,9.9943 +1130,0.000161451,10.015 +1135,0.000157196,10.036 +1140,0.00015306,10.056 +1145,0.000149043,10.077 +1150,0.000144981,10.359 +1155,0.000140962,10.118 +1160,0.000136912,10.139 +1165,0.000132989,10.16 +1170,0.000129185,10.18 +1175,0.000125499,10.201 +1180,0.000121695,10.222 +1185,0.000118017,10.242 +1190,0.000114456,10.263 +1195,0.000111012,10.283 +1200,0.000107956,10.25 +1205,0.00010519,10.322 +1210,0.000102708,10.343 +1215,0.000100291,10.365 +1220,9.79561e-05,10.385 +1225,9.56477e-05,10.407 +1230,9.22585e-05,10.427 +1235,8.8991e-05,10.448 +1240,8.58387e-05,10.469 +1245,8.28435e-05,10.49 +1250,7.98307e-05,10.474 diff --git a/MFVNeutralino/test/One2Two/higgsino_N2N1.csv b/MFVNeutralino/test/One2Two/higgsino_N2N1.csv index 918b622e7..28629bd4f 100644 --- a/MFVNeutralino/test/One2Two/higgsino_N2N1.csv +++ b/MFVNeutralino/test/One2Two/higgsino_N2N1.csv @@ -1,480 +1,38 @@ -100,3.27701,3.68159 -105,2.81976,3.72783 -110,2.42502,3.7762 -115,2.08452,3.82631 -120,1.79103,3.878 -125,1.53824,3.93113 -130,1.32062,3.9856 -135,1.1334,4.04129 -140,0.972404,4.09812 -145,0.834027,4.15599 -150,0.71514,4.21496 -155,0.642974,4.28381 -160,0.577932,4.35002 -165,0.519335,4.41348 -170,0.466564,4.47435 -175,0.419059,4.53279 -180,0.376309,4.58893 -185,0.33785,4.6429 -190,0.303263,4.69482 -195,0.272166,4.7448 -200,0.244213,4.7925 -205,0.222513,4.8404 -210,0.203142,4.88688 -215,0.185809,4.93399 -220,0.170262,4.98143 -225,0.156286,5.02876 -230,0.143693,5.07597 -235,0.132324,5.12308 -240,0.122038,5.17008 -245,0.112715,5.21699 -250,0.104252,5.26169 -255,0.0965489,5.31054 -260,0.0895317,5.35719 -265,0.0831271,5.40375 -270,0.0772725,5.45024 -275,0.0719125,5.49666 -280,0.0669982,5.54301 -285,0.0624863,5.5893 -290,0.0583381,5.63551 -295,0.0545194,5.68167 -300,0.0509994,5.72762 -305,0.0477402,5.76247 -310,0.0447286,5.79775 -315,0.0419428,5.83296 -320,0.039363,5.8681 -325,0.0369715,5.90317 -330,0.0347522,5.93817 -335,0.0326908,5.9731 -340,0.0307741,6.00797 -345,0.0289904,6.04277 -350,0.0273286,6.07766 -355,0.0257798,6.11218 -360,0.0243344,6.1468 -365,0.0229845,6.18136 -370,0.0217229,6.21587 -375,0.0205429,6.25031 -380,0.0194383,6.28471 -385,0.0184035,6.31904 -390,0.0174334,6.35333 -395,0.0165234,6.38757 -400,0.0156691,6.42085 -405,0.0148666,6.46141 -410,0.0141091,6.49084 -415,0.0133981,6.52 -420,0.0127271,6.54914 -425,0.0120965,6.57801 -430,0.0115007,6.60687 -435,0.0109402,6.63548 -440,0.0104101,6.66407 -445,0.00991074,6.69242 -450,0.00944017,6.74544 -455,0.00899229,6.74886 -460,0.00856991,6.77695 -465,0.00817124,6.80482 -470,0.00779311,6.83268 -475,0.00743587,6.86033 -480,0.00709673,6.88797 -485,0.00677602,6.91539 -490,0.00647132,6.94282 -495,0.00618292,6.97004 -500,0.00590757,6.99909 -505,0.0056489,7.02428 -510,0.00540169,7.05131 -515,0.00516732,7.07814 -520,0.00494412,7.10498 -525,0.00473235,7.13166 -530,0.00453053,7.15835 -535,0.00433889,7.18486 -540,0.00415614,7.21138 -545,0.00398248,7.23772 -550,0.0038167,7.22834 -555,0.00365918,7.29025 -560,0.00350871,7.31644 -565,0.00336553,7.34245 -570,0.00322873,7.36849 -575,0.00309847,7.39435 -580,0.00297393,7.42023 -585,0.00285529,7.44595 -590,0.00274179,7.47168 -595,0.00263359,7.49726 -600,0.00253015,7.54291 -605,0.00243169,7.57341 -610,0.00233709,7.58671 -615,0.00224677,7.60081 -620,0.00216022,7.61573 -625,0.00207755,7.63142 -630,0.00199829,7.64791 -635,0.00192253,7.66513 -640,0.00184987,7.68314 -645,0.00178039,7.70185 -650,0.00171418,7.75695 -655,0.00164993,7.74147 -660,0.0015887,7.76236 -665,0.00153009,7.78391 -670,0.0014738,7.80617 -675,0.0014199,7.82907 -680,0.00136812,7.85267 -685,0.00131851,7.87687 -690,0.00127083,7.90176 -695,0.00122513,7.92723 -700,0.00118113,7.96388 -705,0.00113906,7.98008 -710,0.00109854,8.00743 -715,0.00105967,8.03533 -720,0.00102227,8.06386 -725,0.00098639,8.09291 -730,0.000951846,8.12259 -735,0.000918692,8.15276 -740,0.000886764,8.18355 -745,0.00085611,8.21481 -750,0.000826366,8.1879 -755,0.000798217,8.27899 -760,0.000770886,8.3119 -765,0.000744626,8.34525 -770,0.000719314,8.37917 -775,0.000694985,8.41352 -780,0.000671527,8.44843 -785,0.000648974,8.48374 -790,0.000627221,8.51961 -795,0.0006063,8.55587 -800,0.000586211,8.62527 -805,0.000562918,8.54043 -810,0.00054536,8.56518 -815,0.000528365,8.58986 -820,0.000511875,8.61463 -825,0.000495914,8.63944 -830,0.000480428,8.6643 -835,0.00046544,8.68907 -840,0.000450897,8.71388 -845,0.000436822,8.73861 -850,0.000420556,8.5742 -855,0.000409951,8.78808 -860,0.000397128,8.81282 -865,0.000384719,8.83747 -870,0.00037268,8.86217 -875,0.000361029,8.88678 -880,0.000349725,8.91145 -885,0.000338786,8.93603 -890,0.000328174,8.96065 -895,0.000317904,8.98519 -900,0.000305935,9.12439 -905,0.0002983,9.03429 -910,0.000288948,9.05884 -915,0.000279897,9.08332 -920,0.000271117,9.10783 -925,0.000262621,9.13227 -930,0.00025438,9.15676 -935,0.000246405,9.18116 -940,0.000238669,9.20561 -945,0.000231183,9.22998 -950,0.00022285,9.19538 -955,0.000216896,9.27873 -960,0.000210081,9.30312 -965,0.000203486,9.32742 -970,0.00019709,9.35177 -975,0.0001909,9.37616 -980,0.000184897,9.40065 -985,0.000179089,9.42507 -990,0.000173454,9.44955 -995,0.000168003,9.47396 -1000,0.00016428,9.54285 -1005,0.00015869,9.49214 -1010,0.000154174,9.51328 -1015,0.000149792,9.53436 -1020,0.000145528,9.55546 -1025,0.00014139,9.5765 -1030,0.000137364,9.59757 -1035,0.000133456,9.61858 -1040,0.000129655,9.63961 -1045,0.000125966,9.66058 -1050,0.000121865,9.67595 -1055,0.000118894,9.70252 -1060,0.000115506,9.7235 -1065,0.000112217,9.7444 -1070,0.000109018,9.76534 -1075,0.000105913,9.78621 -1080,0.000102893,9.80712 -1085,9.99621E-05,9.82796 -1090,9.71109E-05,9.84883 -1095,9.43437E-05,9.86964 -1100,9.12469E-05,9.64142 -1105,8.90397E-05,9.91126 -1110,8.64987E-05,9.93208 -1115,8.40326E-05,9.95283 -1120,8.16338E-05,9.97361 -1125,7.93058E-05,9.99433 -1130,7.70413E-05,10.0151 -1135,7.48438E-05,10.0358 -1140,7.27062E-05,10.0565 -1145,7.06317E-05,10.0771 -1150,6.84561E-05,10.3594 -1155,6.66558E-05,10.1185 -1160,6.47511E-05,10.1391 -1165,6.29027E-05,10.1597 -1170,6.11049E-05,10.1804 -1175,5.93602E-05,10.201 -1180,5.76631E-05,10.2216 -1185,5.60163E-05,10.2421 -1190,5.44145E-05,10.2627 -1195,5.28601E-05,10.2832 -1200,5.16263E-05,10.2499 -1205,5.00356E-05,10.3216 -1210,4.87007E-05,10.3432 -1215,4.74019E-05,10.3646 -1220,4.61573E-05,10.3852 -1225,4.49127E-05,10.4069 -1230,4.37353E-05,10.4271 -1235,4.25748E-05,10.4478 -1240,4.143E-05,10.4694 -1245,4.0348E-05,10.49 -1250,3.91587E-05,10.4736 -1255,3.82278E-05,10.5325 -1260,3.72189E-05,10.5529 -1265,3.621E-05,10.5745 -1270,3.52693E-05,10.5939 -1275,3.43286E-05,10.6143 -1280,3.34133E-05,10.6345 -1285,3.25362E-05,10.6537 -1290,3.1659E-05,10.674 -1295,3.08293E-05,10.6929 -1300,2.99353E-05,10.783 -1305,2.92047E-05,10.7316 -1310,2.84421E-05,10.7497 -1315,2.76795E-05,10.7688 -1320,2.69478E-05,10.7871 -1325,2.62368E-05,10.8052 -1330,2.55257E-05,10.8242 -1335,2.48627E-05,10.8412 -1340,2.41997E-05,10.8591 -1345,2.35547E-05,10.8769 -1350,2.28072E-05,10.9427 -1355,2.23183E-05,10.9117 -1360,2.17335E-05,10.9282 -1365,2.1157E-05,10.945 -1370,2.05884E-05,10.9622 -1375,2.00509E-05,10.9781 -1380,1.95134E-05,10.9949 -1385,1.89977E-05,11.0111 -1390,1.84965E-05,11.0279 -1395,1.79953E-05,11.0456 -1400,1.75031E-05,11.1631 -1405,1.70607E-05,11.0785 -1410,1.6606E-05,11.0953 -1415,1.61703E-05,11.1114 -1420,1.57345E-05,11.1284 -1425,1.53223E-05,11.1443 -1430,1.4916E-05,11.1605 -1435,1.45152E-05,11.1771 -1440,1.41363E-05,11.1925 -1445,1.37574E-05,11.2088 -1450,1.34572E-05,11.084 -1455,1.30406E-05,11.24 -1460,1.26873E-05,11.2564 -1465,1.23579E-05,11.2712 -1470,1.20285E-05,11.2868 -1475,1.1708E-05,11.3023 -1480,1.14008E-05,11.3172 -1485,1.10936E-05,11.3329 -1490,1.08031E-05,11.3476 -1495,1.05166E-05,11.3626 -1500,1.02341E-05,11.3779 -1505,9.967E-06,11.3922 -1510,9.69992E-06,11.4072 -1515,9.44366E-06,11.4218 -1520,9.19461E-06,11.4361 -1525,8.94556E-06,11.4513 -1530,8.71333E-06,11.465 -1535,8.4811E-06,11.4794 -1540,8.25515E-06,11.4938 -1545,8.0386E-06,11.5076 -1550,7.82205E-06,11.5221 -1555,7.6172E-06,11.5357 -1560,7.41527E-06,11.5496 -1565,7.21607E-06,11.5638 -1570,7.02778E-06,11.577 -1575,6.83949E-06,11.5909 -1580,6.65882E-06,11.6044 -1585,6.48324E-06,11.6177 -1590,6.30766E-06,11.6317 -1595,6.14394E-06,11.6444 -1600,5.98021E-06,11.6578 -1605,5.82091E-06,11.6711 -1610,5.66824E-06,11.6839 -1615,5.51557E-06,11.6973 -1620,5.37114E-06,11.7099 -1625,5.22878E-06,11.7228 -1630,5.08834E-06,11.7359 -1635,4.95558E-06,11.7482 -1640,4.82283E-06,11.7611 -1645,4.69545E-06,11.7736 -1650,4.57166E-06,11.7859 -1655,4.44787E-06,11.7989 -1660,4.33243E-06,11.8107 -1665,4.217E-06,11.8231 -1670,4.10468E-06,11.8354 -1675,3.99703E-06,11.8472 -1680,3.88939E-06,11.8597 -1685,3.78756E-06,11.8714 -1690,3.68718E-06,11.8833 -1695,3.58816E-06,11.8955 -1700,3.49456E-06,11.9069 -1705,3.40095E-06,11.9189 -1710,3.31114E-06,11.9304 -1715,3.22386E-06,11.9418 -1720,3.13657E-06,11.9539 -1725,3.05518E-06,11.9648 -1730,2.97379E-06,11.9763 -1735,2.89459E-06,11.9878 -1740,2.81869E-06,11.9987 -1745,2.74279E-06,12.0103 -1750,2.67099E-06,12.0211 -1755,2.60021E-06,12.0322 -1760,2.53039E-06,12.0435 -1765,2.46439E-06,12.054 -1770,2.39839E-06,12.0651 -1775,2.33506E-06,12.0759 -1780,2.27351E-06,12.0865 -1785,2.21196E-06,12.0976 -1790,2.15457E-06,12.1078 -1795,2.09718E-06,12.1184 -1800,2.04133E-06,12.129 -1805,1.98781E-06,12.1392 -1810,1.93429E-06,12.15 -1815,1.88366E-06,12.16 -1820,1.83375E-06,12.1702 -1825,1.78452E-06,12.1807 -1830,1.73798E-06,12.1905 -1835,1.69143E-06,12.2008 -1840,1.64678E-06,12.2108 -1845,1.60338E-06,12.2206 -1850,1.55998E-06,12.231 -1855,1.5195E-06,12.2404 -1860,1.47903E-06,12.2503 -1865,1.43965E-06,12.2601 -1870,1.40191E-06,12.2695 -1875,1.36417E-06,12.2795 -1880,1.32847E-06,12.2888 -1885,1.29327E-06,12.2983 -1890,1.25855E-06,12.3081 -1895,1.22573E-06,12.3171 -1900,1.19291E-06,12.3267 -1905,1.16142E-06,12.3359 -1910,1.13081E-06,12.345 -1915,1.10021E-06,12.3547 -1920,1.07167E-06,12.3634 -1925,1.04313E-06,12.3725 -1930,1.01536E-06,12.3817 -1935,9.8874E-07,12.3904 -1940,9.62124E-07,12.3997 -1945,9.36945E-07,12.4083 -1950,9.12125E-07,12.4171 -1955,8.8764E-07,12.4261 -1960,8.64495E-07,12.4345 -1965,8.41349E-07,12.4434 -1970,8.19141E-07,12.4519 -1975,7.97557E-07,12.4604 -1980,7.75973E-07,12.4693 -1985,7.55845E-07,12.4774 -1990,7.35717E-07,12.4859 -1995,7.16132E-07,12.4944 -2000,6.97362E-07,12.5025 -2005,6.78592E-07,12.5111 -2010,6.60834E-07,12.5191 -2015,6.4333E-07,12.5272 -2020,6.26063E-07,12.5356 -2025,6.09739E-07,12.5434 -2030,5.93416E-07,12.5516 -2035,5.77753E-07,12.5595 -2040,5.62531E-07,12.5674 -2045,5.47309E-07,12.5756 -2050,5.33114E-07,12.5831 -2055,5.18918E-07,12.591 -2060,5.05106E-07,12.5988 -2065,4.91868E-07,12.6063 -2070,4.7863E-07,12.6143 -2075,4.66106E-07,12.6217 -2080,4.53761E-07,12.6293 -2085,4.41583E-07,12.637 -2090,4.30071E-07,12.6442 -2095,4.18558E-07,12.6518 -2100,4.07512E-07,12.6592 -2105,3.96776E-07,12.6664 -2110,3.8604E-07,12.6741 -2115,3.76028E-07,12.681 -2120,3.66016E-07,12.6883 -2125,3.56275E-07,12.6956 -2130,3.46938E-07,12.7025 -2135,3.37601E-07,12.7099 -2140,3.28769E-07,12.7167 -2145,3.20062E-07,12.7237 -2150,3.11472E-07,12.7309 -2155,3.03353E-07,12.7376 -2160,2.95233E-07,12.7446 -2165,2.87442E-07,12.7514 -2170,2.7987E-07,12.7581 -2175,2.72298E-07,12.7652 -2180,2.65237E-07,12.7716 -2185,2.58175E-07,12.7783 -2190,2.51304E-07,12.785 -2195,2.44719E-07,12.7915 -2200,2.38134E-07,12.7983 -2205,2.31904E-07,12.8046 -2210,2.25763E-07,12.8111 -2215,2.19705E-07,12.8177 -2220,2.13978E-07,12.8239 -2225,2.08251E-07,12.8304 -2230,2.02755E-07,12.8367 -2235,1.97415E-07,12.8429 -2240,1.92074E-07,12.8494 -2245,1.87093E-07,12.8553 -2250,1.82113E-07,12.8615 -2255,1.77266E-07,12.8677 -2260,1.72622E-07,12.8737 -2265,1.67977E-07,12.8799 -2270,1.63583E-07,12.8858 -2275,1.59251E-07,12.8918 -2280,1.54978E-07,12.8979 -2285,1.50939E-07,12.9036 -2290,1.46899E-07,12.9096 -2295,1.43023E-07,12.9154 -2300,1.39256E-07,12.9211 -2305,1.35489E-07,12.9271 -2310,1.31976E-07,12.9326 -2315,1.28463E-07,12.9383 -2320,1.25044E-07,12.944 -2325,1.21768E-07,12.9495 -2330,1.18492E-07,12.9553 -2335,1.15392E-07,12.9607 -2340,1.12337E-07,12.9662 -2345,1.09323E-07,12.9718 -2350,1.06474E-07,12.977 -2355,1.03624E-07,12.9826 -2360,1.0089E-07,12.9879 -2365,9.82332E-08,12.9932 -2370,9.55761E-08,12.9987 -2375,9.3098E-08,13.0037 -2380,9.062E-08,13.009 -2385,8.82088E-08,13.0143 -2390,8.58979E-08,13.0193 -2395,8.35869E-08,13.0246 -2400,8.14006E-08,13.0296 -2405,7.92455E-08,13.0346 -2410,7.71194E-08,13.0398 -2415,7.51095E-08,13.0446 -2420,7.30997E-08,13.0497 -2425,7.11712E-08,13.0546 -2430,6.92968E-08,13.0594 -2435,6.74225E-08,13.0645 -2440,6.56745E-08,13.0691 -2445,6.39265E-08,13.074 -2450,6.22257E-08,13.0788 -2455,6.05956E-08,13.0834 -2460,5.89655E-08,13.0883 -2465,5.74232E-08,13.0929 -2470,5.5903E-08,13.0975 -2475,5.44033E-08,13.1023 -2480,5.29855E-08,13.1067 -2485,5.15678E-08,13.1113 -2490,5.02074E-08,13.1158 -2495,4.88852E-08,13.1202 +90,5.231,3.962 +100,3.459,3.754 +150,0.7527,3.489 +200,0.2567,3.684 +250,0.1094,3.894 +300,0.05338,4.258 +350,0.02854,4.639 +400,0.0163,5.025 +450,0.009786,5.523 +500,0.006108,5.914 +550,0.003934,6.41 +600,0.002599,6.909 +650,0.001754,7.506 +700,0.001206,8.106 +750,0.0008415,8.805 +800,0.0005952,9.605 +850,0.000426,10.4 +900,0.0003081,11.4 +950,0.0002247,12.5 +1000,0.0001653,13.8 +1050,0.0001225,15.2 +1100,9.133e-05,16.8 +1150,6.852e-05,18.6 +1200,5.169e-05,20.7 +1250,3.919e-05,23 +1300,2.986e-05,25.6 +1350,2.284e-05,28.4 +1400,1.755e-05,31.6 +1450,1.354e-05,35.1 +1500,1.048e-05,39 +1550,8.138e-06,43.4 +1600,6.342e-06,48.1 +1650,4.958e-06,53.3 +1700,3.888e-06,59 +1750,3.058e-06,65.2 +1800,2.412e-06,71.9 +1850,1.908e-06,79.1 +1900,1.513e-06,86.9 From fb7a0e49d99d3cf769db8d6854d9bac3c59e5f1a Mon Sep 17 00:00:00 2001 From: Gianfranco de Castro Date: Sat, 23 May 2026 14:45:14 -0500 Subject: [PATCH 09/15] Add binning study scripts and HybridNew validation All Python/shell scripts for the sumdbv binning optimization study: scheme comparison (asymptotic + HybridNew), boundary scans, discovery significance cross-checks, and condor submission infrastructure. Also updates makeDatacard.py, submitCombine.py, plotLimits.py, limits_config.yaml for the new binning framework. Co-Authored-By: Claude Sonnet 4.6 --- MFVNeutralino/test/.gitignore | 9 +- .../ForLimits/BinningStudy/binning_schemes.py | 85 ++++ .../ForLimits/BinningStudy/boundary_scan.py | 232 +++++++++++ .../BinningStudy/boundary_scan_2bin.py | 216 ++++++++++ .../BinningStudy/check_fast_vs_original.py | 88 ++++ .../ForLimits/BinningStudy/collect_results.py | 163 ++++++++ .../BinningStudy/condor_binning_study.jdl | 14 + .../BinningStudy/condor_binning_study.out | 4 + .../BinningStudy/condor_binning_study.sh | 34 ++ .../BinningStudy/discovery_combine_scan.py | 183 ++++++++ .../ForLimits/BinningStudy/discovery_scan.py | 179 ++++++++ .../BinningStudy/fast_study_datacards.py | 219 ++++++++++ .../fast_study_datacards_systs.py | 253 ++++++++++++ .../BinningStudy/generate_variants_el7.py | 102 +++++ .../BinningStudy/hybridnew_validation.py | 385 +++++++++++++++++ .../BinningStudy/plot_background_templates.py | 191 +++++++++ .../BinningStudy/plot_new_signals.py | 123 ++++++ .../BinningStudy/plot_scheme_comparison.py | 144 +++++++ .../BinningStudy/plot_syst_comparison.py | 118 ++++++ .../BinningStudy/run_combine_study.sh | 77 ++++ .../ForLimits/BinningStudy/run_full_study.sh | 34 ++ .../ForLimits/BinningStudy/run_systs_study.sh | 61 +++ .../ForLimits/BinningStudy/strip_systs.py | 59 +++ .../test/ForLimits/BinningStudy/tail_check.py | 24 ++ .../test/ForLimits/limits_config.yaml | 22 +- MFVNeutralino/test/ForLimits/makeDatacard.py | 7 +- MFVNeutralino/test/ForLimits/plotLimits.py | 389 ++++++++++++++++-- MFVNeutralino/test/ForLimits/submitCombine.py | 246 +++++++---- 28 files changed, 3536 insertions(+), 125 deletions(-) create mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/binning_schemes.py create mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/boundary_scan.py create mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/boundary_scan_2bin.py create mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/check_fast_vs_original.py create mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/collect_results.py create mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.jdl create mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.out create mode 100755 MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.sh create mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/discovery_combine_scan.py create mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/discovery_scan.py create mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/fast_study_datacards.py create mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/fast_study_datacards_systs.py create mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/generate_variants_el7.py create mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/hybridnew_validation.py create mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/plot_background_templates.py create mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/plot_new_signals.py create mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/plot_scheme_comparison.py create mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/plot_syst_comparison.py create mode 100755 MFVNeutralino/test/ForLimits/BinningStudy/run_combine_study.sh create mode 100755 MFVNeutralino/test/ForLimits/BinningStudy/run_full_study.sh create mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/run_systs_study.sh create mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/strip_systs.py create mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/tail_check.py diff --git a/MFVNeutralino/test/.gitignore b/MFVNeutralino/test/.gitignore index dcbb589ae..1180bbcf0 100644 --- a/MFVNeutralino/test/.gitignore +++ b/MFVNeutralino/test/.gitignore @@ -15,5 +15,12 @@ ForLimits/CombineOutput/ ForLimits/CombineCondor/ ForLimits/LimitPlots/ ForLimits/BinningStudy/datacards/ +ForLimits/BinningStudy/datacards_systs/ ForLimits/BinningStudy/combine_output/ -ForLimits/BinningStudy/generate_variants.log +ForLimits/BinningStudy/combine_output_systs/ +ForLimits/BinningStudy/condor_hybridnew/ +ForLimits/BinningStudy/root_output/ +ForLimits/BinningStudy/__pycache__/ +ForLimits/BinningStudy/*.pyc +ForLimits/BinningStudy/*.log +ForLimits/BinningStudy/*.err diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/binning_schemes.py b/MFVNeutralino/test/ForLimits/BinningStudy/binning_schemes.py new file mode 100644 index 000000000..231e28b49 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/BinningStudy/binning_schemes.py @@ -0,0 +1,85 @@ +"""Central definition of all binning schemes and study signal points.""" + +SCHEMES = { + "old_binning": {"bins": [0., 0.08, 0.16, 4.0], "nbins": 3, + "label": "3-bin old [0, 0.08, 0.16, 4.0]"}, + "2bin": {"bins": [0., 1.6, 4.0], "nbins": 2, + "label": "2-bin [0, 1.6, 4.0]"}, + "3bin_nom": {"bins": [0., 0.8, 1.6, 4.0], "nbins": 3, + "label": "3-bin nominal [0, 0.8, 1.6, 4.0]"}, + "3bin_v1": {"bins": [0., 0.4, 1.6, 4.0], "nbins": 3, + "label": "3-bin v1 [0, 0.4, 1.6, 4.0]"}, + "3bin_v2": {"bins": [0., 0.8, 2.5, 4.0], "nbins": 3, + "label": "3-bin v2 [0, 0.8, 2.5, 4.0]"}, + "3bin_v3": {"bins": [0., 1.0, 2.0, 4.0], "nbins": 3, + "label": "3-bin v3 [0, 1.0, 2.0, 4.0]"}, + "3bin_v4": {"bins": [0., 0.5, 1.0, 4.0], "nbins": 3, + "label": "3-bin v4 [0, 0.5, 1.0, 4.0]"}, + "4bin_v1": {"bins": [0., 0.4, 0.8, 1.6, 4.0], "nbins": 4, + "label": "4-bin v1 [0, 0.4, 0.8, 1.6, 4.0]"}, + "4bin_v2": {"bins": [0., 0.8, 1.2, 1.6, 4.0], "nbins": 4, + "label": "4-bin v2 [0, 0.8, 1.2, 1.6, 4.0]"}, + # --- Per-channel split schemes (bjet and lep get different boundaries) --- + # Motivated by background shape plots: bjet bkg falls steeply by ~0.4 cm; + # lep bkg has a secondary bump to ~0.7 cm and long-lifetime signals extend flat. + "3bin_split": { + "bjet_bins": [0., 0.4, 1.2, 4.0], "bjet_nbins": 3, + "lep_bins": [0., 0.5, 1.6, 4.0], "lep_nbins": 3, + "label": "split: bjet[0,0.4,1.2,4] lep[0,0.5,1.6,4]", + }, + "3bin_split_v2": { + "bjet_bins": [0., 0.3, 1.0, 4.0], "bjet_nbins": 3, + "lep_bins": [0., 0.5, 1.6, 4.0], "lep_nbins": 3, + "label": "split v2: bjet[0,0.3,1.0,4] lep[0,0.5,1.6,4]", + }, + "3bin_412": { + "bins": [0., 0.4, 1.2, 4.0], "nbins": 3, + "label": "3-bin [0, 0.4, 1.2, 4.0]", + }, + "2bin_split": { + "bjet_bins": [0., 0.4, 4.0], "bjet_nbins": 2, + "lep_bins": [0., 0.5, 4.0], "lep_nbins": 2, + "label": "2-bin split: bjet[0,0.4,4] lep[0,0.5,4]", + }, + "4bin_split": { + "bjet_bins": [0., 0.3, 0.8, 1.6, 4.0], "bjet_nbins": 4, + "lep_bins": [0., 0.4, 0.8, 1.6, 4.0], "lep_nbins": 4, + "label": "4-bin split: bjet[0,0.3,0.8,1.6,4] lep[0,0.4,0.8,1.6,4]", + }, + # --- Round 2: high-displacement boundaries --- + # bjet: ggH tau=1mm M=55 extends to 3+ cm; add boundary at 2.5 cm + # lep: VH tau=10mm is flat to 4 cm with ~0 bkg past 2 cm; boundary at 3 cm + "4bin_412_25": {"bins": [0., 0.4, 1.2, 2.5, 4.0], "nbins": 4, + "label": "4-bin [0, 0.4, 1.2, 2.5, 4.0]"}, + "3bin_420": {"bins": [0., 0.4, 2.0, 4.0], "nbins": 3, + "label": "3-bin [0, 0.4, 2.0, 4.0]"}, + "4bin_nom_30": {"bins": [0., 0.8, 1.6, 3.0, 4.0], "nbins": 4, + "label": "4-bin [0, 0.8, 1.6, 3.0, 4.0]"}, + "4bin_516_30": {"bins": [0., 0.5, 1.6, 3.0, 4.0], "nbins": 4, + "label": "4-bin [0, 0.5, 1.6, 3.0, 4.0]"}, + "3bin_520": {"bins": [0., 0.5, 2.0, 4.0], "nbins": 3, + "label": "3-bin [0, 0.5, 2.0, 4.0]"}, + "3bin_104": {"bins": [0., 0.1, 0.4, 4.0], "nbins": 3, + "label": "3-bin [0, 0.1, 0.4, 4.0]"}, + "4bin_104_200": {"bins": [0., 0.1, 0.4, 2.0, 4.0], "nbins": 4, + "label": "4-bin [0, 0.1, 0.4, 2.0, 4.0]"}, + "4bin_104_250": {"bins": [0., 0.1, 0.4, 2.5, 4.0], "nbins": 4, + "label": "4-bin [0, 0.1, 0.4, 2.5, 4.0]"}, +} + +# (sig_id, channel) — sig_id matches Datacard___.txt filename stem +SIGNAL_POINTS = [ + # Lepton-triggered + ("VH_tau1mm_M55", "lep"), + ("VH_tau10mm_M55", "lep"), + ("VH_tau1mm_M40", "lep"), + ("VH_tau1mm_M15", "lep"), + # Displacement-triggered + ("ggHToSSTodddd_tau1mm_M55", "bjet"), + ("ggHToSSTodddd_tau1mm_M40", "bjet"), + ("mfv_stopdbardbar_tau001000um_M0200", "bjet"), + ("mfv_stopdbardbar_tau000300um_M0400", "bjet"), + ("mfv_neu_tau001000um_M0400", "bjet"), +] + +YEARS = ["20161", "20162", "2017", "2018"] diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/boundary_scan.py b/MFVNeutralino/test/ForLimits/BinningStudy/boundary_scan.py new file mode 100644 index 000000000..b45bbb8e2 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/BinningStudy/boundary_scan.py @@ -0,0 +1,232 @@ +""" +Scan expected 95% CL UL vs first boundary position. +Scheme: 3-bin [0, x, 1.6, 4.0]. + Coarse scan: x = 0.2..1.4 in steps of 0.1 (existing) + Fine scan: x = 0.01..0.10 in steps of 0.01 (extended) + +Usage: + python3 boundary_scan.py gen # generate datacards (LCG dev3 or cmsenv) + python3 boundary_scan.py run # run combine (cmsenv) + python3 boundary_scan.py plot # make plot (LCG dev3) + python3 boundary_scan.py # all three +""" +import os, sys, subprocess +import numpy as np + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from binning_schemes import SIGNAL_POINTS, YEARS +from fast_study_datacards import run_scheme, get_bkg_yields, get_sig_files, get_sig_shape, parse_ref_yield, write_datacard + +HERE = os.path.dirname(os.path.abspath(__file__)) +DC_BASE = os.path.join(HERE, "datacards") +OUT_BASE = os.path.join(HERE, "combine_output") + +FINE_VALS = [round(i * 0.01, 2) for i in range(1, 11)] # 0.01..0.10 +COARSE_VALS = [round(v * 0.1, 1) for v in range(2, 15)] # 0.20..1.40 (existing) +SCAN_VALS = FINE_VALS + COARSE_VALS +SECOND_BDY = 1.6 +UPPER = 4.0 + +SIG_CHANNEL = {sp[0]: sp[1] for sp in SIGNAL_POINTS} + +def scheme_name(x): + # fine range uses 'f' prefix with 3-digit millimeter representation + if x < 0.15: + return "scan_b1_f%03d" % round(x * 1000) + return "scan_b1_%02d" % round(x * 10) + +def scheme_bins(x): + return [0., x, SECOND_BDY, UPPER] + + +# ---- generation ------------------------------------------------------- + +def gen_all(): + try: + import ROOT + ROOT.gROOT.SetBatch(True) + except ImportError: + print("ERROR: ROOT not available"); sys.exit(1) + + for x in SCAN_VALS: + name = scheme_name(x) + bins = scheme_bins(x) + info = {"bins": bins, "nbins": len(bins) - 1} + # Check whether any signal/year datacards are missing + missing = False + for sig_id, ch in SIGNAL_POINTS: + for yr in YEARS: + p = os.path.join(DC_BASE, name, ch, + "Datacard_%s_%s_%s_statonly.txt" % (ch, sig_id, yr)) + if not os.path.exists(p): + missing = True + break + if missing: + break + if not missing: + print("SKIP %s (all datacards present)" % name) + continue + print("\n=== scan x=%.2f %s ===" % (x, bins)) + run_scheme(name, info) + print("\nGeneration done.") + + +# ---- combine ---------------------------------------------------------- + +def run_all(): + for x in SCAN_VALS: + name = scheme_name(x) + dc_dir = os.path.join(DC_BASE, name) + if not os.path.isdir(dc_dir): + print("SKIP %s (no datacards)" % name) + continue + for sig_id, ch in SIGNAL_POINTS: + _run_one(name, sig_id, ch) + print("\nCombine done.") + + +def _run_one(scheme, sig_id, ch): + work = os.path.join(OUT_BASE, scheme, sig_id) + os.makedirs(work, exist_ok=True) + + card_args = [] + for yr in YEARS: + p = os.path.join(DC_BASE, scheme, ch, + "Datacard_%s_%s_%s_statonly.txt" % (ch, sig_id, yr)) + if not os.path.exists(p): + print(" SKIP (missing card): %s/%s" % (scheme, sig_id)) + return + card_args.append("%s_%s=%s" % (ch, yr, p)) + + combined = os.path.join(work, "combined_%s.txt" % sig_id) + r = subprocess.run(["combineCards.py"] + card_args, + capture_output=True, text=True) + if r.returncode != 0: + print(" combineCards FAILED: %s/%s" % (scheme, sig_id)) + return + with open(combined, "w") as fh: + fh.write(r.stdout) + + subprocess.run( + ["combine", "-M", "AsymptoticLimits", + "--name", "%s_%s" % (scheme, sig_id), + combined, "--expectSignal", "0", "-v", "0"], + cwd=work, capture_output=True) + + +# ---- collect results -------------------------------------------------- + +def collect(): + try: + import ROOT + ROOT.gROOT.SetBatch(True) + except ImportError: + print("ERROR: ROOT not available"); sys.exit(1) + + results = {} # x -> sig_id -> expected_median_UL + for x in SCAN_VALS: + name = scheme_name(x) + out_dir = os.path.join(OUT_BASE, name) + if not os.path.isdir(out_dir): + continue + results[x] = {} + for sig_id, ch in SIGNAL_POINTS: + work = os.path.join(out_dir, sig_id) + pattern = "higgsCombine%s_%s.AsymptoticLimits" % (name, sig_id) + ul = None + for fn in (os.listdir(work) if os.path.isdir(work) else []): + if fn.startswith(pattern) and fn.endswith(".root"): + f = ROOT.TFile(os.path.join(work, fn)) + t = f.Get("limit") + try: + for ev in t: + if abs(ev.quantileExpected - 0.5) < 0.01: + ul = float(ev.limit) + break + except TypeError: + print(" WARN: unreadable file %s" % fn) + f.Close() + break + results[x][sig_id] = ul + return results + + +# ---- plot ------------------------------------------------------------- + +def plot(results): + import matplotlib + matplotlib.use("Agg") + import matplotlib.pyplot as plt + + sigs = [sp[0] for sp in SIGNAL_POINTS] + + SIG_LABELS = { + "VH_tau1mm_M55": r"VH $\tau$=1mm $M$=55 (lep)", + "VH_tau10mm_M55": r"VH $\tau$=10mm $M$=55 (lep)", + "VH_tau1mm_M40": r"VH $\tau$=1mm $M$=40 (lep)", + "VH_tau1mm_M15": r"VH $\tau$=1mm $M$=15 (lep)", + "ggHToSSTodddd_tau1mm_M55": r"ggH $\tau$=1mm $M$=55 (bjet)", + "ggHToSSTodddd_tau1mm_M40": r"ggH $\tau$=1mm $M$=40 (bjet)", + "mfv_stopdbardbar_tau001000um_M0200": r"stop $\tau$=1mm $M$=200 (bjet)", + "mfv_stopdbardbar_tau000300um_M0400": r"stop $\tau$=0.3mm $M$=400 (bjet)", + "mfv_neu_tau001000um_M0400": r"neu $\tau$=1mm $M$=400 (bjet)", + } + COLORS = ["royalblue","tomato","cornflowerblue","skyblue", + "forestgreen","limegreen","darkorange","purple","saddlebrown"] + + xs = sorted(results.keys()) + nom_x = 0.8 + # x-tick labels: show all fine points and every other coarse point + tick_xs = [x for x in xs if x <= 0.10 or abs(round(x * 10) % 2) < 0.01] + + fig, axes = plt.subplots(1, 2, figsize=(16, 5)) + + for ax, sig_ids, title in [ + (axes[0], [s for s in sigs if SIG_CHANNEL[s] == "bjet"], "Bjet channel"), + (axes[1], [s for s in sigs if SIG_CHANNEL[s] == "lep"], "Lepton channel"), + ]: + for sig_id, color in zip(sig_ids, COLORS): + lbl = SIG_LABELS.get(sig_id, sig_id) + uls = [results.get(x, {}).get(sig_id) for x in xs] + valid_x = [x for x, u in zip(xs, uls) if u is not None] + valid_ul = [u for u in uls if u is not None] + if not valid_ul: + continue + ax.plot(valid_x, valid_ul, "o-", color=color, lw=1.8, ms=4, + label=lbl) + + ax.axvline(nom_x, color="black", ls="--", lw=1.2, label="Nominal (0.8 cm)") + ax.set_xlabel("First boundary (cm)", fontsize=12) + ax.set_ylabel("Exp. 95% CL UL on r", fontsize=11) + ax.set_title(title, fontsize=12) + ax.set_xticks(tick_xs) + ax.set_xticklabels(["%.2f" % v for v in tick_xs], rotation=45, ha="right", fontsize=7) + ax.legend(fontsize=8, framealpha=0.85) + ax.grid(alpha=0.3) + + fig.suptitle(r"Expected UL vs first boundary — scheme [0, $x$, 1.6, 4.0] cm", + fontsize=12) + fig.tight_layout() + + for ext in ("pdf", "png"): + out = os.path.join(HERE, "boundary_scan.%s" % ext) + fig.savefig(out, bbox_inches="tight", dpi=150) + print("Saved:", out) + + +# ---- main ------------------------------------------------------------- + +def main(): + mode = sys.argv[1] if len(sys.argv) > 1 else "all" + + if mode in ("gen", "all"): + gen_all() + if mode in ("run", "all"): + run_all() + if mode in ("plot", "all"): + results = collect() + plot(results) + + +if __name__ == "__main__": + main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/boundary_scan_2bin.py b/MFVNeutralino/test/ForLimits/BinningStudy/boundary_scan_2bin.py new file mode 100644 index 000000000..fcc812f2d --- /dev/null +++ b/MFVNeutralino/test/ForLimits/BinningStudy/boundary_scan_2bin.py @@ -0,0 +1,216 @@ +""" +2-bin boundary scan: [0, x, 4.0] + Fine: x = 0.01..0.10 in steps of 0.01 + Coarse: x = 0.20..3.90 in steps of 0.10 + +Usage: + python3 boundary_scan_2bin.py gen # generate datacards (LCG dev3 or cmsenv) + python3 boundary_scan_2bin.py run # run combine (cmsenv) + python3 boundary_scan_2bin.py plot # make plot (LCG dev3) + python3 boundary_scan_2bin.py # all three +""" +import os, sys, subprocess +import numpy as np + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from binning_schemes import SIGNAL_POINTS, YEARS +from fast_study_datacards import run_scheme, parse_ref_yield, write_datacard + +HERE = os.path.dirname(os.path.abspath(__file__)) +DC_BASE = os.path.join(HERE, "datacards") +OUT_BASE = os.path.join(HERE, "combine_output") + +FINE_VALS = [round(i * 0.01, 2) for i in range(1, 11)] # 0.01..0.10 +COARSE_VALS = [round(i * 0.1, 1) for i in range(2, 40)] # 0.20..3.90 +SCAN_VALS = FINE_VALS + COARSE_VALS +UPPER = 4.0 + +SIG_CHANNEL = {sp[0]: sp[1] for sp in SIGNAL_POINTS} + + +def scheme_name(x): + return "scan2b_%03d" % round(x * 100) + +def scheme_bins(x): + return [0., x, UPPER] + + +# ---- generation ------------------------------------------------------- + +def gen_all(): + try: + import ROOT + ROOT.gROOT.SetBatch(True) + except ImportError: + print("ERROR: ROOT not available"); sys.exit(1) + + for x in SCAN_VALS: + name = scheme_name(x) + dc_check = os.path.join(DC_BASE, name) + if os.path.isdir(dc_check): + print("SKIP %s (datacards exist)" % name) + continue + bins = scheme_bins(x) + print("\n=== scan2b x=%.2f %s ===" % (x, bins)) + info = {"bins": bins, "nbins": len(bins) - 1} + run_scheme(name, info) + print("\nGeneration done.") + + +# ---- combine ---------------------------------------------------------- + +def run_all(): + for x in SCAN_VALS: + name = scheme_name(x) + dc_dir = os.path.join(DC_BASE, name) + if not os.path.isdir(dc_dir): + print("SKIP %s (no datacards)" % name) + continue + for sig_id, ch in SIGNAL_POINTS: + _run_one(name, sig_id, ch) + print("\nCombine done.") + + +def _run_one(scheme, sig_id, ch): + work = os.path.join(OUT_BASE, scheme, sig_id) + os.makedirs(work, exist_ok=True) + + card_args = [] + for yr in YEARS: + p = os.path.join(DC_BASE, scheme, ch, + "Datacard_%s_%s_%s_statonly.txt" % (ch, sig_id, yr)) + if not os.path.exists(p): + print(" SKIP (missing card): %s/%s" % (scheme, sig_id)) + return + card_args.append("%s_%s=%s" % (ch, yr, p)) + + combined = os.path.join(work, "combined_%s.txt" % sig_id) + r = subprocess.run(["combineCards.py"] + card_args, + capture_output=True, text=True) + if r.returncode != 0: + print(" combineCards FAILED: %s/%s" % (scheme, sig_id)) + return + with open(combined, "w") as fh: + fh.write(r.stdout) + + subprocess.run( + ["combine", "-M", "AsymptoticLimits", + "--name", "%s_%s" % (scheme, sig_id), + combined, "--expectSignal", "0", "-v", "0"], + cwd=work, capture_output=True) + + +# ---- collect results -------------------------------------------------- + +def collect(): + try: + import ROOT + ROOT.gROOT.SetBatch(True) + except ImportError: + print("ERROR: ROOT not available"); sys.exit(1) + + results = {} # x -> sig_id -> expected_median_UL + for x in SCAN_VALS: + name = scheme_name(x) + out_dir = os.path.join(OUT_BASE, name) + if not os.path.isdir(out_dir): + continue + results[x] = {} + for sig_id, ch in SIGNAL_POINTS: + work = os.path.join(out_dir, sig_id) + pattern = "higgsCombine%s_%s.AsymptoticLimits" % (name, sig_id) + ul = None + for fn in (os.listdir(work) if os.path.isdir(work) else []): + if fn.startswith(pattern) and fn.endswith(".root"): + f = ROOT.TFile(os.path.join(work, fn)) + t = f.Get("limit") + try: + for ev in t: + if abs(ev.quantileExpected - 0.5) < 0.01: + ul = float(ev.limit) + break + except TypeError: + print(" WARN: unreadable file %s" % fn) + f.Close() + break + results[x][sig_id] = ul + return results + + +# ---- plot ------------------------------------------------------------- + +def plot(results): + import matplotlib + matplotlib.use("Agg") + import matplotlib.pyplot as plt + + sigs = [sp[0] for sp in SIGNAL_POINTS] + + SIG_LABELS = { + "VH_tau1mm_M55": r"VH $\tau$=1mm $M$=55 (lep)", + "VH_tau10mm_M55": r"VH $\tau$=10mm $M$=55 (lep)", + "VH_tau1mm_M40": r"VH $\tau$=1mm $M$=40 (lep)", + "VH_tau1mm_M15": r"VH $\tau$=1mm $M$=15 (lep)", + "ggHToSSTodddd_tau1mm_M55": r"ggH $\tau$=1mm $M$=55 (bjet)", + "ggHToSSTodddd_tau1mm_M40": r"ggH $\tau$=1mm $M$=40 (bjet)", + "mfv_stopdbardbar_tau001000um_M0200": r"stop $\tau$=1mm $M$=200 (bjet)", + "mfv_stopdbardbar_tau000300um_M0400": r"stop $\tau$=0.3mm $M$=400 (bjet)", + "mfv_neu_tau001000um_M0400": r"neu $\tau$=1mm $M$=400 (bjet)", + } + COLORS = ["royalblue","tomato","cornflowerblue","skyblue", + "forestgreen","limegreen","darkorange","purple","saddlebrown"] + + xs = sorted(results.keys()) + # x-ticks: all fine points + every other coarse point + tick_xs = [x for x in xs if x <= 0.10 or abs(round(x * 10) % 2) < 0.01] + + fig, axes = plt.subplots(1, 2, figsize=(16, 5)) + + for ax, sig_ids, title in [ + (axes[0], [s for s in sigs if SIG_CHANNEL[s] == "bjet"], "Bjet channel"), + (axes[1], [s for s in sigs if SIG_CHANNEL[s] == "lep"], "Lepton channel"), + ]: + for sig_id, color in zip(sig_ids, COLORS): + lbl = SIG_LABELS.get(sig_id, sig_id) + uls = [results.get(x, {}).get(sig_id) for x in xs] + valid_x = [x for x, u in zip(xs, uls) if u is not None] + valid_ul = [u for u in uls if u is not None] + if not valid_ul: + continue + ax.plot(valid_x, valid_ul, "o-", color=color, lw=1.8, ms=4, + label=lbl) + + ax.set_xlabel("Boundary x (cm)", fontsize=12) + ax.set_ylabel("Exp. 95% CL UL on r", fontsize=11) + ax.set_title(title, fontsize=12) + ax.set_xticks(tick_xs) + ax.set_xticklabels(["%.2f" % v for v in tick_xs], rotation=45, ha="right", fontsize=7) + ax.legend(fontsize=8, framealpha=0.85) + ax.grid(alpha=0.3) + + fig.suptitle(r"Expected UL vs boundary — scheme [0, $x$, 4.0] cm (2-bin)", + fontsize=12) + fig.tight_layout() + + for ext in ("pdf", "png"): + out = os.path.join(HERE, "boundary_scan_2bin.%s" % ext) + fig.savefig(out, bbox_inches="tight", dpi=150) + print("Saved:", out) + + +# ---- main ------------------------------------------------------------- + +def main(): + mode = sys.argv[1] if len(sys.argv) > 1 else "all" + + if mode in ("gen", "all"): + gen_all() + if mode in ("run", "all"): + run_all() + if mode in ("plot", "all"): + results = collect() + plot(results) + + +if __name__ == "__main__": + main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/check_fast_vs_original.py b/MFVNeutralino/test/ForLimits/BinningStudy/check_fast_vs_original.py new file mode 100644 index 000000000..b73b6c033 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/BinningStudy/check_fast_vs_original.py @@ -0,0 +1,88 @@ +""" +Cross-check: compare fast_study_datacards.py yields vs the original +3bin_nom datacards produced by the full makeLimitsInputROOT.py pipeline. + +Prints a table of (original, fast, % diff) for signal and background +yields in each bin for each year / signal point. + +Usage: + source LCG dev3 setup + python3 check_fast_vs_original.py +""" +import os, sys, re +import numpy as np + +try: + import ROOT + ROOT.gROOT.SetBatch(True) +except ImportError: + print("ERROR: ROOT not available"); sys.exit(1) + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from binning_schemes import SCHEMES, SIGNAL_POINTS, YEARS +from fast_study_datacards import ( + parse_ref_yield, get_bkg_yields, get_sig_files, get_sig_shape +) + +HERE = os.path.dirname(os.path.abspath(__file__)) +NOM_BINS = SCHEMES["3bin_nom"]["bins"] + + +def parse_original_rates(sig_id, ch, year): + """Return (sig_yields, bkg_yields) lists from original 3bin_nom stat-only card.""" + dc = os.path.join(HERE, "datacards", "3bin_nom", ch, + "Datacard_%s_%s_%s_statonly.txt" % (ch, sig_id, year)) + for line in open(dc): + if line.startswith("rate"): + vals = list(map(float, line.split()[1:])) + n = len(vals) // 2 + return vals[:n], vals[n:] + raise RuntimeError("No rate line in %s" % dc) + + +def recompute_fast(sig_id, ch, year): + """Recompute yields the same way fast_study_datacards.py would.""" + bins = NOM_BINS + ref_yield = parse_ref_yield(sig_id, ch, year) + files = get_sig_files(sig_id, ch, year) + shape = get_sig_shape(files, bins) + sig_ylds = [s * ref_yield for s in shape] + bkg_ylds = get_bkg_yields(ch, year, bins) + return sig_ylds, bkg_ylds + + +def pct(a, b): + if abs(b) < 1e-12: + return " n/a " if abs(a) < 1e-12 else " +inf%" + return "%+6.2f%%" % (100.0 * (a - b) / b) + + +print("%-42s %-5s %-25s %-25s %s" % ( + "signal / year", "bin", "original (full pipeline)", "fast (recomputed)", "diff")) +print("-" * 115) + +max_sig_diff = 0.0 +max_bkg_diff = 0.0 + +for sig_id, ch in SIGNAL_POINTS: + for year in YEARS: + try: + orig_sig, orig_bkg = parse_original_rates(sig_id, ch, year) + fast_sig, fast_bkg = recompute_fast(sig_id, ch, year) + except Exception as e: + print(" SKIP %s %s: %s" % (sig_id, year, e)) + continue + + label = "%s / %s" % (sig_id[-20:], year) + for i in range(len(orig_sig)): + d_sig = abs(fast_sig[i] - orig_sig[i]) / orig_sig[i] * 100 if orig_sig[i] > 1e-12 else 0 + d_bkg = abs(fast_bkg[i] - orig_bkg[i]) / orig_bkg[i] * 100 if orig_bkg[i] > 1e-12 else 0 + max_sig_diff = max(max_sig_diff, d_sig) + max_bkg_diff = max(max_bkg_diff, d_bkg) + print("%-42s bin%d sig: %9.4f vs %9.4f %s bkg: %9.5f vs %9.5f %s" % ( + label if i == 0 else "", i, + orig_sig[i], fast_sig[i], pct(fast_sig[i], orig_sig[i]), + orig_bkg[i], fast_bkg[i], pct(fast_bkg[i], orig_bkg[i]))) + +print() +print("Max signal diff: %.3f%% Max background diff: %.3f%%" % (max_sig_diff, max_bkg_diff)) diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/collect_results.py b/MFVNeutralino/test/ForLimits/BinningStudy/collect_results.py new file mode 100644 index 000000000..195fb8b04 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/BinningStudy/collect_results.py @@ -0,0 +1,163 @@ +# Usage: python collect_results.py +import os, sys + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from binning_schemes import SCHEMES + +try: + import ROOT + ROOT.gROOT.SetBatch(True) + HAS_ROOT = True +except ImportError: + HAS_ROOT = False + +HERE = os.path.dirname(os.path.abspath(__file__)) +OUT_BASE = os.path.join(HERE, "combine_output") + +SCHEMES_ORDER = list(SCHEMES.keys()) +SCHEME_LABELS = {k: v["label"] for k, v in SCHEMES.items()} + +SIG_LABELS = { + "VH_tau1mm_M55": "VH tau=1mm M=55 (lep)", + "VH_tau10mm_M55": "VH tau=10mm M=55 (lep)", + "VH_tau1mm_M40": "VH tau=1mm M=40 (lep)", + "VH_tau1mm_M15": "VH tau=1mm M=15 (lep)", + "ggHToSSTodddd_tau1mm_M55": "ggH tau=1mm M=55 (bjet)", + "ggHToSSTodddd_tau1mm_M40": "ggH tau=1mm M=40 (bjet)", + "mfv_stopdbardbar_tau001000um_M0200": "stop tau=1mm M=200 (bjet)", + "mfv_stopdbardbar_tau000300um_M0400": "stop tau=0.3mm M=400 (bjet)", + "mfv_neu_tau001000um_M0400": "neu tau=1mm M=400 (bjet)", +} + + +def read_grid_sigma_r(path): + """Return sigma_r from MultiDimFit --algo grid output. + + Reads the NLL profile, finds the best-fit r, then interpolates the + crossings of deltaNLL = 0.5 on each side to get the 68% CI. + Returns the average half-width as sigma_r, or None on failure. + """ + if not HAS_ROOT or not os.path.exists(path): + return None + f = ROOT.TFile.Open(path) + if not f or f.IsZombie(): + return None + t = f.Get("limit") + if not t or t.GetEntries() < 3: + f.Close() + return None + + pts = sorted((ev.r, ev.deltaNLL) for ev in t) + f.Close() + + best_r, best_dnll = min(pts, key=lambda x: x[1]) + + # Shift so minimum is at 0 + pts = [(r, d - best_dnll) for r, d in pts] + + # Interpolate 68% crossing (deltaNLL = 0.5) on each side + def interp_crossing(pairs): + for i in range(len(pairs) - 1): + r0, d0 = pairs[i] + r1, d1 = pairs[i+1] + if d0 <= 0.5 <= d1 and abs(d1 - d0) > 1e-10: + return r0 + (0.5 - d0) * (r1 - r0) / (d1 - d0) + return None + + # left side: scan outward from best_r downward + left = sorted([(r, d) for r, d in pts if r <= best_r], reverse=True) + # right side: scan outward from best_r upward + right = sorted([(r, d) for r, d in pts if r >= best_r]) + + lo = interp_crossing(left) + hi = interp_crossing(right) + + if lo is None or hi is None: + return None + return 0.5 * (hi - lo) + + +def read_asymptotic(path): + """Return expected 95% CL UL (median quantile) or None.""" + if not HAS_ROOT or not os.path.exists(path): + return None + f = ROOT.TFile.Open(path) + if not f or f.IsZombie(): + return None + t = f.Get("limit") + if not t: + f.Close() + return None + exp = None + for ev in t: + if abs(ev.quantileExpected - 0.5) < 0.01: + exp = ev.limit + break + f.Close() + return exp + + +def collect(): + results = {} # [scheme][sig] = {"sigma_r": ..., "exp_ul": ...} + for scheme in SCHEMES_ORDER: + scheme_dir = os.path.join(OUT_BASE, scheme) + if not os.path.isdir(scheme_dir): + continue + results[scheme] = {} + for sig_id in SIG_LABELS: + sig_dir = os.path.join(scheme_dir, sig_id) + # MultiDimFit grid scan + grid_pat = os.path.join(sig_dir, + "higgsCombine%s_%s.MultiDimFit.mH120.root" % (scheme, sig_id)) + sr = read_grid_sigma_r(grid_pat) + # AsymptoticLimits + al_pat = os.path.join(sig_dir, + "higgsCombine%s_%s.AsymptoticLimits.mH120.root" % (scheme, sig_id)) + al = read_asymptotic(al_pat) + results[scheme][sig_id] = {"sigma_r": sr, "al": al} + return results + + +def print_table(results, metric, title): + print("\n" + "="*80) + print(title) + print("="*80) + + sigs = list(SIG_LABELS.keys()) + schemes = [s for s in SCHEMES_ORDER if s in results] + + print("%-26s" % "Scheme", end="") + for s in sigs: + lbl = SIG_LABELS[s].split("(")[0].strip()[:18] + print(" %-18s" % lbl, end="") + print() + print("-" * (26 + 20 * len(sigs))) + + for scheme in schemes: + print("%-26s" % SCHEME_LABELS.get(scheme, scheme), end="") + for sig in sigs: + d = results[scheme].get(sig, {}) + if metric == "sigma_r": + sr = d.get("sigma_r") + val = "%6.4f" % sr if sr is not None else " -- " + else: + al = d.get("al") + val = "%6.3f" % al if al is not None else " -- " + print(" %-18s" % val, end="") + print() + + +def main(): + results = collect() + if not results: + print("No results found in %s" % OUT_BASE) + sys.exit(1) + + print_table(results, "sigma_r", + "sigma_r (68% CI half-width on r, Asimov injection r=1, stat-only)") + print_table(results, "exp_ul", + "Expected 95% CL upper limit on r (stat-only)") + + +if __name__ == "__main__": + main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.jdl b/MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.jdl new file mode 100644 index 000000000..da26099e5 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.jdl @@ -0,0 +1,14 @@ +universe = vanilla +executable = /uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648/src/JMTucker/MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.sh +output = /uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648/src/JMTucker/MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.out +error = /uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648/src/JMTucker/MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.err +log = /uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648/src/JMTucker/MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.log +request_cpus = 1 +request_memory = 4000MB +request_disk = 5000000 ++DesiredOS = "EL9" ++SingularityBind = "/uscms/home,/uscms_data" +should_transfer_files = YES +when_to_transfer_output = ON_EXIT +transfer_output_files = "" +queue 1 diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.out b/MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.out new file mode 100644 index 000000000..aaeefbf91 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.out @@ -0,0 +1,4 @@ +[FERMIHTC-APPTAINER]: INFO -- ApptainerImage classAd detected +[FERMIHTC-APPTAINER]: INFO -- Attempting to run job in /cvmfs/singularity.opensciencegrid.org/cmssw/cms:rhel9 +[FERMIHTC-APPTAINER]: INFO -- Running /cvmfs/oasis.opensciencegrid.org/mis/apptainer/current/bin/apptainer exec --pid --ipc --contain --bind /cvmfs --bind /etc/hosts --bind /etc/grid-security --home /storage/local/data1/condor/execute/dir_3071396:/srv --pwd /srv /cvmfs/singularity.opensciencegrid.org/cmssw/cms:rhel9 ./condor_binning_study.sh +====== Step 1: Generate datacards (el7 container) ====== diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.sh b/MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.sh new file mode 100755 index 000000000..30b0966d4 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.sh @@ -0,0 +1,34 @@ +#!/bin/bash +# Condor payload: generate datacards, strip systs, run combine, collect results. +# Runs on el9 batch node; el7 step uses the cmssw-cc7 apptainer wrapper. +# All I/O goes to NFS (/uscms/home mounted via SingularityBind in JDL). + +set -e +HERE="/uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648/src/JMTucker/MFVNeutralino/test/ForLimits/BinningStudy" +NEW_SCHEMES="3bin_split 3bin_split_v2 3bin_412 2bin_split 4bin_split" +CMSSW14_SRC="/uscms/home/gdecastr/nobackup/work/CMSSW_14_1_0_pre4/src" + +echo "====== Step 1: Generate datacards (el7 container) ======" +/cvmfs/cms.cern.ch/common/cmssw-cc7 -- bash -c " + source /cvmfs/cms.cern.ch/cmsset_default.sh + cd /uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648 + eval \$(scramv1 runtime -sh) 2>/dev/null + cd src/JMTucker/MFVNeutralino/test/ForLimits/BinningStudy + python generate_variants_el7.py ${NEW_SCHEMES} +" + +echo "====== Step 2: Strip systematics ======" +python3 "${HERE}/strip_systs.py" + +echo "====== Step 3: Run combine (CMSSW_14_1_0_pre4) ======" +source /cvmfs/cms.cern.ch/cmsset_default.sh +cd "${CMSSW14_SRC}" +eval $(scramv1 runtime -sh) 2>/dev/null +cd "${HERE}" +bash run_combine_study.sh ${NEW_SCHEMES} + +echo "====== Step 4: Collect results ======" +source /cvmfs/sft.cern.ch/lcg/views/dev3/latest/x86_64-el9-gcc13-opt/setup.sh 2>/dev/null || true +python3 "${HERE}/collect_results.py" | tee "${HERE}/results_new_schemes.txt" + +echo "====== Done ======" diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/discovery_combine_scan.py b/MFVNeutralino/test/ForLimits/BinningStudy/discovery_combine_scan.py new file mode 100644 index 000000000..16d7ce0f7 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/BinningStudy/discovery_combine_scan.py @@ -0,0 +1,183 @@ +""" +Combine-based expected discovery significance scan. + +For each (signal, x), builds a single-bin [x, 4.0] datacard with + bkg = B_tail(x), sig = S_tail(x) +and runs: + combine -M Significance -t -1 --expectSignal 1 +to get Z_exp: the expected significance if the signal is present at r=1. + +This is the proper discovery-power metric — it combines signal efficiency +and background suppression into one number via the profile likelihood Asimov. + +Usage (from CMSSW environment with combine in PATH): + python3 discovery_combine_scan.py +""" +import os, sys, subprocess, tempfile, shutil, re +import numpy as np + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from binning_schemes import YEARS +from fast_study_datacards import (BKG_FILES, N2V, get_sig_files, parse_ref_yield) + +HERE = os.path.dirname(os.path.abspath(__file__)) +SCAN_VALS = [round(i * 0.1, 1) for i in range(5, 40)] # 0.5..3.9 + +PLOT_SIGS = [ + ("ggHToSSTodddd_tau1mm_M55", "bjet", "forestgreen", r"ggH $\tau$=1mm $M$=55"), + ("ggHToSSTodddd_tau1mm_M40", "bjet", "limegreen", r"ggH $\tau$=1mm $M$=40"), + ("VH_tau1mm_M55", "lep", "royalblue", r"VH $\tau$=1mm $M$=55"), + ("VH_tau10mm_M55", "lep", "tomato", r"VH $\tau$=10mm $M$=55"), +] + + +def get_bkg_tail(ch, x): + import ROOT + f = ROOT.TFile(BKG_FILES[ch]) + h = f.Get("h_c1v_sumdbv_w_errorbars") + total = h.Integral() + scale = sum(N2V[ch]) / total + nbins = h.GetNbinsX() + tail = 0.0 + for i in range(1, nbins + 2): + if h.GetBinLowEdge(i) >= x: + tail += h.GetBinContent(i) * scale + f.Close() + return tail + + +def get_sig_tail(sig_id, ch, x): + """Returns (s_tail, n_mc_above). n_mc_above=0 means unusable.""" + import ROOT + counts_above = 0.0 + counts_total = 0.0 + for year in YEARS: + for fn in get_sig_files(sig_id, ch, year): + f = ROOT.TFile(fn) + t = f.Get("mfvMiniTree/t") + counts_above += max(t.Draw("sumdbv", "nvtx>=2 && sumdbv>=%f" % x, "goff"), 0) + counts_total += max(t.Draw("sumdbv", "nvtx>=2", "goff"), 0) + f.Close() + if counts_total == 0: + return 0.0, 0 + total_yield = sum(parse_ref_yield(sig_id, ch, yr) for yr in YEARS) + s_tail = total_yield * (counts_above / counts_total) + return s_tail, int(counts_above) + + +def make_datacard(path, b_tail, s_tail): + """Stat-only single-bin datacard. Observation is -1: Asimov used by combine -t -1.""" + with open(path, "w") as f: + f.write("imax 1\njmax 1\nkmax 0\n") + f.write("-" * 40 + "\n") + f.write("bin tail\n") + f.write("observation -1\n") + f.write("-" * 40 + "\n") + f.write("bin tail tail\n") + f.write("process sig bkg\n") + f.write("process 0 1\n") + f.write("rate %.8g %.8g\n" % (s_tail, b_tail)) + + +def run_significance(dc_path, workdir): + """Run combine -M Significance on Asimov (s+b) with r=1, return Z_exp or None.""" + tag = os.path.splitext(os.path.basename(dc_path))[0] + cmd = ["combine", "-M", "Significance", "-t", "-1", "--expectSignal", "1", + "-n", tag, dc_path] + try: + r = subprocess.run(cmd, capture_output=True, text=True, + cwd=workdir, timeout=60) + for line in r.stdout.splitlines(): + m = re.search(r"Significance:\s+([\d.eE+\-nan]+)", line) + if m: + val = m.group(1) + return float(val) if val != "nan" else None + except Exception: + pass + return None + + + +def main(): + if shutil.which("combine") is None: + print("ERROR: combine not in PATH — source CMSSW environment first.") + sys.exit(1) + + try: + import ROOT + ROOT.gROOT.SetBatch(True) + ROOT.gErrorIgnoreLevel = ROOT.kError + except ImportError: + print("ERROR: ROOT not available"); sys.exit(1) + + import matplotlib + matplotlib.use("Agg") + import matplotlib.pyplot as plt + + xs = SCAN_VALS + workdir = tempfile.mkdtemp(prefix="disc_comb_") + print("Tempdir:", workdir) + + print("Computing background tails...") + bkg = {ch: [get_bkg_tail(ch, x) for x in xs] for ch in ("bjet", "lep")} + + # --- Combine expected significance scan --- + combine_results = {} # sig_id -> list of (x, Z_exp) + for sig_id, ch, color, label in PLOT_SIGS: + print("\n%s (%s)..." % (sig_id, ch)) + pts = [] + for x, b in zip(xs, bkg[ch]): + s_tail, n_mc = get_sig_tail(sig_id, ch, x) + if n_mc < 1 or s_tail <= 0: + pts.append((x, None)) + continue + dc = os.path.join(workdir, "dc_%s_%03d.txt" % (sig_id.replace("_","")[:12], round(x*10))) + make_datacard(dc, b, s_tail) + z = run_significance(dc, workdir) + print(" x=%.1f B=%.3e S=%.4f Z_exp=%s" % ( + x, b, s_tail, "%.2f" % z if z is not None else "fail")) + pts.append((x, z)) + combine_results[sig_id] = pts + + # --- plot --- + fig, axes = plt.subplots(1, 2, figsize=(14, 6)) + + for ax, ch, title in [ + (axes[0], "bjet", "Bjet channel"), + (axes[1], "lep", "Lepton channel"), + ]: + ch_sigs = [(sid, c, col, lab) for sid, c, col, lab in PLOT_SIGS if c == ch] + + for sig_id, _, color, label in ch_sigs: + pts = combine_results[sig_id] + vx = [x for x, z in pts if z is not None] + vz = [z for _, z in pts if z is not None] + if vz: + ax.plot(vx, vz, "o-", color=color, lw=1.8, ms=4, label=label) + + ax.axhline(3.0, color="gray", ls="--", lw=1.2, label=r"3$\sigma$") + ax.axhline(5.0, color="black", ls="--", lw=1.2, label=r"5$\sigma$") + + ax.set_xlabel("4th boundary x (cm)", fontsize=11) + ax.set_ylabel(r"Expected $Z_{\rm exp}$ (sigma, Asimov $r$=1)", fontsize=10) + ax.set_title(title, fontsize=12) + ax.set_ylim(0, 12) + ax.set_xticks(xs[::2]) + ax.set_xticklabels(["%.1f" % v for v in xs[::2]], fontsize=8) + ax.legend(fontsize=9, loc="upper right", framealpha=0.85) + ax.grid(alpha=0.3) + + fig.suptitle(r"Expected discovery significance vs 4th boundary x in [0, 0.1, 0.4, $x$, 4.0] cm (single tail bin, stat-only)", + fontsize=11) + fig.tight_layout() + + for ext in ("pdf", "png"): + out = os.path.join(HERE, "discovery_combine_scan.%s" % ext) + fig.savefig(out, bbox_inches="tight", dpi=150) + print("Saved:", out) + + shutil.rmtree(workdir) + + +if __name__ == "__main__": + main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/discovery_scan.py b/MFVNeutralino/test/ForLimits/BinningStudy/discovery_scan.py new file mode 100644 index 000000000..068753565 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/BinningStudy/discovery_scan.py @@ -0,0 +1,179 @@ +""" +Discovery boundary scan: [0, 0.1, 0.4, x, 4.0] + +For each x, computes: + - B_tail(x): integrated background in [x, 4.0] from the Run2 template + - S_tail(x): absolute expected signal events in [x, 4.0] at r=1 + +B_tail(x) is the p-value for observing >= 1 event given background-only. +Z = sqrt(2) * erfinv(1 - 2*B_tail) is the equivalent sigma. +S_tail(x) = total_run2_yield * (counts_above_x / counts_total) from MiniTree TTrees. + +Usage: + python3 discovery_scan.py # runs and plots (LCG dev3) +""" +import os, sys +import numpy as np + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from binning_schemes import SIGNAL_POINTS, YEARS +from fast_study_datacards import (BKG_FILES, MINI_BASE, N2V, YEAR_IDX, + VH_PROCS, get_sig_files, get_sig_shape, + parse_ref_yield) + +HERE = os.path.dirname(os.path.abspath(__file__)) + +SCAN_VALS = [round(i * 0.1, 1) for i in range(5, 40)] # 0.5..3.9 +UPPER = 4.0 + +# Signals to show — pick representative ones from each channel +PLOT_SIGS = [ + ("ggHToSSTodddd_tau1mm_M55", "bjet", "forestgreen", r"ggH $\tau$=1mm $M$=55"), + ("ggHToSSTodddd_tau1mm_M40", "bjet", "limegreen", r"ggH $\tau$=1mm $M$=40"), + ("VH_tau1mm_M55", "lep", "royalblue", r"VH $\tau$=1mm $M$=55"), + ("VH_tau10mm_M55", "lep", "tomato", r"VH $\tau$=10mm $M$=55"), +] + + +def get_bkg_tail(ch, x): + """Integrated Run2 background in [x, 4.0] from the 200-bin template.""" + import ROOT + f = ROOT.TFile(BKG_FILES[ch]) + h = f.Get("h_c1v_sumdbv_w_errorbars") + total = h.Integral() + n2v_run2 = sum(N2V[ch]) + scale = n2v_run2 / total + nbins = h.GetNbinsX() + tail = 0.0 + for i in range(1, nbins + 2): # +2 to include overflow + if h.GetBinLowEdge(i) >= x: + tail += h.GetBinContent(i) * scale + f.Close() + return tail + + +def get_sig_fraction(sig_id, ch, x): + """Fraction of Run2 signal events with sumdbv >= x (from MiniTree TTrees).""" + import ROOT + counts_above = 0.0 + counts_total = 0.0 + for year in YEARS: + files = get_sig_files(sig_id, ch, year) + for fn in files: + f = ROOT.TFile(fn) + t = f.Get("mfvMiniTree/t") + n_above = t.Draw("sumdbv", "nvtx>=2 && sumdbv>=%f" % x, "goff") + n_total = t.Draw("sumdbv", "nvtx>=2", "goff") + counts_above += max(n_above, 0) + counts_total += max(n_total, 0) + f.Close() + if counts_total == 0: + return None + return counts_above / counts_total + + +def get_total_sig_yield(sig_id, ch): + """Total Run2 expected signal yield at r=1, summed over all years.""" + total = 0.0 + for year in YEARS: + try: + total += parse_ref_yield(sig_id, ch, year) + except (FileNotFoundError, RuntimeError): + pass + return total + + +def main(): + try: + import ROOT + ROOT.gROOT.SetBatch(True) + ROOT.gErrorIgnoreLevel = ROOT.kError + except ImportError: + print("ERROR: ROOT not available"); sys.exit(1) + + import matplotlib + matplotlib.use("Agg") + import matplotlib.pyplot as plt + from scipy.special import erfinv + + xs = SCAN_VALS + + # --- compute background tails --- + print("Computing background tails...") + bkg = {} + for ch in ("bjet", "lep"): + bkg[ch] = [get_bkg_tail(ch, x) for x in xs] + print(" %s done" % ch) + + # --- compute absolute signal yields in tail --- + print("Computing signal tails...") + sig_yields = {} + for sig_id, ch, color, label in PLOT_SIGS: + print(" %s..." % sig_id) + total_yield = get_total_sig_yield(sig_id, ch) + print(" Run2 total yield = %.4f" % total_yield) + fracs = [get_sig_fraction(sig_id, ch, x) for x in xs] + sig_yields[sig_id] = [total_yield * f if f is not None else None for f in fracs] + + # --- plot --- + fig, axes = plt.subplots(1, 2, figsize=(14, 6)) + + for ax, ch, title, ch_sigs in [ + (axes[0], "bjet", "Bjet channel", [s for s in PLOT_SIGS if s[1]=="bjet"]), + (axes[1], "lep", "Lepton channel", [s for s in PLOT_SIGS if s[1]=="lep"]), + ]: + ax2 = ax.twinx() + + # background tail (left axis, log scale) + ax.semilogy(xs, bkg[ch], "k-", lw=2.5, label="Bkg tail B(x,4)") + ax.axhline(1.35e-3, color="gray", ls="--", lw=1.2, label=r"3$\sigma$ threshold") + ax.axhline(2.87e-7, color="black", ls="--", lw=1.2, label=r"5$\sigma$ threshold") + + # mark where background crosses 1e-3 + for i in range(len(xs)-1): + if bkg[ch][i] >= 1e-3 > bkg[ch][i+1]: + ax.axvline(xs[i+1], color="orange", ls=":", lw=1.5, + label="B < 1e-3 @ %.1f cm" % xs[i+1]) + break + + ax.set_ylabel("Background in [x, 4.0] cm (= p-value for 1 obs. event)", fontsize=10) + ax.set_ylim(1e-8, 1.0) + + # absolute signal yields (right axis, log scale) + ax2.axhline(1.0, color="dimgray", ls=":", lw=1.2, label="1 event") + for sig_id, _, color, label in ch_sigs: + yvals = sig_yields.get(sig_id, []) + valid_x = [x for x, y in zip(xs, yvals) if y is not None and y > 0] + valid_y = [y for y in yvals if y is not None and y > 0] + if valid_y: + ax2.semilogy(valid_x, valid_y, "o--", color=color, lw=1.5, ms=4, + label=label + " (sig. events)") + + ax2.set_ylabel("Expected signal events in [x, 4.0] (r=1)", fontsize=10) + ax2.set_ylim(1e-4, 1e2) + ax2.yaxis.set_tick_params(labelsize=9) + + ax.set_xlabel("4th boundary x (cm)", fontsize=11) + ax.set_title(title, fontsize=12) + ax.set_xticks(xs[::2]) + ax.set_xticklabels(["%.1f" % v for v in xs[::2]], fontsize=8) + + # combined legend + lines1, labs1 = ax.get_legend_handles_labels() + lines2, labs2 = ax2.get_legend_handles_labels() + ax.legend(lines1 + lines2, labs1 + labs2, fontsize=8, framealpha=0.85, + loc="upper right") + ax.grid(alpha=0.3) + + fig.suptitle(r"Discovery scan — background tail & expected signal events vs 4th boundary x in [0, 0.1, 0.4, $x$, 4.0] cm", + fontsize=11) + fig.tight_layout() + + for ext in ("pdf", "png"): + out = os.path.join(HERE, "discovery_scan.%s" % ext) + fig.savefig(out, bbox_inches="tight", dpi=150) + print("Saved:", out) + + +if __name__ == "__main__": + main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/fast_study_datacards.py b/MFVNeutralino/test/ForLimits/BinningStudy/fast_study_datacards.py new file mode 100644 index 000000000..5804a2fe0 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/BinningStudy/fast_study_datacards.py @@ -0,0 +1,219 @@ +""" +Fast datacard generator for binning study schemes. + +Instead of re-running makeLimitsInputROOT.py (processes all 120+ signals), +this reads only the 6 study signals: + - Background: rebin 200-bin BackgroundTemplates histogram to new boundaries + - Signal shape: fill histogram from MiniTree TTree (sumdbv, nvtx>=2) + - Signal normalization: read from existing 3bin_nom stat-only datacards + +Requires: PyROOT (source LCG dev3 or cmsenv with ROOT) + +Usage: + python3 fast_study_datacards.py # all new schemes + python3 fast_study_datacards.py 3bin_split 3bin_412 +""" +from __future__ import print_function +import os, sys, re, glob +import numpy as np + +try: + import ROOT + ROOT.gROOT.SetBatch(True) +except ImportError: + print("ERROR: ROOT not available. Source LCG dev3 or cmsenv.") + sys.exit(1) + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from binning_schemes import SCHEMES, SIGNAL_POINTS, YEARS + +# --------------------------------------------------------------------------- +HERE = os.path.dirname(os.path.abspath(__file__)) +FORLIM = os.path.dirname(HERE) + +BKG_FILES = { + "lep": os.path.join(FORLIM, "BackgroundTemplates/lep/2v_from_jets_run2_5track_default_ULV30Lepm.root"), + "bjet": os.path.join(FORLIM, "BackgroundTemplates/bjet/2v_from_jets_run2_5track_default_ULV30BvetoLHTm.root"), +} + +MINI_BASE = { + "lep": "/uscms/home/gdecastr/nobackup/crabdirs/MiniTree_tag001Lepm_VH", + "bjet": "/uscms/home/gdecastr/nobackup/crabdirs/MiniTree_tag001BvetoLHTm_bjet", +} + +N2V = { + "lep": [0.001, 0.012, 0.002, 0.034], + "bjet": [0.258, 0.062, 0.078, 0.122], +} +YEAR_IDX = {y: i for i, y in enumerate(YEARS)} + +# VH: sum of 4 production modes (dddd final state only) +VH_PROCS = ["ZHToSSTodddd", "WminusHToSSTodddd", "WplusHToSSTodddd", "ggZHToSSTodddd"] + +# Ref scheme to borrow signal normalization from +REF_SCHEME = "3bin_nom" + + +# Main Datacards/ directory (fall back for signals not yet in BinningStudy/datacards/) +MAIN_DATACARDS = os.path.join(FORLIM, "Datacards") + + +# --------------------------------------------------------------------------- +def parse_ref_yield(sig_id, ch, year): + """Sum of per-bin signal rates from a reference datacard. + + Tries BinningStudy/datacards/3bin_nom first (stat-only), then falls back + to the main ForLimits/Datacards/ directory (full systematics — only the + rate line is read so systematics don't matter here). + """ + candidates = [ + os.path.join(HERE, "datacards", REF_SCHEME, ch, + "Datacard_%s_%s_%s_statonly.txt" % (ch, sig_id, year)), + os.path.join(MAIN_DATACARDS, ch, + "Datacard_%s_%s_%s.txt" % (ch, sig_id, year)), + ] + for dc in candidates: + if not os.path.exists(dc): + continue + for line in open(dc): + if line.startswith("rate"): + vals = list(map(float, line.split()[1:])) + nbins_ref = len(vals) // 2 + return sum(vals[:nbins_ref]) + raise RuntimeError("No rate line in %s" % dc) + raise FileNotFoundError("No ref datacard found for %s/%s/%s" % (sig_id, ch, year)) + + +def get_bkg_yields(ch, year, bins): + """Rebin the 200-bin background histogram to `bins`, return per-bin yields.""" + f = ROOT.TFile.Open(BKG_FILES[ch]) + h200 = f.Get("h_c1v_sumdbv_w_errorbars") + h200.SetDirectory(0) + f.Close() + nbins = len(bins) - 1 + arr = np.array(bins, dtype=np.float64) + h = h200.Rebin(nbins, "bkg_tmp", arr) + # last bin absorbs overflow (sumdbv > 4 is negligible but keep consistent) + last = h.GetBinContent(nbins) + h.GetBinContent(nbins + 1) + h.SetBinContent(nbins, last) + total = h.Integral() + scale = N2V[ch][YEAR_IDX[year]] / total if total > 0 else 0.0 + # floor at 1e-9 to avoid combine segfault on zero-background bins + return [max(h.GetBinContent(i+1) * scale, 1e-9) for i in range(nbins)] + + +def get_sig_files(sig_id, ch, year): + """Return list of minitree paths for this signal.""" + base = MINI_BASE[ch] + if sig_id.startswith("VH_"): + # Decode tau/mass from sig_id: VH_tau1mm_M55 → tau1mm, M55 + m = re.match(r"VH_(tau\S+)_(M\d+)$", sig_id) + tau, mass = m.group(1), m.group(2) + paths = [] + for proc in VH_PROCS: + p = os.path.join(base, "condor_%s_%s_%s_%s" % (proc, tau, mass, year), "minitree_0.root") + if os.path.exists(p): + paths.append(p) + return paths + else: + p = os.path.join(base, "condor_%s_%s" % (sig_id, year), "minitree_0.root") + return [p] if os.path.exists(p) else [] + + +def get_sig_shape(files, bins): + """Fill sumdbv histogram (nvtx>=2) from list of ROOT files, normalize to 1.""" + nbins = len(bins) - 1 + counts = np.zeros(nbins) + edges = np.array(bins) + for fn in files: + f = ROOT.TFile(fn) + t = f.Get("mfvMiniTree/t") + n = t.Draw("sumdbv", "1.0*(nvtx>=2)", "goff") + if n > 0: + vals = np.frombuffer(t.GetV1(), dtype=np.float64, count=n).copy() + c, _ = np.histogram(vals, bins=edges) + counts += c + f.Close() + total = counts.sum() + return counts / total if total > 0 else counts + + +def write_datacard(path, ch, sig_id, year, sig_yields, bkg_yields): + nbins = len(sig_yields) + yr_tag = {"20161": "2016pre", "20162": "2016post", "2017": "2017", "2018": "2018"}.get(year, year) + bin_names = " ".join("b%s%d" % (year, i) for i in range(nbins)) + sig_proc = "sig%s" % year + bkg_proc = "bkg%s" % yr_tag + + sig_rate = " ".join("%.10g" % v for v in sig_yields) + bkg_rate = " ".join("%.10g" % v for v in bkg_yields) + + obs_line = " ".join("0" for _ in range(nbins)) + + with open(path, "w") as fh: + fh.write("imax %d\n" % nbins) + fh.write("jmax 1\n") + fh.write("kmax 0 number of nuisance parameters\n") + fh.write("________\n") + fh.write("bin %s\n" % bin_names) + fh.write("observation %s\n" % obs_line) + fh.write("________\n") + fh.write("bin %s %s\n" % (bin_names, bin_names)) + fh.write("process %s %s\n" % ( + " ".join([sig_proc] * nbins), + " ".join([bkg_proc] * nbins))) + fh.write("process %s %s\n" % ( + " ".join(["0"] * nbins), + " ".join(["1"] * nbins))) + fh.write("rate %s %s\n" % (sig_rate, bkg_rate)) + + +def run_scheme(scheme_name, scheme_info): + is_split = "lep_bins" in scheme_info + + for sig_id, ch in SIGNAL_POINTS: + if is_split: + bins = scheme_info["%s_bins" % ch] + else: + bins = scheme_info["bins"] + nbins = len(bins) - 1 + + dc_dir = os.path.join(HERE, "datacards", scheme_name, ch) + if not os.path.exists(dc_dir): + os.makedirs(dc_dir) + + for year in YEARS: + dc_path = os.path.join(dc_dir, "Datacard_%s_%s_%s_statonly.txt" % (ch, sig_id, year)) + + try: + ref_yield = parse_ref_yield(sig_id, ch, year) + except (FileNotFoundError, RuntimeError) as e: + print(" SKIP %s/%s/%s: %s" % (scheme_name, sig_id, year, e)) + continue + + files = get_sig_files(sig_id, ch, year) + if not files: + print(" SKIP %s/%s/%s: no MiniTree files" % (scheme_name, sig_id, year)) + continue + + shape = get_sig_shape(files, bins) + sig_ylds = [s * ref_yield for s in shape] + bkg_ylds = get_bkg_yields(ch, year, bins) + + write_datacard(dc_path, ch, sig_id, year, sig_ylds, bkg_ylds) + print(" wrote %s" % os.path.relpath(dc_path, HERE)) + + +def main(): + schemes_to_run = sys.argv[1:] if len(sys.argv) > 1 else sorted(SCHEMES.keys()) + for name in schemes_to_run: + if name not in SCHEMES: + print("Unknown scheme:", name) + continue + print("\n=== Scheme:", name, "===") + run_scheme(name, SCHEMES[name]) + print("\nDone.") + + +if __name__ == "__main__": + main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/fast_study_datacards_systs.py b/MFVNeutralino/test/ForLimits/BinningStudy/fast_study_datacards_systs.py new file mode 100644 index 000000000..86e8f4c13 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/BinningStudy/fast_study_datacards_systs.py @@ -0,0 +1,253 @@ +""" +Generate with-systematics datacards for a subset of binning schemes, +by porting nuisances from the original 3bin_nom full-pipeline cards. + +Supports schemes: 3bin_nom, 3bin_v1, 3bin_412 (add others as needed). + +Nuisance porting rules: + lnN uniform (lumi, vtx_reco, calo_ineff, disp_trig): copy as-is, repeat for new nbins. + lnN bin-dependent (pileup, tk_reco_eff): assign original bin whose range most + overlaps the new bin (conservative approximation — these are small systematics). + gmN (signal MC stats): recompute N from unweighted TTree counts per new bin; + coefficient = ref_yield / total_MC_count (constant across bins). + +Usage: + source LCG dev3 or cmsenv + python3 fast_study_datacards_systs.py # all three schemes + python3 fast_study_datacards_systs.py 3bin_nom # single scheme +""" +from __future__ import print_function +import os, sys, re +import numpy as np + +try: + import ROOT + ROOT.gROOT.SetBatch(True) +except ImportError: + print("ERROR: ROOT not available"); sys.exit(1) + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from binning_schemes import SCHEMES, SIGNAL_POINTS, YEARS +from fast_study_datacards import ( + get_bkg_yields, get_sig_files, parse_ref_yield, YEAR_IDX +) + +HERE = os.path.dirname(os.path.abspath(__file__)) +FORLIM = os.path.dirname(HERE) +ORIG_DC = os.path.join(FORLIM, "Datacards") # full-syst nominal cards +NOM_BINS = SCHEMES["3bin_nom"]["bins"] + +SCHEMES_WITH_SYSTS = ["3bin_nom", "3bin_v1", "3bin_412"] + + +# --------------------------------------------------------------------------- + +def get_sig_counts(files, bins): + """Return (counts_per_bin, total) — unweighted, for gmN computation.""" + nbins = len(bins) - 1 + counts = np.zeros(nbins) + edges = np.array(bins) + for fn in files: + f = ROOT.TFile(fn) + t = f.Get("mfvMiniTree/t") + n = t.Draw("sumdbv", "1.0*(nvtx>=2)", "goff") + if n > 0: + vals = np.frombuffer(t.GetV1(), dtype=np.float64, count=n).copy() + c, _ = np.histogram(vals, bins=edges) + counts += c + f.Close() + return counts, counts.sum() + + +def _orig_bin_for(new_lo, new_hi, orig_bins): + """Return the index of the original bin that most overlaps [new_lo, new_hi].""" + best_k, best_overlap = 0, 0.0 + for k in range(len(orig_bins) - 1): + lo_k, hi_k = orig_bins[k], orig_bins[k + 1] + overlap = max(0.0, min(new_hi, hi_k) - max(new_lo, lo_k)) + if overlap > best_overlap: + best_overlap, best_k = overlap, k + return best_k + + +def parse_original_nuisances(dc_path): + """Parse a full-syst datacard, return (nbins, nuisance_lines_raw).""" + nbins = None + nuisance_lines = [] + for line in open(dc_path): + line = line.rstrip() + if line.startswith("imax"): + nbins = int(line.split()[1]) + if (line.startswith("CMS_") or line.startswith("lumi_")) and len(line) > 5: + nuisance_lines.append(line) + return nbins, nuisance_lines + + +def port_nuisances(nuisance_lines, orig_nbins, orig_bins, new_nbins, new_bins, + new_sig_counts, total_mc, ref_yield): + """ + Convert original nuisance lines to new binning. + Returns list of (name, type, sig_vals_list, bkg_dashes_list, extra) + where extra = gmN_N for gmN, None for lnN. + """ + ported = [] + for line in nuisance_lines: + parts = line.split() + if len(parts) < 2 + 2 * orig_nbins: + continue + name = parts[0] + ntype = parts[1] + + if ntype == "lnN": + sig_orig = parts[2 : 2 + orig_nbins] + # check if any value is not '-' + active = [v for v in sig_orig if v != "-"] + if not active: + continue + + # check if uniform + uniform = len(set(active)) == 1 + + new_sig_vals = [] + for j in range(new_nbins): + if uniform: + new_sig_vals.append(active[0]) + else: + k = _orig_bin_for(new_bins[j], new_bins[j + 1], orig_bins) + new_sig_vals.append(sig_orig[k]) + + ported.append((name, "lnN", new_sig_vals, None)) + + elif ntype == "gmN": + # original gmN: one nuisance controls one bin + # find which original bin is controlled + coeffs = parts[3 : 3 + orig_nbins] + try: + active_orig_bin = next(i for i, c in enumerate(coeffs) if c != "-") + except StopIteration: + continue + + # Emit one gmN nuisance per new bin + coeff = ref_yield / total_mc if total_mc > 0 else 0.0 + for j in range(new_nbins): + n_j = int(new_sig_counts[j]) + nname = re.sub(r"b\d+$", "nb%d" % j, name) + ported.append((nname, "gmN", j, n_j, coeff)) + + # deduplicate gmN entries (we'll get one set per original gmN line; keep first) + seen_gmN = set() + deduped = [] + for entry in ported: + if entry[1] == "gmN": + key = entry[2] # new bin index + if key in seen_gmN: + continue + seen_gmN.add(key) + deduped.append(entry) + return deduped + + +def write_datacard_with_systs(path, ch, sig_id, year, sig_yields, bkg_yields, + new_bins, nuisances): + nbins = len(sig_yields) + yr_tag = {"20161":"2016pre","20162":"2016post","2017":"2017","2018":"2018"}.get(year,year) + bin_names = " ".join("b%s%d" % (year, i) for i in range(nbins)) + sig_proc = "sig%s" % year + bkg_proc = "bkg%s" % yr_tag + obs = " ".join("0" for _ in range(nbins)) + sig_rate = " ".join("%.10g" % v for v in sig_yields) + bkg_rate = " ".join("%.10g" % max(v, 1e-9) for v in bkg_yields) + + kmax = len([e for e in nuisances if e[1] == "lnN"]) + nbins # lnN + gmN per bin + + with open(path, "w") as fh: + fh.write("imax %d\n" % nbins) + fh.write("jmax 1\n") + fh.write("kmax %d\n" % kmax) + fh.write("________\n") + fh.write("bin %s\n" % bin_names) + fh.write("observation %s\n" % obs) + fh.write("________\n") + fh.write("bin %s %s\n" % (bin_names, bin_names)) + fh.write("process %s %s\n" % ( + " ".join([sig_proc] * nbins), " ".join([bkg_proc] * nbins))) + fh.write("process %s %s\n" % ( + " ".join(["0"] * nbins), " ".join(["1"] * nbins))) + fh.write("rate %s %s\n" % (sig_rate, bkg_rate)) + fh.write("________\n\n") + + gmN_written = set() + for entry in nuisances: + if entry[1] == "lnN": + name, _, sig_vals, _ = entry + dashes = " ".join(["-"] * nbins) + fh.write("%-50s lnN %s %s\n" % ( + name, " ".join(sig_vals), dashes)) + elif entry[1] == "gmN": + name, _, j, N_j, coeff = entry + if j in gmN_written: + continue + gmN_written.add(j) + sig_cols = [" -"] * nbins + sig_cols[j] = " %.10g" % coeff + bkg_cols = ["-"] * nbins + fh.write("%-50s gmN %d %s %s\n" % ( + name, N_j, " ".join(sig_cols), " ".join(bkg_cols))) + + +def run_scheme_systs(scheme_name, bins): + nbins = len(bins) - 1 + orig_bins = NOM_BINS + + for sig_id, ch in SIGNAL_POINTS: + dc_dir = os.path.join(HERE, "datacards_systs", scheme_name, ch) + os.makedirs(dc_dir, exist_ok=True) + + for year in YEARS: + dc_path = os.path.join(dc_dir, + "Datacard_%s_%s_%s_withsysts.txt" % (ch, sig_id, year)) + + orig_dc = os.path.join(ORIG_DC, ch, + "Datacard_%s_%s_%s.txt" % (ch, sig_id, year)) + if not os.path.exists(orig_dc): + print(" SKIP (no orig card): %s/%s/%s" % (scheme_name, sig_id, year)) + continue + + try: + ref_yield = parse_ref_yield(sig_id, ch, year) + except Exception as e: + print(" SKIP: %s" % e) + continue + + files = get_sig_files(sig_id, ch, year) + if not files: + print(" SKIP (no MiniTree): %s/%s/%s" % (scheme_name, sig_id, year)) + continue + + sig_counts, total_mc = get_sig_counts(files, bins) + shape = sig_counts / total_mc if total_mc > 0 else sig_counts + sig_ylds = [float(s * ref_yield) for s in shape] + bkg_ylds = get_bkg_yields(ch, year, bins) + + orig_nbins, nuis_lines = parse_original_nuisances(orig_dc) + nuisances = port_nuisances( + nuis_lines, orig_nbins, orig_bins, nbins, bins, + sig_counts, total_mc, ref_yield) + + write_datacard_with_systs( + dc_path, ch, sig_id, year, sig_ylds, bkg_ylds, bins, nuisances) + print(" wrote %s" % os.path.relpath(dc_path, HERE)) + + +def main(): + targets = sys.argv[1:] if len(sys.argv) > 1 else SCHEMES_WITH_SYSTS + for name in targets: + if name not in SCHEMES: + print("Unknown scheme:", name); continue + print("\n=== Scheme:", name, "===") + run_scheme_systs(name, SCHEMES[name]["bins"]) + print("\nDone.") + + +if __name__ == "__main__": + main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/generate_variants_el7.py b/MFVNeutralino/test/ForLimits/BinningStudy/generate_variants_el7.py new file mode 100644 index 000000000..1a1b85d24 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/BinningStudy/generate_variants_el7.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Run inside el7 apptainer + CMSSW_10_6_48 cmsenv. +# For each binning scheme: backs up limits_config.yaml, writes a modified +# version redirecting outputs to BinningStudy/, runs makeLimitsInputROOT.py, +# then restores the original yaml (even on error). +from __future__ import print_function +import os, sys, shutil, subprocess + +try: + import yaml +except ImportError: + print("ERROR: yaml not available - run inside CMSSW cmsenv.") + sys.exit(1) + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from binning_schemes import SCHEMES + +HERE = os.path.dirname(os.path.abspath(__file__)) +FORLIM = os.path.dirname(HERE) +YAML = os.path.join(FORLIM, "limits_config.yaml") +YAML_BAK = YAML + ".study_backup" + +YEARS = ["20161", "20162", "2017", "2018"] +CHANNELS = ["lep", "bjet"] + + +def is_split(scheme_info): + return "lep_bins" in scheme_info + + +def _write_yaml(scheme_name, bins, nbins, channels): + """Write limits_config.yaml for given bins/nbins, for specified channels only.""" + with open(YAML_BAK) as f: + cfg = yaml.safe_load(f) + cfg["bins"] = bins + cfg["nbins"] = nbins + cfg["observations"] = {yr: [0]*nbins for yr in YEARS} + root_base = os.path.join(HERE, "root_output", scheme_name) + dc_base = os.path.join(HERE, "datacards", scheme_name) + for ch in channels: + for d in [os.path.join(root_base, ch), os.path.join(dc_base, ch)]: + if not os.path.exists(d): + os.makedirs(d) + cfg["root_output"][ch]["folder"] = os.path.join(root_base, ch) + "/" + cfg["datacard_output"][ch]["folder"] = os.path.join(dc_base, ch) + "/" + with open(YAML, "w") as f: + yaml.safe_dump(cfg, f, default_flow_style=False) + + +def write_study_yaml(scheme_name, scheme_info): + _write_yaml(scheme_name, scheme_info["bins"], scheme_info["nbins"], CHANNELS) + + +def restore_yaml(): + if os.path.exists(YAML_BAK): + shutil.copy2(YAML_BAK, YAML) + os.remove(YAML_BAK) + + +def run_pipeline(scheme_name, channels=None): + script = os.path.join(FORLIM, "makeLimitsInputROOT.py") + for ch in (channels or CHANNELS): + cmd = [sys.executable, script, "--year", "all", "--channel", ch] + print("\n>>> %s" % " ".join(cmd)) + ret = subprocess.call(cmd, cwd=FORLIM) + if ret != 0: + print("WARNING: exit %d for %s %s" % (ret, scheme_name, ch)) + + +def main(): + schemes_to_run = sys.argv[1:] if len(sys.argv) > 1 else sorted(SCHEMES.keys()) + + for name in schemes_to_run: + if name not in SCHEMES: + print("Unknown scheme:", name); continue + + info = SCHEMES[name] + print("\n" + "="*60) + print("SCHEME:", name) + print("="*60) + + shutil.copy2(YAML, YAML_BAK) + try: + if is_split(info): + # Run each channel separately with its own boundaries + _write_yaml(name, info["lep_bins"], info["lep_nbins"], ["lep"]) + run_pipeline(name, ["lep"]) + _write_yaml(name, info["bjet_bins"], info["bjet_nbins"], ["bjet"]) + run_pipeline(name, ["bjet"]) + else: + write_study_yaml(name, info) + run_pipeline(name) + finally: + restore_yaml() + print("Restored limits_config.yaml for scheme: %s" % name) + + print("\nAll schemes done. Nominal limits_config.yaml and Datacards/ untouched.") + + +if __name__ == "__main__": + main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/hybridnew_validation.py b/MFVNeutralino/test/ForLimits/BinningStudy/hybridnew_validation.py new file mode 100644 index 000000000..16d2fb671 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/BinningStudy/hybridnew_validation.py @@ -0,0 +1,385 @@ +""" +HybridNew scheme comparison + validation. + +Produces two plots: + 1. hybridnew_schemes.pdf — same format as scheme_comparison.pdf but HybridNew limits + (all 18 named schemes, 9 signals) + 2. hybridnew_validation.pdf — HybridNew vs Asymptotic side-by-side for 5 key schemes + +Uses the same condor pattern as submitCombine.py: + - text2workspace.py run on submit node (needs cmsenv) + - combine binary shipped via combine_env.tar.gz + - CMSSW 14.1.0 from CVMFS on worker + +Usage: + source cmsenv first, then: + python3 hybridnew_validation.py submit # build workspaces + submit condor jobs + python3 hybridnew_validation.py check # count finished jobs + python3 hybridnew_validation.py collect # make plots (needs LCG dev3) +""" +import os, sys, subprocess, glob +import numpy as np + +HERE = os.path.dirname(os.path.abspath(__file__)) +OUTBASE = os.path.join(HERE, "combine_output") +CONDDIR = os.path.join(HERE, "condor_hybridnew") + +COMBINE_TARBALL = os.environ.get( + "COMBINE_TARBALL", + "/uscms_data/d3/gdecastr/work/combine_env.tar.gz", +) +CVMFS_CMSSW14 = "/cvmfs/cms.cern.ch/el9_amd64_gcc12/cms/cmssw/CMSSW_14_1_0/src" + +NTOYS = 20000 # --fork 2 → 20000 effective toys, ~3x noise reduction vs 2000 +SEED = 1234 # fixed seed → predictable output filename + +# All 18 named comparison schemes (same order as scheme_comparison.pdf) +ALL_SCHEMES = [ + "old_binning", "2bin", "3bin_nom", "3bin_v1", "3bin_v2", "3bin_v3", "3bin_v4", + "4bin_v1", "4bin_v2", "3bin_412", + "4bin_412_25", "3bin_420", "4bin_nom_30", "4bin_516_30", "3bin_520", + "3bin_104", "4bin_104_200", "4bin_104_250", +] + +# 5 key schemes for the HybridNew vs Asymptotic validation plot +VALIDATION_SCHEMES = ["2bin", "old_binning", "3bin_nom", "3bin_104", "4bin_104_200"] + +SHORT_LABELS = { + "old_binning": "[0,.08,.16,4]", + "2bin": "[0,1.6,4]", + "3bin_nom": "[0,.8,1.6,4]", + "3bin_v1": "[0,.4,1.6,4]", + "3bin_v2": "[0,.8,2.5,4]", + "3bin_v3": "[0,1,2,4]", + "3bin_v4": "[0,.5,1,4]", + "4bin_v1": "[0,.4,.8,\n1.6,4]", + "4bin_v2": "[0,.8,1.2,\n1.6,4]", + "3bin_412": "[0,.4,1.2,4]", + "4bin_412_25": "[0,.4,1.2,\n2.5,4]", + "3bin_420": "[0,.4,2,4]", + "4bin_nom_30": "[0,.8,1.6,\n3,4]", + "4bin_516_30": "[0,.5,1.6,\n3,4]", + "3bin_520": "[0,.5,2,4]", + "3bin_104": "[0,.1,.4,4]", + "4bin_104_200": "[0,.1,.4,\n2,4]", + "4bin_104_250": "[0,.1,.4,\n2.5,4]", +} + +SIG_SHORT = { + "VH_tau1mm_M55": "VH τ=1mm M=55 (lep)", + "VH_tau10mm_M55": "VH τ=10mm M=55 (lep)", + "VH_tau1mm_M40": "VH τ=1mm M=40 (lep)", + "VH_tau1mm_M15": "VH τ=1mm M=15 (lep)", + "ggHToSSTodddd_tau1mm_M55": "ggH τ=1mm M=55 (bjet)", + "ggHToSSTodddd_tau1mm_M40": "ggH τ=1mm M=40 (bjet)", + "mfv_stopdbardbar_tau001000um_M0200": "stop τ=1mm M=200 (bjet)", + "mfv_stopdbardbar_tau000300um_M0400": "stop τ=0.3mm M=400 (bjet)", + "mfv_neu_tau001000um_M0400": "neu τ=1mm M=400 (bjet)", +} + +# Color scheme matching scheme_comparison.pdf +NOM_COLOR = "#222222" +NBINS_COLOR = {2: "#88CCEE", 3: "#DDCC77", 4: "#CC6677"} +NBINS = { + "old_binning": 3, "2bin": 2, "3bin_nom": 3, "3bin_v1": 3, "3bin_v2": 3, + "3bin_v3": 3, "3bin_v4": 3, "4bin_v1": 4, "4bin_v2": 4, "3bin_412": 3, + "4bin_412_25": 4, "3bin_420": 3, "4bin_nom_30": 4, "4bin_516_30": 4, + "3bin_520": 3, "3bin_104": 3, "4bin_104_200": 4, "4bin_104_250": 4, +} + +def scheme_color(s): + if s == "3bin_nom": + return NOM_COLOR + return NBINS_COLOR.get(NBINS.get(s, 3), "#999999") + + +def get_jobs(schemes=None): + """Return list of (scheme, sig_id, datacard_path).""" + if schemes is None: + schemes = ALL_SCHEMES + jobs = [] + for scheme in schemes: + scheme_dir = os.path.join(OUTBASE, scheme) + if not os.path.isdir(scheme_dir): + continue + for sig_dir in sorted(os.listdir(scheme_dir)): + dc = os.path.join(scheme_dir, sig_dir, "combined_%s.txt" % sig_dir) + if os.path.exists(dc): + jobs.append((scheme, sig_dir, dc)) + return jobs + + +def hybridnew_outfile(tag): + return "higgsCombine%s.HybridNew.mH120.%d.root" % (tag, SEED) + + +def submit(): + import shutil + os.makedirs(CONDDIR, exist_ok=True) + + if not os.path.exists(COMBINE_TARBALL): + print("ERROR: combine tarball not found: %s" % COMBINE_TARBALL) + sys.exit(1) + if not shutil.which("text2workspace.py"): + print("ERROR: text2workspace.py not in PATH — source cmsenv first") + sys.exit(1) + + jobs = get_jobs() + print("Found %d jobs across %d schemes" % (len(jobs), len(ALL_SCHEMES))) + + n_submitted = 0 + n_skipped = 0 + for scheme, sig_id, dc_path in jobs: + tag = "%s_%s" % (scheme, sig_id) + work_dir = os.path.dirname(dc_path) + out_root = os.path.join(work_dir, hybridnew_outfile(tag)) + + # Skip if output already exists + if os.path.exists(out_root): + n_skipped += 1 + continue + + job_dir = os.path.join(CONDDIR, tag) + os.makedirs(job_dir, exist_ok=True) + + # Pre-convert datacard to workspace on submit node + ws = os.path.join(work_dir, "workspace_%s.root" % tag) + if not os.path.exists(ws): + ret = subprocess.call( + "text2workspace.py %s -m 125 -o %s" % (dc_path, ws), shell=True) + if ret != 0: + print("WARNING: text2workspace.py failed for %s -- skipping" % tag) + continue + + sh = os.path.join(job_dir, "run.sh") + with open(sh, "w") as f: + f.write("#!/bin/bash\nset -e\n") + f.write("source /cvmfs/cms.cern.ch/cmsset_default.sh\n") + f.write("cd %s\n" % CVMFS_CMSSW14) + f.write("eval $(scramv1 runtime -sh)\n") + f.write("cd /srv\n") + f.write("tar xf combine_env.tar.gz\n") + f.write("export PATH=/srv/combine_env/bin:$PATH\n") + f.write("export LD_LIBRARY_PATH=/srv/combine_env/lib:$LD_LIBRARY_PATH\n") + f.write("echo '=== HybridNew: %s ==='\n" % tag) + f.write("combine -M HybridNew --frequentist --testStat LHC \\\n") + f.write(" -T %d --fork 2 -t -1 -s %d \\\n" % (NTOYS, SEED)) + f.write(" --name %s \\\n" % tag) + f.write(" workspace_%s.root -v 0\n" % tag) + f.write("echo '=== Done: %s ==='\n" % tag) + os.chmod(sh, 0o755) + + jdl = os.path.join(job_dir, "submit.jdl") + with open(jdl, "w") as f: + f.write("universe = vanilla\n") + f.write("executable = %s\n" % sh) + f.write("initialdir = %s\n" % work_dir) + f.write("output = %s/job.out\n" % job_dir) + f.write("error = %s/job.err\n" % job_dir) + f.write("log = %s/job.log\n" % job_dir) + f.write("request_cpus = 2\n") + f.write("request_memory = 3000MB\n") + f.write('+DesiredOS = "EL9"\n') + f.write("should_transfer_files = YES\n") + f.write("when_to_transfer_output = ON_EXIT\n") + f.write("transfer_input_files = %s,%s\n" % (COMBINE_TARBALL, ws)) + f.write("transfer_output_files = %s\n" % hybridnew_outfile(tag)) + f.write("queue 1\n") + + ret = subprocess.call("condor_submit " + jdl, shell=True) + if ret == 0: + n_submitted += 1 + else: + print("WARNING: condor_submit failed for %s" % tag) + + print("\n%d submitted, %d already done (skipped)" % (n_submitted, n_skipped)) + + +def check(): + subprocess.call("condor_q", shell=True) + jobs = get_jobs() + done, missing = 0, [] + for scheme, sig_id, dc_path in jobs: + tag = "%s_%s" % (scheme, sig_id) + root = os.path.join(os.path.dirname(dc_path), hybridnew_outfile(tag)) + if os.path.exists(root): + done += 1 + else: + missing.append("%s/%s" % (scheme, sig_id)) + print("\n%d / %d jobs have output" % (done, len(jobs))) + if missing: + print("Missing:", missing[:10], "..." if len(missing) > 10 else "") + + +def read_hybridnew(scheme, sig_id, dc_path): + """Read HybridNew expected limit. Returns float or None.""" + import ROOT + tag = "%s_%s" % (scheme, sig_id) + root = os.path.join(os.path.dirname(dc_path), hybridnew_outfile(tag)) + if not os.path.exists(root): + files = glob.glob(os.path.join(os.path.dirname(dc_path), + "higgsCombine%s.HybridNew.mH120.*.root" % tag)) + if not files: + return None + root = files[0] + f = ROOT.TFile(root) + t = f.Get("limit") + if not t or t.GetEntries() == 0: + f.Close() + return None + t.GetEntry(0) + val = float(t.limit) + f.Close() + return val + + +def read_asymptotic(scheme, sig_id, dc_path): + """Read Asymptotic median expected limit. Returns float or None.""" + import ROOT + root = os.path.join(os.path.dirname(dc_path), + "higgsCombine%s_%s.AsymptoticLimits.mH120.root" % (scheme, sig_id)) + if not os.path.exists(root): + return None + f = ROOT.TFile(root) + t = f.Get("limit") + if not t: + f.Close() + return None + for _ in t: + if abs(t.quantileExpected - 0.5) < 0.01: + val = float(t.limit) + f.Close() + return val + f.Close() + return None + + +def collect(): + import matplotlib + matplotlib.use("Agg") + import matplotlib.pyplot as plt + import matplotlib.patches as mpatches + + try: + import ROOT + ROOT.gROOT.SetBatch(True) + ROOT.gErrorIgnoreLevel = ROOT.kError + except ImportError: + print("ERROR: ROOT not available"); sys.exit(1) + + jobs = get_jobs() + all_jobs = get_jobs(ALL_SCHEMES) + sig_ids = sorted(set(s for _, s, _ in all_jobs)) + + # Build lookup: scheme -> sig_id -> (hyb, asy) + data = {s: {} for s in ALL_SCHEMES} + for scheme, sig_id, dc_path in all_jobs: + h = read_hybridnew(scheme, sig_id, dc_path) + a = read_asymptotic(scheme, sig_id, dc_path) + data[scheme][sig_id] = (h, a) + if h is not None and a is not None: + print(" %-20s %-40s Asymp=%.3f HybNew=%.3f ratio=%.3f" % ( + scheme, sig_id, a, h, h/a)) + + # ------------------------------------------------------------------ # + # Plot 1: HybridNew scheme comparison — same style as scheme_comparison.pdf + # ------------------------------------------------------------------ # + schemes_present = [s for s in ALL_SCHEMES + if any(data[s].get(si, (None,))[0] is not None for si in sig_ids)] + xs = np.arange(len(schemes_present)) + colors = [scheme_color(s) for s in schemes_present] + + fig1, axes1 = plt.subplots(3, 3, figsize=(18, 13)) + axes1 = axes1.flatten() + + for ax, sig_id in zip(axes1, sig_ids): + nom_val = data.get("3bin_nom", {}).get(sig_id, (None,))[0] + for i, (s, c) in enumerate(zip(schemes_present, colors)): + v = data[s].get(sig_id, (None,))[0] + if v is None: + continue + ax.bar(i, v, color=c, alpha=0.90, width=0.75, + linewidth=1.5 if s == "3bin_nom" else 0.5, + edgecolor="black") + if nom_val is not None: + ax.axhline(nom_val, color="black", linestyle="--", linewidth=1.0, alpha=0.6) + + ax.set_title(SIG_SHORT.get(sig_id, sig_id), fontsize=10) + ax.set_ylabel("Exp. 95% CL UL on r", fontsize=8) + ax.set_xticks(xs) + ax.set_xticklabels([SHORT_LABELS.get(s, s) for s in schemes_present], + fontsize=6.5, rotation=30, ha="right") + ax.yaxis.set_tick_params(labelsize=8) + vals = [data[s].get(sig_id, (None,))[0] for s in schemes_present] + vals = [v for v in vals if v is not None] + if vals: + ax.set_ylim(min(vals) * 0.88, max(vals) * 1.12) + ax.grid(axis="y", alpha=0.3) + + legend_handles = [ + mpatches.Patch(color=NOM_COLOR, label="Nominal [0,0.8,1.6,4]"), + mpatches.Patch(color="#88CCEE", label="2-bin"), + mpatches.Patch(color="#DDCC77", label="3-bin alternatives"), + mpatches.Patch(color="#CC6677", label="4-bin alternatives"), + ] + fig1.legend(handles=legend_handles, loc="upper center", ncol=4, + fontsize=9, bbox_to_anchor=(0.5, 1.01)) + fig1.suptitle("Expected 95%% CL UL on r — HybridNew scheme comparison (frequentist, T=%d\xd72, Asimov)" % NTOYS, + fontsize=11, y=1.04) + fig1.tight_layout() + for ext in ("pdf", "png"): + out = os.path.join(HERE, "hybridnew_schemes.%s" % ext) + fig1.savefig(out, bbox_inches="tight", dpi=150) + print("Saved:", out) + plt.close(fig1) + + # ------------------------------------------------------------------ # + # Plot 2: HybridNew vs Asymptotic for 5 key validation schemes # + # ------------------------------------------------------------------ # + val_schemes_present = [s for s in VALIDATION_SCHEMES + if any(data[s].get(si, (None,))[0] is not None for si in sig_ids)] + val_xs = np.arange(len(val_schemes_present)) + + fig2, axes2 = plt.subplots(3, 3, figsize=(16, 12)) + axes2 = axes2.flatten() + + for ax, sig_id in zip(axes2, sig_ids): + asy_vals = [data[s].get(sig_id, (None, None))[1] for s in val_schemes_present] + hyb_vals = [data[s].get(sig_id, (None, None))[0] for s in val_schemes_present] + + for i, (a, h) in enumerate(zip(asy_vals, hyb_vals)): + if a is not None: + ax.bar(i - 0.2, a, 0.35, color="#4477AA", alpha=0.8, + label="Asymptotic" if i == 0 else "") + if h is not None: + ax.bar(i + 0.2, h, 0.35, color="#EE6677", alpha=0.8, + label="HybridNew" if i == 0 else "") + + ax.set_title(SIG_SHORT.get(sig_id, sig_id), fontsize=9) + ax.set_ylabel("Exp. 95% CL UL on r", fontsize=8) + ax.set_xticks(val_xs) + ax.set_xticklabels([SHORT_LABELS.get(s, s) for s in val_schemes_present], + fontsize=8, rotation=15, ha="right") + ax.legend(fontsize=7) + ax.grid(axis="y", alpha=0.3) + + fig2.suptitle("AsymptoticLimits vs HybridNew (-t -1, T=%d\xd72) — key schemes" % NTOYS, + fontsize=11) + fig2.tight_layout() + for ext in ("pdf", "png"): + out = os.path.join(HERE, "hybridnew_validation.%s" % ext) + fig2.savefig(out, bbox_inches="tight", dpi=150) + print("Saved:", out) + plt.close(fig2) + + +if __name__ == "__main__": + cmd = sys.argv[1] if len(sys.argv) > 1 else "help" + if cmd == "submit": + submit() + elif cmd == "collect": + collect() + elif cmd == "check": + check() + else: + print(__doc__) diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/plot_background_templates.py b/MFVNeutralino/test/ForLimits/BinningStudy/plot_background_templates.py new file mode 100644 index 000000000..ae5a73419 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/BinningStudy/plot_background_templates.py @@ -0,0 +1,191 @@ +# Background and signal shapes in sumdbv, yield-normalized. +# Background: h_c1v_sumdbv_w_errorbars scaled to Run2 n2v (expected background events). +# Signal: weighted by XS x lumi x eff (weight branch), summed over all years. +# Requires PyROOT (LCG dev3 or cmsenv). + +import os, glob +import ROOT +ROOT.gROOT.SetBatch(True) +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import numpy as np + +HERE = os.path.dirname(os.path.abspath(__file__)) +FORLIM = os.path.dirname(HERE) +BKG_BASE = os.path.join(FORLIM, "BackgroundTemplates") + +LEP_MINI = "/uscms/home/gdecastr/nobackup/crabdirs/MiniTree_tag001Lepm_VH" +BJET_MINI = "/uscms/home/gdecastr/nobackup/crabdirs/MiniTree_tag001BvetoLHTm_bjet" + +NOMINAL_EDGES = [0.0, 0.8, 1.6, 4.0] +YEARS = ["20161", "20162", "2017", "2018"] +REBIN = 8 # 200 -> 25 bins, width 0.16 cm +NBINS_DISP = 25 +XMAX = 4.0 + +# Run2 total expected background (sum over years), from sig_and_bkg_configs.py +N2V_RUN2 = { + "bjet": 0.258 + 0.062 + 0.078 + 0.122, # = 0.520 + "lep": 0.001 + 0.012 + 0.002 + 0.034, # = 0.049 +} + + +def get_fine_bkg(channel, tag): + """Rebin background histogram and scale to Run2 n2v yield. + Returns (edges, counts) where counts are in expected events per display bin.""" + path = os.path.join(BKG_BASE, channel, + "2v_from_jets_run2_5track_default_%s.root" % tag) + f = ROOT.TFile(path) + h = f.Get("h_c1v_sumdbv_w_errorbars") + h.SetDirectory(0) + h_rb = h.Rebin(REBIN) + nb = h_rb.GetNbinsX() + edges = np.array([h_rb.GetBinLowEdge(i+1) for i in range(nb)] + + [h_rb.GetBinLowEdge(nb+1)]) + contents = np.array([h_rb.GetBinContent(i+1) for i in range(nb)]) + f.Close() + total = contents.sum() + if total > 0: + contents = contents / total * N2V_RUN2[channel] + return edges, contents + + +def get_fine_sig_shape(mini_dirs_by_year): + """Fill sumdbv histogram (unweighted, nvtx>=2 selection). + Returns (edges, counts_normalized) normalized to unit area — shape only.""" + edges = np.linspace(0.0, XMAX, NBINS_DISP + 1) + counts = np.zeros(NBINS_DISP) + for pattern in mini_dirs_by_year: + for fn in glob.glob(pattern): + f = ROOT.TFile(fn) + t = f.Get("mfvMiniTree/t") + n = t.Draw("sumdbv", "1.0*(nvtx>=2)", "goff") + if n > 0: + vals = np.frombuffer(t.GetV1(), dtype=np.float64, count=n).copy() + c, _ = np.histogram(vals, bins=edges) + counts += c + f.Close() + bin_w = edges[1] - edges[0] + total = (counts * bin_w).sum() + if total > 0: + counts = counts / total + return edges, counts + + +def get_sig_run2_yield(sig_id, ch): + """Sum expected signal events across all 4 years from 3bin_nom stat-only datacards.""" + total = 0.0 + for year in YEARS: + dc = os.path.join(HERE, "datacards", "3bin_nom", ch, + "Datacard_%s_%s_%s_statonly.txt" % (ch, sig_id, year)) + if not os.path.exists(dc): + continue + for line in open(dc): + if line.startswith("rate"): + vals = list(map(float, line.split()[1:])) + nbins = len(vals) // 2 + total += sum(vals[:nbins]) + break + return total + + +def plot_channel(ax, channel, tag, signals, title): + # signals: list of (label, color, glob_patterns, sig_id) + edges, bkg = get_fine_bkg(channel, tag) + + # Pre-compute signal yields for y_ceil + sig_counts = [] + for label, color, patterns, sig_id in signals: + _, shape = get_fine_sig_shape(patterns) + run2_yield = get_sig_run2_yield(sig_id, channel) + bin_w = edges[1] - edges[0] + counts = shape * run2_yield * bin_w # events per display bin + sig_counts.append((label, color, counts)) + + nonzero = bkg[bkg > 0] + y_floor = nonzero.min() * 0.10 if len(nonzero) else 1e-6 + y_ceil = max(bkg.max(), max(c.max() for _, _, c in sig_counts)) * 5.0 + + bkg_disp = np.where(bkg > 0, bkg, y_floor) + ax.fill_between(edges[:-1], bkg_disp, y2=y_floor, + step="post", alpha=0.20, color="#444444") + ax.step(edges[:-1], bkg_disp, where="post", + color="#222222", lw=1.8, label="Background") + + for label, color, counts in sig_counts: + sig_disp = np.where(counts > 0, counts, y_floor) + ax.step(edges[:-1], sig_disp, where="post", color=color, lw=2.2, label=label) + + for edge in NOMINAL_EDGES[1:-1]: + ax.axvline(edge, color="black", lw=1.8, ls="--", zorder=5) + + nom_labels = [r"[0.0, 0.8)", r"[0.8, 1.6)", r"[1.6, $\infty$)"] + nom_ctrs = [0.4, 1.2, 2.8] + for ctr, lbl in zip(nom_ctrs, nom_labels): + ax.text(ctr / XMAX, 1.01, lbl, ha="center", va="bottom", + fontsize=9, color="black", transform=ax.transAxes) + + ax.set_yscale("log") + ax.set_xlim(0.0, XMAX) + ax.set_ylim(y_floor, y_ceil) + ax.set_xlabel(r"sumdbv (cm)", fontsize=12) + ax.set_ylabel(r"Expected events / 0.16 cm bin (Run 2)", fontsize=11) + ax.set_title(title, fontsize=13, pad=14) + ax.set_xticks([0.0, 0.4, 0.8, 1.2, 1.6, 2.0, 2.4, 2.8, 3.2, 3.6, 4.0]) + ax.tick_params(axis="both", labelsize=10) + ax.legend(fontsize=10, loc="upper right", framealpha=0.85) + + +def main(): + fig, axes = plt.subplots(1, 2, figsize=(14, 5.5)) + fig.suptitle("Nominal sumdbv bin boundaries", fontsize=13) + + def bjet_patterns(proc, tau, mass): + return ["%s/condor_%s_%s_%s_%s/minitree_0.root" % (BJET_MINI, proc, tau, mass, yr) + for yr in YEARS] + + VH_PROCS = ["ZHToSSTodddd", "WminusHToSSTodddd", "WplusHToSSTodddd", "ggZHToSSTodddd"] + + def lep_vh_patterns(tau, mass): + return ["%s/condor_%s_%s_%s_%s/minitree_0.root" % (LEP_MINI, proc, tau, mass, yr) + for proc in VH_PROCS for yr in YEARS] + + plot_channel( + axes[0], "bjet", "ULV30BvetoLHTm", + signals=[ + (r"$\tilde{g}\tilde{g}$, $\tau=1$ mm, $M=400$ GeV", + "royalblue", bjet_patterns("mfv_neu", "tau001000um", "M0400"), + "mfv_neu_tau001000um_M0400"), + (r"$\tilde{t}\tilde{t}^*$, $\tau=0.3$ mm, $M=400$ GeV", + "tomato", bjet_patterns("mfv_stopdbardbar", "tau000300um", "M0400"), + "mfv_stopdbardbar_tau000300um_M0400"), + (r"ggH $\to$ SS, $\tau=1$ mm, $m_S=55$ GeV", + "forestgreen", bjet_patterns("ggHToSSTodddd", "tau1mm", "M55"), + "ggHToSSTodddd_tau1mm_M55"), + ], + title="Bjet channel", + ) + + plot_channel( + axes[1], "lep", "ULV30Lepm", + signals=[ + (r"VH $\to$ SS, $\tau=1$ mm, $m_S=55$ GeV", + "royalblue", lep_vh_patterns("tau1mm", "M55"), + "VH_tau1mm_M55"), + (r"VH $\to$ SS, $\tau=10$ mm, $m_S=55$ GeV", + "tomato", lep_vh_patterns("tau10mm", "M55"), + "VH_tau10mm_M55"), + ], + title="Lepton channel", + ) + + plt.tight_layout() + for ext in ("pdf", "png"): + out = os.path.join(HERE, "background_templates.%s" % ext) + fig.savefig(out, bbox_inches="tight", dpi=150) + print("Saved:", out) + + +if __name__ == "__main__": + main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/plot_new_signals.py b/MFVNeutralino/test/ForLimits/BinningStudy/plot_new_signals.py new file mode 100644 index 000000000..21d01c952 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/BinningStudy/plot_new_signals.py @@ -0,0 +1,123 @@ +""" +Scheme comparison plot for the three new signal points added in round 2: + VH tau=1mm M=40 (lep), VH tau=1mm M=15 (lep), ggH tau=1mm M=40 (bjet) + +Usage: + source LCG dev3 setup + python3 plot_new_signals.py +Output: new_signals_comparison.pdf / .png +""" +import os, sys +import numpy as np +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import matplotlib.patches as mpatches + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from binning_schemes import SCHEMES +from collect_results import collect + +HERE = os.path.dirname(os.path.abspath(__file__)) + +SHORT_LABELS = { + "old_binning": "[0,.08,.16,4]", + "2bin": "[0,1.6,4]", + "3bin_nom": "[0,.8,1.6,4]", + "3bin_v1": "[0,.4,1.6,4]", + "3bin_v2": "[0,.8,2.5,4]", + "3bin_v3": "[0,1,2,4]", + "3bin_v4": "[0,.5,1,4]", + "4bin_v1": "[0,.4,.8,\n1.6,4]", + "4bin_v2": "[0,.8,1.2,\n1.6,4]", + "3bin_412": "[0,.4,1.2,4]", + "4bin_412_25": "[0,.4,1.2,\n2.5,4]", + "3bin_420": "[0,.4,2,4]", + "4bin_nom_30": "[0,.8,1.6,\n3,4]", + "4bin_516_30": "[0,.5,1.6,\n3,4]", + "3bin_520": "[0,.5,2,4]", + "3bin_104": "[0,.1,.4,4]", + "4bin_104_200": "[0,.1,.4,\n2,4]", + "4bin_104_250": "[0,.1,.4,\n2.5,4]", +} + +NEW_SIGS = [ + ("ggHToSSTodddd_tau1mm_M40", "ggH τ=1mm M=40 (bjet)"), + ("VH_tau1mm_M40", "VH τ=1mm M=40 (lep)"), + ("VH_tau1mm_M15", "VH τ=1mm M=15 (lep)"), +] + +ALL_SCHEMES = [ + "old_binning","2bin","3bin_nom","3bin_v1","3bin_v2","3bin_v3","3bin_v4", + "4bin_v1","4bin_v2","3bin_412", + "4bin_412_25","3bin_420","4bin_nom_30","4bin_516_30","3bin_520", + "3bin_104","4bin_104_200","4bin_104_250", +] + +NBINS_COLOR = {2: "#88CCEE", 3: "#DDCC77", 4: "#CC6677"} +NOM_COLOR = "#222222" + +def scheme_color(s): + if s == "3bin_nom": + return NOM_COLOR + nbins = SCHEMES[s].get("nbins", SCHEMES[s].get("bjet_nbins", 3)) + return NBINS_COLOR.get(nbins, "#999999") + + +def main(): + results = collect() + schemes = [s for s in ALL_SCHEMES if s in results] + xs = np.arange(len(schemes)) + colors = [scheme_color(s) for s in schemes] + + fig, axes = plt.subplots(1, 3, figsize=(18, 5)) + + for ax, (sig_id, title) in zip(axes, NEW_SIGS): + uls = [results.get(s, {}).get(sig_id, {}).get("al") for s in schemes] + nom_ul = results.get("3bin_nom", {}).get(sig_id, {}).get("al") + + for i, (x, ul, c) in enumerate(zip(xs, uls, colors)): + if ul is None: + continue + is_nom = (schemes[i] == "3bin_nom") + ax.bar(x, ul, color=c, alpha=0.90, width=0.75, + linewidth=1.5 if is_nom else 0.5, + edgecolor="black") + + if nom_ul is not None: + ax.axhline(nom_ul, color="black", linestyle="--", linewidth=1.0, alpha=0.6) + + ax.set_title(title, fontsize=11) + ax.set_ylabel("Exp. 95% CL UL on r", fontsize=9) + ax.set_xticks(xs) + ax.set_xticklabels([SHORT_LABELS.get(s, s) for s in schemes], + fontsize=6.5, rotation=30, ha="right") + ax.yaxis.set_tick_params(labelsize=9) + + vals = [v for v in uls if v is not None] + if vals: + ax.set_ylim(min(vals) * 0.88, max(vals) * 1.12) + + ax.grid(axis="y", alpha=0.3) + + legend_handles = [ + mpatches.Patch(color=NOM_COLOR, label="Nominal [0,0.8,1.6,4]"), + mpatches.Patch(color="#88CCEE", label="2-bin"), + mpatches.Patch(color="#DDCC77", label="3-bin alternatives"), + mpatches.Patch(color="#CC6677", label="4-bin alternatives"), + ] + fig.legend(handles=legend_handles, loc="upper center", ncol=4, + fontsize=9, bbox_to_anchor=(0.5, 1.02)) + + fig.suptitle("Expected 95% CL UL on r — new signal points (stat-only, Asimov)", + fontsize=11, y=1.06) + fig.tight_layout() + + for ext in ("pdf", "png"): + out = os.path.join(HERE, "new_signals_comparison.%s" % ext) + fig.savefig(out, bbox_inches="tight", dpi=150) + print("Saved:", out) + + +if __name__ == "__main__": + main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/plot_scheme_comparison.py b/MFVNeutralino/test/ForLimits/BinningStudy/plot_scheme_comparison.py new file mode 100644 index 000000000..8a723548d --- /dev/null +++ b/MFVNeutralino/test/ForLimits/BinningStudy/plot_scheme_comparison.py @@ -0,0 +1,144 @@ +""" +Plot expected 95% CL UL on r for each signal point, across all binning schemes. +One panel per signal. Nominal scheme highlighted with a dashed reference line. + +Usage: + source LCG dev3 setup + python3 plot_scheme_comparison.py +Output: scheme_comparison.pdf / .png +""" +import os, sys +import numpy as np +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import matplotlib.patches as mpatches + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from binning_schemes import SCHEMES +from collect_results import collect, SIG_LABELS + +HERE = os.path.dirname(os.path.abspath(__file__)) + +# Short scheme labels for the x-axis +SHORT_LABELS = { + "old_binning": "[0,.08,.16,4]", + "2bin": "[0,1.6,4]", + "3bin_nom": "[0,.8,1.6,4]", + "3bin_v1": "[0,.4,1.6,4]", + "3bin_v2": "[0,.8,2.5,4]", + "3bin_v3": "[0,1,2,4]", + "3bin_v4": "[0,.5,1,4]", + "4bin_v1": "[0,.4,.8,\n1.6,4]", + "4bin_v2": "[0,.8,1.2,\n1.6,4]", + "3bin_412": "[0,.4,1.2,4]", + "4bin_412_25": "[0,.4,1.2,\n2.5,4]", + "3bin_420": "[0,.4,2,4]", + "4bin_nom_30": "[0,.8,1.6,\n3,4]", + "4bin_516_30": "[0,.5,1.6,\n3,4]", + "3bin_520": "[0,.5,2,4]", + "3bin_104": "[0,.1,.4,4]", + "4bin_104_200": "[0,.1,.4,\n2,4]", + "4bin_104_250": "[0,.1,.4,\n2.5,4]", +} + +# Short signal labels for panel titles +SIG_SHORT = { + "VH_tau1mm_M55": "VH τ=1mm M=55 (lep)", + "VH_tau10mm_M55": "VH τ=10mm M=55 (lep)", + "VH_tau1mm_M40": "VH τ=1mm M=40 (lep)", + "VH_tau1mm_M15": "VH τ=1mm M=15 (lep)", + "ggHToSSTodddd_tau1mm_M55": "ggH τ=1mm M=55 (bjet)", + "ggHToSSTodddd_tau1mm_M40": "ggH τ=1mm M=40 (bjet)", + "mfv_stopdbardbar_tau001000um_M0200":"stop τ=1mm M=200 (bjet)", + "mfv_stopdbardbar_tau000300um_M0400":"stop τ=0.3mm M=400 (bjet)", + "mfv_neu_tau001000um_M0400": "neu τ=1mm M=400 (bjet)", +} + +ALL_SCHEMES = [ + "old_binning","2bin","3bin_nom","3bin_v1","3bin_v2","3bin_v3","3bin_v4", + "4bin_v1","4bin_v2","3bin_412", + "4bin_412_25","3bin_420","4bin_nom_30","4bin_516_30","3bin_520", + "3bin_104","4bin_104_200","4bin_104_250", +] + + +def main(): + results = collect() + + sigs = list(SIG_LABELS.keys()) + schemes = [s for s in ALL_SCHEMES if s in results] + xs = np.arange(len(schemes)) + + # Color by number of bins; nominal gets its own color + NBINS_COLOR = {2: "#88CCEE", 3: "#DDCC77", 4: "#CC6677"} + NOM_COLOR = "#222222" + def scheme_color(s): + if s == "3bin_nom": + return NOM_COLOR + nbins = SCHEMES[s].get("nbins", SCHEMES[s].get("bjet_nbins", 3)) + return NBINS_COLOR.get(nbins, "#999999") + colors = [scheme_color(s) for s in schemes] + + fig, axes = plt.subplots(3, 3, figsize=(18, 13)) + axes = axes.flatten() + + for ax, sig_id in zip(axes, sigs): + uls = [] + for s in schemes: + v = results.get(s, {}).get(sig_id, {}).get("al") + uls.append(v) + + nom_ul = results.get("3bin_nom", {}).get(sig_id, {}).get("al") + + # Bar chart + for i, (x, ul, c) in enumerate(zip(xs, uls, colors)): + if ul is None: + continue + is_nom = (schemes[i] == "3bin_nom") + ax.bar(x, ul, color=c, alpha=0.90, width=0.75, + linewidth=1.5 if is_nom else 0.5, + edgecolor="black") + + # Nominal reference line + if nom_ul is not None: + ax.axhline(nom_ul, color="black", linestyle="--", linewidth=1.0, alpha=0.6) + + ax.set_title(SIG_SHORT[sig_id], fontsize=10) + ax.set_ylabel("Exp. 95% CL UL on r", fontsize=8) + ax.set_xticks(xs) + ax.set_xticklabels([SHORT_LABELS.get(s, s) for s in schemes], + fontsize=6.5, rotation=30, ha="right") + ax.yaxis.set_tick_params(labelsize=8) + + # Y-range: just above the max bar, starting near zero + vals = [v for v in uls if v is not None] + if vals: + ymax = max(vals) * 1.12 + ymin = min(vals) * 0.88 + ax.set_ylim(ymin, ymax) + + ax.grid(axis="y", alpha=0.3) + + # Legend + legend_handles = [ + mpatches.Patch(color=NOM_COLOR, label="Nominal [0,0.8,1.6,4]"), + mpatches.Patch(color="#88CCEE", label="2-bin"), + mpatches.Patch(color="#DDCC77", label="3-bin alternatives"), + mpatches.Patch(color="#CC6677", label="4-bin alternatives"), + ] + fig.legend(handles=legend_handles, loc="upper center", ncol=4, + fontsize=9, bbox_to_anchor=(0.5, 1.01)) + + fig.suptitle("Expected 95% CL UL on r — binning scheme comparison (stat-only, Asimov)", + fontsize=11, y=1.04) + fig.tight_layout() + + for ext in ("pdf", "png"): + out = os.path.join(HERE, "scheme_comparison.%s" % ext) + fig.savefig(out, bbox_inches="tight", dpi=150) + print("Saved:", out) + + +if __name__ == "__main__": + main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/plot_syst_comparison.py b/MFVNeutralino/test/ForLimits/BinningStudy/plot_syst_comparison.py new file mode 100644 index 000000000..e85ef874f --- /dev/null +++ b/MFVNeutralino/test/ForLimits/BinningStudy/plot_syst_comparison.py @@ -0,0 +1,118 @@ +""" +Compare stat-only vs with-systematics expected UL for 3bin_nom, 3bin_v1, 3bin_412. +Bar chart: grouped pairs (stat-only, with-systs) per scheme per signal. +Output: syst_comparison.pdf / .png +""" +import os, sys +import numpy as np +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import matplotlib.patches as mpatches + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from collect_results import collect, SIG_LABELS + +HERE = os.path.dirname(os.path.abspath(__file__)) +OUT_SYST = os.path.join(HERE, "combine_output_systs") + +SCHEMES_SYST = ["3bin_nom", "3bin_v1", "3bin_412"] +SCHEME_LABELS = { + "3bin_nom": "nom\n[0,.8,1.6,4]", + "3bin_v1": "v1\n[0,.4,1.6,4]", + "3bin_412": "412\n[0,.4,1.2,4]", +} +SIG_SHORT = { + "VH_tau1mm_M55": "VH τ=1mm M=55 (lep)", + "VH_tau10mm_M55": "VH τ=10mm M=55 (lep)", + "ggHToSSTodddd_tau1mm_M55": "ggH τ=1mm M=55 (bjet)", + "mfv_stopdbardbar_tau001000um_M0200":"stop τ=1mm M=200 (bjet)", + "mfv_stopdbardbar_tau000300um_M0400":"stop τ=0.3mm M=400 (bjet)", + "mfv_neu_tau001000um_M0400": "neu τ=1mm M=400 (bjet)", +} + + +def collect_systs(): + try: + import ROOT + ROOT.gROOT.SetBatch(True) + except ImportError: + print("ERROR: ROOT not available"); sys.exit(1) + + results = {} + for scheme in SCHEMES_SYST: + results[scheme] = {} + for sig_id in SIG_LABELS: + work = os.path.join(OUT_SYST, scheme, sig_id) + if not os.path.isdir(work): + continue + pattern = "higgsCombinesysts_%s_%s.AsymptoticLimits" % (scheme, sig_id) + for fn in os.listdir(work): + if fn.startswith(pattern) and fn.endswith(".root"): + f = ROOT.TFile(os.path.join(work, fn)) + t = f.Get("limit") + for ev in t: + if abs(ev.quantileExpected - 0.5) < 0.01: + results[scheme][sig_id] = float(ev.limit) + break + f.Close() + break + return results + + +def main(): + stat_results = collect() # from collect_results.py + syst_results = collect_systs() + + sigs = list(SIG_LABELS.keys()) + schemes = SCHEMES_SYST + + fig, axes = plt.subplots(2, 3, figsize=(14, 8)) + axes = axes.flatten() + + bar_w = 0.35 + xs_stat = np.arange(len(schemes)) + xs_syst = xs_stat + bar_w + + for ax, sig_id in zip(axes, sigs): + stat_uls = [stat_results.get(s, {}).get(sig_id, {}).get("al") for s in schemes] + syst_uls = [syst_results.get(s, {}).get(sig_id) for s in schemes] + + for i, (xu, xs_, u_stat, u_syst) in enumerate( + zip(xs_stat, xs_syst, stat_uls, syst_uls)): + if u_stat is not None: + ax.bar(xu, u_stat, bar_w, color="#4477AA", alpha=0.85, + edgecolor="black", linewidth=0.5) + if u_syst is not None: + ax.bar(xs_, u_syst, bar_w, color="#CC6677", alpha=0.85, + edgecolor="black", linewidth=0.5) + + ax.set_title(SIG_SHORT[sig_id], fontsize=9) + ax.set_ylabel("Exp. 95% CL UL on r", fontsize=8) + ax.set_xticks(xs_stat + bar_w / 2) + ax.set_xticklabels([SCHEME_LABELS[s] for s in schemes], fontsize=9) + ax.yaxis.set_tick_params(labelsize=8) + ax.grid(axis="y", alpha=0.3) + + vals = [v for v in stat_uls + syst_uls if v is not None] + if vals: + ax.set_ylim(min(vals) * 0.85, max(vals) * 1.15) + + legend_handles = [ + mpatches.Patch(color="#4477AA", label="Stat-only"), + mpatches.Patch(color="#CC6677", label="With systematics"), + ] + fig.legend(handles=legend_handles, loc="upper center", ncol=2, + fontsize=10, bbox_to_anchor=(0.5, 1.01)) + fig.suptitle("Exp. 95% CL UL on r — stat-only vs with-systematics (Asimov)", + fontsize=11, y=1.04) + fig.tight_layout() + + for ext in ("pdf", "png"): + out = os.path.join(HERE, "syst_comparison.%s" % ext) + fig.savefig(out, bbox_inches="tight", dpi=150) + print("Saved:", out) + + +if __name__ == "__main__": + main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/run_combine_study.sh b/MFVNeutralino/test/ForLimits/BinningStudy/run_combine_study.sh new file mode 100755 index 000000000..41c40497a --- /dev/null +++ b/MFVNeutralino/test/ForLimits/BinningStudy/run_combine_study.sh @@ -0,0 +1,77 @@ +#!/bin/bash +# Run inside CMSSW_14_1_0_pre4 with cmsenv already sourced. +# For each scheme x signal point: combineCards + FitDiagnostics + AsymptoticLimits (stat-only datacards). +set -e + +HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +DATACARD_BASE="${HERE}/datacards" +OUT_BASE="${HERE}/combine_output" + +YEARS="20161 20162 2017 2018" + +declare -A SIG_CHANNEL +SIG_CHANNEL["VH_tau1mm_M55"]="lep" +SIG_CHANNEL["VH_tau10mm_M55"]="lep" +SIG_CHANNEL["VH_tau1mm_M40"]="lep" +SIG_CHANNEL["VH_tau1mm_M15"]="lep" +SIG_CHANNEL["ggHToSSTodddd_tau1mm_M55"]="bjet" +SIG_CHANNEL["ggHToSSTodddd_tau1mm_M40"]="bjet" +SIG_CHANNEL["mfv_stopdbardbar_tau001000um_M0200"]="bjet" +SIG_CHANNEL["mfv_stopdbardbar_tau000300um_M0400"]="bjet" +SIG_CHANNEL["mfv_neu_tau001000um_M0400"]="bjet" + +# Optional: pass scheme names as arguments to process only those schemes. +SCHEME_LIST="${@:-$(ls "${DATACARD_BASE}")}" + +for SCHEME in ${SCHEME_LIST}; do + echo "" + echo "===============================" + echo "SCHEME: ${SCHEME}" + echo "===============================" + + for SIG_ID in "${!SIG_CHANNEL[@]}"; do + CH="${SIG_CHANNEL[$SIG_ID]}" + WORK_DIR="${OUT_BASE}/${SCHEME}/${SIG_ID}" + mkdir -p "${WORK_DIR}" + cd "${WORK_DIR}" + + # Build card_args: one card per year, named _= + CARD_ARGS="" + MISSING=0 + for YR in ${YEARS}; do + CARD="${DATACARD_BASE}/${SCHEME}/${CH}/Datacard_${CH}_${SIG_ID}_${YR}_statonly.txt" + if [ ! -f "${CARD}" ]; then + echo " SKIP (missing card): ${CARD}" + MISSING=1 + break + fi + CARD_ARGS="${CARD_ARGS} ${CH}_${YR}=${CARD}" + done + [ "${MISSING}" -eq 1 ] && continue + + COMBINED="combined_${SIG_ID}.txt" + + echo " Combining: ${SIG_ID}" + combineCards.py ${CARD_ARGS} > "${COMBINED}" 2>/dev/null + + echo " MultiDimFit grid scan (signal injection r=1)" + combine -M MultiDimFit --algo grid \ + --name "${SCHEME}_${SIG_ID}" \ + "${COMBINED}" \ + -t -1 --expectSignal 1 \ + --rMin 0.5 --rMax 1.5 --points 200 \ + -v 0 2>/dev/null || echo " WARNING: MultiDimFit failed" + + echo " AsymptoticLimits (expectSignal=0)" + combine -M AsymptoticLimits \ + --name "${SCHEME}_${SIG_ID}" \ + "${COMBINED}" \ + --expectSignal 0 \ + -v 0 2>/dev/null || echo " WARNING: AsymptoticLimits failed" + + cd "${HERE}" + done +done + +echo "" +echo "Combine study complete." diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/run_full_study.sh b/MFVNeutralino/test/ForLimits/BinningStudy/run_full_study.sh new file mode 100755 index 000000000..d4739a07a --- /dev/null +++ b/MFVNeutralino/test/ForLimits/BinningStudy/run_full_study.sh @@ -0,0 +1,34 @@ +#!/bin/bash +# Sequential pipeline for the 5 new binning schemes. +# Run as: nohup bash run_full_study.sh > run_full_study.log 2>&1 & echo $! > run_full_study.pid +# Survives SSH disconnect. Check progress: tail -f run_full_study.log + +HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +NEW_SCHEMES="3bin_split 3bin_split_v2 3bin_412 2bin_split 4bin_split" + +echo "[$(date)] === Step 1: Generate datacards (el7 + CMSSW_10_6_48) ===" +/cvmfs/cms.cern.ch/common/cmssw-cc7 -- bash -c " + source /cvmfs/cms.cern.ch/cmsset_default.sh + cd /uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648 + eval \$(scramv1 runtime -sh) 2>/dev/null + cd src/JMTucker/MFVNeutralino/test/ForLimits/BinningStudy + python generate_variants_el7.py ${NEW_SCHEMES} +" +echo "[$(date)] Step 1 done (exit $?)" + +echo "[$(date)] === Step 2: Strip systematics ===" +python3 "${HERE}/strip_systs.py" +echo "[$(date)] Step 2 done" + +echo "[$(date)] === Step 3: Run combine (CMSSW_14_1_0_pre4) ===" +source /cvmfs/cms.cern.ch/cmsset_default.sh +cd /uscms/home/gdecastr/nobackup/work/CMSSW_14_1_0_pre4/src +eval $(scramv1 runtime -sh) 2>/dev/null +cd "${HERE}" +bash run_combine_study.sh ${NEW_SCHEMES} +echo "[$(date)] Step 3 done" + +echo "[$(date)] === Step 4: Collect results ===" +source /cvmfs/sft.cern.ch/lcg/views/dev3/latest/x86_64-el9-gcc13-opt/setup.sh 2>/dev/null || true +python3 "${HERE}/collect_results.py" | tee "${HERE}/results_new_schemes.txt" +echo "[$(date)] === All done ===" diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/run_systs_study.sh b/MFVNeutralino/test/ForLimits/BinningStudy/run_systs_study.sh new file mode 100644 index 000000000..e5ce9c0c7 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/BinningStudy/run_systs_study.sh @@ -0,0 +1,61 @@ +#!/bin/bash +# Run combine (AsymptoticLimits only) on with-systematics datacards. +# Source cmsenv before running. +set -e + +HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +DC_BASE="${HERE}/datacards_systs" +OUT_BASE="${HERE}/combine_output_systs" +YEARS="20161 20162 2017 2018" + +declare -A SIG_CHANNEL +SIG_CHANNEL["VH_tau1mm_M55"]="lep" +SIG_CHANNEL["VH_tau10mm_M55"]="lep" +SIG_CHANNEL["ggHToSSTodddd_tau1mm_M55"]="bjet" +SIG_CHANNEL["mfv_stopdbardbar_tau001000um_M0200"]="bjet" +SIG_CHANNEL["mfv_stopdbardbar_tau000300um_M0400"]="bjet" +SIG_CHANNEL["mfv_neu_tau001000um_M0400"]="bjet" + +SCHEME_LIST="${@:-$(ls "${DC_BASE}" 2>/dev/null)}" + +for SCHEME in ${SCHEME_LIST}; do + echo "" + echo "===============================" + echo "SCHEME (with systs): ${SCHEME}" + echo "===============================" + + for SIG_ID in "${!SIG_CHANNEL[@]}"; do + CH="${SIG_CHANNEL[$SIG_ID]}" + WORK_DIR="${OUT_BASE}/${SCHEME}/${SIG_ID}" + mkdir -p "${WORK_DIR}" + cd "${WORK_DIR}" + + CARD_ARGS="" + MISSING=0 + for YR in ${YEARS}; do + CARD="${DC_BASE}/${SCHEME}/${CH}/Datacard_${CH}_${SIG_ID}_${YR}_withsysts.txt" + if [ ! -f "${CARD}" ]; then + echo " SKIP (missing card): ${CARD}" + MISSING=1; break + fi + CARD_ARGS="${CARD_ARGS} ${CH}_${YR}=${CARD}" + done + [ "${MISSING}" -eq 1 ] && continue + + COMBINED="combined_systs_${SIG_ID}.txt" + echo " Combining: ${SIG_ID}" + combineCards.py ${CARD_ARGS} > "${COMBINED}" 2>/dev/null + + echo " AsymptoticLimits (with systs)" + combine -M AsymptoticLimits \ + --name "systs_${SCHEME}_${SIG_ID}" \ + "${COMBINED}" \ + --expectSignal 0 \ + -v 0 2>/dev/null || echo " WARNING: AsymptoticLimits failed" + + cd "${HERE}" + done +done + +echo "" +echo "Systs study complete." diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/strip_systs.py b/MFVNeutralino/test/ForLimits/BinningStudy/strip_systs.py new file mode 100644 index 000000000..5ccb9bb20 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/BinningStudy/strip_systs.py @@ -0,0 +1,59 @@ +# Strip nuisance lines from datacards; write _statonly.txt alongside each. +# Usage: python strip_systs.py [scheme1 scheme2 ...] (default: all schemes) +import os, sys, glob + +HERE = os.path.dirname(os.path.abspath(__file__)) + + +def strip_one(src_path, dst_path): + with open(src_path) as f: + lines = f.readlines() + + out = [] + past_rate = False + for line in lines: + stripped = line.strip() + if stripped.startswith("rate ") or stripped.startswith("rate\t"): + out.append(line) + past_rate = True + continue + if past_rate: + continue # drop all nuisance lines + # Fix kmax line to 0 (no nuisances) + if stripped.startswith("kmax"): + out.append("kmax 0 number of nuisance parameters\n") + else: + out.append(line) + + with open(dst_path, "w") as f: + f.writelines(out) + + +def strip_scheme(scheme_dir): + n = 0 + for ch in ("lep", "bjet"): + ch_dir = os.path.join(scheme_dir, ch) + if not os.path.isdir(ch_dir): + continue + for fn in glob.glob(os.path.join(ch_dir, "Datacard_*.txt")): + if fn.endswith("_statonly.txt"): + continue + dst = fn.replace(".txt", "_statonly.txt") + strip_one(fn, dst) + n += 1 + return n + + +def main(): + datacards_dir = os.path.join(HERE, "datacards") + schemes = sys.argv[1:] if len(sys.argv) > 1 else sorted(os.listdir(datacards_dir)) + for name in schemes: + d = os.path.join(datacards_dir, name) + if not os.path.isdir(d): + continue + n = strip_scheme(d) + print("%-12s stripped %d datacards" % (name, n)) + + +if __name__ == "__main__": + main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/tail_check.py b/MFVNeutralino/test/ForLimits/BinningStudy/tail_check.py new file mode 100644 index 000000000..21f8f2be2 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/BinningStudy/tail_check.py @@ -0,0 +1,24 @@ +import ROOT +ROOT.gROOT.SetBatch(True) +ROOT.gErrorIgnoreLevel = ROOT.kError + +N2V = {'bjet': 0.520, 'lep': 0.049} +FILES = { + 'bjet': '../BackgroundTemplates/bjet/2v_from_jets_run2_5track_default_ULV30BvetoLHTm.root', + 'lep': '../BackgroundTemplates/lep/2v_from_jets_run2_5track_default_ULV30Lepm.root', +} + +with open('/tmp/tail_result.txt', 'w') as out: + for ch, fpath in FILES.items(): + f = ROOT.TFile(fpath) + h = f.Get('h_c1v_sumdbv_w_errorbars') + scale = N2V[ch] / h.Integral() + nbins = h.GetNbinsX() + tail = 0.0 + for i in range(nbins, 0, -1): + tail += h.GetBinContent(i) * scale + if tail >= 1e-3: + line = '%s: x = %.3f cm tail = %.2e events\n' % (ch, h.GetBinLowEdge(i), tail) + out.write(line) + break + f.Close() diff --git a/MFVNeutralino/test/ForLimits/limits_config.yaml b/MFVNeutralino/test/ForLimits/limits_config.yaml index 528e01594..411358fc4 100644 --- a/MFVNeutralino/test/ForLimits/limits_config.yaml +++ b/MFVNeutralino/test/ForLimits/limits_config.yaml @@ -10,9 +10,9 @@ channel: "lep" # "lep" or "bjet" debug: true # verbose output while running # ---- Binning ------------------------------------------------- -# Units: cm. Three bins matching AN Figure 49: [0, 0.8, 1.6, 4.0] cm -bins: [0., 0.8, 1.6, 4.0] -nbins: 3 +# Units: cm. Four bins: [0, 0.1, 0.4, 2.0, 4.0] cm +bins: [0., 0.1, 0.4, 2.0, 4.0] +nbins: 4 # ---- Input signal MiniTree paths ---------------------------- # Folder should contain files named like: {process}_tau{ct}_{year}.root @@ -43,16 +43,16 @@ background: # datacard_output: the final .txt combine datacards root_output: lep: - folder: "/uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648/src/JMTucker/MFVNeutralino/test/ForLimits/LimitsInput/lep/" + folder: "/uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648/src/JMTucker/MFVNeutralino/test/ForLimits/LimitsInput_4bin/lep/" bjet: - folder: "/uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648/src/JMTucker/MFVNeutralino/test/ForLimits/LimitsInput/bjet/" + folder: "/uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648/src/JMTucker/MFVNeutralino/test/ForLimits/LimitsInput_4bin/bjet/" filename: "limitsinput" datacard_output: lep: - folder: "/uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648/src/JMTucker/MFVNeutralino/test/ForLimits/Datacards/lep/" + folder: "/uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648/src/JMTucker/MFVNeutralino/test/ForLimits/Datacards_4bin/lep/" bjet: - folder: "/uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648/src/JMTucker/MFVNeutralino/test/ForLimits/Datacards/bjet/" + folder: "/uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648/src/JMTucker/MFVNeutralino/test/ForLimits/Datacards_4bin/bjet/" prefix: "Datacard_" suffix: ".txt" @@ -67,7 +67,7 @@ nuisance_tables: # ---- Observed events (set to 0 for blind analysis) ----------- observations: - "20161": [0, 0, 0] - "20162": [0, 0, 0] - "2017": [0, 0, 0] - "2018": [0, 0, 0] + "20161": [0, 0, 0, 0] + "20162": [0, 0, 0, 0] + "2017": [0, 0, 0, 0] + "2018": [0, 0, 0, 0] diff --git a/MFVNeutralino/test/ForLimits/makeDatacard.py b/MFVNeutralino/test/ForLimits/makeDatacard.py index 6919d92a6..137652522 100644 --- a/MFVNeutralino/test/ForLimits/makeDatacard.py +++ b/MFVNeutralino/test/ForLimits/makeDatacard.py @@ -108,10 +108,11 @@ def turn_info_to_line(ns_name, ns_type, strls, write_sig): nuis_seg += dash if strls[i] is None else pad(str(strls[i]), 7, False) new_line += pad(ns_name, 30) + pad(ns_type, 5) + dash_tag = "DASH%d" % nbins if write_sig is True: - new_line += nuis_seg + return_sep() + "DASH3" + new_line += nuis_seg + return_sep() + dash_tag elif write_sig is False: - new_line += "DASH3" + return_sep() + nuis_seg + new_line += dash_tag + return_sep() + nuis_seg else: raise Exception("Specify whether to write signal or bkg") return new_line @@ -130,7 +131,7 @@ def turn_info_to_nlines(ns_names, ns_type, strls, write_sig): def return_no_dashes(template): new_template = template - for d in range(4): + for d in range(nbins + 1): new_template = new_template.replace("DASH%i" % d, d * pad("-", 7, False)) return new_template diff --git a/MFVNeutralino/test/ForLimits/plotLimits.py b/MFVNeutralino/test/ForLimits/plotLimits.py index a5dbd6505..b4f0f58a0 100644 --- a/MFVNeutralino/test/ForLimits/plotLimits.py +++ b/MFVNeutralino/test/ForLimits/plotLimits.py @@ -2,7 +2,8 @@ """ Plot 95% CL upper limits on sigma x B^2 [fb] (SUSY) or BR(H->SS) (Higgs). -Reads CombineOutput//higgsCombine.AsymptoticLimits.mH120.root +Reads CombineOutput//higgsCombine.HybridNew.mH120.root +(falls back to AsymptoticLimits if HybridNew output is absent) for all available hypotheses and produces per-process plots. Output (in LimitPlots/): @@ -45,6 +46,12 @@ except ImportError: _HAS_MPLHEP = False +plt.rcParams.update({ + "axes.labelsize": 13, + "xtick.labelsize": 11, + "ytick.labelsize": 11, +}) + try: from scipy.interpolate import RectBivariateSpline _HAS_SCIPY = True @@ -161,9 +168,20 @@ def parse_sig_id(sig_id): def read_limits(sig_id): """Return {key: r_value} or None. Keys: obs, exp, dn1, up1, dn2, up2.""" - fn = os.path.join(COMBINE_OUT, sig_id, - "higgsCombine%s.AsymptoticLimits.mH120.root" % sig_id) - if not os.path.exists(fn): + method_found = None + fn = None + for method in ("HybridNew", "AsymptoticLimits"): + # HybridNew jobs run with -s 1234, which appends the seed to the filename. + for suffix in (".mH120.1234.root", ".mH120.root"): + candidate = os.path.join(COMBINE_OUT, sig_id, + "higgsCombine%s.%s%s" % (sig_id, method, suffix)) + if os.path.exists(candidate): + fn = candidate + method_found = method + break + if fn: + break + if fn is None: return None try: f = ROOT.TFile.Open(fn) @@ -188,6 +206,11 @@ def read_limits(sig_id): if abs(q - qref) < 0.01: result[key] = float(t.limit) f.Close() + # HybridNew run with Asimov dataset (-t -1) produces a single entry with + # quantileExpected=-1 (the "observed" slot). Since data=Asimov, this IS + # the median expected limit — remap so downstream code finds it as "exp". + if method_found == "HybridNew" and "obs" in result and "exp" not in result: + result["exp"] = result.pop("obs") return result if "exp" in result else None except Exception as exc: print("Could not read %s: %s" % (fn, exc)) @@ -382,6 +405,13 @@ def _cms_label(ax): hep.cms.label("Preliminary", data=False, ax=ax, fontsize=12, rlabel=_RUN2_LUMI) +def _band(lims_list, key, fallback_key=None): + """Return list of limit values for `key` if ALL entries have it, else None.""" + vals = [l.get(key) if fallback_key is None else l.get(key, l.get(fallback_key)) + for l in lims_list] + return vals if all(v is not None for v in vals) else None + + def _save(fig, out_fn): plt.tight_layout() fig.savefig(out_fn, bbox_inches="tight") @@ -404,20 +434,24 @@ def plot_1d(proc, mass_data, out_dir, hepdata): ctaus = sorted(cdict.keys()) if not ctaus: continue - exp = [cdict[c]["exp"] * scale for c in ctaus] - dn1 = [cdict[c]["dn1"] * scale for c in ctaus] - up1 = [cdict[c]["up1"] * scale for c in ctaus] - dn2 = [cdict[c].get("dn2", cdict[c]["dn1"]) * scale for c in ctaus] - up2 = [cdict[c].get("up2", cdict[c]["up1"]) * scale for c in ctaus] + lims_c = [cdict[c] for c in ctaus] + exp = [l["exp"] * scale for l in lims_c] + _raw1 = _band(lims_c, "dn1"); dn1 = [v * scale for v in _raw1] if _raw1 else None + _raw2 = _band(lims_c, "up1"); up1 = [v * scale for v in _raw2] if _raw2 else None + _raw3 = _band(lims_c, "dn2", "dn1"); dn2 = [v * scale for v in _raw3] if _raw3 else None + _raw4 = _band(lims_c, "up2", "up1"); up2 = [v * scale for v in _raw4] if _raw4 else None col = _COLORS[i % len(_COLORS)] - ax.fill_between(ctaus, dn2, up2, alpha=0.15, color=col, edgecolor="none") - ax.fill_between(ctaus, dn1, up1, alpha=0.35, color=col, edgecolor="none") + if dn2 and up2: + ax.fill_between(ctaus, dn2, up2, alpha=0.15, color=col, edgecolor="none") + if dn1 and up1: + ax.fill_between(ctaus, dn1, up1, alpha=0.35, color=col, edgecolor="none") ax.plot(ctaus, exp, color=col, lw=2, ls="--", label="m = %s GeV (exp)" % mass) - if "obs" in cdict[ctaus[0]]: - obs = [cdict[c]["obs"] * scale for c in ctaus] + _obs_raw = _band(lims_c, "obs") + if _obs_raw: + obs = [v * scale for v in _obs_raw] ax.plot(ctaus, obs, color=col, lw=2, ls="-", label="m = %s GeV (obs)" % mass) @@ -450,22 +484,25 @@ def plot_1d_vs_mass_all(proc, mass_data, out_dir): mass_vals = [int(m) for m in masses] scales = [_sig_scale_fb(proc, m) for m in masses] - exp = [mdict[m]["exp"] * s for m, s in zip(masses, scales)] - dn1 = [mdict[m]["dn1"] * s for m, s in zip(masses, scales)] - up1 = [mdict[m]["up1"] * s for m, s in zip(masses, scales)] - dn2 = [mdict[m].get("dn2", mdict[m]["dn1"]) * s for m, s in zip(masses, scales)] - up2 = [mdict[m].get("up2", mdict[m]["up1"]) * s for m, s in zip(masses, scales)] + lims_m = [mdict[m] for m in masses] + exp = [l["exp"] * s for l, s in zip(lims_m, scales)] + _r1 = _band(lims_m, "dn1"); dn1 = [v * s for v, s in zip(_r1, scales)] if _r1 else None + _r2 = _band(lims_m, "up1"); up1 = [v * s for v, s in zip(_r2, scales)] if _r2 else None + _r3 = _band(lims_m, "dn2", "dn1"); dn2 = [v * s for v, s in zip(_r3, scales)] if _r3 else None + _r4 = _band(lims_m, "up2", "up1"); up2 = [v * s for v, s in zip(_r4, scales)] if _r4 else None col = _COLORS[i % len(_COLORS)] lbl = _format_ctau(ctau) - ax.fill_between(mass_vals, dn2, up2, alpha=0.15, color=col, edgecolor="none") - ax.fill_between(mass_vals, dn1, up1, alpha=0.35, color=col, edgecolor="none") + if dn2 and up2: + ax.fill_between(mass_vals, dn2, up2, alpha=0.15, color=col, edgecolor="none") + if dn1 and up1: + ax.fill_between(mass_vals, dn1, up1, alpha=0.35, color=col, edgecolor="none") ax.plot(mass_vals, exp, color=col, lw=2, ls="--", label=r"$c\tau$ = %s (exp)" % lbl) - has_obs = "obs" in mdict[masses[0]] - if has_obs: - obs = [mdict[m]["obs"] * s for m, s in zip(masses, scales)] + _obs_raw = _band(lims_m, "obs") + if _obs_raw: + obs = [v * s for v, s in zip(_obs_raw, scales)] ax.plot(mass_vals, obs, color=col, lw=2, ls="-", label=r"$c\tau$ = %s (obs)" % lbl) @@ -492,19 +529,23 @@ def _draw_lowht_pair(ax, proc, ctau_data, c1, c2): masses = _sorted_masses(mdict) mass_vals = [int(m) for m in masses] scales = [_sig_scale_fb(proc, m) for m in masses] - exp = [mdict[m]["exp"] * s for m, s in zip(masses, scales)] - dn1 = [mdict[m]["dn1"] * s for m, s in zip(masses, scales)] - up1 = [mdict[m]["up1"] * s for m, s in zip(masses, scales)] - dn2 = [mdict[m].get("dn2", mdict[m]["dn1"]) * s for m, s in zip(masses, scales)] - up2 = [mdict[m].get("up2", mdict[m]["up1"]) * s for m, s in zip(masses, scales)] + lims_m = [mdict[m] for m in masses] + exp = [l["exp"] * s for l, s in zip(lims_m, scales)] + _r1 = _band(lims_m, "dn1"); dn1 = [v * s for v, s in zip(_r1, scales)] if _r1 else None + _r2 = _band(lims_m, "up1"); up1 = [v * s for v, s in zip(_r2, scales)] if _r2 else None + _r3 = _band(lims_m, "dn2", "dn1"); dn2 = [v * s for v, s in zip(_r3, scales)] if _r3 else None + _r4 = _band(lims_m, "up2", "up1"); up2 = [v * s for v, s in zip(_r4, scales)] if _r4 else None col = _COLORS[i] lbl = _format_ctau(ctau) - ax.fill_between(mass_vals, dn2, up2, alpha=0.15, color=col, edgecolor="none") - ax.fill_between(mass_vals, dn1, up1, alpha=0.35, color=col, edgecolor="none") + if dn2 and up2: + ax.fill_between(mass_vals, dn2, up2, alpha=0.15, color=col, edgecolor="none") + if dn1 and up1: + ax.fill_between(mass_vals, dn1, up1, alpha=0.35, color=col, edgecolor="none") ax.plot(mass_vals, exp, color=col, lw=2, ls="--", label=r"$c\tau$ = %s Low-HT exp." % lbl) - if "obs" in mdict[masses[0]]: - obs = [mdict[m]["obs"] * s for m, s in zip(masses, scales)] + _obs_raw = _band(lims_m, "obs") + if _obs_raw: + obs = [v * s for v, s in zip(_obs_raw, scales)] ax.plot(mass_vals, obs, color=col, lw=2, ls="-", label=r"$c\tau$ = %s Low-HT obs." % lbl) @@ -719,7 +760,7 @@ def plot_2d(proc, mass_data, out_dir, hepdata, theory_csv=None, fname_suffix="") cf = ax.contourf(fine_ctau, fine_mass, cmap_data_exp.T, levels=levels, norm=norm, cmap=cmap, extend="both") cbar = plt.colorbar(cf, ax=ax, pad=0.02) - cbar.set_label(cbar_label) + cbar.set_label(cbar_label, fontsize=11) cbar.set_ticks(_nice_ticks) cbar.set_ticklabels(["%g" % t for t in _nice_ticks]) cbar.ax.axhline(y=vref, color="black", lw=1.0, ls="--") @@ -747,7 +788,7 @@ def plot_2d(proc, mass_data, out_dir, hepdata, theory_csv=None, fname_suffix="") norm=norm, cmap=cmap, edgecolors="black", linewidths=0.5) cbar = plt.colorbar(sc, ax=ax, pad=0.02) - cbar.set_label(cbar_label) + cbar.set_label(cbar_label, fontsize=11) cbar.set_ticks(_nice_ticks) cbar.set_ticklabels(["%g" % t for t in _nice_ticks]) cbar.ax.axhline(y=vref, color="black", lw=1.0, ls="--") @@ -771,6 +812,259 @@ def plot_2d(proc, mass_data, out_dir, hepdata, theory_csv=None, fname_suffix="") +# --------------------------------------------------------------------------- +# Method comparison: collect both HybridNew and AsymptoticLimits per signal +# --------------------------------------------------------------------------- + +_HN_COLOR = "#2166ac" # blue — HybridNew +_AS_COLOR = "#d6604d" # red — AsymptoticLimits + + +def read_limits_method(sig_id, method): + """Read limits for a specific method without priority fallback.""" + for suffix in (".mH120.1234.root", ".mH120.root"): + fn = os.path.join(COMBINE_OUT, sig_id, + "higgsCombine%s.%s%s" % (sig_id, method, suffix)) + if os.path.exists(fn): + break + else: + return None + try: + f = ROOT.TFile.Open(fn) + if not f or f.IsZombie(): + return None + t = f.Get("limit") + if not t: + f.Close() + return None + quant_map = {-1.0: "obs", 0.025: "dn2", 0.16: "dn1", + 0.5: "exp", 0.84: "up1", 0.975: "up2"} + result = {} + for _ in t: + q = round(float(t.quantileExpected), 3) + for qref, key in quant_map.items(): + if abs(q - qref) < 0.01: + result[key] = float(t.limit) + f.Close() + if method == "HybridNew" and "obs" in result and "exp" not in result: + result["exp"] = result.pop("obs") + return result if "exp" in result else None + except Exception as exc: + print("Could not read %s %s: %s" % (sig_id, method, exc)) + return None + + +def collect_all_methods(): + """Return {proc -> {mass_str -> {ctau_mm -> {method: lims}}}}""" + data = {} + if not os.path.isdir(COMBINE_OUT): + return data + for sig_id in sorted(os.listdir(COMBINE_OUT)): + if not os.path.isdir(os.path.join(COMBINE_OUT, sig_id)): + continue + proc, ctau_str, mass = parse_sig_id(sig_id) + if proc is None: + continue + ctau_mm = ctau_to_mm(ctau_str) + if ctau_mm <= 0: + continue + methods = {} + for method in ("HybridNew", "AsymptoticLimits"): + lims = read_limits_method(sig_id, method) + if lims is not None: + methods[method] = lims + if not methods: + continue + data.setdefault(proc, {}).setdefault(mass, {})[ctau_mm] = methods + return data + + +# --------------------------------------------------------------------------- +# Comparison 1D: one plot per ctau, HybridNew median vs Asymptotic median+bands +# --------------------------------------------------------------------------- + +def plot_comparison_1d_per_ctau(proc, mass_data_m, out_dir): + """Per-ctau 1D vs mass: HybridNew median (blue) + Asymptotic median+bands (red).""" + # Invert to {ctau -> {mass -> {method -> lims}}} + ctau_data = {} + for mass, cdict in mass_data_m.items(): + for ctau, mdict in cdict.items(): + ctau_data.setdefault(ctau, {})[mass] = mdict + + for ctau in sorted(ctau_data.keys()): + mdict = ctau_data[ctau] + masses = _sorted_masses(mdict) + if not masses: + continue + mass_vals = [int(m) for m in masses] + scales = [_sig_scale_fb(proc, m) for m in masses] + + fig, ax = plt.subplots(figsize=(8, 6)) + drew = False + + # AsymptoticLimits: median + ±1σ/2σ bands + as_idx = [i for i, m in enumerate(masses) if "AsymptoticLimits" in mdict[m]] + if as_idx: + as_mv = [mass_vals[i] for i in as_idx] + as_sc = [scales[i] for i in as_idx] + as_lims = [mdict[masses[i]]["AsymptoticLimits"] for i in as_idx] + as_exp = [l["exp"] * s for l, s in zip(as_lims, as_sc)] + as_dn1 = [l["dn1"] * s for l, s in zip(as_lims, as_sc)] if all("dn1" in l for l in as_lims) else None + as_up1 = [l["up1"] * s for l, s in zip(as_lims, as_sc)] if all("up1" in l for l in as_lims) else None + as_dn2 = [l.get("dn2", l["dn1"]) * s for l, s in zip(as_lims, as_sc)] if as_dn1 else None + as_up2 = [l.get("up2", l["up1"]) * s for l, s in zip(as_lims, as_sc)] if as_up1 else None + if as_dn2 and as_up2: + ax.fill_between(as_mv, as_dn2, as_up2, alpha=0.15, color=_AS_COLOR, edgecolor="none") + if as_dn1 and as_up1: + ax.fill_between(as_mv, as_dn1, as_up1, alpha=0.35, color=_AS_COLOR, edgecolor="none") + ax.plot(as_mv, as_exp, color=_AS_COLOR, lw=2, ls="--", label="Asymptotic exp.", zorder=4) + drew = True + + # HybridNew: median only (solid, marker at missing points) + hn_idx = [i for i, m in enumerate(masses) if "HybridNew" in mdict[m]] + if hn_idx: + hn_mv = [mass_vals[i] for i in hn_idx] + hn_sc = [scales[i] for i in hn_idx] + hn_lims = [mdict[masses[i]]["HybridNew"] for i in hn_idx] + hn_exp = [l["exp"] * s for l, s in zip(hn_lims, hn_sc)] + ax.plot(hn_mv, hn_exp, color=_HN_COLOR, lw=2.5, ls="-", + marker="o", ms=5, label="HybridNew exp.", zorder=5) + drew = True + + if not drew: + plt.close(fig) + continue + + _draw_ref_curve_vsmass(ax, proc) + ax.set_yscale("log") + ax.set_xlabel(_mass_xlabel(proc)) + ax.set_ylabel(_ylabel(proc)) + ax.set_title(r"$c\tau = %s$" % _format_ctau(ctau), fontsize=12) + ax.legend(fontsize=10) + ax.grid(True, which="both", ls=":", alpha=0.4) + _cms_label(ax) + _annotate_proc(ax, proc) + ctau_tag = _format_ctau(ctau).replace(".", "p") + _save(fig, os.path.join(out_dir, "%s_compare_%s.pdf" % (proc, ctau_tag))) + + +# --------------------------------------------------------------------------- +# Comparison 2D: color map + HybridNew contour + Asymptotic contour +# --------------------------------------------------------------------------- + +def plot_comparison_2d(proc, mass_data_m, out_dir, hepdata, theory_csv=None, fname_suffix=""): + """2D comparison: HybridNew color map with both exclusion contours overlaid.""" + masses = _sorted_masses(mass_data_m) + ctau_counts = {m: len(mass_data_m[m]) for m in masses} + max_n = max(ctau_counts.values()) + min_n = max(3, max_n - 1) if proc in _SUSY_PROCS else 2 + masses = [m for m in masses if ctau_counts[m] >= min_n] + ctaus_all = sorted(set.union(*[set(mass_data_m[m].keys()) for m in masses])) + + if len(masses) < 2 or len(ctaus_all) < 2: + print(" Skipping comparison 2D for %s: need at least 2x2 grid" % proc) + return + + mass_vals = np.array([int(m) for m in masses], dtype=float) + ctau_vals = np.array(ctaus_all, dtype=float) + scales = np.array([_sig_scale_fb(proc, m) for m in masses]) + thresholds = _excl_thresholds_2d(proc, masses, mass_vals, theory_csv=theory_csv) + + grid_hn = np.full((len(ctau_vals), len(mass_vals)), np.nan) + grid_as = np.full((len(ctau_vals), len(mass_vals)), np.nan) + + for j, mass in enumerate(masses): + for i, ctau in enumerate(ctau_vals): + if ctau not in mass_data_m[mass]: + continue + entry = mass_data_m[mass][ctau] + if "HybridNew" in entry: + grid_hn[i, j] = entry["HybridNew"]["exp"] + if "AsymptoticLimits" in entry: + grid_as[i, j] = entry["AsymptoticLimits"]["exp"] + + grid_hn_s = grid_hn * scales[np.newaxis, :] + grid_as_s = grid_as * scales[np.newaxis, :] + + # Color map: HybridNew where available, fill Asymptotic for missing cells + grid_cmap = np.where(np.isnan(grid_hn_s), grid_as_s, grid_hn_s) + + if proc in _SUSY_PROCS: + ratio_cmap = grid_cmap / thresholds[np.newaxis, :] + ratio_hn = grid_hn_s / thresholds[np.newaxis, :] + ratio_as = grid_as_s / thresholds[np.newaxis, :] + vmin, vref, vmax = 0.01, 1.0, 100.0 + cbar_label = r"$\sigma\mathcal{B}^{2}\ /\ \sigma_\mathrm{theory}$ [HybridNew]" + else: + ratio_cmap = grid_cmap + ratio_hn = grid_hn_s / thresholds[np.newaxis, :] + ratio_as = grid_as_s / thresholds[np.newaxis, :] + vmin, vref, vmax = _2D_VSCALE.get(proc, (None, None, None)) + if vref is None: + vref = float(np.exp(np.mean(np.log(thresholds[thresholds > 0])))) + vmin, vmax = vref * 0.05, vref * 200.0 + cbar_label = _ylabel(proc) + " [HybridNew]" + + log_ctaus = np.log10(ctau_vals) + log_ctau_lo = log_ctaus[0] - 0.7 + fine_lct = np.linspace(log_ctau_lo, log_ctaus[-1], 200) + fine_mass = np.linspace(mass_vals[0], mass_vals[-1], 200) + fine_ctau = 10.0 ** fine_lct + + fine_cmap = _interp_grid(log_ctaus, mass_vals, ratio_cmap, fine_lct, fine_mass) + fine_ratio_hn = _interp_grid(log_ctaus, mass_vals, ratio_hn, fine_lct, fine_mass) + fine_ratio_as = _interp_grid(log_ctaus, mass_vals, ratio_as, fine_lct, fine_mass) + + n_half = 30 + levels = np.concatenate([ + np.logspace(np.log10(vmin), np.log10(vref), n_half + 1)[:-1], + np.logspace(np.log10(vref), np.log10(vmax), n_half + 1), + ]) + norm = mcolors.LogNorm(vmin=vmin, vmax=vmax) + cmap = plt.get_cmap("RdBu_r") + _all_nice = [0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, + 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, + 10000, 20000, 50000, 100000] + _nice_ticks = [t for t in _all_nice if vmin <= t <= vmax] + + fig, ax = plt.subplots(figsize=(9, 6)) + + if fine_cmap is not None: + cf = ax.contourf(fine_ctau, fine_mass, fine_cmap.T, + levels=levels, norm=norm, cmap=cmap, extend="both") + cbar = plt.colorbar(cf, ax=ax, pad=0.02) + cbar.set_label(cbar_label, fontsize=11) + cbar.set_ticks(_nice_ticks) + cbar.set_ticklabels(["%g" % t for t in _nice_ticks]) + cbar.ax.axhline(y=vref, color="black", lw=1.0, ls="--") + + if fine_ratio_hn is not None: + ax.contour(fine_ctau, fine_mass, fine_ratio_hn.T, levels=[1.0], + colors=[_HN_COLOR], linewidths=[2.5], linestyles=["solid"]) + ax.plot([], [], color=_HN_COLOR, lw=2.5, ls="-", label="HybridNew exp.") + + if fine_ratio_as is not None: + ax.contour(fine_ctau, fine_mass, fine_ratio_as.T, levels=[1.0], + colors=[_AS_COLOR], linewidths=[2.0], linestyles=["dashed"]) + ax.plot([], [], color=_AS_COLOR, lw=2.0, ls="--", label="Asymptotic exp.") + + for j, mass in enumerate(masses): + for i, ctau in enumerate(ctau_vals): + ax.scatter(ctau, mass_vals[j], color="black", s=20, zorder=6) + + y_pad = max(3.0, (mass_vals[-1] - mass_vals[0]) * 0.08) + ax.set_ylim(mass_vals[0] - y_pad, mass_vals[-1] + y_pad) + ax.set_xscale("log") + ax.set_xlim(10.0 ** log_ctau_lo, 10.0 ** (log_ctaus[-1] + 0.25)) + ax.set_xlabel(r"$c\tau$ [mm]") + ax.set_ylabel("Mass [GeV]") + ax.legend(fontsize=11, loc="upper right", framealpha=0.92, edgecolor="0.7") + ax.grid(True, which="both", ls=":", alpha=0.3) + _cms_label(ax) + _annotate_proc(ax, proc) + _save(fig, os.path.join(out_dir, "%s_2D_compare%s.pdf" % (proc, fname_suffix))) + + # --------------------------------------------------------------------------- # Entry point # --------------------------------------------------------------------------- @@ -779,10 +1073,12 @@ def main(): global COMBINE_OUT ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) - ap.add_argument("--out-dir", default=PLOT_DIR) - ap.add_argument("--combine-out", default=COMBINE_OUT) - ap.add_argument("--subset", default=None, + ap.add_argument("--out-dir", default=PLOT_DIR) + ap.add_argument("--combine-out", default=COMBINE_OUT) + ap.add_argument("--subset", default=None, help="Comma-separated process names to plot") + ap.add_argument("--comparison-dir", default=None, + help="If set, write HybridNew vs Asymptotic comparison plots here") args = ap.parse_args() COMBINE_OUT = args.combine_out @@ -830,6 +1126,25 @@ def main(): print("\nDone. Plots saved to %s" % args.out_dir) + if args.comparison_dir: + os.makedirs(args.comparison_dir, exist_ok=True) + print("\n--- Generating HybridNew vs Asymptotic comparison plots ---") + data_m = collect_all_methods() + for proc in sorted(data_m): + if proc in _skip_procs: + continue + if subset and proc not in subset: + continue + n_pts = sum(len(v) for v in data_m[proc].values()) + print("\n%s: %d hypotheses" % (proc, n_pts)) + plot_comparison_1d_per_ctau(proc, data_m[proc], args.comparison_dir) + plot_comparison_2d(proc, data_m[proc], args.comparison_dir, hepdata) + if proc == "mfv_neu" and "mfv_neu" in _EXTRA_THEORY_CSV: + plot_comparison_2d(proc, data_m[proc], args.comparison_dir, hepdata, + theory_csv=_EXTRA_THEORY_CSV["mfv_neu"], + fname_suffix="_ewk") + print("\nComparison plots saved to %s" % args.comparison_dir) + if __name__ == "__main__": main() diff --git a/MFVNeutralino/test/ForLimits/submitCombine.py b/MFVNeutralino/test/ForLimits/submitCombine.py index b5feb70d6..6b1141914 100644 --- a/MFVNeutralino/test/ForLimits/submitCombine.py +++ b/MFVNeutralino/test/ForLimits/submitCombine.py @@ -39,12 +39,16 @@ COMBINE_OUT = os.path.join(HERE, "CombineOutput") CONDOR_DIR = os.path.join(HERE, "CombineCondor") -# Tarball of user-built Combine files: binary, library, .pcm/.rootmap. -# Expected at $CMSSW_BASE/../combine_env.tar.gz (one level above the CMSSW installation). -# Override by setting the COMBINE_TARBALL environment variable. +def _apply_tag(tag): + """Redirect all I/O directories to tagged variants (e.g. tag='4bin').""" + global DATACARD_DIR, COMBINE_OUT, CONDOR_DIR + DATACARD_DIR = os.path.join(HERE, "Datacards_%s" % tag) + COMBINE_OUT = os.path.join(HERE, "CombineOutput_%s" % tag) + CONDOR_DIR = os.path.join(HERE, "CombineCondor_%s" % tag) + COMBINE_TARBALL = os.environ.get( "COMBINE_TARBALL", - os.path.join(os.path.dirname(os.environ.get("CMSSW_BASE", "")), "combine_env.tar.gz"), + "/uscms_data/d3/gdecastr/work/combine_env.tar.gz", ) # CMSSW_14_1_0 (final release) is in CVMFS and has the same ABI as pre4. # Worker nodes only bind /cvmfs, so we set up the environment from there. @@ -54,11 +58,12 @@ CHANNELS = ("lep", "bjet") # --------------------------------------------------------------------------- -# Per-job shell script -# Cards are pre-merged locally; this script only runs combine. -# CMSSW_14_1_0 from CVMFS sets up ROOT/RooFit; the shipped .so provides Combine. +# Per-job shell scripts # --------------------------------------------------------------------------- -_JOB_SH = """\ + +# AsymptoticLimits: analytic CLs, fast (~5s), produces bands + median. +# Output: higgsCombine{sig}.AsymptoticLimits.mH120.root + combine.log +_JOB_SH_ASYMPTOTIC = """\ #!/bin/bash set -e source /cvmfs/cms.cern.ch/cmsset_default.sh @@ -69,36 +74,41 @@ export PATH=/srv/combine_env/bin:$PATH export LD_LIBRARY_PATH=/srv/combine_env/lib:$LD_LIBRARY_PATH -echo "=== AsymptoticLimits: {sig_id} ===" -combine -M AsymptoticLimits \\ - --name {sig_id} \\ - workspace_{sig_id}.root \\ - -v 1 - -# FitDiagnostics is best-effort; failure does not abort the job. -set +e -echo "=== FitDiagnostics: {sig_id} ===" -combine -M FitDiagnostics \\ - --name {sig_id} \\ - workspace_{sig_id}.root \\ - --saveShapes --saveWithUncertainties \\ - -v 1 -FD_STATUS=$? +SIG={sig_id} +echo "=== AsymptoticLimits: $SIG ===" +combine -M AsymptoticLimits workspace_$SIG.root \\ + --name $SIG --run blind -v 0 \\ + 2>&1 | tee combine.log +echo "=== Done: $SIG ===" +""" + +# HybridNew: single Asimov (-t -1) run; blinded analysis so data = background. +_JOB_SH_HYBRIDNEW = """\ +#!/bin/bash set -e -if [ $FD_STATUS -ne 0 ]; then - echo "WARNING: FitDiagnostics failed (status $FD_STATUS) -- AsymptoticLimits result is still valid" - touch higgsCombine{sig_id}.FitDiagnostics.mH120.root fitDiagnostics{sig_id}.root -fi +source /cvmfs/cms.cern.ch/cmsset_default.sh +cd {cvmfs_cmssw14} +eval $(scramv1 runtime -sh) +cd /srv +tar xf combine_env.tar.gz +export PATH=/srv/combine_env/bin:$PATH +export LD_LIBRARY_PATH=/srv/combine_env/lib:$LD_LIBRARY_PATH -echo "=== Done: {sig_id} ===" +SIG={sig_id} +echo "=== HybridNew Asimov expected: $SIG ===" +combine -M HybridNew --frequentist --testStat LHC \\ + -T 20000 --fork 2 -t -1 -s 1234 \\ + --rMax {rmax} \\ + --name $SIG \\ + workspace_$SIG.root -v 0 +echo "=== Done: $SIG ===" """ # --------------------------------------------------------------------------- -# Condor JDL -# transfer_input_files ships combine + the one user-built .so + the merged card. -# initialdir directs returned output files straight into CombineOutput/sig_id/. +# Condor JDL templates (one per method) # --------------------------------------------------------------------------- -_JDL = """\ + +_JDL_ASYMPTOTIC = """\ universe = vanilla executable = {job_sh} initialdir = {work_dir} @@ -111,10 +121,59 @@ should_transfer_files = YES when_to_transfer_output = ON_EXIT transfer_input_files = {combine_tarball},{workspace} -transfer_output_files = higgsCombine{sig_id}.AsymptoticLimits.mH120.root,higgsCombine{sig_id}.FitDiagnostics.mH120.root,fitDiagnostics{sig_id}.root +transfer_output_files = higgsCombine{sig_id}.AsymptoticLimits.mH120.root,combine.log +queue 1 +""" + +_JDL_HYBRIDNEW = """\ +universe = vanilla +executable = {job_sh} +initialdir = {work_dir} +output = {log_pfx}.out +error = {log_pfx}.err +log = {log_pfx}.log +request_cpus = 2 +request_memory = 4000MB ++DesiredOS = "EL9" +should_transfer_files = YES +when_to_transfer_output = ON_EXIT +transfer_input_files = {combine_tarball},{workspace} +transfer_output_files = higgsCombine{sig_id}.HybridNew.mH120.1234.root queue 1 """ +# Keep _JOB_SH / _JDL as aliases for backward compatibility +_JOB_SH = _JOB_SH_HYBRIDNEW +_JDL = _JDL_HYBRIDNEW + + +def _read_asymptotic_exp(sig_id): + """Return median expected limit (quantile=0.5) from AsymptoticLimits ROOT file, or None.""" + root_fn = os.path.join(COMBINE_OUT, sig_id, + "higgsCombine%s.AsymptoticLimits.mH120.root" % sig_id) + if not os.path.exists(root_fn): + return None + try: + import ROOT + ROOT.PyConfig.IgnoreCommandLineOptions = True + ROOT.gROOT.SetBatch(True) + f = ROOT.TFile.Open(root_fn) + if not f or f.IsZombie(): + return None + t = f.Get("limit") + if not t: + f.Close() + return None + for _ in t: + if abs(float(t.quantileExpected) - 0.5) < 0.01: + val = float(t.limit) + f.Close() + return val + f.Close() + except Exception: + pass + return None + def _makedirs(path): if not os.path.exists(path): @@ -147,48 +206,75 @@ def find_hypotheses(): return hyps -def _write_job(sig_id, cards, dry_run): +def _write_job(sig_id, cards, dry_run, method="hybridnew"): work_dir = os.path.join(COMBINE_OUT, sig_id) condor_dir = os.path.join(CONDOR_DIR, sig_id) _makedirs(work_dir) _makedirs(condor_dir) - # Pre-merge cards locally (runs on submit node where NFS is available). + # Pre-merge cards and build workspace locally (submit node has NFS access). card_args = " ".join("%s=%s" % (k, v) for k, v in sorted(cards.items())) combined_card = os.path.join(condor_dir, "combined_%s.txt" % sig_id) workspace = os.path.join(condor_dir, "workspace_%s.root" % sig_id) if not dry_run: - ret = subprocess.call("combineCards.py %s > %s" % (card_args, combined_card), shell=True) - if ret != 0: - print("WARNING: combineCards.py failed for %s -- skipping" % sig_id) - return False - # Convert to RooStats workspace locally (requires CMSSW_14_1_0_pre4 Python). - # Worker nodes run combine on the workspace in pure C++ -- no Python needed there. - ret = subprocess.call( - "text2workspace.py %s -m 125 -o %s" % (combined_card, workspace), shell=True) - if ret != 0: - print("WARNING: text2workspace.py failed for %s -- skipping" % sig_id) - return False - - job_sh = os.path.join(condor_dir, "run.sh") - with open(job_sh, "w") as fh: - fh.write(_JOB_SH.format( - cvmfs_cmssw14 = CVMFS_CMSSW14, - sig_id = sig_id, - )) - os.chmod(job_sh, stat.S_IRWXU | stat.S_IRGRP | stat.S_IXGRP | stat.S_IROTH | stat.S_IXOTH) - + if not os.path.exists(workspace): + import shutil + for tool in ("combineCards.py", "text2workspace.py"): + if not shutil.which(tool): + print("ERROR: %s not in PATH; workspace missing for %s -- skipping" % (tool, sig_id)) + return False + ret = subprocess.call("combineCards.py %s > %s" % (card_args, combined_card), shell=True) + if ret != 0: + print("WARNING: combineCards.py failed for %s -- skipping" % sig_id) + return False + ret = subprocess.call( + "text2workspace.py %s -m 125 -o %s" % (combined_card, workspace), shell=True) + if ret != 0: + print("WARNING: text2workspace.py failed for %s -- skipping" % sig_id) + return False + + job_sh = os.path.join(condor_dir, "run.sh") log_pfx = os.path.join(condor_dir, "job") jdl_fn = os.path.join(condor_dir, "submit.jdl") - with open(jdl_fn, "w") as fh: - fh.write(_JDL.format( - job_sh = job_sh, - work_dir = work_dir, - log_pfx = log_pfx, - combine_tarball = COMBINE_TARBALL, - workspace = workspace, - sig_id = sig_id, - )) + + if method == "asymptotic": + with open(job_sh, "w") as fh: + fh.write(_JOB_SH_ASYMPTOTIC.format( + cvmfs_cmssw14 = CVMFS_CMSSW14, + sig_id = sig_id, + )) + os.chmod(job_sh, stat.S_IRWXU | stat.S_IRGRP | stat.S_IXGRP | stat.S_IROTH | stat.S_IXOTH) + with open(jdl_fn, "w") as fh: + fh.write(_JDL_ASYMPTOTIC.format( + job_sh = job_sh, + work_dir = work_dir, + log_pfx = log_pfx, + combine_tarball = COMBINE_TARBALL, + workspace = workspace, + sig_id = sig_id, + )) + else: + asymp_exp = _read_asymptotic_exp(sig_id) + if asymp_exp and asymp_exp > 0: + rmax = 10.0 * asymp_exp # no floor: at r=10*expected, CLs~0 and fork 2 is stable + else: + rmax = 20.0 # fallback for signals with no asymptotic log + with open(job_sh, "w") as fh: + fh.write(_JOB_SH_HYBRIDNEW.format( + cvmfs_cmssw14 = CVMFS_CMSSW14, + sig_id = sig_id, + rmax = rmax, + )) + os.chmod(job_sh, stat.S_IRWXU | stat.S_IRGRP | stat.S_IXGRP | stat.S_IROTH | stat.S_IXOTH) + with open(jdl_fn, "w") as fh: + fh.write(_JDL_HYBRIDNEW.format( + job_sh = job_sh, + work_dir = work_dir, + log_pfx = log_pfx, + combine_tarball = COMBINE_TARBALL, + workspace = workspace, + sig_id = sig_id, + )) if not dry_run: ret = subprocess.call("condor_submit " + jdl_fn, shell=True) @@ -207,19 +293,25 @@ def main(): ap.add_argument("--dry-run", action="store_true", help="Write job files but do not call condor_submit") ap.add_argument("--skip-existing", action="store_true", - help="Skip hypotheses that already have AsymptoticLimits output") + help="Skip hypotheses that already have output for the chosen method") + ap.add_argument("--limit", type=int, default=None, + help="Submit at most N jobs (for testing)") + ap.add_argument("--sig-id", default=None, + help="Submit only this exact hypothesis (e.g. mfv_neu_tau001000um_M0400)") + ap.add_argument("--tag", default=None, + help="Redirect I/O to tagged directories, e.g. --tag 4bin uses Datacards_4bin/, CombineOutput_4bin/, CombineCondor_4bin/") + ap.add_argument("--method", default="hybridnew", choices=["hybridnew", "asymptotic"], + help="Which combine method to run: hybridnew (default) or asymptotic") args = ap.parse_args() + if args.tag: + _apply_tag(args.tag) + if not args.dry_run: for path in (COMBINE_TARBALL, CVMFS_CMSSW14): if not os.path.exists(path): print("ERROR: required path not found: %s" % path) sys.exit(1) - import shutil - for tool in ("combineCards.py", "text2workspace.py"): - if not shutil.which(tool): - print("ERROR: %s not in PATH -- source CMSSW_14_1_0_pre4 cmsenv first" % tool) - sys.exit(1) subset = set(args.subset.split(",")) if args.subset else None hyps = find_hypotheses() @@ -232,16 +324,24 @@ def main(): n_skip = 0 for sig_id in sorted(hyps): proc = sig_id.split("_tau")[0] + if args.sig_id and sig_id != args.sig_id: + continue if subset and proc not in subset: continue if args.skip_existing: - out_fn = os.path.join(COMBINE_OUT, sig_id, - "higgsCombine%s.AsymptoticLimits.mH120.root" % sig_id) + if args.method == "asymptotic": + out_fn = os.path.join(COMBINE_OUT, sig_id, + "higgsCombine%s.AsymptoticLimits.mH120.root" % sig_id) + else: + out_fn = os.path.join(COMBINE_OUT, sig_id, + "higgsCombine%s.HybridNew.mH120.1234.root" % sig_id) if os.path.exists(out_fn): n_skip += 1 continue - if _write_job(sig_id, hyps[sig_id], args.dry_run) is not False: + if _write_job(sig_id, hyps[sig_id], args.dry_run, method=args.method) is not False: n += 1 + if args.limit and n >= args.limit: + break if n_skip: print("Skipped %d already-completed hypotheses (--skip-existing)" % n_skip) From 9a7ccd61219622b3c40508bad7c786f9e7dde59f Mon Sep 17 00:00:00 2001 From: Gianfranco de Castro Date: Sat, 23 May 2026 15:57:36 -0500 Subject: [PATCH 10/15] Updated to 4 bins and added HybridNew --- MFVNeutralino/test/ForLimits/ReadMe.txt | 75 +++++++++++++++++++ .../test/ForLimits/cleanup_failed_limits.sh | 31 ++++++++ .../test/ForLimits/getNuisanceFromSig.py | 2 +- .../ForLimits/helper_PyStorage_objects.py | 45 ++++++++--- MFVNeutralino/test/ForLimits/plotLimits.py | 34 +++------ .../test/ForLimits/script_configs.py | 6 +- .../test/ForLimits/sig_and_bkg_configs.py | 5 +- 7 files changed, 156 insertions(+), 42 deletions(-) create mode 100644 MFVNeutralino/test/ForLimits/ReadMe.txt create mode 100755 MFVNeutralino/test/ForLimits/cleanup_failed_limits.sh diff --git a/MFVNeutralino/test/ForLimits/ReadMe.txt b/MFVNeutralino/test/ForLimits/ReadMe.txt new file mode 100644 index 000000000..4264ebb59 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/ReadMe.txt @@ -0,0 +1,75 @@ +MFV Displaced Vertex -- Limit Setting +====================================== + +Two environments needed: + - CMSSW_10_6_48 (el7/apptainer) for datacard making + - CMSSW_14_1_0_pre4 (el9, native) for combine + + +FIRST-TIME COMBINE SETUP (only once, on an el9 node) +----------------------------------------------------- +Build CMSSW + CombinedLimit: + + cmsrel CMSSW_14_1_0_pre4 + cd CMSSW_14_1_0_pre4/src && cmsenv + git clone https://github.com/cms-analysis/HiggsAnalysis-CombinedLimit.git HiggsAnalysis/CombinedLimit + scram b -j8 + +Then build the tarball that gets shipped to Condor workers: + + # from ForLimits/, with CMSSW_14_1_0_pre4 cmsenv active: + bash make_combine_tarball.sh + +This writes combine_env.tar.gz one level above CMSSW_BASE. +The path is hardcoded in submitCombine.py as COMBINE_TARBALL -- update it there if needed. + + +MAKING DATACARDS (el7 apptainer, CMSSW_10_6_48) +------------------------------------------------ +Run makeLimitsInputROOT.py for each year/channel combo. +Outputs go to LimitsInput_4bin/ (ROOT histograms) and Datacards_4bin/ (combine .txt cards). + + python makeLimitsInputROOT.py --year 2018 --channel lep + python makeLimitsInputROOT.py --year all --channel lep + bash run_limits_bjet_allyears.sh # convenience wrapper for bjet all years + +Config is in limits_config.yaml -- edit paths, bins, or year/channel defaults there. +The 4-bin setup is [0, 0.1, 0.4, 2.0, 4.0] cm and is the default. + + +RUNNING COMBINE (el9, CMSSW_14_1_0_pre4) +----------------------------------------- +Always run asymptotic first -- HybridNew uses the asymptotic result to set rMax. + + python submitCombine.py --tag 4bin --method asymptotic + python submitCombine.py --tag 4bin --method hybridnew + +Useful flags: + --dry-run write job files but don't submit + --skip-existing skip hypotheses that already have output + --subset VH,mfv_neu only submit these processes + --sig-id VH_tau1mm_M15 only submit this one hypothesis + --limit 5 cap at N jobs (good for testing) + +The --tag 4bin flag routes everything through Datacards_4bin/, CombineOutput_4bin/, CombineCondor_4bin/. +ttH signals are skipped -- combineCards fails for those due to a negative signal rate corner case. + + +PLOTTING +-------- +Run inside CMSSW_14_1_0_pre4 (has scipy + matplotlib). + + python3 plotLimits.py --combine-out CombineOutput_4bin --out-dir LimitPlots_4bin + +Add --comparison-dir LimitPlots_4bin_Comparison to also make HybridNew vs Asymptotic overlays. +Add --subset VH,mfv_neu to only plot specific processes. + + +NUISANCE TABLES +--------------- +Pickle files under NuisTabStore_*/ are precomputed and read at datacard-making time. +To regenerate them (usually not needed): + + python turn_7p4p1_to_2darr.py # displaced trigger uncertainties + python turn_TrkMvr_to_2darr.py # TrackMover vertex reco uncertainties + python turn_TrkRec_to_2darr.py # track reco efficiency (VH only) diff --git a/MFVNeutralino/test/ForLimits/cleanup_failed_limits.sh b/MFVNeutralino/test/ForLimits/cleanup_failed_limits.sh new file mode 100755 index 000000000..a22f96f8d --- /dev/null +++ b/MFVNeutralino/test/ForLimits/cleanup_failed_limits.sh @@ -0,0 +1,31 @@ +#!/bin/bash +# Delete output files for jobs that hit "Cannot set higher limit" +# so they can be resubmitted with --skip-existing. +CONDOR=/uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648/src/JMTucker/MFVNeutralino/test/ForLimits/CombineCondor +OUT=/uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648/src/JMTucker/MFVNeutralino/test/ForLimits/CombineOutput + +n_del=0; n_keep=0; n_running=0 +for d in $CONDOR/*/; do + sig=$(basename $d) + log="$d/job.out" + outf="$OUT/$sig/higgsCombine${sig}.HybridNew.mH120.1234.root" + [ -f "$log" ] || continue + if grep -q "=== Done:" "$log" 2>/dev/null; then + if grep -q "Limit: r <" "$log" 2>/dev/null; then + n_keep=$((n_keep+1)) + else + # "Cannot set higher limit" — delete output so it gets resubmitted + if [ -f "$outf" ]; then + echo "DEL $sig" + rm -f "$outf" + n_del=$((n_del+1)) + fi + fi + else + n_running=$((n_running+1)) + fi +done +echo "" +echo "Kept (good limit): $n_keep" +echo "Deleted (bad/no limit): $n_del" +echo "Still running: $n_running" diff --git a/MFVNeutralino/test/ForLimits/getNuisanceFromSig.py b/MFVNeutralino/test/ForLimits/getNuisanceFromSig.py index 19d33de4b..449995a4c 100644 --- a/MFVNeutralino/test/ForLimits/getNuisanceFromSig.py +++ b/MFVNeutralino/test/ForLimits/getNuisanceFromSig.py @@ -49,7 +49,7 @@ "lep": {}, } -# Background systematics are disabled until CRs are unblinded and real uncertainties measured. +# disabled until CRs unblinded nuis_bkg = set() nuis_bkg_replacements = {} diff --git a/MFVNeutralino/test/ForLimits/helper_PyStorage_objects.py b/MFVNeutralino/test/ForLimits/helper_PyStorage_objects.py index e57f3df27..45c050a88 100644 --- a/MFVNeutralino/test/ForLimits/helper_PyStorage_objects.py +++ b/MFVNeutralino/test/ForLimits/helper_PyStorage_objects.py @@ -191,13 +191,30 @@ def __getattr__(self, name): class NuisanceInfo(object): - """Store information for one nuisance parameter line on a combine datacard. + """ + Object to store information to make a nuisance parameter. This object was defined assuming log-normal parameters, but it can be adjusted to non-log-normal parameters. + + The convention is to store e.g. 1.01 (NOT 0.01) if some fluctuation is ~1%. - Convention: store e.g. 1.01 (not 0.01) for a ~1% fluctuation. + -INPUTS- + nuis_name: string. + nuis_val: int or arr-like. Note this is meaningless if type is shape, but provide something anyway otherwise it'll crash. + make_updn: Boolean. Will this make a shape uncertainty? + sep_yrs: Boolean. If true, the nuis_name will be tagged with year number, e.g. lepSF -> lepSF8 (prevents ROOT chaining unrelated nuisances together) + -Optional Inputs- + corr: Boolean. Will this nuisance produce one line on the datacard, or more than one? If non-correlated, it will produce nuisb1, nuisb2 (or nuis7b1) etc + nuis_type: string. If make_updn is True, it MUST be "shape". + nbins: int + ana_spec: Boolean. Is this analysis-specific and gets tagged with CMS+CADI? + add_era_tags: if False, neither a year- nor Run2-tag will be added + extra_info: list + + -Other Things Stored- """ def __init__(self, nuis_name, nuis_val, make_updn, sep_yrs, corr, nuis_type="lnN", nbins=3, ana_spec=False, add_era_tags=True, extra_info=None): + """It will always expand one entry into an array of size nbins. If you don't want this behavior, give it e.g. [1, 1.05, 1] so some bins don't fluctuate.""" if extra_info is None: extra_info = [] @@ -210,11 +227,7 @@ def __init__(self, nuis_name, nuis_val, make_updn, sep_yrs, corr, except Exception: raise Exception("Unable to parse nuis_val") - # Resize nuis_val to match nbins when the array length doesn't match. - # Shorter: pad with 1.0 (no effect) -- happens when nuisance tables - # were built for fewer bins than the current scheme. - # Longer: truncate -- happens when a hardcoded per-bin array (e.g. - # pileup [1.03, 1.04, 1.06]) is used with a coarser binning. + # Pad with 1.0 or truncate to match nbins. if len(self.nuis_val) != nbins: if len(self.nuis_val) < nbins: self.nuis_val = np.concatenate( @@ -259,10 +272,11 @@ def print_diagnostics(self): class NuisanceTable(object): - """2-D (lifetime x mass) nuisance table with bilinear interpolation. + """ + Make and query a table of nuisances. - Values are always stored as fractions (not percent); set as_percent=True - if the input data is in percent. + -STORAGE- + Nuisance grid: Indexed by year (string). The values are ALWAYS interpreted as fractions (not percent). """ def __init__(self, proc="", x_vals=None, x_unit=None, y_vals=None, y_unit=None, @@ -270,6 +284,17 @@ def __init__(self, proc="", x_vals=None, x_unit=None, y_vals=None, y_unit=None, years=None, nbin_len=False, dtype=float, pickle_loc=None, make_pickle_fn=True, trig_for_pickle=None): + """ + -INPUTS- + as_percent: Boolean. If True, input 10 -> store 0.1. If False, stores exactly the input. The value stored is always interpreted as a FRACTION. + years: array-like, must be strings + nbin_len: Boolean. If False, assumes Nuisances are integers. Else it assumes len-nbins arrays. Writes arr_len. + dtype: how the np.array should represent the data + pickle_loc: if not None, it will un-pickle the specified dictionary, and construct itself. + make_pickle_fn: if True, it will add pickle_loc + "_" + proc + ".pkl" + trig_for_pickle: addresses the issue that aliases are needed for some processes, and these are trig-dependent + -Good practice: if you don't think it needs aliases, don't feed it one, so it catches errors + """ if years is None: years = set(["20161", "20162", "2017", "2018"]) diff --git a/MFVNeutralino/test/ForLimits/plotLimits.py b/MFVNeutralino/test/ForLimits/plotLimits.py index b4f0f58a0..1842228b9 100644 --- a/MFVNeutralino/test/ForLimits/plotLimits.py +++ b/MFVNeutralino/test/ForLimits/plotLimits.py @@ -73,11 +73,8 @@ "mfv_stopbbarbbar": os.path.join(_ONE2TWO, "stopstop.csv"), } -# Additional theory curves drawn on top of the primary one (keyed by process). -# For mfv_neu: EWK Higgsino N2N1 (Ñ₂χ̃₁⁰, aNNLO-NNLL, fully degenerate, 13 TeV). -# Only N2N1 is relevant: both final-state particles are neutral, matching the -# neutral LLP produced in the gluino signal MC. C1C1/N2C1 involve charginos -# which are themselves long-lived in the degenerate limit (different topology). +# Extra theory curves drawn on top (per process). For mfv_neu: EWK Higgsino N2N1 +# (aNNLO-NNLL, 13 TeV) -- both final-state particles are neutral, matching the gluino LLP. _EXTRA_THEORY_CSV = { "mfv_neu": os.path.join(_ONE2TWO, "higgsino_N2N1.csv"), } @@ -96,10 +93,8 @@ _SUSY_PROCS = {"mfv_neu", "mfv_stopdbardbar", "mfv_stopbbarbbar"} -# Fixed 2D colorbar scale (vmin, vref, vmax) in fb, keyed by process. -# vref is the neutral-color pivot (white on RdBu_r) and the colorbar reference line. -# For SUSY: pivot near the expected exclusion boundary (~1-100 fb for M~1-2 TeV). -# Falls back to automatic geometric-mean computation for unspecified processes. +# (vmin, vref, vmax) in fb for the 2D color scale; vref is the white pivot on RdBu_r. +# Unspecified processes fall back to geometric-mean auto-scaling. _2D_VSCALE = { "mfv_neu": (0.1, 10.0, 1e5), "mfv_stopdbardbar": (0.1, 10.0, 1e5), @@ -206,9 +201,7 @@ def read_limits(sig_id): if abs(q - qref) < 0.01: result[key] = float(t.limit) f.Close() - # HybridNew run with Asimov dataset (-t -1) produces a single entry with - # quantileExpected=-1 (the "observed" slot). Since data=Asimov, this IS - # the median expected limit — remap so downstream code finds it as "exp". + # -t -1 (Asimov) puts the result in quantileExpected=-1 ("obs" slot) -- remap to "exp". if method_found == "HybridNew" and "obs" in result and "exp" not in result: result["exp"] = result.pop("obs") return result if "exp" in result else None @@ -631,13 +624,9 @@ def _nearest(target): # --------------------------------------------------------------------------- def _excl_thresholds_2d(proc, masses, mass_vals, theory_csv=None): - """Return σ×B² [fb] exclusion threshold per mass column for the 2D contour. - - For SUSY: threshold = σ_theory_NLO(mass) from CSV. The r=1 Combine contour - marks σ×B²=1 fb (arbitrary σ_ref), NOT the theory exclusion boundary. - For H→SS: threshold = σ_ref_fb(proc, mass) = σ_SM × BR(1%) × filter_eff, - so r=1 Combine contour IS the SM exclusion boundary — no correction needed. - theory_csv overrides the default CSV for SUSY (used for EWK variant plots). + """Per-mass σ×B² [fb] threshold where r=1 is the physical exclusion boundary. + SUSY: σ_theory_NLO from CSV. H→SS: σ_ref_fb (_sig_scale_fb), so r=1 = SM boundary. + theory_csv overrides the SUSY default (for EWK variant plots). """ if proc in _SUSY_PROCS: csv_path = theory_csv if theory_csv is not None else _HEPDATA_THEORY_CSV.get(proc) @@ -664,11 +653,8 @@ def _interp_grid(log_ctaus, mass_vals, grid, fine_lct, fine_mass): def plot_2d(proc, mass_data, out_dir, hepdata, theory_csv=None, fname_suffix=""): masses = _sorted_masses(mass_data) - # Build a rectangular grid (NaN for missing cells, capped in _interp_grid). - # SUSY: drop masses with >1 missing ctau (e.g. M3000 hit wall time, only 2 jobs done). - # Higgs: only 3 mass points total so keep any mass with >=2 valid ctau. - # Use the union of all ctau values so no mass is excluded for lacking a corner point; - # missing (ctau, mass) cells are left as NaN and capped to "not excluded" during interpolation. + # Rectangular grid with NaN for missing cells (capped to "not excluded" in _interp_grid). + # min_n: drop masses with too few valid ctau points (SUSY needs 3+, Higgs 2+). ctau_counts = {m: len(mass_data[m]) for m in masses} max_n = max(ctau_counts.values()) min_n = max(3, max_n - 1) if proc in _SUSY_PROCS else 2 diff --git a/MFVNeutralino/test/ForLimits/script_configs.py b/MFVNeutralino/test/ForLimits/script_configs.py index f01c13724..6ea310739 100644 --- a/MFVNeutralino/test/ForLimits/script_configs.py +++ b/MFVNeutralino/test/ForLimits/script_configs.py @@ -37,8 +37,7 @@ def _abs(rel): # -------------------------------------------------------------------------- # Signal configuration # -------------------------------------------------------------------------- -# Signals that fire the lepton trigger. -# mfv_neu is NOT in the lepton channel -- it has no lepton in the hard scatter. +# Lepton trigger signals (mfv_neu excluded -- no hard-scatter lepton). _lep_sigs = [ "WminusHToSSTodddd", "WplusHToSSTodddd", "ZHToSSTodddd", "ggZHToSSTobbbb", "ggZHToSSTodddd", @@ -52,8 +51,7 @@ def _abs(rel): "ttHToLLPs_bbbb", "ttHToLLPs_dddd", ] -# Lepton-triggered signals that require a lepton reco efficiency nuisance. -# VH (ZH/WH/ggZH) and ttH have a lepton in the hard scatter; SUSY signals do not. +# Processes with a hard-scatter lepton -- get lep_effi nuisance (VH, ttH; not SUSY). lep_reco_effi_sigs = frozenset([ "WminusHToSSTodddd", "WplusHToSSTodddd", "ZHToSSTodddd", "ggZHToSSTobbbb", "ggZHToSSTodddd", diff --git a/MFVNeutralino/test/ForLimits/sig_and_bkg_configs.py b/MFVNeutralino/test/ForLimits/sig_and_bkg_configs.py index f80da93a2..bc04b347a 100644 --- a/MFVNeutralino/test/ForLimits/sig_and_bkg_configs.py +++ b/MFVNeutralino/test/ForLimits/sig_and_bkg_configs.py @@ -26,9 +26,8 @@ } -# n2v_uncs: excluded from datacards until real uncertainties are measured. -# Replace the placeholder values below and uncomment to re-enable; -# also add "n2v_unc" back to nuis_bkg in getNuisanceFromSig.py. +# n2v_uncs disabled until real uncertainties measured after unblinding. +# To re-enable: fill values below, uncomment, add "n2v_unc" to nuis_bkg. # # n2v_uncs = { # "lep": [0.0001, 0.0001, 0.0001, 0.0001], From a142db7f15cbdf1321790c0fd03792454217f88a Mon Sep 17 00:00:00 2001 From: Gianfranco de Castro Date: Wed, 10 Jun 2026 15:33:15 -0500 Subject: [PATCH 11/15] Remove BinningStudy, update plotLimits (tbs label, HepData on comparison plots, NaN interp fix) --- .../ForLimits/BinningStudy/binning_schemes.py | 85 ---- .../ForLimits/BinningStudy/boundary_scan.py | 232 ----------- .../BinningStudy/boundary_scan_2bin.py | 216 ---------- .../BinningStudy/check_fast_vs_original.py | 88 ---- .../ForLimits/BinningStudy/collect_results.py | 163 -------- .../BinningStudy/condor_binning_study.jdl | 14 - .../BinningStudy/condor_binning_study.out | 4 - .../BinningStudy/condor_binning_study.sh | 34 -- .../BinningStudy/discovery_combine_scan.py | 183 --------- .../ForLimits/BinningStudy/discovery_scan.py | 179 -------- .../BinningStudy/fast_study_datacards.py | 219 ---------- .../fast_study_datacards_systs.py | 253 ------------ .../BinningStudy/generate_variants_el7.py | 102 ----- .../BinningStudy/hybridnew_validation.py | 385 ------------------ .../BinningStudy/plot_background_templates.py | 191 --------- .../BinningStudy/plot_new_signals.py | 123 ------ .../BinningStudy/plot_scheme_comparison.py | 144 ------- .../BinningStudy/plot_syst_comparison.py | 118 ------ .../BinningStudy/run_combine_study.sh | 77 ---- .../ForLimits/BinningStudy/run_full_study.sh | 34 -- .../ForLimits/BinningStudy/run_systs_study.sh | 61 --- .../ForLimits/BinningStudy/strip_systs.py | 59 --- .../test/ForLimits/BinningStudy/tail_check.py | 24 -- MFVNeutralino/test/ForLimits/plotLimits.py | 29 +- 24 files changed, 25 insertions(+), 2992 deletions(-) delete mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/binning_schemes.py delete mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/boundary_scan.py delete mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/boundary_scan_2bin.py delete mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/check_fast_vs_original.py delete mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/collect_results.py delete mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.jdl delete mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.out delete mode 100755 MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.sh delete mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/discovery_combine_scan.py delete mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/discovery_scan.py delete mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/fast_study_datacards.py delete mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/fast_study_datacards_systs.py delete mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/generate_variants_el7.py delete mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/hybridnew_validation.py delete mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/plot_background_templates.py delete mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/plot_new_signals.py delete mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/plot_scheme_comparison.py delete mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/plot_syst_comparison.py delete mode 100755 MFVNeutralino/test/ForLimits/BinningStudy/run_combine_study.sh delete mode 100755 MFVNeutralino/test/ForLimits/BinningStudy/run_full_study.sh delete mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/run_systs_study.sh delete mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/strip_systs.py delete mode 100644 MFVNeutralino/test/ForLimits/BinningStudy/tail_check.py diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/binning_schemes.py b/MFVNeutralino/test/ForLimits/BinningStudy/binning_schemes.py deleted file mode 100644 index 231e28b49..000000000 --- a/MFVNeutralino/test/ForLimits/BinningStudy/binning_schemes.py +++ /dev/null @@ -1,85 +0,0 @@ -"""Central definition of all binning schemes and study signal points.""" - -SCHEMES = { - "old_binning": {"bins": [0., 0.08, 0.16, 4.0], "nbins": 3, - "label": "3-bin old [0, 0.08, 0.16, 4.0]"}, - "2bin": {"bins": [0., 1.6, 4.0], "nbins": 2, - "label": "2-bin [0, 1.6, 4.0]"}, - "3bin_nom": {"bins": [0., 0.8, 1.6, 4.0], "nbins": 3, - "label": "3-bin nominal [0, 0.8, 1.6, 4.0]"}, - "3bin_v1": {"bins": [0., 0.4, 1.6, 4.0], "nbins": 3, - "label": "3-bin v1 [0, 0.4, 1.6, 4.0]"}, - "3bin_v2": {"bins": [0., 0.8, 2.5, 4.0], "nbins": 3, - "label": "3-bin v2 [0, 0.8, 2.5, 4.0]"}, - "3bin_v3": {"bins": [0., 1.0, 2.0, 4.0], "nbins": 3, - "label": "3-bin v3 [0, 1.0, 2.0, 4.0]"}, - "3bin_v4": {"bins": [0., 0.5, 1.0, 4.0], "nbins": 3, - "label": "3-bin v4 [0, 0.5, 1.0, 4.0]"}, - "4bin_v1": {"bins": [0., 0.4, 0.8, 1.6, 4.0], "nbins": 4, - "label": "4-bin v1 [0, 0.4, 0.8, 1.6, 4.0]"}, - "4bin_v2": {"bins": [0., 0.8, 1.2, 1.6, 4.0], "nbins": 4, - "label": "4-bin v2 [0, 0.8, 1.2, 1.6, 4.0]"}, - # --- Per-channel split schemes (bjet and lep get different boundaries) --- - # Motivated by background shape plots: bjet bkg falls steeply by ~0.4 cm; - # lep bkg has a secondary bump to ~0.7 cm and long-lifetime signals extend flat. - "3bin_split": { - "bjet_bins": [0., 0.4, 1.2, 4.0], "bjet_nbins": 3, - "lep_bins": [0., 0.5, 1.6, 4.0], "lep_nbins": 3, - "label": "split: bjet[0,0.4,1.2,4] lep[0,0.5,1.6,4]", - }, - "3bin_split_v2": { - "bjet_bins": [0., 0.3, 1.0, 4.0], "bjet_nbins": 3, - "lep_bins": [0., 0.5, 1.6, 4.0], "lep_nbins": 3, - "label": "split v2: bjet[0,0.3,1.0,4] lep[0,0.5,1.6,4]", - }, - "3bin_412": { - "bins": [0., 0.4, 1.2, 4.0], "nbins": 3, - "label": "3-bin [0, 0.4, 1.2, 4.0]", - }, - "2bin_split": { - "bjet_bins": [0., 0.4, 4.0], "bjet_nbins": 2, - "lep_bins": [0., 0.5, 4.0], "lep_nbins": 2, - "label": "2-bin split: bjet[0,0.4,4] lep[0,0.5,4]", - }, - "4bin_split": { - "bjet_bins": [0., 0.3, 0.8, 1.6, 4.0], "bjet_nbins": 4, - "lep_bins": [0., 0.4, 0.8, 1.6, 4.0], "lep_nbins": 4, - "label": "4-bin split: bjet[0,0.3,0.8,1.6,4] lep[0,0.4,0.8,1.6,4]", - }, - # --- Round 2: high-displacement boundaries --- - # bjet: ggH tau=1mm M=55 extends to 3+ cm; add boundary at 2.5 cm - # lep: VH tau=10mm is flat to 4 cm with ~0 bkg past 2 cm; boundary at 3 cm - "4bin_412_25": {"bins": [0., 0.4, 1.2, 2.5, 4.0], "nbins": 4, - "label": "4-bin [0, 0.4, 1.2, 2.5, 4.0]"}, - "3bin_420": {"bins": [0., 0.4, 2.0, 4.0], "nbins": 3, - "label": "3-bin [0, 0.4, 2.0, 4.0]"}, - "4bin_nom_30": {"bins": [0., 0.8, 1.6, 3.0, 4.0], "nbins": 4, - "label": "4-bin [0, 0.8, 1.6, 3.0, 4.0]"}, - "4bin_516_30": {"bins": [0., 0.5, 1.6, 3.0, 4.0], "nbins": 4, - "label": "4-bin [0, 0.5, 1.6, 3.0, 4.0]"}, - "3bin_520": {"bins": [0., 0.5, 2.0, 4.0], "nbins": 3, - "label": "3-bin [0, 0.5, 2.0, 4.0]"}, - "3bin_104": {"bins": [0., 0.1, 0.4, 4.0], "nbins": 3, - "label": "3-bin [0, 0.1, 0.4, 4.0]"}, - "4bin_104_200": {"bins": [0., 0.1, 0.4, 2.0, 4.0], "nbins": 4, - "label": "4-bin [0, 0.1, 0.4, 2.0, 4.0]"}, - "4bin_104_250": {"bins": [0., 0.1, 0.4, 2.5, 4.0], "nbins": 4, - "label": "4-bin [0, 0.1, 0.4, 2.5, 4.0]"}, -} - -# (sig_id, channel) — sig_id matches Datacard___.txt filename stem -SIGNAL_POINTS = [ - # Lepton-triggered - ("VH_tau1mm_M55", "lep"), - ("VH_tau10mm_M55", "lep"), - ("VH_tau1mm_M40", "lep"), - ("VH_tau1mm_M15", "lep"), - # Displacement-triggered - ("ggHToSSTodddd_tau1mm_M55", "bjet"), - ("ggHToSSTodddd_tau1mm_M40", "bjet"), - ("mfv_stopdbardbar_tau001000um_M0200", "bjet"), - ("mfv_stopdbardbar_tau000300um_M0400", "bjet"), - ("mfv_neu_tau001000um_M0400", "bjet"), -] - -YEARS = ["20161", "20162", "2017", "2018"] diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/boundary_scan.py b/MFVNeutralino/test/ForLimits/BinningStudy/boundary_scan.py deleted file mode 100644 index b45bbb8e2..000000000 --- a/MFVNeutralino/test/ForLimits/BinningStudy/boundary_scan.py +++ /dev/null @@ -1,232 +0,0 @@ -""" -Scan expected 95% CL UL vs first boundary position. -Scheme: 3-bin [0, x, 1.6, 4.0]. - Coarse scan: x = 0.2..1.4 in steps of 0.1 (existing) - Fine scan: x = 0.01..0.10 in steps of 0.01 (extended) - -Usage: - python3 boundary_scan.py gen # generate datacards (LCG dev3 or cmsenv) - python3 boundary_scan.py run # run combine (cmsenv) - python3 boundary_scan.py plot # make plot (LCG dev3) - python3 boundary_scan.py # all three -""" -import os, sys, subprocess -import numpy as np - -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from binning_schemes import SIGNAL_POINTS, YEARS -from fast_study_datacards import run_scheme, get_bkg_yields, get_sig_files, get_sig_shape, parse_ref_yield, write_datacard - -HERE = os.path.dirname(os.path.abspath(__file__)) -DC_BASE = os.path.join(HERE, "datacards") -OUT_BASE = os.path.join(HERE, "combine_output") - -FINE_VALS = [round(i * 0.01, 2) for i in range(1, 11)] # 0.01..0.10 -COARSE_VALS = [round(v * 0.1, 1) for v in range(2, 15)] # 0.20..1.40 (existing) -SCAN_VALS = FINE_VALS + COARSE_VALS -SECOND_BDY = 1.6 -UPPER = 4.0 - -SIG_CHANNEL = {sp[0]: sp[1] for sp in SIGNAL_POINTS} - -def scheme_name(x): - # fine range uses 'f' prefix with 3-digit millimeter representation - if x < 0.15: - return "scan_b1_f%03d" % round(x * 1000) - return "scan_b1_%02d" % round(x * 10) - -def scheme_bins(x): - return [0., x, SECOND_BDY, UPPER] - - -# ---- generation ------------------------------------------------------- - -def gen_all(): - try: - import ROOT - ROOT.gROOT.SetBatch(True) - except ImportError: - print("ERROR: ROOT not available"); sys.exit(1) - - for x in SCAN_VALS: - name = scheme_name(x) - bins = scheme_bins(x) - info = {"bins": bins, "nbins": len(bins) - 1} - # Check whether any signal/year datacards are missing - missing = False - for sig_id, ch in SIGNAL_POINTS: - for yr in YEARS: - p = os.path.join(DC_BASE, name, ch, - "Datacard_%s_%s_%s_statonly.txt" % (ch, sig_id, yr)) - if not os.path.exists(p): - missing = True - break - if missing: - break - if not missing: - print("SKIP %s (all datacards present)" % name) - continue - print("\n=== scan x=%.2f %s ===" % (x, bins)) - run_scheme(name, info) - print("\nGeneration done.") - - -# ---- combine ---------------------------------------------------------- - -def run_all(): - for x in SCAN_VALS: - name = scheme_name(x) - dc_dir = os.path.join(DC_BASE, name) - if not os.path.isdir(dc_dir): - print("SKIP %s (no datacards)" % name) - continue - for sig_id, ch in SIGNAL_POINTS: - _run_one(name, sig_id, ch) - print("\nCombine done.") - - -def _run_one(scheme, sig_id, ch): - work = os.path.join(OUT_BASE, scheme, sig_id) - os.makedirs(work, exist_ok=True) - - card_args = [] - for yr in YEARS: - p = os.path.join(DC_BASE, scheme, ch, - "Datacard_%s_%s_%s_statonly.txt" % (ch, sig_id, yr)) - if not os.path.exists(p): - print(" SKIP (missing card): %s/%s" % (scheme, sig_id)) - return - card_args.append("%s_%s=%s" % (ch, yr, p)) - - combined = os.path.join(work, "combined_%s.txt" % sig_id) - r = subprocess.run(["combineCards.py"] + card_args, - capture_output=True, text=True) - if r.returncode != 0: - print(" combineCards FAILED: %s/%s" % (scheme, sig_id)) - return - with open(combined, "w") as fh: - fh.write(r.stdout) - - subprocess.run( - ["combine", "-M", "AsymptoticLimits", - "--name", "%s_%s" % (scheme, sig_id), - combined, "--expectSignal", "0", "-v", "0"], - cwd=work, capture_output=True) - - -# ---- collect results -------------------------------------------------- - -def collect(): - try: - import ROOT - ROOT.gROOT.SetBatch(True) - except ImportError: - print("ERROR: ROOT not available"); sys.exit(1) - - results = {} # x -> sig_id -> expected_median_UL - for x in SCAN_VALS: - name = scheme_name(x) - out_dir = os.path.join(OUT_BASE, name) - if not os.path.isdir(out_dir): - continue - results[x] = {} - for sig_id, ch in SIGNAL_POINTS: - work = os.path.join(out_dir, sig_id) - pattern = "higgsCombine%s_%s.AsymptoticLimits" % (name, sig_id) - ul = None - for fn in (os.listdir(work) if os.path.isdir(work) else []): - if fn.startswith(pattern) and fn.endswith(".root"): - f = ROOT.TFile(os.path.join(work, fn)) - t = f.Get("limit") - try: - for ev in t: - if abs(ev.quantileExpected - 0.5) < 0.01: - ul = float(ev.limit) - break - except TypeError: - print(" WARN: unreadable file %s" % fn) - f.Close() - break - results[x][sig_id] = ul - return results - - -# ---- plot ------------------------------------------------------------- - -def plot(results): - import matplotlib - matplotlib.use("Agg") - import matplotlib.pyplot as plt - - sigs = [sp[0] for sp in SIGNAL_POINTS] - - SIG_LABELS = { - "VH_tau1mm_M55": r"VH $\tau$=1mm $M$=55 (lep)", - "VH_tau10mm_M55": r"VH $\tau$=10mm $M$=55 (lep)", - "VH_tau1mm_M40": r"VH $\tau$=1mm $M$=40 (lep)", - "VH_tau1mm_M15": r"VH $\tau$=1mm $M$=15 (lep)", - "ggHToSSTodddd_tau1mm_M55": r"ggH $\tau$=1mm $M$=55 (bjet)", - "ggHToSSTodddd_tau1mm_M40": r"ggH $\tau$=1mm $M$=40 (bjet)", - "mfv_stopdbardbar_tau001000um_M0200": r"stop $\tau$=1mm $M$=200 (bjet)", - "mfv_stopdbardbar_tau000300um_M0400": r"stop $\tau$=0.3mm $M$=400 (bjet)", - "mfv_neu_tau001000um_M0400": r"neu $\tau$=1mm $M$=400 (bjet)", - } - COLORS = ["royalblue","tomato","cornflowerblue","skyblue", - "forestgreen","limegreen","darkorange","purple","saddlebrown"] - - xs = sorted(results.keys()) - nom_x = 0.8 - # x-tick labels: show all fine points and every other coarse point - tick_xs = [x for x in xs if x <= 0.10 or abs(round(x * 10) % 2) < 0.01] - - fig, axes = plt.subplots(1, 2, figsize=(16, 5)) - - for ax, sig_ids, title in [ - (axes[0], [s for s in sigs if SIG_CHANNEL[s] == "bjet"], "Bjet channel"), - (axes[1], [s for s in sigs if SIG_CHANNEL[s] == "lep"], "Lepton channel"), - ]: - for sig_id, color in zip(sig_ids, COLORS): - lbl = SIG_LABELS.get(sig_id, sig_id) - uls = [results.get(x, {}).get(sig_id) for x in xs] - valid_x = [x for x, u in zip(xs, uls) if u is not None] - valid_ul = [u for u in uls if u is not None] - if not valid_ul: - continue - ax.plot(valid_x, valid_ul, "o-", color=color, lw=1.8, ms=4, - label=lbl) - - ax.axvline(nom_x, color="black", ls="--", lw=1.2, label="Nominal (0.8 cm)") - ax.set_xlabel("First boundary (cm)", fontsize=12) - ax.set_ylabel("Exp. 95% CL UL on r", fontsize=11) - ax.set_title(title, fontsize=12) - ax.set_xticks(tick_xs) - ax.set_xticklabels(["%.2f" % v for v in tick_xs], rotation=45, ha="right", fontsize=7) - ax.legend(fontsize=8, framealpha=0.85) - ax.grid(alpha=0.3) - - fig.suptitle(r"Expected UL vs first boundary — scheme [0, $x$, 1.6, 4.0] cm", - fontsize=12) - fig.tight_layout() - - for ext in ("pdf", "png"): - out = os.path.join(HERE, "boundary_scan.%s" % ext) - fig.savefig(out, bbox_inches="tight", dpi=150) - print("Saved:", out) - - -# ---- main ------------------------------------------------------------- - -def main(): - mode = sys.argv[1] if len(sys.argv) > 1 else "all" - - if mode in ("gen", "all"): - gen_all() - if mode in ("run", "all"): - run_all() - if mode in ("plot", "all"): - results = collect() - plot(results) - - -if __name__ == "__main__": - main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/boundary_scan_2bin.py b/MFVNeutralino/test/ForLimits/BinningStudy/boundary_scan_2bin.py deleted file mode 100644 index fcc812f2d..000000000 --- a/MFVNeutralino/test/ForLimits/BinningStudy/boundary_scan_2bin.py +++ /dev/null @@ -1,216 +0,0 @@ -""" -2-bin boundary scan: [0, x, 4.0] - Fine: x = 0.01..0.10 in steps of 0.01 - Coarse: x = 0.20..3.90 in steps of 0.10 - -Usage: - python3 boundary_scan_2bin.py gen # generate datacards (LCG dev3 or cmsenv) - python3 boundary_scan_2bin.py run # run combine (cmsenv) - python3 boundary_scan_2bin.py plot # make plot (LCG dev3) - python3 boundary_scan_2bin.py # all three -""" -import os, sys, subprocess -import numpy as np - -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from binning_schemes import SIGNAL_POINTS, YEARS -from fast_study_datacards import run_scheme, parse_ref_yield, write_datacard - -HERE = os.path.dirname(os.path.abspath(__file__)) -DC_BASE = os.path.join(HERE, "datacards") -OUT_BASE = os.path.join(HERE, "combine_output") - -FINE_VALS = [round(i * 0.01, 2) for i in range(1, 11)] # 0.01..0.10 -COARSE_VALS = [round(i * 0.1, 1) for i in range(2, 40)] # 0.20..3.90 -SCAN_VALS = FINE_VALS + COARSE_VALS -UPPER = 4.0 - -SIG_CHANNEL = {sp[0]: sp[1] for sp in SIGNAL_POINTS} - - -def scheme_name(x): - return "scan2b_%03d" % round(x * 100) - -def scheme_bins(x): - return [0., x, UPPER] - - -# ---- generation ------------------------------------------------------- - -def gen_all(): - try: - import ROOT - ROOT.gROOT.SetBatch(True) - except ImportError: - print("ERROR: ROOT not available"); sys.exit(1) - - for x in SCAN_VALS: - name = scheme_name(x) - dc_check = os.path.join(DC_BASE, name) - if os.path.isdir(dc_check): - print("SKIP %s (datacards exist)" % name) - continue - bins = scheme_bins(x) - print("\n=== scan2b x=%.2f %s ===" % (x, bins)) - info = {"bins": bins, "nbins": len(bins) - 1} - run_scheme(name, info) - print("\nGeneration done.") - - -# ---- combine ---------------------------------------------------------- - -def run_all(): - for x in SCAN_VALS: - name = scheme_name(x) - dc_dir = os.path.join(DC_BASE, name) - if not os.path.isdir(dc_dir): - print("SKIP %s (no datacards)" % name) - continue - for sig_id, ch in SIGNAL_POINTS: - _run_one(name, sig_id, ch) - print("\nCombine done.") - - -def _run_one(scheme, sig_id, ch): - work = os.path.join(OUT_BASE, scheme, sig_id) - os.makedirs(work, exist_ok=True) - - card_args = [] - for yr in YEARS: - p = os.path.join(DC_BASE, scheme, ch, - "Datacard_%s_%s_%s_statonly.txt" % (ch, sig_id, yr)) - if not os.path.exists(p): - print(" SKIP (missing card): %s/%s" % (scheme, sig_id)) - return - card_args.append("%s_%s=%s" % (ch, yr, p)) - - combined = os.path.join(work, "combined_%s.txt" % sig_id) - r = subprocess.run(["combineCards.py"] + card_args, - capture_output=True, text=True) - if r.returncode != 0: - print(" combineCards FAILED: %s/%s" % (scheme, sig_id)) - return - with open(combined, "w") as fh: - fh.write(r.stdout) - - subprocess.run( - ["combine", "-M", "AsymptoticLimits", - "--name", "%s_%s" % (scheme, sig_id), - combined, "--expectSignal", "0", "-v", "0"], - cwd=work, capture_output=True) - - -# ---- collect results -------------------------------------------------- - -def collect(): - try: - import ROOT - ROOT.gROOT.SetBatch(True) - except ImportError: - print("ERROR: ROOT not available"); sys.exit(1) - - results = {} # x -> sig_id -> expected_median_UL - for x in SCAN_VALS: - name = scheme_name(x) - out_dir = os.path.join(OUT_BASE, name) - if not os.path.isdir(out_dir): - continue - results[x] = {} - for sig_id, ch in SIGNAL_POINTS: - work = os.path.join(out_dir, sig_id) - pattern = "higgsCombine%s_%s.AsymptoticLimits" % (name, sig_id) - ul = None - for fn in (os.listdir(work) if os.path.isdir(work) else []): - if fn.startswith(pattern) and fn.endswith(".root"): - f = ROOT.TFile(os.path.join(work, fn)) - t = f.Get("limit") - try: - for ev in t: - if abs(ev.quantileExpected - 0.5) < 0.01: - ul = float(ev.limit) - break - except TypeError: - print(" WARN: unreadable file %s" % fn) - f.Close() - break - results[x][sig_id] = ul - return results - - -# ---- plot ------------------------------------------------------------- - -def plot(results): - import matplotlib - matplotlib.use("Agg") - import matplotlib.pyplot as plt - - sigs = [sp[0] for sp in SIGNAL_POINTS] - - SIG_LABELS = { - "VH_tau1mm_M55": r"VH $\tau$=1mm $M$=55 (lep)", - "VH_tau10mm_M55": r"VH $\tau$=10mm $M$=55 (lep)", - "VH_tau1mm_M40": r"VH $\tau$=1mm $M$=40 (lep)", - "VH_tau1mm_M15": r"VH $\tau$=1mm $M$=15 (lep)", - "ggHToSSTodddd_tau1mm_M55": r"ggH $\tau$=1mm $M$=55 (bjet)", - "ggHToSSTodddd_tau1mm_M40": r"ggH $\tau$=1mm $M$=40 (bjet)", - "mfv_stopdbardbar_tau001000um_M0200": r"stop $\tau$=1mm $M$=200 (bjet)", - "mfv_stopdbardbar_tau000300um_M0400": r"stop $\tau$=0.3mm $M$=400 (bjet)", - "mfv_neu_tau001000um_M0400": r"neu $\tau$=1mm $M$=400 (bjet)", - } - COLORS = ["royalblue","tomato","cornflowerblue","skyblue", - "forestgreen","limegreen","darkorange","purple","saddlebrown"] - - xs = sorted(results.keys()) - # x-ticks: all fine points + every other coarse point - tick_xs = [x for x in xs if x <= 0.10 or abs(round(x * 10) % 2) < 0.01] - - fig, axes = plt.subplots(1, 2, figsize=(16, 5)) - - for ax, sig_ids, title in [ - (axes[0], [s for s in sigs if SIG_CHANNEL[s] == "bjet"], "Bjet channel"), - (axes[1], [s for s in sigs if SIG_CHANNEL[s] == "lep"], "Lepton channel"), - ]: - for sig_id, color in zip(sig_ids, COLORS): - lbl = SIG_LABELS.get(sig_id, sig_id) - uls = [results.get(x, {}).get(sig_id) for x in xs] - valid_x = [x for x, u in zip(xs, uls) if u is not None] - valid_ul = [u for u in uls if u is not None] - if not valid_ul: - continue - ax.plot(valid_x, valid_ul, "o-", color=color, lw=1.8, ms=4, - label=lbl) - - ax.set_xlabel("Boundary x (cm)", fontsize=12) - ax.set_ylabel("Exp. 95% CL UL on r", fontsize=11) - ax.set_title(title, fontsize=12) - ax.set_xticks(tick_xs) - ax.set_xticklabels(["%.2f" % v for v in tick_xs], rotation=45, ha="right", fontsize=7) - ax.legend(fontsize=8, framealpha=0.85) - ax.grid(alpha=0.3) - - fig.suptitle(r"Expected UL vs boundary — scheme [0, $x$, 4.0] cm (2-bin)", - fontsize=12) - fig.tight_layout() - - for ext in ("pdf", "png"): - out = os.path.join(HERE, "boundary_scan_2bin.%s" % ext) - fig.savefig(out, bbox_inches="tight", dpi=150) - print("Saved:", out) - - -# ---- main ------------------------------------------------------------- - -def main(): - mode = sys.argv[1] if len(sys.argv) > 1 else "all" - - if mode in ("gen", "all"): - gen_all() - if mode in ("run", "all"): - run_all() - if mode in ("plot", "all"): - results = collect() - plot(results) - - -if __name__ == "__main__": - main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/check_fast_vs_original.py b/MFVNeutralino/test/ForLimits/BinningStudy/check_fast_vs_original.py deleted file mode 100644 index b73b6c033..000000000 --- a/MFVNeutralino/test/ForLimits/BinningStudy/check_fast_vs_original.py +++ /dev/null @@ -1,88 +0,0 @@ -""" -Cross-check: compare fast_study_datacards.py yields vs the original -3bin_nom datacards produced by the full makeLimitsInputROOT.py pipeline. - -Prints a table of (original, fast, % diff) for signal and background -yields in each bin for each year / signal point. - -Usage: - source LCG dev3 setup - python3 check_fast_vs_original.py -""" -import os, sys, re -import numpy as np - -try: - import ROOT - ROOT.gROOT.SetBatch(True) -except ImportError: - print("ERROR: ROOT not available"); sys.exit(1) - -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from binning_schemes import SCHEMES, SIGNAL_POINTS, YEARS -from fast_study_datacards import ( - parse_ref_yield, get_bkg_yields, get_sig_files, get_sig_shape -) - -HERE = os.path.dirname(os.path.abspath(__file__)) -NOM_BINS = SCHEMES["3bin_nom"]["bins"] - - -def parse_original_rates(sig_id, ch, year): - """Return (sig_yields, bkg_yields) lists from original 3bin_nom stat-only card.""" - dc = os.path.join(HERE, "datacards", "3bin_nom", ch, - "Datacard_%s_%s_%s_statonly.txt" % (ch, sig_id, year)) - for line in open(dc): - if line.startswith("rate"): - vals = list(map(float, line.split()[1:])) - n = len(vals) // 2 - return vals[:n], vals[n:] - raise RuntimeError("No rate line in %s" % dc) - - -def recompute_fast(sig_id, ch, year): - """Recompute yields the same way fast_study_datacards.py would.""" - bins = NOM_BINS - ref_yield = parse_ref_yield(sig_id, ch, year) - files = get_sig_files(sig_id, ch, year) - shape = get_sig_shape(files, bins) - sig_ylds = [s * ref_yield for s in shape] - bkg_ylds = get_bkg_yields(ch, year, bins) - return sig_ylds, bkg_ylds - - -def pct(a, b): - if abs(b) < 1e-12: - return " n/a " if abs(a) < 1e-12 else " +inf%" - return "%+6.2f%%" % (100.0 * (a - b) / b) - - -print("%-42s %-5s %-25s %-25s %s" % ( - "signal / year", "bin", "original (full pipeline)", "fast (recomputed)", "diff")) -print("-" * 115) - -max_sig_diff = 0.0 -max_bkg_diff = 0.0 - -for sig_id, ch in SIGNAL_POINTS: - for year in YEARS: - try: - orig_sig, orig_bkg = parse_original_rates(sig_id, ch, year) - fast_sig, fast_bkg = recompute_fast(sig_id, ch, year) - except Exception as e: - print(" SKIP %s %s: %s" % (sig_id, year, e)) - continue - - label = "%s / %s" % (sig_id[-20:], year) - for i in range(len(orig_sig)): - d_sig = abs(fast_sig[i] - orig_sig[i]) / orig_sig[i] * 100 if orig_sig[i] > 1e-12 else 0 - d_bkg = abs(fast_bkg[i] - orig_bkg[i]) / orig_bkg[i] * 100 if orig_bkg[i] > 1e-12 else 0 - max_sig_diff = max(max_sig_diff, d_sig) - max_bkg_diff = max(max_bkg_diff, d_bkg) - print("%-42s bin%d sig: %9.4f vs %9.4f %s bkg: %9.5f vs %9.5f %s" % ( - label if i == 0 else "", i, - orig_sig[i], fast_sig[i], pct(fast_sig[i], orig_sig[i]), - orig_bkg[i], fast_bkg[i], pct(fast_bkg[i], orig_bkg[i]))) - -print() -print("Max signal diff: %.3f%% Max background diff: %.3f%%" % (max_sig_diff, max_bkg_diff)) diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/collect_results.py b/MFVNeutralino/test/ForLimits/BinningStudy/collect_results.py deleted file mode 100644 index 195fb8b04..000000000 --- a/MFVNeutralino/test/ForLimits/BinningStudy/collect_results.py +++ /dev/null @@ -1,163 +0,0 @@ -# Usage: python collect_results.py -import os, sys - -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from binning_schemes import SCHEMES - -try: - import ROOT - ROOT.gROOT.SetBatch(True) - HAS_ROOT = True -except ImportError: - HAS_ROOT = False - -HERE = os.path.dirname(os.path.abspath(__file__)) -OUT_BASE = os.path.join(HERE, "combine_output") - -SCHEMES_ORDER = list(SCHEMES.keys()) -SCHEME_LABELS = {k: v["label"] for k, v in SCHEMES.items()} - -SIG_LABELS = { - "VH_tau1mm_M55": "VH tau=1mm M=55 (lep)", - "VH_tau10mm_M55": "VH tau=10mm M=55 (lep)", - "VH_tau1mm_M40": "VH tau=1mm M=40 (lep)", - "VH_tau1mm_M15": "VH tau=1mm M=15 (lep)", - "ggHToSSTodddd_tau1mm_M55": "ggH tau=1mm M=55 (bjet)", - "ggHToSSTodddd_tau1mm_M40": "ggH tau=1mm M=40 (bjet)", - "mfv_stopdbardbar_tau001000um_M0200": "stop tau=1mm M=200 (bjet)", - "mfv_stopdbardbar_tau000300um_M0400": "stop tau=0.3mm M=400 (bjet)", - "mfv_neu_tau001000um_M0400": "neu tau=1mm M=400 (bjet)", -} - - -def read_grid_sigma_r(path): - """Return sigma_r from MultiDimFit --algo grid output. - - Reads the NLL profile, finds the best-fit r, then interpolates the - crossings of deltaNLL = 0.5 on each side to get the 68% CI. - Returns the average half-width as sigma_r, or None on failure. - """ - if not HAS_ROOT or not os.path.exists(path): - return None - f = ROOT.TFile.Open(path) - if not f or f.IsZombie(): - return None - t = f.Get("limit") - if not t or t.GetEntries() < 3: - f.Close() - return None - - pts = sorted((ev.r, ev.deltaNLL) for ev in t) - f.Close() - - best_r, best_dnll = min(pts, key=lambda x: x[1]) - - # Shift so minimum is at 0 - pts = [(r, d - best_dnll) for r, d in pts] - - # Interpolate 68% crossing (deltaNLL = 0.5) on each side - def interp_crossing(pairs): - for i in range(len(pairs) - 1): - r0, d0 = pairs[i] - r1, d1 = pairs[i+1] - if d0 <= 0.5 <= d1 and abs(d1 - d0) > 1e-10: - return r0 + (0.5 - d0) * (r1 - r0) / (d1 - d0) - return None - - # left side: scan outward from best_r downward - left = sorted([(r, d) for r, d in pts if r <= best_r], reverse=True) - # right side: scan outward from best_r upward - right = sorted([(r, d) for r, d in pts if r >= best_r]) - - lo = interp_crossing(left) - hi = interp_crossing(right) - - if lo is None or hi is None: - return None - return 0.5 * (hi - lo) - - -def read_asymptotic(path): - """Return expected 95% CL UL (median quantile) or None.""" - if not HAS_ROOT or not os.path.exists(path): - return None - f = ROOT.TFile.Open(path) - if not f or f.IsZombie(): - return None - t = f.Get("limit") - if not t: - f.Close() - return None - exp = None - for ev in t: - if abs(ev.quantileExpected - 0.5) < 0.01: - exp = ev.limit - break - f.Close() - return exp - - -def collect(): - results = {} # [scheme][sig] = {"sigma_r": ..., "exp_ul": ...} - for scheme in SCHEMES_ORDER: - scheme_dir = os.path.join(OUT_BASE, scheme) - if not os.path.isdir(scheme_dir): - continue - results[scheme] = {} - for sig_id in SIG_LABELS: - sig_dir = os.path.join(scheme_dir, sig_id) - # MultiDimFit grid scan - grid_pat = os.path.join(sig_dir, - "higgsCombine%s_%s.MultiDimFit.mH120.root" % (scheme, sig_id)) - sr = read_grid_sigma_r(grid_pat) - # AsymptoticLimits - al_pat = os.path.join(sig_dir, - "higgsCombine%s_%s.AsymptoticLimits.mH120.root" % (scheme, sig_id)) - al = read_asymptotic(al_pat) - results[scheme][sig_id] = {"sigma_r": sr, "al": al} - return results - - -def print_table(results, metric, title): - print("\n" + "="*80) - print(title) - print("="*80) - - sigs = list(SIG_LABELS.keys()) - schemes = [s for s in SCHEMES_ORDER if s in results] - - print("%-26s" % "Scheme", end="") - for s in sigs: - lbl = SIG_LABELS[s].split("(")[0].strip()[:18] - print(" %-18s" % lbl, end="") - print() - print("-" * (26 + 20 * len(sigs))) - - for scheme in schemes: - print("%-26s" % SCHEME_LABELS.get(scheme, scheme), end="") - for sig in sigs: - d = results[scheme].get(sig, {}) - if metric == "sigma_r": - sr = d.get("sigma_r") - val = "%6.4f" % sr if sr is not None else " -- " - else: - al = d.get("al") - val = "%6.3f" % al if al is not None else " -- " - print(" %-18s" % val, end="") - print() - - -def main(): - results = collect() - if not results: - print("No results found in %s" % OUT_BASE) - sys.exit(1) - - print_table(results, "sigma_r", - "sigma_r (68% CI half-width on r, Asimov injection r=1, stat-only)") - print_table(results, "exp_ul", - "Expected 95% CL upper limit on r (stat-only)") - - -if __name__ == "__main__": - main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.jdl b/MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.jdl deleted file mode 100644 index da26099e5..000000000 --- a/MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.jdl +++ /dev/null @@ -1,14 +0,0 @@ -universe = vanilla -executable = /uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648/src/JMTucker/MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.sh -output = /uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648/src/JMTucker/MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.out -error = /uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648/src/JMTucker/MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.err -log = /uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648/src/JMTucker/MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.log -request_cpus = 1 -request_memory = 4000MB -request_disk = 5000000 -+DesiredOS = "EL9" -+SingularityBind = "/uscms/home,/uscms_data" -should_transfer_files = YES -when_to_transfer_output = ON_EXIT -transfer_output_files = "" -queue 1 diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.out b/MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.out deleted file mode 100644 index aaeefbf91..000000000 --- a/MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.out +++ /dev/null @@ -1,4 +0,0 @@ -[FERMIHTC-APPTAINER]: INFO -- ApptainerImage classAd detected -[FERMIHTC-APPTAINER]: INFO -- Attempting to run job in /cvmfs/singularity.opensciencegrid.org/cmssw/cms:rhel9 -[FERMIHTC-APPTAINER]: INFO -- Running /cvmfs/oasis.opensciencegrid.org/mis/apptainer/current/bin/apptainer exec --pid --ipc --contain --bind /cvmfs --bind /etc/hosts --bind /etc/grid-security --home /storage/local/data1/condor/execute/dir_3071396:/srv --pwd /srv /cvmfs/singularity.opensciencegrid.org/cmssw/cms:rhel9 ./condor_binning_study.sh -====== Step 1: Generate datacards (el7 container) ====== diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.sh b/MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.sh deleted file mode 100755 index 30b0966d4..000000000 --- a/MFVNeutralino/test/ForLimits/BinningStudy/condor_binning_study.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash -# Condor payload: generate datacards, strip systs, run combine, collect results. -# Runs on el9 batch node; el7 step uses the cmssw-cc7 apptainer wrapper. -# All I/O goes to NFS (/uscms/home mounted via SingularityBind in JDL). - -set -e -HERE="/uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648/src/JMTucker/MFVNeutralino/test/ForLimits/BinningStudy" -NEW_SCHEMES="3bin_split 3bin_split_v2 3bin_412 2bin_split 4bin_split" -CMSSW14_SRC="/uscms/home/gdecastr/nobackup/work/CMSSW_14_1_0_pre4/src" - -echo "====== Step 1: Generate datacards (el7 container) ======" -/cvmfs/cms.cern.ch/common/cmssw-cc7 -- bash -c " - source /cvmfs/cms.cern.ch/cmsset_default.sh - cd /uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648 - eval \$(scramv1 runtime -sh) 2>/dev/null - cd src/JMTucker/MFVNeutralino/test/ForLimits/BinningStudy - python generate_variants_el7.py ${NEW_SCHEMES} -" - -echo "====== Step 2: Strip systematics ======" -python3 "${HERE}/strip_systs.py" - -echo "====== Step 3: Run combine (CMSSW_14_1_0_pre4) ======" -source /cvmfs/cms.cern.ch/cmsset_default.sh -cd "${CMSSW14_SRC}" -eval $(scramv1 runtime -sh) 2>/dev/null -cd "${HERE}" -bash run_combine_study.sh ${NEW_SCHEMES} - -echo "====== Step 4: Collect results ======" -source /cvmfs/sft.cern.ch/lcg/views/dev3/latest/x86_64-el9-gcc13-opt/setup.sh 2>/dev/null || true -python3 "${HERE}/collect_results.py" | tee "${HERE}/results_new_schemes.txt" - -echo "====== Done ======" diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/discovery_combine_scan.py b/MFVNeutralino/test/ForLimits/BinningStudy/discovery_combine_scan.py deleted file mode 100644 index 16d7ce0f7..000000000 --- a/MFVNeutralino/test/ForLimits/BinningStudy/discovery_combine_scan.py +++ /dev/null @@ -1,183 +0,0 @@ -""" -Combine-based expected discovery significance scan. - -For each (signal, x), builds a single-bin [x, 4.0] datacard with - bkg = B_tail(x), sig = S_tail(x) -and runs: - combine -M Significance -t -1 --expectSignal 1 -to get Z_exp: the expected significance if the signal is present at r=1. - -This is the proper discovery-power metric — it combines signal efficiency -and background suppression into one number via the profile likelihood Asimov. - -Usage (from CMSSW environment with combine in PATH): - python3 discovery_combine_scan.py -""" -import os, sys, subprocess, tempfile, shutil, re -import numpy as np - -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from binning_schemes import YEARS -from fast_study_datacards import (BKG_FILES, N2V, get_sig_files, parse_ref_yield) - -HERE = os.path.dirname(os.path.abspath(__file__)) -SCAN_VALS = [round(i * 0.1, 1) for i in range(5, 40)] # 0.5..3.9 - -PLOT_SIGS = [ - ("ggHToSSTodddd_tau1mm_M55", "bjet", "forestgreen", r"ggH $\tau$=1mm $M$=55"), - ("ggHToSSTodddd_tau1mm_M40", "bjet", "limegreen", r"ggH $\tau$=1mm $M$=40"), - ("VH_tau1mm_M55", "lep", "royalblue", r"VH $\tau$=1mm $M$=55"), - ("VH_tau10mm_M55", "lep", "tomato", r"VH $\tau$=10mm $M$=55"), -] - - -def get_bkg_tail(ch, x): - import ROOT - f = ROOT.TFile(BKG_FILES[ch]) - h = f.Get("h_c1v_sumdbv_w_errorbars") - total = h.Integral() - scale = sum(N2V[ch]) / total - nbins = h.GetNbinsX() - tail = 0.0 - for i in range(1, nbins + 2): - if h.GetBinLowEdge(i) >= x: - tail += h.GetBinContent(i) * scale - f.Close() - return tail - - -def get_sig_tail(sig_id, ch, x): - """Returns (s_tail, n_mc_above). n_mc_above=0 means unusable.""" - import ROOT - counts_above = 0.0 - counts_total = 0.0 - for year in YEARS: - for fn in get_sig_files(sig_id, ch, year): - f = ROOT.TFile(fn) - t = f.Get("mfvMiniTree/t") - counts_above += max(t.Draw("sumdbv", "nvtx>=2 && sumdbv>=%f" % x, "goff"), 0) - counts_total += max(t.Draw("sumdbv", "nvtx>=2", "goff"), 0) - f.Close() - if counts_total == 0: - return 0.0, 0 - total_yield = sum(parse_ref_yield(sig_id, ch, yr) for yr in YEARS) - s_tail = total_yield * (counts_above / counts_total) - return s_tail, int(counts_above) - - -def make_datacard(path, b_tail, s_tail): - """Stat-only single-bin datacard. Observation is -1: Asimov used by combine -t -1.""" - with open(path, "w") as f: - f.write("imax 1\njmax 1\nkmax 0\n") - f.write("-" * 40 + "\n") - f.write("bin tail\n") - f.write("observation -1\n") - f.write("-" * 40 + "\n") - f.write("bin tail tail\n") - f.write("process sig bkg\n") - f.write("process 0 1\n") - f.write("rate %.8g %.8g\n" % (s_tail, b_tail)) - - -def run_significance(dc_path, workdir): - """Run combine -M Significance on Asimov (s+b) with r=1, return Z_exp or None.""" - tag = os.path.splitext(os.path.basename(dc_path))[0] - cmd = ["combine", "-M", "Significance", "-t", "-1", "--expectSignal", "1", - "-n", tag, dc_path] - try: - r = subprocess.run(cmd, capture_output=True, text=True, - cwd=workdir, timeout=60) - for line in r.stdout.splitlines(): - m = re.search(r"Significance:\s+([\d.eE+\-nan]+)", line) - if m: - val = m.group(1) - return float(val) if val != "nan" else None - except Exception: - pass - return None - - - -def main(): - if shutil.which("combine") is None: - print("ERROR: combine not in PATH — source CMSSW environment first.") - sys.exit(1) - - try: - import ROOT - ROOT.gROOT.SetBatch(True) - ROOT.gErrorIgnoreLevel = ROOT.kError - except ImportError: - print("ERROR: ROOT not available"); sys.exit(1) - - import matplotlib - matplotlib.use("Agg") - import matplotlib.pyplot as plt - - xs = SCAN_VALS - workdir = tempfile.mkdtemp(prefix="disc_comb_") - print("Tempdir:", workdir) - - print("Computing background tails...") - bkg = {ch: [get_bkg_tail(ch, x) for x in xs] for ch in ("bjet", "lep")} - - # --- Combine expected significance scan --- - combine_results = {} # sig_id -> list of (x, Z_exp) - for sig_id, ch, color, label in PLOT_SIGS: - print("\n%s (%s)..." % (sig_id, ch)) - pts = [] - for x, b in zip(xs, bkg[ch]): - s_tail, n_mc = get_sig_tail(sig_id, ch, x) - if n_mc < 1 or s_tail <= 0: - pts.append((x, None)) - continue - dc = os.path.join(workdir, "dc_%s_%03d.txt" % (sig_id.replace("_","")[:12], round(x*10))) - make_datacard(dc, b, s_tail) - z = run_significance(dc, workdir) - print(" x=%.1f B=%.3e S=%.4f Z_exp=%s" % ( - x, b, s_tail, "%.2f" % z if z is not None else "fail")) - pts.append((x, z)) - combine_results[sig_id] = pts - - # --- plot --- - fig, axes = plt.subplots(1, 2, figsize=(14, 6)) - - for ax, ch, title in [ - (axes[0], "bjet", "Bjet channel"), - (axes[1], "lep", "Lepton channel"), - ]: - ch_sigs = [(sid, c, col, lab) for sid, c, col, lab in PLOT_SIGS if c == ch] - - for sig_id, _, color, label in ch_sigs: - pts = combine_results[sig_id] - vx = [x for x, z in pts if z is not None] - vz = [z for _, z in pts if z is not None] - if vz: - ax.plot(vx, vz, "o-", color=color, lw=1.8, ms=4, label=label) - - ax.axhline(3.0, color="gray", ls="--", lw=1.2, label=r"3$\sigma$") - ax.axhline(5.0, color="black", ls="--", lw=1.2, label=r"5$\sigma$") - - ax.set_xlabel("4th boundary x (cm)", fontsize=11) - ax.set_ylabel(r"Expected $Z_{\rm exp}$ (sigma, Asimov $r$=1)", fontsize=10) - ax.set_title(title, fontsize=12) - ax.set_ylim(0, 12) - ax.set_xticks(xs[::2]) - ax.set_xticklabels(["%.1f" % v for v in xs[::2]], fontsize=8) - ax.legend(fontsize=9, loc="upper right", framealpha=0.85) - ax.grid(alpha=0.3) - - fig.suptitle(r"Expected discovery significance vs 4th boundary x in [0, 0.1, 0.4, $x$, 4.0] cm (single tail bin, stat-only)", - fontsize=11) - fig.tight_layout() - - for ext in ("pdf", "png"): - out = os.path.join(HERE, "discovery_combine_scan.%s" % ext) - fig.savefig(out, bbox_inches="tight", dpi=150) - print("Saved:", out) - - shutil.rmtree(workdir) - - -if __name__ == "__main__": - main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/discovery_scan.py b/MFVNeutralino/test/ForLimits/BinningStudy/discovery_scan.py deleted file mode 100644 index 068753565..000000000 --- a/MFVNeutralino/test/ForLimits/BinningStudy/discovery_scan.py +++ /dev/null @@ -1,179 +0,0 @@ -""" -Discovery boundary scan: [0, 0.1, 0.4, x, 4.0] - -For each x, computes: - - B_tail(x): integrated background in [x, 4.0] from the Run2 template - - S_tail(x): absolute expected signal events in [x, 4.0] at r=1 - -B_tail(x) is the p-value for observing >= 1 event given background-only. -Z = sqrt(2) * erfinv(1 - 2*B_tail) is the equivalent sigma. -S_tail(x) = total_run2_yield * (counts_above_x / counts_total) from MiniTree TTrees. - -Usage: - python3 discovery_scan.py # runs and plots (LCG dev3) -""" -import os, sys -import numpy as np - -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from binning_schemes import SIGNAL_POINTS, YEARS -from fast_study_datacards import (BKG_FILES, MINI_BASE, N2V, YEAR_IDX, - VH_PROCS, get_sig_files, get_sig_shape, - parse_ref_yield) - -HERE = os.path.dirname(os.path.abspath(__file__)) - -SCAN_VALS = [round(i * 0.1, 1) for i in range(5, 40)] # 0.5..3.9 -UPPER = 4.0 - -# Signals to show — pick representative ones from each channel -PLOT_SIGS = [ - ("ggHToSSTodddd_tau1mm_M55", "bjet", "forestgreen", r"ggH $\tau$=1mm $M$=55"), - ("ggHToSSTodddd_tau1mm_M40", "bjet", "limegreen", r"ggH $\tau$=1mm $M$=40"), - ("VH_tau1mm_M55", "lep", "royalblue", r"VH $\tau$=1mm $M$=55"), - ("VH_tau10mm_M55", "lep", "tomato", r"VH $\tau$=10mm $M$=55"), -] - - -def get_bkg_tail(ch, x): - """Integrated Run2 background in [x, 4.0] from the 200-bin template.""" - import ROOT - f = ROOT.TFile(BKG_FILES[ch]) - h = f.Get("h_c1v_sumdbv_w_errorbars") - total = h.Integral() - n2v_run2 = sum(N2V[ch]) - scale = n2v_run2 / total - nbins = h.GetNbinsX() - tail = 0.0 - for i in range(1, nbins + 2): # +2 to include overflow - if h.GetBinLowEdge(i) >= x: - tail += h.GetBinContent(i) * scale - f.Close() - return tail - - -def get_sig_fraction(sig_id, ch, x): - """Fraction of Run2 signal events with sumdbv >= x (from MiniTree TTrees).""" - import ROOT - counts_above = 0.0 - counts_total = 0.0 - for year in YEARS: - files = get_sig_files(sig_id, ch, year) - for fn in files: - f = ROOT.TFile(fn) - t = f.Get("mfvMiniTree/t") - n_above = t.Draw("sumdbv", "nvtx>=2 && sumdbv>=%f" % x, "goff") - n_total = t.Draw("sumdbv", "nvtx>=2", "goff") - counts_above += max(n_above, 0) - counts_total += max(n_total, 0) - f.Close() - if counts_total == 0: - return None - return counts_above / counts_total - - -def get_total_sig_yield(sig_id, ch): - """Total Run2 expected signal yield at r=1, summed over all years.""" - total = 0.0 - for year in YEARS: - try: - total += parse_ref_yield(sig_id, ch, year) - except (FileNotFoundError, RuntimeError): - pass - return total - - -def main(): - try: - import ROOT - ROOT.gROOT.SetBatch(True) - ROOT.gErrorIgnoreLevel = ROOT.kError - except ImportError: - print("ERROR: ROOT not available"); sys.exit(1) - - import matplotlib - matplotlib.use("Agg") - import matplotlib.pyplot as plt - from scipy.special import erfinv - - xs = SCAN_VALS - - # --- compute background tails --- - print("Computing background tails...") - bkg = {} - for ch in ("bjet", "lep"): - bkg[ch] = [get_bkg_tail(ch, x) for x in xs] - print(" %s done" % ch) - - # --- compute absolute signal yields in tail --- - print("Computing signal tails...") - sig_yields = {} - for sig_id, ch, color, label in PLOT_SIGS: - print(" %s..." % sig_id) - total_yield = get_total_sig_yield(sig_id, ch) - print(" Run2 total yield = %.4f" % total_yield) - fracs = [get_sig_fraction(sig_id, ch, x) for x in xs] - sig_yields[sig_id] = [total_yield * f if f is not None else None for f in fracs] - - # --- plot --- - fig, axes = plt.subplots(1, 2, figsize=(14, 6)) - - for ax, ch, title, ch_sigs in [ - (axes[0], "bjet", "Bjet channel", [s for s in PLOT_SIGS if s[1]=="bjet"]), - (axes[1], "lep", "Lepton channel", [s for s in PLOT_SIGS if s[1]=="lep"]), - ]: - ax2 = ax.twinx() - - # background tail (left axis, log scale) - ax.semilogy(xs, bkg[ch], "k-", lw=2.5, label="Bkg tail B(x,4)") - ax.axhline(1.35e-3, color="gray", ls="--", lw=1.2, label=r"3$\sigma$ threshold") - ax.axhline(2.87e-7, color="black", ls="--", lw=1.2, label=r"5$\sigma$ threshold") - - # mark where background crosses 1e-3 - for i in range(len(xs)-1): - if bkg[ch][i] >= 1e-3 > bkg[ch][i+1]: - ax.axvline(xs[i+1], color="orange", ls=":", lw=1.5, - label="B < 1e-3 @ %.1f cm" % xs[i+1]) - break - - ax.set_ylabel("Background in [x, 4.0] cm (= p-value for 1 obs. event)", fontsize=10) - ax.set_ylim(1e-8, 1.0) - - # absolute signal yields (right axis, log scale) - ax2.axhline(1.0, color="dimgray", ls=":", lw=1.2, label="1 event") - for sig_id, _, color, label in ch_sigs: - yvals = sig_yields.get(sig_id, []) - valid_x = [x for x, y in zip(xs, yvals) if y is not None and y > 0] - valid_y = [y for y in yvals if y is not None and y > 0] - if valid_y: - ax2.semilogy(valid_x, valid_y, "o--", color=color, lw=1.5, ms=4, - label=label + " (sig. events)") - - ax2.set_ylabel("Expected signal events in [x, 4.0] (r=1)", fontsize=10) - ax2.set_ylim(1e-4, 1e2) - ax2.yaxis.set_tick_params(labelsize=9) - - ax.set_xlabel("4th boundary x (cm)", fontsize=11) - ax.set_title(title, fontsize=12) - ax.set_xticks(xs[::2]) - ax.set_xticklabels(["%.1f" % v for v in xs[::2]], fontsize=8) - - # combined legend - lines1, labs1 = ax.get_legend_handles_labels() - lines2, labs2 = ax2.get_legend_handles_labels() - ax.legend(lines1 + lines2, labs1 + labs2, fontsize=8, framealpha=0.85, - loc="upper right") - ax.grid(alpha=0.3) - - fig.suptitle(r"Discovery scan — background tail & expected signal events vs 4th boundary x in [0, 0.1, 0.4, $x$, 4.0] cm", - fontsize=11) - fig.tight_layout() - - for ext in ("pdf", "png"): - out = os.path.join(HERE, "discovery_scan.%s" % ext) - fig.savefig(out, bbox_inches="tight", dpi=150) - print("Saved:", out) - - -if __name__ == "__main__": - main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/fast_study_datacards.py b/MFVNeutralino/test/ForLimits/BinningStudy/fast_study_datacards.py deleted file mode 100644 index 5804a2fe0..000000000 --- a/MFVNeutralino/test/ForLimits/BinningStudy/fast_study_datacards.py +++ /dev/null @@ -1,219 +0,0 @@ -""" -Fast datacard generator for binning study schemes. - -Instead of re-running makeLimitsInputROOT.py (processes all 120+ signals), -this reads only the 6 study signals: - - Background: rebin 200-bin BackgroundTemplates histogram to new boundaries - - Signal shape: fill histogram from MiniTree TTree (sumdbv, nvtx>=2) - - Signal normalization: read from existing 3bin_nom stat-only datacards - -Requires: PyROOT (source LCG dev3 or cmsenv with ROOT) - -Usage: - python3 fast_study_datacards.py # all new schemes - python3 fast_study_datacards.py 3bin_split 3bin_412 -""" -from __future__ import print_function -import os, sys, re, glob -import numpy as np - -try: - import ROOT - ROOT.gROOT.SetBatch(True) -except ImportError: - print("ERROR: ROOT not available. Source LCG dev3 or cmsenv.") - sys.exit(1) - -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from binning_schemes import SCHEMES, SIGNAL_POINTS, YEARS - -# --------------------------------------------------------------------------- -HERE = os.path.dirname(os.path.abspath(__file__)) -FORLIM = os.path.dirname(HERE) - -BKG_FILES = { - "lep": os.path.join(FORLIM, "BackgroundTemplates/lep/2v_from_jets_run2_5track_default_ULV30Lepm.root"), - "bjet": os.path.join(FORLIM, "BackgroundTemplates/bjet/2v_from_jets_run2_5track_default_ULV30BvetoLHTm.root"), -} - -MINI_BASE = { - "lep": "/uscms/home/gdecastr/nobackup/crabdirs/MiniTree_tag001Lepm_VH", - "bjet": "/uscms/home/gdecastr/nobackup/crabdirs/MiniTree_tag001BvetoLHTm_bjet", -} - -N2V = { - "lep": [0.001, 0.012, 0.002, 0.034], - "bjet": [0.258, 0.062, 0.078, 0.122], -} -YEAR_IDX = {y: i for i, y in enumerate(YEARS)} - -# VH: sum of 4 production modes (dddd final state only) -VH_PROCS = ["ZHToSSTodddd", "WminusHToSSTodddd", "WplusHToSSTodddd", "ggZHToSSTodddd"] - -# Ref scheme to borrow signal normalization from -REF_SCHEME = "3bin_nom" - - -# Main Datacards/ directory (fall back for signals not yet in BinningStudy/datacards/) -MAIN_DATACARDS = os.path.join(FORLIM, "Datacards") - - -# --------------------------------------------------------------------------- -def parse_ref_yield(sig_id, ch, year): - """Sum of per-bin signal rates from a reference datacard. - - Tries BinningStudy/datacards/3bin_nom first (stat-only), then falls back - to the main ForLimits/Datacards/ directory (full systematics — only the - rate line is read so systematics don't matter here). - """ - candidates = [ - os.path.join(HERE, "datacards", REF_SCHEME, ch, - "Datacard_%s_%s_%s_statonly.txt" % (ch, sig_id, year)), - os.path.join(MAIN_DATACARDS, ch, - "Datacard_%s_%s_%s.txt" % (ch, sig_id, year)), - ] - for dc in candidates: - if not os.path.exists(dc): - continue - for line in open(dc): - if line.startswith("rate"): - vals = list(map(float, line.split()[1:])) - nbins_ref = len(vals) // 2 - return sum(vals[:nbins_ref]) - raise RuntimeError("No rate line in %s" % dc) - raise FileNotFoundError("No ref datacard found for %s/%s/%s" % (sig_id, ch, year)) - - -def get_bkg_yields(ch, year, bins): - """Rebin the 200-bin background histogram to `bins`, return per-bin yields.""" - f = ROOT.TFile.Open(BKG_FILES[ch]) - h200 = f.Get("h_c1v_sumdbv_w_errorbars") - h200.SetDirectory(0) - f.Close() - nbins = len(bins) - 1 - arr = np.array(bins, dtype=np.float64) - h = h200.Rebin(nbins, "bkg_tmp", arr) - # last bin absorbs overflow (sumdbv > 4 is negligible but keep consistent) - last = h.GetBinContent(nbins) + h.GetBinContent(nbins + 1) - h.SetBinContent(nbins, last) - total = h.Integral() - scale = N2V[ch][YEAR_IDX[year]] / total if total > 0 else 0.0 - # floor at 1e-9 to avoid combine segfault on zero-background bins - return [max(h.GetBinContent(i+1) * scale, 1e-9) for i in range(nbins)] - - -def get_sig_files(sig_id, ch, year): - """Return list of minitree paths for this signal.""" - base = MINI_BASE[ch] - if sig_id.startswith("VH_"): - # Decode tau/mass from sig_id: VH_tau1mm_M55 → tau1mm, M55 - m = re.match(r"VH_(tau\S+)_(M\d+)$", sig_id) - tau, mass = m.group(1), m.group(2) - paths = [] - for proc in VH_PROCS: - p = os.path.join(base, "condor_%s_%s_%s_%s" % (proc, tau, mass, year), "minitree_0.root") - if os.path.exists(p): - paths.append(p) - return paths - else: - p = os.path.join(base, "condor_%s_%s" % (sig_id, year), "minitree_0.root") - return [p] if os.path.exists(p) else [] - - -def get_sig_shape(files, bins): - """Fill sumdbv histogram (nvtx>=2) from list of ROOT files, normalize to 1.""" - nbins = len(bins) - 1 - counts = np.zeros(nbins) - edges = np.array(bins) - for fn in files: - f = ROOT.TFile(fn) - t = f.Get("mfvMiniTree/t") - n = t.Draw("sumdbv", "1.0*(nvtx>=2)", "goff") - if n > 0: - vals = np.frombuffer(t.GetV1(), dtype=np.float64, count=n).copy() - c, _ = np.histogram(vals, bins=edges) - counts += c - f.Close() - total = counts.sum() - return counts / total if total > 0 else counts - - -def write_datacard(path, ch, sig_id, year, sig_yields, bkg_yields): - nbins = len(sig_yields) - yr_tag = {"20161": "2016pre", "20162": "2016post", "2017": "2017", "2018": "2018"}.get(year, year) - bin_names = " ".join("b%s%d" % (year, i) for i in range(nbins)) - sig_proc = "sig%s" % year - bkg_proc = "bkg%s" % yr_tag - - sig_rate = " ".join("%.10g" % v for v in sig_yields) - bkg_rate = " ".join("%.10g" % v for v in bkg_yields) - - obs_line = " ".join("0" for _ in range(nbins)) - - with open(path, "w") as fh: - fh.write("imax %d\n" % nbins) - fh.write("jmax 1\n") - fh.write("kmax 0 number of nuisance parameters\n") - fh.write("________\n") - fh.write("bin %s\n" % bin_names) - fh.write("observation %s\n" % obs_line) - fh.write("________\n") - fh.write("bin %s %s\n" % (bin_names, bin_names)) - fh.write("process %s %s\n" % ( - " ".join([sig_proc] * nbins), - " ".join([bkg_proc] * nbins))) - fh.write("process %s %s\n" % ( - " ".join(["0"] * nbins), - " ".join(["1"] * nbins))) - fh.write("rate %s %s\n" % (sig_rate, bkg_rate)) - - -def run_scheme(scheme_name, scheme_info): - is_split = "lep_bins" in scheme_info - - for sig_id, ch in SIGNAL_POINTS: - if is_split: - bins = scheme_info["%s_bins" % ch] - else: - bins = scheme_info["bins"] - nbins = len(bins) - 1 - - dc_dir = os.path.join(HERE, "datacards", scheme_name, ch) - if not os.path.exists(dc_dir): - os.makedirs(dc_dir) - - for year in YEARS: - dc_path = os.path.join(dc_dir, "Datacard_%s_%s_%s_statonly.txt" % (ch, sig_id, year)) - - try: - ref_yield = parse_ref_yield(sig_id, ch, year) - except (FileNotFoundError, RuntimeError) as e: - print(" SKIP %s/%s/%s: %s" % (scheme_name, sig_id, year, e)) - continue - - files = get_sig_files(sig_id, ch, year) - if not files: - print(" SKIP %s/%s/%s: no MiniTree files" % (scheme_name, sig_id, year)) - continue - - shape = get_sig_shape(files, bins) - sig_ylds = [s * ref_yield for s in shape] - bkg_ylds = get_bkg_yields(ch, year, bins) - - write_datacard(dc_path, ch, sig_id, year, sig_ylds, bkg_ylds) - print(" wrote %s" % os.path.relpath(dc_path, HERE)) - - -def main(): - schemes_to_run = sys.argv[1:] if len(sys.argv) > 1 else sorted(SCHEMES.keys()) - for name in schemes_to_run: - if name not in SCHEMES: - print("Unknown scheme:", name) - continue - print("\n=== Scheme:", name, "===") - run_scheme(name, SCHEMES[name]) - print("\nDone.") - - -if __name__ == "__main__": - main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/fast_study_datacards_systs.py b/MFVNeutralino/test/ForLimits/BinningStudy/fast_study_datacards_systs.py deleted file mode 100644 index 86e8f4c13..000000000 --- a/MFVNeutralino/test/ForLimits/BinningStudy/fast_study_datacards_systs.py +++ /dev/null @@ -1,253 +0,0 @@ -""" -Generate with-systematics datacards for a subset of binning schemes, -by porting nuisances from the original 3bin_nom full-pipeline cards. - -Supports schemes: 3bin_nom, 3bin_v1, 3bin_412 (add others as needed). - -Nuisance porting rules: - lnN uniform (lumi, vtx_reco, calo_ineff, disp_trig): copy as-is, repeat for new nbins. - lnN bin-dependent (pileup, tk_reco_eff): assign original bin whose range most - overlaps the new bin (conservative approximation — these are small systematics). - gmN (signal MC stats): recompute N from unweighted TTree counts per new bin; - coefficient = ref_yield / total_MC_count (constant across bins). - -Usage: - source LCG dev3 or cmsenv - python3 fast_study_datacards_systs.py # all three schemes - python3 fast_study_datacards_systs.py 3bin_nom # single scheme -""" -from __future__ import print_function -import os, sys, re -import numpy as np - -try: - import ROOT - ROOT.gROOT.SetBatch(True) -except ImportError: - print("ERROR: ROOT not available"); sys.exit(1) - -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from binning_schemes import SCHEMES, SIGNAL_POINTS, YEARS -from fast_study_datacards import ( - get_bkg_yields, get_sig_files, parse_ref_yield, YEAR_IDX -) - -HERE = os.path.dirname(os.path.abspath(__file__)) -FORLIM = os.path.dirname(HERE) -ORIG_DC = os.path.join(FORLIM, "Datacards") # full-syst nominal cards -NOM_BINS = SCHEMES["3bin_nom"]["bins"] - -SCHEMES_WITH_SYSTS = ["3bin_nom", "3bin_v1", "3bin_412"] - - -# --------------------------------------------------------------------------- - -def get_sig_counts(files, bins): - """Return (counts_per_bin, total) — unweighted, for gmN computation.""" - nbins = len(bins) - 1 - counts = np.zeros(nbins) - edges = np.array(bins) - for fn in files: - f = ROOT.TFile(fn) - t = f.Get("mfvMiniTree/t") - n = t.Draw("sumdbv", "1.0*(nvtx>=2)", "goff") - if n > 0: - vals = np.frombuffer(t.GetV1(), dtype=np.float64, count=n).copy() - c, _ = np.histogram(vals, bins=edges) - counts += c - f.Close() - return counts, counts.sum() - - -def _orig_bin_for(new_lo, new_hi, orig_bins): - """Return the index of the original bin that most overlaps [new_lo, new_hi].""" - best_k, best_overlap = 0, 0.0 - for k in range(len(orig_bins) - 1): - lo_k, hi_k = orig_bins[k], orig_bins[k + 1] - overlap = max(0.0, min(new_hi, hi_k) - max(new_lo, lo_k)) - if overlap > best_overlap: - best_overlap, best_k = overlap, k - return best_k - - -def parse_original_nuisances(dc_path): - """Parse a full-syst datacard, return (nbins, nuisance_lines_raw).""" - nbins = None - nuisance_lines = [] - for line in open(dc_path): - line = line.rstrip() - if line.startswith("imax"): - nbins = int(line.split()[1]) - if (line.startswith("CMS_") or line.startswith("lumi_")) and len(line) > 5: - nuisance_lines.append(line) - return nbins, nuisance_lines - - -def port_nuisances(nuisance_lines, orig_nbins, orig_bins, new_nbins, new_bins, - new_sig_counts, total_mc, ref_yield): - """ - Convert original nuisance lines to new binning. - Returns list of (name, type, sig_vals_list, bkg_dashes_list, extra) - where extra = gmN_N for gmN, None for lnN. - """ - ported = [] - for line in nuisance_lines: - parts = line.split() - if len(parts) < 2 + 2 * orig_nbins: - continue - name = parts[0] - ntype = parts[1] - - if ntype == "lnN": - sig_orig = parts[2 : 2 + orig_nbins] - # check if any value is not '-' - active = [v for v in sig_orig if v != "-"] - if not active: - continue - - # check if uniform - uniform = len(set(active)) == 1 - - new_sig_vals = [] - for j in range(new_nbins): - if uniform: - new_sig_vals.append(active[0]) - else: - k = _orig_bin_for(new_bins[j], new_bins[j + 1], orig_bins) - new_sig_vals.append(sig_orig[k]) - - ported.append((name, "lnN", new_sig_vals, None)) - - elif ntype == "gmN": - # original gmN: one nuisance controls one bin - # find which original bin is controlled - coeffs = parts[3 : 3 + orig_nbins] - try: - active_orig_bin = next(i for i, c in enumerate(coeffs) if c != "-") - except StopIteration: - continue - - # Emit one gmN nuisance per new bin - coeff = ref_yield / total_mc if total_mc > 0 else 0.0 - for j in range(new_nbins): - n_j = int(new_sig_counts[j]) - nname = re.sub(r"b\d+$", "nb%d" % j, name) - ported.append((nname, "gmN", j, n_j, coeff)) - - # deduplicate gmN entries (we'll get one set per original gmN line; keep first) - seen_gmN = set() - deduped = [] - for entry in ported: - if entry[1] == "gmN": - key = entry[2] # new bin index - if key in seen_gmN: - continue - seen_gmN.add(key) - deduped.append(entry) - return deduped - - -def write_datacard_with_systs(path, ch, sig_id, year, sig_yields, bkg_yields, - new_bins, nuisances): - nbins = len(sig_yields) - yr_tag = {"20161":"2016pre","20162":"2016post","2017":"2017","2018":"2018"}.get(year,year) - bin_names = " ".join("b%s%d" % (year, i) for i in range(nbins)) - sig_proc = "sig%s" % year - bkg_proc = "bkg%s" % yr_tag - obs = " ".join("0" for _ in range(nbins)) - sig_rate = " ".join("%.10g" % v for v in sig_yields) - bkg_rate = " ".join("%.10g" % max(v, 1e-9) for v in bkg_yields) - - kmax = len([e for e in nuisances if e[1] == "lnN"]) + nbins # lnN + gmN per bin - - with open(path, "w") as fh: - fh.write("imax %d\n" % nbins) - fh.write("jmax 1\n") - fh.write("kmax %d\n" % kmax) - fh.write("________\n") - fh.write("bin %s\n" % bin_names) - fh.write("observation %s\n" % obs) - fh.write("________\n") - fh.write("bin %s %s\n" % (bin_names, bin_names)) - fh.write("process %s %s\n" % ( - " ".join([sig_proc] * nbins), " ".join([bkg_proc] * nbins))) - fh.write("process %s %s\n" % ( - " ".join(["0"] * nbins), " ".join(["1"] * nbins))) - fh.write("rate %s %s\n" % (sig_rate, bkg_rate)) - fh.write("________\n\n") - - gmN_written = set() - for entry in nuisances: - if entry[1] == "lnN": - name, _, sig_vals, _ = entry - dashes = " ".join(["-"] * nbins) - fh.write("%-50s lnN %s %s\n" % ( - name, " ".join(sig_vals), dashes)) - elif entry[1] == "gmN": - name, _, j, N_j, coeff = entry - if j in gmN_written: - continue - gmN_written.add(j) - sig_cols = [" -"] * nbins - sig_cols[j] = " %.10g" % coeff - bkg_cols = ["-"] * nbins - fh.write("%-50s gmN %d %s %s\n" % ( - name, N_j, " ".join(sig_cols), " ".join(bkg_cols))) - - -def run_scheme_systs(scheme_name, bins): - nbins = len(bins) - 1 - orig_bins = NOM_BINS - - for sig_id, ch in SIGNAL_POINTS: - dc_dir = os.path.join(HERE, "datacards_systs", scheme_name, ch) - os.makedirs(dc_dir, exist_ok=True) - - for year in YEARS: - dc_path = os.path.join(dc_dir, - "Datacard_%s_%s_%s_withsysts.txt" % (ch, sig_id, year)) - - orig_dc = os.path.join(ORIG_DC, ch, - "Datacard_%s_%s_%s.txt" % (ch, sig_id, year)) - if not os.path.exists(orig_dc): - print(" SKIP (no orig card): %s/%s/%s" % (scheme_name, sig_id, year)) - continue - - try: - ref_yield = parse_ref_yield(sig_id, ch, year) - except Exception as e: - print(" SKIP: %s" % e) - continue - - files = get_sig_files(sig_id, ch, year) - if not files: - print(" SKIP (no MiniTree): %s/%s/%s" % (scheme_name, sig_id, year)) - continue - - sig_counts, total_mc = get_sig_counts(files, bins) - shape = sig_counts / total_mc if total_mc > 0 else sig_counts - sig_ylds = [float(s * ref_yield) for s in shape] - bkg_ylds = get_bkg_yields(ch, year, bins) - - orig_nbins, nuis_lines = parse_original_nuisances(orig_dc) - nuisances = port_nuisances( - nuis_lines, orig_nbins, orig_bins, nbins, bins, - sig_counts, total_mc, ref_yield) - - write_datacard_with_systs( - dc_path, ch, sig_id, year, sig_ylds, bkg_ylds, bins, nuisances) - print(" wrote %s" % os.path.relpath(dc_path, HERE)) - - -def main(): - targets = sys.argv[1:] if len(sys.argv) > 1 else SCHEMES_WITH_SYSTS - for name in targets: - if name not in SCHEMES: - print("Unknown scheme:", name); continue - print("\n=== Scheme:", name, "===") - run_scheme_systs(name, SCHEMES[name]["bins"]) - print("\nDone.") - - -if __name__ == "__main__": - main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/generate_variants_el7.py b/MFVNeutralino/test/ForLimits/BinningStudy/generate_variants_el7.py deleted file mode 100644 index 1a1b85d24..000000000 --- a/MFVNeutralino/test/ForLimits/BinningStudy/generate_variants_el7.py +++ /dev/null @@ -1,102 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# Run inside el7 apptainer + CMSSW_10_6_48 cmsenv. -# For each binning scheme: backs up limits_config.yaml, writes a modified -# version redirecting outputs to BinningStudy/, runs makeLimitsInputROOT.py, -# then restores the original yaml (even on error). -from __future__ import print_function -import os, sys, shutil, subprocess - -try: - import yaml -except ImportError: - print("ERROR: yaml not available - run inside CMSSW cmsenv.") - sys.exit(1) - -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from binning_schemes import SCHEMES - -HERE = os.path.dirname(os.path.abspath(__file__)) -FORLIM = os.path.dirname(HERE) -YAML = os.path.join(FORLIM, "limits_config.yaml") -YAML_BAK = YAML + ".study_backup" - -YEARS = ["20161", "20162", "2017", "2018"] -CHANNELS = ["lep", "bjet"] - - -def is_split(scheme_info): - return "lep_bins" in scheme_info - - -def _write_yaml(scheme_name, bins, nbins, channels): - """Write limits_config.yaml for given bins/nbins, for specified channels only.""" - with open(YAML_BAK) as f: - cfg = yaml.safe_load(f) - cfg["bins"] = bins - cfg["nbins"] = nbins - cfg["observations"] = {yr: [0]*nbins for yr in YEARS} - root_base = os.path.join(HERE, "root_output", scheme_name) - dc_base = os.path.join(HERE, "datacards", scheme_name) - for ch in channels: - for d in [os.path.join(root_base, ch), os.path.join(dc_base, ch)]: - if not os.path.exists(d): - os.makedirs(d) - cfg["root_output"][ch]["folder"] = os.path.join(root_base, ch) + "/" - cfg["datacard_output"][ch]["folder"] = os.path.join(dc_base, ch) + "/" - with open(YAML, "w") as f: - yaml.safe_dump(cfg, f, default_flow_style=False) - - -def write_study_yaml(scheme_name, scheme_info): - _write_yaml(scheme_name, scheme_info["bins"], scheme_info["nbins"], CHANNELS) - - -def restore_yaml(): - if os.path.exists(YAML_BAK): - shutil.copy2(YAML_BAK, YAML) - os.remove(YAML_BAK) - - -def run_pipeline(scheme_name, channels=None): - script = os.path.join(FORLIM, "makeLimitsInputROOT.py") - for ch in (channels or CHANNELS): - cmd = [sys.executable, script, "--year", "all", "--channel", ch] - print("\n>>> %s" % " ".join(cmd)) - ret = subprocess.call(cmd, cwd=FORLIM) - if ret != 0: - print("WARNING: exit %d for %s %s" % (ret, scheme_name, ch)) - - -def main(): - schemes_to_run = sys.argv[1:] if len(sys.argv) > 1 else sorted(SCHEMES.keys()) - - for name in schemes_to_run: - if name not in SCHEMES: - print("Unknown scheme:", name); continue - - info = SCHEMES[name] - print("\n" + "="*60) - print("SCHEME:", name) - print("="*60) - - shutil.copy2(YAML, YAML_BAK) - try: - if is_split(info): - # Run each channel separately with its own boundaries - _write_yaml(name, info["lep_bins"], info["lep_nbins"], ["lep"]) - run_pipeline(name, ["lep"]) - _write_yaml(name, info["bjet_bins"], info["bjet_nbins"], ["bjet"]) - run_pipeline(name, ["bjet"]) - else: - write_study_yaml(name, info) - run_pipeline(name) - finally: - restore_yaml() - print("Restored limits_config.yaml for scheme: %s" % name) - - print("\nAll schemes done. Nominal limits_config.yaml and Datacards/ untouched.") - - -if __name__ == "__main__": - main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/hybridnew_validation.py b/MFVNeutralino/test/ForLimits/BinningStudy/hybridnew_validation.py deleted file mode 100644 index 16d2fb671..000000000 --- a/MFVNeutralino/test/ForLimits/BinningStudy/hybridnew_validation.py +++ /dev/null @@ -1,385 +0,0 @@ -""" -HybridNew scheme comparison + validation. - -Produces two plots: - 1. hybridnew_schemes.pdf — same format as scheme_comparison.pdf but HybridNew limits - (all 18 named schemes, 9 signals) - 2. hybridnew_validation.pdf — HybridNew vs Asymptotic side-by-side for 5 key schemes - -Uses the same condor pattern as submitCombine.py: - - text2workspace.py run on submit node (needs cmsenv) - - combine binary shipped via combine_env.tar.gz - - CMSSW 14.1.0 from CVMFS on worker - -Usage: - source cmsenv first, then: - python3 hybridnew_validation.py submit # build workspaces + submit condor jobs - python3 hybridnew_validation.py check # count finished jobs - python3 hybridnew_validation.py collect # make plots (needs LCG dev3) -""" -import os, sys, subprocess, glob -import numpy as np - -HERE = os.path.dirname(os.path.abspath(__file__)) -OUTBASE = os.path.join(HERE, "combine_output") -CONDDIR = os.path.join(HERE, "condor_hybridnew") - -COMBINE_TARBALL = os.environ.get( - "COMBINE_TARBALL", - "/uscms_data/d3/gdecastr/work/combine_env.tar.gz", -) -CVMFS_CMSSW14 = "/cvmfs/cms.cern.ch/el9_amd64_gcc12/cms/cmssw/CMSSW_14_1_0/src" - -NTOYS = 20000 # --fork 2 → 20000 effective toys, ~3x noise reduction vs 2000 -SEED = 1234 # fixed seed → predictable output filename - -# All 18 named comparison schemes (same order as scheme_comparison.pdf) -ALL_SCHEMES = [ - "old_binning", "2bin", "3bin_nom", "3bin_v1", "3bin_v2", "3bin_v3", "3bin_v4", - "4bin_v1", "4bin_v2", "3bin_412", - "4bin_412_25", "3bin_420", "4bin_nom_30", "4bin_516_30", "3bin_520", - "3bin_104", "4bin_104_200", "4bin_104_250", -] - -# 5 key schemes for the HybridNew vs Asymptotic validation plot -VALIDATION_SCHEMES = ["2bin", "old_binning", "3bin_nom", "3bin_104", "4bin_104_200"] - -SHORT_LABELS = { - "old_binning": "[0,.08,.16,4]", - "2bin": "[0,1.6,4]", - "3bin_nom": "[0,.8,1.6,4]", - "3bin_v1": "[0,.4,1.6,4]", - "3bin_v2": "[0,.8,2.5,4]", - "3bin_v3": "[0,1,2,4]", - "3bin_v4": "[0,.5,1,4]", - "4bin_v1": "[0,.4,.8,\n1.6,4]", - "4bin_v2": "[0,.8,1.2,\n1.6,4]", - "3bin_412": "[0,.4,1.2,4]", - "4bin_412_25": "[0,.4,1.2,\n2.5,4]", - "3bin_420": "[0,.4,2,4]", - "4bin_nom_30": "[0,.8,1.6,\n3,4]", - "4bin_516_30": "[0,.5,1.6,\n3,4]", - "3bin_520": "[0,.5,2,4]", - "3bin_104": "[0,.1,.4,4]", - "4bin_104_200": "[0,.1,.4,\n2,4]", - "4bin_104_250": "[0,.1,.4,\n2.5,4]", -} - -SIG_SHORT = { - "VH_tau1mm_M55": "VH τ=1mm M=55 (lep)", - "VH_tau10mm_M55": "VH τ=10mm M=55 (lep)", - "VH_tau1mm_M40": "VH τ=1mm M=40 (lep)", - "VH_tau1mm_M15": "VH τ=1mm M=15 (lep)", - "ggHToSSTodddd_tau1mm_M55": "ggH τ=1mm M=55 (bjet)", - "ggHToSSTodddd_tau1mm_M40": "ggH τ=1mm M=40 (bjet)", - "mfv_stopdbardbar_tau001000um_M0200": "stop τ=1mm M=200 (bjet)", - "mfv_stopdbardbar_tau000300um_M0400": "stop τ=0.3mm M=400 (bjet)", - "mfv_neu_tau001000um_M0400": "neu τ=1mm M=400 (bjet)", -} - -# Color scheme matching scheme_comparison.pdf -NOM_COLOR = "#222222" -NBINS_COLOR = {2: "#88CCEE", 3: "#DDCC77", 4: "#CC6677"} -NBINS = { - "old_binning": 3, "2bin": 2, "3bin_nom": 3, "3bin_v1": 3, "3bin_v2": 3, - "3bin_v3": 3, "3bin_v4": 3, "4bin_v1": 4, "4bin_v2": 4, "3bin_412": 3, - "4bin_412_25": 4, "3bin_420": 3, "4bin_nom_30": 4, "4bin_516_30": 4, - "3bin_520": 3, "3bin_104": 3, "4bin_104_200": 4, "4bin_104_250": 4, -} - -def scheme_color(s): - if s == "3bin_nom": - return NOM_COLOR - return NBINS_COLOR.get(NBINS.get(s, 3), "#999999") - - -def get_jobs(schemes=None): - """Return list of (scheme, sig_id, datacard_path).""" - if schemes is None: - schemes = ALL_SCHEMES - jobs = [] - for scheme in schemes: - scheme_dir = os.path.join(OUTBASE, scheme) - if not os.path.isdir(scheme_dir): - continue - for sig_dir in sorted(os.listdir(scheme_dir)): - dc = os.path.join(scheme_dir, sig_dir, "combined_%s.txt" % sig_dir) - if os.path.exists(dc): - jobs.append((scheme, sig_dir, dc)) - return jobs - - -def hybridnew_outfile(tag): - return "higgsCombine%s.HybridNew.mH120.%d.root" % (tag, SEED) - - -def submit(): - import shutil - os.makedirs(CONDDIR, exist_ok=True) - - if not os.path.exists(COMBINE_TARBALL): - print("ERROR: combine tarball not found: %s" % COMBINE_TARBALL) - sys.exit(1) - if not shutil.which("text2workspace.py"): - print("ERROR: text2workspace.py not in PATH — source cmsenv first") - sys.exit(1) - - jobs = get_jobs() - print("Found %d jobs across %d schemes" % (len(jobs), len(ALL_SCHEMES))) - - n_submitted = 0 - n_skipped = 0 - for scheme, sig_id, dc_path in jobs: - tag = "%s_%s" % (scheme, sig_id) - work_dir = os.path.dirname(dc_path) - out_root = os.path.join(work_dir, hybridnew_outfile(tag)) - - # Skip if output already exists - if os.path.exists(out_root): - n_skipped += 1 - continue - - job_dir = os.path.join(CONDDIR, tag) - os.makedirs(job_dir, exist_ok=True) - - # Pre-convert datacard to workspace on submit node - ws = os.path.join(work_dir, "workspace_%s.root" % tag) - if not os.path.exists(ws): - ret = subprocess.call( - "text2workspace.py %s -m 125 -o %s" % (dc_path, ws), shell=True) - if ret != 0: - print("WARNING: text2workspace.py failed for %s -- skipping" % tag) - continue - - sh = os.path.join(job_dir, "run.sh") - with open(sh, "w") as f: - f.write("#!/bin/bash\nset -e\n") - f.write("source /cvmfs/cms.cern.ch/cmsset_default.sh\n") - f.write("cd %s\n" % CVMFS_CMSSW14) - f.write("eval $(scramv1 runtime -sh)\n") - f.write("cd /srv\n") - f.write("tar xf combine_env.tar.gz\n") - f.write("export PATH=/srv/combine_env/bin:$PATH\n") - f.write("export LD_LIBRARY_PATH=/srv/combine_env/lib:$LD_LIBRARY_PATH\n") - f.write("echo '=== HybridNew: %s ==='\n" % tag) - f.write("combine -M HybridNew --frequentist --testStat LHC \\\n") - f.write(" -T %d --fork 2 -t -1 -s %d \\\n" % (NTOYS, SEED)) - f.write(" --name %s \\\n" % tag) - f.write(" workspace_%s.root -v 0\n" % tag) - f.write("echo '=== Done: %s ==='\n" % tag) - os.chmod(sh, 0o755) - - jdl = os.path.join(job_dir, "submit.jdl") - with open(jdl, "w") as f: - f.write("universe = vanilla\n") - f.write("executable = %s\n" % sh) - f.write("initialdir = %s\n" % work_dir) - f.write("output = %s/job.out\n" % job_dir) - f.write("error = %s/job.err\n" % job_dir) - f.write("log = %s/job.log\n" % job_dir) - f.write("request_cpus = 2\n") - f.write("request_memory = 3000MB\n") - f.write('+DesiredOS = "EL9"\n') - f.write("should_transfer_files = YES\n") - f.write("when_to_transfer_output = ON_EXIT\n") - f.write("transfer_input_files = %s,%s\n" % (COMBINE_TARBALL, ws)) - f.write("transfer_output_files = %s\n" % hybridnew_outfile(tag)) - f.write("queue 1\n") - - ret = subprocess.call("condor_submit " + jdl, shell=True) - if ret == 0: - n_submitted += 1 - else: - print("WARNING: condor_submit failed for %s" % tag) - - print("\n%d submitted, %d already done (skipped)" % (n_submitted, n_skipped)) - - -def check(): - subprocess.call("condor_q", shell=True) - jobs = get_jobs() - done, missing = 0, [] - for scheme, sig_id, dc_path in jobs: - tag = "%s_%s" % (scheme, sig_id) - root = os.path.join(os.path.dirname(dc_path), hybridnew_outfile(tag)) - if os.path.exists(root): - done += 1 - else: - missing.append("%s/%s" % (scheme, sig_id)) - print("\n%d / %d jobs have output" % (done, len(jobs))) - if missing: - print("Missing:", missing[:10], "..." if len(missing) > 10 else "") - - -def read_hybridnew(scheme, sig_id, dc_path): - """Read HybridNew expected limit. Returns float or None.""" - import ROOT - tag = "%s_%s" % (scheme, sig_id) - root = os.path.join(os.path.dirname(dc_path), hybridnew_outfile(tag)) - if not os.path.exists(root): - files = glob.glob(os.path.join(os.path.dirname(dc_path), - "higgsCombine%s.HybridNew.mH120.*.root" % tag)) - if not files: - return None - root = files[0] - f = ROOT.TFile(root) - t = f.Get("limit") - if not t or t.GetEntries() == 0: - f.Close() - return None - t.GetEntry(0) - val = float(t.limit) - f.Close() - return val - - -def read_asymptotic(scheme, sig_id, dc_path): - """Read Asymptotic median expected limit. Returns float or None.""" - import ROOT - root = os.path.join(os.path.dirname(dc_path), - "higgsCombine%s_%s.AsymptoticLimits.mH120.root" % (scheme, sig_id)) - if not os.path.exists(root): - return None - f = ROOT.TFile(root) - t = f.Get("limit") - if not t: - f.Close() - return None - for _ in t: - if abs(t.quantileExpected - 0.5) < 0.01: - val = float(t.limit) - f.Close() - return val - f.Close() - return None - - -def collect(): - import matplotlib - matplotlib.use("Agg") - import matplotlib.pyplot as plt - import matplotlib.patches as mpatches - - try: - import ROOT - ROOT.gROOT.SetBatch(True) - ROOT.gErrorIgnoreLevel = ROOT.kError - except ImportError: - print("ERROR: ROOT not available"); sys.exit(1) - - jobs = get_jobs() - all_jobs = get_jobs(ALL_SCHEMES) - sig_ids = sorted(set(s for _, s, _ in all_jobs)) - - # Build lookup: scheme -> sig_id -> (hyb, asy) - data = {s: {} for s in ALL_SCHEMES} - for scheme, sig_id, dc_path in all_jobs: - h = read_hybridnew(scheme, sig_id, dc_path) - a = read_asymptotic(scheme, sig_id, dc_path) - data[scheme][sig_id] = (h, a) - if h is not None and a is not None: - print(" %-20s %-40s Asymp=%.3f HybNew=%.3f ratio=%.3f" % ( - scheme, sig_id, a, h, h/a)) - - # ------------------------------------------------------------------ # - # Plot 1: HybridNew scheme comparison — same style as scheme_comparison.pdf - # ------------------------------------------------------------------ # - schemes_present = [s for s in ALL_SCHEMES - if any(data[s].get(si, (None,))[0] is not None for si in sig_ids)] - xs = np.arange(len(schemes_present)) - colors = [scheme_color(s) for s in schemes_present] - - fig1, axes1 = plt.subplots(3, 3, figsize=(18, 13)) - axes1 = axes1.flatten() - - for ax, sig_id in zip(axes1, sig_ids): - nom_val = data.get("3bin_nom", {}).get(sig_id, (None,))[0] - for i, (s, c) in enumerate(zip(schemes_present, colors)): - v = data[s].get(sig_id, (None,))[0] - if v is None: - continue - ax.bar(i, v, color=c, alpha=0.90, width=0.75, - linewidth=1.5 if s == "3bin_nom" else 0.5, - edgecolor="black") - if nom_val is not None: - ax.axhline(nom_val, color="black", linestyle="--", linewidth=1.0, alpha=0.6) - - ax.set_title(SIG_SHORT.get(sig_id, sig_id), fontsize=10) - ax.set_ylabel("Exp. 95% CL UL on r", fontsize=8) - ax.set_xticks(xs) - ax.set_xticklabels([SHORT_LABELS.get(s, s) for s in schemes_present], - fontsize=6.5, rotation=30, ha="right") - ax.yaxis.set_tick_params(labelsize=8) - vals = [data[s].get(sig_id, (None,))[0] for s in schemes_present] - vals = [v for v in vals if v is not None] - if vals: - ax.set_ylim(min(vals) * 0.88, max(vals) * 1.12) - ax.grid(axis="y", alpha=0.3) - - legend_handles = [ - mpatches.Patch(color=NOM_COLOR, label="Nominal [0,0.8,1.6,4]"), - mpatches.Patch(color="#88CCEE", label="2-bin"), - mpatches.Patch(color="#DDCC77", label="3-bin alternatives"), - mpatches.Patch(color="#CC6677", label="4-bin alternatives"), - ] - fig1.legend(handles=legend_handles, loc="upper center", ncol=4, - fontsize=9, bbox_to_anchor=(0.5, 1.01)) - fig1.suptitle("Expected 95%% CL UL on r — HybridNew scheme comparison (frequentist, T=%d\xd72, Asimov)" % NTOYS, - fontsize=11, y=1.04) - fig1.tight_layout() - for ext in ("pdf", "png"): - out = os.path.join(HERE, "hybridnew_schemes.%s" % ext) - fig1.savefig(out, bbox_inches="tight", dpi=150) - print("Saved:", out) - plt.close(fig1) - - # ------------------------------------------------------------------ # - # Plot 2: HybridNew vs Asymptotic for 5 key validation schemes # - # ------------------------------------------------------------------ # - val_schemes_present = [s for s in VALIDATION_SCHEMES - if any(data[s].get(si, (None,))[0] is not None for si in sig_ids)] - val_xs = np.arange(len(val_schemes_present)) - - fig2, axes2 = plt.subplots(3, 3, figsize=(16, 12)) - axes2 = axes2.flatten() - - for ax, sig_id in zip(axes2, sig_ids): - asy_vals = [data[s].get(sig_id, (None, None))[1] for s in val_schemes_present] - hyb_vals = [data[s].get(sig_id, (None, None))[0] for s in val_schemes_present] - - for i, (a, h) in enumerate(zip(asy_vals, hyb_vals)): - if a is not None: - ax.bar(i - 0.2, a, 0.35, color="#4477AA", alpha=0.8, - label="Asymptotic" if i == 0 else "") - if h is not None: - ax.bar(i + 0.2, h, 0.35, color="#EE6677", alpha=0.8, - label="HybridNew" if i == 0 else "") - - ax.set_title(SIG_SHORT.get(sig_id, sig_id), fontsize=9) - ax.set_ylabel("Exp. 95% CL UL on r", fontsize=8) - ax.set_xticks(val_xs) - ax.set_xticklabels([SHORT_LABELS.get(s, s) for s in val_schemes_present], - fontsize=8, rotation=15, ha="right") - ax.legend(fontsize=7) - ax.grid(axis="y", alpha=0.3) - - fig2.suptitle("AsymptoticLimits vs HybridNew (-t -1, T=%d\xd72) — key schemes" % NTOYS, - fontsize=11) - fig2.tight_layout() - for ext in ("pdf", "png"): - out = os.path.join(HERE, "hybridnew_validation.%s" % ext) - fig2.savefig(out, bbox_inches="tight", dpi=150) - print("Saved:", out) - plt.close(fig2) - - -if __name__ == "__main__": - cmd = sys.argv[1] if len(sys.argv) > 1 else "help" - if cmd == "submit": - submit() - elif cmd == "collect": - collect() - elif cmd == "check": - check() - else: - print(__doc__) diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/plot_background_templates.py b/MFVNeutralino/test/ForLimits/BinningStudy/plot_background_templates.py deleted file mode 100644 index ae5a73419..000000000 --- a/MFVNeutralino/test/ForLimits/BinningStudy/plot_background_templates.py +++ /dev/null @@ -1,191 +0,0 @@ -# Background and signal shapes in sumdbv, yield-normalized. -# Background: h_c1v_sumdbv_w_errorbars scaled to Run2 n2v (expected background events). -# Signal: weighted by XS x lumi x eff (weight branch), summed over all years. -# Requires PyROOT (LCG dev3 or cmsenv). - -import os, glob -import ROOT -ROOT.gROOT.SetBatch(True) -import matplotlib -matplotlib.use("Agg") -import matplotlib.pyplot as plt -import numpy as np - -HERE = os.path.dirname(os.path.abspath(__file__)) -FORLIM = os.path.dirname(HERE) -BKG_BASE = os.path.join(FORLIM, "BackgroundTemplates") - -LEP_MINI = "/uscms/home/gdecastr/nobackup/crabdirs/MiniTree_tag001Lepm_VH" -BJET_MINI = "/uscms/home/gdecastr/nobackup/crabdirs/MiniTree_tag001BvetoLHTm_bjet" - -NOMINAL_EDGES = [0.0, 0.8, 1.6, 4.0] -YEARS = ["20161", "20162", "2017", "2018"] -REBIN = 8 # 200 -> 25 bins, width 0.16 cm -NBINS_DISP = 25 -XMAX = 4.0 - -# Run2 total expected background (sum over years), from sig_and_bkg_configs.py -N2V_RUN2 = { - "bjet": 0.258 + 0.062 + 0.078 + 0.122, # = 0.520 - "lep": 0.001 + 0.012 + 0.002 + 0.034, # = 0.049 -} - - -def get_fine_bkg(channel, tag): - """Rebin background histogram and scale to Run2 n2v yield. - Returns (edges, counts) where counts are in expected events per display bin.""" - path = os.path.join(BKG_BASE, channel, - "2v_from_jets_run2_5track_default_%s.root" % tag) - f = ROOT.TFile(path) - h = f.Get("h_c1v_sumdbv_w_errorbars") - h.SetDirectory(0) - h_rb = h.Rebin(REBIN) - nb = h_rb.GetNbinsX() - edges = np.array([h_rb.GetBinLowEdge(i+1) for i in range(nb)] - + [h_rb.GetBinLowEdge(nb+1)]) - contents = np.array([h_rb.GetBinContent(i+1) for i in range(nb)]) - f.Close() - total = contents.sum() - if total > 0: - contents = contents / total * N2V_RUN2[channel] - return edges, contents - - -def get_fine_sig_shape(mini_dirs_by_year): - """Fill sumdbv histogram (unweighted, nvtx>=2 selection). - Returns (edges, counts_normalized) normalized to unit area — shape only.""" - edges = np.linspace(0.0, XMAX, NBINS_DISP + 1) - counts = np.zeros(NBINS_DISP) - for pattern in mini_dirs_by_year: - for fn in glob.glob(pattern): - f = ROOT.TFile(fn) - t = f.Get("mfvMiniTree/t") - n = t.Draw("sumdbv", "1.0*(nvtx>=2)", "goff") - if n > 0: - vals = np.frombuffer(t.GetV1(), dtype=np.float64, count=n).copy() - c, _ = np.histogram(vals, bins=edges) - counts += c - f.Close() - bin_w = edges[1] - edges[0] - total = (counts * bin_w).sum() - if total > 0: - counts = counts / total - return edges, counts - - -def get_sig_run2_yield(sig_id, ch): - """Sum expected signal events across all 4 years from 3bin_nom stat-only datacards.""" - total = 0.0 - for year in YEARS: - dc = os.path.join(HERE, "datacards", "3bin_nom", ch, - "Datacard_%s_%s_%s_statonly.txt" % (ch, sig_id, year)) - if not os.path.exists(dc): - continue - for line in open(dc): - if line.startswith("rate"): - vals = list(map(float, line.split()[1:])) - nbins = len(vals) // 2 - total += sum(vals[:nbins]) - break - return total - - -def plot_channel(ax, channel, tag, signals, title): - # signals: list of (label, color, glob_patterns, sig_id) - edges, bkg = get_fine_bkg(channel, tag) - - # Pre-compute signal yields for y_ceil - sig_counts = [] - for label, color, patterns, sig_id in signals: - _, shape = get_fine_sig_shape(patterns) - run2_yield = get_sig_run2_yield(sig_id, channel) - bin_w = edges[1] - edges[0] - counts = shape * run2_yield * bin_w # events per display bin - sig_counts.append((label, color, counts)) - - nonzero = bkg[bkg > 0] - y_floor = nonzero.min() * 0.10 if len(nonzero) else 1e-6 - y_ceil = max(bkg.max(), max(c.max() for _, _, c in sig_counts)) * 5.0 - - bkg_disp = np.where(bkg > 0, bkg, y_floor) - ax.fill_between(edges[:-1], bkg_disp, y2=y_floor, - step="post", alpha=0.20, color="#444444") - ax.step(edges[:-1], bkg_disp, where="post", - color="#222222", lw=1.8, label="Background") - - for label, color, counts in sig_counts: - sig_disp = np.where(counts > 0, counts, y_floor) - ax.step(edges[:-1], sig_disp, where="post", color=color, lw=2.2, label=label) - - for edge in NOMINAL_EDGES[1:-1]: - ax.axvline(edge, color="black", lw=1.8, ls="--", zorder=5) - - nom_labels = [r"[0.0, 0.8)", r"[0.8, 1.6)", r"[1.6, $\infty$)"] - nom_ctrs = [0.4, 1.2, 2.8] - for ctr, lbl in zip(nom_ctrs, nom_labels): - ax.text(ctr / XMAX, 1.01, lbl, ha="center", va="bottom", - fontsize=9, color="black", transform=ax.transAxes) - - ax.set_yscale("log") - ax.set_xlim(0.0, XMAX) - ax.set_ylim(y_floor, y_ceil) - ax.set_xlabel(r"sumdbv (cm)", fontsize=12) - ax.set_ylabel(r"Expected events / 0.16 cm bin (Run 2)", fontsize=11) - ax.set_title(title, fontsize=13, pad=14) - ax.set_xticks([0.0, 0.4, 0.8, 1.2, 1.6, 2.0, 2.4, 2.8, 3.2, 3.6, 4.0]) - ax.tick_params(axis="both", labelsize=10) - ax.legend(fontsize=10, loc="upper right", framealpha=0.85) - - -def main(): - fig, axes = plt.subplots(1, 2, figsize=(14, 5.5)) - fig.suptitle("Nominal sumdbv bin boundaries", fontsize=13) - - def bjet_patterns(proc, tau, mass): - return ["%s/condor_%s_%s_%s_%s/minitree_0.root" % (BJET_MINI, proc, tau, mass, yr) - for yr in YEARS] - - VH_PROCS = ["ZHToSSTodddd", "WminusHToSSTodddd", "WplusHToSSTodddd", "ggZHToSSTodddd"] - - def lep_vh_patterns(tau, mass): - return ["%s/condor_%s_%s_%s_%s/minitree_0.root" % (LEP_MINI, proc, tau, mass, yr) - for proc in VH_PROCS for yr in YEARS] - - plot_channel( - axes[0], "bjet", "ULV30BvetoLHTm", - signals=[ - (r"$\tilde{g}\tilde{g}$, $\tau=1$ mm, $M=400$ GeV", - "royalblue", bjet_patterns("mfv_neu", "tau001000um", "M0400"), - "mfv_neu_tau001000um_M0400"), - (r"$\tilde{t}\tilde{t}^*$, $\tau=0.3$ mm, $M=400$ GeV", - "tomato", bjet_patterns("mfv_stopdbardbar", "tau000300um", "M0400"), - "mfv_stopdbardbar_tau000300um_M0400"), - (r"ggH $\to$ SS, $\tau=1$ mm, $m_S=55$ GeV", - "forestgreen", bjet_patterns("ggHToSSTodddd", "tau1mm", "M55"), - "ggHToSSTodddd_tau1mm_M55"), - ], - title="Bjet channel", - ) - - plot_channel( - axes[1], "lep", "ULV30Lepm", - signals=[ - (r"VH $\to$ SS, $\tau=1$ mm, $m_S=55$ GeV", - "royalblue", lep_vh_patterns("tau1mm", "M55"), - "VH_tau1mm_M55"), - (r"VH $\to$ SS, $\tau=10$ mm, $m_S=55$ GeV", - "tomato", lep_vh_patterns("tau10mm", "M55"), - "VH_tau10mm_M55"), - ], - title="Lepton channel", - ) - - plt.tight_layout() - for ext in ("pdf", "png"): - out = os.path.join(HERE, "background_templates.%s" % ext) - fig.savefig(out, bbox_inches="tight", dpi=150) - print("Saved:", out) - - -if __name__ == "__main__": - main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/plot_new_signals.py b/MFVNeutralino/test/ForLimits/BinningStudy/plot_new_signals.py deleted file mode 100644 index 21d01c952..000000000 --- a/MFVNeutralino/test/ForLimits/BinningStudy/plot_new_signals.py +++ /dev/null @@ -1,123 +0,0 @@ -""" -Scheme comparison plot for the three new signal points added in round 2: - VH tau=1mm M=40 (lep), VH tau=1mm M=15 (lep), ggH tau=1mm M=40 (bjet) - -Usage: - source LCG dev3 setup - python3 plot_new_signals.py -Output: new_signals_comparison.pdf / .png -""" -import os, sys -import numpy as np -import matplotlib -matplotlib.use("Agg") -import matplotlib.pyplot as plt -import matplotlib.patches as mpatches - -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from binning_schemes import SCHEMES -from collect_results import collect - -HERE = os.path.dirname(os.path.abspath(__file__)) - -SHORT_LABELS = { - "old_binning": "[0,.08,.16,4]", - "2bin": "[0,1.6,4]", - "3bin_nom": "[0,.8,1.6,4]", - "3bin_v1": "[0,.4,1.6,4]", - "3bin_v2": "[0,.8,2.5,4]", - "3bin_v3": "[0,1,2,4]", - "3bin_v4": "[0,.5,1,4]", - "4bin_v1": "[0,.4,.8,\n1.6,4]", - "4bin_v2": "[0,.8,1.2,\n1.6,4]", - "3bin_412": "[0,.4,1.2,4]", - "4bin_412_25": "[0,.4,1.2,\n2.5,4]", - "3bin_420": "[0,.4,2,4]", - "4bin_nom_30": "[0,.8,1.6,\n3,4]", - "4bin_516_30": "[0,.5,1.6,\n3,4]", - "3bin_520": "[0,.5,2,4]", - "3bin_104": "[0,.1,.4,4]", - "4bin_104_200": "[0,.1,.4,\n2,4]", - "4bin_104_250": "[0,.1,.4,\n2.5,4]", -} - -NEW_SIGS = [ - ("ggHToSSTodddd_tau1mm_M40", "ggH τ=1mm M=40 (bjet)"), - ("VH_tau1mm_M40", "VH τ=1mm M=40 (lep)"), - ("VH_tau1mm_M15", "VH τ=1mm M=15 (lep)"), -] - -ALL_SCHEMES = [ - "old_binning","2bin","3bin_nom","3bin_v1","3bin_v2","3bin_v3","3bin_v4", - "4bin_v1","4bin_v2","3bin_412", - "4bin_412_25","3bin_420","4bin_nom_30","4bin_516_30","3bin_520", - "3bin_104","4bin_104_200","4bin_104_250", -] - -NBINS_COLOR = {2: "#88CCEE", 3: "#DDCC77", 4: "#CC6677"} -NOM_COLOR = "#222222" - -def scheme_color(s): - if s == "3bin_nom": - return NOM_COLOR - nbins = SCHEMES[s].get("nbins", SCHEMES[s].get("bjet_nbins", 3)) - return NBINS_COLOR.get(nbins, "#999999") - - -def main(): - results = collect() - schemes = [s for s in ALL_SCHEMES if s in results] - xs = np.arange(len(schemes)) - colors = [scheme_color(s) for s in schemes] - - fig, axes = plt.subplots(1, 3, figsize=(18, 5)) - - for ax, (sig_id, title) in zip(axes, NEW_SIGS): - uls = [results.get(s, {}).get(sig_id, {}).get("al") for s in schemes] - nom_ul = results.get("3bin_nom", {}).get(sig_id, {}).get("al") - - for i, (x, ul, c) in enumerate(zip(xs, uls, colors)): - if ul is None: - continue - is_nom = (schemes[i] == "3bin_nom") - ax.bar(x, ul, color=c, alpha=0.90, width=0.75, - linewidth=1.5 if is_nom else 0.5, - edgecolor="black") - - if nom_ul is not None: - ax.axhline(nom_ul, color="black", linestyle="--", linewidth=1.0, alpha=0.6) - - ax.set_title(title, fontsize=11) - ax.set_ylabel("Exp. 95% CL UL on r", fontsize=9) - ax.set_xticks(xs) - ax.set_xticklabels([SHORT_LABELS.get(s, s) for s in schemes], - fontsize=6.5, rotation=30, ha="right") - ax.yaxis.set_tick_params(labelsize=9) - - vals = [v for v in uls if v is not None] - if vals: - ax.set_ylim(min(vals) * 0.88, max(vals) * 1.12) - - ax.grid(axis="y", alpha=0.3) - - legend_handles = [ - mpatches.Patch(color=NOM_COLOR, label="Nominal [0,0.8,1.6,4]"), - mpatches.Patch(color="#88CCEE", label="2-bin"), - mpatches.Patch(color="#DDCC77", label="3-bin alternatives"), - mpatches.Patch(color="#CC6677", label="4-bin alternatives"), - ] - fig.legend(handles=legend_handles, loc="upper center", ncol=4, - fontsize=9, bbox_to_anchor=(0.5, 1.02)) - - fig.suptitle("Expected 95% CL UL on r — new signal points (stat-only, Asimov)", - fontsize=11, y=1.06) - fig.tight_layout() - - for ext in ("pdf", "png"): - out = os.path.join(HERE, "new_signals_comparison.%s" % ext) - fig.savefig(out, bbox_inches="tight", dpi=150) - print("Saved:", out) - - -if __name__ == "__main__": - main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/plot_scheme_comparison.py b/MFVNeutralino/test/ForLimits/BinningStudy/plot_scheme_comparison.py deleted file mode 100644 index 8a723548d..000000000 --- a/MFVNeutralino/test/ForLimits/BinningStudy/plot_scheme_comparison.py +++ /dev/null @@ -1,144 +0,0 @@ -""" -Plot expected 95% CL UL on r for each signal point, across all binning schemes. -One panel per signal. Nominal scheme highlighted with a dashed reference line. - -Usage: - source LCG dev3 setup - python3 plot_scheme_comparison.py -Output: scheme_comparison.pdf / .png -""" -import os, sys -import numpy as np -import matplotlib -matplotlib.use("Agg") -import matplotlib.pyplot as plt -import matplotlib.patches as mpatches - -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from binning_schemes import SCHEMES -from collect_results import collect, SIG_LABELS - -HERE = os.path.dirname(os.path.abspath(__file__)) - -# Short scheme labels for the x-axis -SHORT_LABELS = { - "old_binning": "[0,.08,.16,4]", - "2bin": "[0,1.6,4]", - "3bin_nom": "[0,.8,1.6,4]", - "3bin_v1": "[0,.4,1.6,4]", - "3bin_v2": "[0,.8,2.5,4]", - "3bin_v3": "[0,1,2,4]", - "3bin_v4": "[0,.5,1,4]", - "4bin_v1": "[0,.4,.8,\n1.6,4]", - "4bin_v2": "[0,.8,1.2,\n1.6,4]", - "3bin_412": "[0,.4,1.2,4]", - "4bin_412_25": "[0,.4,1.2,\n2.5,4]", - "3bin_420": "[0,.4,2,4]", - "4bin_nom_30": "[0,.8,1.6,\n3,4]", - "4bin_516_30": "[0,.5,1.6,\n3,4]", - "3bin_520": "[0,.5,2,4]", - "3bin_104": "[0,.1,.4,4]", - "4bin_104_200": "[0,.1,.4,\n2,4]", - "4bin_104_250": "[0,.1,.4,\n2.5,4]", -} - -# Short signal labels for panel titles -SIG_SHORT = { - "VH_tau1mm_M55": "VH τ=1mm M=55 (lep)", - "VH_tau10mm_M55": "VH τ=10mm M=55 (lep)", - "VH_tau1mm_M40": "VH τ=1mm M=40 (lep)", - "VH_tau1mm_M15": "VH τ=1mm M=15 (lep)", - "ggHToSSTodddd_tau1mm_M55": "ggH τ=1mm M=55 (bjet)", - "ggHToSSTodddd_tau1mm_M40": "ggH τ=1mm M=40 (bjet)", - "mfv_stopdbardbar_tau001000um_M0200":"stop τ=1mm M=200 (bjet)", - "mfv_stopdbardbar_tau000300um_M0400":"stop τ=0.3mm M=400 (bjet)", - "mfv_neu_tau001000um_M0400": "neu τ=1mm M=400 (bjet)", -} - -ALL_SCHEMES = [ - "old_binning","2bin","3bin_nom","3bin_v1","3bin_v2","3bin_v3","3bin_v4", - "4bin_v1","4bin_v2","3bin_412", - "4bin_412_25","3bin_420","4bin_nom_30","4bin_516_30","3bin_520", - "3bin_104","4bin_104_200","4bin_104_250", -] - - -def main(): - results = collect() - - sigs = list(SIG_LABELS.keys()) - schemes = [s for s in ALL_SCHEMES if s in results] - xs = np.arange(len(schemes)) - - # Color by number of bins; nominal gets its own color - NBINS_COLOR = {2: "#88CCEE", 3: "#DDCC77", 4: "#CC6677"} - NOM_COLOR = "#222222" - def scheme_color(s): - if s == "3bin_nom": - return NOM_COLOR - nbins = SCHEMES[s].get("nbins", SCHEMES[s].get("bjet_nbins", 3)) - return NBINS_COLOR.get(nbins, "#999999") - colors = [scheme_color(s) for s in schemes] - - fig, axes = plt.subplots(3, 3, figsize=(18, 13)) - axes = axes.flatten() - - for ax, sig_id in zip(axes, sigs): - uls = [] - for s in schemes: - v = results.get(s, {}).get(sig_id, {}).get("al") - uls.append(v) - - nom_ul = results.get("3bin_nom", {}).get(sig_id, {}).get("al") - - # Bar chart - for i, (x, ul, c) in enumerate(zip(xs, uls, colors)): - if ul is None: - continue - is_nom = (schemes[i] == "3bin_nom") - ax.bar(x, ul, color=c, alpha=0.90, width=0.75, - linewidth=1.5 if is_nom else 0.5, - edgecolor="black") - - # Nominal reference line - if nom_ul is not None: - ax.axhline(nom_ul, color="black", linestyle="--", linewidth=1.0, alpha=0.6) - - ax.set_title(SIG_SHORT[sig_id], fontsize=10) - ax.set_ylabel("Exp. 95% CL UL on r", fontsize=8) - ax.set_xticks(xs) - ax.set_xticklabels([SHORT_LABELS.get(s, s) for s in schemes], - fontsize=6.5, rotation=30, ha="right") - ax.yaxis.set_tick_params(labelsize=8) - - # Y-range: just above the max bar, starting near zero - vals = [v for v in uls if v is not None] - if vals: - ymax = max(vals) * 1.12 - ymin = min(vals) * 0.88 - ax.set_ylim(ymin, ymax) - - ax.grid(axis="y", alpha=0.3) - - # Legend - legend_handles = [ - mpatches.Patch(color=NOM_COLOR, label="Nominal [0,0.8,1.6,4]"), - mpatches.Patch(color="#88CCEE", label="2-bin"), - mpatches.Patch(color="#DDCC77", label="3-bin alternatives"), - mpatches.Patch(color="#CC6677", label="4-bin alternatives"), - ] - fig.legend(handles=legend_handles, loc="upper center", ncol=4, - fontsize=9, bbox_to_anchor=(0.5, 1.01)) - - fig.suptitle("Expected 95% CL UL on r — binning scheme comparison (stat-only, Asimov)", - fontsize=11, y=1.04) - fig.tight_layout() - - for ext in ("pdf", "png"): - out = os.path.join(HERE, "scheme_comparison.%s" % ext) - fig.savefig(out, bbox_inches="tight", dpi=150) - print("Saved:", out) - - -if __name__ == "__main__": - main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/plot_syst_comparison.py b/MFVNeutralino/test/ForLimits/BinningStudy/plot_syst_comparison.py deleted file mode 100644 index e85ef874f..000000000 --- a/MFVNeutralino/test/ForLimits/BinningStudy/plot_syst_comparison.py +++ /dev/null @@ -1,118 +0,0 @@ -""" -Compare stat-only vs with-systematics expected UL for 3bin_nom, 3bin_v1, 3bin_412. -Bar chart: grouped pairs (stat-only, with-systs) per scheme per signal. -Output: syst_comparison.pdf / .png -""" -import os, sys -import numpy as np -import matplotlib -matplotlib.use("Agg") -import matplotlib.pyplot as plt -import matplotlib.patches as mpatches - -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from collect_results import collect, SIG_LABELS - -HERE = os.path.dirname(os.path.abspath(__file__)) -OUT_SYST = os.path.join(HERE, "combine_output_systs") - -SCHEMES_SYST = ["3bin_nom", "3bin_v1", "3bin_412"] -SCHEME_LABELS = { - "3bin_nom": "nom\n[0,.8,1.6,4]", - "3bin_v1": "v1\n[0,.4,1.6,4]", - "3bin_412": "412\n[0,.4,1.2,4]", -} -SIG_SHORT = { - "VH_tau1mm_M55": "VH τ=1mm M=55 (lep)", - "VH_tau10mm_M55": "VH τ=10mm M=55 (lep)", - "ggHToSSTodddd_tau1mm_M55": "ggH τ=1mm M=55 (bjet)", - "mfv_stopdbardbar_tau001000um_M0200":"stop τ=1mm M=200 (bjet)", - "mfv_stopdbardbar_tau000300um_M0400":"stop τ=0.3mm M=400 (bjet)", - "mfv_neu_tau001000um_M0400": "neu τ=1mm M=400 (bjet)", -} - - -def collect_systs(): - try: - import ROOT - ROOT.gROOT.SetBatch(True) - except ImportError: - print("ERROR: ROOT not available"); sys.exit(1) - - results = {} - for scheme in SCHEMES_SYST: - results[scheme] = {} - for sig_id in SIG_LABELS: - work = os.path.join(OUT_SYST, scheme, sig_id) - if not os.path.isdir(work): - continue - pattern = "higgsCombinesysts_%s_%s.AsymptoticLimits" % (scheme, sig_id) - for fn in os.listdir(work): - if fn.startswith(pattern) and fn.endswith(".root"): - f = ROOT.TFile(os.path.join(work, fn)) - t = f.Get("limit") - for ev in t: - if abs(ev.quantileExpected - 0.5) < 0.01: - results[scheme][sig_id] = float(ev.limit) - break - f.Close() - break - return results - - -def main(): - stat_results = collect() # from collect_results.py - syst_results = collect_systs() - - sigs = list(SIG_LABELS.keys()) - schemes = SCHEMES_SYST - - fig, axes = plt.subplots(2, 3, figsize=(14, 8)) - axes = axes.flatten() - - bar_w = 0.35 - xs_stat = np.arange(len(schemes)) - xs_syst = xs_stat + bar_w - - for ax, sig_id in zip(axes, sigs): - stat_uls = [stat_results.get(s, {}).get(sig_id, {}).get("al") for s in schemes] - syst_uls = [syst_results.get(s, {}).get(sig_id) for s in schemes] - - for i, (xu, xs_, u_stat, u_syst) in enumerate( - zip(xs_stat, xs_syst, stat_uls, syst_uls)): - if u_stat is not None: - ax.bar(xu, u_stat, bar_w, color="#4477AA", alpha=0.85, - edgecolor="black", linewidth=0.5) - if u_syst is not None: - ax.bar(xs_, u_syst, bar_w, color="#CC6677", alpha=0.85, - edgecolor="black", linewidth=0.5) - - ax.set_title(SIG_SHORT[sig_id], fontsize=9) - ax.set_ylabel("Exp. 95% CL UL on r", fontsize=8) - ax.set_xticks(xs_stat + bar_w / 2) - ax.set_xticklabels([SCHEME_LABELS[s] for s in schemes], fontsize=9) - ax.yaxis.set_tick_params(labelsize=8) - ax.grid(axis="y", alpha=0.3) - - vals = [v for v in stat_uls + syst_uls if v is not None] - if vals: - ax.set_ylim(min(vals) * 0.85, max(vals) * 1.15) - - legend_handles = [ - mpatches.Patch(color="#4477AA", label="Stat-only"), - mpatches.Patch(color="#CC6677", label="With systematics"), - ] - fig.legend(handles=legend_handles, loc="upper center", ncol=2, - fontsize=10, bbox_to_anchor=(0.5, 1.01)) - fig.suptitle("Exp. 95% CL UL on r — stat-only vs with-systematics (Asimov)", - fontsize=11, y=1.04) - fig.tight_layout() - - for ext in ("pdf", "png"): - out = os.path.join(HERE, "syst_comparison.%s" % ext) - fig.savefig(out, bbox_inches="tight", dpi=150) - print("Saved:", out) - - -if __name__ == "__main__": - main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/run_combine_study.sh b/MFVNeutralino/test/ForLimits/BinningStudy/run_combine_study.sh deleted file mode 100755 index 41c40497a..000000000 --- a/MFVNeutralino/test/ForLimits/BinningStudy/run_combine_study.sh +++ /dev/null @@ -1,77 +0,0 @@ -#!/bin/bash -# Run inside CMSSW_14_1_0_pre4 with cmsenv already sourced. -# For each scheme x signal point: combineCards + FitDiagnostics + AsymptoticLimits (stat-only datacards). -set -e - -HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -DATACARD_BASE="${HERE}/datacards" -OUT_BASE="${HERE}/combine_output" - -YEARS="20161 20162 2017 2018" - -declare -A SIG_CHANNEL -SIG_CHANNEL["VH_tau1mm_M55"]="lep" -SIG_CHANNEL["VH_tau10mm_M55"]="lep" -SIG_CHANNEL["VH_tau1mm_M40"]="lep" -SIG_CHANNEL["VH_tau1mm_M15"]="lep" -SIG_CHANNEL["ggHToSSTodddd_tau1mm_M55"]="bjet" -SIG_CHANNEL["ggHToSSTodddd_tau1mm_M40"]="bjet" -SIG_CHANNEL["mfv_stopdbardbar_tau001000um_M0200"]="bjet" -SIG_CHANNEL["mfv_stopdbardbar_tau000300um_M0400"]="bjet" -SIG_CHANNEL["mfv_neu_tau001000um_M0400"]="bjet" - -# Optional: pass scheme names as arguments to process only those schemes. -SCHEME_LIST="${@:-$(ls "${DATACARD_BASE}")}" - -for SCHEME in ${SCHEME_LIST}; do - echo "" - echo "===============================" - echo "SCHEME: ${SCHEME}" - echo "===============================" - - for SIG_ID in "${!SIG_CHANNEL[@]}"; do - CH="${SIG_CHANNEL[$SIG_ID]}" - WORK_DIR="${OUT_BASE}/${SCHEME}/${SIG_ID}" - mkdir -p "${WORK_DIR}" - cd "${WORK_DIR}" - - # Build card_args: one card per year, named _= - CARD_ARGS="" - MISSING=0 - for YR in ${YEARS}; do - CARD="${DATACARD_BASE}/${SCHEME}/${CH}/Datacard_${CH}_${SIG_ID}_${YR}_statonly.txt" - if [ ! -f "${CARD}" ]; then - echo " SKIP (missing card): ${CARD}" - MISSING=1 - break - fi - CARD_ARGS="${CARD_ARGS} ${CH}_${YR}=${CARD}" - done - [ "${MISSING}" -eq 1 ] && continue - - COMBINED="combined_${SIG_ID}.txt" - - echo " Combining: ${SIG_ID}" - combineCards.py ${CARD_ARGS} > "${COMBINED}" 2>/dev/null - - echo " MultiDimFit grid scan (signal injection r=1)" - combine -M MultiDimFit --algo grid \ - --name "${SCHEME}_${SIG_ID}" \ - "${COMBINED}" \ - -t -1 --expectSignal 1 \ - --rMin 0.5 --rMax 1.5 --points 200 \ - -v 0 2>/dev/null || echo " WARNING: MultiDimFit failed" - - echo " AsymptoticLimits (expectSignal=0)" - combine -M AsymptoticLimits \ - --name "${SCHEME}_${SIG_ID}" \ - "${COMBINED}" \ - --expectSignal 0 \ - -v 0 2>/dev/null || echo " WARNING: AsymptoticLimits failed" - - cd "${HERE}" - done -done - -echo "" -echo "Combine study complete." diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/run_full_study.sh b/MFVNeutralino/test/ForLimits/BinningStudy/run_full_study.sh deleted file mode 100755 index d4739a07a..000000000 --- a/MFVNeutralino/test/ForLimits/BinningStudy/run_full_study.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash -# Sequential pipeline for the 5 new binning schemes. -# Run as: nohup bash run_full_study.sh > run_full_study.log 2>&1 & echo $! > run_full_study.pid -# Survives SSH disconnect. Check progress: tail -f run_full_study.log - -HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -NEW_SCHEMES="3bin_split 3bin_split_v2 3bin_412 2bin_split 4bin_split" - -echo "[$(date)] === Step 1: Generate datacards (el7 + CMSSW_10_6_48) ===" -/cvmfs/cms.cern.ch/common/cmssw-cc7 -- bash -c " - source /cvmfs/cms.cern.ch/cmsset_default.sh - cd /uscms/home/gdecastr/nobackup/work/DVCode/mfv_10648 - eval \$(scramv1 runtime -sh) 2>/dev/null - cd src/JMTucker/MFVNeutralino/test/ForLimits/BinningStudy - python generate_variants_el7.py ${NEW_SCHEMES} -" -echo "[$(date)] Step 1 done (exit $?)" - -echo "[$(date)] === Step 2: Strip systematics ===" -python3 "${HERE}/strip_systs.py" -echo "[$(date)] Step 2 done" - -echo "[$(date)] === Step 3: Run combine (CMSSW_14_1_0_pre4) ===" -source /cvmfs/cms.cern.ch/cmsset_default.sh -cd /uscms/home/gdecastr/nobackup/work/CMSSW_14_1_0_pre4/src -eval $(scramv1 runtime -sh) 2>/dev/null -cd "${HERE}" -bash run_combine_study.sh ${NEW_SCHEMES} -echo "[$(date)] Step 3 done" - -echo "[$(date)] === Step 4: Collect results ===" -source /cvmfs/sft.cern.ch/lcg/views/dev3/latest/x86_64-el9-gcc13-opt/setup.sh 2>/dev/null || true -python3 "${HERE}/collect_results.py" | tee "${HERE}/results_new_schemes.txt" -echo "[$(date)] === All done ===" diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/run_systs_study.sh b/MFVNeutralino/test/ForLimits/BinningStudy/run_systs_study.sh deleted file mode 100644 index e5ce9c0c7..000000000 --- a/MFVNeutralino/test/ForLimits/BinningStudy/run_systs_study.sh +++ /dev/null @@ -1,61 +0,0 @@ -#!/bin/bash -# Run combine (AsymptoticLimits only) on with-systematics datacards. -# Source cmsenv before running. -set -e - -HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -DC_BASE="${HERE}/datacards_systs" -OUT_BASE="${HERE}/combine_output_systs" -YEARS="20161 20162 2017 2018" - -declare -A SIG_CHANNEL -SIG_CHANNEL["VH_tau1mm_M55"]="lep" -SIG_CHANNEL["VH_tau10mm_M55"]="lep" -SIG_CHANNEL["ggHToSSTodddd_tau1mm_M55"]="bjet" -SIG_CHANNEL["mfv_stopdbardbar_tau001000um_M0200"]="bjet" -SIG_CHANNEL["mfv_stopdbardbar_tau000300um_M0400"]="bjet" -SIG_CHANNEL["mfv_neu_tau001000um_M0400"]="bjet" - -SCHEME_LIST="${@:-$(ls "${DC_BASE}" 2>/dev/null)}" - -for SCHEME in ${SCHEME_LIST}; do - echo "" - echo "===============================" - echo "SCHEME (with systs): ${SCHEME}" - echo "===============================" - - for SIG_ID in "${!SIG_CHANNEL[@]}"; do - CH="${SIG_CHANNEL[$SIG_ID]}" - WORK_DIR="${OUT_BASE}/${SCHEME}/${SIG_ID}" - mkdir -p "${WORK_DIR}" - cd "${WORK_DIR}" - - CARD_ARGS="" - MISSING=0 - for YR in ${YEARS}; do - CARD="${DC_BASE}/${SCHEME}/${CH}/Datacard_${CH}_${SIG_ID}_${YR}_withsysts.txt" - if [ ! -f "${CARD}" ]; then - echo " SKIP (missing card): ${CARD}" - MISSING=1; break - fi - CARD_ARGS="${CARD_ARGS} ${CH}_${YR}=${CARD}" - done - [ "${MISSING}" -eq 1 ] && continue - - COMBINED="combined_systs_${SIG_ID}.txt" - echo " Combining: ${SIG_ID}" - combineCards.py ${CARD_ARGS} > "${COMBINED}" 2>/dev/null - - echo " AsymptoticLimits (with systs)" - combine -M AsymptoticLimits \ - --name "systs_${SCHEME}_${SIG_ID}" \ - "${COMBINED}" \ - --expectSignal 0 \ - -v 0 2>/dev/null || echo " WARNING: AsymptoticLimits failed" - - cd "${HERE}" - done -done - -echo "" -echo "Systs study complete." diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/strip_systs.py b/MFVNeutralino/test/ForLimits/BinningStudy/strip_systs.py deleted file mode 100644 index 5ccb9bb20..000000000 --- a/MFVNeutralino/test/ForLimits/BinningStudy/strip_systs.py +++ /dev/null @@ -1,59 +0,0 @@ -# Strip nuisance lines from datacards; write _statonly.txt alongside each. -# Usage: python strip_systs.py [scheme1 scheme2 ...] (default: all schemes) -import os, sys, glob - -HERE = os.path.dirname(os.path.abspath(__file__)) - - -def strip_one(src_path, dst_path): - with open(src_path) as f: - lines = f.readlines() - - out = [] - past_rate = False - for line in lines: - stripped = line.strip() - if stripped.startswith("rate ") or stripped.startswith("rate\t"): - out.append(line) - past_rate = True - continue - if past_rate: - continue # drop all nuisance lines - # Fix kmax line to 0 (no nuisances) - if stripped.startswith("kmax"): - out.append("kmax 0 number of nuisance parameters\n") - else: - out.append(line) - - with open(dst_path, "w") as f: - f.writelines(out) - - -def strip_scheme(scheme_dir): - n = 0 - for ch in ("lep", "bjet"): - ch_dir = os.path.join(scheme_dir, ch) - if not os.path.isdir(ch_dir): - continue - for fn in glob.glob(os.path.join(ch_dir, "Datacard_*.txt")): - if fn.endswith("_statonly.txt"): - continue - dst = fn.replace(".txt", "_statonly.txt") - strip_one(fn, dst) - n += 1 - return n - - -def main(): - datacards_dir = os.path.join(HERE, "datacards") - schemes = sys.argv[1:] if len(sys.argv) > 1 else sorted(os.listdir(datacards_dir)) - for name in schemes: - d = os.path.join(datacards_dir, name) - if not os.path.isdir(d): - continue - n = strip_scheme(d) - print("%-12s stripped %d datacards" % (name, n)) - - -if __name__ == "__main__": - main() diff --git a/MFVNeutralino/test/ForLimits/BinningStudy/tail_check.py b/MFVNeutralino/test/ForLimits/BinningStudy/tail_check.py deleted file mode 100644 index 21f8f2be2..000000000 --- a/MFVNeutralino/test/ForLimits/BinningStudy/tail_check.py +++ /dev/null @@ -1,24 +0,0 @@ -import ROOT -ROOT.gROOT.SetBatch(True) -ROOT.gErrorIgnoreLevel = ROOT.kError - -N2V = {'bjet': 0.520, 'lep': 0.049} -FILES = { - 'bjet': '../BackgroundTemplates/bjet/2v_from_jets_run2_5track_default_ULV30BvetoLHTm.root', - 'lep': '../BackgroundTemplates/lep/2v_from_jets_run2_5track_default_ULV30Lepm.root', -} - -with open('/tmp/tail_result.txt', 'w') as out: - for ch, fpath in FILES.items(): - f = ROOT.TFile(fpath) - h = f.Get('h_c1v_sumdbv_w_errorbars') - scale = N2V[ch] / h.Integral() - nbins = h.GetNbinsX() - tail = 0.0 - for i in range(nbins, 0, -1): - tail += h.GetBinContent(i) * scale - if tail >= 1e-3: - line = '%s: x = %.3f cm tail = %.2e events\n' % (ch, h.GetBinLowEdge(i), tail) - out.write(line) - break - f.Close() diff --git a/MFVNeutralino/test/ForLimits/plotLimits.py b/MFVNeutralino/test/ForLimits/plotLimits.py index 1842228b9..c224277fe 100644 --- a/MFVNeutralino/test/ForLimits/plotLimits.py +++ b/MFVNeutralino/test/ForLimits/plotLimits.py @@ -86,7 +86,7 @@ "ggHToSSTodddd": r"ggH, H$\to$SS$\to$dddd", "ttHToLLPs_bbbb": r"ttH, H$\to$SS$\to$bbbb", "ttHToLLPs_dddd": r"ttH, H$\to$SS$\to$dddd", - "mfv_neu": r"RPV SUSY, $\tilde{g}\to qqq$", + "mfv_neu": r"RPV SUSY, $\tilde{g}\to tbs$", "mfv_stopdbardbar": r"RPV SUSY, $\tilde{t}\to\bar{d}\bar{d}$", "mfv_stopbbarbbar": r"RPV SUSY, $\tilde{t}\to\bar{b}\bar{b}$", } @@ -643,7 +643,14 @@ def _interp_grid(log_ctaus, mass_vals, grid, fine_lct, fine_mass): g = grid.copy() if np.all(np.isnan(g)): return None - # fill missing cells with a large cap so contour at r=1 can still be drawn + # Interpolate interior NaN holes along ctau per mass column before capping edges + x_all = np.arange(g.shape[0]) + for j in range(g.shape[1]): + col = g[:, j] + valid = ~np.isnan(col) + if valid.sum() >= 2 and not valid.all(): + g[:, j] = np.interp(x_all, x_all[valid], col[valid]) + # fill remaining edge NaNs with a large cap so contour at r=1 can still be drawn cap = max(200.0, float(np.nanmax(g)) * 2.0) g[np.isnan(g) | (g <= 0)] = cap sp = RectBivariateSpline(log_ctaus, mass_vals, np.log10(g), kx=1, ky=1) @@ -869,7 +876,7 @@ def collect_all_methods(): # Comparison 1D: one plot per ctau, HybridNew median vs Asymptotic median+bands # --------------------------------------------------------------------------- -def plot_comparison_1d_per_ctau(proc, mass_data_m, out_dir): +def plot_comparison_1d_per_ctau(proc, mass_data_m, out_dir, hepdata=None): """Per-ctau 1D vs mass: HybridNew median (blue) + Asymptotic median+bands (red).""" # Invert to {ctau -> {mass -> {method -> lims}}} ctau_data = {} @@ -877,6 +884,8 @@ def plot_comparison_1d_per_ctau(proc, mass_data_m, out_dir): for ctau, mdict in cdict.items(): ctau_data.setdefault(ctau, {})[mass] = mdict + hd = hepdata.get(proc) if hepdata else None + for ctau in sorted(ctau_data.keys()): mdict = ctau_data[ctau] masses = _sorted_masses(mdict) @@ -917,6 +926,18 @@ def plot_comparison_1d_per_ctau(proc, mass_data_m, out_dir): marker="o", ms=5, label="HybridNew exp.", zorder=5) drew = True + # HepData reference (EXO-19-013), where available for this ctau + if hd is not None: + hd_masses_sl, hd_r_sl = _hepdata_slice_at_ctau(hd, ctau) + if hd_masses_sl is not None: + hd_masses_sl = np.array(hd_masses_sl) + hd_r_sl = np.array(hd_r_sl) + keep = hd_r_sl > 0 + if np.any(keep): + ax.plot(hd_masses_sl[keep], hd_r_sl[keep], color="black", lw=1.5, ls="-", + label="High-HT obs. (EXO-19-013)", zorder=3) + drew = True + if not drew: plt.close(fig) continue @@ -1123,7 +1144,7 @@ def main(): continue n_pts = sum(len(v) for v in data_m[proc].values()) print("\n%s: %d hypotheses" % (proc, n_pts)) - plot_comparison_1d_per_ctau(proc, data_m[proc], args.comparison_dir) + plot_comparison_1d_per_ctau(proc, data_m[proc], args.comparison_dir, hepdata) plot_comparison_2d(proc, data_m[proc], args.comparison_dir, hepdata) if proc == "mfv_neu" and "mfv_neu" in _EXTRA_THEORY_CSV: plot_comparison_2d(proc, data_m[proc], args.comparison_dir, hepdata, From c0a0f143967d20573eedd9a9ca7ce84d26dd1ef4 Mon Sep 17 00:00:00 2001 From: Gianfranco de Castro Date: Thu, 11 Jun 2026 12:32:17 -0500 Subject: [PATCH 12/15] Add from __future__ import print_function for Python 2 compatibility --- MFVNeutralino/test/ForLimits/getNuisanceFromSig.py | 1 + MFVNeutralino/test/ForLimits/makeDatacard.py | 1 + MFVNeutralino/test/ForLimits/makeLimitsInputROOT.py | 1 + MFVNeutralino/test/ForLimits/nuisance_configs_and_functions.py | 1 + 4 files changed, 4 insertions(+) diff --git a/MFVNeutralino/test/ForLimits/getNuisanceFromSig.py b/MFVNeutralino/test/ForLimits/getNuisanceFromSig.py index 449995a4c..aa5e4d3e0 100644 --- a/MFVNeutralino/test/ForLimits/getNuisanceFromSig.py +++ b/MFVNeutralino/test/ForLimits/getNuisanceFromSig.py @@ -1,3 +1,4 @@ +from __future__ import print_function import numpy as np import script_configs as config diff --git a/MFVNeutralino/test/ForLimits/makeDatacard.py b/MFVNeutralino/test/ForLimits/makeDatacard.py index 137652522..b668989f1 100644 --- a/MFVNeutralino/test/ForLimits/makeDatacard.py +++ b/MFVNeutralino/test/ForLimits/makeDatacard.py @@ -1,3 +1,4 @@ +from __future__ import print_function import ROOT import numpy as np diff --git a/MFVNeutralino/test/ForLimits/makeLimitsInputROOT.py b/MFVNeutralino/test/ForLimits/makeLimitsInputROOT.py index db67a7afc..21a6ca4d3 100644 --- a/MFVNeutralino/test/ForLimits/makeLimitsInputROOT.py +++ b/MFVNeutralino/test/ForLimits/makeLimitsInputROOT.py @@ -1,3 +1,4 @@ +from __future__ import print_function import argparse import os import sys diff --git a/MFVNeutralino/test/ForLimits/nuisance_configs_and_functions.py b/MFVNeutralino/test/ForLimits/nuisance_configs_and_functions.py index b84972d79..8e002d370 100644 --- a/MFVNeutralino/test/ForLimits/nuisance_configs_and_functions.py +++ b/MFVNeutralino/test/ForLimits/nuisance_configs_and_functions.py @@ -1,3 +1,4 @@ +from __future__ import print_function import numpy as np import helper_PyStorage_objects as sth From 50ba92a9fed5020d80ab82cb9dec64f3cf6913d4 Mon Sep 17 00:00:00 2001 From: Gianfranco de Castro Date: Wed, 17 Jun 2026 16:19:01 -0500 Subject: [PATCH 13/15] Modified lumi uncertainty to match combine recommendations, added ggH renorm and VH factorization --- .../pickle_ggHToSSTodddd.pkl | 163 +++++++++++++++++ .../NuisTabStore_7p4p1/pickle_mfv_neu.pkl | 163 +++++++++++++++++ .../pickle_mfv_stopbbarbbar.pkl | 163 +++++++++++++++++ .../pickle_mfv_stopdbardbar.pkl | 163 +++++++++++++++++ .../NuisTabStore_TrkMvr/pickle_VH.pkl | 125 +++++++++++++ .../pickle_ggHToSSTodddd.pkl | 125 +++++++++++++ .../NuisTabStore_TrkMvr/pickle_mfv_neu.pkl | 125 +++++++++++++ .../pickle_mfv_stopbbarbbar.pkl | 125 +++++++++++++ .../pickle_mfv_stopdbardbar.pkl | 125 +++++++++++++ .../NuisTabStore_TrkRec/ct_pickle_VH.pkl | 167 ++++++++++++++++++ .../NuisTabStore_TrkRec/dn_pickle_VH.pkl | 167 ++++++++++++++++++ .../NuisTabStore_TrkRec/up_pickle_VH.pkl | 167 ++++++++++++++++++ .../test/ForLimits/getNuisanceFromSig.py | 12 +- .../test/ForLimits/limits_config.yaml | 1 + .../test/ForLimits/nuisance_configs.py | 2 + .../nuisance_configs_and_functions.py | 104 +++++++++++ .../test/ForLimits/script_configs.py | 1 + .../test/ForLimits/sig_and_bkg_configs.py | 10 +- 18 files changed, 1903 insertions(+), 5 deletions(-) create mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_ggHToSSTodddd.pkl create mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_neu.pkl create mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_stopbbarbbar.pkl create mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_stopdbardbar.pkl create mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_VH.pkl create mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_ggHToSSTodddd.pkl create mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_neu.pkl create mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_stopbbarbbar.pkl create mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_stopdbardbar.pkl create mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/ct_pickle_VH.pkl create mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/dn_pickle_VH.pkl create mode 100644 MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/up_pickle_VH.pkl diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_ggHToSSTodddd.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_ggHToSSTodddd.pkl new file mode 100644 index 000000000..4d1686421 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_ggHToSSTodddd.pkl @@ -0,0 +1,163 @@ +(dp0 +S'perc' +p1 +I00 +sS'y_vals' +p2 +cnumpy.core.multiarray +_reconstruct +p3 +(cnumpy +ndarray +p4 +(I0 +tp5 +S'b' +p6 +tp7 +Rp8 +(I1 +(I1 +tp9 +cnumpy +dtype +p10 +(S'f8' +p11 +I0 +I1 +tp12 +Rp13 +(I3 +S'<' +p14 +NNNI-1 +I-1 +I0 +tp15 +bI00 +S'\x00\x00\x00\x00\x00\x80K@' +p16 +tp17 +bsS'dtype' +p18 +c__builtin__ +float +p19 +sS'x_unit' +p20 +S'mm' +p21 +sS'arr_len' +p22 +I0 +sS'years' +p23 +c__builtin__ +set +p24 +((lp25 +S'2017' +p26 +aS'2016' +p27 +aS'2016APV' +p28 +aS'2018' +p29 +atp30 +Rp31 +sS'y_unit' +p32 +S'GeV' +p33 +sg29 +g3 +(g4 +(I0 +tp34 +g6 +tp35 +Rp36 +(I1 +(I3 +I1 +tp37 +g13 +I00 +S'[\xb1\xbf\xec\x9e<\xbc?\xbc\x05\x12\x14?\xc6\xac?\xb57\xf8\xc2d\xaa\xc0?' +p38 +tp39 +bsS'x_vals' +p40 +g3 +(g4 +(I0 +tp41 +g6 +tp42 +Rp43 +(I1 +(I3 +tp44 +g13 +I00 +S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00Y@' +p45 +tp46 +bsg26 +g3 +(g4 +(I0 +tp47 +g6 +tp48 +Rp49 +(I1 +(I3 +I1 +tp50 +g13 +I00 +S'\xfb:p\xce\x88\xd2\xbe?D\x8bl\xe7\xfb\xa9\xb1?\xc7):\x92\xcb\x7f\xc0?' +p51 +tp52 +bsg27 +g3 +(g4 +(I0 +tp53 +g6 +tp54 +Rp55 +(I1 +(I3 +I1 +tp56 +g13 +I00 +S'\xfa~j\xbct\x93\xa8?\x92\xcb\x7fH\xbf}\xad?\x00\x00\x00\x00\x00\x00\xf8\x7f' +p57 +tp58 +bsS'proc' +p59 +S'ggHToSSTodddd' +p60 +sg28 +g3 +(g4 +(I0 +tp61 +g6 +tp62 +Rp63 +(I1 +(I3 +I1 +tp64 +g13 +I00 +S'\x90\xa0\xf81\xe6\xae\xc5?d;\xdfO\x8d\x97\xce?\xf2\xd2Mb\x10X\xeb?' +p65 +tp66 +bs. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_neu.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_neu.pkl new file mode 100644 index 000000000..4f002eeff --- /dev/null +++ b/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_neu.pkl @@ -0,0 +1,163 @@ +(dp0 +S'perc' +p1 +I00 +sS'y_vals' +p2 +cnumpy.core.multiarray +_reconstruct +p3 +(cnumpy +ndarray +p4 +(I0 +tp5 +S'b' +p6 +tp7 +Rp8 +(I1 +(I8 +tp9 +cnumpy +dtype +p10 +(S'f8' +p11 +I0 +I1 +tp12 +Rp13 +(I3 +S'<' +p14 +NNNI-1 +I-1 +I0 +tp15 +bI00 +S'\x00\x00\x00\x00\x00\x00i@\x00\x00\x00\x00\x00\xc0r@\x00\x00\x00\x00\x00\x00y@\x00\x00\x00\x00\x00\xc0\x82@\x00\x00\x00\x00\x00\x00\x89@\x00\x00\x00\x00\x00\xc0\x92@\x00\x00\x00\x00\x00\x00\x99@\x00\x00\x00\x00\x00p\xa7@' +p16 +tp17 +bsS'dtype' +p18 +c__builtin__ +float +p19 +sS'x_unit' +p20 +S'mm' +p21 +sS'arr_len' +p22 +I0 +sS'years' +p23 +c__builtin__ +set +p24 +((lp25 +S'2017' +p26 +aS'2016' +p27 +aS'2016APV' +p28 +aS'2018' +p29 +atp30 +Rp31 +sS'y_unit' +p32 +S'GeV' +p33 +sg29 +g3 +(g4 +(I0 +tp34 +g6 +tp35 +Rp36 +(I1 +(I5 +I8 +tp37 +g13 +I00 +S'a\xc3\xd3+e\x19\xb2?\xd9\xce\xf7S\xe3\xa5\x9b?c\xeeZB>\xe8\x99?\xaa\xf1\xd2Mb\x10\x98?Zd;\xdfO\x8d\x97?V}\xae\xb6b\x7f\x99?\x82sF\x94\xf6\x06\x9f?J\x0c\x02+\x87\x16\xa9?\xf2\xb0Pk\x9aw\xac?\xa4p=\n\xd7\xa3\xa0?\x13a\xc3\xd3+e\x99?\x13a\xc3\xd3+e\x99?\xcb\xa1E\xb6\xf3\xfd\x94?\xcb\xa1E\xb6\xf3\xfd\x94?j\xbct\x93\x18\x04\x96?\xa85\xcd;N\xd1\xa1?\xf2\xb0Pk\x9aw\xac?\xd0D\xd8\xf0\xf4J\xa9?\x1c\xeb\xe26\x1a\xc0\x9b?Dio\xf0\x85\xc9\x94?a2U0*\xa9\x93?\xb1\xbf\xec\x9e<,\x94?+\x87\x16\xd9\xce\xf7\x93?Q\xda\x1b|a2\x95?c\xeeZB>\xe8\xa9?EGr\xf9\x0f\xe9\xa7?h\x91\xed|?5\x9e?\xdeq\x8a\x8e\xe4\xf2\x7f?\xfa~j\xbct\x93x?\xed\r\xbe0\x99*x?\xed\r\xbe0\x99*x?Q\xda\x1b|a2\x95?\xff!\xfd\xf6u\xe0\xac?\xd6\xc5m4\x80\xb7\xb0?\xd7\x12\xf2A\xcff\xa5?\t\x1b\x9e^)\xcb\x80?\xc7\xba\xb8\x8d\x06\xf0v?\xa1g\xb3\xeas\xb5u?\xa1g\xb3\xeas\xb5u?\xd4+e\x19\xe2Xw?' +p38 +tp39 +bsS'x_vals' +p40 +g3 +(g4 +(I0 +tp41 +g6 +tp42 +Rp43 +(I1 +(I5 +tp44 +g13 +I00 +S'\x9a\x99\x99\x99\x99\x99\xb9?333333\xd3?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00>@' +p45 +tp46 +bsg26 +g3 +(g4 +(I0 +tp47 +g6 +tp48 +Rp49 +(I1 +(I5 +I8 +tp50 +g13 +I00 +S'\xa4p=\n\xd7\xa3\xb0?\xc9v\xbe\x9f\x1a/\x9d?\xb3{\xf2\xb0Pk\x9a?\xbaI\x0c\x02+\x87\x96?\xbaI\x0c\x02+\x87\x96?Q\xda\x1b|a2\x95?\x0e\xbe0\x99*\x18\x95?\xfee\xf7\xe4a\xa1\x96?\x18&S\x05\xa3\x92\xaa?aTR\'\xa0\x89\xa0?\x15\x8cJ\xea\x044\xa1?^K\xc8\x07=\x9b\x95?Q\xda\x1b|a2\x95?\xbe0\x99*\x18\x95\x94?\x01M\x84\rO\xaf\x94?\xf1\xf4JY\x868\x96?\x18&S\x05\xa3\x92\xaa?\x1f\xf4lV}\xae\xa6?\x15\x8cJ\xea\x044\xa1?tF\x94\xf6\x06_\x98?\n\xd7\xa3p=\n\x97?j\xbct\x93\x18\x04\x96?\x1b/\xdd$\x06\x81\x95?\xf1\xf4JY\x868\x96?\xd5\th"lx\xaa?+\x87\x16\xd9\xce\xf7\xa3?\xb3{\xf2\xb0Pk\x9a?\t\x1b\x9e^)\xcb\x80?\x13a\xc3\xd3+ey?_\x07\xce\x19Q\xda{?\x82\xe2\xc7\x98\xbb\x96\x80?"\xfd\xf6u\xe0\x9c\x81?vO\x1e\x16jM\xa3?M\xf3\x8eSt$\xa7?X9\xb4\xc8v\xbe\x9f?\xdb\xf9~j\xbct\x83?\x13a\xc3\xd3+ey?_\x07\xce\x19Q\xda{?\xc7\xba\xb8\x8d\x06\xf0v? \xd2o_\x07\xcey?' +p51 +tp52 +bsg27 +g3 +(g4 +(I0 +tp53 +g6 +tp54 +Rp55 +(I1 +(I5 +I8 +tp56 +g13 +I00 +S'{\x14\xaeG\xe1z\x94?\xa1g\xb3\xeas\xb5\x95?Dio\xf0\x85\xc9\x94?\x0e\xbe0\x99*\x18\x95?\x88\x85Z\xd3\xbc\xe3\x94?Dio\xf0\x85\xc9\x94?\x01M\x84\rO\xaf\x94?%u\x02\x9a\x08\x1b\x9e?J\x0c\x02+\x87\x16\x99?\xfa~j\xbct\x93\x98?\n\xd7\xa3p=\n\x97?\xcb\xa1E\xb6\xf3\xfd\x94?\x01M\x84\rO\xaf\x94?\xbe0\x99*\x18\x95\x94?\xbe0\x99*\x18\x95\x94?\xe2X\x17\xb7\xd1\x00\x9e?-C\x1c\xeb\xe26\x9a?\xe0\x9c\x11\xa5\xbd\xc1\x97?\x1b/\xdd$\x06\x81\x95?\xb5\xa6y\xc7):\x92?\x01M\x84\rO\xaf\x94?\x88\x85Z\xd3\xbc\xe3\x94?\x88\x85Z\xd3\xbc\xe3\x94?\x9d\x80&\xc2\x86\xa7\x97?\n\xd7\xa3p=\n\xa7?7\x1a\xc0[ A\xa1?\xc5\x8f1w-!\x8f?lxz\xa5,C|?9\xb4\xc8v\xbe\x9fz? \xd2o_\x07\xcey?\xb8\x1e\x85\xebQ\xb8~?U\xc1\xa8\xa4N@\x83?\x03\t\x8a\x1fc\xee\xaa?\xb3{\xf2\xb0Pk\xaa?\x0e\xbe0\x99*\x18\x95? \xd2o_\x07\xcey?\xed\r\xbe0\x99*x?\xc7\xba\xb8\x8d\x06\xf0v?\xc7\xba\xb8\x8d\x06\xf0v?lxz\xa5,C|?' +p57 +tp58 +bsS'proc' +p59 +S'mfv_neu' +p60 +sg28 +g3 +(g4 +(I0 +tp61 +g6 +tp62 +Rp63 +(I1 +(I5 +I8 +tp64 +g13 +I00 +S'\xbe0\x99*\x18\x95\xa4?333333\xa3?Dio\xf0\x85\xc9\x94?\xe4\x83\x9e\xcd\xaa\xcf\x95?\xfa~j\xbct\x93\x98?\'\xa0\x89\xb0\xe1\xe9\x95?{\x14\xaeG\xe1z\x94?y\xe9&1\x08\xac\x9c?\x84\x9e\xcd\xaa\xcf\xd5\xa6?\xbaI\x0c\x02+\x87\xa6?2\xe6\xae%\xe4\x83\x9e?A\x82\xe2\xc7\x98\xbb\x96?\xae\xd8_vO\x1e\x96?^K\xc8\x07=\x9b\x95?\'\xa0\x89\xb0\xe1\xe9\x95?y\xe9&1\x08\xac\x9c?\x95\xd4\th"l\xb8?\xcc\xee\xc9\xc3B\xad\xb9?\xc1\xca\xa1E\xb6\xf3\xad?\x1e\x16jM\xf3\x8e\xa3?\xef\xc9\xc3B\xadi\x9e?S\x96!\x8euq\x9b?\xc0\xec\x9e<,\xd4\x9a?y\xe9&1\x08\xac\x9c?6<\xbdR\x96!\xc6?\xac\x8b\xdbh\x00o\xc1?\x0b\xb5\xa6y\xc7)\xba?\xdf\xe0\x0b\x93\xa9\x82\xb1?Tt$\x97\xff\x90\xae?EGr\xf9\x0f\xe9\xa7?tF\x94\xf6\x06_\xa8?\x1e\xa7\xe8H.\xff\xb1?\xbct\x93\x18\x04V\xc6?_\x07\xce\x19Q\xda\xc3?\x02\x9a\x08\x1b\x9e^\xb9?t$\x97\xff\x90~\xab?\xd4+e\x19\xe2X\xa7?EGr\xf9\x0f\xe9\xa7?\x93\x18\x04V\x0e-\xa2?\xb1\xbf\xec\x9e<,\xa4?' +p65 +tp66 +bs. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_stopbbarbbar.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_stopbbarbbar.pkl new file mode 100644 index 000000000..8cbbedfea --- /dev/null +++ b/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_stopbbarbbar.pkl @@ -0,0 +1,163 @@ +(dp0 +S'perc' +p1 +I00 +sS'y_vals' +p2 +cnumpy.core.multiarray +_reconstruct +p3 +(cnumpy +ndarray +p4 +(I0 +tp5 +S'b' +p6 +tp7 +Rp8 +(I1 +(I8 +tp9 +cnumpy +dtype +p10 +(S'f8' +p11 +I0 +I1 +tp12 +Rp13 +(I3 +S'<' +p14 +NNNI-1 +I-1 +I0 +tp15 +bI00 +S'\x00\x00\x00\x00\x00\x00i@\x00\x00\x00\x00\x00\xc0r@\x00\x00\x00\x00\x00\x00y@\x00\x00\x00\x00\x00\xc0\x82@\x00\x00\x00\x00\x00\x00\x89@\x00\x00\x00\x00\x00\xc0\x92@\x00\x00\x00\x00\x00\x00\x99@\x00\x00\x00\x00\x00p\xa7@' +p16 +tp17 +bsS'dtype' +p18 +c__builtin__ +float +p19 +sS'x_unit' +p20 +S'mm' +p21 +sS'arr_len' +p22 +I0 +sS'years' +p23 +c__builtin__ +set +p24 +((lp25 +S'2017' +p26 +aS'2016' +p27 +aS'2016APV' +p28 +aS'2018' +p29 +atp30 +Rp31 +sS'y_unit' +p32 +S'GeV' +p33 +sg29 +g3 +(g4 +(I0 +tp34 +g6 +tp35 +Rp36 +(I1 +(I5 +I8 +tp37 +g13 +I00 +S"vq\x1b\r\xe0-\xb0?\xbb'\x0f\x0b\xb5\xa6\xa9?;\xdfO\x8d\x97n\xa2?\xa85\xcd;N\xd1\xa1?\xfd\x87\xf4\xdb\xd7\x81\xa3?(~\x8c\xb9k\t\xa9?\xce\x88\xd2\xde\xe0\x0b\xb3?\xa5,C\x1c\xeb\xe2\xb6?\n\xd7\xa3p=\n\xa7?\xb1\xe1\xe9\x95\xb2\x0c\xa1? \xd2o_\x07\xce\x99?\xed\r\xbe0\x99*\x98?V}\xae\xb6b\x7f\x99?%u\x02\x9a\x08\x1b\x9e?\x9c\xc4 \xb0rh\xa1?\xa9\x13\xd0D\xd8\xf0\xa4?'\xa0\x89\xb0\xe1\xe9\xa5?aTR'\xa0\x89\xa0?Dio\xf0\x85\xc9\x94?\xe8j+\xf6\x97\xdd\x93?\xdf\xe0\x0b\x93\xa9\x82\x91?U\xc1\xa8\xa4N@\x93?Dio\xf0\x85\xc9\x94?\x07\xf0\x16HP\xfc\x98?\xdf\xe0\x0b\x93\xa9\x82\xa1?\xdf\xe0\x0b\x93\xa9\x82\xa1?\xc2\x17&S\x05\xa3\x92?\x9f<,\xd4\x9a\xe6}?\x9f<,\xd4\x9a\xe6}?lxz\xa5,C|?_\x07\xce\x19Q\xda{?F%u\x02\x9a\x08{?\x7f\xd9=yX\xa8\xa5?R\xb8\x1e\x85\xebQ\xa8?\xf6\x97\xdd\x93\x87\x85\x9a?\x9f<,\xd4\x9a\xe6}?y\xe9&1\x08\xac|?\x07\xf0\x16HP\xfcx? \xd2o_\x07\xcey?\xfa~j\xbct\x93x?" +p38 +tp39 +bsS'x_vals' +p40 +g3 +(g4 +(I0 +tp41 +g6 +tp42 +Rp43 +(I1 +(I5 +tp44 +g13 +I00 +S'\x9a\x99\x99\x99\x99\x99\xb9?333333\xd3?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00>@' +p45 +tp46 +bsg26 +g3 +(g4 +(I0 +tp47 +g6 +tp48 +Rp49 +(I1 +(I5 +I8 +tp50 +g13 +I00 +S'\x8d(\xed\r\xbe0\x99?\x07\xf0\x16HP\xfc\x98?\x84\x9e\xcd\xaa\xcf\xd5\x96?=\x9bU\x9f\xab\xad\x98?\x91\x0fz6\xab>\x97?j\xbct\x93\x18\x04\x96?j\xbct\x93\x18\x04\x96?f\xf7\xe4a\xa1\xd6\xa4?\r\xe0-\x90\xa0\xf8\xa1?\x1c\xeb\xe26\x1a\xc0\x9b?Zd;\xdfO\x8d\x97?\xa1g\xb3\xeas\xb5\x95?\xd7\x12\xf2A\xcff\x95?\x1b/\xdd$\x06\x81\x95?\x0e\xbe0\x99*\x18\x95?+\x87\x16\xd9\xce\xf7\xa3?\xd74\xef8EG\xa2?"\xfd\xf6u\xe0\x9c\xa1?\xa3#\xb9\xfc\x87\xf4\x9b?\xed\r\xbe0\x99*\x98?\xbaI\x0c\x02+\x87\x96?j\xbct\x93\x18\x04\x96?j\xbct\x93\x18\x04\x96?+\x87\x16\xd9\xce\xf7\xa3?\xe0\xbe\x0e\x9c3\xa2\xa4?r\x8a\x8e\xe4\xf2\x1f\xa2?\x91\x0fz6\xab>\x97?\xc5\xfe\xb2{\xf2\xb0\x90?K\xc8\x07=\x9bU\x8f?\x8d(\xed\r\xbe0\x89?\xa85\xcd;N\xd1\x81?\xa85\xcd;N\xd1\x91?\xdb\xf9~j\xbct\xa3?\x01M\x84\rO\xaf\xa4?\xd0D\xd8\xf0\xf4J\x99?\x82\xe2\xc7\x98\xbb\x96\x90?\x86Z\xd3\xbc\xe3\x14\x8d?A\x82\xe2\xc7\x98\xbb\x86?\x0e\xbe0\x99*\x18\x85?\xa6\nF%u\x02\x8a?' +p51 +tp52 +bsg27 +g3 +(g4 +(I0 +tp53 +g6 +tp54 +Rp55 +(I1 +(I5 +I8 +tp56 +g13 +I00 +S'\xc3\xd3+e\x19\xe2\x98?=\x9bU\x9f\xab\xad\x98?\x1b/\xdd$\x06\x81\x95?\xbe0\x99*\x18\x95\x94?{\x14\xaeG\xe1z\x94?\xc7\xba\xb8\x8d\x06\xf0\x96?\r\xe0-\x90\xa0\xf8\xa1?\xbc\x05\x12\x14?\xc6\xbc?\xd4+e\x19\xe2X\x97?M\xf3\x8eSt$\x97?\xd7\x12\xf2A\xcff\x95?\xbe0\x99*\x18\x95\x94?\x88\x85Z\xd3\xbc\xe3\x94?=\x9bU\x9f\xab\xad\x98?=\x9bU\x9f\xab\xad\x98?\xa5N@\x13a\xc3\xb3?\x10z6\xab>W\x9b?\xa1g\xb3\xeas\xb5\x95?L7\x89A`\xe5\x90?U\xc1\xa8\xa4N@\x93?\xdb\xf9~j\xbct\x93?\x88\x85Z\xd3\xbc\xe3\x94?0*\xa9\x13\xd0D\x98?j\xbct\x93\x18\x04\xa6?\x8d(\xed\r\xbe0\xa9?{\x14\xaeG\xe1z\x94?\xed\r\xbe0\x99*\x88?\xac\xad\xd8_vO~?\xdeq\x8a\x8e\xe4\xf2\x7f?\xc5\x8f1w-!\x7f?\xce\x88\xd2\xde\xe0\x0b\x83?K\xc8\x07=\x9bU\x8f?\x07\xf0\x16HP\xfc\xa8?\x92\xcb\x7fH\xbf}\x9d?\x86Z\xd3\xbc\xe3\x14\x8d?\xfc\xa9\xf1\xd2Mb\x80?\x13a\xc3\xd3+ey?S\x96!\x8euq{?\x9f<,\xd4\x9a\xe6}?\xbaI\x0c\x02+\x87\x86?' +p57 +tp58 +bsS'proc' +p59 +S'mfv_stopbbarbbar' +p60 +sg28 +g3 +(g4 +(I0 +tp61 +g6 +tp62 +Rp63 +(I1 +(I5 +I8 +tp64 +g13 +I00 +S'{\x14\xaeG\xe1z\x94?\xa1g\xb3\xeas\xb5\x95?\x88\x85Z\xd3\xbc\xe3\x94?\x88\x85Z\xd3\xbc\xe3\x94?\x1b/\xdd$\x06\x81\x95?\xbaI\x0c\x02+\x87\x96?_)\xcb\x10\xc7\xba\xa8?\xb8\x1e\x85\xebQ\xb8\xbe?\xe7\x8c(\xed\r\xbe\xa0?_\x07\xce\x19Q\xda\x9b?M\xf3\x8eSt$\x97?\x84\x9e\xcd\xaa\xcf\xd5\x96?\xa1g\xb3\xeas\xb5\x95?\x1b/\xdd$\x06\x81\x95?9\xb4\xc8v\xbe\x9f\x9a?aTR\'\xa0\x89\xb0?\xbe\xc1\x17&S\x05\xb3?\xe7\x8c(\xed\r\xbe\xb0?\xa6\nF%u\x02\xaa?\xc3\xf5(\\\x8f\xc2\xa5?\xf0\x16HP\xfc\x18\xa3?;\xdfO\x8d\x97n\xa2??\xc6\xdc\xb5\x84|\xa0?aTR\'\xa0\x89\xb0?\x8fSt$\x97\xff\xc8?\xca\xc3B\xadi\xde\xc1?\xa6\x9b\xc4 \xb0r\xc0?\xe5\xd0"\xdb\xf9~\xba?\xf2\xd2Mb\x10X\xb9?\x17HP\xfc\x18s\xb7?(~\x8c\xb9k\t\xb9?C\x1c\xeb\xe26\x1a\xc0?\xf6(\\\x8f\xc2\xf5\xc8?\xbe\xc1\x17&S\x05\xc3?C\xadi\xdeq\x8a\xbe?\xf6(\\\x8f\xc2\xf5\xb8?\xcff\xd5\xe7j+\xb6?\xbe\xc1\x17&S\x05\xb3?\xe4\x14\x1d\xc9\xe5?\xb4?\x95\xd4\th"l\xb8?' +p65 +tp66 +bs. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_stopdbardbar.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_stopdbardbar.pkl new file mode 100644 index 000000000..8cdda2161 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/NuisTabStore_7p4p1/pickle_mfv_stopdbardbar.pkl @@ -0,0 +1,163 @@ +(dp0 +S'perc' +p1 +I00 +sS'y_vals' +p2 +cnumpy.core.multiarray +_reconstruct +p3 +(cnumpy +ndarray +p4 +(I0 +tp5 +S'b' +p6 +tp7 +Rp8 +(I1 +(I8 +tp9 +cnumpy +dtype +p10 +(S'f8' +p11 +I0 +I1 +tp12 +Rp13 +(I3 +S'<' +p14 +NNNI-1 +I-1 +I0 +tp15 +bI00 +S'\x00\x00\x00\x00\x00\x00i@\x00\x00\x00\x00\x00\xc0r@\x00\x00\x00\x00\x00\x00y@\x00\x00\x00\x00\x00\xc0\x82@\x00\x00\x00\x00\x00\x00\x89@\x00\x00\x00\x00\x00\xc0\x92@\x00\x00\x00\x00\x00\x00\x99@\x00\x00\x00\x00\x00p\xa7@' +p16 +tp17 +bsS'dtype' +p18 +c__builtin__ +float +p19 +sS'x_unit' +p20 +S'mm' +p21 +sS'arr_len' +p22 +I0 +sS'years' +p23 +c__builtin__ +set +p24 +((lp25 +S'2017' +p26 +aS'2016' +p27 +aS'2016APV' +p28 +aS'2018' +p29 +atp30 +Rp31 +sS'y_unit' +p32 +S'GeV' +p33 +sg29 +g3 +(g4 +(I0 +tp34 +g6 +tp35 +Rp36 +(I1 +(I5 +I8 +tp37 +g13 +I00 +S"0\xbb'\x0f\x0b\xb5\xb6?\xa5\xbd\xc1\x17&S\xb5?\x1aQ\xda\x1b|a\xb2?\xe4\x14\x1d\xc9\xe5?\xb4?\xc2\x86\xa7W\xca2\xb4?\xf1c\xcc]K\xc8\xb7?\xd4+e\x19\xe2X\xb7?\xd4+e\x19\xe2X\xb7?\xc6m4\x80\xb7@\xb2?lxz\xa5,C\xac?\xdc\xd7\x81sF\x94\xa6?^K\xc8\x07=\x9b\xa5?\xa1g\xb3\xeas\xb5\xa5?\xcc\x7fH\xbf}\x1d\xa8?\x96\xb2\x0cq\xac\x8b\xab?\x96\xb2\x0cq\xac\x8b\xab?\x07\xf0\x16HP\xfc\xa8?\x12\xa5\xbd\xc1\x17&\xa3?\xa3#\xb9\xfc\x87\xf4\x9b?tF\x94\xf6\x06_\x98?\n\xd7\xa3p=\n\x97?\x07\xf0\x16HP\xfc\x98?\x8d(\xed\r\xbe0\x99?M\xf3\x8eSt$\x97?<\xbdR\x96!\x8e\xa5?/n\xa3\x01\xbc\x05\xa2?\x19\x04V\x0e-\xb2\x8d?\x8fSt$\x97\xff\x80?y\xe9&1\x08\xac|?\xdeq\x8a\x8e\xe4\xf2\x7f?\x9f<,\xd4\x9a\xe6}?\xc2\x17&S\x05\xa3\x82?K\xc8\x07=\x9bU\xaf?5\xef8EGr\xa9?5\xef8EGr\xa9?\x9f<,\xd4\x9a\xe6}?y\xe9&1\x08\xac|?\x13a\xc3\xd3+ey?9\xb4\xc8v\xbe\x9fz?_\x07\xce\x19Q\xda{?" +p38 +tp39 +bsS'x_vals' +p40 +g3 +(g4 +(I0 +tp41 +g6 +tp42 +Rp43 +(I1 +(I5 +tp44 +g13 +I00 +S'\x9a\x99\x99\x99\x99\x99\xb9?333333\xd3?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00>@' +p45 +tp46 +bsg26 +g3 +(g4 +(I0 +tp47 +g6 +tp48 +Rp49 +(I1 +(I5 +I8 +tp50 +g13 +I00 +S"\xa0\x1a/\xdd$\x06\xb1?\x03\t\x8a\x1fc\xee\xaa?\n\xd7\xa3p=\n\xa7?\xecQ\xb8\x1e\x85\xeb\xa1?\xd2\x00\xde\x02\t\x8a\x9f?tF\x94\xf6\x06_\x98?\xcc]K\xc8\x07=\x9b?9\xb4\xc8v\xbe\x9f\xaa?}\xae\xb6b\x7f\xd9\xad?\x06\x12\x14?\xc6\xdc\xa5?aTR'\xa0\x89\xa0?9\xb4\xc8v\xbe\x9f\x9a?c\xeeZB>\xe8\x99?A\x82\xe2\xc7\x98\xbb\x96?\x13a\xc3\xd3+e\x99?\xa2E\xb6\xf3\xfd\xd4\xa8?\xf3\x8eSt$\x97\xaf?\xaa\xf1\xd2Mb\x10\xa8?D\x8bl\xe7\xfb\xa9\xa1?D\x8bl\xe7\xfb\xa9\xa1?S\x96!\x8euq\x9b?\xbaI\x0c\x02+\x87\x96?\x8d(\xed\r\xbe0\x99?\x1b\r\xe0-\x90\xa0\xa8?\x12\xa5\xbd\xc1\x17&\xa3??\xc6\xdc\xb5\x84|\xa0?j\xbct\x93\x18\x04\x96?\x9f<,\xd4\x9a\xe6\x8d?\x9f<,\xd4\x9a\xe6\x8d?\xb5\xa6y\xc7):\x82?\x82\xe2\xc7\x98\xbb\x96\x80?\x01M\x84\rO\xaf\x94?\x9a\x99\x99\x99\x99\x99\xa9?\xa9\x13\xd0D\xd8\xf0\xa4?\xd4+e\x19\xe2X\x97?\xc5\xfe\xb2{\xf2\xb0\x90?2\xe6\xae%\xe4\x83\x8e?A\x82\xe2\xc7\x98\xbb\x86?4\x116<\xbdR\x86?tF\x94\xf6\x06_\x88?" +p51 +tp52 +bsg27 +g3 +(g4 +(I0 +tp53 +g6 +tp54 +Rp55 +(I1 +(I5 +I8 +tp56 +g13 +I00 +S'Zd;\xdfO\x8d\x97?\x94\xf6\x06_\x98L\x95?\x84\x9e\xcd\xaa\xcf\xd5\x96?4\x116<\xbdR\x96?\xae\xd8_vO\x1e\x96?aTR\'\xa0\x89\xa0?r\x8a\x8e\xe4\xf2\x1f\xb2?M\x84\rO\xaf\x94\xcd? \xd2o_\x07\xce\x99?\xd4+e\x19\xe2X\x97?\xae\xd8_vO\x1e\x96?\xae\xd8_vO\x1e\x96?j\xbct\x93\x18\x04\x96?\xaa\xf1\xd2Mb\x10\x98?\x1aQ\xda\x1b|a\xa2?\xe2X\x17\xb7\xd1\x00\xbe?\x07\xf0\x16HP\xfc\x98?\xbe0\x99*\x18\x95\x94?"\xfd\xf6u\xe0\x9c\x91?{\x14\xaeG\xe1z\x94?\xa5N@\x13a\xc3\x93?\xe0\x9c\x11\xa5\xbd\xc1\x97?\x07\xf0\x16HP\xfc\x98?\xf3\x8eSt$\x97\xaf?K\xc8\x07=\x9bU\x9f?\xdb\xf9~j\xbct\x93?\x1b/\xdd$\x06\x81\x85?{\x14\xaeG\xe1z\x84?vq\x1b\r\xe0-\x80?\xb5\xa6y\xc7):\x82?\x94\xf6\x06_\x98L\x85?\xf3\x8eSt$\x97\xaf?\xab\xcf\xd5V\xec/\xab?lxz\xa5,C\x9c?{\x14\xaeG\xe1z\x84?y\xe9&1\x08\xac|?lxz\xa5,C|?\x92\xcb\x7fH\xbf}}?\xb8\x1e\x85\xebQ\xb8~?g\xd5\xe7j+\xf6\x87?' +p57 +tp58 +bsS'proc' +p59 +S'mfv_stopdbardbar' +p60 +sg28 +g3 +(g4 +(I0 +tp61 +g6 +tp62 +Rp63 +(I1 +(I5 +I8 +tp64 +g13 +I00 +S'{\x14\xaeG\xe1z\x94?\x01M\x84\rO\xaf\x94?\xae\xd8_vO\x1e\x96?M\xf3\x8eSt$\x97?4\x116<\xbdR\x96?\x9bU\x9f\xab\xad\xd8\x9f?\x0eO\xaf\x94e\x88\xb3?U0*\xa9\x13\xd0\xcc?\x15\x8cJ\xea\x044\xa1?\xbc\x05\x12\x14?\xc6\x9c?\xf6\x97\xdd\x93\x87\x85\x9a?\xfa~j\xbct\x93\x98?\x91\x0fz6\xab>\x97?\xc7\xba\xb8\x8d\x06\xf0\x96?\xdb\xf9~j\xbct\xa3?\x8a\xb0\xe1\xe9\x95\xb2\xbc?\xa9\xa4N@\x13a\xb3?\x00o\x81\x04\xc5\x8f\xb1?mV}\xae\xb6b\xbf?\x91\xed|?5^\xaa?4\x116<\xbdR\xa6?\x1e\x16jM\xf3\x8e\xa3?sh\x91\xed|?\xa5?333333\xb3?\x7f\xfb:p\xce\x88\xc2?\x8fSt$\x97\xff\xc0?mV}\xae\xb6b\xbf?\x92\xcb\x7fH\xbf}\xbd?\xd9_vO\x1e\x16\xba?\x0f\x9c3\xa2\xb47\xb8?h"lxz\xa5\xbc?\xee\xeb\xc09#J\xc3?\xaf\x94e\x88c]\xc4?\xa4p=\n\xd7\xa3\xc0?\x14?\xc6\xdc\xb5\x84\xbc?\x9e\xef\xa7\xc6K7\xb9?U0*\xa9\x13\xd0\xb4?\xe4\x83\x9e\xcd\xaa\xcf\xb5?\x7f\xd9=yX\xa8\xb5?\x88c]\xdcF\x03\xb8?' +p65 +tp66 +bs. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_VH.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_VH.pkl new file mode 100644 index 000000000..7cc2e0941 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_VH.pkl @@ -0,0 +1,125 @@ +(dp0 +S'perc' +p1 +I01 +sS'y_vals' +p2 +cnumpy.core.multiarray +_reconstruct +p3 +(cnumpy +ndarray +p4 +(I0 +tp5 +S'b' +p6 +tp7 +Rp8 +(I1 +(I3 +tp9 +cnumpy +dtype +p10 +(S'f8' +p11 +I0 +I1 +tp12 +Rp13 +(I3 +S'<' +p14 +NNNI-1 +I-1 +I0 +tp15 +bI00 +S'\x00\x00\x00\x00\x00\x00.@\x00\x00\x00\x00\x00\x00D@\x00\x00\x00\x00\x00\x80K@' +p16 +tp17 +bsS'dtype' +p18 +c__builtin__ +float +p19 +sS'x_unit' +p20 +S'mm' +p21 +sS'arr_len' +p22 +I0 +sS'years' +p23 +c__builtin__ +set +p24 +((lp25 +S'2017-8' +p26 +aS'20161-2' +p27 +atp28 +Rp29 +sS'y_unit' +p30 +S'GeV' +p31 +sg27 +g3 +(g4 +(I0 +tp32 +g6 +tp33 +Rp34 +(I1 +(I6 +I3 +tp35 +g13 +I00 +S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?;\x01M\x84\rO\xe3?\xffC\xfa\xed\xeb\xc0\xd9?\x00\x00\x00\x00\x00\x00\xf0?J{\x83/L\xa6\xd2?\x0f\x9c3\xa2\xb47\xd0?\x00\x00\x00\x00\x00\x00\xf0?\xe3X\x17\xb7\xd1\x00\xce?\xcf\x88\xd2\xde\xe0\x0b\xc3?\x00\x00\x00\x00\x00\x00\xf0?\x91~\xfb:p\xce\xc8?\x8cJ\xea\x044\x11\xc6?\x00\x00\x00\x00\x00\x00\xf0?\x10\xe9\xb7\xaf\x03\xe7\xcc?\xfee\xf7\xe4a\xa1\xc6?' +p36 +tp37 +bsS'x_vals' +p38 +g3 +(g4 +(I0 +tp39 +g6 +tp40 +Rp41 +(I1 +(I6 +tp42 +g13 +I00 +S'\x9a\x99\x99\x99\x99\x99\xb9?333333\xd3?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x08@\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00>@' +p43 +tp44 +bsg26 +g3 +(g4 +(I0 +tp45 +g6 +tp46 +Rp47 +(I1 +(I6 +I3 +tp48 +g13 +I00 +S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xb1Pk\x9aw\x9c\xd2?!\x1f\xf4lV}\xd6?,\xf6\x97\xdd\x93\x87\xe9?h"lxz\xa5\xcc?C>\xe8\xd9\xac\xfa\xcc?\xda=yX\xa85\xe5?-\xb2\x9d\xef\xa7\xc6\xcb?hDio\xf0\x85\xc9?\xbe\xc1\x17&S\x05\xdb?\xcd;N\xd1\x91\\\xce?\xff\xb2{\xf2\xb0P\xcb?\xe7?\xa4\xdf\xbe\x0e\xdc? \xd2o_\x07\xce\xd1?\xc0[ A\xf1c\xcc?' +p49 +tp50 +bsS'proc' +p51 +S'VH' +p52 +s. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_ggHToSSTodddd.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_ggHToSSTodddd.pkl new file mode 100644 index 000000000..009a71d91 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_ggHToSSTodddd.pkl @@ -0,0 +1,125 @@ +(dp0 +S'perc' +p1 +I01 +sS'y_vals' +p2 +cnumpy.core.multiarray +_reconstruct +p3 +(cnumpy +ndarray +p4 +(I0 +tp5 +S'b' +p6 +tp7 +Rp8 +(I1 +(I3 +tp9 +cnumpy +dtype +p10 +(S'f8' +p11 +I0 +I1 +tp12 +Rp13 +(I3 +S'<' +p14 +NNNI-1 +I-1 +I0 +tp15 +bI00 +S'\x00\x00\x00\x00\x00\x00.@\x00\x00\x00\x00\x00\x00D@\x00\x00\x00\x00\x00\x80K@' +p16 +tp17 +bsS'dtype' +p18 +c__builtin__ +float +p19 +sS'x_unit' +p20 +S'mm' +p21 +sS'arr_len' +p22 +I0 +sS'years' +p23 +c__builtin__ +set +p24 +((lp25 +S'2017-8' +p26 +aS'20161-2' +p27 +atp28 +Rp29 +sS'y_unit' +p30 +S'GeV' +p31 +sg27 +g3 +(g4 +(I0 +tp32 +g6 +tp33 +Rp34 +(I1 +(I4 +I3 +tp35 +g13 +I00 +S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?h"lxz\xa5\xe4?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?9EGr\xf9\x0f\xe1?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?9EGr\xf9\x0f\xe1?' +p36 +tp37 +bsS'x_vals' +p38 +g3 +(g4 +(I0 +tp39 +g6 +tp40 +Rp41 +(I1 +(I4 +tp42 +g13 +I00 +S'\x9a\x99\x99\x99\x99\x99\xb9?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00Y@' +p43 +tp44 +bsg26 +g3 +(g4 +(I0 +tp45 +g6 +tp46 +Rp47 +(I1 +(I4 +I3 +tp48 +g13 +I00 +S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x18&S\x05\xa3\x92\xda?C\x1c\xeb\xe26\x1a\xd0?\x00\x00\x00\x00\x00\x00\xf0?(\xa0\x89\xb0\xe1\xe9\xd5?d;\xdfO\x8d\x97\xce?\x00\x00\x00\x00\x00\x00\xf0?(\xa0\x89\xb0\xe1\xe9\xd5?d;\xdfO\x8d\x97\xce?' +p49 +tp50 +bsS'proc' +p51 +S'ggHToSSTodddd' +p52 +s. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_neu.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_neu.pkl new file mode 100644 index 000000000..41d57579c --- /dev/null +++ b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_neu.pkl @@ -0,0 +1,125 @@ +(dp0 +S'perc' +p1 +I01 +sS'y_vals' +p2 +cnumpy.core.multiarray +_reconstruct +p3 +(cnumpy +ndarray +p4 +(I0 +tp5 +S'b' +p6 +tp7 +Rp8 +(I1 +(I3 +tp9 +cnumpy +dtype +p10 +(S'f8' +p11 +I0 +I1 +tp12 +Rp13 +(I3 +S'<' +p14 +NNNI-1 +I-1 +I0 +tp15 +bI00 +S'\x00\x00\x00\x00\x00\x00i@\x00\x00\x00\x00\x00\x00y@\x00\x00\x00\x00\x00\x00\x89@' +p16 +tp17 +bsS'dtype' +p18 +c__builtin__ +float +p19 +sS'x_unit' +p20 +S'mm' +p21 +sS'arr_len' +p22 +I0 +sS'years' +p23 +c__builtin__ +set +p24 +((lp25 +S'2017-8' +p26 +aS'20161-2' +p27 +atp28 +Rp29 +sS'y_unit' +p30 +S'GeV' +p31 +sg27 +g3 +(g4 +(I0 +tp32 +g6 +tp33 +Rp34 +(I1 +(I5 +I3 +tp35 +g13 +I00 +S'\xeeZB>\xe8\xd9\xdc?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x18\x95\xd4\th"\xcc?\xe8\xfb\xa9\xf1\xd2M\xd2?\xed\r\xbe0\x99*\xd8?(\xa0\x89\xb0\xe1\xe9\xc5?\xb8\x1e\x85\xebQ\xb8\xce?\x9a\x99\x99\x99\x99\x99\xc9?\x08\xce\x19Q\xda\x1b\xbc?)\\\x8f\xc2\xf5(\xbc?)\\\x8f\xc2\xf5(\xbc?\xfee\xf7\xe4a\xa1\xc6?\n\xd7\xa3p=\n\xc7?\n\xd7\xa3p=\n\xc7?' +p36 +tp37 +bsS'x_vals' +p38 +g3 +(g4 +(I0 +tp39 +g6 +tp40 +Rp41 +(I1 +(I5 +tp42 +g13 +I00 +S'\x9a\x99\x99\x99\x99\x99\xb9?333333\xd3?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00>@' +p43 +tp44 +bsg26 +g3 +(g4 +(I0 +tp45 +g6 +tp46 +Rp47 +(I1 +(I5 +I3 +tp48 +g13 +I00 +S"\xa1g\xb3\xeas\xb5\xe1?\xc3d\xaa`TR\xe7?\x01M\x84\rO\xaf\xec?\xaf%\xe4\x83\x9e\xcd\xd2?'S\x05\xa3\x92:\xd9?%\xe4\x83\x9e\xcd\xaa\xdf?\xfa\xa0g\xb3\xeas\xc5?\xb8\x1e\x85\xebQ\xb8\xce?\x9a\x99\x99\x99\x99\x99\xc9?\xc2\x17&S\x05\xa3\xb2?{\x14\xaeG\xe1z\xb4?\xb8\x1e\x85\xebQ\xb8\xae?\xf8\xc2d\xaa`T\xb2?{\x14\xaeG\xe1z\xb4?\xb8\x1e\x85\xebQ\xb8\xae?" +p49 +tp50 +bsS'proc' +p51 +S'mfv_neu' +p52 +s. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_stopbbarbbar.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_stopbbarbbar.pkl new file mode 100644 index 000000000..df7e4b991 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_stopbbarbbar.pkl @@ -0,0 +1,125 @@ +(dp0 +S'perc' +p1 +I01 +sS'y_vals' +p2 +cnumpy.core.multiarray +_reconstruct +p3 +(cnumpy +ndarray +p4 +(I0 +tp5 +S'b' +p6 +tp7 +Rp8 +(I1 +(I3 +tp9 +cnumpy +dtype +p10 +(S'f8' +p11 +I0 +I1 +tp12 +Rp13 +(I3 +S'<' +p14 +NNNI-1 +I-1 +I0 +tp15 +bI00 +S'\x00\x00\x00\x00\x00\x00i@\x00\x00\x00\x00\x00\x00y@\x00\x00\x00\x00\x00\x00\x89@' +p16 +tp17 +bsS'dtype' +p18 +c__builtin__ +float +p19 +sS'x_unit' +p20 +S'mm' +p21 +sS'arr_len' +p22 +I0 +sS'years' +p23 +c__builtin__ +set +p24 +((lp25 +S'2017-8' +p26 +aS'20161-2' +p27 +atp28 +Rp29 +sS'y_unit' +p30 +S'GeV' +p31 +sg27 +g3 +(g4 +(I0 +tp32 +g6 +tp33 +Rp34 +(I1 +(I5 +I3 +tp35 +g13 +I00 +S'\xc1\xa8\xa4N@\x13\xe5?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xd6\xc5m4\x80\xb7\xe0?\xc0[ A\xf1c\xcc?@' +p43 +tp44 +bsg26 +g3 +(g4 +(I0 +tp45 +g6 +tp46 +Rp47 +(I1 +(I5 +I3 +tp48 +g13 +I00 +S'\x88\xf4\xdb\xd7\x81s\xee?L7\x89A`\xe5\xec?\nF%u\x02\x9a\xe8?.\xff!\xfd\xf6u\xd8?\x9f\xab\xad\xd8_v\xcf?\xaf%\xe4\x83\x9e\xcd\xd2?\xf7\x06_\x98L\x15\xd4?\x05\xc5\x8f1w-\xc1?)\\\x8f\xc2\xf5(\xac?5^\xbaI\x0c\x02\xd3?\xf6\x97\xdd\x93\x87\x85\xba?\xe8j+\xf6\x97\xdd\xa3?\xc5\xb1.n\xa3\x01\xd4?\xe0\x9c\x11\xa5\xbd\xc1\xb7?\xdc\xb5\x84|\xd0\xb3\xa9?' +p49 +tp50 +bsS'proc' +p51 +S'mfv_stopbbarbbar' +p52 +s. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_stopdbardbar.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_stopdbardbar.pkl new file mode 100644 index 000000000..c90f43658 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkMvr/pickle_mfv_stopdbardbar.pkl @@ -0,0 +1,125 @@ +(dp0 +S'perc' +p1 +I01 +sS'y_vals' +p2 +cnumpy.core.multiarray +_reconstruct +p3 +(cnumpy +ndarray +p4 +(I0 +tp5 +S'b' +p6 +tp7 +Rp8 +(I1 +(I3 +tp9 +cnumpy +dtype +p10 +(S'f8' +p11 +I0 +I1 +tp12 +Rp13 +(I3 +S'<' +p14 +NNNI-1 +I-1 +I0 +tp15 +bI00 +S'\x00\x00\x00\x00\x00\x00i@\x00\x00\x00\x00\x00\x00y@\x00\x00\x00\x00\x00\x00\x89@' +p16 +tp17 +bsS'dtype' +p18 +c__builtin__ +float +p19 +sS'x_unit' +p20 +S'mm' +p21 +sS'arr_len' +p22 +I0 +sS'years' +p23 +c__builtin__ +set +p24 +((lp25 +S'2017-8' +p26 +aS'20161-2' +p27 +atp28 +Rp29 +sS'y_unit' +p30 +S'GeV' +p31 +sg27 +g3 +(g4 +(I0 +tp32 +g6 +tp33 +Rp34 +(I1 +(I5 +I3 +tp35 +g13 +I00 +S'3\xc4\xb1.n\xa3\xd1?_)\xcb\x10\xc7\xba\xe8?\x80H\xbf}\x1d8\xeb?1\x08\xac\x1cZd\xbb?\xa3#\xb9\xfc\x87\xf4\xd3?D\x8bl\xe7\xfb\xa9\xd9?\xfd\x87\xf4\xdb\xd7\x81\xb3?\x18&S\x05\xa3\x92\xba?\xb8\x1e\x85\xebQ\xb8\xbe?n\xa3\x01\xbc\x05\x12\xb4?\xdc\xb5\x84|\xd0\xb3\xa9?\xb5\xa6y\xc7):\xa2?\x81sF\x94\xf6\x06\xbf?>\x9bU\x9f\xab\xad\xa8?X\xa85\xcd;N\xa1?' +p36 +tp37 +bsS'x_vals' +p38 +g3 +(g4 +(I0 +tp39 +g6 +tp40 +Rp41 +(I1 +(I5 +tp42 +g13 +I00 +S'\x9a\x99\x99\x99\x99\x99\xb9?333333\xd3?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00>@' +p43 +tp44 +bsg26 +g3 +(g4 +(I0 +tp45 +g6 +tp46 +Rp47 +(I1 +(I5 +I3 +tp48 +g13 +I00 +S'\xa2\xb47\xf8\xc2d\xd2?j\xdeq\x8a\x8e\xe4\xe2?\x17\xd9\xce\xf7S\xe3\xe1?1*\xa9\x13\xd0D\xb8?\x13a\xc3\xd3+e\xc9?\x9f\xcd\xaa\xcf\xd5V\xcc?\xb3{\xf2\xb0Pk\xaa?1*\xa9\x13\xd0D\xa8?\x0e\xbe0\x99*\x18\xa5?333333\xb3?\xcd]K\xc8\x07=\x9b?\x83\xe2\xc7\x98\xbb\x96\x90?\x80\xb7@\x82\xe2\xc7\xb8?\x9f<,\xd4\x9a\xe6\x9d?\xc2\x17&S\x05\xa3\x92?' +p49 +tp50 +bsS'proc' +p51 +S'mfv_stopdbardbar' +p52 +s. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/ct_pickle_VH.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/ct_pickle_VH.pkl new file mode 100644 index 000000000..c0d82064d --- /dev/null +++ b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/ct_pickle_VH.pkl @@ -0,0 +1,167 @@ +(dp0 +S'perc' +p1 +I00 +sS'y_vals' +p2 +cnumpy.core.multiarray +_reconstruct +p3 +(cnumpy +ndarray +p4 +(I0 +tp5 +S'b' +p6 +tp7 +Rp8 +(I1 +(I3 +tp9 +cnumpy +dtype +p10 +(S'f8' +p11 +I0 +I1 +tp12 +Rp13 +(I3 +S'<' +p14 +NNNI-1 +I-1 +I0 +tp15 +bI00 +S'\x00\x00\x00\x00\x00\x00.@\x00\x00\x00\x00\x00\x00D@\x00\x00\x00\x00\x00\x80K@' +p16 +tp17 +bsS'dtype' +p18 +c__builtin__ +float +p19 +sS'20162' +p20 +g3 +(g4 +(I0 +tp21 +g6 +tp22 +Rp23 +(I1 +(I6 +I3 +I3 +tp24 +g13 +I00 +S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xc3(\x08\x1e\xdf^\xee?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xc3(\x08\x1e\xdf^\xee?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xc3(\x08\x1e\xdf^\xee?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xd9\n\x9a\x96X\x99\xed?\x15\x1a\x88e3\x07\xeb?\xder\xf5c\x93\xfc\xed?\xd9\n\x9a\x96X\x99\xed?\x15\x1a\x88e3\x07\xeb?\xder\xf5c\x93\xfc\xed?\xd9\n\x9a\x96X\x99\xed?\x15\x1a\x88e3\x07\xeb?\xder\xf5c\x93\xfc\xed?\x1c}\xcc\x07\x04\xba\xec?\xfaE\t\xfa\x0b\xbd\xe8?\xe6\x94\x80\x98\x84\x0b\xe9?\x1c}\xcc\x07\x04\xba\xec?\xfaE\t\xfa\x0b\xbd\xe8?\xe6\x94\x80\x98\x84\x0b\xe9?\x1c}\xcc\x07\x04\xba\xec?\xfaE\t\xfa\x0b\xbd\xe8?\xe6\x94\x80\x98\x84\x0b\xe9?\xd8\xd8%\xaa\xb7\x86\xea?%\xcc\xb4\xfd+\xab\xe7?3\x18#\x12\x85\x16\xe6?\xd8\xd8%\xaa\xb7\x86\xea?%\xcc\xb4\xfd+\xab\xe7?3\x18#\x12\x85\x16\xe6?\xd8\xd8%\xaa\xb7\x86\xea?%\xcc\xb4\xfd+\xab\xe7?3\x18#\x12\x85\x16\xe6?z\xa6\x97\x18\xcb\xf4\xe8?["\x17\x9c\xc1_\xe6?\xa3"N\'\xd9\xea\xe5?z\xa6\x97\x18\xcb\xf4\xe8?["\x17\x9c\xc1_\xe6?\xa3"N\'\xd9\xea\xe5?z\xa6\x97\x18\xcb\xf4\xe8?["\x17\x9c\xc1_\xe6?\xa3"N\'\xd9\xea\xe5?' +p25 +tp26 +bsS'x_unit' +p27 +S'mm' +p28 +sS'arr_len' +p29 +I3 +sS'years' +p30 +c__builtin__ +set +p31 +((lp32 +S'20161' +p33 +ag20 +aS'2017' +p34 +aS'2018' +p35 +atp36 +Rp37 +sS'y_unit' +p38 +S'GeV' +p39 +sg35 +g3 +(g4 +(I0 +tp40 +g6 +tp41 +Rp42 +(I1 +(I6 +I3 +I3 +tp43 +g13 +I00 +S'\xcb\x12\x9de\x16\xa1\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xcb\x12\x9de\x16\xa1\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xcb\x12\x9de\x16\xa1\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x8c\xf2\xcc\xcbaw\xee?\xd5w~Q\x82\xfe\xef?\x00\x00\x00\x00\x00\x00\xf0?\x8c\xf2\xcc\xcbaw\xee?\xd5w~Q\x82\xfe\xef?\x00\x00\x00\x00\x00\x00\xf0?\x8c\xf2\xcc\xcbaw\xee?\xd5w~Q\x82\xfe\xef?\x00\x00\x00\x00\x00\x00\xf0?\xec1\x91\xd2l\x1e\xee?/\xfdKR\x99b\xec?\xc2\x87\x12-y<\xe5?\xec1\x91\xd2l\x1e\xee?/\xfdKR\x99b\xec?\xc2\x87\x12-y<\xe5?\xec1\x91\xd2l\x1e\xee?/\xfdKR\x99b\xec?\xc2\x87\x12-y<\xe5?\x00VG\x8et\x06\xed?\x1f\xf2\x96\xab\x1f\x1b\xeb?\xd0\xf2<\xb8;\xeb\xe9?\x00VG\x8et\x06\xed?\x1f\xf2\x96\xab\x1f\x1b\xeb?\xd0\xf2<\xb8;\xeb\xe9?\x00VG\x8et\x06\xed?\x1f\xf2\x96\xab\x1f\x1b\xeb?\xd0\xf2<\xb8;\xeb\xe9?\xa5\xa1F!\xc9,\xec?Z\xd6\xfdc!\xba\xe9?\x84\xf4\x149D\xdc\xe7?\xa5\xa1F!\xc9,\xec?Z\xd6\xfdc!\xba\xe9?\x84\xf4\x149D\xdc\xe7?\xa5\xa1F!\xc9,\xec?Z\xd6\xfdc!\xba\xe9?\x84\xf4\x149D\xdc\xe7?\x17b\xf5G\x18\x86\xeb?\x85\xb2\xf0\xf5\xb5.\xea?\xce\x89=\xb4\x8f\x15\xe7?\x17b\xf5G\x18\x86\xeb?\x85\xb2\xf0\xf5\xb5.\xea?\xce\x89=\xb4\x8f\x15\xe7?\x17b\xf5G\x18\x86\xeb?\x85\xb2\xf0\xf5\xb5.\xea?\xce\x89=\xb4\x8f\x15\xe7?' +p44 +tp45 +bsg33 +g3 +(g4 +(I0 +tp46 +g6 +tp47 +Rp48 +(I1 +(I6 +I3 +I3 +tp49 +g13 +I00 +S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xf3\x8eSt$\x97\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xf3\x8eSt$\x97\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xf3\x8eSt$\x97\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xc7,{\x12\xd8\x9c\xed?8\x84*5{\xa0\xec?\x92@\x83M\x9d\xc7\xe7?\xc7,{\x12\xd8\x9c\xed?8\x84*5{\xa0\xec?\x92@\x83M\x9d\xc7\xe7?\xc7,{\x12\xd8\x9c\xed?8\x84*5{\xa0\xec?\x92@\x83M\x9d\xc7\xe7??V\xf0\xdb\x10\xe3\xec?\xe2?\xdd@\x81w\xe9?\xdaY\xf4N\x05\xdc\xe6??V\xf0\xdb\x10\xe3\xec?\xe2?\xdd@\x81w\xe9?\xdaY\xf4N\x05\xdc\xe6??V\xf0\xdb\x10\xe3\xec?\xe2?\xdd@\x81w\xe9?\xdaY\xf4N\x05\xdc\xe6?\xe9\x0f\xcd<\xb9\xa6\xec?3\xc5\x1c\x04\x1d\xad\xe7?\xf9\xf4\xd8\x96\x01\xe7\xe5?\xe9\x0f\xcd<\xb9\xa6\xec?3\xc5\x1c\x04\x1d\xad\xe7?\xf9\xf4\xd8\x96\x01\xe7\xe5?\xe9\x0f\xcd<\xb9\xa6\xec?3\xc5\x1c\x04\x1d\xad\xe7?\xf9\xf4\xd8\x96\x01\xe7\xe5?5E\x80\xd3\xbbx\xec??\x8b\xa5H\xbe\x12\xe7?\x160\x81[ws\xe5?5E\x80\xd3\xbbx\xec??\x8b\xa5H\xbe\x12\xe7?\x160\x81[ws\xe5?5E\x80\xd3\xbbx\xec??\x8b\xa5H\xbe\x12\xe7?\x160\x81[ws\xe5?' +p50 +tp51 +bsS'x_vals' +p52 +g3 +(g4 +(I0 +tp53 +g6 +tp54 +Rp55 +(I1 +(I6 +tp56 +g13 +I00 +S'\x9a\x99\x99\x99\x99\x99\xb9?333333\xd3?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x08@\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00>@' +p57 +tp58 +bsg34 +g3 +(g4 +(I0 +tp59 +g6 +tp60 +Rp61 +(I1 +(I6 +I3 +I3 +tp62 +g13 +I00 +S'F(\xb6\x82\xa6\xa5\xec?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?F(\xb6\x82\xa6\xa5\xec?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?F(\xb6\x82\xa6\xa5\xec?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x83\x89?\x8a:s\xee?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x83\x89?\x8a:s\xee?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x83\x89?\x8a:s\xee?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xf6\xebNw\x9e\xf8\xed?G\xad0}\xaf!\xed?\xd2\x8b\xda\xfd*@\xec?\xf6\xebNw\x9e\xf8\xed?G\xad0}\xaf!\xed?\xd2\x8b\xda\xfd*@\xec?\xf6\xebNw\x9e\xf8\xed?G\xad0}\xaf!\xed?\xd2\x8b\xda\xfd*@\xec?\x9f<,\xd4\x9af\xed?\xc6\xfbq\xfb\xe5\x93\xea?\xd9$?\xe2W\xac\xe9?\x9f<,\xd4\x9af\xed?\xc6\xfbq\xfb\xe5\x93\xea?\xd9$?\xe2W\xac\xe9?\x9f<,\xd4\x9af\xed?\xc6\xfbq\xfb\xe5\x93\xea?\xd9$?\xe2W\xac\xe9?\xe6\\\x8a\xab\xca\xbe\xec?t~\x8a\xe3\xc0+\xe9?\xc1\xe0\x9a;\xfa_\xe7?\xe6\\\x8a\xab\xca\xbe\xec?t~\x8a\xe3\xc0+\xe9?\xc1\xe0\x9a;\xfa_\xe7?\xe6\\\x8a\xab\xca\xbe\xec?t~\x8a\xe3\xc0+\xe9?\xc1\xe0\x9a;\xfa_\xe7?\xea\xb0\xc2-\x1fI\xeb?\x90kC\xc58\x7f\xe8?\xd0%\x1cz\x8b\x07\xe8?\xea\xb0\xc2-\x1fI\xeb?\x90kC\xc58\x7f\xe8?\xd0%\x1cz\x8b\x07\xe8?\xea\xb0\xc2-\x1fI\xeb?\x90kC\xc58\x7f\xe8?\xd0%\x1cz\x8b\x07\xe8?' +p63 +tp64 +bsS'proc' +p65 +S'VH' +p66 +s. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/dn_pickle_VH.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/dn_pickle_VH.pkl new file mode 100644 index 000000000..5623c66da --- /dev/null +++ b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/dn_pickle_VH.pkl @@ -0,0 +1,167 @@ +(dp0 +S'perc' +p1 +I00 +sS'y_vals' +p2 +cnumpy.core.multiarray +_reconstruct +p3 +(cnumpy +ndarray +p4 +(I0 +tp5 +S'b' +p6 +tp7 +Rp8 +(I1 +(I3 +tp9 +cnumpy +dtype +p10 +(S'f8' +p11 +I0 +I1 +tp12 +Rp13 +(I3 +S'<' +p14 +NNNI-1 +I-1 +I0 +tp15 +bI00 +S'\x00\x00\x00\x00\x00\x00.@\x00\x00\x00\x00\x00\x00D@\x00\x00\x00\x00\x00\x80K@' +p16 +tp17 +bsS'dtype' +p18 +c__builtin__ +float +p19 +sS'20162' +p20 +g3 +(g4 +(I0 +tp21 +g6 +tp22 +Rp23 +(I1 +(I6 +I3 +I3 +tp24 +g13 +I00 +S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xd8\xd8%\xaa\xb7\x06\xf0?\xd7Q\xd5\x04Qw\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xd8\xd8%\xaa\xb7\x06\xf0?\xd7Q\xd5\x04Qw\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xd8\xd8%\xaa\xb7\x06\xf0?\xd7Q\xd5\x04Qw\xf0?\x00\x00\x00\x00\x00\x00\xf0?M2r\x16\xf64\xf0?Ae\xfc\xfb\x8c\x8b\xf0?\xfe\xb7\x92\x1d\x1b\x01\xf1?M2r\x16\xf64\xf0?Ae\xfc\xfb\x8c\x8b\xf0?\xfe\xb7\x92\x1d\x1b\x01\xf1?M2r\x16\xf64\xf0?Ae\xfc\xfb\x8c\x8b\xf0?\xfe\xb7\x92\x1d\x1b\x01\xf1?\xe4I\xd25\x93o\xf0?l&\xdfls\xe3\xf0?B\xb2\x80\t\xdc\xba\xf0?\xe4I\xd25\x93o\xf0?l&\xdfls\xe3\xf0?B\xb2\x80\t\xdc\xba\xf0?\xe4I\xd25\x93o\xf0?l&\xdfls\xe3\xf0?B\xb2\x80\t\xdc\xba\xf0?9\xd1\xaeB\xca\xcf\xf1?{\xf7\xc7{\xd5J\xf1? \x0c<\xf7\x1e\xae\xf1?9\xd1\xaeB\xca\xcf\xf1?{\xf7\xc7{\xd5J\xf1? \x0c<\xf7\x1e\xae\xf1?9\xd1\xaeB\xca\xcf\xf1?{\xf7\xc7{\xd5J\xf1? \x0c<\xf7\x1e\xae\xf1?' +p25 +tp26 +bsS'x_unit' +p27 +S'mm' +p28 +sS'arr_len' +p29 +I3 +sS'years' +p30 +c__builtin__ +set +p31 +((lp32 +S'20161' +p33 +ag20 +aS'2017' +p34 +aS'2018' +p35 +atp36 +Rp37 +sS'y_unit' +p38 +S'GeV' +p39 +sg35 +g3 +(g4 +(I0 +tp40 +g6 +tp41 +Rp42 +(I1 +(I6 +I3 +I3 +tp43 +g13 +I00 +S"\xe2X\x17\xb7\xd1\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xe2X\x17\xb7\xd1\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xe2X\x17\xb7\xd1\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xcb\xf6!o\xb9\xfa\xef?\xedG\x8a\xc8\xb0\n\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xcb\xf6!o\xb9\xfa\xef?\xedG\x8a\xc8\xb0\n\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xcb\xf6!o\xb9\xfa\xef?\xedG\x8a\xc8\xb0\n\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xc0\t\x85\x088\x04\xf0?\n\xbf\xd4\xcf\x9b\n\xf0?}\xe8\x82\xfa\x969\xf0?\xc0\t\x85\x088\x04\xf0?\n\xbf\xd4\xcf\x9b\n\xf0?}\xe8\x82\xfa\x969\xf0?\xc0\t\x85\x088\x04\xf0?\n\xbf\xd4\xcf\x9b\n\xf0?}\xe8\x82\xfa\x969\xf0?\x1an\xc0\xe7\x87\x11\xf0?\xad4)\x05\xdd^\xf0?g'\x83\xa3\xe4U\xf0?\x1an\xc0\xe7\x87\x11\xf0?\xad4)\x05\xdd^\xf0?g'\x83\xa3\xe4U\xf0?\x1an\xc0\xe7\x87\x11\xf0?\xad4)\x05\xdd^\xf0?g'\x83\xa3\xe4U\xf0?\x8a\x1fc\xeeZB\xf0?\x12\xbd\x8cb\xb9\xa5\xf0?\xc8\x0cT\xc6\xbfO\xf0?\x8a\x1fc\xeeZB\xf0?\x12\xbd\x8cb\xb9\xa5\xf0?\xc8\x0cT\xc6\xbfO\xf0?\x8a\x1fc\xeeZB\xf0?\x12\xbd\x8cb\xb9\xa5\xf0?\xc8\x0cT\xc6\xbfO\xf0?\x17\x0e\x84d\x01\x13\xf0?R\xf2\xea\x1c\x032\xf0?\xdflsczB\xf0?\x17\x0e\x84d\x01\x13\xf0?R\xf2\xea\x1c\x032\xf0?\xdflsczB\xf0?\x17\x0e\x84d\x01\x13\xf0?R\xf2\xea\x1c\x032\xf0?\xdflsczB\xf0?" +p44 +tp45 +bsg33 +g3 +(g4 +(I0 +tp46 +g6 +tp47 +Rp48 +(I1 +(I6 +I3 +I3 +tp49 +g13 +I00 +S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x9e\xef\xa7\xc6K7\xf0?\xd4\xb7\xcc\xe9\xb2\x18\xf0?\x0eO\xaf\x94e\x08\xf1?\x9e\xef\xa7\xc6K7\xf0?\xd4\xb7\xcc\xe9\xb2\x18\xf0?\x0eO\xaf\x94e\x08\xf1?\x9e\xef\xa7\xc6K7\xf0?\xd4\xb7\xcc\xe9\xb2\x18\xf0?\x0eO\xaf\x94e\x08\xf1?\xbe\x87K\x8e;%\xf0?\x94M\xb9\xc2\xbb\\\xf0?\x15\x1d\xc9\xe5?$\xf1?\xbe\x87K\x8e;%\xf0?\x94M\xb9\xc2\xbb\\\xf0?\x15\x1d\xc9\xe5?$\xf1?\xbe\x87K\x8e;%\xf0?\x94M\xb9\xc2\xbb\\\xf0?\x15\x1d\xc9\xe5?$\xf1?\xed\xbb"\xf8\xdfJ\xf0?\xb1\x16\x9f\x02`\xbc\xf0?\xa8W\xca2\xc4\xb1\xf0?\xed\xbb"\xf8\xdfJ\xf0?\xb1\x16\x9f\x02`\xbc\xf0?\xa8W\xca2\xc4\xb1\xf0?\xed\xbb"\xf8\xdfJ\xf0?\xb1\x16\x9f\x02`\xbc\xf0?\xa8W\xca2\xc4\xb1\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x8f\xaa&\x88\xba\x0f\xf1?\x19\x90\xbd\xde\xfdq\xf1?\x00\x00\x00\x00\x00\x00\xf0?\x8f\xaa&\x88\xba\x0f\xf1?\x19\x90\xbd\xde\xfdq\xf1?\x00\x00\x00\x00\x00\x00\xf0?\x8f\xaa&\x88\xba\x0f\xf1?\x19\x90\xbd\xde\xfdq\xf1?' +p50 +tp51 +bsS'x_vals' +p52 +g3 +(g4 +(I0 +tp53 +g6 +tp54 +Rp55 +(I1 +(I6 +tp56 +g13 +I00 +S'\x9a\x99\x99\x99\x99\x99\xb9?333333\xd3?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x08@\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00>@' +p57 +tp58 +bsg34 +g3 +(g4 +(I0 +tp59 +g6 +tp60 +Rp61 +(I1 +(I6 +I3 +I3 +tp62 +g13 +I00 +S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?ywd\xac6\xff\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?ywd\xac6\xff\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?ywd\xac6\xff\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?o\xbb\xd0\\\xa7\x11\xf0?\xb6\xbeHh\xcb9\xf0?\xe3p\xe6Ws\x00\xf0?o\xbb\xd0\\\xa7\x11\xf0?\xb6\xbeHh\xcb9\xf0?\xe3p\xe6Ws\x00\xf0?o\xbb\xd0\\\xa7\x11\xf0?\xb6\xbeHh\xcb9\xf0?\xe3p\xe6Ws\x00\xf0?\x05\x17+j0\r\xf0?\xd0D\xd8\xf0\xf4J\xf0?\xdb\xc4\xc9\xfd\x0eE\xf0?\x05\x17+j0\r\xf0?\xd0D\xd8\xf0\xf4J\xf0?\xdb\xc4\xc9\xfd\x0eE\xf0?\x05\x17+j0\r\xf0?\xd0D\xd8\xf0\xf4J\xf0?\xdb\xc4\xc9\xfd\x0eE\xf0?^\xbaI\x0c\x02+\xf0?\xcb\x84_\xea\xe7M\xf0?\xe6"\xbe\x13\xb3^\xf0?^\xbaI\x0c\x02+\xf0?\xcb\x84_\xea\xe7M\xf0?\xe6"\xbe\x13\xb3^\xf0?^\xbaI\x0c\x02+\xf0?\xcb\x84_\xea\xe7M\xf0?\xe6"\xbe\x13\xb3^\xf0?W!\xe5\'\xd5>\xf0?\xfa\xb86T\x8cs\xf0?\x02\xf1\xba~\xc1n\xf0?W!\xe5\'\xd5>\xf0?\xfa\xb86T\x8cs\xf0?\x02\xf1\xba~\xc1n\xf0?W!\xe5\'\xd5>\xf0?\xfa\xb86T\x8cs\xf0?\x02\xf1\xba~\xc1n\xf0?' +p63 +tp64 +bsS'proc' +p65 +S'VH' +p66 +s. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/up_pickle_VH.pkl b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/up_pickle_VH.pkl new file mode 100644 index 000000000..4c52e61b8 --- /dev/null +++ b/MFVNeutralino/test/ForLimits/NuisTabStore_TrkRec/up_pickle_VH.pkl @@ -0,0 +1,167 @@ +(dp0 +S'perc' +p1 +I00 +sS'y_vals' +p2 +cnumpy.core.multiarray +_reconstruct +p3 +(cnumpy +ndarray +p4 +(I0 +tp5 +S'b' +p6 +tp7 +Rp8 +(I1 +(I3 +tp9 +cnumpy +dtype +p10 +(S'f8' +p11 +I0 +I1 +tp12 +Rp13 +(I3 +S'<' +p14 +NNNI-1 +I-1 +I0 +tp15 +bI00 +S'\x00\x00\x00\x00\x00\x00.@\x00\x00\x00\x00\x00\x00D@\x00\x00\x00\x00\x00\x80K@' +p16 +tp17 +bsS'dtype' +p18 +c__builtin__ +float +p19 +sS'20162' +p20 +g3 +(g4 +(I0 +tp21 +g6 +tp22 +Rp23 +(I1 +(I6 +I3 +I3 +tp24 +g13 +I00 +S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?Ii6\x8f\xc3`\xef?l\xce\xc13\xa1\xc9\xee?\x00\x00\x00\x00\x00\x00\xf0?Ii6\x8f\xc3`\xef?l\xce\xc13\xa1\xc9\xee?\x00\x00\x00\x00\x00\x00\xf0?Ii6\x8f\xc3`\xef?l\xce\xc13\xa1\xc9\xee?\x00\x00\x00\x00\x00\x00\xf0?8\x82T\x8a\x1d\x8d\xef?0b\x9f\x00\x8a\x91\xee?{\xbb%9`W\xef?8\x82T\x8a\x1d\x8d\xef?0b\x9f\x00\x8a\x91\xee?{\xbb%9`W\xef?8\x82T\x8a\x1d\x8d\xef?0b\x9f\x00\x8a\x91\xee?{\xbb%9`W\xef?\xff\xe8\x9b4\r\x8a\xef?\x97Tm7\xc17\xef?W\n\x81\\\xe2H\xee?\xff\xe8\x9b4\r\x8a\xef?\x97Tm7\xc17\xef?W\n\x81\\\xe2H\xee?\xff\xe8\x9b4\r\x8a\xef?\x97Tm7\xc17\xef?W\n\x81\\\xe2H\xee?\x94O\x8fm\x19p\xef?\xbc\xb3v\xdb\x85f\xee?s\x9c\xdb\x84{e\xef?\x94O\x8fm\x19p\xef?\xbc\xb3v\xdb\x85f\xee?s\x9c\xdb\x84{e\xef?\x94O\x8fm\x19p\xef?\xbc\xb3v\xdb\x85f\xee?s\x9c\xdb\x84{e\xef?' +p25 +tp26 +bsS'x_unit' +p27 +S'mm' +p28 +sS'arr_len' +p29 +I3 +sS'years' +p30 +c__builtin__ +set +p31 +((lp32 +S'20161' +p33 +ag20 +aS'2017' +p34 +aS'2018' +p35 +atp36 +Rp37 +sS'y_unit' +p38 +S'GeV' +p39 +sg35 +g3 +(g4 +(I0 +tp40 +g6 +tp41 +Rp42 +(I1 +(I6 +I3 +I3 +tp43 +g13 +I00 +S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?F"4\x82\x8d\xeb\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?F"4\x82\x8d\xeb\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?F"4\x82\x8d\xeb\xef?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xa6\x81\x1f\xd5\xb0\xdf\xef?\xf8l\x1d\x1c\xec\xcd\xef?\x17\xd7\xf8L\xf6\xcf\xed?\xa6\x81\x1f\xd5\xb0\xdf\xef?\xf8l\x1d\x1c\xec\xcd\xef?\x17\xd7\xf8L\xf6\xcf\xed?\xa6\x81\x1f\xd5\xb0\xdf\xef?\xf8l\x1d\x1c\xec\xcd\xef?\x17\xd7\xf8L\xf6\xcf\xed?\x96\xe8,\xb3\x08\xc5\xef?\xc9\xaa\x087\x19U\xef?\x83P\xde\xc7\xd1\x1c\xef?\x96\xe8,\xb3\x08\xc5\xef?\xc9\xaa\x087\x19U\xef?\x83P\xde\xc7\xd1\x1c\xef?\x96\xe8,\xb3\x08\xc5\xef?\xc9\xaa\x087\x19U\xef?\x83P\xde\xc7\xd1\x1c\xef?\x85B\x04\x1cB\x95\xef?\xab\x933\x14w<\xef?\xf2\xb3\x91\xeb\xa6\x14\xef?\x85B\x04\x1cB\x95\xef?\xab\x933\x14w<\xef?\xf2\xb3\x91\xeb\xa6\x14\xef?\x85B\x04\x1cB\x95\xef?\xab\x933\x14w<\xef?\xf2\xb3\x91\xeb\xa6\x14\xef?/\xf9\x9f\xfc\xdd\xbb\xef?\n\xf7\xca\xbcU\xd7\xee?C\x8f\x18=\xb7P\xee?/\xf9\x9f\xfc\xdd\xbb\xef?\n\xf7\xca\xbcU\xd7\xee?C\x8f\x18=\xb7P\xee?/\xf9\x9f\xfc\xdd\xbb\xef?\n\xf7\xca\xbcU\xd7\xee?C\x8f\x18=\xb7P\xee?' +p44 +tp45 +bsg33 +g3 +(g4 +(I0 +tp46 +g6 +tp47 +Rp48 +(I1 +(I6 +I3 +I3 +tp49 +g13 +I00 +S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?dY0\xf1G\xd1\xef?rP\xc2L\xdb?\xef?\x00\x00\x00\x00\x00\x00\xf0?dY0\xf1G\xd1\xef?rP\xc2L\xdb?\xef?\x00\x00\x00\x00\x00\x00\xf0?dY0\xf1G\xd1\xef?rP\xc2L\xdb?\xef?\x00\x00\x00\x00\x00\x00\xf0??\xfdg\xcd\x8f?\xef?\xa6\xb5il\xaf\x85\xee?\xa6|\x08\xaaF/\xee??\xfdg\xcd\x8f?\xef?\xa6\xb5il\xaf\x85\xee?\xa6|\x08\xaaF/\xee??\xfdg\xcd\x8f?\xef?\xa6\xb5il\xaf\x85\xee?\xa6|\x08\xaaF/\xee?=d\xca\x87\xa0\xea\xee?z\xe29[@\xe8\xed?k\x10\xe6v/w\xee?=d\xca\x87\xa0\xea\xee?z\xe29[@\xe8\xed?k\x10\xe6v/w\xee?=d\xca\x87\xa0\xea\xee?z\xe29[@\xe8\xed?k\x10\xe6v/w\xee?\t\xa4\xc4\xae\xed\xed\xed?\xcd!\xa9\x85\x92\xc9\xee?\xba\xda\x8a\xfdew\xee?\t\xa4\xc4\xae\xed\xed\xed?\xcd!\xa9\x85\x92\xc9\xee?\xba\xda\x8a\xfdew\xee?\t\xa4\xc4\xae\xed\xed\xed?\xcd!\xa9\x85\x92\xc9\xee?\xba\xda\x8a\xfdew\xee?' +p50 +tp51 +bsS'x_vals' +p52 +g3 +(g4 +(I0 +tp53 +g6 +tp54 +Rp55 +(I1 +(I6 +tp56 +g13 +I00 +S'\x9a\x99\x99\x99\x99\x99\xb9?333333\xd3?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x08@\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00>@' +p57 +tp58 +bsg34 +g3 +(g4 +(I0 +tp59 +g6 +tp60 +Rp61 +(I1 +(I6 +I3 +I3 +tp62 +g13 +I00 +S'od\x1e\xf9\x83\x01\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?od\x1e\xf9\x83\x01\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?od\x1e\xf9\x83\x01\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xe3\x88\xb5\xf8\x14\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xe3\x88\xb5\xf8\x14\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xe3\x88\xb5\xf8\x14\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\xbd\x8f\xa39\xb2\xf2\xef?\xa8\x8eUJ\xcf\xf4\xef?YLl>\xae\x8d\xef?\xbd\x8f\xa39\xb2\xf2\xef?\xa8\x8eUJ\xcf\xf4\xef?YLl>\xae\x8d\xef?\xbd\x8f\xa39\xb2\xf2\xef?\xa8\x8eUJ\xcf\xf4\xef?YLl>\xae\x8d\xef?S\x92u8\xba\xca\xef?Jz\x18Z\x9d\x1c\xef?\x0e\xd9@\xba\xd84\xef?S\x92u8\xba\xca\xef?Jz\x18Z\x9d\x1c\xef?\x0e\xd9@\xba\xd84\xef?S\x92u8\xba\xca\xef?Jz\x18Z\x9d\x1c\xef?\x0e\xd9@\xba\xd84\xef?\xb8\x03u\xca\xa3\x9b\xef?\xa5\x82\x8a\xaa_i\xef?\xdd^\xd2\x18\xad#\xef?\xb8\x03u\xca\xa3\x9b\xef?\xa5\x82\x8a\xaa_i\xef?\xdd^\xd2\x18\xad#\xef?\xb8\x03u\xca\xa3\x9b\xef?\xa5\x82\x8a\xaa_i\xef?\xdd^\xd2\x18\xad#\xef?\x9b\xffW\x1d9R\xef?\xf7\xaf\xac4)\x85\xee?U\xa4\xc2\xd8B\x90\xee?\x9b\xffW\x1d9R\xef?\xf7\xaf\xac4)\x85\xee?U\xa4\xc2\xd8B\x90\xee?\x9b\xffW\x1d9R\xef?\xf7\xaf\xac4)\x85\xee?U\xa4\xc2\xd8B\x90\xee?' +p63 +tp64 +bsS'proc' +p65 +S'VH' +p66 +s. \ No newline at end of file diff --git a/MFVNeutralino/test/ForLimits/getNuisanceFromSig.py b/MFVNeutralino/test/ForLimits/getNuisanceFromSig.py index aa5e4d3e0..6cbc76ad5 100644 --- a/MFVNeutralino/test/ForLimits/getNuisanceFromSig.py +++ b/MFVNeutralino/test/ForLimits/getNuisanceFromSig.py @@ -77,8 +77,10 @@ def get_nuis_fromname(nuis_name, siginfo, nuis_ls, debug_mode=False): elif nuis_name == "pileup": new_nuis = nsfc.get_pileup("CMS_pileup", siginfo, debug_mode=debug_mode) elif nuis_name == "int_lumi": new_nuis = nsfc.get_int_lumi("lumi", siginfo, debug_mode=debug_mode) elif nuis_name == "lep_effi": new_nuis = nsfc.get_lep_effi("CMS_eff_", siginfo, debug_mode=debug_mode) - elif nuis_name == "trig_JESR_btag": new_nuis = nsfc.get_trig_JESR_btag("disp_trig_uncerts", siginfo, debug_mode=debug_mode) - elif nuis_name == "calo_inef": new_nuis = nsfc.get_calo_inef("calo_ineff", siginfo, debug_mode=debug_mode) + elif nuis_name == "trig_JESR_btag": new_nuis = nsfc.get_trig_JESR_btag("disp_trig_uncerts", siginfo, debug_mode=debug_mode) + elif nuis_name == "calo_inef": new_nuis = nsfc.get_calo_inef("calo_ineff", siginfo, debug_mode=debug_mode) + elif nuis_name == "qcd_scale_ren_ggH": new_nuis = nsfc.get_qcd_scale_ren_ggH("QCDscale_ren_ggH", siginfo, debug_mode=debug_mode) + elif nuis_name == "qcd_scale_fac_VH": new_nuis = nsfc.get_qcd_scale_fac_VH("QCDscale_fac_VH", siginfo, debug_mode=debug_mode) else: print("Error: nuisance name not implemented for", nuis_name) @@ -141,6 +143,12 @@ def get_nuis_fromsig(siginfo, nuis_ls, debug_mode=False): for nuis in sorted(nuis_set): get_nuis_fromname(nuis, siginfo, nuis_ls, debug_mode=debug_mode) + # Process-specific theory systematics (year- and bin-correlated, no CMS_EXO24035_ prefix) + if siginfo.proc == "ggHToSSTodddd": + get_nuis_fromname("qcd_scale_ren_ggH", siginfo, nuis_ls, debug_mode=debug_mode) + if siginfo.proc == "VH": + get_nuis_fromname("qcd_scale_fac_VH", siginfo, nuis_ls, debug_mode=debug_mode) + if debug_mode: print("Nuisances that produced a SIG Nuisance object:") for nuis in nuis_ls: diff --git a/MFVNeutralino/test/ForLimits/limits_config.yaml b/MFVNeutralino/test/ForLimits/limits_config.yaml index 411358fc4..bd7e1c54c 100644 --- a/MFVNeutralino/test/ForLimits/limits_config.yaml +++ b/MFVNeutralino/test/ForLimits/limits_config.yaml @@ -64,6 +64,7 @@ nuisance_tables: base: "NuisTabStore_TrkRec/" up_prefix: "up_pickle" dn_prefix: "dn_pickle" + fac_scale_VH_csv: "/uscms/home/gdecastr/nobackup/crabdirs/TheorySystematics/fac_scale_shape_bins.csv" # ---- Observed events (set to 0 for blind analysis) ----------- observations: diff --git a/MFVNeutralino/test/ForLimits/nuisance_configs.py b/MFVNeutralino/test/ForLimits/nuisance_configs.py index 844f9a01c..e07d96807 100644 --- a/MFVNeutralino/test/ForLimits/nuisance_configs.py +++ b/MFVNeutralino/test/ForLimits/nuisance_configs.py @@ -32,3 +32,5 @@ "vtx_reco_TM": {"20161": "20161-2", "20162": "20161-2", "2017": "2017-8", "2018": "2017-8"}, "disp_trig_uncerts": {"20161": "2016", "20162": "2016APV", "2017": "2017", "2018": "2018"}, } + +fac_scale_VH_csv_path = _ntpaths["fac_scale_VH_csv"] diff --git a/MFVNeutralino/test/ForLimits/nuisance_configs_and_functions.py b/MFVNeutralino/test/ForLimits/nuisance_configs_and_functions.py index 8e002d370..cce91fdbb 100644 --- a/MFVNeutralino/test/ForLimits/nuisance_configs_and_functions.py +++ b/MFVNeutralino/test/ForLimits/nuisance_configs_and_functions.py @@ -1,4 +1,5 @@ from __future__ import print_function +import csv as _csv import numpy as np import helper_PyStorage_objects as sth @@ -175,6 +176,109 @@ def get_calo_inef(nuis_name, siginfo, debug_mode=False): sep_yrs=True, corr=True, nbins=siginfo.nbins, ana_spec=True)] +def get_qcd_scale_ren_ggH(nuis_name, siginfo, debug_mode=False): + """QCD renormalization scale theory uncertainty for ggH (2%, year- and bin-correlated).""" + return [sth.NuisanceInfo(nuis_name, 1.02, make_updn=False, sep_yrs=False, corr=True, + nbins=siginfo.nbins, ana_spec=False, add_era_tags=False)] + + +def _load_fac_scale_VH_table(csv_path): + """Parse fac_scale_shape_bins.csv into yield-weighted VH kappas. + + Returns {(mass_gev, ctau_um, year): ([kup_b0..b3], [kdn_b0..b3])}. + ggZH -> 1.0 (negligible fac-scale dep.). + Low-stats bins (flags_bin{i}='low_bin') -> kappa=1.0, weight=0. + """ + NBINS_CSV = 4 + NBINS_ALL = 4 + + raw = {} + with open(csv_path) as f: + for r in _csv.DictReader(f): + key = (int(r['mass_gev']), int(r['ctau_um']), r['year']) + entry = {} + for b in range(NBINS_CSV): + if r['flags_bin%d' % b] == 'ok': + entry[b] = (float(r['kappa_up_bin%d' % b]), + float(r['kappa_dn_bin%d' % b]), + int(r['n_bin%d' % b])) + else: + entry[b] = (1.0, 1.0, 0) + raw.setdefault(key, {})[r['stype']] = entry + + table = {} + for key, stypes_d in raw.items(): + kup, kdn = [], [] + for b in range(NBINS_ALL): + if b >= NBINS_CSV: + kup.append(1.0) + kdn.append(1.0) + continue + total_n = sum_ku = sum_kd = 0.0 + for st in ('ZH', 'WplusH', 'WminusH'): + ku, kd, n = stypes_d.get(st, {}).get(b, (1.0, 1.0, 0)) + sum_ku += ku * n + sum_kd += kd * n + total_n += n + if total_n > 0: + kup.append(sum_ku / total_n) + kdn.append(sum_kd / total_n) + else: + kup.append(1.0) + kdn.append(1.0) + table[key] = (kup, kdn) + return table + + +_fac_scale_VH_table = None + + +def _get_fac_scale_VH_table(): + global _fac_scale_VH_table + if _fac_scale_VH_table is None: + _fac_scale_VH_table = _load_fac_scale_VH_table(ns_conf.fac_scale_VH_csv_path) + return _fac_scale_VH_table + + +def get_qcd_scale_fac_VH(nuis_name, siginfo, debug_mode=False): + """Factorization scale shape uncertainty for VH (ZH/WH+/WH-), year-correlated. + + Per-bin kappas from CSV; bin 3 and ggZH use kappa=1.0; low-stats bins use kappa=1.0. + Missing signal points fall back to kappa=1.0 (no systematic applied). + """ + table = _get_fac_scale_VH_table() + mass = siginfo.return_mass_as_int() + ctau = int(siginfo.return_lifetime_in_unit(unit="um")) + result = table.get((mass, ctau, year)) + + if result is None: + if debug_mode: + print("QCDscale_fac_VH: no entry for mass=%d ctau=%d year=%s; using 1.0" % ( + mass, ctau, year)) + kup = [1.0] * siginfo.nbins + kdn = [1.0] * siginfo.nbins + else: + kup = list(result[0])[:siginfo.nbins] + kdn = list(result[1])[:siginfo.nbins] + while len(kup) < siginfo.nbins: + kup.append(1.0) + kdn.append(1.0) + + if debug_mode: + print("QCDscale_fac_VH: mass=%d ctau=%d year=%s kup=%s kdn=%s" % ( + mass, ctau, year, kup, kdn)) + + up_nuis = sth.NuisanceInfo(nuis_name, kup, make_updn=False, sep_yrs=False, corr=True, + nuis_type="special", nbins=siginfo.nbins, + ana_spec=False, add_era_tags=False, + extra_info=["updn_pair", "up"]) + dn_nuis = sth.NuisanceInfo(nuis_name, kdn, make_updn=False, sep_yrs=False, corr=True, + nuis_type="special", nbins=siginfo.nbins, + ana_spec=False, add_era_tags=False, + extra_info=["updn_pair", "dn"]) + return [up_nuis, dn_nuis] + + # --------------------------------------------------------------------------- # Background nuisances # --------------------------------------------------------------------------- diff --git a/MFVNeutralino/test/ForLimits/script_configs.py b/MFVNeutralino/test/ForLimits/script_configs.py index 6ea310739..494d0a8cc 100644 --- a/MFVNeutralino/test/ForLimits/script_configs.py +++ b/MFVNeutralino/test/ForLimits/script_configs.py @@ -131,6 +131,7 @@ def _abs(rel): "up_prefix": _cfg["nuisance_tables"]["tk_reco_eff"]["up_prefix"], "dn_prefix": _cfg["nuisance_tables"]["tk_reco_eff"]["dn_prefix"], }, + "fac_scale_VH_csv": _cfg["nuisance_tables"]["fac_scale_VH_csv"], # absolute path } # -------------------------------------------------------------------------- diff --git a/MFVNeutralino/test/ForLimits/sig_and_bkg_configs.py b/MFVNeutralino/test/ForLimits/sig_and_bkg_configs.py index bc04b347a..9b7a1f1d9 100644 --- a/MFVNeutralino/test/ForLimits/sig_and_bkg_configs.py +++ b/MFVNeutralino/test/ForLimits/sig_and_bkg_configs.py @@ -36,10 +36,14 @@ n2v_uncs = None # sentinel; code must not use this until real values are filled +# CMS Run 2 luminosity uncertainty decomposition (CMS-LUM-17-003/4, CMS-LUM-18-002). +# Totals: 2016 1.2%, 2017 2.3%, 2018 2.5%. lumi_lit_corrs = { - "lumi_13TeV_1516_l": {"2016": 1.0118, "2017": None, "2018": None}, - "lumi_13TeV_151617_l": {"2016": 1.0004, "2017": 1.0055, "2018": None}, - "lumi_13TeV_15161718_l": {"2016": 1.0035, "2017": 1.0061, "2018": 1.0084}, + "lumi_13TeV_correlated": {"2016": 1.006, "2017": 1.009, "2018": 1.020 }, + "lumi_13TeV_1718": {"2016": None, "2017": 1.006, "2018": 1.002 }, + "lumi_2016": {"2016": 1.010, "2017": None, "2018": None }, + "lumi_2017": {"2016": None, "2017": 1.020, "2018": None }, + "lumi_2018": {"2016": None, "2017": None, "2018": 1.015 }, } From 7a63174c6e75276a5d944e9aba2fa5b4c86741fa Mon Sep 17 00:00:00 2001 From: Gianfranco de Castro Date: Thu, 18 Jun 2026 12:49:09 -0500 Subject: [PATCH 14/15] Extrapolate last bin of the PU unc in lep --- MFVNeutralino/test/ForLimits/nuisance_configs_and_functions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MFVNeutralino/test/ForLimits/nuisance_configs_and_functions.py b/MFVNeutralino/test/ForLimits/nuisance_configs_and_functions.py index cce91fdbb..8df4c0b2c 100644 --- a/MFVNeutralino/test/ForLimits/nuisance_configs_and_functions.py +++ b/MFVNeutralino/test/ForLimits/nuisance_configs_and_functions.py @@ -119,7 +119,7 @@ def get_vtx_reco_TM(nuis_name, siginfo, debug_mode=False): def get_pileup(nuis_name, siginfo, debug_mode=False): if siginfo.trig_type == "lep": - nuis = sth.NuisanceInfo(nuis_name, [1.03, 1.04, 1.06], make_updn=False, + nuis = sth.NuisanceInfo(nuis_name, [1.03, 1.04, 1.06, 1.06], make_updn=False, sep_yrs=False, corr=True, nbins=siginfo.nbins) elif siginfo.trig_type == "bjet": nuis = sth.NuisanceInfo(nuis_name, 1.03, make_updn=False, From 7c1312e357810b944e517df1048fc4aa246e47c8 Mon Sep 17 00:00:00 2001 From: Gianfranco de Castro Date: Thu, 18 Jun 2026 14:01:22 -0500 Subject: [PATCH 15/15] Fixed missing electron SF, fixed 5% track reco eff, fixed correlation of disp_trig nuisances --- all to match AN --- .../ForLimits/nuisance_configs_and_functions.py | 17 ++++++++++++----- MFVNeutralino/test/ForLimits/script_configs.py | 3 +++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/MFVNeutralino/test/ForLimits/nuisance_configs_and_functions.py b/MFVNeutralino/test/ForLimits/nuisance_configs_and_functions.py index 8df4c0b2c..eff42190e 100644 --- a/MFVNeutralino/test/ForLimits/nuisance_configs_and_functions.py +++ b/MFVNeutralino/test/ForLimits/nuisance_configs_and_functions.py @@ -73,12 +73,19 @@ def get_mc_stat(nuis_name, siginfo, debug_mode=False): def get_reco_effi(nuis_name, siginfo, debug_mode=False): """Track reconstruction efficiency uncertainty. - Currently only VH has a dedicated table; other processes fall back to 1.0 - (which is then filtered out by replace_all_ones in getNuisanceFromSig). + Bjet channel: flat 5% working placeholder per AN Sec. 6.2.1 (Table 39/40). + Lep channel: per-bin asymmetric values from dedicated VH scale factor tables. """ + if siginfo.trig_type == "bjet": + # AN working placeholder: flat 5% symmetric lnN for all bjet signals + if debug_mode: + print("tk_reco_eff: using flat 5% placeholder for bjet signal") + return [sth.NuisanceInfo(nuis_name, [1.05] * siginfo.nbins, make_updn=False, + sep_yrs=False, corr=True, nbins=siginfo.nbins, ana_spec=True)] + + # Lep channel: per-bin asymmetric values from VH scale factor tables pickle_locs = interp_pickle_triple(nuis_name) - # TODO: replace "VH" with siginfo.proc once tables exist for all processes up_ntab = sth.NuisanceTable(proc="VH", pickle_loc=pickle_locs[0]) up_arr = up_ntab.get_point_from_fn(siginfo.fn.replace(siginfo.proc, "VH")) if up_arr is None: @@ -161,9 +168,9 @@ def get_trig_JESR_btag(nuis_name, siginfo, debug_mode=False): if frac_unc is None: print("Warning: trig_JESR_btag value not found. Writing arbitrary value.") return [sth.NuisanceInfo(nuis_name + "_fake", 1 + 0.1, make_updn=False, - sep_yrs=False, corr=True, nbins=siginfo.nbins, ana_spec=True)] + sep_yrs=True, corr=True, nbins=siginfo.nbins, ana_spec=True)] return [sth.NuisanceInfo(nuis_name, 1 + frac_unc, make_updn=False, - sep_yrs=False, corr=True, nbins=siginfo.nbins, ana_spec=True)] + sep_yrs=True, corr=True, nbins=siginfo.nbins, ana_spec=True)] def get_calo_inef(nuis_name, siginfo, debug_mode=False): diff --git a/MFVNeutralino/test/ForLimits/script_configs.py b/MFVNeutralino/test/ForLimits/script_configs.py index 494d0a8cc..6a9c69065 100644 --- a/MFVNeutralino/test/ForLimits/script_configs.py +++ b/MFVNeutralino/test/ForLimits/script_configs.py @@ -52,7 +52,10 @@ def _abs(rel): ] # Processes with a hard-scatter lepton -- get lep_effi nuisance (VH, ttH; not SUSY). +# "VH" is the combined signal group (ZH+WH++WH-+ggZH); individual sub-process names +# are also listed for any cards generated outside the combined group path. lep_reco_effi_sigs = frozenset([ + "VH", "WminusHToSSTodddd", "WplusHToSSTodddd", "ZHToSSTodddd", "ggZHToSSTobbbb", "ggZHToSSTodddd", "ttHToLLPs_bbbb", "ttHToLLPs_dddd",