CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
List of all members | Public Member Functions | Private Member Functions | Private Attributes
plotting.Plot Class Reference

Public Member Functions

def __init__
 
def addToLegend
 
def clone
 
def create
 
def draw
 
def drawRatioUncertainty
 
def getName
 
def getNumberOfHistograms
 
def isEmpty
 
def isRatio
 
def isTGraph2D
 
def setName
 
def setProperties
 

Private Member Functions

def _createOne
 
def _normalize
 
def _setStats
 

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

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.

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

Member Function Documentation

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().

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

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

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

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

Definition at line 1837 of file plotting.py.

References GenericMVAComputerCache.isEmpty(), TkPhase2OTMeasurementDet.isEmpty(), TkPixelMeasurementDet.isEmpty(), TkStackMeasurementDet.isEmpty(), reco::PFDisplacedVertexSeed.isEmpty(), MultipleKinematicConstraint.isEmpty(), KinematicTree.isEmpty(), L1MuDTTrackAssembler.isEmpty(), L1MuBMTrackAssembler.isEmpty(), L1MuGMTInputEvent.isEmpty(), cond::TagInfo_t.isEmpty(), BPHKinematicFit.isEmpty(), cond::persistency::IOVArray.isEmpty(), TkStripMeasurementDet.isEmpty(), BXVector< T >.isEmpty(), HistoData.isEmpty, FWGeometry.isEmpty(), DDXMLElement.isEmpty(), html.Page.isEmpty(), plotting.PlotEmpty.isEmpty(), and plotting.Plot.isEmpty().

1838  def clone(self, **kwargs):
1839  if not self.isEmpty():
1840  raise Exception("Plot can be cloned only before histograms have been created")
1841  cl = copy.copy(self)
1842  cl.setProperties(**kwargs)
1843  return cl
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.TaskPlaceholder._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, and sistrip::SpyUtilities.range().

1893  def create(self, tdirNEvents, requireAllHistograms=False):
1894  """Create histograms from list of TDirectories"""
1895  self._histograms = [self._createOne(self._name, i, tdirNEvent[0], tdirNEvent[1]) for i, tdirNEvent in enumerate(tdirNEvents)]
1896 
1897  if self._fallback is not None:
1898  profileX = [self._profileX]*len(self._histograms)
1899  for i in range(0, len(self._histograms)):
1900  if self._histograms[i] is None:
1901  self._histograms[i] = self._createOne(self._fallback["name"], i, tdirNEvents[i][0], tdirNEvents[i][1])
1902  profileX[i] = self._fallback.get("profileX", self._profileX)
1903 
1904  if self._histogramModifier is not None:
1905  self._histograms = self._histogramModifier(self._histograms)
1906 
1907  if len(self._histograms) > len(_plotStylesColor):
1908  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)))
1909 
1910  # Modify histograms here in case self._name returns numbers
1911  # and self._histogramModifier creates the histograms from
1912  # these numbers
1913  def _modifyHisto(th1, profileX):
1914  if th1 is None:
1915  return None
1916 
1917  if profileX:
1918  th1 = th1.ProfileX()
1919 
1920  if self._fitSlicesY:
1921  ROOT.TH1.AddDirectory(True)
1922  th1.FitSlicesY()
1923  th1 = ROOT.gDirectory.Get(th1.GetName()+"_2")
1924  th1.SetDirectory(None)
1925  #th1.SetName(th1.GetName()+"_ref")
1926  ROOT.TH1.AddDirectory(False)
1927 
1928  if self._title is not None:
1929  th1.SetTitle(self._title)
1930 
1931  if self._scale is not None:
1932  th1.Scale(self._scale)
1933 
1934  return th1
1935 
1936  if self._fallback is not None:
1937  self._histograms = list(map(_modifyHisto, self._histograms, profileX))
1938  else:
1939  self._histograms = list(map(lambda h: _modifyHisto(h, self._profileX), self._histograms))
1940  if requireAllHistograms and None in self._histograms:
1941  self._histograms = [None]*len(self._histograms)
const uint16_t range(const Frame &aFrame)
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().

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

Definition at line 1874 of file plotting.py.

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

Definition at line 1866 of file plotting.py.

References 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.TaskPlaceholder._name, plotting.Plot._name, and str.

Referenced by plotting.Plot.draw().

1867  def getName(self):
1868  if self._outname is not None:
1869  return self._outname
1870  if isinstance(self._name, list):
1871  return str(self._name[0])
1872  else:
1873  return str(self._name)
#define str(s)
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().

1845  def getNumberOfHistograms(self):
1846  """Return number of existing histograms."""
1847  return len([h for h in self._histograms if h is not None])
def getNumberOfHistograms
Definition: plotting.py:1844
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().

1849  def isEmpty(self):
1850  """Return true if there are no histograms created for the plot"""
1851  return self.getNumberOfHistograms() == 0
def getNumberOfHistograms
Definition: plotting.py:1844
def plotting.Plot.isRatio (   self,
  ratio 
)

Definition at line 1858 of file plotting.py.

1859  def isRatio(self, ratio):
1860  if self._ratio is None:
1861  return ratio
1862  return ratio and self._ratio
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().

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

Definition at line 1863 of file plotting.py.

References 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.TaskPlaceholder._name, and plotting.Plot._name.

1864  def setName(self, name):
1865  self._name = name
def plotting.Plot.setProperties (   self,
  kwargs 
)

Definition at line 1831 of file plotting.py.

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

Member Data Documentation

plotting.Plot._forLegend
private

Definition at line 2243 of file plotting.py.

plotting.Plot._frame
private

Definition at line 2228 of file plotting.py.

plotting.Plot._histograms
private

Definition at line 1829 of file plotting.py.

Referenced by plotting.Plot._normalize(), plotting.Plot.addToLegend(), plotting.Plot.create(), plotting.Plot.draw(), plotting.Plot.getNumberOfHistograms(), and plotting.Plot.isTGraph2D().

plotting.Plot._mainAdditional
private

Definition at line 2098 of file plotting.py.

plotting.Plot._name
private

Definition at line 1758 of file plotting.py.

Referenced by trackingPlots.TimePerEventPlot.__str__(), trackingPlots.TimePerTrackPlot.__str__(), trackingPlots.TimePerEventPlot._create(), plotting.PlotGroup._drawSeparate(), plotting.PlotGroup._save(), trackingPlots.TimePerTrackPlot.create(), plotting.Plot.create(), plotting.PlotGroup.draw(), plotting.Plot.getName(), plotting.PlotGroup.getName(), plotting.PlotterFolder.getName(), plotting.PlotterItem.getName(), plotting.PlotterFolder.getSelectionNameIterator(), validation.SimpleSample.name(), trackingPlots.Iteration.name(), plotting.PlotterItem.readDirs(), plotting.PlotGroup.remove(), and plotting.Plot.setName().

plotting.Plot._ratioAdditional
private

Definition at line 2099 of file plotting.py.

plotting.Plot._ratios
private

Definition at line 2102 of file plotting.py.

plotting.Plot._tmp_histos
private

Definition at line 2062 of file plotting.py.

plotting.Plot._xtitle
private

Definition at line 2166 of file plotting.py.

plotting.Plot._ytitle
private

Definition at line 2176 of file plotting.py.