Exemplo n.º 1
0
def get_named_limit(chain_name, perc, burns=0, names=[]):
    mcmc_file = fFITS(chain_name)
    h = fread_header(chain_name, 'MCMC')
    nwalkers = h['NWALKERS']

    if names == []:
        names = mcmc_file[1].get_colnames()
        names = names[1:]

    labels = [l.replace('_', ' ') for l in names]
    new_labels = [l.replace('_', ' ') for l in names]

    data = []
    mod = []

    perc_list = []

    frac_1sigma = 100

    for i in range(0, len(names)):
        name = names[i]
        d = mcmc_file[1][name][burns * nwalkers:]
        lp = mcmc_file[1]['lp'][burns * nwalkers:]
        mask = np.isfinite(lp)
        d = d[mask]
        d = d[np.isfinite(d)]

        percs = np.percentile(d, [perc])
        sigma1 = hpd(d, 0.6827)
        perc_list += [percs]

    perc_list = np.array(perc_list)
    return perc_list
Exemplo n.º 2
0
def resume_file(chain_name, ndim, nwalkers):

    with fFITS(chain_name, 'r') as fits:
        length = fits['MCMC']._info['nrows']
        p0 = fits['MCMC']['x'][length - nwalkers:length]

    return p0, length
Exemplo n.º 3
0
def get_highest_likelihood(chain_name, burns=0, names=[], use_hpd=False):
    mcmc_file = fFITS(chain_name)
    h = fread_header(chain_name, 'MCMC')
    nwalkers = h['NWALKERS']

    if names == []:
        names = mcmc_file[1].get_colnames()
        names = names[1:]

    labels = [l.replace('_', ' ') for l in names]
    new_labels = [l.replace('_', ' ') for l in names]

    data = []
    mod = []

    chain_list = []

    for i in range(0, len(names)):
        name = names[i]
        d = mcmc_file[1][name][burns * nwalkers:]
        lp = mcmc_file[1]['lp'][burns * nwalkers:]
        mask = np.isfinite(lp)
        d = d[mask]
        d = d[np.isfinite(d)]

        chain_list += [d]

    chain_list = np.array(chain_list)
    return chain_list
Exemplo n.º 4
0
def load_chain(chain_name, maxlength=1e6):

    #keeping this seperate for now in case I want to implement burning or something.

    with fFITS(chain_name, 'r') as fits:
        length = fits['MCMC']._info['nrows']
        if length > maxlength:
            data_dict = fits['MCMC'][length - maxlength:length]
        else:
            data_dict = fits['MCMC'][0:length]

    return data_dict
Exemplo n.º 5
0
def run_emcee(x, lnprob, args, nwalkers, nruns, fudge, chain_name, burns,
              pool=None,
              nthreads=1,
              namearray=[],
              resume=False,
              w=False):

    ndim = len(x)

    p0 = []

    if resume == True:
        p0, ndone = resume_file(chain_name, ndim, nwalkers)
        nruns -= ndone
        n = (ndone + burns) / nwalkers
    else:
        for i in range(0, nwalkers):
            shuffle = (10 ** (fudge * (np.random.rand(ndim) - 0.5)))
            p0 += [list(shuffle * x)]
        initiate_file(chain_name, ndim, blob_list=namearray, w=w)
        n = 0

    iterations = int(nruns / nwalkers)

    if pool != None:
        sampler = EnsembleSampler(nwalkers, ndim, lnprob, args=args, pool=pool)
    else:
        sampler = EnsembleSampler(nwalkers, ndim, lnprob,
                                  args=args,
                                  threads=nthreads)

    for result in sampler.sample(p0, iterations=iterations, storechain=False):
        n += 1
        if (n > burns / nwalkers):
            position = result[0]
            logl = result[1]
            with fFITS(chain_name, 'rw') as fits:
                for k in range(position.shape[0]):
                    output = {
                        'lp': np.array([logl[k]]),
                        'x': np.array([position[k]])
                    }
                    for i in range(0, len(namearray)):
                        blob = result[3][k][i]
                        output[namearray[i]] = np.array([blob])
                    if np.isfinite(logl[k]):
                        fits['MCMC'].append(output)
    pool.close()
Exemplo n.º 6
0
def get_named_vals(chain_name, burns=0, names=[], use_hpd=False):
    mcmc_file = fFITS(chain_name)
    h = fread_header(chain_name, 'MCMC')
    nwalkers = h['NWALKERS']

    if names == []:
        names = mcmc_file[1].get_colnames()
        names = names[1:]

    labels = [l.replace('_', ' ') for l in names]
    new_labels = [l.replace('_', ' ') for l in names]

    data = []
    mod = []

    perc_list = []

    frac_1sigma = 100

    for i in range(0, len(names)):
        name = names[i]
        d = mcmc_file[1][name][burns * nwalkers:]
        lp = mcmc_file[1]['lp'][burns * nwalkers:]
        mask = np.isfinite(lp)
        d = d[mask]
        d = d[np.isfinite(d)]

        try:
            percs = np.percentile(d, [16, 50, 84])
            sigma1 = hpd(d, 0.6827)
            #                sigma1 = hpd(good_sli,0.3)
            percs2 = [sigma1[0], mode(d, frac_1sigma=frac_1sigma), sigma1[1]]

            if use_hpd == True:
                perc_list += [percs2]
            else:
                perc_list += [percs]
        except:
            perc_list += [[0, 0, 0]]

    perc_list = np.array(perc_list)
    return perc_list
Exemplo n.º 7
0
def plot_chain(chain_name, burns=0, names=[], alpha=0.01):
    mcmc_file = fFITS(chain_name)
    h = fread_header(chain_name, 'MCMC')
    nwalkers = h['NWALKERS']

    if names == []:
        names = mcmc_file[1].get_colnames()

    for i in range(0, len(names)):
        name = names[i]
        data = mcmc_file[1][name].read()
        #            if name == 'xi':
        #                data = np.log10(data)

        all_lp = mcmc_file[1]['lp'].read()
        l = np.arange(len(data))

        ds = []

        for i in range(0, nwalkers):
            d = data[i::nwalkers]
            lp = all_lp[i::nwalkers]
            na = np.arange(0, len(d))
            mask = np.isfinite(lp)
            ds += [d]
            plt.plot(na[mask], d[mask], c='k', alpha=alpha)

        ds = np.array(ds)

        mean_d = []
        upper_d = []
        lower_d = []

        for i in range(0, len(ds[0])):
            sli = ds[:, i]
            good_sli = sli[np.isfinite(sli)]
            percs = np.percentile(good_sli, [16, 50, 84])
            sigma1 = hpd(good_sli, 0.6827)
            #                sigma1 = hpd(good_sli,0.3)
            percs2 = [sigma1[0], mode(good_sli), sigma1[1]]

            percs = percs2

            mean_d += [percs[1]]
            upper_d += [percs[2]]
            lower_d += [percs[0]]

        fwidth = 20

        plt.plot(gaussian_filter1d(mean_d, fwidth), '-', c='r', lw=2)

        plt.plot(gaussian_filter1d(lower_d, fwidth), '--', c='r', lw=2)

        plt.plot(gaussian_filter1d(upper_d, fwidth), '--', c='r', lw=2)

        plt.axhline(gaussian_filter1d(upper_d, fwidth)[-1], ls=':', c='k')
        plt.axhline(gaussian_filter1d(mean_d, fwidth)[-1], ls=':', c='k')
        plt.axhline(gaussian_filter1d(lower_d, fwidth)[-1], ls=':', c='k')

        plt.ylabel('$' + name + '$')
        plt.xlabel('steps')
        plt.axvline(burns, c='k')
        plt.savefig(chain_name.replace('.fits', '_' + name + '.png'),
                    bbox_inches='tight')
        plt.show()
        plt.close()
Exemplo n.º 8
0
def corner_plot(chain_name,
                burns=0,
                names=[],
                show_contours=True,
                use_hpd=False):
    mcmc_file = fFITS(chain_name)
    h = fread_header(chain_name, 'MCMC')
    nwalkers = h['NWALKERS']

    if names == []:
        names = mcmc_file[1].get_colnames()
        names = names[1:]

    labels = [l.replace('_', ' ') for l in names]
    new_labels = [l.replace('_', ' ') for l in names]

    data = []
    mod = []

    perc_list = []

    frac_1sigma = 100

    for i in range(0, len(names)):
        name = names[i]
        d = mcmc_file[1][name][burns * nwalkers:]
        lp = mcmc_file[1]['lp'][burns * nwalkers:]
        mask = np.isfinite(lp)
        d = d[mask]
        d = d[np.isfinite(d)]

        percs = np.percentile(d, [16, 50, 84])
        sigma1 = hpd(d, 0.6827)
        #                sigma1 = hpd(good_sli,0.3)
        percs2 = [sigma1[0], mode(d, frac_1sigma=frac_1sigma), sigma1[1]]

        perc_list += [percs2]

        d_i = (math.ceil(np.log10(abs(np.median(d)))))

        if d_i < -2:
            d = d / 10**(d_i - 1)
            mod += [d_i - 1]
            new_labels[i] += ' (x$10^{' + str(-1 * mod[i]) + '}$)'
        else:
            mod += [0]
        data += [d]
    data = np.array(data)
    data = data.T

    if use_hpd == True:
        quantiles = []
    else:
        quantiles = [0.16, 0.5, 0.84]

    corner.corner(data,
                  quantiles=quantiles,
                  labels=labels,
                  show_titles=True,
                  plot_contours=show_contours,
                  title_fmt='.2f')

    f = plt.gcf()

    for i in range(1, len(names)):
        index = i * len(names)
        f.axes[index].set_ylabel(new_labels[i])

    for i in range(0, len(names)):
        index = i + len(names) * (len(names) - 1)
        f.axes[index].set_xlabel(new_labels[i])

    for i in range(0, len(names)):
        index = i + i * len(names)

        if use_hpd == True:
            f.axes[index].axvline(perc_list[i][0] / (10**mod[i]),
                                  ls=':',
                                  color='r')
            f.axes[index].axvline(perc_list[i][1] / (10**mod[i]),
                                  ls=':',
                                  color='r')
            f.axes[index].axvline(perc_list[i][2] / (10**mod[i]),
                                  ls=':',
                                  color='r')
            exist = f.axes[index].title.get_text()
            mine = r'${}$ = ${{{:.2f}}}_{{{:.2f}}}^{{+{:.2f}}}$'.format(
                names[i], (perc_list[i][1]) / (10**mod[i]),
                (perc_list[i][0] - perc_list[i][1]) / (10**mod[i]),
                (perc_list[i][2] - perc_list[i][1]) / (10**mod[i]))
            f.axes[index].title.set_text(mine)
        if mod[i] != 0:
            exist = f.axes[index].title.get_text()
            f.axes[index].title.set_text(exist + ' x$10^{' + str(mod[i]) +
                                         '}$')

    plt.show()
Exemplo n.º 9
0
def twochainz(chain_name1, chain_name2, burns=0):

    mcmc_file1 = fFITS(chain_name1)
    h1 = fread_header(chain_name1, 'MCMC')
    nwalkers1 = h1['NWALKERS']

    mcmc_file2 = fFITS(chain_name2)
    h2 = fread_header(chain_name2, 'MCMC')
    nwalkers2 = h2['NWALKERS']

    for i in range(0, len(mcmc_file1[1].get_colnames())):
        name = mcmc_file1[1].get_colnames()[i]

        data1 = mcmc_file1[1][name].read()
        all_lp1 = mcmc_file1[1]['lp'].read()
        l1 = np.arange(len(data1))

        data2 = mcmc_file2[1][name].read()
        all_lp2 = mcmc_file2[1]['lp'].read()
        l2 = np.arange(len(data2))

        d1s = []
        d2s = []
        for i in range(0, 100):
            d = data1[i::nwalkers1]
            lp = all_lp1[i::nwalkers1]
            na = np.arange(0, len(d))
            mask = np.isfinite(lp)
            d1s += [d]
            plt.plot(na[mask], d[mask], c='k', alpha=0.1)

            d = data2[i::nwalkers2]
            lp = all_lp2[i::nwalkers2]
            na = np.arange(0, len(d))
            mask = np.isfinite(lp)
            d2s += [d]
            plt.plot(na[mask], d[mask], c='r', alpha=0.1)

        d1s = np.array(d1s)
        d2s = np.array(d2s)

        mean_d1 = []
        upper_d1 = []
        lower_d1 = []

        for i in range(0, len(d1s[0])):
            sli = d1s[:, i]
            percs = np.percentile(sli[np.isfinite(sli)], [16, 50, 84])
            mean_d1 += [percs[1]]
            upper_d1 += [percs[2]]
            lower_d1 += [percs[0]]

        mean_d2 = []
        upper_d2 = []
        lower_d2 = []

        for i in range(0, len(d2s[0])):
            sli = d2s[:, i]
            percs = np.percentile(sli[np.isfinite(sli)], [16, 50, 84])
            mean_d2 += [percs[1]]
            upper_d2 += [percs[2]]
            lower_d2 += [percs[0]]

        plt.plot(mean_d1)
        plt.plot(mean_d2)

        plt.plot(upper_d1)
        plt.plot(upper_d2)

        plt.plot(lower_d1)
        plt.plot(lower_d2)

        plt.ylabel('$' + name + '$')
        plt.xlabel('steps')
        plt.axvline(burns, c='k')
        #            plt.savefig(chain_name.replace('.fits','_'+name+'.png'),bbox_inches='tight')
        plt.show()
        plt.close()