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")
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))) """
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"))