Exemple #1
0
 def to_localized_string(self, city):
   from jyotisha.panchaanga.temporal.time import Timezone
   return "muhUrta %d (nirvIrya: %s) starts from %s to %s" % (self.muhuurta_id, str(self.is_nirviirya),
                                                              Timezone(city.timezone).julian_day_to_local_time(
                                                                julian_day=self.jd_start, round_seconds=True),
                                                              Timezone(city.timezone).julian_day_to_local_time(
                                                                julian_day=self.jd_end, round_seconds=True))
Exemple #2
0
def test_jd_from_local_time():
    jd = Timezone("America/Los_Angeles").local_time_to_julian_day(
        date=Date(year=2018, month=11, day=11, hour=6, minute=0, second=0))
    import numpy.testing
    numpy.testing.assert_approx_equal(actual=jd,
                                      desired=2458433.750000,
                                      significant=7)
Exemple #3
0
 def get(self, timezone, year, month, day, hour, minute, second, body):
     from jyotisha import zodiac
     jd = Timezone(timezone).local_time_to_julian_day(
         Date(year, month, day, hour, minute, second))
     from jyotisha.panchaanga import temporal
     transits = Graha.singleton(body).get_transits(
         jd_start=jd,
         jd_end=jd + 100,
         anga_type=AngaType.RASHI,
         ayanaamsha_id=Ayanamsha.CHITRA_AT_180)
     # logging.debug(transits)
     transits_local = [
         (Timezone(timezone).julian_day_to_local_time(transit.jd),
          transit.value_1, transit.value_2) for transit in transits
     ]
     return str(transits_local)
Exemple #4
0
def get_panchaanga_for_shaka_year(city,
                                  year,
                                  precomputed_json_dir="~/Documents/jyotisha",
                                  computation_system: ComputationSystem = None,
                                  allow_precomputed=True):
    fname = os.path.expanduser(
        '%s/%s__shaka_%s__%s.json' %
        (precomputed_json_dir, city.name, year, computation_system))
    if os.path.isfile(fname) and allow_precomputed:
        fn = lambda: get_panchaanga_for_shaka_year(
            city=city,
            year=year,
            precomputed_json_dir=precomputed_json_dir,
            computation_system=computation_system,
            allow_precomputed=False)
        panchaanga = load_panchaanga(fname=fname, fallback_fn=fn)
        # Fest repos to be used might have changed in this call.
        panchaanga.computation_system = computation_system
        panchaanga.update_festival_details()
        return panchaanga
    else:
        logging.info(
            'No precomputed data available. Computing panchaanga...\n')
        SHAKA_CIVIL_ERA_DIFF = 78
        start_year_civil = year + era.get_year_0_offset(era_id=era.ERA_SHAKA)
        anga_span_finder = AngaSpanFinder.get_cached(
            ayanaamsha_id=Ayanamsha.ASHVINI_STARTING_0,
            anga_type=AngaType.SIDEREAL_MONTH)
        start_equinox = anga_span_finder.find(jd1=time.utc_gregorian_to_jd(
            Date(year=start_year_civil, month=3, day=1)),
                                              jd2=time.utc_gregorian_to_jd(
                                                  Date(year=start_year_civil,
                                                       month=5,
                                                       day=1)),
                                              target_anga_id=1)
        end_equinox = anga_span_finder.find(jd1=time.utc_gregorian_to_jd(
            Date(year=start_year_civil + 1, month=3, day=1)),
                                            jd2=time.utc_gregorian_to_jd(
                                                Date(year=start_year_civil + 1,
                                                     month=5,
                                                     day=1)),
                                            target_anga_id=1)
        tz = Timezone(city.timezone)
        panchaanga = periodical.Panchaanga(
            city=city,
            start_date=tz.julian_day_to_local_time(
                julian_day=start_equinox.jd_start),
            end_date=tz.julian_day_to_local_time(
                julian_day=end_equinox.jd_start),
            computation_system=computation_system)
        panchaanga.year = year
        # Festival data may be updated more frequently and a precomputed panchaanga may go out of sync. Hence we keep this method separate.
        logging.info('Writing computed panchaanga to %s...\n' % fname)

        try:
            panchaanga.dump_to_file(filename=fname)
        except EnvironmentError:
            logging.warning("Not able to save.")
            logging.error(traceback.format_exc())
        return panchaanga
Exemple #5
0
def test_get_local_time():
    local_time = Timezone("America/Los_Angeles").julian_day_to_local_time(
        julian_day=2458418.319444).as_tuple()
    assert local_time[0] == 2018
    assert local_time[1] == 10
    assert local_time[2] == 26
    assert local_time[3] == 12
    assert local_time[4] == 39
Exemple #6
0
 def get(self, timezone, year, month, day, hour, minute, second):
     jd = Timezone(timezone).local_time_to_julian_day(
         Date(year, month, day, hour, minute, second))
     from jyotisha.panchaanga import temporal
     raashi = NakshatraDivision(
         jd, ayanaamsha_id=Ayanamsha.CHITRA_AT_180).get_solar_raashi()
     logging.info(raashi)
     return str(raashi)
Exemple #7
0
 def from_city_and_julian_day(cls,
                              city,
                              julian_day,
                              computation_system: ComputationSystem = None):
     date = Timezone(city.timezone).julian_day_to_local_time(julian_day)
     return DailyPanchaanga(city=city,
                            date=date,
                            computation_system=computation_system)
Exemple #8
0
    def __init__(self,
                 city: City,
                 date: Date,
                 computation_system=None,
                 previous_day_panchaanga=None) -> None:
        """Constructor for the panchaanga.
    """
        super(DailyPanchaanga, self).__init__()
        self.city = city
        self.date = date
        date.set_time_to_day_start()
        self.julian_day_start = Timezone(
            self.city.timezone).local_time_to_julian_day(date=self.date)
        self.computation_system = default_if_none(computation_system,
                                                  ComputationSystem.DEFAULT)

        self.jd_sunrise = None
        self.jd_sunset = None
        self.jd_previous_sunset = None
        self.jd_next_sunrise = None
        self.jd_moonrise = None
        self.jd_moonset = None

        self.lagna_data = None
        self.sunrise_day_angas = None

        self.solar_sidereal_date_sunset = None

        self.tropical_date_sunset = None

        self.lunar_month_sunrise = None

        self.shraaddha_tithi = []
        self.festival_id_to_instance = {}
        self.mauDhyas = None
        self.amauDhyas = None

        self.compute_sun_moon_transitions(
            previous_day_panchaanga=previous_day_panchaanga)
        self.compute_solar_day_sunset(
            previous_day_panchaanga=previous_day_panchaanga)
        self.set_tropical_date_sunset(
            previous_day_panchaanga=previous_day_panchaanga)
        self.day_length_based_periods = DayLengthBasedPeriods(
            jd_previous_sunset=self.jd_previous_sunset,
            jd_sunrise=self.jd_sunrise,
            jd_sunset=self.jd_sunset,
            jd_next_sunrise=self.jd_next_sunrise,
            weekday=self.date.get_weekday())

        if self.computation_system.lunar_month_assigner_type is not None:
            lunar_month_assigner = LunarMonthAssigner.get_assigner(
                computation_system=self.computation_system)
            self.set_lunar_month_sunrise(
                month_assigner=lunar_month_assigner,
                previous_day_panchaanga=previous_day_panchaanga)
            self.set_mauDhyas()
Exemple #9
0
 def get(self, body_name, anga_type_str, timezone, year, month, day, hour,
         minute, second):
     jd = Timezone(timezone).local_time_to_julian_day(
         Date(year, month, day, hour, minute, second))
     nd = NakshatraDivision(jd=jd, ayanaamsha_id=Ayanamsha.CHITRA_AT_180)
     body = Graha(body_name=body_name)
     anga_type = AngaType.NAKSHATRA
     if anga_type_str == AngaType.RASHI.name:
         anga_type = AngaType.RASHI
     division = nd.get_fractional_division_for_body(body=body,
                                                    anga_type=anga_type)
     logging.info(division)
     return str(division)
def print_festivals_to_stream(daily_panchaanga, output_stream, panchaanga,
                              languages, scripts):
    rules_collection = rules.RulesCollection.get_cached(
        repos_tuple=tuple(
            panchaanga.computation_system.festival_options.repos),
        julian_handling=panchaanga.computation_system.festival_options.
        julian_handling)
    fest_details_dict = rules_collection.name_to_rule
    print('{%s}' % '\\eventsep '.join([
        f.tex_code(languages=languages,
                   scripts=scripts,
                   timezone=Timezone(timezone_id=panchaanga.city.timezone),
                   fest_details_dict=fest_details_dict,
                   reference_date=daily_panchaanga.date)
        for f in sorted(daily_panchaanga.festival_id_to_instance.values())
    ]),
          file=output_stream)
Exemple #11
0
def test_get_timezone_offset_hours_from_jd():
    tz = Timezone("America/Los_Angeles")
    assert tz.get_timezone_offset_hours_from_jd(2458447) == -8
Exemple #12
0
def write_monthly_tex(panchaanga, time_format="hh:mm", languages=None, scripts=None):
  """Write out the panchaanga TeX using a specified template
  """
  if scripts is None:
    scripts = [sanscript.DEVANAGARI]
  day_colours = {0: 'blue', 1: 'blue', 2: 'blue',
                 3: 'blue', 4: 'blue', 5: 'blue', 6: 'blue'}

  if languages is None:
    languages = ["sa"]

  monthly_template_file = open(os.path.join(os.path.dirname(__file__), 'templates/monthly_cal_template.tex'))

  template_lines = monthly_template_file.readlines()
  for i in range(0, len(template_lines) - 3):
    print(template_lines[i][:-1])

  samvatsara_id = (panchaanga.year - 1568) % 60 + 1  # distance from prabhava
  samvatsara_names = '%s–%s' % (names.NAMES['SAMVATSARA_NAMES']['sa'][scripts[0]][samvatsara_id],
                                names.NAMES['SAMVATSARA_NAMES']['sa'][scripts[0]][(samvatsara_id % 60) + 1])

  print('\\mbox{}')
  print('{\\sffamily\\fontsize{60}{25}\\selectfont %d\\\\[0.5cm]}' % panchaanga.year)
  print('\\mbox{\\font\\x="Siddhanta:language=deva" at 48 pt\\x %s}\\\\[0.5cm]' %
        samvatsara_names)
  print('\\mbox{\\font\\x="Siddhanta:language=deva" at 32 pt\\x %s } %%'
        % jyotisha.custom_transliteration.tr('kali', scripts[0]))
  print('{\\sffamily\\fontsize{32}{25}\\selectfont %d–%d\\\\[0.5cm]}'
        % (panchaanga.year + 3100, panchaanga.year + 3101))
  print('{\\sffamily\\fontsize{48}{25}\\selectfont \\uppercase{%s}\\\\[0.2cm]}' %
        panchaanga.city.name)
  print('{\\sffamily\\fontsize{16}{25}\\selectfont {%s}\\\\[0.5cm]}' %
        jyotisha.custom_transliteration.print_lat_lon(panchaanga.city.latitude, panchaanga.city.longitude))
  print('\\hrule')

  print('\\newpage')
  print('\\centering')
  print('\\centerline{\\LARGE {{%s}}}' % jyotisha.custom_transliteration.tr('mAsAntara-vizESAH', scripts[0]))
  print('\\begin{multicols*}{3}')
  print('\\TrickSupertabularIntoMulticols')
  print('\\begin{supertabular}' +
        '{>{\\sffamily}r>{\\sffamily}r>{\\sffamily}c>{\\hangindent=2ex}p{8cm}}')

  mlast = 1
  daily_panchaangas = panchaanga.daily_panchaangas_sorted()
  for d in range(panchaanga.duration_prior_padding, jyotisha.panchaanga.temporal.MAX_SZ - 1):
    [y, m, dt, t] = time.jd_to_utc_gregorian(panchaanga.jd_start + d - 1).to_date_fractional_hour_tuple()
    daily_panchaanga = daily_panchaangas[d]

    rules_collection = rules.RulesCollection.get_cached(
      repos_tuple=tuple(panchaanga.computation_system.festival_options.repos), julian_handling=panchaanga.computation_system.festival_options.julian_handling)
    fest_details_dict = rules_collection.name_to_rule

    if len(daily_panchaanga.festival_id_to_instance) != 0:
      if m != mlast:
        mlast = m
        print('\\\\')

      print('%s & %s & %s & {\\raggedright %s} \\\\' %
            (names.month_map[m], dt, names.weekday_short_map[daily_panchaanga.date.get_weekday()],
             '\\\\'.join([f.tex_code(languages=languages, scripts=scripts, timezone=panchaanga.city.timezone, fest_details_dict=fest_details_dict, reference_date=daily_panchaanga.date)
                          for f in sorted(daily_panchaanga.festival_id_to_instance.values())])))

    if m == 12 and dt == 31:
      break

  print('\\end{supertabular}')
  print('\\end{multicols*}')
  print('\\renewcommand{\\tamil}[1]{%')
  print('{\\fontspec[Scale=0.9,FakeStretch=0.9]{Noto Sans Tamil}\\fontsize{7}{12}\\selectfont #1}}')

  # print('\\clearpage')

  month_text = ''
  W6D1 = W6D2 = ''
  for d in range(panchaanga.duration_prior_padding, jyotisha.panchaanga.temporal.MAX_SZ - 1):
    [y, m, dt, t] = time.jd_to_utc_gregorian(panchaanga.jd_start + d - 1).to_date_fractional_hour_tuple()

    # checking @ 6am local - can we do any better?
    local_time = tz(panchaanga.city.timezone).localize(datetime(y, m, dt, 6, 0, 0))
    # compute offset from UTC in hours
    tz_off = (datetime.utcoffset(local_time).days * 86400 +
              datetime.utcoffset(local_time).seconds) / 3600.0

    # What is the jd at 00:00 local time today?
    jd = daily_panchaanga.julian_day_start

    if dt == 1:
      currWeek = 1
      if m > 1:
        month_text = month_text.replace('W6D1', W6D1)
        month_text = month_text.replace('W6D2', W6D2)
        print(month_text)
        month_text = W6D1 = W6D2 = ''
        if currWeek < 6:
          if daily_panchaanga.date.get_weekday() != 0:  # Space till Sunday
            for i in range(daily_panchaanga.date.get_weekday(), 6):
              print("\\mbox{}  & %% %d" % currWeek)
            print("\\\\ \\hline")
        print('\\end{tabular}')
        print('\n\n')

      # Begin tabular
      print('\\begin{tabular}{|c|c|c|c|c|c|c|}')
      print('\\multicolumn{7}{c}{\\Large \\bfseries \\sffamily %s %s}\\\\[3mm]' % (
        names.month_map[m], y))
      print('\\hline')
      WDAY_NAMES = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT']
      print(' & '.join(['\\textbf{\\textsf{%s}}' %
                        _day for _day in WDAY_NAMES]) + ' \\\\ \\hline')

      # Blanks for previous weekdays
      for i in range(0, daily_panchaanga.date.get_weekday()):
        if i == 0:
          month_text += '\n' + ("{W6D1}  &")
        elif i == 1:
          month_text += '\n' + ("{W6D2}  &")
        else:
          month_text += '\n' + ("{}  &")

    tithi_data_str = day_details.get_tithi_data_str(daily_panchaanga, scripts, time_format)

    nakshatra_data_str = day_details.get_nakshatra_data_str(daily_panchaanga, scripts, time_format)

    yoga_data_str = day_details.get_yoga_data_str(daily_panchaanga, scripts, time_format)

    karana_data_str = day_details.get_karaNa_data_str(daily_panchaanga, scripts, time_format)


    sunrise = Hour(24 * (daily_panchaanga.jd_sunrise - jd)).to_string(
      format=time_format)
    sunset = Hour(24 * (daily_panchaanga.jd_sunset - jd)).to_string(format=time_format)
    saangava = Hour(24 * (daily_panchaanga.day_length_based_periods.fifteen_fold_division.saangava.jd_start - jd)).to_string(
      format=time_format)
    rahu = '%s--%s' % (
      Hour(24 * (daily_panchaanga.day_length_based_periods.eight_fold_division.raahu.jd_start - jd)).to_string(
        format=time_format),
      Hour(24 * (daily_panchaanga.day_length_based_periods.eight_fold_division.raahu.jd_end - jd)).to_string(
        format=time_format))
    yama = '%s--%s' % (
      Hour(24 * (daily_panchaanga.day_length_based_periods.eight_fold_division.yama.jd_start - jd)).to_string(
        format=time_format),
      Hour(24 * (daily_panchaanga.day_length_based_periods.eight_fold_division.yama.jd_end - jd)).to_string(
        format=time_format))

    if daily_panchaanga.solar_sidereal_date_sunset.month_transition is None:
      month_end_str = ''
    else:
      _m = daily_panchaangas[d - 1].solar_sidereal_date_sunset.month
      if daily_panchaanga.solar_sidereal_date_sunset.month_transition >= daily_panchaangas[d + 1].jd_sunrise:
        month_end_str = '\\mbox{%s{\\tiny\\RIGHTarrow}\\textsf{%s}}' % (
          names.NAMES['RASHI_NAMES']['sa'][scripts[0]][_m], Hour(
            24 * (daily_panchaanga.solar_sidereal_date_sunset.month_transition - daily_panchaangas[d + 1].julian_day_start)).to_string(format=time_format))
      else:
        month_end_str = '\\mbox{%s{\\tiny\\RIGHTarrow}\\textsf{%s}}' % (
          names.NAMES['RASHI_NAMES']['sa'][scripts[0]][_m], Hour(
            24 * (daily_panchaanga.solar_sidereal_date_sunset.month_transition - daily_panchaanga.julian_day_start)).to_string(format=time_format))

    month_data = '\\sunmonth{%s}{%d}{%s}' % (
      names.NAMES['RASHI_NAMES']['sa'][scripts[0]][daily_panchaanga.solar_sidereal_date_sunset.month], daily_panchaanga.solar_sidereal_date_sunset.day,
      month_end_str)

    if currWeek < 6:
      month_text += '\n' + ('\\caldata{\\textcolor{%s}{%s}}{%s{%s}}%%' %
                            (day_colours[daily_panchaanga.date.get_weekday()], dt, month_data,
                             names.get_chandra_masa(daily_panchaanga.lunar_month_sunrise, scripts[0])))
      month_text += '\n' + ('{\\sundata{%s}{%s}{%s}}%%' % (sunrise, sunset, saangava))
      month_text += '\n' + ('{\\tnyk{%s}%%\n{%s}%%\n{%s}%%\n{%s}}%%' % (tithi_data_str, nakshatra_data_str,
                                                                        yoga_data_str, karana_data_str))
      month_text += '\n' + ('{\\rahuyama{%s}{%s}}%%' % (rahu, yama))

      # Using set as an ugly workaround since we may have sometimes assigned the same
      # festival to the same day again!
      month_text += '\n' + ('{%s}' % '\\eventsep '.join(
        [f.tex_code(languages=languages, scripts=scripts, timezone=panchaanga.city.timezone, fest_details_dict=fest_details_dict, reference_date=daily_panchaanga.date) for f in
         sorted(daily_panchaanga.festival_id_to_instance.values())]))
    else:
      if daily_panchaanga.date.get_weekday() == 0:
        W6D1 = '\n' + ('\\caldata{\\textcolor{%s}{%s}}{%s{%s}}%%' %
                       (day_colours[daily_panchaanga.date.get_weekday()], dt, month_data,
                        names.get_chandra_masa(daily_panchaanga.lunar_month_sunrise,scripts[0])))
        W6D1 += '\n' + ('{\\sundata{%s}{%s}{%s}}%%' % (sunrise, sunset, saangava))
        W6D1 += '\n' + ('{\\tnyk{%s}%%\n{%s}%%\n{%s}%%\n{%s}}%%' % (tithi_data_str, nakshatra_data_str,
                                                                    yoga_data_str, karana_data_str))
        W6D1 += '\n' + ('{\\rahuyama{%s}{%s}}%%' % (rahu, yama))

        # Using set as an ugly workaround since we may have sometimes assigned the same
        # festival to the same day again!
        W6D1 += '\n' + ('{%s}' % '\\eventsep '.join(
          [f.tex_code(languages=languages, scripts=scripts, timezone=Timezone(panchaanga.city.timezone), fest_details_dict=fest_details_dict, reference_date=daily_panchaanga.date) for f in sorted(daily_panchaanga.festival_id_to_instance.values())]))
      elif daily_panchaanga.date.get_weekday() == 1:
        W6D2 = '\n' + ('\\caldata{\\textcolor{%s}{%s}}{%s{%s}}%%' %
                       (day_colours[daily_panchaanga.date.get_weekday()], dt, month_data,
                        names.get_chandra_masa(daily_panchaanga.lunar_month_sunrise,scripts[0])))
        W6D2 += '\n' + ('{\\sundata{%s}{%s}{%s}}%%' % (sunrise, sunset, saangava))
        W6D2 += '\n' + ('{\\tnyk{%s}%%\n{%s}%%\n{%s}%%\n{%s}}%%' % (tithi_data_str, nakshatra_data_str,
                                                                    yoga_data_str, karana_data_str))
        W6D2 += '\n' + ('{\\rahuyama{%s}{%s}}%%' % (rahu, yama))

        # Using set as an ugly workaround since we may have sometimes assigned the same
        # festival to the same day again!
        W6D2 += '\n' + ('{%s}' % '\\eventsep '.join(
          [f.tex_code(languages=languages, scripts=scripts, timezone=panchaanga.city.timezone, fest_details_dict=fest_details_dict, reference_date=daily_panchaanga.date) for f in sorted(daily_panchaanga.festival_id_to_instance.values())]))
      else:
        # Cannot be here, since we cannot have more than 2 days in week 6 of any month!
        pass

    if daily_panchaanga.date.get_weekday() == 6:
      month_text += '\n' + ("\\\\ \\hline %%END OF WEEK %d" % (currWeek))
      currWeek += 1
    else:
      if currWeek < 6:
        month_text += '\n' + ("&")

    if m == 12 and dt == 31:
      break

  month_text = month_text.replace('W6D1', W6D1)
  month_text = month_text.replace('W6D2', W6D2)
  print(month_text)

  if currWeek < 6:
    for i in range(daily_panchaanga.date.get_weekday() + 1, 6):
      print("{}  &")
    if daily_panchaanga.date.get_weekday() != 6:
      print("\\\\ \\hline")
  print('\\end{tabular}')
  print('\n\n')

  print(template_lines[-2][:-1])
  print(template_lines[-1][:-1])
Exemple #13
0
 def get_timezone_obj(self):
     from jyotisha.panchaanga.temporal.time import Timezone
     return Timezone(timezone_id=self.timezone)
Exemple #14
0
def write_monthly_tex(panchaanga, template_file, scripts=None, temporal=None):
    """Write out the panchaanga TeX using a specified template
  """
    if scripts is None:
        scripts = [sanscript.DEVANAGARI]
    day_colours = {
        0: 'blue',
        1: 'blue',
        2: 'blue',
        3: 'blue',
        4: 'blue',
        5: 'blue',
        6: 'blue'
    }
    month = {
        1: 'JANUARY',
        2: 'FEBRUARY',
        3: 'MARCH',
        4: 'APRIL',
        5: 'MAY',
        6: 'JUNE',
        7: 'JULY',
        8: 'AUGUST',
        9: 'SEPTEMBER',
        10: 'OCTOBER',
        11: 'NOVEMBER',
        12: 'DECEMBER'
    }
    MON = {
        1: 'January',
        2: 'February',
        3: 'March',
        4: 'April',
        5: 'May',
        6: 'June',
        7: 'July',
        8: 'August',
        9: 'September',
        10: 'October',
        11: 'November',
        12: 'December'
    }
    WDAY = {
        0: 'Sun',
        1: 'Mon',
        2: 'Tue',
        3: 'Wed',
        4: 'Thu',
        5: 'Fri',
        6: 'Sat'
    }

    monthly_template_file = open(
        os.path.join(os.path.dirname(__file__),
                     'templates/monthly_cal_template.tex'))

    template_lines = template_file.readlines()
    for i in range(0, len(template_lines) - 3):
        print(template_lines[i][:-1])

    samvatsara_id = (panchaanga.year - 1568) % 60 + 1  # distance from prabhava
    samvatsara_names = '%s–%s' % (
        jyotisha.names.NAMES['SAMVATSARA_NAMES'][scripts[0]][samvatsara_id],
        jyotisha.names.NAMES['SAMVATSARA_NAMES'][scripts[0]][
            (samvatsara_id % 60) + 1])

    print('\\mbox{}')
    print('{\\sffamily\\fontsize{60}{25}\\selectfont %d\\\\[0.5cm]}' %
          panchaanga.year)
    print(
        '\\mbox{\\font\\x="Siddhanta:script=deva" at 48 pt\\x %s}\\\\[0.5cm]' %
        samvatsara_names)
    print('\\mbox{\\font\\x="Siddhanta:script=deva" at 32 pt\\x %s } %%' %
          jyotisha.custom_transliteration.tr('kali', scripts[0]))
    print('{\\sffamily\\fontsize{32}{25}\\selectfont %d–%d\\\\[0.5cm]}' %
          (panchaanga.year + 3100, panchaanga.year + 3101))
    print(
        '{\\sffamily\\fontsize{48}{25}\\selectfont \\uppercase{%s}\\\\[0.2cm]}'
        % panchaanga.city.name)
    print('{\\sffamily\\fontsize{16}{25}\\selectfont {%s}\\\\[0.5cm]}' %
          jyotisha.custom_transliteration.print_lat_lon(
              panchaanga.city.latitude, panchaanga.city.longitude))
    print('\\hrule')

    print('\\newpage')
    print('\\centering')
    print('\\centerline{\\LARGE {{%s}}}' %
          jyotisha.custom_transliteration.tr('mAsAntara-vizESAH', scripts[0]))
    print('\\begin{multicols*}{3}')
    print('\\TrickSupertabularIntoMulticols')
    print(
        '\\begin{supertabular}' +
        '{>{\\sffamily}r>{\\sffamily}r>{\\sffamily}c>{\\hangindent=2ex}panchaanga{8cm}}'
    )

    mlast = 1
    daily_panchaangas = panchaanga.daily_panchaangas_sorted()
    for d in range(panchaanga.duration_prior_padding,
                   jyotisha.panchaanga.temporal.MAX_SZ - 1):
        [y, m, dt,
         t] = time.jd_to_utc_gregorian(panchaanga.jd_start + d -
                                       1).to_date_fractional_hour_tuple()
        daily_panchaanga = daily_panchaangas[d]

        rules_collection = rules.RulesCollection.get_cached(repos_tuple=tuple(
            panchaanga.computation_system.options.fest_repos))
        fest_details_dict = rules_collection.name_to_rule

        if len(daily_panchaanga.festival_id_to_instance) != 0:
            if m != mlast:
                mlast = m
                print('\\\\')

            print('%s & %s & %s & {\\raggedright %s} \\\\' %
                  (MON[m], dt, WDAY[daily_panchaanga.date.get_weekday()],
                   '\\\\'.join([
                       f.tex_code(scripts=scripts,
                                  timezone=panchaanga.city.timezone,
                                  fest_details_dict=fest_details_dict)
                       for f in sorted(
                           daily_panchaanga.festival_id_to_instance.values())
                   ])))

        if m == 12 and dt == 31:
            break

    print('\\end{supertabular}')
    print('\\end{multicols*}')
    print('\\renewcommand{\\tamil}[1]{%')
    print(
        '{\\fontspec[Scale=0.9,FakeStretch=0.9]{Noto Sans Tamil}\\fontsize{7}{12}\\selectfont #1}}'
    )

    # print('\\clearpage')

    month_text = ''
    W6D1 = W6D2 = ''
    for d in range(panchaanga.duration_prior_padding,
                   jyotisha.panchaanga.temporal.MAX_SZ - 1):
        [y, m, dt,
         t] = time.jd_to_utc_gregorian(panchaanga.jd_start + d -
                                       1).to_date_fractional_hour_tuple()

        # checking @ 6am local - can we do any better?
        local_time = tz(panchaanga.city.timezone).localize(
            datetime(y, m, dt, 6, 0, 0))
        # compute offset from UTC in hours
        tz_off = (datetime.utcoffset(local_time).days * 86400 +
                  datetime.utcoffset(local_time).seconds) / 3600.0

        # What is the jd at 00:00 local time today?
        jd = daily_panchaanga.julian_day_start

        if dt == 1:
            currWeek = 1
            if m > 1:
                month_text = month_text.replace('W6D1', W6D1)
                month_text = month_text.replace('W6D2', W6D2)
                print(month_text)
                month_text = W6D1 = W6D2 = ''
                if currWeek < 6:
                    if daily_panchaanga.date.get_weekday(
                    ) != 0:  # Space till Sunday
                        for i in range(daily_panchaanga.date.get_weekday(), 6):
                            print("\\mbox{}  & %% %d" % currWeek)
                        print("\\\\ \\hline")
                print('\\end{tabular}')
                print('\n\n')

            # Begin tabular
            print('\\begin{tabular}{|c|c|c|c|c|c|c|}')
            print(
                '\\multicolumn{7}{c}{\\Large \\bfseries \\sffamily %s %s}\\\\[3mm]'
                % (month[m], y))
            print('\\hline')
            WDAY_NAMES = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT']
            print(' & '.join(
                ['\\textbf{\\textsf{%s}}' % _day
                 for _day in WDAY_NAMES]) + ' \\\\ \\hline')

            # Blanks for previous weekdays
            for i in range(0, daily_panchaanga.date.get_weekday()):
                if i == 0:
                    month_text += '\n' + ("{W6D1}  &")
                elif i == 1:
                    month_text += '\n' + ("{W6D2}  &")
                else:
                    month_text += '\n' + ("{}  &")

        tithi_data_str = ''
        for tithi_span in daily_panchaanga.sunrise_day_angas.tithis_with_ends:
            (tithi_ID, tithi_end_jd) = (tithi_span.anga.index,
                                        tithi_span.jd_end)
            # if tithi_data_str != '':
            #     tithi_data_str += '\\hspace{2ex}'
            tithi = '\\moon[scale=0.6]{%d}\\hspace{2pt}' % (tithi_ID) + \
                    jyotisha.names.NAMES['TITHI_NAMES'][scripts[0]][tithi_ID]
            if tithi_end_jd is None:
                tithi_data_str = '%s\\mbox{%s\\To{}%s}' % \
                                 (tithi_data_str, tithi, jyotisha.custom_transliteration.tr('ahOrAtram', scripts[0]))
            else:
                tithi_data_str = '%s\\mbox{%s\\To{}\\textsf{%s%s}}' % \
                                 (tithi_data_str, tithi,
                                  Hour(24 * (tithi_end_jd - jd)).toString(
                                    format=panchaanga.fmt),
                                  '\\hspace{2ex}')

        nakshatra_data_str = ''
        for nakshatra_span in daily_panchaanga.sunrise_day_angas.nakshatras_with_ends:
            (nakshatra_ID, nakshatra_end_jd) = (nakshatra_span.anga.index,
                                                nakshatra_span.jd_end)
            # if nakshatra_data_str != '':
            #     nakshatra_data_str += '\\hspace{2ex}'
            nakshatra = jyotisha.names.NAMES['NAKSHATRA_NAMES'][
                scripts[0]][nakshatra_ID]
            if nakshatra_end_jd is None:
                nakshatra_data_str = '%s\\mbox{%s\\To{}%s}' % \
                                      (nakshatra_data_str, nakshatra,
                                       jyotisha.custom_transliteration.tr('ahOrAtram', scripts[0]))
            else:
                nakshatra_data_str = '%s\\mbox{%s\\To{}\\textsf{%s%s}}' % \
                                      (nakshatra_data_str, nakshatra,
                                       Hour(24 * (nakshatra_end_jd -
                                                                                    jd)).toString(format=panchaanga.fmt),
                                       '\\hspace{2ex}')

        yoga_data_str = ''
        for yoga_span in daily_panchaanga.sunrise_day_angas.yogas_with_ends:
            (yoga_ID, yoga_end_jd) = (yoga_span.anga.index, yoga_span.jd_end)
            # if yoga_data_str != '':
            #     yoga_data_str += '\\hspace{2ex}'
            yoga = jyotisha.names.NAMES['YOGA_NAMES'][scripts[0]][yoga_ID]
            if yoga_end_jd is None:
                yoga_data_str = '%s\\mbox{%s\\To{}%s}' % \
                                (yoga_data_str, yoga, jyotisha.custom_transliteration.tr('ahOrAtram', scripts[0]))
            else:
                yoga_data_str = '%s\\mbox{%s\\To{}\\textsf{%s%s}}' % \
                                (yoga_data_str, yoga,
                                 Hour(24 * (yoga_end_jd - jd)).toString(
                                   format=panchaanga.fmt),
                                 '\\hspace{2ex}')

        karana_data_str = ''
        for numKaranam, karaNa_span in enumerate(
                daily_panchaanga.sunrise_day_angas.karanas_with_ends):
            (karana_ID, karana_end_jd) = (karaNa_span.anga.index,
                                          karaNa_span.jd_end)
            # if numKaranam == 1:
            #     karana_data_str += '\\hspace{2ex}'
            if numKaranam == 2:
                karana_data_str = karana_data_str + '\\\\'
            karana = jyotisha.names.NAMES['KARANA_NAMES'][
                scripts[0]][karana_ID]
            if karana_end_jd is None:
                karana_data_str = '%s\\mbox{%s\\To{}%s}' % \
                                   (karana_data_str, karana,
                                    jyotisha.custom_transliteration.tr('ahOrAtram', scripts[0]))
            else:
                karana_data_str = '%s\\mbox{%s\\To{}\\textsf{%s%s}}' % \
                                   (karana_data_str, karana,
                                    Hour(24 * (karana_end_jd -
                                                                                 jd)).toString(format=panchaanga.fmt),
                                    '\\hspace{2ex}')

        sunrise = Hour(24 * (daily_panchaanga.jd_sunrise - jd)).toString(
            format=panchaanga.fmt)
        sunset = Hour(24 * (daily_panchaanga.jd_sunset - jd)).toString(
            format=panchaanga.fmt)
        saangava = Hour(
            24 * (daily_panchaanga.day_length_based_periods.saangava.jd_start -
                  jd)).toString(format=panchaanga.fmt)
        rahu = '%s--%s' % (
            Hour(24 *
                 (daily_panchaanga.day_length_based_periods.raahu.jd_start -
                  jd)).toString(format=panchaanga.fmt),
            Hour(24 * (daily_panchaanga.day_length_based_periods.raahu.jd_end -
                       jd)).toString(format=panchaanga.fmt))
        yama = '%s--%s' % (
            Hour(24 *
                 (daily_panchaanga.day_length_based_periods.yama.jd_start -
                  jd)).toString(format=panchaanga.fmt),
            Hour(24 * (daily_panchaanga.day_length_based_periods.yama.jd_end -
                       jd)).toString(format=panchaanga.fmt))

        if daily_panchaanga.solar_sidereal_date_sunset.month_transition is None:
            month_end_str = ''
        else:
            _m = daily_panchaangas[d - 1].solar_sidereal_date_sunset.month
            if daily_panchaanga.solar_sidereal_date_sunset.month_transition >= daily_panchaangas[
                    d + 1].jd_sunrise:
                month_end_str = '\\mbox{%s{\\tiny\\RIGHTarrow}\\textsf{%s}}' % (
                    jyotisha.names.NAMES['RASHI_NAMES'][scripts[0]][_m],
                    Hour(24 *
                         (daily_panchaanga.solar_sidereal_date_sunset.
                          month_transition -
                          daily_panchaangas[d + 1].julian_day_start)).toString(
                              format=panchaanga.fmt))
            else:
                month_end_str = '\\mbox{%s{\\tiny\\RIGHTarrow}\\textsf{%s}}' % (
                    jyotisha.names.NAMES['RASHI_NAMES'][scripts[0]][_m],
                    Hour(24 *
                         (daily_panchaanga.solar_sidereal_date_sunset.
                          month_transition - daily_panchaanga.julian_day_start)
                         ).toString(format=panchaanga.fmt))

        month_data = '\\sunmonth{%s}{%d}{%s}' % (
            jyotisha.names.NAMES['RASHI_NAMES'][scripts[0]][
                daily_panchaanga.solar_sidereal_date_sunset.month],
            daily_panchaanga.solar_sidereal_date_sunset.day, month_end_str)

        if currWeek < 6:
            month_text += '\n' + (
                '\\caldata{\\textcolor{%s}{%s}}{%s{%s}}%%' %
                (day_colours[daily_panchaanga.date.get_weekday()], dt,
                 month_data,
                 jyotisha.names.get_chandra_masa(
                     daily_panchaanga.lunar_month_sunrise,
                     jyotisha.names.NAMES, scripts[0])))
            month_text += '\n' + ('{\\sundata{%s}{%s}{%s}}%%' %
                                  (sunrise, sunset, saangava))
            month_text += '\n' + ('{\\tnyk{%s}%%\n{%s}%%\n{%s}%%\n{%s}}%%' %
                                  (tithi_data_str, nakshatra_data_str,
                                   yoga_data_str, karana_data_str))
            month_text += '\n' + ('{\\rahuyama{%s}{%s}}%%' % (rahu, yama))

            # Using set as an ugly workaround since we may have sometimes assigned the same
            # festival to the same day again!
            month_text += '\n' + ('{%s}' % '\\eventsep '.join([
                f.tex_code(scripts=scripts,
                           timezone=panchaanga.city.timezone,
                           fest_details_dict=fest_details_dict) for f in
                sorted(daily_panchaanga.festival_id_to_instance.values())
            ]))
        else:
            if daily_panchaanga.date.get_weekday() == 0:
                W6D1 = '\n' + ('\\caldata{\\textcolor{%s}{%s}}{%s{%s}}%%' %
                               (day_colours[daily_panchaanga.date.get_weekday(
                               )], dt, month_data,
                                jyotisha.names.get_chandra_masa(
                                    daily_panchaanga.lunar_month_sunrise,
                                    jyotisha.names.NAMES, scripts[0])))
                W6D1 += '\n' + ('{\\sundata{%s}{%s}{%s}}%%' %
                                (sunrise, sunset, saangava))
                W6D1 += '\n' + ('{\\tnyk{%s}%%\n{%s}%%\n{%s}%%\n{%s}}%%' %
                                (tithi_data_str, nakshatra_data_str,
                                 yoga_data_str, karana_data_str))
                W6D1 += '\n' + ('{\\rahuyama{%s}{%s}}%%' % (rahu, yama))

                # Using set as an ugly workaround since we may have sometimes assigned the same
                # festival to the same day again!
                W6D1 += '\n' + ('{%s}' % '\\eventsep '.join([
                    f.tex_code(scripts=scripts,
                               timezone=Timezone(panchaanga.city.timezone),
                               fest_details_dict=fest_details_dict) for f in
                    sorted(daily_panchaanga.festival_id_to_instance.values())
                ]))
            elif daily_panchaanga.date.get_weekday() == 1:
                W6D2 = '\n' + ('\\caldata{\\textcolor{%s}{%s}}{%s{%s}}%%' %
                               (day_colours[daily_panchaanga.date.get_weekday(
                               )], dt, month_data,
                                jyotisha.names.get_chandra_masa(
                                    daily_panchaanga.lunar_month_sunrise,
                                    jyotisha.names.NAMES, scripts[0])))
                W6D2 += '\n' + ('{\\sundata{%s}{%s}{%s}}%%' %
                                (sunrise, sunset, saangava))
                W6D2 += '\n' + ('{\\tnyk{%s}%%\n{%s}%%\n{%s}%%\n{%s}}%%' %
                                (tithi_data_str, nakshatra_data_str,
                                 yoga_data_str, karana_data_str))
                W6D2 += '\n' + ('{\\rahuyama{%s}{%s}}%%' % (rahu, yama))

                # Using set as an ugly workaround since we may have sometimes assigned the same
                # festival to the same day again!
                W6D2 += '\n' + ('{%s}' % '\\eventsep '.join([
                    f.tex_code(scripts=scripts,
                               timezone=panchaanga.city.timezone,
                               fest_details_dict=fest_details_dict) for f in
                    sorted(daily_panchaanga.festival_id_to_instance.values())
                ]))
            else:
                # Cannot be here, since we cannot have more than 2 days in week 6 of any month!
                pass

        if daily_panchaanga.date.get_weekday() == 6:
            month_text += '\n' + ("\\\\ \\hline %%END OF WEEK %d" % (currWeek))
            currWeek += 1
        else:
            if currWeek < 6:
                month_text += '\n' + ("&")

        if m == 12 and dt == 31:
            break

    month_text = month_text.replace('W6D1', W6D1)
    month_text = month_text.replace('W6D2', W6D2)
    print(month_text)

    if currWeek < 6:
        for i in range(daily_panchaanga.date.get_weekday() + 1, 6):
            print("{}  &")
        if daily_panchaanga.date.get_weekday() != 6:
            print("\\\\ \\hline")
    print('\\end{tabular}')
    print('\n\n')

    print(template_lines[-2][:-1])
    print(template_lines[-1][:-1])
def emit(panchaanga, time_format="hh:mm", scripts=None, output_stream=None):
  """Write out the panchaanga TeX using a specified template
  """
  # day_colours = {0: 'blue', 1: 'blue', 2: 'blue',
  #                3: 'blue', 4: 'blue', 5: 'blue', 6: 'blue'}
  compute_lagnams = panchaanga.computation_system.options.set_lagnas
  if scripts is None:
    scripts = [sanscript.DEVANAGARI]
  month = {1: 'JANUARY', 2: 'FEBRUARY', 3: 'MARCH', 4: 'APRIL',
           5: 'MAY', 6: 'JUNE', 7: 'JULY', 8: 'AUGUST', 9: 'SEPTEMBER',
           10: 'OCTOBER', 11: 'NOVEMBER', 12: 'DECEMBER'}
  WDAY = {0: 'Sun', 1: 'Mon', 2: 'Tue', 3: 'Wed', 4: 'Thu', 5: 'Fri', 6: 'Sat'}


  template_file = open(os.path.join(os.path.dirname(__file__), 'templates/daily_cal_template.tex'))

  template_lines = template_file.readlines()
  for i in range(len(template_lines)):
    print(template_lines[i][:-1], file=output_stream)

  year = panchaanga.start_date.year
  logging.debug(year)

  samvatsara_id = (year - 1568) % 60 + 1  # distance from prabhava
  samvatsara_names = (jyotisha.names.NAMES['SAMVATSARA_NAMES'][scripts[0]][samvatsara_id],
                      jyotisha.names.NAMES['SAMVATSARA_NAMES'][scripts[0]][(samvatsara_id % 60) + 1])

  yname = samvatsara_names[0]  # Assign year name until Mesha Sankranti

  print('\\mbox{}', file=output_stream)
  print('\\renewcommand{\\yearname}{%d}' % year, file=output_stream)
  print('\\begin{center}', file=output_stream)
  print('{\\sffamily \\fontsize{80}{80}\\selectfont  %d\\\\[0.5cm]}' % year, file=output_stream)
  print('\\mbox{\\fontsize{48}{48}\\selectfont %s–%s}\\\\'
        % samvatsara_names, file=output_stream)
  print('\\mbox{\\fontsize{32}{32}\\selectfont %s } %%'
        % jyotisha.custom_transliteration.tr('kali', scripts[0]), file=output_stream)
  print('{\\sffamily \\fontsize{43}{43}\\selectfont  %d–%d\\\\[0.5cm]}\n\\hrule\n\\vspace{0.2cm}'
        % (year + 3100, year + 3101), file=output_stream)
  print('{\\sffamily \\fontsize{50}{50}\\selectfont  \\uppercase{%s}\\\\[0.2cm]}' % panchaanga.city.name,
        file=output_stream)
  print('{\\sffamily \\fontsize{23}{23}\\selectfont  {%s}\\\\[0.2cm]}'
        % jyotisha.custom_transliteration.print_lat_lon(panchaanga.city.latitude, panchaanga.city.longitude),
        file=output_stream)
  print('\\hrule', file=output_stream)
  print('\\end{center}', file=output_stream)
  print('\\clearpage\\pagestyle{fancy}', file=output_stream)

  daily_panchaangas = panchaanga.daily_panchaangas_sorted()
  for d, daily_panchaanga in enumerate(daily_panchaangas):
    if daily_panchaanga.date < panchaanga.start_date or daily_panchaanga.date > panchaanga.end_date:
      continue
    [y, m, dt] = [daily_panchaanga.date.year, daily_panchaanga.date.month, daily_panchaanga.date.day]

    # checking @ 6am local - can we do any better?
    local_time = tz(panchaanga.city.timezone).localize(datetime(y, m, dt, 6, 0, 0))
    # compute offset from UTC in hours
    tz_off = (datetime.utcoffset(local_time).days * 86400 +
              datetime.utcoffset(local_time).seconds) / 3600.0

    # What is the jd at 00:00 local time today?
    jd = daily_panchaanga.julian_day_start

    tithi_data_str = ''
    for iTithi, tithi_span in enumerate(daily_panchaanga.sunrise_day_angas.tithis_with_ends):
      (tithi_ID, tithi_end_jd) = (tithi_span.anga.index, tithi_span.jd_end)
      # if tithi_data_str != '':
      #     tithi_data_str += '\\hspace{1ex}'
      tithi = '\\raisebox{-1pt}{\\moon[scale=0.8]{%d}}\\hspace{2pt}' % (tithi_ID) + \
              jyotisha.names.NAMES['TITHI_NAMES'][scripts[0]][tithi_ID]
      if tithi_end_jd is None:
        if iTithi == 0:
          tithi_data_str = '%s\\mbox{%s\\To{}%s}' % \
                           (tithi_data_str, tithi,
                            jyotisha.custom_transliteration.tr('ahOrAtram (tridinaspRk)', scripts[0]))
      else:
        tithi_data_str = '%s\\mbox{%s\\To{}\\textsf{%s (%s)}}\\hspace{1ex}' % \
                         (tithi_data_str, tithi,
                          time.Hour(
                            24 * (tithi_end_jd - daily_panchaanga.jd_sunrise)).toString(format='gg-pp'),
                          time.Hour(24 * (tithi_end_jd - jd)).toString(
                            format=time_format))

    nakshatra_data_str = ''
    for iNakshatra, nakshatra_span in enumerate(daily_panchaanga.sunrise_day_angas.nakshatras_with_ends):
      (nakshatra_ID, nakshatra_end_jd) = (nakshatra_span.anga.index, nakshatra_span.jd_end)
      if nakshatra_data_str != '':
        nakshatra_data_str += '\\hspace{1ex}'
      nakshatra = jyotisha.names.NAMES['NAKSHATRA_NAMES'][scripts[0]][nakshatra_ID]
      if nakshatra_end_jd is None:
        if iNakshatra == 0:
          nakshatra_data_str = '%s\\mbox{%s\\To{}%s}' % \
                                (nakshatra_data_str, nakshatra,
                                 jyotisha.custom_transliteration.tr('ahOrAtram', scripts[0]))
      else:
        nakshatra_data_str = '%s\\mbox{%s\\To{}\\textsf{%s (%s)}}' % \
                              (nakshatra_data_str, nakshatra,
                               time.Hour(
                                 24 * (nakshatra_end_jd - daily_panchaanga.jd_sunrise)).toString(format='gg-pp'),
                               time.Hour(24 * (nakshatra_end_jd - jd)).toString(
                                 format=time_format))

    rashi_data_str = ''
    for iRaashi, raashi_span in enumerate(daily_panchaanga.sunrise_day_angas.raashis_with_ends):
      if iRaashi == 0:
        (rashi_ID, rashi_end_jd) = (raashi_span.anga.index, raashi_span.jd_end)
        # if rashi_data_str != '':
        #     rashi_data_str += '\\hspace{1ex}'
        rashi = jyotisha.names.NAMES['RASHI_SUFFIXED_NAMES'][scripts[0]][rashi_ID]
        if rashi_end_jd is None:
          rashi_data_str = '%s\\mbox{%s}' % (rashi_data_str, rashi)
        else:
          rashi_data_str = '%s\\mbox{%s \\RIGHTarrow \\textsf{%s}}' % \
                           (rashi_data_str, rashi,
                            time.Hour(24 * (rashi_end_jd - jd)).toString(
                              format=time_format))
    if compute_lagnams:
      lagna_data_str = 'लग्नम्–'
      for lagna_ID, lagna_end_jd in daily_panchaanga.lagna_data:
        lagna = jyotisha.names.NAMES['RASHI_NAMES'][scripts[0]][lagna_ID]
        lagna_data_str = '%s\\mbox{%s\\RIGHTarrow\\textsf{%s}} ' % \
                         (lagna_data_str, lagna,
                          time.Hour(24 * (lagna_end_jd - jd)).toString(
                            format=time_format))

    yoga_data_str = ''
    for iYoga, yoga_span in enumerate(daily_panchaanga.sunrise_day_angas.yogas_with_ends):
      (yoga_ID, yoga_end_jd) = (yoga_span.anga.index, yoga_span.jd_end)
      # if yoga_data_str != '':
      #     yoga_data_str += '\\hspace{1ex}'
      yoga = jyotisha.names.NAMES['YOGA_NAMES'][scripts[0]][yoga_ID]
      if yoga_end_jd is None:
        if iYoga == 0:
          yoga_data_str = '%s\\mbox{%s\\To{}%s}' % \
                          (yoga_data_str, yoga, jyotisha.custom_transliteration.tr('ahOrAtram', scripts[0]))
        else:                
          yoga_data_str = '%s\\mbox{%s\\Too{}}' % \
                          (yoga_data_str, yoga)
      else:
        yoga_data_str = '%s\\mbox{%s\\To{}\\textsf{%s (%s)}}\\hspace{1ex}' % \
                        (yoga_data_str, yoga,
                         time.Hour(24 * (yoga_end_jd - daily_panchaanga.jd_sunrise)).toString(
                           format='gg-pp'),
                         time.Hour(24 * (yoga_end_jd - jd)).toString(
                           format=time_format))
    if yoga_end_jd is not None:
      yoga_data_str += '\\mbox{%s\\Too{}}' % (
        jyotisha.names.NAMES['YOGA_NAMES'][scripts[0]][(yoga_ID % 27) + 1])

    karana_data_str = ''
    for numKaranam, karaNa_span in enumerate(daily_panchaanga.sunrise_day_angas.karanas_with_ends):
      (karana_ID, karana_end_jd) = (karaNa_span.anga.index, karaNa_span.jd_end)
      # if numKaranam == 1:
      #     karana_data_str += '\\hspace{1ex}'
      karana = jyotisha.names.NAMES['KARANA_NAMES'][scripts[0]][karana_ID]
      if karana_end_jd is None:
        karana_data_str = '%s\\mbox{%s\\Too{}}' % \
                           (karana_data_str, karana)
      else:
        karana_data_str = '%s\\mbox{%s\\To{}\\textsf{%s (%s)}}\\hspace{1ex}' % \
                           (karana_data_str, karana,
                            time.Hour(
                              24 * (karana_end_jd - daily_panchaanga.jd_sunrise)).toString(format='gg-pp'),
                            time.Hour(24 * (karana_end_jd - jd)).toString(
                              format=time_format))

    sunrise = time.Hour(24 * (daily_panchaanga.jd_sunrise - jd)).toString(
      format=time_format)
    sunset = time.Hour(24 * (daily_panchaanga.jd_sunset - jd)).toString(format=time_format)
    moonrise = time.Hour(24 * (daily_panchaanga.jd_moonrise - jd)).toString(
      format=time_format)
    moonset = time.Hour(24 * (daily_panchaanga.jd_moonset - jd)).toString(
      format=time_format)

    braahma_start = time.Hour(24 * (daily_panchaanga.day_length_based_periods.braahma.jd_start - jd)).toString(
      format=time_format)
    praatahsandhya_start = time.Hour(
      24 * (daily_panchaanga.day_length_based_periods.praatas_sandhyaa.jd_start - jd)).toString(format=time_format)
    praatahsandhya_end = time.Hour(
      24 * (daily_panchaanga.day_length_based_periods.praatas_sandhyaa_end.jd_start - jd)).toString(format=time_format)
    saangava = time.Hour(24 * (daily_panchaanga.day_length_based_periods.saangava.jd_start - jd)).toString(
      format=time_format)
    madhyaahna = time.Hour(24 * (daily_panchaanga.day_length_based_periods.madhyaahna.jd_start - jd)).toString(
      format=time_format)
    madhyahnika_sandhya_start = time.Hour(
      24 * (daily_panchaanga.day_length_based_periods.maadhyaahnika_sandhyaa.jd_start - jd)).toString(format=time_format)
    madhyahnika_sandhya_end = time.Hour(
      24 * (daily_panchaanga.day_length_based_periods.maadhyaahnika_sandhyaa_end.jd_start - jd)).toString(format=time_format)
    aparaahna_muhuurta = time.Hour(24 * (daily_panchaanga.day_length_based_periods.aparaahna_muhuurta.jd_start - jd)).toString(
      format=time_format)
    sayahna = time.Hour(24 * (daily_panchaanga.day_length_based_periods.saayaahna.jd_start - jd)).toString(
      format=time_format)
    sayamsandhya_start = time.Hour(
      24 * (daily_panchaanga.day_length_based_periods.saayam_sandhyaa.jd_start - jd)).toString(format=time_format)
    sayamsandhya_end = time.Hour(
      24 * (daily_panchaanga.day_length_based_periods.pradosha.jd_end - jd)).toString(format=time_format)
    ratriyama1 = time.Hour(24 * (daily_panchaanga.day_length_based_periods.raatri_yaama_1.jd_start - jd)).toString(
      format=time_format)
    shayana_time_end = time.Hour(24 * (daily_panchaanga.day_length_based_periods.shayana.jd_start - jd)).toString(
      format=time_format)
    dinaanta = time.Hour(24 * (daily_panchaanga.day_length_based_periods.dinaanta.jd_start - jd)).toString(
      format=time_format)

    rahu = '%s--%s' % (
      time.Hour(24 * (daily_panchaanga.day_length_based_periods.raahu.jd_start - jd)).toString(
        format=time_format),
      time.Hour(24 * (daily_panchaanga.day_length_based_periods.raahu.jd_end - jd)).toString(
        format=time_format))
    yama = '%s--%s' % (
      time.Hour(24 * (daily_panchaanga.day_length_based_periods.yama.jd_start - jd)).toString(
        format=time_format),
      time.Hour(24 * (daily_panchaanga.day_length_based_periods.yama.jd_end - jd)).toString(
        format=time_format))
    gulika = '%s--%s' % (
      time.Hour(24 * (daily_panchaanga.day_length_based_periods.gulika.jd_start - jd)).toString(
        format=time_format),
      time.Hour(24 * (daily_panchaanga.day_length_based_periods.gulika.jd_end - jd)).toString(
        format=time_format))

    if daily_panchaanga.solar_sidereal_date_sunset.month == 1:
      # Flip the year name for the remaining days
      yname = samvatsara_names[1]

    # Assign samvatsara, ayana, rtu #
    sar_data = '{%s}{%s}{%s}' % (yname,
                                 jyotisha.names.NAMES['AYANA_NAMES'][scripts[0]][daily_panchaanga.solar_sidereal_date_sunset.month],
                                 jyotisha.names.NAMES['RTU_NAMES'][scripts[0]][daily_panchaanga.solar_sidereal_date_sunset.month])

    if daily_panchaanga.solar_sidereal_date_sunset.month_transition is None:
      month_end_str = ''
    else:
      _m = daily_panchaangas[d - 1].solar_sidereal_date_sunset.month
      if daily_panchaanga.solar_sidereal_date_sunset.month_transition >= daily_panchaangas[d + 1].jd_sunrise:
        month_end_str = '\\mbox{%s{\\tiny\\RIGHTarrow}\\textsf{%s}}' % (
          jyotisha.names.NAMES['RASHI_NAMES'][scripts[0]][_m], time.Hour(
            24 * (daily_panchaanga.solar_sidereal_date_sunset.month_transition - daily_panchaangas[d + 1].julian_day_start)).toString(format=time_format))
      else:
        month_end_str = '\\mbox{%s{\\tiny\\RIGHTarrow}\\textsf{%s}}' % (
          jyotisha.names.NAMES['RASHI_NAMES'][scripts[0]][_m], time.Hour(
            24 * (daily_panchaanga.solar_sidereal_date_sunset.month_transition - daily_panchaanga.julian_day_start)).toString(format=time_format))

    month_data = '\\sunmonth{%s}{%d}{%s}' % (
      jyotisha.names.NAMES['RASHI_NAMES'][scripts[0]][daily_panchaanga.solar_sidereal_date_sunset.month], daily_panchaanga.solar_sidereal_date_sunset.day,
      month_end_str)

    print('\\caldata{%s}{%s}{%s{%s}{%s}{%s}%s}' %
          (month[m], dt, month_data,
           jyotisha.names.get_chandra_masa(daily_panchaanga.lunar_month_sunrise.index,
                                           jyotisha.names.NAMES, scripts[0]),
           jyotisha.names.NAMES['RTU_NAMES'][scripts[0]][int(ceil(daily_panchaanga.lunar_month_sunrise.index))],
           jyotisha.names.NAMES['VARA_NAMES'][scripts[0]][daily_panchaanga.date.get_weekday()], sar_data), file=output_stream)

    if daily_panchaanga.jd_moonrise > daily_panchaangas[d + 1].jd_sunrise:
      moonrise = '---'
    if daily_panchaanga.jd_moonset > daily_panchaangas[d + 1].jd_sunrise:
      moonset = '---'

    if daily_panchaanga.jd_moonrise < daily_panchaanga.jd_moonset:
      print('{\\sunmoonrsdata{%s}{%s}{%s}{%s}' % (sunrise, sunset, moonrise, moonset), file=output_stream)
    else:
      print('{\\sunmoonsrdata{%s}{%s}{%s}{%s}' % (sunrise, sunset, moonrise, moonset), file=output_stream)

    print(
      '{\\kalas{%s %s %s %s %s %s %s %s %s %s %s %s %s %s}}}' % (braahma_start, praatahsandhya_start, praatahsandhya_end,
                                                                saangava,
                                                                madhyahnika_sandhya_start, madhyahnika_sandhya_end,
                                                                madhyaahna, aparaahna_muhuurta, sayahna,
                                                                sayamsandhya_start, sayamsandhya_end,
                                                                ratriyama1, shayana_time_end, dinaanta),
      file=output_stream)
    if compute_lagnams:
      print('{\\tnykdata{%s}%%\n{%s}{%s}%%\n{%s}%%\n{%s}{%s}\n}'
            % (tithi_data_str, nakshatra_data_str, rashi_data_str, yoga_data_str,
               karana_data_str, lagna_data_str), file=output_stream)
    else:
      print('{\\tnykdata{%s}%%\n{%s}{%s}%%\n{%s}%%\n{%s}{\\scriptsize %s}\n}'
            % (tithi_data_str, nakshatra_data_str, rashi_data_str, yoga_data_str,
               karana_data_str, ''), file=output_stream)

    rules_collection = rules.RulesCollection.get_cached(
      repos_tuple=tuple(panchaanga.computation_system.options.fest_repos))
    fest_details_dict = rules_collection.name_to_rule

    # Using set as an ugly workaround since we may have sometimes assigned the same
    # festival to the same day again!
    print('{%s}' % '\\eventsep '.join(
      [f.tex_code(scripts=scripts, timezone=Timezone(timezone_id=panchaanga.city.timezone), fest_details_dict=fest_details_dict) for f in
       sorted(daily_panchaanga.festival_id_to_instance.values())]), file=output_stream)

    print('{%s} ' % WDAY[daily_panchaanga.date.get_weekday()], file=output_stream)
    print('\\cfoot{\\rygdata{%s}{%s}{%s}}' % (rahu, yama, gulika), file=output_stream)

    if m == 12 and dt == 31:
      break

  print('\\end{document}', file=output_stream)
Exemple #16
0
def get_panchaanga_for_kali_year(city,
                                 year,
                                 precomputed_json_dir="~/Documents/jyotisha",
                                 computation_system: ComputationSystem = None,
                                 allow_precomputed=True,
                                 recompute_festivals=True):
    year = int(year)
    fname = os.path.expanduser(
        '%s/%s__kali_%s__%s.json' %
        (precomputed_json_dir, city.name, year, computation_system))
    if os.path.isfile(fname) and allow_precomputed:
        fn = lambda: get_panchaanga_for_kali_year(
            city=city,
            year=year,
            precomputed_json_dir=precomputed_json_dir,
            computation_system=computation_system,
            allow_precomputed=False)
        panchaanga = load_panchaanga(fname=fname, fallback_fn=fn)
        # Fest repos to be used might have changed in this call.
        panchaanga.computation_system = computation_system
        if recompute_festivals:
            panchaanga.update_festival_details()
        return panchaanga
    else:
        logging.info(
            'No precomputed data available or allowed. Computing panchaanga...\n'
        )
        start_year_civil = year - era.get_year_0_offset(era_id=era.ERA_KALI)
        anga_span_finder = AngaSpanFinder.get_cached(
            ayanaamsha_id=Ayanamsha.CHITRA_AT_180,
            anga_type=AngaType.SIDEREAL_MONTH)
        start_mesha = anga_span_finder.find(jd1=time.utc_gregorian_to_jd(
            Date(year=start_year_civil, month=3, day=1)),
                                            jd2=time.utc_gregorian_to_jd(
                                                Date(year=start_year_civil,
                                                     month=5,
                                                     day=1)),
                                            target_anga_id=1)
        jd_next_sunset_start_mesha = city.get_setting_time(
            julian_day_start=start_mesha.jd_start, body=Graha.SUN)
        end_mina = anga_span_finder.find(jd1=time.utc_gregorian_to_jd(
            Date(year=start_year_civil + 1, month=3, day=1)),
                                         jd2=time.utc_gregorian_to_jd(
                                             Date(year=start_year_civil + 1,
                                                  month=5,
                                                  day=1)),
                                         target_anga_id=1)
        jd_preceding_sunset_end_mina = city.get_setting_time(
            julian_day_start=end_mina.jd_start - 1, body=Graha.SUN)
        tz = Timezone(city.timezone)
        panchaanga = periodical.Panchaanga(
            city=city,
            start_date=tz.julian_day_to_local_time(
                julian_day=jd_next_sunset_start_mesha),
            end_date=tz.julian_day_to_local_time(
                julian_day=jd_preceding_sunset_end_mina),
            computation_system=computation_system)
        panchaanga.year = year
        # Festival data may be updated more frequently and a precomputed panchaanga may go out of sync. Hence we keep this method separate.
        logging.info('Writing computed panchaanga to %s...\n' % fname)

        try:
            panchaanga.dump_to_file(filename=fname)
        except EnvironmentError:
            logging.warning("Not able to save.")
            logging.error(traceback.format_exc())
        return panchaanga