コード例 #1
0
def getModelLimits(ptCut, coupling, these_massvals,individualLimitFiles, sig_dict, limitsDictOut, \
  cutstring = '', xname = "M_{Z'} [GeV]", yname = "#sigma #times #it{A} #times BR [pb]" ):
    print ptCut, "  ", coupling

    # Initialize painter
    myPainter = Morisot()
    myPainter.setColourPalette("ATLAS")
    myPainter.cutstring = cutstring
    #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"

    thisobserved = ROOT.TGraph()
    thisexpected = ROOT.TGraph()
    thisexpected_plus1 = ROOT.TGraph()
    thisexpected_minus1 = ROOT.TGraph()
    thisexpected_plus2 = ROOT.TGraph()
    thisexpected_minus2 = ROOT.TGraph()
    thistheory = ROOT.TGraph()
    #for mass in these_massvals:
    for mass in masses:
        import glob
        #file_list = glob.glob(individualLimitFiles.format(signal,mass))
        individualLimitFiles = individualLimitFiles.replace("PPP", ptCut)
        individualLimitFiles = individualLimitFiles.replace("CCC", coupling)
        individualLimitFiles = individualLimitFiles.replace("MMM", str(mass))
        file_list = glob.glob(
            individualLimitFiles.format(ptCut, coupling, mass))
        print "individualLimitFiles", individualLimitFiles
        print("file_list: ", file_list)
        if len(file_list) == 0: continue
        allCLs = []
        PE_CLs = []
        for f in file_list:
            file = ROOT.TFile.Open(f)
            if not file or not file.Get("CLOfRealLikelihood"): continue
            CL = file.Get("CLOfRealLikelihood")[0]
            PE_tree = file.Get("ensemble_test")

            if not PE_tree or not CL: continue

            for event in PE_tree:
                PE_CLs.append(
                    event.GetBranch("95quantile_marginalized_2").
                    GetListOfLeaves().At(0).GetValue())
            allCLs.append(CL)
        if len(allCLs) == 0: continue
        expCLs = GetCenterAndSigmaDeviations(PE_CLs)
        print mass, allCLs[0], expCLs[2], len(PE_CLs)
        m = float(mass) / 1000.
        obsCL = allCLs[0] / luminosity
        expCLs = [e / luminosity for e in expCLs]
        thisobserved.SetPoint(thisobserved.GetN(), m, obsCL)
        thisexpected_minus2.SetPoint(thisexpected_minus2.GetN(), m, expCLs[0])
        thisexpected_minus1.SetPoint(thisexpected_minus1.GetN(), m, expCLs[1])
        thisexpected.SetPoint(thisexpected.GetN(), m, expCLs[2])
        thisexpected_plus1.SetPoint(thisexpected_plus1.GetN(), m, expCLs[3])
        thisexpected_plus2.SetPoint(thisexpected_plus2.GetN(), m, expCLs[4])

        #c = SignalCouplings[signal]
        #print sig_dict[c]
        #signal_info        = sig_dict[c]['%1.2f'%m]
        #signal_acc         = signal_info['acc']
        #signal_thxsec      = signal_info['theory']
        #signal_info['exp'] = expCLs[2]
        #signal_info['obs'] = obsCL
        #signal_info['exp+1'] = expCLs[3]
        #signal_info['exp+2'] = expCLs[4]
        #signal_info['exp-1'] = expCLs[1]
        #signal_info['exp-2'] = expCLs[0]
        #if c not in limitsDictOut: limitsDictOut[c] = {}
        limitsDictOut = {}
        #limitsDictOut['%1.2f'%m] = signal_info
        #t#histheory.SetPoint(thistheory.GetN(),m,signal_acc*signal_thxsec)

        #if not c in ZPrimeLimits: ZPrimeLimits[c] = {}
        #ZPrimeLimits[c][m] = {'obs':obsCL,'exp':expCLs[2],'th':signal_acc*signal_thxsec}

    if thisobserved.GetN() == 0:
        print "No limits found for couping: ", coupling, "ptCut: ", ptCut
        return limitsDictOut

    thisexpected1 = makeBand(thisexpected_minus1, thisexpected_plus1)
    thisexpected2 = makeBand(thisexpected_minus2, thisexpected_plus2)
    outputName = folderextension + "Limits_pH" + ptCut + '_gSM' + coupling + "_" + dataset + plotextension

    xlow = 'automatic'  # (int(masses[signal][0]) - 100)/1000.
    xhigh = 'automatic'  #(int(masses[signal][-1]) + 100)/1000.

    #myPainter.drawLimitSettingPlotObservedExpected(thisobserved,thisexpected,thisexpected1, thisexpected2, thistheory,SignalTitles[signal],\
    #   outputName, xname,yname,luminosity,Ecm,xlow,xhigh,2E-4,100,False)
    myPainter.drawLimitSettingPlotObservedExpected(thisobserved,thisexpected,thisexpected1, thisexpected2,"",\
       "",outputName, xname,yname,luminosity,Ecm,xlow,xhigh,2E-4,100,False)
    return limitsDictOut
コード例 #2
0
luminosity = "0.0"

#fig = plt.figure(figsize=(10,8))
#ax = fig.add_subplot(111)

plotstart = 0
plotend = 4200

# greens,  reds,      blues,     # yellows
fillcolours = ['#CAFF70', '#FF6A6A', '#B0E2FF', '#FFF68F']
binedgecolours = ['#B3EE3A', '#CD5C5C', '#87CEFA', '#EEE685']
rangecolours = ['#6E8B3D', '#FF3030', '#4F94CD', '#EEEE00']
centrecolours = ['#556B2F', '#FF0000', '#36648B', '#8B7500']

# Initialize painter
myPainter = Morisot()
myPainter.setColourPalette("Teals")
myPainter.setLabelType(2)
myPainter.setEPS(True)

# Useful
firstXBinPlot = 4
lastXBinPlot = 50

for case in cases:
    for windowWidth in windowWidths:

        if "D" in case and windowWidth == 17: continue

        mystring = "case{0}_window{1}".format(case, windowWidth)
コード例 #3
0
doAlternate = True

luminosity = 6690

lowfit = 303
highfit = 611

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

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

# Initialize painter
myPainter = Morisot()
myPainter.setColourPalette("Teals")
myPainter.setLabelType(4)
myPainter.setEPS(False)

# Get search phase result
searchInputFile = ROOT.TFile.Open(filenametemp, "READ")

# Retrieve search phase inputs
basicData = searchInputFile.Get("basicData")
basicBkgFrom4ParamFit = searchInputFile.Get("basicBkgFrom4ParamFit")

nomPlus1 = searchInputFile.Get("nominalBkgFromFit_plus1Sigma")
nomMinus1 = searchInputFile.Get("nominalBkgFromFit_minus1Sigma")

if doAlternate:
コード例 #4
0
def getGaussianLimits( inputfileform, ratios, dataset, luminosity, cutstring, makePlot = True, outfolder = "./plots/"):

  basicInputFiles = {}
  for r in ratios: basicInputFiles[r] = []

  import glob
  file_list = glob.glob(inputfileform)
  for f in file_list:
    ratio_str = f.split('.')[-2].split('_')[-1]
    if ratio_str == 'resolutionwidth': ratio = 0.0
    else: ratio = float(ratio_str)/1000.
    if ratio in basicInputFiles: basicInputFiles[ratio].append(f)

  # Initialize painter
  myPainter = Morisot()
  # Internal
  myPainter.setLabelType(2)
  myPainter.cutstring = cutstring
  #myPainter.setLabelType(1)

  minMassVal = {}
  values = {}
  mass_list = []
  allobserved = []
  allexpected = []
  allexpected1Sigma = []
  allexpected2Sigma = []
  
  results = {}
  
  for r in ratios:
    values[r] = {}
    for f in basicInputFiles[r]:
      file = ROOT.TFile.Open(f)
      CLs = file.Get("CLsPerMass_widthToMass%d"%(r*1000))
      masses = file.Get("massesUsed")

      if masses == None: continue

      for i,mass in enumerate(masses) :
      
          #if dataset == "J100" and mass < 700: continue
          if "J75" in dataset and not makePlot and mass > 700: continue
          if mass > 1850: continue
          
          mass_list += [mass]
          PE_tree = file.Get("ensemble_tree_%d_%d"%(mass,r*1000))
          PE_CLs = []
          for event in PE_tree:
              PE_CLs.append( event.GetBranch("95quantile_marginalized_1").GetListOfLeaves().At(0).GetValue() )
          expCLs = GetCenterAndSigmaDeviations(PE_CLs)

          #print mass, CLs[i]/luminosity, [e/luminosity for e in expCLs]
          if mass not in values[r]:
            values[r][mass] = {'obs': [], 'exp': [], 'PEs': [] }
          values[r][mass]['obs'].append(CLs[i]/luminosity)
          values[r][mass]['exp'].append(expCLs[2]/luminosity)
          values[r][mass]['PEs'] += [e/luminosity for e in PE_CLs]        

    mass_list = sorted(list(set(mass_list)))
    thisobserved = ROOT.TGraph()
    thisexpected = ROOT.TGraph()
    thisexpected_plus1  = ROOT.TGraph()
    thisexpected_minus1 = ROOT.TGraph()
    thisexpected_plus2  = ROOT.TGraph()
    thisexpected_minus2 = ROOT.TGraph()
    for m in mass_list :
      if m not in values[r]: continue
      expCLs = GetCenterAndSigmaDeviations(values[r][m]['PEs'])
      print r, m, values[r][m]['obs'][0], values[r][m]['exp'][0], len(values[r][m]['PEs'])
      thisobserved.SetPoint(       thisobserved.GetN(),m,values[r][m]['obs'][0])
      thisexpected_minus2.SetPoint(thisexpected_minus2.GetN(),m,expCLs[0])
      thisexpected_minus1.SetPoint(thisexpected_minus1.GetN(),m,expCLs[1])
      thisexpected.SetPoint(       thisexpected.GetN(),m,expCLs[2])
      thisexpected_plus1.SetPoint( thisexpected_plus1.GetN(),m,expCLs[3])
      thisexpected_plus2.SetPoint( thisexpected_plus2.GetN(),m,expCLs[4])

    allobserved.append(thisobserved)
    allexpected.append(thisexpected)
    
    thisexpected1Sigma = makeBand(thisexpected_minus1,thisexpected_plus1)
    thisexpected2Sigma = makeBand(thisexpected_minus2,thisexpected_plus2)
    
    if r == 0:
    	allexpected1Sigma.append(thisexpected1Sigma)
    	allexpected2Sigma.append(thisexpected2Sigma)
    else:
        allexpected1Sigma.append(ROOT.TGraph())
        allexpected2Sigma.append(ROOT.TGraph())
    results[r] = {'obs':thisobserved, 'exp': thisexpected,'exp1':  thisexpected1Sigma,'exp2': thisexpected2Sigma}
    
  if makePlot:
    #print ratios
    #print [names['%1.2f'%r] for r in ratios]
    myPainter.drawSeveralObservedExpectedLimits(allobserved,allexpected,allexpected1Sigma,allexpected2Sigma,[names['%1.2f'%r] for r in ratios],outfolder+"GenericGaussians_"+dataset,"m_{G} [GeV]",\
     "#sigma #times #it{A} #times BR [pb]",luminosity,13,400,2000,1E-2,50,[],ATLASLabelLocation="BottomR",cutLocation="Left")
  
  return results
コード例 #5
0
# Options
doSyst = False
doQuadrants = True
folderextension = "./plots/"
plotextension = ""

# Define necessary quantities.
Ecm = 13
luminosity = 1000

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

# Initialize painter
myPainter = Morisot()
myPainter.setColourPalette("ATLAS")
#myPainter.setEPS(True)
myPainter.setLabelType(
    0)  # 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"

# Will run for each signal type you include here.
#signalInputFileTypes = ["QStar","BlackMax","ZPrime0p10","ZPrime0p20","ZPrime0p30","ZPrime0p60","ZPrime0p70","ZPrime0p80""ZPrime0p90","WPrime","QBHRS","QBHRS_FullSim"]
コード例 #6
0
#folder = "TestAnomalousPoints"
#ext = "_our3Par_496"

filename = "/lustre/SCRATCH/atlas/ywng/WorkSpace/r21/r21SwiftNew/r21StatisticalAnalysis/source/results/data2017/DijetISRMC/SearchResultData_caseA_window13_doSwift.root"

folder = "Test"
ext = ""

doAlternate = False
doStatSearch = False

luminosity = 3500

# Initialize painter
myPainter = Morisot()
myPainter.setColourPalette("Teals")
myPainter.setLabelType(2)
myPainter.setEPS(True)

searchInputFile = ROOT.TFile.Open(filename, "READ")

# Retrieve search phase inputs
basicData = searchInputFile.Get("basicData")
normalizedData = searchInputFile.Get("normalizedData")
basicBkgFrom4ParamFit = searchInputFile.Get("basicBkgFrom4ParamFit")
normalizedBkgFrom4ParamFit = searchInputFile.Get("normalizedBkgFrom4ParamFit")
residualHist = searchInputFile.Get("residualHist")
relativeDiffHist = searchInputFile.Get("relativeDiffHist")
sigOfDiffHist = searchInputFile.Get("sigOfDiffHist")
logLikelihoodPseudoStatHist = searchInputFile.Get(
コード例 #7
0
    ratios_J75 = [0.0, 0.05, 0.07, 0.10]
    inputfileform = indir+"results/data2017/runSWIFT2016_J75yStar06/GenericGaussians_3p57_doSwift_*"
    
    J75_plots = getGaussianLimits( inputfileform, ratios_J75, dataset, luminosity, cutstring, makePlot = not makeCombinedPlot)
  '''

  if makeCombinedPlot:  
    allobserved = []
    allexpected = []
    allexpected1Sigma = []
    allexpected2Sigma = []
    
    all_ratios = list(set().union(ratios_J100,ratios_J75))
    all_ratios.sort()
    for r in all_ratios:
        SR_dicts = [J100_plots,J75_plots]
        allobserved.append([d[r]['obs'] if r in d else None for d in SR_dicts])
        allexpected.append([d[r]['exp'] if r in d else None for d in SR_dicts])
        allexpected1Sigma.append([d[r]['exp1'] if r in d else None for d in SR_dicts if r == 0])
        allexpected2Sigma.append([d[r]['exp2'] if r in d else None for d in SR_dicts if r == 0])
      
    # Initialize painter
    myPainter = Morisot()
    # Internal
    myPainter.setLabelType(2)
    myPainter.cutstring = 'J75 |y*| < 0.3, 3.57 fb^{-1}    J100 |y*| < 0.6, 29.3 fb^{-1}'
    outfolder = "./plots/"
    
    myPainter.drawSeveralObservedExpectedLimits(allobserved,allexpected,allexpected1Sigma,allexpected2Sigma,[names['%1.2f'%r] for r in all_ratios],outfolder+"GenericGaussians_Combined","m_{G} [GeV]",\
       "#sigma #times #it{A} #times BR [pb]",0,13,400,2000,1E-2,50,[],ATLASLabelLocation="byLegend",cutLocation="BottomL",labels=["J75 |y*| < 0.3, 3.57 fb^{-1}","J100 |y*| < 0.6, 29.3 fb^{-1} "])
コード例 #8
0
subranges = [[200, 400], [400, 600], [600, 800], [800, 1000], [1000, 1500]]

folderextension = 'IgnoreNeff_dijetgamma_mc_00-00-05_3p23fb_4Par/'

plotextension = ''  #_3p34'

basicInputFileTemplate = "/home/beresford/TriJet/StatisticalAnalysis/Bayesian/results/Step4_GaussianLimits/IgnoreNeff_dijetgamma_mc_00-00-05_3p23fb_4Par/GenericGaussians_3p23_low{0}_high{1}_{2}.root"

inputsForFailedPoints = "/home/beresford/TriJet/StatisticalAnalysis/Bayesian/results/Step4_GaussianLimits/IgnoreNeff_dijetgamma_mc_00-00-05_3p23fb_4Par/GenericGaussians_mass{0}_{1}.root"
failedPoints = []
#failedPoints = [[1350,-1],[1500,-1],[1650,0.15],[1750,0.10]]
#failedPoints = [[1700,0.15]]

# Initialize painter
myPainter = Morisot()
myPainter.setLabelType(1)  # label

graphs = []
#names = ['#sigma_{G}/m_{G} = 0.15','#sigma_{G}/m_{G} = 0.10','#sigma_{G}/m_{G} = 0.07','#sigma_{G}/m_{G} = Res.']
names = [
    '#sigma_{G}/m_{G} = 0.10', '#sigma_{G}/m_{G} = 0.07',
    '#sigma_{G}/m_{G} = Res.'
]

results = {}

# Retrieve search phase inputs
for width in sorted(ratios, reverse=True):

    print "--------------------------------------"
コード例 #9
0
#plotextension = '_yStar0p6'
#plotextension = '_yStar0p3'

basicInputFileTemplates = [
    "/afs/cern.ch/work/r/rhankach/workDir/jet_exotic/StatisticalAnalysis/Bayesian/Gaussians/Dijet_LHCP_fold/GenericGaussians_0p08_low{0}_high{1}_{2}.root"
]
#basicInputFileTemplates = [
#"/cluster/warehouse/kpachal/DijetsSummer2016//Results/Gaussians/Dijet2016p2015/GenericGaussians_6p1_low{0}_high{1}_{2}.root"
#]

inputsForFailedPoints = ''  #'/cluster/warehouse/kpachal/ResultFiles_DijetStat13/Data15_C_fGRL_20150718/GaussianLimits/GenericGaussians_mass{0}_{1}.root'
failedPoints = []

# Initialize painter
myPainter = Morisot()
# Internal
myPainter.setLabelType(2)
#myPainter.setLabelType(1)

minMassVal = {}

for basicInputFileTemplate in basicInputFileTemplates:

    plotextension = extensions[basicInputFileTemplates.index(
        basicInputFileTemplate)]

    graphs = []

    results = {}
コード例 #10
0
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."
コード例 #11
0
#!/usr/bin/env python
import os
import ROOT
from art.morisot import Morisot

# get bash environment variables into python
STATS12PATH = str(os.environ["STATS12PATH"])

# Get input (the rootfile name should match that specified in the SearchPhase.config file)
searchInputFile = ROOT.TFile(STATS12PATH + '/results/SearchPhase_results.root')
folderextension = ''

# Initialize painter
myPainter = Morisot()

# Define necessary quantities.
luminosity = 20300

# Retrieve search phase inputs
basicData = searchInputFile.Get("basicData")
basicData.Print("all")
normalizedData = searchInputFile.Get("normalizedData")
basicBkgFrom4ParamFit = searchInputFile.Get("basicBkgFrom4ParamFit")
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")
コード例 #12
0
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")

    args = parser.parse_args()
    inFileName = args.inFileName
    outPath = args.outPath

    print "==================================="
    print "Executing Run_SearchPhase.py with :"
    print "inFileName       : ", inFileName
    print "outPath       : ", outPath
    print "Lumi       : ", args.lumi
    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.
    luminosity = 1000 * args.lumi
    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")
    normalizedData = searchInputFile.Get("normalizedData")
    basicBkgFrom4ParamFit = searchInputFile.Get("basicBkgFrom4ParamFit")
    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')

    if doAlternate:
        searchInputFile.ls()
        alternateBkg = searchInputFile.Get("alternateFitOnRealData")
        nomPlus1 = searchInputFile.Get("nominalBkgFromFit_plus1Sigma")
        nomMinus1 = searchInputFile.Get("nominalBkgFromFit_minus1Sigma")
        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()
    while (basicData.GetBinContent(lastBin) == 0 and lastBin > 0):
        lastBin -= 1
    if (firstBin > lastBin):
        firstBin = 1
        lastBin = basicData.GetNbinsX()
    print "First bin = ", firstBin, ": lower edge at", basicData.GetBinLowEdge(
        firstBin)

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

    #firstBin = basicData.FindBin(1100)
    #print "and another firstbin is",firstBin

    # 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 never versions of old plots
    newbasicdata = ROOT.TH1D("basicData_TeV", "basicData_TeV",
                             len(newbins) - 1, array('d', newbins))
    newbasicBkgFrom4ParamFit = ROOT.TH1D("basicBkgFrom4ParamFit_TeV",
                                         "basicBkgFrom4ParamFit_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))

    newAlternateBkg = ROOT.TH1D("alternateBkg_TeV", "alternateBkg_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))
    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],[newbasicBkgFrom4ParamFit,basicBkgFrom4ParamFit],\
            [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))

    # 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)
        #print residualValue
        ToddSignificancesHist.Fill(residualValue)
    myPainter.drawBasicHistogram(ToddSignificancesHist, -1, -1, "Residuals",
                                 "Entries",
                                 "{0}/ToddSignificancesHist".format(outPath))

    # Search phase plots
    myPainter.drawDataAndFitOverSignificanceHist(newbasicdata,newbasicBkgFrom4ParamFit,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,newbasicBkgFrom4ParamFit,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,newbasicBkgFrom4ParamFit,newresidualHist,\
            'm_{jj} [TeV]','Prescale-weighted events','Significance','{0}/figure1_nobump'.format(outPath),\
            luminosity,13,fitRange[0],fitRange[1],firstBin,lastBin,False,bumpLowEdge,bumpHighEdge,[],True,False,[],True,bumpHunterPVal)
    myPainter.drawDataAndFitOverSignificanceHist(newbasicdata,newbasicBkgFrom4ParamFit,newresidualHist,\
            'm_{jj} [TeV]','Prescale-weighted 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.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 = newbasicBkgFrom4ParamFit.Clone()
    placeHolderNom.SetName("placeHolderNom")
    nomPlusSymmFuncErr = newbasicBkgFrom4ParamFit.Clone()
    nomPlusSymmFuncErr.SetName("nomPlusNewFuncErr")
    nomMinusSymmFuncErr = newbasicBkgFrom4ParamFit.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))

    myPainter.drawDataWithFitAsHistogram(
        newbasicdata, newbasicBkgFrom4ParamFit, luminosity, 13, "m_{jj} [TeV]",
        "Events", ["Data", "Fit", "Fit uncertainty", "Function choice"],
        "{0}/compareFitQualityAndAlternateFit".format(outPath), True,
        [[newNomPlus1, newNomMinus1], [placeHolderNom, newAlternateBkg]],
        firstBin, lastBin + 2, True, True, True, False, False)
    myPainter.drawDataWithFitAsHistogram(
        newbasicdata, newbasicBkgFrom4ParamFit, luminosity, 13, "m_{jj} [TeV]",
        "Events", ["Data", "Fit", "Function choice", "Alternate function"],
        "{0}/compareFitChoiceAndAlternateFit".format(outPath), True,
        [[nomPlusSymmFuncErr, nomMinusSymmFuncErr],
         [placeHolderNom, newAlternateBkg]], firstBin, lastBin + 2, True, True,
        True, False, False)
    myPainter.drawDataWithFitAsHistogram(
        newbasicdata, newbasicBkgFrom4ParamFit, luminosity, 13, "m_{jj} [TeV]",
        "Events", ["Data", "Fit", "Fit uncertainty", "Function choice"],
        "{0}/compareFitQualtiyAndFitChoice".format(outPath),
        True, [[newNomPlus1, newNomMinus1],
               [nomPlusSymmFuncErr, nomMinusSymmFuncErr]], firstBin,
        lastBin + 2, True, True, True, False, False)

    myPainter.drawDataWithFitAsHistogram(
        newbasicdata, newbasicBkgFrom4ParamFit, 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 + 2,
        True, True, True, False, False)

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

    #print "RATI"
    #newfitfunctionratio = newAlternateBkg.Clone()
    #newfitfunctionratio.Add(newAlternateBkg,-1)
    #for bin in range(0,newAlternateBkg.GetNbinsX()+1) :
    #  if newAlternateBkg.GetBinContent(bin) == 0 :
    #    newfitfunctionratio.SetBinContent(bin,0)
    #  else :
    #    newfitfunctionratio.SetBinContent(bin,(newbasicBkgFrom4ParamFit.GetBinContent(bin)/newAlternateBkg.GetBinContent(bin)))
    #myPainter.drawBasicHistogram(newfitfunctionratio,firstBin,lastBin-5,"m_{jj} [TeV]","3 par/4par","{0}/compareDiffFitChoices".format(outPath))
    # BROKEN myPainter.drawManyOverlaidHistograms([newbasicBkgFrom4ParamFit],["3 par"],"m_{jj} [TeV]","Events","CompareFitFunctions",firstBin,lastBin+2,0,1E6)

    # Make a ratio histogram for Sasha's plot.
    # altFitRatio = ROOT.TH1D("altFitRatio","altFitRatio",len(newbins)-1,array('d',newbins))
    # for bin in range(0,altFitRatio.GetNbinsX()+1) :
    #   if newbasicBkgFrom4ParamFit.GetBinContent(bin) == 0 :
    #     altFitRatio.SetBinContent(bin,0)
    #   else :
    #     altFitRatio.SetBinContent(bin,(valueNewFuncErrDirected.GetBinContent(bin)-newbasicBkgFrom4ParamFit.GetBinContent(bin))/newbasicBkgFrom4ParamFit.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 newbasicBkgFrom4ParamFit.GetBinContent(bin) == 0:
            PlusNomRatio.SetBinContent(bin, 0)
        else:
            PlusNomRatio.SetBinContent(
                bin, (newNomPlus1.GetBinContent(bin) -
                      newbasicBkgFrom4ParamFit.GetBinContent(bin)) /
                newbasicBkgFrom4ParamFit.GetBinContent(bin))
    MinusNomRatio = ROOT.TH1D("MinusNomRatio", "MinusNomRatio",
                              len(newbins) - 1, array('d', newbins))
    for bin in range(0, MinusNomRatio.GetNbinsX() + 1):
        if newbasicBkgFrom4ParamFit.GetBinContent(bin) == 0:
            MinusNomRatio.SetBinContent(bin, 0)
        else:
            MinusNomRatio.SetBinContent(
                bin, (newNomMinus1.GetBinContent(bin) -
                      newbasicBkgFrom4ParamFit.GetBinContent(bin)) /
                newbasicBkgFrom4ParamFit.GetBinContent(bin))

    # myPainter.drawDataWithFitAsHistogramAndResidual(newbasicdata,newbasicBkgFrom4ParamFit,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+2,True,True,True,False,False,True,False,True,bumpHunterPVal,True,fitRange[0],fitRange[1]) # changed from lastBin+2 to lastBin+18 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(outPath),True,[[newNomPlus1,newNomMinus1],[placeHolderNom,newValueNewFuncErrDirected]],[altFitRatio,MinusNomRatio,PlusNomRatio],firstBin,lastBin+2,True,True,True,False,False) # changed from lastBin+2 to lastBin+18 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(outPath),luminosity,13,firstBin,lastBin+2)

    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(outPath))
        myPainter.drawBumpHunterTomographyPlot(
            TomographyPlotWithStats,
            "{0}/bumpHunterTomographyPlot_withStats".format(outPath))

        print "with stats, bumpLowEdge, bumpHighEdge are", bumpPValLow, bumpPValHigh
        print "BumpHunter pvalue is", bumpPValStat

    searchInputFile.Close()

    print "Done."
コード例 #13
0
do2DZPrime = True
doMixedSignals = False
doMCComparison = False
folderextension = "./plots/"
plotextension = ""

# Define necessary quantities.
Ecm = 13
luminosity = 1000

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

# Initialize painter
myPainter = Morisot()
#myPainter.setEPS(True)
myPainter.setColourPalette("ATLAS")
myPainter.setLabelType(
    1)  # 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"

# Will run for each signal type you include here.
#signalInputFileTypes = ["ZPrime0p16"]
コード例 #14
0
def makePlots(ratios_J100,ratios_J75,J100inputfileform,J75inputfileform,makeCombinedPlot = False):
  (dataset, luminosity, cutstring) = ("J100yStar06", 29.3*1000, "|y*| < 0.6" )
  if len(ratios_J100) == 1: cutstring += "  " + names['%1.2f'%(ratios_J100[0])]
  J100_plots = getGaussianLimits( J100inputfileform, ratios_J100, dataset, luminosity, cutstring, makePlot = not makeCombinedPlot)
   
  (dataset, luminosity, cutstring) = ("J75yStar03",  3.57*1000, "|y*| < 0.3")
  if len(ratios_J100) == 1: cutstring += "  " + names['%1.2f'%(ratios_J75[0])]
  J75_plots = getGaussianLimits( J75inputfileform, ratios_J75, dataset, luminosity, cutstring, makePlot = not makeCombinedPlot)
  

  if makeCombinedPlot:  
    allobserved = []
    allexpected = []
    allexpected1Sigma = []
    allexpected2Sigma = []
    
    all_ratios = list(set().union(ratios_J100,ratios_J75))
    all_ratios.sort()
    for r in all_ratios:
        SR_dicts = [J100_plots,J75_plots]
        allobserved.append([d[r]['obs'] if r in d else None for d in SR_dicts])
        allexpected.append([d[r]['exp'] if r in d else None for d in SR_dicts])
        allexpected1Sigma.append([d[r]['exp1'] if r in d else None for d in SR_dicts if r == 0])
        allexpected2Sigma.append([d[r]['exp2'] if r in d else None for d in SR_dicts if r == 0])
      
    # Initialize painter
    myPainter = Morisot()
    # Internal
    if len(ratios_J100) > 1 or len(ratios_J75) >  1:
      myPainter.setColourPalette("Tropical")
    else: myPainter.setColourPalette("ATLAS")
    myPainter.setLabelType(2)
    myPainter.cutstring = '#scale[0.9]{|y*| < 0.3, m_{jj} < 700 GeV};#scale[0.9]{|y*| < 0.6, m_{jj} > 700 GeV}'
    outfolder = "./plots/"
    outname = outfolder+"GenericGaussians_Combined"
    if len(ratios_J100) == 1 and len(ratios_J75) == 1 and ratios_J100[0] == ratios_J75[0]:
      outname += "_" + str(int(ratios_J75[0]*100))
      myPainter.cutstring += ";"+names['%1.2f'%(ratios_J75[0])].replace('Res.','detector resolution')
    
    myPainter.drawSeveralObservedExpectedLimits(allobserved,allexpected,allexpected1Sigma,allexpected2Sigma,\
       [names['%1.2f'%r] for r in all_ratios],outname,"m_{G} [GeV]",\
       "#sigma #times #it{A} #times BR [pb]",[3.57*1000,29.3*1000],13,400,1850,2E-2,300,[],\
       ATLASLabelLocation="BottomL",cutLocation="Left",doLegendLocation="Left" if len(ratios_J100) == 1 else "Center")
コード例 #15
0
folderextension = './plotting/SearchPhase/plots/2018-1-12/'

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

# Define necessary quantities.
luminosity = 1000
Ecm = 13

# Get input
doStatSearch = True
doAlternate = False # 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"

#searchInputFile = ROOT.TFile.Open(filename,"READ")
コード例 #16
0
#!/usr/bin/env python

import os
import ROOT
from art.morisot import Morisot
from array import array
import sys
import math

# Initialize painter
myPainter = Morisot()
myPainter.setColourPalette("Teals")
myPainter.setLabelType(2)
myPainter.setEPS(True)

CME = 13000

doIndividualPlots = False


class searchFileData:
    def __init__(self, filename, permitWindow=False):

        self.permitWindow = permitWindow

        searchInputFile = ROOT.TFile.Open(filename, "READ")

        # Retrieve search phase inputs
        self.basicData = searchInputFile.Get("basicData")
        self.basicData.SetDirectory(0)
        self.basicBkgFrom4ParamFit = searchInputFile.Get(
コード例 #17
0
def main():
    # User controlled arguments
    parser = argparse.ArgumentParser()
    parser.add_argument("--inFileName",
                        type=str,
                        default="",
                        help="The path to the input file from runBumpHunter")
    parser.add_argument(
        "--outPath",
        type=str,
        default="",
        help="The path prefix (directory) where you want the output plots")
    parser.add_argument("--lumi", type=float, default=1, help="Luminosity")
    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 = args.lumi * 1000
    overlaidSignal = args.overlaidSignal
    signalFileName = args.signalFileName
    drawMCComparison = args.drawMCComparison
    mcFileName = args.mcFileName

    print "==================================="
    print "inputFile       : ", inFileName
    print "outPath       : ", outPath
    print "Luminosity       : ", args.lumi
    print "OverlaidSignal       : ", overlaidSignal
    print "Signal File       : ", signalFileName
    print "drawMCComparison: ", drawMCComparison
    print "mcFileName: ", mcFileName
    print "==================================="

    # Get input root file
    inFile = ROOT.TFile.Open(inFileName, "READ")
    if not inFile:
        print inFileName, " doesn't exist."
        return
    # make plots folder i.e. make folder extension
    if not os.path.exists(outPath):
        os.makedirs(outPath)

    # Define necessary quantities.
    Ecm = 13
    # Initialize painter
    myPainter = Morisot()
    myPainter.setColourPalette("Teals")
    #myPainter.setEPS(True)
    myPainter.setLabelType(
        1)  # Sets label type i.e. Internal, Work in progress etc.
    # 0 Just ATLAS
    # 1 "Preliminary"
    # 2 "Internal"
    # 3 "Simulation Preliminary"
    # 4 "Simulation Internal"
    # 5 "Simulation"
    # 6 "Work in Progress"

    # Retrieve search phase inputs
    basicData = inFile.Get("basicData")
    basicBkg = inFile.Get("basicBkg")
    residualHist = inFile.Get("residualHist")
    logLikelihoodPseudoStatHist = inFile.Get("logLikelihoodStatHistNullCase")
    chi2PseudoStatHist = inFile.Get("chi2StatHistNullCase")
    bumpHunterStatHist = inFile.Get("bumpHunterStatHistNullCase")
    bumpHunterTomographyPlot = inFile.Get(
        'bumpHunterTomographyFromPseudoexperiments')
    bumpHunterStatOfFitToData = inFile.Get('bumpHunterStatOfFitToData')

    logLOfFitToDataVec = inFile.Get('logLOfFitToData')
    chi2OfFitToDataVec = inFile.Get('chi2OfFitToData')
    statOfFitToData = inFile.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]

    print "logL of fit to data is", logLOfFitToData
    print "logL pvalue is", logLPVal
    print "chi2 of fit to data is", chi2OfFitToData
    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)

    # Find range
    # Calculate from fit range
    fitRange = inFile.Get("FitRange")
    firstBin = basicData.FindBin(fitRange[0]) - 1
    lastBin = basicData.FindBin(fitRange[1])
    print "firstbin, lastbin: ", firstBin, lastBin
    print "First bin = ", firstBin, ": lower edge at", basicData.GetBinLowEdge(
        firstBin)
    print "Last bin = ", lastBin, ": higher edge at", basicData.GetBinLowEdge(
        lastBin) + basicData.GetBinWidth(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 never 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))

    for histnew, histold in [[newbasicdata, basicData],
                             [newbasicBkg, basicBkg],
                             [newresidualHist, residualHist]]:
        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)
        #print residualValue
        ToddSignificancesHist.Fill(residualValue)
    myPainter.drawBasicHistogram(ToddSignificancesHist, -1, -1, "Residuals",
                                 "Entries",
                                 "{0}/ToddSignificancesHist".format(outPath))

    # 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_nobump'.format(outPath),\
              luminosity,13,fitRange[0],fitRange[1],firstBin,lastBin,False,\
              bumpLowEdge,bumpHighEdge,[],True,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))

    ####### 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]"
            }
        }

        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("mjj_Scaled_"+signalType+"{0}_10fb".format(mass))
                sigplot = signalFile.Get("h_mjj_{0}".format(mass))
                #sigplot.Scale(luminosity/1000.)
                #sigplot.Scale(luminosity/1000./10*139)
                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])

    inFile.Close()
    print "Done."
コード例 #18
0
yranges['QStar'] = [5E-4,5E3] # was 1000
yranges['S8'] = [5E-3,5E3] # was 1000
yranges['WPrime'] = [5E-3,1E3]
yranges['WStarSinX0'] = [1E-3,100]
yranges['WStarSinX1'] = [1E-3,100]

# Get input
searchInputFile = ROOT.TFile(STATS12PATH+'/results/SearchPhase_results.root')
#limitInputFile = ROOT.TFile('/home/pachal/oxfordDijets/statisticsCode/StatisticalAnalysis2012/results/LimitSettingPhase_results.root')
xseceffInputFile = ROOT.TFile(DATA+'/inputs/xsecandacceptance/NormalizeTemplates/CrossSectionsForPlotting.root')
templateInputFile = ROOT.TFile(DATA+'/inputs/xsecandacceptance/NormalizeTemplates/TemplatesForPlotting.root')

folderextension = ""

# Initialize painter
myPainter = Morisot()
myPainter.setColourPalette("ATLAS")
myPainter.setLabelType(0)

for signal in signalInputFileTypes :
  # My files
#  limitFileName = "/home/pachal/oxfordDijets/statisticsCode/StatisticalAnalysis2012/results/{0}/LimitSettingPhase_results.root".format(signal)
  # Caterina's files
#  limitFileName = "/home/pachal/oxfordDijets/statisticsCode/StatisticalAnalysis2012/results/LimitSettingPhase{0}_Caterina_results.root".format(signal)
  # Oliver's files
#  limitFileName = "/data/atlas/atlasdata/pachal/fromOliver/LimitSettingPhase_results_{0}.root".format(signal)
  # "Final" files
  limitFileName = STATS12PATH+"/results/{0}/LimitSettingPhase_results.root".format(signal)
  limitInputFile = ROOT.TFile(limitFileName)

  axisnames = SignalAxes[signal]