예제 #1
0
def main(args, opt):
    trees = {}
    for filename in os.listdir(args[0]):
        if not os.path.splitext(filename)[1] == '.root': continue
        isdata, pname, splitno = resolveFilename(filename)
        treefile = os.path.join(args[0], filename)
        tfile = ROOT.TFile.Open(treefile, 'READ')
        trees[pname] = tfile.Get(TREENAME)

    try:
        cachefile = open('genmlbhists.pck', 'r')
        hists = pickle.load(cachefile)
        print '>>> Read syst histos from cache (.svlsysthistos.pck)'
        cachefile.close()
    except IOError:
        hists = {}

        for tag, sel in MLBSELECTIONS:
            for pname in trees.keys():
                print '... processing', pname, tag
                hists[(pname, tag)] = getHistoFromTree(trees[pname],
                                                       sel=sel,
                                                       var='GenMlb',
                                                       hname="GenMlb_%s_%s" %
                                                       (pname, tag),
                                                       nbins=100,
                                                       xmin=0,
                                                       xmax=200,
                                                       titlex=MLBAXISTITLE)

        cachefile = open('genmlbhists.pck', 'w')
        pickle.dump(hists, cachefile, pickle.HIGHEST_PROTOCOL)
        print '>>> Dumped histos to cachefile (genmlbhists.pck)'
        cachefile.close()

    ROOT.gStyle.SetOptTitle(0)
    ROOT.gStyle.SetOptStat(0)
    ROOT.gROOT.SetBatch(1)

    for tag, _ in MLBSELECTIONS:
        plot = RatioPlot('genmlb')
        plot.normalized = False
        plot.add(hists[('TTJets_MSDecays_172v5', tag)], 'Nominal')
        plot.add(hists[('TTJets_MSDecays_scaleup', tag)], 'Q^{2} scale up')
        plot.add(hists[('TTJets_MSDecays_scaledown', tag)], 'Q^{2} scale down')
        plot.tag = "Generator level m_{lb} shape"
        if tag == 'cor':
            plot.subtag = "Correct combinations"
        else:
            plot.subtag = "Wrong combinations"
        plot.ratiotitle = 'Ratio wrt nominal'
        plot.titlex = MLBAXISTITLE
        plot.tagpos = (0.22, 0.85)
        plot.subtagpos = (0.22, 0.78)
        plot.legpos = (0.20, 0.55)
        plot.ratiorange = (0.85, 1.15)
        plot.colors = [ROOT.kBlue - 3, ROOT.kRed - 4, ROOT.kOrange - 3]
        plot.show("genmlb_scale_%s" % tag, opt.outDir)

    return 0
예제 #2
0
def main(args, opt):
	trees = {}
	for filename in os.listdir(args[0]):
		if not os.path.splitext(filename)[1] == '.root': continue
		isdata, pname, splitno = resolveFilename(filename)
		treefile = os.path.join(args[0], filename)
		tfile = ROOT.TFile.Open(treefile,'READ')
		trees[pname] = tfile.Get(TREENAME)


	try:
		cachefile = open('genmlbhists.pck', 'r')
		hists = pickle.load(cachefile)
		print '>>> Read syst histos from cache (.svlsysthistos.pck)'
		cachefile.close()
	except IOError:
		hists = {}

		for tag,sel in MLBSELECTIONS:
			for pname in trees.keys():
				print '... processing', pname, tag
				hists[(pname,tag)] = getHistoFromTree(trees[pname],
				                                sel=sel,
				                                var='GenMlb',
			                                    hname="GenMlb_%s_%s"%(pname,tag),
		                                        nbins=100,xmin=0,xmax=200,
		                                        titlex=MLBAXISTITLE)

		cachefile = open('genmlbhists.pck', 'w')
		pickle.dump(hists, cachefile, pickle.HIGHEST_PROTOCOL)
		print '>>> Dumped histos to cachefile (genmlbhists.pck)'
		cachefile.close()


	ROOT.gStyle.SetOptTitle(0)
	ROOT.gStyle.SetOptStat(0)
	ROOT.gROOT.SetBatch(1)


	for tag,_ in MLBSELECTIONS:
		plot = RatioPlot('genmlb')
		plot.normalized = False
		plot.add(hists[('TTJets_MSDecays_172v5', tag)],     'Nominal')
		plot.add(hists[('TTJets_MSDecays_scaleup', tag)],   'Q^{2} scale up')
		plot.add(hists[('TTJets_MSDecays_scaledown', tag)], 'Q^{2} scale down')
		plot.tag = "Generator level m_{lb} shape"
		if tag == 'cor':
			plot.subtag = "Correct combinations"
		else:
			plot.subtag = "Wrong combinations"
		plot.ratiotitle = 'Ratio wrt nominal'
		plot.titlex = MLBAXISTITLE
		plot.tagpos    = (0.22, 0.85)
		plot.subtagpos = (0.22, 0.78)
		plot.legpos = (0.20, 0.55)
		plot.ratiorange = (0.85, 1.15)
		plot.colors = [ROOT.kBlue-3, ROOT.kRed-4, ROOT.kOrange-3]
		plot.show("genmlb_scale_%s"%tag, opt.outDir)

	return 0
예제 #3
0
def makeSVMassPlots(histodict):
	ratplot = RatioPlot('SVMass')
	ratplot.normalized = True
	ratplot.ratiorange = (0.5,1.5)
	ratplot.legpos = (0.65, 0.60)
	ratplot.ratiotitle = 'Data/MC'
	ratplot.extratext = '' #Work in Progress'
	ratplot.tag = "Inclusive"
	# ratplot.tag = "e#mu channel"
	ratplot.tagpos = (0.80,0.55)
	ratplot.add(histodict[('nominal','SVMass',3)], 'N_{trk}=3 t#bar{t} MC', includeInRatio=False)
	ratplot.add(histodict[('data',   'SVMass',3)], 'N_{trk}=3 Data',        includeInRatio=True)
	ratplot.add(histodict[('nominal','SVMass',4)], 'N_{trk}=4 t#bar{t} MC', includeInRatio=False)
	ratplot.add(histodict[('data',   'SVMass',4)], 'N_{trk}=4 Data',        includeInRatio=True)
	ratplot.add(histodict[('nominal','SVMass',5)], 'N_{trk}=5 t#bar{t} MC', includeInRatio=False)
	ratplot.add(histodict[('data',   'SVMass',5)], 'N_{trk}=5 Data',        includeInRatio=True)

	ratplot.reference =     [histodict[('nominal','SVMass',3)]]
	ratplot.reference.append(histodict[('nominal','SVMass',4)])
	ratplot.reference.append(histodict[('nominal','SVMass',5)])

	ratplot.colors = [ROOT.kMagenta+1, ROOT.kMagenta+1,
	                  ROOT.kViolet+2, ROOT.kViolet+2,
	                  ROOT.kAzure+7, ROOT.kAzure+7]

	ratplot.drawoptions =  ['hist', 'PE', 'hist', 'PE', 'hist', 'PE']
	ratplot.markerstyles = [24, 24, 25, 25, 26, 26]
	ratplot.markersizes = len(ratplot.histos)*[1.4]
	ratplot.show('svmassplot',opt.outDir)
	ratplot.saveRatios('svmass_weights',opt.outDir,['SVMass_weight_3','SVMass_weight_4','SVMass_weight_5'])
예제 #4
0
def makeMassPlot(histos, outname, tag='', subtag=''):
	ratplot = RatioPlot('ratioplot')
	ratplot.normalized = False
	ratplot.ratiotitle = "Ratio wrt 172.5 GeV"
	ratplot.extratext = ''
	ratplot.tag = tag
	ratplot.subtag = subtag
	ratplot.legpos = (0.65, 0.62)
	ratplot.ratiorange = (0.7, 1.3)
	ratplot.titlex = 'm_{svl} [GeV]'
	ratplot.xlabelsize = 28
	ratplot.xtitlesize = 34
	ratplot.ylabelsize = 28
	ratplot.ytitlesize = 34
	ratplot.ytitleoffset = 1.8
	ratplot.xtitleoffset = 3
	ratplot.legendtextsize = 28
	ratplot.legendrowsize = 0.08
	ratplot.reference = [histos[172.5]]
        ratplot.titley = "Combinations / %3.1f GeV" %histos['data'].GetXaxis().GetBinWidth(1)

	####################################################
	# Construct dummy data for now
	# dummy = histos[172.5].Clone('dummy_data')
	# dummy.Reset('ICE')
	# dummy.FillRandom(histos[173.5], ROOT.gRandom.Poisson(histos[172.5].Integral()))
	# ratplot.add(dummy,'Pseudo Data (@173.5 GeV)')
	####################################################

	####################################################
	# REAL DATA:
	ratplot.add(histos['data'], 'Data')
	####################################################

	# histos[MASSESTOPLOT[0]].SetLineStyle(2)
	# histos[MASSESTOPLOT[-1]].SetLineStyle(3)


	for mass in MASSESTOPLOT:
		legentry = 'm_{t} = %5.1f GeV' % mass
		try:
			histo = histos[mass]
			ratplot.add(histo, legentry, includeInRatio=(mass != 172.5))
		except KeyError: pass

	# ratplot.colors = [ROOT.kBlack, ROOT.kAzure-4, ROOT.kAzure+1, ROOT.kAzure-6]

	# ratplot.colors = [ROOT.kBlack, ROOT.kAzure-2, ROOT.kGray, ROOT.kOrange+9]
	ratplot.colors = [ROOT.kBlack, ROOT.kSpring-8, ROOT.kGray+1, ROOT.kOrange+9]

	# ratplot.colors = [ROOT.kBlack, ROOT.kOrange-4, ROOT.kOrange-3, ROOT.kOrange+9]

	ratplot.drawoptions = ['PE', 'hist', 'hist', 'hist']
	ratplot.markerstyles = [20,1,1,1]
	ratplot.markersizes =  [1.5,1,1,1]
	ratplot.ratioydivisions = 405
	ratplot.show("massscan_paper_%s"%outname, opt.outDir)
예제 #5
0
def makeSVMassPlots(histodict):
    ratplot = RatioPlot('SVMass')
    ratplot.normalized = True
    ratplot.ratiorange = (0.5, 1.5)
    ratplot.legpos = (0.65, 0.60)
    ratplot.ratiotitle = 'Data/MC'
    ratplot.extratext = ''  #Work in Progress'
    ratplot.tag = "Inclusive"
    # ratplot.tag = "e#mu channel"
    ratplot.tagpos = (0.80, 0.55)
    ratplot.add(histodict[('nominal', 'SVMass', 3)],
                'N_{trk}=3 t#bar{t} MC',
                includeInRatio=False)
    ratplot.add(histodict[('data', 'SVMass', 3)],
                'N_{trk}=3 Data',
                includeInRatio=True)
    ratplot.add(histodict[('nominal', 'SVMass', 4)],
                'N_{trk}=4 t#bar{t} MC',
                includeInRatio=False)
    ratplot.add(histodict[('data', 'SVMass', 4)],
                'N_{trk}=4 Data',
                includeInRatio=True)
    ratplot.add(histodict[('nominal', 'SVMass', 5)],
                'N_{trk}=5 t#bar{t} MC',
                includeInRatio=False)
    ratplot.add(histodict[('data', 'SVMass', 5)],
                'N_{trk}=5 Data',
                includeInRatio=True)

    ratplot.reference = [histodict[('nominal', 'SVMass', 3)]]
    ratplot.reference.append(histodict[('nominal', 'SVMass', 4)])
    ratplot.reference.append(histodict[('nominal', 'SVMass', 5)])

    ratplot.colors = [
        ROOT.kMagenta + 1, ROOT.kMagenta + 1, ROOT.kViolet + 2,
        ROOT.kViolet + 2, ROOT.kAzure + 7, ROOT.kAzure + 7
    ]

    ratplot.drawoptions = ['hist', 'PE', 'hist', 'PE', 'hist', 'PE']
    ratplot.markerstyles = [24, 24, 25, 25, 26, 26]
    ratplot.markersizes = len(ratplot.histos) * [1.4]
    ratplot.show('svmassplot', opt.outDir)
    ratplot.saveRatios(
        'svmass_weights', opt.outDir,
        ['SVMass_weight_3', 'SVMass_weight_4', 'SVMass_weight_5'])
예제 #6
0
def main(args, opt):
    os.system('mkdir -p %s' % opt.outDir)
    masstrees, massfiles = getMassTrees(args[0], verbose=True)
    masspoints = sorted(list(set([mass for mass, _ in masstrees.keys()])))

    hname_to_keys = {}  # hname -> (tag, chan, mass, comb, [ntk1])

    tasklist = {}  ## (mass,chan) -> tasks
    for (mass, chan) in masstrees.keys():
        tasks = []
        for tag, sel, _ in SELECTIONS:

            #htag = ("%s_%5.1f_tt"%(tag,mass)).replace('.','')
            #if not chan == 'tt':
            htag = ("%s_%5.1f_%s" % (tag, mass, chan)).replace('.', '')

            for comb, combsel in COMBINATIONS.iteritems():
                hname = "SVLMass_%s_%s" % (comb, htag)
                finalsel = "%s*(%s&&%s)" % (COMMONWEIGHT, sel, combsel)
                tasks.append((hname, 'SVLMass', finalsel, NBINS, XMIN, XMAX,
                              MASSXAXISTITLE))
                hname_to_keys[hname] = (tag, chan, mass, comb)

                for ntk1, ntk2 in NTRKBINS:
                    tksel = "(SVNtrk>=%d && SVNtrk<%d)" % (ntk1, ntk2)
                    finalsel = "%s*(%s&&%s&&%s)" % (COMMONWEIGHT, sel, combsel,
                                                    tksel)
                    hname = "SVLMass_%s_%s_%d" % (comb, htag, ntk1)
                    tasks.append((hname, 'SVLMass', finalsel, NBINS, XMIN,
                                  XMAX, MASSXAXISTITLE))
                    hname_to_keys[hname] = (tag, chan, mass, comb, ntk1)

        tasklist[(mass, chan)] = tasks

    if not opt.cache:
        runTasks(massfiles, tasklist, opt, 'mass_histos')

        ## Retrieve the histograms from the individual files
        # (tag, chan, mass, comb)      -> histo
        # (tag, chan, mass, comb, ntk) -> histo
        masshistos = gatherHistosFromFiles(
            tasklist, massfiles, os.path.join(opt.outDir, 'mass_histos'),
            hname_to_keys)

        cachefile = open(".svlmasshistos.pck", 'w')
        pickle.dump(masshistos, cachefile, pickle.HIGHEST_PROTOCOL)
        cachefile.close()
        print 'Wrote .svlmasshistos.pck with all the mass histos'

    else:
        ## Read mass scan histos:
        cachefile = open(".svlmasshistos.pck", 'r')
        masshistos = pickle.load(cachefile)
        print '>>> Read mass scan histograms from cache (.svlmasshistos.pck)'
        cachefile.close()

    # ofi = ROOT.TFile(os.path.join(opt.outDir,'masshistos.root'),
    # 													   'recreate')
    # ofi.cd()

    # for key in masshistos.keys():
    # 	tag, chan, mass = key[0],key[1],key[2]
    # 	if not ofi.cd(tag):
    # 		outDir = ofi.mkdir(tag)
    # 		outDir.cd()

    # 	for comb in COMBINATIONS.keys():
    # 		masshistos[(tag,chan,mass,comb)].Write()
    # 		for ntk,_ in NTRKBINS:
    # 			masshistos[(tag,chan,mass,comb,ntk)].Write()
    # ofi.Write()
    # ofi.Close()

    ROOT.gStyle.SetOptTitle(0)
    ROOT.gStyle.SetOptStat(0)
    ROOT.gROOT.SetBatch(1)

    cachefile = open(".xsecweights.pck", 'r')
    xsecweights = pickle.load(cachefile)
    cachefile.close()
    print '>>> Read xsec weights from cache (.xsecweights.pck)'

    ## Scale all the histograms for the plotting:
    for key, hist in masshistos.iteritems():
        hist.Scale(LUMI * xsecweights[CHANMASSTOPROCNAME[(key[1], key[2])]])

    errorGetters = {}  # tag -> function(chi2) -> error
    systematics = {}  # (seltag, systname) -> error
    mass_scan_dir = os.path.join(opt.outDir, 'mass_scans')
    for tag, sel, seltag in SELECTIONS:
        print "... processing %s" % tag
        pairing = 'inclusive'
        try:
            pairing = tag.split('_', 1)[1]
        except IndexError:
            pass

        for chan in ['tt', 't', 'tbar', 'tW', 'tbarW']:
            # print "   %s channel" % chan
            ## Skip some useless combinations:
            chanTitle = chan
            if chanTitle == 'tt': chanTitle = 'ttbar'
            chanTitle = chanTitle.replace('tbar', '#bar{t}')
            if chan in ['t', 'tbar'] and ('ee' in tag or 'mm' in tag
                                          or 'em' in tag):
                continue
            if chan in ['tW', 'tbarW'] and tag in [
                    'e', 'm', 'eplus', 'eminus', 'mplus', 'mminus',
                    'e_optmrank', 'm_optmrank', 'eplus_optmrank',
                    'eminus_optmrank', 'mplus_optmrank', 'mminus_optmrank'
            ]:
                continue

            ratplot = RatioPlot('ratioplot')
            ratplot.normalized = False
            ratplot.ratiotitle = "Ratio wrt 172.5 GeV"
            ratplot.ratiorange = (0.5, 1.5)
            ratplot.rebin = 2

            reference = masshistos[(tag, chan, 172.5, 'tot')]
            ratplot.reference = reference

            for mass in masspoints:
                legentry = 'm_{t} = %5.1f GeV' % mass
                try:
                    histo = masshistos[(tag, chan, mass, 'tot')]
                    ratplot.add(histo, legentry)
                except KeyError:
                    pass
                # print "Can't find ", (tag,chan,mass,'tot')

            ratplot.tag = 'All combinations'
            ratplot.subtag = '%s %s' % (seltag, chanTitle)
            ratplot.show("massscan_%s_%s_tot" % (tag, chan), mass_scan_dir)

            # chi2s = ratplot.getChiSquares(rangex=FITRANGE)
            # chi2stofit = []
            # for legentry in sorted(chi2s.keys()):
            # 	chi2stofit.append((float(legentry[8:-4]), chi2s[legentry]))
            # errorGetters[tag] = fitChi2(chi2stofit,
            # 							tag=seltag,
            # 							oname=os.path.join(mass_scan_dir,
            # 						    "chi2_simple_fit_%s.pdf"%tag),
            # 							drawfit=False)
            ratplot.reset()

            ratplot.reference = masshistos[(tag, chan, 172.5, 'cor')]
            for mass in masspoints:
                legentry = 'm_{t} = %5.1f GeV' % mass
                try:
                    ratplot.add(masshistos[(tag, chan, mass, 'cor')], legentry)
                except KeyError:
                    pass
            ratplot.tag = 'Correct combinations'
            ratplot.subtag = '%s %s' % (seltag, chanTitle)
            ratplot.show("massscan_%s_%s_cor" % (tag, chan), mass_scan_dir)
            ratplot.reset()

            ratplot.reference = masshistos[(tag, chan, 172.5, 'wro')]
            for mass in masspoints:
                legentry = 'm_{t} = %5.1f GeV' % mass
                try:
                    ratplot.add(masshistos[(tag, chan, mass, 'wro')], legentry)
                except KeyError:
                    pass
            ratplot.tag = 'Wrong combinations'
            ratplot.subtag = '%s %s' % (seltag, chanTitle)
            ratplot.show("massscan_%s_%s_wro" % (tag, chan), mass_scan_dir)
            ratplot.reset()

            ratplot.reference = masshistos[(tag, chan, 172.5, 'unm')]
            for mass in masspoints:
                legentry = 'm_{t} = %5.1f GeV' % mass
                try:
                    ratplot.add(masshistos[(tag, chan, mass, 'unm')], legentry)
                except KeyError:
                    pass
            ratplot.tag = 'Unmatched combinations'
            ratplot.subtag = '%s %s' % (seltag, chanTitle)
            ratplot.show("massscan_%s_%s_unm" % (tag, chan), mass_scan_dir)
            ratplot.reset()

        ## ntkscan plot
        if 'inclusive' in tag:
            ntkmassplot = RatioPlot('ntkmassplot_%s' % tag)
            ntkmassplot.rebin = 2
            ntkmassplot.reference = [masshistos[(tag, 'tt', 172.5, 'tot')]]
            ntkmassplot.add(masshistos[(tag, 'tt', 172.5, 'tot')],
                            'Sum',
                            includeInRatio=False)
            for ntk1, ntk2 in NTRKBINS:
                title = "%d #leq N_{trk.} < %d" % (ntk1, ntk2)
                if ntk2 > 100:
                    title = "%d #leq N_{trk.}" % (ntk1)
                ntkmassplot.add(masshistos[(tag, 'tt', 172.5, 'tot', ntk1)],
                                title)
            ntkmassplot.colors = [
                ROOT.kOrange + 8, ROOT.kGreen + 3, ROOT.kGreen + 1,
                ROOT.kGreen, ROOT.kGreen - 10, ROOT.kYellow - 3,
                ROOT.kYellow - 5
            ]
            ntkmassplot.ratiorange = (0, 3.0)
            ntkmassplot.ratiotitle = "Ratio wrt Sum"
            ntkmassplot.tag = 'm_{t} = 172.5 GeV'
            ntkmassplot.subtag = '%s, %s' % (pairing, seltag)
            ntkmassplot.show("ntkscan_%s" % tag, opt.outDir)
            ntkmassplot.reset()

    #fractions
    for tag, sel, seltag in SELECTIONS:
        print 70 * '-'
        print '%-10s: %s %s' % (tag, sel, seltag)
        if not ('inclusive' in tag): continue
        fcor, fwro, funm = {}, {}, {}
        for mass, proc in sorted(massfiles.keys()):
            # mass = 172.5
            ncount = {}
            for comb in ['tot', 'cor', 'wro', 'unm']:
                hist = masshistos[(tag, proc, mass, comb)]
                ncount[comb] = hist.Integral()
            fcor[mass] = 100. * (ncount['cor'] / float(ncount['tot']))
            fwro[mass] = 100. * (ncount['wro'] / float(ncount['tot']))
            funm[mass] = 100. * (ncount['unm'] / float(ncount['tot']))
            print(
                '  %-6s %5.1f GeV: %7d entries \t'
                '(%4.1f%% corr, %4.1f%% wrong, %4.1f%% unmatched)' %
                (proc, mass, ncount['tot'], fcor[mass], fwro[mass],
                 funm[mass]))
        oname = os.path.join(opt.outDir, 'fracvsmt_%s' % tag)
        plotFracVsTopMass(fcor, fwro, funm, tag, seltag, oname)

    return 0
예제 #7
0
def main(args, opt):
	os.system('mkdir -p %s'%opt.outDir)
	masstrees, massfiles = getMassTrees(args[0], verbose=True)
	masspoints = sorted(list(set([mass for mass,_ in masstrees.keys()])))

	hname_to_keys = {} # hname -> (tag, chan, mass, comb, [ntk1])

	tasklist = {} ## (mass,chan) -> tasks
	for (mass,chan) in masstrees.keys():
		tasks = []
		for tag,sel,_ in SELECTIONS:

			#htag = ("%s_%5.1f_tt"%(tag,mass)).replace('.','')
			#if not chan == 'tt':
			htag = ("%s_%5.1f_%s"%(tag,mass,chan)).replace('.','')

			for comb,combsel in COMBINATIONS.iteritems():
				hname = "SVLMass_%s_%s" % (comb, htag)
				finalsel = "%s*(%s&&%s)"%(COMMONWEIGHT,sel,combsel)
				tasks.append((hname, 'SVLMass', finalsel,
							  NBINS, XMIN, XMAX, MASSXAXISTITLE))
				hname_to_keys[hname] = (tag, chan, mass, comb)

				for ntk1,ntk2 in NTRKBINS:
					tksel = "(SVNtrk>=%d && SVNtrk<%d)"%(ntk1,ntk2)
					finalsel = "%s*(%s&&%s&&%s)"%(COMMONWEIGHT, sel,
												  combsel,tksel)
					hname = "SVLMass_%s_%s_%d" % (comb, htag, ntk1)
					tasks.append((hname, 'SVLMass', finalsel,
								  NBINS, XMIN, XMAX, MASSXAXISTITLE))
					hname_to_keys[hname] = (tag, chan, mass, comb, ntk1)

		tasklist[(mass,chan)] = tasks

	if not opt.cache:
		runTasks(massfiles, tasklist, opt, 'mass_histos')

		## Retrieve the histograms from the individual files
		# (tag, chan, mass, comb)      -> histo
		# (tag, chan, mass, comb, ntk) -> histo
		masshistos = gatherHistosFromFiles(tasklist, massfiles,
						   os.path.join(opt.outDir,
								'mass_histos'),
						   hname_to_keys)

		cachefile = open(".svlmasshistos.pck", 'w')
		pickle.dump(masshistos, cachefile, pickle.HIGHEST_PROTOCOL)
		cachefile.close()
		print 'Wrote .svlmasshistos.pck with all the mass histos'

	else:
		## Read mass scan histos:
		cachefile = open(".svlmasshistos.pck", 'r')
		masshistos = pickle.load(cachefile)
		print '>>> Read mass scan histograms from cache (.svlmasshistos.pck)'
		cachefile.close()

	# ofi = ROOT.TFile(os.path.join(opt.outDir,'masshistos.root'),
	# 													   'recreate')
	# ofi.cd()

	# for key in masshistos.keys():
	# 	tag, chan, mass = key[0],key[1],key[2]
	# 	if not ofi.cd(tag):
	# 		outDir = ofi.mkdir(tag)
	# 		outDir.cd()

	# 	for comb in COMBINATIONS.keys():
	# 		masshistos[(tag,chan,mass,comb)].Write()
	# 		for ntk,_ in NTRKBINS:
	# 			masshistos[(tag,chan,mass,comb,ntk)].Write()
	# ofi.Write()
	# ofi.Close()

	ROOT.gStyle.SetOptTitle(0)
	ROOT.gStyle.SetOptStat(0)
	ROOT.gROOT.SetBatch(1)


	cachefile = open(".xsecweights.pck", 'r')
	xsecweights = pickle.load(cachefile)
	cachefile.close()
	print '>>> Read xsec weights from cache (.xsecweights.pck)'

	## Scale all the histograms for the plotting:
	for key, hist in masshistos.iteritems():
		hist.Scale(LUMI*xsecweights[CHANMASSTOPROCNAME[(key[1], key[2])]])


	errorGetters = {} # tag -> function(chi2) -> error
	systematics = {} # (seltag, systname) -> error
	mass_scan_dir = os.path.join(opt.outDir, 'mass_scans')
	for tag,sel,seltag in SELECTIONS:
		print "... processing %s"%tag
		pairing = 'inclusive'
		try: pairing = tag.split('_',1)[1]
		except IndexError: pass

		for chan in ['tt', 't', 'tbar', 'tW', 'tbarW']:
			# print "   %s channel" % chan
			## Skip some useless combinations:
			chanTitle=chan
			if chanTitle=='tt' : chanTitle='ttbar'
			chanTitle=chanTitle.replace('tbar','#bar{t}')
			if chan in ['t','tbar'] and ('ee' in tag or 'mm' in tag or 'em' in tag):
				continue
			if chan in ['tW','tbarW'] and tag in ['e', 'm',
							      'eplus','eminus', 'mplus','mminus',
							      'e_optmrank', 'm_optmrank',
							      'eplus_optmrank','eminus_optmrank', 'mplus_optmrank','mminus_optmrank']:
				continue

			ratplot = RatioPlot('ratioplot')
			ratplot.normalized = False
			ratplot.ratiotitle = "Ratio wrt 172.5 GeV"
			ratplot.ratiorange = (0.5, 1.5)
			ratplot.rebin = 2

			reference = masshistos[(tag,chan,172.5,'tot')]
			ratplot.reference = reference

			for mass in masspoints:
				legentry = 'm_{t} = %5.1f GeV' % mass
				try:
					histo = masshistos[(tag,chan,mass,'tot')]
					ratplot.add(histo, legentry)
				except KeyError: pass
					# print "Can't find ", (tag,chan,mass,'tot')


			ratplot.tag = 'All combinations'
			ratplot.subtag = '%s %s' % (seltag, chanTitle)
			ratplot.show("massscan_%s_%s_tot"%(tag,chan), mass_scan_dir)

			# chi2s = ratplot.getChiSquares(rangex=FITRANGE)
			# chi2stofit = []
			# for legentry in sorted(chi2s.keys()):
			# 	chi2stofit.append((float(legentry[8:-4]), chi2s[legentry]))
			# errorGetters[tag] = fitChi2(chi2stofit,
			# 							tag=seltag,
			# 							oname=os.path.join(mass_scan_dir,
			# 						    "chi2_simple_fit_%s.pdf"%tag),
			# 							drawfit=False)
			ratplot.reset()

			ratplot.reference = masshistos[(tag,chan,172.5,'cor')]
			for mass in masspoints:
				legentry = 'm_{t} = %5.1f GeV' % mass
				try: ratplot.add(masshistos[(tag,chan,mass,'cor')], legentry)
				except KeyError: pass
			ratplot.tag = 'Correct combinations'
			ratplot.subtag = '%s %s' % (seltag, chanTitle)
			ratplot.show("massscan_%s_%s_cor"%(tag,chan), mass_scan_dir)
			ratplot.reset()

			ratplot.reference = masshistos[(tag,chan,172.5,'wro')]
			for mass in masspoints:
				legentry = 'm_{t} = %5.1f GeV' % mass
				try: ratplot.add(masshistos[(tag,chan,mass,'wro')], legentry)
				except KeyError: pass
			ratplot.tag = 'Wrong combinations'
			ratplot.subtag = '%s %s' % (seltag, chanTitle)
			ratplot.show("massscan_%s_%s_wro"%(tag,chan), mass_scan_dir)
			ratplot.reset()

			ratplot.reference = masshistos[(tag,chan,172.5,'unm')]
			for mass in masspoints:
				legentry = 'm_{t} = %5.1f GeV' % mass
				try: ratplot.add(masshistos[(tag,chan,mass,'unm')], legentry)
				except KeyError: pass
			ratplot.tag = 'Unmatched combinations'
			ratplot.subtag = '%s %s' % (seltag, chanTitle)
			ratplot.show("massscan_%s_%s_unm"%(tag,chan), mass_scan_dir)
			ratplot.reset()


		## ntkscan plot
		if 'inclusive' in tag:
			ntkmassplot = RatioPlot('ntkmassplot_%s'%tag)
			ntkmassplot.rebin = 2
			ntkmassplot.reference = [masshistos[(tag, 'tt', 172.5, 'tot')]]
			ntkmassplot.add(masshistos[(tag, 'tt', 172.5, 'tot')], 'Sum', includeInRatio=False)
			for ntk1,ntk2 in NTRKBINS:
				title = "%d #leq N_{trk.} < %d" %(ntk1, ntk2)
				if ntk2 > 100:
					title = "%d #leq N_{trk.}" %(ntk1)
				ntkmassplot.add(masshistos[(tag, 'tt', 172.5, 'tot', ntk1)],
					            title)
			ntkmassplot.colors = [ROOT.kOrange+8,
			                      ROOT.kGreen+3, ROOT.kGreen+1,
								  ROOT.kGreen, ROOT.kGreen-10,
								  ROOT.kYellow-3, ROOT.kYellow-5]
			ntkmassplot.ratiorange = (0,3.0)
			ntkmassplot.ratiotitle = "Ratio wrt Sum"
			ntkmassplot.tag = 'm_{t} = 172.5 GeV'
			ntkmassplot.subtag = '%s, %s' %(pairing, seltag)
			ntkmassplot.show("ntkscan_%s"%tag, opt.outDir)
			ntkmassplot.reset()

	#fractions
	for tag,sel,seltag in SELECTIONS:
		print 70*'-'
	 	print '%-10s: %s %s' % (tag, sel,seltag)
		if not('inclusive' in tag): continue
	 	fcor, fwro, funm = {}, {}, {}
	 	for mass,proc in sorted(massfiles.keys()):
			# mass = 172.5
			ncount={}
			for comb in ['tot','cor','wro','unm']:
				hist = masshistos[(tag,proc, mass,comb)]
				ncount[comb]=hist.Integral()
			fcor[mass] = 100.*(ncount['cor']/float(ncount['tot']))
	 		fwro[mass] = 100.*(ncount['wro']/float(ncount['tot']))
	 		funm[mass] = 100.*(ncount['unm']/float(ncount['tot']))
	 		print ('  %-6s %5.1f GeV: %7d entries \t'
	 			   '(%4.1f%% corr, %4.1f%% wrong, %4.1f%% unmatched)' %
	 			   (proc, mass, ncount['tot'],
	 			   	fcor[mass], fwro[mass], funm[mass]))
		oname = os.path.join(opt.outDir, 'fracvsmt_%s'%tag)
		plotFracVsTopMass(fcor, fwro, funm, tag, seltag, oname)


	return 0
def main(args, opt):
	os.system('mkdir -p %s'%opt.outDir)
	ROOT.gStyle.SetOptTitle(0)
	ROOT.gStyle.SetOptStat(0)
	ROOT.gROOT.SetBatch(1)

	# Construct histograms
	peInputFile = ROOT.TFile.Open(args[0], 'READ')
	masshistos = {}
	for mass in ALLMASSES+['data']:
		masshist = None
		masstag = mass
		if type(mass) == float:
			masstag = 'nominal_'+str(mass).replace('.','v')

		for trk,_ in NTRKBINS:
			ihist = peInputFile.Get('%s/SVLMass_inclusive_optmrank_%s_%d'%(masstag,masstag,trk))
			try:
				masshist.Add(ihist)
			except AttributeError:
				try:
					masshist = ihist.Clone(masstag)
				except ReferenceError:
					print "Histogram not found: %s/SVLMass_inclusive_optmrank_%s_%d"%(masstag,masstag,trk)
					continue
		masshistos[mass] = masshist

	ratplot = RatioPlot('ratioplot')
	ratplot.normalized = False
	ratplot.ratiotitle = "Ratio wrt 172.5 GeV"
	ratplot.tag = 'All channels combined'
	ratplot.extratext = 'Preliminary'
	ratplot.rebin = 1
	ratplot.legpos = (0.55, 0.15)
	ratplot.ratiorange = (0.5, 1.5)
	ratplot.reference = [masshistos[172.5]]

	# Construct dummy data for now
	dummy = masshistos[172.5].Clone('dummy_data')
	dummy.Reset('ICE')
	dummy.FillRandom(masshistos[173.5], ROOT.gRandom.Poisson(masshistos[172.5].Integral()))
	ratplot.add(dummy,'Pseudo Data (@173.5 GeV)')

	####################################################
	# REAL DATA:
	# ratplot.add(masshistos['data'], 'Data')
	####################################################

	for mass in MASSESTOPLOT:
		legentry = 'MC (m_{top} = %5.1f GeV)' % mass
		try:
			histo = masshistos[mass]
			ratplot.add(histo, legentry, includeInRatio=(mass != 172.5))
		except KeyError: pass

	ratplot.colors = [ROOT.kBlack, ROOT.kAzure-4, ROOT.kAzure+1, ROOT.kAzure-6]
	# ratplot.colors = [ROOT.kBlack, ROOT.kOrange-4, ROOT.kOrange-3, ROOT.kOrange+9]

	ratplot.drawoptions = ['PE', 'hist', 'hist', 'hist']
	ratplot.markerstyles = [20,1,1,1]
	ratplot.markersizes =  [1.5,1,1,1]
	ratplot.show("massscan_paper_optmrank", opt.outDir)

	return 0