Exemplo n.º 1
0
def get_panchaanga_for_shaka_year(city,
                                  year,
                                  precomputed_json_dir="~/Documents/jyotisha",
                                  computation_system: ComputationSystem = None,
                                  allow_precomputed=True):
    fname = os.path.expanduser(
        '%s/%s__shaka_%s__%s.json' %
        (precomputed_json_dir, city.name, year, computation_system))
    if os.path.isfile(fname) and allow_precomputed:
        fn = lambda: get_panchaanga_for_shaka_year(
            city=city,
            year=year,
            precomputed_json_dir=precomputed_json_dir,
            computation_system=computation_system,
            allow_precomputed=False)
        panchaanga = load_panchaanga(fname=fname, fallback_fn=fn)
        # Fest repos to be used might have changed in this call.
        panchaanga.computation_system = computation_system
        panchaanga.update_festival_details()
        return panchaanga
    else:
        logging.info(
            'No precomputed data available. Computing panchaanga...\n')
        SHAKA_CIVIL_ERA_DIFF = 78
        start_year_civil = year + era.get_year_0_offset(era_id=era.ERA_SHAKA)
        anga_span_finder = AngaSpanFinder.get_cached(
            ayanaamsha_id=Ayanamsha.ASHVINI_STARTING_0,
            anga_type=AngaType.SIDEREAL_MONTH)
        start_equinox = anga_span_finder.find(jd1=time.utc_gregorian_to_jd(
            Date(year=start_year_civil, month=3, day=1)),
                                              jd2=time.utc_gregorian_to_jd(
                                                  Date(year=start_year_civil,
                                                       month=5,
                                                       day=1)),
                                              target_anga_id=1)
        end_equinox = anga_span_finder.find(jd1=time.utc_gregorian_to_jd(
            Date(year=start_year_civil + 1, month=3, day=1)),
                                            jd2=time.utc_gregorian_to_jd(
                                                Date(year=start_year_civil + 1,
                                                     month=5,
                                                     day=1)),
                                            target_anga_id=1)
        tz = Timezone(city.timezone)
        panchaanga = periodical.Panchaanga(
            city=city,
            start_date=tz.julian_day_to_local_time(
                julian_day=start_equinox.jd_start),
            end_date=tz.julian_day_to_local_time(
                julian_day=end_equinox.jd_start),
            computation_system=computation_system)
        panchaanga.year = year
        # Festival data may be updated more frequently and a precomputed panchaanga may go out of sync. Hence we keep this method separate.
        logging.info('Writing computed panchaanga to %s...\n' % fname)

        try:
            panchaanga.dump_to_file(filename=fname)
        except EnvironmentError:
            logging.warning("Not able to save.")
            logging.error(traceback.format_exc())
        return panchaanga
Exemplo n.º 2
0
 def get_year_number(self, month_type, era_id):
     # The below is a crude variable name: sidereal lunar month could be only approximately equinox-referrent.
     equinox_referrent_date = self.get_date(month_type=month_type)
     year_0_offset = era.get_year_0_offset(era_id=era_id)
     # For a few millennia around 1987, it is safe to assume that lunar year starts wihtin the first 5 months of the Gregorian year. This means that only the tail end of the lunar year occurs within the first few months of the year. And only in that case, would we need to offset relative to 1988 rather than 1987.
     if equinox_referrent_date.month >= 7 and self.date.month <= 5:
         year_index = (self.date.year - 1 + year_0_offset)
     else:
         year_index = (self.date.year + year_0_offset)
     return year_index
Exemplo n.º 3
0
    def assign_festival_numbers(self):
        # Update festival numbers if they exist
        solar_y_start_d = []
        lunar_y_start_d = []
        if self.daily_panchaangas[0].lunar_month_sunrise.index == 1:
            lunar_y_start_d.append(0)
        for d in range(
                1, self.panchaanga.duration +
                self.panchaanga.duration_prior_padding):
            if self.daily_panchaangas[
                    d].solar_sidereal_date_sunset.month == 1 and self.daily_panchaangas[
                        d - 1].solar_sidereal_date_sunset.month != 1:
                solar_y_start_d.append(d)
            if self.daily_panchaangas[
                    d].lunar_month_sunrise.index == 1 and self.daily_panchaangas[
                        d - 1].lunar_month_sunrise.index != 1:
                lunar_y_start_d.append(d)

        period_start_year = self.panchaanga.start_date.year
        for festival_name in copy.copy(self.panchaanga.festival_id_to_days):
            festival_rule = self.rules_collection.name_to_rule.get(
                festival_name, None)
            if festival_rule is None:
                continue
            if festival_rule.timing.year_start is not None:
                fest_start_year = festival_rule.timing.year_start
                fest_start_year_era = festival_rule.timing.year_start_era
                year_offset = era.get_year_0_offset(fest_start_year_era)
                month_type = festival_rule.timing.month_type
                for assigned_day in copy.copy(
                        self.panchaanga.festival_id_to_days[festival_name]):
                    assigned_day_index = int(assigned_day -
                                             self.daily_panchaangas[0].date)
                    if month_type == RulesRepo.SIDEREAL_SOLAR_MONTH_DIR:
                        fest_num = period_start_year + year_offset - fest_start_year
                        for start_day in solar_y_start_d:
                            if assigned_day_index >= start_day:
                                fest_num += 1
                    elif month_type == RulesRepo.LUNAR_MONTH_DIR:
                        if festival_rule.timing.anga_number == 1 and festival_rule.timing.month_number == 1:
                            # Assigned day may be less by one, since prathama may have started after sunrise
                            # Still assume assigned_day >= lunar_y_start_d!
                            fest_num = period_start_year + year_offset - fest_start_year
                            for start_day in lunar_y_start_d:
                                if assigned_day_index >= start_day:
                                    fest_num += 1
                        else:
                            fest_num = period_start_year + year_offset - fest_start_year
                            for start_day in lunar_y_start_d:
                                if assigned_day_index >= start_day:
                                    fest_num += 1
                    elif month_type == RulesRepo.GREGORIAN_MONTH_DIR:
                        fest_num = period_start_year + year_offset - fest_start_year

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

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