Sidereal Zodiac and Ayanamsa Offsets¶
The calculation of celestial positions can be based on one of two primary zodiac systems: the tropical zodiac or the sidereal zodiac. While the raw ecliptic longitude remains the same, the choice of zodiac determines the starting point (0 Aries) for measuring the 12 signs.
The two zodiacs¶
Tropical zodiac (default)¶
The tropical zodiac is an equinoctial, geocentric system where 0 Aries is fixed to the point of the Vernal Equinox (the position of the Sun at the start of Spring in the Northern Hemisphere).
It is directly tied to the Earth’s orbital relationship with the Sun and the seasons.
The 0 Aries point is a dynamic coordinate and moves relative to the fixed stars due to axial precession (the slow wobble of the Earth’s axis).
Sidereal zodiac¶
The sidereal zodiac is a fixed-star system used widely in Indian astrology and by a minority of Western astrologers.
It aligns 0 Aries with a fixed point in the celestial sphere that references the background zodiacal constellations.
Because the tropical starting point (the Vernal Equinox) precedes the sidereal starting point over time, the two systems are constantly shifting relative to each other.
Ayanamsa (sidereal offset)¶
The angular difference between the tropical 0 Aries and the sidereal 0 Aries is called the ayanamsa. The ayanamsa value must be subtracted from the tropical longitude to obtain the sidereal longitude.
Since the starting point for the sidereal zodiac is based on different astronomical conventions (e.g., fixed stars like Spica or specific theories), there is no single universally agreed-upon ayanamsa.
The Swiss Ephemeris provides functions to handle this offset automatically.
swe.set_sid_mode(): Sets the preferred sidereal mode for the session. This is an optional low-level function if you need a non-standard offsets.swe.get_ayanamsa(): Calculates the precise offset value (in decimal degrees) for a specific date (Julian Day) and sidereal mode.
Calculating sidereal positions¶
Obtaining a sidereal position is a two-step process:
Set the global mode: Tell the library which offset value to use.
Calculate with flag: Call the position function (
swe.calc_ut(),swe.houses(), etc.) and include theswe.FLG_SIDEREALflag to trigger the ayanamsa subtraction.
import swisseph as swe
SIGNS = ("Ari", "Tau", "Gem", "Can", "Leo", "Vir", "Lib", "Sco", "Sag", "Cap", "Aqu", "Pis")
# This is 1997 Sept 30 14:00 UTC
jd = 2450722.0833377214
# For comparison, we'll calculate the tropical longitude and DMS first
coords, flags = swe.calc_ut(jd, swe.SUN)
longitude = coords[0]
tropical_dms = swe.split_deg(longitude, swe.SPLIT_DEG_ZODIACAL)
tropical_string = f"{tropical_dms[0]} {SIGNS[tropical_dms[4]]} {tropical_dms[1]} {tropical_dms[2]}"
print(f"Tropical sun: {tropical_string}")
# Output:
# Tropical sun: 7 Lib 26 31
# Set the sidereal offset
swe.set_sid_mode(swe.SIDM_FAGAN_BRADLEY)
# Repeat the above for sidereal
coords, flags = swe.calc_ut(jd, swe.SUN, swe.FLG_SIDEREAL) # <- this pulls what we set in swe.set_sid_mode
longitude = coords[0]
sidereal_dms = swe.split_deg(longitude, swe.SPLIT_DEG_ZODIACAL)
sidereal_string = f"{sidereal_dms[0]} {SIGNS[sidereal_dms[4]]} {sidereal_dms[1]} {sidereal_dms[2]}"
print(f"Sidereal sun: {sidereal_string}")
# Output:
# Sidereal sun: 12 Vir 44 3
swe.SIDM ayanamsa constants¶
The Swiss Ephemeris supports dozens of sidereal offsets which are defined by constants beginning with swe.SID_ or swe.SIDM_. These are passed to swe.set_sid_mode.
Ayanamsa constants[1]
# |
Ayanamsa Name |
Constant |
|---|---|---|
0 |
Fagan-Bradley |
swe.SIDM_FAGAN_BRADLEY |
1 |
Lahiri |
swe.SIDM_LAHIRI |
2 |
Deluce |
swe.SIDM_DELUCE |
3 |
Raman |
swe.SIDM_RAMAN |
4 |
Ushashashi |
swe.SIDM_USHASHASHI |
5 |
Krishnamurti |
swe.SIDM_KRISHNAMURTI |
6 |
Djwhal Khul |
swe.SIDM_DJWHAL_KHUL |
7 |
Yukteshwar |
swe.SIDM_YUKTESHWAR |
8 |
J.N. Bhasin |
swe.SIDM_JN_BHASIN |
9 |
Babylonian/Kugler 1 |
swe.SIDM_BABYL_KUGLER1 |
10 |
Babylonian/Kugler 2 |
swe.SIDM_BABYL_KUGLER2 |
11 |
Babylolnian/Kugler 3 |
swe.SIDM_BABYL_KUGLER3 |
12 |
Babylonian/Huber |
swe.SIDM_BABYL_HUBER |
13 |
Babylonian/Eta Piscium |
swe.SIDM_BABYL_ETPSC |
14 |
Babylonian/Aldebaran = 15 Tau |
swe.SIDM_ALDEBARAN_15TAU |
15 |
Hipparchos |
swe.SIDM_HIPPARCHOS |
16 |
Sassanian |
swe.SIDM_SASSANIAN |
17 |
Galact. Center = 0 Sag |
swe.SIDM_GALCENT_0SAG |
18 |
J2000 |
swe.SIDM_J2000 |
19 |
J1900 |
swe.SIDM_J1900 |
20 |
B1950 |
swe.SIDM_B1950 |
21 |
Suryasiddhanta |
swe.SIDM_SURYASIDDHANTA |
22 |
Suryasiddhanta, mean Sun |
swe.SIDM_SURYASIDDHANTA_MSUN |
23 |
Aryabhata |
swe.SIDM_ARYABHATA |
24 |
Aryabhata, mean Sun |
swe.SIDM_ARYABHATA_MSUN |
25 |
SS Revati |
swe.SIDM_SS_REVATI |
26 |
SS Citra |
swe.SIDM_SS_CITRA |
27 |
True Citra |
swe.SIDM_TRUE_CITRA |
28 |
True Revati |
swe.SIDM_TRUE_REVATI |
29 |
True Pusya (PVRN Rao) |
swe.SIDM_TRUE_PUSHYA |
30 |
Galactic Center (Gil Brand) |
swe.SIDM_GALCENT_RGILBRAND |
31 |
Galactic Equator (IAU1958) |
swe.SIDM_GALEQU_IAU1958 |
32 |
Galactic Equator |
swe.SIDM_GALEQU_TRUE |
33 |
Galactic Equator mid-Mula |
swe.SIDM_GALEQU_MULA |
34 |
Skydram (Mardysk) |
swe.SIDM_GALALIGN_MARDYKS |
35 |
True Mula (Chanda Hari) |
swe.SIDM_TRUE_MULA |
36 |
Dhruva/Gal. Center/Mula (Wilhelm) |
swe.SIDM_GALCENT_MULA_WILHELM |
37 |
Aryabhata 522 |
swe.SIDM_ARYABHATA_522 |
38 |
Babylonian/Britton |
swe.SIDM_BABYL_BRITTON |
39 |
‘Vedic’/Sheoran |
swe.SIDM_TRUE_SHEORAN |
40 |
Cochrane (Gal. Center = 0 Cap) |
swe.SIDM_GALCENT_COCHRANE |
41 |
Galactic Equator (Forenza) |
swe.SIDM_GALEQU_FIORENZA |
42 |
Vettius Valens |
swe.SIDM_VALENS_MOON |
43 |
Lahiri 1940 |
swe.SIDM_LAHIRI_1940 |
44 |
Lahiri VP285 |
swe.SIDM_LAHIRI_VP285 |
45 |
Krishnamurti-Senthilathiban |
swe.SIDM_KRISHNAMURTI_VP291 |
46 |
Lahiri ICRC |
swe.SIDM_LAHIRI_ICRC |