diff --git a/src/assets/data/bodies.json b/src/assets/data/bodies.json index adc1bed..7ff2a89 100644 --- a/src/assets/data/bodies.json +++ b/src/assets/data/bodies.json @@ -540,7 +540,7 @@ "argumentOfPeriapsisDegPerDay": 0 }, "orbitSource": "JPL SBDB osculating elements, epoch 2026 Jun 9", - "rotationPeriodHours": 25.9 + "rotationPeriodHours": 378.504 }, { "id": "haumea", diff --git a/tools/etl/build.ts b/tools/etl/build.ts index 7af145b..e6908d6 100644 --- a/tools/etl/build.ts +++ b/tools/etl/build.ts @@ -335,6 +335,13 @@ function validateBodies(bodies: BodyRecord[], horizonsOrbits: Map body.kind === 'dwarf').length; assertCondition(dwarfCount === 5, `Expected the IAU's 5 dwarf planets, found ${dwarfCount}.`); + // Eris keeps one face to Dysnomia, whose orbit takes 15.78590 days (Holler et al. 2021); its light + // curve gives 15.771 +/- 0.008 (Bernstein et al. 2023). The SBDB still gives 25.9 hours. + const erisDays = (bodies.find((body) => body.id === 'eris')?.rotationPeriodHours ?? NaN) / 24; + assertCondition( + Math.abs(erisDays / 15.7859 - 1) < 0.002, + `Eris turns once in ${erisDays.toFixed(3)} days; it is locked to Dysnomia's 15.786-day orbit — the SBDB's 25.9-hour period, which it flags as possibly 30 per cent wrong, was taken.` + ); console.log(` mean elements against Horizons, degrees: ${offsets.join(', ')}.`); console.log(` IAU rotation against Horizons (day as a fraction of it, tilt in degrees): ${spins.join(', ')}.`); } diff --git a/tools/etl/fetchSolarSystem.ts b/tools/etl/fetchSolarSystem.ts index e09f3a3..8b0d1ef 100644 --- a/tools/etl/fetchSolarSystem.ts +++ b/tools/etl/fetchSolarSystem.ts @@ -31,6 +31,8 @@ interface BodySpec { sbdb?: string; /** A measured mean radius, in km, for a body neither Horizons nor the SBDB gives one for. */ radiusKm?: number; + /** A measured sidereal day, in hours, where a later measurement overturns the one its source gives. */ + rotationPeriodHours?: number; /** A moon that does not keep one face to its planet: its page's own spin, or none, is kept. */ spinsFreely?: boolean; /** A moon heavy enough to move its planet round their barycentre visibly; see `BodyRecord.massRatio`. */ @@ -87,7 +89,12 @@ const BODY_SPECS: BodySpec[] = [ // 2017 (Nature 550, 219); drawn as a sphere, at the radius of the sphere of the same volume. // Makemake: 1434 km across its equator and 1422 across its projected pole, Brown 2013 (ApJ 767, // L7); the same mean. - { id: 'eris', name: 'Eris', kind: 'dwarf', horizonsCommand: '136199;', center: '500@10', sbdb: 'Eris', radiusKm: 1163 }, + // + // Eris's day is not the SBDB's 25.9 hours, a light curve of partial coverage (Roe et al. 2008) the + // SBDB itself flags as "may be wrong by 30 percent or so": it turns once in 15.771 +/- 0.008 days + // (Bernstein et al. 2023, PSJ 4, 115), locked to Dysnomia's 15.786-day orbit (Szakáts et al. + // 2023, A&A 669, L3). On the SBDB's figure it turned 14.6 times too fast. + { id: 'eris', name: 'Eris', kind: 'dwarf', horizonsCommand: '136199;', center: '500@10', sbdb: 'Eris', radiusKm: 1163, rotationPeriodHours: 15.771 * 24 }, { id: 'haumea', name: 'Haumea', kind: 'dwarf', horizonsCommand: '136108;', center: '500@10', sbdb: 'Haumea', radiusKm: 797.6 }, { id: 'makemake', name: 'Makemake', kind: 'dwarf', horizonsCommand: '136472;', center: '500@10', sbdb: 'Makemake', radiusKm: 715 }, { id: 'moon', name: 'Moon', kind: 'moon', horizonsCommand: '301', center: '500@399', parentBodyId: 'earth' }, @@ -206,9 +213,7 @@ export async function fetchSolarSystem(): Promise<{ bodies: BodyRecord[]; horizo // without W by. const rotationPeriodHours = result.tidallyLocked || (spec.kind === 'moon' && !spec.spinsFreely) ? (360 / mean.rates.meanMotionDegPerDay) * HOURS_PER_DAY - : smallBody - ? smallBody.rotationPeriodHours - : result.rotationPeriodHours; + : (spec.rotationPeriodHours ?? (smallBody ? smallBody.rotationPeriodHours : result.rotationPeriodHours)); const parentGm = spec.barycentric && spec.parentBodyId ? gmById.get(spec.parentBodyId) : undefined; if (spec.barycentric && (result.gmKm3PerS2 === undefined || parentGm === undefined)) { throw new Error(`${spec.name} and its planet need a GM each to place their barycentre.`);