def create_samples(self): print "total samples:",len(sample_names) for index in range(len(sample_names)): sample_name = sample_names[index] sample = Sample(sample_name, sample_colors[index]) file_name = input_dir+sample_name+"_combined.root" yields_dic = self.read_hist(file_name) print "Sample:", sample_name+";", if "data" in sample_name: sample.setData() self.data_sample = sample for region in regions: nevts, nerror = yields_dic[region] sample.buildHisto([nevts], region, "cuts", 0.5) print region,str(round(nevts,3))+";", print continue sample.setNormByTheory() for region in regions: nevts, nerror = yields_dic[region] nevts *= weight nerror *= weight if "Dijets" in sample_name and "SR" in region: if self.cut == 10: nevts = 4.07 nerror = math.sqrt(nevts) if self.cut == 14: nevts = 2.42 nerror = math.sqrt(nevts) sample.buildHisto([nevts], region, "cuts", 0.5) sample.buildStatErrors([nerror], region, "cuts") print region,str(round(nevts,3))+";", print #sample.setStatConfig(True) sample.setFileList([in_file_path]) ## add systematic?? sample.addSystematic(Systematic(sample_name+"_stats",\ configMgr.weights, 1.2, 0.8, "user", "userOverallSys")) #for systematic in self.sys_common: #sample.addSystematic(systematic) self.set_norm_factor(sample)
configMgr.analysisName = "MyUserAnalysis_ShapeFactor" configMgr.outputFileName = "results/%s_Output.root"%configMgr.analysisName # Define cuts configMgr.cutsDict["CR"] = "1." configMgr.cutsDict["SR"] = "1." # Define weights configMgr.weights = "1." # Define samples bkgSample = Sample("Bkg",kGreen-9) bkgSample.setNormByTheory(True) bkgSample.buildHisto(nBkgCR,"CR","cuts",0.5) bkgSample.buildHisto(nBkgSR,"SR","cuts",0.5) bkgSample.addSystematic(bg1xsec) ddSample = Sample("DataDriven",kGreen+2) ddSample.addShapeFactor("DDShape") sigSample = Sample("Sig",kPink) sigSample.setNormFactor("mu_Sig",1.,0.2,1.5) sigSample.buildHisto(nSigSR,"SR","cuts",0.5) sigSample.setNormByTheory(True) sigSample.addSystematic(sigxsec) dataSample = Sample("Data",kBlack) dataSample.setData() dataSample.buildHisto(nDataCR,"CR","cuts",0.5) dataSample.buildHisto(nDataSR,"SR","cuts",0.5)
# Give the analysis a name configMgr.analysisName = "PhotonMetAnalysis_Simple" configMgr.outputFileName = "results/%s_Output.root" % configMgr.analysisName # Define cuts configMgr.cutsDict["SR"] = "1." # Define weights configMgr.weights = "1." # Define samples bkgSample = Sample("Bkg", ROOT.kGreen - 9) bkgSample.setStatConfig(True) bkgSample.buildHisto([nbkg], "SR", "cuts", 0.5) bkgSample.addSystematic(ucb) sigSample = Sample("GGM_GG_bhmix_%d_%d" % (args.m3, args.mu), ROOT.kOrange + 3) sigSample.setNormFactor("mu_SIG", 1., 0., 10.) #sigSample.setStatConfig(True) sigSample.setNormByTheory() sigSample.buildHisto([nsig], "SR", "cuts", 0.5) dataSample = Sample("Data", ROOT.kBlack) dataSample.setData() dataSample.buildHisto([ndata], "SR", "cuts", 0.5) # Define top-level ana = configMgr.addFitConfig("Disc") ana.addSamples([bkgSample, sigSample, dataSample]) ana.setSignalSample(sigSample)
#diboson theoSysDiboson = Systematic("theoSysDiboson", configMgr.weights, 1.5, 0.5, "user", "userOverallSys") #photon systematics in SR for Z gammaToZSyst = Systematic("gammaToZSyst", configMgr.weights, 1.25, 0.75, "user", "userOverallSys") #------------------------------------------- # List of samples and their plotting colours #------------------------------------------- dibosonSample = Sample("Diboson", kRed + 3) dibosonSample.setTreeName("Diboson_SRAll") dibosonSample.setFileList(dibosonFiles) dibosonSample.setStatConfig(useStat) dibosonSample.addSystematic(theoSysDiboson) topSample = Sample("Top", kGreen - 9) topSample.setTreeName("Top_SRAll") topSample.setNormFactor("mu_Top", 1., 0., 500.) topSample.setFileList(topFiles) topSample.setStatConfig(useStat) qcdSample = Sample("MCMultijet", kOrange + 2) qcdSample.setTreeName("QCD_SRAll") qcdSample.setNormFactor("mu_MCMultijet", 1., 0., 500.) qcdSample.setFileList(qcdFiles) qcdSample.setStatConfig(useStat) wSample = Sample("W", kAzure + 1) wSample.setTreeName("W_SRAll")
phoScaleEldiboson = Systematic("phoScale",configMgr.weights, 1.029, 1-.029, "user","userOverallSys") phoScaleElZgamma = Systematic("phoScale",configMgr.weights, 1.025, 1-.025, "user","userOverallSys") phoScaleMuWgamma = Systematic("phoScale",configMgr.weights, 1.018, 1-.018, "user","userOverallSys") phoScaleMuttgamma = Systematic("phoScale",configMgr.weights, 1.015,1-.015, "user","userOverallSys") phoScaleMuttbarDilep = Systematic("phoScale",configMgr.weights, 1.028, 1-.028, "user","userOverallSys") phoScaleMust = Systematic("phoScale",configMgr.weights, 1.023, 1-.023, "user","userOverallSys") phoScaleMudiboson = Systematic("phoScale",configMgr.weights, 1.040, 1-.040, "user","userOverallSys") phoScaleMuZgamma = Systematic("phoScale",configMgr.weights, 1.025, 1-.025, "user","userOverallSys") ## List of samples and their plotting colours. Associate dedicated systematics if applicable. ttbargamma = Sample("ttbargamma",46) # brick ttbargamma.setNormByTheory() ttbargamma.setStatConfig(True) ttbargamma.addSystematic(ttbargammaNorm) Wgamma = Sample("Wgamma",7) # cyan Wgamma.setNormByTheory() Wgamma.setStatConfig(True) Wgamma.addSystematic(WgammaNorm) Zgamma = Sample("Zgamma",7) # cyan Zgamma.setNormByTheory() Zgamma.setStatConfig(True) Zgamma.addSystematic(ZgammaNorm) Zleplep = Sample("Zleplep",7) # cyan Zleplep.setNormByTheory() Zleplep.setStatConfig(True) Zleplep.addSystematic(ZjetsNorm)
useStat = False # If using stat set some limits tlx.statErrThreshold = 0.001 # define quantities to make configuration below easier SR = userOpts.signalRegion lepChan = userOpts.leptonChannel if userOpts.do2L : # ----------------------------------------------------- # # Zjets # # ----------------------------------------------------- # zjetsSample.setStatConfig(useStat) if userOpts.splitMCSys : zjetsSample.addSystematic(sysObj.AR_mcstat_ZX) zjetsSample.setNormByTheory() zjetsSample = addSys(zjetsSample, False, sysObj) # ----------------------------------------------------- # # Higgs # # ----------------------------------------------------- # higgsSample.setStatConfig(useStat) if userOpts.splitMCSys : higgsSample.addSystematic(sysObj.AR_mcstat_H) higgsSample.setNormByTheory() higgsSample = addSys(higgsSample, False, sysObj) # ----------------------------------------------------- # # ZV # # ----------------------------------------------------- #
sample_data = Sample("data", ROOT.kBlack) sample_data.setData() sample_sig = Sample("sig", ROOT.kRed) sample_sig.setStatConfig(True) all_samples = [sample_bkg0, sample_bkg1, sample_bkg2, sample_data] # systematics norm_syst_bkg1 = Systematic("Norm_Bkg1_0", configMgr.weights, 1.0 + 0.1, 1.0 - 0.1, "user", "userHistoSys") norm_syst2_bkg1 = Systematic("Norm_Bkg1_1", configMgr.weights, 1.0 + 0.1, 1.0 - 0.1, "user", "userHistoSys") norm_syst_bkg2 = Systematic("Norm_Bkg2", configMgr.weights, 1.0 + 0.10, 1.0 - 0.10, "user", "userHistoSys") sample_bkg1.addSystematic(norm_syst_bkg1) sample_bkg1.addSystematic(norm_syst2_bkg1) sample_bkg2.addSystematic(norm_syst_bkg2) #sample_bkg0.addSystematic(norm_syst_bkg0) #cb1a = Systematic("Norm_Bkg1_A", configMgr.weights, 1.0 + 0.80, 1.0 - 0.80, "user", "userHistoSys") #cb1b = Systematic("Norm_Bkg1_B", configMgr.weights, 1.0 + 0.1, 1.0 - 0.1, "user", "userHistoSys") #cb1c = Systematic("Norm_Bkg1_C", configMgr.weights, 1.0 + 0.1, 1.0 - 0.1, "user", "userHistoSys") #cb1d = Systematic("Norm_Bkg1_D", configMgr.weights, 1.0 + 0.1, 1.0 - 0.1, "user", "userHistoSys") #sample_bkg1.addSystematic(cb1a) #sample_bkg1.addSystematic(cb1b) #sample_bkg1.addSystematic(cb1c) #sample_bkg1.addSystematic(cb1d) def sample_by_name(name):
topXSample.setFileList(topXFiles) higgsSample.setFileList(higgsFiles) qFlipSample.setFileList(dataFiles) fLepSample.setFileList(dataFiles) dataSample.setFileList(dataFiles) for aSample in [ wgammaSample, dibosonSample, tribosonSample, topXSample, higgsSample ]: aSample.setNormByTheory(True) aSample.setStatConfig(True) for aSys in reconSys: aSample.addSystematic(aSys) qFlipSample.addSystematic(qFlipSys) qFlipWeights = ("ElSF", "MuSF", "BtagSF", "weight", "pwt", "qFwt", dataDrivenBkgScale) qFlipSample.setWeights(qFlipWeights) #overrides configMgr.weights qFlipSample.setNormByTheory(False) qFlipSample.setStatConfig(True) fLepSample.addSystematic(fLepSys) fLepWeights = ("ElSF", "MuSF", "BtagSF", "weight", "pwt", "fLwt", dataDrivenBkgScale) fLepSample.setWeights(fLepWeights) #overrides configMgr.weights fLepSample.setNormByTheory(False) fLepSample.setStatConfig(True) dataWeights = ("((%s)&&(%s))" % (ssUtil.sigLepCut, ssUtil.ssCut), dataDrivenBkgScale)
# Give the analysis a name configMgr.analysisName = "MyUserAnalysis" configMgr.outputFileName = "results/%s_Output.root" % configMgr.analysisName # Define cuts configMgr.cutsDict["UserRegion"] = "1." # Define weights configMgr.weights = "1." # Define samples bkgSample = Sample("Bkg", kGreen - 9) bkgSample.setStatConfig(True) bkgSample.buildHisto([nbkg], "UserRegion", "cuts", 0.5) bkgSample.buildStatErrors([nbkgErr], "UserRegion", "cuts") bkgSample.addSystematic(corb) bkgSample.addSystematic(ucb) sigSample = Sample("Sig", kPink) sigSample.setNormFactor("mu_Sig", 1., 0., 100.) sigSample.setStatConfig(True) sigSample.setNormByTheory() sigSample.buildHisto([nsig], "UserRegion", "cuts", 0.5) sigSample.buildStatErrors([nsigErr], "UserRegion", "cuts") sigSample.addSystematic(cors) sigSample.addSystematic(ucs) dataSample = Sample("Data", kBlack) dataSample.setData() dataSample.buildHisto([ndata], "UserRegion", "cuts", 0.5)
#------------------------------------------- # Diboson dibosonSample = Sample("Diboson", kRed+3) dibosonSample.setTreeName("Diboson_SRAll") dibosonSample.setFileList(dibosonFiles) dibosonSample.setStatConfig(useStat) # Top topSample = Sample("ttbar", kGreen-9) topSample.setTreeName("Top_SRAll") topSample.setNormFactor("mu_Top", 1., 0., 500.) topSample.setFileList(topFiles) topSample.setStatConfig(useStat) if useTheoSys: topSample.addSystematic(theoSysTop) if useSyst : topSample.addSystematic(pileup) topSample.addSystematic(jes) topSample.addSystematic(jer) topSample.addSystematic(scalest) topSample.addSystematic(resost) if useSyst and useCRWTY: #topSample.setNormRegions([("CRT","cuts"),("CRW","cuts")]) topSample.setNormRegions([("CRT", binVar)]) # QCD qcdSample = Sample("Multijets", kOrange+2) qcdSample.setTreeName("QCDdd")
"userOverallSys") electron = Systematic("electron", configMgr.weights, 1.05, 0.95, "user", "userOverallSys") muon = Systematic("muon", configMgr.weights, 1.05, 0.95, "user", "userOverallSys") metMu = Systematic("metMu", configMgr.weights, 1.1, 0.9, "user", "userOverallSys") metEl = Systematic("metEl", configMgr.weights, 1.1, 0.9, "user", "userOverallSys") ## List of samples and their plotting colours. Associate dedicated systematics if applicable. ttbargamma = Sample("ttbargamma", 46) # brick ttbargamma.setNormByTheory() ttbargamma.setStatConfig(True) ttbargamma.addSystematic(ttbargammaNorm) Wgamma = Sample("Wgamma", 7) # cyan Wgamma.setNormByTheory() Wgamma.setStatConfig(True) Wgamma.addSystematic(WgammaNorm) Zgamma = Sample("Zgamma", 7) # cyan Zgamma.setNormByTheory() Zgamma.setStatConfig(True) Zgamma.addSystematic(ZgammaNorm) Zleplep = Sample("Zleplep", 7) # cyan Zleplep.setNormByTheory() Zleplep.setStatConfig(True) Zleplep.addSystematic(ZjetsNorm)
topSample = Sample(zlFitterConfig.topSampleName, kGreen-9) topSample.setTreeName("Top_SRAll") topSample.setNormFactor("mu_"+zlFitterConfig.topSampleName, 1., 0., 500.) topSample.setFileList(topFiles) topSample.setStatConfig(zlFitterConfig.useStat) if zlFitterConfig.doSetNormRegion: if "CRT" in zlFitterConfig.constrainingRegionsList and "CRW" in zlFitterConfig.constrainingRegionsList: topSample.setNormRegions([("CRT", zlFitterConfig.binVar),("CRW", zlFitterConfig.binVar)]) if "CRTZL" in zlFitterConfig.constrainingRegionsList and "CRW" in zlFitterConfig.constrainingRegionsList: topSample.setNormRegions([("CRTZL", zlFitterConfig.binVar),("CRW", zlFitterConfig.binVar)]) #### LL # if "CRT0L" in zlFitterConfig.constrainingRegionsList: # topSample.setNormRegions( [ ("CRT0L",zlFitterConfig.binVar) ] ) if not zlFitterConfig.usePreComputedTopGeneratorSys: topSample.addSystematic(Systematic("generatorTop",configMgr.weights , "_aMcAtNloHerwigpp", "_aMcAtNloHerwigpp", "tree", "overallNormHistoSysOneSideSym")) if not zlFitterConfig.usePreComputedTopFragmentationSys: topSample.addSystematic(Systematic("fragmentationTop",configMgr.weights , "_PowhegHerwigpp", "_PowhegHerwigpp", "tree", "overallNormHistoSysOneSideSym")) #-------------------------- # W #-------------------------- wSample = Sample(zlFitterConfig.wSampleName, kAzure+1) wSample.setTreeName("W_SRAll") wSample.setNormFactor("mu_"+zlFitterConfig.wSampleName, 1., 0., 500.) wSample.setFileList(wFiles) wSample.setStatConfig(zlFitterConfig.useStat) if not zlFitterConfig.usePreComputedWGeneratorSys:
phoScaleEldiboson = Systematic("phoScale",configMgr.weights, 1.029, 1-.029, "user","userOverallSys") phoScaleElZgamma = Systematic("phoScale",configMgr.weights, 1.025, 1-.025, "user","userOverallSys") # phoScaleMuWgamma = Systematic("phoScale",configMgr.weights, 1.018, 1-.018, "user","userOverallSys") # phoScaleMuttgamma = Systematic("phoScale",configMgr.weights, 1.015,1-.015, "user","userOverallSys") # phoScaleMuttbarDilep = Systematic("phoScale",configMgr.weights, 1.028, 1-.028, "user","userOverallSys") # phoScaleMust = Systematic("phoScale",configMgr.weights, 1.023, 1-.023, "user","userOverallSys") # phoScaleMudiboson = Systematic("phoScale",configMgr.weights, 1.040, 1-.040, "user","userOverallSys") # phoScaleMuZgamma = Systematic("phoScale",configMgr.weights, 1.025, 1-.025, "user","userOverallSys") ## List of samples and their plotting colours. Associate dedicated systematics if applicable. ttbargamma = Sample("ttbargamma",46) # brick ttbargamma.setNormByTheory() ttbargamma.setStatConfig(True) ttbargamma.addSystematic(ttbargammaNorm) Wgamma = Sample("Wgamma",7) # cyan Wgamma.setNormFactor("mu_Wgamma",1.,0.,5.) Wgamma.setNormRegions([("WCRhHTEl", "cuts")]) Wgamma.setStatConfig(True) #Wgamma.addSystematic(WgammaNorm) Zgamma = Sample("Zgamma",kViolet) # cyan Zgamma.setNormByTheory() Zgamma.setStatConfig(True) Zgamma.addSystematic(ZgammaNorm) Zjets = Sample("Zjets",kBlue) # cyan Zjets.setNormByTheory() Zjets.setStatConfig(True)
phoScaleEldiboson = Systematic("phoScale",configMgr.weights, 1.029, 1-.029, "user","userOverallSys") phoScaleElZgamma = Systematic("phoScale",configMgr.weights, 1.025, 1-.025, "user","userOverallSys") phoScaleMuWgamma = Systematic("phoScale",configMgr.weights, 1.018, 1-.018, "user","userOverallSys") phoScaleMuttgamma = Systematic("phoScale",configMgr.weights, 1.015,1-.015, "user","userOverallSys") phoScaleMuttbarDilep = Systematic("phoScale",configMgr.weights, 1.028, 1-.028, "user","userOverallSys") phoScaleMust = Systematic("phoScale",configMgr.weights, 1.023, 1-.023, "user","userOverallSys") phoScaleMudiboson = Systematic("phoScale",configMgr.weights, 1.040, 1-.040, "user","userOverallSys") phoScaleMuZgamma = Systematic("phoScale",configMgr.weights, 1.025, 1-.025, "user","userOverallSys") ## List of samples and their plotting colours. Associate dedicated systematics if applicable. ttbargamma = Sample("ttbargamma",46) # brick ttbargamma.setNormByTheory() ttbargamma.setStatConfig(True) ttbargamma.addSystematic(ttbargammaNorm) Wgamma = Sample("Wgamma",7) # cyan Wgamma.setNormByTheory() Wgamma.setStatConfig(True) Wgamma.addSystematic(WgammaNorm) Zgamma = Sample("Zgamma",kViolet) # cyan Zgamma.setNormByTheory() Zgamma.setStatConfig(True) Zgamma.addSystematic(ZgammaNorm) Zjets = Sample("Zjets",kBlue) # cyan Zjets.setNormByTheory() Zjets.setStatConfig(True) Zjets.addSystematic(ZjetsNorm)
useStat = False # This is added as systematics below # Add systematics here # Stat zjetsSample.setStatConfig(useStat) fakeSample.setStatConfig(useStat) higgsSample.setStatConfig(useStat) wwSample.setStatConfig(useStat) wzSample.setStatConfig(useStat) zzSample.setStatConfig(useStat) tribosonSample.setStatConfig(useStat) ttbarVSample.setStatConfig(useStat) if not useStat: zjetsSample.addSystematic(sysObj.AR_mcstat_Zjets) fakeSample.addSystematic(sysObj.AR_mcstat_fake) higgsSample.addSystematic(sysObj.AR_mcstat_Higgs) wwSample.addSystematic(sysObj.AR_mcstat_WW) wzSample.addSystematic(sysObj.AR_mcstat_WZ) zzSample.addSystematic(sysObj.AR_mcstat_ZZ) tribosonSample.addSystematic(sysObj.AR_mcstat_triboson) ttbarVSample.addSystematic(sysObj.AR_mcstat_ttbarV) else: tlx.statErrThreshold = 0.001 # Rest should be implemented here fakeSample.addSystematic(sysObj.AR_fake_eFr) fakeSample.addSystematic(sysObj.AR_fake_mFr) fakeSample.addSystematic(sysObj.AR_fake_eRe) fakeSample.addSystematic(sysObj.AR_fake_mRe)
sample_bkg0.setStatConfig(True) sample_bkg1 = Sample("bkg1", ROOT.kGreen) sample_bkg1.setStatConfig(True) sample_data = Sample("data", ROOT.kBlack) sample_data.setData() sample_sig = Sample("sig", ROOT.kRed) sample_sig.setStatConfig(True) all_samples = [sample_bkg0, sample_bkg1, sample_data] # systematics norm_syst_bkg0 = Systematic("Norm_Bkg0", configMgr.weights, 1.0 + 0.5, 1.0 - 0.5, "user", "userHistoSys") sample_bkg0.addSystematic(norm_syst_bkg0) cb1a = Systematic("Norm_Bkg1_A", configMgr.weights, 1.0 + 0.1, 1.0 - 0.1, "user", "userHistoSys") cb1b = Systematic("Norm_Bkg1_B", configMgr.weights, 1.0 + 0.1, 1.0 - 0.1, "user", "userHistoSys") cb1c = Systematic("Norm_Bkg1_C", configMgr.weights, 1.0 + 0.1, 1.0 - 0.1, "user", "userHistoSys") cb1d = Systematic("Norm_Bkg1_D", configMgr.weights, 1.0 + 0.1, 1.0 - 0.1, "user", "userHistoSys") sample_bkg1.addSystematic(cb1a) sample_bkg1.addSystematic(cb1b) #sample_bkg1.addSystematic(cb1c) #sample_bkg1.addSystematic(cb1d) def sample_by_name(name) : global all_samples for s in all_samples : if s.name.lower() == name.lower() : return s
#diboson theoSysDiboson = Systematic("theoSysDiboson", configMgr.weights, 1.5,0.5, "user","userOverallSys") #photon systematics in SR for Z gammaToZSyst = Systematic("gammaToZSyst", configMgr.weights, 1.25,0.75, "user","userOverallSys") #------------------------------------------- # List of samples and their plotting colours #------------------------------------------- dibosonSample = Sample("Diboson",kRed+3) dibosonSample.setTreeName("Diboson_SRAll") dibosonSample.setFileList(dibosonFiles) dibosonSample.setStatConfig(useStat) dibosonSample.addSystematic(theoSysDiboson) topSample = Sample("Top",kGreen-9) topSample.setTreeName("Top_SRAll") topSample.setNormFactor("mu_Top",1.,0.,50000.) topSample.setFileList(topFiles) topSample.setStatConfig(useStat) qcdSample = Sample("MCMultijet",kOrange+2) qcdSample.setTreeName("QCD_SRAll") qcdSample.setNormFactor("mu_MCMultijet",1.,0.,500.) qcdSample.setFileList(qcdFiles) qcdSample.setStatConfig(useStat) wSample = Sample("W",kAzure+1) wSample.setTreeName("W_SRAll")
def common_setting(mass): from configManager import configMgr from ROOT import kBlack, kGray, kRed, kPink, kViolet, kBlue, kAzure, kGreen, \ kOrange from configWriter import Sample from systematic import Systematic import os color_dict = { "Zbb": kAzure, "Zbc": kAzure, "Zbl": kAzure, "Zcc": kAzure, "Zcl": kBlue, "Zl": kBlue, "Wbb": kGreen, "Wbc": kGreen, "Wbl": kGreen, "Wcc": kGreen, "Wcl": kGreen, "Wl": kGreen, "ttbar": kOrange, "stop": kOrange, "stopWt": kOrange, "ZZPw": kGray, "WZPw": kGray, "WWPw": kGray, "fakes": kPink, "Zjets": kAzure, "Wjets": kGreen, "top": kOrange, "diboson": kGray, "$Z\\tau\\tau$+HF": kAzure, "$Z\\tau\\tau$+LF": kBlue, "$W$+jets": kGreen, "$Zee$": kViolet, "Zhf": kAzure, "Zlf": kBlue, "Zee": kViolet, "others": kViolet, signal_prefix + "1000": kRed, signal_prefix + "1100": kRed, signal_prefix + "1200": kRed, signal_prefix + "1400": kRed, signal_prefix + "1600": kRed, signal_prefix + "1800": kRed, signal_prefix + "2000": kRed, signal_prefix + "2500": kRed, signal_prefix + "3000": kRed, # Add your new processes here "VH": kGray + 2, "VHtautau": kGray + 2, "ttH": kGray + 2, } ########################## # Setting the parameters of the hypothesis test configMgr.doExclusion = True # True=exclusion, False=discovery configMgr.nTOYs = 10000 # default=5000 configMgr.calculatorType = 0 # 2=asymptotic calculator, 0=frequentist calculator configMgr.testStatType = 3 # 3=one-sided profile likelihood test statistic (LHC default) configMgr.nPoints = 30 # number of values scanned of signal-strength for upper-limit determination of signal strength. configMgr.writeXML = False configMgr.seed = 40 configMgr.toySeedSet = True configMgr.toySeed = 400 # Pruning # - any overallSys systematic uncertainty if the difference of between the up variation and the nominal and between # the down variation and the nominal is below a certain (user) given threshold # - for histoSys types, the situation is more complex: # - a first check is done if the integral of the up histogram - the integral of the nominal histogram is smaller # than the integral of the nominal histogram and the same for the down histogram # - then a second check is done if the shape of the up, down and nominal histograms is very similar Only when both # conditions are fulfilled the systematics will be removed. # default is False, so the pruning is normally not enabled configMgr.prun = True # The threshold to decide if an uncertainty is small or not is set by configMgr.prunThreshold = 0.005 # where the number gives the fraction of deviation with respect to the nominal histogram below which an uncertainty # is considered to be small. The default is currently set to 0.01, corresponding to 1 % (This might be very aggressive # for the one or the other analyses!) configMgr.prunThreshold = 0.005 # method 1: a chi2 test (this is still a bit experimental, so watch out if this is working or not) # method 2: checking for every bin of the histograms that the difference between up variation and nominal and down (default) configMgr.prunMethod = 2 # variation and nominal is below a certain threshold. # Smoothing: HistFitter does not provide any smoothing tools. # More Details: https://twiki.cern.ch/twiki/bin/viewauth/AtlasProtected/HistFitterAdvancedTutorial#Pruning_in_HistFitter ########################## # Keep SRs also in background fit confuguration configMgr.keepSignalRegionType = True configMgr.blindSR = BLIND # Give the analysis a name configMgr.analysisName = "bbtautau" + "X" + mass configMgr.histCacheFile = "data/" + configMgr.analysisName + ".root" configMgr.outputFileName = "results/" + configMgr.analysisName + "_Output.root" # Define cuts configMgr.cutsDict["SR"] = "1." # Define weights configMgr.weights = "1." # Define samples list_samples = [] yields_mass = yields[mass] for process, yields_process in yields_mass.items(): if process == 'data' or signal_prefix in process: continue # print("-> {} / Colour: {}".format(process, color_dict[process])) bkg = Sample(str(process), color_dict[process]) bkg.setStatConfig(stat_config) # OLD: add lumi uncertainty (bkg/sig correlated, not for data-driven fakes) # NOW: add lumi by hand bkg.setNormByTheory(False) noms = yields_process["nEvents"] errors = yields_process["nEventsErr"] if use_mcstat else [0.0] # print(" nEvents (StatError): {} ({})".format(noms, errors)) bkg.buildHisto(noms, "SR", my_disc, 0.5) bkg.buildStatErrors(errors, "SR", my_disc) if not stat_only and not no_syst: if process == 'fakes': key_here = "ATLAS_FF_1BTAG_SIDEBAND_Syst_hadhad" if not impact_check_continue(dict_syst_check, key_here): bkg.addSystematic( Systematic(key_here, configMgr.weights, 1.50, 0.50, "user", syst_type)) else: key_here = "ATLAS_Lumi_Run2_hadhad" if not impact_check_continue(dict_syst_check, key_here): bkg.addSystematic( Systematic(key_here, configMgr.weights, 1.017, 0.983, "user", syst_type)) for key, values in yields_process.items(): if 'ATLAS' not in key: continue if impact_check_continue(dict_syst_check, key): continue # this should not be applied on the Sherpa if process == 'Zhf' and key == 'ATLAS_DiTauSF_ZMODEL_hadhad': continue if process == 'Zlf' and key == 'ATLAS_DiTauSF_ZMODEL_hadhad': continue ups = values[0] downs = values[1] systUpRatio = [ u / n if n != 0. else float(1.) for u, n in zip(ups, noms) ] systDoRatio = [ d / n if n != 0. else float(1.) for d, n in zip(downs, noms) ] bkg.addSystematic( Systematic(str(key), configMgr.weights, systUpRatio, systDoRatio, "user", syst_type)) list_samples.append(bkg) # FIXME: This is unusual! top = Sample('top', kOrange) top.setStatConfig(False) # No stat error top.setNormByTheory(False) # consider lumi for it top.buildHisto([0.00001], "SR", my_disc, 0.5) # small enough # HistFitter can accept such large up ratio # Systematic(name, weight, ratio_up, ratio_down, syst_type, syst_fistfactory_type) if not stat_only and not no_syst: key_here = 'ATLAS_TTBAR_YIELD_UPPER_hadhad' if not impact_check_continue(dict_syst_check, key_here): top.addSystematic( Systematic(key_here, configMgr.weights, unc_ttbar[mass], 0.9, "user", syst_type)) list_samples.append(top) sigSample = Sample("Sig", kRed) sigSample.setNormFactor("mu_Sig", 1., 0., 100.) #sigSample.setStatConfig(stat_config) sigSample.setStatConfig(False) sigSample.setNormByTheory(False) noms = yields_mass[signal_prefix + mass]["nEvents"] errors = yields_mass[signal_prefix + mass]["nEventsErr"] if use_mcstat else [0.0] sigSample.buildHisto([n * MY_SIGNAL_NORM * 1e-3 for n in noms], "SR", my_disc, 0.5) #sigSample.buildStatErrors(errors, "SR", my_disc) for key, values in yields_mass[signal_prefix + mass].items(): if 'ATLAS' not in key: continue if impact_check_continue(dict_syst_check, key): continue ups = values[0] downs = values[1] systUpRatio = [ u / n if n != 0. else float(1.) for u, n in zip(ups, noms) ] systDoRatio = [ d / n if n != 0. else float(1.) for d, n in zip(downs, noms) ] if not stat_only and not no_syst: sigSample.addSystematic( Systematic(str(key), configMgr.weights, systUpRatio, systDoRatio, "user", syst_type)) if not stat_only and not no_syst: key_here = "ATLAS_SigAccUnc_hadhad" if not impact_check_continue(dict_syst_check, key_here): sigSample.addSystematic( Systematic(key_here, configMgr.weights, [1 + unc_sig_acc[mass] for i in range(my_nbins)], [1 - unc_sig_acc[mass] for i in range(my_nbins)], "user", syst_type)) key_here = "ATLAS_Lumi_Run2_hadhad" if not impact_check_continue(dict_syst_check, key_here): sigSample.addSystematic( Systematic(key_here, configMgr.weights, 1.017, 0.983, "user", syst_type)) list_samples.append(sigSample) # Set observed and expected number of events in counting experiment n_SPlusB = yields_mass[signal_prefix + mass]["nEvents"][0] + sum_of_bkg(yields_mass)[0] n_BOnly = sum_of_bkg(yields_mass)[0] if BLIND: # configMgr.useAsimovSet = True # Use the Asimov dataset # configMgr.generateAsimovDataForObserved = True # Generate Asimov data as obsData for UL # configMgr.useSignalInBlindedData = False ndata = sum_of_bkg(yields_mass) else: try: ndata = yields_mass["data"]["nEvents"] except: ndata = [0. for _ in range(my_nbins)] lumiError = 0.017 # Relative luminosity uncertainty dataSample = Sample("Data", kBlack) dataSample.setData() dataSample.buildHisto(ndata, "SR", my_disc, 0.5) list_samples.append(dataSample) # Define top-level ana = configMgr.addFitConfig("SPlusB") ana.addSamples(list_samples) ana.setSignalSample(sigSample) # Define measurement meas = ana.addMeasurement(name="NormalMeasurement", lumi=1.0, lumiErr=lumiError / 100000.) # make it very small so that pruned # we use the one added by hand meas.addPOI("mu_Sig") #meas.statErrorType = "Poisson" # Fix the luminosity in HistFactory to constant meas.addParamSetting("Lumi", True, 1) # Add the channel chan = ana.addChannel(my_disc, ["SR"], my_nbins, my_xmin, my_xmax) chan.blind = BLIND #chan.statErrorType = "Poisson" ana.addSignalChannels([chan]) # These lines are needed for the user analysis to run # Make sure file is re-made when executing HistFactory if configMgr.executeHistFactory: if os.path.isfile("data/%s.root" % configMgr.analysisName): os.remove("data/%s.root" % configMgr.analysisName)
# Give the analysis a name configMgr.analysisName = "MyUserAnalysis" configMgr.outputFileName = "results/%s_Output.root"%configMgr.analysisName # Define cuts configMgr.cutsDict["UserRegion"] = "1." # Define weights configMgr.weights = "1." # Define samples bkgSample = Sample("Bkg",kGreen-9) bkgSample.setStatConfig(True) bkgSample.buildHisto([nbkg],"UserRegion","cuts",0.5) bkgSample.buildStatErrors([nbkgErr],"UserRegion","cuts") bkgSample.addSystematic(corb) bkgSample.addSystematic(ucb) sigSample = Sample("Sig",kPink) sigSample.setNormFactor("mu_Sig",1.,0.,100.) sigSample.setStatConfig(True) sigSample.setNormByTheory() sigSample.buildHisto([nsig],"UserRegion","cuts",0.5) sigSample.buildStatErrors([nsigErr],"UserRegion","cuts") sigSample.addSystematic(cors) sigSample.addSystematic(ucs) dataSample = Sample("Data",kBlack) dataSample.setData() dataSample.buildHisto([ndata],"UserRegion","cuts",0.5)
# Add Sample Specific Systematics (apparently it's needed to add these systs to the samples *BEFORE* adding them to the FitConfig if do_detector_syst: for gsyst in syst_to_all: for sample in bkg_samples: if sample.name.startswith('efake') or sample.name.startswith( 'jfake'): continue if sample.name == 'photonjet': continue sample.addSystematic(gsyst) if do_dd_syst: efake_sample.addSystematic(syst_feg) jfake_sample.addSystematic(syst_fjg) efake_sample.addSystematic(syst_stat_feg) jfake_sample.addSystematic(syst_stat_fjg) if do_mc_syst: photonjet_sample.addSystematic(syst_gamjet_theo_all) # if not do_detector_syst and not do_dd_syst and not do_mc_syst: # ucb = Systematic("uncorrl_bkg", None, 1+0.30, 1-0.30, "user", "userOverallSys") # 30% error up and down # for sample in bkg_samples: # sample.addSystematic(ucb) #--------- # Fit
## Discovery fit #discovery = configMgr.adFitConfigClone(bkgOnly,"SimpleChannel_Discovery") #discovery.clearSystematics() #sigSample = Sample("discoveryMode",kBlue) #sigSample.setNormFactor("mu_SIG",1.0, 0.0, 5.0) #sigSample.setNormByTheory() #discovery.addSamples(sigSample) #discovery.setSignalSample(sigSample) ## Exclusion fits (MSUGRA grid) #sigSamples=["SU_180_360_0_10","SU_580_240_0_10","SU_740_330_0_10","SU_900_420_0_10","SU_1300_210_0_10"] sigSamples = ["SU_680_310_0_10","SU_440_145_0_10","SU_200_160_0_10","SU_440_340_0_10","SU_440_100_0_10","SU_120_130_0_10","SU_600_280_0_10","SU_320_115_0_10","SU_360_175_0_10","SU_920_310_0_10","SU_280_205_0_10","SU_1080_340_0_10","SU_40_280_0_10","SU_760_160_0_10","SU_200_115_0_10","SU_280_280_0_10","SU_40_160_0_10","SU_520_280_0_10","SU_120_220_0_10","SU_680_220_0_10","SU_40_115_0_10","SU_920_190_0_10","SU_320_130_0_10","SU_440_280_0_10","SU_360_100_0_10","SU_120_160_0_10","SU_1080_190_0_10","SU_840_250_0_10","SU_120_100_0_10","SU_120_340_0_10","SU_840_280_0_10","SU_80_115_0_10","SU_840_130_0_10","SU_320_175_0_10","SU_120_205_0_10","SU_520_100_0_10","SU_400_130_0_10","SU_360_310_0_10","SU_160_115_0_10","SU_1000_310_0_10","SU_40_220_0_10","SU_440_130_0_10","SU_1000_190_0_10","SU_80_220_0_10","SU_840_160_0_10","SU_120_145_0_10","SU_440_175_0_10","SU_360_280_0_10","SU_320_145_0_10","SU_400_160_0_10","SU_1000_340_0_10","SU_600_310_0_10","SU_320_190_0_10","SU_840_310_0_10","SU_200_220_0_10","SU_440_205_0_10","SU_360_205_0_10","SU_120_280_0_10","SU_1080_130_0_10","SU_160_145_0_10","SU_520_250_0_10","SU_840_100_0_10","SU_160_220_0_10","SU_120_190_0_10","SU_40_205_0_10","SU_280_250_0_10","SU_80_145_0_10","SU_200_175_0_10","SU_840_190_0_10","SU_240_145_0_10","SU_160_205_0_10","SU_400_115_0_10","SU_440_250_0_10","SU_600_340_0_10","SU_80_100_0_10","SU_520_190_0_10","SU_1160_190_0_10","SU_80_130_0_10","SU_400_190_0_10","SU_400_175_0_10","SU_600_130_0_10","SU_1080_100_0_10","SU_200_340_0_10","SU_1160_310_0_10","SU_440_160_0_10","SU_240_220_0_10","SU_200_100_0_10","SU_240_130_0_10","SU_360_130_0_10","SU_1000_250_0_10","SU_920_130_0_10","SU_240_190_0_10","SU_520_340_0_10","SU_40_175_0_10","SU_240_100_0_10","SU_400_145_0_10","SU_40_145_0_10","SU_240_205_0_10","SU_1080_280_0_10","SU_600_250_0_10","SU_360_145_0_10","SU_520_130_0_10","SU_1000_130_0_10","SU_440_310_0_10","SU_600_160_0_10","SU_920_280_0_10","SU_760_280_0_10","SU_280_190_0_10","SU_280_175_0_10","SU_120_310_0_10","SU_440_220_0_10","SU_1000_220_0_10","SU_1160_250_0_10","SU_400_205_0_10","SU_160_160_0_10","SU_1000_280_0_10","SU_1000_160_0_10","SU_400_100_0_10","SU_760_190_0_10","SU_680_160_0_10","SU_840_220_0_10","SU_360_340_0_10","SU_1080_220_0_10","SU_360_250_0_10","SU_760_130_0_10","SU_440_115_0_10","SU_240_160_0_10","SU_200_310_0_10","SU_200_145_0_10","SU_600_220_0_10","SU_280_130_0_10","SU_520_220_0_10","SU_1080_160_0_10","SU_40_190_0_10","SU_1160_160_0_10","SU_280_310_0_10","SU_920_160_0_10","SU_80_190_0_10","SU_40_310_0_10","SU_1160_130_0_10","SU_40_250_0_10","SU_40_100_0_10","SU_400_220_0_10","SU_40_340_0_10","SU_1000_100_0_10","SU_120_175_0_10","SU_280_220_0_10","SU_760_340_0_10","SU_240_115_0_10","SU_440_190_0_10","SU_1160_340_0_10","SU_600_100_0_10","SU_200_250_0_10","SU_280_145_0_10","SU_200_190_0_10","SU_200_205_0_10","SU_760_250_0_10","SU_120_250_0_10","SU_80_175_0_10","SU_40_130_0_10","SU_920_250_0_10","SU_80_160_0_10","SU_240_175_0_10","SU_280_100_0_10","SU_1080_310_0_10","SU_920_340_0_10","SU_120_115_0_10","SU_1160_100_0_10","SU_280_340_0_10","SU_1160_220_0_10","SU_200_130_0_10","SU_160_175_0_10","SU_360_220_0_10"] #if not 'sigSamples' in dir(): # sigSamples=["SU_680_310_0_10"] for sig in sigSamples: myTopLvl = configMgr.addFitConfigClone(bkgOnly,"SimpleChannel_%s"%sig) #myTopLvl.removeSystematic(jes) sigSample = Sample(sig,kBlue) sigSample.setNormFactor("mu_SIG", 1.0, 0., 5.0) sigXSSyst = Systematic("SigXSec",configMgr.weights,1.1,0.9,"user","overallSys") sigSample.addSystematic(sigXSSyst) #sigSample.addSystematic(jesSig) sigSample.setNormByTheory() myTopLvl.addSamples(sigSample) myTopLvl.setSignalSample(sigSample) ch = myTopLvl.getChannel("cuts",cutsRegions) myTopLvl.addSignalChannels(ch)
sample_data = Sample("data", ROOT.kBlack) sample_data.setData() #sample_sig = Sample("sig", ROOT.kRed) #sample_sig.setStatConfig(True) all_samples = [sample_bkg0, sample_data] #, sample_bkg1, sample_bkg2, sample_data] # systematics syst_bkg0_cr = Systematic("SYST_BKG_CR", configMgr.weights, 1.0 + 0.10, 1.0 - 0.10, "user", "userHistoSys") syst_bkg0_sr = Systematic("SYST_BKG_SR", configMgr.weights, 1.0 + 0.05, 1.0 - 0.05, "user", "userHistoSys") sample_bkg0.addSystematic(syst_bkg0_sr) #norm_syst_bkg1 = Systematic("Norm_Bkg1_0", configMgr.weights, 1.0 + 0.1, 1.0 - 0.1, "user", "userHistoSys") #norm_syst2_bkg1 = Systematic("Norm_Bkg1_1", configMgr.weights, 1.0 + 0.1, 1.0 - 0.1, "user", "userHistoSys") #norm_syst_bkg2 = Systematic("Norm_Bkg2", configMgr.weights, 1.0 + 0.10, 1.0 - 0.10, "user", "userHistoSys") #sample_bkg1.addSystematic(norm_syst_bkg1) #sample_bkg1.addSystematic(norm_syst2_bkg1) #sample_bkg2.addSystematic(norm_syst_bkg2) def sample_by_name(name): global all_samples for s in all_samples: if s.name.lower() == name.lower(): return s print "sample_by_name failed"
bkgOnly.addSystematic(jes) meas = bkgOnly.addMeasurement(measName,measLumi,measLumiError) meas.addPOI("mu_SIG") cutsChannel = bkgOnly.addChannel("cuts",cutsRegions,cutsNBins,cutsBinLow,cutsBinHigh) ## Discovery fit #discovery = configMgr.addTopLevelXMLClone(bkgOnly,"SimpleChannel_Discovery") #discovery.clearSystematics() #sigSample = Sample("discoveryMode",kBlue) #sigSample.setNormFactor("mu_SIG",0.5,0.,1.) #sigSample.setNormByTheory() #discovery.addSamples(sigSample) #discovery.setSignalSample(sigSample) ## Exclusion fits (MSUGRA grid) #sigSamples=["SU_180_360_0_10","SU_580_240_0_10","SU_740_330_0_10","SU_900_420_0_10","SU_1300_210_0_10"] sigSamples = ["SU_680_310_0_10","SU_440_145_0_10","SU_200_160_0_10","SU_440_340_0_10","SU_440_100_0_10","SU_120_130_0_10","SU_600_280_0_10","SU_320_115_0_10","SU_360_175_0_10","SU_920_310_0_10","SU_280_205_0_10","SU_1080_340_0_10","SU_40_280_0_10","SU_760_160_0_10","SU_200_115_0_10","SU_280_280_0_10","SU_40_160_0_10","SU_520_280_0_10","SU_120_220_0_10","SU_680_220_0_10","SU_40_115_0_10","SU_920_190_0_10","SU_320_130_0_10","SU_440_280_0_10","SU_360_100_0_10","SU_120_160_0_10","SU_1080_190_0_10","SU_840_250_0_10","SU_120_100_0_10","SU_120_340_0_10","SU_840_280_0_10","SU_80_115_0_10","SU_840_130_0_10","SU_320_175_0_10","SU_120_205_0_10","SU_520_100_0_10","SU_400_130_0_10","SU_360_310_0_10","SU_160_115_0_10","SU_1000_310_0_10","SU_40_220_0_10","SU_440_130_0_10","SU_1000_190_0_10","SU_80_220_0_10","SU_840_160_0_10","SU_120_145_0_10","SU_440_175_0_10","SU_360_280_0_10","SU_320_145_0_10","SU_400_160_0_10","SU_1000_340_0_10","SU_600_310_0_10","SU_320_190_0_10","SU_840_310_0_10","SU_200_220_0_10","SU_440_205_0_10","SU_360_205_0_10","SU_120_280_0_10","SU_1080_130_0_10","SU_160_145_0_10","SU_520_250_0_10","SU_840_100_0_10","SU_160_220_0_10","SU_120_190_0_10","SU_40_205_0_10","SU_280_250_0_10","SU_80_145_0_10","SU_200_175_0_10","SU_840_190_0_10","SU_240_145_0_10","SU_160_205_0_10","SU_400_115_0_10","SU_440_250_0_10","SU_600_340_0_10","SU_80_100_0_10","SU_520_190_0_10","SU_1160_190_0_10","SU_80_130_0_10","SU_400_190_0_10","SU_400_175_0_10","SU_600_130_0_10","SU_1080_100_0_10","SU_200_340_0_10","SU_1160_310_0_10","SU_440_160_0_10","SU_240_220_0_10","SU_200_100_0_10","SU_240_130_0_10","SU_360_130_0_10","SU_1000_250_0_10","SU_920_130_0_10","SU_240_190_0_10","SU_520_340_0_10","SU_40_175_0_10","SU_240_100_0_10","SU_400_145_0_10","SU_40_145_0_10","SU_240_205_0_10","SU_1080_280_0_10","SU_600_250_0_10","SU_360_145_0_10","SU_520_130_0_10","SU_1000_130_0_10","SU_440_310_0_10","SU_600_160_0_10","SU_920_280_0_10","SU_760_280_0_10","SU_280_190_0_10","SU_280_175_0_10","SU_120_310_0_10","SU_440_220_0_10","SU_1000_220_0_10","SU_1160_250_0_10","SU_400_205_0_10","SU_160_160_0_10","SU_1000_280_0_10","SU_1000_160_0_10","SU_400_100_0_10","SU_760_190_0_10","SU_680_160_0_10","SU_840_220_0_10","SU_360_340_0_10","SU_1080_220_0_10","SU_360_250_0_10","SU_760_130_0_10","SU_440_115_0_10","SU_240_160_0_10","SU_200_310_0_10","SU_200_145_0_10","SU_600_220_0_10","SU_280_130_0_10","SU_520_220_0_10","SU_1080_160_0_10","SU_40_190_0_10","SU_1160_160_0_10","SU_280_310_0_10","SU_920_160_0_10","SU_80_190_0_10","SU_40_310_0_10","SU_1160_130_0_10","SU_40_250_0_10","SU_40_100_0_10","SU_400_220_0_10","SU_40_340_0_10","SU_1000_100_0_10","SU_120_175_0_10","SU_280_220_0_10","SU_760_340_0_10","SU_240_115_0_10","SU_440_190_0_10","SU_1160_340_0_10","SU_600_100_0_10","SU_200_250_0_10","SU_280_145_0_10","SU_200_190_0_10","SU_200_205_0_10","SU_760_250_0_10","SU_120_250_0_10","SU_80_175_0_10","SU_40_130_0_10","SU_920_250_0_10","SU_80_160_0_10","SU_240_175_0_10","SU_280_100_0_10","SU_1080_310_0_10","SU_920_340_0_10","SU_120_115_0_10","SU_1160_100_0_10","SU_280_340_0_10","SU_1160_220_0_10","SU_200_130_0_10","SU_160_175_0_10","SU_360_220_0_10"] for sig in sigSamples: myTopLvl = configMgr.addTopLevelXMLClone(bkgOnly,"SimpleChannel_%s"%sig) #myTopLvl.removeSystematic(jes) sigSample = Sample(sig,kBlue) sigSample.setNormFactor("mu_SIG",0.5,0.,1.) sigXSSyst = Systematic("SigXSec",None,None,None,"user","overallSys") sigSample.addSystematic(sigXSSyst) #sigSample.addSystematic(jesSig) sigSample.setNormByTheory() myTopLvl.addSamples(sigSample) myTopLvl.setSignalSample(sigSample)
# Top #-------------------------- topSample = Sample(zlFitterConfig.topSampleName, kGreen-9) topSample.setTreeName("Top_SRAll") topSample.setNormFactor("mu_"+zlFitterConfig.topSampleName, 1., 0., 500.) topSample.setFileList(topFiles) topSample.setStatConfig(zlFitterConfig.useStat) if zlFitterConfig.doSetNormRegion: if "CRT" in zlFitterConfig.constrainingRegionsList and "CRW" in zlFitterConfig.constrainingRegionsList: topSample.setNormRegions([("CRT", zlFitterConfig.binVar),("CRW", zlFitterConfig.binVar)]) if "CRTZL" in zlFitterConfig.constrainingRegionsList and "CRW" in zlFitterConfig.constrainingRegionsList: topSample.setNormRegions([("CRTZL", zlFitterConfig.binVar),("CRW", zlFitterConfig.binVar)]) if not zlFitterConfig.usePreComputedTopGeneratorSys: topSample.addSystematic(Systematic("generatorTop", "", "_aMcAtNloHerwigpp", "", "tree", "overallNormHistoSysOneSide")) if not zlFitterConfig.usePreComputedTopFragmentationSys: topSample.addSystematic(Systematic("Pythia8Top", "" , "_PowhegPythia8", "" , "tree", "overallNormHistoSysOneSide")) # topSample.addSystematic(Systematic("HerwigppTop", "", "_PowhegHerwigpp", "", "tree", "overallNormHistoSysOneSide")) if not zlFitterConfig.usePreComputedTopRadiationSys: topSample.addSystematic(Systematic("radiationTop", "", "_RadLo", "_RadHi", "tree", "overallNormHistoSys")) # topSample.addSystematic(Systematic("radiationTop", "", "_RadHi", "", "tree", "overallNormHistoSysOneSideSym")) #-------------------------- # W #-------------------------- wSample = Sample(zlFitterConfig.wSampleName, kAzure+1) wSample.setTreeName("W_SRAll")
matchScaleTFSysW = Systematic("matchScaleTFSys", configMgr.weights, 1.0+WMap['matchScaleWeightUp'][level][chn],1.0, "user","userOverallSys") mu1ScaleTFSysZ = Systematic("mu1ScaleTFSys", configMgr.weights, 1.0+ZMap['mu1ScaleWeightUp'][level][chn],1.0-ZMap['mu1ScaleWeightDown'][level][chn], "user","userOverallSys") mu2ScaleTFSysZ = Systematic("mu2ScaleTFSys", configMgr.weights, 1.0+ZMap['mu2ScaleWeightUp'][level][chn],1.0-ZMap['mu2ScaleWeightDown'][level][chn], "user","userOverallSys") sherpaTFSysTop = Systematic("sherpaTFSys", configMgr.weights, 1.0+TopMap['topSherpa'][level][chn],1.0-TopMap['topSherpa'][level][chn], "user","userOverallSys") #------------------------------------------- # List of samples and their plotting colours #------------------------------------------- dibosonSample = Sample("Diboson",kRed+3) dibosonSample.setTreeName("Diboson_SRAll") dibosonSample.setFileList(dibosonFiles) dibosonSample.setStatConfig(useStat) dibosonSample.addSystematic(theoSysDiboson) topSample = Sample("ttbar",kGreen-9) if useShape: topSample.addShapeFactor("topShape") topSample.setTreeName("Top_SRAll") topSample.setNormFactor("mu_Top",1.,0.,500.) topSample.setFileList(topFiles) topSample.setStatConfig(useStat) if useTheoSys: topSample.addSystematic(theoSysTop) ####topSample.addSystematic(mu1ScaleSysTop) ####topSample.addSystematic(mu2ScaleSysTop) ####topSample.addSystematic(matchScaleSysTop) topSample.setNormRegions([("CRT","meffInc"),("CRW","meffInc")])
configMgr.analysisName = "MyUserAnalysis" configMgr.outputFileName = "results/%s_Output.root" % configMgr.analysisName # Define cuts configMgr.cutsDict["UserRegion"] = "1." # Define weights configMgr.weights = "1." # Define samples bkgSample = Sample("Bkg", kGreen - 9) bkgSample.setStatConfig(False) bkgSample.buildHisto([nbkg], "UserRegion", "cuts") # bkgSample.buildStatErrors([nbkgErr],"UserRegion","cuts") # bkgSample.addSystematic(corb) bkgSample.addSystematic(ucb) sigSample = Sample("Sig", kPink) sigSample.setNormFactor("mu_Sig", 1.0, 0.0, 100.0) sigSample.setStatConfig(False) sigSample.setNormByTheory(False) sigSample.buildHisto([nsig], "UserRegion", "cuts") # sigSample.buildStatErrors([nsigErr],"UserRegion","cuts") # sigSample.addSystematic(cors) # sigSample.addSystematic(ucs) dataSample = Sample("Data", kBlack) dataSample.setData() dataSample.buildHisto([ndata], "UserRegion", "cuts") # Define top-level
sigma_ttgamma_crq = 0.177 sigma_ttgamma_crwt = 0.085 syst_ttgamma_theo_srl = Systematic("theoSysTG", 1, 1+sigma_ttgamma_srl, 1-sigma_ttgamma_srl, "user", "userOverallSys") syst_ttgamma_theo_srh = Systematic("theoSysTG", 1, 1+sigma_ttgamma_srh, 1-sigma_ttgamma_srh, "user", "userOverallSys") syst_ttgamma_theo_crq = Systematic("theoSysTG", 1, 1+sigma_ttgamma_crq, 1-sigma_ttgamma_crq, "user", "userOverallSys") syst_ttgamma_theo_crwt = Systematic("theoSysTG", 1, 1+sigma_ttgamma_crwt, 1-sigma_ttgamma_crwt, "user", "userOverallSys") ## signal sigXsec = Sys('SigXSec') # Add Sample Specific Systematics (apparently it's needed to add these systs to the samples *BEFORE* adding them to the FitConfig if do_theo_syst: zllgamma_sample. addSystematic(syst_zgamma_theo) znunugamma_sample.addSystematic(syst_zgamma_theo) if do_syst: efake_sample.addSystematic(syst_feg) jfake_sample.addSystematic(syst_fjg) #-- global systematics for gsyst in syst_to_all: for sample in bkg_samples: if sample.name.startswith('efake') or sample.name.startswith('jfake'): continue sample.addSystematic(gsyst)
all_samples = [sample_bkg0, sample_bkg1, sample_data] #, sample_bkg1, sample_bkg2, sample_data] # systematics syst_bkg0_cr = Systematic("SYST_BKG0_CR", configMgr.weights, 1.0 + 0.05, 1.0 - 0.05, "user", "userHistoSys") syst_bkg0_sr = Systematic("SYST_BKG0_SR", configMgr.weights, 1.0 + 0.25, 1.0 - 0.25, "user", "userHistoSys") syst_bkg1_cr = Systematic("SYST_BKG1_CR", configMgr.weights, 1.0 + 0.05, 1.0 - 0.05, "user", "userHistoSys") syst_bkg1_sr = Systematic("SYST_BKG1_SR", configMgr.weights, 1.0 + 0.25, 1.0 - 0.25, "user", "userHistoSys") sample_bkg0.addSystematic(syst_bkg0_cr) sample_bkg1.addSystematic(syst_bkg1_cr) #norm_syst_bkg1 = Systematic("Norm_Bkg1_0", configMgr.weights, 1.0 + 0.1, 1.0 - 0.1, "user", "userHistoSys") #norm_syst2_bkg1 = Systematic("Norm_Bkg1_1", configMgr.weights, 1.0 + 0.1, 1.0 - 0.1, "user", "userHistoSys") #norm_syst_bkg2 = Systematic("Norm_Bkg2", configMgr.weights, 1.0 + 0.10, 1.0 - 0.10, "user", "userHistoSys") #sample_bkg1.addSystematic(norm_syst_bkg1) #sample_bkg1.addSystematic(norm_syst2_bkg1) #sample_bkg2.addSystematic(norm_syst_bkg2) def sample_by_name(name): global all_samples for s in all_samples: if s.name.lower() == name.lower(): return s
mu1ScaleTFSysZ = Systematic("mu1ScaleTFSys", configMgr.weights, 1.0+ZMap['mu1ScaleWeightUp'][level][chn],1.0-ZMap['mu1ScaleWeightDown'][level][chn], "user","userOverallSys") mu2ScaleTFSysZ = Systematic("mu2ScaleTFSys", configMgr.weights, 1.0+ZMap['mu2ScaleWeightUp'][level][chn],1.0-ZMap['mu2ScaleWeightDown'][level][chn], "user","userOverallSys") sherpaTFSysTop = Systematic("sherpaTFSys", configMgr.weights, 1.0+TopMap['topSherpa'][level][chn],1.0-TopMap['topSherpa'][level][chn], "user","userOverallSys") #------------------------------------------- # List of samples and their plotting colours #------------------------------------------- dibosonSample = Sample("Diboson",kRed+3) dibosonSample.setTreeName("Diboson_SRAll") dibosonSample.setFileList(dibosonFiles) dibosonSample.setStatConfig(useStat) if useSyst: dibosonSample.addSystematic(theoSysDiboson) topSample = Sample("ttbar",kGreen-9) topSample.setTreeName("Top_SRAll") topSample.setNormFactor("mu_Top",1.,0.,500.) topSample.setFileList(topFiles) topSample.setStatConfig(useStat) if useTheoSys: if useSyst: topSample.addSystematic(theoSysTop) ####topSample.addSystematic(mu1ScaleSysTop) ####topSample.addSystematic(mu2ScaleSysTop) ####topSample.addSystematic(matchScaleSysTop) topSample.setNormRegions([("CRT","meffInc"),("CRW","meffInc")])
addSystematic([sig_sample], (btag_sf_uncert_sig_list + jes_uncert_list + [jer_uncert])) # apply the correct cross section systematic to the signal # sample if it is available if sig in signal_xsec_rel_uncert: this_signal_xsec_uncert = Systematic( name='SigXSec', nominal=nominal_weight_sig, high=(1+signal_xsec_rel_uncert[sig]), low=(1-signal_xsec_rel_uncert[sig]), type='user', method='overallSys') sig_sample.addSystematic(this_signal_xsec_uncert) # add samples to configuration exclusion_sr_config.addSamples(sig_sample) exclusion_sr_config.setSignalSample(sig_sample) # ------------------------------------------------------------------------------ # Create TLegend for our plots # TCanvas is needed for this, but it gets deleted afterwards c = TCanvas() compFillStyle = 1001 # see ROOT for Fill styles leg = TLegend(0.6, 0.475, 0.9, 0.925, "") leg.SetFillStyle(0) leg.SetFillColor(0) leg.SetBorderSize(0)
# if oksampk in s : use_this = True # if not use_this : continue # if "225" not in s : continue # if "135" not in s : continue # s_ = s.replace(".0", "") s_ = s extlx = configMgr.addFitConfigClone(tlx, "Sig_%s" % s_) userPrint(" > Adding signal sample to exclusion fit config : %s" % s) sigSample_ = Sample(s, kPink) sigSample_.setFileList(signal_files) sigSample_.setNormByTheory() sigSample_.setStatConfig(not runOptions.doSplitMCsys()) if runOptions.doSplitMCsys(): sigSample_.addSystematic(sysObj.mcstat_SIG) ## set the signal weight to be the weight with no PUPW sigSample_.weights = ["eventweightNOPUPW"] if runOptions.doTheoryBand(): ### TODO check if we need the configMgr setRunOnlyNominalXSec sigXSSyst = Systematic( "SigXSec", ["eventweightNOPUPW"], 1.07, 0.93, "user", "overallSys" ) ### TODO add xsec util to grab the uncertainties on xsec (rather than storing in tree) # sigXSSyst = Systematic("SigXSec", configMgr.weights, 1.07, 0.93, "user", "overallSys") ### TODO add xsec util to grab the uncertainties on xsec (rather than storing in tree) sigSample_.addSystematic(sigXSSyst) ## add systematics sigSample_ = addSys(sigSample_, False, sysObj, True) ## attach the signal strength sigSample_.setNormFactor("mu_SIG", 1.0, 0.0, 5.0)