Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
plotZXValidationRegions.py 10.77 KiB
import ROOT
import numpy as np

import sys 
from os import path
sys.path.append( path.dirname( path.dirname( path.abspath(__file__) ) ) ) # need to append the parent directory here explicitly to be able to import plotPostProcess

import functions.tGraphHelpers as graphHelper


def m12UpperLimit( m4l ):

    if m4l < 130 : return 106.
    else :         return  97.2

def m12LowerLimit( m4l ):
    
    if m4l < 130 : return 50.
    else :         return 85.2


def m34UpperLimit( m4l ): return 115.


def m34LowerLimit( m4l ):
    
    if   m4l <= 100. : return 5.
    elif m4l <= 105. : return ((m4l - 100.)*1.4 + 5.)
    elif m4l <= 140. : return 12.
    elif m4l <= 190. : return ((m4l - 140.)*0.76 + 12.)
    else:              return 50.


def prepCanvas(canvasName = "VRVisualizationCanvas"):

    canvasWidth = 20.00025*10*2.6; canvasHeight = 20.320*10*2.6
    canvas = ROOT.TCanvas(canvasName,canvasName, int(canvasWidth),int(canvasHeight))

    canvas.SetLeftMargin(0.16)
    canvas.SetBottomMargin(0.12)

    return canvas


def setupTLegend( nColumns = 2, boundaries = (0.15,0.70,0.55,0.95)):
    # set up a TLegend, still need to add the different entries
    # boundaries = (lowLimit X, lowLimit Y, highLimit X, highLimit Y)

    TLegend = ROOT.TLegend(boundaries[0],boundaries[1],boundaries[2],boundaries[3])
    TLegend.SetFillColor(ROOT.kWhite)
    TLegend.SetLineColor(ROOT.kWhite)
    TLegend.SetNColumns(nColumns);
    TLegend.SetFillStyle(0);  # make legend background transparent
    TLegend.SetBorderSize(0); # and remove its border without a border

    ROOT.gStyle.SetLegendTextSize(0.038)

    return TLegend

def activateATLASPlotStyle():
    # runs the root macro that defines the ATLAS style, and checks that it is active
    # relies on a seperate style macro
    ROOT.gROOT.ProcessLine(".x ../atlasStyle.C")

    if "ATLAS" in ROOT.gStyle.GetName(): print("ROOT.gStyle: ATLAS style loaded!")
    else:                                warnings.warn("Did not load ATLAS style properly")

    return None

def makeTGraphs():
    m4lVR1 = range(50, 115); m4lVR1.append(114.99999999999)
    m4lSR  = range(115, 130); m4lSR.append(129.99999999999)
    m4lVR2 = range(130, 170+1)

    m4lList = []

    for eachList in [m4lVR1,m4lSR,m4lVR2]:  m4lList.extend(eachList)

    m12HighList = [m12UpperLimit( m4l ) for m4l in m4lList]
    m12LowList  = [m12LowerLimit( m4l ) for m4l in m4lList]


    m34HighList = [m34UpperLimit( m4l ) for m4l in m4lList]
    m34LowList  = [m34LowerLimit( m4l ) for m4l in m4lList]

    m12HighGraph = graphHelper.listToTGraph(m4lList, m12HighList)
    m12LowGraph  = graphHelper.listToTGraph(m4lList, m12LowList)

    m34HighGraph = graphHelper.listToTGraph(m4lList, m34HighList)
    m34LowGraph  = graphHelper.listToTGraph(m4lList, m34LowList)

    VR1Graph = graphHelper.listToTGraph(m4lVR1, [(m34LowerLimit(m4l)+ m34UpperLimit(m4l))/2 for m4l in m4lVR1], [m34LowerLimit(m4l) for m4l in m4lVR1], [m34UpperLimit(m4l) for m4l in m4lVR1]) 
    VR2Graph = graphHelper.listToTGraph(m4lVR2, [(m34LowerLimit(m4l)+ m34UpperLimit(m4l))/2 for m4l in m4lVR2], [m34LowerLimit(m4l) for m4l in m4lVR2], [m34UpperLimit(m4l) for m4l in m4lVR2]) 
    SRGraph = graphHelper.listToTGraph(m4lSR, [(m34LowerLimit(m4l)+ m34UpperLimit(m4l))/2 for m4l in m4lSR], [m34LowerLimit(m4l) for m4l in m4lSR], [m34UpperLimit(m4l) for m4l in m4lSR]) 


    VR1GraphM12 = graphHelper.listToTGraph(m4lVR1, [(m12LowerLimit(m4l)+ m12UpperLimit(m4l))/2 for m4l in m4lVR1], [m12LowerLimit(m4l) for m4l in m4lVR1], [m12UpperLimit(m4l) for m4l in m4lVR1]) 
    VR2GraphM12 = graphHelper.listToTGraph(m4lVR2, [(m12LowerLimit(m4l)+ m12UpperLimit(m4l))/2 for m4l in m4lVR2], [m12LowerLimit(m4l) for m4l in m4lVR2], [m12UpperLimit(m4l) for m4l in m4lVR2]) 
    SRGraphM12  = graphHelper.listToTGraph(m4lSR, [(m12LowerLimit(m4l)+ m12UpperLimit(m4l))/2 for m4l in m4lSR], [m12LowerLimit(m4l) for m4l in m4lSR], [m12UpperLimit(m4l) for m4l in m4lSR]) 


    for graph in m12HighGraph, m12LowGraph, m34HighGraph, m34LowGraph, VR1Graph, VR2Graph, SRGraph:
        graph.GetXaxis().SetRangeUser( min(m4lList), max(m4lList))
        graph.GetYaxis().SetRangeUser( 0, 150)
        graph.SetLineWidth(2)
        graph.GetXaxis().SetTitle("m_{4l}")


        yAxisTitleSize = 0.055
        graph.GetYaxis().SetTitleSize(yAxisTitleSize)
        graph.GetYaxis().SetTitleOffset(0)
        graph.GetXaxis().SetTitleOffset(1.0)
        graph.GetXaxis().SetTitleSize(0.055)


    for graph in [m12HighGraph, m12LowGraph]: graph.SetLineStyle(2)


    #import pdb; pdb.set_trace() # import the debugger and instruct it to stop here

    return m12HighGraph, m12LowGraph, m34HighGraph, m34LowGraph, VR1Graph, VR2Graph, SRGraph, VR1GraphM12, VR2GraphM12, SRGraphM12



if __name__ == '__main__':

    #activateATLASPlotStyle()


    alternatePlot = True


    ### make TGraphs


    m12HighGraph, m12LowGraph, m34HighGraph, m34LowGraph, VR1Graph, VR2Graph, SRGraph, VR1GraphM12, VR2GraphM12, SRGraphM12 = makeTGraphs()


    VR1Color = ROOT.kRed
    VR2Color = ROOT.kGreen 
    SRColor = ROOT.kBlue 


    VR1Graph.SetFillColorAlpha(VR1Color ,0.1)
    VR2Graph.SetFillColorAlpha(VR2Color  ,0.1)
    SRGraph.SetFillColorAlpha( SRColor ,0.1)

    VR1GraphM12.SetFillColor(VR1Color)
    VR2GraphM12.SetFillColor(VR2Color)
    SRGraphM12.SetFillColor( SRColor)

    VR1GraphM12.SetFillStyle(3013)
    VR2GraphM12.SetFillStyle(3013)
    SRGraphM12.SetFillStyle(3013)

    legend = setupTLegend(nColumns = 3, boundaries = (0.2, 0.8 ,0.9,0.9) )

    if alternatePlot: legend = setupTLegend(nColumns = 3, boundaries = (0.2, 0.75 ,0.9,0.9) )

    legend.AddEntry(VR1Graph , "ZX VR c" , "f");
    legend.AddEntry(SRGraph  , "ZX SR" , "f");
    legend.AddEntry(VR2Graph , "ZX VR d" , "f");

    if alternatePlot:
        legend.AddEntry(m12HighGraph , "m_{12} bounds" , "l");
        legend.AddEntry(m34HighGraph , "m_{34} bounds" , "l");


    regionsMultiGraph = ROOT.TMultiGraph()
    for graph in [VR1Graph, VR2Graph, SRGraph]: 
        graph.GetXaxis().SetRangeUser( 50, 170)
        regionsMultiGraph.Add(graph)



    regionsMultiGraphM12 = ROOT.TMultiGraph()
    for graph in [VR1GraphM12, VR2GraphM12, SRGraphM12]: regionsMultiGraphM12.Add(graph)

    limitsMultiGraph = ROOT.TMultiGraph()
    for graph in [m12HighGraph, m12LowGraph, m34HighGraph, m34LowGraph]: limitsMultiGraph.Add(graph)

    regionsMultiGraph.GetXaxis().SetTitle("m_{4l} [GeV]")
    regionsMultiGraph.GetYaxis().SetTitle("m_{ll'} [GeV]")




    regionsMultiGraph.GetYaxis().SetRangeUser( 0, 150)
    

    canvas = prepCanvas()

    #VR1Graph.Draw("A3")

    regionsMultiGraph.Draw("A3")
    regionsMultiGraphM12.Draw("3")
    limitsMultiGraph.Draw()

    #SRGraph.Draw("3 same")

    latexText = ROOT.TLatex()
    #latexText.SetTextAlign(10)


    if not alternatePlot:

        textScale = 0.75

        latexText.DrawLatex( 90 ,m12UpperLimit( 90 ) -6,"#scale[%f]{#color[1]{#bf{m_{12} upper limit}}}" %(textScale) )
        latexText.DrawLatex( 90 ,m12LowerLimit( 90 ) -6,"#scale[%f]{#color[1]{#bf{m_{12} lower limit}}}" %(textScale) )

        latexText.DrawLatex(60,m34UpperLimit( 60 ) +3,"#scale[%f]{#color[1]{#bf{m_{34} upper limit}}}" %(textScale) )
        latexText.DrawLatex(60,m34LowerLimit( 60 ) +3,"#scale[%f]{#color[1]{#bf{m_{34} lower limit}}}" %(textScale) )

    else: pass

    legend.Draw()

    canvas.Update()

    ROOT.gPad.RedrawAxis("G") # to make sure that the Axis ticks are above the histograms


    if alternatePlot : 
        canvas.Print("validationRegionPlot_b.pdf")
        canvas.Print("validationRegionPlot_b.root")
    else :             
        canvas.Print("validationRegionPlot_a.pdf")
        canvas.Print("validationRegionPlot_a.root")
    


    #####   canvas2   #####


    canvas2 = prepCanvas( canvasName = "VRVisualizationM34" )

    #VR1Graph.Draw("A3")

    regionsMultiGraph.Draw("A3")
    regionsMultiGraph.GetYaxis().SetTitle("m_{34} [GeV]")

    limitsMultiGraph2 = ROOT.TMultiGraph()
    for graph in [ m34HighGraph, m34LowGraph]: limitsMultiGraph2.Add(graph)
    limitsMultiGraph2.Draw()


    delimeter_m34_VR1_SR = ROOT.TLine(115,m34LowerLimit(115),115, m34UpperLimit(115))
    delimeter_m34_SR_VR2 = ROOT.TLine(130,m34LowerLimit(130),130, m34UpperLimit(130))
    for line in [delimeter_m34_VR1_SR, delimeter_m34_SR_VR2]:
        line.SetLineWidth(2)
        line.SetLineStyle(2)
        line.Draw()


    #regionsMultiGraphM12.Draw("3")
    #limitsMultiGraph.Draw()

    #SRGraph.Draw("3 same")

    #latexText.DrawLatex(60,80,"#scale[%f]{#bf{ZX VR 5}}"%(.75))
    #latexText.DrawLatex(116,80,"#scale[%f]{#bf{ZX \\ SR}}"%(.6))
    #latexText.DrawLatex(140,80,"#scale[%f]{#bf{ZX VR 6}}"%(.75))


    legend2 = setupTLegend(nColumns = 3, boundaries = (0.2, 0.8 ,0.9,0.9) )
    #if alternatePlot: legend = setupTLegend(nColumns = 3, boundaries = (0.2, 0.75 ,0.9,0.9) )
    legend2.AddEntry(VR1Graph , "ZX VR 5" , "f");
    legend2.AddEntry(SRGraph  , "ZX SR" , "f");
    legend2.AddEntry(VR2Graph , "ZX VR 6" , "f");
    legend2.Draw()

    canvas2.Update()

    canvas2.Print("validationRegionPlot_M34.pdf")
    canvas2.Print("validationRegionPlot_M34.root")



    #####   canvas3   #####


    canvas3 = prepCanvas( canvasName = "VRVisualizationM12" )

    #VR1Graph.Draw("A3")

    VR1GraphM12.SetFillStyle(1001)  ; VR1GraphM12.SetFillColorAlpha(VR1Color ,0.1)
    VR2GraphM12.SetFillStyle(1001)  ; VR2GraphM12.SetFillColorAlpha(VR2Color  ,0.1)
    SRGraphM12.SetFillStyle(1001)  ; SRGraphM12.SetFillColorAlpha( SRColor ,0.1)

    regionsMultiGraphM12.Draw("A3")

    regionsMultiGraphM12.GetYaxis().SetTitle("m_{12} [GeV]")
    regionsMultiGraphM12.GetYaxis().SetTitle("m_{12} [GeV]")
    regionsMultiGraphM12.GetXaxis().SetTitle("m_{4l} [GeV]")
    regionsMultiGraphM12.GetYaxis().SetRangeUser( 0, 150)
    regionsMultiGraphM12.GetXaxis().SetRangeUser( 50, 170)

    limitsMultiGraph3 = ROOT.TMultiGraph()
    for graph in [ m12HighGraph, m12LowGraph]: 
        graph.SetLineStyle(1)
        limitsMultiGraph3.Add(graph)
    limitsMultiGraph3.Draw()
    #regionsMultiGraphM12.Draw("3")
    #limitsMultiGraph.Draw()

    #SRGraph.Draw("3 same")

    delimeter_m12_VR1_SR = ROOT.TLine(115,m12LowerLimit(115),115, m12UpperLimit(115))
    delimeter_m12_SR_VR2 = ROOT.TLine(130,m12LowerLimit(130),130, m12UpperLimit(130))
    for line in [delimeter_m12_VR1_SR, delimeter_m12_SR_VR2]:
        line.SetLineWidth(2)
        line.SetLineStyle(2)
        line.Draw()


    legend3 = setupTLegend(nColumns = 3, boundaries = (0.2, 0.8 ,0.9,0.9) )
    #if alternatePlot: legend = setupTLegend(nColumns = 3, boundaries = (0.2, 0.75 ,0.9,0.9) )
    legend3.AddEntry(VR1Graph , "ZX VR c" , "f");
    legend3.AddEntry(SRGraph  , "ZX SR" , "f");
    legend3.AddEntry(VR2Graph , "ZX VR d" , "f");
    legend3.Draw()

    canvas3.Update()

    canvas3.Print("validationRegionPlot_M12.pdf")
    canvas3.Print("validationRegionPlot_M12.root")

    #import pdb; pdb.set_trace() # import the debugger and instruct it to stop here