CMS 3D CMS Logo

List of all members | Public Member Functions | Private Member Functions | Private Attributes
plotting.Plot Class Reference

Public Member Functions

def __init__ (self, name, kwargs)
 
def addToLegend (self, legend, legendLabels, denomUncertainty)
 
def clone (self, kwargs)
 
def create (self, tdirNEvents, requireAllHistograms=False)
 
def draw (self, pad, ratio, ratioFactor, nrows)
 
def drawRatioUncertainty (self)
 
def getName (self)
 
def getNumberOfHistograms (self)
 
def isEmpty (self)
 
def isRatio (self, ratio)
 
def isTGraph2D (self)
 
def setName (self, name)
 
def setProperties (self, kwargs)
 

Private Member Functions

def _createOne (self, name, index, tdir, nevents)
 
def _normalize (self)
 
def _setStats (self, histos, startingX, startingY)
 

Private Attributes

 _forLegend
 
 _frame
 
 _histograms
 
 _mainAdditional
 
 _name
 
 _ratioAdditional
 
 _ratios
 
 _tmp_histos
 
 _xtitle
 
 _ytitle
 

Detailed Description

Represents one plot, comparing one or more histograms.

Definition at line 1695 of file plotting.py.

Constructor & Destructor Documentation

◆ __init__()

def plotting.Plot.__init__ (   self,
  name,
  kwargs 
)
Constructor.

Arguments:
name -- String for name of the plot, or Efficiency object

Keyword arguments:
fallback     -- Dictionary for specifying fallback (default None)
outname      -- String for an output name of the plot (default None for the same as 'name')
title        -- String for a title of the plot (default None)
xtitle       -- String for x axis title (default None)
xtitlesize   -- Float for x axis title size (default None)
xtitleoffset -- Float for x axis title offset (default None)
xlabelsize   -- Float for x axis label size (default None)
ytitle       -- String for y axis title (default None)
ytitlesize   -- Float for y axis title size (default None)
ytitleoffset -- Float for y axis title offset (default None)
ztitle       -- String for z axis title (default None)
ztitleoffset -- Float for z axis title offset (default None)
xmin         -- Float for x axis minimum (default None, i.e. automatic)
xmax         -- Float for x axis maximum (default None, i.e. automatic)
ymin         -- Float for y axis minimum (default 0)
ymax         -- Float for y axis maximum (default None, i.e. automatic)
xlog         -- Bool for x axis log status (default False)
ylog         -- Bool for y axis log status (default False)
xgrid        -- Bool for x axis grid status (default True)
ygrid        -- Bool for y axis grid status (default True)
stat         -- Draw stat box? (default False)
fit          -- Do gaussian fit? (default False)
statx        -- Stat box x coordinate (default 0.65)
staty        -- Stat box y coordinate (default 0.8)
statyadjust  -- List of floats for stat box y coordinate adjustments (default None)
normalizeToUnitArea -- Normalize histograms to unit area? (default False)
normalizeToNumberOfEvents -- Normalize histograms to number of events? If yes, the PlotFolder needs 'numberOfEventsHistogram' set to a histogram filled once per event (default False)
profileX     -- Take histograms via ProfileX()? (default False)
fitSlicesY   -- Take histograms via FitSlicesY() (default False)
rebinX       -- rebin x axis (default None)
scale        -- Scale histograms by a number (default None)
xbinlabels   -- List of x axis bin labels (if given, default None)
xbinlabelsize -- Size of x axis bin labels (default None)
xbinlabeloption -- Option string for x axis bin labels (default None)
removeEmptyBins -- Bool for removing empty bins, but only if histogram has bin labels (default False)
printBins    -- Bool for printing bin values, but only if histogram has bin labels (default False)
drawStyle    -- If "hist", draw as line instead of points (default None)
drawCommand  -- Deliver this to Draw() (default: None for same as drawStyle)
lineWidth    -- If drawStyle=="hist", the width of line (default 2)
legendDx     -- Float for moving TLegend in x direction for separate=True (default None)
legendDy     -- Float for moving TLegend in y direction for separate=True (default None)
legendDw     -- Float for changing TLegend width for separate=True (default None)
legendDh     -- Float for changing TLegend height for separate=True (default None)
legend       -- Bool to enable/disable legend (default True)
adjustMarginLeft  -- Float for adjusting left margin (default None)
adjustMarginRight  -- Float for adjusting right margin (default None)
ratio        -- Possibility to disable ratio for this particular plot (default None)
ratioYmin    -- Float for y axis minimum in ratio pad (default: list of values)
ratioYmax    -- Float for y axis maximum in ratio pad (default: list of values)
ratioFit     -- Fit straight line in ratio? (default None)
ratioUncertainty -- Plot uncertainties on ratio? (default True)
ratioCoverageXrange -- Range of x axis values (xmin,xmax) to limit the automatic ratio y axis range calculation to (default None for disabled)
histogramModifier -- Function to be called in create() to modify the histograms (default None)

Definition at line 1697 of file plotting.py.

1697  def __init__(self, name, **kwargs):
1698  """ Constructor.
1699 
1700  Arguments:
1701  name -- String for name of the plot, or Efficiency object
1702 
1703  Keyword arguments:
1704  fallback -- Dictionary for specifying fallback (default None)
1705  outname -- String for an output name of the plot (default None for the same as 'name')
1706  title -- String for a title of the plot (default None)
1707  xtitle -- String for x axis title (default None)
1708  xtitlesize -- Float for x axis title size (default None)
1709  xtitleoffset -- Float for x axis title offset (default None)
1710  xlabelsize -- Float for x axis label size (default None)
1711  ytitle -- String for y axis title (default None)
1712  ytitlesize -- Float for y axis title size (default None)
1713  ytitleoffset -- Float for y axis title offset (default None)
1714  ztitle -- String for z axis title (default None)
1715  ztitleoffset -- Float for z axis title offset (default None)
1716  xmin -- Float for x axis minimum (default None, i.e. automatic)
1717  xmax -- Float for x axis maximum (default None, i.e. automatic)
1718  ymin -- Float for y axis minimum (default 0)
1719  ymax -- Float for y axis maximum (default None, i.e. automatic)
1720  xlog -- Bool for x axis log status (default False)
1721  ylog -- Bool for y axis log status (default False)
1722  xgrid -- Bool for x axis grid status (default True)
1723  ygrid -- Bool for y axis grid status (default True)
1724  stat -- Draw stat box? (default False)
1725  fit -- Do gaussian fit? (default False)
1726  statx -- Stat box x coordinate (default 0.65)
1727  staty -- Stat box y coordinate (default 0.8)
1728  statyadjust -- List of floats for stat box y coordinate adjustments (default None)
1729  normalizeToUnitArea -- Normalize histograms to unit area? (default False)
1730  normalizeToNumberOfEvents -- Normalize histograms to number of events? If yes, the PlotFolder needs 'numberOfEventsHistogram' set to a histogram filled once per event (default False)
1731  profileX -- Take histograms via ProfileX()? (default False)
1732  fitSlicesY -- Take histograms via FitSlicesY() (default False)
1733  rebinX -- rebin x axis (default None)
1734  scale -- Scale histograms by a number (default None)
1735  xbinlabels -- List of x axis bin labels (if given, default None)
1736  xbinlabelsize -- Size of x axis bin labels (default None)
1737  xbinlabeloption -- Option string for x axis bin labels (default None)
1738  removeEmptyBins -- Bool for removing empty bins, but only if histogram has bin labels (default False)
1739  printBins -- Bool for printing bin values, but only if histogram has bin labels (default False)
1740  drawStyle -- If "hist", draw as line instead of points (default None)
1741  drawCommand -- Deliver this to Draw() (default: None for same as drawStyle)
1742  lineWidth -- If drawStyle=="hist", the width of line (default 2)
1743  legendDx -- Float for moving TLegend in x direction for separate=True (default None)
1744  legendDy -- Float for moving TLegend in y direction for separate=True (default None)
1745  legendDw -- Float for changing TLegend width for separate=True (default None)
1746  legendDh -- Float for changing TLegend height for separate=True (default None)
1747  legend -- Bool to enable/disable legend (default True)
1748  adjustMarginLeft -- Float for adjusting left margin (default None)
1749  adjustMarginRight -- Float for adjusting right margin (default None)
1750  ratio -- Possibility to disable ratio for this particular plot (default None)
1751  ratioYmin -- Float for y axis minimum in ratio pad (default: list of values)
1752  ratioYmax -- Float for y axis maximum in ratio pad (default: list of values)
1753  ratioFit -- Fit straight line in ratio? (default None)
1754  ratioUncertainty -- Plot uncertainties on ratio? (default True)
1755  ratioCoverageXrange -- Range of x axis values (xmin,xmax) to limit the automatic ratio y axis range calculation to (default None for disabled)
1756  histogramModifier -- Function to be called in create() to modify the histograms (default None)
1757  """
1758  self._name = name
1759 
1760  def _set(attr, default):
1761  setattr(self, "_"+attr, kwargs.get(attr, default))
1762 
1763  _set("fallback", None)
1764  _set("outname", None)
1765 
1766  _set("title", None)
1767  _set("xtitle", None)
1768  _set("xtitlesize", None)
1769  _set("xtitleoffset", None)
1770  _set("xlabelsize", None)
1771  _set("ytitle", None)
1772  _set("ytitlesize", None)
1773  _set("ytitleoffset", None)
1774  _set("ztitle", None)
1775  _set("ztitleoffset", None)
1776 
1777  _set("xmin", None)
1778  _set("xmax", None)
1779  _set("ymin", 0.)
1780  _set("ymax", None)
1781 
1782  _set("xlog", False)
1783  _set("ylog", False)
1784  _set("xgrid", True)
1785  _set("ygrid", True)
1786 
1787  _set("stat", False)
1788  _set("fit", False)
1789 
1790  _set("statx", 0.65)
1791  _set("staty", 0.8)
1792  _set("statyadjust", None)
1793 
1794  _set("normalizeToUnitArea", False)
1795  _set("normalizeToNumberOfEvents", False)
1796  _set("profileX", False)
1797  _set("fitSlicesY", False)
1798  _set("rebinX", None)
1799 
1800  _set("scale", None)
1801  _set("xbinlabels", None)
1802  _set("xbinlabelsize", None)
1803  _set("xbinlabeloption", None)
1804  _set("removeEmptyBins", False)
1805  _set("printBins", False)
1806 
1807  _set("drawStyle", "EP")
1808  _set("drawCommand", None)
1809  _set("lineWidth", 2)
1810 
1811  _set("legendDx", None)
1812  _set("legendDy", None)
1813  _set("legendDw", None)
1814  _set("legendDh", None)
1815  _set("legend", True)
1816 
1817  _set("adjustMarginLeft", None)
1818  _set("adjustMarginRight", None)
1819 
1820  _set("ratio", None)
1821  _set("ratioYmin", [0, 0.2, 0.5, 0.7, 0.8, 0.9, 0.95])
1822  _set("ratioYmax", [1.05, 1.1, 1.2, 1.3, 1.5, 1.8, 2, 2.5, 3, 4, 5])
1823  _set("ratioFit", None)
1824  _set("ratioUncertainty", True)
1825  _set("ratioCoverageXrange", None)
1826 
1827  _set("histogramModifier", None)
1828 
1829  self._histograms = []
1830 
def __init__(self, dataset, job_number, job_id, job_name, isDA, isMC, applyBOWS, applyEXTRACOND, extraconditions, runboundary, lumilist, intlumi, maxevents, gt, allFromGT, alignmentDB, alignmentTAG, apeDB, apeTAG, bowDB, bowTAG, vertextype, tracktype, refittertype, ttrhtype, applyruncontrol, ptcut, CMSSW_dir, the_dir)

Member Function Documentation

◆ _createOne()

def plotting.Plot._createOne (   self,
  name,
  index,
  tdir,
  nevents 
)
private
Create one histogram from a TDirectory.

Definition at line 1878 of file plotting.py.

References plotting._getOrCreateObject().

Referenced by plotting.Plot.create().

1878  def _createOne(self, name, index, tdir, nevents):
1879  """Create one histogram from a TDirectory."""
1880  if tdir == None:
1881  return None
1882 
1883  # If name is a list, pick the name by the index
1884  if isinstance(name, list):
1885  name = name[index]
1886 
1887  h = _getOrCreateObject(tdir, name)
1888  if h is not None and self._normalizeToNumberOfEvents and nevents is not None and nevents != 0:
1889  h.Scale(1.0/nevents)
1890  return h
1891 
def _getOrCreateObject(tdirectory, nameOrCreator)
Definition: plotting.py:57

◆ _normalize()

def plotting.Plot._normalize (   self)
private
Normalise histograms to unit area

Definition at line 1984 of file plotting.py.

References RunHistogramManager._histograms, and plotting.Plot._histograms.

Referenced by plotting.Plot.draw().

1984  def _normalize(self):
1985  """Normalise histograms to unit area"""
1986 
1987  for h in self._histograms:
1988  if h is None:
1989  continue
1990  i = h.Integral()
1991  if i == 0:
1992  continue
1993  if h.GetSumw2().fN <= 0: # to suppress warning
1994  h.Sumw2()
1995  h.Scale(1.0/i)
1996 

◆ _setStats()

def plotting.Plot._setStats (   self,
  histos,
  startingX,
  startingY 
)
private
Set stats box.

Definition at line 1942 of file plotting.py.

References DTSC._stat, and DTTrigGeom._stat.

1942  def _setStats(self, histos, startingX, startingY):
1943  """Set stats box."""
1944  if not self._stat:
1945  for h in histos:
1946  if h is not None and hasattr(h, "SetStats"):
1947  h.SetStats(0)
1948  return
1949 
1950  def _doStats(h, col, dy):
1951  if h is None:
1952  return
1953  h.SetStats(True)
1954 
1955  if self._fit and h.GetEntries() > 0.5:
1956  h.Fit("gaus", "Q")
1957  f = h.GetListOfFunctions().FindObject("gaus")
1958  if f == None:
1959  h.SetStats(0)
1960  return
1961  f.SetLineColor(col)
1962  f.SetLineWidth(1)
1963  h.Draw()
1964  ROOT.gPad.Update()
1965  st = h.GetListOfFunctions().FindObject("stats")
1966  if self._fit:
1967  st.SetOptFit(0o010)
1968  st.SetOptStat(1001)
1969  st.SetOptStat(1110)
1970  st.SetX1NDC(startingX)
1971  st.SetX2NDC(startingX+0.3)
1972  st.SetY1NDC(startingY+dy)
1973  st.SetY2NDC(startingY+dy+0.12)
1974  st.SetTextColor(col)
1975 
1976  dy = 0.0
1977  for i, h in enumerate(histos):
1978  if self._statyadjust is not None and i < len(self._statyadjust):
1979  dy += self._statyadjust[i]
1980 
1981  _doStats(h, _plotStylesColor[i], dy)
1982  dy -= 0.16
1983 

◆ addToLegend()

def plotting.Plot.addToLegend (   self,
  legend,
  legendLabels,
  denomUncertainty 
)
Add histograms to a legend.

Arguments:
legend       -- TLegend
legendLabels -- List of strings for the legend labels

Definition at line 2230 of file plotting.py.

References RunHistogramManager._histograms, plotting.Plot._histograms, and ComparisonHelper.zip().

2230  def addToLegend(self, legend, legendLabels, denomUncertainty):
2231  """Add histograms to a legend.
2232 
2233  Arguments:
2234  legend -- TLegend
2235  legendLabels -- List of strings for the legend labels
2236  """
2237  first = denomUncertainty
2238  for h, label in zip(self._histograms, legendLabels):
2239  if h is None:
2240  first = False
2241  continue
2242  if first:
2243  self._forLegend = h.Clone()
2244  self._forLegend.SetFillStyle(1001)
2245  self._forLegend.SetFillColor(ROOT.kGray)
2246  entry = legend.AddEntry(self._forLegend, label, "lpf")
2247  first = False
2248  else:
2249  legend.AddEntry(h, label, "LP")
2250 
OutputIterator zip(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp)

◆ clone()

def plotting.Plot.clone (   self,
  kwargs 
)

◆ create()

def plotting.Plot.create (   self,
  tdirNEvents,
  requireAllHistograms = False 
)
Create histograms from list of TDirectories

Definition at line 1892 of file plotting.py.

References plotting.Plot._createOne(), RunHistogramManager._histograms, plotting.Plot._histograms, FP420HitsObject._name, TrackerHitsObject._name, PGeometricDet::Item._name, TrackingRecHitAlgorithm._name, Logger._name, hcaldqm::DQModule._name, citk::IsolationConeDefinitionBase._name, WValidation._name, DrellYanValidation._name, hcaldqm::flag::Flag._name, hcaldqm::quantity::Quantity._name, HistoParams< T >._name, CutApplicatorBase._name, HistoParams< TH2F >._name, HistoParams< TProfile2D >._name, SequenceTypes.SequencePlaceholder._name, plotting.Subtract._name, plotting.Transform._name, plotting.FakeDuplicate._name, plotting.CutEfficiency._name, plotting.AggregateBins._name, plotting.AggregateHistos._name, plotting.ROC._name, SequenceTypes._TaskBasePlaceholder._name, plotting.Plot._name, plotting.AggregateBins._scale, HistoParams< TH1F >._title, HistoParams< TProfile >._title, HistoParams< T >._title, HistoParams< TH2F >._title, SiStripHitEffFromCalibTree._title, HistoParams< TProfile2D >._title, html.PageSet._title, plotting.Subtract._title, html.HtmlReport._title, plotting.Transform._title, plotting.FakeDuplicate._title, plotting.CutEfficiency._title, genParticles_cff.map, and FastTimerService_cff.range.

1892  def create(self, tdirNEvents, requireAllHistograms=False):
1893  """Create histograms from list of TDirectories"""
1894  self._histograms = [self._createOne(self._name, i, tdirNEvent[0], tdirNEvent[1]) for i, tdirNEvent in enumerate(tdirNEvents)]
1895 
1896  if self._fallback is not None:
1897  profileX = [self._profileX]*len(self._histograms)
1898  for i in range(0, len(self._histograms)):
1899  if self._histograms[i] is None:
1900  self._histograms[i] = self._createOne(self._fallback["name"], i, tdirNEvents[i][0], tdirNEvents[i][1])
1901  profileX[i] = self._fallback.get("profileX", self._profileX)
1902 
1903  if self._histogramModifier is not None:
1904  self._histograms = self._histogramModifier(self._histograms)
1905 
1906  if len(self._histograms) > len(_plotStylesColor):
1907  raise Exception("More histograms (%d) than there are plot styles (%d) defined. Please define more plot styles in this file" % (len(self._histograms), len(_plotStylesColor)))
1908 
1909  # Modify histograms here in case self._name returns numbers
1910  # and self._histogramModifier creates the histograms from
1911  # these numbers
1912  def _modifyHisto(th1, profileX):
1913  if th1 is None:
1914  return None
1915 
1916  if profileX:
1917  th1 = th1.ProfileX()
1918 
1919  if self._fitSlicesY:
1920  ROOT.TH1.AddDirectory(True)
1921  th1.FitSlicesY()
1922  th1 = ROOT.gDirectory.Get(th1.GetName()+"_2")
1923  th1.SetDirectory(None)
1924  #th1.SetName(th1.GetName()+"_ref")
1925  ROOT.TH1.AddDirectory(False)
1926 
1927  if self._title is not None:
1928  th1.SetTitle(self._title)
1929 
1930  if self._scale is not None:
1931  th1.Scale(self._scale)
1932 
1933  return th1
1934 
1935  if self._fallback is not None:
1936  self._histograms = list(map(_modifyHisto, self._histograms, profileX))
1937  else:
1938  self._histograms = list(map(lambda h: _modifyHisto(h, self._profileX), self._histograms))
1939  if requireAllHistograms and None in self._histograms:
1940  self._histograms = [None]*len(self._histograms)
1941 
def create(alignables, pedeDump, additionalData, outputFile, config)

◆ draw()

def plotting.Plot.draw (   self,
  pad,
  ratio,
  ratioFactor,
  nrows 
)
Draw the histograms using values for a given algorithm.

Definition at line 1997 of file plotting.py.

References RunHistogramManager._histograms, plotting.Plot._histograms, plotting._mergeBinLabelsX(), plotting._mergeBinLabelsY(), plotting.Plot._normalize(), plotting._th1IncludeOnlyBins(), HistoData.getName(), MaterialInformation.getName(), trklet::MemoryBase.getName(), EcalLogicID.getName(), PCaloHit.getName(), emtf::Node.getName(), CocoaMaterialElementary.getName(), trklet::ProcessBase.getName(), ecaldqm::DBReaderWorker.getName(), ParticleFlux.getName(), L1TUtmScale.getName(), FittedEntry.getName(), hcaldqm::mapper::Mapper.getName(), ecaldqm::DBWriterWorker.getName(), TkOfflineVariables.getName(), FieldHandlerBase< TOutput >.getName(), L1TUtmCondition.getName(), IdealResult.getName(), TrackingRecHitAlgorithm.getName(), L1TUtmAlgorithm.getName(), PassiveHit.getName(), jsoncollector::JsonMonitorable.getName(), QCriterion.getName(), hcaldqm::mapper::HashMapper.getName(), CSGAction.getName(), MVAVariableManager< ParticleType >.getName(), AnyMVAEstimatorRun2Base.getName(), DTTPGLutFile.getName(), AlignmentAlgorithm.getName(), L1TriggerLutFile.getName(), fastsim::InteractionModel.getName(), L1MuGMTReg.getName(), GenericMVAComputer::TaggingVariableIterator< Iter_t >::Value.getName(), pos::PixelPortcardMap.getName(), L1TUtmCut.getName(), GEMStation.getName(), PhysicsTools::Variable::Value.getName(), edm::messagelogger::ELseverityLevel.getName(), L1TUtmObject.getName(), L1TUtmTriggerMenu.getName(), edm::ELseverityLevel.getName(), RPCDCCLink.getName(), RPCAMCLink.getName(), L1MuGMTRegMMConfig.getName(), JanAlignmentAlgorithm.getName(), cscdqm::HistoDef.getName(), FourVectorHLT::PathInfo.getName(), RPCLBLink.getName(), jsoncollector::DataPoint.getName(), ecaldqm::DQWorker.getName(), PhysicsTools::Variable.getName(), dqm::impl::MonitorElement.getName(), L1MuGMTRegSortRankOffset.getName(), L1MuGMTRegCDLConfig.getName(), cscdqm::CSCHistoDef.getName(), plotting.PlotEmpty.getName(), plotting.Plot.getName(), plotting.Plot.isTGraph2D(), and print().

1997  def draw(self, pad, ratio, ratioFactor, nrows):
1998  """Draw the histograms using values for a given algorithm."""
1999 # if len(self._histograms) == 0:
2000 # print "No histograms for plot {name}".format(name=self._name)
2001 # return
2002 
2003  isTGraph2D = self.isTGraph2D()
2004  if isTGraph2D:
2005  # Ratios for the TGraph2Ds is not that interesting
2006  ratioOrig = ratio
2007  ratio = False
2008 
2009  if self._normalizeToUnitArea:
2010  self._normalize()
2011 
2012  if self._rebinX is not None:
2013  for h in self._histograms:
2014  h.Rebin(self._rebinX)
2015 
2016  def _styleMarker(h, msty, col):
2017  h.SetMarkerStyle(msty)
2018  h.SetMarkerColor(col)
2019  h.SetMarkerSize(0.7)
2020  h.SetLineColor(1)
2021  h.SetLineWidth(1)
2022 
2023  def _styleHist(h, msty, col):
2024  _styleMarker(h, msty, col)
2025  h.SetLineColor(col)
2026  h.SetLineWidth(self._lineWidth)
2027 
2028  # Use marker or hist style
2029  style = _styleMarker
2030  if "hist" in self._drawStyle.lower():
2031  style = _styleHist
2032  if len(self._histograms) > 0 and isinstance(self._histograms[0], ROOT.TGraph):
2033  if "l" in self._drawStyle.lower():
2034  style = _styleHist
2035 
2036  # Apply style to histograms, filter out Nones
2037  histos = []
2038  for i, h in enumerate(self._histograms):
2039  if h is None:
2040  continue
2041  style(h, _plotStylesMarker[i], _plotStylesColor[i])
2042  histos.append(h)
2043  if len(histos) == 0:
2044  if verbose:
2045  print("No histograms for plot {name}".format(name=self.getName()))
2046  return
2047 
2048  # Extract x bin labels, make sure that only bins with same
2049  # label are compared with each other
2050  histosHaveBinLabels = len(histos[0].GetXaxis().GetBinLabel(1)) > 0
2051  xbinlabels = self._xbinlabels
2052  ybinlabels = None
2053  if xbinlabels is None:
2054  if histosHaveBinLabels:
2055  xbinlabels = _mergeBinLabelsX(histos)
2056  if isinstance(histos[0], ROOT.TH2):
2057  ybinlabels = _mergeBinLabelsY(histos)
2058 
2059  if len(histos) > 1: # don't bother if only one histogram
2060  # doing this for TH2 is pending for use case, for now there is only 1 histogram/plot for TH2
2061  histos = _th1IncludeOnlyBins(histos, xbinlabels)
2062  self._tmp_histos = histos # need to keep these in memory too ...
2063 
2064  # Remove empty bins, but only if histograms have bin labels
2065  if self._removeEmptyBins and histosHaveBinLabels:
2066  # at this point, all histograms have been "equalized" by their x binning and labels
2067  # therefore remove bins which are empty in all histograms
2068  if isinstance(histos[0], ROOT.TH2):
2069  (histos, xbinlabels, ybinlabels) = _th2RemoveEmptyBins(histos, xbinlabels, ybinlabels)
2070  else:
2071  (histos, xbinlabels) = _th1RemoveEmptyBins(histos, xbinlabels)
2072  self._tmp_histos = histos # need to keep these in memory too ...
2073  if len(histos) == 0:
2074  if verbose:
2075  print("No histograms with non-empty bins for plot {name}".format(name=self.getName()))
2076  return
2077 
2078  if self._printBins and histosHaveBinLabels:
2079  print("####################")
2080  print(self._name)
2081  width = max([len(l) for l in xbinlabels])
2082  tmp = "%%-%ds " % width
2083  for b in range(1, histos[0].GetNbinsX()+1):
2084  s = tmp % xbinlabels[b-1]
2085  for h in histos:
2086  s += "%.3f " % h.GetBinContent(b)
2087  print(s)
2088  print()
2089 
2090  bounds = _findBounds(histos, self._ylog,
2091  xmin=self._xmin, xmax=self._xmax,
2092  ymin=self._ymin, ymax=self._ymax)
2093  zmax = None
2094  if isinstance(histos[0], ROOT.TH2):
2095  zmax = max([h.GetMaximum() for h in histos])
2096 
2097  # need to keep these in memory
2098  self._mainAdditional = []
2099  self._ratioAdditional = []
2100 
2101  if ratio:
2102  self._ratios = _calculateRatios(histos, self._ratioUncertainty) # need to keep these in memory too ...
2103  ratioHistos = [h for h in [r.getRatio() for r in self._ratios[1:]] if h is not None]
2104 
2105  if len(ratioHistos) > 0:
2106  ratioBoundsY = _findBoundsY(ratioHistos, ylog=False, ymin=self._ratioYmin, ymax=self._ratioYmax, coverage=0.68, coverageRange=self._ratioCoverageXrange)
2107  else:
2108  ratioBoundsY = (0.9, 1,1) # hardcoded default in absence of valid ratio calculations
2109 
2110  if self._ratioFit is not None:
2111  for i, rh in enumerate(ratioHistos):
2112  tf_line = ROOT.TF1("line%d"%i, "[0]+x*[1]")
2113  tf_line.SetRange(self._ratioFit["rangemin"], self._ratioFit["rangemax"])
2114  fitres = rh.Fit(tf_line, "RINSQ")
2115  tf_line.SetLineColor(rh.GetMarkerColor())
2116  tf_line.SetLineWidth(2)
2117  self._ratioAdditional.append(tf_line)
2118  box = PlotTextBox(xmin=self._ratioFit.get("boxXmin", 0.14), ymin=None, # None for automatix
2119  xmax=self._ratioFit.get("boxXmax", 0.35), ymax=self._ratioFit.get("boxYmax", 0.09),
2120  color=rh.GetMarkerColor(), font=43, size=11, lineheight=0.02)
2121  box.move(dx=(box.width()+0.01)*i)
2122  #box.addText("Const: %.4f" % fitres.Parameter(0))
2123  #box.addText("Slope: %.4f" % fitres.Parameter(1))
2124  box.addText("Const: %.4f#pm%.4f" % (fitres.Parameter(0), fitres.ParError(0)))
2125  box.addText("Slope: %.4f#pm%.4f" % (fitres.Parameter(1), fitres.ParError(1)))
2126  self._mainAdditional.append(box)
2127 
2128 
2129  # Create bounds before stats in order to have the
2130  # SetRangeUser() calls made before the fit
2131  #
2132  # stats is better to be called before frame, otherwise get
2133  # mess in the plot (that frame creation cleans up)
2134  if ratio:
2135  pad.cd(1)
2136  self._setStats(histos, self._statx, self._staty)
2137 
2138  # Create frame
2139  if isTGraph2D:
2140  frame = FrameTGraph2D(pad, bounds, histos, ratioOrig, ratioFactor)
2141  else:
2142  if ratio:
2143  ratioBounds = (bounds[0], ratioBoundsY[0], bounds[2], ratioBoundsY[1])
2144  frame = FrameRatio(pad, bounds, zmax, ratioBounds, ratioFactor, nrows, xbinlabels, self._xbinlabelsize, self._xbinlabeloption)
2145  else:
2146  frame = Frame(pad, bounds, zmax, nrows, xbinlabels, self._xbinlabelsize, self._xbinlabeloption, ybinlabels=ybinlabels)
2147 
2148  # Set log and grid
2149  frame.setLogx(self._xlog)
2150  frame.setLogy(self._ylog)
2151  frame.setGridx(self._xgrid)
2152  frame.setGridy(self._ygrid)
2153 
2154  # Construct draw option string
2155  opt = "sames" # s for statbox or something?
2156  ds = ""
2157  if self._drawStyle is not None:
2158  ds = self._drawStyle
2159  if self._drawCommand is not None:
2160  ds = self._drawCommand
2161  if len(ds) > 0:
2162  opt += " "+ds
2163 
2164  # Set properties of frame
2165  frame.setTitle(histos[0].GetTitle())
2166  if self._xtitle == 'Default':
2167  frame.setXTitle( histos[0].GetXaxis().GetTitle() )
2168  elif self._xtitle is not None:
2169  frame.setXTitle(self._xtitle)
2170  if self._xtitlesize is not None:
2171  frame.setXTitleSize(self._xtitlesize)
2172  if self._xtitleoffset is not None:
2173  frame.setXTitleOffset(self._xtitleoffset)
2174  if self._xlabelsize is not None:
2175  frame.setXLabelSize(self._xlabelsize)
2176  if self._ytitle == 'Default':
2177  frame.setYTitle( histos[0].GetYaxis().GetTitle() )
2178  elif self._ytitle is not None:
2179  frame.setYTitle(self._ytitle)
2180  if self._ytitlesize is not None:
2181  frame.setYTitleSize(self._ytitlesize)
2182  if self._ytitleoffset is not None:
2183  frame.setYTitleOffset(self._ytitleoffset)
2184  if self._ztitle is not None:
2185  frame.setZTitle(self._ztitle)
2186  if self._ztitleoffset is not None:
2187  frame.setZTitleOffset(self._ztitleoffset)
2188  if self._adjustMarginLeft is not None:
2189  frame.adjustMarginLeft(self._adjustMarginLeft)
2190  if self._adjustMarginRight is not None:
2191  frame.adjustMarginRight(self._adjustMarginRight)
2192  elif "z" in opt:
2193  frame.adjustMarginLeft(0.03)
2194  frame.adjustMarginRight(0.08)
2195 
2196  # Draw histograms
2197  if ratio:
2198  frame._pad.cd()
2199 
2200  for i, h in enumerate(histos):
2201  o = opt
2202  if isTGraph2D and i == 0:
2203  o = o.replace("sames", "")
2204  h.Draw(o)
2205 
2206  for addl in self._mainAdditional:
2207  addl.Draw("same")
2208 
2209  # Draw ratios
2210  if ratio and len(self._ratios) > 0:
2211  frame._padRatio.cd()
2212  firstRatio = self._ratios[0].getRatio()
2213  if self._ratioUncertainty and firstRatio is not None:
2214  firstRatio.SetFillStyle(1001)
2215  firstRatio.SetFillColor(ROOT.kGray)
2216  firstRatio.SetLineColor(ROOT.kGray)
2217  firstRatio.SetMarkerColor(ROOT.kGray)
2218  firstRatio.SetMarkerSize(0)
2219  self._ratios[0].draw("E2")
2220  frame._padRatio.RedrawAxis("G") # redraw grid on top of the uncertainty of denominator
2221  for r in self._ratios[1:]:
2222  r.draw()
2223 
2224  for addl in self._ratioAdditional:
2225  addl.Draw("same")
2226 
2227  frame.redrawAxis()
2228  self._frame = frame # keep the frame in memory for sure
2229 
def _findBoundsY(th1s, ylog, ymin=None, ymax=None, coverage=None, coverageRange=None)
Definition: plotting.py:527
SOAFrame< float > Frame
def _findBounds(th1s, ylog, xmin=None, xmax=None, ymin=None, ymax=None)
Definition: plotting.py:459
def _calculateRatios(histos, ratioUncertainty=False)
Definition: plotting.py:148
def draw(name, histos, styles=_defaultStyles, legendLabels=[], kwargs)
Definition: style.py:1
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:47
def _mergeBinLabelsY(histos)
Definition: plotting.py:710
def _th1RemoveEmptyBins(histos, xbinlabels)
Definition: plotting.py:607
def _th2RemoveEmptyBins(histos, xbinlabels, ybinlabels)
Definition: plotting.py:647
def _mergeBinLabelsX(histos)
Definition: plotting.py:707
def _th1IncludeOnlyBins(histos, xbinlabels)
Definition: plotting.py:744

◆ drawRatioUncertainty()

def plotting.Plot.drawRatioUncertainty (   self)
Return true if the ratio uncertainty should be drawn

Definition at line 1874 of file plotting.py.

1874  def drawRatioUncertainty(self):
1875  """Return true if the ratio uncertainty should be drawn"""
1876  return self._ratioUncertainty
1877 

◆ getName()

def plotting.Plot.getName (   self)

◆ getNumberOfHistograms()

def plotting.Plot.getNumberOfHistograms (   self)
Return number of existing histograms.

Definition at line 1844 of file plotting.py.

References RunHistogramManager._histograms, and plotting.Plot._histograms.

Referenced by plotting.Plot.isEmpty().

1844  def getNumberOfHistograms(self):
1845  """Return number of existing histograms."""
1846  return len([h for h in self._histograms if h is not None])
1847 

◆ isEmpty()

def plotting.Plot.isEmpty (   self)
Return true if there are no histograms created for the plot

Definition at line 1848 of file plotting.py.

References plotting.PlotEmpty.getNumberOfHistograms(), and plotting.Plot.getNumberOfHistograms().

Referenced by plotting.Plot.clone().

1848  def isEmpty(self):
1849  """Return true if there are no histograms created for the plot"""
1850  return self.getNumberOfHistograms() == 0
1851 

◆ isRatio()

def plotting.Plot.isRatio (   self,
  ratio 
)

Definition at line 1858 of file plotting.py.

1858  def isRatio(self, ratio):
1859  if self._ratio is None:
1860  return ratio
1861  return ratio and self._ratio
1862 

◆ isTGraph2D()

def plotting.Plot.isTGraph2D (   self)

Definition at line 1852 of file plotting.py.

References RunHistogramManager._histograms, and plotting.Plot._histograms.

Referenced by plotting.Plot.draw().

1852  def isTGraph2D(self):
1853  for h in self._histograms:
1854  if isinstance(h, ROOT.TGraph2D):
1855  return True
1856  return False
1857 

◆ setName()

def plotting.Plot.setName (   self,
  name 
)

◆ setProperties()

def plotting.Plot.setProperties (   self,
  kwargs 
)

Definition at line 1831 of file plotting.py.

1831  def setProperties(self, **kwargs):
1832  for name, value in kwargs.items():
1833  if not hasattr(self, "_"+name):
1834  raise Exception("No attribute '%s'" % name)
1835  setattr(self, "_"+name, value)
1836 

Member Data Documentation

◆ _forLegend

plotting.Plot._forLegend
private

Definition at line 2243 of file plotting.py.

◆ _frame

plotting.Plot._frame
private

Definition at line 2228 of file plotting.py.

◆ _histograms

plotting.Plot._histograms
private

◆ _mainAdditional

plotting.Plot._mainAdditional
private

Definition at line 2098 of file plotting.py.

◆ _name

plotting.Plot._name
private

◆ _ratioAdditional

plotting.Plot._ratioAdditional
private

Definition at line 2099 of file plotting.py.

◆ _ratios

plotting.Plot._ratios
private

Definition at line 2102 of file plotting.py.

◆ _tmp_histos

plotting.Plot._tmp_histos
private

Definition at line 2062 of file plotting.py.

◆ _xtitle

plotting.Plot._xtitle
private

Definition at line 2166 of file plotting.py.

◆ _ytitle

plotting.Plot._ytitle
private

Definition at line 2176 of file plotting.py.