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