Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions packages/astronomy/data/bodies/ngc-3132-central-star.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"id": "ngc-3132-central-star",
"classification": "star",
"order": 5781,
"physical": {
"name": "NGC 3132 central star",
"horizonsCode": null,
"meanRadiusKm": 27062.7,
"gravitationalParameterKm3PerS2": 0,
"parent": null,
"effectiveTemperatureK": 110000
},
"physicalNotes": "Radius 0.0389 solar radii from De Marco et al. (2022), arXiv:2301.02775, Results: the star their model of the nebula needs has 110 kK and 200 Lsun; the paper prints no radius, and 0.0389 solar radii is the sphere that radiates that luminosity at that temperature (Stefan-Boltzmann law) (https://arxiv.org/abs/2301.02775): 27,063 km at 695,700 km per solar radius. No mass is measured, so GM is 0, the records' unpublished value. Temperature 110000 K from De Marco et al. (2022), arXiv:2301.02775, Results: a model of the nebula's light with a central star of effective temperature 110 kK and luminosity 200 Lsun matches the observations (https://arxiv.org/abs/2301.02775). presentationUp: the display axis is a sky-plane convention; the spin axis's position angle on the sky is not measured.",
"star": {
"rightAscensionDegrees": 151.7568557416905,
"declinationDegrees": -40.43674438999238,
"positionEpochJulianYear": 2016,
"distanceParsecs": 754,
"properMotionRaMasPerYear": -7.677450171548887,
"properMotionDecMasPerYear": 0.19727499759393125,
"radialVelocityKmPerS": 0,
"presentationUp": "display-axis",
"sources": {
"position": "Gaia DR3 source 5420219732233481472 (Gaia Collaboration 2023, A&A 674, A1), ICRS at epoch J2016.0, from the archived row src/objects/ngc-3132-central-star/source/photometry/gaia-dr3-source.csv",
"distance": "Monteiro et al. (2025), MNRAS 539, 1756: 754 pc (+18, -15), the Gaia DR3 geometric distance of the bright star beside it, the distance its nebula's page stands at; this star's own Gaia DR3 parallax, 0.51 +/- 0.19 mas, is too weak to place it (https://arxiv.org/abs/2503.20640): 754 pc; Gaia DR3 parallax 0.5116 +/- 0.1936 mas (same row, RUWE 2.07), 2.6 standard errors, is not used",
"properMotion": "Gaia DR3 (same row): -7.677, 0.197 mas/yr",
"radialVelocity": "No catalogued radial velocity: Gaia DR3 measures none for source 5420219732233481472 and SIMBAD lists none. Zero is assumed; a 30 km/s error moves the star by one part in 200,000 of its distance per century (https://simbad.cds.unistra.fr/simbad/sim-id?Ident=Gaia%20DR3%205420219732233481472)"
}
}
}
30 changes: 30 additions & 0 deletions packages/astronomy/data/bodies/wd-1111-552.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"id": "wd-1111-552",
"classification": "star",
"order": 5779,
"physical": {
"name": "WD 1111+552",
"horizonsCode": null,
"meanRadiusKm": 26019.2,
"gravitationalParameterKm3PerS2": 0,
"parent": null,
"effectiveTemperatureK": 93300
},
"physicalNotes": "Radius 0.0374 solar radii from González-Santamaría et al. (2021), A&A 656, A51, Table 8: log(L/Lsun) = 1.98 from the star's V magnitude at its Gaia EDR3 distance, and log(Teff) = 4.97; the paper prints no radius, and 0.0374 solar radii is the sphere that radiates that luminosity at that temperature (Stefan-Boltzmann law) (https://arxiv.org/abs/2109.12114): 26,019 km at 695,700 km per solar radius. No mass is measured, so GM is 0, the records' unpublished value. Temperature 93300 K from González-Santamaría et al. (2021), A&A 656, A51, Table 8: log(Teff) = 4.97, a temperature from the literature the paper compiles; spectral type DAO (https://arxiv.org/abs/2109.12114). presentationUp: the display axis is a sky-plane convention; the spin axis's position angle on the sky is not measured.",
"star": {
"rightAscensionDegrees": 168.6988018192362,
"declinationDegrees": 55.019028406093206,
"positionEpochJulianYear": 2016,
"distanceParsecs": 811.014503375056,
"properMotionRaMasPerYear": 0.07623383022787678,
"properMotionDecMasPerYear": 1.2143663249499133,
"radialVelocityKmPerS": 0,
"presentationUp": "display-axis",
"sources": {
"position": "Gaia DR3 source 843950873117830528 (Gaia Collaboration 2023, A&A 674, A1), ICRS at epoch J2016.0, from the archived row src/objects/wd-1111-552/source/photometry/gaia-dr3-source.csv",
"distance": "Chornay & Walton (2021), A&A 656, A110; CDS J/A+A/656/A110, Table A.1, PN G148.4+57.0: distance 811 pc (782 to 842) from the Gaia EDR3 parallax of this star, the distance its nebula's page stands at (https://cdsarc.cds.unistra.fr/viz-bin/cat/J/A+A/656/A110): 811.014503375056 pc; Gaia DR3 parallax 1.2347 +/- 0.0461 mas (same row, RUWE 1.04), 26.8 standard errors, is not used",
"properMotion": "Gaia DR3 (same row): 0.076, 1.214 mas/yr",
"radialVelocity": "No catalogued radial velocity: Gaia DR3 measures none for source 843950873117830528 and SIMBAD lists none. Zero is assumed; a 30 km/s error moves the star by one part in 300,000 of its distance per century (https://simbad.cds.unistra.fr/simbad/sim-id?Ident=Gaia%20DR3%20843950873117830528)"
}
}
}
30 changes: 30 additions & 0 deletions packages/astronomy/data/bodies/wd-1851-329.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"id": "wd-1851-329",
"classification": "star",
"order": 5778,
"physical": {
"name": "WD 1851+329",
"horizonsCode": null,
"meanRadiusKm": 26019.2,
"gravitationalParameterKm3PerS2": 0,
"parent": null,
"effectiveTemperatureK": 112200
},
"physicalNotes": "Radius 0.0374 solar radii from González-Santamaría et al. (2021), A&A 656, A51, Table 8: log(L/Lsun) = 2.3 from the star's V magnitude at its Gaia EDR3 distance, and log(Teff) = 5.05; the paper prints no radius, and 0.0374 solar radii is the sphere that radiates that luminosity at that temperature (Stefan-Boltzmann law) (https://arxiv.org/abs/2109.12114): 26,019 km at 695,700 km per solar radius. No mass is measured, so GM is 0, the records' unpublished value. Temperature 112200 K from González-Santamaría et al. (2021), A&A 656, A51, Table 8: log(Teff) = 5.05, a temperature from the literature the paper compiles; spectral type hgO(H) (https://arxiv.org/abs/2109.12114). presentationUp: the display axis is a sky-plane convention; the spin axis's position angle on the sky is not measured.",
"star": {
"rightAscensionDegrees": 283.39624524512595,
"declinationDegrees": 33.029145234727864,
"positionEpochJulianYear": 2016,
"distanceParsecs": 790.014153719229,
"properMotionRaMasPerYear": 1.6450208472431704,
"properMotionDecMasPerYear": 2.4723413701200947,
"radialVelocityKmPerS": -19.1,
"presentationUp": "display-axis",
"sources": {
"position": "Gaia DR3 source 2090486618786534784 (Gaia Collaboration 2023, A&A 674, A1), ICRS at epoch J2016.0, from the archived row src/objects/wd-1851-329/source/photometry/gaia-dr3-source.csv; cross-identification HD 175353: https://simbad.cds.unistra.fr/simbad/sim-id?Ident=Gaia+DR3+2090486618786534784",
"distance": "Chornay & Walton (2021), A&A 656, A110; CDS J/A+A/656/A110, Table A.1, PN G063.1+13.9: distance 790 pc (764 to 818) from the Gaia EDR3 parallax of this star, the distance its nebula's page stands at (https://cdsarc.cds.unistra.fr/viz-bin/cat/J/A+A/656/A110): 790.014153719229 pc; Gaia DR3 parallax 1.2696 +/- 0.0438 mas (same row, RUWE 1.07), 29.0 standard errors, is not used",
"properMotion": "Gaia DR3 (same row): 1.645, 2.472 mas/yr",
"radialVelocity": "SIMBAD's radial velocity for Gaia DR3 2090486618786534784 (quality E), from 1953GCRV..C......0W; Gaia DR3 measures none (https://ui.adsabs.harvard.edu/abs/1953GCRV..C......0W/abstract)"
}
}
}
30 changes: 30 additions & 0 deletions packages/astronomy/data/bodies/wd-2226-210.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"id": "wd-2226-210",
"classification": "star",
"order": 5780,
"physical": {
"name": "WD 2226-210",
"horizonsCode": null,
"meanRadiusKm": 15862,
"gravitationalParameterKm3PerS2": 0,
"parent": null,
"effectiveTemperatureK": 107200
},
"physicalNotes": "Radius 0.0228 solar radii from González-Santamaría et al. (2021), A&A 656, A51, Table 8: log(L/Lsun) = 1.79 from the star's V magnitude at its Gaia EDR3 distance, and log(Teff) = 5.03; the paper prints no radius, and 0.0228 solar radii is the sphere that radiates that luminosity at that temperature (Stefan-Boltzmann law) (https://arxiv.org/abs/2109.12114): 15,862 km at 695,700 km per solar radius. No mass is measured, so GM is 0, the records' unpublished value. Temperature 107200 K from González-Santamaría et al. (2021), A&A 656, A51, Table 8: log(Teff) = 5.03, a temperature from the literature the paper compiles; spectral type DAO.5 (https://arxiv.org/abs/2109.12114). presentationUp: the display axis is a sky-plane convention; the spin axis's position angle on the sky is not measured.",
"star": {
"rightAscensionDegrees": 337.41079031598287,
"declinationDegrees": -20.837166885514563,
"positionEpochJulianYear": 2016,
"distanceParsecs": 216,
"properMotionRaMasPerYear": 38.78960371587057,
"properMotionDecMasPerYear": -3.3465676470410934,
"radialVelocityKmPerS": -15,
"presentationUp": "display-axis",
"sources": {
"position": "Gaia DR3 source 6628874205642084224 (Gaia Collaboration 2023, A&A 674, A1), ICRS at epoch J2016.0, from the archived row src/objects/wd-2226-210/source/photometry/gaia-dr3-source.csv",
"distance": "Benedict et al. (2009), HST parallaxes of planetary nebula nuclei: 216 pc (-12/+14) from the trigonometric parallax of this star, the distance its nebula's page stands at (https://arxiv.org/abs/0909.4281): 216 pc; Gaia DR3 parallax 5.0124 +/- 0.0437 mas (same row, RUWE 0.95), 114.8 standard errors, is not used",
"properMotion": "Gaia DR3 (same row): 38.790, -3.347 mas/yr",
"radialVelocity": "SIMBAD's radial velocity for Gaia DR3 6628874205642084224 (quality E), from 1953GCRV..C......0W; Gaia DR3 measures none (https://ui.adsabs.harvard.edu/abs/1953GCRV..C......0W/abstract)"
}
}
}
12 changes: 12 additions & 0 deletions packages/bake/src/objects/color/star-catalogue-color.test.mts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import assert from 'node:assert/strict';
import { test } from 'node:test';
import { readStarTemperature, temperatureCatalogueColor } from './star-catalogue-color.ts';

test('a central star past 100,000 K is read, and takes the display fit\'s hottest color', () => {
const effectiveTemperatureSource = 'A paper (https://example.org/paper)';
assert.equal(readStarTemperature({ effectiveTemperatureK: 112200, effectiveTemperatureSource }).kelvin, 112200);
assert.equal(temperatureCatalogueColor(112200), temperatureCatalogueColor(40000));
for (const effectiveTemperatureK of [900, 300000]) {
assert.throws(() => readStarTemperature({ effectiveTemperatureK, effectiveTemperatureSource }), /between 1,000 and 250,000 K/u);
}
});
4 changes: 3 additions & 1 deletion packages/bake/src/objects/color/star-catalogue-color.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@ export interface StarTemperature { readonly kelvin: number; readonly source: str
export function readStarTemperature(measurements: unknown): StarTemperature {
const record = requireRecord(measurements, 'star measurements');
const kelvin = requireFiniteNumber(record.effectiveTemperatureK, 'effectiveTemperatureK');
if (!(kelvin >= 1000 && kelvin <= 40000)) throw new TypeError('A stellar effective temperature lies between 1,000 and 40,000 K.');
// The display fit ends at 40,000 K and holds its color there for a hotter star (temperatureColor): a planetary nebula's
// central star is past 100,000 K.
if (!(kelvin >= 1000 && kelvin <= 250000)) throw new TypeError('A stellar effective temperature lies between 1,000 and 250,000 K.');
const source = requireString(record.effectiveTemperatureSource, 'effectiveTemperatureSource');
if (!/https?:\/\//u.test(source)) throw new TypeError('The effective temperature source names the publication by URL.');
return { kelvin, source };
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,10 @@ test('the spec takes a cited atmosphere class and refuses one no grid tabulates'
assert.equal(parseStarSpec({ ...star, whiteDwarf: { atmosphere: 'DA', source: 'a paper', url: cited.url } }).whiteDwarf?.atmosphere, 'DA');
assert.throws(() => parseStarSpec({ ...star, whiteDwarf: { atmosphere: 'DQZ', source: 'a paper', url: cited.url } }), /whiteDwarf\.atmosphere is DA, DB, DBA, not DQZ: no other white-dwarf atmosphere has a limb-darkening grid here/u);
});

test('the spec takes a planetary nebula\'s central star, past 100,000 K, and refuses a temperature no star has', () => {
const cited = { value: 1, source: 'a paper', url: 'https://doi.org/10.3847/1538-4357/aa6af8' };
const star = { id: 'a-nucleus', name: 'A Nucleus', description: 'A central star.', target: 'A Nucleus', paper: { url: cited.url, credit: 'A paper' }, radius: { ...cited, value: 0.0374 }, mass: 'unmeasured' };
assert.equal(parseStarSpec({ ...star, temperature: { ...cited, value: 112200 } }).temperature.value, 112200);
assert.throws(() => parseStarSpec({ ...star, temperature: { ...cited, value: 300000 } }), /temperature\.value 300000 is outside 1000 to 250000/u);
});
2 changes: 2 additions & 0 deletions packages/telescope-cli/src/new-object/limb.mts
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,8 @@ export interface LimbChoice {
readonly acquisitions?: readonly Record<string, unknown>[]; readonly inputs?: readonly Record<string, unknown>[]; readonly coefficients?: QuadraticLimbDarkening;
/** The sentence the dataset qualification, README and NOTICE use. */
readonly sentence: string; readonly credit?: string; readonly grid?: Grid['key'] | 'howarth' | 'picaso';
/** A transcribed row of a model grid, the nearest to a star no grid reaches (star-limb.mts). */
readonly nearestModel?: boolean;
}

// The node range a request names, written as the grid writes its values (the form every existing package restores with).
Expand Down
3 changes: 2 additions & 1 deletion packages/telescope-cli/src/new-object/spec.mts
Original file line number Diff line number Diff line change
Expand Up @@ -396,7 +396,8 @@ export function parseStarSpec(value: unknown): StarSpec {
...(input.order === undefined ? {} : { order: requireFiniteNumber(input.order, at('order')) }), ...(target ? { target } : {}), ...(gaia ? { gaia } : {}),
paper: { url: requireString(paper.url, at('paper.url')), credit: requireString(paper.credit, at('paper.credit')) },
radius: citedOrFlame(input.radius, at('radius'), [0.005, 3000]), mass: input.mass === 'unmeasured' ? 'unmeasured' : citedOrFlame(input.mass, at('mass'), [0.01, 300]),
temperature: cited(input.temperature, at('temperature'), [1000, 60000]),
// The bound refuses a typing slip, not a star: a planetary nebula's central star is past 100,000 K.
temperature: cited(input.temperature, at('temperature'), [1000, 250000]),
...(input.gravity === undefined ? {} : { gravity: cited(input.gravity, at('gravity'), [-1, 9]) }),
...(input.gravityRange === undefined ? {} : { gravityRange: (() => {
const r = requireRecord(input.gravityRange, at('gravityRange')), min = requireFiniteNumber(r.min, at('gravityRange.min')), max = requireFiniteNumber(r.max, at('gravityRange.max'));
Expand Down
14 changes: 9 additions & 5 deletions packages/telescope-cli/src/new-object/star-limb.mts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@
*
* The law comes from the first source that holds the star:
* 1. a law transcribed from a paper beside the star (`source/photometry/<name>-limb-darkening.json`, cssearth-published-limb-darkening@1,
* quadratic or power), a measurement or the model a paper fixed for this star. A power law that follows from sizes a paper
* prints, not from an exponent it prints, says how in `derived`, and the star's texts say it in those words;
* quadratic or power), a measurement or the model a paper fixed for this star. A law that is not the paper's own value for
* the star says how it follows in `derived`, and the star's texts say it in those words: a power law from sizes a paper
* prints, or the row of a model grid nearest a star no grid reaches (a white dwarf past the grid's hottest model);
* 2. the model grids of limb.mts, at the star's temperature and gravity (and mass, for spherical models). The gravity is the star's
* mass and radius in its astronomy record, else a published spectroscopic value (gravity.mts), searched at the star's J2000
* position: the record's, carried back from its own epoch by its proper motion.
Expand Down Expand Up @@ -73,10 +74,12 @@ async function publishedLaw(root: string, id: string): Promise<LimbChoice | null
// A law fitted in this package to a pinned input says so, and names the tool that refits it; any other record is a paper's.
const terms = coefficients.law === 'power' ? `power law I(mu) = mu^${coefficients.alpha}` : `quadratic law (u1 ${coefficients.u1}, u2 ${coefficients.u2})`;
const law = fit ? `the ${terms} fitted in this package to ${fit.data} (${record.band})`
: coefficients.law === 'power' && record.derived !== undefined ? `the ${terms} ${requireString(record.derived, 'derived')} (${record.band})`
: record.derived !== undefined ? `the ${terms} ${requireString(record.derived, 'derived')} (${record.band})`
: coefficients.law === 'power' ? `the ${terms} that ${credit} fit to the star's resolved disc (${record.band})`
: `the ${terms} ${credit} ${record.basis === 'model-prior' ? 'fixed from model atmospheres for this star' : 'fit to this star'} (${record.band})`;
return { limbDarkening: { law: record.law === 'power' ? 'power' : 'quadratic', published: true, path }, sentence: `dimmed toward the limb by ${law}`, credit: `Limb darkening: ${credit}.`,
// A row of a model grid chosen for the star, not a paper's own value for it: the nearest tabulated model.
const nearestModel = record.derived !== undefined && record.basis === 'model-prior';
return { limbDarkening: { law: record.law === 'power' ? 'power' : 'quadratic', published: true, path }, sentence: `dimmed toward the limb by ${law}`, credit: `Limb darkening: ${credit}.`, ...(nearestModel ? { nearestModel } : {}),
inputs: [{ id: `${id}-${name.replace(/\.json$/u, '')}`, path, origin: url, credit, license: 'Factual numerical measurements; source attribution retained',
acquisition: fit ? `Fitted by ${fit.tool} to ${fit.input}` : 'Transcribed from the paper, each value with its quoted cell', redistribution: fit ? 'A fitted parameter with its method; no paper figures' : 'Factual parameter transcription only; no paper figures', consumers: ['assets', 'datasets'],
sourceBinding: { kind: 'local', reason: fit ? 'Limb-darkening law fitted in this package, with the refit that checks it; repinned when edited.' : 'Published limb-darkening law transcribed with its cells; repinned when edited.' } }] };
Expand Down Expand Up @@ -202,7 +205,8 @@ export async function starLimb(root: string, ids: readonly string[], { archive =
if (respec) files.set(`${o}/${STORED_SPEC}`, respec);
if (cited) files.set(`${o}/README.md`, String(files.get(`${o}/README.md`) ?? '').replace(STAR_GRAVITY, (_all, before: string) => `${before} log g ${cited.logg} from ${cited.source}.`));
files.set(`${o}/README.md`, readmeWithLimb(String(files.get(`${o}/README.md`) ?? ''), `**Limb.** The disc is ${limb.sentence}.${readAt}`,
measured ? '- **Measured limb, other band.** The law was measured or fixed outside the visible band the color is drawn in; the visible limb is not measured.' : `- **Model limb.** The limb darkening is a model atmosphere at the star's temperature and ${gravity?.kind === 'bounded' ? 'a display gravity' : 'gravity'}, not a measurement of this star.`));
limb.nearestModel ? '- **Model limb.** The limb darkening is the nearest tabulated model atmosphere\'s, not a measurement of this star.'
: measured ? '- **Measured limb, other band.** The law was measured or fixed outside the visible band the color is drawn in; the visible limb is not measured.' : `- **Model limb.** The limb darkening is a model atmosphere at the star's temperature and ${gravity?.kind === 'bounded' ? 'a display gravity' : 'gravity'}, not a measurement of this star.`));
// The gravity on record is the one a grid law was read at. A published law is read at none, so the star's cited gravity stays.
if (gravity && limb.grid && measurements.surfaceGravityLogg !== gravity.logg && gravity.kind !== 'bounded') { measurements.surfaceGravityLogg = gravity.logg; measurements.surfaceGravitySource = `${gravity.sentence}${gravity.url ? ` (${gravity.url})` : ''}`; files.set(`${s}/measurements.json`, json(measurements)); }
const ledgerPath = `${o}/investigations.json`, ledger = files.has(ledgerPath) ? read(ledgerPath) : { schema: INVESTIGATION_LEDGER_SCHEMA, objectId: id, entries: [] };
Expand Down
Loading
Loading