Example #1
0
def ml_parameter_distributions(overwrite=False):
    """ Compute distributions of microlensing event parameter fits by doing my MCMC
        fit to all candidate, qso, not interesting, bad data, transient, and supernova
        tagged light curves.

        There are about ~4500

        NEW: Hmm...maybe forget this, I keep breaking navtara
    """

    ptf = mongo.PTFConnection()
    light_curve_collection = ptf.light_curves

    Nwalkers = 100
    Nsamples = 1000
    Nburn = 100

    searched = []
    max_parameters = []
    for tag in ["candidate", "qso", "not interesting", "transient", "supernova", "bad data"]:
        for lc_document in list(light_curve_collection.find({"tags" : tag})):
            if str(lc_document["_id"]) in searched and not overwrite:
                continue

            light_curve = pdb.get_light_curve(lc_document["field_id"], lc_document["ccd_id"], lc_document["source_id"], clean=True)
            sampler = fit.fit_model_to_light_curve(light_curve, nwalkers=Nwalkers, nsamples=Nsamples, nburn_in=Nburn)
            max_idx = np.ravel(sampler.lnprobability).argmax()

            # Turn this on to dump plots for each light curve
            #fit.make_chain_distribution_figure(light_curve, sampler, filename="{0}_{1}_{2}_dists.png".format(lc_document["field_id"], lc_document["ccd_id"], lc_document["source_id"]))
            #fit.make_light_curve_figure(light_curve, sampler, filename="{0}_{1}_{2}_lc.png".format(lc_document["field_id"], lc_document["ccd_id"], lc_document["source_id"]))

            max_parameters.append(list(sampler.flatchain[max_idx]))
            searched.append(str(lc_document["_id"]))

            if len(searched) == 500:
                break

        if len(searched) == 500:
            break

    max_parameters = np.array(max_parameters)
    fig, axes = plt.subplots(2, 2, figsize=(14,14))

    for ii, ax in enumerate(np.ravel(axes)):
        if ii == 3:
            bins = np.logspace(min(max_parameters[:,ii]), max(max_parameters[:,ii]), 25)
            ax.hist(max_parameters[:,ii], bins=bins, color="k", histtype="step")
        else:
            ax.hist(max_parameters[:,ii], color="k", histtype="step")
        ax.set_yscale("log")

    fig.savefig("plots/fit_events/all_parameters.png")
Example #2
0
def fit_non_candidates(Nburn, Nsamples, Nwalkers):
    # Now, the other ones...


    non_candidates = [("PTFS1203am", "PTFS1212ak", "PTFS1213ap"),
                      ("PTFS1215aj","PTFS1217ce", "PTFS1217df"),
                      ("PTFS1217dk", "PTFS1219ad")]

    for kk,row in enumerate(non_candidates):
        #fig1 = plt.figure(figsize=(32,12))
        fig1 = plt.figure(figsize=(22,8))
        fontsize = 16
        gs = gridspec.GridSpec(2, 3, height_ratios=[1,2])

        # Make 6-panel figure with non-candidates
        for ii,PTFID in enumerate(row):
            if ii == 1 and kk == 2:
                Nsamples = 10
                #Nsamples = 1000

            filename = "data/candidates/lc_{0}.dat".format(PTFID)
            figtext = ptfid_to_longname[PTFID] #candidate["long_ptf_name"]

            light_curve = lightcurve_from_filename(filename)

            if ii == 0:
                y_axis_labels = True
            else:
                y_axis_labels = False

            if kk == 2 or (kk == 1 and ii == 2):
                x_axis_labels = True
            else:
                x_axis_labels = False

            logger.info("Fitting {0}".format(PTFID))
            sampler = fit.fit_model_to_light_curve(light_curve, nwalkers=Nwalkers, nsamples=Nsamples, nburn_in=Nburn)
            chain = sampler.flatchain
            print "Mean acceptance fraction: {0:.3f}".format(np.mean(sampler.acceptance_fraction))

            ax = plt.subplot(gs[1,ii])
            ax2 = plt.subplot(gs[0,ii])

            # "best" parameters
            flatchain = np.vstack(sampler.chain)
            best_m0, best_u0, best_t0, best_tE = np.median(flatchain, axis=0)

            mjd = np.arange(light_curve.mjd.min()-1000., light_curve.mjd.max()+1000., 0.2)

            mean_m0, mean_u0, mean_t0, mean_tE = np.median(chain,axis=0)
            std_m0, std_u0, std_t0, std_tE = np.std(chain,axis=0)

            print("m0 = ", mean_m0, std_m0)
            print("u0 = ", mean_u0, std_u0)
            print("tE = ", mean_tE, std_tE)
            print("t0 = ", mean_t0, std_t0)

            light_curve.mjd -= mean_t0
            zoomed_light_curve = light_curve.slice_mjd(-3.*mean_tE, 3.*mean_tE)
            if len(zoomed_light_curve) == 0:
                mean_t0 = light_curve.mjd.min()
                mean_tE = 10.

                light_curve.mjd -= mean_t0
                zoomed_light_curve = light_curve.slice_mjd(-3.*mean_tE, 3.*mean_tE)

            zoomed_light_curve.plot(ax)
            light_curve.plot(ax2)
            ax.set_xlim(-3.*mean_tE, 3.*mean_tE)
            #ax.text(-2.5*mean_tE, np.min(s_light_curve.mag), r"$u_0=${u0:.3f}$\pm${std:.3f}".format(u0=u0, std=std_u0) + "\n" + r"$t_E=${tE:.1f}$\pm${std:.1f} days".format(tE=mean_tE, std=std_tE), fontsize=19)

            ylim, xlim = ax2.get_ylim(), ax2.get_xlim()
            dx, dy = (xlim[1]-xlim[0]), (ylim[0]-ylim[1])
            if (kk == 0 and ii == 1) or (kk == 1 and ii == 0) or (kk == 2 and ii == 0):
                ax2.text((xlim[0]+xlim[1])/2.-15,ylim[1]+dy/8.,figtext,fontsize=fontsize)
            else:
                ax2.text(xlim[0]+dx/20., ylim[1]+dy/8., figtext,fontsize=fontsize)

            if y_axis_labels:
                ax.set_ylabel(r"$R$ (mag)", fontsize=fontsize+2)
            if x_axis_labels:
                ax.set_xlabel(r"time-$t_0$ [days]", fontsize=fontsize+2)

            if y_axis_labels:
                ax2.set_ylabel(r"$R$ (mag)", fontsize=fontsize+2)

        fig1.subplots_adjust(hspace=0.15, wspace=0.15, left=0.06, right=0.95, top=0.98, bottom=0.09)
        #fig1.savefig(os.path.join("plots/fit_events", "non_candidates_{0}.eps".format(kk)))
        fig1.savefig(os.path.join("plots/fit_events", "fig14_{0}.eps".format(kk)))



    """
Example #3
0
def fit_candidates(Nburn, Nsamples, Nwalkers, seed=None):
    final_candidates = ["PTFS1206i", "PTFS1216bt", "PTFS1217cv"]

    fig1 = plt.figure(figsize=(22,8))
    fontsize = 16
    gs = gridspec.GridSpec(2, 3, height_ratios=[1,2])

    u0s,t0s,m0s,tEs = [],[],[],[]
    du0s,dt0s,dm0s,dtEs = [],[],[],[]

    # Make 3-panel figure with candidates
    for ii,PTFID in enumerate(final_candidates):
        if ii == 2:
            Nsamples = 1000

        chains = True
        filename = "data/candidates/lc_{0}.dat".format(PTFID)
        figtext = ptfid_to_longname[PTFID] #candidate["long_ptf_name"]
        light_curve = lightcurve_from_filename(filename)

        if ii == 0:
            y_axis_labels = True
        else:
            y_axis_labels = False

        if ii == 1:
            x_axis_labels = True
        else:
            x_axis_labels = False

        logger.info("Fitting {0}".format(PTFID))
        sampler = fit.fit_model_to_light_curve(light_curve, nwalkers=Nwalkers, nsamples=Nsamples, nburn_in=Nburn, seed=seed)
        chain = sampler.flatchain
        print "Mean acceptance fraction: {0:.3f}".format(np.mean(sampler.acceptance_fraction))

        ax = plt.subplot(gs[1,ii])
        ax2 = plt.subplot(gs[0,ii])

        # "best" parameters
        flatchain = np.vstack(sampler.chain)
        best_m0, best_u0, best_t0, best_tE = np.median(flatchain, axis=0)

        mjd = np.arange(light_curve.mjd.min()-1000., light_curve.mjd.max()+1000., 0.2)

        first_t0 = None
        for jj in range(100):
            walker_idx = np.random.randint(sampler.k)
            chain = sampler.chain[walker_idx][-100:]
            probs = sampler.lnprobability[walker_idx][-100:]
            link_idx = np.random.randint(len(chain))

            prob = probs[link_idx]
            link = chain[link_idx]
            m0, u0, t0, tE = link

            if prob/probs.max() > 2:
                continue

            # More than 100% error
            if np.any(np.fabs(link - np.mean(chain,axis=0)) / np.mean(chain,axis=0) > 0.25) or tE < 8 or tE > 250.:
                continue

            if np.fabs(t0 - best_t0) > 20.:
                continue

            if first_t0 == None:
                first_t0 = t0
            s_light_curve = SimulatedLightCurve(mjd=mjd, error=np.zeros_like(mjd), mag=m0)
            s_light_curve.add_microlensing_event(t0=t0, u0=u0, tE=tE)
            ax.plot(s_light_curve.mjd-first_t0, s_light_curve.mag, linestyle="-", color="#ababab", alpha=0.05, marker=None)
            #ax_inset.plot(s_light_curve.mjd-first_t0, s_light_curve.mag, "r-", alpha=0.05)

        mean_m0, mean_u0, mean_t0, mean_tE = np.median(chain,axis=0)
        std_m0, std_u0, std_t0, std_tE = np.std(chain,axis=0)

        m0s.append(mean_m0)
        dm0s.append(std_m0)
        t0s.append(mean_t0+54832.) # HJD to MJD
        dt0s.append(std_t0)
        tEs.append(mean_tE)
        dtEs.append(std_tE)
        u0s.append(mean_u0)
        du0s.append(std_u0)
        print("m0 = ", mean_m0, std_m0)
        print("u0 = ", mean_u0, std_u0)
        print("tE = ", mean_tE, std_tE)
        print("t0 = ", mean_t0, std_t0)

        light_curve.mjd -= mean_t0
        zoomed_light_curve = light_curve.slice_mjd(-3.*mean_tE, 3.*mean_tE)
        if len(zoomed_light_curve) == 0:
            mean_t0 = light_curve.mjd.min()
            mean_tE = 10.

            light_curve.mjd -= mean_t0
            zoomed_light_curve = light_curve.slice_mjd(-3.*mean_tE, 3.*mean_tE)

        zoomed_light_curve.plot(ax)
        light_curve.plot(ax2)
        ax.set_xlim(-3.*mean_tE, 3.*mean_tE)
        #ax.text(-2.5*mean_tE, np.min(s_light_curve.mag), r"$u_0=${u0:.3f}$\pm${std:.3f}".format(u0=u0, std=std_u0) + "\n" + r"$t_E=${tE:.1f}$\pm${std:.1f} days".format(tE=mean_tE, std=std_tE), fontsize=19)

        ylim, xlim = ax.get_ylim(), ax.get_xlim()
        dx, dy = (xlim[1]-xlim[0]), (ylim[0]-ylim[1])
        ax.text(xlim[0]+dx/20., ylim[1]+dy/8.,
                 r"$u_0=${u0:.3f}$\pm${std:.3f}".format(u0=mean_u0, std=std_u0) +
                 "\n" + r"$t_E=${tE:.1f}$\pm${std:.1f} days".format(tE=mean_tE, std=std_tE), fontsize=fontsize)

        ylim, xlim = ax2.get_ylim(), ax2.get_xlim()
        dx, dy = (xlim[1]-xlim[0]), (ylim[0]-ylim[1])
        if ii == 2:
            ax2.text((xlim[0]+xlim[1])/2.-30,ylim[1]+dy/8.,figtext,fontsize=fontsize)
        else:
            ax2.text(xlim[0]+dx/20., ylim[1]+dy/8., figtext,fontsize=fontsize)

        if y_axis_labels:
            ax.set_ylabel(r"$R$ (mag)", fontsize=fontsize+2)
        if x_axis_labels:
            ax.set_xlabel(r"time-$t_0$ [days]", fontsize=fontsize+2)

        # Now plot the "best fit" line in red
        s_light_curve = SimulatedLightCurve(mjd=mjd, error=np.zeros_like(mjd), mag=best_m0)
        s_light_curve.add_microlensing_event(t0=best_t0, u0=best_u0, tE=best_tE)
        ax.plot(s_light_curve.mjd-best_t0, s_light_curve.mag, "k-", alpha=0.6, linewidth=3)

        if y_axis_labels:
            ax2.set_ylabel(r"$R$ (mag)", fontsize=fontsize+2)

    import astropy.table as at
    from astropy.io import ascii
    tbl = at.Table([at.Column(data=u0s, name="u0"),
                    at.Column(data=du0s, name="e_u0"),
                    at.Column(data=tEs, name="tE"),
                    at.Column(data=dtEs, name="e_tE"),
                    at.Column(data=t0s, name="t0"),
                    at.Column(data=dt0s, name="e_t0"),
                    at.Column(data=m0s, name="m0"),
                    at.Column(data=dm0s, name="e_m0")])

    ascii.write(tbl, output=os.path.join("plots/fit_events/metadata.tex"), Writer=ascii.Latex)

    fig1.subplots_adjust(hspace=0.15, wspace=0.15, left=0.06, right=0.95, top=0.98, bottom=0.09)
    fig1.savefig(os.path.join("plots/fit_events", "fig10.eps"))