"""Actual original Gaia -> member selections -> native-grid descriptive comparisons. Outputs include local individual rows/figures and may have upstream restrictions. This Python workflow does not regenerate the protected Lab Engine. """ from pathlib import Path import argparse,csv,json,platform import numpy as np,scipy from model_io import verify_inputs,RECIPES,HERE from science.inputs import gaia_rows,parsec_rows,mist_rows,native_rows,model_at_age from science.membership import select_members from science.comparison import compare_cmd,compare_native_grids from science.validation import validate_limits,validate_grid_interpolation from science.population import synthesize_population from frontier_reading import compute as paper_table from projection_audit import audit from public_nodes import produce from projection_cohort import compute as cohort parser=argparse.ArgumentParser(description=__doc__);parser.add_argument('--inputs',type=Path,default=Path('inputs'));parser.add_argument('--out',type=Path,default=Path('results'));args=parser.parse_args();args.out.mkdir(parents=True,exist_ok=True) receipts=verify_inputs(args.inputs) gaia=gaia_rows(args.inputs/'m67-gaia-dr3-cone.csv');masks=select_members(gaia) grids={av:parsec_rows(args.inputs/f'parsec-dense-av{av:.1f}.dat') for av in [0,.1,.2]} mist=mist_rows(args.inputs/RECIPES['mistPhotometryName']);mist96={key:value[np.isclose(mist['log10_isochrone_age_yr'],9.6,atol=1e-8,rtol=0)] for key,value in mist.items()} native=native_rows(args.inputs/'m67-isochrone-a.csv');selected=masks['fixed'];rv=gaia['radial_velocity'];available=selected&np.isfinite(rv) selection={'coneRows':len(gaia['ra']),'qualityRows':int(masks['quality'].sum()),'fixedRows':int(selected.sum()),'sensitivityRows':int(masks['covarianceSensitivity'].sum()),'ruweAbove1p4Retained':int((selected&(gaia['ruwe']>1.4)).sum()),'rvAvailable':int(available.sum()),'rvOutside20p4To47p6Retained':int((available&(np.abs(rv-34)>13.6)).sum()),'astrometricReferenceEpochJyr':sorted(set(gaia['ref_epoch'])),'posteriorMembershipComputed':False} with (args.out/'selected-gaia-local-only.csv').open('w') as stream: fields=['source_id','ra','dec','parallax','pmra','pmdec','phot_g_mean_mag','phot_bp_mean_mag','phot_rp_mean_mag','ruwe'];writer=csv.writer(stream);writer.writerow(fields) for index in np.flatnonzero(selected):writer.writerow([gaia[field][index] for field in fields]) print('Actual selections complete',selection,flush=True) cmd=compare_cmd(gaia,masks,grids) native_difference=compare_native_grids(grids[0],mist96,native) limits=validate_limits(args.out);projection=audit(args.out);interpolation=validate_grid_interpolation(grids) licensed=json.loads((HERE/'isoa-hydrogen-burning.json').read_text());public=produce(licensed) # Leave out alternating original native nodes; retain the predeclared0.002mag failure. nodes=np.array(licensed['rows']);train=np.unique(np.r_[np.arange(0,len(nodes),2),len(nodes)-1]);held=np.setdiff1d(np.arange(1,len(nodes)-1),train) prediction=np.column_stack([np.interp(nodes[held,0],nodes[train,0],nodes[train,band]) for band in [5,6,7]]) max_error=float(np.max(np.abs(prediction-nodes[held,5:8]))) withheld={'trainRows':len(train),'withheldRows':len(held),'maxMagnitudeError':max_error,'prespecifiedGate':.002,'passed':bool(max_error<.002),'publicDefaultUsesContinuousInterpolation':False} paper=paper_table(args.inputs/'huang2024-v1.html') products={'cmd-comparison':cmd,'native-grid-comparison-local-only':native_difference,'deterministic-and-retained-sampling':limits,'same-input-projection-audit':projection,'withheld-age':interpolation,'public-node-reference':public,'public-continuous-interpolation-failure':withheld,'primary-table-aggregates':paper,'separate-predeclared-projection-cohort':cohort()} for name,value in products.items():(args.out/(name+'.json')).write_text(json.dumps(value,indent=2)+'\n') # Real and uncleared model points are generated only here on the reader computer. import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt fig,axis=plt.subplots(figsize=(7,5),layout='constrained') axis.scatter((gaia['phot_bp_mean_mag']-gaia['phot_rp_mean_mag'])[selected],gaia['phot_g_mean_mag'][selected],s=5,label='Fixed astrometric selection') for age in [9.4,9.6,9.7]: model=model_at_age(grids[.1],age) for phase in range(6): keep=model['label']==phase if keep.any():axis.plot(model['G_BPmag'][keep]-model['G_RPmag'][keep],model['Gmag'][keep]+9.6,lw=.8,label=f'{10**(age-9):.2g} Gyr' if phase==1 else None) axis.set(xlabel='Native EDR3 BP - RP [mag]',ylabel='DR3 mean G [mag]',ylim=(18.6,8),xlim=(-.2,2.6));axis.legend(fontsize=8);fig.savefig(args.out/'real-gaia-local-only.png',dpi=140);plt.close(fig) summary={'status':'Actual local producer completed; scientific failures retained','versions':{'python':platform.python_version(),'numpy':np.__version__,'scipy':scipy.__version__},'inputs':receipts,'selection':selection,'bestDescriptiveMatches':cmd['selectionConditionedBestDisplayMatches'],'publicNodeContinuousFailure':withheld,'nativeAgeInterpolationAccepted':interpolation['continuousAgeInterpolationAccepted'],'originalProjectionPassed':limits['projectionSimultaneousSamplingCheck']['passesStatedBand'],'sameInputGeometryError':projection['independentSameInputPositionError'],'paperTableStars':paper['stars'],'boundary':'No posterior, completeness correction, stellar-evolution recomputation, N-body evolution, raw-spectra refit or protected Engine generation.'} (args.out/'summary.json').write_text(json.dumps(summary,indent=2)+'\n');print('PASS actual producer; retained failures are not renamed passes',flush=True)