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 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
 

Detailed Description

Represents one plot, comparing one or more histograms.

Definition at line 1696 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 1698 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)
1829 
1830  self._histograms = []
1831 
def __init__(self, name, kwargs)
Definition: plotting.py:1698

Member Function Documentation

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

Definition at line 1876 of file plotting.py.

References plotting._getOrCreateObject().

Referenced by plotting.Plot.create().

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

Definition at line 1981 of file plotting.py.

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

Referenced by plotting.Plot.draw().

1981  def _normalize(self):
1982  """Normalise histograms to unit area"""
1983 
1984  for h in self._histograms:
1985  if h is None:
1986  continue
1987  i = h.Integral()
1988  if i == 0:
1989  continue
1990  if h.GetSumw2().fN <= 0: # to suppress warning
1991  h.Sumw2()
1992  h.Scale(1.0/i)
1993 
def _normalize(self)
Definition: plotting.py:1981
def plotting.Plot._setStats (   self,
  histos,
  startingX,
  startingY 
)
private
Set stats box.

Definition at line 1940 of file plotting.py.

References DTSC._stat, and DTTrigGeom._stat.

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

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

2217  def addToLegend(self, legend, legendLabels, denomUncertainty):
2218  """Add histograms to a legend.
2219 
2220  Arguments:
2221  legend -- TLegend
2222  legendLabels -- List of strings for the legend labels
2223  """
2224  first = denomUncertainty
2225  for h, label in zip(self._histograms, legendLabels):
2226  if h is None:
2227  first = False
2228  continue
2229  if first:
2230  self._forLegend = h.Clone()
2231  self._forLegend.SetFillStyle(1001)
2232  self._forLegend.SetFillColor(ROOT.kGray)
2233  entry = legend.AddEntry(self._forLegend, label, "lpf")
2234  first = False
2235  else:
2236  legend.AddEntry(h, label, "LP")
2237 
OutputIterator zip(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp)
def addToLegend(self, legend, legendLabels, denomUncertainty)
Definition: plotting.py:2217
def plotting.Plot.clone (   self,
  kwargs 
)
def plotting.Plot.create (   self,
  tdirNEvents,
  requireAllHistograms = False 
)
Create histograms from list of TDirectories

Definition at line 1890 of file plotting.py.

References plotting.Plot._createOne(), RunHistogramManager._histograms, plotting.Plot._histograms, FP420HitsObject._name, TrackerHitsObject._name, PGeometricDet::Item._name, TrackingRecHitAlgorithm._name, LikelihoodSpecies._name, L1TMuon::PtAssignmentUnit._name, L1TMuon::PtRefinementUnit._name, LikelihoodPdfProduct._name, LikelihoodPdf._name, citk::IsolationConeDefinitionBase._name, Logger._name, hcaldqm::DQModule._name, DrellYanValidation._name, WValidation._name, HistoParams< T >._name, hcaldqm::flag::Flag._name, hcaldqm::quantity::Quantity._name, CutApplicatorBase._name, ElectronMVAEstimatorRun2Phys14NonTrig._name, PhotonMVAEstimatorRun2Spring15NonTrig._name, PhotonMVAEstimatorRun2Phys14NonTrig._name, ElectronMVAEstimatorRun2Spring15Trig._name, GeometricDetExtra._name, ElectronMVAEstimatorRun2Spring15NonTrig._name, HistoParams< TH2F >._name, HistoParams< TProfile2D >._name, Vispa.Views.PropertyView.Property._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, plotting.Plot._name, Vispa.Gui.VispaWidget.VispaWidget._scale, plotting.AggregateBins._scale, HistoParams< TH1F >._title, HistoParams< T >._title, HistoParams< TProfile >._title, HistoParams< TH2F >._title, SiStripHitEffFromCalibTree._title, HistoParams< TProfile2D >._title, html.PageSet._title, html.HtmlReport._title, plotting.Subtract._title, plotting.Transform._title, plotting.FakeDuplicate._title, plotting.CutEfficiency._title, and genParticles_cff.map.

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

Definition at line 1994 of file plotting.py.

References RunHistogramManager._histograms, plotting.Plot._histograms, plotting._mergeBinLabelsX(), plotting._mergeBinLabelsY(), plotting.Plot._normalize(), plotting._th1IncludeOnlyBins(), HistoData.getName(), emtf::Node.getName(), PhysicsTools::Source.getName(), PassiveHit.getName(), CocoaMaterialElementary.getName(), ecaldqm::DBReaderWorker.getName(), LikelihoodSpecies.getName(), PCaloHit.getName(), ParticleFlux.getName(), EcalLogicID.getName(), pftools::SpaceManager.getName(), ecaldqm::DBWriterWorker.getName(), LikelihoodPdf.getName(), TkOfflineVariables.getName(), hcaldqm::mapper::Mapper.getName(), FieldHandlerBase< TOutput >.getName(), AnyMVAEstimatorRun2Base.getName(), FittedEntry.getName(), TrackingRecHitAlgorithm.getName(), hcaldqm::mapper::HashMapper.getName(), jsoncollector::JsonMonitorable.getName(), CSGAction.getName(), L1TUtmAlgorithm.getName(), L1TUtmScale.getName(), DTTPGLutFile.getName(), PhysicsTools::MVATrainer.getName(), L1TriggerLutFile.getName(), L1TUtmCondition.getName(), QCriterion.getName(), pos::PixelPortcardMap.getName(), L1MuGMTReg.getName(), GenericMVAComputer::TaggingVariableIterator< Iter_t >::Value.getName(), GEMStation.getName(), PhysicsTools::Variable::Value.getName(), pftools::SpaceVoxel.getName(), ecaldqm::DQWorker.getName(), RPCAMCLink.getName(), RPCDCCLink.getName(), PhotonMVAEstimatorRun2Spring16NonTrig.getName(), PhotonMVAEstimatorRun2Spring15NonTrig.getName(), L1TUtmTriggerMenu.getName(), L1TUtmObject.getName(), PhotonMVAEstimatorRun2Phys14NonTrig.getName(), L1TUtmCut.getName(), ElectronMVAEstimatorRun2Phys14NonTrig.getName(), PFTrackAlgoTools::edm::ELslProxy< ELgen >.getName(), edm::ELslProxy< ELgen >.getName(), L1MuGMTRegMMConfig.getName(), PhysicsTools::MVAModuleHelper< Record, Object, Filler >::Value.getName(), ElectronMVAEstimatorRun2Spring15Trig.getName(), ElectronMVAEstimatorRun2Spring15NonTrig.getName(), cscdqm::HistoDef.getName(), ElectronMVAEstimatorRun2Spring16GeneralPurpose.getName(), ElectronMVAEstimatorRun2Spring16HZZ.getName(), FourVectorHLT::PathInfo.getName(), RPCLBLink.getName(), jsoncollector::DataPoint.getName(), MonitorElement.getName(), edm::ELseverityLevel.getName(), PFTrackAlgoTools::edm::ELseverityLevel.getName(), PhysicsTools::Variable.getName(), PhysicsTools::TrainerMonitoring::Object.getName(), L1MuGMTRegSortRankOffset.getName(), L1MuGMTRegCDLConfig.getName(), cscdqm::CSCHistoDef.getName(), plotting.PlotEmpty.getName(), plotting.Plot.getName(), and plotting.Plot.isTGraph2D().

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

Definition at line 1872 of file plotting.py.

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

Definition at line 1864 of file plotting.py.

References FP420HitsObject._name, TrackerHitsObject._name, PGeometricDet::Item._name, TrackingRecHitAlgorithm._name, LikelihoodSpecies._name, L1TMuon::PtAssignmentUnit._name, L1TMuon::PtRefinementUnit._name, LikelihoodPdfProduct._name, LikelihoodPdf._name, citk::IsolationConeDefinitionBase._name, Logger._name, hcaldqm::DQModule._name, DrellYanValidation._name, WValidation._name, HistoParams< T >._name, hcaldqm::flag::Flag._name, hcaldqm::quantity::Quantity._name, CutApplicatorBase._name, ElectronMVAEstimatorRun2Phys14NonTrig._name, PhotonMVAEstimatorRun2Spring15NonTrig._name, PhotonMVAEstimatorRun2Phys14NonTrig._name, ElectronMVAEstimatorRun2Spring15Trig._name, GeometricDetExtra._name, ElectronMVAEstimatorRun2Spring15NonTrig._name, HistoParams< TH2F >._name, HistoParams< TProfile2D >._name, Vispa.Views.PropertyView.Property._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, plotting.Plot._name, and harvestTrackValidationPlots.str.

Referenced by plotting.Plot.draw().

1864  def getName(self):
1865  if self._outname is not None:
1866  return self._outname
1867  if isinstance(self._name, list):
1868  return str(self._name[0])
1869  else:
1870  return str(self._name)
1871 
def getName(self)
Definition: plotting.py:1864
def plotting.Plot.getNumberOfHistograms (   self)
Return number of existing histograms.

Definition at line 1845 of file plotting.py.

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

Referenced by plotting.Plot.isEmpty().

1846  """Return number of existing histograms."""
1847  return len(filter(lambda h: h is not None, self._histograms))
1848 
def getNumberOfHistograms(self)
Definition: plotting.py:1845
def plotting.Plot.isEmpty (   self)
Return true if there are no histograms created for the plot

Definition at line 1849 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
1852 
def getNumberOfHistograms(self)
Definition: plotting.py:1845
def isEmpty(self)
Definition: plotting.py:1849
def plotting.Plot.isRatio (   self,
  ratio 
)

Definition at line 1859 of file plotting.py.

1859  def isRatio(self, ratio):
1860  if self._ratio is None:
1861  return ratio
1862  return ratio and self._ratio
1863 
def isRatio(self, ratio)
Definition: plotting.py:1859
def plotting.Plot.isTGraph2D (   self)

Definition at line 1853 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
1858 
def isTGraph2D(self)
Definition: plotting.py:1853
def plotting.Plot.setProperties (   self,
  kwargs 
)

Definition at line 1832 of file plotting.py.

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

Member Data Documentation

plotting.Plot._forLegend
private

Definition at line 2230 of file plotting.py.

plotting.Plot._frame
private

Definition at line 2215 of file plotting.py.

plotting.Plot._histograms
private
plotting.Plot._mainAdditional
private

Definition at line 2092 of file plotting.py.

plotting.Plot._name
private
plotting.Plot._ratioAdditional
private

Definition at line 2093 of file plotting.py.

plotting.Plot._ratios
private

Definition at line 2096 of file plotting.py.

plotting.Plot._tmp_histos
private

Definition at line 2059 of file plotting.py.