Esempio n. 1
0
def pymask_grid(input_data,
                ngrid=40,
                pa_prior=[0, 360],
                sep_prior=[0, 100],
                cr_prior=[1, 150],
                err_scale=1.,
                extra_error_cp=0.,
                ncore=1,
                verbose=False):
    cpo = pymask.cpo(input_data)
    like_grid = pymask.coarse_grid(cpo,
                                   nsep=ngrid,
                                   nth=ngrid,
                                   ncon=ngrid,
                                   thmin=pa_prior[0],
                                   thmax=pa_prior[1],
                                   smin=sep_prior[0],
                                   smax=sep_prior[1],
                                   cmin=cr_prior[0],
                                   cmax=cr_prior[1],
                                   threads=ncore,
                                   err_scale=err_scale,
                                   extra_error=extra_error_cp,
                                   verbose=verbose)
    return like_grid
Esempio n. 2
0
def pymask_cr_limit(input_data,
                    nsim=100,
                    err_scale=1,
                    extra_error_cp=0,
                    ncore=1,
                    cmax=500,
                    nsep=60,
                    ncrat=60,
                    nth=30,
                    smin=20,
                    smax=250,
                    cmin=1.0001):
    cpo = pymask.cpo(input_data)
    lims_data = pymask.detec_limits(cpo,
                                    threads=ncore,
                                    nsim=nsim,
                                    nsep=nsep,
                                    ncon=ncrat,
                                    nth=nth,
                                    smax=smax,
                                    cmax=cmax,
                                    cmin=cmin,
                                    smin=smin,
                                    err_scale=err_scale,
                                    extra_error=extra_error_cp)

    limits = lims_data['limits']
    seps = lims_data['seps']
    crats = lims_data['cons']
    crat_limits = 0 * seps

    # Loop through seps and find the highest contrast ratio that would be detectable
    for sep_ix in range(len(seps)):
        would_detec = limits[:, sep_ix] >= 0.9973
        if np.sum(would_detec) >= 1:
            threesig_lim = np.max(crats[would_detec])
            crat_limits[sep_ix] = threesig_lim  # fivesig_lim
        else:
            crat_limits[sep_ix] = 1.
    con_limits = 2.5 * np.log10(crat_limits)

    plt.figure()
    plt.plot(seps, con_limits)
    plt.xlabel('Separation [mas]')
    plt.ylabel('$\Delta \mathrm{Mag}_{3\sigma}$')
    plt.title("PYMASK: flux ratio for 3$\sigma$ detection")
    plt.ylim(plt.ylim()[1], plt.ylim()[0])  # -- rreverse plot
    plt.tight_layout()
    res = {'r': seps, 'cr_limit': con_limits, 'lims_data': lims_data}
    return res
Esempio n. 3
0
def pymask_mcmc(input_data,
                initial_guess,
                niters=1000,
                pa_prior=[0, 360],
                sep_prior=None,
                cr_prior=None,
                err_scale=1,
                extra_error_cp=0,
                ncore=1,
                burn_in=500,
                walkers=100,
                display=True,
                verbose=True):
    cpo = pymask.cpo(input_data)
    hammer_data = pymask.hammer(cpo,
                                ivar=initial_guess,
                                niters=niters,
                                model='constant',
                                nwalcps=walkers,
                                sep_prior=sep_prior,
                                pa_prior=pa_prior,
                                crat_prior=cr_prior,
                                err_scale=err_scale,
                                extra_error=extra_error_cp,
                                plot=display,
                                burn_in=burn_in,
                                threads=ncore)

    res_corner = hammer_data[1]
    chain = hammer_data[0]['chain']

    dm = 2.5 * np.log10(res_corner['cr'])
    dmm = 2.5 * np.log10(res_corner['cr'] - res_corner['delcrm'])
    dmp = 2.5 * np.log10(res_corner['cr'] + res_corner['delcrp'])
    e_dmm = abs(dm - dmm)
    e_dmp = abs(dm - dmp)

    if verbose:
        print('MCMC estimation')
        print('---------------')
        print(
            'Separation = %2.1f +%2.1f/-%2.1f mas' %
            (res_corner['sep'], res_corner['delsepp'], res_corner['delsepm']))
        print('PA = %2.1f +%2.1f/-%2.1f deg' %
              (res_corner['pa'], res_corner['delpap'], res_corner['delpam']))
        print('Contrast Ratio = %2.1f +%2.1f/-%2.1f' %
              (res_corner['cr'], res_corner['delcrp'], res_corner['delcrm']))
        print('dm = %2.2f +%2.2f/-%2.2f mag' % (dm, e_dmp, e_dmm))

    chain_sep = chain[:, :, 0].T
    chain_th = chain[:, :, 1].T
    chain_cr = chain[:, :, 2].T

    if display:
        sep = res_corner['sep']
        pa = res_corner['pa']
        cr = res_corner['cr']
        plt.figure(figsize=(5, 7))
        plt.subplot(3, 1, 1)
        plt.plot(chain_sep, color='grey', alpha=.5)
        plt.plot(len(chain_sep), sep, marker='*', color='#0085ca', zorder=1e3)
        plt.ylabel('Separation [mas]')
        plt.subplot(3, 1, 2)
        plt.plot(chain_th, color='grey', alpha=.5)
        plt.plot(len(chain_sep), pa, marker='*', color='#0085ca', zorder=1e3)
        plt.ylabel('PA [deg]')
        plt.subplot(3, 1, 3)
        plt.plot(chain_cr, color='grey', alpha=.2)
        plt.plot(len(chain_sep), cr, marker='*', color='#0085ca', zorder=1e3)
        plt.xlabel('Step')
        plt.ylabel('CR')
        plt.tight_layout()
        plt.show(block=False)

    res = {
        'best': {
            'model': 'binary',
            'dm': dm,
            'theta': res_corner['pa'],
            'sep': res_corner['sep'],
            'x0': 0,
            'y0': 0
        },
        'uncer': {
            'dm_p': e_dmp,
            'dm_m': e_dmm,
            'theta_p': res_corner['delpap'],
            'theta_m': res_corner['delpam'],
            'sep_p': res_corner['delsepp'],
            'sep_m': res_corner['delsepm']
        },
    }
    return res