pyreduce-astro 0.4.37__tar.gz → 0.7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pyreduce_astro-0.7/.gitattributes +1 -0
- pyreduce_astro-0.7/.gitignore +26 -0
- pyreduce_astro-0.7/.pre-commit-config.yaml +33 -0
- pyreduce_astro-0.7/.python-version +1 -0
- pyreduce_astro-0.7/.readthedocs.yaml +25 -0
- pyreduce_astro-0.7/AGENTS.md +1 -0
- pyreduce_astro-0.7/ANDES_plan.md +182 -0
- pyreduce_astro-0.7/CHANGELOG.md +252 -0
- pyreduce_astro-0.7/CLAUDE.md +356 -0
- pyreduce_astro-0.7/PKG-INFO +121 -0
- pyreduce_astro-0.7/README.md +80 -0
- pyreduce_astro-0.7/WhatsNew.md +78 -0
- pyreduce_astro-0.7/examples/andes_yjh_example.py +112 -0
- pyreduce_astro-0.7/examples/crires_plus_example.py +52 -0
- pyreduce_astro-0.7/examples/custom_instrument_example.py +80 -0
- pyreduce_astro-0.7/examples/debug_single_swath.py +233 -0
- pyreduce_astro-0.7/examples/harpn_example.py +48 -0
- pyreduce_astro-0.7/examples/harps_example.py +51 -0
- pyreduce_astro-0.7/examples/harps_gridsearch.py +114 -0
- pyreduce_astro-0.7/examples/just_one_swath.py +127 -0
- pyreduce_astro-0.7/examples/jwst_miri_example.py +46 -0
- pyreduce_astro-0.7/examples/jwst_niriss_example.py +46 -0
- pyreduce_astro-0.7/examples/lick_apf_example.py +46 -0
- pyreduce_astro-0.7/examples/mcdonald_example.py +57 -0
- pyreduce_astro-0.7/examples/metis_ifu_example.py +52 -0
- pyreduce_astro-0.7/examples/metis_lss_example.py +52 -0
- pyreduce_astro-0.7/examples/micado_example.py +72 -0
- pyreduce_astro-0.7/examples/mosaic_nir.py +96 -0
- pyreduce_astro-0.7/examples/mosaic_preset-slitfunc.py +141 -0
- pyreduce_astro-0.7/examples/mosaic_vis.py +92 -0
- pyreduce_astro-0.7/examples/neid_example.py +65 -0
- pyreduce_astro-0.7/examples/nirspec_example.py +50 -0
- pyreduce_astro-0.7/examples/toes_example.py +163 -0
- pyreduce_astro-0.7/examples/uves_callfunc.py +183 -0
- pyreduce_astro-0.7/examples/uves_example.py +50 -0
- pyreduce_astro-0.7/examples/xshooter_example.py +58 -0
- pyreduce_astro-0.7/hatch_build.py +99 -0
- pyreduce_astro-0.7/pyproject.toml +214 -0
- {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/__init__.py +21 -16
- pyreduce_astro-0.7/pyreduce/__main__.py +513 -0
- pyreduce_astro-0.7/pyreduce/cli.py +342 -0
- pyreduce_astro-0.7/pyreduce/clib/build_extract.py +80 -0
- {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/clib/slit_func_2d_xi_zeta_bd.c +193 -125
- {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/clib/slit_func_2d_xi_zeta_bd.h +25 -0
- {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/clib/slit_func_bd.c +3 -6
- {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/clib/slit_func_bd.h +1 -1
- {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/clipnflip.py +11 -3
- {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/combine_frames.py +340 -94
- pyreduce_astro-0.7/pyreduce/configuration.py +292 -0
- {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/continuum_normalization.py +10 -7
- pyreduce_astro-0.7/pyreduce/cwrappers.py +621 -0
- pyreduce_astro-0.7/pyreduce/datasets.py +190 -0
- {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/echelle.py +51 -21
- {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/estimate_background_scatter.py +34 -32
- {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/extract.py +591 -399
- pyreduce-astro-0.4.37/pyreduce/extraction_width.py → pyreduce_astro-0.7/pyreduce/extraction_height.py +20 -21
- pyreduce_astro-0.7/pyreduce/instruments/ANDES_YJH/__init__.py +14 -0
- pyreduce_astro-0.7/pyreduce/instruments/ANDES_YJH/config.yaml +122 -0
- pyreduce_astro-0.7/pyreduce/instruments/ANDES_YJH/order_centers_h.yaml +9 -0
- pyreduce_astro-0.7/pyreduce/instruments/ANDES_YJH/order_centers_j.yaml +21 -0
- pyreduce_astro-0.7/pyreduce/instruments/ANDES_YJH/order_centers_y.yaml +9 -0
- pyreduce_astro-0.7/pyreduce/instruments/ANDES_YJH/settings.json +24 -0
- pyreduce_astro-0.7/pyreduce/instruments/CRIRES_PLUS/__init__.py +116 -0
- pyreduce_astro-0.7/pyreduce/instruments/CRIRES_PLUS/config.yaml +99 -0
- pyreduce_astro-0.7/pyreduce/instruments/CRIRES_PLUS/mask_det1.fits.gz +0 -0
- pyreduce_astro-0.7/pyreduce/instruments/CRIRES_PLUS/mask_det2.fits.gz +0 -0
- pyreduce_astro-0.7/pyreduce/instruments/CRIRES_PLUS/mask_det3.fits.gz +0 -0
- pyreduce_astro-0.7/pyreduce/instruments/CRIRES_PLUS/settings.json +92 -0
- pyreduce_astro-0.7/pyreduce/instruments/CRIRES_PLUS/wavecal_J1228_det1.npz +0 -0
- pyreduce_astro-0.7/pyreduce/instruments/CRIRES_PLUS/wavecal_J1228_det2.npz +0 -0
- pyreduce_astro-0.7/pyreduce/instruments/CRIRES_PLUS/wavecal_J1228_det3.npz +0 -0
- pyreduce_astro-0.7/pyreduce/instruments/HARPN/__init__.py +203 -0
- pyreduce_astro-0.7/pyreduce/instruments/HARPN/config.yaml +140 -0
- pyreduce_astro-0.7/pyreduce/instruments/HARPN/settings.json +21 -0
- pyreduce_astro-0.7/pyreduce/instruments/HARPN/wavecal_harpn_2D.npz +0 -0
- pyreduce_astro-0.7/pyreduce/instruments/HARPN/wavecal_harpn_fibB_2D.npz +0 -0
- pyreduce-astro-0.4.37/pyreduce/instruments/harps.py → pyreduce_astro-0.7/pyreduce/instruments/HARPS/__init__.py +51 -34
- pyreduce_astro-0.7/pyreduce/instruments/HARPS/config.yaml +144 -0
- pyreduce_astro-0.7/pyreduce/instruments/HARPS/mask_blue.fits.gz +0 -0
- pyreduce_astro-0.7/pyreduce/instruments/HARPS/mask_red.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/settings/settings_HARPS.json → pyreduce_astro-0.7/pyreduce/instruments/HARPS/settings.json +24 -14
- pyreduce_astro-0.7/pyreduce/instruments/JWST_MIRI/__init__.py +29 -0
- pyreduce_astro-0.7/pyreduce/instruments/JWST_MIRI/config.yaml +53 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_jwst_miri_lrs_slitless.fits.gz → pyreduce_astro-0.7/pyreduce/instruments/JWST_MIRI/mask_lrs_slitless.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/settings/settings_JWST_MIRI.json → pyreduce_astro-0.7/pyreduce/instruments/JWST_MIRI/settings.json +25 -13
- pyreduce-astro-0.4.37/pyreduce/instruments/jwst_niriss.py → pyreduce_astro-0.7/pyreduce/instruments/JWST_NIRISS/__init__.py +19 -23
- pyreduce_astro-0.7/pyreduce/instruments/JWST_NIRISS/config.yaml +60 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_jwst_niriss_gr700xd.fits.gz → pyreduce_astro-0.7/pyreduce/instruments/JWST_NIRISS/mask_gr700xd.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/settings/settings_JWST_NIRISS.json → pyreduce_astro-0.7/pyreduce/instruments/JWST_NIRISS/settings.json +24 -12
- pyreduce_astro-0.7/pyreduce/instruments/LICK_APF/__init__.py +34 -0
- pyreduce_astro-0.7/pyreduce/instruments/LICK_APF/config.yaml +60 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_lick_apf_.fits.gz → pyreduce_astro-0.7/pyreduce/instruments/LICK_APF/mask_.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/settings/settings_LICK_APF.json → pyreduce_astro-0.7/pyreduce/instruments/LICK_APF/settings.json +35 -23
- pyreduce-astro-0.4.37/pyreduce/instruments/mcdonald.py → pyreduce_astro-0.7/pyreduce/instruments/MCDONALD/__init__.py +28 -21
- pyreduce_astro-0.7/pyreduce/instruments/MCDONALD/config.yaml +56 -0
- pyreduce_astro-0.7/pyreduce/instruments/MCDONALD/mask.fits.gz +0 -0
- pyreduce_astro-0.7/pyreduce/instruments/MCDONALD/settings.json +69 -0
- pyreduce_astro-0.7/pyreduce/instruments/MCDONALD/wavecal.npz +0 -0
- pyreduce_astro-0.7/pyreduce/instruments/METIS_IFU/__init__.py +42 -0
- pyreduce_astro-0.7/pyreduce/instruments/METIS_IFU/config.yaml +62 -0
- pyreduce_astro-0.7/pyreduce/instruments/METIS_IFU/settings.json +76 -0
- pyreduce_astro-0.7/pyreduce/instruments/METIS_LSS/__init__.py +42 -0
- pyreduce_astro-0.7/pyreduce/instruments/METIS_LSS/config.yaml +62 -0
- pyreduce_astro-0.7/pyreduce/instruments/METIS_LSS/settings.json +4 -0
- pyreduce_astro-0.7/pyreduce/instruments/METIS_LSS/wavecal_l_2D.npz +0 -0
- pyreduce_astro-0.7/pyreduce/instruments/METIS_LSS/wavecal_m_2D.npz +0 -0
- pyreduce_astro-0.7/pyreduce/instruments/MICADO/__init__.py +42 -0
- pyreduce_astro-0.7/pyreduce/instruments/MICADO/config.yaml +62 -0
- pyreduce_astro-0.7/pyreduce/instruments/MICADO/settings.json +77 -0
- pyreduce_astro-0.7/pyreduce/instruments/MICADO/wavecal_HK_3arcsec_chip5.npz +0 -0
- pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/__init__.py +38 -0
- pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/bundle_centers_nir.yaml +92 -0
- pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/bundle_centers_vis1.yaml +69 -0
- pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/bundle_centers_vis2.yaml +72 -0
- pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/bundle_centers_vis3.yaml +87 -0
- pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/bundle_centers_vis4.yaml +87 -0
- pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/config.yaml +61 -0
- pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/mask_nir.fits.gz +0 -0
- pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/mosaic_fiber_positions.npz +0 -0
- pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/settings.json +25 -0
- pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/settings_VIS1.json +22 -0
- pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/settings_VIS2.json +4 -0
- pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/settings_VIS3.json +4 -0
- pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/settings_VIS4.json +4 -0
- pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/settings_nir.json +21 -0
- pyreduce_astro-0.7/pyreduce/instruments/NEID/__init__.py +128 -0
- pyreduce_astro-0.7/pyreduce/instruments/NEID/config.yaml +60 -0
- pyreduce_astro-0.7/pyreduce/instruments/NEID/settings.json +71 -0
- pyreduce-astro-0.4.37/pyreduce/instruments/nirspec.py → pyreduce_astro-0.7/pyreduce/instruments/NIRSPEC/__init__.py +37 -38
- pyreduce_astro-0.7/pyreduce/instruments/NIRSPEC/config.yaml +63 -0
- pyreduce_astro-0.7/pyreduce/instruments/NIRSPEC/mask_nirspec.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/settings/settings_NIRSPEC.json → pyreduce_astro-0.7/pyreduce/instruments/NIRSPEC/settings.json +24 -13
- pyreduce_astro-0.7/pyreduce/instruments/NTE/__init__.py +40 -0
- pyreduce_astro-0.7/pyreduce/instruments/NTE/config.yaml +55 -0
- pyreduce_astro-0.7/pyreduce/instruments/NTE/settings.json +60 -0
- pyreduce_astro-0.7/pyreduce/instruments/UVES/__init__.py +43 -0
- pyreduce_astro-0.7/pyreduce/instruments/UVES/config.yaml +65 -0
- pyreduce_astro-0.7/pyreduce/instruments/UVES/mask_blue.fits.gz +0 -0
- pyreduce_astro-0.7/pyreduce/instruments/UVES/mask_blue_binned_2_2.fits.gz +0 -0
- pyreduce_astro-0.7/pyreduce/instruments/UVES/mask_middle.fits.gz +0 -0
- pyreduce_astro-0.7/pyreduce/instruments/UVES/mask_middle_2x2_split.fits.gz +0 -0
- pyreduce_astro-0.7/pyreduce/instruments/UVES/mask_middle_binned_2_2.fits.gz +0 -0
- pyreduce_astro-0.7/pyreduce/instruments/UVES/mask_red.fits.gz +0 -0
- pyreduce_astro-0.7/pyreduce/instruments/UVES/mask_red_2x2.fits.gz +0 -0
- pyreduce_astro-0.7/pyreduce/instruments/UVES/mask_red_2x2_split.fits.gz +0 -0
- pyreduce_astro-0.7/pyreduce/instruments/UVES/mask_red_binned_2_2.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/settings/settings_UVES.json → pyreduce_astro-0.7/pyreduce/instruments/UVES/settings.json +23 -13
- pyreduce_astro-0.7/pyreduce/instruments/XSHOOTER/__init__.py +37 -0
- pyreduce_astro-0.7/pyreduce/instruments/XSHOOTER/config.yaml +63 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_xshooter_nir.fits.gz → pyreduce_astro-0.7/pyreduce/instruments/XSHOOTER/mask_nir.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/settings/settings_XSHOOTER.json → pyreduce_astro-0.7/pyreduce/instruments/XSHOOTER/settings.json +31 -21
- pyreduce_astro-0.7/pyreduce/instruments/common.py +948 -0
- pyreduce_astro-0.7/pyreduce/instruments/defaults/atlas/thar.fits +4946 -13
- pyreduce_astro-0.7/pyreduce/instruments/defaults/atlas/thar_list.txt +4172 -0
- pyreduce_astro-0.7/pyreduce/instruments/defaults/atlas/une.fits +0 -0
- pyreduce_astro-0.7/pyreduce/instruments/defaults/config.yaml +57 -0
- pyreduce-astro-0.4.37/pyreduce/settings/settings_schema.json → pyreduce_astro-0.7/pyreduce/instruments/defaults/schema.json +231 -140
- pyreduce-astro-0.4.37/pyreduce/settings/settings_pyreduce.json → pyreduce_astro-0.7/pyreduce/instruments/defaults/settings.json +75 -27
- {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/instruments/filters.py +40 -14
- {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/instruments/instrument_info.py +23 -18
- pyreduce_astro-0.7/pyreduce/instruments/models.py +385 -0
- pyreduce_astro-0.7/pyreduce/pipeline.py +835 -0
- {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/rectify.py +25 -27
- pyreduce_astro-0.7/pyreduce/reduce.py +2542 -0
- pyreduce_astro-0.7/pyreduce/slit_curve.py +671 -0
- {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/tools/combine.py +8 -8
- pyreduce_astro-0.7/pyreduce/trace.py +1882 -0
- {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/util.py +161 -41
- {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/wavelength_calibration.py +601 -216
- pyreduce_astro-0.7/tools/argon.line +133 -0
- pyreduce_astro-0.7/tools/bpm_creator.py +123 -0
- pyreduce_astro-0.7/tools/convert_wavecal.py +38 -0
- pyreduce_astro-0.7/tools/create_wavelength_guess.py +530 -0
- pyreduce_astro-0.7/tools/download_files.py +84 -0
- pyreduce_astro-0.7/tools/ipy_startup.py +19 -0
- pyreduce_astro-0.7/tools/make_notebook.py +47 -0
- pyreduce_astro-0.7/tools/mosaic_vis_bundle_plot.py +66 -0
- pyreduce_astro-0.7/tools/neon.lin +4180 -0
- pyreduce_astro-0.7/tools/neon.line +477 -0
- pyreduce_astro-0.7/tools/plot_1d_vs_2d_extraction.py +162 -0
- pyreduce_astro-0.7/tools/plot_swath_debug.py +64 -0
- pyreduce_astro-0.7/tools/pymultispec.py +267 -0
- pyreduce_astro-0.7/tools/thar.npz +0 -0
- pyreduce_astro-0.7/tools/wavecal_creator.py +28 -0
- pyreduce_astro-0.7/tools/wavecal_creator_from_existing.py +103 -0
- pyreduce_astro-0.7/tools/xshooter_nir.json +74 -0
- pyreduce_astro-0.7/uv.lock +2138 -0
- pyreduce-astro-0.4.37/MANIFEST.in +0 -20
- pyreduce-astro-0.4.37/PKG-INFO +0 -52
- pyreduce-astro-0.4.37/README.md +0 -39
- pyreduce-astro-0.4.37/codemeta.json +0 -53
- pyreduce-astro-0.4.37/pyreduce/__main__.py +0 -106
- pyreduce-astro-0.4.37/pyreduce/_version.py +0 -21
- pyreduce-astro-0.4.37/pyreduce/clib/build_extract.py +0 -75
- pyreduce-astro-0.4.37/pyreduce/configuration.py +0 -185
- pyreduce-astro-0.4.37/pyreduce/cwrappers.py +0 -313
- pyreduce-astro-0.4.37/pyreduce/datasets.py +0 -224
- pyreduce-astro-0.4.37/pyreduce/instruments/common.json +0 -45
- pyreduce-astro-0.4.37/pyreduce/instruments/common.py +0 -647
- pyreduce-astro-0.4.37/pyreduce/instruments/crires_plus.json +0 -62
- pyreduce-astro-0.4.37/pyreduce/instruments/crires_plus.py +0 -201
- pyreduce-astro-0.4.37/pyreduce/instruments/harps.json +0 -82
- pyreduce-astro-0.4.37/pyreduce/instruments/instrument_schema.json +0 -221
- pyreduce-astro-0.4.37/pyreduce/instruments/jwst_miri.json +0 -53
- pyreduce-astro-0.4.37/pyreduce/instruments/jwst_miri.py +0 -36
- pyreduce-astro-0.4.37/pyreduce/instruments/jwst_niriss.json +0 -52
- pyreduce-astro-0.4.37/pyreduce/instruments/lick_apf.json +0 -53
- pyreduce-astro-0.4.37/pyreduce/instruments/lick_apf.py +0 -43
- pyreduce-astro-0.4.37/pyreduce/instruments/mcdonald.json +0 -59
- pyreduce-astro-0.4.37/pyreduce/instruments/nirspec.json +0 -56
- pyreduce-astro-0.4.37/pyreduce/instruments/uves.json +0 -59
- pyreduce-astro-0.4.37/pyreduce/instruments/uves.py +0 -43
- pyreduce-astro-0.4.37/pyreduce/instruments/xshooter.json +0 -66
- pyreduce-astro-0.4.37/pyreduce/instruments/xshooter.py +0 -44
- pyreduce-astro-0.4.37/pyreduce/make_shear.py +0 -602
- pyreduce-astro-0.4.37/pyreduce/masks/mask_HARPS_blue.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_HARPS_blue_new.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_HARPS_red.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_HARPS_red_new.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_ctio_chiron.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_elodie.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_feros3.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_flames_giraffe.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_harps_blue.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_harps_red.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_hds_blue.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_hds_red.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_het_hrs_2x5.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_nes.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_nirspec_nirspec.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_sarg.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_sarg_2x2a.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_sarg_2x2b.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_subaru_hds_red.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_uves_blue.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_uves_blue_binned_2_2.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_uves_middle.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_uves_middle_2x2_split.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_uves_middle_binned_2_2.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_uves_red.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_uves_red_2x2.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_uves_red_2x2_split.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/masks/mask_uves_red_binned_2_2.fits.gz +0 -0
- pyreduce-astro-0.4.37/pyreduce/reduce.py +0 -1933
- pyreduce-astro-0.4.37/pyreduce/settings/settings_CRIRES_PLUS.json +0 -56
- pyreduce-astro-0.4.37/pyreduce/settings/settings_MCDONALD.json +0 -52
- pyreduce-astro-0.4.37/pyreduce/trace_orders.py +0 -604
- pyreduce-astro-0.4.37/pyreduce_astro.egg-info/PKG-INFO +0 -52
- pyreduce-astro-0.4.37/pyreduce_astro.egg-info/SOURCES.txt +0 -147
- pyreduce-astro-0.4.37/pyreduce_astro.egg-info/dependency_links.txt +0 -1
- pyreduce-astro-0.4.37/pyreduce_astro.egg-info/requires.txt +0 -11
- pyreduce-astro-0.4.37/pyreduce_astro.egg-info/top_level.txt +0 -1
- pyreduce-astro-0.4.37/requirements.txt +0 -17
- pyreduce-astro-0.4.37/setup.cfg +0 -20
- pyreduce-astro-0.4.37/setup.py +0 -77
- pyreduce-astro-0.4.37/test/test_bias.py +0 -68
- pyreduce-astro-0.4.37/test/test_clib_build.py +0 -5
- pyreduce-astro-0.4.37/test/test_clipnflip.py +0 -108
- pyreduce-astro-0.4.37/test/test_combine.py +0 -129
- pyreduce-astro-0.4.37/test/test_configuration.py +0 -66
- pyreduce-astro-0.4.37/test/test_continuum.py +0 -71
- pyreduce-astro-0.4.37/test/test_cwrappers.py +0 -115
- pyreduce-astro-0.4.37/test/test_echelle.py +0 -185
- pyreduce-astro-0.4.37/test/test_extract.py +0 -379
- pyreduce-astro-0.4.37/test/test_flat.py +0 -78
- pyreduce-astro-0.4.37/test/test_instruments.py +0 -106
- pyreduce-astro-0.4.37/test/test_mask.py +0 -23
- pyreduce-astro-0.4.37/test/test_normflat.py +0 -51
- pyreduce-astro-0.4.37/test/test_orders.py +0 -85
- pyreduce-astro-0.4.37/test/test_reduce.py +0 -75
- pyreduce-astro-0.4.37/test/test_scatter.py +0 -68
- pyreduce-astro-0.4.37/test/test_science.py +0 -75
- pyreduce-astro-0.4.37/test/test_shear.py +0 -136
- pyreduce-astro-0.4.37/test/test_util.py +0 -5
- pyreduce-astro-0.4.37/test/test_wavecal.py +0 -59
- pyreduce-astro-0.4.37/versioneer.py +0 -1822
- {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/LICENSE +0 -0
- {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/clib/__init__.py +0 -0
- /pyreduce-astro-0.4.37/pyreduce/wavecal/harps_blue_2D.npz → /pyreduce_astro-0.7/pyreduce/instruments/HARPS/wavecal_blue_2D.npz +0 -0
- /pyreduce-astro-0.4.37/pyreduce/wavecal/harps_blue_pol_2D.npz → /pyreduce_astro-0.7/pyreduce/instruments/HARPS/wavecal_blue_pol_2D.npz +0 -0
- /pyreduce-astro-0.4.37/pyreduce/wavecal/harps_red_2D.npz → /pyreduce_astro-0.7/pyreduce/instruments/HARPS/wavecal_red_2D.npz +0 -0
- /pyreduce-astro-0.4.37/pyreduce/wavecal/harps_red_pol_2D.npz → /pyreduce_astro-0.7/pyreduce/instruments/HARPS/wavecal_red_pol_2D.npz +0 -0
- /pyreduce-astro-0.4.37/pyreduce/wavecal/nirspec_K2.npz → /pyreduce_astro-0.7/pyreduce/instruments/NIRSPEC/wavecal_K2.npz +0 -0
- /pyreduce-astro-0.4.37/pyreduce/wavecal/uves_blue_360nm_2D.npz → /pyreduce_astro-0.7/pyreduce/instruments/UVES/wavecal_blue_360nm_2D.npz +0 -0
- /pyreduce-astro-0.4.37/pyreduce/wavecal/uves_blue_390nm_2D.npz → /pyreduce_astro-0.7/pyreduce/instruments/UVES/wavecal_blue_390nm_2D.npz +0 -0
- /pyreduce-astro-0.4.37/pyreduce/wavecal/uves_blue_437nm_2D.npz → /pyreduce_astro-0.7/pyreduce/instruments/UVES/wavecal_blue_437nm_2D.npz +0 -0
- /pyreduce-astro-0.4.37/pyreduce/wavecal/uves_middle_2x2_2D.npz → /pyreduce_astro-0.7/pyreduce/instruments/UVES/wavecal_middle_2x2_2D.npz +0 -0
- /pyreduce-astro-0.4.37/pyreduce/wavecal/uves_middle_565nm_2D.npz → /pyreduce_astro-0.7/pyreduce/instruments/UVES/wavecal_middle_565nm_2D.npz +0 -0
- /pyreduce-astro-0.4.37/pyreduce/wavecal/uves_middle_580nm_2D.npz → /pyreduce_astro-0.7/pyreduce/instruments/UVES/wavecal_middle_580nm_2D.npz +0 -0
- /pyreduce-astro-0.4.37/pyreduce/wavecal/uves_middle_600nm_2D.npz → /pyreduce_astro-0.7/pyreduce/instruments/UVES/wavecal_middle_600nm_2D.npz +0 -0
- /pyreduce-astro-0.4.37/pyreduce/wavecal/uves_middle_665nm_2D.npz → /pyreduce_astro-0.7/pyreduce/instruments/UVES/wavecal_middle_665nm_2D.npz +0 -0
- /pyreduce-astro-0.4.37/pyreduce/wavecal/uves_middle_860nm_2D.npz → /pyreduce_astro-0.7/pyreduce/instruments/UVES/wavecal_middle_860nm_2D.npz +0 -0
- /pyreduce-astro-0.4.37/pyreduce/wavecal/uves_red_580nm_2D.npz → /pyreduce_astro-0.7/pyreduce/instruments/UVES/wavecal_red_580nm_2D.npz +0 -0
- /pyreduce-astro-0.4.37/pyreduce/wavecal/uves_red_600nm_2D.npz → /pyreduce_astro-0.7/pyreduce/instruments/UVES/wavecal_red_600nm_2D.npz +0 -0
- /pyreduce-astro-0.4.37/pyreduce/wavecal/uves_red_665nm_2D.npz → /pyreduce_astro-0.7/pyreduce/instruments/UVES/wavecal_red_665nm_2D.npz +0 -0
- /pyreduce-astro-0.4.37/pyreduce/wavecal/uves_red_760nm_2D.npz → /pyreduce_astro-0.7/pyreduce/instruments/UVES/wavecal_red_760nm_2D.npz +0 -0
- /pyreduce-astro-0.4.37/pyreduce/wavecal/uves_red_860nm_2D.npz → /pyreduce_astro-0.7/pyreduce/instruments/UVES/wavecal_red_860nm_2D.npz +0 -0
- /pyreduce-astro-0.4.37/pyreduce/wavecal/xshooter_nir.npz → /pyreduce_astro-0.7/pyreduce/instruments/XSHOOTER/wavecal_nir.npz +0 -0
- {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/instruments/__init__.py +0 -0
- {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/tools/__init__.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
pyreduce/_version.py export-subst
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
datasets
|
|
2
|
+
DATA
|
|
3
|
+
__pycache__
|
|
4
|
+
*.sw[op]
|
|
5
|
+
.coverage
|
|
6
|
+
cov.xml
|
|
7
|
+
*.so
|
|
8
|
+
*.o
|
|
9
|
+
pyreduce/clib/_slitfunc_2d.c
|
|
10
|
+
pyreduce/clib/_slitfunc_bd.c
|
|
11
|
+
pyreduce_astro.egg*
|
|
12
|
+
.vscode
|
|
13
|
+
*.py[cod]
|
|
14
|
+
.venv
|
|
15
|
+
.uv
|
|
16
|
+
esorex.log
|
|
17
|
+
pyesorex.log
|
|
18
|
+
test/test_outputs
|
|
19
|
+
docs/_build/
|
|
20
|
+
.claude
|
|
21
|
+
debug/
|
|
22
|
+
idl/
|
|
23
|
+
logs/
|
|
24
|
+
*.ipynb
|
|
25
|
+
tmp/*
|
|
26
|
+
.obsidian/
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
3
|
+
rev: v6.0.0
|
|
4
|
+
hooks:
|
|
5
|
+
# Identify invalid files
|
|
6
|
+
- id: check-ast
|
|
7
|
+
- id: check-yaml
|
|
8
|
+
- id: check-json
|
|
9
|
+
- id: check-toml
|
|
10
|
+
# git checks
|
|
11
|
+
- id: check-merge-conflict
|
|
12
|
+
- id: check-added-large-files
|
|
13
|
+
- id: detect-private-key
|
|
14
|
+
- id: check-case-conflict
|
|
15
|
+
# Python checks
|
|
16
|
+
- id: check-docstring-first
|
|
17
|
+
- id: debug-statements
|
|
18
|
+
# General checks
|
|
19
|
+
- id: mixed-line-ending
|
|
20
|
+
exclude: ".fits"
|
|
21
|
+
- id: trailing-whitespace
|
|
22
|
+
exclude: ".fits"
|
|
23
|
+
- id: end-of-file-fixer
|
|
24
|
+
|
|
25
|
+
# Ruff - Modern Python linter and formatter (replaces isort, black, flake8, pyupgrade)
|
|
26
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
27
|
+
rev: v0.13.2
|
|
28
|
+
hooks:
|
|
29
|
+
# Run the linter
|
|
30
|
+
- id: ruff
|
|
31
|
+
args: [--fix]
|
|
32
|
+
# Run the formatter
|
|
33
|
+
- id: ruff-format
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.14
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# .readthedocs.yaml
|
|
2
|
+
# Read the Docs configuration file
|
|
3
|
+
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
|
|
4
|
+
|
|
5
|
+
# Required
|
|
6
|
+
version: 2
|
|
7
|
+
|
|
8
|
+
# Build documentation in the docs/ directory with Sphinx
|
|
9
|
+
sphinx:
|
|
10
|
+
configuration: docs/conf.py
|
|
11
|
+
|
|
12
|
+
# Optionally build your docs in additional formats such as PDF and ePub
|
|
13
|
+
formats: all
|
|
14
|
+
|
|
15
|
+
# Set the version of Python and install from pyproject.toml
|
|
16
|
+
build:
|
|
17
|
+
os: ubuntu-22.04
|
|
18
|
+
tools:
|
|
19
|
+
python: "3.13"
|
|
20
|
+
|
|
21
|
+
python:
|
|
22
|
+
install:
|
|
23
|
+
- method: pip
|
|
24
|
+
path: .
|
|
25
|
+
- requirements: docs/requirements.txt
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
CLAUDE.md
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# ANDES Instrument Configuration Design
|
|
2
|
+
|
|
3
|
+
## Background
|
|
4
|
+
|
|
5
|
+
### ANDES Instrument Overview
|
|
6
|
+
|
|
7
|
+
ANDES is a future ELT high-resolution spectrograph with multiple spectrographs, each containing multiple arms:
|
|
8
|
+
|
|
9
|
+
| Spectrograph | Arms | Detector Type |
|
|
10
|
+
|--------------|------|---------------|
|
|
11
|
+
| 1 | U, B, V | Optical CCD |
|
|
12
|
+
| 2 | R, IZ | Red optical CCD |
|
|
13
|
+
| 3 | Y, J, H | Near-IR (H2RG or similar) |
|
|
14
|
+
| 4 | K | Thermal IR |
|
|
15
|
+
|
|
16
|
+
Key characteristics:
|
|
17
|
+
- All arms fed from the same fibers on sky
|
|
18
|
+
- Each arm has its own independent detector
|
|
19
|
+
- FITS files organized **per spectrograph** (one file with arms as extensions)
|
|
20
|
+
- Detectors are similar within each spectrograph
|
|
21
|
+
|
|
22
|
+
### Terminology
|
|
23
|
+
|
|
24
|
+
| ANDES term | PyReduce term |
|
|
25
|
+
|------------|---------------|
|
|
26
|
+
| Spectrograph | Instrument |
|
|
27
|
+
| Arm | Channel |
|
|
28
|
+
|
|
29
|
+
### Current State
|
|
30
|
+
|
|
31
|
+
- `ANDES_YJH/` - Working instrument for near-IR spectrograph (Y, J, H arms)
|
|
32
|
+
- Old `ANDES/` directory removed (was empty)
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## PyReduce Architecture Context
|
|
37
|
+
|
|
38
|
+
### How Channels Work
|
|
39
|
+
|
|
40
|
+
Channels in PyReduce handle multi-extension FITS files. The `getter` class in `instruments/common.py` automatically indexes list values by channel position:
|
|
41
|
+
|
|
42
|
+
```yaml
|
|
43
|
+
# Example: UVES with 3 channels
|
|
44
|
+
channels: [BLUE, MIDDLE, RED]
|
|
45
|
+
extension: [0, 2, 1] # BLUE→ext0, MIDDLE→ext2, RED→ext1
|
|
46
|
+
orientation: [2, 1, 1] # BLUE rotated differently
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
When processing channel "RED" (index 2), PyReduce automatically uses `extension[2]=1`, `orientation[2]=1`.
|
|
50
|
+
|
|
51
|
+
### Per-Channel Settings
|
|
52
|
+
|
|
53
|
+
PyReduce supports per-channel settings files. When loading configuration for a channel, it looks for `settings_{channel}.json` first, falling back to `settings.json`.
|
|
54
|
+
|
|
55
|
+
Example from MOSAIC:
|
|
56
|
+
```
|
|
57
|
+
MOSAIC/
|
|
58
|
+
├── settings.json # base: __inherits__: "defaults"
|
|
59
|
+
├── settings_nir.json # __inherits__: "MOSAIC", NIR-specific tuning
|
|
60
|
+
├── settings_VIS1.json # __inherits__: "MOSAIC", VIS1-specific tuning
|
|
61
|
+
└── ...
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
This allows different arms to have different reduction parameters while sharing a single instrument config.
|
|
65
|
+
|
|
66
|
+
### Channel-Based File Filtering
|
|
67
|
+
|
|
68
|
+
Files can be filtered by channel using `kw_channel` and `id_channel`:
|
|
69
|
+
|
|
70
|
+
```yaml
|
|
71
|
+
# From ANDES_YJH config
|
|
72
|
+
kw_channel: BAND
|
|
73
|
+
id_channel: ["^Y$", "^J$", "^H$"]
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
When reducing channel `J`, only files with `BAND=J` header are selected.
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## Design Options
|
|
81
|
+
|
|
82
|
+
### Option A: Single ANDES Instrument (9 channels)
|
|
83
|
+
|
|
84
|
+
```yaml
|
|
85
|
+
# andes/config.yaml
|
|
86
|
+
channels: [U, B, V, R, IZ, Y, J, H, K]
|
|
87
|
+
extension: [1, 2, 3, 1, 2, 1, 2, 3, 1]
|
|
88
|
+
kw_channel: BAND
|
|
89
|
+
id_channel: ["^U$", "^B$", "^V$", "^R$", "^IZ$", "^Y$", "^J$", "^H$", "^K$"]
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
With per-channel settings:
|
|
93
|
+
```
|
|
94
|
+
ANDES/
|
|
95
|
+
├── config.yaml
|
|
96
|
+
├── settings.json # base settings
|
|
97
|
+
├── settings_U.json # optical CCD tuning
|
|
98
|
+
├── settings_B.json
|
|
99
|
+
├── settings_V.json
|
|
100
|
+
├── settings_R.json
|
|
101
|
+
├── settings_IZ.json
|
|
102
|
+
├── settings_Y.json # near-IR tuning
|
|
103
|
+
├── settings_J.json
|
|
104
|
+
├── settings_H.json
|
|
105
|
+
└── settings_K.json # thermal IR tuning
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
| Pros | Cons |
|
|
109
|
+
|------|------|
|
|
110
|
+
| Single instrument, unified management | Larger config directory |
|
|
111
|
+
| Can reduce any/all arms in one command | Requires consistent BAND header across spectrographs |
|
|
112
|
+
| Conceptually cleaner (ANDES is one instrument) | |
|
|
113
|
+
| Per-arm tuning via settings files | |
|
|
114
|
+
|
|
115
|
+
**Requirements**: All ANDES FITS files must have a `BAND` header (or equivalent) identifying the arm.
|
|
116
|
+
|
|
117
|
+
### Option B: Per-Spectrograph Instruments (4 instruments)
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
ANDES_UBV/ channels=[U,B,V] extension=[1,2,3]
|
|
121
|
+
ANDES_RIZ/ channels=[R,IZ] extension=[1,2]
|
|
122
|
+
ANDES_YJH/ channels=[Y,J,H] extension=[1,2,3]
|
|
123
|
+
ANDES_K/ channels=[K] extension=1
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
| Pros | Cons |
|
|
127
|
+
|------|------|
|
|
128
|
+
| Smaller, focused config files | 4 instruments to manage |
|
|
129
|
+
| Natural file separation (each spectrograph = separate FITS) | Cannot reduce "all ANDES" in one command |
|
|
130
|
+
| Independent development per spectrograph | |
|
|
131
|
+
| Already working for ANDES_YJH | |
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Recommendation
|
|
136
|
+
|
|
137
|
+
**Option A (single instrument)** is now viable and cleaner, provided FITS headers are consistent across spectrographs.
|
|
138
|
+
|
|
139
|
+
**Option B (per-spectrograph)** remains a practical alternative if:
|
|
140
|
+
- Different spectrographs have incompatible header conventions
|
|
141
|
+
- Independent development of each spectrograph config is preferred
|
|
142
|
+
- ANDES_YJH is already working and migration isn't worth the effort
|
|
143
|
+
|
|
144
|
+
### For ANDES_YJH Now
|
|
145
|
+
|
|
146
|
+
The current setup works. If Y/J/H need different tuning, add per-channel settings:
|
|
147
|
+
```
|
|
148
|
+
ANDES_YJH/
|
|
149
|
+
├── settings.json # shared base
|
|
150
|
+
├── settings_Y.json # __inherits__: "ANDES_YJH"
|
|
151
|
+
├── settings_J.json
|
|
152
|
+
└── settings_H.json
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Future Migration to Single Instrument
|
|
156
|
+
|
|
157
|
+
When other spectrographs (UBV, RIZ, K) are needed:
|
|
158
|
+
1. Verify all use consistent `BAND` header convention
|
|
159
|
+
2. If yes: create single `ANDES/` instrument with all 9 channels
|
|
160
|
+
3. If no: create additional per-spectrograph instruments (ANDES_UBV, etc.)
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## File Filtering Details
|
|
165
|
+
|
|
166
|
+
For a single ANDES instrument to work, file classification must correctly select files by arm:
|
|
167
|
+
|
|
168
|
+
1. **Channel identification**: `kw_channel: BAND` with `id_channel` patterns
|
|
169
|
+
2. **File type identification**: `kw_flat`, `kw_wave`, etc. must work consistently across spectrographs
|
|
170
|
+
|
|
171
|
+
If spectrographs use different header conventions for file types, separate instruments are cleaner.
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## Summary
|
|
176
|
+
|
|
177
|
+
| Approach | Per-arm tuning | File filtering | Complexity |
|
|
178
|
+
|----------|----------------|----------------|------------|
|
|
179
|
+
| Single ANDES | Via settings_*.json | Via kw_channel/id_channel | One instrument |
|
|
180
|
+
| Per-spectrograph | Via settings_*.json | Natural (separate FITS) | Multiple instruments |
|
|
181
|
+
|
|
182
|
+
Both approaches now support per-arm tuning via per-channel settings files. The choice depends on FITS header consistency and organizational preference.
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
## [0.7] - 2026-01-25
|
|
5
|
+
|
|
6
|
+
First stable release of the 0.7 series!
|
|
7
|
+
|
|
8
|
+
### Changed
|
|
9
|
+
- Rename `OrderTracing` class to `Trace`, save file from `.orders.npz` to `.traces.npz`
|
|
10
|
+
- Store per-trace extraction heights in traces.npz
|
|
11
|
+
- Compute extraction heights for fiber bundles automatically
|
|
12
|
+
- CLI: consistent `-t/--target` option across all commands
|
|
13
|
+
- Allow explicit paths in settings `__inherits__` directive
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
- Limit trace overlay to column_range in science step plot
|
|
17
|
+
|
|
18
|
+
### Documentation
|
|
19
|
+
- Add WhatsNew.md summarizing 0.7 series improvements
|
|
20
|
+
- Update docs for traces.npz rename and mask convention
|
|
21
|
+
|
|
22
|
+
## [0.7b4] - 2026-01-22
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
- Per-channel settings support via `settings_{channel}.json` files
|
|
26
|
+
- Fiber grouping configuration for multi-fiber instruments (bundle_centers, fiber_groups)
|
|
27
|
+
- `preset_slitfunc` parameter for single-pass extraction using pre-computed slit function
|
|
28
|
+
- `noise_relative` parameter for trace threshold scaling
|
|
29
|
+
- `extraction_reject` threshold parameter for outlier rejection
|
|
30
|
+
- ANDES_YJH instrument with multi-channel support
|
|
31
|
+
- MOSAIC VIS quadrant support (VIS1-VIS4 channels) and NIR settings
|
|
32
|
+
- HARPN fiber B wavecal file
|
|
33
|
+
- Extraction residual panel in ProgressPlot
|
|
34
|
+
- `tools/plot_swath_debug.py` for analyzing extraction debug data
|
|
35
|
+
|
|
36
|
+
### Changed
|
|
37
|
+
- **Mask convention**: Switch to numpy convention (True/1=bad) on Python side; C code uses inverted (1=good)
|
|
38
|
+
- Extraction convergence now based on spectrum change with global RMS for rejection
|
|
39
|
+
- Improved outlier rejection using 6*sigma instead of MAD in 2D extraction
|
|
40
|
+
- Norm_flat step saves slit function with metadata for reuse
|
|
41
|
+
- Refactor Pipeline trace API: add `trace_raw()` and `organize()` methods
|
|
42
|
+
- Remove `extraction_cutoff` parameter (dead code)
|
|
43
|
+
|
|
44
|
+
### Fixed
|
|
45
|
+
- `smooth_spectrum` normalization (port from cr2res)
|
|
46
|
+
- Masked array handling in swath debug plotting
|
|
47
|
+
- Minimum 4 iterations enforced in curved extraction
|
|
48
|
+
|
|
49
|
+
## [0.7b3] - 2026-01-11
|
|
50
|
+
|
|
51
|
+
### Added
|
|
52
|
+
- MOSAIC instrument support with fiber group detection and curvature step
|
|
53
|
+
- Extraction animation controls: pause/step buttons and speed control (`PYREDUCE_PLOT_ANIMATION_SPEED`)
|
|
54
|
+
- `--plot-dir` and `--plot-show` CLI options for flexible plot output
|
|
55
|
+
|
|
56
|
+
### Changed
|
|
57
|
+
- Rename `orders` to `traces` in rectify and slit_curve modules for consistency
|
|
58
|
+
- Downgrade extraction max-iterations message from ERROR to WARNING
|
|
59
|
+
- Only warn about missing files for steps that are actually requested
|
|
60
|
+
|
|
61
|
+
### Fixed
|
|
62
|
+
- Handle channel mismatch gracefully in CLI
|
|
63
|
+
- Curvature plotting index error when peaks need int casting
|
|
64
|
+
|
|
65
|
+
## [0.7b2] - 2026-01-09
|
|
66
|
+
|
|
67
|
+
### Changed
|
|
68
|
+
- **Reorganize instrument files**: All instrument-related files now in per-instrument directories
|
|
69
|
+
- `instruments/{name}.py` → `instruments/{NAME}/__init__.py`
|
|
70
|
+
- `instruments/{name}.yaml` → `instruments/{NAME}/config.yaml`
|
|
71
|
+
- `settings/settings_{NAME}.json` → `instruments/{NAME}/settings.json`
|
|
72
|
+
- `wavecal/{name}_*.npz` → `instruments/{NAME}/wavecal_*.npz`
|
|
73
|
+
- `masks/mask_{name}_*.fits.gz` → `instruments/{NAME}/mask_*.fits.gz`
|
|
74
|
+
- Base settings and schema moved to `instruments/defaults/`
|
|
75
|
+
- Wavelength atlas files moved to `instruments/defaults/atlas/`
|
|
76
|
+
|
|
77
|
+
### Removed
|
|
78
|
+
- Orphan mask files for undefined instruments (elodie, sarg, hds, etc.)
|
|
79
|
+
|
|
80
|
+
## [0.7b1] - 2026-01-06
|
|
81
|
+
|
|
82
|
+
### Changed
|
|
83
|
+
- **Curvature algorithm rewrite**: Replace 2D model fitting with row-tracking method for better robustness
|
|
84
|
+
- Rename `make_shear.py` to `slit_curve.py`
|
|
85
|
+
- Rename curvature coefficients: `tilt`/`shear` → `p1`/`p2` throughout codebase
|
|
86
|
+
- Rename `arc_extraction` to `simple_extraction`
|
|
87
|
+
- Split curvature `extraction_height` into separate `extraction_height` and `curve_height` parameters
|
|
88
|
+
- Save file renamed from `.shear.npz` to `.curve.npz`
|
|
89
|
+
|
|
90
|
+
### Added
|
|
91
|
+
- `discover_channels()` for automatic channel detection from data files
|
|
92
|
+
- CLI: `--target` is now optional; loops over all targets if not specified
|
|
93
|
+
- CLI: Uses `$REDUCE_DATA` for base_dir, reads default input_dir from config
|
|
94
|
+
- Comprehensive CLI test coverage
|
|
95
|
+
|
|
96
|
+
### Fixed
|
|
97
|
+
- Curvature step index error when traces are removed during processing
|
|
98
|
+
- Validate base_dir and input_dir exist with clear error messages
|
|
99
|
+
- File sorting to correctly loop over all nights when not specified
|
|
100
|
+
- CLI dynamic dependency loading for step commands
|
|
101
|
+
|
|
102
|
+
## [0.7a7] - 2026-01-04
|
|
103
|
+
|
|
104
|
+
### Added
|
|
105
|
+
- `--settings` option for CLI to override reduction parameters from JSON file
|
|
106
|
+
|
|
107
|
+
### Changed
|
|
108
|
+
- Rename `extraction_width` to `extraction_height` in settings (clarifies coordinate system)
|
|
109
|
+
- Rename `orders` to `traces` in extract.py internal API
|
|
110
|
+
|
|
111
|
+
## [0.7a6] - 2026-01-03
|
|
112
|
+
|
|
113
|
+
### Added
|
|
114
|
+
- `--file` option for CLI step commands to bypass file discovery
|
|
115
|
+
- NEID instrument with multi-amplifier support
|
|
116
|
+
|
|
117
|
+
### Changed
|
|
118
|
+
- Rename `orders` step to `trace` throughout codebase (CLI, API, configs)
|
|
119
|
+
|
|
120
|
+
### Fixed
|
|
121
|
+
- test_normflat to use column_range returned by extract
|
|
122
|
+
|
|
123
|
+
## [0.7a5] - 2025-12-30
|
|
124
|
+
|
|
125
|
+
### Changed
|
|
126
|
+
- Rename `arm` to `channel` throughout codebase (API, CLI, configs)
|
|
127
|
+
- Remove decker from CRIRES+ channel format (`J1228_det1` instead of `J1228_Open_det1`)
|
|
128
|
+
- Example scripts now use `$REDUCE_DATA` env var instead of hardcoded paths
|
|
129
|
+
|
|
130
|
+
## [0.7a4] - 2025-12-23
|
|
131
|
+
|
|
132
|
+
### Added
|
|
133
|
+
- `reduce examples --run` flag to download and execute examples directly
|
|
134
|
+
- PEP 723 inline metadata in examples for `uv run` compatibility
|
|
135
|
+
|
|
136
|
+
## [0.7a3] - 2025-12-23
|
|
137
|
+
|
|
138
|
+
### Added
|
|
139
|
+
- `reduce examples` command to list/download examples from GitHub matching installed version
|
|
140
|
+
|
|
141
|
+
### Changed
|
|
142
|
+
- CLI startup 12x faster via lazy imports (1.2s -> 0.1s)
|
|
143
|
+
|
|
144
|
+
## [0.7a2] - 2025-12-23
|
|
145
|
+
|
|
146
|
+
### Added
|
|
147
|
+
- Manual API calls documentation (manual_calls.md)
|
|
148
|
+
|
|
149
|
+
### Fixed
|
|
150
|
+
- ReadTheDocs build failing due to missing myst_parser
|
|
151
|
+
- Trace module reference in documentation
|
|
152
|
+
|
|
153
|
+
### Changed
|
|
154
|
+
- Docs Makefile now uses uv
|
|
155
|
+
- pyproject.toml cleanup
|
|
156
|
+
|
|
157
|
+
## [0.7a1] - 2025-12-22
|
|
158
|
+
|
|
159
|
+
### Added
|
|
160
|
+
- New Pipeline API with `Pipeline.from_instrument()` for simplified usage
|
|
161
|
+
- Click-based CLI replacing argparse (`uv run reduce run UVES HD132205`)
|
|
162
|
+
- Pydantic models for instrument configuration validation
|
|
163
|
+
- YAML instrument configs replacing JSON
|
|
164
|
+
- IPython startup script for interactive development
|
|
165
|
+
- `plot_dir` option to save plots as PNG files
|
|
166
|
+
- Fiber bundle tracing support for multi-fiber instruments
|
|
167
|
+
- `filter_x` and `filter_type` options for order tracing
|
|
168
|
+
|
|
169
|
+
### Changed
|
|
170
|
+
- Rename `mode` to `channel` terminology throughout
|
|
171
|
+
- Output extension changed from `.ech` to `.fits`
|
|
172
|
+
- Documentation converted from RST to Markdown
|
|
173
|
+
- Trace detection parameters renamed (`opower` -> `degree`, `filter_size` -> `filter_y`)
|
|
174
|
+
|
|
175
|
+
### Fixed
|
|
176
|
+
- Plotting issues with non-finite values
|
|
177
|
+
- Use `interpolate_replace_nans` for masked pixels
|
|
178
|
+
|
|
179
|
+
## [0.6.0] - 2025-12-22
|
|
180
|
+
|
|
181
|
+
### Added
|
|
182
|
+
- JSON schema validation test for instrument configurations
|
|
183
|
+
- GitHub workflow creates GitHub Release on tag push
|
|
184
|
+
|
|
185
|
+
### Fixed
|
|
186
|
+
- Fix test_wavecal to match WavelengthCalibration.execute() signature
|
|
187
|
+
- Fix spec fixture to match ScienceExtraction.run() signature
|
|
188
|
+
- Fix instrument schema: replace invalid 'value' keyword with standard JSON Schema 'type'
|
|
189
|
+
|
|
190
|
+
## [0.6.0b5] - 2025-10-04
|
|
191
|
+
|
|
192
|
+
### Fixed
|
|
193
|
+
- Include *.pyd files for Windows builds
|
|
194
|
+
- Remove redundant build test from workflow
|
|
195
|
+
|
|
196
|
+
## [0.6.0b4] - 2025-10-03
|
|
197
|
+
|
|
198
|
+
### Changed
|
|
199
|
+
- workflow builds multi-arch wheels
|
|
200
|
+
- minor fixes to make build pass
|
|
201
|
+
|
|
202
|
+
## [0.6.0b3] - 2025-10-02
|
|
203
|
+
|
|
204
|
+
### Added
|
|
205
|
+
- Test organization with pytest markers (unit, instrument, slow, downloads)
|
|
206
|
+
- ANDES instrument configuration and settings
|
|
207
|
+
|
|
208
|
+
### Changed
|
|
209
|
+
- CI now runs fast tests (~7s) on every push to master
|
|
210
|
+
- Test suite optimized with slow marker for tests >3s
|
|
211
|
+
|
|
212
|
+
### Fixed
|
|
213
|
+
- ANDES instrument configuration errors (missing decker fields, regex pattern)
|
|
214
|
+
- NIRSPEC FITS header errors with illegal keywords containing dots
|
|
215
|
+
- Pre-commit hooks now documented and working correctly
|
|
216
|
+
|
|
217
|
+
## [0.6.0b2] - 2025-10-02
|
|
218
|
+
|
|
219
|
+
### Changed
|
|
220
|
+
- lazy imports
|
|
221
|
+
- cosmetic fixes like version string
|
|
222
|
+
|
|
223
|
+
## [0.6.0b1] - 2025-10-02
|
|
224
|
+
|
|
225
|
+
### Changed
|
|
226
|
+
- Modern build system using uv package manager
|
|
227
|
+
- Minimum Python version now 3.11, default 3.13
|
|
228
|
+
- Migrated build system from setuptools to Hatchling (PEP 517)
|
|
229
|
+
- Replaced black, isort, flake8, and pyupgrade with Ruff
|
|
230
|
+
- Improved code formatting across entire codebase using Ruff
|
|
231
|
+
- Modernized GitHub Actions workflow (uv-based, Python 3.11-3.13 matrix)
|
|
232
|
+
- Updated documentation to reflect modern installation with uv
|
|
233
|
+
- Consolidated legacy build files (setup.py, requirements.txt) into pyproject.toml
|
|
234
|
+
- Removed automatic PyPI publishing from GitHub Actions (now manual)
|
|
235
|
+
- GitHub Actions tests now manual-only on master branch
|
|
236
|
+
- Modernized ReadTheDocs build configuration
|
|
237
|
+
|
|
238
|
+
### Fixed
|
|
239
|
+
- Close FITS file handles after reading to prevent resource leaks ([#28](https://github.com/ivh/PyReduce/pull/28))
|
|
240
|
+
- Store wavelength calibration in double precision instead of single ([#30](https://github.com/ivh/PyReduce/pull/30))
|
|
241
|
+
- Add fallback value for E_ORIENT header keyword ([#31](https://github.com/ivh/PyReduce/pull/31))
|
|
242
|
+
- Return final wavelength linelist with flags from calibration ([#33](https://github.com/ivh/PyReduce/pull/33))
|
|
243
|
+
- Fix MaskedArray filling in normflat routine
|
|
244
|
+
- Fix undefined TypeFilter import in NEID instrument
|
|
245
|
+
- Fix Sphinx documentation build warnings
|
|
246
|
+
- Fix pre-commit hook configuration issues
|
|
247
|
+
|
|
248
|
+
### Documentation
|
|
249
|
+
- Updated README badges for GitHub Actions and Python versions
|
|
250
|
+
- Updated installation instructions to use uv instead of pip
|
|
251
|
+
- Improved documentation build process
|
|
252
|
+
- CLAUDE.md / AGENTS.md for AI-assisted development guidance
|