
from ROOT import TStyle, TText, TLatex, TPaveText, gROOT
from Globals import *
from array import array

lhcbStyle = TStyle("lhcbStyle", "LHCb official plots style")
lhcbLabel = TText()
lhcbLatex = TLatex()
lhcb7TeVPrelimL = TPaveText()
lhcb0_9TeVPrelimL = TPaveText()

def LHCbStyle(colzPlot=False, NCont=25):

  # ##################################
  # # PURPOSE:
  # #
  # # This file defines a reasonable style for (black-and-white) 
  # # "publication quality" ROOT plots. The default settings contain 
  # # many features that are either not desirable for printing on white 
  # # paper or impair the general readability of plots.
  # #
  # # USAGE:
  #
  # Simply add the line
  #   from LHCbStyle import LHCbStyle
  # at the beginning of your root program (and make sure LHCbStyle.py is 
  # in a location accessible to the compiler). Then add the line
  #   lhcbStyle()
  # somewhere at the beginning of your program
  #
  # SOME COMMENTS:
  #
  # Statistics and fit boxes:
  #
  # "Decorative" items around the histogram are kept to a minimum.
  # In particular there is no box with statistics or fit information.
  # You can easily change this either by editing your private copy
  # of this style file or by calls to "gStyle" in your macro.
  # For example, 
  #   gStyle->SetOptFit(1011);
  # will add some fit information.
  #
  # Font:
  # 
  # The font is chosen to be 62, i.e.helvetica-bold-r-normal with
  # precision 2. Font is of course a matter of taste, but most people
  # will probably agree that Helvetica bold gives close to optimal
  # readibility in presentations. It appears to be the ROOT default, 
  # and since there are still some features in ROOT that simply won't 
  # respond to any font requests, it is the wise choice to avoid 
  # ugly font mixtures on the same plot... The precision of the font (2)
  # is chosen in order to have a rotatable and scalable font. Be sure
  # to use true-type fonts! I.e.
  # Unix.*.Root.UseTTFonts: true  in your .rootrc file. 
  #
  # "Landscape histograms":
  #
  # The style here is designed for more or less quadratic plots.
  # For very long histograms, adjustements are needed. For instance, 
  # for a canvas with 1x5 histograms:
  #  TCanvas* c1 = new TCanvas("c1", "L0 muons", 600, 800);
  #  c1->Divide(1,5);
  # adaptions like the following will be needed:
  #  gStyle->SetTickLength(0.05,"x");
  #  gStyle->SetTickLength(0.01,"y");
  #  gStyle->SetLabelSize(0.15,"x");
  #  gStyle->SetLabelSize(0.1,"y");
  #  gStyle->SetStatW(0.15);
  #  gStyle->SetStatH(0.5);
  #
  ##################################

  lhcbFont = 132  # Old LHCb style: 62
  lhcbWidth = 2  # Old LHCb style: 3.00
  lhcbTSize = 0.06

  lhcbStyle.SetFillColor(1)
  lhcbStyle.SetFillStyle(1001)   # solid
  lhcbStyle.SetFrameFillColor(0)
  lhcbStyle.SetFrameBorderMode(0)
  lhcbStyle.SetPadBorderMode(0)
  lhcbStyle.SetPadColor(0)
  lhcbStyle.SetCanvasBorderMode(0)
  lhcbStyle.SetCanvasColor(0)
  lhcbStyle.SetStatColor(0)
  lhcbStyle.SetLegendBorderSize(0)
  lhcbStyle.SetLegendFont(132)

  # If you want the usual gradient palette (blue . red)
  lhcbStyle.SetPalette(1)
  # If you want colors that correspond to gray scale in black and white:
  palette = array('i',[0, 5, 7, 3, 6, 2, 4, 1])
  lhcbStyle.SetPalette(8, palette) 

  # set the paper & margin sizes
  lhcbStyle.SetPaperSize(20, 26)
  lhcbStyle.SetPadTopMargin(0.05)
  lhcbStyle.SetPadRightMargin(0.05)  # increase for colz plots
  lhcbStyle.SetPadBottomMargin(0.16)
  lhcbStyle.SetPadLeftMargin(0.14)

  # use large fonts
  lhcbStyle.SetTextFont(lhcbFont)
  lhcbStyle.SetTextSize(lhcbTSize)
  lhcbStyle.SetLabelFont(lhcbFont, "x")
  lhcbStyle.SetLabelFont(lhcbFont, "y")
  lhcbStyle.SetLabelFont(lhcbFont, "z")
  lhcbStyle.SetLabelSize(lhcbTSize, "x")
  lhcbStyle.SetLabelSize(lhcbTSize, "y")
  lhcbStyle.SetLabelSize(lhcbTSize, "z")
  lhcbStyle.SetTitleFont(lhcbFont)
  lhcbStyle.SetTitleFont(lhcbFont, "x")
  lhcbStyle.SetTitleFont(lhcbFont, "y")
  lhcbStyle.SetTitleFont(lhcbFont, "z")
  lhcbStyle.SetTitleSize(1.2*lhcbTSize, "x")
  lhcbStyle.SetTitleSize(1.2*lhcbTSize, "y")
  lhcbStyle.SetTitleSize(1.2*lhcbTSize, "z")

  # use medium bold lines and thick markers
  
  lhcbStyle.SetLineWidth(lhcbWidth)
  lhcbStyle.SetFrameLineWidth(lhcbWidth)
  lhcbStyle.SetHistLineWidth(lhcbWidth)
  lhcbStyle.SetFuncWidth(lhcbWidth)
  lhcbStyle.SetGridWidth(lhcbWidth)

  lhcbStyle.SetLineStyleString(2, "[12 12]")  # postscript dashes
  lhcbStyle.SetMarkerStyle(20)
  lhcbStyle.SetMarkerSize(1.0)


# label offsets
  lhcbStyle.SetLabelOffset(0.010, "X")
  lhcbStyle.SetLabelOffset(0.010, "Y")

  # by default, do not display histogram decorations:
  lhcbStyle.SetOptStat(0)
  #lhcbStyle.SetOptStat("emr");  # show only nent -e , mean - m , rms -r
  # full opts at http:#root.cern.ch/root/html/TStyle.html#TStyle:SetOptStat
  lhcbStyle.SetStatFormat("6.3g")  # specified as c printf options
  lhcbStyle.SetOptTitle(0)
  lhcbStyle.SetOptFit(0)
  #lhcbStyle.SetOptFit(1011); # order is probability, Chi2, errors, parameters
  #titles
  lhcbStyle.SetTitleOffset(0.95, "X")
  lhcbStyle.SetTitleOffset(0.95, "Y")
  lhcbStyle.SetTitleOffset(1.2, "Z")
  lhcbStyle.SetTitleFillColor(0)
  lhcbStyle.SetTitleStyle(0)
  lhcbStyle.SetTitleBorderSize(0)
  lhcbStyle.SetTitleFont(lhcbFont, "title")
  lhcbStyle.SetTitleX(0.0)
  lhcbStyle.SetTitleY(1.0)
  lhcbStyle.SetTitleW(1.0)
  lhcbStyle.SetTitleH(0.05)

  # look of the statistics box:
  lhcbStyle.SetStatBorderSize(0)
  lhcbStyle.SetStatFont(lhcbFont)
  lhcbStyle.SetStatFontSize(0.05)
  lhcbStyle.SetStatX(0.9)
  lhcbStyle.SetStatY(0.9)
  lhcbStyle.SetStatW(0.25)
  lhcbStyle.SetStatH(0.15)

  # put tick marks on top and RHS of plots
  lhcbStyle.SetPadTickX(1)
  lhcbStyle.SetPadTickY(1)

  # histogram divisions: only 5 in x to avoid label overlaps
  lhcbStyle.SetNdivisions(505, "x")
  lhcbStyle.SetNdivisions(510, "y")

  ## add LHCb label
  #lhcbName = new TPaveText(gStyle.GetPadLeftMargin() + 0.05,
  #                         0.87 - gStyle.GetPadTopMargin(),
  #                         gStyle.GetPadLeftMargin() + 0.20,
  #                         0.95 - gStyle.GetPadTopMargin(),
  #                         "BRNDC");
  #lhcbName.AddText("LHCb");
  #lhcbName.SetFillColor(0);
  #lhcbName.SetTextAlign(12);
  #lhcbName.SetBorderSize(0);

  lhcbLabel.SetTextFont(lhcbFont)
  lhcbLabel.SetTextColor(1)
  lhcbLabel.SetTextSize(lhcbTSize)
  lhcbLabel.SetTextAlign(12)

  lhcbLatex.SetTextFont(lhcbFont)
  lhcbLatex.SetTextColor(1)
  lhcbLatex.SetTextSize(lhcbTSize)
  lhcbLatex.SetTextAlign(12)

  gROOT.SetStyle("lhcbStyle")
  gROOT.ForceStyle()

  return
