From ce8f516b113f35141445cda1e22fde51474de8b8 Mon Sep 17 00:00:00 2001 From: Kyle Pearson Date: Fri, 13 Oct 2023 15:17:16 -0700 Subject: [PATCH 1/6] cleaned up ephemeris fitting examples --- exotic/api/ephemeris.py | 516 ++++++---------------------- exotic/api/nested_linear_fitter.py | 519 ----------------------------- 2 files changed, 104 insertions(+), 931 deletions(-) diff --git a/exotic/api/ephemeris.py b/exotic/api/ephemeris.py index 81349b1b..6e2ef3b8 100644 --- a/exotic/api/ephemeris.py +++ b/exotic/api/ephemeris.py @@ -50,7 +50,6 @@ from ultranest import ReactiveNestedSampler from astropy.timeseries import LombScargle from astropy import units as u -import copy class ephemeris_fitter(object): @@ -909,364 +908,117 @@ def plot_triangle(self): ) return fig - - -def empty_data(N): # orbit parameters in Nbody simulation - return { - 'x':np.zeros(N), - 'y':np.zeros(N), - 'z':np.zeros(N), - 'P':np.zeros(N), - 'a':np.zeros(N), - 'e':np.zeros(N), - 'inc':np.zeros(N), - 'Omega':np.zeros(N), - 'omega':np.zeros(N), - 'M':np.zeros(N), - } - -def integrate(sim, objects, Ndays, Noutputs): - # ps is now an array of pointers and will change as the simulation runs - ps = sim.particles - - times = np.linspace(0., Ndays, Noutputs) # units of days - - pdata = [empty_data(Noutputs) for i in range(len(objects)-1)] - star = {'x':np.zeros(Noutputs),'y':np.zeros(Noutputs),'z':np.zeros(Noutputs) } - - # run simulation time steps - for i,time in enumerate(times): - sim.integrate(time) - - # record data - for k in star.keys(): - star[k][i] = getattr(ps[0], k) - - for j in range(1,len(objects)): - for k in pdata[j-1].keys(): - pdata[j-1][k][i] = getattr(ps[j],k) - - sim_data = ({ - 'pdata':pdata, - 'star':star, - 'times':times, - 'objects':objects, - 'dt': Noutputs/(Ndays*24*60*60) # conversion factor to get seconds for RV semi-amp - }) - - return sim_data - -def generate(objects, Ndays=None, Noutputs=None): - # create rebound simulation - # for object parameters see: - # https://rebound.readthedocs.io/en/latest/_modules/rebound/particle.html - sim = rebound.Simulation() - - # sim.integrator = "tes" - # sim.ri_tes.dq_max = 1e-2 - # sim.ri_tes.recti_per_orbit = 1.61803398875 - # sim.ri_tes.epsilon = 1e-6 - - # sim.integrator = "whfast" - # sim.ri_whfast.corrector = 5 - # sim.ri_whfast.safe_mode = 0 - sim.units = ('day', 'AU', 'Msun') - for i in range(len(objects)): - sim.add( **objects[i] ) - sim.move_to_com() - - if Ndays and Noutputs: - return integrate(sim, objects, Ndays, Noutputs) - else: - return sim - -def find_zero(t1,dx1, t2,dx2): - # find zero with linear interpolation - m = (dx2-dx1)/(t2-t1) - T0 = -dx1/m + t1 - return T0 - -def transit_times(xp,xs,times): - # check for sign change in position difference - dx = xp-xs - tt = [] - for i in range(1,len(dx)): - if dx[i-1] >= 0 and dx[i] <= 0: - tt.append( find_zero(times[i-1],dx[i-1], times[i],dx[i]) ) - return np.array(tt) - -def TTV(epochs, tt): - N = len(epochs) - A = np.vstack([np.ones(N), epochs]).T - b, m = np.linalg.lstsq(A, tt, rcond=None)[0] - ttv = (tt-m*np.array(epochs)-b) - return [ttv,m,b] - -class nbody_fitter(): - - def __init__(self, data, prior=None, bounds=None, verbose=True): - self.data = data - self.bounds = bounds - self.prior = prior - self.verbose = verbose - self.fit_nested() - - def fit_nested(self): - - # set up some arrays for mapping sampler output - freekeys = [] - boundarray = [] - for i,planet in enumerate(self.bounds): - for bound in planet: - freekeys.append(f"{i}_{bound}") - boundarray.append(planet[bound]) - - # find min and max time for simulation - min_time = np.min(self.data[1]['Tc']) - max_time = np.max(self.data[1]['Tc']) - # todo extend for multiplanet systems - - sim_time = (max_time-min_time)*1.05 - # TODO extend for multiplanet systems - Tc_norm = self.data[1]['Tc'] - min_time # normalize the data to the first observation - self.orbit = np.rint(Tc_norm / self.prior[1]['P']).astype(int) # number of orbits since first observation (rounded to nearest integer) - - # numpify - boundarray = np.array(boundarray) - bounddiff = np.diff(boundarray,1).reshape(-1) - - # create queue and save simulation to - def loglike(pars): - chi2 = 0 - - # set parameters - for i,par in enumerate(pars): - idx,key = freekeys[i].split('_') - idx = int(idx) - if key == 'tmid': - continue - # this dict goes to REBOUND and needs specific keys - self.prior[idx][key] = par - - # take difference between data and simulation - # run N-body simulation - sim_data = generate(self.prior, sim_time, int(sim_time*24)) # uses linspace behind the scenes - - # json structure with analytics of interest from the simulation - # ttv_data = analyze(sim_data) # slow - - sim_shift = 0 - # loop over planets, check for data - for i,planet in enumerate(self.prior): - if self.data[i]: - # compute transit times from N-body simulation - Tc_sim = transit_times( sim_data['pdata'][i-1]['x'], sim_data['star']['x'], sim_data['times'] ) - - # derive an offset in time from the first planet - if i-1==0: - sim_shift = Tc_sim.min() - - # shift the first mid-transit in simulation to observation - Tc_sim -= sim_shift # first orbit has tmid at 0 - - # scale Tc_sim to data - try: - residual = self.data[i]['Tc'] - Tc_sim[self.orbit] - except: - #import pdb; pdb.set_trace - #ttv,m,b = TTV(np.arange(Tc_sim.shape[0]), Tc_sim) - #ttv1,m1,b1 = TTV(self.orbit, self.data[i]['Tc']) - # could be unstable orbit or not enough data - # switch to average error and clip by max epoch? - print(self.prior) - chi2 += -1e6 - continue - - Tc_sim += residual.mean() - - # take difference between data and simulation - try: - chi2 += -0.5*np.sum(((self.data[i]['Tc'] - Tc_sim[self.orbit])/self.data[i]['Tc_err'])**2) - except: - chi2 += -1e6 - print(self.prior) - # usually unstable orbit - - return chi2 - - - def prior_transform(upars): - return (boundarray[:,0] + bounddiff*upars) - - if self.verbose: - self.results = ReactiveNestedSampler(freekeys, loglike, prior_transform).run(max_ncalls=1e5) - else: - self.results = ReactiveNestedSampler(freekeys, loglike, prior_transform).run(max_ncalls=1e5, show_status=self.verbose, viz_callback=self.verbose) - - self.errors = {} - self.quantiles = {} - self.parameters = copy.deepcopy(self.prior) - - #for i, key in enumerate(freekeys): - # self.parameters[key] = self.results['maximum_likelihood']['point'][i] - # self.errors[key] = self.results['posterior']['stdev'][i] - # self.quantiles[key] = [ - # self.results['posterior']['errlo'][i], - # self.results['posterior']['errup'][i]] - - -#def main(): if __name__ == "__main__": Tc = np.array([ # measured mid-transit times #Exoplanet Watch transit times array -2457025.7867,2457347.7655,2457694.8263,2458112.8495,2458492.6454,2459532.7834,2459604.81036,2459604.8137,2459614.6365,2459616.8209, -2459651.7466,2459903.8588,2459914.7783,2459915.8684,2459925.6921,2459939.8793,2459949.7047,2459959.5249,2459962.8037,2459973.7129, -2459974.798,2459986.8057,2459994.4489,2460009.7312,2458867.01587,2459501.1295, - -#ExoClock transit times array -2454508.977,2454515.525,2454801.477,2454840.769,2455123.447,2455140.91,2455147.459,2455147.459,2455148.551,2455148.552,2455158.372, -2455158.373,2455159.464,2455159.467,2455160.556,2455163.831,2455172.562,2455192.205,2455209.669,2455210.762,2455215.129,2455230.407, -2455238.046,2455254.419,2455265.331,2455494.53,2455494.531,2455509.81,2455510.902,2455530.547,2455542.553,2455548.011,2455565.472, -2455566.563,2455575.296,2455575.297,2455578.569,2455589.483,2455590.576,2455598.216,2455600.397,2455600.398,2455600.398,2455601.49, -2455601.49,2455601.49,2455603.673,2455612.404,2455623.318,2455623.319,2455624.41,2455624.41,2455663.702,2455842.693,2455842.694, -2455876.528,2455887.442,2455887.442,2455887.442,2455888.533,2455888.534,2455888.534,2455889.625,2455890.716,2455901.63,2455903.814, -2455903.814,2455920.185,2455923.459,2455926.733,2455939.829,2455945.287,2455946.378,2455946.379,2455947.47,2455948.561,2455951.835, -2455952.927,2455959.475,2455960.567,2455970.39,2455971.481,2455981.304,2455982.395,2455983.487,2455984.578,2455985.67,2455996.584, -2456000.95,2456005.315,2456006.406,2456014.046,2456175.577,2456245.427,2456249.794,2456273.805,2456282.536,2456284.719,2456297.816, -2456302.182,2456305.455,2456319.644,2456328.376,2456329.467,2456604.505,2456605.596,2456606.688,2456607.779,2456629.607,2456630.699, -2456654.71,2456659.076,2456662.35,2456663.441,2456664.533,2456674.356,2456677.63,2456688.544,2456694.002,2456703.824,2456711.464, -2456719.104,2456721.287,2456722.378,2456986.502,2457010.513,2457012.696,2457033.434,2457045.438,2457046.53,2457059.627,2457060.718, -2457067.267,2457068.358,2457103.284,2457345.579,2457368.5,2457378.321,2457390.327,2457391.418,2457426.343,2457426.344,2457427.435, -2457451.446,2457474.364,2457486.372,2457671.913,2457691.559,2457703.564,2457706.838,2457726.484,2457727.575,2457760.318,2457765.775, -2457766.866,2457772.324,2457773.415,2457776.689,2457786.512,2457788.695,2457800.7,2457808.34,2457809.432,2457809.434,2457810.523, -2457832.348,2457832.351,2458026.624,2458050.635,2458060.459,2458072.462,2458073.555,2458074.647,2458077.921,2458123.76,2458124.852, -2458132.491,2458134.675,2458136.858,2458155.41,2458155.412,2458156.503,2458159.778,2458166.326,2458178.331,2458214.347,2458411.895, -2458467.557,2458471.923,2458478.472,2458479.564,2458490.477,2458494.843,2458501.39,2458501.392,2458506.848,2458536.315,2458537.408, -2458871.382,2458880.113,2458883.384,2458893.209,2458903.032,2459088.575,2459148.602,2459156.242,2459157.334,2459190.076,2459194.441, -2459194.443,2459196.623,2459197.717,2459204.264, - -#ETD mid transit times array -2454508.976854,2454836.403393,2454840.768603,2454840.771193,2454908.437992,2454931.358182,2455164.923956,2455164.924316,2455172.561816,2455172.562786, -2455198.756735,2455230.406730,2455254.418870,2455256.596033,2455265.334053,2455506.533285,2455509.808915,2455519.632074,2455532.729964,2455541.461084, -2455576.387242,2455577.475172,2455577.476782,2455577.477112,2455578.568422,2455593.850192,2455600.398282,2455601.489211,2455603.671161,2455612.400801, -2455612.401321,2455615.675911,2455647.328760,2455857.973783,2455857.973783,2455867.797832,2455873.253612,2455877.618482,2455877.619162,2455889.623302, -2455899.448441,2455899.451251,2455900.539781,2455904.905271,2455905.995241,2455912.544561,2455912.544561,2455913.636131,2455914.726741,2455922.370121, -2455928.913321,2455936.552560,2455936.561520,2455937.645430,2455938.738730,2455946.383030,2455947.468480,2455949.650900,2455949.650900,2455950.742510, -2455957.287600,2455957.294400,2455957.296780,2455957.296780,2455961.659130,2455962.749930,2455970.392369,2455982.394919,2455993.309869,2455993.313119, -2455994.398719,2455994.399359,2456003.129689,2456003.130169,2456005.315328,2456222.509695,2456246.516835,2456249.793845,2456269.425195,2456271.623265, -2456296.724384,2456304.364534,2456304.365804,2456304.367454,2456304.367784,2456329.469294,2456364.392544,2456584.860173,2456595.772813,2456596.866383, -2456604.503073,2456608.869564,2456616.511354,2456626.333324,2456627.429034,2456628.515004,2456628.517074,2456630.699754,2456639.430344,2456639.432894, -2456640.522554,2456641.610274,2456650.341584,2456663.443614,2456688.544734,2456722.372535,2456722.382615,2456734.383505,2456734.388675,2456746.385515, -2456746.391885,2456927.546138,2456950.485119,2456960.306869,2456963.578439,2456963.578959,2456963.582479,2456986.501140,2456998.508180,2456998.508180, -2457032.333311,2457033.433561,2457069.448912,2457080.367572,2457080.367572,2457092.368353,2457344.486723,2457344.488693,2457345.578813,2457345.579833, -2457356.493733,2457357.585013,2457357.586493,2457368.498964,2457368.499654,2457369.589474,2457379.414424,2457379.414424,2457414.334726,2457426.343356, -2457451.447237,2457474.364078,2457474.364348,2457486.371248,2457668.637786,2457726.484138,2457749.405049,2457750.494949,2457751.585649,2457751.586939, -2457757.043281,2457758.134851,2457760.317471,2457760.318171,2457761.408951,2457770.140361,2457772.327372,2457773.415162,2457774.506522,2457809.431273, -2457809.435043,2457832.350874,2458087.745843,2458096.474134,2458109.571734,2458131.400315,2458396.615162,2458396.617562,2458411.896052,2458455.554593, -2458457.734253,2458479.568743,2458489.383454,2458489.387804,2458490.477904,2458490.482824,2458501.391674,2458501.392014,2458501.396544,2458513.402254, -2458537.407634,2458538.507734,2458837.550156,2458848.461686,2458859.375956,2458860.465876,2458860.469616,2458871.379136,2458871.382556,2458872.470796, -2458883.387165,2458883.389555,2458884.478175,2458884.478425,2458884.479455,2458906.306925,2458930.332215,2459147.510251,2459171.522921,2459172.608741, -2459172.617851,2459183.531910,2459193.352480,2459194.442340,2459194.443610,2459196.623950,2459197.719250,2459220.632699,2459242.461499,2459265.384258, -2459265.384318,2459505.495609,2459553.514627,2459553.515137,2459564.427746,2459565.520376,2459566.615006,2459576.438096]) + 2457025.7867,2457347.7655,2457694.8263,2458112.8495,2458492.6454,2459532.7834,2459604.81036,2459604.8137,2459614.6365,2459616.8209, + 2459651.7466,2459903.8588,2459914.7783,2459915.8684,2459925.6921,2459939.8793,2459949.7047,2459959.5249,2459962.8037,2459973.7129, + 2459974.798,2459986.8057,2459994.4489,2460009.7312,2458867.01587,2459501.1295, + + #ExoClock transit times array + 2454508.977,2454515.525,2454801.477,2454840.769,2455123.447,2455140.91,2455147.459,2455147.459,2455148.551,2455148.552,2455158.372, + 2455158.373,2455159.464,2455159.467,2455160.556,2455163.831,2455172.562,2455192.205,2455209.669,2455210.762,2455215.129,2455230.407, + 2455238.046,2455254.419,2455265.331,2455494.53,2455494.531,2455509.81,2455510.902,2455530.547,2455542.553,2455548.011,2455565.472, + 2455566.563,2455575.296,2455575.297,2455578.569,2455589.483,2455590.576,2455598.216,2455600.397,2455600.398,2455600.398,2455601.49, + 2455601.49,2455601.49,2455603.673,2455612.404,2455623.318,2455623.319,2455624.41,2455624.41,2455663.702,2455842.693,2455842.694, + 2455876.528,2455887.442,2455887.442,2455887.442,2455888.533,2455888.534,2455888.534,2455889.625,2455890.716,2455901.63,2455903.814, + 2455903.814,2455920.185,2455923.459,2455926.733,2455939.829,2455945.287,2455946.378,2455946.379,2455947.47,2455948.561,2455951.835, + 2455952.927,2455959.475,2455960.567,2455970.39,2455971.481,2455981.304,2455982.395,2455983.487,2455984.578,2455985.67,2455996.584, + 2456000.95,2456005.315,2456006.406,2456014.046,2456175.577,2456245.427,2456249.794,2456273.805,2456282.536,2456284.719,2456297.816, + 2456302.182,2456305.455,2456319.644,2456328.376,2456329.467,2456604.505,2456605.596,2456606.688,2456607.779,2456629.607,2456630.699, + 2456654.71,2456659.076,2456662.35,2456663.441,2456664.533,2456674.356,2456677.63,2456688.544,2456694.002,2456703.824,2456711.464, + 2456719.104,2456721.287,2456722.378,2456986.502,2457010.513,2457012.696,2457033.434,2457045.438,2457046.53,2457059.627,2457060.718, + 2457067.267,2457068.358,2457103.284,2457345.579,2457368.5,2457378.321,2457390.327,2457391.418,2457426.343,2457426.344,2457427.435, + 2457451.446,2457474.364,2457486.372,2457671.913,2457691.559,2457703.564,2457706.838,2457726.484,2457727.575,2457760.318,2457765.775, + 2457766.866,2457772.324,2457773.415,2457776.689,2457786.512,2457788.695,2457800.7,2457808.34,2457809.432,2457809.434,2457810.523, + 2457832.348,2457832.351,2458026.624,2458050.635,2458060.459,2458072.462,2458073.555,2458074.647,2458077.921,2458123.76,2458124.852, + 2458132.491,2458134.675,2458136.858,2458155.41,2458155.412,2458156.503,2458159.778,2458166.326,2458178.331,2458214.347,2458411.895, + 2458467.557,2458471.923,2458478.472,2458479.564,2458490.477,2458494.843,2458501.39,2458501.392,2458506.848,2458536.315,2458537.408, + 2458871.382,2458880.113,2458883.384,2458893.209,2458903.032,2459088.575,2459148.602,2459156.242,2459157.334,2459190.076,2459194.441, + 2459194.443,2459196.623,2459197.717,2459204.264, + + #ETD mid transit times array + 2454508.976854,2454836.403393,2454840.768603,2454840.771193,2454908.437992,2454931.358182,2455164.923956,2455164.924316,2455172.561816,2455172.562786, + 2455198.756735,2455230.406730,2455254.418870,2455256.596033,2455265.334053,2455506.533285,2455509.808915,2455519.632074,2455532.729964,2455541.461084, + 2455576.387242,2455577.475172,2455577.476782,2455577.477112,2455578.568422,2455593.850192,2455600.398282,2455601.489211,2455603.671161,2455612.400801, + 2455612.401321,2455615.675911,2455647.328760,2455857.973783,2455857.973783,2455867.797832,2455873.253612,2455877.618482,2455877.619162,2455889.623302, + 2455899.448441,2455899.451251,2455900.539781,2455904.905271,2455905.995241,2455912.544561,2455912.544561,2455913.636131,2455914.726741,2455922.370121, + 2455928.913321,2455936.552560,2455936.561520,2455937.645430,2455938.738730,2455946.383030,2455947.468480,2455949.650900,2455949.650900,2455950.742510, + 2455957.287600,2455957.294400,2455957.296780,2455957.296780,2455961.659130,2455962.749930,2455970.392369,2455982.394919,2455993.309869,2455993.313119, + 2455994.398719,2455994.399359,2456003.129689,2456003.130169,2456005.315328,2456222.509695,2456246.516835,2456249.793845,2456269.425195,2456271.623265, + 2456296.724384,2456304.364534,2456304.365804,2456304.367454,2456304.367784,2456329.469294,2456364.392544,2456584.860173,2456595.772813,2456596.866383, + 2456604.503073,2456608.869564,2456616.511354,2456626.333324,2456627.429034,2456628.515004,2456628.517074,2456630.699754,2456639.430344,2456639.432894, + 2456640.522554,2456641.610274,2456650.341584,2456663.443614,2456688.544734,2456722.372535,2456722.382615,2456734.383505,2456734.388675,2456746.385515, + 2456746.391885,2456927.546138,2456950.485119,2456960.306869,2456963.578439,2456963.578959,2456963.582479,2456986.501140,2456998.508180,2456998.508180, + 2457032.333311,2457033.433561,2457069.448912,2457080.367572,2457080.367572,2457092.368353,2457344.486723,2457344.488693,2457345.578813,2457345.579833, + 2457356.493733,2457357.585013,2457357.586493,2457368.498964,2457368.499654,2457369.589474,2457379.414424,2457379.414424,2457414.334726,2457426.343356, + 2457451.447237,2457474.364078,2457474.364348,2457486.371248,2457668.637786,2457726.484138,2457749.405049,2457750.494949,2457751.585649,2457751.586939, + 2457757.043281,2457758.134851,2457760.317471,2457760.318171,2457761.408951,2457770.140361,2457772.327372,2457773.415162,2457774.506522,2457809.431273, + 2457809.435043,2457832.350874,2458087.745843,2458096.474134,2458109.571734,2458131.400315,2458396.615162,2458396.617562,2458411.896052,2458455.554593, + 2458457.734253,2458479.568743,2458489.383454,2458489.387804,2458490.477904,2458490.482824,2458501.391674,2458501.392014,2458501.396544,2458513.402254, + 2458537.407634,2458538.507734,2458837.550156,2458848.461686,2458859.375956,2458860.465876,2458860.469616,2458871.379136,2458871.382556,2458872.470796, + 2458883.387165,2458883.389555,2458884.478175,2458884.478425,2458884.479455,2458906.306925,2458930.332215,2459147.510251,2459171.522921,2459172.608741, + 2459172.617851,2459183.531910,2459193.352480,2459194.442340,2459194.443610,2459196.623950,2459197.719250,2459220.632699,2459242.461499,2459265.384258, + 2459265.384318,2459505.495609,2459553.514627,2459553.515137,2459564.427746,2459565.520376,2459566.615006,2459576.438096]) Tc_error = np.array([ 0.0039,0.0058,0.0054,0.0022,0.0065,0.0024,0.00091,0.00097,0.0022,0.0018, -0.002,0.0021,0.0065,0.0036,0.0071,0.0031,0.0044,0.0021,0.0028,0.0023, -0.0039,0.0071,0.0015,0.0055,0.00092,0.00092, - -#ExoClock error array -0.0002,0.00013,0.00041,0.00047,0.0007,0.000417,0.0009,0.00042,0.001,0.0013,0.00057, -0.0013,0.00095,0.00061,0.0007,0.000324,0.00044,0.0005,0.000463,0.000405,0.00082,0.00011, -0.00066,0.00014,0.0016,0.00048,0.00063,0.00037,0.000313,0.00077,0.00029,0.00024,0.0011, -0.00022,0.00063,0.00079,0.0008,0.00094,0.001,0.00036,0.00083,0.00026,0.00078,0.000289, -0.00017,0.00039,0.001,0.00088,0.0009,0.00054,0.00086,0.0014,0.00063,0.00093,0.0013, -0.0003,0.00038,0.00062,0.00075,0.00059,0.0003,0.00038,0.0009,0.00023,0.00083,0.00093, -0.000324,0.00046,0.0002,0.00092,0.0019,0.00079,0.00036,0.00034,0.00022,0.00028,0.00011, -0.0001,0.00018,0.0004,0.00029,0.00029,0.00094,0.00047,0.00029,0.000324,0.000417,0.00037, -0.0004,0.00038,0.0004,0.00023,0.00033,0.00033,0.000394,0.000301,0.0003,0.000301,0.000301, -0.00046,0.00026,0.000382,0.00027,0.00029,0.0002,0.0003,0.00034,0.000706,0.00019,0.00043, -0.000336,0.00034,0.00019,0.00019,0.00032,0.00028,0.000324,0.00041,0.00029,0.00029,0.00026, -0.00034,0.00034,0.00046,0.00043,0.00039,0.000486,0.0005,0.00049,0.00049,0.000347,0.000359, -0.00022,0.00021,0.0003,0.00042,0.0004,0.0013,0.00034,0.00033,0.00055,0.0006,0.00023,0.00021, -0.0007,0.0013,0.00035,0.00025,0.00034,0.00037,0.00028,0.00023,0.0006,0.00028,0.00039, -0.00024,0.00022,0.00029,0.00026,0.00048,0.00032,0.0004,0.00018,0.0009,0.00021,0.0006, -0.0006,0.00056,0.00023,0.0003,0.0003,0.00022,0.00034,0.00028,0.00027,0.00035,0.00031, -0.00032,0.00033,0.0005,0.00031,0.00032,0.00091,0.00034,0.00038,0.0017,0.0004,0.0005, -0.00026,0.0006,0.0006,0.0008,0.0003,0.0009,0.0003,0.00044,0.0008,0.0007,0.0009, -0.0003,0.0007,0.0005,0.0003,0.0013,0.0007,0.0003,0.0004,0.0003,0.0012,0.0006, -0.0005,0.0013,0.0004, - -#ETD error array -0.000200,0.000600,0.000470,0.001000,0.001000,0.000980,0.001490,0.001290,0.000440,0.000140, -0.001410,0.000110,0.000140,0.000590,0.001290,0.001120,0.000870,0.000700,0.000350,0.000500, -0.001350,0.000380,0.000690,0.000850,0.000820,0.000470,0.000420,0.001090,0.000940,0.000830, -0.000780,0.000540,0.001730,0.000710,0.000710,0.000750,0.001260,0.000920,0.001290,0.000730, -0.000630,0.000570,0.000380,0.001030,0.001350,0.000570,0.000570,0.000780,0.000470,0.000900, -0.000730,0.000910,0.001230,0.001190,0.000720,0.000770,0.001020,0.000590,0.000590,0.000660, -0.001100,0.001040,0.000570,0.000570,0.001070,0.001320,0.000860,0.001160,0.000600,0.000760, -0.000680,0.000760,0.000630,0.000600,0.000440,0.000810,0.000740,0.000670,0.000900,0.000550, -0.000520,0.001460,0.000890,0.001560,0.000580,0.001640,0.001170,0.000510,0.000960,0.000510, -0.000920,0.000710,0.000900,0.000510,0.001050,0.000970,0.000880,0.000440,0.000740,0.000680, -0.000820,0.000800,0.001040,0.000760,0.000540,0.000890,0.001080,0.001120,0.000730,0.001390, -0.001410,0.001640,0.000740,0.000570,0.000930,0.000890,0.000610,0.000510,0.001450,0.001450, -0.001130,0.000460,0.000510,0.001190,0.001190,0.000600,0.000650,0.001070,0.001090,0.000490, -0.000610,0.000520,0.000430,0.000580,0.000460,0.000340,0.000890,0.000890,0.001310,0.000650, -0.000860,0.000770,0.000550,0.001350,0.000820,0.000550,0.000840,0.000530,0.000940,0.000720, -0.000370,0.000520,0.000670,0.001030,0.000630,0.000330,0.000990,0.000550,0.000620,0.000720, -0.000940,0.000580,0.000350,0.000570,0.001380,0.000640,0.001180,0.000700,0.000700,0.000710, -0.000550,0.000580,0.000680,0.001030,0.000860,0.000850,0.000300,0.000760,0.000680,0.000820, -0.000610,0.001450,0.000730,0.000700,0.001350,0.000820,0.000670,0.000940,0.000490,0.001130, -0.000540,0.000540,0.000700,0.000790,0.000840,0.000600,0.000520,0.000730,0.000640,0.001020, -0.000780,0.000610,0.001330,0.000770,0.000610,0.000520,0.001130,0.001130,0.000530,0.000780, -0.000420,0.001250,0.000380,0.000720,0.000860,0.000470,0.000950,0.000540]) + 0.002,0.0021,0.0065,0.0036,0.0071,0.0031,0.0044,0.0021,0.0028,0.0023, + 0.0039,0.0071,0.0015,0.0055,0.00092,0.00092, + + #ExoClock error array + 0.0002,0.00013,0.00041,0.00047,0.0007,0.000417,0.0009,0.00042,0.001,0.0013,0.00057, + 0.0013,0.00095,0.00061,0.0007,0.000324,0.00044,0.0005,0.000463,0.000405,0.00082,0.00011, + 0.00066,0.00014,0.0016,0.00048,0.00063,0.00037,0.000313,0.00077,0.00029,0.00024,0.0011, + 0.00022,0.00063,0.00079,0.0008,0.00094,0.001,0.00036,0.00083,0.00026,0.00078,0.000289, + 0.00017,0.00039,0.001,0.00088,0.0009,0.00054,0.00086,0.0014,0.00063,0.00093,0.0013, + 0.0003,0.00038,0.00062,0.00075,0.00059,0.0003,0.00038,0.0009,0.00023,0.00083,0.00093, + 0.000324,0.00046,0.0002,0.00092,0.0019,0.00079,0.00036,0.00034,0.00022,0.00028,0.00011, + 0.0001,0.00018,0.0004,0.00029,0.00029,0.00094,0.00047,0.00029,0.000324,0.000417,0.00037, + 0.0004,0.00038,0.0004,0.00023,0.00033,0.00033,0.000394,0.000301,0.0003,0.000301,0.000301, + 0.00046,0.00026,0.000382,0.00027,0.00029,0.0002,0.0003,0.00034,0.000706,0.00019,0.00043, + 0.000336,0.00034,0.00019,0.00019,0.00032,0.00028,0.000324,0.00041,0.00029,0.00029,0.00026, + 0.00034,0.00034,0.00046,0.00043,0.00039,0.000486,0.0005,0.00049,0.00049,0.000347,0.000359, + 0.00022,0.00021,0.0003,0.00042,0.0004,0.0013,0.00034,0.00033,0.00055,0.0006,0.00023,0.00021, + 0.0007,0.0013,0.00035,0.00025,0.00034,0.00037,0.00028,0.00023,0.0006,0.00028,0.00039, + 0.00024,0.00022,0.00029,0.00026,0.00048,0.00032,0.0004,0.00018,0.0009,0.00021,0.0006, + 0.0006,0.00056,0.00023,0.0003,0.0003,0.00022,0.00034,0.00028,0.00027,0.00035,0.00031, + 0.00032,0.00033,0.0005,0.00031,0.00032,0.00091,0.00034,0.00038,0.0017,0.0004,0.0005, + 0.00026,0.0006,0.0006,0.0008,0.0003,0.0009,0.0003,0.00044,0.0008,0.0007,0.0009, + 0.0003,0.0007,0.0005,0.0003,0.0013,0.0007,0.0003,0.0004,0.0003,0.0012,0.0006, + 0.0005,0.0013,0.0004, + + #ETD error array + 0.000200,0.000600,0.000470,0.001000,0.001000,0.000980,0.001490,0.001290,0.000440,0.000140, + 0.001410,0.000110,0.000140,0.000590,0.001290,0.001120,0.000870,0.000700,0.000350,0.000500, + 0.001350,0.000380,0.000690,0.000850,0.000820,0.000470,0.000420,0.001090,0.000940,0.000830, + 0.000780,0.000540,0.001730,0.000710,0.000710,0.000750,0.001260,0.000920,0.001290,0.000730, + 0.000630,0.000570,0.000380,0.001030,0.001350,0.000570,0.000570,0.000780,0.000470,0.000900, + 0.000730,0.000910,0.001230,0.001190,0.000720,0.000770,0.001020,0.000590,0.000590,0.000660, + 0.001100,0.001040,0.000570,0.000570,0.001070,0.001320,0.000860,0.001160,0.000600,0.000760, + 0.000680,0.000760,0.000630,0.000600,0.000440,0.000810,0.000740,0.000670,0.000900,0.000550, + 0.000520,0.001460,0.000890,0.001560,0.000580,0.001640,0.001170,0.000510,0.000960,0.000510, + 0.000920,0.000710,0.000900,0.000510,0.001050,0.000970,0.000880,0.000440,0.000740,0.000680, + 0.000820,0.000800,0.001040,0.000760,0.000540,0.000890,0.001080,0.001120,0.000730,0.001390, + 0.001410,0.001640,0.000740,0.000570,0.000930,0.000890,0.000610,0.000510,0.001450,0.001450, + 0.001130,0.000460,0.000510,0.001190,0.001190,0.000600,0.000650,0.001070,0.001090,0.000490, + 0.000610,0.000520,0.000430,0.000580,0.000460,0.000340,0.000890,0.000890,0.001310,0.000650, + 0.000860,0.000770,0.000550,0.001350,0.000820,0.000550,0.000840,0.000530,0.000940,0.000720, + 0.000370,0.000520,0.000670,0.001030,0.000630,0.000330,0.000990,0.000550,0.000620,0.000720, + 0.000940,0.000580,0.000350,0.000570,0.001380,0.000640,0.001180,0.000700,0.000700,0.000710, + 0.000550,0.000580,0.000680,0.001030,0.000860,0.000850,0.000300,0.000760,0.000680,0.000820, + 0.000610,0.001450,0.000730,0.000700,0.001350,0.000820,0.000670,0.000940,0.000490,0.001130, + 0.000540,0.000540,0.000700,0.000790,0.000840,0.000600,0.000520,0.000730,0.000640,0.001020, + 0.000780,0.000610,0.001330,0.000770,0.000610,0.000520,0.001130,0.001130,0.000530,0.000780, + 0.000420,0.001250,0.000380,0.000720,0.000860,0.000470,0.000950,0.000540]) labels = np.full(len(Tc), 'EpW') - # # Tc = np.array([ # measured mid-transit times - # # 2459150.837905, 2459524.851045, - # # 2459546.613126, 2459565.643663, 2459584.690470, 2459584.686476, - # # 2459909.739104, 2459957.337739, 2459169.880602, 2458416.424861, - # # 2458428.664794, 2459145.400124, 2458430.025044, 2459164.440695, - # # 2458415.064846, 2458435.465269, 2458412.344658, 2459150.840070, - # # 2459160.360691, 2458431.384897, 2459146.760284, 2459154.920516, - # # 2458417.784945, 2459161.720466, 2459167.160761, 2458427.304939, - # # 2458413.705181, 2459163.080605, 2459153.560229, 2459168.520861, - # # 2458425.945068, 2459148.120269, 2458434.105274, 2458432.745423, - # # 2459152.200558, 2459165.800918, 2459159.000645, 2459149.480289, - # # 2455870.450027, 2456663.347570, 2457420.884390, 2457658.888900]) - - # # Tc_error = np.array([ - # # 0.001674, 0.000715, - # # 0.000758, 0.001560, 0.000371, 0.001651, - # # 0.000955, 0.000176, 0.000154, 0.000357, - # # 0.000381, 0.000141, 0.000362, 0.000149, - # # 0.000336, 0.000368, 0.000379, 0.000153, - # # 0.000153, 0.000349, 0.000149, 0.000146, - # # 0.000385, 0.000146, 0.000153, 0.000360, - # # 0.000356, 0.000147, 0.000147, 0.000146, - # # 0.000363, 0.000142, 0.000357, 0.000368, - # # 0.000160, 0.000160, 0.000151, 0.000160, - # # 0.000140, 0.000120, 0.000800, 0.000140]) - - # # labels for a legend - # labels = np.array(['TESS', 'TESS', - # 'TESS', 'EpW', 'ExoClock', 'Unistellar', - # 'TESS', 'EpW', 'ExoClock', 'Unistellar', - # 'TESS', 'EpW', 'ExoClock', 'Unistellar', - # 'TESS', 'EpW', 'ExoClock', 'Unistellar', - # 'TESS', 'EpW', 'ExoClock', 'Unistellar', - # 'TESS', 'EpW', 'ExoClock', 'Unistellar', - # 'TESS', 'EpW', 'ExoClock', 'Unistellar', - # 'TESS', 'EpW', 'ExoClock', 'Unistellar', - # 'TESS', 'EpW', 'ExoClock', 'Unistellar', - # 'TESS', 'EpW', 'ExoClock', 'Unistellar']) P = 1.0914203 # orbital period for your target Tc_norm = Tc - Tc.min() # normalize the data to the first observation - # print(Tc_norm) orbit = np.rint(Tc_norm / P) # number of orbits since first observation (rounded to nearest integer) - # print(orbit) # make a n x 2 matrix with 1's in the first column and values of orbit in the second A = np.vstack([np.ones(len(Tc)), orbit]).T @@ -1302,17 +1054,17 @@ def prior_transform(upars): # min and max values to search between for fitting bounds = { - 'm': [P - 0.1, P + 0.1], # orbital period - 'b': [intercept - 0.1, intercept + 0.1] # mid-transit time + 'P': [slope - 0.1, slope + 0.1], # orbital period + 'T0': [intercept - 0.1, intercept + 0.1] # mid-transit time } # used to plot red overlay in O-C figure prior = { - 'm': [slope, slope_std_dev], # value from WLS (replace with literature value) - 'b': [intercept, intercept_std_dev] # value from WLS (replace with literature value) + 'P': [slope, slope_std_dev], # value from WLS (replace with literature value) + 'T0': [intercept, intercept_std_dev] # value from WLS (replace with literature value) } - lf = linear_fitter(Tc, Tc_error, bounds, prior=prior, labels=labels) + lf = ephemeris_fitter(Tc, Tc_error, bounds, prior=prior, labels=labels) lf.plot_triangle() plt.subplots_adjust(top=0.9, hspace=0.2, wspace=0.2) @@ -1348,7 +1100,7 @@ def prior_transform(upars): 'dPdN': [0, 0.0001] # best guess } - nlf = non_linear_fitter(Tc, Tc_error, bounds, prior=prior, labels=labels) + nlf = decay_fitter(Tc, Tc_error, bounds, prior=prior, labels=labels) nlf.plot_triangle() plt.subplots_adjust(top=0.9, hspace=0.2, wspace=0.2) @@ -1367,64 +1119,4 @@ def prior_transform(upars): for key in nlf.parameters: print(f"Parameter {key} = {nlf.parameters[key]:.2e} +- {nlf.errors[key]:.2e}") - # TODO extend plot, BIC Values - - dude() - # mearth = u.M_earth.to(u.kg).value - msun = u.M_sun.to(u.kg) - mjup = u.M_jup.to(u.kg) - - # Parameters for N-body Retrieval - # read more about adding particles: https://rebound.readthedocs.io/en/latest/addingparticles/ - nbody_prior = [ - {'m':1.12}, # star - - {'m':0.28*mjup/msun, - 'P':lf.parameters['P'], # inner planet - 'inc':3.14159/2, - 'e':0, - 'omega':0}, - - {'m':0.988*mjup/msun, - 'P':lf.parameters['P']*3, # outer planet - 'inc':3.14159/2, - 'e':0, - 'omega':0 }, - ] - - - # specify data to fit - data = [ - {}, # data for star (e.g. RV) - {'Tc':Tc, 'Tc_err':Tc_error}, # data for inner planet (e.g. Mid-transit times) - {} # data for outer planet (e.g. Mid-transit times) - ] - - - # set up where to look for a solution - bounds = [ - - {}, # no bounds on star parameters - - { # bounds for inner planet - 'P': [nbody_prior[1]['P']-0.025, nbody_prior[1]['P']+0.025], # based on solution from linear fit - # mid-transit is automatically adjusted in the fitter class - }, - - { # bounds for outer planet - 'P':[lf.parameters['P']*1.75, lf.parameters['P']*4.25], # orbital period [day] - 'm':[0.1*mjup/msun,1.5*mjup/msun], # mass [msun] - #'e':[0,0.05], # eccentricity - #'omega':[-20*np.pi/180, 20*np.pi/180] # arg of periastron [radians] - } - ] - - # run the fitter - nfit = nbody_fitter(data, nbody_prior, bounds) - # todo how could I phase fold the data to just shorter nbody simulations? - - print(nfit.parameters) - print(nfit.errors) - - -# main() + # TODO BIC Values \ No newline at end of file diff --git a/exotic/api/nested_linear_fitter.py b/exotic/api/nested_linear_fitter.py index 1152dab1..a8dea534 100644 --- a/exotic/api/nested_linear_fitter.py +++ b/exotic/api/nested_linear_fitter.py @@ -904,522 +904,3 @@ def plot_triangle(self): hist_kwargs={'color': 'black', } ) return fig - - -def empty_data(N): # orbit parameters in Nbody simulation - return { - 'x':np.zeros(N), - 'y':np.zeros(N), - 'z':np.zeros(N), - 'P':np.zeros(N), - 'a':np.zeros(N), - 'e':np.zeros(N), - 'inc':np.zeros(N), - 'Omega':np.zeros(N), - 'omega':np.zeros(N), - 'M':np.zeros(N), - } - -def integrate(sim, objects, Ndays, Noutputs): - # ps is now an array of pointers and will change as the simulation runs - ps = sim.particles - - times = np.linspace(0., Ndays, Noutputs) # units of days - - pdata = [empty_data(Noutputs) for i in range(len(objects)-1)] - star = {'x':np.zeros(Noutputs),'y':np.zeros(Noutputs),'z':np.zeros(Noutputs) } - - # run simulation time steps - for i,time in enumerate(times): - sim.integrate(time) - - # record data - for k in star.keys(): - star[k][i] = getattr(ps[0], k) - - for j in range(1,len(objects)): - for k in pdata[j-1].keys(): - pdata[j-1][k][i] = getattr(ps[j],k) - - sim_data = ({ - 'pdata':pdata, - 'star':star, - 'times':times, - 'objects':objects, - 'dt': Noutputs/(Ndays*24*60*60) # conversion factor to get seconds for RV semi-amp - }) - - return sim_data - -def generate(objects, Ndays=None, Noutputs=None): - # create rebound simulation - # for object parameters see: - # https://rebound.readthedocs.io/en/latest/_modules/rebound/particle.html - sim = rebound.Simulation() - - # sim.integrator = "tes" - # sim.ri_tes.dq_max = 1e-2 - # sim.ri_tes.recti_per_orbit = 1.61803398875 - # sim.ri_tes.epsilon = 1e-6 - - # sim.integrator = "whfast" - # sim.ri_whfast.corrector = 5 - # sim.ri_whfast.safe_mode = 0 - sim.units = ('day', 'AU', 'Msun') - for i in range(len(objects)): - sim.add( **objects[i] ) - sim.move_to_com() - - if Ndays and Noutputs: - return integrate(sim, objects, Ndays, Noutputs) - else: - return sim - -def find_zero(t1,dx1, t2,dx2): - # find zero with linear interpolation - m = (dx2-dx1)/(t2-t1) - t0 = -dx1/m + t1 - return t0 - -def transit_times(xp,xs,times): - # check for sign change in position difference - dx = xp-xs - tt = [] - for i in range(1,len(dx)): - if dx[i-1] >= 0 and dx[i] <= 0: - tt.append( find_zero(times[i-1],dx[i-1], times[i],dx[i]) ) - return np.array(tt) - -def TTV(epochs, tt): - N = len(epochs) - A = np.vstack([np.ones(N), epochs]).T - b, m = np.linalg.lstsq(A, tt, rcond=None)[0] - ttv = (tt-m*np.array(epochs)-b) - return [ttv,m,b] - -class nbody_fitter(): - - def __init__(self, data, prior=None, bounds=None, verbose=True): - self.data = data - self.bounds = bounds - self.prior = prior - self.verbose = verbose - self.fit_nested() - - def fit_nested(self): - - # set up some arrays for mapping sampler output - freekeys = [] - boundarray = [] - for i,planet in enumerate(self.bounds): - for bound in planet: - freekeys.append(f"{i}_{bound}") - boundarray.append(planet[bound]) - - # find min and max time for simulation - min_time = np.min(self.data[1]['Tc']) - max_time = np.max(self.data[1]['Tc']) - # todo extend for multiplanet systems - - sim_time = (max_time-min_time)*1.05 - # TODO extend for multiplanet systems - Tc_norm = self.data[1]['Tc'] - min_time # normalize the data to the first observation - self.orbit = np.rint(Tc_norm / self.prior[1]['P']).astype(int) # number of orbits since first observation (rounded to nearest integer) - - # numpify - boundarray = np.array(boundarray) - bounddiff = np.diff(boundarray,1).reshape(-1) - - # create queue and save simulation to - def loglike(pars): - chi2 = 0 - - # set parameters - for i,par in enumerate(pars): - idx,key = freekeys[i].split('_') - idx = int(idx) - if key == 'tmid': - continue - # this dict goes to REBOUND and needs specific keys - self.prior[idx][key] = par - - # take difference between data and simulation - # run N-body simulation - sim_data = generate(self.prior, sim_time, int(sim_time*24)) # uses linspace behind the scenes - - # json structure with analytics of interest from the simulation - # ttv_data = analyze(sim_data) # slow - - sim_shift = 0 - # loop over planets, check for data - for i,planet in enumerate(self.prior): - if self.data[i]: - # compute transit times from N-body simulation - Tc_sim = transit_times( sim_data['pdata'][i-1]['x'], sim_data['star']['x'], sim_data['times'] ) - - # derive an offset in time from the first planet - if i-1==0: - sim_shift = Tc_sim.min() - - # shift the first mid-transit in simulation to observation - Tc_sim -= sim_shift # first orbit has tmid at 0 - - # scale Tc_sim to data - try: - residual = self.data[i]['Tc'] - Tc_sim[self.orbit] - except: - #import pdb; pdb.set_trace - #ttv,m,b = TTV(np.arange(Tc_sim.shape[0]), Tc_sim) - #ttv1,m1,b1 = TTV(self.orbit, self.data[i]['Tc']) - # could be unstable orbit or not enough data - # switch to average error and clip by max epoch? - print(self.prior) - chi2 += -1e6 - continue - - Tc_sim += residual.mean() - - # take difference between data and simulation - try: - chi2 += -0.5*np.sum(((self.data[i]['Tc'] - Tc_sim[self.orbit])/self.data[i]['Tc_err'])**2) - except: - chi2 += -1e6 - print(self.prior) - # usually unstable orbit - - return chi2 - - - def prior_transform(upars): - return (boundarray[:,0] + bounddiff*upars) - - if self.verbose: - self.results = ReactiveNestedSampler(freekeys, loglike, prior_transform).run(max_ncalls=1e5) - else: - self.results = ReactiveNestedSampler(freekeys, loglike, prior_transform).run(max_ncalls=1e5, show_status=self.verbose, viz_callback=self.verbose) - - self.errors = {} - self.quantiles = {} - self.parameters = copy.deepcopy(self.prior) - - #for i, key in enumerate(freekeys): - # self.parameters[key] = self.results['maximum_likelihood']['point'][i] - # self.errors[key] = self.results['posterior']['stdev'][i] - # self.quantiles[key] = [ - # self.results['posterior']['errlo'][i], - # self.results['posterior']['errup'][i]] - - -#def main(): -if __name__ == "__main__": - - Tc = np.array([ # measured mid-transit times - #Exoplanet Watch transit times array -2457025.7867,2457347.7655,2457694.8263,2458112.8495,2458492.6454,2459532.7834,2459604.81036,2459604.8137,2459614.6365,2459616.8209, -2459651.7466,2459903.8588,2459914.7783,2459915.8684,2459925.6921,2459939.8793,2459949.7047,2459959.5249,2459962.8037,2459973.7129, -2459974.798,2459986.8057,2459994.4489,2460009.7312,2458867.01587,2459501.1295, - -#ExoClock transit times array -2454508.977,2454515.525,2454801.477,2454840.769,2455123.447,2455140.91,2455147.459,2455147.459,2455148.551,2455148.552,2455158.372, -2455158.373,2455159.464,2455159.467,2455160.556,2455163.831,2455172.562,2455192.205,2455209.669,2455210.762,2455215.129,2455230.407, -2455238.046,2455254.419,2455265.331,2455494.53,2455494.531,2455509.81,2455510.902,2455530.547,2455542.553,2455548.011,2455565.472, -2455566.563,2455575.296,2455575.297,2455578.569,2455589.483,2455590.576,2455598.216,2455600.397,2455600.398,2455600.398,2455601.49, -2455601.49,2455601.49,2455603.673,2455612.404,2455623.318,2455623.319,2455624.41,2455624.41,2455663.702,2455842.693,2455842.694, -2455876.528,2455887.442,2455887.442,2455887.442,2455888.533,2455888.534,2455888.534,2455889.625,2455890.716,2455901.63,2455903.814, -2455903.814,2455920.185,2455923.459,2455926.733,2455939.829,2455945.287,2455946.378,2455946.379,2455947.47,2455948.561,2455951.835, -2455952.927,2455959.475,2455960.567,2455970.39,2455971.481,2455981.304,2455982.395,2455983.487,2455984.578,2455985.67,2455996.584, -2456000.95,2456005.315,2456006.406,2456014.046,2456175.577,2456245.427,2456249.794,2456273.805,2456282.536,2456284.719,2456297.816, -2456302.182,2456305.455,2456319.644,2456328.376,2456329.467,2456604.505,2456605.596,2456606.688,2456607.779,2456629.607,2456630.699, -2456654.71,2456659.076,2456662.35,2456663.441,2456664.533,2456674.356,2456677.63,2456688.544,2456694.002,2456703.824,2456711.464, -2456719.104,2456721.287,2456722.378,2456986.502,2457010.513,2457012.696,2457033.434,2457045.438,2457046.53,2457059.627,2457060.718, -2457067.267,2457068.358,2457103.284,2457345.579,2457368.5,2457378.321,2457390.327,2457391.418,2457426.343,2457426.344,2457427.435, -2457451.446,2457474.364,2457486.372,2457671.913,2457691.559,2457703.564,2457706.838,2457726.484,2457727.575,2457760.318,2457765.775, -2457766.866,2457772.324,2457773.415,2457776.689,2457786.512,2457788.695,2457800.7,2457808.34,2457809.432,2457809.434,2457810.523, -2457832.348,2457832.351,2458026.624,2458050.635,2458060.459,2458072.462,2458073.555,2458074.647,2458077.921,2458123.76,2458124.852, -2458132.491,2458134.675,2458136.858,2458155.41,2458155.412,2458156.503,2458159.778,2458166.326,2458178.331,2458214.347,2458411.895, -2458467.557,2458471.923,2458478.472,2458479.564,2458490.477,2458494.843,2458501.39,2458501.392,2458506.848,2458536.315,2458537.408, -2458871.382,2458880.113,2458883.384,2458893.209,2458903.032,2459088.575,2459148.602,2459156.242,2459157.334,2459190.076,2459194.441, -2459194.443,2459196.623,2459197.717,2459204.264, - -#ETD mid transit times array -2454508.976854,2454836.403393,2454840.768603,2454840.771193,2454908.437992,2454931.358182,2455164.923956,2455164.924316,2455172.561816,2455172.562786, -2455198.756735,2455230.406730,2455254.418870,2455256.596033,2455265.334053,2455506.533285,2455509.808915,2455519.632074,2455532.729964,2455541.461084, -2455576.387242,2455577.475172,2455577.476782,2455577.477112,2455578.568422,2455593.850192,2455600.398282,2455601.489211,2455603.671161,2455612.400801, -2455612.401321,2455615.675911,2455647.328760,2455857.973783,2455857.973783,2455867.797832,2455873.253612,2455877.618482,2455877.619162,2455889.623302, -2455899.448441,2455899.451251,2455900.539781,2455904.905271,2455905.995241,2455912.544561,2455912.544561,2455913.636131,2455914.726741,2455922.370121, -2455928.913321,2455936.552560,2455936.561520,2455937.645430,2455938.738730,2455946.383030,2455947.468480,2455949.650900,2455949.650900,2455950.742510, -2455957.287600,2455957.294400,2455957.296780,2455957.296780,2455961.659130,2455962.749930,2455970.392369,2455982.394919,2455993.309869,2455993.313119, -2455994.398719,2455994.399359,2456003.129689,2456003.130169,2456005.315328,2456222.509695,2456246.516835,2456249.793845,2456269.425195,2456271.623265, -2456296.724384,2456304.364534,2456304.365804,2456304.367454,2456304.367784,2456329.469294,2456364.392544,2456584.860173,2456595.772813,2456596.866383, -2456604.503073,2456608.869564,2456616.511354,2456626.333324,2456627.429034,2456628.515004,2456628.517074,2456630.699754,2456639.430344,2456639.432894, -2456640.522554,2456641.610274,2456650.341584,2456663.443614,2456688.544734,2456722.372535,2456722.382615,2456734.383505,2456734.388675,2456746.385515, -2456746.391885,2456927.546138,2456950.485119,2456960.306869,2456963.578439,2456963.578959,2456963.582479,2456986.501140,2456998.508180,2456998.508180, -2457032.333311,2457033.433561,2457069.448912,2457080.367572,2457080.367572,2457092.368353,2457344.486723,2457344.488693,2457345.578813,2457345.579833, -2457356.493733,2457357.585013,2457357.586493,2457368.498964,2457368.499654,2457369.589474,2457379.414424,2457379.414424,2457414.334726,2457426.343356, -2457451.447237,2457474.364078,2457474.364348,2457486.371248,2457668.637786,2457726.484138,2457749.405049,2457750.494949,2457751.585649,2457751.586939, -2457757.043281,2457758.134851,2457760.317471,2457760.318171,2457761.408951,2457770.140361,2457772.327372,2457773.415162,2457774.506522,2457809.431273, -2457809.435043,2457832.350874,2458087.745843,2458096.474134,2458109.571734,2458131.400315,2458396.615162,2458396.617562,2458411.896052,2458455.554593, -2458457.734253,2458479.568743,2458489.383454,2458489.387804,2458490.477904,2458490.482824,2458501.391674,2458501.392014,2458501.396544,2458513.402254, -2458537.407634,2458538.507734,2458837.550156,2458848.461686,2458859.375956,2458860.465876,2458860.469616,2458871.379136,2458871.382556,2458872.470796, -2458883.387165,2458883.389555,2458884.478175,2458884.478425,2458884.479455,2458906.306925,2458930.332215,2459147.510251,2459171.522921,2459172.608741, -2459172.617851,2459183.531910,2459193.352480,2459194.442340,2459194.443610,2459196.623950,2459197.719250,2459220.632699,2459242.461499,2459265.384258, -2459265.384318,2459505.495609,2459553.514627,2459553.515137,2459564.427746,2459565.520376,2459566.615006,2459576.438096]) - - Tc_error = np.array([ - 0.0039,0.0058,0.0054,0.0022,0.0065,0.0024,0.00091,0.00097,0.0022,0.0018, -0.002,0.0021,0.0065,0.0036,0.0071,0.0031,0.0044,0.0021,0.0028,0.0023, -0.0039,0.0071,0.0015,0.0055,0.00092,0.00092, - -#ExoClock error array -0.0002,0.00013,0.00041,0.00047,0.0007,0.000417,0.0009,0.00042,0.001,0.0013,0.00057, -0.0013,0.00095,0.00061,0.0007,0.000324,0.00044,0.0005,0.000463,0.000405,0.00082,0.00011, -0.00066,0.00014,0.0016,0.00048,0.00063,0.00037,0.000313,0.00077,0.00029,0.00024,0.0011, -0.00022,0.00063,0.00079,0.0008,0.00094,0.001,0.00036,0.00083,0.00026,0.00078,0.000289, -0.00017,0.00039,0.001,0.00088,0.0009,0.00054,0.00086,0.0014,0.00063,0.00093,0.0013, -0.0003,0.00038,0.00062,0.00075,0.00059,0.0003,0.00038,0.0009,0.00023,0.00083,0.00093, -0.000324,0.00046,0.0002,0.00092,0.0019,0.00079,0.00036,0.00034,0.00022,0.00028,0.00011, -0.0001,0.00018,0.0004,0.00029,0.00029,0.00094,0.00047,0.00029,0.000324,0.000417,0.00037, -0.0004,0.00038,0.0004,0.00023,0.00033,0.00033,0.000394,0.000301,0.0003,0.000301,0.000301, -0.00046,0.00026,0.000382,0.00027,0.00029,0.0002,0.0003,0.00034,0.000706,0.00019,0.00043, -0.000336,0.00034,0.00019,0.00019,0.00032,0.00028,0.000324,0.00041,0.00029,0.00029,0.00026, -0.00034,0.00034,0.00046,0.00043,0.00039,0.000486,0.0005,0.00049,0.00049,0.000347,0.000359, -0.00022,0.00021,0.0003,0.00042,0.0004,0.0013,0.00034,0.00033,0.00055,0.0006,0.00023,0.00021, -0.0007,0.0013,0.00035,0.00025,0.00034,0.00037,0.00028,0.00023,0.0006,0.00028,0.00039, -0.00024,0.00022,0.00029,0.00026,0.00048,0.00032,0.0004,0.00018,0.0009,0.00021,0.0006, -0.0006,0.00056,0.00023,0.0003,0.0003,0.00022,0.00034,0.00028,0.00027,0.00035,0.00031, -0.00032,0.00033,0.0005,0.00031,0.00032,0.00091,0.00034,0.00038,0.0017,0.0004,0.0005, -0.00026,0.0006,0.0006,0.0008,0.0003,0.0009,0.0003,0.00044,0.0008,0.0007,0.0009, -0.0003,0.0007,0.0005,0.0003,0.0013,0.0007,0.0003,0.0004,0.0003,0.0012,0.0006, -0.0005,0.0013,0.0004, - -#ETD error array -0.000200,0.000600,0.000470,0.001000,0.001000,0.000980,0.001490,0.001290,0.000440,0.000140, -0.001410,0.000110,0.000140,0.000590,0.001290,0.001120,0.000870,0.000700,0.000350,0.000500, -0.001350,0.000380,0.000690,0.000850,0.000820,0.000470,0.000420,0.001090,0.000940,0.000830, -0.000780,0.000540,0.001730,0.000710,0.000710,0.000750,0.001260,0.000920,0.001290,0.000730, -0.000630,0.000570,0.000380,0.001030,0.001350,0.000570,0.000570,0.000780,0.000470,0.000900, -0.000730,0.000910,0.001230,0.001190,0.000720,0.000770,0.001020,0.000590,0.000590,0.000660, -0.001100,0.001040,0.000570,0.000570,0.001070,0.001320,0.000860,0.001160,0.000600,0.000760, -0.000680,0.000760,0.000630,0.000600,0.000440,0.000810,0.000740,0.000670,0.000900,0.000550, -0.000520,0.001460,0.000890,0.001560,0.000580,0.001640,0.001170,0.000510,0.000960,0.000510, -0.000920,0.000710,0.000900,0.000510,0.001050,0.000970,0.000880,0.000440,0.000740,0.000680, -0.000820,0.000800,0.001040,0.000760,0.000540,0.000890,0.001080,0.001120,0.000730,0.001390, -0.001410,0.001640,0.000740,0.000570,0.000930,0.000890,0.000610,0.000510,0.001450,0.001450, -0.001130,0.000460,0.000510,0.001190,0.001190,0.000600,0.000650,0.001070,0.001090,0.000490, -0.000610,0.000520,0.000430,0.000580,0.000460,0.000340,0.000890,0.000890,0.001310,0.000650, -0.000860,0.000770,0.000550,0.001350,0.000820,0.000550,0.000840,0.000530,0.000940,0.000720, -0.000370,0.000520,0.000670,0.001030,0.000630,0.000330,0.000990,0.000550,0.000620,0.000720, -0.000940,0.000580,0.000350,0.000570,0.001380,0.000640,0.001180,0.000700,0.000700,0.000710, -0.000550,0.000580,0.000680,0.001030,0.000860,0.000850,0.000300,0.000760,0.000680,0.000820, -0.000610,0.001450,0.000730,0.000700,0.001350,0.000820,0.000670,0.000940,0.000490,0.001130, -0.000540,0.000540,0.000700,0.000790,0.000840,0.000600,0.000520,0.000730,0.000640,0.001020, -0.000780,0.000610,0.001330,0.000770,0.000610,0.000520,0.001130,0.001130,0.000530,0.000780, -0.000420,0.001250,0.000380,0.000720,0.000860,0.000470,0.000950,0.000540]) - - labels = np.full(len(Tc), 'EpW') - # # Tc = np.array([ # measured mid-transit times - # # 2459150.837905, 2459524.851045, - # # 2459546.613126, 2459565.643663, 2459584.690470, 2459584.686476, - # # 2459909.739104, 2459957.337739, 2459169.880602, 2458416.424861, - # # 2458428.664794, 2459145.400124, 2458430.025044, 2459164.440695, - # # 2458415.064846, 2458435.465269, 2458412.344658, 2459150.840070, - # # 2459160.360691, 2458431.384897, 2459146.760284, 2459154.920516, - # # 2458417.784945, 2459161.720466, 2459167.160761, 2458427.304939, - # # 2458413.705181, 2459163.080605, 2459153.560229, 2459168.520861, - # # 2458425.945068, 2459148.120269, 2458434.105274, 2458432.745423, - # # 2459152.200558, 2459165.800918, 2459159.000645, 2459149.480289, - # # 2455870.450027, 2456663.347570, 2457420.884390, 2457658.888900]) - - # # Tc_error = np.array([ - # # 0.001674, 0.000715, - # # 0.000758, 0.001560, 0.000371, 0.001651, - # # 0.000955, 0.000176, 0.000154, 0.000357, - # # 0.000381, 0.000141, 0.000362, 0.000149, - # # 0.000336, 0.000368, 0.000379, 0.000153, - # # 0.000153, 0.000349, 0.000149, 0.000146, - # # 0.000385, 0.000146, 0.000153, 0.000360, - # # 0.000356, 0.000147, 0.000147, 0.000146, - # # 0.000363, 0.000142, 0.000357, 0.000368, - # # 0.000160, 0.000160, 0.000151, 0.000160, - # # 0.000140, 0.000120, 0.000800, 0.000140]) - - # # labels for a legend - # labels = np.array(['TESS', 'TESS', - # 'TESS', 'EpW', 'ExoClock', 'Unistellar', - # 'TESS', 'EpW', 'ExoClock', 'Unistellar', - # 'TESS', 'EpW', 'ExoClock', 'Unistellar', - # 'TESS', 'EpW', 'ExoClock', 'Unistellar', - # 'TESS', 'EpW', 'ExoClock', 'Unistellar', - # 'TESS', 'EpW', 'ExoClock', 'Unistellar', - # 'TESS', 'EpW', 'ExoClock', 'Unistellar', - # 'TESS', 'EpW', 'ExoClock', 'Unistellar', - # 'TESS', 'EpW', 'ExoClock', 'Unistellar', - # 'TESS', 'EpW', 'ExoClock', 'Unistellar']) - - P = 1.0914203 # orbital period for your target - - Tc_norm = Tc - Tc.min() # normalize the data to the first observation - # print(Tc_norm) - orbit = np.rint(Tc_norm / P) # number of orbits since first observation (rounded to nearest integer) - # print(orbit) - - # make a n x 2 matrix with 1's in the first column and values of orbit in the second - A = np.vstack([np.ones(len(Tc)), orbit]).T - - # perform the weighted least squares regression - res = sm.WLS(Tc, A, weights=1.0 / Tc_error ** 2).fit() - # use sm.WLS for weighted LS, sm.OLS for ordinary LS, or sm.GLS for general LS - - params = res.params # retrieve the slope and intercept of the fit from res - std_dev = np.sqrt(np.diagonal(res.normalized_cov_params)) - - slope = params[1] - slope_std_dev = std_dev[1] - intercept = params[0] - intercept_std_dev = std_dev[0] - - # 3 sigma clip based on residuals - calculated = orbit * slope + intercept - residuals = (Tc - calculated) / Tc_error - mask = np.abs(residuals) < 3 - Tc = Tc[mask] - Tc_error = Tc_error[mask] - labels = labels[mask] - - # print(res.summary()) - # print("Params =",params) - # print("Error matrix =",res.normalized_cov_params) - # print("Standard Deviations =",std_dev) - - print("Weighted Linear Least Squares Solution") - print("T0 =", intercept, "+-", intercept_std_dev) - print("P =", slope, "+-", slope_std_dev) - - # min and max values to search between for fitting - bounds = { - 'm': [P - 0.1, P + 0.1], # orbital period - 'b': [intercept - 0.1, intercept + 0.1] # mid-transit time - } - - # used to plot red overlay in O-C figure - prior = { - 'm': [slope, slope_std_dev], # value from WLS (replace with literature value) - 'b': [intercept, intercept_std_dev] # value from WLS (replace with literature value) - } - - lf = linear_fitter(Tc, Tc_error, bounds, prior=prior, labels=labels) - - lf.plot_triangle() - plt.subplots_adjust(top=0.9, hspace=0.2, wspace=0.2) - plt.savefig("posterior.png") - plt.close() - print("image saved to: posterior.png") - - fig, ax = lf.plot_oc() - plt.tight_layout() - plt.savefig("oc.png") - plt.show() - plt.close() - print("image saved to: oc.png") - - fig, ax = lf.plot_periodogram() - plt.tight_layout() - plt.savefig("periodogram.png") - plt.close() - print("image saved to: periodogram.png") - - - # min and max values to search between for fitting - bounds = { - 'P': [P - 0.1, P + 0.1], # orbital period - 't0': [intercept - 0.1, intercept + 0.1], # mid-transit time - 'dPdN': [-0.00001, 0.00001] # dPdN - } - - # used to plot red overlay in O-C figure - prior = { - 'P': [slope, slope_std_dev], # value from WLS (replace with literature value) - 't0': [intercept, intercept_std_dev], # value from WLS (replace with literature value) - 'dPdN': [0, 0.0001] # best guess - } - - nlf = non_linear_fitter(Tc, Tc_error, bounds, prior=prior, labels=labels) - - nlf.plot_triangle() - plt.subplots_adjust(top=0.9, hspace=0.2, wspace=0.2) - plt.savefig("nl_posterior.png") - plt.close() - print("image saved to: nl_posterior.png") - - nfig, ax = nlf.plot_oc() - plt.tight_layout() - plt.savefig("nl_oc.png") - plt.show() - plt.close() - print("image saved to: nl_oc.png") - - # for each free key print parameter and error - for key in nlf.parameters: - print(f"Parameter {key} = {nlf.parameters[key]:.2e} +- {nlf.errors[key]:.2e}") - - # TODO extend plot, BIC Values - - dude() - # mearth = u.M_earth.to(u.kg).value - msun = u.M_sun.to(u.kg) - mjup = u.M_jup.to(u.kg) - - # Parameters for N-body Retrieval - # read more about adding particles: https://rebound.readthedocs.io/en/latest/addingparticles/ - nbody_prior = [ - {'m':1.12}, # star - - {'m':0.28*mjup/msun, - 'P':lf.parameters['P'], # inner planet - 'inc':3.14159/2, - 'e':0, - 'omega':0}, - - {'m':0.988*mjup/msun, - 'P':lf.parameters['P']*3, # outer planet - 'inc':3.14159/2, - 'e':0, - 'omega':0 }, - ] - - - # specify data to fit - data = [ - {}, # data for star (e.g. RV) - {'Tc':Tc, 'Tc_err':Tc_error}, # data for inner planet (e.g. Mid-transit times) - {} # data for outer planet (e.g. Mid-transit times) - ] - - - # set up where to look for a solution - bounds = [ - - {}, # no bounds on star parameters - - { # bounds for inner planet - 'P': [nbody_prior[1]['P']-0.025, nbody_prior[1]['P']+0.025], # based on solution from linear fit - # mid-transit is automatically adjusted in the fitter class - }, - - { # bounds for outer planet - 'P':[lf.parameters['P']*1.75, lf.parameters['P']*4.25], # orbital period [day] - 'm':[0.1*mjup/msun,1.5*mjup/msun], # mass [msun] - #'e':[0,0.05], # eccentricity - #'omega':[-20*np.pi/180, 20*np.pi/180] # arg of periastron [radians] - } - ] - - # run the fitter - nfit = nbody_fitter(data, nbody_prior, bounds) - # todo how could I phase fold the data to just shorter nbody simulations? - - print(nfit.parameters) - print(nfit.errors) - - -# main() From 42103c05601926086c3aa5c356ddae8e23a84645 Mon Sep 17 00:00:00 2001 From: Kyle Pearson Date: Tue, 24 Oct 2023 09:51:35 -0700 Subject: [PATCH 2/6] nbody prior estimate --- exotic/api/ephemeris.py | 27 +- exotic/api/nbody.py | 754 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 775 insertions(+), 6 deletions(-) create mode 100644 exotic/api/nbody.py diff --git a/exotic/api/ephemeris.py b/exotic/api/ephemeris.py index 6e2ef3b8..8ca336a1 100644 --- a/exotic/api/ephemeris.py +++ b/exotic/api/ephemeris.py @@ -71,7 +71,10 @@ def __init__(self, data, dataerr, bounds=None, prior=None, labels=None, verbose= self.data = data self.dataerr = dataerr self.bounds = bounds - self.labels = np.array(labels) + if labels is not None: + self.labels = np.array(labels) + else: + self.labels = np.array(["Data"]*len(data)) self.prior = prior.copy() # dict {'P':(0.1,0.5), 'T0':(0,1), (value, uncertainty)} self.verbose = verbose @@ -157,7 +160,6 @@ def plot_oc(self, savefile=None, ylim='none', show_2sigma=False, prior_name="Pri for i, ulabel in enumerate(ulabels): # find where the label matches mask = self.labels == ulabel - # plot the data/residuals ax.errorbar(self.epochs[mask], self.residuals[mask] * 24 * 60, yerr=self.dataerr[mask] * 24 * 60, ls='none', marker=next(markers), color=next(colors), label=ulabel) else: @@ -324,7 +326,7 @@ def plot_triangle(self): ) return fig - def plot_periodogram(self, minper=0, maxper=0, minper2=1, maxper2=9): + def plot_periodogram(self, minper=0, maxper=0, minper2=0, maxper2=0): """ Search the residuals for periodic signals. """ ######################################## @@ -376,14 +378,18 @@ def plot_periodogram(self, minper=0, maxper=0, minper2=1, maxper2=9): ######################################## # subtract first order solution from data and recompute periodogram - maxper = maxper2 + + if minper2 == 0: + minper2 = per*2.1 + if maxper2 == 0: + maxper2 = (np.max(self.epochs) - np.min(self.epochs)) * 3. # recompute on new grid ls2 = LombScargle(self.epochs, residuals_linear, dy=self.dataerr) # search for periods greater than first order freq2,power2 = ls.autopower(maximum_frequency=1./(minper2+1), - minimum_frequency=1./maxper, nyquist_factor=2) + minimum_frequency=1./maxper2, nyquist_factor=2) # TODO do a better job defining period grid, ignoring harmonics of first order solution +- 0.25 day @@ -558,6 +564,7 @@ def plot_periodogram(self, minper=0, maxper=0, minper2=1, maxper2=9): # perform the weighted least squares regression to find second order fourier solution res = sm.WLS(residuals_first_order, basis2.T, weights=1.0 / self.dataerr ** 2).fit() coeffs = res.params # retrieve the slope and intercept of the fit from res + self.coeffs = res.params y_bestfit = np.dot(basis2.T, coeffs) # super sample fourier solution @@ -620,6 +627,11 @@ def plot_periodogram(self, minper=0, maxper=0, minper2=1, maxper2=9): ax[3].legend(loc='best') + self.best_periods = np.array([per, per2]) + coeff1 = np.sqrt(coeffs[1]**2 + coeffs[1]**2) + coeff2 = np.sqrt(coeffs[3]**2 + coeffs[4]**2) + self.amplitudes = np.array([coeff1, coeff2]) + return fig, ax class decay_fitter(object): @@ -643,7 +655,10 @@ def __init__(self, data, dataerr, bounds=None, prior=None, labels=None, verbose= self.data = data self.dataerr = dataerr self.bounds = bounds - self.labels = np.array(labels) + if labels is not None: + self.labels = np.array(labels) + else: + self.labels = ["Data"]*len(data) self.prior = prior.copy() # dict {'m':(0.1,0.5), 'b':(0,1)} self.verbose = verbose if bounds is None: diff --git a/exotic/api/nbody.py b/exotic/api/nbody.py new file mode 100644 index 00000000..c3cf6e6d --- /dev/null +++ b/exotic/api/nbody.py @@ -0,0 +1,754 @@ +# ########################################################################### # +# Copyright (c) 2019-2020, California Institute of Technology. +# All rights reserved. Based on Government Sponsored Research under +# contracts NNN12AA01C, NAS7-1407 and/or NAS7-03001. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. Neither the name of the California Institute of +# Technology (Caltech), its operating division the Jet Propulsion +# Laboratory (JPL), the National Aeronautics and Space +# Administration (NASA), nor the names of its contributors may be +# used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE CALIFORNIA +# INSTITUTE OF TECHNOLOGY BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# ########################################################################### # +# EXOplanet Transit Interpretation Code (EXOTIC) +# # NOTE: See companion file version.py for version info. +# ########################################################################### # +# ########################################################################### # +# Code for running N-body simulations and computing transit timing variations. +# Adapted from: https://github.com/pearsonkyle/Nbody-ai +# ########################################################################### # +# ########################################################################### # +import os +import copy +import time +import numpy as np +import matplotlib.pyplot as plt +import rebound +from exotic.api.plotting import corner +from ultranest import ReactiveNestedSampler +from astropy.io import fits +from astropy import units as u +from astropy import constants as c +from scipy.interpolate import interp1d +from astropy.timeseries import LombScargle +from scipy.signal import find_peaks + +mearth = u.M_earth.to(u.kg) +msun = u.M_sun.to(u.kg) +mjup = u.M_jup.to(u.kg) + +# outlier robust "average" +maxavg = lambda x: (np.percentile(np.abs(x),75)+np.max(np.abs(x)) )*0.5 + +def empty_data(N): # orbit parameters in Nbody simulation + return { + 'x':np.zeros(N), + 'y':np.zeros(N), + 'z':np.zeros(N), + 'P':np.zeros(N), + 'a':np.zeros(N), + 'e':np.zeros(N), + 'inc':np.zeros(N), + 'Omega':np.zeros(N), + 'omega':np.zeros(N), + 'M':np.zeros(N), + } + +def generate(objects, Ndays=None, Noutputs=None): + # create rebound simulation + # for object parameters see: + # https://rebound.readthedocs.io/en/latest/_modules/rebound/particle.html + sim = rebound.Simulation() + sim.units = ('day', 'AU', 'Msun') + for i in range(len(objects)): + sim.add( **objects[i] ) + sim.move_to_com() + + if Ndays and Noutputs: + return integrate(sim, objects, Ndays, Noutputs) + else: + return sim + +def integrate(sim, objects, Ndays, Noutputs): + # ps is now an array of pointers and will change as the simulation runs + ps = sim.particles + + times = np.linspace(0., Ndays, Noutputs) # units of days + + pdata = [empty_data(Noutputs) for i in range(len(objects)-1)] + star = {'x':np.zeros(Noutputs),'y':np.zeros(Noutputs),'z':np.zeros(Noutputs) } + + # run simulation time steps + for i,time in enumerate(times): + sim.integrate(time) + + # record data + for k in star.keys(): + star[k][i] = getattr(ps[0], k) + + for j in range(1,len(objects)): + for k in pdata[j-1].keys(): + pdata[j-1][k][i] = getattr(ps[j],k) + + sim_data = ({ + 'pdata':pdata, + 'star':star, + 'times':times, + 'objects':objects, + 'dt': Noutputs/(Ndays*24*60*60) # conversion factor to get seconds for RV semi-amp + }) + + return sim_data + +def analyze(m, ttvfast=False): + + if ttvfast: + tt = transit_times( m['pdata'][0]['x'], m['star']['x'], m['times'] ) + ttv,per,t0 = TTV(np.arange(len(tt)),tt ) + return np.arange(len(ttv)),ttv,tt + + RV = np.diff(m['star']['x'])*1.496e11*m['dt'] # measurements -> seconds + + freq,power,peak_periods = lomb_scargle(m['times'][1:], RV, min_freq=1./365, max_freq=1.) + + data = { + 'times':m['times'], + 'RV':{'freq':freq, 'power':power, 'signal':RV, 'max':maxavg(RV), 'peak_periods':peak_periods}, + 'mstar': m['objects'][0]['m'], + 'planets':[], + 'objects':m['objects'] + } + + # parse planet data + for j in range(1,len(m['objects'])): + key = label='Planet {}'.format(j) + pdata = {} + + # compute transit times + tt = transit_times( m['pdata'][j-1]['x'], m['star']['x'], m['times'] ) + if len(tt)>=3: + ttv,per,t0 = TTV(np.arange(len(tt)),tt ) + else: + per = m['objects'][j]['P'] + t0 = 0 + ttv = [0] + + # periodogram of o-c + freq,power,peak_periods = lomb_scargle(np.arange(len(ttv)),ttv) + + # save data + for k in ['e','inc','a', 'omega']: + pdata[k] = np.mean( m['pdata'][j-1][k] ) + pdata['mass'] = m['objects'][j]['m'] + pdata['P'] = per + pdata['t0'] = t0 + pdata['tt'] = tt + pdata['ttv'] = ttv + pdata['max'] = maxavg(ttv) + pdata['freq'] = freq + pdata['power'] = power + pdata['peak_periods'] = peak_periods + + # down sample data for plotting + pdata['x'] = m['pdata'][j-1]['x'][::4] + pdata['y'] = m['pdata'][j-1]['z'][::4] + data['planets'].append(pdata) + + return data + +def lomb_scargle(t,y,dy=None, min_freq=None, max_freq=None, npeaks=0, peaktol=0.05): + + # perform quick periodicity analysis on residuals + find peaks in power plot + if dy is not None: + ls = LombScargle(t, y, dy) + else: + ls = LombScargle(t, y) + + if min_freq is None: + min_freq = 1./(1.5*(max(t)-min(t))) + + if max_freq is None: + max_freq = 1./2.5 + + # compute power spectrum + freq,power = ls.autopower(maximum_frequency=max_freq, minimum_frequency=min_freq, + nyquist_factor=2, samples_per_peak=5, method='cython') + + # find peaks in power spectrum + peaks,amps = find_peaks(power,height=peaktol) + + # sort by biggest to smallest amplitude + peaks = peaks[np.argsort(amps['peak_heights'])[::-1]] + peak_periods = 1./freq[peaks] + return freq,power,peak_periods + + +def report(data, savefile=None): + + # set up simulation summary report + f = plt.figure( figsize=(12,8) ) + plt.subplots_adjust() + ax = [ plt.subplot2grid( (2,3), (0,0) ), # x,y plot + plt.subplot2grid( (2,3), (1,0) ), # table data + plt.subplot2grid( (2,3), (0,1) ), # # RV semi-amplitude plot #include theoretical limit for 2body system + plt.subplot2grid( (2,3), (1,1) ), # O-C plot # TODO add second axis for time (day) + plt.subplot2grid( (2,3), (0,2) ), # lomb scargle for RV semi-amplitude + plt.subplot2grid( (2,3), (1,2) ) # lomb scargle for o-c + ] + plt.subplots_adjust(top=0.96, bottom=0.07, left=0.1, right=0.98, hspace=0.3, wspace=0.3) + + ax[2].plot(data['times'][1:],data['RV']['signal'],'k-' ) + ax[2].set_xlim([0, 2.5*data['planets'][-1]['P'] ]) + ax[2].set_ylabel('RV semi-amplitude (m/s)') + ax[2].set_xlabel('time (day)') + + ax[4].plot(1./data['RV']['freq'],data['RV']['power'] ) + # plot reconstructed signal from sin series + + ax[4].set_xlabel('Period (day)') + ax[4].set_ylabel('|RV semi-amplitude| Power') + ax[4].set_xlim([1, 1.5*data['planets'][-1]['P'] ]) + #u = (m['objects'][1]['m']/m['objects'][0]['m']) * np.sqrt( G*(m['objects'][0]['m']+m['objects'][1]['m'])/m['objects'][1]['a'] )*1.496e11/(24*60*60) + #print('expected RV:',u) + + # create table stuff + keys = ['mass','a','P','inc','e','max'] + units = [msun/mearth,1,1,1,1,24*60] + rounds = [2,3,2,2,3,1,1] + + # make 2d list for table + tdata=[] + for i in range(len(units)): + tdata.append( [0 for i in range(len(data['planets']))] ) + + tinfo = { + 'mass':'Mass (Mearth)', + 'a':'Semi-major Axis (au)', + 'P':'Period (day)', + 'inc':'Inclination (deg)', + 'e':'Eccentricity', + 'max':'TTV Max Avg (min)', + } + row_labels = [ tinfo[k] for k in keys ] + col_labels = [ "P {}".format(i+1) for i in range(len(data['planets']))] + + # for each planet in the system + for j in range(1,len(data['objects'])): + + # plot orbits + ax[0].plot( data['planets'][j-1]['x'], data['planets'][j-1]['y'],label='Planet {}'.format(j),lw=0.5,alpha=0.5 ) + + if len(data['planets'][j-1]['ttv']) >= 2: + # plot O-C + ax[3].plot(data['planets'][j-1]['ttv']*24*60,label='Planet {}'.format(j) ) # convert days to minutes + + # lomb-scargle for O-C + ax[5].semilogx( 1./data['planets'][j-1]['freq'], data['planets'][j-1]['power'], label='Planet {}'.format(j) ) + + # add peak periods to legend + for i,per in enumerate(data['planets'][j-1]['peak_periods']): + # vertical line with label + if per > 0: + ax[5].axvline(per, ls='--', lw=0.5, label=f"{np.round(per,2)} day") + + # populate table data + for i,k in enumerate(keys): + tdata[i][j-1] = np.round( data['planets'][j-1][k] * units[i], rounds[i]) + + if k == 'inc': + tdata[i][j-1] = np.round( np.rad2deg(data['planets'][j-1][k]) * units[i], rounds[i]) + + table = ax[1].table(cellText=tdata, + colLabels=col_labels, + rowLabels=row_labels, + colWidths=[0.1]*len(col_labels), + loc='center') + + ax[1].set_title('Stellar mass: {:.2f} Msun'.format(data['mstar']) ) + table.scale(1.5,1.5) + + ax[1].axis('tight') + ax[1].axis('off') + + ax[0].set_ylabel('(au)') + ax[0].set_xlabel('(au)') + ax[0].legend(loc='best') + + ax[1].set_ylabel('position (au)') + ax[1].set_xlabel('time (day)') + + ax[3].set_ylabel('O-C (minutes)') + ax[3].set_xlabel('transit epoch') + ax[3].legend(loc='best') + ax[3].grid(True) + + ax[5].set_xlabel('Period (epoch)') + ax[5].set_ylabel('|O-C| Power' ) + #ax[5].set_xlim([1,30]) + ax[5].legend(loc='best') + + if savefile: + plt.savefig(savefile) + plt.close() + else: + plt.show() + +def find_zero(t1,x1, t2,x2): + """ + Find the zero of a line given two points. + + Parameters + ---------- + t1 : float + Time of first point. + + x1 : float + Position of first point. + + t2 : float + Time of second point. + + x2 : float + Position of second point. + + Returns + ------- + T0 : float + Time of zero. + """ + m = (x2-x1)/(t2-t1) + T0 = -x1/m + t1 + return T0 + +def transit_times(xp,xs,times): + """ + Find transit times from position data. + + Parameters + ---------- + xp : array + Planet x positions. + + xs : array + Star x positions. + + times : array + Simulation times. + + Returns + ------- + tt : array + Transit times. + """ + # check for sign change in position difference + dx = xp-xs + tt = [] + for i in range(1,len(dx)): + if dx[i-1] >= 0 and dx[i] <= 0: + tt.append( find_zero(times[i-1],dx[i-1], times[i],dx[i]) ) + return np.array(tt) + +def TTV(epochs, tt): + """ + Fit a line to the data and subtract it from the data. + + Parameters + ---------- + epochs : array + Orbits epochs of the data. + + tt : array + Transit times. + + Returns + ------- + ttv : array + Transit times with the linear trend subtracted. + + m : float + Slope of the linear trend. + + b : float + Intercept of the linear trend. + """ + N = len(epochs) + A = np.vstack([np.ones(N), epochs]).T + b, m = np.linalg.lstsq(A, tt, rcond=None)[0] + ttv = (tt-m*np.array(epochs)-b) + return [ttv,m,b] + + +# directory path of file +fpath = os.path.dirname(os.path.abspath(__file__)) +def estimate_prior( amplitude, periodicity, amp_lim=2, per_lim=4, file_name = os.path.join(fpath,"ttv_grid.fits"), show=True): + + with fits.open(file_name) as ttv_grid_list: + + # The grid is stored in multiple extensions + Npts = ttv_grid_list[0].header['NAXIS1'] + + # in Earth + mass_grid = np.linspace(ttv_grid_list[0].header['CRVAL1'], ttv_grid_list[0].header['CRVAL1'] + Npts*ttv_grid_list[0].header['CDELT1'], Npts) + mass_grid_2 = np.linspace(ttv_grid_list[0].header['CRVAL1'], ttv_grid_list[0].header['CRVAL1'] + Npts*ttv_grid_list[0].header['CDELT1'], int(0.5*Npts)) + period_grid = np.linspace(ttv_grid_list[0].header['CRVAL2'], ttv_grid_list[0].header['CRVAL2'] + Npts*ttv_grid_list[0].header['CDELT2'], Npts) + #period_grid_2 = np.linspace(ttv_grid_list[0].header['CRVAL2'], ttv_grid_list[0].header['CRVAL2'] + Npts*ttv_grid_list[0].header['CDELT2'], int(0.5*Npts)) + + # extract data + pg, mg = np.meshgrid(period_grid, mass_grid) + amplitude_grid = ttv_grid_list[0].data + periodicity1_grid = ttv_grid_list[1].data + periodicity2_grid = ttv_grid_list[2].data + # combine periods by min + #periodicity_grid = np.minimum(periodicity1_grid, periodicity2_grid) + rv_grid = ttv_grid_list[3].data + + # amplitude grid + fig, ax = plt.subplots(3, 2, figsize=(9, 11)) + fig.suptitle("N-body Estimates from Transit Timing Variations", fontsize=16) + plt.subplots_adjust(left=0.0485, right=0.985, bottom=0.15, top=0.9, wspace=0.3) + im = ax[0,0].imshow(amplitude_grid, origin='lower', extent=[mass_grid[0], mass_grid[-1],period_grid[0], period_grid[-1]], vmin=0,vmax=30, aspect='auto', cmap='jet', interpolation='none') + ax[0,0].set_ylabel('Period Ratio') + ax[0,0].set_xlabel('Mass [Earth]') + cbar = fig.colorbar(im, ax=ax[0,0]) + cbar.set_label('TTV Amplitude [min]') + + # periodoicity 1 grid + im = ax[0,1].imshow(periodicity1_grid, origin='lower', extent=[mass_grid[0], mass_grid[-1],period_grid[0], period_grid[-1]], vmin=0,vmax=0.5*np.nanmax(ttv_grid_list[1].data), aspect='auto', cmap='jet', interpolation='none') + ax[0,1].set_ylabel('Period Ratio') + ax[0,1].set_xlabel('Mass [Earth]') + cbar = fig.colorbar(im, ax=ax[0,1]) + cbar.set_label('TTV Periodicity 1st Order [epoch]') + + # simulate some results based on the periodogram + mask = (amplitude_grid > amplitude-amp_lim) & (amplitude_grid < amplitude+amp_lim) & \ + (((periodicity1_grid > periodicity-per_lim) & (periodicity1_grid < periodicity+per_lim)) | \ + ((periodicity2_grid > periodicity-per_lim) & (periodicity2_grid < periodicity+per_lim))) + # plot mask + im = ax[1,0].imshow(mask, origin='lower', extent=[mass_grid[0], mass_grid[-1],period_grid[0], period_grid[-1]], vmin=0,vmax=1, aspect='auto', cmap='binary_r', interpolation='none') + ax[1,0].set_ylabel('Period Ratio') + ax[1,0].set_xlabel('Mass [Earth]') + cbar = fig.colorbar(im, ax=ax[1,0]) + cbar.set_label('N-body Prior from O-C Data') + + # compare to original + # TODO find why the last bin has double the number of points + masses = mg.T[mask].flatten() + ax[1,1].hist(masses, bins=mass_grid_2, alpha=0.5) + ax[1,1].set_xlabel('Mass [Earth]') + ax[1,1].set_ylabel('Prior Probability') + ax[1,1].axes.yaxis.set_ticklabels([]) + ax[1,1].set_xlim([mg.min(), mg.max()-10]) + + # compare to original + periods = pg.T[mask].flatten() + ax[2,0].hist(periods, bins=period_grid, density=True, alpha=0.5) + ax[2,0].set_xlabel('Period Ratio') + ax[2,0].set_ylabel('Prior Probability') + ax[2,0].axes.yaxis.set_ticklabels([]) + ax[2,0].set_xlim([pg.min(), pg.max()]) + + # plot histogram for rv data + rvs = rv_grid.T[mask].flatten() + ax[2,1].hist(rvs, bins=50, density=True, alpha=0.5) + ax[2,1].set_xlabel('RV Semi-Amplitude [m/s]') + ax[2,1].set_ylabel('Prior Probability') + ax[2,1].axes.yaxis.set_ticklabels([]) + + # m_earth, days, m/s + return masses, periods, rvs, fig, ax + +def interp_distribution(values, nbins=50): + value_grid = np.linspace(np.min(values), np.max(values), nbins) + heights, edges = np.histogram(values, bins=value_grid, density=True) + edge_center = (edges[:-1] + edges[1:]) / 2 + + # Step 2: Normalize the histogram + bin_widths = np.diff(edges) + total_area = np.sum(bin_widths * heights) + normalized_heights = heights / total_area + + # Step 3: Interpolate to create a continuous PDF + return interp1d(edge_center, normalized_heights, kind='linear', bounds_error=False, fill_value=0) + + + + +class nbody_fitter(): + + def __init__(self, data, prior=None, bounds=None, verbose=True): + self.data = data + self.bounds = bounds + self.prior = prior + self.verbose = verbose + self.fit_nested() + + def fit_nested(self): + + # set up some arrays for mapping sampler output + freekeys = [] + boundarray = [] + for i,planet in enumerate(self.bounds): + for bound in planet: + if '_logl' in bound or '_fn' in bound: + continue + freekeys.append(f"{i}_{bound}") + boundarray.append(planet[bound]) + + # find min and max time for simulation + min_time = np.min(self.data[1]['Tc']) + max_time = np.max(self.data[1]['Tc']) + # todo extend for multiplanet systems + + sim_time = (max_time-min_time)*1.05 + # TODO extend for multiplanet systems + Tc_norm = self.data[1]['Tc'] - min_time # normalize the data to the first observation + self.orbit = np.rint(Tc_norm / self.prior[1]['P']).astype(int) # number of orbits since first observation (rounded to nearest integer) + + # numpify + boundarray = np.array(boundarray) + bounddiff = np.diff(boundarray,1).reshape(-1) + + # create queue and save simulation to + def loglike(pars): + chi2 = 0 + + # set parameters + for i,par in enumerate(pars): + idx,key = freekeys[i].split('_') + idx = int(idx) + if key == 'tmid': + continue + # this dict goes to REBOUND and needs specific keys + self.prior[idx][key] = par + + # prior likelihood function for P, m of outer planet + likelihood_m = self.bounds[2]['m_logl'](self.prior[2]['m']) + likelihood_P = self.bounds[2]['P_logl'](self.prior[2]['P']) + if likelihood_m <= 0 or likelihood_P <= 0: + return -1e6 + + # take difference between data and simulation + # run N-body simulation + sim_data = generate(self.prior, sim_time, int(sim_time*24)) # uses linspace behind the scenes + + # json structure with analytics of interest from the simulation + # ttv_data = analyze(sim_data) # slow + + sim_shift = 0 + # loop over planets, check for data + for i,planet in enumerate(self.prior): + if self.data[i]: + # compute transit times from N-body simulation + Tc_sim = transit_times( sim_data['pdata'][i-1]['x'], sim_data['star']['x'], sim_data['times'] ) + + # derive an offset in time from the first planet + if i-1==0: + sim_shift = Tc_sim.min() + + # shift the first mid-transit in simulation to observation + Tc_sim -= sim_shift # first orbit has tmid at 0 + + # scale Tc_sim to data + try: + residual = self.data[i]['Tc'] - Tc_sim[self.orbit] + except: + #import pdb; pdb.set_trace + #ttv,m,b = TTV(np.arange(Tc_sim.shape[0]), Tc_sim) + #ttv1,m1,b1 = TTV(self.orbit, self.data[i]['Tc']) + # could be unstable orbit or not enough data + # switch to average error and clip by max epoch? + print(self.prior) + chi2 += -1e6 + continue + + Tc_sim += residual.mean() + + # take difference between data and simulation + try: + chi2 += -0.5*np.sum(((self.data[i]['Tc'] - Tc_sim[self.orbit])/self.data[i]['Tc_err'])**2) + except: + chi2 += -1e6 + print(self.prior) + # usually unstable orbit + + return chi2 + + + def prior_transform(upars): + return (boundarray[:,0] + bounddiff*upars) + + if self.verbose: + self.results = ReactiveNestedSampler(freekeys, loglike, prior_transform).run(max_ncalls=1e5) + else: + self.results = ReactiveNestedSampler(freekeys, loglike, prior_transform).run(max_ncalls=1e5, show_status=self.verbose, +viz_callback=self.verbose) + + self.errors = {} + self.quantiles = {} + self.parameters = copy.deepcopy(self.prior) + + # TODO finish + #for i, key in enumerate(freekeys): + # self.parameters[key] = self.results['maximum_likelihood']['point'][i] + # self.errors[key] = self.results['posterior']['stdev'][i] + # self.quantiles[key] = [ + # self.results['posterior']['errlo'][i], + # self.results['posterior']['errup'][i]] + + +if __name__ == '__main__': + + # create some sample data + objects = [ + # units: Msun, Days, au + {'m':0.95}, # stellar mass + {'m':1.169*mjup/msun, 'P':2.797436, 'inc':3.14159/2, 'e':0, 'omega':0 }, + {'m':0.1*mjup/msun, 'P':2.797436*1.9, 'inc':3.14159/2, 'e':0.0, 'omega':0 }, + ] # HAT-P-37 + + # create REBOUND simulation + n_orbits = 2000 + + # time the simulation + t1 = time.time() + # inputs: object dict, length of simulation in days, number of timesteps [1hr] (should be at least 1/20 orbital period) + sim_data = generate(objects, objects[1]['P']*n_orbits, int(n_orbits*objects[1]['P']*24) ) + t2 = time.time() + print(f"Simulation time: {t2-t1:.2f} seconds") + + # collect the analytics of interest from the simulation + # lomb-scargle can be a lil slow + ttv_data = analyze(sim_data) + + # plot the results + report(ttv_data) + + # create a fake dataset + tmids = 2459150 + ttv_data['planets'][0]['tt'] + # add random noise to observations + tmids += np.random.normal(0,0.5,len(tmids))/(24*60) + # randomly select 50 observations without repeat + tmids = np.random.choice(tmids,50,replace=False) + # add random error to observations between + err = 1/24/60 + np.random.random()*0.25/24/60 + np.random.normal(0,0.1,len(tmids))/(24*60) + # estimate orbital epochs + orbit = np.rint((tmids-tmids.min())/ttv_data['planets'][0]['P']).astype(int) + + # estimate period from data + ttv,P,T0 = TTV(orbit, tmids) + + # run though linear fitter to estimate prior + from exotic.api.ephemeris import ephemeris_fitter + + # min and max values to search between for fitting + bounds = { + 'P': [P - 0.1, P + 0.1], # orbital period + 'T0': [T0 - 0.1, T0 + 0.1] # mid-transit time + } + + # used to plot red overlay in O-C figure + prior = { + 'P': [P, 0.00001], # value from linear lstq + 'T0': [T0, 0.001] # value from linear lstq + } + + lf = ephemeris_fitter(tmids, err, bounds, prior=prior) + + fig,ax = lf.plot_oc() + plt.tight_layout() + plt.show() + + # search for periodic signals in the data + fig,ax = lf.plot_periodogram() + plt.tight_layout() + plt.savefig('periodogram.png') + plt.show() + plt.close() + + # estimate ttv amplitude + amp = lf.amplitudes[0]*24*60 + per = lf.best_periods[0] # 1st order solution + + # estimate prior using periods from linear fit periodogram + masses, per_ratio, rvs, fig, ax = estimate_prior(amp, per) + masses *= mearth/msun + periods = per_ratio*lf.parameters['P'] + prior_fn_mass = interp_distribution(masses) + prior_fn_per = interp_distribution(periods) + plt.tight_layout() + plt.savefig('ttv_prior.png') + plt.show() + plt.close() + + # Parameters for N-body Retrieval + nbody_prior = [ + # star + {'m':0.95}, + + # inner planet + {'m':1.169*mjup/msun, + 'P':lf.parameters['P'], + 'inc':3.14159/2, + 'e':0, + 'omega':0}, + + # outer planet + {'m':masses.mean(), + 'P':periods.mean(), + 'inc':3.14159/2, + 'e':0, + 'omega':0,}, + ] + + # specify data to fit + data = [ + {}, # data for star (e.g. RV) + {'Tc':tmids, 'Tc_err':err}, # data for inner planet (e.g. Mid-transit times) + {} # data for outer planet (e.g. Mid-transit times) + ] + + + # set up where to look for a solution + nbody_bounds = [ + {}, # no bounds on stellar parameters + + { # bounds for inner planet + 'P': [nbody_prior[1]['P']-0.025, nbody_prior[1]['P']+0.025], # based on solution from linear fit\ + # 'T0': [None, None] # mid-transit is automatically adjusted, no need to include in bounds + }, + { # bounds for outer planet + 'P':[periods.min(), periods.max()], # period [day] + 'P_logl': prior_fn_per, # prior likelihood function + 'm':[masses.min(), masses.max()], # mass [msun + 'm_logl': prior_fn_mass, # prior likelihood function + 'omega': [-np.pi, np.pi] # argument of periastron [rad] + } + ] + + # run the fitter + nfit = nbody_fitter(data, nbody_prior, nbody_bounds) + + print(nfit.parameters) + print(nfit.errors) \ No newline at end of file From eaaf56146504d887d32acf0b74638c8c62d024e9 Mon Sep 17 00:00:00 2001 From: Kyle Pearson Date: Tue, 24 Oct 2023 13:34:02 -0700 Subject: [PATCH 3/6] nbody example --- examples/nbody/README.md | 4 +- examples/nbody/example.py | 143 ++++++++++++++++++++++++++++++++ examples/nbody/grid_100_50.png | Bin 66691 -> 0 bytes examples/nbody/grid_500_150.png | Bin 0 -> 157673 bytes 4 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 examples/nbody/example.py delete mode 100644 examples/nbody/grid_100_50.png create mode 100644 examples/nbody/grid_500_150.png diff --git a/examples/nbody/README.md b/examples/nbody/README.md index d70a6f70..78cd0848 100644 --- a/examples/nbody/README.md +++ b/examples/nbody/README.md @@ -4,4 +4,6 @@ In the meantime checkout: https://github.com/pearsonkyle/Nbody-ai Match your Lomb-Scargle periodicity to this chart to determine the mass and period of a potential outer planet. A digitized version of this plot is coming soon... Occasionally, the O-C perturbation will experience an additional periodicity with only a single perturber, it is suspected to be due to precession of the inner planet's orbit. For now, just worry about the 1st order solution when matching to your observations. -![](grid_100_50.png) +![](grid_500_150.png) + +The example code is still in development and may not work entirely... please be paitent and report any issues to our slack. \ No newline at end of file diff --git a/examples/nbody/example.py b/examples/nbody/example.py new file mode 100644 index 00000000..21fc39b3 --- /dev/null +++ b/examples/nbody/example.py @@ -0,0 +1,143 @@ +import time +import numpy as np +import matplotlib.pyplot as plt +from astropy import units as u + +from exotic.api.nbody import report, generate, nbody_fitter, analyze, estimate_prior, TTV, interp_distribution + +mearth = u.M_earth.to(u.kg) +msun = u.M_sun.to(u.kg) +mjup = u.M_jup.to(u.kg) + +# create some sample data +objects = [ + # units: Msun, Days, au + {'m':0.95}, # stellar mass + {'m':1.169*mjup/msun, 'P':2.797436, 'inc':3.14159/2, 'e':0, 'omega':0 }, + {'m':0.1*mjup/msun, 'P':2.797436*1.9, 'inc':3.14159/2, 'e':0.0, 'omega':0 }, +] # HAT-P-37 + +# create REBOUND simulation +n_orbits = 2000 + +# time the simulation +t1 = time.time() +# inputs: object dict, length of simulation in days, number of timesteps [1hr] (should be at least 1/20 orbital period) +sim_data = generate(objects, objects[1]['P']*n_orbits, int(n_orbits*objects[1]['P']*24) ) +t2 = time.time() +print(f"Simulation time: {t2-t1:.2f} seconds") + +# collect the analytics of interest from the simulation +# lomb-scargle can be a lil slow +ttv_data = analyze(sim_data) + +# plot the results +report(ttv_data) + +# create a fake dataset +tmids = 2459150 + ttv_data['planets'][0]['tt'] +# add random noise to observations +tmids += np.random.normal(0,0.5,len(tmids))/(24*60) +# randomly select 50 observations without repeat +tmids = np.random.choice(tmids,50,replace=False) +# add random error to observations between +err = 1/24/60 + np.random.random()*0.25/24/60 + np.random.normal(0,0.1,len(tmids))/(24*60) +# estimate orbital epochs +orbit = np.rint((tmids-tmids.min())/ttv_data['planets'][0]['P']).astype(int) + +# estimate period from data +ttv,P,T0 = TTV(orbit, tmids) + +# run though linear fitter to estimate prior +from exotic.api.ephemeris import ephemeris_fitter + +# min and max values to search between for fitting +bounds = { + 'P': [P - 0.1, P + 0.1], # orbital period + 'T0': [T0 - 0.1, T0 + 0.1] # mid-transit time +} + +# used to plot red overlay in O-C figure +prior = { + 'P': [P, 0.00001], # value from linear lstq + 'T0': [T0, 0.001] # value from linear lstq +} + +lf = ephemeris_fitter(tmids, err, bounds, prior=prior) + +fig,ax = lf.plot_oc() +plt.tight_layout() +plt.show() + +# search for periodic signals in the data +fig,ax = lf.plot_periodogram() +plt.tight_layout() +plt.savefig('periodogram.png') +plt.show() +plt.close() + +# estimate ttv amplitude +amp = lf.amplitudes[0]*24*60 +per = lf.best_periods[0] # 1st order solution + +# estimate prior using periods from linear fit periodogram +masses, per_ratio, rvs, fig, ax = estimate_prior(amp, per) +masses *= mearth/msun +periods = per_ratio*lf.parameters['P'] +prior_fn_mass = interp_distribution(masses) +prior_fn_per = interp_distribution(periods) +plt.tight_layout() +plt.savefig('ttv_prior.png') +plt.show() +plt.close() + +# Parameters for N-body Retrieval +nbody_prior = [ + # star + {'m':0.95}, + + # inner planet + {'m':1.169*mjup/msun, + 'P':lf.parameters['P'], + 'inc':3.14159/2, + 'e':0, + 'omega':0}, + + # outer planet + {'m':masses.mean(), + 'P':periods.mean(), + 'inc':3.14159/2, + 'e':0, + 'omega':0,}, +] + +# specify data to fit +data = [ + {}, # data for star (e.g. RV) + {'Tc':tmids, 'Tc_err':err}, # data for inner planet (e.g. Mid-transit times) + {} # data for outer planet (e.g. Mid-transit times) +] + + +# set up where to look for a solution +nbody_bounds = [ + {}, # no bounds on stellar parameters + + { # bounds for inner planet + 'P': [nbody_prior[1]['P']-0.025, nbody_prior[1]['P']+0.025], # based on solution from linear fit\ + # 'T0': [None, None] # mid-transit is automatically adjusted, no need to include in bounds + }, + { # bounds for outer planet + 'P':[periods.min(), periods.max()], # period [day] + 'P_logl': prior_fn_per, # prior likelihood function + 'm':[masses.min(), masses.max()], # mass [msun + 'm_logl': prior_fn_mass, # prior likelihood function + 'omega': [-np.pi, np.pi] # argument of periastron [rad] + } +] + +# run the fitter +nfit = nbody_fitter(data, nbody_prior, nbody_bounds) + +print(nfit.parameters) +print(nfit.errors) diff --git a/examples/nbody/grid_100_50.png b/examples/nbody/grid_100_50.png deleted file mode 100644 index 512791b8a7f1503a718ebc3256630d74792f8f88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66691 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 K8^h)HocSMreF^9Q diff --git a/examples/nbody/grid_500_150.png b/examples/nbody/grid_500_150.png new file mode 100644 index 0000000000000000000000000000000000000000..7104c1928d49965b0060a639e4b72fdb64b9949a GIT binary patch literal 157673 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

B*JQ~{lWkA+YkWO!+1idh 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

M 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⁡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 blehK;>^Rt;QLYrv0DsP$HawN9V-xvbyP?vR literal 0 HcmV?d00001 From 51945516b5f54bd9c85cc0b42e08cc421822fb13 Mon Sep 17 00:00:00 2001 From: Kyle Pearson Date: Tue, 24 Oct 2023 14:02:33 -0700 Subject: [PATCH 4/6] docs --- examples/nbody/README.md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/examples/nbody/README.md b/examples/nbody/README.md index 78cd0848..c1b93395 100644 --- a/examples/nbody/README.md +++ b/examples/nbody/README.md @@ -1,9 +1,15 @@ +# N-body Retrievals + Coming soon to EXOTIC... -In the meantime checkout: https://github.com/pearsonkyle/Nbody-ai +## Prior estimate + +The lomb-scargle periodogram from our ephemeris fitting code can be used to estimate a prior for an N-body retrieval. Transit timing variations (TTV) alone are not sufficient to uniquely constrain a single solution, instead multiple modes can exist which give the same amplitude/periodicity of perturbation. The distinguishing factor will rely on radial velocity measurements but none the less this approach can help limit the search space for potential planets. Below is a figure highlighting results from a grid of N-body simulations where we construct a mask based on the amplitude and periodicity found in the O-C diagram. The mask is used to constrain the N-body retrieval (i.e. search space) which significantly reduces the number of simulations needed to find a solution. + +![](ttv_prior.png) -Match your Lomb-Scargle periodicity to this chart to determine the mass and period of a potential outer planet. A digitized version of this plot is coming soon... Occasionally, the O-C perturbation will experience an additional periodicity with only a single perturber, it is suspected to be due to precession of the inner planet's orbit. For now, just worry about the 1st order solution when matching to your observations. +The example code has recently been refactored from [Nbody-AI](https://github.com/pearsonkyle/Nbody-ai) and is still in development. Some retrievals not work entirely... please be paitent and report any issues to our slack. -![](grid_500_150.png) +If you make use of this code please cite: -The example code is still in development and may not work entirely... please be paitent and report any issues to our slack. \ No newline at end of file +https://ui.adsabs.harvard.edu/abs/2019AJ....158..243P/abstract From 129d85dd225867797248c94185450882a0beeec7 Mon Sep 17 00:00:00 2001 From: Kyle Pearson Date: Tue, 24 Oct 2023 14:31:30 -0700 Subject: [PATCH 5/6] docs + comments --- examples/nbody/README.md | 2 +- examples/nbody/example.py | 4 ++-- exotic/api/nbody.py | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/nbody/README.md b/examples/nbody/README.md index c1b93395..c45fd839 100644 --- a/examples/nbody/README.md +++ b/examples/nbody/README.md @@ -8,7 +8,7 @@ The lomb-scargle periodogram from our ephemeris fitting code can be used to esti ![](ttv_prior.png) -The example code has recently been refactored from [Nbody-AI](https://github.com/pearsonkyle/Nbody-ai) and is still in development. Some retrievals not work entirely... please be paitent and report any issues to our slack. +The example code has recently been refactored from [Nbody-AI](https://github.com/pearsonkyle/Nbody-ai) and is still in development. Some retrievals not work entirely... please be paitent and report any issues to our slack. If you make use of this code please cite: diff --git a/examples/nbody/example.py b/examples/nbody/example.py index 21fc39b3..64c1dd16 100644 --- a/examples/nbody/example.py +++ b/examples/nbody/example.py @@ -139,5 +139,5 @@ # run the fitter nfit = nbody_fitter(data, nbody_prior, nbody_bounds) -print(nfit.parameters) -print(nfit.errors) +# print(nfit.parameters) +# print(nfit.errors) diff --git a/exotic/api/nbody.py b/exotic/api/nbody.py index c3cf6e6d..f55a8ddd 100644 --- a/exotic/api/nbody.py +++ b/exotic/api/nbody.py @@ -50,7 +50,6 @@ from ultranest import ReactiveNestedSampler from astropy.io import fits from astropy import units as u -from astropy import constants as c from scipy.interpolate import interp1d from astropy.timeseries import LombScargle from scipy.signal import find_peaks @@ -609,7 +608,8 @@ def prior_transform(upars): self.quantiles = {} self.parameters = copy.deepcopy(self.prior) - # TODO finish + # TODO finish saving final results + posteriors + #for i, key in enumerate(freekeys): # self.parameters[key] = self.results['maximum_likelihood']['point'][i] # self.errors[key] = self.results['posterior']['stdev'][i] @@ -750,5 +750,5 @@ def prior_transform(upars): # run the fitter nfit = nbody_fitter(data, nbody_prior, nbody_bounds) - print(nfit.parameters) - print(nfit.errors) \ No newline at end of file + # print(nfit.parameters) + # print(nfit.errors) \ No newline at end of file From 4eb7eacaa9c6b751508f5625a51d6893285fa853 Mon Sep 17 00:00:00 2001 From: Kyle Pearson Date: Tue, 24 Oct 2023 15:19:05 -0700 Subject: [PATCH 6/6] nbody modes + docs --- examples/nbody/README.md | 2 +- exotic/api/nbody.py | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/examples/nbody/README.md b/examples/nbody/README.md index c45fd839..a0c0620c 100644 --- a/examples/nbody/README.md +++ b/examples/nbody/README.md @@ -8,7 +8,7 @@ The lomb-scargle periodogram from our ephemeris fitting code can be used to esti ![](ttv_prior.png) -The example code has recently been refactored from [Nbody-AI](https://github.com/pearsonkyle/Nbody-ai) and is still in development. Some retrievals not work entirely... please be paitent and report any issues to our slack. +The example code has recently been refactored from [Nbody-AI](https://github.com/pearsonkyle/Nbody-ai) and is still in development. Some retrievals may not work entirely... please be paitent and report any issues to our slack. If you make use of this code please cite: diff --git a/exotic/api/nbody.py b/exotic/api/nbody.py index f55a8ddd..068cf0cd 100644 --- a/exotic/api/nbody.py +++ b/exotic/api/nbody.py @@ -203,7 +203,6 @@ def lomb_scargle(t,y,dy=None, min_freq=None, max_freq=None, npeaks=0, peaktol=0. peak_periods = 1./freq[peaks] return freq,power,peak_periods - def report(data, savefile=None): # set up simulation summary report @@ -578,18 +577,19 @@ def loglike(pars): #ttv1,m1,b1 = TTV(self.orbit, self.data[i]['Tc']) # could be unstable orbit or not enough data # switch to average error and clip by max epoch? - print(self.prior) + # print(self.prior) chi2 += -1e6 continue - Tc_sim += residual.mean() + import pdb; pdb.set_trace + Tc_sim += residual.mean() # why? # take difference between data and simulation try: chi2 += -0.5*np.sum(((self.data[i]['Tc'] - Tc_sim[self.orbit])/self.data[i]['Tc_err'])**2) except: chi2 += -1e6 - print(self.prior) + # print(self.prior) # usually unstable orbit return chi2 @@ -729,6 +729,7 @@ def prior_transform(upars): {} # data for outer planet (e.g. Mid-transit times) ] + # TODO break P,m modes into individual runs # set up where to look for a solution nbody_bounds = [