Exemplo n.º 1
0
  for bin in range(0,MinusNomRatioGeV.GetNbinsX()+1) :
    if basicBkgFrom4ParamFit.GetBinContent(bin) == 0 :
      MinusNomRatioGeV.SetBinContent(bin,0)
    else :
      MinusNomRatioGeV.SetBinContent(bin,(newNomMinus1.GetBinContent(bin)-newbasicBkgFrom4ParamFit.GetBinContent(bin))/newbasicBkgFrom4ParamFit.GetBinContent(bin))
# Used at some point 8,5E4???
  myPainter.drawDataWithFitAsHistogramAndResidual(basicData,basicBkgFrom4ParamFit,luminosity,13,"m_{jj} [GeV]","Events",["Data","Fit","Statistical uncertainty on fit","Function choice"],"{0}/compareFitQualityAndFitChoice_Asymm_WithRatio".format(folderextension),True,[[nomPlus1,nomMinus1],[placeHolderNomGeV,valueNewFuncErrDirected]],[altFitRatioGeV,MinusNomRatioGeV,PlusNomRatioGeV],firstBin,lastBin-1,True,True,True,False,False,True,False,True,bumpHunterPVal,True,fitRange[0],fitRange[1],5E3,5E6) # changed from lastBin+2 to lastBin+15E3 to match FancyFigure

  myPainter.drawDataWithFitAsHistogramAndResidual(newbasicdata,newbasicBkgFrom4ParamFit,luminosity,13,"m_{jj} [TeV]","Events",["Data","Fit","Statistical uncertainty on fit","Function choice"],"{0}/compareFitQualityAndFitChoice_Asymm_WithRatioTeV".format(folderextension),True,[[newNomPlus1,newNomMinus1],[placeHolderNom,newValueNewFuncErrDirected]],[altFitRatio,MinusNomRatio,PlusNomRatio],firstBin,lastBin-1,True,True,True,False,False,True,False,True,bumpHunterPVal,True,fitRange[0],fitRange[1],5E3,5E6) # changed from lastBin+2 to lastBin+15E3 to match FancyFigure

  #drawing as hist not smooth curve so doesn't drop to zero
  #myPainter.drawDataWithFitAsHistogramAndResidual(newbasicdata,newbasicBkgFrom4ParamFit,luminosity,13,"m_{jj} [TeV]","Events",["Data","Fit","Statistical uncertainty on fit","Function choice"],"{0}/compareFitQualityAndFitChoice_Asymm_WithRatio".format(folderextension),True,[[newNomPlus1,newNomMinus1],[placeHolderNom,newValueNewFuncErrDirected]],[altFitRatio,MinusNomRatio,PlusNomRatio],firstBin,lastBin-1,True,True,False,False,False,True,False,True,bumpHunterPVal,True,fitRange[0],fitRange[1]) # changed from lastBin+2 to lastBin+15E3 to match FancyFigure

  myPainter.drawDataWithFitAsHistogramAndResidualPaper(newbasicdata,newbasicBkgFrom4ParamFit,luminosity,13,"m_{jj} [TeV]","Events",["Data","Fit","Statistical uncertainty on fit","Function choice"],"{0}/compareFitQualityAndFitChoice_Asymm_WithRatioPaper".format(folderextension),True,[[newNomPlus1,newNomMinus1],[placeHolderNom,newValueNewFuncErrDirected]],[altFitRatio,MinusNomRatio,PlusNomRatio],firstBin,lastBin-1,True,True,True,False,False) # changed from lastBin+2 to lastBin+15E3 to match FancyFigure

  myPainter.drawMultipleFitsAndResiduals(newbasicdata,[newbasicBkgFrom4ParamFit,newValueNewFuncErrDirected],[altFitRatio],["Nominal fit","Func choice unc"],"m_{jj} [TeV]","Events",["(alt-nom)/nom"],"{0}/directedFuncChoiceVersusNominal_withRatio".format(folderextension),luminosity,13,firstBin,lastBin-1)

doStatSearch=False
if doStatSearch :
  TomographyPlotWithStats = searchInputFile.Get("TomographyPlotWithStats")
  bumpHunterStatsWSyst = searchInputFile.Get("bumpHunterStatsWSyst")
  bumpPValStat = bumpHunterStatsWSyst(0)
  bumpPValLow = bumpHunterStatsWSyst(1)
  bumpPValHigh = bumpHunterStatsWSyst[2]
  myPainter.drawPseudoExperimentsWithObservedStat(bumpHunterStatsWSyst,3.20359,0.7241,0,luminosity,13,\
          'BumpHunter','Pseudo-experiments',"{0}/bumpHunterStatPlot_withUncertainties".format(folderextension))
  myPainter.drawBumpHunterTomographyPlot(TomographyPlotWithStats,"{0}/bumpHunterTomographyPlot_withStats".format(folderextension))

  print "with stats, bumpLowEdge, bumpHighEdge are",bumpPValLow,bumpPValHigh
  print "BumpHunter pvalue is",bumpPValStat
        while (testHist.GetBinContent(firstBin) == 0
               and firstBin < testHist.GetNbinsX()):
            firstBin += 1
        while (testHist.GetBinContent(lastBin) == 0 and lastBin > 0):
            lastBin -= 1
        if (firstBin > lastBin):
            firstBin = 1
            lastBin = testHist.GetNbinsX()
        print "First bin = ", firstBin, ": lower edge at", testHist.GetBinLowEdge(
            firstBin)
        print "Last bin = ", lastBin, ": upper edge at", testHist.GetBinLowEdge(
            lastBin + 1)

        myPainter.drawMultipleFitsAndResiduals(
            dataHist, [testHist, validateHist], [ratio],
            ["New fit", "SWIFT fit"], "m_{jj} [TeV]", "Events",
            ["(new-SWIFT)/SWIFT"],
            "{0}/compareOnData_{1}".format(folder, mystring), luminosity, 13,
            firstBin, lastBin)

        myPainter.drawSignificanceHistAlone(ratio,
                                            "m_{jj} [TeV]",
                                            "(new-SWIFT)/SWIFT",
                                            "{0}/fitsRatio_{1}".format(
                                                folder, mystring),
                                            firstBin=firstBin,
                                            lastBin=lastBin)

        myPainter.drawSignificanceHistAlone(diff,
                                            "m_{jj} [TeV]",
                                            "(new-SWIFT)",
                                            "{0}/fitsDifference_{1}".format(
def main():

    # User controlled arguments
    parser = argparse.ArgumentParser()
    parser.add_argument("--inFileName",       type=str,  default="", help="The path to the input file from SearchPhase")
    parser.add_argument("--outPath",       type=str,  default="./plotting/SearchPhase/plots/", help="The path prefix (directory) where you want the output plots")
    parser.add_argument("--lumi",       type=float,  default=1, help="Luminosity in fb-1")
    parser.add_argument("--doAlternate",     action='store_true', help="Compare Nominal and Alternate Fit")
    parser.add_argument("--overlaidSignal", action='store_true', help="Overlaid Signal on Background")
    parser.add_argument("--signalFileName", type=str, default="", help="Signal histogram overlaid on background")
    parser.add_argument("--drawMCComparison", action='store_true', help="Draw the comparison between data and MC")
    parser.add_argument("--mcFileName", type=str, default="", help="MC File Name")

    args = parser.parse_args()
    inFileName       = args.inFileName
    outPath       = args.outPath
    luminosity = 1000*args.lumi
    doAlternate = args.doAlternate
    overlaidSignal = args.overlaidSignal
    signalFileName = args.signalFileName
    drawMCComparison = args.drawMCComparison
    mcFileName = args.mcFileName
    
    print "==================================="
    print "Executing Run_SearchPhase.py with :"
    print "inFileName       : ",inFileName      
    print "outPath       : ",outPath
    print "Lumi       : ", args.lumi
    print "doAlternate: ", doAlternate
    print "overlaidSignal: ", overlaidSignal
    if overlaidSignal: 
      print " signalFileName: ", signalFileName
    print "drawMCComparison: ", drawMCComparison
    print "mcFileName: ", mcFileName
    print "==================================="

    # Get input (the rootfile name should match that specified in the SearchPhase.config file)
    searchInputFile = ROOT.TFile(inFileName, "READ")

    # make plots folder i.e. make folder extension
    if not os.path.exists(outPath):
        os.makedirs(outPath)

    # Define necessary quantities.
    Ecm = 13

    # Get input
    doStatSearch = False
    #doAlternate = True # You can use this if you included the alternate fit function in the search phase

    # Initialize painter
    myPainter = Morisot()
    myPainter.setColourPalette("Teals")
    #myPainter.setEPS(True)
    myPainter.setLabelType(2) # Sets label type i.e. Internal, Work in progress etc.
                              # See below for label explanation

    # 0 Just ATLAS    
    # 1 "Preliminary"
    # 2 "Internal"
    # 3 "Simulation Preliminary"
    # 4 "Simulation Internal"
    # 5 "Simulation"
    # 6 "Work in Progress"

    # Retrieve search phase inputs
    basicData = searchInputFile.Get("basicData")
    basicBkg = searchInputFile.Get("basicBkgFrom4ParamFit")
    #normalizedData = searchInputFile.Get("normalizedData")
    #normalizedBkgFrom4ParamFit = searchInputFile.Get("normalizedBkgFrom4ParamFit")
    residualHist = searchInputFile.Get("residualHist")
    relativeDiffHist = searchInputFile.Get("relativeDiffHist")
    sigOfDiffHist = searchInputFile.Get("sigOfDiffHist")
    logLikelihoodPseudoStatHist = searchInputFile.Get("logLikelihoodStatHistNullCase")
    chi2PseudoStatHist = searchInputFile.Get("chi2StatHistNullCase")
    bumpHunterStatHist = searchInputFile.Get("bumpHunterStatHistNullCase")
    #theFitFunction = searchInputFile.Get('theFitFunction')
    bumpHunterTomographyPlot = searchInputFile.Get('bumpHunterTomographyFromPseudoexperiments')
    bumpHunterStatOfFitToData = searchInputFile.Get('bumpHunterStatOfFitToData')

    # nominal background +- statistical uncertainty(uncertainty from fitting parameters)
    nomPlus1 = searchInputFile.Get("nominalBkgFromFit_plus1Sigma")
    nomMinus1 = searchInputFile.Get("nominalBkgFromFit_minus1Sigma")

    #nominal background +- uncertainties from fitting function choice
    if doAlternate :
      alternateBkg = searchInputFile.Get("alternateFitOnRealData")
      nomWithNewFuncErrSymm = searchInputFile.Get("nomOnDataWithSymmetricRMSScaleFuncChoiceErr")
      valueNewFuncErrDirected = searchInputFile.Get("nomOnDataWithDirectedRMSScaleFuncChoiceErr")

    logLOfFitToDataVec = searchInputFile.Get('logLOfFitToData')
    chi2OfFitToDataVec = searchInputFile.Get('chi2OfFitToData')
    statOfFitToData = searchInputFile.Get('bumpHunterPLowHigh')
    logLOfFitToData = logLOfFitToDataVec[0]
    logLPVal = logLOfFitToDataVec[1]
    chi2OfFitToData = chi2OfFitToDataVec[0]
    chi2PVal = chi2OfFitToDataVec[1]
    bumpHunterStatFitToData = statOfFitToData[0]
    bumpHunterPVal = bumpHunterStatOfFitToData[1]
    bumpLowEdge = statOfFitToData[1]
    bumpHighEdge = statOfFitToData[2]

    #NDF = searchInputFile.Get('NDF')[0]
    #fitparams = searchInputFile.Get('fittedParameters')

    print "logL of fit to data is",logLOfFitToData
    print "logL pvalue is",logLPVal
    print "chi2 of fit to data is",chi2OfFitToData
    #print "NDF is",NDF
    #print "chi2/NDF is",chi2OfFitToData/NDF
    print "chi2 pvalue is",chi2PVal
    print "bump hunter stat of fit to data is",bumpHunterStatFitToData
    print "bumpLowEdge, bumpHighEdge are",bumpLowEdge,bumpHighEdge
    print "BumpHunter pvalue is",bumpHunterPVal
    print "which is Z value of",GetZVal(bumpHunterPVal,True)
    #print "Fitted parameters were:",fitparams

    # Find range
    firstBin = 1000
    lastBin = basicData.GetNbinsX()
    print lastBin
    while (basicData.GetBinContent(lastBin)==0 and lastBin > 0) :
      lastBin = lastBin - 1

    # Calculate from fit range
    fitRange = searchInputFile.Get("FitRange")
    firstBin = basicData.FindBin(fitRange[0])
    lastBin = basicData.FindBin(fitRange[1])
    print "New firstbin, lastbin",firstBin,lastBin

    # Convert plots into desired final form
    standardbins = basicData.GetXaxis().GetXbins()
    newbins = []#ROOT.TArrayD(standardbins.GetSize())
    for np in range(standardbins.GetSize()) :
      newbins.append(standardbins[np]/1000)

    # Make new versions of old plots
    newbasicdata = ROOT.TH1D("basicData_TeV","basicData_TeV",len(newbins)-1,array('d',newbins))
    newbasicBkg = ROOT.TH1D("basicBkg_TeV","basicBkg_TeV",len(newbins)-1,array('d',newbins))
    newresidualHist = ROOT.TH1D("residualHist_TeV","residualHist_TeV",len(newbins)-1,array('d',newbins))
    newrelativeDiffHist = ROOT.TH1D("relativeDiffHist_TeV","relativeDiffHist_TeV",len(newbins)-1,array('d',newbins))
    newsigOfDiffHist = ROOT.TH1D("sigOfDiffHist_TeV","sigOfDiffHist_TeV",len(newbins)-1,array('d',newbins))

    newNomPlus1= ROOT.TH1D("nomPlus1_TeV","nomPlus1_TeV",len(newbins)-1,array('d',newbins))
    newNomMinus1= ROOT.TH1D("nomMinus1_TeV","nomMinus1_TeV",len(newbins)-1,array('d',newbins))

    newAlternateBkg = ROOT.TH1D("alternateBkg_TeV","alternateBkg_TeV",len(newbins)-1,array('d',newbins))
    newnomWithNewFuncErrSymm = ROOT.TH1D("nomWithNewFuncErrSymm_TeV","nomWithNewFuncErrSymm_TeV",len(newbins)-1,array('d',newbins))
    newValueNewFuncErrDirected= ROOT.TH1D("nomWithNewFuncErrDirected_TeV","nomWithNewFuncErrDirected_TeV",len(newbins)-1,array('d',newbins))

    for histnew,histold in [[newbasicdata,basicData],[newbasicBkg,basicBkg],\
                            [newNomPlus1,nomPlus1],[newNomMinus1,nomMinus1], \
                            [newresidualHist,residualHist],[newrelativeDiffHist,relativeDiffHist],\
                            [newsigOfDiffHist,sigOfDiffHist]] :
      for bin in range(histnew.GetNbinsX()+2) :
        histnew.SetBinContent(bin,histold.GetBinContent(bin))
        histnew.SetBinError(bin,histold.GetBinError(bin))
 
    if doAlternate:
      icount=0
      for histnew,histold in [[newAlternateBkg,alternateBkg], [newnomWithNewFuncErrSymm,nomWithNewFuncErrSymm],\
                              [newValueNewFuncErrDirected,valueNewFuncErrDirected]] :
     
        print "Count : ",icount
        print histnew.GetName()
        print histold.GetName()
        icount+=1
      
        for bin in range(histnew.GetNbinsX()+2) :
          histnew.SetBinContent(bin,histold.GetBinContent(bin))
          histnew.SetBinError(bin,histold.GetBinError(bin))

    # Significances for Todd
    ToddSignificancesHist = ROOT.TH1D("ToddSignificancesHist","ToddSignificancesHist",100,-5,5)
    for bin in range(0,newresidualHist.GetNbinsX()+1):
      if bin < firstBin: continue
      if bin > lastBin: continue
      residualValue = newresidualHist.GetBinContent(bin)
      ToddSignificancesHist.Fill(residualValue)

    # Search phase plots
    myPainter.drawDataAndFitOverSignificanceHist(newbasicdata,newbasicBkg,newresidualHist, 'm_{jj} [TeV]','Events','Significance','{0}/figure1'.format(outPath), luminosity,13,fitRange[0],fitRange[1], firstBin,lastBin,True,bumpLowEdge/1000.0,bumpHighEdge/1000.0,[],True,False,[],True,bumpHunterPVal)
    myPainter.drawDataAndFitOverSignificanceHist(newbasicdata,newbasicBkg,newresidualHist, 'm_{jj} [TeV]','Events','Significance','{0}/figure1_nologx'.format(outPath), luminosity,13,fitRange[0],fitRange[1], firstBin,lastBin,True,bumpLowEdge/1000.0,bumpHighEdge/1000.0,[],False,False,[],True,bumpHunterPVal)
    myPainter.drawDataAndFitOverSignificanceHist(newbasicdata,newbasicBkg,newresidualHist, 'm_{jj} [TeV]','Events','Significance','{0}/figure1_nobump'.format(outPath), luminosity,13,fitRange[0],fitRange[1],firstBin,lastBin+2,False,bumpLowEdge,bumpHighEdge,[],True,False,[],True,bumpHunterPVal)
    myPainter.drawDataAndFitOverSignificanceHist(newbasicdata,newbasicBkg,newresidualHist, 'm_{jj} [TeV]','Events','Significance','{0}/figure1_nobump_nologx'.format(outPath), luminosity,13,fitRange[0],fitRange[1],firstBin,lastBin,False,bumpLowEdge,bumpHighEdge,[],False,False,[],True,bumpHunterPVal)
    myPainter.drawPseudoExperimentsWithObservedStat(logLikelihoodPseudoStatHist,float(logLOfFitToData),logLPVal,0,luminosity,13, 'logL statistic','Pseudo-exeperiments',"{0}/logLStatPlot".format(outPath))
    myPainter.drawPseudoExperimentsWithObservedStat(chi2PseudoStatHist,float(chi2OfFitToData),chi2PVal,0,luminosity,13, "#chi^{2}",'Pseudo-exeperiments',"{0}/chi2StatPlot".format(outPath))
    myPainter.drawPseudoExperimentsWithObservedStat(bumpHunterStatHist,float(bumpHunterStatFitToData),bumpHunterPVal,0,luminosity,13, 'BumpHunter','Pseudo-exeperiments',"{0}/bumpHunterStatPlot".format(outPath))
    myPainter.drawBumpHunterTomographyPlot(bumpHunterTomographyPlot,"{0}/bumpHunterTomographyPlot".format(outPath))

    # Various significance plots
    myPainter.drawBasicHistogram(ToddSignificancesHist,-1,-1,"Residuals","Entries","{0}/ToddSignificancesHist".format(outPath))
    myPainter.drawSignificanceHistAlone(newrelativeDiffHist,"m_{jj} [TeV]","(D - B)/B","{0}/significanceonlyplot".format(outPath))
    myPainter.drawSignificanceHistAlone(newsigOfDiffHist,"m_{jj} [TeV]","(D - B)/#sqrt{Derr^{2}+Berr^{2}}","{0}/sigofdiffonlyplot".format(outPath))

    # Now to make the one comparing uncertainties
    placeHolderNom = newbasicBkg.Clone()
    placeHolderNom.SetName("placeHolderNom")
    nomPlusSymmFuncErr = newbasicBkg.Clone()
    nomPlusSymmFuncErr.SetName("nomPlusNewFuncErr")
    nomMinusSymmFuncErr = newbasicBkg.Clone()
    nomMinusSymmFuncErr.SetName("nomMinusNewFuncErr")
    for bin in range(nomPlusSymmFuncErr.GetNbinsX()+2) :
      nomPlusSymmFuncErr.SetBinContent(bin,newnomWithNewFuncErrSymm.GetBinContent(bin) + newnomWithNewFuncErrSymm.GetBinError(bin))
      nomMinusSymmFuncErr.SetBinContent(bin,newnomWithNewFuncErrSymm.GetBinContent(bin) - newnomWithNewFuncErrSymm.GetBinError(bin))

    if doAlternate:
      myPainter.drawDataWithFitAsHistogram(newbasicdata,newbasicBkg,luminosity,13,"m_{jj} [TeV]","Events",["Data","Fit","Fit uncertainty","Function choice"],"{0}/compareFitQualityAndAlternateFit".format(outPath),True,[[newNomPlus1,newNomMinus1],[placeHolderNom,newAlternateBkg]],firstBin,lastBin,True,True,True,False,False)
      myPainter.drawDataWithFitAsHistogram(newbasicdata,newbasicBkg,luminosity,13,"m_{jj} [TeV]","Events",["Data","Fit","Function choice","Alternate function"],"{0}/compareFitChoiceAndAlternateFit".format(outPath),True,[[nomPlusSymmFuncErr,nomMinusSymmFuncErr],[placeHolderNom,newAlternateBkg]],firstBin,lastBin,True,True,True,False,False)
      myPainter.drawDataWithFitAsHistogram(newbasicdata,newbasicBkg,luminosity,13,"m_{jj} [TeV]","Events",["Data","Fit","Fit uncertainty","Function choice"],"{0}/compareFitQualtiyAndFitChoice".format(outPath),True,[[newNomPlus1,newNomMinus1],[nomPlusSymmFuncErr,nomMinusSymmFuncErr]],firstBin,lastBin,True,True,True,False,False)
      myPainter.drawDataWithFitAsHistogram(newbasicdata,newbasicBkg,luminosity,13,"m_{jj} [TeV]","Events",["Data","Fit","Statistical fit uncertainty","Function choice"],"{0}/compareFitQualityAndFitChoice_Asymm".format(outPath),True,[[newNomPlus1,newNomMinus1],[placeHolderNom,newValueNewFuncErrDirected]],firstBin,lastBin,True,True,True,False,False)

      # Overlay nominal and alternate fit functions
      myPainter.drawDataWithFitAsHistogram(newbasicdata,newbasicBkg,luminosity,13,"m_{jj} [TeV]","Events",["Data","Fit","Alternate function"],"{0}/compareFitChoices".format(outPath),True,[[placeHolderNom,newAlternateBkg]],firstBin,lastBin,True,True,True,False,False)

      # Make a ratio histogram for bottom plot.
      altFitRatio = ROOT.TH1D("altFitRatio","altFitRatio",len(newbins)-1,array('d',newbins))
      for bin in range(0,altFitRatio.GetNbinsX()+1) :
        if newbasicBkg.GetBinContent(bin) == 0 :
          altFitRatio.SetBinContent(bin,0)
        else :
          altFitRatio.SetBinContent(bin,(valueNewFuncErrDirected.GetBinContent(bin)-newbasicBkg.GetBinContent(bin))/newbasicBkg.GetBinContent(bin))

      # Make a ratio histogram for paper plot.
      PlusNomRatio = ROOT.TH1D("PlusNomRatio","PlusNomRatio",len(newbins)-1,array('d',newbins))
      for bin in range(0,PlusNomRatio.GetNbinsX()+1) :
        if newbasicBkg.GetBinContent(bin) == 0 :
          PlusNomRatio.SetBinContent(bin,0)
        else :
          PlusNomRatio.SetBinContent(bin,(newNomPlus1.GetBinContent(bin)-newbasicBkg.GetBinContent(bin))/newbasicBkg.GetBinContent(bin))
      MinusNomRatio = ROOT.TH1D("MinusNomRatio","MinusNomRatio",len(newbins)-1,array('d',newbins))
      for bin in range(0,MinusNomRatio.GetNbinsX()+1) :
        if newbasicBkg.GetBinContent(bin) == 0 :
          MinusNomRatio.SetBinContent(bin,0)
        else :
          MinusNomRatio.SetBinContent(bin,(newNomMinus1.GetBinContent(bin)-newbasicBkg.GetBinContent(bin))/newbasicBkg.GetBinContent(bin))

      myPainter.drawDataWithFitAsHistogramAndResidual(newbasicdata,newbasicBkg,luminosity,13,"m_{jj} [TeV]","Events",["Data","Fit","Statistical uncertainty on fit","Function choice"],"{0}/compareFitQualityAndFitChoice_Asymm_WithRatio".format(outPath),True,[[newNomPlus1,newNomMinus1],[placeHolderNom,newValueNewFuncErrDirected]],[altFitRatio,MinusNomRatio,PlusNomRatio],firstBin,lastBin,True,True,True,False,False,True,False,True,bumpHunterPVal,True,fitRange[0],fitRange[1])
     
      myPainter.drawDataWithFitAsHistogramAndResidualPaper(newbasicdata,newbasicBkg,luminosity,13,"m_{jj} [TeV]","Events",["Data","Fit","Statistical uncertainty on fit","Function choice"],"{0}/compareFitQualityAndFitChoice_Asymm_WithRatioPaper".format(outPath),True,[[newNomPlus1,newNomMinus1],[placeHolderNom,newValueNewFuncErrDirected]],[altFitRatio,MinusNomRatio,PlusNomRatio],firstBin,lastBin,True,True,True,False,False)
     
      myPainter.drawMultipleFitsAndResiduals(newbasicdata,[newbasicBkg,newValueNewFuncErrDirected],[altFitRatio],["Nominal fit","Function choice"],"m_{jj} [TeV]","Events",["(alt-nom)/nom"],"{0}/directedFuncChoiceVersusNominal_withRatio".format(outPath),luminosity,13,firstBin,lastBin)

    ####### Draw Signal Template overlaid on Background###########
    if overlaidSignal:
      signalFile = ROOT.TFile.Open(signalFileName, "read")
      if not signalFile:
        print signalFileName, " doesn't exist!!!!"
        return
      # setup signal information
      #signalTitles = {"QStar": "#it{q}*"}
      #signalTypes = ["QStar"]
      #signalsMasses = {"QStar":[4000, 5000]}
      #signalScalingFactors = {"QStar": 0.1}
      #signalAxes = {"QStar": {"X" : "M_{#it{q}*} [GeV]", "Y": "#sigma #times #it{A} #times BR [pb]"} }
      signalTitles = {"DMZprime": "DM #it{Z}'"}
      signalTypes = ["DMZprime"]
      signalsMasses = {"DMZprime":[4000, 5000]}
      signalScalingFactors = {"DMZprime": 1000}
      signalAxes = {"DMZprime": {"X" : "M_{#it{q}*} [GeV]", "Y": "#sigma #times #it{A} #times BR [pb]"} }

      for signalType in signalTypes:
        print "in signal",signalType
        signalMasses = signalsMasses[signalType]
        signalMassesTeV = signalsMasses[signalType][:]
        for index in range(len(signalMasses)) :
          signalMassesTeV[index] = signalMasses[index]/1000.0
        print signalMassesTeV

        signalPlotsTeV = []
        legendlistTeV = []
        for mass in signalMasses :
          #sigplot = signalFile.Get("h_mjj_{0}".format(mass))
          sigplot = signalFile.Get("{0}_{1}".format(signalType, mass))
          sigplot.SetDirectory(0)
          sigplottev = newbasicdata.Clone()
          sigplottev.SetName("sigplot_{0}_{1}_TeV".format(signalType,mass))
          for bins in range(sigplot.GetNbinsX()+2) :
            for bin in range(sigplottev.GetNbinsX()+2) :
              if sigplot.GetBinLowEdge(bins)/1000.==sigplottev.GetBinLowEdge(bin) :
                sigplottev.SetBinContent(bin,sigplot.GetBinContent(bins))
                sigplottev.SetBinError(bin,sigplot.GetBinError(bins))
          sigplotforfitplusbkg = sigplottev.Clone()
          sigplotforfitplusbkg.SetDirectory(0)
          sigplotforfitplusbkg.SetName(sigplottev.GetName()+"_forfitplusbkg_TeV")
          sigplotforfitplusbkg.Scale(signalScalingFactors[signalType])
          signalPlotsTeV.append(sigplotforfitplusbkg)
          thistitle = signalTitles[signalType] + ", {0}= {1} TeV".format(signalAxes[signalType]["X"].split("[GeV]")[0].replace("M","m"),mass/1000.0)
          legendlistTeV.append(thistitle)

          extLastBin = lastBin
          for bin in range(sigplotforfitplusbkg.GetNbinsX()) :
            if bin > extLastBin and sigplotforfitplusbkg.GetBinContent(bin) > 0.01 :
              extLastBin = bin
            if sigplotforfitplusbkg.GetBinLowEdge(bin) > 1.3*mass/1000.0 :
              continue
            if extLastBin < lastBin :
              extLastBin = lastBin

      UserScaleText = signalTitles[signalType]
      if signalScalingFactors[signalType] == 1 :
        UserScaleText = signalTitles[signalType]
      else :
        UserScaleText = UserScaleText+",  #sigma #times "+str(signalScalingFactors[signalType])
      outputName = outPath+"FancyFigure1_"+signalType
      myPainter.drawDataAndFitWithSignalsOverSignificances(newbasicdata,newbasicBkg, None,\
                   newresidualHist,signalPlotsTeV, None, signalMassesTeV,legendlistTeV,\
                   "m_{jj} [TeV]","Events","","Significance ", outputName,luminosity,\
                   Ecm, firstBin,extLastBin,\
                   True, bumpLowEdge/1000,bumpHighEdge/1000,\
                   True,False,True,UserScaleText,True,bumpHunterPVal, True, \
                   fitRange[0], fitRange[1])
      outputName = outPath+"FancyFigure1_"+signalType+"_nologx"
      myPainter.drawDataAndFitWithSignalsOverSignificances(newbasicdata,newbasicBkg, None,\
                   newresidualHist,signalPlotsTeV, None, signalMassesTeV,legendlistTeV,\
                   "m_{jj} [TeV]","Events","","Significance ", outputName,luminosity,\
                   Ecm, firstBin,extLastBin,\
                   True, bumpLowEdge/1000,bumpHighEdge/1000,\
                   False,False,True,UserScaleText,True,bumpHunterPVal, True, \
                   fitRange[0], fitRange[1])
      outputName = outPath+"FancyFigure1_"+signalType+"_noBump"
      myPainter.drawDataAndFitWithSignalsOverSignificances(newbasicdata,newbasicBkg, None,\
                   newresidualHist,signalPlotsTeV, None, signalMassesTeV,legendlistTeV,\
                   "m_{jj} [TeV]","Events","","Significance ", outputName,luminosity,\
                   Ecm, firstBin,extLastBin,\
                   False, bumpLowEdge/1000,bumpHighEdge/1000,\
                   True,False,True,UserScaleText,True,bumpHunterPVal, True, \
                   fitRange[0], fitRange[1])
      outputName = outPath+"FancyFigure1_"+signalType+"_noBump_nologx"
      myPainter.drawDataAndFitWithSignalsOverSignificances(newbasicdata,newbasicBkg, None,\
                   newresidualHist,signalPlotsTeV, None, signalMassesTeV,legendlistTeV,\
                   "m_{jj} [TeV]","Events","","Significance ", outputName,luminosity,\
                   Ecm, firstBin,extLastBin,\
                   False, bumpLowEdge/1000,bumpHighEdge/1000,\
                   False,False,True,UserScaleText,True,bumpHunterPVal, True, \
                   fitRange[0], fitRange[1])

      ###############################
      # Draw the comparison between data and MC in the bottom panel
      if drawMCComparison:
        mcFile = ROOT.TFile(mcFileName, "read") ;
        if not mcFile:
          print "Can not open: ", mcFileName
          return 
        mchist_nominal = mcFile.Get("djet_mjj_nominal")
        mchist_jesup = mcFile.Get("djet_mjj_JES_up")
        mchist_jesdown = mcFile.Get("djet_mjj_JES_down")
        newmchist_nominal=ROOT.TH1D("djet_mjj_nominal_TeV","djet_mjj_nominal_TeV",len(newbins)-1,array('d',newbins))
        newmchist_jesup=ROOT.TH1D("djet_mjj_jesup_TeV","djet_mjj_jesup_TeV",len(newbins)-1,array('d',newbins))
        newmchist_jesdown=ROOT.TH1D("djet_mjj_jesdown_TeV","djet_mjj_jesdown_TeV",len(newbins)-1,array('d',newbins))
        for iBin1 in range(1, newmchist_nominal.GetNbinsX()+1):
          for iBin2 in range(1, mchist_nominal.GetNbinsX()+1):
            if newmchist_nominal.GetBinLowEdge(iBin1)*1000==mchist_nominal.GetBinLowEdge(iBin2):
              newmchist_nominal.SetBinContent(iBin1, mchist_nominal.GetBinContent(iBin2))
              newmchist_nominal.SetBinError(iBin1, mchist_nominal.GetBinError(iBin2))
              continue
        for iBin1 in range(1, newmchist_jesup.GetNbinsX()+1):
          for iBin2 in range(1, mchist_jesup.GetNbinsX()+1):
            if newmchist_jesup.GetBinLowEdge(iBin1)*1000==mchist_jesup.GetBinLowEdge(iBin2):
              newmchist_jesup.SetBinContent(iBin1, mchist_jesup.GetBinContent(iBin2))
              newmchist_jesup.SetBinError(iBin1, mchist_jesup.GetBinError(iBin2))
              continue
        for iBin1 in range(1, newmchist_jesdown.GetNbinsX()+1):
          for iBin2 in range(1, mchist_jesdown.GetNbinsX()+1):
            if newmchist_jesdown.GetBinLowEdge(iBin1)*1000==mchist_jesdown.GetBinLowEdge(iBin2):
              newmchist_jesdown.SetBinContent(iBin1, mchist_jesdown.GetBinContent(iBin2))
              newmchist_jesdown.SetBinError(iBin1, mchist_jesdown.GetBinError(iBin2))
              continue
      
        tmpRatioHist = newbasicdata.Clone()
        tmpRatioHist.SetMarkerColor(ROOT.kBlack)
        tmpRatioHist.Add(newmchist_nominal,-1)
        tmpRatioHist.Divide(newmchist_nominal)
        ## If data is 0 then there should be no ratio drawn
        for iBin in range(1, tmpRatioHist.GetNbinsX()+1):
          if newbasicdata.GetBinContent(iBin) == 0:
            tmpRatioHist.SetBinContent(iBin, 0)
            tmpRatioHist.SetBinError(iBin, 0)

        UpDownRatioHists = []
        if mchist_jesup.GetEntries() >= 0:
          tmpJESRatioHist = newmchist_jesup
          tmpJESRatioHist.Add( newmchist_nominal, -1. )
          tmpJESRatioHist.Divide( newmchist_nominal )
          tmpJESRatioHist.SetMarkerColorAlpha( ROOT.kBlue,0.15)
          tmpJESRatioHist.SetLineColorAlpha( ROOT.kBlue,0.15)
          tmpJESRatioHist.SetFillColorAlpha( ROOT.kBlue, 0.15)
          tmpJESRatioHist.SetFillStyle(1001)
          UpDownRatioHists.append(tmpJESRatioHist)
        if mchist_jesdown.GetEntries() >= 0:
          tmpJESRatioHist = newmchist_jesdown
          tmpJESRatioHist.Add( newmchist_nominal, -1. )
          tmpJESRatioHist.Divide( newmchist_nominal )
          tmpJESRatioHist.SetMarkerColorAlpha( ROOT.kBlue,0.15)
          tmpJESRatioHist.SetLineColorAlpha( ROOT.kBlue,0.15)
          tmpJESRatioHist.SetFillColorAlpha( ROOT.kBlue, 0.15)
          tmpJESRatioHist.SetFillStyle(1001)
          UpDownRatioHists.append(tmpJESRatioHist)
        outputName = outPath+"FancyFigure1_"+signalType+"_WithMCRatio"
        myPainter.drawDataAndFitWithSignalsOverSignificancesWithMCRatio(newbasicdata,newbasicBkg,None,\
                     newresidualHist, signalPlotsTeV, [], signalMassesTeV,legendlistTeV,\
                     "m_{jj} [TeV]","Events","#frac{Data-MC}{MC}","Significance",\
                     outputName,luminosity,Ecm,firstBin,lastBin,True,bumpLowEdge/1000.0,bumpHighEdge/1000.0,\
                     True,False,False, UserScaleText,True,bumpHunterPVal,True,fitRange[0],fitRange[1],\
                     newmchist_nominal,tmpRatioHist,UpDownRatioHists[0],UpDownRatioHists[1])
        outputName = outPath+"FancyFigure1_"+signalType+"_WithMCRatio_nologx"
        myPainter.drawDataAndFitWithSignalsOverSignificancesWithMCRatio(newbasicdata,newbasicBkg,None, \
                     newresidualHist, signalPlotsTeV, [],signalMassesTeV,legendlistTeV, \
                     "m_{jj} [TeV]","Events","#frac{Data-MC}{MC}","Significance",\
                     outputName,luminosity,Ecm,firstBin,lastBin,True,bumpLowEdge/1000.0,bumpHighEdge/1000.0,\
                     False,False,False, UserScaleText,True,bumpHunterPVal,True,fitRange[0],fitRange[1],\
                     newmchist_nominal,tmpRatioHist,UpDownRatioHists[0],UpDownRatioHists[1])

    searchInputFile.Close()
    del searchInputFile

    print "Done."
            residual2.SetDirectory(0)

            newfit2 = ROOT.TH1D("fit2_TeV", "fit2_TeV",
                                len(newbins) - 1, array('d', newbins))
            newresidual2 = ROOT.TH1D("residual2_TeV", "residual2_TeV",
                                     len(newbins) - 1, array('d', newbins))
            for histnew, histold in [[newfit2, fit2],
                                     [newresidual2, residual2]]:
                for bin in range(histnew.GetNbinsX() + 2):
                    histnew.SetBinContent(bin, histold.GetBinContent(bin))
                    histnew.SetBinError(bin, histold.GetBinError(bin))

            outputName = folderextension + "NominalAndBestFits_{0}_m{1}TeV".format(
                signal, mass) + plotextension
            myPainter.drawMultipleFitsAndResiduals(newdatahist,[newfithist,newfit2],[newresidual,newresidual2],["Nominal fit","Best fit in all #theta"],\
       "m_{jj} [TeV]","Events",["Nominal","Best Fit  "],outputName,luminosity,Ecm,\
       firstBin,lastBin+2)

            #      outputName = folderextension+"NominalAndBestFits_{0}_m{1}TeV_megazoom".format(signal,mass)+plotextension
            #      myPainter.drawMultipleFitsAndResiduals(newdatahist,[newfithist,newfit2],[newresidual,newresidual2],["Nominal fit","Best fit in all #theta"],\
            #	"m_{jj} [TeV]","Events",["Nominal","Best Fit  "],outputName,luminosity,Ecm,\
            #	newdatahist.FindBin(1.55),newdatahist.FindBin(1.74),False,0,0,True,False,notLogY=True)

            # Posteriors with CLs
            signalpost = inputfile.Get("likelihoodFunction")
            signalpost.SetDirectory(0)
            signalCL = inputfile.Get("CLOfRealLikelihood")[0]

            outputName = folderextension + "SignalPosteriorWith95CL_{0}_m{1}TeV".format(
                signal, mass)
            inlist = [signalpost, signalCL]
Exemplo n.º 5
0
            for histnew, histold in [[newfit2, fit2],
                                     [newresidual2, residual2]]:
                for bin in range(histnew.GetNbinsX() + 2):
                    histnew.SetBinContent(bin, histold.GetBinContent(bin))
                    histnew.SetBinError(bin, histold.GetBinError(bin))

            residual2.GetYaxis().SetNdivisions(604)

            outputName = folderextension + "NominalAndBestFits_{0}_m{1}TeV".format(
                signal, mass) + plotextension
            #myPainter.drawMultipleFitsAndResiduals(datahist,[fithist,fit2],[residual,residual2],["Nominal fit","Best fit in all #theta"],\
            #"m_{jj} [GeV]","Events",[" Significance","Significance   "],outputName,luminosity,Ecm,\
            #firstBin,lastBin-1,False,0,0,True,False,False,11,-1,True,["Nominal","Best Fit"],5E3,5E6)

            myPainter.drawMultipleFitsAndResiduals(datahist,[fithist,fit2],[residual,residual2],["Nominal fit","Best fit"],\
       "m_{jj} [GeV]","Events",[" Significance","Significance   "],outputName,luminosity,Ecm,\
       firstBin,lastBin-1,False,0,0,True,False,False,11,-1,True,["Nominal","Best Fit"],5E3,5E6)
            #outputName = folderextension+"NominalAndBestFits_{0}_m{1}TeV_megazoom".format(signal,mass)+plotextension
            #myPainter.drawMultipleFitsAndResiduals(newdatahist,[newfithist,newfit2],[newresidual,newresidual2],["Nominal fit","Best fit in all #theta"],\
            #"m_{jj} [TeV]","Events",["Nominal","Best Fit  "],outputName,luminosity,Ecm,\
            #newdatahist.FindBin(1.55),newdatahist.FindBin(1.74),False,0,0,True,False,notLogY=True)

            # Posteriors with CLs
            signalpost = inputfile.Get("likelihoodFunction")
            signalpost.SetDirectory(0)
            signalCL = inputfile.Get("CLOfRealLikelihood")[0]

            outputName = folderextension + "SignalPosteriorWith95CL_{0}_m{1}TeV".format(
                signal, mass)
            inlist = [signalpost, signalCL]
            myPainter.drawPosteriorsWithCLs([inlist], ["Signal posterior"],