Skip to content

Instantly share code, notes, and snippets.

@andycasey
Created January 19, 2024 01:00
Show Gist options
  • Save andycasey/c28d73ca3f51ae26c787dd8957cc58b6 to your computer and use it in GitHub Desktop.
Save andycasey/c28d73ca3f51ae26c787dd8957cc58b6 to your computer and use it in GitHub Desktop.
Create fake mwmVisit/mwmStar files
import numpy as np
from astropy.io import fits
def generate_apogee_hdu(observatory="APO", with_wl=True):
wl = (10**(4.179 + 6e-6 * np.arange(8575))).reshape((1, -1))
flux = np.zeros_like(wl)
ivar = np.zeros_like(wl)
pixel_flags = np.zeros_like(wl)
continuum = np.zeros_like(wl)
nmf_rectified_model_flux = np.zeros_like(wl)
columns = [
fits.Column(name='spectrum_pk_id', array=[159783564], format='K'),
fits.Column(name='release', array=[b'sdss5'], format='5A'),
fits.Column(name='filetype', array=[b'apStar'], format='6A'),
fits.Column(name='v_astra', array=[b'0.5.0'], format='5A'),
fits.Column(name='healpix', array=[3], format='J'),
fits.Column(name='sdss_id', array=[42], format='K'),
fits.Column(name='apred', array=[b'1.2'], format='3A'),
fits.Column(name='obj', array=[b'2M19534321+6705175'], format='18A'),
fits.Column(name='telescope', array=[b'apo25m'], format='6A'),
fits.Column(name='min_mjd', array=[59804], format='J'),
fits.Column(name='max_mjd', array=[59866], format='J'),
fits.Column(name='n_entries', array=[-1], format='J'),
fits.Column(name='n_visits', array=[5], format='J'),
fits.Column(name='n_good_visits', array=[5], format='J'),
fits.Column(name='n_good_rvs', array=[5], format='J'),
fits.Column(name='snr', array=[46.56802], format='E'),
fits.Column(name='mean_fiber', array=[256.], format='E'),
fits.Column(name='std_fiber', array=[0.], format='E'),
fits.Column(name='spectrum_flags', array=[1048576], format='J'),
fits.Column(name='v_rad', array=[-56.7284381], format='E'),
fits.Column(name='e_v_rad', array=[5.35407624], format='E'),
fits.Column(name='std_v_rad', array=[10.79173857], format='E'),
fits.Column(name='median_e_v_rad', array=[16.19418386], format='E'),
fits.Column(name='doppler_teff', array=[7169.0107], format='E'),
fits.Column(name='doppler_e_teff', array=[9.405238], format='E'),
fits.Column(name='doppler_logg', array=[2.981389], format='E'),
fits.Column(name='doppler_e_logg', array=[0.01916536], format='E'),
fits.Column(name='doppler_fe_h', array=[-1.20532212], format='E'),
fits.Column(name='doppler_e_fe_h', array=[0.0093738], format='E'),
fits.Column(name='doppler_rchi2', array=[1.1424173], format='E'),
fits.Column(name='doppler_flags', array=[0], format='J'),
fits.Column(name='xcorr_v_rad', array=[np.nan], format='E'),
fits.Column(name='xcorr_v_rel', array=[np.nan], format='E'),
fits.Column(name='xcorr_e_v_rel', array=[np.nan], format='E'),
fits.Column(name='ccfwhm', array=[np.nan], format='E'),
fits.Column(name='autofwhm', array=[np.nan], format='E'),
fits.Column(name='n_components', array=[1], format='J'),
]
if with_wl:
columns.append(fits.Column(name='wavelength', array=wl, format='8575E', dim='(8575)'))
columns += [
fits.Column(name='flux', array=flux, format='8575E', dim='(8575)'),
fits.Column(name='ivar', array=ivar, format='8575E', dim='(8575)'),
fits.Column(name='pixel_flags', array=pixel_flags, format='8575E', dim='(8575)'),
fits.Column(name='continuum', array=continuum, format='8575E', dim='(8575)'),
fits.Column(name='nmf_rectified_model_flux', array=nmf_rectified_model_flux, format='8575E', dim='(8575)'),
fits.Column(name='nmf_rchi2', array=[2.3391197], format='E'),
fits.Column(name='nmf_flags', array=[0], format='J') ,
]
header = fits.Header(cards=[
("EXTNAME", f"APOGEE/{observatory}", ""),
("OBSRVTRY", observatory, None),
("INSTRMNT", "APOGEE", None),
("CRVAL", 4.179, None),
("CDELT", 6e-6, None),
("CTYPE", "LOG-LINEAR", None),
("CUNIT", "Angstrom (Vacuum)"),
("CRPIX", 1, None),
("DC-FAG", 1, None),
("NPIXELS", 8575, None)
])
return fits.BinTableHDU.from_columns(columns, header=header)
def generate_boss_hdu(observatory="APO", with_wl=True):
wl = (10**(3.5523 + 1e-4 * np.arange(4648))).reshape((1, -1))
flux = ivar = continuum = pixel_flags = nmf_rectified_model_flux = np.zeros_like(wl)
columns = [
fits.Column(name='spectrum_pk_id', array=[0], format='K'),
fits.Column(name='release', array=["sdss5"], format='5A'),
fits.Column(name='filetype', array=["specFull"], format='7A'),
fits.Column(name='v_astra', array=["0.5.0"], format='5A'),
fits.Column(name='healpix', array=[34], format='J'),
fits.Column(name='sdss_id', array=[42], format='K'),
fits.Column(name='run2d', array=["6_1_2"], format='6A'),
fits.Column(name='telescope', array=["apo25m"], format='6A'),
fits.Column(name='min_mjd', array=[54], format='J'),
fits.Column(name='max_mjd', array=[488], format='J'),
fits.Column(name='n_visits', array=[1], format='J'),
fits.Column(name='n_good_visits', array=[1], format='J'),
fits.Column(name='n_good_rvs', array=[1], format='J'),
fits.Column(name='v_rad', array=[0], format='E'),
fits.Column(name='e_v_rad', array=[1], format='E'),
fits.Column(name='std_v_rad', array=[1], format='E'),
fits.Column(name='median_e_v_rad', array=[3], format='E'),
fits.Column(name='xcsao_teff', array=[5000], format='E'),
fits.Column(name='xcsao_e_teff', array=[10], format='E'),
fits.Column(name='xcsao_logg', array=[4], format='E'),
fits.Column(name='xcsao_e_logg', array=[3], format='E'),
fits.Column(name='xcsao_fe_h', array=[0], format='E'),
fits.Column(name='xcsao_e_fe_h', array=[5], format='E'),
fits.Column(name='xcsao_meanrxc', array=[0], format='E'),
fits.Column(name='snr', array=[50], format='E'),
fits.Column(name='gri_gaia_transform_flags', array=[1], format='J'),
fits.Column(name='zwarning_flags', array=[0], format='J'),
]
if with_wl:
columns.append(fits.Column(name='wavelength', array=wl, format='4648E', dim='(4648)'))
columns += [
fits.Column(name='flux', array=flux, format='4648E', dim='(4648)'),
fits.Column(name='ivar', array=ivar, format='4648E', dim='(4648)'),
fits.Column(name='pixel_flags', array=pixel_flags, format='4648E', dim='(4648)'),
fits.Column(name='continuum', array=continuum, format='4648E', dim='(4648)'),
fits.Column(name='nmf_rectified_model_flux', array=nmf_rectified_model_flux, format='4648E', dim='(4648)'),
fits.Column(name='nmf_rchi2', array=[5], format='E'),
fits.Column(name='nmf_flags', array=[0], format='J'),
]
header = fits.Header(cards=[
("EXTNAME", f"BOSS/{observatory}", ""),
("OBSRVTRY", observatory, None),
("INSTRMNT", "BOSS", None),
("CRVAL", 3.5523, None),
("CDELT", 1e-4, None),
("CTYPE", "LOG-LINEAR", None),
("CUNIT", "Angstrom (Vacuum)"),
("CRPIX", 1, None),
("DC-FAG", 1, None),
("NPIXELS", 4648, None)
])
return fits.BinTableHDU.from_columns(columns, header=header)
def fake_primary_hdu():
return fits.PrimaryHDU(header=fits.Header(cards=[
('SIMPLE', True, 'conforms to FITS standard'),
('BITPIX', 8, 'array data type'),
('NAXIS', 0, 'number of array dimensions'),
('EXTEND', True, ''),
('', '', ''),
('', 'Metadata', ''),
('', '', ''),
('V_ASTRA', '0.5.0', 'Astra version'),
('CREATED', '23-11-13 10:21:47', 'File creation time (UTC %y-%m-%d %H:%M:%S)'),
('', '', ''),
('', 'Identifiers', ''),
('', '', ''),
('SDSS_ID', 34, 'SDSS-5 unique identifier'),
('APOGEEID', '', 'SDSS-4 DR17 APOGEE identifier'),
('GAIA2_ID', 23423, 'Gaia DR2 source identifier'),
('GAIA3_ID', 23423, 'Gaia DR3 source identifier'),
('TIC_ID', 453, 'TESS Input Catalog (v8) identifier'),
('HEALPIX', 7769, 'HEALPix (128 side)'),
('', '', ''),
('', 'Targeting Provenance', ''),
('', '', ''),
('CARTON_0', '', 'Highest priority carton name'),
('LEAD', 'tic_v8', 'Lead catalog used for cross-match'),
('VER_ID', 25, 'SDSS catalog version for targeting'),
('CAT_ID', 27021597842679140, 'Catalog identifier used to target the source'),
('CAT_ID21', 4283338543, 'Catalog identifier (v21; v0.0)'),
('CAT_ID25', 27021597842679140, 'Catalog identifier (v25; v0.5)'),
('CAT_ID31', 63050395058384891, 'Catalog identifier (v31; v1.0)'),
('N_ASSOC', 1, 'SDSS_IDs associated with this CATALOGID'),
('N_NEIGH', 0, 'Sources within 3" and G_MAG < G_MAG_source + 5'),
('', '', ''),
('', 'Astrometry', ''),
('', '', ''),
('RA', 198.4346, 'Right ascension [deg]'),
('DEC', 67.110405, 'Declination [deg]'),
('L', 39.57304281336641, 'Galactic longitude [deg]'),
('B', 69.09476252445475, 'Galactic latitude [deg]'),
('PLX', 6.2856047, 'Parallax [mas]'),
('E_PLX', 1.04624034, 'Error on parallax [mas]'),
('PMRA', -3.6440573, 'Proper motion in RA [mas/yr]'),
('E_PMRA', 6.05078333, 'Error on proper motion in RA [mas/yr]'),
('PMDE', -8.818821, 'Proper motion in DEC [mas/yr]'),
('E_PMDE', 1.05103116, 'Error on proper motion in DEC [mas/yr]'),
('V_RAD', 'NaN', 'Gaia radial velocity [km/s]'),
('E_V_RAD', 'NaN', 'Error on Gaia radial velocity [km/s]'),
('', '', ''),
('', 'Gaia Photometry', ''),
('', '', ''),
('G_MAG', 5.212288, 'Gaia DR3 mean G band magnitude [mag]'),
('BP_MAG', 1.417452, 'Gaia DR3 mean BP band magnitude [mag]'),
('RP_MAG', 13.138654, 'Gaia DR3 mean RP band magnitude [mag]'),
('', '', ''),
('', '2MASS Photometry', ''),
('', '', ''),
('J_MAG', 3.709, '2MASS J band magnitude [mag]'),
('E_J_MAG', 0.026, 'Error on 2MASS J band magnitude [mag]'),
('H_MAG', 2.893, '2MASS H band magnitude [mag]'),
('E_H_MAG', 0.032, 'Error on 2MASS H band magnitude [mag]'),
('K_MAG', 1.776, '2MASS K band magnitude [mag]'),
('E_K_MAG', 0.026, 'Error on 2MASS K band magnitude [mag]'),
('PH_QUAL', '', '2MASS photometric quality flag'),
('BL_FLG', '', 'Number of components fit per band (JHK)'),
('CC_FLG', '', 'Contamination and confusion flag'),
('COMMENT', 'See https://www.ipac.caltech.edu/2mass/releases/allsky/doc/sec2_2a.html', ''),
('', '', ''),
('', 'unWISE Photometry', ''),
('', '', ''),
('W1_MAG', 1.615836388268159, 'W1 magnitude'),
('E_W1_MAG', 3.001952228308748062, 'Error on W1 magnitude'),
('W1_FLUX', 954.997, 'W1 flux [Vega nMgy]'),
('W1_DFLUX', 1.1017, 'Error on W1 flux [Vega nMgy]'),
('W1_FRAC', 0.976102, 'Fraction of W1 flux from this object'),
('W2_MAG', 12.20587252800215, 'W2 magnitude [Vega]'),
('E_W2_MAG', 0.04519932356304733, 'Error on W2 magnitude'),
('W2_FLUX', 868.906, 'W2 flux [Vega nMgy]'),
('W2_DFLUX', 3.172016, 'Error on W2 flux [Vega nMgy]'),
('W2_FRAC', 0.9741495, 'Fraction of W2 flux from this object'),
('W1UFLAGS', 0, 'unWISE flags for W1'),
('W2UFLAGS', 0, 'unWISE flags for W2'),
('W1AFLAGS', 0, 'Additional flags for W1'),
('W2AFLAGS', 0, 'Additional flags for W2'),
('COMMENT', 'See https://catalog.unwise.me/catalogs.html', ''),
('', '', ''),
('', 'GLIMPSE Photometry', ''),
('', '', ''),
('MAG4_5', '', 'IRAC band 4.5 micron magnitude [mag]'),
('D4_5M', '', 'Error on IRAC band 4.5 micron magnitude [mag]'),
('RMS_F4_5', '', 'RMS deviations from final flux [mJy]'),
('SQF_4_5', 0, 'Source quality flag for IRAC band 4.5 micron'),
('MF4_5', 0, 'Flux calculation method flag'),
('CSF', 0, 'Close source flag'),
('COMMENT', 'See https://irsa.ipac.caltech.edu/data/SPITZER/GLIMPSE/gator_docs/', ''),
('', '', ''),
('', 'Observations Summary', ''),
('', '', ''),
('N_BOSS', 1, 'Number of BOSS visits'),
('B_MINMJD', 59804, 'Minimum MJD of BOSS visits'),
('N_MAXMJD', 59866, 'Maximum MJD of BOSS visits'),
('N_APOGEE', 1, 'Number of APOGEE visits'),
('A_MINMJD', 59804, 'Minimum MJD of APOGEE visits'),
('A_MAXMJD', 59866, 'Maximum MJD of APOGEE visits'),
('', '', ''),
('', 'Data Integrity', ''),
('', '', ''),
('CHECKSUM', 'UKTRaHQOWHQOaHQO', 'HDU checksum updated 2023-11-13T03:21:47'),
('DATASUM', '0', 'data unit checksum updated 2023-11-13T03:21:47'),
('', '', ''),
('', 'HDU Descriptions', ''),
('', '', ''),
('COMMENT', 'HDU 0: Summary information only', ''),
('COMMENT', 'HDU 1: BOSS spectra from Apache Point Observatory', ''),
('COMMENT', 'HDU 2: BOSS spectra from Las Campanas Observatory', ''),
('COMMENT', 'HDU 3: APOGEE spectra from Apache Point Observatory', ''),
('COMMENT', 'HDU 4: APOGEE spectra from Las Campanas Observatory', '')
]))
def _create_fake_mwm_file(with_wl):
return fits.HDUList([
fake_primary_hdu(),
generate_boss_hdu("APO", with_wl=with_wl),
generate_boss_hdu("LCO", with_wl=with_wl),
generate_apogee_hdu("APO", with_wl=with_wl),
generate_apogee_hdu("LCO", with_wl=with_wl)
])
def create_fake_mwm_visit():
return _create_fake_mwm_file(with_wl=False)
def create_fake_mwm_star():
return _create_fake_mwm_file(with_wl=True)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment