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))
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
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)
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)
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
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)
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)
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()
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)
def test_get_timezone_offset_hours_from_jd(): tz = Timezone("America/Los_Angeles") assert tz.get_timezone_offset_hours_from_jd(2458447) == -8
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])
def get_timezone_obj(self): from jyotisha.panchaanga.temporal.time import Timezone return Timezone(timezone_id=self.timezone)
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)
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