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
Esempio n. 2
0
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)
Esempio n. 3
0
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)
Esempio n. 4
0
    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
Esempio n. 5
0
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)