Select Git revision
Bootstrapping.py
Jack Christopher Hutchinson Rolph authored
Update PeakOTron.py, data/hamamatsu_pcb6/Light/PCB6_MPPC_53.5V_histo.txt, data/hamamatsu_pcb6/Light/PCB6_MPPC_53V_histo.txt, data/hamamatsu_pcb6/Light/PCB6_MPPC_54.5V_histo.txt, data/hamamatsu_pcb6/Light/PCB6_MPPC_54V_histo.txt, data/hamamatsu_pcb6/Light/PCB6_MPPC_55.5V_histo.txt, data/hamamatsu_pcb6/Light/PCB6_MPPC_55V_histo.txt, data/hamamatsu_pcb6/Light/PCB6_MPPC_56.5V_histo.txt, data/hamamatsu_pcb6/Light/PCB6_MPPC_56V_histo.txt, data/hamamatsu_pcb6/Light/PCB6_MPPC_57.5V_histo.txt, data/hamamatsu_pcb6/Light/PCB6_MPPC_57V_histo.txt, data/hamamatsu_pcb6/Light/PCB6_MPPC_58.5V_histo.txt, data/hamamatsu_pcb6/Light/PCB6_MPPC_58V_histo.txt, data/hamamatsu_pcb6/Light/PCB6_MPPC_59.5V_histo.txt, data/hamamatsu_pcb6/Light/PCB6_MPPC_59V_histo.txt, data/hamamatsu_pcb6/Light/PCB6_MPPC_60V_histo.txt, Bootstrapping.py, Example.py, HelperFunctions.py, LossFunctions.py, Model_AP1.py Deleted Results/dummy, SiPMSpectra/03/F1_U28p5_dark_PM3325WBA0-03_AmpG101_660nm_00000.dat, SiPMSpectra/03/F1_U28p5_light_PM3325WBA0-03_AmpG101_660nm_00000.dat, SiPMSpectra/03/F1_U29p5_dark_PM3325WBA0-03_AmpG101_660nm_00000.dat, SiPMSpectra/03/F1_U29p5_light_PM3325WBA0-03_AmpG101_660nm_00000.dat, SiPMSpectra/03/F1_U30p5_dark_PM3325WBA0-03_AmpG101_660nm_00000.dat, SiPMSpectra/03/F1_U30p5_light_PM3325WBA0-03_AmpG101_660nm_00000.dat, SiPMSpectra/03/F1_U31p5_dark_PM3325WBA0-03_AmpG101_660nm_00000.dat, SiPMSpectra/03/F1_U31p5_light_PM3325WBA0-03_AmpG101_660nm_00000.dat, SiPMSpectra/03/F1_U32p5_dark_PM3325WBA0-03_AmpG101_660nm_00000.dat, SiPMSpectra/03/F1_U32p5_light_PM3325WBA0-03_AmpG101_660nm_00000.dat, SiPMSpectra/04_ZnS/F1_U28p1_dark_PM3325WBA0-04_ZnS_AmpG101_660nm_00000.dat, SiPMSpectra/04_ZnS/F1_U28p1_light_PM3325WBA0-04_ZnS_AmpG101_660nm_00000.dat, SiPMSpectra/04_ZnS/F1_U29p1_dark_PM3325WBA0-04_ZnS_AmpG101_660nm_00000.dat, SiPMSpectra/04_ZnS/F1_U29p1_light_PM3325WBA0-04_ZnS_AmpG101_660nm_00000.dat, SiPMSpectra/04_ZnS/F1_U30p6_dark_PM3325WBA0-04_ZnS_AmpG101_660nm_00000.dat, SiPMSpectra/04_ZnS/F1_U30p6_light_PM3325WBA0-04_ZnS_AmpG101_660nm_00000.dat, SiPMSpectra/04_ZnS/F1_U31p6_dark_PM3325WBA0-04_ZnS_AmpG101_660nm_00000.dat, SiPMSpectra/04_ZnS/F1_U31p6_light_PM3325WBA0-04_ZnS_AmpG101_660nm_00000.dat, SiPMSpectra/06_ZnS/F1_U28p4_dark_PM3315WBA0-06_ZnS_AmpG101_660nm_00000.dat, SiPMSpectra/06_ZnS/F1_U28p4_light_PM3315WBA0-06_ZnS_AmpG101_660nm_00000.dat, SiPMSpectra/06_ZnS/F1_U29p4_dark_PM3315WBA0-06_ZnS_AmpG101_660nm_00000.dat, SiPMSpectra/06_ZnS/F1_U29p4_light_PM3315WBA0-06_ZnS_AmpG101_660nm_00000.dat, SiPMSpectra/06_ZnS/F1_U30p4_dark_PM3315WBA0-06_ZnS_AmpG101_660nm_00000.dat, SiPMSpectra/06_ZnS/F1_U30p4_light_PM3315WBA0-06_ZnS_AmpG101_660nm_00000.dat, SiPMSpectra/06_ZnS/F1_U31p4_dark_PM3315WBA0-06_ZnS_AmpG101_660nm_00000.dat, SiPMSpectra/06_ZnS/F1_U31p4_light_PM3315WBA0-06_ZnS_AmpG101_660nm_00000.dat, SiPMSpectra/06_ZnS/F1_U32p4_dark_PM3315WBA0-06_ZnS_AmpG101_660nm_00000.dat, SiPMSpectra/06_ZnS/F1_U32p4_light_PM3315WBA0-06_ZnS_AmpG101_660nm_00000.dat, SiPMSpectra/07/F1_U28p1_dark_PM3315WBA0-07_AmpG101_660nm_00000.dat, SiPMSpectra/07/F1_U28p1_light_PM3315WBA0-07_AmpG101_660nm_00000.dat, SiPMSpectra/07/F1_U30p1_dark_PM3315WBA0-07_AmpG101_660nm_00000.dat, SiPMSpectra/07/F1_U30p1_light_PM3315WBA0-07_AmpG101_660nm_00000.dat, SiPMSpectra/07/F1_U31p6_dark_PM3315WBA0-07_AmpG101_660nm_00000.dat, SiPMSpectra/07/F1_U31p6_light_PM3315WBA0-07_AmpG101_660nm_00000.dat, SiPMSpectra/07/F1_U33p1_dark_PM3315WBA0-07_AmpG101_660nm_00000.dat, SiPMSpectra/07/F1_U33p1_light_PM3315WBA0-07_AmpG101_660nm_00000.dat, SiPMSpectra/07/F1_U35p1_dark_PM3315WBA0-07_AmpG101_660nm_00000.dat, SiPMSpectra/07/F1_U35p1_light_PM3315WBA0-07_AmpG101_660nm_00000.dat, SiPMSpectra/08/F1_U28p1_dark_PM33125WBA0-08_AmpG101_660nm_00000.dat, SiPMSpectra/08/F1_U28p1_light_PM33125WBA0-08_AmpG101_660nm_00000.dat, SiPMSpectra/08/F1_U29p6_dark_PM33125WBA0-08_AmpG101_660nm_00000.dat, SiPMSpectra/08/F1_U29p6_light_PM33125WBA0-08_AmpG101_660nm_00000.dat, SiPMSpectra/08/F1_U31p1_dark_PM33125WBA0-08_AmpG101_660nm_00000.dat, SiPMSpectra/08/F1_U31p1_light_PM33125WBA0-08_AmpG101_660nm_00001.dat, SiPMSpectra/08/F1_U32p6_dark_PM33125WBA0-08_AmpG101_660nm_00000.dat, SiPMSpectra/08/F1_U32p6_light_PM33125WBA0-08_AmpG101_660nm_00000.dat, SiPMSpectra/08/F1_U34p1_dark_PM33125WBA0-08_AmpG101_660nm_00000.dat, SiPMSpectra/08/F1_U34p1_light_PM33125WBA0-08_AmpG101_660nm_00000.dat, SiPMSpectra/KETEK_spectra.opju, README.txt, RunFit.py
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
Bootstrapping.py 4.59 KiB
from HelperFunctions import FakeFuncCode, SelectRangeNumba, EmpiricalPPF
from KDEpy import FFTKDE
import numpy as np
from scipy.interpolate import interp1d
from iminuit import Minuit
from astropy.stats import bootstrap, scott_bin_width
import scipy.special as sc
import logging
class BandWidthOptimiser:
#Hobbema, Hermans, and Van den Broeck (1971) and by Duin (1976)
#leave-one-out cross-validation approach
#https://cran.r-project.org/web/packages/kedd/vignettes/kedd.pdf
def _Dummy(self, _, bw):
return bw
def _KDE(self, bw):
x_kde, y_kde = FFTKDE(kernel = self.kernel, bw=bw).fit(self.data).evaluate(self.n_kde_samples)
loss = -np.mean(np.log(y_kde))
return loss
def __init__(self, data, kernel="gaussian", alpha = 0.95, n_kde_samples=2**13):
if(alpha<=0.5):
raise ValueError("alpha must be above 0.5")
self.data = data
PPF = EmpiricalPPF(self.data)
x_low, x_hi = PPF(0.5-alpha/2), PPF(0.5+alpha/2)
self.data = SelectRangeNumba(self.data, x_low, x_hi)
self.N = len(data)
self.kernel=kernel
self.n_kde_samples=n_kde_samples
self.last_arg = None
self.func_code = FakeFuncCode(self._Dummy, dock=True)
self.eps = np.finfo(np.float64).eps * 10
self.eps_inv = 1/self.eps
def __call__(self, *arg):
self.last_arg = arg
loss = self._KDE(*arg)
return loss
def Bootstrap(data, statistic, n_bootstrap, alpha=0.95, ):
if not (0 < alpha < 1):
raise ValueError("confidence level must be in (0, 1)")
if len(data) < 1:
raise ValueError("data must contain at least one measurement.")
boot_stat = bootstrap(data, n_bootstrap, bootfunc=statistic)
stat_data = statistic(data)
mean_stat = np.mean(boot_stat)
est_stat = 2*stat_data - mean_stat
std_err = np.std(boot_stat)
z_score = np.sqrt(2.0)*sc.erfinv(alpha)
conf_interval = est_stat + z_score*np.array((-std_err, std_err))
return est_stat, std_err, conf_interval
def BootstrapKDE(data,
n_bootstrap,
n_call=1000,
n_iterations=10,
kernel = "gaussian",
n_kde_samples=2**14,
alpha=0.95,
bw_limits=(1e-6, None),
limits=None,
):
if not (0 < alpha < 1):
raise ValueError("Bootstrap confidence level, alpha, must be in (0, 1).")
if len(data) <= 3:
raise ValueError("Bootstrap data must contain at least three measurements.")
try:
logging.debug("Optimising bandwidth...")
BWO= BandWidthOptimiser(data, kernel=kernel)
bw_scott = scott_bin_width(data)
minuit_kde = Minuit(BWO, bw=bw_scott/2)
minuit_kde.limits["bw"]=bw_limits
minuit_kde.strategy=2
minuit_kde.migrad(ncall=n_call,
iterate=n_iterations)
bw = minuit_kde.values["bw"]
logging.debug("Bandwidth optimised to {:3.3E} units.".format(bw))
except:
logging.warning("Bandwidth optimisation failed. Defaulting to Improved Sheather Jones...")
bw = "ISJ"
kde = FFTKDE(kernel = kernel, bw=bw).fit(data)
x_kde, y_kde_orig = kde.evaluate(n_kde_samples)
boot_data = bootstrap(data, n_bootstrap)
y_kde_bs = np.vstack([FFTKDE(kernel = kernel, bw=bw).fit(_data).evaluate(x_kde)
for _data in boot_data])
y_kde_mean = np.mean(y_kde_bs, axis=0)
y_kde = 2*y_kde_orig - y_kde_mean
y_kde_err = np.std(y_kde_bs, axis=0)
z_score = np.sqrt(2.0)*sc.erfinv(alpha)
y_kde_conf_interval = y_kde + z_score*np.array((-y_kde_err, y_kde_err))
if(limits is not None):
cond_inrange =(x_kde>np.min(limits)) & (x_kde<np.max(limits))
x_kde = x_kde[cond_inrange]
y_kde = y_kde[cond_inrange]
y_kde_err = y_kde_err[cond_inrange]
return x_kde, y_kde, y_kde_err, y_kde_conf_interval
def Bootstrap(data, statistic, n_bootstrap, alpha=0.95):
if not (0 < alpha < 1):
raise ValueError("confidence level must be in (0, 1)")
if len(data) < 1:
raise ValueError("data must contain at least one measurement.")
boot_stat = bootstrap(data, n_bootstrap, bootfunc=statistic)
stat_data = statistic(data)
mean_stat = np.mean(boot_stat)
est_stat = 2*stat_data - mean_stat
std_err = np.std(boot_stat)
z_score = np.sqrt(2.0)*sc.erfinv(alpha)
conf_interval = est_stat + z_score*np.array((-std_err, std_err))
return est_stat, std_err, conf_interval