def calculate_julian(year, month, day, hours=None, minutes=None, seconds=None):
    """
    Calculate the julian date value.
    :param year:    the year
    :param month:   the month
    :param day:     the day
    :param hours:   the hours
    :param minutes: the minutes
    :param seconds: the seconds
    :return:        the julian date
    """
    yr = mathutils.to_int(year)
    mth = mathutils.to_int(month)
    day = mathutils.to_int(day)
    hrs = mathutils.to_int(hours)
    mns = mathutils.to_int(minutes)
    scs = mathutils.to_float(seconds)
    if mth <= 2:
        yr -= 1
        mth += 12
    if yr >= 1582:
        A = yr / 100
        B = 2 - A + (A / 4)
    else:
        B = 0
    if yr < 0:
        C = int((365.25 * yr) - 0.75)
    else:
        C = int(365.25 * yr)
    D = int(30.6001 * (mth + 1))
    return 1720994.5 + B + C + D + day + (((
        (mathutils.fix(scs, TIME_SECONDS_PRECISION) / 60.0) + float(mns)) /
                                           60.0) + float(hrs)) / 24.0
def dms_from_dd(dd):
    dd = mathutils.to_float(dd, None)
    if dd is not None:
        d = int(dd)
        dm = abs(dd - d) * 60.0
        m = int(dm + 0.0005)
        s = mathutils.fix((dm - m) * 60.0, 2)
        return d, m, s
    return None
 def get_tuple(self):
     """
     Get the current date/time as a tuple.
     :return:    the date/time (year, month, day[, hours, minutes, seconds[, mode]])
     """
     if self.year is not None:
         if self.hours is not None:
             secs = mathutils.fix(self.seconds, TIME_SECONDS_PRECISION)
             if self.mode is not None:
                 return self.year, self.month, self.day, self.hours, self.minutes, secs, self.mode
             return self.year, self.month, self.day, self.hours, self.minutes, secs
         return self.year, self.month, self.day
     return None
def hms_from_dh(dh):
    """
    Converts decimal hours to a time tuple.
    :param dh:  decimal hours to convert
    :return:    time tuple (hours, mins, secs)
    """
    dh = mathutils.to_float(dh, None)
    if dh is not None:
        h = int(dh)
        dm = abs(dh - h) * 60.0
        m = int(dm + 0.0005
                )  # add a tiny amount to make sure the minutes round properly
        s = mathutils.fix((dm - m) * 60.0, 2)
        return h, m, s
    return None
def __convert_date_time(res):
    """
    Convert the response array (usually from keyboard input) into a date time tuple.

    :param res: the response to convert
    :return:    an unvalidated date time tuple
    """
    dat = []
    i = 0
    while (i < len(res)) and (i < 7):
        if i < 5:
            dat.append(mathutils.to_int(res[i]))
        elif i == 5:
            dat.append(mathutils.fix(res[i], astrodate.TIME_SECONDS_PRECISION))
        else:
            dat.append(res[i])
        i += 1
    return dat
def read_datetime(default_datetime=None,
                  prompt=DATETIME_PROMPT,
                  format=DATETIME_FORMAT):
    """
    Read a date time tuple.

    :param default_datetime:    the default date time tuple to use
    :param prompt:              the prompt to use (optional)
    :param format:              the format to use (optional)
    :return:    the date time tuple (year, month, day[, hours, minutes, seconds, mode])
    """
    while True:
        res = sio.read_delimited_line(DATE_DELIMITER, prompt, None, format,
                                      default_datetime)
        if (type(res) is str) and (len(res) == 0):
            return None
        if (type(res) is str) and (len(res) == 1) and (res[0] == '?'):
            sio.print_newline()
            sio.print_text(DATETIME_HELP)
            sio.print_newline()
        elif (type(res) is str) and (len(res) == 1) and (res[0] == '*'):
            current = time.time()
            dat = time.gmtime(current)
            #   dat = (year, month, day, hour, min, sec, weekday, julian day, daylight savings flag)
            year = dat[0]
            month = dat[1]
            day = dat[2]
            hours = dat[3]
            minutes = dat[4]
            seconds = mathutils.fix(dat[5], astrodate.TIME_SECONDS_PRECISION)
            mode = astrodate.TIME_MODE_UT
            return year, month, day, hours, minutes, seconds, mode
        else:
            dat = __convert_date_time(res)
            if not astrodate.validate_date(dat, True):
                sio.print_newline()
                sio.print_text(DATETIME_INVALID)
                sio.print_newline()
            else:
                return tuple(dat)
 def calculate_angular_separation(self, coord2):
     if (self.mode == coord2.mode) and (self.is_equatorial() or self.is_ecliptic()):
         c1_1 = self.get_dd1()
         c2_1 = coord2.get_dd1()
         if self.is_hours():
             c1_1 *= 15.0
             c2_1 *= 15.0
         diff_c1_1_c2_1 = c1_1 - c2_1
         diff_c1_1_c2_1_rad = diff_c1_1_c2_1 * math.pi / 180.0
         c1_2 = self.get_dd2()
         c1_2_rad = c1_2 * math.pi / 180.0
         c2_2 = coord2.get_dd2()
         c2_2_rad = c2_2 * math.pi / 180.0
         cos_d = (math.sin(c1_2_rad) * math.sin(c2_2_rad)) + (math.cos(c1_2_rad) * math.cos(c2_2_rad) * math.cos(diff_c1_1_c2_1_rad))
         dd = math.acos(cos_d) * 180.0 / math.pi
         if (dd <= 0.16666667) or (dd >= 179.83333333):
             t1 = math.cos((c1_2 + c2_2) / 2.0)
             t2 = c1_1 - c2_1
             t3 = c1_2 - c2_2
             t = (t1 * t1) * (t2 * t2) + (t3 * t3)
             dd = math.sqrt(t)
         d, m, s = dms_from_dd(dd)
         return d, m, mathutils.fix(s, 2)
     raise ValueError, "Invalid coordinate! (Must be Equatorial or Ecliptic)"