def residual(params, mod_pars, photo_data, rv_data, ncores, *args): # mod_pars[1] = params['epoch'].value params = utilfuncs.get_lmfit_parameters(mod_pars, params) mod_flux, mod_rv = utilfuncs.model(mod_pars, params, photo_data[0], rv_data[0], ncores) weighted = ((mod_flux - photo_data[1]) / photo_data[2]) return np.append(weighted, ((mod_rv - rv_data[1]) / rv_data[2]))
def lnlike(mod_pars, params, photo_data, rv_data): # lnf = np.log(1.0e-10) # Natural log of the underestimation fraction # inv_sigma2 = 1.0 / (yerr ** 2 + model ** 2 * np.exp(2 * lnf)) # return -0.5 * (np.sum((y - model) ** 2 * inv_sigma2 - np.log(inv_sigma2))) mod_flux, mod_rv = utilfuncs.model(mod_pars, params, photo_data[0], rv_data[0]) flnl = np.sum((-0.5 * ((mod_flux - photo_data[1]) / photo_data[2]) ** 2)) rvlnl = np.sum((-0.5 * ((mod_rv - rv_data[1]) / rv_data[2])**2)) return flnl + rvlnl
def lnlike(cube, ndim, nparams): theta = np.array([cube[i] for i in range(ndim)]) params = utilfuncs.split_parameters(theta, mod_pars[0]) mod_flux, mod_rv = utilfuncs.model(mod_pars, params, photo_data[0], rv_data[0], ncores) flnl = np.sum((-0.5 * ((mod_flux - photo_data[1]) / photo_data[2]) ** 2)) rvlnl = np.sum((-0.5 * ((mod_rv - rv_data[1]) / rv_data[2])**2)) per_iteration(mod_pars, theta, flnl, mod_flux) return flnl + rvlnl
def generate(lmod_pars, lparams, lphoto_data, lrv_data, lncores, lfname): global mod_pars, params, photo_data, rv_data, ncores, fname mod_pars, params, photo_data, rv_data, ncores, fname = \ lmod_pars, lparams, lphoto_data, lrv_data, lncores, lfname # number of dimensions our problem has parameters = ["{0}".format(i) for i in range(mod_pars[0] * 5 + (mod_pars[0] - 1) * 6)] nparams = len(parameters) # make sure the output directories exist if not os.path.exists("./output/{0}/multinest".format(fname)): os.makedirs(os.path.join("./", "output", "{0}".format(fname), "multinest")) if not os.path.exists("./output/{0}/plots".format(fname)): os.makedirs(os.path.join("./", "output", "{0}".format(fname), "plots")) if not os.path.exists("chains"): os.makedirs("chains") # we want to see some output while it is running progress_plot = pymultinest.ProgressPlotter(n_params=nparams, outputfiles_basename='output/{0}/multinest/'.format(fname)) progress_plot.start() # progress_print = pymultinest.ProgressPrinter(n_params=nparams, outputfiles_basename='output/{0}/multinest/'.format(fname)) # progress_print.start() # run MultiNest pymultinest.run(lnlike, lnprior, nparams, outputfiles_basename=u'./output/{0}/multinest/'.format(fname), resume=True, verbose=True, sampling_efficiency='parameter', n_live_points=1000) # run has completed progress_plot.stop() # progress_print.stop() json.dump(parameters, open('./output/{0}/multinest/params.json'.format(fname), 'w')) # save parameter names # plot the distribution of a posteriori possible models plt.figure() plt.plot(photo_data[0], photo_data[1], '+ ', color='red', label='data') a = pymultinest.Analyzer(outputfiles_basename="./output/{0}/reports/".format(fname), n_params=nparams) for theta in a.get_equal_weighted_posterior()[::100, :-1]: params = utilfuncs.split_parameters(theta, mod_pars[0]) mod_flux, mod_rv = utilfuncs.model(mod_pars, params, photo_data[0], rv_data[0]) plt.plot(photo_data[0], mod_flux, '-', color='blue', alpha=0.3, label='data') utilfuncs.report_as_input(params, fname) plt.savefig('./output/{0}/plots/posterior.pdf'.format(fname)) plt.close()
def plot_model(mod_pars, body_pars, photo_data, rv_data): mod_flux, mod_rv = utilfuncs.model(mod_pars, body_pars, photo_data[0], photo_data[0]) # print("Reduced chi-square:", # np.sum(((photo_data[1] - mod_flux) / photo_data[2]) ** 2) / # (photo_data[2].size - 1 - (mod_pars[0] * 5 + (mod_pars[0] - 1) * 6))) # # inv_sigma2 = 1.0 / (photo_data[2] ** 2 + mod_flux ** 2 * np.exp(2.0 * np.log(1.0e-10))) # print("Custom optimized value:", # -0.5 * (np.sum((photo_data[1] - mod_flux) ** 2 * inv_sigma2 - np.log(inv_sigma2)))) pylab.plot(photo_data[0], photo_data[1], 'k+') pylab.plot(photo_data[0], mod_flux, 'r') pylab.show() pylab.plot(rv_data[0], rv_data[1], 'o') pylab.plot(photo_data[0], mod_rv, 'r') pylab.show()