diff --git a/Root/HiggsWeightTool.cxx b/Root/HiggsWeightTool.cxx index ffedbdeae3de3d84eb368b49b9f10b084d007668..2541a6e3661aba2cc5f575e646ecd95e055fb185 100644 --- a/Root/HiggsWeightTool.cxx +++ b/Root/HiggsWeightTool.cxx @@ -201,7 +201,7 @@ namespace xAOD { updateWeights(hw.nominal,hw.ct14nlo,hw.ct14nlo_0118); updateWeights(hw.nominal,hw.qcd_wg1_mu,hw.qcd_wg1_res); updateWeights(hw.nominal,hw.qcd_wg1_mig01,hw.qcd_wg1_mig12); - updateWeights(hw.nominal,hw.qcd_wg1_pTH,hw.qcd_wg1_qm); + updateWeights(hw.nominal,hw.qcd_wg1_pTH,hw.qcd_wg1_qm_b,hw.qcd_wg1_qm_t); updateWeights(hw.nominal,hw.qcd_nnlops_nnlo,hw.qcd_nnlops_pow); updateWeights(hw.nominal,hw.qcd_stxs); } @@ -362,13 +362,23 @@ namespace xAOD { // High pT uncertainty static double y1_1 = 0.88, y2_1 = 1.16, x2_1 = 150; static double y1_ge2 = 0.88, y2_ge2 = 1.16, x2_ge2 = 225; - double pTH_unc = 1.0; - if (Njets>=2) pTH_unc = pTH>x2_ge2?y2_ge2:y1_ge2+(y2_ge2-y1_ge2)*pTH/x2_ge2; - else if (Njets==1) pTH_unc = pTH>x2_1?y2_1:y1_1+(y2_1-y1_1)*pTH/x2_1; - hw.qcd_wg1_pTH = pTH_unc*w_nom; + double pTH_uncSF = 1.0; + if (Njets==1) pTH_uncSF = linInter(pTH,0,y1_1,x2_1,y2_1); + else if (Njets>=2) pTH_uncSF = linInter(pTH,0,y1_ge2,x2_ge2,y2_ge2); + //pTH>x2_ge2?y2_ge2:y1_ge2+(y2_ge2-y1_ge2)*pTH/x2_ge2; + //else if (Njets==1) pTH_uncSF = pTH>x2_1?y2_1:y1_1+(y2_1-y1_1)*pTH/x2_1; + hw.qcd_wg1_pTH = pTH_uncSF*w_nom; + + double qmSF=1.0; + if (Njets==0) qmSF = linInter(pTH,6,0.92,24,1.05); + else if (Njets==1) qmSF = linInter(pTH,35,0.92,62.5,1.05); + else if (Njets>=2) qmSF = linInter(pTH,40,0.92,120,1.05); + hw.qcd_wg1_qm_b = w_nom * qmSF; + hw.qcd_wg1_qm_t = w_nom * linInter(pTH,160,1.0,500,1.37); // Quark-mass uncdertainty - TODO - hw.qcd_wg1_qm = w_nom; + //if (pTH>500) qm=1.5; else if (pTH>160) qm=1.0+0.5*(pTH-160)/340; + //hw.qcd_wg1_qm = w_nom; /********* * Tackmann STXS uncertainty scheme @@ -383,12 +393,13 @@ namespace xAOD { // This is followed by Dsig60, Dsig120 and Dsig200 // These are extracted from Powheg NNLOPS scale variations (using this tool!) // As the envelope of hw.qcd_nnlops, which gives (all x-sec below have Njets>=1): - // sig60 = 9.687 +/- 1.566 pb - // sig120 = 2.534 +/- 0.526 pb - // sig200 = 0.562 +/- 0.115 pb - static double sig0_60=8.458, sig60_200=9.125, sig120_200=1.972, - sig0_120=sig0_60+sig60_200-sig120_200, sig200_plus=0.562; - static double Dsig60_200=1.457, Dsig120_200=0.411, Dsig200_plus=0.115; + // sig(60,200) = 9.095 +/- 1.445 pb, BLPTW 10.9% + // sig(120,200) = 1.961 +/- 0.401 pb, BLPTW 13.1% + // sig(200,inf) = 0.582 +/- 0.121 pb, BLPTW 15.1% + static double sig0_60=8.719, sig60_200=9.095, sig120_200=1.961, + sig0_120=sig0_60+sig60_200-sig120_200, sig200_plus=0.582; // 0.121 (-) 0.151*0.582 + // static double Dsig60_200=1.457, Dsig120_200=0.411, Dsig200_plus=0.115; // with 40k events, and no BLPTW subraction + static double Dsig60_200=1.055, Dsig120_200=0.206, Dsig200_plus=0.0832; // with 2M evts, and subtraction double dsig60=0, dsig120=0, dsig200=0; if (Njets>=1) { if (pTH<60) dsig60=-Dsig60_200/sig0_60; // -17.2% @@ -397,7 +408,7 @@ namespace xAOD { if (pTH<120) dsig120 = -Dsig120_200/sig0_120; // -2.6% else if (pTH<200) dsig120 = Dsig120_200/sig120_200; // +20.8% - if (pTH>200) dsig200=Dsig200_plus/sig200_plus; // +20.5% + if (pTH>200) dsig200=Dsig200_plus/sig200_plus; // +14.3% } hw.qcd_stxs.push_back((1.0+dsig60)*w_nom); hw.qcd_stxs.push_back((1.0+dsig120)*w_nom); diff --git a/TruthWeightTools/HiggsWeightTool.h b/TruthWeightTools/HiggsWeightTool.h index 0cc9cf53d5b072b0f7fe27a239feec8764031e4e..0638f205f7aa48fc654685feeadd7ea3bac9facd 100644 --- a/TruthWeightTools/HiggsWeightTool.h +++ b/TruthWeightTools/HiggsWeightTool.h @@ -35,7 +35,7 @@ namespace xAOD { /// WG1 proposed QCD uncertainty scheme double qcd_wg1_mu, qcd_wg1_res, qcd_wg1_mig01, qcd_wg1_mig12; - double qcd_wg1_pTH, qcd_wg1_qm; + double qcd_wg1_pTH, qcd_wg1_qm_b, qcd_wg1_qm_t; /// Tackmann proposed QCD uncertainty scheme, TODO std::vector<double> qcd_stxs; @@ -51,6 +51,8 @@ namespace xAOD { double pTH; int Njets30, STXS; + std::vector<double> qcd_wg1() { return {qcd_wg1_mu,qcd_wg1_res,qcd_wg1_mig01,qcd_wg1_mig12,qcd_wg1_pTH,qcd_wg1_qm_b,qcd_wg1_qm_t}; } + /// methods to print weights to the screen char *uncStr(double var, double nom) { return var==0?Form(" N/A"):Form("%s%.1f%%",var>=nom?"+":"",(var-nom)/nom*100); } void print() { @@ -84,8 +86,8 @@ namespace xAOD { printf("\n WG1 proposed QCD uncertainty scheme\n"); printf(" mu: %s, res: %s, mig01: %s, mig12: %s\n", uncStr(qcd_wg1_mu,n),uncStr(qcd_wg1_res,n),uncStr(qcd_wg1_mig01,n),uncStr(qcd_wg1_mig12,n)); - printf(" pTH: %s, quark-mass: %s\n", - uncStr(qcd_wg1_pTH,n),uncStr(qcd_wg1_qm,n)); + printf(" pTH: %s, quark-mass, b: %s, t: %s\n", + uncStr(qcd_wg1_pTH,n),uncStr(qcd_wg1_qm_b,n),uncStr(qcd_wg1_qm_b,n)); } if (qcd.size()) { @@ -151,6 +153,13 @@ namespace xAOD { private: + /// linear interpolation + double linInter(double x, double x1, double y1, double x2, double y2) { + if (x<x1) return y1; + if (x>x2) return y2; + return y1+(y2-y1)*(x-x1)/(x2-x1); + } + /// Access the HiggsWeights HiggsWeights getHiggsWeightsInternal(int HTXS_Njets30=-1, double HTXS_pTH=-99.0, int HTXS_cat=-1); diff --git a/util/HiggsWeightTest.cxx b/util/HiggsWeightTest.cxx index 090f1125971948334a09521717425689d22c6300..6523ef683614e65fa822a492e74a2e7f848d5b10 100644 --- a/util/HiggsWeightTest.cxx +++ b/util/HiggsWeightTest.cxx @@ -85,7 +85,7 @@ int main( int argc, char* argv[] ) { HistV h_pTH_qcd = makeHistos(8,"pTH_qcd",Nbins,min,max,ptTit); // Default Powheg QCD variations (NLO) HistV h_pTH_nnlops_qcd = makeHistos(26,"pTH_nnlops_qcd",Nbins,min,max,ptTit); // NNLOPS internal QCD vars HistV h_pTH_nnlops_qcd2 = makeHistos(2,"pTH_nnlo_qcd",Nbins,min,max,ptTit); // NNLO and Powheg vars for NNLOPS - HistV h_pTH_wg1qcd = makeHistos(6,"pTH_wg1qcd",Nbins,min,max,ptTit); // WG1 propsed scheme for ggF + HistV h_pTH_wg1qcd = makeHistos(7,"pTH_wg1qcd",Nbins,min,max,ptTit); // WG1 propsed scheme for ggF Nbins=10; min=-0.5; max=9.5; Str tit=";#it{N}_{jets}"; TH1F *h_Njets = new TH1F("Njets30",tit,Nbins,min,max); @@ -96,7 +96,7 @@ int main( int argc, char* argv[] ) { HistV h_Njets_qcd = makeHistos(8,"Njets30_qcd",Nbins,min,max,tit); // Default Powheg QCD variations (NLO) HistV h_Njets_nnlops_qcd = makeHistos(26,"Njets30_nnlops_qcd",Nbins,min,max,tit); // NNLOPS internal QCD vars HistV h_Njets_nnlops_qcd2 = makeHistos(2,"Njets30_nnlo_qcd",Nbins,min,max,tit); // NNLO and Powheg vars for NNLOPS - HistV h_Njets_wg1qcd = makeHistos(6,"Njets30_wg1qcd",Nbins,min,max,tit); // WG1 propsed scheme for ggF + HistV h_Njets_wg1qcd = makeHistos(7,"Njets30_wg1qcd",Nbins,min,max,tit); // WG1 propsed scheme for ggF Nbins=52; min=1; max=53; tit=";STXS fine index"; TH1F *h_STXS = new TH1F("STXS",tit,Nbins,min,max); @@ -107,7 +107,7 @@ int main( int argc, char* argv[] ) { HistV h_STXS_qcd = makeHistos(8,"STXS_qcd",Nbins,min,max,tit); // Default Powheg QCD variations (NLO) HistV h_STXS_nnlops_qcd = makeHistos(26,"STXS_nnlops_qcd",Nbins,min,max,tit); // NNLOPS internal QCD vars HistV h_STXS_nnlops_qcd2 = makeHistos(2,"STXS_nnlo_qcd",Nbins,min,max,tit); // NNLO and Powheg vars for NNLOPS - HistV h_STXS_wg1qcd = makeHistos(6,"STXS_wg1qcd",Nbins,min,max,tit); // WG1 propsed scheme for ggF + HistV h_STXS_wg1qcd = makeHistos(7,"STXS_wg1qcd",Nbins,min,max,tit); // WG1 propsed scheme for ggF Nbins=80; min=-4; max=4; tit=";#it{y_{H}}"; TH1F *h_yH = new TH1F("yH",tit,Nbins,min,max); @@ -118,7 +118,7 @@ int main( int argc, char* argv[] ) { HistV h_yH_qcd = makeHistos(8,"yH_qcd",Nbins,min,max,tit); // Default Powheg QCD variations (NLO) HistV h_yH_nnlops_qcd = makeHistos(26,"yH_nnlops_qcd",Nbins,min,max,tit); // NNLOPS internal QCD vars HistV h_yH_nnlops_qcd2 = makeHistos(2,"yH_nnlo_qcd",Nbins,min,max,tit); // NNLO and Powheg vars for NNLOPS - HistV h_yH_wg1qcd = makeHistos(6,"yH_wg1qcd",Nbins,min,max,tit); // WG1 propsed scheme for ggF + HistV h_yH_wg1qcd = makeHistos(7,"yH_wg1qcd",Nbins,min,max,tit); // WG1 propsed scheme for ggF HistV h_yH_other = makeHistos(8,"yH_other",Nbins,min,max,tit); // WG1 propsed scheme for ggF // Initialise the application: @@ -258,7 +258,8 @@ int main( int argc, char* argv[] ) { fillHistos(h_STXS_nnlops_qcd2,HTXS_index,nnlops_2np_qcd); // 3.d WG1 propsed uncertainty scheme. Recommended. - NumV wg1_qcd={hw.qcd_wg1_mu,hw.qcd_wg1_res,hw.qcd_wg1_mig01,hw.qcd_wg1_mig12,hw.qcd_wg1_pTH,hw.qcd_wg1_qm}; + //NumV wg1_qcd={hw.qcd_wg1_mu,hw.qcd_wg1_res,hw.qcd_wg1_mig01,hw.qcd_wg1_mig12,hw.qcd_wg1_pTH,hw.qcd_wg1_qm}; + NumV wg1_qcd=hw.qcd_wg1(); fillHistos(h_pTH_wg1qcd,h.Pt(),wg1_qcd); fillHistos(h_yH_wg1qcd,h.Rapidity(),wg1_qcd); fillHistos(h_Njets_wg1qcd,HTXS_Njets30,wg1_qcd);