Exemplo n.º 1
0
 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
Exemplo n.º 2
0
 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
Exemplo n.º 3
0
 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
Exemplo n.º 4
0
    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))
Exemplo n.º 5
0
    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
Exemplo n.º 6
0
 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))
Exemplo n.º 7
0
  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)
Exemplo n.º 8
0
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
Exemplo n.º 9
0
  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)
Exemplo n.º 10
0
  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)
Exemplo n.º 11
0
    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
Exemplo n.º 12
0
    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)
Exemplo n.º 13
0
 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
Exemplo n.º 14
0
    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)
Exemplo n.º 15
0
    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
Exemplo n.º 16
0
    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)
Exemplo n.º 17
0
    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)
Exemplo n.º 18
0
    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)
Exemplo n.º 19
0
    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
Exemplo n.º 20
0
    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
Exemplo n.º 21
0
    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!')
Exemplo n.º 22
0
    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