Exemplo n.º 1
0
def plot_response(histos,profiles,profiles_noReg,profiles_Cat,style=False,outString=None):
    if style==True:
        gROOT.SetBatch(True)
        gROOT.ProcessLineSync(".x /mnt/t3nfs01/data01/shome/nchernya/HHbbgg_ETH_devel/scripts/setTDRStyle.C")
        gROOT.ForceStyle()
        gStyle.SetPadTopMargin(0.06)
        gStyle.SetPadRightMargin(0.04)
        gStyle.SetPadLeftMargin(0.15)
        
    c = ROOT.TCanvas("c","c",900,900)
    c.cd()
    histos.Draw("HISTBOX")
    colors=[ROOT.kRed,ROOT.kOrange-3,ROOT.kAzure+10]
    profiles.SetLineColor(colors[0])
    profiles.SetLineWidth(3)
    profiles.SetMarkerColor(colors[0])
    profiles.SetStats(0)
    profiles.Draw("PLsame")
    profiles_noReg.SetLineColor(colors[1])
    profiles_noReg.SetLineWidth(3)
    profiles_noReg.SetMarkerColor(colors[1])
    profiles_noReg.SetStats(0)
    profiles_noReg.Draw("PLsame")
    profiles_Cat.SetLineColor(colors[2])
    profiles_Cat.SetLineWidth(3)
    profiles_Cat.SetMarkerColor(colors[2])
    profiles_Cat.SetStats(0)
    profiles_Cat.Draw("PLsame")
    line = ROOT.TLine(histos.GetXaxis().GetBinCenter(0),1,histos.GetXaxis().GetBinCenter(histos.GetXaxis().GetNbins()),1)
    line.SetLineStyle(9)
    line.SetLineWidth(3)
    line.SetLineColor(ROOT.kGreen+1)
    line.Draw("Lsame")
    leg = ROOT.TLegend(0.72,0.75,0.95,0.9)
    leg.SetFillStyle(-1)
    leg.SetBorderSize(0)
    leg.SetTextFont(42)
    leg.SetTextSize(0.03)
    leg.AddEntry(profiles,"XGboost","PL")
    leg.AddEntry(profiles_noReg,"no regression","PL")
    leg.AddEntry(profiles_Cat,"HIG-16-044","PL")
    leg.Draw("same")
    
    c.SaveAs(utils.IO.plotFolder+"Response_"+histos.GetTitle()+'_'+str(outString)+'.png')
    c.SaveAs(utils.IO.plotFolder+"Response_"+histos.GetTitle()+'_'+str(outString)+'.pdf')
Exemplo n.º 2
0
    return item[1]


dy = sys.argv[1]

dy_choice = ''
dy_model = ''
if dy == 'amc':
    dy_model = 'AMC@NLO'
    dy_choice = "amc_"
if dy == 'mdg':
    dy_model = 'Madgraph'
    dy_choice = "HT_"

gROOT.SetBatch(True)
gROOT.ProcessLineSync(".x /afs/cern.ch/work/n/nchernya/Hbb/setTDRStyle.C")
gROOT.ForceStyle()
gStyle.SetPadTopMargin(0.06)
gStyle.SetPadRightMargin(0.04)
gStyle.SetPadLeftMargin(0.15)

path = "dcap://t3se01.psi.ch:22125//pnfs/psi.ch/cms/trivcat//store/user/nchernya/VBFZll/plotterOutput/v25/"
end = "_QCDScalenom_JESnom_v25_bdt_alldata.root"

list_nom_data = []
list_denom_data = []
list_nom_dy = []
list_denom_dy = []
list_nom_ewk = []
list_denom_ewk = []
list_nom_ewk_herwig = []
from Merge_DS import Merged_WS
import ROOT
from ROOT import TFile, TCanvas
from ROOT import RooRealVar, RooDataSet, RooWorkspace
from ROOT import RooFit, RooDataHist, RooAddPdf, RooArgList, RooKeysPdf, RooHistPdf, RooArgSet, RooAbsData
from ROOT import gROOT
from datetime import datetime
gROOT.ProcessLineSync('.L functions/Johnson.cxx+')
gROOT.ProcessLineSync('.L functions/Background.cxx+')
from configs.cuts import preselection_cut as offline_cut
"""
This is simple script to perform combinatorial subtraction from log IPCHI2 distribution.
Idea is sraight-forward:
- Fit mass distribution (here, we use three gaussians for signal and generic shape for the Background)
- Estimate number of combinatorials in signal region
- Reweight candidates from background region with negative weights to correct this
"""

def Subtract_Distribution(dataset, DTF_D0sPi_M, LOG_D0_IPCHI2_OWNPV, bin = "undefined", silent = False):

    dataset_sig = RooDataSet("dataset_sig", "Signal region",dataset, RooArgSet(DTF_D0sPi_M, LOG_D0_IPCHI2_OWNPV) ," ( DTF_D0sPi_M < 2015 ) ")
    dataset_bckg = RooDataSet("dataset_bckg", "Background region",dataset, RooArgSet(DTF_D0sPi_M, LOG_D0_IPCHI2_OWNPV) ," ( DTF_D0sPi_M > 2015 ) && ( DTF_D0sPi_M < 2020 ) ")

    #Introduce fit variables
    ## Johnson parameters
    J_mu = RooRealVar("J_mu","J_mu",  2011, 2000, 2020)
    J_sigma = RooRealVar("J_sigma","J_sigma", 0.045, 0.01, 0.1)
    J_delta = RooRealVar("J_delta","J_delta", 0., -1, 1)
    J_gamma = RooRealVar("J_gamma","J_gamma", 0., -1, 1)

    ## Gaussian parameters
Exemplo n.º 4
0
        num] + '>>' + profile_name
    draw_line_profile_noReg = 'Jet_mcPt/Jet_pt:' + features[
        num] + '>>' + profile_name_noReg
    draw_line_profile_Cat = 'Jet_mcPt/Jet_pt_regNew:' + features[
        num] + '>>' + profile_name_Cat
    tree.Draw(draw_line, cuts)
    tree.Draw(draw_line_profile, cuts)
    tree.Draw(draw_line_profile_noReg, cuts)
    tree.Draw(draw_line_profile_Cat, cuts)

# In[4]:

import plotting_utils as plotting

reload(plotting)

gROOT.SetBatch(True)
gROOT.ProcessLineSync(
    ".x /mnt/t3nfs01/data01/shome/nchernya/HHbbgg_ETH_devel/scripts/setTDRStyle.C"
)
gROOT.ForceStyle()
gStyle.SetPadTopMargin(0.06)
gStyle.SetPadRightMargin(0.04)
gStyle.SetPadLeftMargin(0.15)

for i in range(0, len(features)):
    plotting.plot_response(histograms[i], profiles[i], profiles_noReg[i],
                           profiles_Cat[i], False)

# In[ ]:
def rooFit104():

    print ">>> RooClassFactory::makePdf - write class (\"MyPdfV1\") skeleton code..."
    # Write skeleton p.d.f class with variable x,a,b
    # To use this class,
    #   - Edit the file MyPdfV1.cxx and implement the evaluate() method in terms of x,a and b
    #   - Compile and link class with '.x MyPdfV1.cxx+'
    RooClassFactory.makePdf("MyPdfV1", "x,A,B")

    print ">>> write class (\"MyPdfV2\") with added initial value expression..."
    # Write skeleton pdf class with variable x,a,b and given formula expression
    # To use this class,
    #   - Compile and link class with '.x MyPdfV2.cxx+'
    RooClassFactory.makePdf("MyPdfV2", "x,A,B", "", "A*fabs(x)+pow(x-B,2)")

    print ">>> write class (\"MyPdfV3\") with added analytical integral expression..."
    # Write skeleton p.d.f class with variable x,a,b, given formula expression _and_
    # given expression for analytical integral over x
    # To use this class,
    #   - Compile and link class with '.x MyPdfV3.cxx+'
    RooClassFactory.makePdf(
        "MyPdfV3", "x,A,B", "", "A*fabs(x)+pow(x-B,2)", kTRUE, kFALSE,
        "x:(A/2)*(pow(x.max(rangeName),2)+pow(x.min(rangeName),2))+(1./3)*(pow(x.max(rangeName)-B,3)-pow(x.min(rangeName)-B,3))"
    )

    print ">>> compile and load \"MyPdfV3\" class..."
    gROOT.ProcessLineSync(".x MyPdfV3.cxx+")
    #MyPdfV3 = gROOT.LoadClass("MyPdfV3.cxx+") # TClass
    #print ">>> type(%s) = %s" % ("MyPdfV3",type(MyPdfV3))
    from ROOT import MyPdfV3

    print ">>> generate and fit data with \"MyPdfV3\" class...\n"
    a = RooRealVar("a", "a", 1)
    b = RooRealVar("b", "b", 2, -10, 10)
    x = RooRealVar("x", "x", -10, 10)
    pdf = MyPdfV3("pdf", "pdf", x, a, b)
    frame1 = x.frame(Title("Compiled class MyPdfV3"))  # RooPlot
    data = pdf.generate(RooArgSet(x), 1000)  # RooDataSet
    pdf.fitTo(data)
    data.plotOn(frame1, Binning(40))
    pdf.plotOn(frame1)

    print "\n>>> RooClassFactory::makePdfInstance - generate a pdf instance directly..."
    # The RooClassFactory::makePdfInstance() function performs code writing, compiling, linking
    # and object instantiation in one go and can serve as a straight replacement of RooGenericPdf
    y = RooRealVar("y", "y", -20, 20)
    alpha = RooRealVar("alpha", "alpha", 5, 0.1, 10)
    genpdf = RooClassFactory.makePdfInstance(
        "GenPdf", "(1+0.1*fabs(y)+sin(sqrt(fabs(y*alpha+0.1))))",
        RooArgList(y, alpha))  # RooAbsPdf

    print ">>> generate and fit data with pdf instance...\n"
    data2 = genpdf.generate(RooArgSet(y), 10000)  # RooDataSet
    genpdf.fitTo(data2)
    frame2 = y.frame(Title("Compiled version of pdf of rf103"))  # RooPlot
    data2.plotOn(frame2, Binning(50))
    genpdf.plotOn(frame2)

    print "\n>>> draw pdfs and fits on canvas..."
    canvas = TCanvas("canvas", "canvas", 100, 100, 1400, 600)
    canvas.Divide(2)
    canvas.cd(1)
    gPad.SetLeftMargin(0.15)
    gPad.SetRightMargin(0.02)
    frame1.GetYaxis().SetLabelOffset(0.008)
    frame1.GetYaxis().SetTitleOffset(1.6)
    frame1.GetYaxis().SetTitleSize(0.045)
    frame1.GetXaxis().SetTitleSize(0.045)
    frame1.Draw()
    canvas.cd(2)
    gPad.SetLeftMargin(0.15)
    gPad.SetRightMargin(0.02)
    frame2.GetYaxis().SetLabelOffset(0.008)
    frame2.GetYaxis().SetTitleOffset(1.6)
    frame2.GetYaxis().SetTitleSize(0.045)
    frame2.GetXaxis().SetTitleSize(0.045)
    frame2.Draw()
    canvas.SaveAs("rooFit104.png")
Exemplo n.º 6
0
    def makeNominals(self, sampleName, sample, inFiles, outFile, variables,
                     columns, definitions, cuts, supercut, nuisances):
        print "===================="
        print "=== makeNominals ==="
        print "===================="
        gROOT.SetBatch()

        # only one sample dilivered for now
        self._inFiles = inFiles
        self._variables = variables
        self._cuts = cuts
        self._definitions = definitions

        #print 'ShapeFactory:sample',self._sample
        #print 'ShapeFactory:inFiles',self._inFiles
        #print 'ShapeFactory:outFile',self._outFile
        #print 'ShapeFactory:variables',self._variables
        #print 'ShapeFactory:cuts',self._cuts
        print 'ShapeFactory:supercut', supercut

        #in case some variables need a compiled function
        for variableName, variable in self._variables.iteritems():
            if variable.has_key('linesToAdd'):
                linesToAdd = variable['linesToAdd']
                for line in linesToAdd:
                    gROOT.ProcessLineSync(line)

        TH1D.SetDefaultSumw2(True)
        self.outFile = TFile(outFile, 'recreate')

        #print 'ShapeFactory',self._treeName
        #chain = TChain(self._treeName)
        #                                                         skipMissingFiles
        inputDir = ''
        trees = self._connectInputs(inFiles, inputDir, False)
        for cutName, cut in self._cuts.iteritems():
            totCut = cut + "&&" + supercut
            print 'cut', cutName, '::', cut
            self.outFile.mkdir(cutName)
            for variableName, variable in variables.iteritems():
                self.outFile.mkdir(cutName + "/" + variableName)
                self.outFile.cd(cutName + "/" + variableName)
                print variableName
                print 'variable[name]', variable['name']
                print 'variable[range]', variable['range'][0], ':', variable[
                    'range'][1], ':', variable['range'][2]

                doFold = 0
                if 'fold' in variable.keys():
                    print "	variable[fold] = ", variable['fold']
                    doFold = variable['fold']

                # create histogram
                if 'weights' in sample.keys():
                    outputsHisto = self._draw(
                        variable['name'], variable['range'], sample['weight'],
                        sample['weights'], totCut, sampleName, trees, columns,
                        doFold, cutName, variableName, sample, True)
                else:
                    outputsHisto = self._draw(variable['name'],
                                              variable['range'],
                                              sample['weight'], [], totCut,
                                              sampleName, trees, columns,
                                              doFold, cutName, variableName,
                                              sample, True)

                outputsHisto.Write()

                # weight based nuisances: kind = weight
                for nuisanceName, nuisance in nuisances.iteritems():
                    if ('cuts' not in nuisance) or (
                        ('cuts' in nuisance) and
                        (cutName in nuisance['cuts'])):
                        if 'kind' in nuisance:
                            if nuisance['kind'] == 'weight':
                                for sampleNuisName, configurationNuis in nuisance[
                                        'samples'].iteritems():
                                    if sampleNuisName == sampleName:
                                        newSampleNameUp = sampleName + '_' + nuisance[
                                            'name'] + 'Up'
                                        newSampleNameDo = sampleName + '_' + nuisance[
                                            'name'] + 'Down'
                                        #                                 the first weight is "up", the second is "down"
                                        newSampleWeightUp = sample[
                                            'weight'] + '* (' + configurationNuis[
                                                0] + ")"
                                        newSampleWeightDo = sample[
                                            'weight'] + '* (' + configurationNuis[
                                                1] + ")"

                                        if 'weights' in sample.keys():
                                            outputsHistoUp = self._draw(
                                                variable['name'],
                                                variable['range'],
                                                newSampleWeightUp,
                                                sample['weights'], totCut,
                                                newSampleNameUp, trees,
                                                columns, doFold, cutName,
                                                variableName, sample, False)
                                            outputsHistoDo = self._draw(
                                                variable['name'],
                                                variable['range'],
                                                newSampleWeightDo,
                                                sample['weights'], totCut,
                                                newSampleNameDo, trees,
                                                columns, doFold, cutName,
                                                variableName, sample, False)
                                        else:
                                            #print 'newSampleWeightUp', newSampleWeightUp
                                            outputsHistoUp = self._draw(
                                                variable['name'],
                                                variable['range'],
                                                newSampleWeightUp, [], totCut,
                                                newSampleNameUp, trees,
                                                columns, doFold, cutName,
                                                variableName, sample, False)
                                            outputsHistoDo = self._draw(
                                                variable['name'],
                                                variable['range'],
                                                newSampleWeightDo, [], totCut,
                                                newSampleNameDo, trees,
                                                columns, doFold, cutName,
                                                variableName, sample, False)

                                        outputsHistoUp.Write()
                                        outputsHistoDo.Write()

                            elif nuisance['kind'] == 'PDF':
                                for sampleNuisName, configurationNuis in nuisance[
                                        'samples'].iteritems():
                                    if sampleNuisName == sampleName:
                                        newSampleName = sampleName + '_' + nuisance[
                                            'name']

                                        if 'weights' in sample.keys():
                                            histoList = self._drawPDF(
                                                nuisance['type'],
                                                configurationNuis[0],
                                                variable['name'],
                                                variable['range'],
                                                sample['weight'],
                                                sample['weights'], totCut,
                                                newSampleName, trees, columns,
                                                doFold, cutName, variableName,
                                                sample, False)
                                        else:
                                            #print 'newSampleWeightUp', newSampleWeightUp
                                            histoList = self._drawPDF(
                                                nuisance['type'],
                                                configurationNuis[0],
                                                variable['name'],
                                                variable['range'],
                                                sample['weight'], [], totCut,
                                                newSampleName, trees, columns,
                                                doFold, cutName, variableName,
                                                sample, False)

                                        print 'length of histoList', len(
                                            histoList)
                                        for ahist in histoList:
                                            #print 'writing ahist'
                                            ahist.Write()
                                        #outputsHistoUp.Write()
                                        #outputsHistoDo.Write()

        self.outFile.Close()
        print 'FINISHED'
Exemplo n.º 7
0
import ROOT
from ROOT import gROOT
from ROOT import gStyle
import sys

#end=sys.argv[1]

gROOT.SetBatch(True)
gROOT.ProcessLineSync(".x styleCMSTDR.C")
gROOT.ForceStyle()
gStyle.SetPadTopMargin(0.06)
gStyle.SetPadRightMargin(0.04)
gStyle.SetPadLeftMargin(0.15)

f = ROOT.TFile.Open(
    "/afs/cern.ch/work/l/lata/VBF_Analysis/CMSSW_7_4_7/src/VBFHbb2016/VBF_combine/toolkit/src/case0/datacards/higgsCombinedatacard_scan_cat7.MultiDimFit.mH125.root"
)
tree = f.Get("limit")
gr = ROOT.TGraph()
for entry in range(1, tree.GetEntries()):
    tree.GetEntry(entry)
    gr.SetPoint(entry, tree.r, 2 * tree.deltaNLL)
    print tree.r, 2 * tree.deltaNLL

gr.SetLineColor(1)
gr.GetYaxis().SetTitle("-2 #Delta ln L")
ymax = 10
gr.GetYaxis().SetRangeUser(0., ymax)
xmin = 0
xmax = 2
#xmin=-4
Exemplo n.º 8
0
def fit_quantiles(X_region,names,style=True,n_bins=100,pol='Pol',outString=None):  
    if style==True:
        gROOT.SetBatch(True)
        gROOT.ProcessLineSync(".x /mnt/t3nfs01/data01/shome/nchernya/HHbbgg_ETH_devel/scripts/setTDRStyle.C")
        gROOT.ForceStyle()
        gStyle.SetPadTopMargin(0.06)
        gStyle.SetPadRightMargin(0.04)
        gStyle.SetPadLeftMargin(0.15)
    

    h_names = [ 'region'+str(t) for t in range(0,len(X_region))]

    c_min=0
    c_max=2.

    hist_list=[]
    func_list=[]
    max_list=[]
    datahists=[]
    graphs=[]
    func=[]
    colors=[ROOT.kBlue+1,ROOT.kAzure+5,ROOT.kCyan-1, ROOT.kGreen, ROOT.kSpring+8, ROOT.kOrange]
   # nqx=3
  #  taus = array('d',[0.25, 0.5, 0.75])
  #  nqx=5
  #  taus = array('d',[0.5-0.68/2,0.3, 0.5, 0.7, 0.5+0.68/2.])
 #   nqx=4
  #  taus = array('d',[0.5-0.68/2,0.3, 0.5, 0.8])
  #  nqx=4
  #  taus = array('d',[0.5-0.68/2,0.4, 0.5, 0.8])
 #   nqx=4
  #  taus = array('d',[0.10,0.16, 0.2, 0.7])
 #   nqx=4
  #  taus = array('d',[0.10,0.16, 0.4, 0.7])   
  #  nqx=5
   # taus = array('d',[0.10,0.16, 0.4, 0.6, 0.8])   
   # nqx=5
   # taus = array('d',[0.10,0.20, 0.4, 0.6, 0.8])   
    nqx=4
    taus = array('d',[0.10,0.20, 0.4, 0.7])    # the best
    taus_fit = array('d',[x-taus[0] for x in taus ])
    quantiles_pos=[]
    x0_hist=[]
    x0_CDFfit=[]
 
 
    for j in range(len(X_region)):
        h=h_names[j]
        data =((X_region[j]).as_matrix()).ravel()
      #  print len(data)
        h_rel_diff = TH1F("hrel_diff_%s"%h_names[j], "hrel_diff_%s"%h_names[j], n_bins, c_min, c_max)
        h_rel_diff.Sumw2(True)
        for i in range(len(data)): 
            h_rel_diff.Fill(data[i])
        h_rel_diff.Scale(1./h_rel_diff.Integral())
        h_rel_diff.SetLineColor(colors[j])
        h_rel_diff.SetMarkerColor(colors[j])
        h_rel_diff.SetLineWidth(2)
        h_rel_diff.SetLineStyle(1+j)
        h_rel_diff.SetMarkerStyle(20+j)
        datahists.append(h_rel_diff)
        quantiles_x = array('d', [0 for x in range(0, nqx)])
        h_rel_diff.GetQuantiles( nqx,quantiles_x, taus )
        quantiles_pos.append(quantiles_x)
        max_list.append(h_rel_diff.GetMaximum()*1.3)
        x0_hist.append(h_rel_diff.GetBinCenter(h_rel_diff.GetMaximumBin()))

        gr = TGraph(nqx,quantiles_x,taus_fit);
        gr.SetLineColor(colors[j])
        gr.SetMarkerColor(colors[j])
        gr.SetMarkerStyle(20+j)
        graphs.append(gr)

   #     fit_cdf = TF1("fit_%s"%h, myCDF, 0., 2., 4)   
       # fit_cdf = TF1("fit_%s"%h, myCDF,quantiles_x[0]*0.98,quantiles_x[4]*1.02,4) 
     #   fit_cdf = TF1("fit_%s"%h, myErFuncCdf,quantiles_x[0]*0.98,quantiles_x[3]*1.02,4) 
    #    fit_cdf = TF1("fit_%s"%h,"pol3",quantiles_x[0]*0.98,quantiles_x[nqx-1]*1.02)   #final with pol3
        fit_cdf = TF1("fit_%s"%h,"pol3",quantiles_x[0]*0.98,quantiles_x[nqx-1]*1.02)   #final with pol3
  #      fit_cdf.FixParameter(1,quantiles_x[0] )  #q1   
  #      fit_cdf.FixParameter(2,quantiles_x[2] )  #q3   
  #      fit_cdf.SetParameter(0,1. )  #x0   
  #      fit_cdf.SetParameter(4,3. )  #const 
  #      fit_cdf.SetParLimits(4,0.,10 )  #const 
  #      fit_cdf.SetParLimits(0, 0.5, 1.5)    
        fit_cdf.SetLineColor(colors[j])
        gr.Fit("fit_%s"%h,"R")
        func.append(fit_cdf)
        
   #     pol_coeff = [6*fit_cdf.GetParameter(4), 3*fit_cdf.GetParameter(3),fit_cdf.GetParameter(2)]  # for pol4 only
   #     pol_roots = np.roots(pol_coeff)
   #     pol_roots_diff = [x - x0_hist[j] for x in pol_roots]
    #    x0_CDFfit.append(pol_roots[min(xrange(len(pol_roots_diff)), key=pol_roots_diff.__getitem__)])

    #    x0_CDFfit.append(-1*fit_cdf.GetParameter(2)/3/fit_cdf.GetParameter(3))  #for pol3 only
        x0_CDFfit.append(fit_cdf.GetParameter(0))  #for erFunc

    c = TCanvas("canv","canv",1600,800)
    c.Divide(2,1)
    c.cd(1)
    frame = TH1F("hframe", "", n_bins, c_min, c_max)
    frame.SetStats(0)
    frame.GetXaxis().SetTitleOffset(0.91);
    frame.GetYaxis().SetTitle("Events")
    frame.GetXaxis().SetTitle("p_{T}^{gen}/p_{T}^{reco}")
    frame.GetYaxis().SetLabelSize(0.04)
    leg = ROOT.TLegend(0.12,0.75,0.6,0.9)
    leg.SetFillStyle(-1)
    leg.SetBorderSize(0)
    leg.SetTextFont(42)
    leg.SetTextSize(0.025)
    frame.GetYaxis().SetRangeUser(0.,max(max_list))
    frame.Draw()
    for j in range(len(X_region)):
        datahists[j].Draw("PEsame")
        leg.AddEntry(datahists[j],names[j] ,"PE")
    leg.Draw('same')

    c.cd(2)
    right,top   = gStyle.GetPadRightMargin(),gStyle.GetPadTopMargin()
    left,bottom = gStyle.GetPadLeftMargin(),gStyle.GetPadBottomMargin()
    ci = ROOT.TColor.GetColor("#ffffff")
 #   frame2 = TH1F("hframe2", "", n_bins, 0.9, 1.25)
    frame2 = TH1F("hframe2", "", n_bins, 0.7, 1.4)
    frame2.SetStats(0)
    frame2.GetXaxis().SetTitleOffset(0.91);
    frame2.GetYaxis().SetTitle("#tau - #tau_{1}")
    frame2.GetXaxis().SetTitle("Quantiles positions")
    frame2.GetYaxis().SetLabelSize(0.04)
    frame2.GetYaxis().SetRangeUser(-0.05,max(taus_fit)*1.1)
    frame2.Draw()
    paveText2 = ROOT.TPaveText(0.6,0.25,0.9,.4,"NDC")
    paveText2.SetTextFont(42)
    paveText2.SetTextSize(top*0.43)
    paveText2.SetFillStyle(-1)
    paveText2.SetBorderSize(0)
    for j in range(len(X_region)):
        graphs[j].Draw("PEsame")
        func[j].Draw("sameR")
        t = paveText2.AddText("x0 hist/fit : %.2f/%.2f"%(x0_hist[j],x0_CDFfit[j]))
        print("%.2f"%x0_CDFfit[j])
        t.SetTextColor(colors[j]);
    leg.Draw('same')

   # paveText = ROOT.TPaveText(0.7,0.85,0.9,.9,"NDC")
    paveText = ROOT.TPaveText(0.75,0.65,0.95,.9,"NDC")
    paveText.SetTextFont(42)
    paveText.SetTextColor(ROOT.kBlue)
    paveText.SetTextSize(top*0.43)
    paveText.SetFillStyle(-1)
    paveText.SetBorderSize(0)
    paveText.AddText("%s Fit"%pol)
    paveText.AddText("Quantiles : ")
    for x in taus :  paveText.AddText("%.2f"%x)
    paveText.Draw("same")
   
    paveText2.Draw("same")
   # print x0_hist, x0_CDFfit
   
 
    line = ROOT.TLine(x0_hist[0],frame2.GetMinimum() ,x0_hist[0],frame2.GetMaximum())
    line.SetLineStyle(9)
    line.SetLineWidth(2)
    line.SetLineColor(ROOT.kRed+1)
    line.Draw("Lsame")

    c.SaveAs(utils.IO.plotFolder+"quantiles_"+str(outString)+str(pol)+'.png')
    c.SaveAs(utils.IO.plotFolder+"quantiles_"+str(outString)+str(pol)+'.pdf')
Exemplo n.º 9
0
def plot_regions(X_region,names,style=True,n_bins=50,outString=None,log=False,title='',titleName=''):  
    if style==True:
        gROOT.SetBatch(True)
        gROOT.ProcessLineSync(".x ~/HHbbgg_ETH/scripts/setTDRStyle.C")
        gROOT.ForceStyle()
        gStyle.SetPadTopMargin(0.06)
        gStyle.SetPadRightMargin(0.04)
        gStyle.SetPadLeftMargin(0.15)
    

    h_names = [ 'region'+str(t) for t in range(0,len(X_region))]

    c_min=0
    c_max=2.
    if log : c_max=4.
    c = TCanvas("canv","canv",900,900)
    c.cd()
    frame = TH1F("hframe", "hframe", n_bins, c_min, c_max)
    frame.SetStats(0)
    frame.GetXaxis().SetTitleOffset(0.91);
    frame.GetYaxis().SetTitle("Events")
    frame.GetXaxis().SetTitle("p_{T}^{gen}/p_{T}^{reco}")
    frame.GetYaxis().SetLabelSize(0.04)
    leg = ROOT.TLegend(0.12,0.75,0.6,0.9)
    leg.SetFillStyle(-1)
    leg.SetBorderSize(0)
    leg.SetTextFont(42)
    leg.SetTextSize(0.025)
    if titleName!='' :  leg.AddEntry(frame,titleName,"")
    if title!='' :  leg.AddEntry(frame,title,"")

    hist_list=[]
    func_list=[]
    max_list=[]
    x=[]
    datahist=[]
    datahists=[]
    meanr, sigmaL, sigmaR, alphaL, alphaR = [],[],[],[],[]   
    Ap,Xp,sigp,xi,rho1,rho2 = [],[],[],[],[],[]
    meanv, widthv, sigmav = [] , [] , []
    Xp_initial,sigp_initial,xi_initial,rho1_initial,rho2_initial =  9.8545e-01, 1.3118e-01,2.2695e-01, 6.4189e-02,  9.0282e-02 
    fsig=[]
    sig=[]
    model=[]
    res=[]
    integral=[]
    formula=[]
    scale_factors=[]
    scaled=[]
    func=[]
    colors=[ROOT.kBlue+1,ROOT.kAzure+5,ROOT.kCyan-1, ROOT.kGreen, ROOT.kSpring+8, ROOT.kOrange, ROOT.kPink+10]
 
 
    for j in range(len(X_region)):
        if isinstance(X_region[j], np.ndarray) : data = X_region[j]
        else : data =((X_region[j]).as_matrix()).ravel()
      #  print len(data)
        h_rel_diff = TH1F("hrel_diff_%s"%h_names[j], "hrel_diff_%s"%h_names[j], n_bins, c_min, c_max)
        h_rel_diff.Sumw2(ROOT.kTRUE)
        for i in range(len(data)): 
            h_rel_diff.Fill(data[i])
  #      h_rel_diff.Scale(1./h_rel_diff.Integral())
        h_rel_diff.SetLineColor(colors[j])
        h_rel_diff.SetMarkerColor(colors[j])
        h_rel_diff.SetLineWidth(2)
        h_rel_diff.SetLineStyle(1+j)
    
    #    if (log==True) : max_list.append(h_rel_diff.GetMaximum()*1.3)
        max_list.append(h_rel_diff.GetMaximum()*1.4)
        datahists.append(h_rel_diff)


        num=j
        h = h_names[j]
        x.append(RooRealVar("x_%s"%h,"x_%s"%h,c_min,c_max))
        datahist.append(RooDataHist("roohist_%s"%h,"roohist_%s"%h,RooArgList(x[num]),datahists[num]))
        #######################Bukin function ################## 
        if ('mse' in names[j]) or ('HybridLoss' in names[j])  : Xp.append(RooRealVar("Xp_%s"%h,"Xp_%s"%h,0.96,0.7,1.1))
        else : Xp.append(RooRealVar("Xp_%s"%h,"Xp_%s"%h,Xp_initial,0.,3.))
        if ('unweighted' in names[j]) and ('Jet_mcPt>=300' in outString)  : sigp.append(RooRealVar("sigp_%s"%h,"sigp_%s"%h,0.06,0.01,0.2))
        elif ('No regression' in names[j]) and ('Jet_mcPt>=600' in outString)  : sigp.append(RooRealVar("sigp_%s"%h,"sigp_%s"%h,0.06,0.01,0.2))
        elif ('mse' in names[j]) or ('HybridLoss' in names[j])  : sigp.append(RooRealVar("sigp_%s"%h,"sigp_%s"%h,0.06,0.01,0.15))
        else  : sigp.append(RooRealVar("sigp_%s"%h,"sigp_%s"%h,sigp_initial,0.01,0.3))
        xi.append(RooRealVar("xi_%s"%h,"xi_%s"%h,xi_initial,-1,1))
        rho1.append(RooRealVar("rho1_%s"%h,"rho1_%s"%h,rho1_initial,-1,1)) #left
        rho2.append(RooRealVar("rho2_%s"%h,"rho2_%s"%h,rho2_initial,-1,1)) #right
        sig.append(RooBukinPdf("signal_bukin_%s"%h,"signal_bukin_%s"%h,x[num],Xp[num],sigp[num],xi[num],rho1[num],rho2[num]))
###########################RooCruijff##################
        meanr.append(RooRealVar("meanr_%s"%h,"meanr_%s"%h,Xp_initial,0.5,1.5))
        sigmaL.append(RooRealVar("sigmaL_%s"%h,"sigmaL_%s"%h,sigp_initial,0.01,0.3))
        sigmaR.append(RooRealVar("sigmaR_%s"%h,"sigmaR_%s"%h,sigp_initial,0.01,0.3))
        alphaL.append(RooRealVar("alphaL_%s"%h,"alphaL_%s"%h,0.01,0,2.))
        alphaR.append(RooRealVar("alphaR_%s"%h,"alphaR_%s"%h,0.1,0.,2.))
        formula_rooCruijff = "( ( (x_%s-meanr_%s)<0) ? (exp( -1*pow((x_%s-meanr_%s),2)/(2*pow(sigmaL_%s,2)+alphaL_%s*pow((x_%s-meanr_%s),2) ))) : (exp( -1*pow((x_%s-meanr_%s),2)/(2*pow(sigmaR_%s,2)+alphaR_%s*pow((x_%s-meanr_%s),2) )))  )"%(h,h,h,h,h,h,h,h,h,h,h,h,h,h) 
     #   sig.append(RooGenericPdf("signal_cruijff_%s"%h,"signal_cruijff_%s"%h,formula_rooCruijff,RooArgList(x[num],meanr[num],sigmaL[num],sigmaR[num],alphaL[num],alphaR[num])))
      #  sig.append(RooBifurGauss("signal_bifurgaus_%s"%h,"signal_bifurgaus_%s"%h,x[num],meanr[num],sigmaL[num],sigmaR[num]))
############################VOigt##########################
        meanv.append(RooRealVar("meanv_%s"%h,"meanv_%s"%h,Xp_initial,0.5,1.5))
        widthv.append(RooRealVar("widthv_%s"%h,"widthv_%s"%h,sigp_initial,0.01,0.7))
        sigmav.append(RooRealVar("sigmav_%s"%h,"sigmav_%s"%h,sigp_initial,0.01,0.7))
   #     sig.append(RooVoigtian("signal_voigt_%s"%h,"signal_voigt_%s"%h,x[num],meanv[num],widthv[num],sigmav[num]))

###########################################################


        res.append(sig[num].fitTo(datahist[num],ROOT.RooFit.Strategy(2),ROOT.RooFit.Save(ROOT.kTRUE),ROOT.RooFit.SumW2Error(ROOT.kTRUE)))
        #res.append(sig[num].chi2FitTo(datahist[num]))
        fit_range_min = h_rel_diff.GetMean()-h_rel_diff.GetRMS()/2
        fit_range_max = h_rel_diff.GetMean()+h_rel_diff.GetRMS()/2
       # print 'range of the fit : ', fit_range_min, fit_range_max
   #     res.append(sig[num].fitTo(datahist[num],ROOT.RooFit.Save(ROOT.kTRUE),ROOT.RooFit.Range(fit_range_min,fit_range_max))) # take Mean of each histogram and add 1/2 of the RMS  ? -> try that
        res[num].Print()
        x[num].setRange("integralRange%s"%h, c_min,c_max)  
        integral.append(sig[num].createIntegral(RooArgSet(x[num]), ROOT.RooFit.Range("integralRange%s"%h)))

        scale_factors.append(datahists[num].Integral()*datahists[num].GetBinWidth(1)/integral[num].getVal())
        formula.append("%f *signal_bukin_%s"%(scale_factors[num],h))
       # formula.append("%f *signal_bifurgaus_%s"%(scale_factors[num],h))
      #  formula.append("%f *signal_voigt_%s"%(scale_factors[num],h))
      #  formula.append("%f *signal_cruijff_%s"%(scale_factors[num],h))
       # create a scaled  function = scale * function
        scaled.append(RooFormulaVar("scaled_%s"%h,formula[num],RooArgList(sig[num])))
        func_list.append(scaled[num].asTF(RooArgList(x[num])))
        func_list[num].SetLineColor(colors[num])
        hist_list.append(h_rel_diff)
   

    fitfunc='Bukin'
    fit_result_file = std.ofstream(utils.IO.plotFolder+"../fitResults/fitResultRegions_%s"%(fitfunc)+str(outString)+'.txt')
    fit_result_file.write('mean Xp\n',8)
    for fitnum in range(len(X_region)):
       Xp[fitnum].writeToStream(fit_result_file,False)
       fit_result_file.write('\n',1)
    fit_result_file.write('sigp\n',5)
    for fitnum in range(len(X_region)):
       sigp[fitnum].writeToStream(fit_result_file,False)
       fit_result_file.write('\n',1)
    fit_result_file.close()
    outString = outString.replace('/','_').replace(':','_').replace('(','_').replace(')','_').replace('+','_').replace('>=','_').replace('<','_').replace('>','_').replace(' & ','and').replace(' ','')

    c.cd()
    frame.GetYaxis().SetRangeUser(1e-06,max(max_list))
 #   frame.GetYaxis().SetRangeUser(1e-06,0.28)
    log_name=''
    if log==True : 
        c.SetLogy()
        log_name='log'
    frame.Draw()
    for j in range(len(X_region)):
        func_list[j].Draw("same")
        hist_list[j].Draw("PEsame")
        leg.AddEntry(hist_list[j],names[j]+',Xp=%.2f,sigp=%.2f'%(Xp[j].getVal(),sigp[j].getVal()) ,"PE")
        print(j,' Sigma plus error : ',sigp[j].getVal(), ' +- ',sigp[j].getError())
    leg.Draw('same')
  #  save_name=utils.IO.plotFolder+"pt_regions_fitBukin_"+str(outString)+'.png'
  #  c.SaveAs("pt_region.png")
    c.SaveAs(utils.IO.plotFolder+"fitBukin_regions_"+str(outString)+log_name+'.png')
    c.SaveAs(utils.IO.plotFolder+"fitBukin_regions_"+str(outString)+log_name+'.pdf')
Exemplo n.º 10
0
def plot_rel_pt_diff(rel_diff_regressed,rel_diff,style=False,n_bins=50,outString=None,option='caterina'):  

    if style==True:
        gROOT.SetBatch(True)
        gROOT.ProcessLineSync(".x /mnt/t3nfs01/data01/shome/nchernya/HHbbgg_ETH_devel/scripts/setTDRStyle.C")
        gROOT.ForceStyle()
        gStyle.SetPadTopMargin(0.06)
        gStyle.SetPadRightMargin(0.04)
        gStyle.SetPadLeftMargin(0.15)
    
    
   #### rel_diff_regressed = (predictions - true)/true
   #### rel_diff = (recoPt - true)/true
#    rel_diff_regressed = true/predictions
 #   rel_diff = true/recoPt
    
    c_min = min(min(rel_diff_regressed),min(rel_diff))
    c_max = max(max(rel_diff_regressed),max(rel_diff))
    c_min=0
    c_max=2.
    
    Histo_rel_diff = np.histogram(rel_diff,bins=n_bins,range=(c_min,c_max))
    Histo_rel_diff_reg = np.histogram(rel_diff_regressed,bins=n_bins,range=(c_min,c_max))
    
    h_rel_diff = TH1F("hrel_diff", "hrel_diff", n_bins, c_min, c_max)
    for i in range(len(rel_diff)): 
        h_rel_diff.Fill(rel_diff[i])
    h_rel_diff_reg = TH1F("hrel_diff_reg", "hrel_diff_reg", n_bins, c_min, c_max)
    for i in range(len(rel_diff_regressed)): 
        h_rel_diff_reg.Fill(rel_diff_regressed[i])
    h_rel_diff.SetLineColor(ROOT.kBlue)
    h_rel_diff.SetMarkerColor(ROOT.kBlue)
    h_rel_diff.SetLineWidth(2)
    h_rel_diff_reg.SetLineColor(ROOT.kRed)
    h_rel_diff_reg.SetMarkerColor(ROOT.kRed)
    h_rel_diff_reg.SetLineWidth(2)
   

    
    AllHistos= [Histo_rel_diff, Histo_rel_diff_reg]
    h_max = max([histo[0].max() for histo in AllHistos])*1.2
    h_min = min([histo[0].min() for histo in AllHistos])
    
    c = ROOT.TCanvas("c","c",900,900)
    c.cd()
    frame = TH1F("hframe", "hframe", n_bins, c_min, c_max)
    frame.SetStats(0)
    frame.GetXaxis().SetTitleOffset(0.91);
    frame.GetYaxis().SetTitle("Events")
  #  frame.GetXaxis().SetTitle("(p_{T}^{Reco}-p_{T}^{gen})/p_{T}^{gen}")
    frame.GetXaxis().SetTitle("p_{T}^{gen}/p_{T}^{reco}")
    frame.GetYaxis().SetLabelSize(0.04)
    frame.GetYaxis().SetRangeUser(h_min,h_max)
    
    frame.Draw()
    h_rel_diff.Draw("samePE")
    h_rel_diff_reg.Draw("samePE")
    print('Nominal : mean, RMS :',h_rel_diff.GetMean(), h_rel_diff.GetRMS())
    print('Regresesd : mean, RMS : ',h_rel_diff_reg.GetMean(), h_rel_diff_reg.GetRMS())

  

    
    
    
    leg = ROOT.TLegend(0.55,0.75,0.9,0.9)
    leg.SetFillStyle(-1)
    leg.SetBorderSize(0)
    leg.SetTextFont(42)
    leg.SetTextSize(0.03)
  #  leg.Draw()
    

    h_names = ['nom','reg']
    datahists = [h_rel_diff,h_rel_diff_reg]
    x=[]
    datahist=[]
    m=[]
    m_initial=[1.0103e+00,9.5381e-01]
    s=[]
    s_initial=[ 1.3210e-01,1.3967e-01]
    a=[]
    a_initial=[-7.7802e-01,-1.1260e+00]
    n=[]
    n_initial=[ 6.0149e+00,5.5622e+00]
    
    Ap,Xp,sigp,xi,rho1,rho2 = [],[],[],[],[],[]
    Xp_initial,sigp_initial,xi_initial,rho1_initial,rho2_initial =  9.8545e-01, 1.3118e-01,2.2695e-01, 6.4189e-02,  9.0282e-02 
    meanr, sigmaL, sigmaR, alphaL, alphaR = [],[],[],[],[]   
 
    fsig=[]
    sig=[]
    model=[]
    res=[]
    integral=[]
    formula=[]
    scale_factors=[]
    scaled_cb=[]
    func=[]
    colors=[ROOT.kBlue,ROOT.kRed]
    chi_squares=[]
    fwhm_bukin=[]
    fwhm=[]
    fwhm.append( -1 *(h_rel_diff.GetBinCenter( h_rel_diff.FindFirstBinAbove(h_rel_diff.GetMaximum()/2.)  )  - h_rel_diff.GetBinCenter( h_rel_diff.FindLastBinAbove(h_rel_diff.GetMaximum()/2.) ) )  )
    fwhm.append( -1 *(h_rel_diff_reg.GetBinCenter( h_rel_diff_reg.FindFirstBinAbove(h_rel_diff_reg.GetMaximum()/2.)  )  - h_rel_diff_reg.GetBinCenter( h_rel_diff_reg.FindLastBinAbove(h_rel_diff_reg.GetMaximum()/2.) ) )  )

    for num,h in enumerate(h_names):
        x.append(RooRealVar("x_%s"%h,"x_%s"%h,c_min,c_max))
        datahist.append(RooDataHist("roohist_%s"%h,"roohist_%s"%h,RooArgList(x[num]),datahists[num]))
       #######################Crystal ball################ 
        m.append(RooRealVar("mean_%s"%h,"mean_%s"%h,m_initial[num],0.5,1.5))
        s.append(RooRealVar("sigma_%s"%h,"sigma_%s"%h,s_initial[num],0.01,0.3))
        a.append(RooRealVar("alpha_%s"%h,"alpha_%s"%h,a_initial[num],-10,0.))
        n.append(RooRealVar("exp_%s"%h,"exp_%s"%h,n_initial[num],1.,100.))
      #  sig.append(RooCBShape("signal_gauss_%s"%h,"signal_gauss_%s"%h,x[num],m[num],s[num],a[num],n[num]))

      #######################Bukin function ################## 
    
        Xp.append(RooRealVar("Xp_%s"%h,"Xp_%s"%h,Xp_initial,0.,3.))
        sigp.append(RooRealVar("sigp_%s"%h,"sigp_%s"%h,sigp_initial,0.01,0.3))
        xi.append(RooRealVar("xi_%s"%h,"xi_%s"%h,xi_initial,-1,1))
        rho1.append(RooRealVar("rho1_%s"%h,"rho1_%s"%h,rho1_initial,-1,1)) #left
        rho2.append(RooRealVar("rho2_%s"%h,"rho2_%s"%h,rho2_initial,-1,1)) #right
        sig.append(RooBukinPdf("signal_bukin_%s"%h,"signal_bukin_%s"%h,x[num],Xp[num],sigp[num],xi[num],rho1[num],rho2[num]))

###########################RooCruijff##################

        meanr.append(RooRealVar("meanr_%s"%h,"meanr_%s"%h,m_initial[num],0.5,1.5))
        sigmaL.append(RooRealVar("sigmaL_%s"%h,"sigmaL_%s"%h,s_initial[num],0.01,0.3))
        sigmaR.append(RooRealVar("sigmaR_%s"%h,"sigmaR_%s"%h,s_initial[num],0.01,0.3))
        alphaL.append(RooRealVar("alphaL_%s"%h,"alphaL_%s"%h,0.01,0,2.))
        alphaR.append(RooRealVar("alphaR_%s"%h,"alphaR_%s"%h,0.1,0.,2.))
#  RooGenericPdf genpdf("genpdf","genpdf","(1+0.1*abs(x)+sin(sqrt(abs(x*alpha+0.1))))",RooArgSet(x,alpha)) ;
        formula_rooCruijff = "( ( (x_%s-meanr_%s)<0) ? (exp( -1*pow((x_%s-meanr_%s),2)/(2*pow(sigmaL_%s,2)+alphaL_%s*pow((x_%s-meanr_%s),2) ))) : (exp( -1*pow((x_%s-meanr_%s),2)/(2*pow(sigmaR_%s,2)+alphaR_%s*pow((x_%s-meanr_%s),2) )))  )"%(h,h,h,h,h,h,h,h,h,h,h,h,h,h) 
    #    sig.append(RooGenericPdf("signal_cruijff_%s"%h,"signal_cruijjff_%s"%h,formula_rooCruijff,RooArgList(x[num],meanr[num],sigmaL[num],sigmaR[num],alphaL[num],alphaR[num])))
    #    sig.append(RooBifurGauss("signal_cruijff_%s"%h,"signal_cruijjff_%s"%h,x[num],meanr[num],sigmaL[num],sigmaR[num]))

     #   fit_range_min = h_rel_diff.GetMean()-fwhm[num]
     #   fit_range_max = h_rel_diff.GetMean()+fwhm[num]
     #   print 'range of the fit : ', fit_range_min, fit_range_max
     #   res.append(sig[num].fitTo(datahist[num],ROOT.RooFit.Save(ROOT.kTRUE),ROOT.RooFit.Range(fit_range_min,fit_range_max))) # take Mean of each histogram and add 1/2 of the RMS  ? -> try that

        res.append(sig[num].fitTo(datahist[num],ROOT.RooFit.Save(ROOT.kTRUE)))
        res[num].Print()

       # chi_squares.append((x[num].frame()).chiSquare())
        x[num].setRange("integralRange%s"%h, c_min,c_max)  
        integral.append(sig[num].createIntegral(RooArgSet(x[num]), ROOT.RooFit.Range("integralRange%s"%h)))

        scale_factors.append(datahists[num].Integral()*datahists[num].GetBinWidth(1)/integral[num].getVal())
        scale_factors.append(datahists[num].Integral()*datahists[num].GetBinWidth(1)/integral[num].getVal())
      #  formula.append("%f *signal_gauss_%s"%(scale_factors[num],h))
        formula.append("%f *signal_bukin_%s"%(scale_factors[num],h))
     #   formula.append("%f *signal_cruijff_%s"%(scale_factors[num],h))
       # create a scaled  function = scale * function
        scaled_cb.append(RooFormulaVar("scaled_cb_%s"%h,formula[num],RooArgList(sig[num])))
        func.append(scaled_cb[num].asTF(RooArgList(x[num])))
        func[num].SetLineColor(colors[num])
        datahists[num].SetMarkerColor(colors[num])
        fwhm_bukin.append(sigp[num].getVal()*2*math.sqrt(2*math.log(2)))
      
      #  chi_squares.append(RooChi2Var("chi2_%s"%h,"chi2_%s"%h,sig[num],datahist[num]))

    
    fitfunc='Bukin'
  #  fitfunc='Bifurgaus'
    fit_result_file = std.ofstream(utils.IO.plotFolder+"../fitResults/fitResult_%s"%(fitfunc)+str(outString)+'.txt')
    res[0].floatParsFinal().printMultiline(fit_result_file, 1111, True)
    res[1].floatParsFinal().printMultiline(fit_result_file, 1111, True)
    fit_result_file.close()

    
    if option=='caterina' :
        leg.AddEntry(h_rel_diff,"HIG-16-044, FWHM=%.3f"%fwhm[0] ,"P")
        leg.AddEntry(h_rel_diff,"FWHM Bukin =%.3f"%fwhm_bukin[0] ,"P")
        leg.AddEntry(h_rel_diff_reg,"XGboost, FWHM=%.3f"%fwhm[1],"P")
        leg.AddEntry(h_rel_diff_reg,"FWHM Bukin =%.3f"%fwhm_bukin[1],"P")
    else : 
        leg.AddEntry(h_rel_diff,"Nominal" ,"P")
        leg.AddEntry(h_rel_diff_reg,"Regressed" ,"P")

	
    c2 = ROOT.TCanvas("c2","c2",900,900)
    c2.cd()
    frame.Draw()
    func[0].Draw("same")
    func[1].Draw("same")
    h_rel_diff.Draw("PEHISTsame")
    h_rel_diff_reg.Draw("PEHISTsame")    
    leg.Draw()
  
   # c2.SaveAs(utils.IO.plotFolder+"pt_rel_fitCruijff_"+str(outString)+'.png')
  #  c2.SaveAs(utils.IO.plotFolder+"pt_rel_noFit_"+str(outString)+'.png')
    c2.SaveAs(utils.IO.plotFolder+"pt_rel_fit%s_"%(fitfunc)+str(outString)+'.png')
    c2.SaveAs(utils.IO.plotFolder+"pt_rel_fit%s_"%(fitfunc)+str(outString)+'.pdf')
    c2.Draw()