From 8c3a86097cbe31969216671c0c4614d87983ebef Mon Sep 17 00:00:00 2001 From: Senrokai Date: Tue, 29 Sep 2026 21:37:35 +0200 Subject: [PATCH] Place a star at whichever of its two distances is the more precise, not at Gaia's regardless MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit placementDistancePc took Gaia's distance wherever the cross-match gave a usable one, and its docstring and c64eea0 called that "the better measurement", adding that Gaia saturates on the brightest stars "so those sit at their Hipparcos distance". For 273 of the 88 781 HYG stars with both, Gaia's relative error is the larger, 257 of them naked-eye and 38 by more than twice: Eta Leo was drawn at Gaia's 556.6 pc ±17 % against Hipparcos's 389 pc ±6.2 %, Schedar and Tarazed at Gaia's though both have Gaia G of about 2. placementDistancePc now takes both relative errors and picks the smaller, Gaia's as before when either is missing; fetchStars gives the placed star the error and the Gaia-distance flag of the distance it took. The merge's combine keeps the Gaia entry's direction, and now takes the other entry's distance with its error where that is the more precise, so a bright star Gaia's main query also holds lands at its Hipparcos distance too. Gaia still wins for the rest, whose parallaxes are some fifty times more precise. From cache: 424 stars move, 386 of them naked-eye; HYG rows at Gaia's distance 58 379 -> 58 109 and HYG stars flagged so 8 129 -> 8 095. Eta Leo 556.6 -> 389.1 pc, Tarazed 178.9 -> 121.1, Imai 139.5 -> 105.8, Schedar 71.0 -> 70.0, Alphecca 23.7 -> 23.0, each now "±" its Hipparcos error. Where the two disagree by more than 5 σ (21 stars, Iot Gem 11 σ), one of the formal errors is wrong, and this takes the smaller one at its word. The validators pass unchanged. Controls, each failing its named test: the placement ignoring the errors, the merge keeping Gaia's distance whatever the errors, and taking the distance but not its error (1 of 805 each). Co-Authored-By: Claude Opus 5.5 (1M context) --- src/app/shared/astro/star-merge.spec.ts | 16 +++++++++ src/app/shared/astro/star-merge.ts | 42 ++++++++++++++++-------- src/assets/data/stars-meta.bin | Bin 7289024 -> 7289024 bytes src/assets/data/stars.bin | Bin 5466768 -> 5466768 bytes tools/etl/fetchStars.ts | 16 +++++---- tools/etl/sources/gaia.ts | 5 +-- 6 files changed, 57 insertions(+), 22 deletions(-) diff --git a/src/app/shared/astro/star-merge.spec.ts b/src/app/shared/astro/star-merge.spec.ts index 569a862..619a002 100644 --- a/src/app/shared/astro/star-merge.spec.ts +++ b/src/app/shared/astro/star-merge.spec.ts @@ -192,6 +192,16 @@ describe('mergeStarCatalogues', () => { expect(merged).toMatchObject({ magnitude: 11.01, magnitudeBand: 'V', colorIndex: 1.807, colorSystem: 'B-V', distanceError: 0.000065, distanceFromGaia: true }); }); + it("takes a Hipparcos distance more precise than the Gaia entry it folds into, along Gaia's direction", () => { + // Schedar: 71.0 pc ±3.5 % in Gaia, which saturates on it, and 70.0 pc ±1.0 % in Hipparcos. + const hyg = at(3179, 10.1268, 56.5373, 70.0, { name: 'Schedar', magnitude: 2.24, distanceError: 0.0105, distanceFromGaia: false }); + const gaia = at(1000000100, 10.1268 + arcsecOfRa(0.2, 56.5373), 56.5373, 71.0, { name: 'Gaia DR3 425040000962559616', magnitude: 1.94, distanceError: 0.035, distanceFromGaia: true, source: 'gaia' }); + const [merged] = mergeStarCatalogues([{ ...HIPPARCOS, stars: [hyg] }, { ...GAIA, stars: [gaia] }]).stars; + expect(Math.hypot(merged.x, merged.y, merged.z)).toBeCloseTo(70.0, 9); + expect(directionCosine(merged, gaia)).toBeCloseTo(1, 12); + expect(merged).toMatchObject({ name: 'Schedar', distanceError: 0.0105, distanceFromGaia: false, source: 'gaia' }); + }); + it('keeps two entries of one source apart, however close they are', () => { // Gaia resolves doubles Hipparcos saw as one star: two source ids 0.8″ apart are two stars, // and only *another* catalogue can claim to have already listed either of them. @@ -320,6 +330,12 @@ describe('placementDistancePc', () => { expect(placementDistancePc(undefined, 180, 8, 250)).toBe(180); }); + it("takes the distance with the smaller error, Hipparcos's where Gaia saturated", () => { + // Eta Leo: 556.6 pc ±17 % in Gaia, 389.1 pc ±6.2 % in Hipparcos. Sirius the other way round. + expect(placementDistancePc(389.1, 556.6, 3.5, 250, 0.062, 0.17)).toBe(389.1); + expect(placementDistancePc(2.64, 2.67, -1.44, 250, 0.004, 0.002)).toBe(2.67); + }); + it('falls back to Hipparcos where Gaia has no usable distance', () => { expect(placementDistancePc(90, undefined, 8, 250)).toBe(90); }); diff --git a/src/app/shared/astro/star-merge.ts b/src/app/shared/astro/star-merge.ts index dafaf95..0e6b73e 100644 --- a/src/app/shared/astro/star-merge.ts +++ b/src/app/shared/astro/star-merge.ts @@ -92,8 +92,11 @@ export const NAKED_EYE_MAGNITUDE = 6.5; /** * Where to draw a star Hipparcos and Gaia both measured, and whether the map keeps it at all. * - * Gaia's distance wherever it has a usable one, since its parallaxes are fifty times more - * precise; Hipparcos's otherwise. The two catalogues used to be cut at the same radius, each on + * At whichever distance has the smaller relative error, given both; Gaia's without them, or + * Hipparcos's where Gaia has none. Gaia's parallaxes are some fifty times more precise, and its + * distance wins for all but 273 of the 88 781 HYG stars with both; those are bright stars Gaia + * saturates on, 257 of them naked-eye — Eta Leo is 556.6 pc ±17 % in Gaia and 389 pc ±6.2 % in + * Hipparcos, Schedar ±3.5 % against ±1.0 %. The two catalogues used to be cut at the same radius, each on * its own distance, so a star Hipparcos put at 200 pc and Gaia at 300 was kept by one, never * downloaded from the other, and drawn at 200. That was 83% of the HYG stars left without a * Gaia counterpart, and at the median Hipparcos had them at two-thirds of Gaia's distance. @@ -101,12 +104,20 @@ export const NAKED_EYE_MAGNITUDE = 6.5; * Now a star either survey places inside `cutoffPc` is kept, and every kept star sits where the * better measurement puts it, inside the cutoff or not. So is every star the naked eye sees, at * any distance: the cutoff took 1 543 of HYG's 8 920 stars of V 6.5 or brighter, Rigel, Deneb - * and Alnilam among them, while 11th-magnitude Gaia stars at the same distance were drawn. Gaia - * saturates on the brightest of them, so those sit at their Hipparcos distance. `null` for a star - * kept by neither rule, or that no survey gives a distance for. + * and Alnilam among them, while 11th-magnitude Gaia stars at the same distance were drawn. Those + * Gaia has no usable parallax for sit at their Hipparcos distance. `null` for a star kept by + * neither rule, or that no survey gives a distance for. */ -export function placementDistancePc(hipparcosPc: number | undefined, gaiaPc: number | undefined, magnitude: number, cutoffPc: number): number | null { - const best = gaiaPc ?? hipparcosPc; +export function placementDistancePc( + hipparcosPc: number | undefined, + gaiaPc: number | undefined, + magnitude: number, + cutoffPc: number, + hipparcosError?: number, + gaiaError?: number +): number | null { + const hipparcosBetter = hipparcosPc !== undefined && hipparcosError !== undefined && gaiaError !== undefined && hipparcosError < gaiaError; + const best = hipparcosBetter ? hipparcosPc : (gaiaPc ?? hipparcosPc); if (best === undefined) { return null; } @@ -227,18 +238,23 @@ export function isSameStar(kept: StarRecord, entry: StarRecord): boolean { * and keeping Gaia's whole once cost the map 102 proper names and 32 000 spectral types. The id * travels with the description, so a star HYG knows keeps its HYG id from one refresh to the next, * and so does its photometry, V and B−V. `source` stays with the position, since that is what it - * records, and so does the distance's error: Gaia's, not the Hipparcos one of a distance dropped. + * records, and so does the distance's error: Gaia's, not the Hipparcos one of a distance dropped — + * unless the other entry's distance is the more precise, as the Hipparcos one of a bright star + * `placementDistancePc` keeps at it is, which then sets the distance along Gaia's direction. */ function combine(kept: StarRecord, other: StarRecord): StarRecord { const described = isDesignation(kept) && !isDesignation(other) ? other : kept; + const otherBetter = other.distanceError !== undefined && kept.distanceError !== undefined && other.distanceError < kept.distanceError; + const placed = otherBetter ? other : kept; + const scale = otherBetter ? distanceOf(other) / distanceOf(kept) : 1; return { ...described, - x: kept.x, - y: kept.y, - z: kept.z, + x: kept.x * scale, + y: kept.y * scale, + z: kept.z * scale, source: kept.source, - distanceError: kept.distanceError, - distanceFromGaia: kept.distanceFromGaia + distanceError: placed.distanceError, + distanceFromGaia: placed.distanceFromGaia }; } diff --git a/src/assets/data/stars-meta.bin b/src/assets/data/stars-meta.bin index 6d4fb64bc967cc62e8cc5a7c18934bb6f0594c74..705ae8a23d43a6828e5c719b93b79359654a7f41 100644 GIT binary patch delta 13091 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 diff --git a/src/assets/data/stars.bin b/src/assets/data/stars.bin index 7dad89dc25266450be5e4c8c94725c3cd5efb59e..253ab6c8735c7da03bafb515197c41baed9be809 100644 GIT binary patch delta 7852 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 JenDgK{{axOIvfB1 delta 7852 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: string { /** * Downloads the HYG (Hipparcos/Yale/Gliese) stellar database, places each star along its - * equatorial direction (epoch J2000.0) at the better of its Hipparcos and Gaia distances, keeps - * the ones either survey puts within range, unions the other positional sources, and writes - * `stars.bin` (packed positions) + `stars-index.json` (everything else). + * equatorial direction (epoch J2000.0) at whichever of its Hipparcos and Gaia distances has the + * smaller error, keeps the ones either survey puts within range, unions the other positional + * sources, and writes `stars.bin` (packed positions) + `stars-index.json` (everything else). */ export async function fetchStars(): Promise { console.log(`Fetching HYG star catalog (distance cutoff: ${DISTANCE_CUTOFF_PC} pc)...`); @@ -101,10 +101,12 @@ export async function fetchStars(): Promise { const gaiaPc = gaia?.distancePc; const magnitudeV = parseOptionalNumber(row['mag']); const magnitude = magnitudeV ?? UNKNOWN_MAGNITUDE; - const distancePc = placementDistancePc(hipparcosPc, gaiaPc, magnitude, DISTANCE_CUTOFF_PC); + const hipparcosError = row['hip'] ? hipparcosErrors.get(Number(row['hip'])) : undefined; + const distancePc = placementDistancePc(hipparcosPc, gaiaPc, magnitude, DISTANCE_CUTOFF_PC, hipparcosError, gaia?.relativeError); if (distancePc === null) { continue; } + const fromGaia = gaia !== undefined && distancePc === gaiaPc; // HYG's own Cartesian columns rather than its `ra`/`dec`, which are in the same frame as // `raDecDistanceToXyz` and would be redundant if the two agreed. They do not, for the stars @@ -124,7 +126,7 @@ export async function fetchStars(): Promise { continue; } const scale = distancePc / length; - if (gaiaPc !== undefined) { + if (fromGaia) { atGaiaDistance++; } if (distancePc > DISTANCE_CUTOFF_PC) { @@ -133,7 +135,7 @@ export async function fetchStars(): Promise { // Gaia's error with Gaia's distance, Hipparcos's with its own; a Gliese row, with neither, has // no published error, and its distance is as often photometric as measured. - const distanceError = gaia?.relativeError ?? (row['hip'] ? hipparcosErrors.get(Number(row['hip'])) : undefined); + const distanceError = fromGaia ? gaia.relativeError : hipparcosError; const colorIndex = parseOptionalNumber(row['ci']); stars.push({ @@ -148,7 +150,7 @@ export async function fetchStars(): Promise { colorIndex: colorIndex ?? null, ...(colorIndex === undefined ? {} : { colorSystem: 'B-V' as const }), ...(distanceError === undefined ? {} : { distanceError }), - distanceFromGaia: gaia !== undefined, + distanceFromGaia: fromGaia, // Only for the Gliese-only rows, whose positions are what the merge needs the motion to see // past. A Hipparcos position is good to under an arcsecond; given its motion too, 15 stars // took their co-moving companion's Gaia entry, and the companion was kept twice. diff --git a/tools/etl/sources/gaia.ts b/tools/etl/sources/gaia.ts index 89d6007..01c860a 100644 --- a/tools/etl/sources/gaia.ts +++ b/tools/etl/sources/gaia.ts @@ -295,8 +295,9 @@ export async function fetchGaiaDistancesByHip(): Promise