def spectrumPlot(self, fixed=None, ax=None, normalize=True, xlabel=None, ylabel=None, steps=True, logx=True, logy=False, loglog=False, sigma=3, labels=None, **kwargs): """ Quick plot of the detector value as a function of energy. Parameters ---------- fixed: None or dict Dictionary controlling the reduction in data {ax} normalize: bool Normalize quantities per unit lethargy {xlabel} {ylabel} steps: bool Plot tally as constant inside bin {logx} {logy} {loglog} {sigma} {labels} {kwargs} :py:func:`matplotlib.pyplot.plot` or :py:func:`matplotlib.pyplot.errorbar` Returns ------- {rax} Raises ------ SerpentToolsException if number of rows in data not equal to number of energy groups See Also -------- :py:meth:`~serpentTools.objects.containers.DetectorBase.slice` """ slicedTallies = self.slice(fixed, 'tallies').copy() if len(slicedTallies.shape) > 2: raise SerpentToolsException( 'Sliced data cannot exceed 2-D for spectrum plot, not ' '{}'.format(slicedTallies.shape)) elif len(slicedTallies.shape) == 1: slicedTallies = slicedTallies.reshape(slicedTallies.size, 1) lowerE = self.grids['E'][:, 0] if normalize: lethBins = log(divide(self.grids['E'][:, -1], lowerE)) for indx in range(slicedTallies.shape[1]): scratch = divide(slicedTallies[:, indx], lethBins) slicedTallies[:, indx] = scratch / scratch.max() if steps: if 'drawstyle' in kwargs: debug( 'Defaulting to drawstyle specified in kwargs as {}'.format( kwargs['drawstyle'])) else: kwargs['drawstyle'] = 'steps-post' if sigma: slicedErrors = sigma * self.slice(fixed, 'errors').copy() slicedErrors = slicedErrors.reshape( slicedTallies.shape) * slicedTallies else: slicedErrors = None ax = plot(lowerE, slicedTallies, ax=ax, labels=labels, yerr=slicedErrors, **kwargs) if loglog or logx: ax.set_xscale('log') if loglog or logy: ax.set_yscale('log') ax.set_xlabel(xlabel or 'Energy [MeV]') ylabel = ylabel or 'Tally data' + (' normalized per unit lethargy' if normalize else '') ax.set_ylabel(ylabel) return ax
def plot(self, xdim=None, what='tallies', sigma=None, fixed=None, ax=None, xlabel=None, ylabel=None, steps=False, labels=None, logx=False, logy=False, loglog=False, **kwargs): """ Simple plot routine for 1- or 2-D data Parameters ---------- xdim: None or str If not None, use the array under this key in ``indexes`` as the x axis what: {'tallies', 'errors', 'scores'} Primary data to plot {sigma} fixed: None or dict Dictionary controlling the reduction in data down to one dimension {ax} {xlabel} If ``xdim`` is given and ``xlabel`` is ``None``, then ``xdim`` will be applied to the x-axis. {ylabel} steps: bool If true, plot the data as constant inside the respective bins. Sets ``drawstyle`` to be ``steps-post`` unless ``drawstyle`` given in ``kwargs`` {labels} {logx} {logy} {loglog} {kwargs} :py:func:`~matplotlib.pyplot.plot` or :py:func:`~matplotlib.pyplot.errorbar` function. Returns ------- {rax} Raises ------ SerpentToolsException If data contains more than 2 dimensions See Also -------- * :py:meth:`~serpentTools.objects.containers.Detector.slice` * :py:meth:`~serpentTools.objects.containers.DetectorBase.spectrumPlot` better options for plotting energy spectra """ data = self.slice(fixed, what) if len(data.shape) > 2: raise SerpentToolsException( 'Data must be constrained to 1- or 2-D, not {}'.format( data.shape)) elif len(data.shape) == 1: data = data.reshape(data.size, 1) if sigma: if what != 'errors': yerr = self.slice(fixed, 'errors').reshape( data.shape) * data * sigma else: warning( 'Will not plot error bars on the error plot. Data to be ' 'plotted: {}. Sigma: {}'.format(what, sigma)) yerr = None else: yerr = None xdata, autoX = self._getPlotXData(xdim, data) xlabel = xlabel or autoX ylabel = ylabel or "Tally data" ax = ax or pyplot.axes() if steps: if 'drawstyle' in kwargs: debug( 'Defaulting to drawstyle specified in kwargs as {}'.format( kwargs['drawstyle'])) else: kwargs['drawstyle'] = 'steps-post' ax = plot(xdata, data, ax, labels, yerr, **kwargs) ax.set_xlabel(xlabel) ax.set_ylabel(ylabel) if loglog or logx: ax.set_xscale('log') if loglog or logy: ax.set_yscale('log') return ax
def spectrumPlot(self, fixed=None, ax=None, normalize=True, xlabel=None, ylabel=None, steps=True, logx=True, logy=False, loglog=False, sigma=3, labels=None, legend=None, ncol=1, title=None, **kwargs): """ Quick plot of the detector value as a function of energy. Parameters ---------- fixed: None or dict Dictionary controlling the reduction in data {ax} normalize: bool Normalize quantities per unit lethargy {xlabel} {ylabel} steps: bool Plot tally as constant inside bin {logx} {logy} {loglog} {sigma} {labels} {legend} {ncol} {title} {kwargs} :py:func:`matplotlib.pyplot.plot` or :py:func:`matplotlib.pyplot.errorbar` Returns ------- {rax} Raises ------ :class:`~serpentTools.SerpentToolsException` if number of rows in data not equal to number of energy groups See Also -------- * :meth:`slice` """ slicedTallies = self.slice(fixed, 'tallies').copy() if len(slicedTallies.shape) > 2: raise SerpentToolsException( 'Sliced data cannot exceed 2-D for spectrum plot, not ' '{}'.format(slicedTallies.shape)) elif len(slicedTallies.shape) == 1: slicedTallies = slicedTallies.reshape(slicedTallies.size, 1) lowerE = self.grids['E'][:, 0] if normalize: lethBins = log(divide(self.grids['E'][:, -1], lowerE)) for indx in range(slicedTallies.shape[1]): scratch = divide(slicedTallies[:, indx], lethBins) slicedTallies[:, indx] = scratch / scratch.max() if steps: if 'drawstyle' in kwargs: debug( 'Defaulting to drawstyle specified in kwargs as {}'.format( kwargs['drawstyle'])) else: kwargs['drawstyle'] = 'steps-post' if sigma: slicedErrors = sigma * self.slice(fixed, 'errors').copy() slicedErrors = slicedErrors.reshape(slicedTallies.shape) slicedErrors *= slicedTallies else: slicedErrors = None ax = plot(lowerE, slicedTallies, ax=ax, labels=labels, yerr=slicedErrors, **kwargs) if ylabel is None: ylabel = 'Tally data' ylabel += ' normalized per unit lethargy' if normalize else '' ylabel += r' $\pm{}\sigma$'.format(sigma) if sigma else '' if legend is None and labels: legend = True ax = formatPlot(ax, loglog=loglog, logx=logx, ncol=ncol, xlabel=xlabel or "Energy [MeV]", ylabel=ylabel, legend=legend, title=title) return ax