def assign_chandra_darshanam(self): for d in range(self.panchaanga.duration_prior_padding, self.panchaanga.duration + 1): [y, m, dt, t] = time.jd_to_utc_gregorian(self.panchaanga.jd_start + d - 1).to_date_fractional_hour_tuple() # Chandra Darshanam if self.daily_panchaangas[ d].sunrise_day_angas.tithi_at_sunrise.index == 1 or self.daily_panchaangas[ d].sunrise_day_angas.tithi_at_sunrise.index == 2: tithi_sunset = temporal.tithi.get_tithi( self.daily_panchaangas[d].jd_sunset).index tithi_sunset_tmrw = temporal.tithi.get_tithi( self.daily_panchaangas[d + 1].jd_sunset).index # if tithi_sunset <= 2 and tithi_sunset_tmrw != 2: fest = FestivalInstance(name='candra-darzanam') if tithi_sunset <= 2: if tithi_sunset == 1: self.daily_panchaangas[d + 1].festival_id_to_instance[ fest.name] = fest else: self.daily_panchaangas[d].festival_id_to_instance[ fest.name] = fest elif tithi_sunset_tmrw == 2: self.daily_panchaangas[d + 1].festival_id_to_instance[ fest.name] = fest
def compute_solar_eclipses(self): jd = self.panchaanga.jd_start while 1: next_eclipse_sol = self.panchaanga.city.get_solar_eclipse_time( jd_start=jd) [y, m, dt, t] = time.jd_to_utc_gregorian( next_eclipse_sol[1][0]).to_date_fractional_hour_tuple() local_time = tz(self.panchaanga.city.timezone).localize( datetime(y, m, dt, 6, 0, 0)) # checking @ 6am local - can we do any better? tz_off = (datetime.utcoffset(local_time).days * 86400 + datetime.utcoffset(local_time).seconds) / 3600.0 # compute offset from UTC jd = next_eclipse_sol[1][0] + (tz_off / 24.0) jd_eclipse_solar_start = next_eclipse_sol[1][1] + (tz_off / 24.0) jd_eclipse_solar_end = next_eclipse_sol[1][4] + (tz_off / 24.0) # -1 is to not miss an eclipse that occurs after sunset on 31-Dec! if jd_eclipse_solar_start > self.panchaanga.jd_end + 1: break else: fday = int( floor(jd) - floor(self.daily_panchaangas[0].julian_day_start)) if (jd < (self.daily_panchaangas[fday].jd_sunrise + tz_off / 24.0)): fday -= 1 eclipse_solar_start = time.jd_to_utc_gregorian( jd_eclipse_solar_start).get_fractional_hour() if (jd_eclipse_solar_start - (tz_off / 24.0)) == 0.0 or \ (jd_eclipse_solar_end - (tz_off / 24.0)) == 0.0: # Move towards the next eclipse... at least the next new # moon (>=25 days away) jd += MIN_DAYS_NEXT_ECLIPSE continue solar_eclipse_str = 'sUrya-grahaNam' if self.daily_panchaangas[fday].date.get_weekday() == 0: solar_eclipse_str = '★cUDAmaNi-' + solar_eclipse_str self.daily_panchaangas[fday].festival_id_to_instance[ solar_eclipse_str] = (FestivalInstance( name=solar_eclipse_str, interval=Interval(jd_start=jd_eclipse_solar_start, jd_end=jd_eclipse_solar_end))) jd = jd + MIN_DAYS_NEXT_ECLIPSE
def assign_bhriguvara_subrahmanya_vratam(self): for d in range(self.panchaanga.duration_prior_padding, self.panchaanga.duration + 1): [y, m, dt, t] = time.jd_to_utc_gregorian(self.panchaanga.jd_start + d - 1).to_date_fractional_hour_tuple() # BHRGUVARA SUBRAHMANYA VRATAM if self.daily_panchaangas[ d].solar_sidereal_date_sunset.month == 7 and self.daily_panchaangas[ d].date.get_weekday() == 5: festival_name = 'bhRguvAra-subrahmaNya-vratam' if festival_name not in self.panchaanga.festival_id_to_days: # only the first bhRguvAra of tulA mAsa is considered (skAnda purANam) # https://youtu.be/rgXwyo0L3i8?t=222 self.festival_id_to_days[festival_name].add( self.daily_panchaangas[d].date)
def calc_nakshatra_tyaajya(self, debug=False): self.panchaanga.tyajyam_data = [[] for _x in range(self.panchaanga.duration + 1)] for d in range(self.panchaanga.duration_prior_padding, self.panchaanga.duration + 1): [y, m, dt, t] = time.jd_to_utc_gregorian(self.panchaanga.jd_start + d - 1).to_date_fractional_hour_tuple() jd = self.daily_panchaangas[d].julian_day_start t_start = self.daily_panchaangas[d - 1].sunrise_day_angas.nakshatras_with_ends[-1].jd_end if t_start is not None: nakshatra_span = self.daily_panchaangas[d].sunrise_day_angas.nakshatras_with_ends[0] (n, t_end) = (nakshatra_span.name, nakshatra_span.jd_end) if t_end is None: t_end = self.daily_panchaangas[d + 1].sunrise_day_angas.nakshatras_with_ends[0].jd_end tyaajya_start = t_start + (t_end - t_start) / 60 * (TYAJYA_SPANS_REL[n - 1] - 1) tyaajya_end = t_start + (t_end - t_start) / 60 * (TYAJYA_SPANS_REL[n - 1] + 3) if tyaajya_start < self.daily_panchaangas[d].jd_sunrise: self.panchaanga.tyajyam_data[d - 1] += [(tyaajya_start, tyaajya_end)] if debug: logging.debug('![%3d]%04d-%02d-%02d: %s (>>%s), %s–%s' % (d - 1, y, m, dt - 1, names.NAMES['NAKSHATRA_NAMES']['hk'][n], Hour(24 * (t_end - self.daily_panchaangas[d - 1].julian_day_start)).toString(format='hh:mm*'), Hour(24 * (tyaajya_start - self.daily_panchaangas[d - 1].julian_day_start)).toString(format='hh:mm*'), Hour(24 * (tyaajya_end - self.daily_panchaangas[d - 1].julian_day_start)).toString(format='hh:mm*'))) else: self.panchaanga.tyajyam_data[d] = [(tyaajya_start, tyaajya_end)] if debug: logging.debug(' [%3d]%04d-%02d-%02d: %s (>>%s), %s–%s' % (d, y, m, dt, names.NAMES['NAKSHATRA_NAMES']['hk'][n], Hour(24 * (t_end - jd)).toString(format='hh:mm*'), Hour(24 * (tyaajya_start - jd)).toString(format='hh:mm*'), Hour(24 * (tyaajya_end - jd)).toString(format='hh:mm*'))) if len(self.daily_panchaangas[d].sunrise_day_angas.nakshatras_with_ends) == 2: t_start = t_end nakshatra_span = self.daily_panchaangas[d].sunrise_day_angas.nakshatras_with_ends[1] (n2, t_end) = (nakshatra_span.name, nakshatra_span.jd_end) tyaajya_start = t_start + (t_end - t_start) / 60 * (TYAJYA_SPANS_REL[n2 - 1] - 1) tyaajya_end = t_start + (t_end - t_start) / 60 * (TYAJYA_SPANS_REL[n2 - 1] + 3) self.panchaanga.tyajyam_data[d] += [(tyaajya_start, tyaajya_end)] if debug: logging.debug(' [%3d] %s (>>%s), %s–%s' % (d, names.NAMES['NAKSHATRA_NAMES']['hk'][n2], Hour(24 * (t_end - jd)).toString(format='hh:mm*'), Hour(24 * (tyaajya_start - jd)).toString(format='hh:mm*'), Hour(24 * (tyaajya_end - jd)).toString(format='hh:mm*')))
def assign_nakshatra_vara_yoga_vratam(self): for d in range(self.panchaanga.duration_prior_padding, self.panchaanga.duration + 1): [y, m, dt, t] = time.jd_to_utc_gregorian(self.panchaanga.jd_start + d - 1).to_date_fractional_hour_tuple() # NAKSHATRA-WEEKDAY FESTIVALS for (nwd_fest_n, nwd_fest_wd, nwd_fest_name) in ( (13, 0, 'Adityahasta-puNyakAlaH'), (8, 0, 'ravipuSyayOga-puNyakAlaH'), (22, 1, 'sOmazrAvaNI-puNyakAlaH'), (5, 1, 'sOmamRgazIrSa-puNyakAlaH'), (1, 2, 'bhaumAzvinI-puNyakAlaH'), (6, 2, 'bhaumArdrA-puNyakAlaH'), (17, 3, 'budhAnurAdhA-puNyakAlaH'), (8, 4, 'gurupuSya-puNyakAlaH'), (27, 5, 'bhRgurEvatI-puNyakAlaH'), (4, 6, 'zanirOhiNI-puNyakAlaH'), ): n_prev = ((nwd_fest_n - 2) % 27) + 1 if (self.daily_panchaangas[d].sunrise_day_angas. nakshatra_at_sunrise.index == nwd_fest_n or self.daily_panchaangas[d].sunrise_day_angas. nakshatra_at_sunrise.index == n_prev ) and self.daily_panchaangas[d].date.get_weekday( ) == nwd_fest_wd: # Is it necessarily only at sunrise? d0_angas = self.daily_panchaangas[ d].day_length_based_periods.dinamaana.get_boundary_angas( anga_type=AngaType.NAKSHATRA, ayanaamsha_id=self.ayanaamsha_id) if any(x == nwd_fest_n for x in [ self.daily_panchaangas[d].sunrise_day_angas. nakshatra_at_sunrise.index, d0_angas.start.index, d0_angas.end.index ]): self.panchaanga.add_festival( fest_id=nwd_fest_name, date=self.daily_panchaangas[d].date)
def assign_vishesha_saptami(self): for d in range(self.panchaanga.duration_prior_padding, self.panchaanga.duration + 1): [y, m, dt, t] = time.jd_to_utc_gregorian(self.panchaanga.jd_start + d - 1).to_date_fractional_hour_tuple() # SPECIAL SAPTAMIs if self.daily_panchaangas[d].date.get_weekday() == 0 and ( self.daily_panchaangas[d].sunrise_day_angas. tithi_at_sunrise.index % 15) == 7: festival_name = 'bhAnusaptamI' if self.daily_panchaangas[ d].sunrise_day_angas.tithi_at_sunrise.index == 7: festival_name = 'vijayA' + '~' + festival_name if self.daily_panchaangas[ d].sunrise_day_angas.nakshatra_at_sunrise.index == 27: # Even more auspicious! festival_name += '★' self.panchaanga.add_festival( fest_id=festival_name, date=self.daily_panchaangas[d].date) if NakshatraDivision(self.daily_panchaangas[d].jd_sunrise, ayanaamsha_id=self.ayanaamsha_id).get_anga( zodiac.AngaType.NAKSHATRA_PADA).index == 49 and \ self.daily_panchaangas[d].sunrise_day_angas.tithi_at_sunrise.index == 7: self.panchaanga.add_festival( fest_id='bhadrA~saptamI', date=self.daily_panchaangas[d].date) if self.daily_panchaangas[ d].solar_sidereal_date_sunset.month_transition is not None: # we have a Sankranti! if self.daily_panchaangas[ d].sunrise_day_angas.tithi_at_sunrise.index == 7: self.panchaanga.add_festival( fest_id='mahAjayA~saptamI', date=self.daily_panchaangas[d].date)
def assign_vishesha_trayodashi(self): for d in range(self.panchaanga.duration_prior_padding, self.panchaanga.duration + 1): [y, m, dt, t] = time.jd_to_utc_gregorian(self.panchaanga.jd_start + d - 1).to_date_fractional_hour_tuple() # VARUNI TRAYODASHI if self.daily_panchaangas[ d].lunar_month_sunrise.index == 12 and self.daily_panchaangas[ d].sunrise_day_angas.tithi_at_sunrise.index == 28: if NakshatraDivision( self.daily_panchaangas[d].jd_sunrise, ayanaamsha_id=self.ayanaamsha_id).get_anga( zodiac.AngaType.NAKSHATRA).index == 24: vtr_name = 'vAruNI~trayOdazI' if self.daily_panchaangas[d].date.get_weekday() == 6: vtr_name = 'mahA' + vtr_name if NakshatraDivision( self.daily_panchaangas[d].jd_sunrise, ayanaamsha_id=self.ayanaamsha_id).get_anga( zodiac.AngaType.NAKSHATRA).index == 23: vtr_name = 'mahA' + vtr_name self.festival_id_to_days[vtr_name].add( self.daily_panchaangas[d].date)
def writeDailyText(panchaanga, time_format="hh:mm", script=sanscript.DEVANAGARI, compute_lagnams=True, output_file_stream=sys.stdout): """Write out the panchaanga TeX using a specified template """ output_stream = StringIO() rules_collection = rules.RulesCollection.get_cached( repos_tuple=tuple(panchaanga.computation_system.options.fest_repos)) fest_details_dict = rules_collection.name_to_rule 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: 'Sunday', 1: 'Monday', 2: 'Tuesday', 3: 'Wednesday', 4: 'Thursday', 5: 'Friday', 6: 'Saturday' } SHULAM = [('pratIcI dik', 12, 'guDam'), ('prAcI dik', 8, 'dadhi'), ('udIcI dik', 12, 'kSIram'), ('udIcI dik', 16, 'kSIram'), ('dakSiNA dik', 20, 'tailam'), ('pratIcI dik', 12, 'guDam'), ('prAcI dik', 8, 'dadhi')] samvatsara_id = (panchaanga.year - 1568) % 60 + 1 # distance from prabhava samvatsara_names = ( jyotisha.names.NAMES['SAMVATSARA_NAMES'][script][samvatsara_id], jyotisha.names.NAMES['SAMVATSARA_NAMES'][script][(samvatsara_id % 60) + 1]) yname_solar = samvatsara_names[0] # Assign year name until Mesha Sankranti yname_lunar = samvatsara_names[0] # Assign year name until Mesha Sankranti # print(' \\sffamily \\fontsize 43 43 \\selectfont %d–%d\\\\[0.5cm] \n\\hrule\n\\vspace 0.2cm ' # % (panchaanga.year + 3100, panchaanga.year + 3101), 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) daily_panchaangas = panchaanga.daily_panchaangas_sorted() for d in range(panchaanga.duration_prior_padding, jyotisha.panchaanga.temporal.MAX_SZ - 1): daily_panchaanga = daily_panchaangas[d] [y, m, dt, t] = time.jd_to_utc_gregorian(panchaanga.jd_start + d - 1).to_date_fractional_hour_tuple() print('## %02d-%s-%4d' % (dt, month[m], y), file=output_stream) jd = daily_panchaanga.julian_day_start tithi_data_str = '' for tithi_span in daily_panchaanga.sunrise_day_angas.tithis_with_ends: (tithi_ID, tithi_end_jd) = (tithi_span.name, tithi_span.jd_end) tithi = jyotisha.names.NAMES['TITHI_NAMES'][script][ tithi_ID].split('-')[-1] paksha = jyotisha.custom_transliteration.tr( 'zuklapakSaH' if tithi_ID <= 15 else 'kRSNapakSaH', script) if tithi_end_jd is None: tithi_data_str = '%s; %s►%s' % \ (tithi_data_str, tithi, jyotisha.custom_transliteration.tr('ahOrAtram (tridinaspRk)', script)) else: tithi_data_str = '%s; %s►%s (%s)%s' % \ (tithi_data_str, tithi, Hour( 24 * (tithi_end_jd - daily_panchaanga.jd_sunrise)).toString(format='gg-pp'), Hour(24 * (tithi_end_jd - jd)).toString( format=time_format), ' ') if tithi_ID % 15 == 0: paksha = '%s►%s' % (paksha, Hour( 24 * (tithi_end_jd - jd)).toString(format=time_format)) tithi_data_str = getName('tithiH', script) + '—' + tithi_data_str[2:] paksha_data_str = getName('pakSaH', script) + '—' + paksha nakshatra_data_str = '' for nakshatra_span in daily_panchaanga.sunrise_day_angas.nakshatras_with_ends: (nakshatra_ID, nakshatra_end_jd) = (nakshatra_span.name, nakshatra_span.jd_end) nakshatra = jyotisha.names.NAMES['NAKSHATRA_NAMES'][script][ nakshatra_ID] if nakshatra_end_jd is None: nakshatra_data_str = '%s; %s►%s' % \ (nakshatra_data_str, nakshatra, jyotisha.custom_transliteration.tr('ahOrAtram', script)) else: nakshatra_data_str = '%s; %s►%s (%s)' % \ (nakshatra_data_str, nakshatra, Hour( 24 * (nakshatra_end_jd - daily_panchaanga.jd_sunrise)).toString(format='gg-pp'), Hour(24 * (nakshatra_end_jd - jd)).toString( format=time_format), ) nakshatra_data_str = getName('nakSatram', script) + '—' + nakshatra_data_str[2:] chandrashtama_rashi_data_str = '' for raashi_span in daily_panchaanga.sunrise_day_angas.raashis_with_ends: (rashi_ID, rashi_end_jd) = (raashi_span.name, raashi_span.jd_end) rashi = jyotisha.names.NAMES['RASHI_SUFFIXED_NAMES'][script][ rashi_ID] if rashi_end_jd is None: rashi_data_str = '%s' % (rashi) chandrashtama_rashi_data_str = getName( 'candrASTama-rAziH', script) + '—%s' % ( jyotisha.names.NAMES['RASHI_NAMES'][script][( (rashi_ID - 8) % 12) + 1]) else: rashi_data_str = '%s►%s' % (rashi, Hour(24 * (rashi_end_jd - jd)).toString( format=time_format)) chandrashtama_rashi_data_str = getName( 'candrASTama-rAziH', script) + '—%s►%s; %s ➥' % ( jyotisha.names.NAMES['RASHI_NAMES'][script][( (rashi_ID - 8) % 12) + 1], Hour(24 * (rashi_end_jd - jd)).toString(format=time_format), jyotisha.names.NAMES['RASHI_NAMES'][script][( (rashi_ID - 7) % 12) + 1]) if compute_lagnams: lagna_data_str = '' for lagna_ID, lagna_end_jd in daily_panchaanga.lagna_data: lagna = jyotisha.names.NAMES['RASHI_NAMES'][script][lagna_ID] lagna_data_str = '%s; %s►%s' % \ (lagna_data_str, lagna, Hour(24 * (lagna_end_jd - jd)).toString( format=time_format)) lagna_data_str = getName('lagnam', script) + '—' + lagna_data_str[2:] 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 += ' ' yoga = jyotisha.names.NAMES['YOGA_NAMES'][script][yoga_ID] if yoga_end_jd is None: yoga_data_str = '%s; %s►%s' % ( yoga_data_str, yoga, jyotisha.custom_transliteration.tr('ahOrAtram', script)) else: yoga_data_str = '%s; %s►%s (%s)' % ( yoga_data_str, yoga, Hour(24 * (yoga_end_jd - daily_panchaanga.jd_sunrise)).toString( format='gg-pp'), Hour(24 * (yoga_end_jd - jd)).toString(format=time_format)) if yoga_end_jd is not None: yoga_data_str += '; %s ➥' % ( jyotisha.names.NAMES['YOGA_NAMES'][script][(yoga_ID % 27) + 1]) yoga_data_str = getName('yOgaH', script) + '—' + yoga_data_str[2:] 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 += ' ' karana = jyotisha.names.NAMES['KARANA_NAMES'][script][karana_ID] if karana_end_jd is None: karana_data_str = '%s; %s►%s' % \ (karana_data_str, karana, jyotisha.custom_transliteration.tr('ahOrAtram', script)) else: karana_data_str = '%s; %s►%s (%s)' % \ (karana_data_str, karana, Hour( 24 * (karana_end_jd - daily_panchaanga.jd_sunrise)).toString(format='gg-pp'), Hour(24 * (karana_end_jd - jd)).toString( format=time_format)) if karana_end_jd is not None: karana_data_str += '; %s ➥' % (jyotisha.names.NAMES['KARANA_NAMES'] [script][(karana_ID % 60) + 1]) karana_data_str = getName('karaNam', script) + '—' + karana_data_str[2:] sunrise = Hour(24 * (daily_panchaanga.jd_sunrise - jd)).toString( format=time_format) sunset = Hour(24 * (daily_panchaanga.jd_sunset - jd)).toString( format=time_format) moonrise = Hour(24 * (daily_panchaanga.jd_moonrise - jd)).toString( format=time_format) moonset = Hour(24 * (daily_panchaanga.jd_moonset - jd)).toString( format=time_format) # braahma = jyotisha.panchaanga.temporal.Time(24 * (daily_panchaanga.day_length_based_periods.braahma.jd_start - jd)).toString(format=time_format) # praatahsandhya = jyotisha.panchaanga.temporal.Time(24 * (daily_panchaanga.day_length_based_periods.praatas_sandhyaa.jd_start - jd)).toString(format=time_format) # praatahsandhya_end = jyotisha.panchaanga.temporal.Time(24 * (daily_panchaanga.day_length_based_periods.praatas_sandhyaa_end.jd_start - jd)).toString(format=time_format) # saangava = jyotisha.panchaanga.temporal.Time(24 * (daily_panchaanga.day_length_based_periods.saangava.jd_start - jd)).toString(format=time_format) # madhyaahna = jyotisha.panchaanga.temporal.Time(24 * (daily_panchaanga.day_length_based_periods.madhyaahna.jd_start - jd)).toString(format=time_format) # madhyahnika_sandhya = jyotisha.panchaanga.temporal.Time(24 * (daily_panchaanga.day_length_based_periods.maadhyaahnika_sandhyaa.jd_start - jd)).toString(format=time_format) # madhyahnika_sandhya_end = jyotisha.panchaanga.temporal.Time(24 * (daily_panchaanga.day_length_based_periods.maadhyaahnika_sandhyaa_end.jd_start - jd)).toString(format=time_format) aparaahna = Hour( 24 * (daily_panchaanga.day_length_based_periods.aparaahna.jd_start - jd)).toString(format=time_format) sayahna = Hour( 24 * (daily_panchaanga.day_length_based_periods.saayaahna.jd_start - jd)).toString(format=time_format) # sayamsandhya = jyotisha.panchaanga.temporal.Time(24 * (daily_panchaanga.day_length_based_periods.saayam_sandhyaa.jd_start - jd)).toString(format=time_format) # sayamsandhya_end = jyotisha.panchaanga.temporal.Time(24 * (daily_panchaanga.day_length_based_periods.saayam_sandhyaa_end.jd_start - jd)).toString(format=time_format) # ratriyama1 = jyotisha.panchaanga.temporal.Time(24 * (daily_panchaanga.day_length_based_periods.raatri_yaama_1.jd_start - jd)).toString(format=time_format) # sayana_time = jyotisha.panchaanga.temporal.Time(24 * (daily_panchaanga.day_length_based_periods.shayana.jd_start - jd)).toString(format=time_format) dinaanta = Hour( 24 * (daily_panchaanga.day_length_based_periods.dinaanta.jd_start - jd)).toString(format=time_format) rahu = '%s–%s' % ( Hour(24 * (daily_panchaanga.day_length_based_periods.raahu.jd_start - jd)).toString(format=time_format), Hour(24 * (daily_panchaanga.day_length_based_periods.raahu.jd_end - jd)).toString(format=time_format)) yama = '%s–%s' % ( Hour(24 * (daily_panchaanga.day_length_based_periods.yama.jd_start - jd)).toString(format=time_format), Hour(24 * (daily_panchaanga.day_length_based_periods.yama.jd_end - jd)).toString(format=time_format)) gulika = '%s–%s' % ( Hour(24 * (daily_panchaanga.day_length_based_periods.gulika.jd_start - jd)).toString(format=time_format), 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_solar = samvatsara_names[1] if daily_panchaanga.lunar_month_sunrise == 1: # Flip the year name for the remaining days yname_lunar = samvatsara_names[1] # Assign samvatsara, ayana, rtu # ayanam = jyotisha.names.NAMES['AYANA_NAMES'][script][ daily_panchaanga.solar_sidereal_date_sunset.month] rtu_solar = jyotisha.names.NAMES['RTU_NAMES'][script][ daily_panchaanga.solar_sidereal_date_sunset.month] rtu_lunar = jyotisha.names.NAMES['RTU_NAMES'][script][int( ceil(daily_panchaanga.lunar_month_sunrise))] 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 = '%s►%s' % ( jyotisha.names.NAMES['RASHI_NAMES'][script][_m], 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 = '%s►%s' % ( jyotisha.names.NAMES['RASHI_NAMES'][script][_m], Hour(24 * (daily_panchaanga.solar_sidereal_date_sunset. month_transition - daily_panchaanga.julian_day_start) ).toString(format=time_format)) if month_end_str == '': month_data = '%s (%s %d)' % ( jyotisha.names.NAMES['RASHI_NAMES'][script][ daily_panchaanga.solar_sidereal_date_sunset.month], getName('dinaM', script), daily_panchaanga.solar_sidereal_date_sunset.day) else: month_data = '%s (%s %d); %s' % ( jyotisha.names.NAMES['RASHI_NAMES'][script][ daily_panchaanga.solar_sidereal_date_sunset.month], getName('dinaM', script), daily_panchaanga.solar_sidereal_date_sunset.day, month_end_str) vara = jyotisha.names.NAMES['VARA_NAMES'][script][ daily_panchaanga.date.get_weekday()] if yname_lunar == yname_solar: print(getName('saMvatsaraH', script) + '—%s' % yname_lunar, file=output_stream) print(getName('ayanam', script) + '—%s' % ayanam, file=output_stream) if rtu_lunar == rtu_solar: print(getName('RtuH', script) + '—%s' % rtu_lunar, file=output_stream) print('°' * 25, file=output_stream) print('☀ ' + getName('sauramAnam', script), file=output_stream) if yname_lunar != yname_solar: print(getName('saMvatsaraH', script) + '—%s' % yname_solar, file=output_stream) print(getName('ayanam', script) + '—%s' % ayanam, file=output_stream) if rtu_lunar != rtu_solar: print(getName('RtuH', script) + '—%s' % rtu_solar, file=output_stream) print(getName('mAsaH', script) + '—%s' % month_data, file=output_stream) print('°' * 25, file=output_stream) print('⚪ ' + getName('cAndramAnam', script), file=output_stream) if yname_lunar != yname_solar: print(getName('saMvatsaraH', script) + '—%s' % yname_lunar, file=output_stream) print(getName('ayanam', script) + '—%s' % ayanam, file=output_stream) if rtu_lunar != rtu_solar: print(getName('RtuH', script) + '—%s' % rtu_lunar, file=output_stream) print(getName('mAsaH', script) + '—%s' % jyotisha.names.get_chandra_masa( daily_panchaanga.lunar_month_sunrise, jyotisha.names.NAMES, script), file=output_stream) print('°' * 25, file=output_stream) # braahma # praatahsandhya, praatahsandhya_end # saangava # madhyahnika_sandhya, madhyahnika_sandhya_end # madhyaahna # aparaahna # sayahna # sayamsandhya, sayamsandhya_end # dinaanta print('%s' % (paksha_data_str), file=output_stream) print('%s' % (tithi_data_str), file=output_stream) print('%s—%s' % (getName('vAsaraH', script), vara), file=output_stream) print('%s (%s)' % (nakshatra_data_str, rashi_data_str), file=output_stream) print('%s' % (yoga_data_str), file=output_stream) print('%s' % (karana_data_str), file=output_stream) print('%s' % (chandrashtama_rashi_data_str), 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 = '---' print( '### **%s (%s)**' % (getName('LOC', script), jyotisha.custom_transliteration.tr(panchaanga.city.name, script)), file=output_stream) if compute_lagnams: print('%s' % (lagna_data_str), file=output_stream) if daily_panchaanga.jd_moonrise < daily_panchaanga.jd_moonset: print('%s—%s; %s—%s' % (getName('sUryOdayaH', script), sunrise, getName('sUryAstamayaH', script), sunset), file=output_stream) print('%s—%s; %s—%s' % (getName('candrOdayaH', script), moonrise, getName('candrAstamayaH', script), moonset), file=output_stream) else: print('%s—%s; %s—%s' % (getName('sUryOdayaH', script), sunrise, getName('sUryAstamayaH', script), sunset), file=output_stream) print('%s—%s; %s—%s' % (getName('candrAstamayaH', script), moonset, getName('candrOdayaH', script), moonrise), file=output_stream) print('%s—%s►%s' % (getName('aparAhNa-kAlaH', script), aparaahna, sayahna), file=output_stream) print('%s—%s' % (getName('dinAntaH', script), dinaanta), file=output_stream) print('%s—%s\n%s—%s\n%s—%s' % (getName( 'rAhukAlaH', script), rahu, getName('yamaghaNTaH', script), yama, getName('gulikakAlaH', script), gulika), file=output_stream) shulam_end_jd = daily_panchaanga.jd_sunrise + ( daily_panchaanga.jd_sunset - daily_panchaanga.jd_sunrise) * ( SHULAM[daily_panchaanga.date.get_weekday()][1] / 30) print( '%s—%s (►%s); %s–%s' % (getName('zUlam', script), getName(SHULAM[daily_panchaanga.date.get_weekday()][0], script), Hour(24 * (shulam_end_jd - jd)).toString(format=time_format), getName('parihAraH', script), getName(SHULAM[daily_panchaanga.date.get_weekday()][2], script)), file=output_stream) # Using set as an ugly workaround since we may have sometimes assigned the same # festival to the same day again! fest_list = [] for f in sorted(daily_panchaanga.festival_id_to_instance.values()): fest_name_cleaned = f.get_best_transliterated_name( scripts=[script], fest_details_dict=fest_details_dict).replace( '~', ' ').replace('tamil', '') fest_name_cleaned = re.sub('[{}]', '', fest_name_cleaned).replace( '\\', '').replace('textsf', '').replace('To', '►').replace('RIGHTarrow', '►') fest_list.append(fest_name_cleaned) if len(fest_list): print('#### %s\n%s\n' % (getName('dina-vizESAH', script), '; '.join(fest_list)), file=output_stream) else: print('', file=output_stream) output_text = cleanTamilNa(output_stream.getvalue()) output_text = output_text.replace('\n', '\\\n') output_text = output_text.replace('\n\\', '\n') output_text = output_text.replace('\\\n\n', '\n\n') output_text = output_text.replace('\\\n#', '\n#') output_text = re.sub(r'(#.*)\\\n', r'\1\n', output_text) # output_text = re.sub(r'^\\', r'', output_text) print(output_text, file=output_file_stream) output_stream = StringIO() if m == 12 and dt == 31: break
def assign_shasthi_vratam(self): for d in range(self.panchaanga.duration_prior_padding, self.panchaanga.duration + 1): [y, m, dt, t] = time.jd_to_utc_gregorian(self.panchaanga.jd_start + d - 1).to_date_fractional_hour_tuple() # # SHASHTHI Vratam # Check only for Adhika maasa here... festival_name = 'SaSThI-vratam' if self.daily_panchaangas[d].lunar_month_sunrise.index == 8: festival_name = 'skanda' + festival_name elif self.daily_panchaangas[d].lunar_month_sunrise.index == 4: festival_name = 'kumAra-' + festival_name elif self.daily_panchaangas[d].lunar_month_sunrise.index == 6: festival_name = 'SaSThIdEvI-' + festival_name elif self.daily_panchaangas[d].lunar_month_sunrise.index == 9: festival_name = 'subrahmaNya-' + festival_name if self.daily_panchaangas[ d].sunrise_day_angas.tithi_at_sunrise.index == 5 or self.daily_panchaangas[ d].sunrise_day_angas.tithi_at_sunrise.index == 6: (d0_angas, d1_angas) = get_2_day_interval_boundary_angas( kaala="madhyaahna", anga_type=AngaType.TITHI, p0=self.daily_panchaangas[d], p1=self.daily_panchaangas[d + 1]) if d0_angas.start.index == 6 or d0_angas.end.index == 6: if festival_name in self.panchaanga.festival_id_to_days: # Check if yesterday was assigned already # to this puurvaviddha festival! if self.daily_panchaangas[ d - 1].date not in self.panchaanga.festival_id_to_days[ festival_name]: self.festival_id_to_days[festival_name].add( self.daily_panchaangas[d].date) else: self.festival_id_to_days[festival_name].add( self.daily_panchaangas[d].date) elif d1_angas.start.index == 6 or d1_angas.end.index == 6: self.festival_id_to_days[festival_name].add( self.daily_panchaangas[d + 1].date) else: # This means that the correct anga did not # touch the kaala on either day! # sys.stderr.write('Could not assign puurvaviddha day for %s!\ # Please check for unusual cases.\n' % festival_name) if d1_angas.start.index == 6 + 1 or d1_angas.end.index == 6 + 1: # Need to assign a day to the festival here # since the anga did not touch kaala on either day # BUT ONLY IF YESTERDAY WASN'T ALREADY ASSIGNED, # THIS BEING PURVAVIDDHA # Perhaps just need better checking of # conditions instead of this fix if festival_name in self.panchaanga.festival_id_to_days: if self.daily_panchaangas[ d - 1].date not in self.panchaanga.festival_id_to_days[ festival_name]: self.festival_id_to_days[festival_name].add( self.daily_panchaangas[d].date) else: self.festival_id_to_days[festival_name].add( self.daily_panchaangas[d].date)
def test_jd_to_utc(): assert time.jd_to_utc_gregorian( 2458434.083333251).to_date_fractional_hour_tuple() == [ 2018, 11, 11, 13.99999802559611 ]
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 assign_shraaddha_tithi(self, debug_shraaddha_tithi=False): tithi_days = [{z: [] for z in range(0, 32)} for _x in range(13)] lunar_tithi_days = {} daily_panchaangas = self.daily_panchaangas def _assign(self, fday, tithi): if daily_panchaangas[ fday].shraaddha_tithi == [] or daily_panchaangas[ fday].shraaddha_tithi == [tithi]: daily_panchaangas[fday].shraaddha_tithi = [tithi] else: daily_panchaangas[fday].shraaddha_tithi.append(tithi) if daily_panchaangas[fday - 1].shraaddha_tithi.count(tithi) == 1: daily_panchaangas[fday - 1].shraaddha_tithi.remove(tithi) for d in range(self.panchaanga.duration_prior_padding, self.panchaanga.duration + 1): [y, m, dt, t] = time.jd_to_utc_gregorian(self.panchaanga.jd_start + d - 1).to_date_fractional_hour_tuple() (d0_angas, d1_angas) = get_2_day_interval_boundary_angas( kaala="aparaahna", anga_type=AngaType.TITHI, p0=self.daily_panchaangas[d], p1=self.daily_panchaangas[d + 1]) angam_start = d0_angas.start next_anga = angam_start + 1 nnext_anga = next_anga + 1 # Calc vyaaptis t_start_d, t_end_d = interval.get_interval( daily_panchaangas[d].jd_sunrise, daily_panchaangas[d].jd_sunset, 3, 5).to_tuple() span_1 = t_end_d - t_start_d span_2 = 0 for tithi_span in daily_panchaangas[ d].sunrise_day_angas.tithis_with_ends: tithi_end = tithi_span.jd_end if tithi_end is None: pass elif t_start_d < tithi_end < t_end_d: span_1 = tithi_end - t_start_d span_2 = t_end_d - tithi_end t_start_d1, t_end_d1 = interval.get_interval( daily_panchaangas[d + 1].jd_sunrise, daily_panchaangas[d + 1].jd_sunset, 3, 5).to_tuple() vyapti_3 = t_end_d1 - t_start_d1 for tithi_span in daily_panchaangas[ d + 1].sunrise_day_angas.tithis_with_ends: tithi_end = tithi_span.jd_end if tithi_end is None: pass elif t_start_d1 < tithi_end < t_end_d1: vyapti_3 = tithi_end - t_start_d1 # Combinations # <a> 1 1 1 1 - d + 1: 1 # <b> 1 1 2 2 - d: 1 # <f> 1 1 2 3 - d: 1, d+1: 2 # <e> 1 1 1 2 - d, or vyApti (just in case next day aparaahna is slightly longer): 1 # <d> 1 1 3 3 - d: 1, 2 # <h> 1 2 3 3 - d: 2 # <c> 1 2 2 2 - d + 1: 2 # <g> 1 2 2 3 - vyApti: 2 fday = -1 reason = '?' # if sunrise_day_angas[1] == angam_start: # logging.debug('Pre-emptively assign %2d to %3d, can be removed tomorrow if need be.' % (angam_start, d)) # _assign(self, d, angam_start) if d1_angas.end == angam_start: # <a> # Full aparaahnas on both days, so second day fday = d + 1 s_tithi = angam_start reason = '%2d incident on consecutive days; paraviddhA' % s_tithi.index elif (d0_angas.end == angam_start) and (d1_angas.start == next_anga): # <b>/<f> fday = d s_tithi = d0_angas.start reason = '%2d not incident on %3d' % (s_tithi.index, d + 1) if d1_angas.end == nnext_anga: # <f> if debug_shraaddha_tithi: logging.debug('%03d [%4d-%02d-%02d]: %s' % ( d, y, m, dt, 'Need to assign %2d to %3d as it is present only at start of aparAhna tomorrow!)' % (next_anga.index, d + 1))) _assign(self, d + 1, next_anga) elif d1_angas.start == angam_start: # <e> if span_1 > vyapti_3: # Most likely fday = d s_tithi = d1_angas.start reason = '%2d has more vyApti on day %3d (%f ghatikAs; full?) compared to day %3d (%f ghatikAs)' % ( s_tithi.index, d, span_1 * 60, d + 1, vyapti_3 * 60) else: fday = d + 1 s_tithi = d1_angas.start reason = '%2d has more vyApti on day %3d (%f ghatikAs) compared to day %3d (%f ghatikAs) --- unusual!' % ( s_tithi.index, d + 1, vyapti_3 * 60, d, span_1 * 60) elif d1_angas.start == nnext_anga: # <d>/<h> if d0_angas.end == next_anga: # <h> fday = d s_tithi = d0_angas.end reason = '%2d has some vyApti on day %3d; not incident on day %3d at all' % ( s_tithi.index, d, d + 1) else: # <d> s_tithi = angam_start fday = d reason = '%2d is incident fully at aparAhna today (%3d), and not incident tomorrow (%3d)!' % ( s_tithi.index, d, d + 1) # Need to check vyApti of next_anga in sAyaMkAla: if it's nearly entire sAyaMkAla ie 5-59-30 or more! if debug_shraaddha_tithi: logging.debug('%03d [%4d-%02d-%02d]: %s' % ( d, y, m, dt, '%2d not incident at aparAhna on either day (%3d/%3d); picking second day %3d!' % (next_anga, d, d + 1, d + 1))) _assign(self, d + 1, next_anga) # logging.debug(reason) elif d0_angas.end == d1_angas.start == d1_angas.end == next_anga: # <c> s_tithi = next_anga fday = d + 1 reason = '%2d has more vyApti on %3d (full) compared to %3d (part)' % ( s_tithi.index, d + 1, d) elif d0_angas.end == d1_angas.start == next_anga: # <g> s_tithi = d1_angas.start if span_2 > vyapti_3: # Most likely fday = d reason = '%2d has more vyApti on day %3d (%f ghatikAs) compared to day %3d (%f ghatikAs)' % ( s_tithi.index, d, span_2 * 60, d + 1, vyapti_3 * 60) else: fday = d + 1 reason = '%2d has more vyApti on day %3d (%f ghatikAs) compared to day %3d (%f ghatikAs)' % ( s_tithi.index, d + 1, vyapti_3 * 60, d, span_2 * 60 ) # Examine for greater vyApti else: logging.error('Should not reach here ever! %s %s', d0_angas.to_tuple(), d1_angas.to_tuple()) reason = '?' if debug_shraaddha_tithi: logging.debug( '%03d [%4d-%02d-%02d]: Assigning tithi %2d to %3d (%s).' % (d, y, m, dt, s_tithi.index, fday, reason)) _assign(self, fday, s_tithi) if debug_shraaddha_tithi: logging.debug(self.panchaanga.shraaddha_tithi) for z in set([x.lunar_month_sunrise for x in self.daily_panchaangas]): lunar_tithi_days[z] = {} for d in range(self.panchaanga.duration_prior_padding, self.panchaanga.duration + 1): for t in daily_panchaangas[d].shraaddha_tithi: lunar_tithi_days[daily_panchaangas[d].lunar_month_sunrise][ t.index] = d # Following this primary assignment, we must now "clean" for Sankranti, and repetitions # If there are two tithis, take second. However, if the second has sankrAnti dushtam, take # first. If both have sankrAnti dushtam, take second. for d in range(self.panchaanga.duration_prior_padding, self.panchaanga.duration + 1): if daily_panchaangas[d].shraaddha_tithi != []: if daily_panchaangas[ d].solar_sidereal_date_sunset.month_transition is not None: if debug_shraaddha_tithi: logging.debug( (d, daily_panchaangas[d]. solar_sidereal_date_sunset.month_transition)) aparaahna_start, aparaahna_end = interval.get_interval( daily_panchaangas[d].jd_sunrise, daily_panchaangas[d].jd_sunset, 3, 5).to_tuple() m1 = daily_panchaangas[ d - 1].solar_sidereal_date_sunset.month # Previous month m2 = daily_panchaangas[ d].solar_sidereal_date_sunset.month # Current month if aparaahna_start < daily_panchaangas[ d].solar_sidereal_date_sunset.month_transition < aparaahna_end: if debug_shraaddha_tithi: logging.debug( 'Sankranti in aparaahna! Assigning to both months!' ) assert daily_panchaangas[ d].solar_sidereal_date_sunset.day == 1 for t in daily_panchaangas[d].shraaddha_tithi: # Assigning to both months --- should get eliminated because of a second occurrence tithi_days[m1][t.index].extend([d, '*']) tithi_days[m2][t.index].extend([d, '*']) if daily_panchaangas[ d].solar_sidereal_date_sunset.month_transition < aparaahna_start: if debug_shraaddha_tithi: logging.debug('Sankranti before aparaahna!') assert daily_panchaangas[ d].solar_sidereal_date_sunset.day == 1 for t in daily_panchaangas[d].shraaddha_tithi: tithi_days[m2][t.index].extend([d, '*']) if aparaahna_end < daily_panchaangas[ d].solar_sidereal_date_sunset.month_transition: if debug_shraaddha_tithi: logging.debug('Sankranti after aparaahna!') # Depending on whether sankranti is before or after sunset, m2 may or may not be equal to m1 # In any case, we wish to assign this tithi to the previous month, where it really occurs. for t in daily_panchaangas[d].shraaddha_tithi: tithi_days[m1][t.index].extend([d, '*']) else: for t in daily_panchaangas[d].shraaddha_tithi: tithi_days[daily_panchaangas[d]. solar_sidereal_date_sunset.month][ t.index].append(d) # We have now assigned all tithis. Now, remove duplicates based on the above-mentioned rules. # TODO: This is not the best way to clean. Need to examine one month at a time. for m in range(1, 13): for t in range(1, 31): if len(tithi_days[m][t]) == 1: continue elif len(tithi_days[m][t]) == 2: if tithi_days[m][t][1] == '*': # Only one tithi available! if debug_shraaddha_tithi: logging.debug( 'Only one %2d tithi in month %2d, on day %3d, despite sankrAnti dushtam!' % (t, m, tithi_days[m][t][0])) del tithi_days[m][t][1] tithi_days[m][t][0] = '%d::%d' % (tithi_days[m][t][0], m) if debug_shraaddha_tithi: logging.debug('Note %s' % str(tithi_days[m][t])) else: daily_panchaangas[ tithi_days[m][t][0]].shraaddha_tithi = [ Anga.get_cached( index=0, anga_type_id=AngaType.TITHI.name) ] # Shunya if debug_shraaddha_tithi: logging.debug('Removed %d' % tithi_days[m][t][0]) del tithi_days[m][t][0] if debug_shraaddha_tithi: logging.debug( 'Two %2d tithis in month %2d: retaining second on %2d!' % (t, m, tithi_days[m][t][0])) elif len(tithi_days[m][t]) == 3: if debug_shraaddha_tithi: logging.debug('Two %2d tithis in month %2d: %s' % (t, m, str(tithi_days[m][t]))) if tithi_days[m][t][1] == '*': daily_panchaangas[ tithi_days[m][t][0]].shraaddha_tithi = [ Anga.get_cached( index=0, anga_type_id=AngaType.TITHI.name) ] # Shunya if debug_shraaddha_tithi: logging.debug('Removed %d' % tithi_days[m][t][0]) del tithi_days[m][t][:2] elif tithi_days[m][t][2] == '*': daily_panchaangas[ tithi_days[m][t][1]].shraaddha_tithi = [ Anga.get_cached( index=0, anga_type_id=AngaType.TITHI.name) ] # Shunya if debug_shraaddha_tithi: logging.debug('Removed %d' % tithi_days[m][t][1]) del tithi_days[m][t][1:] if debug_shraaddha_tithi: logging.debug(' Retaining non-dushta: %s' % (str(tithi_days[m][t]))) elif len(tithi_days[m][t]) == 4: if debug_shraaddha_tithi: logging.debug( 'Two dushta %2d tithis in month %2d: %s' % (t, m, str(tithi_days[m][t]))) daily_panchaangas[tithi_days[m][t][0]].shraaddha_tithi = [ Anga.get_cached(index=0, anga_type_id=AngaType.TITHI.name) ] # Shunya if debug_shraaddha_tithi: logging.debug('Removed %d' % tithi_days[m][t][0]) tithi_days[m][t][3] = str(m) del tithi_days[m][t][:2] if debug_shraaddha_tithi: logging.debug(' Retaining: %s' % (str(tithi_days[m][t]))) tithi_days[m][t][0] = '%d::%d' % (tithi_days[m][t][0], m) if debug_shraaddha_tithi: logging.debug('Note %s' % str(tithi_days[m][t])) elif len(tithi_days[m][t]) == 0: logging.warning( 'Rare issue. No tithi %d in this solar month (%d). Therefore use lunar tithi.' % (t, m)) # सौरमासे तिथ्यलाभे चान्द्रमानेन कारयेत् # tithi_days[m][t] = lunar_tithi_days[m][t] else: logging.error( 'Something weird. len(tithi_days[m][t]) is not in 1:4!! : %s (m=%d, t=%d)', str(tithi_days[m][t]), m, t) if debug_shraaddha_tithi: logging.debug(tithi_days)
def compute_lunar_eclipses(self): # Set location jd = self.panchaanga.jd_start while 1: next_eclipse_lun = self.panchaanga.city.get_lunar_eclipse_time(jd) [y, m, dt, t] = time.jd_to_utc_gregorian( next_eclipse_lun[1][0]).to_date_fractional_hour_tuple() local_time = tz(self.panchaanga.city.timezone).localize( datetime(y, m, dt, 6, 0, 0)) # checking @ 6am local - can we do any better? This is crucial, # since DST changes before 6 am tz_off = (datetime.utcoffset(local_time).days * 86400 + datetime.utcoffset(local_time).seconds) / 3600.0 # compute offset from UTC jd = next_eclipse_lun[1][0] + (tz_off / 24.0) jd_eclipse_lunar_start = next_eclipse_lun[1][2] + (tz_off / 24.0) jd_eclipse_lunar_end = next_eclipse_lun[1][3] + (tz_off / 24.0) # -1 is to not miss an eclipse that occurs after sunset on 31-Dec! if jd_eclipse_lunar_start > self.panchaanga.jd_end: break else: if (jd_eclipse_lunar_start - (tz_off / 24.0)) == 0.0 or \ (jd_eclipse_lunar_end - (tz_off / 24.0)) == 0.0: # Move towards the next eclipse... at least the next full # moon (>=25 days away) jd += MIN_DAYS_NEXT_ECLIPSE continue fday = int( floor(jd_eclipse_lunar_start) - floor(self.panchaanga.jd_start) + 1) # print '%%', jd, fday, self.date_str_to_panchaanga[fday].jd_sunrise, # self.date_str_to_panchaanga[fday-1].jd_sunrise if (jd < (self.daily_panchaangas[fday].jd_sunrise + tz_off / 24.0)): fday -= 1 # print '%%', jd, fday, self.date_str_to_panchaanga[fday].jd_sunrise, # self.date_str_to_panchaanga[fday-1].jd_sunrise, eclipse_lunar_start, # eclipse_lunar_end jd_moonrise_eclipse_day = self.panchaanga.city.get_rising_time( julian_day_start=self.daily_panchaangas[fday].jd_sunrise, body=Graha.MOON) + (tz_off / 24.0) jd_moonset_eclipse_day = self.panchaanga.city.get_rising_time( julian_day_start=jd_moonrise_eclipse_day, body=Graha.MOON) + (tz_off / 24.0) if jd_eclipse_lunar_end < jd_moonrise_eclipse_day or \ jd_eclipse_lunar_start > jd_moonset_eclipse_day: # Move towards the next eclipse... at least the next full # moon (>=25 days away) jd += MIN_DAYS_NEXT_ECLIPSE continue if Graha.singleton(Graha.MOON).get_longitude( jd_eclipse_lunar_end) < Graha.singleton( Graha.SUN).get_longitude(jd_eclipse_lunar_end): grasta = 'rAhugrasta' else: grasta = 'kEtugrasta' lunar_eclipse_str = 'candra-grahaNam~(' + grasta + ')' if self.daily_panchaangas[fday].date.get_weekday() == 1: lunar_eclipse_str = '★cUDAmaNi-' + lunar_eclipse_str self.daily_panchaangas[fday].festival_id_to_instance[ lunar_eclipse_str] = (FestivalInstance( name=lunar_eclipse_str, interval=Interval(jd_start=jd_eclipse_lunar_start, jd_end=jd_eclipse_lunar_end))) jd += MIN_DAYS_NEXT_ECLIPSE
def assign_ekaadashii_vratam(self): for d in range(self.panchaanga.duration_prior_padding, self.panchaanga.duration + 1): [y, m, dt, t] = time.jd_to_utc_gregorian(self.panchaanga.jd_start + d - 1).to_date_fractional_hour_tuple() # checking @ 6am local - can we do any better? local_time = tz(self.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 # EKADASHI Vratam # One of two consecutive tithis must appear @ sunrise! if (self.daily_panchaangas[d].sunrise_day_angas.tithi_at_sunrise. index % 15) == 10 or (self.daily_panchaangas[d].sunrise_day_angas. tithi_at_sunrise.index % 15) == 11: yati_ekaadashii_fday = smaarta_ekaadashii_fday = vaishnava_ekaadashii_fday = None ekaadashii_tithi_days = [ x.sunrise_day_angas.tithi_at_sunrise.index % 15 for x in self.daily_panchaangas[d:d + 3] ] if self.daily_panchaangas[ d].sunrise_day_angas.tithi_at_sunrise.index > 15: ekaadashii_paksha = 'krishna' else: ekaadashii_paksha = 'shukla' if ekaadashii_tithi_days in [[11, 11, 12], [10, 12, 12]]: smaarta_ekaadashii_fday = d + 1 tithi_arunodayam = tithi.get_tithi( self.daily_panchaangas[d + 1].jd_sunrise - (1 / 15.0) * (self.daily_panchaangas[d + 1].jd_sunrise - self.daily_panchaangas[d].jd_sunrise)).index if tithi_arunodayam % 15 == 10: vaishnava_ekaadashii_fday = d + 2 else: vaishnava_ekaadashii_fday = d + 1 elif ekaadashii_tithi_days in [[10, 12, 13], [11, 12, 13], [11, 12, 12], [11, 12, 14]]: smaarta_ekaadashii_fday = d tithi_arunodayam = temporal.tithi.get_tithi( self.daily_panchaangas[d].jd_sunrise - (1 / 15.0) * (self.daily_panchaangas[d].jd_sunrise - self.daily_panchaangas[d - 1].jd_sunrise)).index if tithi_arunodayam % 15 == 11 and ekaadashii_tithi_days in [ [11, 12, 13], [11, 12, 14] ]: vaishnava_ekaadashii_fday = d else: vaishnava_ekaadashii_fday = d + 1 elif ekaadashii_tithi_days in [[10, 11, 13], [11, 11, 13]]: smaarta_ekaadashii_fday = d vaishnava_ekaadashii_fday = d + 1 yati_ekaadashii_fday = d + 1 else: pass # These combinations are taken care of, either in the past or future. # if ekaadashii_tithi_days == [10, 11, 12]: # logging.debug('Not assigning. Maybe tomorrow?') # else: # logging.debug(('!!', d, ekaadashii_tithi_days)) if yati_ekaadashii_fday == smaarta_ekaadashii_fday == vaishnava_ekaadashii_fday is None: # Must have already assigned pass elif yati_ekaadashii_fday is None: if smaarta_ekaadashii_fday == vaishnava_ekaadashii_fday: # It's sarva ekaadashii self.festival_id_to_days[ 'sarva-' + names.get_ekaadashii_name( ekaadashii_paksha, self.daily_panchaangas[d]. lunar_month_sunrise.index)].add( self.daily_panchaangas[ smaarta_ekaadashii_fday].date) if ekaadashii_paksha == 'shukla': if self.daily_panchaangas[ d].solar_sidereal_date_sunset.month == 9: self.festival_id_to_days[ 'sarva-vaikuNTha-EkAdazI'].add( self.daily_panchaangas[ smaarta_ekaadashii_fday].date) else: self.festival_id_to_days[ 'smArta-' + names.get_ekaadashii_name( ekaadashii_paksha, self.daily_panchaangas[d]. lunar_month_sunrise.index)].add( self.daily_panchaangas[ smaarta_ekaadashii_fday].date) self.festival_id_to_days[ 'vaiSNava-' + names.get_ekaadashii_name( ekaadashii_paksha, self.daily_panchaangas[d]. lunar_month_sunrise.index)].add( self.daily_panchaangas[ vaishnava_ekaadashii_fday].date) if ekaadashii_paksha == 'shukla': if self.daily_panchaangas[ d].solar_sidereal_date_sunset.month == 9: self.festival_id_to_days[ 'smArta-vaikuNTha-EkAdazI'].add( self.daily_panchaangas[ smaarta_ekaadashii_fday].date) self.festival_id_to_days[ 'vaiSNava-vaikuNTha-EkAdazI'].add( self.daily_panchaangas[ vaishnava_ekaadashii_fday].date) else: self.festival_id_to_days[ 'smArta-' + names.get_ekaadashii_name( ekaadashii_paksha, self.daily_panchaangas[d]. lunar_month_sunrise.index) + ' (gRhastha)'].add( self.daily_panchaangas[smaarta_ekaadashii_fday]. date) self.festival_id_to_days[ 'smArta-' + names.get_ekaadashii_name( ekaadashii_paksha, self.daily_panchaangas[d]. lunar_month_sunrise.index) + ' (sannyastha)'].add( self.daily_panchaangas[yati_ekaadashii_fday].date) self.festival_id_to_days[ 'vaiSNava-' + names.get_ekaadashii_name( ekaadashii_paksha, self.daily_panchaangas[d]. lunar_month_sunrise.index)].add( self.daily_panchaangas[ vaishnava_ekaadashii_fday].date) if self.daily_panchaangas[ d].solar_sidereal_date_sunset.month == 9: if ekaadashii_paksha == 'shukla': self.festival_id_to_days[ 'smArta-vaikuNTha-EkAdazI (gRhastha)'].add( self.daily_panchaangas[ smaarta_ekaadashii_fday].date) self.festival_id_to_days[ 'smArta-vaikuNTha-EkAdazI (sannyastha)'].add( self.daily_panchaangas[ yati_ekaadashii_fday].date) self.festival_id_to_days[ 'vaiSNava-vaikuNTha-EkAdazI'].add( self.daily_panchaangas[ vaishnava_ekaadashii_fday].date) if yati_ekaadashii_fday == smaarta_ekaadashii_fday == vaishnava_ekaadashii_fday is None: # Must have already assigned pass else: if self.daily_panchaangas[ d].solar_sidereal_date_sunset.month == 8 and ekaadashii_paksha == 'shukla': # self.add_festival('guruvAyupura-EkAdazI', smaarta_ekaadashii_fday) self.festival_id_to_days['guruvAyupura-EkAdazI'].add( self.daily_panchaangas[vaishnava_ekaadashii_fday]. date) self.festival_id_to_days['kaizika-EkAdazI'].add( self.daily_panchaangas[vaishnava_ekaadashii_fday]. date) # Harivasara Computation if ekaadashii_paksha == 'shukla': def f(x): tp_float = NakshatraDivision( x, ayanaamsha_id=self.ayanaamsha_id ).get_anga_float(zodiac.AngaType.TITHI_PADA) return tp_float - 45 harivasara_end = brentq( f, self.daily_panchaangas[smaarta_ekaadashii_fday]. jd_sunrise - 2, self.daily_panchaangas[smaarta_ekaadashii_fday]. jd_sunrise + 2) else: def f(x): tp_float = NakshatraDivision( x, ayanaamsha_id=self.ayanaamsha_id ).get_anga_float(zodiac.AngaType.TITHI_PADA) return tp_float - 105 harivasara_end = brentq( f, self.daily_panchaangas[smaarta_ekaadashii_fday]. jd_sunrise - 2, self.daily_panchaangas[smaarta_ekaadashii_fday]. jd_sunrise + 2) _date = time.jd_to_utc_gregorian(harivasara_end + (tz_off / 24.0)) _date.set_time_to_day_start() fday_hv = time.utc_gregorian_to_jd( _date) - time.utc_gregorian_to_jd( self.daily_panchaangas[0].date) fest = FestivalInstance(name='harivAsaraH', interval=Interval( jd_start=None, jd_end=harivasara_end)) self.daily_panchaangas[int( fday_hv)].festival_id_to_instance[fest.name] = fest
def assign_chaturthi_vratam(self): for d in range(self.panchaanga.duration_prior_padding, self.panchaanga.duration + 1): [y, m, dt, t] = time.jd_to_utc_gregorian(self.panchaanga.jd_start + d - 1).to_date_fractional_hour_tuple() # SANKATAHARA chaturthi if self.daily_panchaangas[ d].sunrise_day_angas.tithi_at_sunrise.index == 18 or self.daily_panchaangas[ d].sunrise_day_angas.tithi_at_sunrise.index == 19: ldiff_moonrise_yest = ( Graha.singleton(Graha.MOON).get_longitude( self.daily_panchaangas[d - 1].jd_moonrise) - Graha.singleton(Graha.SUN).get_longitude( self.daily_panchaangas[d - 1].jd_moonrise)) % 360 ldiff_moonrise = (Graha.singleton(Graha.MOON).get_longitude( self.daily_panchaangas[d].jd_moonrise) - Graha.singleton( Graha.SUN).get_longitude( self.daily_panchaangas[d].jd_moonrise)) % 360 ldiff_moonrise_tmrw = ( Graha.singleton(Graha.MOON).get_longitude( self.daily_panchaangas[d + 1].jd_moonrise) - Graha.singleton(Graha.SUN).get_longitude( self.daily_panchaangas[d + 1].jd_moonrise)) % 360 tithi_moonrise_yest = int(1 + floor(ldiff_moonrise_yest / 12.0)) tithi_moonrise = int(1 + floor(ldiff_moonrise / 12.0)) tithi_moonrise_tmrw = int(1 + floor(ldiff_moonrise_tmrw / 12.0)) _m = self.daily_panchaangas[d].lunar_month_sunrise.index if floor(_m) != _m: _m = 13 # Adhika masa chaturthi_name = names.NAMES['SANKATAHARA_CHATURTHI_NAMES'][ 'hk'][_m] + '-mahAgaNapati ' if tithi_moonrise == 19: # otherwise yesterday would have already been assigned if tithi_moonrise_yest != 19: chaturthi_name = '%s%s' % ( 'aGgArakI~' if self.daily_panchaangas[d].date. get_weekday() == 2 else '', chaturthi_name) fest = FestivalInstance(name=chaturthi_name + 'saGkaTahara-caturthI-vratam') self.daily_panchaangas[d].festival_id_to_instance[ fest.name] = fest # shravana krishna chaturthi if self.daily_panchaangas[ d].lunar_month_sunrise.index == 5: chaturthi_name = '%s%s' % ( 'aGgArakI~' if self.daily_panchaangas[d].date. get_weekday() == 2 else '', chaturthi_name) fest = FestivalInstance( name=chaturthi_name + 'mahAsaGkaTahara-caturthI-vratam') self.daily_panchaangas[d].festival_id_to_instance[ fest.name] = fest elif tithi_moonrise_tmrw == 19: chaturthi_name = '%s%s' % ( 'aGgArakI~' if self.daily_panchaangas[d + 1].date. get_weekday() == 2 else '', chaturthi_name) fest = FestivalInstance(name=chaturthi_name + 'saGkaTahara-caturthI-vratam') self.daily_panchaangas[d + 1].festival_id_to_instance[ fest.name] = fest # self.date_str_to_panchaanga[d].lunar_month_sunrise and[d + 1] are same, so checking [d] is enough if self.daily_panchaangas[ d].lunar_month_sunrise.index == 5: chaturthi_name = '%s%s' % ( 'aGgArakI~' if self.daily_panchaangas[d].date. get_weekday() == 2 else '', chaturthi_name) fest = FestivalInstance( name=chaturthi_name + 'mahAsaGkaTahara-caturthI-vratam') self.daily_panchaangas[d + 1].festival_id_to_instance[ fest.name] = fest else: if tithi_moonrise_yest != 19: if tithi_moonrise == 18 and tithi_moonrise_tmrw == 20: # No vyApti on either day -- pick parA, i.e. next day. chaturthi_name = '%s%s' % ( 'aGgArakI~' if self.daily_panchaangas[ d + 1].date.get_weekday() == 2 else '', chaturthi_name) fest = FestivalInstance( name=chaturthi_name + 'saGkaTahara-caturthI-vratam') self.daily_panchaangas[d + 1].festival_id_to_instance[ fest.name] = fest # shravana krishna chaturthi if self.daily_panchaangas[ d].lunar_month_sunrise.index == 5: chaturthi_name = '%s%s' % ( 'aGgArakI~' if self.daily_panchaangas[ d + 1].date.get_weekday() == 2 else '', chaturthi_name) fest = FestivalInstance( name=chaturthi_name + 'mahAsaGkaTahara-caturthI-vratam') self.daily_panchaangas[ d + 1].festival_id_to_instance[ fest.name] = fest
def assign_mahaadvaadashii(self): for d in range(self.panchaanga.duration_prior_padding, self.panchaanga.duration + 1): [y, m, dt, t] = time.jd_to_utc_gregorian(self.panchaanga.jd_start + d - 1).to_date_fractional_hour_tuple() # 8 MAHA DWADASHIS if (self.daily_panchaangas[d].sunrise_day_angas.tithi_at_sunrise. index % 15) == 11 and (self.daily_panchaangas[ d + 1].sunrise_day_angas.tithi_at_sunrise.index % 15) == 11: self.festival_id_to_days['unmIlanI~mahAdvAdazI'].add( self.daily_panchaangas[d].date + 1) if (self.daily_panchaangas[d].sunrise_day_angas.tithi_at_sunrise. index % 15) == 12 and (self.daily_panchaangas[ d + 1].sunrise_day_angas.tithi_at_sunrise.index % 15) == 12: self.festival_id_to_days['vyaJjulI~mahAdvAdazI'].add( self.daily_panchaangas[d].date) if (self.daily_panchaangas[d].sunrise_day_angas.tithi_at_sunrise. index % 15) == 11 and (self.daily_panchaangas[ d + 1].sunrise_day_angas.tithi_at_sunrise.index % 15) == 13: self.festival_id_to_days['trisparzA~mahAdvAdazI'].add( self.daily_panchaangas[d].date) if (self.daily_panchaangas[d].sunrise_day_angas.tithi_at_sunrise. index % 15) == 0 and (self.daily_panchaangas[ d + 1].sunrise_day_angas.tithi_at_sunrise.index % 15) == 0: # Might miss out on those parva days right after Dec 31! if (d - 3) > 0: self.festival_id_to_days['pakSavardhinI~mahAdvAdazI'].add( self.daily_panchaangas[d].date - 3) if self.daily_panchaangas[ d].sunrise_day_angas.nakshatra_at_sunrise.index == 4 and ( self.daily_panchaangas[d].sunrise_day_angas. tithi_at_sunrise.index % 15) == 12: self.festival_id_to_days['pApanAzinI~mahAdvAdazI'].add( self.daily_panchaangas[d].date) if self.daily_panchaangas[ d].sunrise_day_angas.nakshatra_at_sunrise.index == 7 and ( self.daily_panchaangas[d].sunrise_day_angas. tithi_at_sunrise.index % 15) == 12: self.festival_id_to_days['jayantI~mahAdvAdazI'].add( self.daily_panchaangas[d].date) if self.daily_panchaangas[ d].sunrise_day_angas.nakshatra_at_sunrise.index == 8 and ( self.daily_panchaangas[d].sunrise_day_angas. tithi_at_sunrise.index % 15) == 12: self.festival_id_to_days['jayA~mahAdvAdazI'].add( self.daily_panchaangas[d].date) if self.daily_panchaangas[ d].sunrise_day_angas.nakshatra_at_sunrise.index == 8 and ( self.daily_panchaangas[d].sunrise_day_angas. tithi_at_sunrise.index % 15) == 12 and self.daily_panchaangas[ d].lunar_month_sunrise.index == 12: # Better checking needed (for other than sunrise). # Last occurred on 27-02-1961 - pushya nakshatra and phalguna krishna dvadashi (or shukla!?) self.festival_id_to_days['gOvinda~mahAdvAdazI'].add( self.daily_panchaangas[d].date) if (self.daily_panchaangas[d].sunrise_day_angas.tithi_at_sunrise. index % 15) == 12: if self.daily_panchaangas[ d].sunrise_day_angas.nakshatra_at_sunrise.index in [ 21, 22, 23 ]: # We have a dvaadashii near shravana, check for Shravana sparsha for td in [ x.sunrise_day_angas.tithis_with_ends for x in self.daily_panchaangas[d:d + 2] ]: (t12, t12_end) = (td[0].anga, td[0].jd_end) if t12_end is None: continue if (t12 % 15) == 11: if NakshatraDivision( t12_end, ayanaamsha_id=self.ayanaamsha_id).get_anga( zodiac.AngaType.NAKSHATRA).index == 22: if (self.daily_panchaangas[d].sunrise_day_angas .tithi_at_sunrise.index % 15) == 12 and (self.daily_panchaangas[ d + 1].sunrise_day_angas. tithi_at_sunrise.index % 15) == 12: self.festival_id_to_days[ 'vijayA/zravaNa-mahAdvAdazI'].add( self.daily_panchaangas[d].date) elif (self.daily_panchaangas[d]. sunrise_day_angas.tithi_at_sunrise.index % 15) == 12: self.festival_id_to_days[ 'vijayA/zravaNa-mahAdvAdazI'].add( self.daily_panchaangas[d].date) elif (self.daily_panchaangas[d + 1]. sunrise_day_angas.tithi_at_sunrise.index % 15) == 12: self.festival_id_to_days[ 'vijayA/zravaNa-mahAdvAdazI'].add( self.daily_panchaangas[d].date + 1) if (t12 % 15) == 12: if NakshatraDivision( t12_end, ayanaamsha_id=self.ayanaamsha_id).get_anga( zodiac.AngaType.NAKSHATRA).index == 22: if (self.daily_panchaangas[d].sunrise_day_angas .tithi_at_sunrise.index % 15) == 12 and (self.daily_panchaangas[ d + 1].sunrise_day_angas. tithi_at_sunrise.index % 15) == 12: self.festival_id_to_days[ 'vijayA/zravaNa-mahAdvAdazI'].add( self.daily_panchaangas[d].date) elif (self.daily_panchaangas[d]. sunrise_day_angas.tithi_at_sunrise.index % 15) == 12: self.festival_id_to_days[ 'vijayA/zravaNa-mahAdvAdazI'].add( self.daily_panchaangas[d].date) elif (self.daily_panchaangas[d + 1]. sunrise_day_angas.tithi_at_sunrise.index % 15) == 12: self.festival_id_to_days[ 'vijayA/zravaNa-mahAdvAdazI'].add( self.daily_panchaangas[d].date + 1) if self.daily_panchaangas[ d].sunrise_day_angas.nakshatra_at_sunrise.index == 22 and ( self.daily_panchaangas[d].sunrise_day_angas. tithi_at_sunrise.index % 15) == 12: self.festival_id_to_days['vijayA/zravaNa-mahAdvAdazI'].add( self.daily_panchaangas[d].date)
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 assign_amavasya_yoga(self): if 'amAvAsyA' not in self.panchaanga.festival_id_to_days: logging.error('Must compute amAvAsyA before coming here!') else: ama_days = self.panchaanga.festival_id_to_days['amAvAsyA'] for ama_day in ama_days: d = int(ama_day - self.daily_panchaangas[0].date) # Get Name if self.daily_panchaangas[d].lunar_month_sunrise.index == 6: pref = '(%s) mahAlaya ' % (names.get_chandra_masa( self.daily_panchaangas[d].lunar_month_sunrise.index, names.NAMES, 'hk', visarga=False)) elif self.daily_panchaangas[ d].solar_sidereal_date_sunset.month == 4: pref = '%s (kaTaka) ' % (names.get_chandra_masa( self.daily_panchaangas[d].lunar_month_sunrise.index, names.NAMES, 'hk', visarga=False)) elif self.daily_panchaangas[ d].solar_sidereal_date_sunset.month == 10: pref = 'mauni (%s/makara) ' % (names.get_chandra_masa( self.daily_panchaangas[d].lunar_month_sunrise.index, names.NAMES, 'hk', visarga=False)) else: pref = names.get_chandra_masa( self.daily_panchaangas[d].lunar_month_sunrise.index, names.NAMES, 'hk', visarga=False) + '-' apraahna_interval = self.daily_panchaangas[ d].day_length_based_periods.aparaahna_muhuurta ama_nakshatra_today = [ y for y in apraahna_interval.get_boundary_angas( anga_type=AngaType.NAKSHATRA, ayanaamsha_id=self.ayanaamsha_id).to_tuple() ] suff = '' # Assign if 23 in ama_nakshatra_today and self.daily_panchaangas[ d].lunar_month_sunrise.index == 10: suff = ' (alabhyam–zraviSThA)' elif 24 in ama_nakshatra_today and self.daily_panchaangas[ d].lunar_month_sunrise.index == 10: suff = ' (alabhyam–zatabhiSak)' elif ama_nakshatra_today[0] in [ 15, 16, 17, 6, 7, 8, 23, 24, 25 ]: suff = ' (alabhyam–%s)' % names.NAMES['NAKSHATRA_NAMES'][ 'hk'][ama_nakshatra_today[0]] elif ama_nakshatra_today[1] in [ 15, 16, 17, 6, 7, 8, 23, 24, 25 ]: suff = ' (alabhyam–%s)' % names.NAMES['NAKSHATRA_NAMES'][ 'hk'][ama_nakshatra_today[1]] if self.daily_panchaangas[d].date.get_weekday() in [1, 2, 4]: if suff == '': suff = ' (alabhyam–puSkalA)' else: suff = suff.replace(')', ', puSkalA)') self.festival_id_to_days[pref + 'amAvAsyA' + suff].add( self.daily_panchaangas[d].date) self.panchaanga.delete_festival(fest_id='amAvAsyA') for d in range(self.panchaanga.duration_prior_padding, self.panchaanga.duration + 1): [y, m, dt, t] = time.jd_to_utc_gregorian(self.panchaanga.jd_start + d - 1).to_date_fractional_hour_tuple() # SOMAMAVASYA if self.daily_panchaangas[ d].sunrise_day_angas.tithi_at_sunrise.index == 30 and self.daily_panchaangas[ d].date.get_weekday() == 1: self.festival_id_to_days['sOmavatI amAvAsyA'].add( self.daily_panchaangas[d].date) # AMA-VYATIPATA YOGAH # श्रवणाश्विधनिष्ठार्द्रानागदैवतमापतेत् । # रविवारयुतामायां व्यतीपातः स उच्यते ॥ # व्यतीपाताख्ययोगोऽयं शतार्कग्रहसन्निभः ॥ # “In Mahabharata, if on a Sunday, Amavasya and one of the stars – # Sravanam, Asvini, Avittam, Tiruvadirai or Ayilyam, occurs, then it is called ‘Vyatipatam’. # This Vyatipata yoga is equal to a hundred Surya grahanas in merit.” tithi_sunset = NakshatraDivision( self.daily_panchaangas[d].jd_sunset, ayanaamsha_id=self.ayanaamsha_id).get_anga( zodiac.AngaType.TITHI).index if self.daily_panchaangas[d].date.get_weekday() == 0 and ( self.daily_panchaangas[d].sunrise_day_angas. tithi_at_sunrise.index == 30 or tithi_sunset == 30): # AMAVASYA on a Sunday if (self.daily_panchaangas[d].sunrise_day_angas.nakshatra_at_sunrise.index in [1, 6, 9, 22, 23] and self.daily_panchaangas[d].sunrise_day_angas.tithi_at_sunrise.index == 30) or \ (tithi_sunset == 30 and NakshatraDivision(self.daily_panchaangas[d].jd_sunset, ayanaamsha_id=self.ayanaamsha_id).get_anga( zodiac.AngaType.NAKSHATRA).index in [ 1, 6, 9, 22, 23]): festival_name = 'vyatIpAta-yOgaH (alabhyam)' self.festival_id_to_days[festival_name].add( self.daily_panchaangas[d].date) logging.debug('* %d-%02d-%02d> %s!' % (y, m, dt, festival_name))