Beispiel #1
0
def test_orbmethods():
    from galpy.orbit import Orbit
    from galpy.potential import MWPotential2014
    # 8/17/2019: added explicit z=0.025, because that was the default at the
    # time of the galpy paper, but the default has been changed
    o = Orbit([0.8, 0.3, 0.75, 0., 0.2, 0.],
              zo=0.025)  # setup R,vR,vT,z,vz,phi
    times = numpy.linspace(0., 10., 1001)  # Output times
    o.integrate(times, MWPotential2014)  # Integrate
    o.E()  # Energy
    assert numpy.fabs(o.E() + 1.2547650648697966
                      ) < 10.**-5., 'Orbit method does not work as expected'
    o.L()  # Angular momentum
    assert numpy.all(
        numpy.fabs(o.L() - numpy.array([[0., -0.16, 0.6]])) < 10.**-5.
    ), 'Orbit method does not work as expected'
    o.Jacobi(OmegaP=0.65)  #Jacobi integral E-OmegaP Lz
    assert numpy.fabs(o.Jacobi(OmegaP=0.65) - numpy.array([-1.64476506])
                      ) < 10.**-5., 'Orbit method does not work as expected'
    o.ER(times[-1]), o.Ez(times[-1])  # Rad. and vert. E at end
    assert numpy.fabs(o.ER(times[-1]) + 1.27601734263047
                      ) < 10.**-5., 'Orbit method does not work as expected'
    assert numpy.fabs(o.Ez(times[-1]) - 0.021252201847851909
                      ) < 10.**-5., 'Orbit method does not work as expected'
    o.rperi(), o.rap(), o.zmax()  # Peri-/apocenter r, max. |z|
    assert numpy.fabs(o.rperi() - 0.44231993168097
                      ) < 10.**-5., 'Orbit method does not work as expected'
    assert numpy.fabs(o.rap() - 0.87769030382105
                      ) < 10.**-5., 'Orbit method does not work as expected'
    assert numpy.fabs(o.zmax() - 0.077452357289016
                      ) < 10.**-5., 'Orbit method does not work as expected'
    o.e()  # eccentricity (rap-rperi)/(rap+rperi)
    assert numpy.fabs(o.e() - 0.32982348199330563
                      ) < 10.**-5., 'Orbit method does not work as expected'
    o.R(2., ro=8.)  # Cylindrical radius at time 2. in kpc
    assert numpy.fabs(o.R(2., ro=8.) - 3.5470772876920007
                      ) < 10.**-3., 'Orbit method does not work as expected'
    o.vR(5., vo=220.)  # Cyl. rad. velocity at time 5. in km/s
    assert numpy.fabs(o.vR(5., vo=220.) - 45.202530965094553
                      ) < 10.**-3., 'Orbit method does not work as expected'
    o.ra(1.), o.dec(1.)  # RA and Dec at t=1. (default settings)
    # 5/12/2016: test weakened, because improved galcen<->heliocen
    #            transformation has changed these, but still close
    assert numpy.fabs(o.ra(1.) - numpy.array([288.19277])
                      ) < 10.**-1., 'Orbit method does not work as expected'
    assert numpy.fabs(o.dec(1.) - numpy.array([18.98069155])
                      ) < 10.**-1., 'Orbit method does not work as expected'
    o.jr(type='adiabatic'), o.jz()  # R/z actions (ad. approx.)
    assert numpy.fabs(o.jr(type='adiabatic') - 0.05285302231137586
                      ) < 10.**-3., 'Orbit method does not work as expected'
    assert numpy.fabs(o.jz() - 0.006637988850751242
                      ) < 10.**-3., 'Orbit method does not work as expected'
    # Rad. period w/ Staeckel approximation w/ focal length 0.5,
    o.Tr(type='staeckel', delta=0.5, ro=8., vo=220.)  # in Gyr
    assert numpy.fabs(
        o.Tr(type='staeckel', delta=0.5, ro=8., vo=220.) - 0.1039467864018446
    ) < 10.**-3., 'Orbit method does not work as expected'
    o.plot(d1='R', d2='z')  # Plot the orbit in (R,z)
    o.plot3d()  # Plot the orbit in 3D, w/ default [x,y,z]
    return None
Beispiel #2
0
def test_orbmethods():
    from galpy.orbit import Orbit
    from galpy.potential import MWPotential2014
    o= Orbit([0.8,0.3,0.75,0.,0.2,0.]) # setup R,vR,vT,z,vz,phi
    times= numpy.linspace(0.,10.,1001) # Output times
    o.integrate(times,MWPotential2014) # Integrate
    o.E() # Energy
    assert numpy.fabs(o.E()+1.2547650648697966) < 10.**-5., 'Orbit method does not work as expected'
    o.L() # Angular momentum
    assert numpy.all(numpy.fabs(o.L()-numpy.array([[ 0.  , -0.16,  0.6 ]])) < 10.**-5.), 'Orbit method does not work as expected'
    o.Jacobi(OmegaP=0.65) #Jacobi integral E-OmegaP Lz
    assert numpy.fabs(o.Jacobi(OmegaP=0.65)-numpy.array([-1.64476506])) < 10.**-5., 'Orbit method does not work as expected'
    o.ER(times[-1]), o.Ez(times[-1]) # Rad. and vert. E at end
    assert numpy.fabs(o.ER(times[-1])+1.27601734263047) < 10.**-5., 'Orbit method does not work as expected'
    assert numpy.fabs(o.Ez(times[-1])-0.021252201847851909) < 10.**-5.,  'Orbit method does not work as expected'
    o.rperi(), o.rap(), o.zmax() # Peri-/apocenter r, max. |z|
    assert numpy.fabs(o.rperi()-0.44231993168097) < 10.**-5., 'Orbit method does not work as expected'
    assert numpy.fabs(o.rap()-0.87769030382105) < 10.**-5., 'Orbit method does not work as expected'
    assert numpy.fabs(o.zmax()-0.077452357289016) < 10.**-5., 'Orbit method does not work as expected'
    o.e() # eccentricity (rap-rperi)/(rap+rperi)
    assert numpy.fabs(o.e()-0.32982348199330563) < 10.**-5., 'Orbit method does not work as expected'
    o.R(2.,ro=8.) # Cylindrical radius at time 2. in kpc
    assert numpy.fabs(o.R(2.,ro=8.)-3.5470772876920007) < 10.**-3., 'Orbit method does not work as expected'
    o.vR(5.,vo=220.) # Cyl. rad. velocity at time 5. in km/s
    assert numpy.fabs(o.vR(5.,vo=220.)-45.202530965094553) < 10.**-3., 'Orbit method does not work as expected'
    o.ra(1.), o.dec(1.) # RA and Dec at t=1. (default settings)
    # 5/12/2016: test weakened, because improved galcen<->heliocen 
    #            transformation has changed these, but still close
    assert numpy.fabs(o.ra(1.)-numpy.array([ 288.19277])) < 10.**-1., 'Orbit method does not work as expected'
    assert numpy.fabs(o.dec(1.)-numpy.array([ 18.98069155])) < 10.**-1., 'Orbit method does not work as expected'
    o.jr(type='adiabatic'), o.jz() # R/z actions (ad. approx.)
    assert numpy.fabs(o.jr(type='adiabatic')-0.05285302231137586) < 10.**-3., 'Orbit method does not work as expected'
    assert numpy.fabs(o.jz()-0.006637988850751242) < 10.**-3., 'Orbit method does not work as expected'
    # Rad. period w/ Staeckel approximation w/ focal length 0.5,
    o.Tr(type='staeckel',delta=0.5,ro=8.,vo=220.) # in Gyr  
    assert numpy.fabs(o.Tr(type='staeckel',delta=0.5,ro=8.,vo=220.)-0.1039467864018446) < 10.**-3., 'Orbit method does not work as expected'
    o.plot(d1='R',d2='z') # Plot the orbit in (R,z)
    o.plot3d() # Plot the orbit in 3D, w/ default [x,y,z]
    return None
now_arrayphi_star3 = star3.phi(-ts)

#finding velocity components of star 1 now:
now_arrayvr_star3 = star3.vR(-ts)
now_arrayvt_star3 = star3.vT(-ts)
now_arrayvz_star3 = star3.vz(-ts)

#finding energies of star 1 now:
now_arraye_star3 = star3.E(-ts)
now_arrayer_star3 = star3.ER(-ts)
now_arrayez_star3 = star3.Ez(-ts)

i = (range(len(-ts)))

now_arrayra_star3 = star3.ra(-ts)[i]
now_arraydec_star3 = star3.dec(-ts)[i]
now_arrayra_star2 = star2.ra(-ts)[i]
now_arraydec_star2 = star2.dec(-ts)[i]
now_arrayra_star1 = star1.ra(-ts)[i]
now_arraydec_star1 = star1.dec(-ts)[i]
now_arrayra_omega = forward_omega_orbit.ra(-ts)[i]
now_arraydec_omega = forward_omega_orbit.dec(-ts)[i]
#compared with current orbit of omega cen

print("original omega cen location according to builtin orbit:",rrr,vrvr,vtvt,zzz,vzvz,phiphi)
print('current star 3 location:',now_arrayR_star3[-1],now_arrayvr_star3[-1],now_arrayvt_star3[-1],now_arrayz_star3[-1],now_arrayvz_star3[-1],now_arrayphi_star3[-1])

i = (range(len(-ts)))


#ploting 3 stars R when changing velocities
Beispiel #4
0
def orbital_path(cluster,
                 dt=0.1,
                 nt=100,
                 pot=MWPotential2014,
                 from_centre=False,
                 skypath=False,
                 initialize=False,
                 ro=8.0,
                 vo=220.0,
                 plot=False):
    """Calculate the cluster's orbital path

    Parameters
    ----------
    cluster : class
        StarCluster
    dt : float
        timestep that StarCluster is to be moved to
    nt : int
        number of timesteps
    pot : class
        galpy Potential that orbit is to be integrate in (default: MWPotential2014)
    from_centre : bool
        genrate orbit from cluster's exact centre instead of its assigned galactocentric coordinates (default: False)
    sky_path : bool
        return sky coordinates instead of cartesian coordinates (default: False)
    initialize : bool
        Initialize and return Orbit (default: False)
    ro :float 
        galpy distance scale (Default: 8.)
    vo : float
        galpy velocity scale (Default: 220.)
    plot : bool
        plot a snapshot of the cluster in galactocentric coordinates with the orbital path (defualt: False)

    Returns
    -------
    t : float
        times for which path is provided
    x,y,z : float
        orbit positions
    vx,vy,vz : float
        orbit velocity
    o : class
        galpy orbit (if initialize==True)
    History
    -------
    2018 - Written - Webb (UofT)
    """
    o = initialize_orbit(cluster, from_centre=from_centre)

    ts = np.linspace(0, -1.0 * dt / bovy_conversion.time_in_Gyr(ro=ro, vo=vo),
                     nt)
    o.integrate(ts, pot)

    R, phi, z = bovy_coords.rect_to_cyl(o.x(ts[-1]), o.y(ts[-1]), o.z(ts[-1]))
    vR, vT, vz = bovy_coords.rect_to_cyl_vec(o.vx(ts[-1]), o.vy(ts[-1]),
                                             o.vz(ts[-1]), o.x(ts[-1]),
                                             o.y(ts[-1]), o.z(ts[-1]))
    o = Orbit(
        [R / ro, vR / vo, vT / vo, z / ro, vz / vo, phi],
        ro=ro,
        vo=vo,
        solarmotion=[-11.1, 24.0, 7.25],
    )
    ts = np.linspace(
        -1.0 * dt / bovy_conversion.time_in_Gyr(ro=ro, vo=vo),
        dt / bovy_conversion.time_in_Gyr(ro=ro, vo=vo),
        nt,
    )
    o.integrate(ts, pot)

    if skypath:
        ra = np.array(o.ra(ts))
        dec = np.array(o.dec(ts))
        dist = np.array(o.dist(ts))
        pmra = np.array(o.pmra(ts))
        pmdec = np.array(o.pmdec(ts))
        vlos = np.array(o.vlos(ts))

        if cluster.units == "pckms":
            t = ts * bovy_conversion.time_in_Gyr(ro=ro, vo=vo)
        elif cluster.units == "nbody":
            t = ts * bovy_conversion.time_in_Gyr(ro=ro, vo=vo) / cluster.tstar
        elif cluster.units == "galpy":
            t = ts
        else:
            t = ts * bovy_conversion.time_in_Gyr(ro=ro, vo=vo)

        if plot:
            filename = kwargs.pop("filename", None)
            overplot = kwargs.pop("overplot", False)
            skyplot(cluster)
            plt.plot(ra, dec)
            if filename != None:
                plt.savefig(filename)

        if initialize:
            cluster.orbit = o
            return t, ra, dec, dist, pmra, pmdec, vlos, o
        else:
            return t, ra, dec, dist, pmra, pmdec, vlos
    else:
        x = np.array(o.x(ts))
        y = np.array(o.y(ts))
        z = np.array(o.z(ts))
        vx = np.array(o.vx(ts))
        vy = np.array(o.vy(ts))
        vz = np.array(o.vz(ts))

        if cluster.units == "pckms":
            x *= 1000.0
            y *= 1000.0
            z *= 1000.0
            t = ts * bovy_conversion.time_in_Gyr(ro=ro, vo=vo)
        elif cluster.units == "nbody":
            x *= 1000.0 / cluster.rbar
            y *= 1000.0 / cluster.rbar
            z *= 1000.0 / luster.rbar
            vx /= cluster.vstar
            vy /= cluster.vstar
            vz /= cluster.vstar
            t = ts * bovy_conversion.time_in_Gyr(ro=ro, vo=vo) / cluster.tstar

        elif cluster.units == "galpy":
            x /= ro
            y /= ro
            z /= ro
            vx /= vo
            vy /= vo
            vz /= vo
            t = ts
        else:
            t = ts * bovy_conversion.time_in_Gyr(ro=ro, vo=vo)

        if plot:
            filename = kwargs.pop("filename", None)
            overplot = kwargs.pop("overplot", False)
            starplot(cluster, coord='xy', overplot=overplot)
            _lplot(x, y, overplot=True)

            if filename != None:
                plt.savefig(filename)

        if initialize:
            return t, x, y, z, vx, vy, vz, o
        else:
            return t, x, y, z, vx, vy, vz
Beispiel #5
0
def orbital_path(
    cluster,
    dt=0.1,
    nt=100,
    pot=MWPotential2014,
    from_centre=False,
    skypath=False,
    initialize=False,
    r0=8.0,
    v0=220.0,
):
    """
    NAME:

       orbital_path

    PURPOSE:

       Calculate orbital path +/- dt Gyr around the cluster

    INPUT:

       cluster - StarCluster

       dt - timestep that StarCluster is to be moved to

       nt - number of timesteps

       pot - Potential orbit is to be integrate in (Default: MWPotential2014)

       from_centre - interpolate from cluster's define position (default) or the measured centre of cluster 

       sky_path - return sky coordinates instead of cartesian coordinates (Default: False)

       initialize - Initialize and return Orbit (Default: False)

       r0 - galpy distance scale (Default: 8.)

       v0 - galpy velocity scale (Default: 220.)

    OUTPUT:

       t,x,y,z,vx,vy,vz

    HISTORY:

       2018 - Written - Webb (UofT)
    """
    o = initialize_orbit(cluster, from_centre=from_centre)

    ts = np.linspace(0, -1.0 * dt / bovy_conversion.time_in_Gyr(ro=r0, vo=v0), nt)
    o.integrate(ts, pot)

    R, phi, z = bovy_coords.rect_to_cyl(o.x(ts[-1]), o.y(ts[-1]), o.z(ts[-1]))
    vR, vT, vz = bovy_coords.rect_to_cyl_vec(
        o.vx(ts[-1]), o.vy(ts[-1]), o.vz(ts[-1]), o.x(ts[-1]), o.y(ts[-1]), o.z(ts[-1])
    )
    o = Orbit(
        [R / r0, vR / v0, vT / v0, z / r0, vz / v0, phi],
        ro=r0,
        vo=v0,
        solarmotion=[-11.1, 24.0, 7.25],
    )
    ts = np.linspace(
        -1.0 * dt / bovy_conversion.time_in_Gyr(ro=r0, vo=v0),
        dt / bovy_conversion.time_in_Gyr(ro=r0, vo=v0),
        nt,
    )
    o.integrate(ts, pot)

    if skypath:
        ra = np.array(o.ra(ts))
        dec = np.array(o.dec(ts))
        dist = np.array(o.dist(ts))
        pmra = np.array(o.pmra(ts))
        pmdec = np.array(o.pmdec(ts))
        vlos = np.array(o.vlos(ts))

        if cluster.units == "realpc":
            t = ts * bovy_conversion.time_in_Gyr(ro=r0, vo=v0)
        elif cluster.units == "nbody":
            t = ts * bovy_conversion.time_in_Gyr(ro=r0, vo=v0) / cluster.tstar
        elif cluster.units == "galpy":
            t = ts
        else:
            t = ts * bovy_conversion.time_in_Gyr(ro=r0, vo=v0)

        if initialize:
            cluster.orbit = o
            return t, ra, dec, dist, pmra, pmdec, vlos, o
        else:
            return t, ra, dec, dist, pmra, pmdec, vlos
    else:
        x = np.array(o.x(ts))
        y = np.array(o.y(ts))
        z = np.array(o.z(ts))
        vx = np.array(o.vx(ts))
        vy = np.array(o.vy(ts))
        vz = np.array(o.vz(ts))

        if cluster.units == "realpc":
            x *= 1000.0
            y *= 1000.0
            z *= 1000.0
            t = ts * bovy_conversion.time_in_Gyr(ro=r0, vo=v0)
        elif cluster.units == "nbody":
            x *= 1000.0 / cluster.rbar
            y *= 1000.0 / cluster.rbar
            z *= 1000.0 / luster.rbar
            vx /= cluster.vstar
            vy /= cluster.vstar
            vz /= cluster.vstar
            t = ts * bovy_conversion.time_in_Gyr(ro=r0, vo=v0) / cluster.tstar

        elif cluster.units == "galpy":
            x /= r0
            y /= r0
            z /= r0
            vx /= v0
            vy /= v0
            vz /= v0
            t = ts
        else:
            t = ts * bovy_conversion.time_in_Gyr(ro=r0, vo=v0)

        if initialize:
            cluster.orbit = o
            return t, x, y, z, vx, vy, vz, o
        else:
            return t, x, y, z, vx, vy, vz
o.integrate(ts, MWPotential, method='dopr54_c')

##Integrating Forward in time
newOrbit = Orbit([o.R(TIME), -o.vR(TIME), -o.vT(TIME), o.z(TIME), -o.vz(TIME), o.phi(TIME)],ro=8.,vo=220.)
newOrbit.turn_physical_off()
newOrbit.integrate(ts, MWPotential, method='dopr54_c')


def randomVelocity(std=.001):
    if type(std).__name__ == "Quantity":
        return nu.random.normal(scale=std.value)*std.unit
    return nu.random.normal(scale=std)

time1 = nu.arange(0, TIME.value, dt.value)*units.Myr
orbits_pos = nu.empty((len(time1) + 1,9,len(ts)), dtype=units.quantity.Quantity)
orbits_pos[0, :, :] = ts, newOrbit.x(ts), newOrbit.y(ts), newOrbit.z(ts), newOrbit.vx(ts), newOrbit.vy(ts), newOrbit.vz(ts), newOrbit.ra(ts), newOrbit.dec(ts)
orbits_pos[:,:,:] = orbits_pos[0,:,:]
i = 0
std = 0.004
stdR = std
stdT = std
stdz = std
for t in time1:
    print t
    dvR = randomVelocity(stdR)
    dvT = randomVelocity(stdT)
    dvz = randomVelocity(stdz)
    #dvR, dvT, dvz = 0,0,0
    tempOrbit = Orbit([newOrbit.R(t), newOrbit.vR(t) + dvR, newOrbit.vT(t) + dvT, newOrbit.z(t), newOrbit.vz(t) + dvz, newOrbit.phi(t)],ro=8.,vo=220.)
    tempOrbit.turn_physical_off()
    time = nu.arange(0,(TIME + step_size - t).value,step_size.value)*units.Myr
Beispiel #7
0
def pal5_dpmguess(pot,
                  doras=None,
                  dodecs=None,
                  dovloss=None,
                  dmin=21.,
                  dmax=25.,
                  dstep=0.02,
                  pmmin=-0.36,
                  pmmax=0.36,
                  pmstep=0.01,
                  alongbfpm=False,
                  ro=_REFR0,
                  vo=_REFV0):
    if doras is None:
        with open('pal5_stream_orbit_offset.pkl', 'rb') as savefile:
            doras = pickle.load(savefile)
            dodecs = pickle.load(savefile)
            dovloss = pickle.load(savefile)
    ds = numpy.arange(dmin, dmax + dstep / 2., dstep)
    pmoffs = numpy.arange(pmmin, pmmax + pmstep / 2., pmstep)
    lnl = numpy.zeros((len(ds), len(pmoffs)))
    pos_radec, rvel_ra = pal5_data()
    print("Determining good distance and parallel proper motion...")
    for ii, d in tqdm.tqdm(enumerate(ds)):
        for jj, pmoff in enumerate(pmoffs):
            if alongbfpm:
                pm = (d - 24.) * 0.099 + 0.0769 + pmoff
            else:
                pm = pmoff
            progt = Orbit([
                229.11, 0.3, d + 0.3, -2.27 + pm, -2.22 + pm * 2.257 / 2.296,
                -58.5
            ],
                          radec=True,
                          ro=ro,
                          vo=vo,
                          solarmotion=[-11.1, 24., 7.25]).flip()
            ts = numpy.linspace(0., 3., 1001)
            progt.integrate(ts, pot)
            progt._orb.orbit[:, 1] *= -1.
            progt._orb.orbit[:, 2] *= -1.
            progt._orb.orbit[:, 4] *= -1.
            toras, todecs, tovloss = progt.ra(ts), progt.dec(ts), progt.vlos(
                ts)
            # Interpolate onto common RA
            ipdec = interpolate.InterpolatedUnivariateSpline(toras, todecs)
            ipvlos = interpolate.InterpolatedUnivariateSpline(toras, tovloss)
            todecs = ipdec(doras) - dodecs
            tovloss = ipvlos(doras) - dovloss
            est_trackRADec_trailing = numpy.zeros((1, len(doras), 2))
            est_trackRADec_trailing[0, :, 0] = doras
            est_trackRADec_trailing[0, :, 1] = todecs
            est_trackRAVlos_trailing = numpy.zeros((1, len(doras), 2))
            est_trackRAVlos_trailing[0, :, 0] = doras
            est_trackRAVlos_trailing[0, :, 1] = tovloss
            lnl[ii,jj]= numpy.sum(\
                pal5_lnlike(pos_radec,rvel_ra,
                            est_trackRADec_trailing,
                            est_trackRADec_trailing, # hack
                            est_trackRAVlos_trailing,
                            est_trackRAVlos_trailing, # hack
                            numpy.array([0.]),
                            numpy.array([0.]),None)[0,:3:2])\
                                    -0.5*pm**2./0.186**2. #pm measurement
    bestd = ds[numpy.unravel_index(numpy.argmax(lnl), lnl.shape)[0]]
    if alongbfpm:
        bestpmoff= (bestd-24.)*0.099+0.0769\
            +pmoffs[numpy.unravel_index(numpy.argmax(lnl),lnl.shape)[1]]
    else:
        bestpmoff = pmoffs[numpy.unravel_index(numpy.argmax(lnl),
                                               lnl.shape)[1]]
    return (bestd, bestpmoff, lnl, ds, pmoffs)
def pal5_dpmguess(
    pot: PotentialType,
    doras: Optional[float] = None,
    dodecs: Optional[float] = None,
    dovloss: Optional[float] = None,
    dmin: float = 21.0,
    dmax: float = 25.0,
    dstep: float = 0.02,
    pmmin: float = -0.36,
    pmmax: float = 0.36,
    pmstep: float = 0.01,
    alongbfpm: bool = False,
    ro: float = REFR0,
    vo: float = REFV0,
) -> tuple:
    """pal5_dpmguess.

    Parameters
    ----------
    pot: Potential
    doras : float or None, optional
        default None
    dodecs : float or None, optional
        default None
    dovloss : float or None, optional
        default None
    dmin=21 : float or None, optional
        default 0
    dmax=25 : float or None, optional
        default 0
    dstep=0 : float or None, optional
        default 02
    pmmin=-0 : float or None, optional
        default 36
    pmmax=0 : float or None, optional
        default 36
    pmstep=0 : float or None, optional
        default 01
    alongbfpm : float or None, optional
        default False
    ro : float or None, optional
        default REFR0
    vo : float or None, optional
        default REFV0

    Returns
    -------
    bestd
    bestpmoff
    lnl
    ds
    pmoffs

    """
    if doras is None:
        with open("pal5_stream_orbit_offset.pkl", "rb") as savefile:
            doras = pickle.load(savefile)
            dodecs = pickle.load(savefile)
            dovloss = pickle.load(savefile)

    ds = np.arange(dmin, dmax + dstep / 2.0, dstep)
    pmoffs = np.arange(pmmin, pmmax + pmstep / 2.0, pmstep)
    lnl = np.zeros((len(ds), len(pmoffs)))

    pos_radec, rvel_ra = pal5_data_total()

    print("Determining good distance and parallel proper motion...")

    for ii, d in tqdm(enumerate(ds)):
        for jj, pmoff in enumerate(pmoffs):
            if alongbfpm:
                pm = (d - 24.0) * 0.099 + 0.0769 + pmoff
            else:
                pm = pmoff
            progt = Orbit(
                [
                    229.11,
                    0.3,
                    d + 0.3,
                    -2.27 + pm,
                    -2.22 + pm * 2.257 / 2.296,
                    -58.5,
                ],
                radec=True,
                ro=ro,
                vo=vo,
                solarmotion=[-11.1, 24.0, 7.25],
            ).flip()
            ts = np.linspace(0.0, 3.0, 1001)
            progt.integrate(ts, pot)
            progt._orb.orbit[:, 1] *= -1.0
            progt._orb.orbit[:, 2] *= -1.0
            progt._orb.orbit[:, 4] *= -1.0
            toras, todecs, tovloss = (
                progt.ra(ts),
                progt.dec(ts),
                progt.vlos(ts),
            )
            # Interpolate onto common RA
            ipdec = interpolate.InterpolatedUnivariateSpline(toras, todecs)
            ipvlos = interpolate.InterpolatedUnivariateSpline(toras, tovloss)
            todecs = ipdec(doras) - dodecs
            tovloss = ipvlos(doras) - dovloss
            est_trackRADec_trailing = np.zeros((1, len(doras), 2))
            est_trackRADec_trailing[0, :, 0] = doras
            est_trackRADec_trailing[0, :, 1] = todecs
            est_trackRAVlos_trailing = np.zeros((1, len(doras), 2))
            est_trackRAVlos_trailing[0, :, 0] = doras
            est_trackRAVlos_trailing[0, :, 1] = tovloss
            lnl[ii, jj] = (
                np.sum(
                    pal5_lnlike(
                        pos_radec,
                        rvel_ra,
                        est_trackRADec_trailing,
                        est_trackRADec_trailing,  # hack
                        est_trackRAVlos_trailing,
                        est_trackRAVlos_trailing,  # hack
                        np.array([0.0]),
                        np.array([0.0]),
                        None,
                    )[0, :3:2]) - 0.5 * pm**2.0 / 0.186**2.0)  # pm measurement

        # /for
    # /for

    bestd = ds[np.unravel_index(np.argmax(lnl), lnl.shape)[0]]

    if alongbfpm:
        bestpmoff = ((bestd - 24.0) * 0.099 + 0.0769 +
                     pmoffs[np.unravel_index(np.argmax(lnl), lnl.shape)[1]])
    else:
        bestpmoff = pmoffs[np.unravel_index(np.argmax(lnl), lnl.shape)[1]]
    # /if

    return bestd, bestpmoff, lnl, ds, pmoffs
Beispiel #9
0
        for key in cols:
            o_data[key] = np.nan

################################################################################

# Integrate orbit ##############################################################

if verbose: print "Initializing orbit"
o = Orbit(vxvv=vxvv, radec=True, ro=ro, vo=vo, solarmotion=solarmotion)

if verbose: print "Integrating orbit"
o.integrate(ts, pot, method='leapfrog')

if verbose: print "Saving results to data frame."
if 'ra' in o_data.keys(): o_data['ra'] = o.ra(ts)
if 'dec' in o_data.keys(): o_data['dec'] = o.dec(ts)
if 'd' in o_data.keys(): o_data['d'] = o.dist(ts)
if 'pmra' in o_data.keys(): o_data['pmra'] = o.pmra(ts)
if 'pmde' in o_data.keys(): o_data['pmde'] = o.pmdec(ts)
if 'rv' in o_data.keys(): o_data['rv'] = o.vlos(ts)

if 'x' in o_data.keys(): o_data['x'] = o.x(ts)
if 'y' in o_data.keys(): o_data['y'] = o.y(ts)
if 'z' in o_data.keys(): o_data['z'] = o.z(ts)
if 'r' in o_data.keys(): o_data['r'] = o.R(ts)
if 'phi' in o_data.keys(): o_data['phi'] = o.phi(ts)

if 'vx' in o_data.keys(): o_data['vx'] = o.vx(ts)
if 'vy' in o_data.keys(): o_data['vy'] = o.vy(ts)
if 'vz' in o_data.keys(): o_data['vz'] = o.vz(ts)
if 'vr' in o_data.keys(): o_data['vr'] = o.vR(ts)