def getFCErr(n, bkg=0, MaxN=25): Nbknd = bkg x_bins = np.arange(0, 50) mu_bins = np.linspace(0, MaxN, np.int(np.round(MaxN / 0.005 + 1, 0)), endpoint=True) matrix = [stats.poisson(mu + Nbknd).pmf(x_bins) for mu in mu_bins] acceptance_intervals = gstats.fc_construct_acceptance_intervals_pdfs( matrix, 0.6827) LowerLimitNum, UpperLimitNum, _ = gstats.fc_get_limits( mu_bins, x_bins, acceptance_intervals) #print(matrix) #print(mu_bins) #print(LowerLimitNum) #print(UpperLimitNum) N = n ul = gstats.fc_find_limit(N, UpperLimitNum, mu_bins) ll = gstats.fc_find_limit(N, LowerLimitNum, mu_bins) #print(ll) #print(ul) return ll, ul
def test_numerical_confidence_interval_pdfs(): background = 3.0 step_width_mu = 0.005 mu_min = 0 mu_max = 15 n_bins_x = 50 cl = 0.90 x_bins = np.arange(0, n_bins_x) mu_bins = np.linspace( mu_min, mu_max, int(mu_max / step_width_mu) + 1, endpoint=True ) matrix = [scipy.stats.poisson(mu + background).pmf(x_bins) for mu in mu_bins] acceptance_intervals = fc_construct_acceptance_intervals_pdfs(matrix, cl) lower_limit_num, upper_limit_num, _ = fc_get_limits( mu_bins, x_bins, acceptance_intervals ) fc_fix_limits(lower_limit_num, upper_limit_num) x_measured = 6 upper_limit = fc_find_limit(x_measured, upper_limit_num, mu_bins) lower_limit = fc_find_limit(x_measured, lower_limit_num, mu_bins) # Values are taken from Table IV in the Feldman and Cousins paper. assert_allclose(upper_limit, 8.47, atol=0.01) assert_allclose(lower_limit, 0.15, atol=0.01) # A value which is not inside the x axis range should raise an exception with pytest.raises(ValueError): fc_find_limit(51, upper_limit_num, mu_bins) # Calculate the average upper limit. The upper limit calculated here is # only defined for a small x range, so limit the x bins here so the # calculation of the average limit is meaningful. average_upper_limit = fc_find_average_upper_limit( x_bins, matrix, upper_limit_num, mu_bins ) # Values are taken from Table XII in the Feldman and Cousins paper. # A higher accuracy would require a higher mu_max, which would increase # the computation time. assert_allclose(average_upper_limit, 4.42, atol=0.1)
x_bins = np.linspace(-n_sigma * sigma, n_sigma * sigma, n_bins_x, endpoint=True) mu_bins = np.linspace(mu_min, mu_max, int(mu_max / step_width_mu + 1), endpoint=True) matrix = [ dist / sum(dist) for dist in (norm(loc=mu, scale=sigma).pdf(x_bins) for mu in mu_bins) ] acceptance_intervals = fc_construct_acceptance_intervals_pdfs(matrix, cl) LowerLimitNum, UpperLimitNum, _ = fc_get_limits(mu_bins, x_bins, acceptance_intervals) fc_fix_limits(LowerLimitNum, UpperLimitNum) fig = plt.figure() ax = fig.add_subplot(111) plt.plot(UpperLimitNum, mu_bins, ls="-", color="red") plt.plot(LowerLimitNum, mu_bins, ls="-", color="red") plt.grid(True) ax.xaxis.set_ticks(ticks=np.arange(-10, 10, 1)) ax.xaxis.set_ticks(ticks=np.arange(-10, 10, 0.2), minor=True)
for imu_b, mu_b in enumerate(mu_barray): B2v = (T0vS / T2v) * (sigma / Qbb)**6 n = 0.5 * (2.8 + 10**(-0.48 - 0.32 * np.log10(mu_b * sigma * M * T) - 0.046 * (np.log10(mu_b * sigma * M * T))**2)) aB = mu_b * M * T * 2 * n * sigma Barray[imu_b] = aB + B2v narray[imu_b] = n eff = sp.erf(n / np.sqrt(2)) #Brand = np.random.poisson( aB + B2v, 1000) x_bins = np.arange(0, 100) mu_bins = np.linspace(0, 50, int(50 / 0.1) + 1, endpoint=True) matrix = [stats.poisson(mu + aB + B2v).pmf(x_bins) for mu in mu_bins] acceptance_intervals = gstats.fc_construct_acceptance_intervals_pdfs( matrix, 0.9) LowerLimitNum, UpperLimitNum, _ = gstats.fc_get_limits( mu_bins, x_bins, acceptance_intervals) sarr = np.zeros(1000) for ex in np.arange(1, 1000, 1): sarr[ex] = gstats.fc_find_limit(np.random.poisson(aB + B2v), UpperLimitNum, mu_bins) s = np.median(sarr) Thalfarray[isig, imu_b] = T0vS * eff_tot * eff / s #Thalfarray[imu_b] = T0vS*eff/s Sarray[imu_b] = s #matplotlib.rcParams['font.sans-serif'] = "Helvetica" font = { 'weight': 'normal', #'family' : 'sans-serif' 'size': 15
n_sigma = 10 n_bins_x = 1000 step_width_mu = 0.005 mu_min = 0 mu_max = 8 cl = 0.90 x_bins = np.linspace(-n_sigma * sigma, n_sigma * sigma, n_bins_x, endpoint=True) mu_bins = np.linspace(mu_min, mu_max, mu_max / step_width_mu + 1, endpoint=True) matrix = [ dist / sum(dist) for dist in (norm(loc=mu, scale=sigma).pdf(x_bins) for mu in mu_bins) ] acceptance_intervals = fc_construct_acceptance_intervals_pdfs(matrix, cl) LowerLimitNum, UpperLimitNum, _ = fc_get_limits(mu_bins, x_bins, acceptance_intervals) fc_fix_limits(LowerLimitNum, UpperLimitNum) fig = plt.figure() ax = fig.add_subplot(111) plt.plot(UpperLimitNum, mu_bins, ls="-", color="red") plt.plot(LowerLimitNum, mu_bins, ls="-", color="red") plt.grid(True) ax.xaxis.set_ticks(np.arange(-10, 10, 1)) ax.xaxis.set_ticks(np.arange(-10, 10, 0.2), True) ax.yaxis.set_ticks(np.arange(0, 8, 0.2), True)