# -*- coding: utf-8 -*-
""" Analysis tools
"""
import sciplot
import numpy as np
import matplotlib.pyplot as plt
from .functions import _hist_init
[docs]def plot_flatness(sig, tag, bins=None, ax=None, xrange=None, percent_step=5):
""" Plotting differences of sig distribution in percentiles of tag distribution
Args:
sig:
tag:
bins:
ax:
xrange:
percent_step:
Returns:
"""
if ax is None:
fix, ax = plt.subplots()
xaxis = _hist_init(sig, bins=bins, xrange=xrange)
colormap = plt.get_cmap('magma')
orig, x = np.histogram(sig, bins=xaxis, range=xrange, normed=True, )
bin_center = ((x + np.roll(x, 1)) / 2)[1:]
tmp = orig/orig
ax.plot(bin_center, tmp, color='black', lw=1)
for quantil in np.arange(5, 100, percent_step):
cut = np.percentile(tag, quantil)
sel = tag >= cut
y, x = np.histogram(sig[sel], bins=x, range=xrange, normed=True, )
y /= orig
ax.fill_between(bin_center, tmp, y, color=colormap(quantil/100.0))
tmp = y
[docs]def profile(x, y, bins=None, range=None, fmt='.', *args, **kwargs):
try:
import scipy
except ImportError:
print("Scipy is needed for this feature")
else:
xaxis = _hist_init(x, bins, xrange=range)
means = scipy.stats.binned_statistic(x, y, bins=xaxis, statistic='mean').statistic
std = scipy.stats.binned_statistic(x, y, bins=xaxis, statistic=scipy.stats.sem).statistic
bin_centers = (xaxis[:-1] + xaxis[1:]) / 2.
plt.errorbar(x=bin_centers, y=means, yerr=std, linestyle='none', fmt=fmt, *args, **kwargs)
[docs]def ratio(y1, y2, y1_err=None, y2_err= None):
""" calculate the ratio between two histograms y1/y2
Args:
y1: y values of first histogram
y2: y values of second histogram
y1_err: (optional) error of first
y2_err: (optional) error of second
Returns:
ratio, ratio_error
"""
assert len(y1) == len(y2), "y1 and y2 length does not match"
y1e = np.sqrt(y1) if y1_err is None else y1_err
y2e = np.sqrt(y2) if y2_err is None else y2_err
r = y1/y2
re = np.sqrt((y1/(1.0*y2*y2))*(y1/(1.0*y2*y2))*y2e*y2e+(1/(1.0*y2))*(1/(1.0*y2))*y1e*y1e)
return r, re
[docs]def data_mc_ratio(data, mc, label_data='Data', label_mc="MC",
y_label=None, figsize=None, ratio_range=(0, 2),
*args, **kwarg):
""" Plot a comparison between two sets of data
Args:
data:
mc:
label_data:
label_mc:
y_label:
figsize:
ratio_range:
*args:
**kwarg:
Returns:
"""
f, axes = plt.subplots(2, 1, gridspec_kw={"height_ratios": [3, 1]}, sharex=True, figsize=figsize)
ax0 = axes[0]
hm = sciplot.hist(mc, lw=2, ax=ax0, label=label_mc, *args, **kwarg)
hd = sciplot.errorhist(data, ax=ax0, label=label_data, color='black')
ax0.legend()
ax1 = axes[1]
ry, rye = ratio(hd[0], hm[0])
sciplot.errorbar(hd[1], ry, rye, ax=ax1, color='grey')
ax1.axhline(1, color='grey', lw=0.5, ls='--')
f.subplots_adjust(hspace=0.1)
ax1.set_ylim(*ratio_range)
sciplot.xlim()
if y_label is not None:
ax0.set_ylabel(y_label)
ax1.set_ylabel("Ratio")
ax1.yaxis.set_label_coords(-0.08, 0.5)
ax0.yaxis.set_label_coords(-0.08, 0.5)