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(
Esempio n. 2
0
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
Esempio n. 3
0
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
Esempio n. 4
0
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