pyreduce-astro 0.6.0b5__tar.gz → 0.7a1__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.6.0b5 → pyreduce_astro-0.7a1}/.gitignore +3 -0
- pyreduce_astro-0.7a1/PKG-INFO +114 -0
- pyreduce_astro-0.7a1/README.md +62 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyproject.toml +28 -8
- pyreduce_astro-0.7a1/pyreduce/__main__.py +206 -0
- pyreduce_astro-0.7a1/pyreduce/cli.py +342 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/combine_frames.py +46 -40
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/configuration.py +6 -1
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/continuum_normalization.py +3 -3
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/datasets.py +12 -5
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/estimate_background_scatter.py +2 -1
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/extract.py +2 -1
- pyreduce_astro-0.7a1/pyreduce/instruments/aj.py +9 -0
- pyreduce_astro-0.7a1/pyreduce/instruments/aj.yaml +51 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/instruments/andes.py +17 -17
- pyreduce_astro-0.7a1/pyreduce/instruments/andes.yaml +72 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/instruments/common.py +153 -117
- pyreduce_astro-0.7a1/pyreduce/instruments/common.yaml +57 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/instruments/crires_plus.py +17 -17
- pyreduce_astro-0.7a1/pyreduce/instruments/crires_plus.yaml +101 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/instruments/filters.py +1 -1
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/instruments/harpn.py +19 -17
- pyreduce_astro-0.7a1/pyreduce/instruments/harpn.yaml +140 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/instruments/harps.py +19 -17
- pyreduce_astro-0.7a1/pyreduce/instruments/harps.yaml +144 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/instruments/instrument_info.py +14 -14
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/instruments/jwst_miri.py +4 -4
- pyreduce_astro-0.7a1/pyreduce/instruments/jwst_miri.yaml +53 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/instruments/jwst_niriss.py +8 -8
- pyreduce_astro-0.7a1/pyreduce/instruments/jwst_niriss.yaml +60 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/instruments/lick_apf.py +3 -3
- pyreduce_astro-0.7a1/pyreduce/instruments/lick_apf.yaml +60 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/instruments/mcdonald.py +8 -8
- pyreduce_astro-0.7a1/pyreduce/instruments/mcdonald.yaml +56 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/instruments/metis_ifu.py +7 -7
- pyreduce_astro-0.7a1/pyreduce/instruments/metis_ifu.yaml +62 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/instruments/metis_lss.py +7 -7
- pyreduce_astro-0.7a1/pyreduce/instruments/metis_lss.yaml +62 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/instruments/micado.py +5 -5
- pyreduce_astro-0.7a1/pyreduce/instruments/micado.yaml +62 -0
- pyreduce_astro-0.7a1/pyreduce/instruments/models.py +257 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/instruments/neid.py +19 -17
- pyreduce_astro-0.7a1/pyreduce/instruments/neid.yaml +61 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/instruments/nirspec.py +12 -12
- pyreduce_astro-0.7a1/pyreduce/instruments/nirspec.yaml +63 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/instruments/nte.py +7 -7
- pyreduce_astro-0.7a1/pyreduce/instruments/nte.yaml +55 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/instruments/uves.py +9 -9
- pyreduce_astro-0.7a1/pyreduce/instruments/uves.yaml +65 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/instruments/xshooter.py +6 -6
- pyreduce_astro-0.7a1/pyreduce/instruments/xshooter.yaml +63 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/make_shear.py +3 -2
- pyreduce_astro-0.7a1/pyreduce/pipeline.py +619 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/reduce.py +90 -230
- pyreduce_astro-0.7a1/pyreduce/settings/settings_AJ.json +19 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/settings/settings_ANDES.json +1 -1
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/settings/settings_CRIRES_PLUS.json +1 -1
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/settings/settings_HARPN.json +1 -1
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/settings/settings_HARPS.json +1 -1
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/settings/settings_JWST_MIRI.json +1 -1
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/settings/settings_JWST_NIRISS.json +1 -1
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/settings/settings_LICK_APF.json +2 -2
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/settings/settings_MCDONALD.json +1 -1
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/settings/settings_METIS_IFU.json +1 -1
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/settings/settings_METIS_LSS.json +1 -1
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/settings/settings_MICADO.json +1 -1
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/settings/settings_NEID.json +1 -1
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/settings/settings_NIRSPEC.json +2 -2
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/settings/settings_NTE.json +1 -1
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/settings/settings_UVES.json +1 -1
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/settings/settings_XSHOOTER.json +1 -1
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/settings/settings_pyreduce.json +8 -2
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/settings/settings_schema.json +27 -4
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/tools/combine.py +2 -2
- pyreduce_astro-0.6.0b5/pyreduce/trace_orders.py → pyreduce_astro-0.7a1/pyreduce/trace.py +364 -30
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/util.py +82 -4
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavelength_calibration.py +12 -14
- pyreduce_astro-0.6.0b5/PKG-INFO +0 -113
- pyreduce_astro-0.6.0b5/README.md +0 -66
- pyreduce_astro-0.6.0b5/pyreduce/__main__.py +0 -106
- pyreduce_astro-0.6.0b5/pyreduce/instruments/andes.json +0 -61
- pyreduce_astro-0.6.0b5/pyreduce/instruments/common.json +0 -46
- pyreduce_astro-0.6.0b5/pyreduce/instruments/crires_plus.json +0 -63
- pyreduce_astro-0.6.0b5/pyreduce/instruments/harpn.json +0 -136
- pyreduce_astro-0.6.0b5/pyreduce/instruments/harps.json +0 -155
- pyreduce_astro-0.6.0b5/pyreduce/instruments/instrument_schema.json +0 -221
- pyreduce_astro-0.6.0b5/pyreduce/instruments/jwst_miri.json +0 -53
- pyreduce_astro-0.6.0b5/pyreduce/instruments/jwst_niriss.json +0 -52
- pyreduce_astro-0.6.0b5/pyreduce/instruments/lick_apf.json +0 -53
- pyreduce_astro-0.6.0b5/pyreduce/instruments/mcdonald.json +0 -59
- pyreduce_astro-0.6.0b5/pyreduce/instruments/metis_ifu.json +0 -63
- pyreduce_astro-0.6.0b5/pyreduce/instruments/metis_lss.json +0 -65
- pyreduce_astro-0.6.0b5/pyreduce/instruments/micado.json +0 -53
- pyreduce_astro-0.6.0b5/pyreduce/instruments/neid.json +0 -51
- pyreduce_astro-0.6.0b5/pyreduce/instruments/nirspec.json +0 -56
- pyreduce_astro-0.6.0b5/pyreduce/instruments/nte.json +0 -47
- pyreduce_astro-0.6.0b5/pyreduce/instruments/uves.json +0 -59
- pyreduce_astro-0.6.0b5/pyreduce/instruments/xshooter.json +0 -66
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/LICENSE +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/hatch_build.py +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/__init__.py +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/clib/__init__.py +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/clib/build_extract.py +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/clib/slit_func_2d_xi_zeta_bd.c +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/clib/slit_func_2d_xi_zeta_bd.h +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/clib/slit_func_bd.c +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/clib/slit_func_bd.h +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/clipnflip.py +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/cwrappers.py +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/echelle.py +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/extraction_width.py +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/instruments/__init__.py +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_crires_plus_det1.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_crires_plus_det2.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_crires_plus_det3.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_ctio_chiron.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_elodie.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_feros3.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_flames_giraffe.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_harps_blue.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_harps_red.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_hds_blue.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_hds_red.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_het_hrs_2x5.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_jwst_miri_lrs_slitless.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_jwst_niriss_gr700xd.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_lick_apf_.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_mcdonald.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_nes.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_nirspec_nirspec.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_sarg.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_sarg_2x2a.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_sarg_2x2b.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_subaru_hds_red.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_uves_blue.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_uves_blue_binned_2_2.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_uves_middle.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_uves_middle_2x2_split.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_uves_middle_binned_2_2.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_uves_red.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_uves_red_2x2.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_uves_red_2x2_split.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_uves_red_binned_2_2.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/masks/mask_xshooter_nir.fits.gz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/rectify.py +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/tools/__init__.py +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/MICADO_HK_3arcsec_chip5.npz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/atlas/thar.fits +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/atlas/thar_list.txt +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/atlas/une.fits +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/convert.py +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/crires_plus_J1228_Open_det1.npz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/crires_plus_J1228_Open_det2.npz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/crires_plus_J1228_Open_det3.npz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/harpn_harpn_2D.npz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/harps_blue_2D.npz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/harps_blue_pol_2D.npz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/harps_red_2D.npz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/harps_red_pol_2D.npz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/mcdonald.npz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/metis_lss_l_2D.npz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/metis_lss_m_2D.npz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/nirspec_K2.npz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/uves_blue_360nm_2D.npz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/uves_blue_390nm_2D.npz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/uves_blue_437nm_2D.npz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/uves_middle_2x2_2D.npz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/uves_middle_565nm_2D.npz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/uves_middle_580nm_2D.npz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/uves_middle_600nm_2D.npz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/uves_middle_665nm_2D.npz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/uves_middle_860nm_2D.npz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/uves_red_580nm_2D.npz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/uves_red_600nm_2D.npz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/uves_red_665nm_2D.npz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/uves_red_760nm_2D.npz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/uves_red_860nm_2D.npz +0 -0
- {pyreduce_astro-0.6.0b5 → pyreduce_astro-0.7a1}/pyreduce/wavecal/xshooter_nir.npz +0 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: pyreduce-astro
|
|
3
|
+
Version: 0.7a1
|
|
4
|
+
Summary: A data reduction package for echelle spectrographs
|
|
5
|
+
Project-URL: Homepage, https://github.com/ivh/PyReduce
|
|
6
|
+
Project-URL: Documentation, https://pyreduce-astro.readthedocs.io
|
|
7
|
+
Project-URL: Repository, https://github.com/ivh/PyReduce
|
|
8
|
+
Project-URL: Issues, https://github.com/ivh/PyReduce/issues
|
|
9
|
+
Author: Nikolai Piskunov, Thomas Marquart, Ansgar Wehrhahn
|
|
10
|
+
Maintainer-email: Thomas Marquart <thomas.marquart@astro.uu.se>
|
|
11
|
+
License: GPL-3.0-or-later
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Intended Audience :: Science/Research
|
|
15
|
+
Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
|
|
16
|
+
Classifier: Programming Language :: C
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
22
|
+
Classifier: Topic :: Scientific/Engineering :: Astronomy
|
|
23
|
+
Requires-Python: >=3.11
|
|
24
|
+
Requires-Dist: astropy>=5.3.0
|
|
25
|
+
Requires-Dist: cffi>=1.17.1
|
|
26
|
+
Requires-Dist: click>=8.1.0
|
|
27
|
+
Requires-Dist: colorlog>=6.8.0
|
|
28
|
+
Requires-Dist: corner>=2.2.0
|
|
29
|
+
Requires-Dist: emcee>=3.1.0
|
|
30
|
+
Requires-Dist: joblib>=1.3.0
|
|
31
|
+
Requires-Dist: jsonschema>=4.20.0
|
|
32
|
+
Requires-Dist: matplotlib>=3.8.0
|
|
33
|
+
Requires-Dist: numpy>=1.26.0
|
|
34
|
+
Requires-Dist: pillow>=10.0.0
|
|
35
|
+
Requires-Dist: pydantic>=2.5.0
|
|
36
|
+
Requires-Dist: python-dateutil>=2.8.0
|
|
37
|
+
Requires-Dist: pyyaml>=6.0.0
|
|
38
|
+
Requires-Dist: scikit-image>=0.22.0
|
|
39
|
+
Requires-Dist: scipy>=1.11.0
|
|
40
|
+
Requires-Dist: spectres>=2.2.0
|
|
41
|
+
Requires-Dist: tqdm>=4.66.0
|
|
42
|
+
Requires-Dist: wget>=3.2
|
|
43
|
+
Provides-Extra: dev
|
|
44
|
+
Requires-Dist: myst-parser>=3.0.0; extra == 'dev'
|
|
45
|
+
Requires-Dist: pre-commit>=3.5.0; extra == 'dev'
|
|
46
|
+
Requires-Dist: pytest-cov>=4.1.0; extra == 'dev'
|
|
47
|
+
Requires-Dist: pytest>=7.4.0; extra == 'dev'
|
|
48
|
+
Requires-Dist: ruff>=0.8.0; extra == 'dev'
|
|
49
|
+
Requires-Dist: setuptools; extra == 'dev'
|
|
50
|
+
Requires-Dist: sphinx>=7.2.0; extra == 'dev'
|
|
51
|
+
Description-Content-Type: text/markdown
|
|
52
|
+
|
|
53
|
+
[](https://github.com/ivh/PyReduce/actions/workflows/python-publish.yml)
|
|
54
|
+
[](https://pyreduce-astro.readthedocs.io/en/latest/?badge=latest)
|
|
55
|
+
[](https://www.python.org/downloads/)
|
|
56
|
+
|
|
57
|
+
# PyReduce
|
|
58
|
+
|
|
59
|
+
A data reduction pipeline for echelle spectrographs (HARPS, UVES, XSHOOTER, CRIRES+, JWST/NIRISS, and more).
|
|
60
|
+
|
|
61
|
+
Based on the [REDUCE](http://www.astro.uu.se/~piskunov/RESEARCH/REDUCE/) package. See the papers:
|
|
62
|
+
- Piskunov & Valenti (2001) [doi:10.1051/0004-6361:20020175](https://doi.org/10.1051/0004-6361:20020175)
|
|
63
|
+
- Piskunov, Wehrhahn & Marquart (2021) [doi:10.1051/0004-6361/202038293](https://doi.org/10.1051/0004-6361/202038293)
|
|
64
|
+
|
|
65
|
+
## Installation
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# Using uv (recommended)
|
|
69
|
+
uv add pyreduce-astro
|
|
70
|
+
|
|
71
|
+
# Or pip
|
|
72
|
+
pip install pyreduce-astro
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
For development:
|
|
76
|
+
```bash
|
|
77
|
+
git clone https://github.com/ivh/PyReduce
|
|
78
|
+
cd PyReduce
|
|
79
|
+
uv sync
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Quick Start
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
# Download sample data
|
|
86
|
+
uv run reduce download UVES
|
|
87
|
+
|
|
88
|
+
# Run reduction
|
|
89
|
+
uv run reduce run UVES HD132205 --steps bias,flat,orders,science
|
|
90
|
+
|
|
91
|
+
# Or run individual steps
|
|
92
|
+
uv run reduce bias UVES HD132205
|
|
93
|
+
uv run reduce flat UVES HD132205
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Or use the Python API:
|
|
97
|
+
```python
|
|
98
|
+
from pyreduce.pipeline import Pipeline
|
|
99
|
+
|
|
100
|
+
Pipeline.from_instrument(
|
|
101
|
+
instrument="UVES",
|
|
102
|
+
target="HD132205",
|
|
103
|
+
night="2010-04-01",
|
|
104
|
+
arm="middle",
|
|
105
|
+
).run()
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Documentation
|
|
109
|
+
|
|
110
|
+
Full documentation at [ReadTheDocs](https://pyreduce-astro.readthedocs.io/).
|
|
111
|
+
|
|
112
|
+
## Output
|
|
113
|
+
|
|
114
|
+
PyReduce creates `.ech` files (standard FITS with binary table extension). Headers include original keywords plus PyReduce-specific ones prefixed with `e_`.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
[](https://github.com/ivh/PyReduce/actions/workflows/python-publish.yml)
|
|
2
|
+
[](https://pyreduce-astro.readthedocs.io/en/latest/?badge=latest)
|
|
3
|
+
[](https://www.python.org/downloads/)
|
|
4
|
+
|
|
5
|
+
# PyReduce
|
|
6
|
+
|
|
7
|
+
A data reduction pipeline for echelle spectrographs (HARPS, UVES, XSHOOTER, CRIRES+, JWST/NIRISS, and more).
|
|
8
|
+
|
|
9
|
+
Based on the [REDUCE](http://www.astro.uu.se/~piskunov/RESEARCH/REDUCE/) package. See the papers:
|
|
10
|
+
- Piskunov & Valenti (2001) [doi:10.1051/0004-6361:20020175](https://doi.org/10.1051/0004-6361:20020175)
|
|
11
|
+
- Piskunov, Wehrhahn & Marquart (2021) [doi:10.1051/0004-6361/202038293](https://doi.org/10.1051/0004-6361/202038293)
|
|
12
|
+
|
|
13
|
+
## Installation
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# Using uv (recommended)
|
|
17
|
+
uv add pyreduce-astro
|
|
18
|
+
|
|
19
|
+
# Or pip
|
|
20
|
+
pip install pyreduce-astro
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
For development:
|
|
24
|
+
```bash
|
|
25
|
+
git clone https://github.com/ivh/PyReduce
|
|
26
|
+
cd PyReduce
|
|
27
|
+
uv sync
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Quick Start
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# Download sample data
|
|
34
|
+
uv run reduce download UVES
|
|
35
|
+
|
|
36
|
+
# Run reduction
|
|
37
|
+
uv run reduce run UVES HD132205 --steps bias,flat,orders,science
|
|
38
|
+
|
|
39
|
+
# Or run individual steps
|
|
40
|
+
uv run reduce bias UVES HD132205
|
|
41
|
+
uv run reduce flat UVES HD132205
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Or use the Python API:
|
|
45
|
+
```python
|
|
46
|
+
from pyreduce.pipeline import Pipeline
|
|
47
|
+
|
|
48
|
+
Pipeline.from_instrument(
|
|
49
|
+
instrument="UVES",
|
|
50
|
+
target="HD132205",
|
|
51
|
+
night="2010-04-01",
|
|
52
|
+
arm="middle",
|
|
53
|
+
).run()
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Documentation
|
|
57
|
+
|
|
58
|
+
Full documentation at [ReadTheDocs](https://pyreduce-astro.readthedocs.io/).
|
|
59
|
+
|
|
60
|
+
## Output
|
|
61
|
+
|
|
62
|
+
PyReduce creates `.ech` files (standard FITS with binary table extension). Headers include original keywords plus PyReduce-specific ones prefixed with `e_`.
|
|
@@ -4,15 +4,18 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pyreduce-astro"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.7a1"
|
|
8
8
|
requires-python = ">=3.11"
|
|
9
9
|
description = "A data reduction package for echelle spectrographs"
|
|
10
10
|
readme = "README.md"
|
|
11
11
|
authors = [
|
|
12
|
-
{name = "Thomas Marquart", email = "thomas.marquart@astro.uu.se"},
|
|
13
12
|
{name = "Nikolai Piskunov"},
|
|
13
|
+
{name = "Thomas Marquart"},
|
|
14
14
|
{name = "Ansgar Wehrhahn"}
|
|
15
15
|
]
|
|
16
|
+
maintainers = [
|
|
17
|
+
{name = "Thomas Marquart", email = "thomas.marquart@astro.uu.se"}
|
|
18
|
+
]
|
|
16
19
|
license = {text = "GPL-3.0-or-later"}
|
|
17
20
|
classifiers = [
|
|
18
21
|
"Development Status :: 4 - Beta",
|
|
@@ -23,10 +26,12 @@ classifiers = [
|
|
|
23
26
|
"Programming Language :: Python :: 3.11",
|
|
24
27
|
"Programming Language :: Python :: 3.12",
|
|
25
28
|
"Programming Language :: Python :: 3.13",
|
|
29
|
+
"Programming Language :: Python :: 3.14",
|
|
26
30
|
"Topic :: Scientific/Engineering :: Astronomy",
|
|
27
31
|
]
|
|
28
32
|
|
|
29
33
|
dependencies = [
|
|
34
|
+
"click>=8.1.0",
|
|
30
35
|
"cffi>=1.17.1",
|
|
31
36
|
"numpy>=1.26.0",
|
|
32
37
|
"matplotlib>=3.8.0",
|
|
@@ -37,6 +42,8 @@ dependencies = [
|
|
|
37
42
|
"emcee>=3.1.0",
|
|
38
43
|
"joblib>=1.3.0",
|
|
39
44
|
"jsonschema>=4.20.0",
|
|
45
|
+
"pyyaml>=6.0.0",
|
|
46
|
+
"pydantic>=2.5.0",
|
|
40
47
|
"spectres>=2.2.0",
|
|
41
48
|
"python-dateutil>=2.8.0",
|
|
42
49
|
"scikit-image>=0.22.0",
|
|
@@ -52,6 +59,7 @@ dev = [
|
|
|
52
59
|
"pytest>=7.4.0",
|
|
53
60
|
"pytest-cov>=4.1.0",
|
|
54
61
|
"sphinx>=7.2.0",
|
|
62
|
+
"myst-parser>=3.0.0",
|
|
55
63
|
"setuptools", # Required for CFFI compilation in tests (Python 3.12+)
|
|
56
64
|
]
|
|
57
65
|
|
|
@@ -61,6 +69,9 @@ Documentation = "https://pyreduce-astro.readthedocs.io"
|
|
|
61
69
|
Repository = "https://github.com/ivh/PyReduce"
|
|
62
70
|
Issues = "https://github.com/ivh/PyReduce/issues"
|
|
63
71
|
|
|
72
|
+
[project.scripts]
|
|
73
|
+
reduce = "pyreduce.__main__:main"
|
|
74
|
+
|
|
64
75
|
# Hatch build configuration
|
|
65
76
|
[tool.hatch.build]
|
|
66
77
|
packages = ["pyreduce"]
|
|
@@ -160,6 +171,10 @@ markers = [
|
|
|
160
171
|
"slow: Tests taking >5 seconds",
|
|
161
172
|
"downloads: Tests that download sample datasets",
|
|
162
173
|
]
|
|
174
|
+
filterwarnings = [
|
|
175
|
+
"ignore:The following header keyword is invalid:astropy.utils.exceptions.AstropyUserWarning",
|
|
176
|
+
"ignore:Invalid 'BLANK' keyword:astropy.io.fits.verify.VerifyWarning",
|
|
177
|
+
]
|
|
163
178
|
|
|
164
179
|
# Coverage configuration
|
|
165
180
|
[tool.coverage.run]
|
|
@@ -186,16 +201,21 @@ dev = [
|
|
|
186
201
|
"pytest>=7.4.0",
|
|
187
202
|
"pytest-cov>=4.1.0",
|
|
188
203
|
"sphinx>=7.2.0",
|
|
204
|
+
"ipython>=9.8.0",
|
|
189
205
|
]
|
|
190
206
|
|
|
191
207
|
# cibuildwheel configuration for building platform-specific wheels
|
|
192
208
|
[tool.cibuildwheel]
|
|
193
|
-
|
|
194
|
-
build = "cp311-* cp312-* cp313-*"
|
|
195
|
-
|
|
196
|
-
# Skip musllinux (use manylinux instead) and 32-bit builds
|
|
209
|
+
build = "cp311-* cp312-* cp313-* cp314-*"
|
|
197
210
|
skip = "*-musllinux_* *-win32 *-manylinux_i686"
|
|
198
|
-
|
|
199
|
-
# Test the built wheels
|
|
200
211
|
test-command = "pytest {project}/test -m unit"
|
|
201
212
|
test-requires = ["pytest"]
|
|
213
|
+
|
|
214
|
+
[tool.cibuildwheel.linux]
|
|
215
|
+
archs = ["x86_64"]
|
|
216
|
+
|
|
217
|
+
[tool.cibuildwheel.macos]
|
|
218
|
+
archs = ["arm64"]
|
|
219
|
+
|
|
220
|
+
[tool.cibuildwheel.windows]
|
|
221
|
+
archs = ["AMD64"]
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"""
|
|
2
|
+
PyReduce command-line interface.
|
|
3
|
+
|
|
4
|
+
Usage:
|
|
5
|
+
uv run reduce --help
|
|
6
|
+
uv run reduce run UVES HD132205 --night 2010-04-01
|
|
7
|
+
uv run reduce run UVES HD132205 --steps bias,flat,orders
|
|
8
|
+
uv run reduce bias UVES HD132205
|
|
9
|
+
uv run reduce combine --output combined.fits *.final.fits
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import click
|
|
13
|
+
|
|
14
|
+
from . import datasets
|
|
15
|
+
from .configuration import get_configuration_for_instrument
|
|
16
|
+
from .reduce import main as reduce_main
|
|
17
|
+
from .tools.combine import combine as tools_combine
|
|
18
|
+
|
|
19
|
+
ALL_STEPS = (
|
|
20
|
+
"bias",
|
|
21
|
+
"flat",
|
|
22
|
+
"orders",
|
|
23
|
+
"curvature",
|
|
24
|
+
"scatter",
|
|
25
|
+
"norm_flat",
|
|
26
|
+
"wavecal_master",
|
|
27
|
+
"wavecal_init",
|
|
28
|
+
"wavecal",
|
|
29
|
+
"freq_comb_master",
|
|
30
|
+
"freq_comb",
|
|
31
|
+
"science",
|
|
32
|
+
"continuum",
|
|
33
|
+
"finalize",
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@click.group()
|
|
38
|
+
@click.version_option(package_name="pyreduce-astro")
|
|
39
|
+
def cli():
|
|
40
|
+
"""PyReduce - Echelle spectrograph data reduction pipeline."""
|
|
41
|
+
pass
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@cli.command()
|
|
45
|
+
@click.argument("instrument")
|
|
46
|
+
@click.argument("target")
|
|
47
|
+
@click.option("--night", "-n", default=None, help="Observation night (YYYY-MM-DD)")
|
|
48
|
+
@click.option("--arm", "-a", default=None, help="Instrument arm/detector")
|
|
49
|
+
@click.option(
|
|
50
|
+
"--steps",
|
|
51
|
+
"-s",
|
|
52
|
+
default=None,
|
|
53
|
+
help="Comma-separated steps to run (default: all)",
|
|
54
|
+
)
|
|
55
|
+
@click.option(
|
|
56
|
+
"--base-dir",
|
|
57
|
+
"-b",
|
|
58
|
+
default=None,
|
|
59
|
+
help="Base directory for data (default: $REDUCE_DATA or ~/REDUCE_DATA)",
|
|
60
|
+
)
|
|
61
|
+
@click.option(
|
|
62
|
+
"--input-dir", "-i", default="raw", help="Input directory relative to base"
|
|
63
|
+
)
|
|
64
|
+
@click.option(
|
|
65
|
+
"--output-dir", "-o", default="reduced", help="Output directory relative to base"
|
|
66
|
+
)
|
|
67
|
+
@click.option(
|
|
68
|
+
"--plot", "-p", default=0, help="Plot level (0=none, 1=save, 2=interactive)"
|
|
69
|
+
)
|
|
70
|
+
@click.option(
|
|
71
|
+
"--order-range",
|
|
72
|
+
default=None,
|
|
73
|
+
help="Order range to process (e.g., '1,21')",
|
|
74
|
+
)
|
|
75
|
+
def run(
|
|
76
|
+
instrument,
|
|
77
|
+
target,
|
|
78
|
+
night,
|
|
79
|
+
arm,
|
|
80
|
+
steps,
|
|
81
|
+
base_dir,
|
|
82
|
+
input_dir,
|
|
83
|
+
output_dir,
|
|
84
|
+
plot,
|
|
85
|
+
order_range,
|
|
86
|
+
):
|
|
87
|
+
"""Run the reduction pipeline.
|
|
88
|
+
|
|
89
|
+
INSTRUMENT: Name of the instrument (e.g., UVES, HARPS, XSHOOTER)
|
|
90
|
+
TARGET: Target star name or regex pattern
|
|
91
|
+
"""
|
|
92
|
+
# Parse steps
|
|
93
|
+
if steps:
|
|
94
|
+
steps = tuple(s.strip() for s in steps.split(","))
|
|
95
|
+
else:
|
|
96
|
+
steps = "all"
|
|
97
|
+
|
|
98
|
+
# Parse order range
|
|
99
|
+
if order_range:
|
|
100
|
+
parts = order_range.split(",")
|
|
101
|
+
order_range = (int(parts[0]), int(parts[1]))
|
|
102
|
+
|
|
103
|
+
# Load configuration
|
|
104
|
+
config = get_configuration_for_instrument(instrument)
|
|
105
|
+
|
|
106
|
+
# Run reduction
|
|
107
|
+
reduce_main(
|
|
108
|
+
instrument=instrument,
|
|
109
|
+
target=target,
|
|
110
|
+
night=night,
|
|
111
|
+
arms=arm,
|
|
112
|
+
steps=steps,
|
|
113
|
+
base_dir=base_dir or "",
|
|
114
|
+
input_dir=input_dir,
|
|
115
|
+
output_dir=output_dir,
|
|
116
|
+
configuration=config,
|
|
117
|
+
order_range=order_range,
|
|
118
|
+
plot=plot,
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
@cli.command()
|
|
123
|
+
@click.argument("files", nargs=-1, required=True)
|
|
124
|
+
@click.option("--output", "-o", default="combined.fits", help="Output filename")
|
|
125
|
+
@click.option("--plot", "-p", default=None, type=int, help="Plot specific order")
|
|
126
|
+
def combine(files, output, plot):
|
|
127
|
+
"""Combine multiple reduced spectra.
|
|
128
|
+
|
|
129
|
+
FILES: Input .final.fits files to combine
|
|
130
|
+
"""
|
|
131
|
+
tools_combine(list(files), output, plot=plot)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
@cli.command()
|
|
135
|
+
@click.argument("instrument")
|
|
136
|
+
def download(instrument):
|
|
137
|
+
"""Download sample dataset for an instrument.
|
|
138
|
+
|
|
139
|
+
INSTRUMENT: Name of the instrument (e.g., UVES, HARPS)
|
|
140
|
+
"""
|
|
141
|
+
instrument = instrument.upper()
|
|
142
|
+
dataset_func = getattr(datasets, instrument, None)
|
|
143
|
+
if dataset_func is None:
|
|
144
|
+
available = [
|
|
145
|
+
name
|
|
146
|
+
for name in dir(datasets)
|
|
147
|
+
if name.isupper() and not name.startswith("_")
|
|
148
|
+
]
|
|
149
|
+
raise click.ClickException(
|
|
150
|
+
f"Unknown instrument '{instrument}'. Available: {', '.join(available)}"
|
|
151
|
+
)
|
|
152
|
+
path = dataset_func()
|
|
153
|
+
click.echo(f"Dataset downloaded to: {path}")
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
@cli.command("list-steps")
|
|
157
|
+
def list_steps():
|
|
158
|
+
"""List all available reduction steps."""
|
|
159
|
+
click.echo("Available reduction steps:")
|
|
160
|
+
for step in ALL_STEPS:
|
|
161
|
+
click.echo(f" - {step}")
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def make_step_command(step_name):
|
|
165
|
+
"""Factory to create a command for a single step."""
|
|
166
|
+
|
|
167
|
+
@click.command(name=step_name)
|
|
168
|
+
@click.argument("instrument")
|
|
169
|
+
@click.argument("target")
|
|
170
|
+
@click.option("--night", "-n", default=None, help="Observation night")
|
|
171
|
+
@click.option("--arm", "-a", default=None, help="Instrument arm")
|
|
172
|
+
@click.option("--base-dir", "-b", default=None, help="Base directory")
|
|
173
|
+
@click.option("--input-dir", "-i", default="raw", help="Input directory")
|
|
174
|
+
@click.option("--output-dir", "-o", default="reduced", help="Output directory")
|
|
175
|
+
@click.option("--plot", "-p", default=0, help="Plot level")
|
|
176
|
+
def cmd(instrument, target, night, arm, base_dir, input_dir, output_dir, plot):
|
|
177
|
+
config = get_configuration_for_instrument(instrument)
|
|
178
|
+
reduce_main(
|
|
179
|
+
instrument=instrument,
|
|
180
|
+
target=target,
|
|
181
|
+
night=night,
|
|
182
|
+
arms=arm,
|
|
183
|
+
steps=(step_name,),
|
|
184
|
+
base_dir=base_dir or "",
|
|
185
|
+
input_dir=input_dir,
|
|
186
|
+
output_dir=output_dir,
|
|
187
|
+
configuration=config,
|
|
188
|
+
plot=plot,
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
cmd.__doc__ = f"Run the '{step_name}' step."
|
|
192
|
+
return cmd
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
# Register individual step commands
|
|
196
|
+
for _step in ALL_STEPS:
|
|
197
|
+
cli.add_command(make_step_command(_step))
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def main():
|
|
201
|
+
"""Entry point for the CLI."""
|
|
202
|
+
cli()
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
if __name__ == "__main__":
|
|
206
|
+
main()
|