maxVal, '%s ;m [GeV]; nR' % channel) nRGraph.Draw('LPsame') c.Print('validation/%s_nR.pdf' % channel) maxVal = max(scale) * 1.5 minVal = min(scale) * 1.5 plotPad.DrawFrame(massRanges[0][1], minVal, massRanges[-1][2], maxVal, '%s ;m [GeV]; scale' % channel) scaleGraph.Draw('LPsame') c.Print('validation/%s_scale.pdf' % channel) from tools import getMassRange mass = 4500 massLow, massHigh = getMassRange( mass, 100, 0.006 + channelConfig.getResolution(mass)['res'], channelConfig.dataFile, 150) ws = createWS(mass, 100, args.config, channel, 0.1, False, dataFile="", CB=True, write=False, useShapeUncert=True) #massRanges[0][1] = 200 #massRanges[-1][2] = 400 frame = ws.var('mass_%s' % channel).frame(
def createHistograms(massVal,minNrEv,name,channel,width,correlateMass,binWidth,dataFile="",CB=True): ROOT.RooMsgService.instance().setGlobalKillBelow(RooFit.FATAL) configName ="channelConfig_%s"%channel config = __import__(configName) if dataFile == "": dataFile = config.dataFile effWidth = width + config.getResolution(massVal) if config.nBkg == -1: with open(dataFile) as f: masses = f.readlines() nBkgTotal = len(masses) else: nBkgTotal = config.nBkg from tools import getMassRange massLow, massHigh = getMassRange(massVal,minNrEv,effWidth,dataFile,200) if not correlateMass: peakName = "_%s"%channel else: peakName = "" ws = createWS(massVal,minNrEv,name,channel,width,correlateMass,dataFile=dataFile,CB=CB,write=False) from tools import getBkgEstInWindow nBackground = getBkgEstInWindow(ws,massLow,massHigh,nBkgTotal) binWidth = getBinning(massVal)[0] numEvents = getBinning(massVal)[1] nBins = int((massHigh - massLow)/binWidth) ws.var("mass_%s"%channel).setBins(nBins) histFile = ROOT.TFile("%s.root"%name, "RECREATE") scaleName = "scale" if not correlateMass: scaleName +="_%s"%channel scaleUncert = config.provideUncertainties(massVal)["massScale"] sigShape = ws.pdf("sig_pdf_%s"%channel).generate(ROOT.RooArgSet(ws.var("mass_%s"%channel)),numEvents) ws.var("peak%s"%peakName).setVal(massVal*(1+scaleUncert)) sigShapeUp = ws.pdf("sig_pdf_%s"%channel).generate(ROOT.RooArgSet(ws.var("mass_%s"%channel)),numEvents) ws.var("peak%s"%peakName).setVal(massVal*(1-scaleUncert)) sigShapeDown = ws.pdf("sig_pdf_%s"%channel).generate(ROOT.RooArgSet(ws.var("mass_%s"%channel)),numEvents) sigHistRooFit = ROOT.RooDataHist("sigHist_%s"%channel, "sigHist_%s"%channel, ROOT.RooArgSet(ws.var('mass_%s'%channel)), sigShape) sigHist = sigHistRooFit.createHistogram("sigHist_%s"%channel,ws.var("mass_%s"%channel)) sigHist.SetName("sigHist_%s"%channel) sigHistRooFitUp = ROOT.RooDataHist("sigHist_%s_%sUp"%(channel,scaleName), "sigHist_%s_%sUp"%(channel,scaleName), ROOT.RooArgSet(ws.var('mass_%s'%channel)), sigShapeUp) sigHistUp = sigHistRooFitUp.createHistogram("sigHist_%s_%sUp"%(channel,scaleName),ws.var("mass_%s"%channel)) sigHistUp.SetName("sigHist_%s_%sUp"%(channel,scaleName)) sigHistRooFitDown = ROOT.RooDataHist("sigHist_%s_%sDown"%(channel,scaleName), "sigHist_%s_%sDown"%(channel,scaleName), ROOT.RooArgSet(ws.var('mass_%s'%channel)), sigShapeDown) sigHistDown = sigHistRooFitDown.createHistogram("sigHist_%s_%sDown"%(channel,scaleName),ws.var("mass_%s"%channel)) sigHistDown.SetName("sigHist_%s_%sDown"%(channel,scaleName)) sigHist.Scale(1./(sigHist.Integral())*config.provideSignalScaling(massVal)*1e-7) sigHistUp.Scale(1./(sigHistUp.Integral())*config.provideSignalScaling(massVal)*1e-7) sigHistDown.Scale(1./(sigHistDown.Integral())*config.provideSignalScaling(massVal)*1e-7) bkgShape = ws.pdf("bkgpdf_%s"%channel).generate(ROOT.RooArgSet(ws.var("mass_%s"%channel)),numEvents) bkgHistRooFit = ROOT.RooDataHist("bkgHist_%s"%channel, "bkgHist_%s"%channel, ROOT.RooArgSet(ws.var('mass_%s'%channel)), bkgShape) bkgHist = bkgHistRooFit.createHistogram("bkgHist_%s"%channel,ws.var("mass_%s"%channel)) bkgHist.SetName("bkgHist_%s"%channel) bkgHist.Scale(1./(bkgHist.Integral())*nBackground) dataHist = ROOT.TH1F("data_%s"%channel,"data_%s"%channel,nBins,massLow,massHigh) with open(dataFile) as f: masses = f.readlines() for mass in masses: mass = float(mass) if (mass >= massLow and mass <= massHigh): dataHist.Fill(mass) histFile.Write() histFile.Close() return nBackground
def createWS(massVal,minNrEv,name,channel,width,correlateMass,dataFile="",CB=True,write=True): ROOT.RooMsgService.instance().setGlobalKillBelow(RooFit.FATAL) import glob for f in glob.glob("userfuncs/*.cxx"): ROOT.gSystem.Load(f) configName ="channelConfig_%s"%channel config = __import__(configName) if dataFile == "": dataFile = config.dataFile if not correlateMass: peakName = "_%s"%channel else: peakName = "" effWidth = width + config.getResolution(massVal) from tools import getMassRange massLow, massHigh = getMassRange(massVal,minNrEv,effWidth,dataFile,200) ws = RooWorkspace(channel) massFullRange = RooRealVar('massFullRange','massFullRange',massVal, 200, 5000 ) getattr(ws,'import')(massFullRange,ROOT.RooCmdArg()) mass = RooRealVar('mass_%s'%channel,'mass_%s'%channel,massVal, massLow, massHigh ) getattr(ws,'import')(mass,ROOT.RooCmdArg()) peak = RooRealVar("peak%s"%peakName,"peak%s"%peakName,massVal, massLow, massHigh) peak.setConstant() getattr(ws,'import')(peak,ROOT.RooCmdArg()) ### mass scale uncertainty defined on peak position beta_peak = RooRealVar('beta_peak%s'%peakName,'beta_peak%s'%peakName,0,-5,5) getattr(ws,'import')(beta_peak,ROOT.RooCmdArg()) scaleUncert = 1. + config.provideUncertainties(massVal)["massScale"] peak_kappa = RooRealVar('peak%s_kappa'%peakName,'peak%s_kappa'%peakName,scaleUncert) peak_kappa.setConstant() getattr(ws,'import')(peak_kappa,ROOT.RooCmdArg()) ws.factory("PowFunc::peak_nuis%s(peak%s_kappa, beta_peak%s)"%(peakName,peakName,peakName)) ws.factory("prod::peak_scaled%s(peak%s, peak_nuis%s)"%(peakName,peakName,peakName)) if CB: ws.factory("BreitWigner::bw(mass_%s, peak_scaled%s, %.3f)"%(channel,peakName,massVal*width)) ws.factory("RooCBShape::cb(mass_%s, mean[0.0], %.3f, alpha[1.43], n[3])"%(channel,massVal*config.getResolution(massVal))) bw = ws.pdf("bw") cb = ws.pdf("cb") mass.setBins(10000,"cache") mass.setMin("cache",0) mass.setMax("cache",6000); ## need to be adjusted to be higher than limit setting sigpdf = RooFFTConvPdf("sig_pdf_%s"%channel,"sig_pdf_%s"%channel,mass,bw,cb) getattr(ws,'import')(sigpdf,ROOT.RooCmdArg()) else: ws.factory("Voigtian::sig_pdf_%s(mass_%s, peak_scaled%s, %.3f, %.3f)"%(channel,channel,peakName,massVal*width,massVal*config.getResolution(massVal))) setIntegrator(ws,'sig_pdf_%s'%channel) ws = config.loadBackgroundShape(ws) setIntegrator(ws,'bkgpdf_fullRange') setIntegrator(ws,'bkgpdf_%s'%channel) ds = RooDataSet.read(dataFile,RooArgList(mass)) ds.SetName('data_%s'%channel) ds.SetTitle('data_%s'%channel) getattr(ws,'import')(ds,ROOT.RooCmdArg()) ws.addClassDeclImportDir("shapes/") ws.importClassCode() if config.nBkg == -1: with open(dataFile) as f: masses = f.readlines() nBkgTotal = len(masses) else: nBkgTotal = config.nBkg if write: ws.writeToFile("%s.root"%name,True) from tools import getBkgEstInWindow return getBkgEstInWindow(ws,massLow,massHigh,nBkgTotal) else: return ws
def createWS(massVal,minNrEv,name,channel,width,correlateMass,dataFile="",CB=True,write=True,useShapeUncert=False): ROOT.RooMsgService.instance().setGlobalKillBelow(RooFit.FATAL) import glob for f in glob.glob("userfuncs/*.cxx"): ROOT.gSystem.Load(f) configName ="channelConfig_%s"%channel config = __import__(configName) if dataFile == "": dataFile = config.dataFile if not correlateMass: peakName = "_%s"%channel else: peakName = "" #if "electron" in name: if 'electron' in channel: lowestMass = lowMass['ele'] elif 'muon' in channel: lowestMass = lowMass['mu'] effWidth = width + config.getResolution(massVal)['res'] #else: # effWidth = width + config.getResolution(massVal) from tools import getMassRange massLow, massHigh = getMassRange(massVal,minNrEv,effWidth,dataFile,lowestMass) #massLow = 120 #massHigh = 400 ws = RooWorkspace(channel) massFullRange = RooRealVar('massFullRange','massFullRange',massVal, lowestMass, 6000 ) getattr(ws,'import')(massFullRange,ROOT.RooCmdArg()) mass = RooRealVar('mass_%s'%channel,'mass_%s'%channel,massVal, massLow, massHigh ) getattr(ws,'import')(mass,ROOT.RooCmdArg()) peak = RooRealVar("peak%s"%peakName,"peak%s"%peakName,massVal, massVal, massVal) peak.setConstant() getattr(ws,'import')(peak,ROOT.RooCmdArg()) ### mass scale uncertainty defined on peak position beta_peak = RooRealVar('beta_peak%s'%peakName,'beta_peak%s'%peakName,0,-5,5) getattr(ws,'import')(beta_peak,ROOT.RooCmdArg()) scaleUncert = 1. + config.provideUncertainties(massVal)["massScale"] peak_kappa = RooRealVar('peak%s_kappa'%peakName,'peak%s_kappa'%peakName,scaleUncert) peak_kappa.setConstant() getattr(ws,'import')(peak_kappa,ROOT.RooCmdArg()) ws.factory("PowFunc::peak_nuis%s(peak%s_kappa, beta_peak%s)"%(peakName,peakName,peakName)) ws.factory("prod::peak_scaled%s(peak%s, peak_nuis%s)"%(peakName,peakName,peakName)) ### load resolution parameters and set up log normal for systematic on core resolution params = config.getResolution(massVal) res = RooRealVar("res%s"%peakName,"res%s"%peakName, massVal*params['res']) if params['alphaR'] < 0: params['alphaR'] = 0 res.setConstant() getattr(ws,'import')(res,ROOT.RooCmdArg()) alphaL = RooRealVar("alphaL_%s"%channel,"alphaL_%s"%channel,params['alphaL']) alphaL.setConstant() getattr(ws,'import')(alphaL,ROOT.RooCmdArg()) alphaR = RooRealVar("alphaR_%s"%channel,"alphaR_%s"%channel, params['alphaR']) alphaR.setConstant() getattr(ws,'import')(alphaR,ROOT.RooCmdArg()) beta_res = RooRealVar('beta_res%s'%peakName,'beta_res%s'%peakName,0,-5,5) getattr(ws,'import')(beta_res,ROOT.RooCmdArg()) resUncert = 1. + config.provideUncertainties(massVal)["res"] res_kappa = RooRealVar('res%s_kappa'%peakName,'res%s_kappa'%peakName,resUncert) res_kappa.setConstant() getattr(ws,'import')(res_kappa,ROOT.RooCmdArg()) ws.factory("PowFunc::res_nuis%s(res%s_kappa, beta_res%s)"%(peakName,peakName,peakName)) ws.factory("prod::res_scaled%s(res%s, res_nuis%s)"%(peakName,peakName,peakName)) if CB: ws.factory("BreitWigner::bw(mass_%s, peak_scaled%s, %.3f)"%(channel,peakName,massVal*width)) ws.factory("RooCruijff::cb(mass_%s, mean[0.0], res_scaled%s, res_scaled%s, alphaL_%s, alphaR_%s)"%(channel,peakName,peakName,channel,channel)) bw = ws.pdf("bw") cb = ws.pdf("cb") mass.setBins(20000,"cache") mass.setMin("cache",0) mass.setMax("cache",12500); ## need to be adjusted to be higher than limit setting sigpdf = RooFFTConvPdf("sig_pdf_%s"%channel,"sig_pdf_%s"%channel,mass,bw,cb) getattr(ws,'import')(sigpdf,ROOT.RooCmdArg()) else: params = config.getResolution(massVal) ws.factory("Voigtian::sig_pdf_%s(mass_%s, peak_scaled%s, %.3f, res_scaled%s)"%(channel,channel,peakName,massVal*width,peakName)) setIntegrator(ws,'sig_pdf_%s'%channel) ws = config.loadBackgroundShape(ws,useShapeUncert) setIntegrator(ws,'bkgpdf_fullRange') setIntegrator(ws,'bkgpdf_%s'%channel) ds = RooDataSet.read(dataFile,RooArgList(mass)) ds.SetName('data_%s'%channel) ds.SetTitle('data_%s'%channel) getattr(ws,'import')(ds,ROOT.RooCmdArg()) ws.addClassDeclImportDir("shapes/") ws.importClassCode() if config.nBkg == -1: with open(dataFile) as f: masses = f.readlines() nBkgTotal = len(masses) else: nBkgTotal = config.nBkg if write: ws.writeToFile("%s.root"%name,True) from tools import getBkgEstInWindow return getBkgEstInWindow(ws,massLow,massHigh,nBkgTotal) else: return ws