- Dharmagya
- panchang docs
- Annual Charts & Sensitive Points
Annual Charts & Sensitive Points
panchang · v5.4.0 · MIT
Varshaphala with 27 Sahams, Tithi Pravesha, Arudha padas, Hora/Ghati/Bhava/Sripati lagnas, Upagrahas, and Argala.
Varshaphala — the Tajik annual chart
import { computeVarshaphala, ALL_SAHAM_NAMES } from 'panchang-ts';
// Annual chart for the Nth solar return.
const v = computeVarshaphala(birth, 30, loc);
v.solarReturnInstant; // 2025-08-14T21:58:09.170Z
v.varshaLagna.rashi.name; // 'Mithuna'
v.muntha.rashi; v.muntha.house; // 0, 11 — muntha = (natalLagnaRashi + 30) mod 12
v.yearLord; // 'Mercury' — strongest of 4 candidates by Shadbala
v.sahams.Punya.house; // 5
v.sahams.Vivaha.rashi; // 7
ALL_SAHAM_NAMES.length; // 27import (
"github.com/ishankgupta95/panchang/source/go/v5/panchang"
"github.com/ishankgupta95/panchang/source/go/v5/types"
)
// s, birth, loc as on Birth Charts.
// Annual chart for the Nth solar return.
v, err := s.ComputeVarshaphala(birth, 30, loc, types.BirthChartOptions{})
if err != nil {
panic(err)
}
fmt.Println(v.SolarReturnInstant.ISOString()) // 2025-08-14T21:58:09.170Z
fmt.Println(v.VarshaLagna.Rashi.Name) // Mithuna
fmt.Println(v.Muntha.Rashi, v.Muntha.House) // 0 11
fmt.Println(v.YearLord) // Mercury
fmt.Println(v.Sahams.Punya.House, v.Sahams.Vivaha.Rashi) // 5 7
fmt.Println(len(panchang.AllSahamNames()), panchang.AllSahamNames()[0]) // 27 PunyaThere are 27 Sahams: Punya, Vidya, Yasas, Mitra, Karma, Vivaha, Putra, Roga, Marana, Rajya, Raja, Bandhu, Dharma, Gnati, Apamrityu, Bhratri, Matri, Pitri, Sama, Bandhana, Karyasiddhi, Vyapara, Sastra, Asha, Labha, Susha, Tapas. The list is exported as ALL_SAHAM_NAMES in TypeScript and AllSahamNames() in Go. In TypeScript the SahamName and SahamFormula types are there for building your own tables. Go has types.SahamName but no formula type.
The year lord is the strongest of the four candidates by Shadbala, so the 5.4 correction to Nathonatha Bala (see Strength & Yogas) can change it. For the birth above, 3 of the first 40 years change lord: year 7 from the Moon to Venus, year 11 from the Moon to Mercury, and year 37 from Jupiter to the Moon. Year 30 is still Mercury. Recompute any year lord you stored.
Tithi Pravesha
import { computeTithiPravesha } from 'panchang-ts';
// Annual chart cast when the Sun-Moon separation returns to its natal value,
// at the match near the solar return that has the Sun in its natal sidereal sign.
const tp = computeTithiPravesha(birth, 30, loc);
tp.natalTithi === tp.praveshTithi; // true
tp.praveshInstant; // 2025-08-13T17:33:40.062Z
tp.natalTithi; // 19// s, birth, loc as on Birth Charts.
// Annual chart cast when the Sun-Moon separation returns to its natal value,
// at the match near the solar return that has the Sun in its natal sidereal sign.
tp, err := s.ComputeTithiPravesha(birth, 30, loc, types.BirthChartOptions{})
if err != nil {
panic(err)
}
fmt.Println(tp.NatalTithi == tp.PraveshTithi) // true
fmt.Println(tp.PraveshInstant.ISOString(), tp.NatalTithi)
// 2025-08-13T17:33:40.062Z 19When two matches near the solar return have the Sun in its natal sign, the nearer one is taken. When neither does, which can happen because the Sun crosses Vrischika, Dhanu or Makara in less than the 29.5 days between matches, the nearer one is taken anyway and the Sun is in an adjacent sign. The match is found to about 1e-4° of separation, so praveshTithi equals natalTithi except when the natal separation lies that close to a tithi boundary.
Arudha padas
import { computeArudhas } from 'panchang-ts';
// Image/reflection of each bhava. Arudha[0] = Arudha Lagna (AL).
const a = computeArudhas(d1);
a[0]!.bhava; // 1 — AL
a[0]!.arudhaRashi; // 3 (0..11)
a[6]!.bhava; // 7 — Darapada (spouse pada)
a[6]!.arudhaRashiName; // 'Kumbha'// s, birth, loc, d1 as on Birth Charts.
// Image/reflection of each bhava. a[0] = Arudha Lagna (AL).
a, err := panchang.ComputeArudhas(&d1, panchang.English)
if err != nil {
panic(err)
}
fmt.Println(a[0].Bhava, a[0].ArudhaRashi) // 1 3 - AL, rashi 0..11
fmt.Println(a[6].Bhava, a[6].ArudhaRashiName) // 7 Kumbha - DarapadaSpecial lagnas
import {
computeHoraLagna, computeGhatiLagna, computeBhavaLagna, computeSripatiLagna,
} from 'panchang-ts';
// Time-derived sensitive points from sunrise on/before birth.
computeHoraLagna(birth, loc).rashi.name; // 'Makara' — 30°/hour
computeGhatiLagna(birth, loc).rashi.name; // 'Simha' — 75°/hour
computeBhavaLagna(birth, loc).rashi.name; // 'Tula' — 15°/hour
computeSripatiLagna(birth, loc); // = natal lagna (cusp 1)// s, birth, loc, d1 as on Birth Charts.
// Time-derived sensitive points from sunrise on/before birth.
hora, err := s.ComputeHoraLagna(birth, loc, panchang.Lahiri, panchang.English) // 30 deg/hour
if err != nil {
panic(err)
}
ghati, _ := s.ComputeGhatiLagna(birth, loc, panchang.Lahiri, panchang.English) // 75 deg/hour
bhava, _ := s.ComputeBhavaLagna(birth, loc, panchang.Lahiri, panchang.English) // 15 deg/hour
sripati, _ := s.ComputeSripatiLagna(birth, loc, panchang.Lahiri, panchang.English) // = natal lagna
fmt.Println(hora.Rashi.Name, ghati.Rashi.Name, bhava.Rashi.Name) // Makara Simha Tula
fmt.Println(sripati.SiderealLongitude == d1.Lagna.SiderealLongitude) // trueAsk for the Sripati cusps and you also get bhavas 2 to 12: four angular cusps with the intermediate ones trisected between them. They come back at every latitude, where Placidus cusps can fail beyond the polar circles. There, though, the four angles come out of order for part of the day, and the trisected cusps then overlap. In Go they come from a method of their own, ComputeSripatiLagnaWithCusps, new in 5.4.
// Sripati cusps 2–12 are opt-in.
const sripati = computeSripatiLagna(birth, loc, 'lahiri', 'en', { includeCusps: true });
sripati.cusps; // number[12] of bhava madhyas; cusps[0/3/6/9] = ASC/IC/DSC/MC
// [184.99, 215.61, 246.24, 276.86, …]// s, birth, loc as on Birth Charts.
// Cusps[i] is the bhava madhya of house i+1; Cusps[0/3/6/9] = ASC/IC/DSC/MC.
sripati, err := s.ComputeSripatiLagnaWithCusps(birth, loc, panchang.Lahiri, panchang.English)
if err != nil {
panic(err)
}
fmt.Printf("%.2f\n", sripati.Cusps[:4]) // [184.99 215.61 246.24 276.86]Upagrahas
import { computeUpagrahas } from 'panchang-ts';
// Gulika and Mandi (rising ascendant at the start / midpoint of Saturn's
// segment), plus the Sun-derived Dhuma, Vyatipata, Parivesha, Indrachapa
// and Upaketu.
const u = computeUpagrahas(birth, loc);
u.gulika.longitude; // 203.39
u.gulika.rashi; // 6
u.gulika.house; // 1// s, birth, loc as on Birth Charts.
// Gulika, Mandi, plus Sun-derived Dhuma, Vyatipata, Parivesha,
// Indrachapa, Upaketu.
u, err := s.ComputeUpagrahas(birth, loc, types.BirthChartOptions{})
if err != nil {
panic(err)
}
fmt.Println(u.Gulika.Longitude, u.Gulika.Rashi, u.Gulika.House)
// 203.3920599951469 6 1
fmt.Println(u.Mandi.Rashi, u.Dhuma.Rashi, u.Upaketu.Rashi) // 7 8 2Argala
import { computeArgala } from 'panchang-ts';
// Planets in 2/4/11 from a bhava form Argala (intervention);
// 3/10/12 form Virodhargala (counter). Each planet hits exactly 6 of 12 bhavas.
const arg = computeArgala(d1);
arg[0]!.argala.map(p => p.planet); // ['Mercury', 'Jupiter']
arg[0]!.virodhargala.map(p => p.planet); // ['Sun', 'Mars', 'Venus']// s, birth, loc, d1 as on Birth Charts.
// Planets in 2/4/11 from a bhava form Argala (intervention);
// 3/10/12 form Virodhargala (counter). Each planet hits exactly 6 of 12 bhavas.
arg := panchang.ComputeArgala(&d1)
for _, p := range arg[0].Argala {
fmt.Println("argala", p.Planet)
}
// argala Mercury
// argala Jupiter
for _, p := range arg[0].Virodhargala {
fmt.Println("virodhargala", p.Planet)
}
// virodhargala Sun
// virodhargala Mars
// virodhargala VenusTrikonargala adds the 5/9 trine and is opt-in. Ketu reverses it: the 5th-from placement becomes the virodhaka and the 9th-from becomes the source.
const argT = computeArgala(d1, { includeTrikonargala: true });
argT[0]!.trikona!.sources.map(p => p.planet); // ['Saturn']
argT[0]!.trikona!.virodhakas; // []// s, birth, loc, d1 as on Birth Charts.
// Go reaches it through a second function; ComputeArgala leaves Trikona nil.
argT := panchang.ComputeArgalaWithTrikonargala(&d1)
for _, p := range argT[0].Trikona.Sources {
fmt.Println("source", p.Planet)
}
// source Saturn
fmt.Println(len(argT[0].Trikona.Virodhakas)) // 0