"""Named-source parser. Original observed rows are written only to private output.""" import hashlib import json from pathlib import Path import numpy as np MEMBER_SHA='9be193eccc5c363e74d04270290d831738f41ec9225a3b2c95353fd3812170b8' METADATA_SHA='5aa0501f6b0d881fa579030e315e7b5b6ef561a5bd3a07472f9929c7e5728243' FIELDS=['radiusKpc','observedVelocityKms','velocityErrorKms','gasVelocitySignedKms','diskUnitVelocitySignedKms','bulgeUnitVelocitySignedKms','diskSurfaceBrightnessSolarPerPc2','bulgeSurfaceBrightnessSolarPerPc2'] def source_hash(path):return hashlib.sha256(path.read_bytes()).hexdigest() def load_native(input_directory): member=input_directory/'NGC2403_rotmod.dat';metadata=input_directory/'sparc-table1-metadata.body' if source_hash(member)!=MEMBER_SHA or source_hash(metadata)!=METADATA_SHA:raise ValueError('Wrong frozen observed source') row=next(line for line in metadata.read_text().splitlines() if line[:11].strip()=='NGC2403') columns=row.split() if len(columns)!=19 or columns[0]!='NGC2403':raise ValueError('Wrong named metadata row schema') meta={'distanceMpc':float(columns[2]),'distanceErrorMpc':float(columns[3]),'distanceMethod':int(columns[4]), 'inclinationDegrees':float(columns[5]),'inclinationErrorDegrees':float(columns[6]),'quality':int(columns[17]),'sourceReferences':columns[18]} values=np.loadtxt(member,comments='#') if values.ndim!=2 or values.shape[1]!=8 or np.any(~np.isfinite(values)):raise ValueError('Wrong native schema/nonfinite rows') if np.any(np.diff(values[:,0])<=0) or np.any(values[:,0]<=0) or np.any(values[:,1:3]<=0):raise ValueError('Invalid native radius/velocity/error') if meta['quality']!=1 or np.any(values[:,5]!=0) or np.any(values[:,7]!=0):raise ValueError('Fixed no-bulge/Q1 selection not satisfied') record={'schema':'rotation-curve-observation-v1','label':'Original SPARC measured rotation curve and native component model', 'galaxy':'NGC2403','metadata':meta,'columns':FIELDS,'rows':values.tolist(), 'sourceIdentity':{'memberSha256':MEMBER_SHA,'metadataSha256':METADATA_SHA}, 'errorMeaning':'Native velocity uncertainty excludes inclination systematic; full cross-radius covariance not supplied', 'nativeGeometry':'Arbitrary native radial profile; stellar finite exponential vertical thickness, gas includes1.33 helium; unit stellar M/L=1', 'notRawVelocityField':True} return record def save_record(record,path): path.parent.mkdir(parents=True,exist_ok=True) path.write_text(json.dumps(record,indent=2)+'\n') return {'path':str(path),'bytes':path.stat().st_size,'sha256':source_hash(path)}