Пример #1
0
def do_fill(opts,fout,s,v,sel,trg,ref,KFWght=None):
	trg,trg_orig = trigData(opts,s,trg)
	# cut
	cut,cutlabel = write_cuts(sel,trg,reftrig=ref,sample=s['tag'],jsonsamp=opts.jsonsamp,jsoncuts=opts.jsoncuts,weight=opts.weight,KFWght=KFWght,trigequal=trigTruth(opts.usebool))
	if opts.debug: l3("Cut: %s%s%s: %s"%(blue,cutlabel,plain,cut))

	# names
	sample = s['pointer']
	names  = getNames(opts,s,v,sel,trg_orig,ref)
	wpars  = weightInfo(opts.weight,KFWght)

	# containers
	canvas = TCanvas("cfill","cfill",1200,800)
	fout.Delete(names['hist'])
	h      = TH1F(names['hist'],names['hist-title'],int(v['nbins_x']),float(v['xmin']),float(v['xmax']))
	h.Sumw2()
	
	# do actual filling
	inroot('%s.draw("%s","%s","%s")'%(sample,h.GetName(),v['root'],cut))
	if opts.debug: l3("%sFilled: %40s(N=%9d, Int=%9d)%s"%(yellow,h.GetName(),h.GetEntries(),h.Integral(),plain))
	
	# write histogram to file
	gDirectory.cd('%s:/'%fout.GetName())
	path = "%s/%s/%s"%('plots',wpars,names['path-hist'])
	makeDirsRoot(fout,path)
	gDirectory.cd(path)
	h.Write(h.GetName(),TH1.kOverwrite)
	gDirectory.cd('%s:/'%fout.GetName())

	# clean
	h.Delete()
	canvas.Close()
	trg = dc(trg_orig)
Пример #2
0
def getKFWght(opts,loadedSamples,sel,trg):	
	inroot('float nDat=0.0, nQCD=0.0, nBkg=0.0;')
	inroot('TH1F *hDat = new TH1F("hDat","hDat",1,0,1);')
	inroot('TH1F *hQCD = new TH1F("hQCD","hQCD",1,0,1);')
	inroot('TH1F *hBkg = new TH1F("hBkg","hBkg",1,0,1);')
	### LOOP over samples
	for s in loadedSamples:
		### Skip some
		if any([x in s['tag'] for x in ['JetMon','VBF','GluGlu']]): continue
		if opts.debug: l3("%sSample: %s%s"%(purple,s['tag'],plain))
		### Clean some
		if opts.debug and 'KFAC' in opts.weight[1]: l3("Option specified k-factor and puWt ignored in k-factor calculation.")
		opts.weightlocal = dc(opts.weight)
		opts.weightlocal[1] = list(set(opts.weight[1])-set(['KFAC','PU']))
		### Get cut and weight
		trg,trg_orig = trigData(opts,s,trg)
		cut = write_cuts(sel,trg,sample=s['tag'],jsonsamp=opts.jsonsamp,jsoncuts=opts.jsoncuts,weight=opts.weightlocal,trigequal=trigTruth(opts.usebool))[0]
		trg = dc(trg_orig)
		if opts.debug: l3("Cut: %s"%cut)
		### Data
		if 'Data' in s['tag'] or 'DataV' in s['tag']:
			inroot('%s.draw("%s","%s","%s")'%(s['pointer'],ROOT.hDat.GetName(),"0.5",cut))
		### QCD 
		elif 'QCD' in s['tag']:
			inroot('%s.draw("%s","%s","%s")'%(s['pointer'],ROOT.hQCD.GetName(),"0.5",cut))
		### Bkg
		else:
			inroot('%s.draw("%s","%s","%s")'%(s['pointer'],ROOT.hBkg.GetName(),"0.5",cut))
		print "Data: %8.2f  | Bkg: %8.2f  | QCD: %8.2f"%(ROOT.hDat.Integral(),ROOT.hBkg.Integral(),ROOT.hQCD.Integral())
	### finish
	KFWght = (ROOT.hDat.Integral()-ROOT.hBkg.Integral())/ROOT.hQCD.Integral()
	inroot('delete hDat; delete hQCD; delete hBkg;')
	if opts.debug: l2("KFWght calculated at: %f"%KFWght)
	return KFWght
Пример #3
0
def printSelTrg(opts, KFWghts):
    from write_cuts import write_cuts
    l1("Listing cutstrings for control:")
    for s in opts.selection:
        for t in opts.trigger:
            KFWght = KFWghts[('-'.join(sorted(s)), '-'.join(t))]
            l2("Sel: %20s, Trg: %20s" % ("(%s)" % s, "(%s)" % t))
            cutsel = write_cuts(
                s, [],
                sample='Data' if opts.fileformat == '1' else 'DataA',
                jsonsamp=opts.jsonsamp,
                jsoncuts=opts.jsoncuts,
                weight=opts.weight,
                KFWght=KFWght,
                trigequal=trigTruth(opts.usebool))[0]
            cutsel2 = write_cuts(s, [],
                                 sample='QCD250',
                                 jsonsamp=opts.jsonsamp,
                                 jsoncuts=opts.jsoncuts,
                                 weight=opts.weight,
                                 KFWght=KFWght,
                                 trigequal=trigTruth(opts.usebool))[0]
            cuttrg = write_cuts([],
                                t,
                                sample='QCD250',
                                jsonsamp=opts.jsonsamp,
                                jsoncuts=opts.jsoncuts,
                                weight=opts.weight,
                                KFWght=KFWght,
                                trigequal=trigTruth(opts.usebool))[0]
            cuttrgdat = write_cuts(
                [],
                trigData(opts, "", t)[0],
                sample='Data' if opts.fileformat == '1' else 'DataA',
                jsonsamp=opts.jsonsamp,
                jsoncuts=opts.jsoncuts,
                weight=opts.weight,
                KFWght=KFWght,
                trigequal=trigTruth(opts.usebool))[0]
            l3("%s   Sel:   (e.g. Data) %s %s" % (Red, plain, cutsel))
            l3("%s   Sel: (e.g. QCD250) %s %s" % (Red, plain, cutsel2))
            l3("%s   Trg: (e.g. QCD250) %s %s" % (Purple, plain, cuttrg))
            l3("%sTrgDat:   (e.g. Data) %s %s" % (Purple, plain, cuttrgdat))
            print
Пример #4
0
def mkFitFlatTree(opts,s,sel,trg):
	# info
	jsoninfo = json.loads(filecontent(opts.jsoninfo))
	jsonsamp = json.loads(filecontent(opts.jsonsamp))
        jsonvars = json.loads(filecontent(opts.jsonvars))
	ismc = True if not 'Data' in s['tag'] else False

	# prepare
        tags = {"NOM":"sNOM","VBF":"sVBF","TPN":"sTPN","TPV":"sTPV"}
	tag = tags[trg[0]] 
	nfin = s['fname']
	nfout = nfin.replace('.root','_%s.root'%tag) 
	if not os.path.exists(opts.destination): makeDirs(opts.destination)
	fin = TFile.Open(opts.globalpath+nfin,"read")
	fout = TFile.Open(opts.destination+nfout,"recreate")
	l2("Working for %s"%s['tag'])
	l3("File in : %s"%nfin)
	l3("File out: %s"%nfout)

	# process
	fin.cd()
	tin = fin.Get("Hbb/events")
	hpass = fin.Get("Hbb/TriggerPass")

	tin.SetBranchStatus("*",0)
	for b in list(set(sum([x['bare'].split(',') for x in jsonvars['variables'].itervalues() if not "-"==x['bare']],[]))):
		tin.SetBranchStatus(b,1)
	if ismc:
		for b in ["puWt","trigWtNOM","trigWtVBF"]:
			tin.SetBranchStatus(b,1)
		 
	# cuts
	cut,cutlabel = write_cuts(sel,trg,reftrig=["None"],sample=s['tag'],jsonsamp=opts.jsonsamp,jsoncuts=opts.jsoncuts,weight=opts.weight,trigequal=trigTruth(opts.usebool))
	if opts.debug: l3("Cut %s: \n\t\t\t%s%s%s: \n\t\t\t%s"%(s['tag'],blue,cutlabel,plain,cut))
#	cut = ""
#	if tag=="NOM":
#		cut ="selNOM && (triggerResult[5] || triggerResult[7]) && nLeptons==0"
#	elif tag=="VBF":
#		cut = "selVBF && triggerResult[9] && (!(selNOM && (triggerResult[0] || triggerResult[1]))) && nLeptons==0"
#	else: sys.exit(Red+"Tag type unclear: NOM/VBF. Exiting."+plain)
#	if opts.debug: l3("Cut %s: %s%s%s"%(s['tag'],blue,cut,plain))

	# process
	fout.cd()
	if hpass: hpass.Write("TriggerPass")
	makeDirsRoot(fout,"Hbb")
	gDirectory.cd("%s:/%s"%(fout.GetName(),"Hbb"))
	tout = tin.CopyTree(cut)
	l3("Events: %d"%tout.GetEntries())
	tout.Write()

	# cleaning
	fout.Close()
	fin.Close()
Пример #5
0
def mkFitFlatTree(opts,s,sel,trg):
	# info
	jsoninfo = json.loads(filecontent(opts.jsoninfo))
	jsonsamp = json.loads(filecontent(opts.jsonsamp))
	ismc = True if not 'Data' in s['tag'] else False

	# prepare
	tag = 'VBF' if 'VBF' in trg else 'NOM'
	nfin = s['fname']
	nfout = nfin.replace('flatTree','Fit').replace('.root','_sel%s.root'%tag) 
	if not os.path.exists(opts.destination): makeDirs(opts.destination)
	fin = TFile.Open(opts.globalpath+nfin,"read")
	fout = TFile.Open(opts.destination+nfout,"recreate")
	l2("Working for %s"%s['tag'])
	l3("File in : %s"%nfin)
	l3("File out: %s"%nfout)

	# process
	fin.cd()
	tin = fin.Get("Hbb/events")
	hpass = fin.Get("Hbb/TriggerPass")

	tin.SetBranchStatus("*",0)
	for b in ["mvaNOM","mvaVBF","selNOM","selVBF","mvaZ","dPhibb","mbbReg","mbb","nLeptons","triggerResult","jetBtag","b1"]:
		tin.SetBranchStatus(b,1)
	if ismc:
		for b in ["puWt","trigWtNOM","trigWtVBF"]:
			tin.SetBranchStatus(b,1)
		 
	# cuts
	cut,cutlabel = write_cuts(sel,trg,reftrig=["None"],sample=s['tag'],jsonsamp=opts.jsonsamp,jsoncuts=opts.jsoncuts,weight=opts.weight,trigequal=trigTruth(opts.usebool))
	if opts.debug: l3("Cut %s: \n\t\t\t%s%s%s: \n\t\t\t%s"%(s['tag'],blue,cutlabel,plain,cut))
#	cut = ""
#	if tag=="NOM":
#		cut ="selNOM && (triggerResult[5] || triggerResult[7]) && nLeptons==0"
#	elif tag=="VBF":
#		cut = "selVBF && triggerResult[9] && (!(selNOM && (triggerResult[0] || triggerResult[1]))) && nLeptons==0"
#	else: sys.exit(Red+"Tag type unclear: NOM/VBF. Exiting."+plain)
#	if opts.debug: l3("Cut %s: %s%s%s"%(s['tag'],blue,cut,plain))

	# process
	fout.cd()
	if hpass: hpass.Write("TriggerPass")
	makeDirsRoot(fout,"Hbb")
	gDirectory.cd("%s:/%s"%(fout.GetName(),"Hbb"))
	tout = tin.CopyTree(cut)
	l3("Events: %d"%tout.GetEntries())
	tout.Write()

	# cleaning
	fout.Close()
	fin.Close()
Пример #6
0
def mkPDFFlatTree(opts,s,sel,trg):
	# info
	jsoninfo = json.loads(filecontent(opts.jsoninfo))
	jsonsamp = json.loads(filecontent(opts.jsonsamp))
	ismc = True if not 'Data' in s['tag'] else False

	# prepare
	tag = 'VBF' if 'VBF' in trg else 'NOM'
	makeDirs(opts.destination)
	nfin = s['fname']
	nfout = nfin.replace('flatTree','%sFlatTree'%opts.tag).replace('.root','_%s.root'%tag) 
	fin = TFile.Open(opts.globalpath+nfin,"read")
	fout = TFile.Open(opts.destination+nfout,"recreate")
	l2("Working for %s, renaming with %s"%(s['tag'],opts.tag))
	l3("File in : %s"%nfin)
	l3("File out: %s"%nfout)

	# process
	fin.cd()
	tin = fin.Get("Hbb/events")
#	hpass = fin.Get("Hbb/TriggerPass")

	tin.SetBranchStatus("*",0)
	for b in ["mvaNOM","mvaVBF","selNOM","selVBF","dPhibb","mbbReg","mbb","nLeptons","triggerResult","pdfX1","pdfX2","pdfID1","pdfID2","pdfQ"]:
		tin.SetBranchStatus(b,1)
	if ismc:
		for b in ["puWt","trigWtNOM","trigWtVBF"]:
			tin.SetBranchStatus(b,1)
		 
	# cuts
	cut,cutlabel = write_cuts(sel,trg,reftrig=["None"],sample=s['tag'],jsonsamp=opts.jsonsamp,jsoncuts=opts.jsoncuts,weight=opts.weight,trigequal=trigTruth(opts.usebool))
	if opts.debug: l3("Cut %s: \n\t\t\t%s%s%s: \n\t\t\t%s"%(s['tag'],blue,cutlabel,plain,cut))
#	cut = ""
#	if tag=="NOM":
#		cut ="selNOM && (triggerResult[5] || triggerResult[7]) && nLeptons==0"
#	elif tag=="VBF":
#		cut = "selVBF && triggerResult[9] && (!(selNOM && (triggerResult[0] || triggerResult[1]))) && nLeptons==0"
#	else: sys.exit(Red+"Tag type unclear: NOM/VBF. Exiting."+plain)
#	if opts.debug: l3("Cut %s: %s%s%s"%(s['tag'],blue,cut,plain))

	# process
	fout.cd()
#	hpass.Write("TriggerPass")
	makeDirsRoot(fout,"Hbb")
	gDirectory.cd("%s:/%s"%(fout.GetName(),"Hbb"))
	tout = tin.CopyTree(cut,"",opts.nentries)
	l3("Events: %d"%tout.GetEntries())
	tout.Write()

	# cleaning
	fout.Close()
	fin.Close()
Пример #7
0
def convertSamples(opts, samples):
    l1("Converting samples:")
    # remove files if reformat called
    if opts.reformat:
        for sample in samples.itervalues():
            sname = opts.globalpath + '/' + sample[
                'fname'][:-5] + '_reformatted.root'
            if os.path.exists(sname): os.remove(sname)
        sys.exit(
            red +
            "Reformat function was called. All reformatted trees were removed. Rerun for more converting, but REMOVE the reformat flag (else you'll keep deleting the files)."
            + plain)
    elif opts.preselect:
        for sample in samples.itervalues():
            sname = opts.globalpath + '/' + sample[
                'fname'][:-5] + '_preselected.root'
            if os.path.exists(sname): os.remove(sname)
        sys.exit(
            red +
            "Preselect function was called. All preselected trees were removed. Rerun for more converting, but REMOVE the preselect flag (else you'll keep deleting the files)."
            + plain)

    # actually reformat/preselect trees (one at a time to avoid memory filling up)
    for sample in samples.itervalues():
        if opts.treepreselection == []:
            sname = opts.globalpath + '/' + sample[
                'fname'][:-5] + '_reformatted.root'
            if (not os.path.exists(sname)):
                inroot('reformat("%s","%s",variables,%s,"%s")' %
                       (opts.globalpath, sample['fname'], str(
                           opts.fileformat), opts.source))
                sys.exit(
                    red +
                    "Sample reformat function was needed first. Rerun for actual plotting (or more converting)."
                    + plain)
        else:
            sname = opts.globalpath + '/' + sample[
                'fname'][:-5] + '_preselected.root'
            if (not os.path.exists(sname)):
                cut, label = write_cuts(opts.treepreselection, [], [], [],
                                        sample=sample['tag'],
                                        jsonsamp=opts.jsonsamp,
                                        jsoncuts=opts.jsoncuts,
                                        trigequal=trigTruth(opts.usebool),
                                        varskip=opts.skip)
                inroot('preselect("%s","%s",variables,"%s","%s")' %
                       (opts.globalpath, sample['fname'], cut, opts.source))
                sys.exit(
                    red +
                    "Sample preselect function was needed first. Rerun for actual plotting (or more converting)."
                    + plain)
Пример #8
0
def do_fill(opts,fout,s,v,sel,trg,ref,KFWght=None,skipWght=None):
	# info
	l2("Filling for %s"%v['var'])
	# containers
	cuts = {}
	cutlabels = {}
	names = {}
	canvas = TCanvas("cfill","cfill",1200,1000)
	# trg
	trg, trg_orig = trigData(opts,s,trg)
	# names
	jsoninfo = json.loads(filecontent(opts.jsoninfo))
	names['global'] = getNames(opts,s,v,sel,trg_orig,ref)
	keepMapInfo = None
	if skipWght==True:
		keepMapInfo = [x for x in opts.weight[1] if (x[0:3]=='MAP' or x[0:3]=='FUN' or x[0:3]=='COR')]
		opts.weight[1] = [dc(x) for x in opts.weight[1] if not (x[0:3]=='MAP' or x[0:3] == 'FUN' or x[0:3]=='COR')]
	wpars = weightInfo(opts.weight,KFWght)

	# TEffi object
	TEffi = TEffiType(v)

	# looping over different tags
	for tag in ['Num','Den']:
		# cuts
		cuts[tag],cutlabels[tag] = write_cuts(sel,trg if tag=='Num' else ['None'],reftrig=ref,sample=s['tag'],jsonsamp=opts.jsonsamp,jsoncuts=opts.jsoncuts,weight=opts.weight,KFWght=KFWght,varskip=opts.skip+[v['root']],trigequal=trigTruth(opts.usebool))
		if opts.debug: l3("Cut %s: %s%s%s: %s"%(tag,blue,cutlabels[tag],plain,cuts[tag]))

		# loading/filling
		names[tag] = getNames(opts,s,v,sel,trg_orig if tag=='Num' else ['None'],ref,tag)
		if not s['tag'] in TEffi.h[tag] or TEffi.h[tag][s['tag']]==None:
			fout.Delete(names[tag]['hist'])
			TEffi.fill(s['pointer'],s['tag'],tag,names[tag],cuts[tag])
			if opts.debug: l3("%sFilled: %40s(N=%9d, Int=%9d)%s"%(yellow,TEffi.h[tag][s['tag']].GetName(),TEffi.h[tag][s['tag']].GetEntries(),TEffi.h[tag][s['tag']].Integral(),plain))
	
	# consider ratio
	tag = 'Rat'
	names[tag]  = getNames(opts,s,v,sel,trg_orig,ref,tag)
	TEffi.effi(names[tag],jsoninfo['colours'][s['tag']],markerStyle(s['tag'],jsoninfo['markers'][s['tag']],opts))

	# write histogram to file			
	path = "%s/%s/%s"%('turnonCurves',wpars,names['global']['path-turnon'])
	TEffi.write(fout,path)

	# clean
	#TEffi.delete()
	canvas.Close()
	trg = dc(trg_orig)
	if skipWght==True:
		opts.weight[1] += keepMapInfo
Пример #9
0
def do_fill(opts, fout, s, v, sel, trg, ref, KFWght=None):
    trg, trg_orig = trigData(opts, s, trg)
    # cut
    cut, cutlabel = write_cuts(sel,
                               trg,
                               reftrig=ref,
                               sample=s['tag'],
                               jsonsamp=opts.jsonsamp,
                               jsoncuts=opts.jsoncuts,
                               weight=opts.weight,
                               KFWght=KFWght,
                               trigequal=trigTruth(opts.usebool))
    if opts.debug: l3("Cut: %s%s%s: %s" % (blue, cutlabel, plain, cut))

    # names
    sample = s['pointer']
    names = getNames(opts, s, v, sel, trg_orig, ref)
    wpars = weightInfo(opts.weight, KFWght)

    # containers
    canvas = TCanvas("cfill", "cfill", 1200, 800)
    fout.Delete(names['hist'])
    h = TH1F(names['hist'], names['hist-title'], int(v['nbins_x']),
             float(v['xmin']), float(v['xmax']))
    h.Sumw2()

    # do actual filling
    inroot('%s.draw("%s","%s","%s")' % (sample, h.GetName(), v['root'], cut))
    if opts.debug:
        l3("%sFilled: %40s(N=%9d, Int=%9d)%s" %
           (yellow, h.GetName(), h.GetEntries(), h.Integral(), plain))

    # write histogram to file
    gDirectory.cd('%s:/' % fout.GetName())
    path = "%s/%s/%s" % ('plots', wpars, names['path-hist'])
    makeDirsRoot(fout, path)
    gDirectory.cd(path)
    h.Write(h.GetName(), TH1.kOverwrite)
    gDirectory.cd('%s:/' % fout.GetName())

    # clean
    h.Delete()
    canvas.Close()
    trg = dc(trg_orig)
Пример #10
0
def mkBDTcorrelations():
	mp = parser()
	opts,fout,samples = main(mp,False,False,True)

	sels = ['NOM','VBF']
	jsons = INTERNALprepare(opts)
	markers, colours = INTERNALstyle()

	selsamples = INTERNALpicksamples(opts,jsons)

	can = TCanvas("main","main",650,600)
	hProf = INTERNALhistograms(opts,sels,jsons)
	#INTERNALcanvases(opts)

	l1("Creating profiles")
	if not opts.read:
		for isel,sel in enumerate(sels):
			ssel = [s for s in selsamples if sel in s['fname']]
	
			for s in ssel:
				l2("Running for %s"%s['tag'])
	
				cut,cutlabel = write_cuts(["None"],["None"],reftrig=["None"],sample=s['tag'],jsonsamp=opts.jsonsamp,jsoncuts=opts.jsoncuts,weight=opts.complexWghts[(sel,'old')],trigequal=trigTruth(opts.usebool))
				#cut = re.findall('\*.*',cut)[0][2:-1].replace('pu','ev.pu').replace('trig','ev.trig')
				if opts.debug: l3("Cut %s: \n\t\t\t%s%s%s: \n\t\t\t%s"%(s['tag'],blue,cutlabel,plain,cut))
				
				cutextra = "mbbReg[%d]>=80. && mbbReg[%d]<=200."%(1 if sel=='NOM' else 2, 1 if sel=='NOM' else 2)

				for v in [jsons['vars']['variables'][vv] for vv in opts.variable]:
					if sel=='NOM' and '[2]' in v['root']: continue
					if sel=='VBF' and '[1]' in v['root']: continue
					if 'mva' in v and not sel in v: continue

					s['tree'].Draw("%s:%s>>+%s"%(v['root'],"mva%s"%sel,hProf[(sel,v['var'],'BDT','QCD' if 'QCD' in s['fname'] else 'DAT')].GetName()),TCut(cutextra)*TCut(cut),"prof")
					if 'mbbReg' in v['var']: continue
					s['tree'].Draw("%s:%s>>+%s"%(v['root'],"mbbReg[%d]"%(1 if sel=='NOM' else 2),hProf[(sel,v['var'],'mbbReg','QCD' if 'QCD' in s['fname'] else 'DAT')].GetName()),TCut(cutextra)*TCut(cut),"prof")

	else:
		for k in hProf.iterkeys():
			hProf[k] = fout.Get("h%s_sel%s_%s_%s"%(k[3],k[0],k[1],k[2]))
			
	k = list(set([x[0:3] for x in hProf.iterkeys()])) 
	for ik in k:
		low = min(hProf[(ik[0],ik[1],ik[2],'QCD')].GetBinContent(hProf[(ik[0],ik[1],ik[2],'QCD')].GetMinimumBin()),hProf[(ik[0],ik[1],ik[2],'DAT')].GetBinContent(hProf[(ik[0],ik[1],ik[2],'DAT')].GetMinimumBin()))
		hig = max(hProf[(ik[0],ik[1],ik[2],'QCD')].GetBinContent(hProf[(ik[0],ik[1],ik[2],'QCD')].GetMaximumBin()),hProf[(ik[0],ik[1],ik[2],'DAT')].GetBinContent(hProf[(ik[0],ik[1],ik[2],'DAT')].GetMaximumBin()))
		med = hProf[(ik[0],ik[1],ik[2],'DAT')].GetMean(2)
		dif = hig-low
		setlow = med - 1.6*dif
		sethig = med + 1.6*dif
		if not 'cos' in ik[1]: 
			setlow = max(setlow,0)

		limits = {'dEtaqq1':[2,7,2,7],'dPhiqq1':[0,3,0,3],'jetBtag00':[0.5,1.2,0.8,1.0],'jetBtag01':[0.0,1.2,0.55,0.75],'jetQGLNOM0':[0,1,0.5,0.65],'jetQGLNOM1':[0,1,0.35,0.55],'jetQGLNOM2':[0,1,0.5,0.7],'jetQGLNOM3':[0,1,0.5,0.7],'mqq1':[0,2500,500,800],'mbbReg1':[115,145,115,145],'cosTheta1':[-0.35,0.35,-0.2,0.2],'jetQGLVBF0':[0,1,0.4,0.55],'jetQGLVBF1':[0,1,0.3,0.5],'jetQGLVBF2':[0,1,0.55,0.75],'jetQGLVBF3':[0,1,0.5,0.7],'mqq2':[0,2500,1000,1300],'mbbReg2':[115,145,115,145],'cosTheta2':[-0.35,0.35,-0.2,0.2],'dEtaqq2':[2,7,2,7],'dPhiqq2':[0,3,0,3],'softHt':[0,100,25,50],'softN2':[0,10,4,7]} #[3,7,4,6], [0,3,1,2] [0,3,1.5,2.5]
		if ik[1] in limits:
			if ik[2]=='BDT':
				setlow = limits[ik[1]][0]
				sethig = limits[ik[1]][1]
			else:
				setlow = limits[ik[1]][0]#2]
				sethig = limits[ik[1]][1]#3]
#		if 'jetBtag01' in ik[1] and ik[0]=='VBF' and ik[2]=='mbbReg':
#			setlow = 0.4
#			sethig = 0.55

		hProf[(ik[0],ik[1],ik[2],'DAT')].GetYaxis().SetRangeUser(setlow,sethig)
		hProf[(ik[0],ik[1],ik[2],'DAT')].GetYaxis().SetTitleOffset(1.4)
		hProf[(ik[0],ik[1],ik[2],'DAT')].GetXaxis().SetTitleOffset(1.0)
		hProf[(ik[0],ik[1],ik[2],'DAT')].GetYaxis().SetNdivisions(507)
		hProf[(ik[0],ik[1],ik[2],'DAT')].GetXaxis().SetNdivisions(507)
		hProf[(ik[0],ik[1],ik[2],'DAT')].Draw("axis")
		h = INTERNALgraph(hProf[(ik[0],ik[1],ik[2],'DAT')])
		h.SetMarkerStyle(20)
		h.SetMarkerSize(0.8)
		h.SetMarkerColor(kBlack)
		h.SetLineColor(kBlack)
		h.SetFillStyle(0)
		h.Draw("same pz")
		g = INTERNALgraph(hProf[(ik[0],ik[1],ik[2],'QCD')])
#		hProf[(ik[0],ik[1],ik[2],'QCD')].SetMarkerStyle(25)
#		hProf[(ik[0],ik[1],ik[2],'QCD')].SetMarkerColor(kBlue)
#		hProf[(ik[0],ik[1],ik[2],'QCD')].Draw("same e")
		g.SetMarkerStyle(25)
		g.SetMarkerColor(kBlue)
		g.SetLineColor(kBlue)
		g.SetFillStyle(0)
		g.Draw("same pz")

		leg = TLegend(0.62,0.75,0.9,0.92,"%s selection"%(ik[0].strip('sel')))
		leg.SetFillStyle(-1)
		leg.SetBorderSize(0)
		leg.SetTextFont(42)
		leg.SetTextSize(0.045)
		#leg.AddEntry(hProf[(ik[0],ik[1],ik[2],'DAT')],'Data')
		#leg.AddEntry(hProf[(ik[0],ik[1],ik[2],'QCD')],'QCD')
		leg.AddEntry(h,'Data','LP')
		leg.AddEntry(g,'QCD','LP')
		leg.SetY1(leg.GetY2()-(leg.GetNRows()+1)*0.05)
		leg.Draw()

		can.SaveAs("plots/%s.png"%hProf[(ik[0],ik[1],ik[2],'DAT')].GetName().replace('hDAT','h'))
		can.SaveAs("plots/%s.pdf"%hProf[(ik[0],ik[1],ik[2],'DAT')].GetName().replace('hDAT','h'))

	fout.cd()
	for h in hProf.itervalues():
		h.Write(h.GetName(),TH1.kOverwrite)

# clean
	fout.Close()
Пример #11
0
def get1DMap(opts,fout,samples,variables,sel,trg,ref,vx):
	# info 
	l1("Creating 1D cors for (%s):"%(vx[0]))
	print "+ (sel,trg,ref): (%s,%s,%s)"%(sel,trg,ref)
	jsoninfo = json.loads(filecontent(opts.jsoninfo))
	groups = list(set([jsoninfo['groups'][x['tag']] for x in samples]))
	samplesbygroup = {}
	for group in groups:
		samplesbygroup[group] = [sample for sample in samples if jsoninfo['groups'][sample['tag']]==group]
	ratios = []
	if 'JetMon' in groups and 'QCD' in groups:
		ratios += ['JetMon-QCD']
# storage
	gDirectory.cd("%s:/"%fout.GetName())
	for group in groups:
		makeDirsRoot(fout,'1DMaps/%s'%group)
# calculate
	xvals = array('f',[float(x) for x in vx[1].split("#")])
	maps = {}
	cuts = {}
	inroot('TTree *t = 0;')
# To Save
	canvas = TCanvas("cmap","cmap",1800,1200)
	canvas.cd()
	gPad.SetGrid(0,0)
	gPad.SetRightMargin(0.14)
	gStyle.SetPaintTextFormat("6.2f")
# LOOP over ALL GROUPS
	for group in groups:
		l2("Filling for group: %s%s%s"%(purple,group,plain))
		maps[group] = {}
		cuts[group] = {}
		for tag in ['Num','Den','Rat']:
			trg,trg_orig = trigData(opts,'',trg)
			mapname = "1DMap_%s-%s_s%s-t%s-r%s-d%s_%s"%(group,tag,'-'.join(sorted(sel)),'-'.join(trg_orig),'-'.join(ref),'-'.join(trg),vx[0])
			maptitle = "%s;%s;Scale factor"%(mapname,variables[vx[0]]['title_x'])
			trg = dc(trg_orig)
			maps[group][tag] = fout.FindObjectAny(mapname)
			if (not maps[group][tag]) or (not len(xvals)-1==maps[group][tag].GetXaxis().GetNbins()):
				maps[group][tag] = TH1F(mapname,maptitle,len(xvals)-1,xvals)
				maps[group][tag].Sumw2()
## LOOP over ALL SAMPLES
				for s in sorted(samplesbygroup[group],key=lambda x:('QCD' in x['tag'],not 'WJets' in x['tag'],jsoninfo['crosssections'][x['tag']])):
					if tag=='Rat': continue
					l3("Filling for sample: %s%s (%s)%s"%(cyan,s['tag'],tag,plain))
					trg,trg_orig = trigData(opts,s,trg)
					inroot('t = (TTree*)%s.gett();'%s['pointer'])	
					cuts[group][tag] = write_cuts(sel,trg if tag=='Num' else [],sample=s['tag'],jsonsamp=opts.jsonsamp,jsoncuts=opts.jsoncuts,reftrig=ref,trigequal=trigTruth(opts.usebool),weight=opts.weight)[0] #,varskip=[variables[vx[0]]['root'],variables[vy[0]]['root']]
					if opts.debug: print yellow,cuts[group][tag],plain
					inroot('t->Draw("%s>>+%s",TCut("%s"));'%(variables[vx[0]]['root'],maps[group][tag].GetName(),cuts[group][tag]))
					trg = dc(trg_orig)
			else:
				l3("Loaded from file for group: %s%s%s"%(cyan,group,plain))
## END LOOP over ALL SAMPLES
		# to save
		path = '%s/../trigger/plots/%s/1DMaps/%s'%(basepath,fout.GetName().split('/')[-1][:-5],group)
		makeDirs(path)
		# ratio
		maps[group]['Rat'].Divide(maps[group]['Num'],maps[group]['Den'],1.0,1.0,'B')
#$		maps[group]['Rat'] = TEfficiency(maps[group]['Num'],maps[group]['Den'])
		maps[group]['Rat'].SetName(mapname)
		maps[group]['Rat'].SetTitle(maptitle)
		# save		
		gDirectory.cd('%s:/1DMaps/%s'%(fout.GetName(),group))
##
		for tag in ['Num','Den','Rat']:
			if not tag in maps[group]: continue
			maps[group][tag].Write(maps[group][tag].GetName(),TH1.kOverwrite)
			gPad.SetRightMargin(0.14)
			maps[group][tag].SetTitleOffset(1.0,"Y")
			maps[group][tag].SetMarkerSize(maps[group][tag].GetMarkerSize()*0.75)
			maps[group][tag].Draw("text45,error")
			canvas.SaveAs('%s/%s.png'%(path,maps[group][tag].GetName()))
			canvas.SaveAs('%s/%s.pdf'%(path,maps[group][tag].GetName()))
			l3("Written %s map to (eog %s/%s.png)"%(tag,path,maps[group][tag].GetName()))
# END LOOP over ALL GROUPS

# FOCUS ON RATIO MAPS JetMon / QCD
	gDirectory.cd("%s:/"%fout.GetName())
	for ratio in ratios:
		# store
		makeDirsRoot(fout,'1DMaps/%s'%ratio)
		maps[ratio] = {}
		l2("Getting ratio for: %s%s%s"%(purple,ratio,plain))
		# create
		trg,trg_orig = trigData(opts,'',trg)
		mapname = "1DMap_%s-%s_s%s-t%s-r%s-d%s_%s"%(ratio,'Rat','-'.join(sorted(sel)),'-'.join(trg_orig),'-'.join(ref),'-'.join(trg),vx[0])
		maptitle = "%s;%s;Scale factor"%(mapname,variables[vx[0]]['title_x'])
		trg = dc(trg_orig)
		maps[ratio]['Rat'] = TH1F(mapname,maptitle,len(xvals)-1,xvals)
		maps[ratio]['Rat'].Sumw2()
#$		maps[ratio]['Rat'].Divide(maps[ratio.split('-')[0]]['Rat'].GetPaintedHistogram(),maps[ratio.split('-')[1]]['Rat'].GetPaintedHistogram())
		maps[ratio]['Rat'].Divide(maps[ratio.split('-')[0]]['Rat'],maps[ratio.split('-')[1]]['Rat'])

		# plot
		canvas.cd()
		maps[ratio]['Rat'].SetTitleOffset(1.0,"Y")
		maps[ratio]['Rat'].SetMarkerSize(maps[ratio]['Rat'].GetMarkerSize()*0.75)
		maps[ratio]['Rat'].Draw('text45,error')
		
		# save		
		gDirectory.cd('%s:/1DMaps/%s'%(fout.GetName(),ratio))
		maps[ratio]['Rat'].Write(maps[ratio]['Rat'].GetName(),TH1.kOverwrite)

		path = "%s/../trigger/plots/%s/1DMaps/%s"%(basepath,fout.GetName().split('/')[-1][:-5],ratio)
		makeDirs(path)
		for tag in ['Num','Den','Rat']:
			if not tag in maps[ratio]: continue
			canvas.SaveAs("%s/%s.png"%(path,maps[ratio][tag].GetName()))
			canvas.SaveAs("%s/%s.pdf"%(path,maps[ratio][tag].GetName()))
		l2("Written map to (eog %s/%s.png)"%(path,maps[ratio]['Rat'].GetName()))

		# 2d copy
		binsx = []
		for i in range(1,maps[ratio]['Rat'].GetNbinsX()+2): binsx += [maps[ratio]['Rat'].GetXaxis().GetBinLowEdge(i)]
		#print binsx
		binsx_array = array('f',binsx)
		binsy_array = array('f',[0.0,1.0])
		ratio2d = TH2F('ratio2D','ratio2D',len(binsx_array)-1,binsx_array,len(binsy_array)-1,binsy_array)
		for i in range(maps[ratio]['Rat'].GetNbinsX()+2):
			#print maps[ratio]['Rat'].GetXaxis().GetBinLowEdge(i)
			#print maps[ratio]['Rat'].GetBinContent(i)
			ratio2D.SetBinContent(i,1,maps[ratio]['Rat'].GetBinContent(i))
			ratio2D.SetBinError(i,1,maps[ratio]['Rat'].GetBinError(i))
		#plot 
		canvas.cd()
		ratio2D.SetTitle('%s;%s;%s'%('',maps[ratio]['Rat'].GetXaxis().GetTitle(),'Scale factor'))
		ratio2D.Draw('colz,error,text45')
		canvas.SaveAs("%s/2D%s.png"%(path,maps[ratio][tag].GetName()))
		canvas.SaveAs("%s/2D%s.pdf"%(path,maps[ratio][tag].GetName()))
		l2("Written map to (eog %s/2D%s.png)"%(path,maps[ratio]['Rat'].GetName()))

	# clean
	canvas.Close()
Пример #12
0
def datamc():
    # options
    mp = parser()
    opts,fout,samples,variables = main.main(mp,False,True,True)

    # root setup
    ROOTsetup()
    eps = 0.0001

    # samples / variables
    ji, jv, js, Lsamples = loadSamples(opts,samples)
    Lvariables = {k:v for (k,v) in variables.iteritems() if k in opts.variable}

    # canvas
    can = TCanvas("c","c",900,750)
    can.cd()
    
    # histos
    histos = hists(Lsamples,Lvariables,opts.selection)
    stacks = {}

##################################################
    l1("Filling histograms")
    for s in opts.selection:
        for t in opts.trigger:
            # cms paves
            pcms1,pcms2 = FormatCMSPaves(opts,s)
####        # cuts
####        cut,cutlabel = write_cuts(s,t,reftrig=["None"],sample=Lsamples[Lsamples.keys()[0]]['i']['tag'],jsonsamp=opts.jsonsamp,jsoncuts=opts.jsoncuts,weight=opts.weight,trigequal=trigTruth(opts.usebool))
####        cut1,cut2 = cut.split(' * ')[0][1:],cut.split(' * ')[1][:-1]
##################################################
            # sample loop
            for sn,si in sorted(Lsamples.iteritems()):
                l2("Sample: %s"%sn)
                st = si['i']['tag']
                sg = si['g']
                ca,calabel = write_cuts(s,t,reftrig=["None"],sample=st,jsonsamp=opts.jsonsamp,jsoncuts=opts.jsoncuts,weight=opts.weight,trigequal=trigTruth(opts.usebool))
                ca1,ca2 = ca.split(' * ')[0][1:],ca.split(' * ')[1][:-1]
                n = si['t'].GetEntries()
                print ca2
                # variable loop
                for vn,vi in sorted(Lvariables.iteritems()): 
                    l3(vn)
                    ht = hTag(st,vn,s[0])
                    si['t'].Draw("%s>>%s"%(vi['root'],ht),"%s"%ca2)
##################################################
            # stacking
            for sn,si in sorted(Lsamples.iteritems()):
                sg = si['g']
                st = si['i']['tag']
                for vn,vi in sorted(Lvariables.iteritems()):
                    hg = hTag(sg,vn,s[0])
                    ht = hTag(st,vn,s[0])
                    Hg = histos[hg]
                    Ht = histos[ht]
                    Hg.Add(Ht)
##################################################
            # k-factor
            INTEGRALS = {"Data":0.0,"QCD":0.0,"Other":0.0,"TTJets":0.0}
            if "KF" in opts.weight[1] and not ('TP' in t[0]):
                #print "if"
                for ig,g in enumerate(list(set([x['g'] for (k,x) in Lsamples.iteritems()]))):
                    var = Lvariables.keys()[0]
                    hg = hTag(g,var,s[0]) 
                    if g=="VBF125": continue
                    elif g=="Data": INTEGRALS["Data"] += float(histos[hg].Integral())
                    elif g=="QCD": INTEGRALS["QCD"] += float(histos[hg].Integral())
                    else: INTEGRALS["Other"] += float(histos[hg].Integral())
                kfactor = (INTEGRALS["Data"]-INTEGRALS["Other"])/INTEGRALS["QCD"]
                l1("K-factor: %.2f"%kfactor)
            elif "KF" in opts.weight[1]:
                #print "elif"
                for ig,g in enumerate(list(set([x['g'] for (k,x) in Lsamples.iteritems()]))):
                    var = Lvariables.keys()[0]
                    hg = hTag(g,var,s[0]) 
                    if g=="VBF125": continue
                    elif g=="Data": INTEGRALS["Data"] += float(histos[hg].Integral())
                    elif g=="TTJets": INTEGRALS["TTJets"] += float(histos[hg].Integral())
                    else: INTEGRALS["Other"] += float(histos[hg].Integral())
                kfactor = (INTEGRALS["Data"]-INTEGRALS["Other"])/INTEGRALS["TTJets"]
                l1("K-factor: %.2f"%kfactor)
##################################################
            # groups
            l1("Group iteration")
            can.Clear()
            for vn,vi in sorted(Lvariables.iteritems()):
                fout.cd()
                # set pads
                p1,p2 = FormatPads(can)
##################################################
                # top pad
                p1.cd()
                # containers 
                l2("Variable: %s"%(vn))
                DRAW = {}
                hs = "s_v%s_c%s"%(vn,s[0])
                S  = THStack(hs,hs)
                L = TLegend(gStyle.GetPadLeftMargin()+0.03,0.5,gStyle.GetPadLeftMargin()+0.03+0.23*3,1.-gStyle.GetPadTopMargin()-0.025)
                FormatLegend(L)
                # group loop
                for ig,g in enumerate(sorted(list(set([x['g'] for (k,x) in Lsamples.iteritems()])),key=lambda y:(not '125' in y,not 'WJets' in y,histos[hTag(y,vn,s[0])].Integral()))):
                    l3("%s"%(g))
                    hg = hTag(g,vn,s[0])
                    Hg = histos[hg]
                    print Hg.Integral()
                    # underflow
                    Hg.SetBinContent(1,0.5*(Hg.GetBinContent(0)+Hg.GetBinContent(1)))
                    Hg.SetBinError(1,sqrt(pow(Hg.GetBinError(0),2.)+pow(Hg.GetBinError(1),2.)))
                    # overflow
                    Hg.SetBinContent(Hg.GetNbinsX(),0.5*(Hg.GetBinContent(Hg.GetNbinsX())+Hg.GetBinContent(Hg.GetNbinsX()+1)))
                    Hg.SetBinError(Hg.GetNbinsX(),sqrt(pow(Hg.GetBinError(Hg.GetNbinsX()),2.)+pow(Hg.GetBinError(Hg.GetNbinsX()+1),2.)))
                    # type handling
                    if g=="Data":
                        Hg.SetMarkerStyle(20)
                        Hg.SetMarkerColor(kBlack)
                        Hg.SetMarkerSize(1.2)
                        DRAW["Data"] = Hg
                    elif g=="VBF125":
                        Hg.SetLineStyle(1)
                        Hg.SetLineColor(ji['colours'][g])
                        Hg.SetLineWidth(3)
                        Hg.Scale(10.)
                        DRAW["SIG"] = Hg
                    elif g=="GF125":
                        Hg.SetLineStyle(7)
                        Hg.SetLineColor(ji['colours'][g])
                        Hg.SetLineWidth(3)
                        Hg.Scale(10.)
                        DRAW["SIGGF"] = Hg
                    else:
                        Hg.SetLineStyle(1)
                        Hg.SetLineColor(kBlack)
                        Hg.SetFillStyle(1001)
                        Hg.SetFillColor(ji['colours'][g])
                        if g=="QCD" and (not "TP" in t[0]) and "KF" in opts.weight[1]: Hg.Scale(kfactor)
                        if g=="TTJets" and ("TP" in t[0]) and "KF" in opts.weight[1]: Hg.Scale(kfactor)
                        if not Hg.GetEntries()==0: S.Add(Hg)
                # Full stack (bkg)
                DRAW["BKG"] = S
                S.Draw()
                Sall = FormatStack(S)
                # MC err 
                histos[hTag("MCerr",vn,s[0])] = Sall.Clone(hTag("MCerr",vn,s[0])) 
                Hg = histos[hTag("MCerr",vn,s[0])]
                Hg.SetFillStyle(3004)
                Hg.SetFillColor(kGray+2)#kBlack)
                Hg.SetMarkerSize(0)
                DRAW["MCerr"] = Hg
                # Fill legend
                L.AddEntry(histos[hTag("Data",vn,s[0])],"Data","P")
                L.AddEntry(histos[hTag("QCD",vn,s[0])],"%s%s"%("QCD"," (x%.2f)"%kfactor if ("KF" in opts.weight[1] and not "TP" in t[0]) else ""),"F")
                L.AddEntry(histos[hTag("ZJets",vn,s[0])],"%s"%("ZJets"),"F")
                L.AddEntry(histos[hTag("VBF125",vn,s[0])],"10x VBF H(125)","L")
                if hTag("Tall",vn,s[0]) in histos:
                    L.AddEntry(histos[hTag("Tall",vn,s[0])],"%s%s"%("T"," (x%.2f)"%kfactor if ("KF" in opts.weight[1] and "TP" in t[0]) else ""),"F")
                else: 
                    L.AddEntry(histos[hTag("TTJets",vn,s[0])],"%s%s"%("TTJets"," (x%.2f)"%kfactor if ("KF" in opts.weight[1] and "TP" in t[0]) else ""),"F")
                L.AddEntry(histos[hTag("WJets",vn,s[0])],"%s"%("WJets"),"F")
                L.AddEntry(histos[hTag("GF125",vn,s[0])],"10x GF H(125)","L")
                if not hTag("Tall",vn,s[0]) in histos:
                    L.AddEntry(histos[hTag("singleT",vn,s[0])],"%s"%("singleT"),"F")
                L.AddEntry(histos[hTag("MCerr",vn,s[0])],"MC stat. unc.","F")
                # Draw
                DRAW["BKG"].Draw("hist")
                DRAW["Data"].Draw("PE,same")
                DRAW["SIG"].Draw("hist,same")
                DRAW["SIGGF"].Draw("hist,same")
                DRAW["MCerr"].Draw("E2,same")
                # Edit legend
                L.SetY1(L.GetY2()-L.GetNRows()*0.04)
                L.Draw()
                # Draw paves
                pcms1.Draw()
                pcms2.Draw()
                # Edit canvas
                gPad.SetLogy(1)
                gPad.RedrawAxis()
                p1.Write(p1.GetName()+("NOM" if "NOM" in opts.selection[0] else "VBF")+vn)
##################################################
                # bottom pad
                p2.cd()
                # histo = 1
                one = DRAW["Data"].Clone("one")
                for ibin in range(0,one.GetNbinsX()+2): 
                    one.SetBinContent(ibin,1.)
                    one.SetBinError(ibin,0.)
                # ratio Data/MC - 1
                rat = DRAW["Data"].Clone(DRAW["Data"].GetName().replace('h','hRat'))
                FormatRatio(rat)
                rat.Divide(DRAW["BKG"].GetStack().Last())
                rat.Add(one,-1.)
                histos[hTag("Data/MC",vn,s[0])] = rat
                # ratio MCerr/MC - 1
                ratMCerr = histos[hTag("MCerr",vn,s[0])].Clone("ratMCerr")
                ratMCerr.Divide(DRAW["BKG"].GetStack().Last())
                ratMCerr.Add(one,-1.)
                histos[hTag("MCerrDataMC",vn,s[0])] = ratMCerr
                # Draw
                rat.Draw()
                ratMCerr.Draw("E2,same")
                # Edit pad
                rat.GetYaxis().SetRangeUser(-1.0+eps,1.0-eps)
                gPad.SetGridy(1)
                gPad.Update()
                line = TF1("l1","0.",gPad.GetUxmin(),gPad.GetUxmax())
                line.SetLineColor(kBlack)
                line.Draw("same")
                gPad.RedrawAxis()
##################################################
                # save
                plotdir = "./plots/%s"%s[0]
                if not os.path.exists(plotdir): makeDirs(plotdir)
                can.SaveAs("%s/%s_s%s.pdf"%(plotdir,vn,s[0]))
                can.SaveAs("%s/%s_s%s.png"%(plotdir,vn,s[0]))
                fout.cd()
                can.Clear()
    
##################################################
    # clean   
    can.Close()
    closeSamples(Lsamples)
Пример #13
0
def mkTemplateFunctions():
    global paves
    mp = parser()
    opts, fout, samples = main(mp, False, False, True)

    jsons = INTERNALprepare(opts)
    markers, colours = INTERNALstyle()

    TYPE = opts.typetag
    samples = INTERNALpicksamples(opts, jsons)

    hDat = INTERNALhistograms(opts)
    hQcd = INTERNALhistograms(opts)
    can = TCanvas('profiles', 'profiles', 900, 750)
    #can.Divide(2,1)

    ln = INTERNALline("1", float(opts.fBound[0]), float(opts.fBound[1]))

    for iTag, Tag in enumerate(opts.catTags):
        selsamples = [s for s in samples if s['incarnation'] == Tag]
        fins = [x['tfile'] for x in selsamples]
        l1('Running for %s' % Tag)

        can.cd(1 if 'NOM' in Tag else 2)
        leg = TLegend(0.75, 0.5, 1. - gPad.GetRightMargin() - 0.05,
                      1. - gPad.GetTopMargin() - 0.015)
        leg.SetFillStyle(0)
        leg.SetBorderSize(0)
        leg.SetTextSize(0.045)
        leg.SetTextFont(42)
        leg.SetY1(leg.GetY2() - 2 * leg.GetTextSize() * 1.25)

        l2("Running for <mbbReg>")
        fout.cd()
        hQcd[Tag] = TProfile("hProf_sel%s_%s" % (Tag, TYPE),
                             "hProf_sel%s_%s" % (Tag, TYPE), 25, -0.15, 0.15)
        hDat[Tag] = TProfile("hProf_sel%s_%s" % (Tag, "Data"),
                             "hProf_sel%s_%s" % (Tag, "Data"), 50, -0.15, 0.15)
        h = hDat[Tag]
        h = INTERNALstyleHist(h, 0, markers, colours, TYPE)
        h = hQcd[Tag]
        h = INTERNALstyleHist(h, 0, markers, colours, TYPE)
        can.cd()
        for ifin, fin in enumerate(fins):
            if "QCD" in fin.GetName():
                h = hQcd[Tag]
            else:
                h = hDat[Tag]
            if "VBF" in fin.GetName(): continue
            fout.cd()
            can.cd(1 if 'NOM' in Tag else 2)
            l4('Sample: %s' % fin.GetName())
            CUT1 = "mbbReg[%d] > %.1f && mbbReg[%d] < %.1f" % (
                1 if 'NOM' in Tag else 2, 60, 1 if 'NOM' in Tag else 2, 170)
            CUT2, cutlabel = write_cuts(
                ["None"], ["None"],
                reftrig=["None"],
                sample=jsons['samp']['files'][os.path.split(
                    fin.GetName())[1]]['tag'],
                jsonsamp=opts.jsonsamp,
                jsoncuts=opts.jsoncuts,
                weight=opts.complexWghts[(Tag, 'old')],
                trigequal=trigTruth(opts.usebool))
            l4('Cutting with: (%s)*%s' % (CUT1, CUT2))
            tin = fin.Get("Hbb/events")
            l3('Drawing mbbReg[%d] --> %s' %
               (1 if 'NOM' in Tag else 2, h.GetName()))
            tin.Draw(
                "mbbReg[%d]:%s>>+%s" %
                (1 if 'NOM' in Tag else 2,
                 "mvaZ" if 'NOM' in Tag else "mvaVBF", h.GetName()),
                TCut(CUT1) * TCut(CUT2), "prof")

            h.Write(h.GetTitle(), TH1.kOverwrite)

        gPad.SetGrid(0, 1)
        gPad.RedrawAxis()
        hQcd[Tag].SetMarkerSize(1.0)
        hQcd[Tag].SetMarkerStyle(20)
        hQcd[Tag].SetMarkerColor(kBlack)
        hDat[Tag].GetXaxis().SetTitleOffset(1.1)
        hDat[Tag].DrawCopy()
        hQcd[Tag].DrawCopy("same")
        epave("Z selection",
              gPad.GetLeftMargin() + 0.01, 1. - 0.5 * gPad.GetTopMargin(),
              "left", 1, 0.048)
        epave("%.1f fb^{-1} (8 TeV)" % (19.8 if 'NOM' in Tag else 18.3),
              1. - gPad.GetRightMargin() - 0.01,
              1. - 0.5 * gPad.GetTopMargin(), "right", 0, 0.048)
        line = -0.6 if 'NOM' in Tag else -0.1
        tl = TLine(line, 70, line, 170)
        tl.SetLineStyle(kDashed)
        tl.SetLineColor(kGray + 2)
        tl.Draw()
        paves += [tl]
        leg.Clear()
        a = leg.AddEntry(hDat[Tag], "Data", "PL")
        a.SetTextColor(kBlue + 2)
        a = leg.AddEntry(hQcd[Tag], "QCD", "PL")
        a.SetTextColor(kBlack)
        leg.Draw()
        paves += [leg]
        gPad.RedrawAxis()
        can.SaveAs("mbbRegProfileZ.pdf")

# clean
    for f in samples:
        if f['tfile']: f['tfile'].Close()
    fout.Close()
Пример #14
0
def getYields(opts, loadedSamples, KFWghts):
    jsoninfo = json.loads(filecontent(opts.jsoninfo))
    l1("Extracting yields:")
    yieldarchive = {}
    # selection
    for sel in opts.selection:
        thissel = '-'.join(sorted(sel))
        l1("Running for sel: %s" % thissel)
        # trigger
        for itrg, trg in enumerate(opts.trigger):
            thistrg = '-'.join(trg)
            if not opts.datatrigger == []:
                thisdatatrg = '-'.join(
                    opts.datatrigger[opts.trigger.index(trg)])
            l1("Running for trg: %s" %
               (thistrg if opts.datatrigger == [] else " (data: %s)" %
                thisdatatrg))
            # KFWght
            KFWght = KFWghts[(thissel, thistrg)]
            # samples
            groupcounts = {}
            # category
            if any([('VBF' in '-'.join(x) or 'MBBREG2' in '-'.join(x))
                    for x in opts.selection]):
                keys = ['ALL', 'CAT-2', 'CAT4', 'CAT5', 'CAT6']
            elif any([('NOM' in '-'.join(x) or 'MBBREG1' in '-'.join(x))
                      for x in opts.selection]):
                keys = ['ALL', 'CAT-1', 'CAT0', 'CAT1', 'CAT2', 'CAT3']
            else:
                sys.exit(Red +
                         'Don\'t know how to handle this selection. Exiting.' +
                         plain)

            if any([x in thissel for x in ['NOMC', 'VBFC']]):
                cat = 'CAT' + str(
                    int(re.search('(NOMC|VBFC)([0-9]{1})', thissel).group(2)) -
                    1)
            else:
                cat = 'ALL'
            if 'VBF' in thissel and cat == "CAT-1": cat = "CAT-2"
            if 'VBF' in thissel and 'CAT' in cat and int(
                    re.search('CAT([0-9+-]*)', cat).group(1)) >= 0:
                cat = "CAT%d" % (
                    int(re.search('CAT([0-9+-]*)', cat).group(1)) + 4)

            if any([x in thissel for x in ['NOMC', 'VBFC']]):
                print re.search('([+_-]*)(mvaNOMC|mvaVBFC)([0-9]{1})([+_-]*)',
                                thissel).groups()
                selmincat = thissel.replace(
                    ''.join(
                        re.search(
                            '([+_-]*)(mvaNOMC|mvaVBFC)([0-9]{1})([+_-]*)',
                            thissel).groups()), '')
            else:
                selmincat = thissel
            if not (selmincat, '-'.join(trg)) in yieldarchive:
                yieldarchive[(selmincat, '-'.join(trg))] = {}

            d = dict([(x, {}) for x in keys])
            for k, v in d.iteritems():
                if not k in yieldarchive[(selmincat, '-'.join(trg))]:
                    yieldarchive[(selmincat, '-'.join(trg))][k] = v
            for sample in loadedSamples:
                if opts.debug:
                    l3("%sSample: %s%s" % (purple, sample['tag'], plain))
                trg, trg_orig = trigData(opts, sample, trg)
                cut, cutlabel = write_cuts(sel,
                                           trg,
                                           sample=sample['tag'],
                                           jsonsamp=opts.jsonsamp,
                                           jsoncuts=opts.jsoncuts,
                                           weight=opts.weight,
                                           KFWght=KFWght,
                                           trigequal=trigTruth(opts.usebool),
                                           varskip=opts.skip)
                if opts.debug:
                    l3("Cut: %s%s%s: %s" % (blue, cutlabel, plain, cut))
                inroot('float nCount = %s.count("%s");' %
                       (sample['pointer'], cut))
                l3("Entries %s%-40s: N=%10.f %s" %
                   (cyan, "(%s)" % sample['tag'], ROOT.nCount, plain))
                yieldarchive[(
                    selmincat,
                    '-'.join(trg_orig))][cat][sample['tag']] = ROOT.nCount
                if jsoninfo['groups'][sample['tag']] in groupcounts:
                    groupcounts[jsoninfo['groups'][
                        sample['tag']]] += ROOT.nCount
                else:
                    groupcounts[jsoninfo['groups'][
                        sample['tag']]] = ROOT.nCount
                trg = dc(trg_orig)
            yieldarchive[(selmincat, '-'.join(trg))][cat].update(groupcounts)

            for group, groupval in groupcounts.iteritems():
                l3("Entries %s%-40s: N=%10.f %s" %
                   (purple, "(%s)" % group, groupval, plain))
            print

    allkeys = []
    for y in yieldarchive.itervalues():
        for tag in y:
            allkeys += [str(x) for x in y[tag].keys()]
    allkeys = list(set(allkeys))

    #print allkeys

    printYieldTable(
        opts, yieldarchive,
        sorted(['Data', 'DataV', 'QCD', 'ZWJets', 'Tall', 'VBF125', 'GF125'],
               key=lambda x: (x[0:3], len(x), x)))
    printYieldTable(
        opts, yieldarchive,
        sorted(list(
            set(allkeys) - set([
                'Data', 'DataV', 'QCD', 'ZJets', 'TTJets', 'singleT', 'WJets',
                'VBF125', 'GF125'
            ])),
               key=lambda x: (x[0:3], len(x), x)))

    if opts.latex:
        printYieldTableLatex(
            opts, yieldarchive,
            sorted(
                ['Data', 'DataV', 'QCD', 'ZWJets', 'Tall', 'VBF125', 'GF125'],
                key=lambda x: (x[0:3], len(x), x)))
    if opts.latex:
        printYieldTableLatex(
            opts, yieldarchive,
            sorted(list(
                set(allkeys) - set([
                    'Data', 'DataV', 'QCD', 'Tall', 'ZWJets', 'VBF125', 'GF125'
                ])),
                   key=lambda x: (x[0:3], len(x), x)))
Пример #15
0
def mkTemplateFunctions():
        global paves
	mp = parser()
	opts,fout,samples = main(mp,False,False,True)

	jsons = INTERNALprepare(opts)
	markers, colours = INTERNALstyle()

	TYPE = opts.typetag
	samples = INTERNALpicksamples(opts,jsons)

	hDat  = INTERNALhistograms(opts)
	hQcd  = INTERNALhistograms(opts)
	can = TCanvas('profiles','profiles',900,750)
	#can.Divide(2,1)

	ln = INTERNALline("1",float(opts.fBound[0]),float(opts.fBound[1]))

	for iTag,Tag in enumerate(opts.catTags):
		selsamples = [s for s in samples if s['incarnation']==Tag] 
		fins = [x['tfile'] for x in selsamples]
		l1('Running for %s'%Tag)
		
                can.cd(1 if 'NOM' in Tag else 2)
                leg = TLegend(0.75,0.5,1.-gPad.GetRightMargin()-0.05,1.-gPad.GetTopMargin()-0.015)
                leg.SetFillStyle(0)
                leg.SetBorderSize(0)
                leg.SetTextSize(0.045)
                leg.SetTextFont(42)
                leg.SetY1(leg.GetY2()-2*leg.GetTextSize()*1.25)
		
                l2("Running for <mbbReg>")
                fout.cd()
                hQcd[Tag] = TProfile("hProf_sel%s_%s"%(Tag,TYPE),"hProf_sel%s_%s"%(Tag,TYPE),25,-0.15,0.15)
                hDat[Tag] = TProfile("hProf_sel%s_%s"%(Tag,"Data"),"hProf_sel%s_%s"%(Tag,"Data"),50,-0.15,0.15)
                h = hDat[Tag]
		h = INTERNALstyleHist(h,0,markers,colours,TYPE)
                h = hQcd[Tag]
		h = INTERNALstyleHist(h,0,markers,colours,TYPE)
		can.cd()
		for ifin,fin in enumerate(fins):
                    if "QCD" in fin.GetName(): 
                        h = hQcd[Tag]
                    else: 
                        h = hDat[Tag]
                    if "VBF" in fin.GetName(): continue
                    fout.cd()
                    can.cd(1 if 'NOM' in Tag else 2)
		    l4('Sample: %s'%fin.GetName())
                    CUT1 = "mbbReg[%d] > %.1f && mbbReg[%d] < %.1f"%(1 if 'NOM' in Tag else 2,60,1 if 'NOM' in Tag else 2,170)
		    CUT2,cutlabel = write_cuts(["None"],["None"],reftrig=["None"],sample=jsons['samp']['files'][os.path.split(fin.GetName())[1]]['tag'],jsonsamp=opts.jsonsamp,jsoncuts=opts.jsoncuts,weight=opts.complexWghts[(Tag,'old')],trigequal=trigTruth(opts.usebool))
		    l4('Cutting with: (%s)*%s'%(CUT1,CUT2))
		    tin = fin.Get("Hbb/events")
    	            l3('Drawing mbbReg[%d] --> %s'%(1 if 'NOM' in Tag else 2,h.GetName()))
                    tin.Draw("mbbReg[%d]:%s>>+%s"%(1 if 'NOM' in Tag else 2,"mvaZ" if 'NOM' in Tag else "mvaVBF",h.GetName()),TCut(CUT1)*TCut(CUT2),"prof")

	            h.Write(h.GetTitle(),TH1.kOverwrite)

                gPad.SetGrid(0,1)
                gPad.RedrawAxis()
                hQcd[Tag].SetMarkerSize(1.0)
                hQcd[Tag].SetMarkerStyle(20)
                hQcd[Tag].SetMarkerColor(kBlack)
                hDat[Tag].GetXaxis().SetTitleOffset(1.1)
                hDat[Tag].DrawCopy()
                hQcd[Tag].DrawCopy("same")
                epave("Z selection",gPad.GetLeftMargin()+0.01,1.-0.5*gPad.GetTopMargin(),"left",1,0.048)
                epave("%.1f fb^{-1} (8 TeV)"%(19.8 if 'NOM' in Tag else 18.3),1.-gPad.GetRightMargin()-0.01,1.-0.5*gPad.GetTopMargin(),"right",0,0.048)
                line = -0.6 if 'NOM' in Tag else -0.1
                tl = TLine(line,70,line,170)
                tl.SetLineStyle(kDashed)
                tl.SetLineColor(kGray+2)
                tl.Draw()
                paves += [tl]
                leg.Clear()
                a = leg.AddEntry(hDat[Tag],"Data","PL")
                a.SetTextColor(kBlue+2)
                a = leg.AddEntry(hQcd[Tag],"QCD","PL")
                a.SetTextColor(kBlack)
                leg.Draw()
                paves += [leg]
                gPad.RedrawAxis()
                can.SaveAs("mbbRegProfileZ.pdf")


# clean
	for f in samples: 
            if f['tfile']: f['tfile'].Close()
	fout.Close()
Пример #16
0
def mkTemplateFunctions():
    mp = parser()
    opts, fout, samples = main(mp, False, False, True)

    sels = ['NOM', 'VBF']
    jsons = INTERNALprepare(opts)
    markers, colours = INTERNALstyle()

    selsamples = INTERNALpicksamples(opts, jsons)

    can = TCanvas("main", "main")
    hProf = INTERNALhistograms(opts, sels, jsons)
    #INTERNALcanvases(opts)

    l1("Creating profiles")
    if not opts.read:
        for isel, sel in enumerate(sels):
            ssel = [s for s in selsamples if sel in s['fname']]

            for s in ssel:
                l2("Running for %s" % s['tag'])

                cut, cutlabel = write_cuts(["None"], ["None"],
                                           reftrig=["None"],
                                           sample=s['tag'],
                                           jsonsamp=opts.jsonsamp,
                                           jsoncuts=opts.jsoncuts,
                                           weight=opts.complexWghts[(sel,
                                                                     'old')],
                                           trigequal=trigTruth(opts.usebool))
                cut = re.findall('\*.*',
                                 cut)[0][2:-1].replace('pu', 'ev.pu').replace(
                                     'trig', 'ev.trig')
                if opts.debug:
                    l3("Cut %s: \n\t\t\t%s%s%s: \n\t\t\t%s" %
                       (s['tag'], blue, cutlabel, plain, cut))

                nevents = s['tree'].GetEntries()

                for iev, ev in enumerate(s['tree']):
                    if iev % int(nevents / 5) == 0:
                        l3("%10s/%10s" % (iev, nevents))
                    wght = eval(cut)
                    mva = ev.mvaNOM if sel == 'NOM' else ev.mvaVBF
                    mbb = ev.mbbReg[1] if sel == 'NOM' else ev.mbbReg[2]
                    if sel == 'NOM':
                        if mva < -0.6: continue
                        if mbb < 80. or mbb > 200.: continue
                    if sel == 'VBF':
                        if mva < -0.1: continue
                        if mbb < 80. or mbb > 200.: continue

                    for v in opts.variable:
                        if '1' in v and not sel == 'NOM' and not 'Btag' in v and not 'QGL' in v:
                            continue
                        if '2' in v and not sel == 'VBF' and not 'Btag' in v and not 'QGL' in v:
                            continue
                        if 'mva' in v and not sel in v: continue

                        v = jsons['vars']['variables'][v]

                        h = hProf[(sel, v['var'],
                                   'QCD' if 'QCD' in s['fname'] else 'DAT')]
                        h.Fill(
                            mva,
                            eval("ev.%s" %
                                 (v['root'] if not '[btag' in v['root'] else
                                  v['root'].replace('[btag', '[ev.btag'))),
                            wght)
    else:
        for k in hProf.iterkeys():
            hProf[k] = fout.Get("h%s_sel%s_%s" % (k[2], k[0], k[1]))

    k = list(set([x[0:2] for x in hProf.iterkeys()]))
    for ik in k:
        low = min(
            hProf[(ik[0], ik[1],
                   'QCD')].GetBinContent(hProf[(ik[0], ik[1],
                                                'QCD')].GetMinimumBin()),
            hProf[(ik[0], ik[1],
                   'DAT')].GetBinContent(hProf[(ik[0], ik[1],
                                                'DAT')].GetMinimumBin()))
        hig = max(
            hProf[(ik[0], ik[1],
                   'QCD')].GetBinContent(hProf[(ik[0], ik[1],
                                                'QCD')].GetMaximumBin()),
            hProf[(ik[0], ik[1],
                   'DAT')].GetBinContent(hProf[(ik[0], ik[1],
                                                'DAT')].GetMaximumBin()))
        med = hProf[(ik[0], ik[1], 'DAT')].GetMean(2)
        dif = hig - low
        setlow = med - 2 * dif
        sethig = med + 2 * dif
        if 'mbb' in ik[1]: setlow = 110
        if 'mbb' in ik[1]: sethig = 160

        hProf[(ik[0], ik[1], 'DAT')].GetYaxis().SetRangeUser(setlow, sethig)
        hProf[(ik[0], ik[1], 'DAT')].Draw()
        hProf[(ik[0], ik[1], 'QCD')].SetMarkerStyle(25)
        hProf[(ik[0], ik[1], 'QCD')].SetMarkerColor(kBlue)
        #for ibin in range(1,hProf[(ik[0],ik[1],'QCD')].GetNbinsX()+1): hProf[(ik[0],ik[1],'QCD')].
        hProf[(ik[0], ik[1], 'QCD')].Draw("same L")

        leg = TLegend(0.6, 0.6, 0.9, 0.9,
                      "%s selection" % (ik[0].strip('sel')))
        leg.SetFillStyle(-1)
        leg.SetBorderSize(0)
        leg.SetTextFont(42)
        leg.SetTextSize(0.045)
        leg.AddEntry(hProf[(ik[0], ik[1], 'DAT')], 'Data')
        leg.AddEntry(hProf[(ik[0], ik[1], 'QCD')], 'QCD')
        leg.SetY1(leg.GetY2() - (leg.GetNRows() + 1) * 0.05)
        leg.Draw()

        can.SaveAs("plots/%s.png" %
                   hProf[(ik[0], ik[1], 'DAT')].GetName().replace('hDAT', 'h'))

    fout.cd()
    for h in hProf.itervalues():
        h.Write(h.GetName(), TH1.kOverwrite)

# clean
    fout.Close()
Пример #17
0
def do_fill(opts, fout, s, v, sel, trg, ref, KFWght=None, skipWght=None):
    # info
    l2("Filling for %s" % v['var'])
    # containers
    cuts = {}
    cutlabels = {}
    names = {}
    canvas = TCanvas("cfill", "cfill", 1200, 1000)
    # trg
    trg, trg_orig = trigData(opts, s, trg)
    # names
    jsoninfo = json.loads(filecontent(opts.jsoninfo))
    names['global'] = getNames(opts, s, v, sel, trg_orig, ref)
    keepMapInfo = None
    if skipWght == True:
        keepMapInfo = [
            x for x in opts.weight[1]
            if (x[0:3] == 'MAP' or x[0:3] == 'FUN' or x[0:3] == 'COR')
        ]
        opts.weight[1] = [
            dc(x) for x in opts.weight[1]
            if not (x[0:3] == 'MAP' or x[0:3] == 'FUN' or x[0:3] == 'COR')
        ]
    wpars = weightInfo(opts.weight, KFWght)

    # TEffi object
    TEffi = TEffiType(v)

    # looping over different tags
    for tag in ['Num', 'Den']:
        # cuts
        cuts[tag], cutlabels[tag] = write_cuts(
            sel,
            trg if tag == 'Num' else ['None'],
            reftrig=ref,
            sample=s['tag'],
            jsonsamp=opts.jsonsamp,
            jsoncuts=opts.jsoncuts,
            weight=opts.weight,
            KFWght=KFWght,
            varskip=opts.skip + [v['root']],
            trigequal=trigTruth(opts.usebool))
        if opts.debug:
            l3("Cut %s: %s%s%s: %s" %
               (tag, blue, cutlabels[tag], plain, cuts[tag]))

        # loading/filling
        names[tag] = getNames(opts, s, v, sel,
                              trg_orig if tag == 'Num' else ['None'], ref, tag)
        if not s['tag'] in TEffi.h[tag] or TEffi.h[tag][s['tag']] == None:
            fout.Delete(names[tag]['hist'])
            TEffi.fill(s['pointer'], s['tag'], tag, names[tag], cuts[tag])
            if opts.debug:
                l3("%sFilled: %40s(N=%9d, Int=%9d)%s" %
                   (yellow, TEffi.h[tag][s['tag']].GetName(),
                    TEffi.h[tag][s['tag']].GetEntries(),
                    TEffi.h[tag][s['tag']].Integral(), plain))

    # consider ratio
    tag = 'Rat'
    names[tag] = getNames(opts, s, v, sel, trg_orig, ref, tag)
    TEffi.effi(names[tag], jsoninfo['colours'][s['tag']],
               markerStyle(s['tag'], jsoninfo['markers'][s['tag']], opts))

    # write histogram to file
    path = "%s/%s/%s" % ('turnonCurves', wpars, names['global']['path-turnon'])
    TEffi.write(fout, path)

    # clean
    #TEffi.delete()
    canvas.Close()
    trg = dc(trg_orig)
    if skipWght == True:
        opts.weight[1] += keepMapInfo
Пример #18
0
def mkTemplateFunctions():
	mp = parser()
	opts,fout,samples = main(mp,False,False,True)

	jsons = INTERNALprepare(opts)
	markers, colours = INTERNALstyle()

	TYPE = opts.typetag
	samples = INTERNALpicksamples(opts,jsons)

	hDat, hRat, fFit, gUnc, fitter, covariant = INTERNALhistograms(opts)
	c1, c2, c = INTERNALcanvases(opts)
	can = TCanvas("main","main")

	ln = INTERNALline("1",float(opts.fBound[0]),float(opts.fBound[1]))

	for iTag,Tag in enumerate(opts.catTags):
		nCat = int(opts.mvaBins['mva%s'%Tag][0])-1
		rCat = 0 if Tag=='NOM' else 4
		selsamples = [s for s in samples if s['incarnation']==Tag] 
		fins = [x['tfile'] for x in selsamples]
		l1('Running for %s - QCD'%Tag)
		
		c2[Tag] = TCanvas('transfer_sel%s_%s'%(Tag,TYPE),'transfer_sel%s_%s'%(Tag,TYPE),600*(nCat-1),600)
		c2[Tag].Divide(nCat-1,1)

		leg = INTERNALlegend(Tag)
		leg.SetX1(0.7)
		lleg = dict(((Tag,iCat+1),INTERNALlegend(Tag)) for iCat in range(nCat-1))
		
		for iCat in range(nCat):
			jCat = iCat + rCat
			if opts.merge:
				if iCat==nCat-1: continue
				if iCat==nCat-2: jCat = jCat*10+jCat+1
			l2('Running for CAT%d'%jCat)
#			v = jsons['vars']['variables'][opts.variables[opts.variables.keys()[iTag]][0]]

# regular hists
#			if v['xs']: hDat[(Tag,iCat)] = TH1F('hDat_sel%s_CAT%d'%(Tag,iCat),'hDat_sel%s_CAT%d'%(Tag,iCat),int(v['nbins_x']),v['xs'])
#			else: hDat[(Tag,iCat)] = TH1F('hDat_sel%s_CAT%d'%(Tag,iCat),'hDat_sel%s_CAT%d'%(Tag,iCat),int(v['nbins_x']),int(v['xmin']),int(v['xmax']))
			hDat[(Tag,iCat)] = TH1F('hDat_sel%s_CAT%d_%s'%(Tag,jCat,TYPE),'hDat_sel%s_CAT%d_%s'%(Tag,jCat,TYPE),int(float(opts.fBound[1]) - float(opts.fBound[0]))/(10 if 'Dat' in TYPE else 20),float(opts.fBound[0]),float(opts.fBound[1]))
                        print hDat[(Tag,iCat)].GetBinWidth(1)
			h = hDat[(Tag,iCat)]
			h = INTERNALstyleHist(h,iCat,markers,colours,TYPE)
			can.cd()
# cut
			CUT = TCut("mva%s>%.2f && mva%s<=%.2f"%(Tag,float(opts.mvaBins["mva%s"%Tag][1][iCat+1]),Tag,float(opts.mvaBins["mva%s"%Tag][1][iCat+2])))
			if opts.merge:
				CUT = TCut("mva%s>%.2f && mva%s<=%.2f"%(Tag,float(opts.mvaBins["mva%s"%Tag][1][iCat+1]),Tag,float(opts.mvaBins["mva%s"%Tag][1][iCat+3])))

			###CUT = TCut("mvaNOM>%.2f && mvaNOM<=%.2f"%(float(opts.mvaBins["mva%s"%Tag][1][iCat+1]),float(opts.mvaBins["mva%s"%Tag][1][iCat+2])))
			l3('Cutting with: %s'%CUT)
			for fin in fins:
				l4('Sample: %s'%fin.GetName())
				CUT2,cutlabel = write_cuts(["None"],["None"],reftrig=["None"],sample=jsons['samp']['files'][os.path.split(fin.GetName())[1]]['tag'],jsonsamp=opts.jsonsamp,jsoncuts=opts.jsoncuts,weight=opts.complexWghts[(Tag,'old')],trigequal=trigTruth(opts.usebool))
				l4('Cutting with: %s'%CUT2)

# drawing
				tin = fin.Get("Hbb/events")
				l3('Drawing mbbReg[%d] --> %s'%(1 if 'NOM' in Tag else 2,h.GetName()))
				tin.Draw("mbbReg[%d]>>+%s"%(1 if 'NOM' in Tag else 2,h.GetName()),TCut(CUT)*TCut(CUT2))
			fout.cd()
			###tin.Draw("mbbReg[1]>>%s"%(h.GetName()),CUT)
			if not opts.unblind: h = INTERNALblind(h,100.,150.)
			h.Scale(1./h.Integral())
			h.SetDirectory(0)

# ratio hist
			hRat[(Tag,iCat)] = h.Clone(h.GetName().replace('hDat','hRat'))
			r = hRat[(Tag,iCat)]
			r.SetTitle(r.GetName())
			r = INTERNALstyleHist(r,iCat,markers,colours,TYPE)

# dividing by control CAT
			##print "Divide: ", hDat[(Tag,0)].GetName()
			r.Divide(hDat[(Tag,0)])
			r.SetDirectory(0)
			
# fit
			fFit[(Tag,iCat)] = TF1(h.GetName().replace('hDat','fitRatio'),'pol1',float(opts.fBound[0]),float(opts.fBound[1]))
			f = fFit[(Tag,iCat)]
			f.SetLineColor(colours[iCat])

			h.Write(h.GetTitle(),TH1.kOverwrite)

			if not iCat==0:
				r.Fit(f,"RQ")
				fitter = TVirtualFitter.GetFitter()
				covariant = TMatrixDSym()
				covariant.Use(fitter.GetNumberTotalParameters(),fitter.GetCovarianceMatrix())
				nBins = 200
				dx = (r.GetBinLowEdge(r.GetNbinsX()+1)-r.GetBinLowEdge(1))/float(nBins)
				vx = array('f',[r.GetBinLowEdge(1)+(i+1)*dx for i in range(nBins)])
				vy = array('f',[f.Eval(vx[i]) for i in range(nBins)])
				vex = array('f',[0.0]*nBins)
				vey = array('f',[sqrt(pow(vx[i],2)*covariant(1,1)+2.0*vx[i]*covariant(0,1)+covariant(0,0)) for i in range(nBins)])

				gUnc[(Tag,iCat)] = TGraphErrors(nBins,vx,vy,vex,vey)
				g = gUnc[(Tag,iCat)]
				g.SetFillColor(colours[iCat])
				g.SetFillStyle(3004)
				
				c1[Tag].cd()
				h.Draw('same E')
				hDat[(Tag,0)].GetYaxis().SetRangeUser(0.0,max(h.GetMaximum(),hDat[(Tag,0)].GetMaximum())*1.02)
				gPad.Update()
				leg.AddEntry(h,'CAT%d'%jCat,'P')
				c2[Tag].cd(iCat)
				ln.Draw()
				g.Draw('same E3')
				r.Draw('same')
				ll = lleg[(Tag,iCat)] 
				ll.AddEntry(h,'CAT%d / CAT%d'%(jCat,rCat),'P')
				ll.SetY1(ll.GetY2()-ll.GetNRows()*0.06)
				ll.SetTextSize(0.04)
				ll.Draw()
				r.GetYaxis().SetRangeUser(0.0,2.0)
				r.Write(r.GetTitle(),TH1.kOverwrite)
				g.Write(r.GetTitle().replace('hRat','gRat'),TH1.kOverwrite)
			else:
				c1[Tag] = TCanvas('MbbShape_sel%s_%s'%(Tag,TYPE),'MbbShape_sel%s_%s'%(Tag,TYPE),900,600)
				c1[Tag].cd()
				gPad.SetLeftMargin(0.12)
				gPad.SetRightMargin(0.03)
				h.GetYaxis().SetTitleOffset(0.8)
				h.SetFillColor(kGray)
				h.Draw('hist')
				leg.AddEntry(h,'CAT%d'%jCat,'F')

			fout.cd()
			f.Write(f.GetName(),TH1.kOverwrite)

		c1[Tag].cd()
		leg.SetY1(leg.GetY2()-leg.GetNRows()*0.06)
		leg.Draw()
		c1[Tag].SaveAs('plots/transfer/%s%s.png'%(c1[Tag].GetName(),"_merged" if opts.merge else ""))
		c1[Tag].SaveAs('plots/transfer/%s%s.pdf'%(c1[Tag].GetName(),"_merged" if opts.merge else ""))
		c2[Tag].SaveAs('plots/transfer/%s%s.png'%(c2[Tag].GetName(),"_merged" if opts.merge else ""))
		c2[Tag].SaveAs('plots/transfer/%s%s.pdf'%(c2[Tag].GetName(),"_merged" if opts.merge else ""))

	#c.SaveAs('plots/transfer/%s.png'%c.GetName())

# clean
	for f in samples: f['tfile'].Close()
	fout.Close()
Пример #19
0
def mkSigOverBkg(opts, samples, sel, trg):
    # cut
    cut, cutlabel = write_cuts(sel,
                               trg,
                               reftrig=["None"],
                               sample="DataA",
                               jsonsamp=opts.jsonsamp,
                               jsoncuts=opts.jsoncuts,
                               weight=opts.weight,
                               trigequal=trigTruth(opts.usebool))
    if opts.debug:
        l3("Cut %s: \n\t\t\t%s%s%s: \n\t\t\t%s" %
           ("DataA", blue, cutlabel, plain, cut))

    # category
    cat = ''
    mbb = ''
    print '-'.join(sel)
    if 'VBF' in '-'.join(sel):
        cat = str(
            int(re.search('(mvaVBFC)([0-9]*)', '-'.join(sel)).group(2)) +
            3) if int(re.search('(mvaVBFC)([0-9]*)',
                                '-'.join(sel)).group(2)) > 0 else "-2"
        mbb = 'mbbReg[2]'
    elif 'NOM' in '-'.join(sel):
        cat = str(
            int(re.search('(mvaNOMC)([0-9]*)', '-'.join(sel)).group(2)) - 1)
        mbb = 'mbbReg[1]'
    elif 'None' == '-'.join(sel):
        cat = "ALL"
        mbb = ''
    else:
        sys.exit(Red + "Don't know how to handle this selection: %s. Exiting" %
                 ('-'.join(sel)) + plain)
    # limited categories
    if cat == 'ALL' or not (int(cat) >= 0 and int(cat) < 7): return -99, None

    # container
    numbers = {}

    # input
    if not opts.wsig == '':
        fin = TFile.Open(opts.wsig, "read")
        workspace = fin.Get("w")
        mean = workspace.var("mean_m125_CAT%s" % cat).getVal()
        fwhm = workspace.var("fwhm_m125_CAT%s" % cat).getVal()
        lower = mean - fwhm / 2.
        upper = mean + fwhm / 2.
    elif not (opts.xmin == '' or opts.xmax == '' or opts.xcen == ''):
        mean = opts.xcen
        fwhm = 0
        lower = opts.xmin
        upper = opts.xmax
    else:
        sys.exit(Red + 'Can\'t continue without boundaries. Exiting.' + plain)
    l2("Looking in [%.4f,%.4f] around %.4f" % (lower, upper, mean))
    numbers['nlower'] = lower
    numbers['nupper'] = upper
    numbers['nmean'] = mean

    # extra cut
    extracut = ["%s>=%.6f" % (mbb, lower), "%s<=%.6f" % (mbb, upper)]

    countSig = 0.0
    countBkg = 0.0

    for s in samples:
        cut, cutlabel = write_cuts(sel,
                                   trg,
                                   reftrig=["None"],
                                   sample=s['tag'],
                                   jsonsamp=opts.jsonsamp,
                                   jsoncuts=opts.jsoncuts,
                                   weight=opts.weight,
                                   trigequal=trigTruth(opts.usebool),
                                   extra=extracut)
        if opts.debug:
            l3("Cut %s: \n\t\t\t%s%s%s: \n\t\t\t%s" %
               (s['tag'], blue, cutlabel, plain, cut))
        fsIn = TFile.Open(
            opts.globalpath + '/' +
            s['fname'].replace('flatTree', '%sFlatTree' % opts.flatprefix).
            replace('.root', '%s.root' % opts.flatsuffix) if not (
                opts.flatprefix == "" or opts.flatsuffix == ""
            ) else opts.globalpath + s['fname'])
        tsIn = fsIn.Get("Hbb/events")
        h = TH1F("hcount", "hcount", 1, 0, 1)
        tsIn.Draw("0.5>>hcount", cut)
        count = h.Integral()
        numbers[s['tag']] = count
        if any([x in s['tag'] for x in ['VBF', 'GluGlu']]):
            countSig += count
        elif any([x in s['tag'] for x in ['Data']]):
            countBkg += count
        else:
            continue
        fsIn.Close()

    numbers['bkg'] = countBkg
    numbers['sig'] = countSig
    numbers['SoB'] = countSig / countBkg
    numbers['SosB'] = countSig / sqrt(countBkg)

    return cat, numbers
Пример #20
0
def mkSBSigTrees():
    # initialise
    global paves
    mp = parser()
    opts, fout = main.main(mp, True)
    fname = fout.GetName()
    fout.Close()
    os.remove(fname)
    prefix = basepath + '/../mvd'
    basetree = "flatTree_VBFPowheg125.root"

    makeDirs('/'.join([prefix, "rootfiles"]))
    makeDirs('/'.join([prefix, "plots"]))

    ######################################################################################################################################################
    ######################################################################################################################################################
    # step 01: NOM/PRK selection
    if opts.step == 1:
        fin = TFile.Open('/'.join([opts.globalpath, basetree]), "read")
        tin = fin.Get("Hbb/events")

        l1("Step 01: %s selection" % opts.sel)

        fout = TFile.Open(
            '/'.join([
                prefix, "rootfiles",
                basetree.replace(".root", "_EvIntStep01_%s.root" % opts.sel)
            ]), "recreate")
        makeDirsRoot(fout, "Hbb")
        gDirectory.cd("Hbb")

        #cut,label = write_cuts(opts.selection[0],opts.trigger[0],reftrig=[],jsoncuts=opts.jsoncuts,jsonsamp=opts.jsonsamp,sample="VBF125",weight=opts.weight,trigequal=trigTruth(True))
        cut, label = write_cuts([],
                                opts.trigger[0],
                                reftrig=[],
                                jsoncuts=opts.jsoncuts,
                                jsonsamp=opts.jsonsamp,
                                sample="VBF125",
                                weight=opts.weight,
                                trigequal=trigTruth(True))
        l2("Cut %s: %s" % (opts.sel, cut))

        tout = tin.CopyTree(cut)
        fout.Write()

        fin.Close()
        fout.Close()

######################################################################################################################################################
######################################################################################################################################################
    if opts.step == 2:
        fin = TFile.Open(
            '/'.join([
                prefix, "rootfiles",
                basetree.replace(".root", "_EvIntStep01_%s.root" % opts.sel)
            ]), "read")
        tin = fin.Get("Hbb/events")

        l1("Step 02: %s: eta/btag variable only slimming" % (opts.sel))

        tin.SetBranchStatus('*', 0)
        for b in [
                'jetBtag', 'btagIdx', 'jetEta', 'etaIdx', 'partonId',
                'partonMatchIdx', 'partonMatchDR', 'jetPt', 'jetPhi',
                'jetMass', 'blikNOMIdx', 'blikVBFIdx', 'mqq', 'mbb', 'dEtaqq'
        ]:
            tin.SetBranchStatus(b, 1)

        fout = TFile.Open(
            '/'.join([
                prefix, "rootfiles",
                basetree.replace(".root", "_EvIntStep02_%s.root" % (opts.sel))
            ]), "recreate")
        makeDirsRoot(fout, "Hbb")
        gDirectory.cd("Hbb")

        tout = tin.CloneTree()
        fout.Write(fout.GetName(), TH1.kOverwrite)

        fin.Close()
        fout.Close()

######################################################################################################################################################
######################################################################################################################################################
    if opts.step == 3:
        fin = TFile.Open(
            '/'.join([
                prefix, "rootfiles",
                basetree.replace(".root", "_EvIntStep02_%s.root" % (opts.sel))
            ]), "read")
        tin = fin.Get("Hbb/events")
        nin = tin.GetEntriesFast()

        l1("Step 03%s: %s: jets tree transformation" %
           (" (Alt)" if opts.alt else "", opts.sel))

        fout = TFile.Open(
            '/'.join([
                prefix, "rootfiles",
                basetree.replace(
                    ".root", "_EvIntStep03%s_%s.root" %
                    ("Alt" if opts.alt else "", opts.sel))
            ]), "recreate")
        makeDirsRoot(fout, "Hbb")
        gDirectory.cd("Hbb")

        v_eta, v_btag, v_pt, v_phi, v_mass = zeros(1, dtype='float32'), zeros(
            1, dtype='float32'), zeros(1, dtype='float32'), zeros(
                1, dtype='float32'), zeros(1, dtype='float32')
        v_etaIdx, v_btagIdx, v_pid, v_ptIdx = zeros(1, dtype='int32'), zeros(
            1, dtype='int32'), zeros(1, dtype='int32'), zeros(1, dtype='int32')
        # new branches
        tout = TTree("jets", "jets")
        tout.Branch("eta", v_eta, "eta/F")
        tout.Branch("etaIdx", v_etaIdx, "etaIdx/I")
        tout.Branch("btag", v_btag, "btag/F")
        tout.Branch("btagIdx", v_btagIdx, "btagIdx/I")
        tout.Branch("pid", v_pid, "pid/I")
        tout.Branch("ptIdx", v_ptIdx, "ptIdx/I")
        tout.Branch("pt", v_pt, "pt/F")
        tout.Branch("phi", v_phi, "phi/F")
        tout.Branch("mass", v_mass, "mass/F")
        # loop over tree
        tref = now()
        for iEv, Ev in enumerate(tin):
            if iEv % 20000 == 0:
                [m, s], p = testimate(tref, iEv, nin)
                print "%6d/%-10d (est. %dm %ds, %.1f%%)" % (iEv, nin, m, s, p)
            if opts.nentries > 0 and iEv > opts.nentries: break
            # loop over partons
            for pj in range(len(Ev.partonMatchDR)):
                if Ev.partonMatchDR[pj] > 0.25: continue
                #                if Ev.partonMatchIdx[pj] > len(Ev.jetPt): continue
                ptIdx = Ev.partonMatchIdx[pj]
                v_ptIdx[0] = Ev.partonMatchIdx[pj]
                v_pid[0] = Ev.partonId[pj]
                v_btag[0] = Ev.jetBtag[ptIdx]
                v_pt[0] = Ev.jetPt[ptIdx]
                v_eta[0] = Ev.jetEta[ptIdx]
                v_phi[0] = Ev.jetPhi[ptIdx]
                v_mass[0] = Ev.jetMass[ptIdx]
                if opts.alt:
                    if (ptIdx in list(Ev.btagIdx)) and (ptIdx in list(
                            Ev.etaIdx)):
                        v_btagIdx[0] = list(Ev.btagIdx).index(ptIdx)
                        v_etaIdx[0] = list(Ev.etaIdx).index(ptIdx)
                    else:
                        continue
                else:
                    if ptIdx < len(list(Ev.btagIdx)):
                        v_btagIdx[0] = Ev.btagIdx[ptIdx]
                        v_etaIdx[0] = Ev.etaIdx[ptIdx]
                tout.Fill()
# save
        fout.Write(fout.GetName(), TH1.kOverwrite)

######################################################################################################################################################
######################################################################################################################################################
    if opts.step == 4:
        l1("Step 04%s: %s: blik training" %
           (" (Alt)" if opts.alt else "", opts.sel))

        fin = TFile.Open(
            '/'.join([
                prefix, "rootfiles",
                basetree.replace(
                    ".root", "_EvIntStep03%s_%s.root" %
                    ("Alt" if opts.alt else "", opts.sel))
            ]), "read")
        tin = fin.Get("Hbb/jets")

        fout = TFile.Open(
            "rootfiles/bjetId_%s_MVA%s.root" %
            (opts.sel, "Alt" if opts.alt else ""), "recreate")

        sigCut = TCut("abs(pid) == 5")
        bkgCut = TCut("abs(pid) != 5")
        presel = TCut(
            "btagIdx<4 && etaIdx<4 && etaIdx>-1 && ptIdx<4 && btagIdx>-1 && ptIdx>-1"
        )

        Nin = tin.GetEntries()
        N = 100000
        l1("Input tree: %d events" % Nin)
        l1("Using %d events" % N)

        factory = TMVA.Factory(
            "factory_%s%s_" % (opts.sel, "_Alt" if opts.alt else ""), fout,
            "!V:!Silent:Color:DrawProgressBar:Transformations=I;G:AnalysisType=Classification"
        )
        factory.SetInputTrees(tin, sigCut, bkgCut)

        factory.AddVariable("btag", 'F')
        factory.AddVariable("eta", 'F')
        factory.AddVariable("btagIdx", 'I')
        factory.AddVariable("etaIdx", 'I')

        factory.PrepareTrainingAndTestTree(
            presel,
            "nTrain_Signal=%d:nTrain_Background=%d:nTest_Signal=%d:nTest_Background=%d"
            % (N, N, N, N))

        factory.BookMethod(TMVA.Types.kLikelihood, "Likelihood")
        factory.BookMethod(TMVA.Types.kBDT, "BDT_GRAD2",
                           "NTrees=600:nCuts=25:BoostType=Grad:Shrinkage=0.2")
        factory.TrainAllMethods()
        factory.TestAllMethods()
        factory.EvaluateAllMethods()

        fin.Close()
        fout.Close()

######################################################################################################################################################
######################################################################################################################################################
    if opts.step == 5:
        l1("Step 05%s: %s: Sig/Bkg plots" %
           (" (Alt)" if opts.alt else "", opts.sel))

        fin = TFile.Open(
            prefix + "/rootfiles/flatTree_VBFPowheg125_EvIntStep03%s_%s.root" %
            ("Alt" if opts.alt else "", opts.sel), "read")
        tin = fin.Get("Hbb/jets")
        fout = TFile.Open(
            prefix + "/rootfiles/flatTree_VBFPowheg125_EvIntStep05%s_%s.root" %
            ("Alt" if opts.alt else "", opts.sel), "recreate")

        gStyle.SetOptStat(0)
        gStyle.SetOptTitle(0)
        gStyle.SetLineScalePS(2)
        gROOT.ProcessLineSync(".x %s/styleCMSTDR.C" % basepath)
        gStyle.SetPadRightMargin(0.02)
        gStyle.SetPadLeftMargin(0.16)
        gStyle.SetPadTopMargin(0.02)
        gStyle.SetPadBottomMargin(0.12)
        gROOT.SetBatch(1)
        gStyle.SetTitleSize(0.05, "XY")
        gStyle.SetLabelSize(0.04, "XY")
        gStyle.SetTitleOffset(1.35, "Y")
        gStyle.SetGridColor(17)

        #
        fc = {"sig": kBlue - 9, "bkg": kRed}
        fs = {"sig": 1001, "bkg": 3004}
        lc = {"sig": kBlue - 7, "bkg": kRed}
        Ax = [
            "#eta", "#eta rank", "CSV b-tag", "CSV b-tag rank",
            "(old) b-likelihood", "(old) b-likelihood rank", "b-likelihood",
            "b-likelihood rank"
        ]
        Ay = [
            "N / (0.2)", "N / (1)", "N / (0.1)", "N / (1)", "N / (0.04)",
            "N / (1)", "N / (0.04)", "N / (1)"
        ]
        AN = [50, 4, 110, 4, 50, 4, 50, 4]
        Ami = [-5, -0.5, -10, -0.5, -1, -0.5, -1, -0.5]
        Ama = [5, 3.5, 1, 3.5, 1, 3.5, 1, 3.5]
        Av = [
            "jetEta", "etaIdx", "jetBtag", "btagIdx", "blikNOM", "blikNOMIdx",
            "myblikNOM", "myblikNOMIdx"
        ]
        hs = {}
        btagbinsinput = [-10, -9, -1, 0]
        for i in range(1, int(1. / 0.05) + 1):
            btagbinsinput += [round(float(i) * 0.05, 2)]
        btagbins = array('f', btagbinsinput)
        for a1 in ["sig", "bkg"]:
            for i2, a2 in enumerate(["eta", "etaIdx", "btag", "btagIdx"]):
                x, y, N, mi, ma = Ax[i2], Ay[i2], AN[i2], Ami[i2], Ama[i2]
                if not a2 == "btag":
                    hs["%s_%s" % (a1, a2)] = eval(
                        'TH1F("h%s_%s","h%s_%s;%s;%s",%d,%f,%f)' %
                        (a1, a2, a1, a2, x, y, N, mi, ma))
                else:
                    hs["%s_%s" % (a1, a2)] = TH1F(
                        "h%s_%s" % (a1, a2), "h%s_%s;%s;%s" % (a1, a2, x, y),
                        len(btagbins) - 1, btagbins)
                hs["%s_%s" % (a1, a2)].SetFillColor(fc[a1])
                hs["%s_%s" % (a1, a2)].SetFillStyle(fs[a1])
                hs["%s_%s" % (a1, a2)].SetLineColor(lc[a1])
        #
        hs["sig_etaIdx"].GetXaxis().SetNdivisions(4)
        hs["sig_btagIdx"].GetXaxis().SetNdivisions(4)
        TGaxis.SetMaxDigits(4)

        legs = [
            TLegend(
                1. - gStyle.GetPadRightMargin() - 0.03 - 0.30,
                1. - gStyle.GetPadTopMargin() - 0.03,
                1. - gStyle.GetPadRightMargin() - 0.03,
                1. - gStyle.GetPadTopMargin() - 0.03 - 0.055 * 3,
                "%s selection" % ("Set A" if opts.sel == "NOM" else "Set B"))
        ]
        legs[0].SetTextFont(42)
        legs[0].SetTextSize(0.05)
        legs[0].SetFillStyle(-1)
        legs[0].SetBorderSize(0)
        for i in range(4):
            legs += [deepcopy(legs[0])]
        #
        for var in ["eta", "etaIdx", "btag", "btagIdx"]:
            for typ in ["sig", "bkg"]:
                tin.Draw("%s>>h%s_%s" % (var, typ, var),
                         "abs(pid)==5" if typ == "sig" else "abs(pid)!=5")
        #
        for h in hs.itervalues():
            h.Scale(1. / h.Integral())
            h.GetYaxis().SetRangeUser(
                0.0 if not "Idx" in h.GetName() else 0.1,
                h.GetBinContent(h.GetMaximumBin()) * 1.40)

        hs["sig_btag"] = btagTrafo(hs["sig_btag"], "sig", fc["sig"], fs["sig"],
                                   lc["sig"])
        hs["bkg_btag"] = btagTrafo(hs["bkg_btag"], "bkg", fc["bkg"], fs["bkg"],
                                   lc["bkg"])

        c = TCanvas("c", "c", 1800, 1300)
        c.Divide(2, 2)
        for a1 in ["sig", "bkg"]:
            for i2, a2 in enumerate(["btag", "btagIdx", "eta", "etaIdx"]):
                c.cd(i2 + 1)
                h = hs["%s_%s" % (a1, a2)]
                h.Draw("" if a1 == "sig" else "same")
                gPad.SetGrid(1, 1)
                legs[i2].AddEntry(h, "signal" if a1 == "sig" else "background",
                                  "F")
                if a1 == "bkg": legs[i2].Draw()
                if a2 == "btag":
                    gPad.SetLogy(1)
                    epave("-1", -0.08, 0.000306)
                    epave("-10", -0.135, 0.000306)
        #
        makeDirs(prefix + "/plots")
        c.SaveAs(prefix + "/plots/EvIntDiscriminant_variablesIn%s_%s.pdf" %
                 ("Alt" if opts.alt else "", opts.sel))

        fout.Write(fout.GetName(), TH1.kOverwrite)
        fin.Close()
        fout.Close()

######################################################################################################################################################
######################################################################################################################################################
    if opts.step == 6:
        l1("Step 06%s: %s: weights filling & output plots." %
           (" (Alt)" if opts.alt else "", opts.sel))
        gROOT.SetBatch(1)
        gStyle.SetOptStat(0)
        gStyle.SetOptTitle(0)
        gStyle.SetLineScalePS(2)
        gROOT.ProcessLineSync(".x %s/styleCMSTDR.C" % basepath)
        gStyle.SetPadRightMargin(0.02)
        gStyle.SetPadLeftMargin(0.16)
        gStyle.SetPadTopMargin(0.05)
        gStyle.SetPadBottomMargin(0.12)
        gROOT.SetBatch(1)
        gStyle.SetTitleOffset(1.35, "Y")
        gStyle.SetPalette(1)
        gStyle.SetGridColor(17)
        TGaxis.SetMaxDigits(4)
        gStyle.SetTitleSize(0.05, "XYZ")
        gStyle.SetLabelSize(0.04, "XYZ")
        gStyle.SetTitleOffset(1.35, "Y")
        gStyle.SetGridColor(17)

        #
        fc = {"sig": kBlue - 9, "bkg": kRed}
        fs = {"sig": 1001, "bkg": 3004}
        lc = {"sig": kBlue - 7, "bkg": kRed}
        Ax = [
            "#eta", "#eta rank", "CSV b-tag", "CSV b-tag rank",
            "(old) b-likelihood", "(old) b-likelihood rank", "b-likelihood",
            "b-likelihood rank", "|#eta|", "bbtag", "bblik"
        ]
        Ay = [
            "N / (0.2)", "N / (1)", "N / (0.1)", "N / (1)", "N / (0.08)",
            "N / (1)", "N / (0.08)", "N / (1)", "N / (0.1)", "N / (0.02)",
            "N / (0.01)"
        ]
        AN = [50, 4, 110, 4, 25, 4, 25, 4, 100, 550, 200]
        Ami = [-5, -0.5, -10, -0.5, -1, -0.5, -1, -0.5, 0, -10, -1]
        Ama = [5, 3.5, 1, 3.5, 1, 3.5, 1, 3.5, 5, 1, 1, 1]
        Av = [
            "jetEta", "etaIdx", "jetBtag", "btagIdx",
            "blik%s" % ("NOM" if opts.sel == "NOM" else "VBF"),
            "blik%sIdx" % ("NOM" if opts.sel == "NOM" else "VBF"), "blik",
            "blikIdx", "abseta", "jetBtag", "blik"
        ]
        hs = {}
        btagbinsinput = [-10, -9, -1, 0]
        for i in range(1, int(1. / 0.05) + 1):
            btagbinsinput += [round(float(i) * 0.05, 2)]
        btagbins = array('f', btagbinsinput)
        for a1 in ["sig", "bkg"]:
            for i2, a2 in enumerate([
                    "eta", "etaIdx", "btag", "btagIdx", "blik", "blikIdx",
                    "blik2", "blik2Idx", "abseta", "bbtag", "bblik"
            ]):
                x, y, N, mi, ma = Ax[i2], Ay[i2], AN[i2], Ami[i2], Ama[i2]
                if not a2 == "btag":
                    hs["%s_%s" % (a1, a2)] = eval(
                        'TH1F("h%s_%s","h%s_%s;%s;%s",%d,%f,%f)' %
                        (a1, a2, a1, a2, x, y, N, mi, ma))
                else:
                    hs["%s_%s" % (a1, a2)] = TH1F(
                        "h%s_%s" % (a1, a2), "h%s_%s;%s;%s" % (a1, a2, x, y),
                        len(btagbins) - 1, btagbins)
                hs["%s_%s" % (a1, a2)].SetFillColor(fc[a1])
                hs["%s_%s" % (a1, a2)].SetFillStyle(fs[a1])
                hs["%s_%s" % (a1, a2)].SetLineColor(lc[a1])
        #
        if not opts.replot:
            fglobal = TFile.Open(
                '/'.join([
                    prefix, "rootfiles",
                    basetree.replace(".root",
                                     "_EvIntStep02_%s.root" % opts.sel)
                ]), "read")
            tglobal = fglobal.Get("Hbb/events")
            eta, etaIdx, btag, btagIdx = zeros(1, 'float32'), zeros(
                1, 'float32'), zeros(1, 'float32'), zeros(1, 'float32')
            pid = ROOT.vector('int')()
            reader = TMVA.Reader()
            if opts.alttag == "" or not ("Kostas" in opts.alttag
                                         or "CERN" in opts.alttag):
                reader.AddVariable("btag", btag)
                reader.AddVariable("eta", eta)
                reader.AddVariable("btagIdx", btagIdx)
                reader.AddVariable("etaIdx", etaIdx)
                reader.BookMVA(
                    opts.tmva, "weights/factory_%s%s__BDT_GRAD2.weights.xml" %
                    (opts.sel, "_Alt" if opts.alt else ""))
            elif "Kostas" in opts.alttag:
                reader.AddVariable("btagIdx", btagIdx)
                reader.AddVariable("etaIdx", etaIdx)
                reader.AddVariable("btag", btag)
                reader.AddVariable("eta", eta)
                reader.BookMVA(
                    opts.tmva,
                    "kostas/weights/factory_%s__BDT_GRAD2.weights.xml" %
                    opts.sel)
            elif "CERN" in opts.alttag:
                reader.AddVariable("btagIdx", btagIdx)
                reader.AddVariable("etaIdx", etaIdx)
                reader.AddVariable("btag", btag)
                reader.AddVariable("eta", eta)
                reader.BookMVA(
                    opts.tmva,
                    "tmpcern/factory_BCanditate_%s_BDT_GRAD.weights.xml" %
                    opts.sel)
#                reader.BookMVA(opts.tmva,"weights/kostas.NOM.xml")
#
            blik = ROOT.vector('float')()
            blikIdx = ROOT.vector('int')()
            blikmqq = zeros(1, 'float32')
            blikmbb = zeros(1, 'float32')
            blikdetaqq = zeros(1, 'float32')
            #
            fmvd = TFile.Open(
                prefix +
                "/rootfiles/flatTree_VBFPowheg125_EvIntStep04%s_%s.root" %
                ("Alt" if opts.alt else "", opts.sel), "recreate")
            makeDirsRoot(fmvd, "Hbb")
            gDirectory.cd("Hbb")
            tmvd = tglobal.CloneTree(0)
            #
            tmvd.Branch("blik", blik)
            tmvd.Branch("blikIdx", blikIdx)
            tmvd.Branch("blikmqq", blikmqq, "blikmqq/F")
            tmvd.Branch("blikmbb", blikmbb, "blikmbb/F")
            tmvd.Branch("blikdetaqq", blikdetaqq, "blikdetaqq/F")
            tmvd.Branch("pid", pid)
            #
            nentries = tglobal.GetEntriesFast()
            tref = now()
            for iEv, Ev in enumerate(tglobal):
                blik.resize(4, 0)
                blikIdx.resize(4, 0)
                pid.resize(4, 0)
                #
                if opts.nentries > 0:
                    if iEv > opts.nentries: break
                if iEv % 5000 == 0:
                    [m, s], p = testimate(tref, iEv, nentries)
                    print "%8d/%-10d (est. %dm %ds, %.1f%%)" % (iEv, nentries,
                                                                m, s, p)
                #
                for ijet in range(4):
                    eta[0] = Ev.jetEta[ijet]
                    btag[0] = Ev.jetBtag[ijet]
                    if opts.alt:
                        etaIdx[0] = list(Ev.etaIdx).index(ijet)
                        btagIdx[0] = list(Ev.btagIdx).index(ijet)
                    else:
                        etaIdx[0] = Ev.etaIdx[ijet]
                        btagIdx[0] = Ev.btagIdx[ijet]
                    blik[ijet] = float(reader.EvaluateMVA(opts.tmva))
                #
                blikIdxPair = sorted([[ijet, blik[ijet]] for ijet in range(4)],
                                     key=lambda (x, y): y,
                                     reverse=True)
                #
                for ijet in range(4):
                    blikIdx[ijet] = blikIdxPair[ijet][0]
                #
                for pj in range(len(Ev.partonMatchDR)):
                    if Ev.partonMatchDR[pj] > 0.25: continue
                    ptIdx = Ev.partonMatchIdx[pj]
                    if ptIdx >= len(Ev.btagIdx): continue
                    pid[ptIdx] = Ev.partonId[pj]
                    #                for ijet in range(4):
                    #                    pidVals = sorted([(x,Ev.partonMatchDR[x]) for x in range(len(Ev.partonMatchIdx)) if (Ev.partonMatchIdx[x]==ijet and Ev.partonMatchDR[x]<0.25)],key=lambda (x,y):(y))
                    #                    if len(pidVals)<1: pid[ijet] =-999
                    #                    else: pid[ijet] = Ev.partonId[pidVals[0][0]]
                    #                    if pid[ijet]!=-999:
                    for i2, a2 in enumerate([
                            "eta", "etaIdx", "btag", "btagIdx", "blik",
                            "blikIdx", "blik2", "blik2Idx", "abseta", "bbtag",
                            "bblik"
                    ]):
                        if a2 == "blik": continue
                        h = hs["%s_%s" %
                               ("sig" if abs(pid[ptIdx]) == 5 else "bkg", a2)]
                        if not Av[i2] in ["blik", "blikIdx", "abseta"]:
                            v = eval(
                                "Ev.%s[%d]" %
                                (Av[i2], ptIdx)) if not "Idx" in a2 else eval(
                                    "list(Ev.%s).index(%d)" % (Av[i2], ptIdx))
                        elif Av[i2] == "blik":
                            v = blik[ptIdx]
                        elif Av[i2] == "blikIdx":
                            v = list(blikIdx).index(ptIdx)
                        elif Av[i2] == "abseta":
                            v = abs(Ev.jetEta[ptIdx])
                        elif Av[i2] == "bbtag":
                            v = Ev.jetBtag[ptIdx]
                        elif Av[i2] == "bblik":
                            v = blik[ptIdx]
                        h.Fill(v)
                #
#                v = [TLorentzVector(),TLorentzVector(),TLorentzVector(),TLorentzVector()]
#                for j in range(4):
#                    k = blikIdx[j]
#                    v[j].SetPtEtaPhiM(Ev.jetPt[k],Ev.jetEta[k],Ev.jetPhi[k],Ev.jetMass[k])
                v = []
                for jid in range(4):
                    v += [TLorentzVector()]
                    v[-1].SetPtEtaPhiM(Ev.jetPt[jid], Ev.jetEta[jid],
                                       Ev.jetPhi[jid], Ev.jetMass[jid])
                blikmqq[0] = (v[blikIdx[2]] + v[blikIdx[3]]).M()
                blikmbb[0] = (v[blikIdx[0]] + v[blikIdx[1]]).M()
                blikdetaqq[0] = abs(Ev.jetEta[int(blikIdx[2])] -
                                    Ev.jetEta[int(blikIdx[3])])
                tmvd.Fill()
        else:
            fmvd = TFile.Open(
                prefix +
                "/rootfiles/flatTree_VBFPowheg125_EvIntStep04%s_%s.root" %
                ("Alt" if opts.alt else "", opts.sel), "update")
            gDirectory.cd("Hbb")
            tmvd = fmvd.Get("Hbb/events")
            for a1 in ["sig", "bkg"]:
                for i2, a2 in enumerate([
                        "eta", "etaIdx", "btag", "btagIdx", "blik", "blikIdx",
                        "blik2", "blik2Idx"
                ]):
                    eval('h%s_%s = fmvd.Get("Hbb/h%s_%s")' % (a1, a2, a1, a2))
        #
        c = TCanvas("c", "c", 1800, 1500)
        c.Divide(4, 4)
        Bv = [
            "blikNOM" if opts.sel == "NOM" else "blikVBF",
            "blikNOMIdx" if opts.sel == "NOM" else "blikVBFIdx", "blik",
            "blikIdx", "mqq[0]",
            "mqq[%d]" % (1 if opts.sel == "NOM" else 2), "blikmqq", "NONE",
            "dEtaqq[0]",
            "dEtaqq[%d]" % (1 if opts.sel == "NOM" else 2), "blikdetaqq",
            "NONE", "mbb[0]",
            "mbb[%d]" % (1 if opts.sel == "NOM" else 2), "blikmbb", "NONE"
        ]
        Bx = [
            "(old) b-likelihood", "(old) b-likelihood rank", "b-likelihood",
            "b-likelihood rank", "(CSV) m_{qq'} (GeV)", "(old) m_{qq'} (GeV)",
            "(new) m_{qq'} (GeV)", "", "(CSV) #Delta#eta_{qq'}",
            "(old) #Delta#eta_{qq'}", "(new) #Delta#eta_{qq'}", "",
            "(CSV) m_{b#bar{b}} (GeV)", "(old) m_{b#bar{b}} (GeV)",
            "(new) m_{b#bar{b}} (GeV)", ""
        ]
        By = [
            "N / (0.08)", "N / (1)", "N / (0.08)", "N / (1)", "N / (20 GeV)",
            "N / (20 GeV)", "N / (20 GeV)", "", "N / (0.1)", "N / (0.1)",
            "N / (0.1)", "", "N / (10 GeV)", "N / (10 GeV)", "N / (10 GeV)", ""
        ]
        BN = [25, 4, 25, 4, 100, 100, 100, 0, 50, 50, 50, 0, 30, 30, 30, 0]
        Bmi = [-1, -0.5, -1, -0.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        Bma = [
            1, 3.5, 1, 3.5, 2000, 2000, 2000, 0, 5, 5, 5, 0, 300, 300, 300, 0
        ]
        Bt = [
            "(existing)", "(existing)", "(new)", "(new)", "(existing)",
            "(existing)", "(new)", "", "(existing)", "(existing)", "(new)", "",
            "(existing)", "(existing)", "(new)", ""
        ]
        for iv, v in enumerate(Bv):
            if v == "blikNOM" or v == "blikVBF": continue
            if v == "NONE": continue
            c.cd(iv + 1)
            gPad.SetGrid(1, 1)
            tmvd.Draw("%s>>h%d(%d,%f,%f)" %
                      (v, iv + 1, BN[iv], Bmi[iv], Bma[iv]))
            eval('h%d.GetXaxis().SetTitle("%s")' % (iv + 1, Bx[iv]))
            eval('h%d.GetYaxis().SetTitle("%s")' % (iv + 1, By[iv]))
            trpave(Bt[iv])

        makeDirs(prefix + "/plots")
        c.SaveAs(prefix +
                 "/plots/EvIntDiscriminant_variablesOut%s%s-1_%s.pdf" %
                 ("Alt" if opts.alt else "",
                  opts.alttag if not opts.alttag == "" else "", opts.sel))
        c.Close()

        ci = TCanvas("ci", "ci", 900, 750)
        #        c.Divide(2,1)
        Bv = [
            "blikmbb:mbb[0]",
            "mbb[%d]:mbb[0]" % (1 if opts.sel == "NOM" else 2)
        ]
        Bx = ["CSV b-tag m_{b#bar{b}} (GeV)", "CSV b-tag m_{b#bar{b}} (GeV)"]
        By = [
            "b-likelihood m_{b#bar{b}} (GeV)",
            "b-likelihood m_{b#bar{b}} (GeV)"
        ]
        BN = [[140, 140], [140, 140]]
        Bmi = [[0, 0], [0, 0]]
        Bma = [[700, 700], [700, 700]]
        Bt = ["(new)", "(existing)"]
        for iv, v in enumerate(Bv):
            if v == "NONE": continue
            #            c.cd(iv+1)
            ci.cd()
            tmvd.Draw(
                "%s>>h%d(%d,%f,%f,%d,%f,%f)" %
                (v, iv + 1 + 12, BN[iv][0], Bmi[iv][0], Bma[iv][0], BN[iv][1],
                 Bmi[iv][1], Bma[iv][1]), "", "colz")
            gPad.SetRightMargin(0.14)
            gPad.SetTopMargin(0.06)
            gPad.SetBottomMargin(0.14)
            eval('ROOT.h%d.GetXaxis().SetTitle("%s")' % (iv + 1 + 12, Bx[iv]))
            eval('ROOT.h%d.GetYaxis().SetTitle("%s")' % (iv + 1 + 12, By[iv]))
            eval('ROOT.h%d.GetXaxis().SetTitleOffset(%.2f)' %
                 (iv + 1 + 12, 1.1))
            #trpave(Bt[iv])
            tlpave("Set %s selection" % ("A" if opts.sel == "NOM" else "B"),
                   0.85, 1)
            eval('ROOT.h%d.GetZaxis().SetRangeUser(1,4000)' % (iv + 1 + 12))
            gPad.SetLogz(1)

            ci.SaveAs(prefix +
                      "/plots/EvIntDiscriminant_variablesOut%s%s-2%s_%s.pdf" %
                      ("Alt" if opts.alt else "",
                       opts.alttag if not opts.alttag == "" else "",
                       "-new" if iv == 0 else "-existing", opts.sel))
        #ci.Close()

        cb = TCanvas("cb", "cb", 1800, 750)
        cb.Divide(2, 1)
        c = TCanvas("c", "c", 2700, 1950)
        c.Divide(3, 3)
        for a1 in ["sig", "bkg"]:
            for i2, a2 in enumerate([
                    "eta", "etaIdx", "btag", "btagIdx", "blik", "blikIdx",
                    "blik2", "blik2Idx", "abseta", "bbtag", "bblik"
            ]):
                h = hs["%s_%s" % (a1, a2)]
                if "Idx" in a2: h.GetXaxis().SetNdivisions(4)
                if not h.Integral() == 0: h.Scale(1. / h.Integral())
                h.GetYaxis().SetRangeUser(
                    0.001 if a2 in ["btag", "blik", "blik2", "bbtag", "bblik"
                                    ] else 0.0,
                    h.GetBinContent(h.GetMaximumBin()) *
                    (75 if a2 in ["btag", "blik", "blik2", "bbtag", "bblik"]
                     else 1.4))

        legs = [
            TLegend(
                1. - gStyle.GetPadRightMargin() - 0.03 - 0.30,
                1. - gStyle.GetPadTopMargin() - 0.03,
                1. - gStyle.GetPadRightMargin() - 0.03,
                1. - gStyle.GetPadTopMargin() - 0.03 - 0.055 * 3,
                "%s selection" % ("Set A" if opts.sel == "NOM" else "Set B"))
        ]
        legs[0].SetTextFont(42)
        legs[0].SetTextSize(0.05)
        legs[0].SetFillStyle(-1)
        legs[0].SetBorderSize(0)
        for i in range(8):
            legs += [deepcopy(legs[0])]

        hsigbtagnew = btagTrafo(hs["sig_btag"], "sig", fc["sig"], fs["sig"],
                                lc["sig"])
        hbkgbtagnew = btagTrafo(hs["bkg_btag"], "bkg", fc["bkg"], fs["bkg"],
                                lc["bkg"])

        for i2, a2 in enumerate([
                "blik2", "blik2Idx", "blikIdx", "btag", "btagIdx", "NONE",
                "eta", "etaIdx", "NONE"
        ]):
            if a2 == "blik2": cb.cd(1)
            elif a2 == "blik2Idx": cb.cd(2)
            else: c.cd(i2 + 1)
            for a1 in ["sig", "bkg"]:
                gPad.SetRightMargin(0.02)
                gPad.SetBottomMargin(0.12)
                if a2 == "NONE": continue
                h = hs["%s_%s" % (a1, a2)]
                if a2 == "btag" and a1 == "sig": h = hsigbtagnew
                elif a2 == "btag" and a1 == "bkg": h = hbkgbtagnew
                gPad.SetGrid(1, 1)
                if a2 in ["btag", "blik", "blik2"]: gPad.SetLogy(1)
                else: gPad.SetLogy(0)
                h.Draw("" if a1 == "sig" else "same")
                legs[i2].AddEntry(h, "signal" if a1 == "sig" else "background",
                                  "F")
                if a1 == "bkg": legs[i2].Draw()
                h.GetXaxis().SetTitleSize(0.05)
                h.GetYaxis().SetTitleSize(0.05)
                h.GetXaxis().SetTitleOffset(1.1)
                h.GetYaxis().SetTitleOffset(1.35)
                h.GetXaxis().SetLabelSize(0.04)
                h.GetYaxis().SetLabelSize(0.04)
                if a2 == "btag":
                    epave("-1", -0.08, 0.000306)
                    epave("-10", -0.13, 0.000306)
                gPad.Update()
                if "blik2" in a2 and a1 == "bkg":
                    cb.SaveAs(
                        prefix +
                        "/plots/EvIntDiscriminant_variablesOut%s%s-3a_%s.pdf" %
                        ("Alt" if opts.alt else "", opts.
                         alttag if not opts.alttag == "" else "", opts.sel))

        c.SaveAs(prefix +
                 "/plots/EvIntDiscriminant_variablesOut%s%s-3_%s.pdf" %
                 ("Alt" if opts.alt else "",
                  opts.alttag if not opts.alttag == "" else "", opts.sel))

        c = TCanvas("c", "c", 900, 750)
        c.cd()
        legs = [
            TLegend(
                gStyle.GetPadLeftMargin() + 0.05,
                gStyle.GetPadBottomMargin() + 0.05,
                gStyle.GetPadLeftMargin() + 0.3,
                gStyle.GetPadBottomMargin() + 0.05 + 0.050 * 4,
                "%s selection" % ("Set A" if opts.sel == "NOM" else "Set B"))
        ]
        legs[0].SetTextFont(42)
        legs[0].SetTextSize(0.045)
        legs[0].SetFillStyle(0)
        legs[0].SetBorderSize(0)
        gs = {}
        for i2, a2 in enumerate(["bblik", "bbtag", "abseta"]):
            hsig = hs["sig_%s" % a2]
            hbkg = hs["bkg_%s" % a2]
            g = makeGraph(hsig, hbkg,
                          "right" if not a2 == "abseta" else "left")
            g.Write()
            gs[a2] = g
            legs[0].AddEntry(
                g, "b-likelihood" if "blik" in a2 else
                ("CSV b-tag" if a2 == "bbtag" else "|#eta|"), "L")
            g.Draw("A,L" if i2 == 0 else "same,L")
        legs[0].Draw()
        legs[0].SetY2(legs[0].GetY1() + legs[0].GetNRows() * 0.050 + 0.05)
        gPad.Update()
        c.SaveAs(prefix +
                 "/plots/EvIntDiscriminant_variablesOut%s%s-4_%s.pdf" %
                 ("Alt" if opts.alt else "",
                  opts.alttag if not opts.alttag == "" else "", opts.sel))

        if opts.replot:
            for i in range(20):
                h = eval("ROOT.h%d" % (i))
                if h: h.Write(h.GetName(), TH1.kOverwrite)
            for a1 in ["sig", "bkg"]:
                for i2, a2 in enumerate([
                        "blik2", "blik2Idx", "blikIdx", "btag", "btagIdx",
                        "NONE", "eta", "etaIdx", "NONE"
                ]):
                    if a2 == "NONE": continue
                    h = hs["%s_%s" % (a1, a2)]
                    if h: h.Write(h.GetName(), TH1.kOverwrite)
            for g in gs.itervalues():
                if g: g.Write(g.GetName(), TH1.kOverwrite)
        else:
            fmvd.Write()
        #
        fmvd.Close()

######################################################################################################################################################
######################################################################################################################################################
    if opts.step == 7:
        l1("Step 07%s: %s: more plots." %
           (" (Alt)" if opts.alt else "", opts.sel))
        gROOT.SetBatch(1)
        gStyle.SetOptStat(0)
        gStyle.SetLineScalePS(2)
        gROOT.ProcessLineSync(".x %s/styleCMSTDR.C" % basepath)
        gStyle.SetPadRightMargin(0.02)
        gStyle.SetPadLeftMargin(0.16)
        gStyle.SetPadTopMargin(0.05)
        gStyle.SetPadBottomMargin(0.12)
        gROOT.SetBatch(1)
        gStyle.SetTitleOffset(1.35, "Y")
        gStyle.SetTitleSize(0.05, "XYZ")
        gStyle.SetLabelSize(0.04, "XYZ")
        gStyle.SetPalette(1)
        gStyle.SetGridColor(17)
        TGaxis.SetMaxDigits(4)

        fin = TFile.Open(
            "rootfiles/bjetId_%s_MVA%s.root" %
            (opts.sel, "Alt" if opts.alt else ""), "read")
        tin = fin.Get("TestTree")
        fout = TFile.Open(
            prefix + "/rootfiles/flatTree_VBFPowheg125_EvIntStep07%s_%s.root" %
            ("Alt" if opts.alt else "", opts.sel), "recreate")

        NTrue = float(tin.GetEntries("classID==0"))
        NFake = float(tin.GetEntries("classID==1"))

        V = ["btag", "btag", "abs(eta)", "abs(eta)", "BDT_GRAD2", "BDT_GRAD2"]
        Av = [
            "btagTrue", "btagFake", "etaTrue", "etaFake", "blikTrue",
            "blikFake"
        ]
        Ax = [
            "CSV b-tag", "CSV b-tag", "|#eta|", "|#eta|", "b-likelihood",
            "b-likelihood"
        ]
        Ay = [
            "N / (0.05)", "N / (0.05)", "N / (0.2)", "N / (0.2)", "N / (0.08)",
            "N / (0.08)"
        ]
        Ami = [0, 0, 0, 0, -1, -1]
        Ama = [1, 1, 5, 5, 1, 1]
        AN = [20, 20, 25, 25, 25, 25]
        hs = {}
        for a in range(len(Av)):
            hs["%s" % Av[a]] = TH1F("h%s" % Av[a],
                                    "h%s;%s;%s" % (Av[a], Ax[a], Ay[a]), AN[a],
                                    Ami[a], Ama[a])
            h = hs["%s" % Av[a]]
            if "True" in Av[a]:
                h.SetLineColor(kBlue)
                h.SetFillColor(kBlue - 9)
                h.SetFillStyle(1001)
            elif "Fake" in Av[a]:
                h.SetLineColor(kRed)
                h.SetFillColor(kRed)
                h.SetFillStyle(3004)
        for v in range(len(V)):
            tin.Draw("%s>>h%s" % (V[v], Av[v]),
                     "classID==0" if "True" in Av[v] else "classID==1")
            if "True" in Av[v]: hs[Av[v]].Scale(1. / NTrue)
            elif "Fake" in Av[v]: hs[Av[v]].Scale(1. / NFake)

        c = TCanvas("c", "c", 900, 1950)
        c.Divide(1, 3)
        legs = [
            TLegend(
                1. - gStyle.GetPadRightMargin() - 0.03 - 0.30,
                1. - gStyle.GetPadTopMargin() - 0.03,
                1. - gStyle.GetPadRightMargin() - 0.03,
                1. - gStyle.GetPadTopMargin() - 0.03 - 0.055 * 3,
                "%s selection" % ("Set A" if opts.sel == "NOM" else "Set B"))
        ]
        legs[0].SetTextFont(42)
        legs[0].SetTextSize(0.05)
        legs[0].SetFillStyle(-1)
        legs[0].SetBorderSize(0)
        for i in range(20):
            legs += [deepcopy(legs[0])]
        for a in range(len(Av)):
            c.cd(divmod(a + 2, 2)[0])
            h = hs["%s" % Av[a]]
            h.Draw("" if "True" in Av[a] else "same")
            legs[divmod(a + 2, 2)[0]].AddEntry(
                h, "signal" if "True" in Av[a] else "background", "F")
            if "Fake" in Av[a]: legs[divmod(a + 2, 2)[0]].Draw()
            if "btag" in Av[a] or "blik" in Av[a]:
                if "True" in Av[a]:
                    h.GetYaxis().SetRangeUser(
                        0.001,
                        h.GetBinContent(h.GetMaximumBin()) * 75)
                gPad.SetLogy(1)
            else:
                if "True" in Av[a]:
                    h.GetYaxis().SetRangeUser(
                        0.0,
                        h.GetBinContent(h.GetMaximumBin()) * 1.4)
                gPad.SetLogy(0)
        c.SaveAs("plots/performance%s-1_%s.pdf" %
                 ("Alt" if opts.alt else "", opts.sel))
        c.Close()

        xtrue = [0.] * 1000
        yfake = [0.] * 1000

        c = TCanvas("c", "c", 900, 750)
        c.cd()
        legs = [
            TLegend(
                gStyle.GetPadLeftMargin() + 0.05,
                gStyle.GetPadBottomMargin() + 0.05,
                gStyle.GetPadLeftMargin() + 0.3,
                gStyle.GetPadBottomMargin() + 0.05 + 0.050 * 4,
                "%s selection" % ("Set A" if opts.sel == "NOM" else "Set B"))
        ]
        legs[0].SetTextFont(42)
        legs[0].SetTextSize(0.045)
        legs[0].SetFillStyle(-1)
        legs[0].SetBorderSize(0)
        for i in range(20):
            legs += [deepcopy(legs[0])]
        gs = {}
        for a in range(len(Av)):
            if "True" in Av[a]:
                xtrue = [0.] * 1000
                yfake = [0.] * 1000
                for i in range(hs[Av[a]].GetNbinsX()):
                    xtrue[i] = hs[Av[a]].Integral(i, hs[Av[a]].GetNbinsX())
                    if "eta" in Av[a]: xtrue[i] = 1. - xtrue[i]
            elif "Fake" in Av[a]:
                for i in range(hs[Av[a]].GetNbinsX()):
                    yfake[i] = 1. - hs[Av[a]].Integral(i,
                                                       hs[Av[a]].GetNbinsX())
                    if "eta" in Av[a]: yfake[i] = -yfake[i] + 1.
                gs[Av[a][0:-4]] = TGraph(
                    hs[Av[a]].GetNbinsX(),
                    array('f', xtrue[0:hs[Av[a]].GetNbinsX()]),
                    array('f', yfake[0:hs[Av[a]].GetNbinsX()]))
                g = gs[Av[a][0:-4]]
                g.SetLineColor(kRed if "btag" in Av[a] else (
                    kGreen + 2 if "eta" in Av[a] else kBlue))
        gPad.SetGrid(1, 1)
        gs["btag"].GetXaxis().SetLimits(0.7, 1.05)
        gs["btag"].GetYaxis().SetRangeUser(0.0, 1.1)
        gs["btag"].GetXaxis().SetTitle("Efficiency of matched b-jets")
        gs["btag"].GetYaxis().SetTitle("Rejection of matched non b-jets")
        gs["btag"].GetXaxis().SetNdivisions(504)
        gs["btag"].Draw("AL")
        gs["eta"].Draw("sameL")
        gs["blik"].Draw("sameL")
        legs[-1].AddEntry(gs["btag"], "CSV b-tag", "L")
        legs[-1].AddEntry(gs["eta"], "|#eta|", "L")
        legs[-1].AddEntry(gs["blik"], "b-likelihood", "L")
        legs[-1].Draw()

        c.SaveAs("plots/performance%s-2_%s.pdf" %
                 ("Alt" if opts.alt else "", opts.sel))
        c.Close()

        c1s = fin.Get("CorrelationMatrixS")
        c1b = fin.Get("CorrelationMatrixB")

        gStyle.SetGridColor(kBlack)
        c = TCanvas("c", "c", 900 * 2, 850 * 1)
        c.Divide(2, 1)
        c.cd(1)
        gPad.SetGrid(1, 1)
        gPad.SetTopMargin(0.14)
        gPad.SetRightMargin(0.13)
        c1s.SetMarkerColor(kBlack)
        c1s.Draw("colz,text")
        epavetext([
            "Correlation matrix (signal)",
            "%s selection" % ("Set A" if opts.sel == "NOM" else "Set B")
        ], 0.03, 0.88, 0.5, 0.97)
        epavetext(["Linear correlation coefficients in %"], 0.52, 0.85, 0.99,
                  0.89, 0.025, 0)
        gPad.Update()
        gPad.RedrawAxis()
        c.cd(2)
        gPad.SetGrid(1, 1)
        gPad.SetTopMargin(0.14)
        gPad.SetRightMargin(0.13)
        c1b.SetMarkerColor(kBlack)
        c1b.Draw("colz,text")
        epavetext([
            "Correlation matrix (background)",
            "%s selection" % ("Set A" if opts.sel == "NOM" else "Set B")
        ], 0.03, 0.88, 0.5, 0.97)
        epavetext(["Linear correlation coefficients in %"], 0.52, 0.85, 0.99,
                  0.89, 0.025, 0)
        gPad.Update()
        gPad.RedrawAxis()

        c.SaveAs("plots/performance%s-3_%s.pdf" %
                 ("Alt" if opts.alt else "", opts.sel))
        c.Close()
        gStyle.SetGridColor(17)

        fout.Write(fout.GetName(), TH1.kOverwrite)
        fin.Close()
        fout.Close()
Пример #21
0
def mkTemplateFunctions():
    mp = parser()
    opts, fout, samples = main(mp, False, False, True)

    jsons = INTERNALprepare(opts)
    markers, colours = INTERNALstyle()

    TYPE = opts.typetag
    samples = INTERNALpicksamples(opts, jsons)

    hDat, hRat, fFit, gUnc, fitter, covariant = INTERNALhistograms(opts)
    c1, c2, c = INTERNALcanvases(opts)
    can = TCanvas("main", "main")

    ln = INTERNALline("1", float(opts.fBound[0]), float(opts.fBound[1]))

    for iTag, Tag in enumerate(opts.catTags):
        nCat = int(opts.mvaBins['mva%s' % Tag][0]) - 1
        rCat = 0 if Tag == 'NOM' else 4
        selsamples = [s for s in samples if s['incarnation'] == Tag]
        fins = [x['tfile'] for x in selsamples]
        l1('Running for %s - QCD' % Tag)

        c2[Tag] = TCanvas('transfer_sel%s_%s' % (Tag, TYPE),
                          'transfer_sel%s_%s' % (Tag, TYPE), 600 * (nCat - 1),
                          600)
        c2[Tag].Divide(nCat - 1, 1)

        leg = INTERNALlegend(Tag)
        leg.SetX1(0.7)
        lleg = dict(
            ((Tag, iCat + 1), INTERNALlegend(Tag)) for iCat in range(nCat - 1))

        for iCat in range(nCat):
            jCat = iCat + rCat
            if opts.merge:
                if iCat == nCat - 1: continue
                if iCat == nCat - 2: jCat = jCat * 10 + jCat + 1
            l2('Running for CAT%d' % jCat)
            #			v = jsons['vars']['variables'][opts.variables[opts.variables.keys()[iTag]][0]]

            # regular hists
            #			if v['xs']: hDat[(Tag,iCat)] = TH1F('hDat_sel%s_CAT%d'%(Tag,iCat),'hDat_sel%s_CAT%d'%(Tag,iCat),int(v['nbins_x']),v['xs'])
            #			else: hDat[(Tag,iCat)] = TH1F('hDat_sel%s_CAT%d'%(Tag,iCat),'hDat_sel%s_CAT%d'%(Tag,iCat),int(v['nbins_x']),int(v['xmin']),int(v['xmax']))
            hDat[(Tag, iCat)] = TH1F(
                'hDat_sel%s_CAT%d_%s' % (Tag, jCat, TYPE),
                'hDat_sel%s_CAT%d_%s' % (Tag, jCat, TYPE),
                int(float(opts.fBound[1]) - float(opts.fBound[0])) /
                (10 if 'Dat' in TYPE else 20), float(opts.fBound[0]),
                float(opts.fBound[1]))
            print hDat[(Tag, iCat)].GetBinWidth(1)
            h = hDat[(Tag, iCat)]
            h = INTERNALstyleHist(h, iCat, markers, colours, TYPE)
            can.cd()
            # cut
            CUT = TCut("mva%s>%.2f && mva%s<=%.2f" %
                       (Tag, float(opts.mvaBins["mva%s" % Tag][1][iCat + 1]),
                        Tag, float(opts.mvaBins["mva%s" % Tag][1][iCat + 2])))
            if opts.merge:
                CUT = TCut(
                    "mva%s>%.2f && mva%s<=%.2f" %
                    (Tag, float(opts.mvaBins["mva%s" % Tag][1][iCat + 1]), Tag,
                     float(opts.mvaBins["mva%s" % Tag][1][iCat + 3])))

            ###CUT = TCut("mvaNOM>%.2f && mvaNOM<=%.2f"%(float(opts.mvaBins["mva%s"%Tag][1][iCat+1]),float(opts.mvaBins["mva%s"%Tag][1][iCat+2])))
            l3('Cutting with: %s' % CUT)
            for fin in fins:
                l4('Sample: %s' % fin.GetName())
                CUT2, cutlabel = write_cuts(
                    ["None"], ["None"],
                    reftrig=["None"],
                    sample=jsons['samp']['files'][os.path.split(
                        fin.GetName())[1]]['tag'],
                    jsonsamp=opts.jsonsamp,
                    jsoncuts=opts.jsoncuts,
                    weight=opts.complexWghts[(Tag, 'old')],
                    trigequal=trigTruth(opts.usebool))
                l4('Cutting with: %s' % CUT2)

                # drawing
                tin = fin.Get("Hbb/events")
                l3('Drawing mbbReg[%d] --> %s' %
                   (1 if 'NOM' in Tag else 2, h.GetName()))
                tin.Draw(
                    "mbbReg[%d]>>+%s" %
                    (1 if 'NOM' in Tag else 2, h.GetName()),
                    TCut(CUT) * TCut(CUT2))
            fout.cd()
            ###tin.Draw("mbbReg[1]>>%s"%(h.GetName()),CUT)
            if not opts.unblind: h = INTERNALblind(h, 100., 150.)
            h.Scale(1. / h.Integral())
            h.SetDirectory(0)

            # ratio hist
            hRat[(Tag, iCat)] = h.Clone(h.GetName().replace('hDat', 'hRat'))
            r = hRat[(Tag, iCat)]
            r.SetTitle(r.GetName())
            r = INTERNALstyleHist(r, iCat, markers, colours, TYPE)

            # dividing by control CAT
            ##print "Divide: ", hDat[(Tag,0)].GetName()
            r.Divide(hDat[(Tag, 0)])
            r.SetDirectory(0)

            # fit
            fFit[(Tag, iCat)] = TF1(h.GetName().replace('hDat', 'fitRatio'),
                                    'pol1', float(opts.fBound[0]),
                                    float(opts.fBound[1]))
            f = fFit[(Tag, iCat)]
            f.SetLineColor(colours[iCat])

            h.Write(h.GetTitle(), TH1.kOverwrite)

            if not iCat == 0:
                r.Fit(f, "RQ")
                fitter = TVirtualFitter.GetFitter()
                covariant = TMatrixDSym()
                covariant.Use(fitter.GetNumberTotalParameters(),
                              fitter.GetCovarianceMatrix())
                nBins = 200
                dx = (r.GetBinLowEdge(r.GetNbinsX() + 1) -
                      r.GetBinLowEdge(1)) / float(nBins)
                vx = array(
                    'f',
                    [r.GetBinLowEdge(1) + (i + 1) * dx for i in range(nBins)])
                vy = array('f', [f.Eval(vx[i]) for i in range(nBins)])
                vex = array('f', [0.0] * nBins)
                vey = array('f', [
                    sqrt(
                        pow(vx[i], 2) * covariant(1, 1) +
                        2.0 * vx[i] * covariant(0, 1) + covariant(0, 0))
                    for i in range(nBins)
                ])

                gUnc[(Tag, iCat)] = TGraphErrors(nBins, vx, vy, vex, vey)
                g = gUnc[(Tag, iCat)]
                g.SetFillColor(colours[iCat])
                g.SetFillStyle(3004)

                c1[Tag].cd()
                h.Draw('same E')
                hDat[(Tag, 0)].GetYaxis().SetRangeUser(
                    0.0,
                    max(h.GetMaximum(), hDat[(Tag, 0)].GetMaximum()) * 1.02)
                gPad.Update()
                leg.AddEntry(h, 'CAT%d' % jCat, 'P')
                c2[Tag].cd(iCat)
                ln.Draw()
                g.Draw('same E3')
                r.Draw('same')
                ll = lleg[(Tag, iCat)]
                ll.AddEntry(h, 'CAT%d / CAT%d' % (jCat, rCat), 'P')
                ll.SetY1(ll.GetY2() - ll.GetNRows() * 0.06)
                ll.SetTextSize(0.04)
                ll.Draw()
                r.GetYaxis().SetRangeUser(0.0, 2.0)
                r.Write(r.GetTitle(), TH1.kOverwrite)
                g.Write(r.GetTitle().replace('hRat', 'gRat'), TH1.kOverwrite)
            else:
                c1[Tag] = TCanvas('MbbShape_sel%s_%s' % (Tag, TYPE),
                                  'MbbShape_sel%s_%s' % (Tag, TYPE), 900, 600)
                c1[Tag].cd()
                gPad.SetLeftMargin(0.12)
                gPad.SetRightMargin(0.03)
                h.GetYaxis().SetTitleOffset(0.8)
                h.SetFillColor(kGray)
                h.Draw('hist')
                leg.AddEntry(h, 'CAT%d' % jCat, 'F')

            fout.cd()
            f.Write(f.GetName(), TH1.kOverwrite)

        c1[Tag].cd()
        leg.SetY1(leg.GetY2() - leg.GetNRows() * 0.06)
        leg.Draw()
        c1[Tag].SaveAs('plots/transfer/%s%s.png' %
                       (c1[Tag].GetName(), "_merged" if opts.merge else ""))
        c1[Tag].SaveAs('plots/transfer/%s%s.pdf' %
                       (c1[Tag].GetName(), "_merged" if opts.merge else ""))
        c2[Tag].SaveAs('plots/transfer/%s%s.png' %
                       (c2[Tag].GetName(), "_merged" if opts.merge else ""))
        c2[Tag].SaveAs('plots/transfer/%s%s.pdf' %
                       (c2[Tag].GetName(), "_merged" if opts.merge else ""))

    #c.SaveAs('plots/transfer/%s.png'%c.GetName())

# clean
    for f in samples:
        f['tfile'].Close()
    fout.Close()
Пример #22
0
def mkBDTcorrelations():
    mp = parser()
    opts, fout, samples = main(mp, False, False, True)

    sels = ['NOM', 'VBF']
    jsons = INTERNALprepare(opts)
    markers, colours = INTERNALstyle()

    selsamples = INTERNALpicksamples(opts, jsons)

    can = TCanvas("main", "main", 650, 600)
    hProf = INTERNALhistograms(opts, sels, jsons)
    #INTERNALcanvases(opts)

    l1("Creating profiles")
    if not opts.read:
        for isel, sel in enumerate(sels):
            ssel = [s for s in selsamples if sel in s['fname']]

            for s in ssel:
                l2("Running for %s" % s['tag'])

                cut, cutlabel = write_cuts(["None"], ["None"],
                                           reftrig=["None"],
                                           sample=s['tag'],
                                           jsonsamp=opts.jsonsamp,
                                           jsoncuts=opts.jsoncuts,
                                           weight=opts.complexWghts[(sel,
                                                                     'old')],
                                           trigequal=trigTruth(opts.usebool))
                #cut = re.findall('\*.*',cut)[0][2:-1].replace('pu','ev.pu').replace('trig','ev.trig')
                if opts.debug:
                    l3("Cut %s: \n\t\t\t%s%s%s: \n\t\t\t%s" %
                       (s['tag'], blue, cutlabel, plain, cut))

                cutextra = "mbbReg[%d]>=80. && mbbReg[%d]<=200." % (
                    1 if sel == 'NOM' else 2, 1 if sel == 'NOM' else 2)

                for v in [
                        jsons['vars']['variables'][vv] for vv in opts.variable
                ]:
                    if sel == 'NOM' and '[2]' in v['root']: continue
                    if sel == 'VBF' and '[1]' in v['root']: continue
                    if 'mva' in v and not sel in v: continue

                    s['tree'].Draw(
                        "%s:%s>>+%s" %
                        (v['root'], "mva%s" % sel,
                         hProf[(sel, v['var'], 'BDT', 'QCD'
                                if 'QCD' in s['fname'] else 'DAT')].GetName()),
                        TCut(cutextra) * TCut(cut), "prof")
                    if 'mbbReg' in v['var']: continue
                    s['tree'].Draw(
                        "%s:%s>>+%s" %
                        (v['root'], "mbbReg[%d]" % (1 if sel == 'NOM' else 2),
                         hProf[(sel, v['var'], 'mbbReg', 'QCD'
                                if 'QCD' in s['fname'] else 'DAT')].GetName()),
                        TCut(cutextra) * TCut(cut), "prof")

    else:
        for k in hProf.iterkeys():
            hProf[k] = fout.Get("h%s_sel%s_%s_%s" % (k[3], k[0], k[1], k[2]))

    k = list(set([x[0:3] for x in hProf.iterkeys()]))
    for ik in k:
        low = min(
            hProf[(ik[0], ik[1], ik[2],
                   'QCD')].GetBinContent(hProf[(ik[0], ik[1], ik[2],
                                                'QCD')].GetMinimumBin()),
            hProf[(ik[0], ik[1], ik[2],
                   'DAT')].GetBinContent(hProf[(ik[0], ik[1], ik[2],
                                                'DAT')].GetMinimumBin()))
        hig = max(
            hProf[(ik[0], ik[1], ik[2],
                   'QCD')].GetBinContent(hProf[(ik[0], ik[1], ik[2],
                                                'QCD')].GetMaximumBin()),
            hProf[(ik[0], ik[1], ik[2],
                   'DAT')].GetBinContent(hProf[(ik[0], ik[1], ik[2],
                                                'DAT')].GetMaximumBin()))
        med = hProf[(ik[0], ik[1], ik[2], 'DAT')].GetMean(2)
        dif = hig - low
        setlow = med - 1.6 * dif
        sethig = med + 1.6 * dif
        if not 'cos' in ik[1]:
            setlow = max(setlow, 0)

        limits = {
            'dEtaqq1': [2, 7, 2, 7],
            'dPhiqq1': [0, 3, 0, 3],
            'jetBtag00': [0.5, 1.2, 0.8, 1.0],
            'jetBtag01': [0.0, 1.2, 0.55, 0.75],
            'jetQGLNOM0': [0, 1, 0.5, 0.65],
            'jetQGLNOM1': [0, 1, 0.35, 0.55],
            'jetQGLNOM2': [0, 1, 0.5, 0.7],
            'jetQGLNOM3': [0, 1, 0.5, 0.7],
            'mqq1': [0, 2500, 500, 800],
            'mbbReg1': [115, 145, 115, 145],
            'cosTheta1': [-0.35, 0.35, -0.2, 0.2],
            'jetQGLVBF0': [0, 1, 0.4, 0.55],
            'jetQGLVBF1': [0, 1, 0.3, 0.5],
            'jetQGLVBF2': [0, 1, 0.55, 0.75],
            'jetQGLVBF3': [0, 1, 0.5, 0.7],
            'mqq2': [0, 2500, 1000, 1300],
            'mbbReg2': [115, 145, 115, 145],
            'cosTheta2': [-0.35, 0.35, -0.2, 0.2],
            'dEtaqq2': [2, 7, 2, 7],
            'dPhiqq2': [0, 3, 0, 3],
            'softHt': [0, 100, 25, 50],
            'softN2': [0, 10, 4, 7]
        }  #[3,7,4,6], [0,3,1,2] [0,3,1.5,2.5]
        if ik[1] in limits:
            if ik[2] == 'BDT':
                setlow = limits[ik[1]][0]
                sethig = limits[ik[1]][1]
            else:
                setlow = limits[ik[1]][0]  #2]
                sethig = limits[ik[1]][1]  #3]
#		if 'jetBtag01' in ik[1] and ik[0]=='VBF' and ik[2]=='mbbReg':
#			setlow = 0.4
#			sethig = 0.55

        hProf[(ik[0], ik[1], ik[2],
               'DAT')].GetYaxis().SetRangeUser(setlow, sethig)
        hProf[(ik[0], ik[1], ik[2], 'DAT')].GetYaxis().SetTitleOffset(1.4)
        hProf[(ik[0], ik[1], ik[2], 'DAT')].GetXaxis().SetTitleOffset(1.0)
        hProf[(ik[0], ik[1], ik[2], 'DAT')].GetYaxis().SetNdivisions(507)
        hProf[(ik[0], ik[1], ik[2], 'DAT')].GetXaxis().SetNdivisions(507)
        hProf[(ik[0], ik[1], ik[2], 'DAT')].Draw("axis")
        h = INTERNALgraph(hProf[(ik[0], ik[1], ik[2], 'DAT')])
        h.SetMarkerStyle(20)
        h.SetMarkerSize(0.8)
        h.SetMarkerColor(kBlack)
        h.SetLineColor(kBlack)
        h.SetFillStyle(0)
        h.Draw("same pz")
        g = INTERNALgraph(hProf[(ik[0], ik[1], ik[2], 'QCD')])
        #		hProf[(ik[0],ik[1],ik[2],'QCD')].SetMarkerStyle(25)
        #		hProf[(ik[0],ik[1],ik[2],'QCD')].SetMarkerColor(kBlue)
        #		hProf[(ik[0],ik[1],ik[2],'QCD')].Draw("same e")
        g.SetMarkerStyle(25)
        g.SetMarkerColor(kBlue)
        g.SetLineColor(kBlue)
        g.SetFillStyle(0)
        g.Draw("same pz")

        leg = TLegend(0.62, 0.75, 0.9, 0.92,
                      "%s selection" % (ik[0].strip('sel')))
        leg.SetFillStyle(-1)
        leg.SetBorderSize(0)
        leg.SetTextFont(42)
        leg.SetTextSize(0.045)
        #leg.AddEntry(hProf[(ik[0],ik[1],ik[2],'DAT')],'Data')
        #leg.AddEntry(hProf[(ik[0],ik[1],ik[2],'QCD')],'QCD')
        leg.AddEntry(h, 'Data', 'LP')
        leg.AddEntry(g, 'QCD', 'LP')
        leg.SetY1(leg.GetY2() - (leg.GetNRows() + 1) * 0.05)
        leg.Draw()

        can.SaveAs(
            "plots/%s.png" %
            hProf[(ik[0], ik[1], ik[2], 'DAT')].GetName().replace('hDAT', 'h'))
        can.SaveAs(
            "plots/%s.pdf" %
            hProf[(ik[0], ik[1], ik[2], 'DAT')].GetName().replace('hDAT', 'h'))

    fout.cd()
    for h in hProf.itervalues():
        h.Write(h.GetName(), TH1.kOverwrite)

# clean
    fout.Close()
Пример #23
0
def get2DMap(opts,fout,samples,variables,sel,trg,ref,vx,vy):
	# info 
	l1("Creating 2D maps for (%s,%s):"%(vx[0],vy[0]))
	print "+ (sel,trg,ref): (%s,%s,%s)"%(sel,trg,ref)
	jsoninfo = json.loads(filecontent(opts.jsoninfo))
	groups = list(set([jsoninfo['groups'][x['tag']] for x in samples]))
	samplesbygroup = {}
	paves = []
	for group in groups:
		samplesbygroup[group] = [sample for sample in samples if jsoninfo['groups'][sample['tag']]==group]
	ratios = []
	if 'JetMon' in groups and 'QCD' in groups:
		ratios += ['JetMon-QCD']
# storage
	gDirectory.cd("%s:/"%fout.GetName())
	for group in groups:
		makeDirsRoot(fout,'2DMaps/%s'%group)
# calculate
	xvals = array('f',[float(x) for x in vx[1].split("#")])
	yvals = array('f',[float(x) for x in vy[1].split("#")])
	maps = {}
	cuts = {}
	inroot('TTree *t = 0;')
# style
	gStyle.SetPalette(20) #13
	gStyle.SetPaintTextFormat("7.2f")
# To Save
	if opts.notext: canvas = TCanvas("cmap","cmap",1600,1200)
	else: canvas = TCanvas("cmap","cmap",1800,1200)
	gStyle.SetLineScalePS(2.2)
	canvas.cd()
	set_palette()
	gPad.SetGrid(0,0)
	if not opts.notext: gPad.SetRightMargin(0.25)
	else: gPad.SetRightMargin(0.12)
	print gPad.GetTopMargin()
	gPad.SetTopMargin(0.065)
# LOOP over ALL GROUPS
	itest = 0
	for group in groups:
		l2("Filling for group: %s%s%s"%(purple,group,plain))
		maps[group] = {}
		cuts[group] = {}
		for tag in ['Num','Den','Rat']:
			if opts.numonly and not tag=='Num': continue
			trg,trg_orig = trigData(opts,'',trg)
			mapname = "2DMap_%s-%s_s%s-t%s-r%s-d%s_%s-%s"%(group,tag,'-'.join(sorted(sel)),'-'.join(trg_orig),'-'.join(ref),'-'.join(trg),vx[0],vy[0])
			maptitle = "%s;%s;%s"%(mapname,variables[vx[0]]['title_x'],variables[vy[0]]['title_x'])
			trg = dc(trg_orig)
			maps[group][tag] = fout.FindObjectAny(mapname)
			if (not maps[group][tag]) or (not len(xvals)-1==maps[group][tag].GetXaxis().GetNbins()) or (not len(yvals)-1==maps[group][tag].GetYaxis().GetNbins()) or opts.redo:
				maps[group][tag] = TH2F(mapname,maptitle,len(xvals)-1,xvals,len(yvals)-1,yvals)
				maps[group][tag].Sumw2()
## LOOP over ALL SAMPLES
				for s in sorted(samplesbygroup[group],key=lambda x:('QCD' in x['tag'],not 'WJets' in x['tag'],jsoninfo['crosssections'][x['tag']])):
					if tag=='Rat': continue
					l3("Filling for sample: %s%s (%s)%s"%(cyan,s['tag'],tag,plain))
					trg,trg_orig = trigData(opts,s,trg)
					inroot('t = (TTree*)%s.gett();'%s['pointer'])	
					cuts[group][tag] = write_cuts(sel,trg if tag=='Num' else [],sample=s['tag'],jsonsamp=opts.jsonsamp,jsoncuts=opts.jsoncuts,reftrig=ref,trigequal=trigTruth(opts.usebool),weight=opts.weight)[0] #,varskip=[variables[vx[0]]['root'],variables[vy[0]]['root']]
					if opts.debug: print yellow,cuts[group][tag],plain
					inroot('t->Draw("%s:%s>>+%s",TCut("%s"));'%(variables[vy[0]]['root'],variables[vx[0]]['root'],maps[group][tag].GetName(),cuts[group][tag]))
					trg = dc(trg_orig)
			else:
				l3("Loaded from file for group: %s%s%s"%(cyan,group,plain))
## END LOOP over ALL SAMPLES
		# to save
		path = '%s/../trigger/plots/%s/2DMaps/%s'%(basepath,fout.GetName().split('/')[-1][:-5],group)
		makeDirs(path)
		if not opts.numonly:
			# ratio
##CHECK THIS!!!##			
			maps[group]['Rat'].Divide(maps[group]['Num'],maps[group]['Den'],1.0,1.0,'B')
##ALTERNATIVE#			for ix in range(0,maps[group]['Num'].GetNbinsX()+1):
##ALTERNATIVE#				for iy in range(0,maps[group]['Num'].GetNbinsX()+1):
##ALTERNATIVE#					v1 = maps[group]['Num'].GetBinContent(ix,iy)
##ALTERNATIVE#					ev1 = maps[group]['Num'].GetBinError(ix,iy)
##ALTERNATIVE#					v2 = maps[group]['Den'].GetBinContent(ix,iy)
##ALTERNATIVE#					ev2 = maps[group]['Den'].GetBinError(ix,iy)
##ALTERNATIVE#					if not v2 == 0: 
##ALTERNATIVE#						div = v1/v2
##ALTERNATIVE#						ediv = sqrt(div*(1.-div)/v2)*ev2/sqrt(v2)
##ALTERNATIVE#					else: 
##ALTERNATIVE#						div = 0
##ALTERNATIVE#						ediv = 0
##ALTERNATIVE#					maps[group]['Rat'].SetBinContent(ix,iy,div)
##ALTERNATIVE#					maps[group]['Rat'].SetBinError(ix,iy,ediv)
 
	#$		maps[group]['Rat'] = TEfficiency(maps[group]['Num'],maps[group]['Den'])
			maps[group]['Rat'].SetName(mapname)
			maps[group]['Rat'].SetTitle(maptitle)
			# save		
		gDirectory.cd('%s:/2DMaps/%s'%(fout.GetName(),group))
		for tag in ['Num','Den','Rat']:
			if opts.numonly and not tag=='Num': continue
			if not tag in maps[group]: continue
#$			if tag=='Rat': 
#$				maps[group][tag].Paint("colz,text90,error")
#$				maps[group][tag].GetPaintedHistogram().SetTitleOffset(1.0,"Y")
#$			else: maps[group][tag].SetTitleOffset(1.0,"Y")
			#maps[group][tag].GetXaxis().SetTitle(variables[vx[0]]['title_x'])
			#maps[group][tag].GetYaxis().SetTitle(variables[vy[0]]['title_x'])
			maps[group][tag].SetTitleSize(maps[group][tag].GetTitleSize("X")*1.1,"XY")
			maps[group][tag].SetTitleOffset(maps[group][tag].GetTitleOffset()*1.0 if not opts.notext else maps[group][tag].GetTitleOffset()*1.05,"X")
			maps[group][tag].SetTitleOffset(maps[group][tag].GetTitleOffset()*1.0 if not opts.notext else maps[group][tag].GetTitleOffset()*(1.14 if not "VBF" in trg else 1.00),"Y")
			if "VBF" in trg: maps[group][tag].SetLabelSize(maps[group][tag].GetLabelSize("X")*0.95,"X")
			#maps[group][tag].SetTitleOffset(maps[group][tag].GetTitleOffset()*0.8,"Z")
			maps[group][tag].SetMarkerSize((1.25 if not ('mqq' in vx[0] or 'mqq' in vy[0]) else 0.85) if not (group=='QCD' and not tag=='Rat') else 1.0)
			if "VBF" in trg: maps[group][tag].SetMarkerSize(maps[group][tag].GetMarkerSize()*0.95)
			maps[group][tag].GetXaxis().SetTickLength(0.03)
			maps[group][tag].GetYaxis().SetTickLength(0.016)
			maps[group][tag].GetZaxis().SetRangeUser(0,0.8 if not "VBF" in trg else 1.0)
			maps[group][tag].GetYaxis().SetNdivisions(505 if not 'VBF' in trg else 507)
			maps[group][tag].SetTitle("")
			if 'VBF' in trg:
				gPad.SetLogx(1)
				maps[group][tag].GetXaxis().SetMoreLogLabels()
				maps[group][tag].SetMarkerSize(maps[group][tag].GetMarkerSize()*0.75)
			gStyle.SetHistMinimumZero(kFALSE)
			if maps[group][tag].GetEntries()==0: maps[group][tag].SetBinContent(0,0,-1e-16)
			maps[group][tag].SetMinimum(0.0 if not "VBF" in trg else 0.0)
			maps[group][tag].SetMaximum(0.8 if not "VBF" in trg else 1.0)
			maps[group][tag].SetContour(999)
			set_palette()
			maps[group][tag].Draw("colz,text,error")
			grid = mapgrid(maps[group][tag],2,2 if not "VBF" in trg else 1,5)
			
			gPad.Update()
			try:
				palette = maps[group][tag].GetListOfFunctions().FindObject("palette")
				palette.SetX1NDC(0.89 - (0.13 if not opts.notext else 0.0))
				palette.SetX2NDC(0.93 - (0.13 if not opts.notext else 0.0))
				palette.SetY1NDC(0.1)
				palette.SetY2NDC(0.935)
				maps[group][tag].GetZaxis().SetTickLength(0.02)
				gPad.Update()
			except:
				continue
			canvas.Modified()
			canvas.Update()

			if not opts.notext:
				text,selleg = addText(opts,group,tag,vx,vy,sel,trg,ref)
				text.Draw("same")
				selleg.Draw("same")
			ttl = topleft("Set %s trigger efficiency (%s)"%("A" if not "VBF" in trg else "B","data" if not "QCD" in group else "simulation"))
			ttr = topright("%.1f fb^{-1} (8 TeV)"%(19.8 if not "VBF" in trg else 18.3))

			maps[group][tag].Write(maps[group][tag].GetName(),TH1.kOverwrite)
			canvas.SaveAs('%s/%s%s.png'%(path,maps[group][tag].GetName(),'' if not opts.notext else '_noleg'))
			canvas.SaveAs('%s/%s%s.pdf'%(path,maps[group][tag].GetName(),'' if not opts.notext else '_noleg'))
			gStyle.SetHistMinimumZero(kTRUE)
			l3("Written %s map to (eog %s/%s%s.png)"%(tag,path,maps[group][tag].GetName(),'' if not opts.notext else '_noleg'))
# END LOOP over ALL GROUPS

# FOCUS ON RATIO MAPS JetMon / QCD
	gDirectory.cd("%s:/"%fout.GetName())
	for ratio in ratios:
		if opts.numonly: continue
		# store
		makeDirsRoot(fout,'2DMaps/%s'%ratio)
		maps[ratio] = {}
		l2("Getting ratio for: %s%s%s"%(purple,ratio,plain))
		# create
		trg,trg_orig = trigData(opts,'',trg)
		mapname = "2DMap_%s-%s_s%s-t%s-r%s-d%s_%s-%s"%(ratio,'Rat','-'.join(sorted(sel)),'-'.join(trg_orig),'-'.join(ref),'-'.join(trg),vx[0],vy[0])
		maptitle = "%s;%s;%s"%("",variables[vx[0]]['title_x'],variables[vy[0]]['title_x']) #mapname
		trg = dc(trg_orig)
		maps[ratio]['Rat'] = TH2F(mapname,maptitle,len(xvals)-1,xvals,len(yvals)-1,yvals)
		maps[ratio]['Rat'].Sumw2()
#$		maps[ratio]['Rat'].Divide(maps[ratio.split('-')[0]]['Rat'].GetPaintedHistogram(),maps[ratio.split('-')[1]]['Rat'].GetPaintedHistogram())
		maps[ratio]['Rat'].Divide(maps[ratio.split('-')[0]]['Rat'],maps[ratio.split('-')[1]]['Rat'])

###### CORRECTION FACTOR
#####		for ix in range(maps[ratio]['Rat'].GetNbinsX()+1):
#####			for iy in range(maps[ratio]['Rat'].GetNbinsY()+1):
#####				x = maps[ratio]['Rat'].GetXaxis().GetBinCenter(ix)
#####				y = maps[ratio]['Rat'].GetYaxis().GetBinCenter(iy)
#####				if y >= 3.5	and y < 4.0: maps[ratio]['Rat'].SetBinContent(ix,iy,maps[ratio]['Rat'].GetBinContent(ix,iy)*1.0/0.8)
#####				elif y >= 4.0	and y < 4.5: maps[ratio]['Rat'].SetBinContent(ix,iy,maps[ratio]['Rat'].GetBinContent(ix,iy)*1.0/0.92)
#####				elif y >= 4.5	and y < 5.0: maps[ratio]['Rat'].SetBinContent(ix,iy,maps[ratio]['Rat'].GetBinContent(ix,iy)*1.0/1.0)
#####				elif y >= 5.0	and y < 5.5: maps[ratio]['Rat'].SetBinContent(ix,iy,maps[ratio]['Rat'].GetBinContent(ix,iy)*1.0/1.15)

		# plot
		canvas.cd()
		#maps[ratio]['Rat'].GetXaxis().SetTitle(variables[vx[0]]['title_x'])
		#maps[ratio]['Rat'].GetYaxis().SetTitle(variables[vy[0]]['title_x'])
		maps[ratio]['Rat'].SetMarkerSize(1.25 if not ('mqq' in vx[0] or 'mqq' in vy[0]) else 0.85)
		maps[ratio]['Rat'].SetTitleSize(maps[ratio]['Rat'].GetTitleSize("X")*1.1,"XY")
		maps[ratio]['Rat'].SetTitleOffset(maps[ratio]['Rat'].GetTitleOffset()*1.0 if not opts.notext else maps[ratio]['Rat'].GetTitleOffset()*1.05,"X")
		maps[ratio]['Rat'].SetTitleOffset(maps[ratio]['Rat'].GetTitleOffset()*1.0 if not opts.notext else maps[ratio]['Rat'].GetTitleOffset()*(1.14 if not "VBF" in trg else 1.00),"Y")
		if "VBF" in trg: maps[ratio]['Rat'].SetLabelSize(maps[ratio]['Rat'].GetLabelSize("X")*0.95,"X")
		if "VBF" in trg: maps[ratio]['Rat'].SetMarkerSize(maps[ratio]['Rat'].GetMarkerSize()*0.95)
		maps[ratio]['Rat'].GetXaxis().SetTickLength(0.03)
		maps[ratio]['Rat'].GetYaxis().SetTickLength(0.016)
		maps[ratio]['Rat'].GetZaxis().SetRangeUser(0,1.4 if not "VBF" in trg else 2.0)
		maps[ratio]['Rat'].GetYaxis().SetNdivisions(505 if not 'VBF' in trg else 507)
		if 'VBF' in trg:
			gPad.SetLogx(1)
			maps[ratio]['Rat'].GetXaxis().SetMoreLogLabels()
			maps[ratio]['Rat'].SetMarkerSize(maps[ratio]['Rat'].GetMarkerSize()*0.75)
		gStyle.SetHistMinimumZero(kFALSE)
		set_palette()
		maps[ratio]['Rat'].Draw('colz,error,text')
		maps[ratio]['Rat'].SetMinimum(0.6 if not "VBF" in trg else 0.0)
		maps[ratio]['Rat'].SetMaximum(1.4 if not "VBF" in trg else 1.6)
		grid = mapgrid(maps[ratio]['Rat'],2,2 if not "VBF" in trg else 1,4)
		#for ix in range(1,maps[ratio]['Rat'].GetNbinsX()+1):
		#	for iy in range(1,maps[ratio]['Rat'].GetNbinsY()+1):
		#		if maps[ratio]['Rat'].GetBinContent(ix,iy)==0: 
		#			pave = TPave(maps[ratio]['Rat'].GetXaxis().GetBinCenter(ix)-0.033,maps[ratio]['Rat'].GetYaxis().GetBinCenter(iy)-0.03,maps[ratio]['Rat'].GetXaxis().GetBinCenter(ix)+0.033,maps[ratio]['Rat'].GetYaxis().GetBinCenter(iy)+0.03,0)
		#			pave.SetFillColor(kWhite)
		#			pave.SetFillStyle(1001)
		#			canvas.cd()
		#			pave.Draw()
		#			paves += [pave]
			
		gPad.Update()
		maps[ratio]['Rat'].GetZaxis().SetTickLength(0.02)
		palette = maps[ratio]['Rat'].GetListOfFunctions().FindObject("palette")
		palette.SetX1NDC(0.89 - (0.11 if not opts.notext else 0.0))
		palette.SetX2NDC(0.93 - (0.11 if not opts.notext else 0.0))
		palette.SetY1NDC(0.1)
		palette.SetY2NDC(0.935)
		gPad.Update()
		canvas.Modified()
		canvas.Update()

		if not opts.notext:
			text,selleg = addText(opts,'Data / QCD','SF',vx,vy,sel,trg,ref)
			text.Draw("same")
			selleg.Draw("same")
		ttl = topleft("Set %s trigger efficiency (data/simulation)"%("A" if not "VBF" in trg else "B"))
		ttr = topright("%.1f fb^{-1} (8 TeV)"%(19.8 if not "VBF" in trg else 18.3))
		
		# save		
		gDirectory.cd('%s:/2DMaps/%s'%(fout.GetName(),ratio))
		maps[ratio]['Rat'].Write(maps[ratio]['Rat'].GetName(),TH1.kOverwrite)

		path = "%s/../trigger/plots/%s/2DMaps/%s"%(basepath,fout.GetName().split('/')[-1][:-5],ratio)
		makeDirs(path)
		for tag in ['Num','Den','Rat']:
			if not tag in maps[ratio]: continue
			canvas.SaveAs("%s/%s%s.png"%(path,maps[ratio][tag].GetName(),'' if not opts.notext else '_noleg'))
			canvas.SaveAs("%s/%s%s.pdf"%(path,maps[ratio][tag].GetName(),'' if not opts.notext else '_noleg'))
		gStyle.SetHistMinimumZero(kTRUE)
		l2("Written map to (eog %s/%s%s.png)"%(path,maps[ratio]['Rat'].GetName(),'' if not opts.notext else '_noleg'))
#		canvas.Close()

	# clean
	canvas.Close()
Пример #24
0
def datamc():
    # options
    mp = parser()
    opts, fout, samples, variables = main.main(mp, False, True, True)

    # root setup
    ROOTsetup()
    eps = 0.0001

    # samples / variables
    ji, jv, js, Lsamples = loadSamples(opts, samples)
    Lvariables = {
        k: v
        for (k, v) in variables.iteritems() if k in opts.variable
    }

    # canvas
    can = TCanvas("c", "c", 900, 750)
    can.cd()

    # histos
    histos = hists(Lsamples, Lvariables, opts.selection)
    stacks = {}

    ##################################################
    l1("Filling histograms")
    for s in opts.selection:
        for t in opts.trigger:
            # cms paves
            pcms1, pcms2 = FormatCMSPaves(opts, s)
            ####        # cuts
            ####        cut,cutlabel = write_cuts(s,t,reftrig=["None"],sample=Lsamples[Lsamples.keys()[0]]['i']['tag'],jsonsamp=opts.jsonsamp,jsoncuts=opts.jsoncuts,weight=opts.weight,trigequal=trigTruth(opts.usebool))
            ####        cut1,cut2 = cut.split(' * ')[0][1:],cut.split(' * ')[1][:-1]
            ##################################################
            # sample loop
            for sn, si in sorted(Lsamples.iteritems()):
                l2("Sample: %s" % sn)
                st = si['i']['tag']
                sg = si['g']
                ca, calabel = write_cuts(s,
                                         t,
                                         reftrig=["None"],
                                         sample=st,
                                         jsonsamp=opts.jsonsamp,
                                         jsoncuts=opts.jsoncuts,
                                         weight=opts.weight,
                                         trigequal=trigTruth(opts.usebool))
                ca1, ca2 = ca.split(' * ')[0][1:], ca.split(' * ')[1][:-1]
                n = si['t'].GetEntries()
                print ca2
                # variable loop
                for vn, vi in sorted(Lvariables.iteritems()):
                    l3(vn)
                    ht = hTag(st, vn, s[0])
                    si['t'].Draw("%s>>%s" % (vi['root'], ht), "%s" % ca2)
##################################################
# stacking
            for sn, si in sorted(Lsamples.iteritems()):
                sg = si['g']
                st = si['i']['tag']
                for vn, vi in sorted(Lvariables.iteritems()):
                    hg = hTag(sg, vn, s[0])
                    ht = hTag(st, vn, s[0])
                    Hg = histos[hg]
                    Ht = histos[ht]
                    Hg.Add(Ht)
##################################################
# k-factor
            INTEGRALS = {"Data": 0.0, "QCD": 0.0, "Other": 0.0, "TTJets": 0.0}
            if "KF" in opts.weight[1] and not ('TP' in t[0]):
                #print "if"
                for ig, g in enumerate(
                        list(set([x['g']
                                  for (k, x) in Lsamples.iteritems()]))):
                    var = Lvariables.keys()[0]
                    hg = hTag(g, var, s[0])
                    if g == "VBF125": continue
                    elif g == "Data":
                        INTEGRALS["Data"] += float(histos[hg].Integral())
                    elif g == "QCD":
                        INTEGRALS["QCD"] += float(histos[hg].Integral())
                    else:
                        INTEGRALS["Other"] += float(histos[hg].Integral())
                kfactor = (INTEGRALS["Data"] -
                           INTEGRALS["Other"]) / INTEGRALS["QCD"]
                l1("K-factor: %.2f" % kfactor)
            elif "KF" in opts.weight[1]:
                #print "elif"
                for ig, g in enumerate(
                        list(set([x['g']
                                  for (k, x) in Lsamples.iteritems()]))):
                    var = Lvariables.keys()[0]
                    hg = hTag(g, var, s[0])
                    if g == "VBF125": continue
                    elif g == "Data":
                        INTEGRALS["Data"] += float(histos[hg].Integral())
                    elif g == "TTJets":
                        INTEGRALS["TTJets"] += float(histos[hg].Integral())
                    else:
                        INTEGRALS["Other"] += float(histos[hg].Integral())
                kfactor = (INTEGRALS["Data"] -
                           INTEGRALS["Other"]) / INTEGRALS["TTJets"]
                l1("K-factor: %.2f" % kfactor)
##################################################
# groups
            l1("Group iteration")
            can.Clear()
            for vn, vi in sorted(Lvariables.iteritems()):
                fout.cd()
                # set pads
                p1, p2 = FormatPads(can)
                ##################################################
                # top pad
                p1.cd()
                # containers
                l2("Variable: %s" % (vn))
                DRAW = {}
                hs = "s_v%s_c%s" % (vn, s[0])
                S = THStack(hs, hs)
                L = TLegend(gStyle.GetPadLeftMargin() + 0.03, 0.5,
                            gStyle.GetPadLeftMargin() + 0.03 + 0.23 * 3,
                            1. - gStyle.GetPadTopMargin() - 0.025)
                FormatLegend(L)
                # group loop
                for ig, g in enumerate(
                        sorted(list(
                            set([x['g'] for (k, x) in Lsamples.iteritems()])),
                               key=lambda y:
                               (not '125' in y, not 'WJets' in y, histos[hTag(
                                   y, vn, s[0])].Integral()))):
                    l3("%s" % (g))
                    hg = hTag(g, vn, s[0])
                    Hg = histos[hg]
                    print Hg.Integral()
                    # underflow
                    Hg.SetBinContent(
                        1, 0.5 * (Hg.GetBinContent(0) + Hg.GetBinContent(1)))
                    Hg.SetBinError(
                        1,
                        sqrt(
                            pow(Hg.GetBinError(0), 2.) +
                            pow(Hg.GetBinError(1), 2.)))
                    # overflow
                    Hg.SetBinContent(
                        Hg.GetNbinsX(),
                        0.5 * (Hg.GetBinContent(Hg.GetNbinsX()) +
                               Hg.GetBinContent(Hg.GetNbinsX() + 1)))
                    Hg.SetBinError(
                        Hg.GetNbinsX(),
                        sqrt(
                            pow(Hg.GetBinError(Hg.GetNbinsX()), 2.) +
                            pow(Hg.GetBinError(Hg.GetNbinsX() + 1), 2.)))
                    # type handling
                    if g == "Data":
                        Hg.SetMarkerStyle(20)
                        Hg.SetMarkerColor(kBlack)
                        Hg.SetMarkerSize(1.2)
                        DRAW["Data"] = Hg
                    elif g == "VBF125":
                        Hg.SetLineStyle(1)
                        Hg.SetLineColor(ji['colours'][g])
                        Hg.SetLineWidth(3)
                        Hg.Scale(10.)
                        DRAW["SIG"] = Hg
                    elif g == "GF125":
                        Hg.SetLineStyle(7)
                        Hg.SetLineColor(ji['colours'][g])
                        Hg.SetLineWidth(3)
                        Hg.Scale(10.)
                        DRAW["SIGGF"] = Hg
                    else:
                        Hg.SetLineStyle(1)
                        Hg.SetLineColor(kBlack)
                        Hg.SetFillStyle(1001)
                        Hg.SetFillColor(ji['colours'][g])
                        if g == "QCD" and (not "TP"
                                           in t[0]) and "KF" in opts.weight[1]:
                            Hg.Scale(kfactor)
                        if g == "TTJets" and (
                                "TP" in t[0]) and "KF" in opts.weight[1]:
                            Hg.Scale(kfactor)
                        if not Hg.GetEntries() == 0: S.Add(Hg)
                # Full stack (bkg)
                DRAW["BKG"] = S
                S.Draw()
                Sall = FormatStack(S)
                # MC err
                histos[hTag("MCerr", vn,
                            s[0])] = Sall.Clone(hTag("MCerr", vn, s[0]))
                Hg = histos[hTag("MCerr", vn, s[0])]
                Hg.SetFillStyle(3004)
                Hg.SetFillColor(kGray + 2)  #kBlack)
                Hg.SetMarkerSize(0)
                DRAW["MCerr"] = Hg
                # Fill legend
                L.AddEntry(histos[hTag("Data", vn, s[0])], "Data", "P")
                L.AddEntry(
                    histos[hTag("QCD", vn, s[0])], "%s%s" %
                    ("QCD", " (x%.2f)" % kfactor if
                     ("KF" in opts.weight[1] and not "TP" in t[0]) else ""),
                    "F")
                L.AddEntry(histos[hTag("ZJets", vn, s[0])], "%s" % ("ZJets"),
                           "F")
                L.AddEntry(histos[hTag("VBF125", vn, s[0])], "10x VBF H(125)",
                           "L")
                if hTag("Tall", vn, s[0]) in histos:
                    L.AddEntry(
                        histos[hTag("Tall", vn, s[0])], "%s%s" %
                        ("T", " (x%.2f)" % kfactor if
                         ("KF" in opts.weight[1] and "TP" in t[0]) else ""),
                        "F")
                else:
                    L.AddEntry(
                        histos[hTag("TTJets", vn, s[0])], "%s%s" %
                        ("TTJets", " (x%.2f)" % kfactor if
                         ("KF" in opts.weight[1] and "TP" in t[0]) else ""),
                        "F")
                L.AddEntry(histos[hTag("WJets", vn, s[0])], "%s" % ("WJets"),
                           "F")
                L.AddEntry(histos[hTag("GF125", vn, s[0])], "10x GF H(125)",
                           "L")
                if not hTag("Tall", vn, s[0]) in histos:
                    L.AddEntry(histos[hTag("singleT", vn, s[0])],
                               "%s" % ("singleT"), "F")
                L.AddEntry(histos[hTag("MCerr", vn, s[0])], "MC stat. unc.",
                           "F")
                # Draw
                DRAW["BKG"].Draw("hist")
                DRAW["Data"].Draw("PE,same")
                DRAW["SIG"].Draw("hist,same")
                DRAW["SIGGF"].Draw("hist,same")
                DRAW["MCerr"].Draw("E2,same")
                # Edit legend
                L.SetY1(L.GetY2() - L.GetNRows() * 0.04)
                L.Draw()
                # Draw paves
                pcms1.Draw()
                pcms2.Draw()
                # Edit canvas
                gPad.SetLogy(1)
                gPad.RedrawAxis()
                p1.Write(p1.GetName() +
                         ("NOM" if "NOM" in opts.selection[0] else "VBF") + vn)
                ##################################################
                # bottom pad
                p2.cd()
                # histo = 1
                one = DRAW["Data"].Clone("one")
                for ibin in range(0, one.GetNbinsX() + 2):
                    one.SetBinContent(ibin, 1.)
                    one.SetBinError(ibin, 0.)
                # ratio Data/MC - 1
                rat = DRAW["Data"].Clone(DRAW["Data"].GetName().replace(
                    'h', 'hRat'))
                FormatRatio(rat)
                rat.Divide(DRAW["BKG"].GetStack().Last())
                rat.Add(one, -1.)
                histos[hTag("Data/MC", vn, s[0])] = rat
                # ratio MCerr/MC - 1
                ratMCerr = histos[hTag("MCerr", vn, s[0])].Clone("ratMCerr")
                ratMCerr.Divide(DRAW["BKG"].GetStack().Last())
                ratMCerr.Add(one, -1.)
                histos[hTag("MCerrDataMC", vn, s[0])] = ratMCerr
                # Draw
                rat.Draw()
                ratMCerr.Draw("E2,same")
                # Edit pad
                rat.GetYaxis().SetRangeUser(-1.0 + eps, 1.0 - eps)
                gPad.SetGridy(1)
                gPad.Update()
                line = TF1("l1", "0.", gPad.GetUxmin(), gPad.GetUxmax())
                line.SetLineColor(kBlack)
                line.Draw("same")
                gPad.RedrawAxis()
                ##################################################
                # save
                plotdir = "./plots/%s" % s[0]
                if not os.path.exists(plotdir): makeDirs(plotdir)
                can.SaveAs("%s/%s_s%s.pdf" % (plotdir, vn, s[0]))
                can.SaveAs("%s/%s_s%s.png" % (plotdir, vn, s[0]))
                fout.cd()
                can.Clear()

##################################################
# clean
    can.Close()
    closeSamples(Lsamples)
Пример #25
0
def mkSBSigTrees(): 
# initialise
    global paves
    mp = parser()
    opts,fout = main.main(mp,True)
    fname = fout.GetName()
    fout.Close()
    os.remove(fname)
    prefix = basepath+'/../mvd'
    basetree = "flatTree_VBFPowheg125.root"

    makeDirs('/'.join([prefix,"rootfiles"]))
    makeDirs('/'.join([prefix,"plots"]))
        
######################################################################################################################################################
######################################################################################################################################################
# step 01: NOM/PRK selection
    if opts.step==1:
        fin = TFile.Open('/'.join([opts.globalpath,basetree]),"read")
        tin = fin.Get("Hbb/events")

        l1("Step 01: %s selection"%opts.sel)

        fout = TFile.Open('/'.join([prefix,"rootfiles",basetree.replace(".root","_EvIntStep01_%s.root"%opts.sel)]),"recreate")
        makeDirsRoot(fout,"Hbb")
        gDirectory.cd("Hbb")

        #cut,label = write_cuts(opts.selection[0],opts.trigger[0],reftrig=[],jsoncuts=opts.jsoncuts,jsonsamp=opts.jsonsamp,sample="VBF125",weight=opts.weight,trigequal=trigTruth(True))
        cut,label = write_cuts([],opts.trigger[0],reftrig=[],jsoncuts=opts.jsoncuts,jsonsamp=opts.jsonsamp,sample="VBF125",weight=opts.weight,trigequal=trigTruth(True))
        l2("Cut %s: %s"%(opts.sel,cut))

        tout = tin.CopyTree(cut)
        fout.Write()

        fin.Close()
        fout.Close()
        
######################################################################################################################################################
######################################################################################################################################################
    if opts.step==2:
        fin = TFile.Open('/'.join([prefix,"rootfiles",basetree.replace(".root","_EvIntStep01_%s.root"%opts.sel)]),"read")
        tin = fin.Get("Hbb/events")

        l1("Step 02: %s: eta/btag variable only slimming"%(opts.sel))

        tin.SetBranchStatus('*',0)
        for b in ['jetBtag','btagIdx','jetEta','etaIdx','partonId','partonMatchIdx','partonMatchDR','jetPt','jetPhi','jetMass','blikNOMIdx','blikVBFIdx','mqq','mbb','dEtaqq']:
            tin.SetBranchStatus(b,1)

        fout = TFile.Open('/'.join([prefix,"rootfiles",basetree.replace(".root","_EvIntStep02_%s.root"%(opts.sel))]),"recreate")
        makeDirsRoot(fout,"Hbb")
        gDirectory.cd("Hbb")

        tout = tin.CloneTree()
        fout.Write(fout.GetName(),TH1.kOverwrite)

        fin.Close()
        fout.Close()

######################################################################################################################################################
######################################################################################################################################################
    if opts.step==3:
        fin = TFile.Open('/'.join([prefix,"rootfiles",basetree.replace(".root","_EvIntStep02_%s.root"%(opts.sel))]),"read")
        tin = fin.Get("Hbb/events")
        nin = tin.GetEntriesFast()

        l1("Step 03%s: %s: jets tree transformation"%(" (Alt)" if opts.alt else "",opts.sel))

        fout = TFile.Open('/'.join([prefix,"rootfiles",basetree.replace(".root","_EvIntStep03%s_%s.root"%("Alt" if opts.alt else "",opts.sel))]),"recreate")
        makeDirsRoot(fout,"Hbb")
        gDirectory.cd("Hbb")

        v_eta,v_btag,v_pt,v_phi,v_mass = zeros(1,dtype='float32'),zeros(1,dtype='float32'),zeros(1,dtype='float32'),zeros(1,dtype='float32'),zeros(1,dtype='float32')
        v_etaIdx,v_btagIdx,v_pid,v_ptIdx = zeros(1,dtype='int32'),zeros(1,dtype='int32'),zeros(1,dtype='int32'),zeros(1,dtype='int32')
# new branches
        tout = TTree("jets","jets")
        tout.Branch("eta",v_eta,"eta/F")
        tout.Branch("etaIdx",v_etaIdx,"etaIdx/I")
        tout.Branch("btag",v_btag,"btag/F")
        tout.Branch("btagIdx",v_btagIdx,"btagIdx/I")
        tout.Branch("pid",v_pid,"pid/I")
        tout.Branch("ptIdx",v_ptIdx,"ptIdx/I")
        tout.Branch("pt",v_pt,"pt/F")
        tout.Branch("phi",v_phi,"phi/F")
        tout.Branch("mass",v_mass,"mass/F")
# loop over tree
        tref = now()
        for iEv,Ev in enumerate(tin):
            if iEv%20000==0: 
                [m,s],p = testimate(tref,iEv,nin)
                print "%6d/%-10d (est. %dm %ds, %.1f%%)"%(iEv,nin,m,s,p)
            if opts.nentries>0 and iEv>opts.nentries: break
# loop over partons  
            for pj in range(len(Ev.partonMatchDR)):
                if Ev.partonMatchDR[pj] > 0.25: continue
#                if Ev.partonMatchIdx[pj] > len(Ev.jetPt): continue
                ptIdx = Ev.partonMatchIdx[pj]
                v_ptIdx[0] = Ev.partonMatchIdx[pj]
                v_pid[0]   = Ev.partonId[pj]
                v_btag[0]  = Ev.jetBtag[ptIdx]
                v_pt[0]    = Ev.jetPt[ptIdx]
                v_eta[0]   = Ev.jetEta[ptIdx]
                v_phi[0]   = Ev.jetPhi[ptIdx]
                v_mass[0]  = Ev.jetMass[ptIdx]
                if opts.alt:
                    if (ptIdx in list(Ev.btagIdx)) and (ptIdx in list(Ev.etaIdx)):
                        v_btagIdx[0] = list(Ev.btagIdx).index(ptIdx)
                        v_etaIdx[0]  = list(Ev.etaIdx).index(ptIdx) 
                    else: continue
                else:
                    if ptIdx < len(list(Ev.btagIdx)):
                        v_btagIdx[0] = Ev.btagIdx[ptIdx]
                        v_etaIdx[0]  = Ev.etaIdx[ptIdx]
                tout.Fill()
# save
        fout.Write(fout.GetName(),TH1.kOverwrite)

######################################################################################################################################################
######################################################################################################################################################
    if opts.step==4:
        l1("Step 04%s: %s: blik training"%(" (Alt)" if opts.alt else "",opts.sel))

        fin = TFile.Open('/'.join([prefix,"rootfiles",basetree.replace(".root","_EvIntStep03%s_%s.root"%("Alt" if opts.alt else "",opts.sel))]),"read")
        tin = fin.Get("Hbb/jets")
        
        fout = TFile.Open("rootfiles/bjetId_%s_MVA%s.root"%(opts.sel,"Alt" if opts.alt else ""),"recreate")
        
        sigCut = TCut("abs(pid) == 5")
        bkgCut = TCut("abs(pid) != 5")
        presel = TCut("btagIdx<4 && etaIdx<4 && etaIdx>-1 && ptIdx<4 && btagIdx>-1 && ptIdx>-1")
        
        Nin = tin.GetEntries()
        N = 100000
        l1("Input tree: %d events"%Nin)
        l1("Using %d events"%N)
          
        factory = TMVA.Factory("factory_%s%s_"%(opts.sel,"_Alt" if opts.alt else ""),fout,"!V:!Silent:Color:DrawProgressBar:Transformations=I;G:AnalysisType=Classification")
        factory.SetInputTrees(tin,sigCut,bkgCut)
        
        factory.AddVariable("btag"   ,'F');
        factory.AddVariable("eta"    ,'F');
        factory.AddVariable("btagIdx",'I');
        factory.AddVariable("etaIdx" ,'I');
        
        factory.PrepareTrainingAndTestTree(presel,"nTrain_Signal=%d:nTrain_Background=%d:nTest_Signal=%d:nTest_Background=%d"%(N,N,N,N))
        
        factory.BookMethod(TMVA.Types.kLikelihood,"Likelihood");
        factory.BookMethod(TMVA.Types.kBDT,"BDT_GRAD2","NTrees=600:nCuts=25:BoostType=Grad:Shrinkage=0.2");
        factory.TrainAllMethods();
        factory.TestAllMethods();
        factory.EvaluateAllMethods(); 

        fin.Close()
        fout.Close()

######################################################################################################################################################
######################################################################################################################################################
    if opts.step==5:
        l1("Step 05%s: %s: Sig/Bkg plots"%(" (Alt)" if opts.alt else "",opts.sel))

        fin = TFile.Open(prefix+"/rootfiles/flatTree_VBFPowheg125_EvIntStep03%s_%s.root"%("Alt" if opts.alt else "",opts.sel),"read")
        tin = fin.Get("Hbb/jets")
        fout = TFile.Open(prefix+"/rootfiles/flatTree_VBFPowheg125_EvIntStep05%s_%s.root"%("Alt" if opts.alt else "",opts.sel),"recreate")

        gStyle.SetOptStat(0)
        gStyle.SetOptTitle(0)
        gStyle.SetLineScalePS(2)
        gROOT.ProcessLineSync(".x %s/styleCMSTDR.C"%basepath)
        gStyle.SetPadRightMargin(0.02)
        gStyle.SetPadLeftMargin(0.16)
        gStyle.SetPadTopMargin(0.02)
        gStyle.SetPadBottomMargin(0.12)
        gROOT.SetBatch(1)
        gStyle.SetTitleSize(0.05,"XY")
        gStyle.SetLabelSize(0.04,"XY")
        gStyle.SetTitleOffset(1.35,"Y")
        gStyle.SetGridColor(17) 

        #
        fc = {"sig":kBlue-9,"bkg":kRed}
        fs = {"sig":1001,"bkg":3004}
        lc = {"sig":kBlue-7,"bkg":kRed}
        Ax  = ["#eta","#eta rank","CSV b-tag","CSV b-tag rank","(old) b-likelihood","(old) b-likelihood rank","b-likelihood","b-likelihood rank"]
        Ay  = ["N / (0.2)","N / (1)","N / (0.1)","N / (1)","N / (0.04)","N / (1)","N / (0.04)","N / (1)"]
        AN  = [50,4,110,4,50,4,50,4]
        Ami = [-5,-0.5,-10,-0.5,-1,-0.5,-1,-0.5]
        Ama = [5,3.5,1,3.5,1,3.5,1,3.5]
        Av  = ["jetEta","etaIdx","jetBtag","btagIdx","blikNOM","blikNOMIdx","myblikNOM","myblikNOMIdx"]
        hs = {}
        btagbinsinput = [-10,-9,-1,0]
        for i in range(1,int(1./0.05)+1): btagbinsinput += [round(float(i)*0.05,2)]
        btagbins = array('f',btagbinsinput)
        for a1 in ["sig","bkg"]:
            for i2,a2 in enumerate(["eta","etaIdx","btag","btagIdx"]):
                x,y,N,mi,ma = Ax[i2],Ay[i2],AN[i2],Ami[i2],Ama[i2]
                if not a2=="btag": hs["%s_%s"%(a1,a2)] = eval('TH1F("h%s_%s","h%s_%s;%s;%s",%d,%f,%f)'%(a1,a2,a1,a2,x,y,N,mi,ma))
                else: hs["%s_%s"%(a1,a2)] = TH1F("h%s_%s"%(a1,a2),"h%s_%s;%s;%s"%(a1,a2,x,y),len(btagbins)-1,btagbins)
                hs["%s_%s"%(a1,a2)].SetFillColor(fc[a1])
                hs["%s_%s"%(a1,a2)].SetFillStyle(fs[a1])
                hs["%s_%s"%(a1,a2)].SetLineColor(lc[a1])
        #
        hs["sig_etaIdx"].GetXaxis().SetNdivisions(4)
        hs["sig_btagIdx"].GetXaxis().SetNdivisions(4)
        TGaxis.SetMaxDigits(4)

        legs = [TLegend(1.-gStyle.GetPadRightMargin()-0.03-0.30,1.-gStyle.GetPadTopMargin()-0.03,1.-gStyle.GetPadRightMargin()-0.03,1.-gStyle.GetPadTopMargin()-0.03-0.055*3,"%s selection"%("Set A" if opts.sel=="NOM" else "Set B"))]
        legs[0].SetTextFont(42)
        legs[0].SetTextSize(0.05)
        legs[0].SetFillStyle(-1)
        legs[0].SetBorderSize(0)
        for i in range(4): legs += [deepcopy(legs[0])]
        #
        for var in ["eta","etaIdx","btag","btagIdx"]:
            for typ in ["sig","bkg"]:
                tin.Draw("%s>>h%s_%s"%(var,typ,var),"abs(pid)==5" if typ=="sig" else "abs(pid)!=5")
        #
        for h in hs.itervalues():
            h.Scale(1./h.Integral())
            h.GetYaxis().SetRangeUser(0.0 if not "Idx" in h.GetName() else 0.1,h.GetBinContent(h.GetMaximumBin())*1.40)

        hs["sig_btag"] = btagTrafo(hs["sig_btag"],"sig",fc["sig"],fs["sig"],lc["sig"])
        hs["bkg_btag"] = btagTrafo(hs["bkg_btag"],"bkg",fc["bkg"],fs["bkg"],lc["bkg"])

        c = TCanvas("c","c",1800,1300)
        c.Divide(2,2)
        for a1 in ["sig","bkg"]:
            for i2,a2 in enumerate(["btag","btagIdx","eta","etaIdx"]):
                c.cd(i2+1)
                h = hs["%s_%s"%(a1,a2)]
                h.Draw("" if a1=="sig" else "same")
                gPad.SetGrid(1,1)
                legs[i2].AddEntry(h,"signal" if a1=="sig" else "background","F")
                if a1=="bkg": legs[i2].Draw()
                if a2=="btag":
                    gPad.SetLogy(1)
                    epave("-1",-0.08,0.000306)
                    epave("-10",-0.135,0.000306)
        #
        makeDirs(prefix+"/plots")
        c.SaveAs(prefix+"/plots/EvIntDiscriminant_variablesIn%s_%s.pdf"%("Alt" if opts.alt else "",opts.sel))

        fout.Write(fout.GetName(),TH1.kOverwrite)
        fin.Close()
        fout.Close()

######################################################################################################################################################
######################################################################################################################################################
    if opts.step==6:
        l1("Step 06%s: %s: weights filling & output plots."%(" (Alt)" if opts.alt else "",opts.sel))
        gROOT.SetBatch(1)
        gStyle.SetOptStat(0)
        gStyle.SetOptTitle(0)
        gStyle.SetLineScalePS(2)
        gROOT.ProcessLineSync(".x %s/styleCMSTDR.C"%basepath)
        gStyle.SetPadRightMargin(0.02)
        gStyle.SetPadLeftMargin(0.16)
        gStyle.SetPadTopMargin(0.05)
        gStyle.SetPadBottomMargin(0.12)
        gROOT.SetBatch(1)
        gStyle.SetTitleOffset(1.35,"Y")
        gStyle.SetPalette(1)
        gStyle.SetGridColor(17)
        TGaxis.SetMaxDigits(4)
        gStyle.SetTitleSize(0.05,"XYZ")
        gStyle.SetLabelSize(0.04,"XYZ")
        gStyle.SetTitleOffset(1.35,"Y")
        gStyle.SetGridColor(17) 
            
        #
        fc = {"sig":kBlue-9,"bkg":kRed}
        fs = {"sig":1001,"bkg":3004}
        lc = {"sig":kBlue-7,"bkg":kRed}
        Ax  = ["#eta","#eta rank","CSV b-tag","CSV b-tag rank","(old) b-likelihood","(old) b-likelihood rank","b-likelihood","b-likelihood rank","|#eta|","bbtag","bblik"]
        Ay  = ["N / (0.2)","N / (1)","N / (0.1)","N / (1)","N / (0.08)","N / (1)","N / (0.08)","N / (1)","N / (0.1)","N / (0.02)","N / (0.01)"]
        AN  = [50,4,110,4,25,4,25,4,100,550,200]
        Ami = [-5,-0.5,-10,-0.5,-1,-0.5,-1,-0.5,0,-10,-1]
        Ama = [5,3.5,1,3.5,1,3.5,1,3.5,5,1,1,1]
        Av  = ["jetEta","etaIdx","jetBtag","btagIdx","blik%s"%("NOM" if opts.sel=="NOM" else "VBF"),"blik%sIdx"%("NOM" if opts.sel=="NOM" else "VBF"),"blik","blikIdx","abseta","jetBtag","blik"]
        hs = {}
        btagbinsinput = [-10,-9,-1,0]
        for i in range(1,int(1./0.05)+1): btagbinsinput += [round(float(i)*0.05,2)]
        btagbins = array('f',btagbinsinput)
        for a1 in ["sig","bkg"]:
            for i2,a2 in enumerate(["eta","etaIdx","btag","btagIdx","blik","blikIdx","blik2","blik2Idx","abseta","bbtag","bblik"]):
                x,y,N,mi,ma = Ax[i2],Ay[i2],AN[i2],Ami[i2],Ama[i2]
                if not a2=="btag": hs["%s_%s"%(a1,a2)] = eval('TH1F("h%s_%s","h%s_%s;%s;%s",%d,%f,%f)'%(a1,a2,a1,a2,x,y,N,mi,ma))
                else: hs["%s_%s"%(a1,a2)] = TH1F("h%s_%s"%(a1,a2),"h%s_%s;%s;%s"%(a1,a2,x,y),len(btagbins)-1,btagbins)
                hs["%s_%s"%(a1,a2)].SetFillColor(fc[a1])
                hs["%s_%s"%(a1,a2)].SetFillStyle(fs[a1])
                hs["%s_%s"%(a1,a2)].SetLineColor(lc[a1])
        #
        if not opts.replot:
            fglobal = TFile.Open('/'.join([prefix,"rootfiles",basetree.replace(".root","_EvIntStep02_%s.root"%opts.sel)]),"read")
            tglobal = fglobal.Get("Hbb/events")
            eta,etaIdx,btag,btagIdx = zeros(1,'float32'),zeros(1,'float32'),zeros(1,'float32'),zeros(1,'float32')
            pid = ROOT.vector('int')()
            reader  = TMVA.Reader()
            if opts.alttag=="" or not ("Kostas" in opts.alttag or "CERN" in opts.alttag):
                reader.AddVariable("btag",btag)
                reader.AddVariable("eta",eta)
                reader.AddVariable("btagIdx",btagIdx)
                reader.AddVariable("etaIdx",etaIdx)
                reader.BookMVA(opts.tmva,"weights/factory_%s%s__BDT_GRAD2.weights.xml"%(opts.sel,"_Alt" if opts.alt else ""))
            elif "Kostas" in opts.alttag:
                reader.AddVariable("btagIdx",btagIdx)
                reader.AddVariable("etaIdx",etaIdx)
                reader.AddVariable("btag",btag)
                reader.AddVariable("eta",eta)
                reader.BookMVA(opts.tmva,"kostas/weights/factory_%s__BDT_GRAD2.weights.xml"%opts.sel)
            elif "CERN" in opts.alttag:
                reader.AddVariable("btagIdx",btagIdx)
                reader.AddVariable("etaIdx",etaIdx)
                reader.AddVariable("btag",btag)
                reader.AddVariable("eta",eta)
                reader.BookMVA(opts.tmva,"tmpcern/factory_BCanditate_%s_BDT_GRAD.weights.xml"%opts.sel)
#                reader.BookMVA(opts.tmva,"weights/kostas.NOM.xml")
            #
            blik       = ROOT.vector('float')()
            blikIdx    = ROOT.vector('int')()
            blikmqq    = zeros(1,'float32')
            blikmbb    = zeros(1,'float32')
            blikdetaqq = zeros(1,'float32')
            #
            fmvd = TFile.Open(prefix+"/rootfiles/flatTree_VBFPowheg125_EvIntStep04%s_%s.root"%("Alt" if opts.alt else "",opts.sel),"recreate")
            makeDirsRoot(fmvd,"Hbb")
            gDirectory.cd("Hbb") 
            tmvd = tglobal.CloneTree(0)
            #
            tmvd.Branch("blik",blik)
            tmvd.Branch("blikIdx",blikIdx)
            tmvd.Branch("blikmqq",blikmqq,"blikmqq/F")
            tmvd.Branch("blikmbb",blikmbb,"blikmbb/F")
            tmvd.Branch("blikdetaqq",blikdetaqq,"blikdetaqq/F")
            tmvd.Branch("pid",pid)
            #
            nentries = tglobal.GetEntriesFast()
            tref = now()
            for iEv,Ev in enumerate(tglobal):
                blik.resize(4,0)
                blikIdx.resize(4,0)
                pid.resize(4,0)
                #
                if opts.nentries>0: 
                    if iEv>opts.nentries: break
                if iEv%5000==0: 
                    [m,s],p = testimate(tref,iEv,nentries)
                    print "%8d/%-10d (est. %dm %ds, %.1f%%)"%(iEv,nentries,m,s,p)
                #
                for ijet in range(4):
                    eta[0] = Ev.jetEta[ijet]
                    btag[0] = Ev.jetBtag[ijet]
                    if opts.alt:
                        etaIdx[0] = list(Ev.etaIdx).index(ijet)
                        btagIdx[0] = list(Ev.btagIdx).index(ijet)
                    else:
                        etaIdx[0] = Ev.etaIdx[ijet] 
                        btagIdx[0] = Ev.btagIdx[ijet] 
                    blik[ijet] = float(reader.EvaluateMVA(opts.tmva))
                #
                blikIdxPair = sorted([[ijet,blik[ijet]] for ijet in range(4)],key=lambda (x,y):y,reverse=True)
                #
                for ijet in range(4): blikIdx[ijet] = blikIdxPair[ijet][0]
                #
                for pj in range(len(Ev.partonMatchDR)):
                    if Ev.partonMatchDR[pj] > 0.25: continue
                    ptIdx = Ev.partonMatchIdx[pj]
                    if ptIdx >= len(Ev.btagIdx): continue
                    pid[ptIdx] = Ev.partonId[pj]
#                for ijet in range(4): 
#                    pidVals = sorted([(x,Ev.partonMatchDR[x]) for x in range(len(Ev.partonMatchIdx)) if (Ev.partonMatchIdx[x]==ijet and Ev.partonMatchDR[x]<0.25)],key=lambda (x,y):(y))
#                    if len(pidVals)<1: pid[ijet] =-999 
#                    else: pid[ijet] = Ev.partonId[pidVals[0][0]]
#                    if pid[ijet]!=-999: 
                    for i2,a2 in enumerate(["eta","etaIdx","btag","btagIdx","blik","blikIdx","blik2","blik2Idx","abseta","bbtag","bblik"]):
                        if a2=="blik": continue
                        h = hs["%s_%s"%("sig" if abs(pid[ptIdx])==5 else "bkg",a2)]
                        if not Av[i2] in ["blik","blikIdx","abseta"]:
                            v = eval("Ev.%s[%d]"%(Av[i2],ptIdx)) if not "Idx" in a2 else eval("list(Ev.%s).index(%d)"%(Av[i2],ptIdx))
                        elif Av[i2] == "blik": v = blik[ptIdx]
                        elif Av[i2] == "blikIdx": v = list(blikIdx).index(ptIdx)
                        elif Av[i2] == "abseta": v = abs(Ev.jetEta[ptIdx])
                        elif Av[i2] == "bbtag": v = Ev.jetBtag[ptIdx]
                        elif Av[i2] == "bblik": v = blik[ptIdx]
                        h.Fill(v)
                #
#                v = [TLorentzVector(),TLorentzVector(),TLorentzVector(),TLorentzVector()]
#                for j in range(4): 
#                    k = blikIdx[j]
#                    v[j].SetPtEtaPhiM(Ev.jetPt[k],Ev.jetEta[k],Ev.jetPhi[k],Ev.jetMass[k])
                v = []
                for jid in range(4):
                    v += [TLorentzVector()]
                    v[-1].SetPtEtaPhiM(Ev.jetPt[jid],Ev.jetEta[jid],Ev.jetPhi[jid],Ev.jetMass[jid])
                blikmqq[0] = (v[blikIdx[2]]+v[blikIdx[3]]).M()
                blikmbb[0] = (v[blikIdx[0]]+v[blikIdx[1]]).M()
                blikdetaqq[0] = abs(Ev.jetEta[int(blikIdx[2])]-Ev.jetEta[int(blikIdx[3])])
                tmvd.Fill()
        else:
            fmvd = TFile.Open(prefix+"/rootfiles/flatTree_VBFPowheg125_EvIntStep04%s_%s.root"%("Alt" if opts.alt else "",opts.sel),"update")
            gDirectory.cd("Hbb")
            tmvd = fmvd.Get("Hbb/events")
            for a1 in ["sig","bkg"]:
                for i2,a2 in enumerate(["eta","etaIdx","btag","btagIdx","blik","blikIdx","blik2","blik2Idx"]):
                    eval('h%s_%s = fmvd.Get("Hbb/h%s_%s")'%(a1,a2,a1,a2))
        #
        c = TCanvas("c","c",1800,1500)
        c.Divide(4,4)
        Bv  = ["blikNOM" if opts.sel=="NOM" else "blikVBF","blikNOMIdx" if opts.sel=="NOM" else "blikVBFIdx","blik","blikIdx","mqq[0]","mqq[%d]"%(1 if opts.sel=="NOM" else 2),"blikmqq","NONE","dEtaqq[0]","dEtaqq[%d]"%(1 if opts.sel=="NOM" else 2),"blikdetaqq","NONE","mbb[0]","mbb[%d]"%(1 if opts.sel=="NOM" else 2),"blikmbb","NONE"]
        Bx  = ["(old) b-likelihood","(old) b-likelihood rank","b-likelihood","b-likelihood rank","(CSV) m_{qq'} (GeV)","(old) m_{qq'} (GeV)","(new) m_{qq'} (GeV)","","(CSV) #Delta#eta_{qq'}","(old) #Delta#eta_{qq'}","(new) #Delta#eta_{qq'}","","(CSV) m_{b#bar{b}} (GeV)","(old) m_{b#bar{b}} (GeV)","(new) m_{b#bar{b}} (GeV)",""]
        By  = ["N / (0.08)","N / (1)","N / (0.08)","N / (1)","N / (20 GeV)","N / (20 GeV)","N / (20 GeV)","","N / (0.1)","N / (0.1)","N / (0.1)","","N / (10 GeV)","N / (10 GeV)","N / (10 GeV)",""]
        BN  = [25,4,25,4,100,100,100,0,50,50,50,0,30,30,30,0]
        Bmi = [-1,-0.5,-1,-0.5,0,0,0,0,0,0,0,0,0,0,0,0]
        Bma = [1,3.5,1,3.5,2000,2000,2000,0,5,5,5,0,300,300,300,0]
        Bt  = ["(existing)","(existing)","(new)","(new)","(existing)","(existing)","(new)","","(existing)","(existing)","(new)","","(existing)","(existing)","(new)",""]
        for iv,v in enumerate(Bv):
            if v == "blikNOM" or v == "blikVBF": continue
            if v == "NONE": continue
            c.cd(iv+1)
            gPad.SetGrid(1,1)
            tmvd.Draw("%s>>h%d(%d,%f,%f)"%(v,iv+1,BN[iv],Bmi[iv],Bma[iv]))
            eval('h%d.GetXaxis().SetTitle("%s")'%(iv+1,Bx[iv]))
            eval('h%d.GetYaxis().SetTitle("%s")'%(iv+1,By[iv]))
            trpave(Bt[iv])
        
        makeDirs(prefix+"/plots")
        c.SaveAs(prefix+"/plots/EvIntDiscriminant_variablesOut%s%s-1_%s.pdf"%("Alt" if opts.alt else "",opts.alttag if not opts.alttag=="" else "",opts.sel))
        c.Close()
        
        ci = TCanvas("ci","ci",900,750)
#        c.Divide(2,1)
        Bv  = ["blikmbb:mbb[0]","mbb[%d]:mbb[0]"%(1 if opts.sel=="NOM" else 2)]
        Bx  = ["CSV b-tag m_{b#bar{b}} (GeV)","CSV b-tag m_{b#bar{b}} (GeV)"]
        By  = ["b-likelihood m_{b#bar{b}} (GeV)","b-likelihood m_{b#bar{b}} (GeV)"]
        BN  = [[140,140],[140,140]]
        Bmi = [[0,0],[0,0]]
        Bma = [[700,700],[700,700]]
        Bt  = ["(new)","(existing)"]
        for iv,v in enumerate(Bv):
            if v == "NONE": continue
#            c.cd(iv+1)
            ci.cd()
            tmvd.Draw("%s>>h%d(%d,%f,%f,%d,%f,%f)"%(v,iv+1+12,BN[iv][0],Bmi[iv][0],Bma[iv][0],BN[iv][1],Bmi[iv][1],Bma[iv][1]),"","colz")
            gPad.SetRightMargin(0.14)
            gPad.SetTopMargin(0.06)
            gPad.SetBottomMargin(0.14)
            eval('ROOT.h%d.GetXaxis().SetTitle("%s")'%(iv+1+12,Bx[iv]))
            eval('ROOT.h%d.GetYaxis().SetTitle("%s")'%(iv+1+12,By[iv]))
            eval('ROOT.h%d.GetXaxis().SetTitleOffset(%.2f)'%(iv+1+12,1.1))
            #trpave(Bt[iv])
            tlpave("Set %s selection"%("A" if opts.sel=="NOM" else "B"),0.85,1)
            eval('ROOT.h%d.GetZaxis().SetRangeUser(1,4000)'%(iv+1+12))
            gPad.SetLogz(1)

            ci.SaveAs(prefix+"/plots/EvIntDiscriminant_variablesOut%s%s-2%s_%s.pdf"%("Alt" if opts.alt else "",opts.alttag if not opts.alttag=="" else "","-new" if iv==0 else "-existing",opts.sel))
        #ci.Close()

        cb = TCanvas("cb","cb",1800,750)
        cb.Divide(2,1)
        c = TCanvas("c","c",2700,1950)
        c.Divide(3,3)
        for a1 in ["sig","bkg"]:
            for i2,a2 in enumerate(["eta","etaIdx","btag","btagIdx","blik","blikIdx","blik2","blik2Idx","abseta","bbtag","bblik"]):
                h = hs["%s_%s"%(a1,a2)]
                if "Idx" in a2: h.GetXaxis().SetNdivisions(4)
                if not h.Integral()==0: h.Scale(1./h.Integral())
                h.GetYaxis().SetRangeUser(0.001 if a2 in ["btag","blik","blik2","bbtag","bblik"] else 0.0,h.GetBinContent(h.GetMaximumBin())*(75 if a2 in ["btag","blik","blik2","bbtag","bblik"] else 1.4))

        legs = [TLegend(1.-gStyle.GetPadRightMargin()-0.03-0.30,1.-gStyle.GetPadTopMargin()-0.03,1.-gStyle.GetPadRightMargin()-0.03,1.-gStyle.GetPadTopMargin()-0.03-0.055*3,"%s selection"%("Set A" if opts.sel=="NOM" else "Set B"))]
        legs[0].SetTextFont(42)
        legs[0].SetTextSize(0.05)
        legs[0].SetFillStyle(-1)
        legs[0].SetBorderSize(0)
        for i in range(8): legs += [deepcopy(legs[0])]

        hsigbtagnew = btagTrafo(hs["sig_btag"],"sig",fc["sig"],fs["sig"],lc["sig"])
        hbkgbtagnew = btagTrafo(hs["bkg_btag"],"bkg",fc["bkg"],fs["bkg"],lc["bkg"])

        for i2,a2 in enumerate(["blik2","blik2Idx","blikIdx","btag","btagIdx","NONE","eta","etaIdx","NONE"]):
            if a2=="blik2": cb.cd(1)
            elif a2=="blik2Idx": cb.cd(2)
            else: c.cd(i2+1)
            for a1 in ["sig","bkg"]:
                gPad.SetRightMargin(0.02)
                gPad.SetBottomMargin(0.12)
                if a2=="NONE": continue
                h = hs["%s_%s"%(a1,a2)]
                if a2=="btag" and a1=="sig": h = hsigbtagnew
                elif a2=="btag" and a1=="bkg": h = hbkgbtagnew
                gPad.SetGrid(1,1)
                if a2 in ["btag","blik","blik2"]: gPad.SetLogy(1) 
                else: gPad.SetLogy(0)
                h.Draw("" if a1=="sig" else "same")
                legs[i2].AddEntry(h,"signal" if a1=="sig" else "background","F")
                if a1=="bkg": legs[i2].Draw()
                h.GetXaxis().SetTitleSize(0.05)
                h.GetYaxis().SetTitleSize(0.05)
                h.GetXaxis().SetTitleOffset(1.1)
                h.GetYaxis().SetTitleOffset(1.35)
                h.GetXaxis().SetLabelSize(0.04)
                h.GetYaxis().SetLabelSize(0.04)
                if a2=="btag":
                    epave("-1",-0.08,0.000306)
                    epave("-10",-0.13,0.000306)
                gPad.Update()
                if "blik2" in a2 and a1=="bkg": cb.SaveAs(prefix+"/plots/EvIntDiscriminant_variablesOut%s%s-3a_%s.pdf"%("Alt" if opts.alt else "",opts.alttag if not opts.alttag=="" else "",opts.sel))

        c.SaveAs(prefix+"/plots/EvIntDiscriminant_variablesOut%s%s-3_%s.pdf"%("Alt" if opts.alt else "",opts.alttag if not opts.alttag=="" else "",opts.sel))
        
        c = TCanvas("c","c",900,750) 
        c.cd()
        legs = [TLegend(gStyle.GetPadLeftMargin()+0.05,gStyle.GetPadBottomMargin()+0.05,gStyle.GetPadLeftMargin()+0.3,gStyle.GetPadBottomMargin()+0.05+0.050*4,"%s selection"%("Set A" if opts.sel=="NOM" else "Set B"))]
        legs[0].SetTextFont(42)
        legs[0].SetTextSize(0.045)
        legs[0].SetFillStyle(0)
        legs[0].SetBorderSize(0)
        gs = {}
        for i2,a2 in enumerate(["bblik","bbtag","abseta"]):
            hsig = hs["sig_%s"%a2]
            hbkg = hs["bkg_%s"%a2]
            g = makeGraph(hsig,hbkg,"right" if not a2=="abseta" else "left")
            g.Write()
            gs[a2] = g
            legs[0].AddEntry(g,"b-likelihood" if "blik" in a2 else ("CSV b-tag" if a2=="bbtag" else "|#eta|"),"L")
            g.Draw("A,L" if i2==0 else "same,L")
        legs[0].Draw()
        legs[0].SetY2(legs[0].GetY1()+legs[0].GetNRows()*0.050+0.05)
        gPad.Update()
        c.SaveAs(prefix+"/plots/EvIntDiscriminant_variablesOut%s%s-4_%s.pdf"%("Alt" if opts.alt else "",opts.alttag if not opts.alttag=="" else "",opts.sel))

        if opts.replot:
            for i in range(20):
                h = eval("ROOT.h%d"%(i))
                if h: h.Write(h.GetName(),TH1.kOverwrite)
            for a1 in ["sig","bkg"]:
                for i2,a2 in enumerate(["blik2","blik2Idx","blikIdx","btag","btagIdx","NONE","eta","etaIdx","NONE"]):
                    if a2=="NONE": continue
                    h = hs["%s_%s"%(a1,a2)]
                    if h: h.Write(h.GetName(),TH1.kOverwrite)
            for g in gs.itervalues():
                if g: g.Write(g.GetName(),TH1.kOverwrite)
        else:
            fmvd.Write()
        #
        fmvd.Close()

######################################################################################################################################################
######################################################################################################################################################
    if opts.step==7:
        l1("Step 07%s: %s: more plots."%(" (Alt)" if opts.alt else "",opts.sel))
        gROOT.SetBatch(1)
        gStyle.SetOptStat(0)
        gStyle.SetLineScalePS(2)
        gROOT.ProcessLineSync(".x %s/styleCMSTDR.C"%basepath)
        gStyle.SetPadRightMargin(0.02)
        gStyle.SetPadLeftMargin(0.16)
        gStyle.SetPadTopMargin(0.05)
        gStyle.SetPadBottomMargin(0.12)
        gROOT.SetBatch(1)
        gStyle.SetTitleOffset(1.35,"Y")
        gStyle.SetTitleSize(0.05,"XYZ")
        gStyle.SetLabelSize(0.04,"XYZ")
        gStyle.SetPalette(1)
        gStyle.SetGridColor(17)
        TGaxis.SetMaxDigits(4)
        
        fin = TFile.Open("rootfiles/bjetId_%s_MVA%s.root"%(opts.sel,"Alt" if opts.alt else ""),"read")
        tin = fin.Get("TestTree")
        fout = TFile.Open(prefix+"/rootfiles/flatTree_VBFPowheg125_EvIntStep07%s_%s.root"%("Alt" if opts.alt else "",opts.sel),"recreate")

        NTrue = float(tin.GetEntries("classID==0"))
        NFake = float(tin.GetEntries("classID==1"))

        V = ["btag","btag","abs(eta)","abs(eta)","BDT_GRAD2","BDT_GRAD2"]
        Av = ["btagTrue","btagFake","etaTrue","etaFake","blikTrue","blikFake"]
        Ax = ["CSV b-tag","CSV b-tag","|#eta|","|#eta|","b-likelihood","b-likelihood"]
        Ay = ["N / (0.05)","N / (0.05)","N / (0.2)","N / (0.2)","N / (0.08)","N / (0.08)"]
        Ami = [0,0,0,0,-1,-1]
        Ama = [1,1,5,5,1,1]
        AN = [20,20,25,25,25,25]
        hs = {}
        for a in range(len(Av)):
            hs["%s"%Av[a]] = TH1F("h%s"%Av[a],"h%s;%s;%s"%(Av[a],Ax[a],Ay[a]),AN[a],Ami[a],Ama[a])
            h = hs["%s"%Av[a]]
            if "True" in Av[a]:
                h.SetLineColor(kBlue)
                h.SetFillColor(kBlue-9)
                h.SetFillStyle(1001)
            elif "Fake" in Av[a]:
                h.SetLineColor(kRed)
                h.SetFillColor(kRed)
                h.SetFillStyle(3004)
        for v in range(len(V)):
            tin.Draw("%s>>h%s"%(V[v],Av[v]),"classID==0" if "True" in Av[v] else "classID==1")
            if "True" in Av[v]: hs[Av[v]].Scale(1./NTrue)
            elif "Fake" in Av[v]: hs[Av[v]].Scale(1./NFake)
        
        c = TCanvas("c","c",900,1950)
        c.Divide(1,3)
        legs = [TLegend(1.-gStyle.GetPadRightMargin()-0.03-0.30,1.-gStyle.GetPadTopMargin()-0.03,1.-gStyle.GetPadRightMargin()-0.03,1.-gStyle.GetPadTopMargin()-0.03-0.055*3,"%s selection"%("Set A" if opts.sel=="NOM" else "Set B"))]
        legs[0].SetTextFont(42)
        legs[0].SetTextSize(0.05)
        legs[0].SetFillStyle(-1)
        legs[0].SetBorderSize(0)
        for i in range(20): legs += [deepcopy(legs[0])]
        for a in range(len(Av)):
            c.cd(divmod(a+2,2)[0])
            h = hs["%s"%Av[a]]
            h.Draw("" if "True" in Av[a] else "same")
            legs[divmod(a+2,2)[0]].AddEntry(h,"signal" if "True" in Av[a] else "background","F")
            if "Fake" in Av[a]: legs[divmod(a+2,2)[0]].Draw()
            if "btag" in Av[a] or "blik" in Av[a]: 
                if "True" in Av[a]: h.GetYaxis().SetRangeUser(0.001,h.GetBinContent(h.GetMaximumBin())*75)
                gPad.SetLogy(1)
            else:
                if "True" in Av[a]: h.GetYaxis().SetRangeUser(0.0,h.GetBinContent(h.GetMaximumBin())*1.4)
                gPad.SetLogy(0)
        c.SaveAs("plots/performance%s-1_%s.pdf"%("Alt" if opts.alt else "",opts.sel))
        c.Close()

        xtrue = [0.]*1000
        yfake = [0.]*1000

        c = TCanvas("c","c",900,750) 
        c.cd()
        legs = [TLegend(gStyle.GetPadLeftMargin()+0.05,gStyle.GetPadBottomMargin()+0.05,gStyle.GetPadLeftMargin()+0.3,gStyle.GetPadBottomMargin()+0.05+0.050*4,"%s selection"%("Set A" if opts.sel=="NOM" else "Set B"))]
        legs[0].SetTextFont(42)
        legs[0].SetTextSize(0.045)
        legs[0].SetFillStyle(-1)
        legs[0].SetBorderSize(0)
        for i in range(20): legs += [deepcopy(legs[0])]
        gs = {}
        for a in range(len(Av)):
            if "True" in Av[a]:
                xtrue = [0.]*1000
                yfake = [0.]*1000
                for i in range(hs[Av[a]].GetNbinsX()):
                    xtrue[i] = hs[Av[a]].Integral(i,hs[Av[a]].GetNbinsX())
                    if "eta" in Av[a]: xtrue[i] = 1. - xtrue[i]
            elif "Fake" in Av[a]:
                for i in range(hs[Av[a]].GetNbinsX()):
                    yfake[i] = 1. - hs[Av[a]].Integral(i,hs[Av[a]].GetNbinsX())
                    if "eta" in Av[a]: yfake[i] = -yfake[i] + 1.
                gs[Av[a][0:-4]] = TGraph(hs[Av[a]].GetNbinsX(),array('f',xtrue[0:hs[Av[a]].GetNbinsX()]),array('f',yfake[0:hs[Av[a]].GetNbinsX()]))
                g = gs[Av[a][0:-4]]
                g.SetLineColor(kRed if "btag" in Av[a] else (kGreen+2 if "eta" in Av[a] else kBlue))
        gPad.SetGrid(1,1)
        gs["btag"].GetXaxis().SetLimits(0.7,1.05)
        gs["btag"].GetYaxis().SetRangeUser(0.0,1.1)
        gs["btag"].GetXaxis().SetTitle("Efficiency of matched b-jets")
        gs["btag"].GetYaxis().SetTitle("Rejection of matched non b-jets")
        gs["btag"].GetXaxis().SetNdivisions(504)
        gs["btag"].Draw("AL")
        gs["eta"].Draw("sameL")
        gs["blik"].Draw("sameL")
        legs[-1].AddEntry(gs["btag"],"CSV b-tag","L")
        legs[-1].AddEntry(gs["eta"],"|#eta|","L")
        legs[-1].AddEntry(gs["blik"],"b-likelihood","L")
        legs[-1].Draw()

        c.SaveAs("plots/performance%s-2_%s.pdf"%("Alt" if opts.alt else "",opts.sel))
        c.Close()

        c1s = fin.Get("CorrelationMatrixS")
        c1b = fin.Get("CorrelationMatrixB")

        gStyle.SetGridColor(kBlack)
        c = TCanvas("c","c",900*2,850*1)
        c.Divide(2,1)
        c.cd(1)
        gPad.SetGrid(1,1)
        gPad.SetTopMargin(0.14)
        gPad.SetRightMargin(0.13)
        c1s.SetMarkerColor(kBlack)
        c1s.Draw("colz,text")
        epavetext(["Correlation matrix (signal)","%s selection"%("Set A" if opts.sel=="NOM" else "Set B")],0.03,0.88,0.5,0.97)
        epavetext(["Linear correlation coefficients in %"],0.52,0.85,0.99,0.89,0.025,0)
        gPad.Update()
        gPad.RedrawAxis()
        c.cd(2)
        gPad.SetGrid(1,1)
        gPad.SetTopMargin(0.14)
        gPad.SetRightMargin(0.13)
        c1b.SetMarkerColor(kBlack)
        c1b.Draw("colz,text")
        epavetext(["Correlation matrix (background)","%s selection"%("Set A" if opts.sel=="NOM" else "Set B")],0.03,0.88,0.5,0.97)
        epavetext(["Linear correlation coefficients in %"],0.52,0.85,0.99,0.89,0.025,0)
        gPad.Update()
        gPad.RedrawAxis()

        c.SaveAs("plots/performance%s-3_%s.pdf"%("Alt" if opts.alt else "",opts.sel))
        c.Close()
        gStyle.SetGridColor(17)

        fout.Write(fout.GetName(),TH1.kOverwrite)
        fin.Close()
        fout.Close()
Пример #26
0
def mkUncJEx():
	##################################################	
	# initialising
	#print gSystem.Load("../fitbias/fitTF1")
#	gSystem.AddIncludePath("-I/opt/Software/include")
#	gROOT.ProcessLine(".L ../fitbias/fitTF1.C++")
	opts,fout,variables = main.main(parser(),False,True,False)
	gDirectory.cd("%s:/"%fout.GetName())

	jsoninfo = json.loads(filecontent(opts.jsoninfo))
	jsonsamp = json.loads(filecontent(opts.jsonsamp))
	jsonvars = json.loads(filecontent(opts.jsonvars))
	jsoncuts = json.loads(filecontent(opts.jsoncuts))

	global SEL
	global TRG
	global DTG
	global REF
	global CUT
	global LAB
	global colours
	global offset
	catbounds = {}
	for tag in opts.tag: catbounds[tag] = array('f',opts.categoryboundaries[0]) if tag=="NOM" else array('f',opts.categoryboundaries[1])
	
	if (not len(opts.selection) == len(opts.trigger)) or (not len(opts.selection) == len(opts.tag)): sys.exit("Selection/trigger/tag options are broken. Exiting.")
	for i in range(len(opts.selection)):
		s = opts.selection[i]
		t = opts.trigger[i]
		d = opts.datatrigger[i] if opts.datatrigger and len(opts.datatrigger)>1 else opts.datatrigger[0] if opts.datatrigger else t 
		r = opts.reftrig[i] if opts.reftrig and len(opts.reftrig)>1 else opts.reftrig[0] if opts.reftrig else 'None'
		w = opts.weight[1] if opts.weight else "???"
		tag = opts.tag[i]
		SEL[tag] = s
		TRG[tag] = t
		DTG[tag] = d
		REF[tag] = r
		WGT[tag] = w
		CUT[tag],LAB[tag] = write_cuts(s,t,reftrig=["None"],sample="VBF125",jsonsamp=opts.jsonsamp,jsoncuts=opts.jsoncuts,weight=opts.weight,trigequal='1')

	##################################################	
	# some ROOT settings
	gStyle.SetOptStat(0)
	gROOT.SetBatch(1)
	TH1.SetDefaultSumw2(1)
	ROOT.gErrorIgnoreLevel = kWarning
	gROOT.ProcessLine("TH1::SetDefaultSumw2(1);")
	gStyle.SetPadTopMargin(0.02)
	gStyle.SetPadBottomMargin(0.23)
	gStyle.SetPadLeftMargin(0.11)
	gStyle.SetLabelFont(43,"XYZ")
	gStyle.SetLabelSize(25,"XYZ")
	gStyle.SetTitleFont(43,"XYZ")
	gStyle.SetTitleSize(30,"XYZ")
	gStyle.SetTitleOffset(3.0,"X")
	gStyle.SetTitleOffset(1.6,"Y")
	gStyle.SetLabelOffset(0.015,"X")
	gStyle.SetTitleColor(kBlack,"XYZ")#kBlue+2
	gStyle.SetLabelColor(kBlack,"XYZ")
	gStyle.SetTickLength(0.02)
	
	##################################################	
	# reading sample properties
	friends = ["HbbJERUp","HbbJERCl","HbbJESDn","HbbJESUp"]#HbbJERDn,#"HbbJESUp","HbbJESDn", 
	sampleproperties = {}
	for s in opts.sample:
		sampleproperties[s] = {}
		sprops = sampleproperties[s]
		# load sample properties
		sprops['tag']    = s
		sprops['group']  = jsoninfo['groups'][s]
		sprops['file']   = [k for (k,v) in jsonsamp['files'].iteritems() if v['tag']==s][0]
		sprops['scale']  = jsonsamp['files'][sprops['file']]['scale']
		sprops['colour'] = jsonsamp['files'][sprops['file']]['colour']
		sprops['tfile']  = TFile(opts.globalpath+'/'+sprops['file'],"read")
		sprops['ttree'] = {}
		for f in ["%s"%x for x in ['Hbb']+friends]: 
			if sprops['tfile'].Get("%s/events"%f): sprops['ttree'][f] = sprops['tfile'].Get("%s/events"%f)
			else: sprops['ttree'][f] = None

		sprops['th1'] = {}
		sprops['tf1'] = {}

		for tag in opts.tag:
			for incat,ncat in enumerate(["%s"%x for x in ['Hbb']+friends]):
				for inh,nh in enumerate(opts.variable):
					key = (tag,ncat,nh)
					sprops[key] = {'th1':None,'tf1':{'ful':None,'bkg':None,'params':None}}
					if incat==0: 
						sprops[(tag,'JES',nh)] = {'tca':None}
						sprops[(tag,'JER',nh)] = {'tca':None}
					
					if catveto(tag,nh): continue
					
					if 'jetUnsPt' in nh:
						variables[nh]['xmin'] = '-0.4'
						variables[nh]['xmax'] = '0.4'
						variables[nh]['nbins_x'] = '41'
					v = variables[nh]['root']
					n = variables[nh]['var']
					xmin = float(variables[nh]['xmin'])
					xmax = float(variables[nh]['xmax'])
					bins = int(variables[nh]['nbins_x'])
					tx = variables[nh]['title_x']
					ty = variables[nh]['title_y']
				
					f1,f2,f3,hname = gethname(WGT[tag],variables[nh],sprops['group'],sprops['tag'],SEL[tag],TRG[tag],DTG[tag],REF[tag])
					hname = hname.replace('hNum','h%s'%ncat)
					
					if "mva" in v: sprops[key]['th1'] = TH1F(hname,"%s;%s;%s"%(hname,tx,ty),len(catbounds[tag])-1,catbounds[tag])
					else: sprops[key]['th1'] = TH1F(hname,"%s;%s;%s"%(hname,tx,ty),bins,xmin,xmax)
					sprops[key]['th1'].Sumw2()
					if incat==0: 
						sprops[(tag,'JES',nh)]['tca'] = TCanvas(hname.replace('h%s'%ncat,'cJES'),hname.replace('h%s'%ncat,'cJES'),1200,1200)
						sprops[(tag,'JER',nh)]['tca'] = TCanvas(hname.replace('h%s'%ncat,'cJER'),hname.replace('h%s'%ncat,'cJER'),1200,1200)

	# summarize load block
	l1("Loaded properties for:")
	print "%s%12s | %12s | %8s | %15s | %40s | %15s | %15s | %55s |%s"%(blue,"tag","group","colour","scale","file","tree name","object type","alternatives",plain)
	print "-"*(15*2 + 11 + 18 + 43 + 36 + 58 - 1)
	for sp in sampleproperties.itervalues():
		print "%12s | %12s | %8s | %15s | %40s | %15s | %15s | %55s |"%( \
				sp["tag"],sp["group"],sp["colour"],sp["scale"],sp["file"], \
				sp["ttree"]["Hbb"].GetName() if not sp["ttree"]["Hbb"]==None else "%s%15s%s"%(Red,"None",plain), \
				sp["ttree"]["Hbb"].IsA().GetName() if not sp["ttree"]["Hbb"]==None else "%s%15s%s"%(Red,"None",plain), \
				", ".join([x for x in sprops["ttree"].keys()]) if len(sprops["ttree"].keys())>0 else "%s%30s%s"%(Red,"None",plain) \
				)
	
	# summarize selections & triggers:
	l1("Running these selections:")
	for tag in opts.tag:
		print "%s%s%s: %s\n\t%s%s%s"%(Black,tag,plain,LAB[tag],grey,CUT[tag],plain)
	
	##################################################	
	# loop
	makeDirs("plots/uncertainties")
	f0 = "histos"

	for isp,sp in enumerate(sampleproperties.itervalues()):
		# start
		stag = sp['tag']
		l1("Working with sample: %s"%stag)
		sp['tfile'].cd()
		tarray = []

		for tag in opts.tag:
			for incat,ncat in enumerate(["%s"%x for x in ["Hbb"]+friends]):
				l2("Category %s (%s)"%(ncat,tag))
				tree = sp['ttree'][ncat]
				treedraw = tree.Draw
				for inh,(nhf,nhr,nh) in enumerate([(variables[x],variables[x]['root'],variables[x]['var']) for x in opts.variable]):
					if 'jetUnsPt' in nh and 'JES' in ncat: continue
					f1,f2,f3,hname = gethname(WGT[tag],nhf,sp['group'],sp['tag'],SEL[tag],TRG[tag],DTG[tag],REF[tag])
					hname = hname.replace('hNum','h%s'%ncat)
					makeDirs("plots/uncertainties/%s%s"%(f1,'' if not opts.noleg else '_noleg'))
					makeDirsRoot(fout,'%s/%s/%s/%s'%(f0,f1,f2,f3))

					sp['tfile'].cd()
					if catveto(tag,nh): continue

#					tstart = time()
#					if (isp==0 and incat==len(["%s"%x for x in ["Hbb"]+friends])-1 and inh==len(variables)-1): average = tarray[-1]
#					l3("%-40s %-40s"%("Variable %s"%nh,"(time expected %.fs + %d modules)"%(tarray[-1]*((5-inh)+(4-incat)*5) if len(tarray)>0 else -999,len(sampleproperties)-isp-1)))
					l3("%-40s"%("Variable %s"%nh))
					
					if "JER" in ncat: sp[(tag,'JER',nh)]['tca'].cd()
					else: sp[(tag,'JES',nh)]['tca'].cd()
		
					if fout.Get("%s/%s/%s/%s/%s;1"%(f0,f1,f2,f3,hname)):
						l4('%sLoading%s: %s \n%s%s(%s/%s/%s/%s)%s'%(red,plain,hname,grey,' '*9,f0,f1,f2,f3,plain))
						sp[(tag,ncat,nh)]['th1'] = fout.Get("%s/%s/%s/%s/%s;1"%(f0,f1,f2,f3,hname)).Clone()	
#						sp[(tag,ncat,nh)]['th1'].Sumw2()	
					else:
						l4('%sCreating%s: %s \n%s%s(%s/%s/%s/%s)%s'%(red,plain,hname,grey,' '*9,f0,f1,f2,f3,plain))
						if not 'jetUnsPt' in nh: treedraw("%s>>%s"%(nhr,sp[(tag,ncat,nh)]['th1'].GetName()),CUT[tag])
						else: treedraw("((%s - %s)/(%s))>>%s"%(nhr.replace('Uns',''),nhr,nhr.replace('Uns',''),sp[(tag,ncat,nh)]['th1'].GetName()),CUT[tag])
						oldwd = gDirectory.GetPath()
						gDirectory.cd("%s:/%s/%s/%s/%s/"%(fout.GetName(),f0,f1,f2,f3))
						sp[(tag,ncat,nh)]['th1'].Write(sp[(tag,ncat,nh)]['th1'].GetName(),TH1.kOverwrite)
						gDirectory.cd(oldwd)
					#tnow = time()
					#tarray += [time01(tstart,tnow,tarray)]

					if 'mbb' in nh:
					#	gROOT.ProcessLineSync('TCanvas *can = new TCanvas("%s","%s",1800,1800)'%(sp[(tag,ncat,nh)]['th1'].GetName()[:100],sp[(tag,ncat,nh)]['th1'].GetName()[:100]))
					#	gROOT.ProcessLineSync('TH1F hroot = (TH1F)gDirectory->FindObjectAny("%s").Clone("%s")'%(sp[(tag,ncat,nh)]['th1'].GetName(),sp[(tag,ncat,nh)]['th1'].GetName()[:100]))
					#	gROOT.ProcessLineSync('double params[8] = {0.,0.,0.,0.,0.,0.,0.,0.}')
					#	gROOT.ProcessLineSync('fitTF1(can,hroot,%.2f,%.2f,%.2f,params,%i)'%(90.+offset[ncat],160.+offset[ncat],(float(variables[nh]['xmax'])-float(variables[nh]['xmin']))/float(variables[nh]['nbins_x']),colours[ncat]))
					#	sp[(tag,ncat,nh)]['tf1']['params'] = dc(list(ROOT.params))
					#	count = 0
					#	for i in ROOT.can.GetListOfPrimitives():
					#		if i.IsA().GetName() == "RooCurve" and count==0:
					#			sp[(tag,ncat,nh)]['tf1']['ful'] = i.Clone()
					#			count += 1
					#		elif i.IsA().GetName() == "RooCurve" and count==1:
					#			sp[(tag,ncat,nh)]['tf1']['bkg'] = i.Clone()
					#			count += 1
					#			break
					#	gROOT.ProcessLineSync('can.Close()')
						sp[(tag,ncat,nh)]['th1'].Scale(1./float(sp[(tag,ncat,nh)]['th1'].Integral()))
						c = TCanvas("%s"%(sp[(tag,ncat,nh)]['th1'].GetName()[:100]),"%s"%(sp[(tag,ncat,nh)]['th1'].GetName()[:100]),1800,1800)
						h = sp[(tag,ncat,nh)]['th1'].Clone(sp[(tag,ncat,nh)]['th1'].GetName()[:100])
						params = [0.]*9
						fitTF1(c,h,50,200,(float(variables[nh]['xmax'])-float(variables[nh]['xmin']))/float(variables[nh]['nbins_x']),params,colours[ncat])
						#print params
						sp[(tag,ncat,nh)]['tf1']['params'] = dc(list(params))
						count = 0
						for i in c.GetListOfPrimitives():
							if i.IsA().GetName() == "RooCurve" and count==0:
								sp[(tag,ncat,nh)]['tf1']['ful'] = i.Clone()
								count += 1
							elif i.IsA().GetName() == "RooCurve" and count==1:
								sp[(tag,ncat,nh)]['tf1']['bkg'] = i.Clone()
								count += 1
								break
						c.Close()
					
			for inh,nh in enumerate([variables[x]['var'] for x in opts.variable]):
				if catveto(tag,nh): continue
	
				# JES Up/Dn
				if 'HbbJESUp' in friends:
					sp[(tag,'Hbb',nh)]['th1']      		= style01(sp[(tag,'Hbb',nh)]['th1'],kBlack,kGray)
					sp[(tag,'HbbJESUp',nh)]['th1'] 		= style01(sp[(tag,'HbbJESUp',nh)]['th1'],kBlue+1,None,1)#7
					sp[(tag,'HbbJESDn',nh)]['th1'] 		= style01(sp[(tag,'HbbJESDn',nh)]['th1'],kRed+1,None,1)#10
					sp[(tag,'JES',nh)]['tca'],numbersJES   = func01(opts,tag,sp[(tag,'JES',nh)]['tca'],dict((y,(sp[(tag,y,nh)]['th1'],sp[(tag,y,nh)]['tf1'],None)) for y in ['Hbb','HbbJESUp','HbbJESDn']),SEL[tag],TRG[tag]) 

				# JER Up/Dn
				if 'HbbJERCl' in friends:
					sp[(tag,'HbbJERUp',nh)]['th1'] 		= style01(sp[(tag,'HbbJERUp',nh)]['th1'],kViolet+1,None,1)#7
					sp[(tag,'HbbJERCl',nh)]['th1'] 		= style01(sp[(tag,'HbbJERCl',nh)]['th1'],kSpring-1,None,1)#7
					#sp[(tag,'HbbJERDn',nh)]['th1'] 		= style01(sp[(tag,'HbbJERDn',nh)]['th1'],kMagenta+1,None,9)#10
					sp[(tag,'JER',nh)]['tca'],numbersJER   = func01(opts,tag,sp[(tag,'JER',nh)]['tca'],dict((y,(sp[(tag,y,nh)]['th1'],sp[(tag,y,nh)]['tf1'],sp[(tag,y,nh[0:3]+'Uns'+nh[3:])]['th1'] if 'jetPt' in nh else None)) for y in ['Hbb','HbbJERUp','HbbJERCl']),SEL[tag],TRG[tag]) #,'HbbJERDn'
				
				# table
				numbers = {}
				if not numbersJES=={}: 
					for k,v in sorted(numbersJES.iteritems()): numbers[k] = v
				if not numbersJER=={}: 
					for k,v in sorted(numbersJER.iteritems()): numbers[k] = v
				
				if 'mva' in nh:
					labels = ['Categories','JES Up','JES Down','JER','JER$^{+}$ wrt. JER']
					print "\\begin{table}\n\t\\caption{Jet-energy scale and resolution uncertainty values per category.}\\centering \\small\n\t\\begin{tabular}{|*{%d}{c|}} \\hline"%(len(labels))
					print "\t",
					for il,l in enumerate(labels):
						print "%20s%s"%("\makebox[2.2cm]{%s}"%l," &" if not il==len(labels)-1 else ""),
					print "\\\\ \\hline\\hline"
					for i,(cl,cu) in enumerate(sorted(list(set([(cl,cu) for (n,cl,cu) in numbers.iterkeys()])))):
						print "\t%20d &"%(i-1 if not 'VBF' in tag else (i+3 if not i==0 else -2)),
						for j,n in enumerate(['HbbJESUp','HbbJESDn','HbbJERCl','HbbJERUp']):
							if n=='HbbJERUp': 	   print "%20.4f"%(1-numbers[(n,cl,cu)]),
							elif not n=='HbbJERCl': print "%20.3f &"%(1+numbers[(n,cl,cu)]),
							else:                   print "%20.3f &"%numbers[(n,cl,cu)],
						print "\\\\ \\hline"
					if 'NOM' in tag: print "\t\\hline"
					else: print ""
					print "\\end{tabular}\n\\end{table}"