示例#1
0
def initialize_model(planets, TESSAPFdata, addextra=False):
    time_base = 2458362.5

    nplan = len(planets)
    if addextra:
        nplan = nplan + 1
    params = radvel.Parameters(
        nplan, basis='per tp e w k')  # number of planets = nplan
    n = 1
    for idx in planets:
        c_period = TESSAPFdata['period'][idx]
        k = radvel.utils.semi_amplitude(TESSAPFdata['est_mass'][idx], c_period,
                                        TESSAPFdata['mstar'][idx], 0.)
        tpstart = time_base + c_period * (TESSAPFdata['phase'][idx] + 0.25)
        params['per%d' % (n)] = radvel.Parameter(value=c_period)
        params['tp%d' % (n)] = radvel.Parameter(value=tpstart)
        params['e%d' % (n)] = radvel.Parameter(value=0.0001)
        params['w%d' % (n)] = radvel.Parameter(value=np.pi / 2.)
        params['k%d' % (n)] = radvel.Parameter(value=k)
        n = n + 1

    if addextra:
        params['per%d' % (n)] = radvel.Parameter(value=30.)
        params['tp%d' % (n)] = radvel.Parameter(value=time_base + 15.)
        params['e%d' % (n)] = radvel.Parameter(value=0.0001)
        params['w%d' % (n)] = radvel.Parameter(value=np.pi / 2.)
        params['k%d' % (n)] = radvel.Parameter(value=2.)

    mod = radvel.RVModel(params, time_base=time_base)
    mod.params['dvdt'] = radvel.Parameter(value=0.0)
    mod.params['curv'] = radvel.Parameter(value=0.0)
    return mod
示例#2
0
def initialize_post(data, params=None, priors=[], linear=True, decorrs=None):
    """Initialize a posterior object with data, params, and priors.
    Args:
        data: a pandas dataframe.
        params: a list of radvel parameter objects.
        priors: a list of priors to place on the posterior object.
        decorrs: a list of decorrelation vectors.
    Returns:
        post (radvel Posterior object)

    """

    if params is None:
        # params = radvel.Parameters(1, basis='per tc secosw sesinw logk')
        params = initialize_default_pars(instnames=data.tel, times=data.time)
    iparams = radvel.basis._copy_params(params)

    # Allow for time to be listed as 'time' or 'jd' (Julian Date).
    if {'jd'}.issubset(data.columns):
        data['time'] = data['jd']

    # initialize RVModel
    time_base = np.mean([data['time'].max(), data['time'].min()])
    mod = radvel.RVModel(params, time_base=time_base)

    # initialize Likelihood objects for each instrument
    telgrps = data.groupby('tel').groups
    likes = {}

    for inst in telgrps.keys():
        # 10/8: ADD DECORRELATION VECTORS AND VARS, ONLY FOR SELECTED INST.
        likes[inst] = radvel.likelihood.RVLikelihood(
            mod,
            data.iloc[telgrps[inst]].time,
            data.iloc[telgrps[inst]].mnvel,
            data.iloc[telgrps[inst]].errvel,
            suffix='_' + inst)

        likes[inst].params['gamma_' + inst] = iparams['gamma_' + inst]
        likes[inst].params['jit_' + inst] = iparams['jit_' + inst]
    # Can this be cleaner? like = radvel.likelihood.CompositeLikelihood(likes)
    like = radvel.likelihood.CompositeLikelihood(list(likes.values()))

    post = radvel.posterior.Posterior(like)
    if priors == []:
        priors.append(radvel.prior.PositiveKPrior(post.params.num_planets))
        priors.append(radvel.prior.EccentricityPrior(post.params.num_planets))

        if not linear:
            if ('j' in telgrps.keys()) and ('k' in telgrps.keys()):
                TexStr = 'Gaussian Prior on HIRES offset'
                OffsetPrior = radvel.prior.UserDefinedPrior(
                    ['gamma_j', 'gamma_k'], GaussianDiffFunc, TexStr)
                priors.append(OffsetPrior)
        #for inst in telgrps.keys():
        #    priors.append(radvel.prior.Jeffrey('jit_'+inst, 0.01, 20.0))
    post.priors = priors

    return post
示例#3
0
    def initialize_model(e):
        time_base = 0.0
        params = radvel.Parameters(1, basis='per tp e w k')
        params['per1'] = radvel.Parameter(value=6)
        params['tp1'] = radvel.Parameter(value=2)
        params['e1'] = radvel.Parameter(value=e)
        params['w1'] = radvel.Parameter(value=0.0)
        params['k1'] = radvel.Parameter(value=10.1)

        mod = radvel.RVModel(params, time_base=time_base)
        mod.params['dvdt'] = radvel.Parameter(value=-0.0)
        mod.params['curv'] = radvel.Parameter(value=0.0)
        return mod
示例#4
0
def initialize_posterior(P):
    params = P.params.basis.from_cps(P.params, P.fitting_basis, keep=False)

    for key in params.keys():
        if key.startswith('logjit'):
            msg = """
Fitting log(jitter) is depreciated. Please convert your config
files to initialize 'jit' instead of 'logjit' parameters.
Converting 'logjit' to 'jit' for you now.
"""
            warnings.warn(msg, DeprecationWarning, stacklevel=2)
            newkey = key.replace('logjit', 'jit')
            params[newkey] = np.exp(params[key])
            P.vary[newkey] = P.vary[key]
            del P.vary[key]
            del params[key]

    iparams = params.copy()

    # Make sure we don't have duplicate indicies in the DataFrame
    P.data = P.data.reset_index(drop=True)

    # initialize RVmodel object
    mod = radvel.RVModel(params, time_base=P.time_base)

    # initialize RVlikelihood objects for each instrument
    telgrps = P.data.groupby('tel').groups
    likes = {}
    for inst in P.instnames:
        likes[inst] = radvel.likelihood.RVLikelihood(
            mod,
            P.data.iloc[telgrps[inst]].time,
            P.data.iloc[telgrps[inst]].mnvel,
            P.data.iloc[telgrps[inst]].errvel,
            suffix='_' + inst)
        likes[inst].params['gamma_' + inst] = iparams['gamma_' + inst]
        likes[inst].params['jit_' + inst] = iparams['jit_' + inst]

    like = radvel.likelihood.CompositeLikelihood(likes.values())

    # Set fixed/vary parameters
    like.vary.update(P.vary)

    # Initialize Posterior object
    post = radvel.posterior.Posterior(like)
    post.priors = P.priors
    return post
def initialize_model(planets, TESSAPFdata, addextra=False):
    time_base = 2458362.5

    nplan = len(planets)
    if addextra:
        nplan = nplan + 1
    params = radvel.Parameters(
        nplan, basis='per tp e w k')  # number of planets = nplan
    n = 1
    for idx in planets:
        c_period = TESSAPFdata['period'][idx]
        k = radvel.utils.semi_amplitude(TESSAPFdata['est_mass'][idx], c_period,
                                        TESSAPFdata['mstar'][idx], 0.)
        tpstart = time_base + c_period * (TESSAPFdata['phase'][idx] + 0.25)
        params['per%d' % (n)] = radvel.Parameter(value=c_period)
        params['tp%d' % (n)] = radvel.Parameter(value=tpstart)
        params['e%d' % (n)] = radvel.Parameter(value=0.0)
        params['w%d' % (n)] = radvel.Parameter(value=0.)
        params['k%d' % (n)] = radvel.Parameter(value=k)
        n = n + 1

    if addextra:
        params['per%d' % (n)] = radvel.Parameter(value=30.)
        params['tp%d' % (n)] = radvel.Parameter(value=time_base + 15.)
        params['e%d' % (n)] = radvel.Parameter(value=0.0001)
        params['w%d' % (n)] = radvel.Parameter(value=np.pi / 2.)
        params['k%d' % (n)] = radvel.Parameter(value=2.)


#     nparams = params.basis.from_cps(params,'per tc e w k') # transform to new basis (for less biased fits?)
#     n = 1
#     if addextra:
#         n = 2
#     for i in range(1,len(planets+n)):
# #         del nparams['e%d' % (i)]
# # #        del nparams['k%d' % (i)]
# #         del nparams['w%d' % (i)]
#         del nparams['tp%d' % (i)]
#     # new basis

    mod = radvel.RVModel(params, time_base=time_base)
    mod.params['dvdt'] = radvel.Parameter(value=0.0)
    mod.params['curv'] = radvel.Parameter(value=0.0)
    return mod
def get_full_like(observations_df):
    """
    Get a radvel likelihood object for a two-planet radial velocity model.
    
    Arguments
    ---------
    observations_df : pandas DataFrame
        Dataframe containing the radial observations.
        Required columns:
            'instrument','time','velocity','uncertainty'

    Returns
    -------
    radvel CompositeLikelihood
    """
    # Set up radvel likelihood object
    fitbasis = 'per tc e w k'
    params = radvel.Parameters(2, basis=fitbasis)
    mdl = radvel.RVModel(params, time_base=observations_df.time.median())
    likes = []
    instruments = observations_df.instrument.unique()
    for i, instrument in enumerate(instruments):
        data = observations_df.query('instrument==@instrument')[[
            'time', 'velocity', 'uncertainty'
        ]].values
        inst_like = radvel.likelihood.RVLikelihood(mdl,
                                                   *(data.T),
                                                   suffix=instrument)
        # ... setting pars to 0 is for some reason
        # neccessary to stop the code from eating shit...
        for key, par in inst_like.params.items():
            par.value = 0
        likes.append(inst_like)
    like = radvel.likelihood.CompositeLikelihood(likes)
    like.params['dvdt'].vary = False
    like.params['curv'].vary = False
    return like
示例#7
0
    def initialize_model(self, periods, numplanets):
        """
        Initialize the RadVel keplerian analysis model as described in the tutorial for each of the n number of planets
        specified Fulton et al. (2018).
        :param periods: The periods specified for each planet.
        :param numplanets: The number of planets in the system.
        :return: mod, the initialized radvel model.
        """
        time_base = self.t.values[0]
        params = radvel.Parameters(numplanets,
                                   basis='per tc secosw sesinw logk')

        for i in range(1, numplanets + 1):
            params['per' + str(i)] = radvel.Parameter(value=periods[i - 1])
            params['tc' + str(i)] = radvel.Parameter(value=self.t[0])
            params['secosw' + str(i)] = radvel.Parameter(value=0.01)
            params['sesinw' + str(i)] = radvel.Parameter(value=0.01)
            params['logk' + str(i)] = radvel.Parameter(value=1.1)

        mod = radvel.RVModel(params, time_base=time_base)
        mod.params['dvdt'] = radvel.Parameter(value=-0.02)
        mod.params['curv'] = radvel.Parameter(value=0.01)
        print(mod)
        return mod
示例#8
0
def initialize_posterior(config_file, decorr=False):
    """Initialize Posterior object

    Parse a setup file and initialize the RVModel, Likelihood, Posterior and priors.

    Args:
        config_file (string): path to config file
        decorr (bool): (optional) decorrelate RVs against columns defined in the decorr_vars list

    Returns:
        tuple: (object representation of config file, radvel.Posterior object)
    """

    system_name = os.path.basename(config_file).split('.')[0]
    P = imp.load_source(system_name, os.path.abspath(config_file))

    params = P.params
    assert str(params.basis) == "Basis Object <{}>".format(
        P.fitting_basis), """
Parameters in config file must be converted to fitting basis.
"""

    if decorr:
        try:
            decorr_vars = P.decorr_vars
        except:
            raise Exception("--decorr option selected,\
 but decorr_vars is not found in your setup file.")
    else:
        decorr_vars = []

    for key in params.keys():
        if key.startswith('logjit'):
            msg = """
Fitting log(jitter) is depreciated. Please convert your config
files to initialize 'jit' instead of 'logjit' parameters.
Converting 'logjit' to 'jit' for you now.
"""
            warnings.warn(msg, DeprecationWarning, stacklevel=2)
            newkey = key.replace('logjit', 'jit')
            params[newkey] = radvel.model.Parameter(value=np.exp(
                params[key].value),
                                                    vary=params[key].vary)
            del params[key]

    iparams = radvel.basis._copy_params(params)

    # Make sure we don't have duplicate indicies in the DataFrame
    P.data = P.data.reset_index(drop=True)

    # initialize RVmodel object
    mod = radvel.RVModel(params, time_base=P.time_base)

    # initialize Likelihood objects for each instrument
    telgrps = P.data.groupby('tel').groups
    likes = {}
    for inst in P.instnames:
        assert inst in P.data.groupby('tel').groups.keys(), \
            "No data found for instrument '{}'.\nInstruments found in this dataset: {}".format(inst,
                                                                                               list(telgrps.keys()))
        decorr_vectors = {}
        if decorr:
            for d in decorr_vars:
                decorr_vectors[d] = P.data.iloc[telgrps[inst]][d].values

        try:
            hnames = P.hnames[inst]
            liketype = radvel.likelihood.GPLikelihood
            try:
                kernel_name = P.kernel_name[inst]
                if kernel_name == "Celerite":
                    liketype = radvel.likelihood.CeleriteLikelihood
            except AttributeError:
                kernel_name = "QuasiPer"
        except AttributeError:
            liketype = radvel.likelihood.RVLikelihood
            kernel_name = None
            hnames = None
        likes[inst] = liketype(mod,
                               P.data.iloc[telgrps[inst]].time,
                               P.data.iloc[telgrps[inst]].mnvel,
                               P.data.iloc[telgrps[inst]].errvel,
                               hnames=hnames,
                               suffix='_' + inst,
                               kernel_name=kernel_name,
                               decorr_vars=decorr_vars,
                               decorr_vectors=decorr_vectors)
        likes[inst].params['gamma_' + inst] = iparams['gamma_' + inst]
        likes[inst].params['jit_' + inst] = iparams['jit_' + inst]

    like = radvel.likelihood.CompositeLikelihood(list(likes.values()))

    # Initialize Posterior object
    post = radvel.posterior.Posterior(like)
    post.priors = P.priors

    return P, post
示例#9
0
bin_t, bin_vel, bin_err, bin_tel = radvel.utils.bintels(data['time'].values, data['mnvel'].values, data['errvel'].values, data['tel'].values, binsize=0.1)
data = pd.DataFrame([], columns=['time', 'mnvel', 'errvel', 'tel'])
data['time'] = bin_t
data['mnvel'] = bin_vel
data['errvel'] = bin_err
data['tel'] = bin_tel

instnames = ['j', 'k']
ntels = len(instnames)
anybasis_params['gamma_j'] = radvel.Parameter(value=0.0, vary=False, linear=True)
anybasis_params['jit_j'] = radvel.Parameter(value=1.0)
anybasis_params['gamma_k'] = radvel.Parameter(value=0.0, vary=False, linear=True)
anybasis_params['jit_k'] = radvel.Parameter(value=1.0)

params = anybasis_params.basis.to_any_basis(anybasis_params,fitting_basis)
mod = radvel.RVModel(params, time_base=time_base)

mod.params['per1'].vary = True
mod.params['tc1'].vary = True
mod.params['secosw1'].vary = True
mod.params['sesinw1'].vary = True
mod.params['per2'].vary = True
mod.params['tc2'].vary = True
mod.params['secosw2'].vary = True
mod.params['sesinw2'].vary = True
mod.params['dvdt'].vary = True
mod.params['curv'].vary = False
mod.params['jit_j'].vary = True
mod.params['jit_k'].vary = True

priors = [
示例#10
0
    if '-fname' in sys.argv:
        p = sys.argv.index('-fname')
        fname = str(sys.argv[p + 1])

    # generate the data

    np.random.seed(2021)  #For reproducibility

    x_rv = np.sort(np.random.uniform(low=1, high=100, size=25))

    yerr_rv = sigma

    synth_params = radvel.Parameters(1, basis='per tc e w k')
    synth_params['per1'] = radvel.Parameter(value=per)
    synth_params['tc1'] = radvel.Parameter(value=tc)
    synth_params['e1'] = radvel.Parameter(value=e)
    synth_params['w1'] = radvel.Parameter(value=0.0)
    synth_params['k1'] = radvel.Parameter(value=k)

    synth_params['dvdt'] = radvel.Parameter(value=0)
    synth_params['curv'] = radvel.Parameter(value=0)

    synth_model = radvel.RVModel(params=synth_params)
    y_rv = synth_model(x_rv)
    np.random.seed(2021)  #For reproducibility
    y_rv += yerr_rv * np.random.randn(len(y_rv))

    data = pd.DataFrame({'time': x_rv, 'mnvel': y_rv, 'errvel': yerr_rv})
    data.to_csv(f"./data/{fname}.csv", index=False)
示例#11
0
def initialize_sim_posterior(data, mass_c, sma_c, incl_c, ecc_c,
                             gammajit_dict, verbose=True):
    """
    Initialize Posterior object to be used for the "second planet" models.

    Basically a hack of radvel.utils.initialize_posterior

    Returns:
        tuple: (object representation of config file, radvel.Posterior object)
    """

    system_name = 'simWASP4'

    mstar = 0.864*u.Msun
    mass_b = 1.186*u.Mjup
    Mtotal = (mass_c + mass_b + mstar).to(u.Msun).value

    Msini = (mass_c * np.sin(np.deg2rad(incl_c))).to(u.Mjup).value
    period_c = np.sqrt(
        4*np.pi**2 * sma_c**3 / (const.G * Mtotal*u.Msun)
    ).to(u.day).value

    k_c = semi_amplitude(Msini, period_c, Mtotal, ecc_c, Msini_units='jupiter')

    P = templateWASP4(data, period_c, ecc_c, k_c, tc_c=2455470,
                      w_c=0.42*np.pi/2, gammajit_dict=gammajit_dict)

    # initalization from radvel.utils.initialize_posterior

    params = P.params
    assert str(params.basis) == "Basis Object <{}>".format(P.fitting_basis), """
            Parameters in config file must be converted to fitting basis.
            """

    decorr = False
    decorr_vars = []

    for key in params.keys():
        if key.startswith('logjit'):
            msg = """
            Fitting log(jitter) is depreciated. Please convert your config
            files to initialize 'jit' instead of 'logjit' parameters.
            Converting 'logjit' to 'jit' for you now.
            """
            warnings.warn(msg, DeprecationWarning, stacklevel=2)
            newkey = key.replace('logjit', 'jit')
            params[newkey] = (
                radvel.model.Parameter(value=np.exp(params[key].value),
                                       vary=params[key].vary)
            )
            del params[key]

    iparams = radvel.basis._copy_params(params)

    # Make sure we don't have duplicate indicies in the DataFrame
    P.data = P.data.reset_index(drop=True)

    # initialize RVmodel object
    mod = radvel.RVModel(params, time_base=P.time_base)

    # initialize Likelihood objects for each instrument
    telgrps = P.data.groupby('tel').groups
    likes = {}
    for inst in P.instnames:
        assert inst in P.data.groupby('tel').groups.keys(), \
            "No data found for instrument '{}'.\nInstruments found in this dataset: {}".format(inst, list(telgrps.keys()))
        decorr_vectors = {}
        if decorr:
            for d in decorr_vars:
                decorr_vectors[d] = P.data.iloc[telgrps[inst]][d].values

        try:
            hnames = P.hnames[inst]
            liketype = radvel.likelihood.GPLikelihood
            try:
                kernel_name = P.kernel_name[inst]
                # if kernel_name == "Celerite":
                #     liketype = radvel.likelihood.CeleriteLikelihood
                if kernel_name == "Celerite":
                     liketype = radvel.likelihood.CeleriteLikelihood
            except AttributeError:
                kernel_name = "QuasiPer"
        except AttributeError:
            liketype = radvel.likelihood.RVLikelihood
            kernel_name = None
            hnames = None
        likes[inst] = liketype(
            mod, P.data.iloc[telgrps[inst]].time,
            P.data.iloc[telgrps[inst]].mnvel,
            P.data.iloc[telgrps[inst]].errvel, hnames=hnames, suffix='_'+inst,
            kernel_name=kernel_name, decorr_vars=decorr_vars,
            decorr_vectors=decorr_vectors
        )
        likes[inst].params['gamma_'+inst] = iparams['gamma_'+inst]
        likes[inst].params['jit_'+inst] = iparams['jit_'+inst]

    like = radvel.likelihood.CompositeLikelihood(list(likes.values()))

    # Initialize Posterior object
    post = radvel.posterior.Posterior(like)
    post.priors = P.priors

    #return P, post
    return post
示例#12
0
params['per2'] = radvel.Parameter(value=Ps[1])
params['tc2'] = radvel.Parameter(value=2458415.6344)
params['secosw2'] = radvel.Parameter(value=np.sqrt(es[1]) * np.cos(omegas[1]))
params['sesinw2'] = radvel.Parameter(value=np.sqrt(es[1]) * np.sin(omegas[1]))
params['k2'] = radvel.Parameter(value=Ks[1])

params['per3'] = radvel.Parameter(value=Ps[2])
params['tc3'] = radvel.Parameter(value=2458409.7328)
params['secosw3'] = radvel.Parameter(value=np.sqrt(es[2]) * np.cos(omegas[2]))
params['sesinw3'] = radvel.Parameter(value=np.sqrt(es[2]) * np.sin(omegas[2]))
params['k3'] = radvel.Parameter(value=Ks[2])

# params['dvdt'] = radvel.Parameter(value=0)
# params['curv'] = radvel.Parameter(value=0)

rv_mod = radvel.RVModel(params)

like_syn = radvel.likelihood.RVLikelihood(rv_mod, t, syn_rv,
                                          np.zeros(t.size) + errval)
like_syn.params['gamma'] = radvel.Parameter(value=0)
like_syn.params['jit'] = radvel.Parameter(value=jitter)

like_syn.params['jit'].vary = False  # Don't vary jitter
# like_syn.params['k1'].vary = False # Don't vary period
# like_syn.params['k2'].vary = False # Don't vary period
# like_syn.params['k3'].vary = False # Don't vary period
# like_syn.params['per1'].vary = False # Don't vary period
# like_syn.params['per2'].vary = False # Don't vary period
# like_syn.params['per3'].vary = False # Don't vary period
like_syn.params['dvdt'].vary = False  # Don't vary dvdt
like_syn.params['curv'].vary = False  # Don't vary curvature