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) # compute offset from UTC jd = next_eclipse_sol[1][0] jd_eclipse_solar_start = next_eclipse_sol[1][1] jd_eclipse_solar_end = next_eclipse_sol[1][4] # -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): fday -= 1 if (jd_eclipse_solar_start ) == 0.0 or jd_eclipse_solar_end == 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_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): if 'sUrya-grahaNam' not in self.rules_collection.name_to_rule: return jd = self.panchaanga.jd_start while 1: next_eclipse_sol = self.panchaanga.city.get_solar_eclipse_time(jd_start=jd) # compute offset from UTC jd = next_eclipse_sol[1][0] jd_eclipse_solar_start = next_eclipse_sol[1][1] jd_eclipse_solar_end = next_eclipse_sol[1][4] # -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): fday -= 1 if (jd_eclipse_solar_start) == 0.0 or jd_eclipse_solar_end == 0.0: # Move towards the next eclipse... at least the next new # moon (>=25 days away) jd += MIN_DAYS_NEXT_ECLIPSE continue if abs (Graha.singleton(Graha.SUN).get_longitude(jd_eclipse_solar_end) - Graha.singleton(Graha.RAHU).get_longitude( jd_eclipse_solar_end)) < 5: grasta = 'rAhugrasta' else: grasta = 'kEtugrasta' solar_eclipse_str = 'sUrya-grahaNaM~(' + grasta + ')' if self.daily_panchaangas[fday].date.get_weekday() == 0: solar_eclipse_str = '★cUDAmaNi-' + solar_eclipse_str fest = FestivalInstance(name=solar_eclipse_str, interval=Interval(jd_start=jd_eclipse_solar_start, jd_end=jd_eclipse_solar_end)) self.panchaanga.add_festival_instance(festival_instance=fest, date=self.daily_panchaangas[fday].date) jd = jd + MIN_DAYS_NEXT_ECLIPSE
def apply_month_day_events(self, day_panchaanga, month_type): from jyotisha.panchaanga.temporal.festival import rules rule_set = rules.RulesCollection.get_cached( repos_tuple=tuple(self.computation_system.festival_options.repos), julian_handling=self.computation_system.festival_options. julian_handling) date = day_panchaanga.get_date(month_type=month_type) days = [date.day] if month_type == RulesRepo.GREGORIAN_MONTH_DIR: if (day_panchaanga.date + 1).month != day_panchaanga.date.month: if day_panchaanga.date.day == 28: days = [28, 29, 30, 31] elif day_panchaanga.date.day == 29: days = [29, 30, 31] elif day_panchaanga.date.day == 30: days = [30, 31] fest_dict = rule_set.get_possibly_relevant_fests( month=date.month, angas=days, month_type=month_type, anga_type_id=rules.RulesRepo.DAY_DIR) for fest_id, fest in fest_dict.items(): if month_type in [ RulesRepo.GREGORIAN_MONTH_DIR, RulesRepo.JULIAN_MONTH_DIR ]: interval = day_panchaanga.get_interval( interval_id="julian_day") else: # TODO : Set intervals for preceding_arunodaya differently? interval = day_panchaanga.get_interval(interval_id="full_day") self.panchaanga.add_festival_instance( date=day_panchaanga.date, festival_instance=FestivalInstance(name=fest_id, interval=interval))
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) jd = next_eclipse_lun[1][0] jd_eclipse_lunar_start = next_eclipse_lun[1][2] jd_eclipse_lunar_end = next_eclipse_lun[1][3] # -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 == 0.0 or jd_eclipse_lunar_end == 0.0: # 0.0 is returned in case of eclipses when the moon is below the horizon. # 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: 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) jd_moonset_eclipse_day = self.panchaanga.city.get_setting_time( julian_day_start=jd_moonrise_eclipse_day, body=Graha.MOON) 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 add_festival(self, fest_id, date, interval_id="full_day"): if date.get_date_str() not in self.date_str_to_panchaanga: return interval = self.date_str_to_panchaanga[ date.get_date_str()].get_interval(interval_id=interval_id) self.add_festival_instance(date=date, festival_instance=FestivalInstance( name=fest_id, interval=interval))
def apply_month_anga_events(self, day_panchaanga, anga_type, month_type): from jyotisha.panchaanga.temporal.festival import rules, priority_decision, FestivalInstance rule_set = rules.RulesCollection.get_cached(repos_tuple=tuple(self.computation_system.options.fest_repos)) date = day_panchaanga.date panchaangas = [self.panchaanga.date_str_to_panchaanga.get((date-2).get_date_str(), None), self.panchaanga.date_str_to_panchaanga.get((date-1).get_date_str(), None), day_panchaanga] if panchaangas[1] is None: # We require atleast 1 day history. return anga_type_id = anga_type.name.lower() angas_2 = [x.anga for x in panchaangas[2].sunrise_day_angas.get_angas_with_ends(anga_type=anga_type)] if anga_type == AngaType.TITHI and angas_2[0].index in (29, 30): # We seek festivals based on angas belonging to this month only. angas_2 = [anga for anga in angas_2 if anga.index <= 30] angas_1 = [x.anga for x in panchaangas[1].sunrise_day_angas.get_angas_with_ends(anga_type=anga_type)] if anga_type == AngaType.TITHI and angas_2[0].index in (1, 2): angas_1 = [anga for anga in angas_1 if anga.index >= 1] angas = set(angas_2 + angas_1) # The filtering above avoids the below case (TODO: Check): # When applied to month_type = lunar_sideral and anga_type = tithi, this method fails in certain corner cases. Consider the case: target_anga = tithi 1. It appears in the junction with the preceeding month or with the succeeding month. In that case, clearly, the former is salient - tithi 1 in the latter case belongs to the succeeding month. month = day_panchaanga.get_date(month_type=month_type).month fest_dict = rule_set.get_possibly_relevant_fests(month=month, angas=angas, month_type=month_type, anga_type_id=anga_type_id) for fest_id, fest_rule in fest_dict.items(): kaala = fest_rule.timing.get_kaala() priority = fest_rule.timing.get_priority() anga_type_str = fest_rule.timing.anga_type target_anga = Anga.get_cached(index=fest_rule.timing.anga_number, anga_type_id=anga_type_str.upper()) fday_1_vs_2 = priority_decision.decide(p0=panchaangas[1], p1=panchaangas[2], target_anga=target_anga, kaala=kaala, ayanaamsha_id=self.ayanaamsha_id, priority=priority) if fday_1_vs_2 is not None: fday = fday_1_vs_2 + 1 p_fday = panchaangas[fday] p_fday_minus_1 = panchaangas[fday - 1] if p_fday.get_date(month_type=month_type).month != month: # Example: Suppose festival on tithi 27 of solar siderial month 10; last day of month 9 could have tithi 27, but not day 1 of month 10. continue if priority not in ('puurvaviddha', 'vyaapti'): p_fday.festival_id_to_instance[fest_id] = FestivalInstance(name=fest_id) self.festival_id_to_days[fest_id].add(p_fday.date) elif p_fday_minus_1 is None or p_fday_minus_1.date not in self.festival_id_to_days[fest_id]: # puurvaviddha or vyaapti fest. More careful condition. # p_fday_minus_1 could be None when computing at the beginning of a sequence of days. In that case, we're ok with faulty assignments - since the focus is on getting subsequent days right. p_fday.festival_id_to_instance[fest_id] = FestivalInstance(name=fest_id) self.festival_id_to_days[fest_id].add(p_fday.date)
def get_full_festival_instance(festival_instance, daily_panchaangas, day_index): # Find start and add entire event as well fest_id = festival_instance.name check_d = day_index stext_start = fest_id[:fest_id.find( 'samApanam' )] + 'ArambhaH' # This discards any bracketed info after the word ArambhaH start_d = None while check_d > 1: check_d -= 1 if stext_start in daily_panchaangas[ check_d].festival_id_to_instance.keys(): start_d = check_d break if start_d is None: # Look for approx match check_d = day_index while check_d > 1: check_d -= 1 for fest_key in daily_panchaangas[ check_d].festival_id_to_instance.keys(): if fest_key.startswith(stext_start): logging.debug('Found approx match for %s: %s' % (stext_start, fest_key)) start_d = check_d break if start_d is None: logging.error('Unable to find start date for %s' % stext_start) return None else: # logging.debug(stext) # TODO: Reimplement the below in another way if needed. new_fest_id = fest_id REPLACEMENTS = { 'samApanam': '', 'rAtra-': 'rAtraH', 'nakSatra-': 'nakSatram', 'pakSa-': 'pakSaH', 'puSkara-': 'puSkaram', 'dIpa-': 'dIpaH', 'pArAyaNa-': 'pArAyaNam', 'mAsa-': 'mAsaH', 'snAna-': 'snAnam', 'tsava-': 'tsavaH', 'vrata-': 'vratam' } for _orig, _repl in REPLACEMENTS.items(): new_fest_id = new_fest_id.replace(_orig, _repl) full_festival_instance = FestivalInstance( name=new_fest_id, interval=Interval( jd_start=daily_panchaangas[start_d].julian_day_start, jd_end=festival_instance.interval.jd_start + 1)) return full_festival_instance
def apply_month_day_events(self, day_panchaanga, month_type): from jyotisha.panchaanga.temporal.festival import rules, FestivalInstance rule_set = rules.RulesCollection.get_cached(repos_tuple=tuple(self.computation_system.options.fest_repos)) date = day_panchaanga.get_date(month_type=month_type) fest_dict = rule_set.get_month_anga_fests(month=date.month, anga=date.day, month_type=month_type, anga_type_id=rules.RulesRepo.DAY_DIR) for fest_id, fest in fest_dict.items(): day_panchaanga.festival_id_to_instance[fest_id] = FestivalInstance(name=fest.id) self.festival_id_to_days[fest_id].add(day_panchaanga.date)
def compute_conjunctions(self, Graha1, Graha2, delta=0.0): # Compute the time of conjunction between Graha1 and Graha2 GRAHA_NAMES = {Graha.SUN: 'sUryaH', Graha.MOON: 'candraH', Graha.JUPITER: 'guruH', Graha.VENUS: 'zukraH', Graha.MERCURY: 'budhaH', Graha.MARS: 'aGgArakaH', Graha.SATURN: 'zanaizcaraH', Graha.RAHU: 'rAhuH'} if delta == 0.0: try: t = brentq(lambda jd: Graha.singleton(Graha1).get_longitude(jd) - Graha.singleton(Graha2).get_longitude(jd), self.panchaanga.jd_start, self.panchaanga.jd_end) except ValueError: t = None logging.error('Not able to bracket!') if t is not None and self.panchaanga.jd_start < t < self.panchaanga.jd_end: fday = [self.daily_panchaangas[i].jd_sunrise < t < self.daily_panchaangas[i + 1].jd_sunrise for i in range(self.panchaanga.duration)].index(True) fest = FestivalInstance(name='graha-yuddhaH (%s–%s)' % (GRAHA_NAMES[Graha1], GRAHA_NAMES[Graha2]), interval=Interval(jd_start=None, jd_end=t)) self.panchaanga.add_festival_instance(festival_instance=fest, date=self.daily_panchaangas[fday].date) else: # mauDhya / combustion with some degrees assigned try: t_start = brentq(lambda jd: Graha.singleton(Graha1).get_longitude(jd) - Graha.singleton(Graha2).get_longitude(jd) - delta, self.panchaanga.jd_start, self.panchaanga.jd_end) except ValueError: t_start = None logging.error('Not able to bracket!') try: t_end = brentq(lambda jd: Graha.singleton(Graha1).get_longitude(jd) - Graha.singleton(Graha2).get_longitude(jd) + delta, self.panchaanga.jd_start, self.panchaanga.jd_end) except ValueError: t_end = None logging.error('Not able to bracket!') if t_start is not None and self.panchaanga.jd_start < t_start < self.panchaanga.jd_end: fday = [self.daily_panchaangas[i].jd_sunrise < t_start < self.daily_panchaangas[i + 1].jd_sunrise for i in range(self.panchaanga.duration)].index(True) fest = FestivalInstance(name='%s–mauDhya' % GRAHA_NAMES[Graha1], interval=Interval(jd_start=t_start, jd_end=None)) self.panchaanga.add_festival_instance(festival_instance=fest, date=self.daily_panchaangas[fday].date) if t_end is not None and self.panchaanga.jd_start < t_end < self.panchaanga.jd_end: fday = [self.daily_panchaangas[i].jd_sunrise < t_end < self.daily_panchaangas[i + 1].jd_sunrise for i in range(self.panchaanga.duration)].index(True) fest = FestivalInstance(name='%s–mauDhya' % GRAHA_NAMES[Graha1], interval=Interval(jd_start=None, jd_end=t_end)) self.panchaanga.add_festival_instance(festival_instance=fest, date=self.daily_panchaangas[fday].date)
def assign_chandra_darshanam(self): if 'candra-darzanam' not in self.rules_collection.name_to_rule: return d = self.panchaanga.duration_prior_padding while d < self.panchaanga.duration + self.panchaanga.duration_prior_padding: day_panchaanga = self.daily_panchaangas[d] # Chandra Darshanam if day_panchaanga.sunrise_day_angas.tithi_at_sunrise.index == 1 or day_panchaanga.sunrise_day_angas.tithi_at_sunrise.index == 2: tithi_sunset = temporal.tithi.get_tithi( day_panchaanga.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: if tithi_sunset <= 2: if tithi_sunset == 1: fest = FestivalInstance( name='candra-darzanam', interval=self.daily_panchaangas[ d + 1].get_interval(interval_id="pradosha")) self.panchaanga.add_festival_instance( festival_instance=fest, date=self.daily_panchaangas[d + 1].date) d += 25 else: fest = FestivalInstance( name='candra-darzanam', interval=day_panchaanga.get_interval( interval_id="pradosha")) self.panchaanga.add_festival_instance( festival_instance=fest, date=day_panchaanga.date) d += 25 elif tithi_sunset_tmrw == 2: fest = FestivalInstance( name='candra-darzanam', interval=self.daily_panchaangas[d + 1].get_interval( interval_id="pradosha")) self.panchaanga.add_festival_instance( festival_instance=fest, date=self.daily_panchaangas[d + 1].date) d += 25 d += 1
def assign_gajachhaya_yoga(self): intersect_lists = [ ((zodiac.AngaType.SOLAR_NAKSH, 13), (zodiac.AngaType.NAKSHATRA, 10), (zodiac.AngaType.TITHI, 28)), ((zodiac.AngaType.SOLAR_NAKSH, 13), (zodiac.AngaType.NAKSHATRA, 13), (zodiac.AngaType.TITHI, 30)) ] for intersect_list in intersect_lists: jd_start = self.panchaanga.jd_start jd_end = self.panchaanga.jd_end anga_list = [] gc_yoga = True for anga_type, target_anga_id in intersect_list: finder = zodiac.AngaSpanFinder.get_cached( ayanaamsha_id=self.computation_system.ayanaamsha_id, anga_type=anga_type) anga = finder.find(jd1=jd_start, jd2=jd_end, target_anga_id=target_anga_id) anga_list.append(anga) if anga is None: logging.debug( 'No Gajacchhaya Yoga involving %s %d + %s %d this year!' % (intersect_list[1][0], intersect_list[1][1], intersect_list[2][0], intersect_list[2][1])) gc_yoga = False break if anga.jd_start is not None: jd_start = anga.jd_start - 5 if anga.jd_end is not None: jd_end = anga.jd_end + 5 if gc_yoga: jd_start, jd_end = max([x.jd_start for x in anga_list ]), min([x.jd_end for x in anga_list]) if jd_start > jd_end: logging.debug( 'No Gajacchhaya Yoga involving %s %d + %s %d this year!' % (intersect_list[1][0], intersect_list[1][1], intersect_list[2][0], intersect_list[2][1])) else: fday = int( floor(jd_start) - floor(self.daily_panchaangas[0].julian_day_start)) if (jd_start < self.daily_panchaangas[fday].jd_sunrise): fday -= 1 self.panchaanga.add_festival_instance( festival_instance=FestivalInstance( name='gajacchAyA-yOgaH', interval=Interval(jd_start=jd_start, jd_end=jd_end)), date=self.daily_panchaangas[fday].date)
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_tropical_sankranti(self): if 'mESa-viSu-puNyakAlaH' not in self.rules_collection.name_to_rule: return RTU_MASA_NAMES = { 1: "madhu-mAsaH", 2: "mAdhava-mAsaH/vasantaRtuH", 3: "zukra-mAsaH/uttarAyaNam", 4: "zuci-mAsaH/grISmaRtuH", 5: "nabhO-mAsaH", 6: "nabhasya-mAsaH/varSaRtuH", 7: "iSa-mAsaH", 8: "Urja-mAsaH/zaradRtuH", 9: "sahO-mAsaH/dakSiNAyanam", 10: "sahasya-mAsaH/hEmantaRtuH", 11: "tapO-mAsaH", 12: "tapasya-mAsaH/ziziraRtuH", } for d in range( self.panchaanga.duration_prior_padding, self.panchaanga.duration + self.panchaanga.duration_prior_padding): if self.daily_panchaangas[ d].tropical_date_sunset.month_transition is not None: jd_transition = self.daily_panchaangas[ d].tropical_date_sunset.month_transition # Add tropical sankranti masa_name = RTU_MASA_NAMES[ (self.daily_panchaangas[d + 1].tropical_date_sunset.month - 2) % 12 + 1] if jd_transition < self.daily_panchaangas[d].jd_sunrise: fday = d - 1 else: fday = d self.panchaanga.add_festival_instance( festival_instance=FestivalInstance( name=masa_name, interval=Interval(jd_start=None, jd_end=jd_transition)), date=self.daily_panchaangas[fday].date)
def _sync_festivals_dict_and_daily_festivals(self, here_to_daily=False, daily_to_here=True): if here_to_daily: for festival_id, days in self.festival_id_to_days.items(): for fest_day in days: if not isinstance(fest_day, Date): logging.fatal(festival_id + " " + str(days)) fest_day_str = fest_day.get_date_str() if fest_day_str in self.date_str_to_panchaanga and festival_id not in self.date_str_to_panchaanga[ fest_day_str].festival_id_to_instance: self.date_str_to_panchaanga[ fest_day_str].festival_id_to_instance[ festival_id] = FestivalInstance( name=festival_id) if daily_to_here: for dp in self.date_str_to_panchaanga.values(): for fest in dp.festival_id_to_instance.values(): days = self.festival_id_to_days.get(fest.name, set()) if dp.date not in days: days.add(dp.date) self.festival_id_to_days[fest.name] = days
def assign_chaturthi_vratam(self): if "vikaTa-mahAgaNapati_saGkaTahara-caturthI-vratam" not in self.rules_collection.name_to_rule: return for d in range( self.panchaanga.duration_prior_padding, self.panchaanga.duration + self.panchaanga.duration_prior_padding): # 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: day_panchaanga = self.daily_panchaangas[d] 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( day_panchaanga.jd_moonrise) - Graha.singleton(Graha.SUN).get_longitude( day_panchaanga.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 = day_panchaanga.lunar_month_sunrise.index if floor(_m) != _m: _m = 13 # Adhika masa chaturthi_name = names.NAMES['SANKATAHARA_CHATURTHI_NAMES'][ 'sa']['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 day_panchaanga.date.get_weekday() == 2 else '', chaturthi_name) fest = FestivalInstance( name=chaturthi_name + 'saGkaTahara-caturthI-vratam', interval=day_panchaanga.get_interval( interval_id="full_day")) self.panchaanga.add_festival_instance( festival_instance=fest, date=day_panchaanga.date) # shravana krishna chaturthi if day_panchaanga.lunar_month_sunrise.index == 5: chaturthi_name = '%s%s' % ( 'aGgArakI~' if day_panchaanga.date.get_weekday() == 2 else '', chaturthi_name) fest = FestivalInstance( name=chaturthi_name + 'mahAsaGkaTahara-caturthI-vratam', interval=day_panchaanga.get_interval( interval_id="full_day")) self.panchaanga.add_festival_instance( festival_instance=fest, date=day_panchaanga.date) 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', interval=day_panchaanga.get_interval( interval_id="full_day")) self.panchaanga.add_festival_instance( festival_instance=fest, date=self.daily_panchaangas[d + 1].date) # self.date_str_to_panchaanga[d].lunar_month_sunrise and[d + 1] are same, so checking [d] is enough if day_panchaanga.lunar_month_sunrise.index == 5: chaturthi_name = '%s%s' % ( 'aGgArakI~' if day_panchaanga.date.get_weekday() == 2 else '', chaturthi_name) fest = FestivalInstance( name=chaturthi_name + 'mahAsaGkaTahara-caturthI-vratam', interval=day_panchaanga.get_interval( interval_id="full_day")) self.panchaanga.add_festival_instance( festival_instance=fest, date=self.daily_panchaangas[d + 1].date) 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', interval=day_panchaanga.get_interval( interval_id="full_day")) self.panchaanga.add_festival_instance( festival_instance=fest, date=self.daily_panchaangas[d + 1].date) # shravana krishna chaturthi if day_panchaanga.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', interval=day_panchaanga.get_interval( interval_id="full_day")) self.panchaanga.add_festival_instance( festival_instance=fest, date=self.daily_panchaangas[d + 1].date)
def assign_ekaadashii_vratam(self): if "ajA-EkAdazI" not in self.rules_collection.name_to_rule: return for d in range( self.panchaanga.duration_prior_padding, self.panchaanga.duration + self.panchaanga.duration_prior_padding): day_panchaanga = self.daily_panchaangas[d] # EKADASHI Vratam # One of two consecutive tithis must appear @ sunrise! if (day_panchaanga.sunrise_day_angas.tithi_at_sunrise.index % 15) == 10 or ( day_panchaanga.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 day_panchaanga.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 - day_panchaanga.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( day_panchaanga.jd_sunrise - (1 / 15.0) * (day_panchaanga.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.panchaanga.add_festival( fest_id='sarva-' + names.get_ekaadashii_name( ekaadashii_paksha, day_panchaanga.lunar_month_sunrise.index), date=self. daily_panchaangas[smaarta_ekaadashii_fday].date) if ekaadashii_paksha == 'shukla': if day_panchaanga.solar_sidereal_date_sunset.month == 9: self.panchaanga.add_festival( fest_id='sarva-vaikuNTha-EkAdazI', date=self.daily_panchaangas[ smaarta_ekaadashii_fday].date) else: self.panchaanga.add_festival( fest_id='smArta-' + names.get_ekaadashii_name( ekaadashii_paksha, day_panchaanga.lunar_month_sunrise.index), date=self. daily_panchaangas[smaarta_ekaadashii_fday].date) self.panchaanga.add_festival( fest_id='vaiSNava-' + names.get_ekaadashii_name( ekaadashii_paksha, day_panchaanga.lunar_month_sunrise.index), date=self. daily_panchaangas[vaishnava_ekaadashii_fday].date) if ekaadashii_paksha == 'shukla': if day_panchaanga.solar_sidereal_date_sunset.month == 9: self.panchaanga.add_festival( fest_id='smArta-vaikuNTha-EkAdazI', date=self.daily_panchaangas[ smaarta_ekaadashii_fday].date) self.panchaanga.add_festival( fest_id='vaiSNava-vaikuNTha-EkAdazI', date=self.daily_panchaangas[ vaishnava_ekaadashii_fday].date) else: self.panchaanga.add_festival( fest_id='smArta-' + names.get_ekaadashii_name( ekaadashii_paksha, day_panchaanga.lunar_month_sunrise.index) + ' (gRhastha)', date=self.daily_panchaangas[smaarta_ekaadashii_fday]. date) self.panchaanga.add_festival( fest_id='smArta-' + names.get_ekaadashii_name( ekaadashii_paksha, self.daily_panchaangas[d]. lunar_month_sunrise.index) + ' (sannyastha)', date=self.daily_panchaangas[yati_ekaadashii_fday].date) self.panchaanga.add_festival( fest_id='vaiSNava-' + names.get_ekaadashii_name( ekaadashii_paksha, day_panchaanga.lunar_month_sunrise.index), date=self.daily_panchaangas[vaishnava_ekaadashii_fday]. date) if day_panchaanga.solar_sidereal_date_sunset.month == 9: if ekaadashii_paksha == 'shukla': self.panchaanga.add_festival( fest_id='smArta-vaikuNTha-EkAdazI (gRhastha)', date=self.daily_panchaangas[ smaarta_ekaadashii_fday].date) self.panchaanga.add_festival( fest_id='smArta-vaikuNTha-EkAdazI (sannyastha)', date=self. daily_panchaangas[yati_ekaadashii_fday].date) self.panchaanga.add_festival( fest_id='vaiSNava-vaikuNTha-EkAdazI', date=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 day_panchaanga.solar_sidereal_date_sunset.month == 8 and ekaadashii_paksha == 'shukla': # self.add_festival('guruvAyupura-EkAdazI', smaarta_ekaadashii_fday) self.panchaanga.add_festival( fest_id='guruvAyupura-EkAdazI', date=self. daily_panchaangas[vaishnava_ekaadashii_fday].date) self.panchaanga.add_festival( fest_id='kaizika-EkAdazI', date=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 = self.panchaanga.city.get_timezone_obj( ).julian_day_to_local_time(julian_day=harivasara_end) _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.panchaanga.add_festival_instance( festival_instance=fest, date=self.daily_panchaangas[int(fday_hv)].date)
def assign_sidereal_sankranti_punyakaala(self): if 'mESa-viSu-puNyakAlaH' not in self.rules_collection.name_to_rule: return # Reference # --------- # # अतीतानागते पुण्ये द्वे उदग्दक्षिणायने। त्रिंशत्कर्कटके नाड्यो मकरे विंशतिः स्मृताः॥ # वर्तमाने तुलामेषे नाड्यस्तूभयतो दश। षडशीत्यामतीतायां षष्टिरुक्तास्तु नाडिकाः॥ # पुण्यायां विष्णुपद्यां च प्राक् पश्चादपि षोडशः॥ # —वैद्यनाथ-दीक्षितीये स्मृतिमुक्ताफले आह्निक-काण्डः # # The times before and/or after any given sankranti (tropical/sidereal) are sacred for snanam & danam # with specific times specified. For Mesha and Tula, 10 nAdikas before and after are special, # while for Shadashiti, an entire 60 nAdikas following the sankramaNam are special, and so on. PUNYA_KAALA = { 1: (10, 10), 2: (16, 16), 3: (0, 60), 4: (30, 0), 5: (16, 16), 6: (0, 60), 7: (10, 10), 8: (16, 16), 9: (0, 60), 10: (0, 20), 11: (16, 16), 12: (0, 60) } SANKRANTI_PUNYAKALA_NAMES = { 1: "mESa-saGkramaNa", 2: "vRSabha-ravi-saGkramaNa-viSNupadI", 3: "mithuna-ravi-saGkramaNa-SaDazIti", 4: "karkaTa-saGkramaNa", 5: "siMha-ravi-saGkramaNa-viSNupadI", 6: "kanyA-ravi-saGkramaNa-SaDazIti", 7: "tulA-saGkramaNa", 8: "vRzcika-ravi-saGkramaNa-viSNupadI", 9: "dhanUravi-saGkramaNa-SaDazIti", 10: "makara-saGkramaNa", 11: "kumbha-ravi-saGkramaNa-viSNupadI", 12: "mIna-ravi-saGkramaNa-SaDazIti", } for d in range( self.panchaanga.duration_prior_padding, self.panchaanga.duration + self.panchaanga.duration_prior_padding): if self.daily_panchaangas[ d].solar_sidereal_date_sunset.month_transition is not None: punya_kaala_str = SANKRANTI_PUNYAKALA_NAMES[ self.daily_panchaangas[d + 1].solar_sidereal_date_sunset. month] + '-puNyakAlaH' jd_transition = self.daily_panchaangas[ d].solar_sidereal_date_sunset.month_transition # TODO: convert carefully to relative nadikas! punya_kaala_start_jd = jd_transition - PUNYA_KAALA[ self.daily_panchaangas[ d + 1].solar_sidereal_date_sunset.month][0] * 1 / 60 punya_kaala_end_jd = jd_transition + PUNYA_KAALA[ self.daily_panchaangas[ d + 1].solar_sidereal_date_sunset.month][1] * 1 / 60 if punya_kaala_start_jd < self.daily_panchaangas[ d].julian_day_start: fday = d - 1 else: fday = d self.panchaanga.add_festival_instance( festival_instance=FestivalInstance( name=punya_kaala_str, interval=Interval(jd_start=punya_kaala_start_jd, jd_end=punya_kaala_end_jd)), date=self.daily_panchaangas[fday].date)
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_nakshatra_vara_yoga_vratam(self): if 'Adityahasta-puNyakAlaH' not in self.rules_collection.name_to_rule: return for d in range( self.panchaanga.duration_prior_padding, self.panchaanga.duration + self.panchaanga.duration_prior_padding): # 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'), removed because no pramANam (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) nakshatram_praatah = self.daily_panchaangas[ d].sunrise_day_angas.nakshatra_at_sunrise.index nakshatram_saayam = NakshatraDivision( jd=self.daily_panchaangas[d].jd_sunset, ayanaamsha_id=self.panchaanga.computation_system. ayanaamsha_id).get_anga( anga_type=AngaType.NAKSHATRA).index if nakshatram_praatah == nakshatram_saayam == n_prev: continue if nwd_fest_n == nakshatram_praatah == nakshatram_saayam: self.panchaanga.add_festival_instance( festival_instance=FestivalInstance( name=nwd_fest_name), date=self.daily_panchaangas[d].date) else: (nakshatra_ID, nakshatra_end_jd) = ( self.daily_panchaangas[d].sunrise_day_angas. nakshatras_with_ends[0].anga.index, self.daily_panchaangas[d].sunrise_day_angas. nakshatras_with_ends[0].jd_end) if nwd_fest_n == nakshatram_praatah: # assert nwd_fest_n == nakshatra_ID self.panchaanga.add_festival_instance( festival_instance=FestivalInstance( name=nwd_fest_name, interval=Interval( jd_start=None, jd_end=nakshatra_end_jd)), date=self.daily_panchaangas[d].date) elif nwd_fest_n == nakshatram_saayam: # assert n_prev == nakshatra_ID self.panchaanga.add_festival_instance( festival_instance=FestivalInstance( name=nwd_fest_name, interval=Interval( jd_start=nakshatra_end_jd, jd_end=None)), date=self.daily_panchaangas[d].date) else: logging.error('Should never be here!')
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