Example #1
0
def get_planets():
    planet_names = ('Mercury', 'Venus', 'Mars', 'Jupiter', 'Saturn', 'Uranus',
                    'Neptune')
    d = datetime.utcnow()
    jd = cal_to_jde(d.year, d.month, d.day, d.hour, d.minute, d.second)
    dt = jd + deltaT_seconds(jd) / seconds_per_day
    st = sidereal_time_greenwich(jd)
    deltaPsi = 0.0
    epsilon = obliquity(dt)
    delta = days_per_second
    planets = []

    # this is in ecliptic coordinates
    lon = sun.apparent_longitude_low(dt, sun.longitude_radius_low(dt)[0])
    ra, dec = ecl_to_equ(lon, 0.0, epsilon)
    planets.append(equ_to_geo(ra, dec, st))

    lon, lat = elp2000.dimension3(dt)[:2]
    ra, dec = ecl_to_equ(lon, lat, epsilon)
    planets.append(equ_to_geo(ra, dec, st))

    for planet in planet_names:
        ra, dec = geocentric_planet(dt, planet, deltaPsi, epsilon,
                                    days_per_second)
        planets.append(equ_to_geo(ra, dec, st))

    return planets
Example #2
0
def rise(jd, raList, decList, h0, delta):
    """Return the Julian Day of the rise time of an object.
    
    Parameters:
        jd      : Julian Day number of the day in question, at 0 hr UT
        raList  : a sequence of three right accension values, in radians,
            for (jd-1, jd, jd+1)
        decList : a sequence of three right declination values, in radians,
            for (jd-1, jd, jd+1)
        h0      : the standard altitude in radians
        delta   : desired accuracy in days. Times less than one minute are
            infeasible for rise times because of atmospheric refraction.
            
    Returns:
        Julian Day of the rise time
    
    """
    longitude = astronomia.globals.longitude
    latitude = astronomia.globals.latitude
    THETA0 = sidereal_time_greenwich(jd)
    deltaT_days = deltaT_seconds(jd) / seconds_per_day

    cosH0 = (sin(h0) - sin(latitude) * sin(decList[1])) / (cos(latitude) * cos(decList[1]))
    #
    # future: return some indicator when the object is circumpolar or always
    # below the horizon.
    #
    if cosH0 < -1.0: # circumpolar
        return None
    if cosH0 > 1.0:  # never rises
        return None

    H0 = acos(cosH0)    
    m0 = (raList[1] + longitude - THETA0) / pi2
    m = m0 - H0 / pi2  # this is the only difference between rise() and set()
    if m < 0:
        m += 1
    elif m > 1:
        m -= 1
    if not 0 <= m <= 1:
        raise Error, "m is out of range = " + str(m)
    for bailout in range(20):
        m0 = m
        theta0 = modpi2(THETA0 + _k1 * m)
        n = m + deltaT_days
        if not -1 < n < 1:
            return None # Bug: this is where we drop some events
        ra = interpolate_angle3(n, raList)
        dec = interpolate3(n, decList)
        H = theta0 - longitude - ra
#        if H > pi:
#            H = H - pi2
        H = diff_angle(0.0, H)
        A, h = equ_to_horiz(H, dec)
        dm = (h - h0) / (pi2 * cos(dec) * cos(latitude) * sin(H))
        m += dm
        if abs(m - m0) < delta:
            return jd + m

    raise Error, "bailout"
Example #3
0
def _riseset(jd, raList, decList, h0, delta, mode,
             longitude=astronomia.globals.longitude,
             latitude=astronomia.globals.latitude):
    # Private function since rise/set so similar

    THETA0 = sidereal_time_greenwich(jd)
    deltaT_days = deltaT_seconds(jd) / seconds_per_day

    cosH0 = (np.sin(h0) - np.sin(latitude)*np.sin(decList[1])) / (
        np.cos(latitude)*np.cos(decList[1]))
    #
    # future: return some indicator when the object is circumpolar or always
    # below the horizon.
    #
    if cosH0 < -1.0:  # circumpolar
        return None
    if cosH0 > 1.0:  # never rises
        return None

    H0 = np.arccos(cosH0)
    m0 = (raList[1] + longitude - THETA0) / pi2
    if mode == 'rise':
        m = m0 - H0 / pi2  # the only difference between rise() and settime()
    elif mode == 'set':
        m = m0 + H0 / pi2  # the only difference between rise() and settime()
    if m < 0:
        m += 1
    elif m > 1:
        m -= 1
    if not 0 <= m <= 1:
        raise Error("m is out of range = " + str(m))
    for bailout in range(20):
        m0 = m
        theta0 = modpi2(THETA0 + _k1 * m)
        n = m + deltaT_days
        if not -1 < n < 1:
            return None  # Bug: this is where we drop some events
        ra = interpolate_angle3(n, raList)
        dec = interpolate3(n, decList)
        H = theta0 - longitude - ra
#        if H > pi:
#            H = H - pi2
        H = diff_angle(0.0, H)
        A, h = equ_to_horiz(H, dec)
        dm = (h - h0) / (pi2 * np.cos(dec) * np.cos(latitude) * np.sin(H))
        m += dm
        if abs(m - m0) < delta:
            return jd + m

    raise Error("bailout")
Example #4
0
def transit(jd, raList, delta):
    """Return the Julian Day of the transit time of an object.
    
    Parameters:
        jd      : Julian Day number of the day in question, at 0 hr UT
        raList  : a sequence of three right accension values, in radians,
            for (jd-1, jd, jd+1)
        delta   : desired accuracy in days. 
            
    Returns:
        Julian Day of the transit time
    
    """
    #
    # future: report both upper and lower culmination, and transits of objects below
    # the horizon
    #
    longitude = astronomia.globals.longitude
    THETA0 = sidereal_time_greenwich(jd)
    deltaT_days = deltaT_seconds(jd) / seconds_per_day

    m = (raList[1] + longitude - THETA0) / pi2
    if m < 0:
        m += 1
    elif m > 1:
        m -= 1
    if not 0 <= m <= 1:
        raise Error, "m is out of range = " + str(m)
    for bailout in range(20):
        m0 = m
        theta0 = modpi2(THETA0 + _k1 * m)
        n = m + deltaT_days
        if not -1 < n < 1:
            return None  # Bug: this is where we drop some events
        ra = interpolate_angle3(n, raList)
        H = theta0 - longitude - ra
        #        if H > pi:
        #            H = H - pi2
        H = diff_angle(0.0, H)
        dm = -H / pi2
        m += dm
        if abs(m - m0) < delta:
            return jd + m

    raise Error, "bailout"
Example #5
0
def transit(jd, raList, delta):
    """Return the Julian Day of the transit time of an object.

    Arguments:
      - `jd`      : Julian Day number of the day in question, at 0 hr UT
      - `raList`  : a sequence of three right accension values, in radians, for
        (jd-1, jd, jd+1)
      - `delta`   : desired accuracy in days.

    Returns:
      - Julian Day of the transit time

    """
    #
    # future: report both upper and lower culmination, and transits of objects
    # below the horizon
    #
    longitude = astronomia.globals.longitude
    THETA0 = sidereal_time_greenwich(jd)
    deltaT_days = deltaT_seconds(jd) / seconds_per_day

    m = (raList[1] + longitude - THETA0) / pi2
    if m < 0:
        m += 1
    elif m > 1:
        m -= 1
    if not 0 <= m <= 1:
        raise Error("m is out of range = " + str(m))
    for bailout in range(20):
        m0 = m
        theta0 = modpi2(THETA0 + _k1 * m)
        n = m + deltaT_days
        if not -1 < n < 1:
            return None  # Bug: this is where we drop some events
        ra = interpolate_angle3(n, raList)
        H = theta0 - longitude - ra
#        if H > pi:
#            H = H - pi2
        H = diff_angle(0.0, H)
        dm = -H/pi2
        m += dm
        if abs(m - m0) < delta:
            return jd + m

    raise Error("bailout")
Example #6
0
 def test_deltat(self):
     for jd, testsec in [(cal_to_jd(1977, 1, 18), 47.5),
                         (cal_to_jd(2012, 12), 66.8),
                         (cal_to_jd(-600), 18635.4),
                         (cal_to_jd(-499), 17106.9),
                         (cal_to_jd(-400), 15458.5),
                         (cal_to_jd(-300), 14011.8),
                         (cal_to_jd(-200), 12731.5),
                         (cal_to_jd(-100), 11582.4),
                         (cal_to_jd(0), 10533.7),
                         (cal_to_jd(100), 9551.9),
                         (cal_to_jd(200), 8600.4),
                         (cal_to_jd(300), 7645.2),
                         (cal_to_jd(400), 6667.5),
                         (cal_to_jd(500), 5682.2),
                         (cal_to_jd(600), 4715.1),
                         (cal_to_jd(700), 3792.4),
                         (cal_to_jd(800), 2938.1),
                         (cal_to_jd(900), 2185.6),
                         (cal_to_jd(1000), 1562.1),
                         (cal_to_jd(1100), 1079.2),
                         (cal_to_jd(1200), 728.9),
                         (cal_to_jd(1300), 486.2),
                         (cal_to_jd(1400), 317.7),
                         (cal_to_jd(1500), 195.6),
                         (cal_to_jd(1600), 118.3),
                         (cal_to_jd(1700), 21.0),
                         (cal_to_jd(1750), 13.7),
                         (cal_to_jd(1800), 12.6),
                         (cal_to_jd(1850), 6.5),
                         (cal_to_jd(1900), -2.7),
                         (cal_to_jd(2012, 9), 66.7),
                         (cal_to_jd(2012, 10), 66.8),
                         (cal_to_jd(2013, 1), 67.1),
                         (cal_to_jd(2014, 12), 68.9),
                         (cal_to_jd(2015, 1), 68.9),
                         (cal_to_jd(2016, 1), 69.4),
                         (cal_to_jd(2050, 1), 92.9),
                         (cal_to_jd(2051, 1), 95.0),
                         (cal_to_jd(2150, 1), 328.0),
                         (cal_to_jd(2151, 1), 330.1),
                         (cal_to_jd(1950), 29.1)]:
         secs = deltaT_seconds(jd)
         np.testing.assert_array_almost_equal(secs, testsec, decimal=1)
Example #7
0
def rise(jd, raList, decList, h0, delta):
    """Return the Julian Day of the rise time of an object.
    
    Parameters:
        jd      : Julian Day number of the day in question, at 0 hr UT
        raList  : a sequence of three right accension values, in radians,
            for (jd-1, jd, jd+1)
        decList : a sequence of three right declination values, in radians,
            for (jd-1, jd, jd+1)
        h0      : the standard altitude in radians
        delta   : desired accuracy in days. Times less than one minute are
            infeasible for rise times because of atmospheric refraction.
            
    Returns:
        Julian Day of the rise time
    
    """
    longitude = astronomia.globals.longitude
    latitude = astronomia.globals.latitude
    THETA0 = sidereal_time_greenwich(jd)
    deltaT_days = deltaT_seconds(jd) / seconds_per_day

    cosH0 = (sin(h0) - sin(latitude) * sin(decList[1])) / (cos(latitude) *
                                                           cos(decList[1]))
    #
    # future: return some indicator when the object is circumpolar or always
    # below the horizon.
    #
    if cosH0 < -1.0:  # circumpolar
        return None
    if cosH0 > 1.0:  # never rises
        return None

    H0 = acos(cosH0)
    m0 = (raList[1] + longitude - THETA0) / pi2
    m = m0 - H0 / pi2  # this is the only difference between rise() and set()
    if m < 0:
        m += 1
    elif m > 1:
        m -= 1
    if not 0 <= m <= 1:
        raise Error, "m is out of range = " + str(m)
    for bailout in range(20):
        m0 = m
        theta0 = modpi2(THETA0 + _k1 * m)
        n = m + deltaT_days
        if not -1 < n < 1:
            return None  # Bug: this is where we drop some events
        ra = interpolate_angle3(n, raList)
        dec = interpolate3(n, decList)
        H = theta0 - longitude - ra
        #        if H > pi:
        #            H = H - pi2
        H = diff_angle(0.0, H)
        A, h = equ_to_horiz(H, dec)
        dm = (h - h0) / (pi2 * cos(dec) * cos(latitude) * sin(H))
        m += dm
        if abs(m - m0) < delta:
            return jd + m

    raise Error, "bailout"