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.
Files changed (300) hide show
  1. pyreduce_astro-0.7/.gitattributes +1 -0
  2. pyreduce_astro-0.7/.gitignore +26 -0
  3. pyreduce_astro-0.7/.pre-commit-config.yaml +33 -0
  4. pyreduce_astro-0.7/.python-version +1 -0
  5. pyreduce_astro-0.7/.readthedocs.yaml +25 -0
  6. pyreduce_astro-0.7/AGENTS.md +1 -0
  7. pyreduce_astro-0.7/ANDES_plan.md +182 -0
  8. pyreduce_astro-0.7/CHANGELOG.md +252 -0
  9. pyreduce_astro-0.7/CLAUDE.md +356 -0
  10. pyreduce_astro-0.7/PKG-INFO +121 -0
  11. pyreduce_astro-0.7/README.md +80 -0
  12. pyreduce_astro-0.7/WhatsNew.md +78 -0
  13. pyreduce_astro-0.7/examples/andes_yjh_example.py +112 -0
  14. pyreduce_astro-0.7/examples/crires_plus_example.py +52 -0
  15. pyreduce_astro-0.7/examples/custom_instrument_example.py +80 -0
  16. pyreduce_astro-0.7/examples/debug_single_swath.py +233 -0
  17. pyreduce_astro-0.7/examples/harpn_example.py +48 -0
  18. pyreduce_astro-0.7/examples/harps_example.py +51 -0
  19. pyreduce_astro-0.7/examples/harps_gridsearch.py +114 -0
  20. pyreduce_astro-0.7/examples/just_one_swath.py +127 -0
  21. pyreduce_astro-0.7/examples/jwst_miri_example.py +46 -0
  22. pyreduce_astro-0.7/examples/jwst_niriss_example.py +46 -0
  23. pyreduce_astro-0.7/examples/lick_apf_example.py +46 -0
  24. pyreduce_astro-0.7/examples/mcdonald_example.py +57 -0
  25. pyreduce_astro-0.7/examples/metis_ifu_example.py +52 -0
  26. pyreduce_astro-0.7/examples/metis_lss_example.py +52 -0
  27. pyreduce_astro-0.7/examples/micado_example.py +72 -0
  28. pyreduce_astro-0.7/examples/mosaic_nir.py +96 -0
  29. pyreduce_astro-0.7/examples/mosaic_preset-slitfunc.py +141 -0
  30. pyreduce_astro-0.7/examples/mosaic_vis.py +92 -0
  31. pyreduce_astro-0.7/examples/neid_example.py +65 -0
  32. pyreduce_astro-0.7/examples/nirspec_example.py +50 -0
  33. pyreduce_astro-0.7/examples/toes_example.py +163 -0
  34. pyreduce_astro-0.7/examples/uves_callfunc.py +183 -0
  35. pyreduce_astro-0.7/examples/uves_example.py +50 -0
  36. pyreduce_astro-0.7/examples/xshooter_example.py +58 -0
  37. pyreduce_astro-0.7/hatch_build.py +99 -0
  38. pyreduce_astro-0.7/pyproject.toml +214 -0
  39. {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/__init__.py +21 -16
  40. pyreduce_astro-0.7/pyreduce/__main__.py +513 -0
  41. pyreduce_astro-0.7/pyreduce/cli.py +342 -0
  42. pyreduce_astro-0.7/pyreduce/clib/build_extract.py +80 -0
  43. {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/clib/slit_func_2d_xi_zeta_bd.c +193 -125
  44. {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/clib/slit_func_2d_xi_zeta_bd.h +25 -0
  45. {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/clib/slit_func_bd.c +3 -6
  46. {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/clib/slit_func_bd.h +1 -1
  47. {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/clipnflip.py +11 -3
  48. {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/combine_frames.py +340 -94
  49. pyreduce_astro-0.7/pyreduce/configuration.py +292 -0
  50. {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/continuum_normalization.py +10 -7
  51. pyreduce_astro-0.7/pyreduce/cwrappers.py +621 -0
  52. pyreduce_astro-0.7/pyreduce/datasets.py +190 -0
  53. {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/echelle.py +51 -21
  54. {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/estimate_background_scatter.py +34 -32
  55. {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/extract.py +591 -399
  56. pyreduce-astro-0.4.37/pyreduce/extraction_width.py → pyreduce_astro-0.7/pyreduce/extraction_height.py +20 -21
  57. pyreduce_astro-0.7/pyreduce/instruments/ANDES_YJH/__init__.py +14 -0
  58. pyreduce_astro-0.7/pyreduce/instruments/ANDES_YJH/config.yaml +122 -0
  59. pyreduce_astro-0.7/pyreduce/instruments/ANDES_YJH/order_centers_h.yaml +9 -0
  60. pyreduce_astro-0.7/pyreduce/instruments/ANDES_YJH/order_centers_j.yaml +21 -0
  61. pyreduce_astro-0.7/pyreduce/instruments/ANDES_YJH/order_centers_y.yaml +9 -0
  62. pyreduce_astro-0.7/pyreduce/instruments/ANDES_YJH/settings.json +24 -0
  63. pyreduce_astro-0.7/pyreduce/instruments/CRIRES_PLUS/__init__.py +116 -0
  64. pyreduce_astro-0.7/pyreduce/instruments/CRIRES_PLUS/config.yaml +99 -0
  65. pyreduce_astro-0.7/pyreduce/instruments/CRIRES_PLUS/mask_det1.fits.gz +0 -0
  66. pyreduce_astro-0.7/pyreduce/instruments/CRIRES_PLUS/mask_det2.fits.gz +0 -0
  67. pyreduce_astro-0.7/pyreduce/instruments/CRIRES_PLUS/mask_det3.fits.gz +0 -0
  68. pyreduce_astro-0.7/pyreduce/instruments/CRIRES_PLUS/settings.json +92 -0
  69. pyreduce_astro-0.7/pyreduce/instruments/CRIRES_PLUS/wavecal_J1228_det1.npz +0 -0
  70. pyreduce_astro-0.7/pyreduce/instruments/CRIRES_PLUS/wavecal_J1228_det2.npz +0 -0
  71. pyreduce_astro-0.7/pyreduce/instruments/CRIRES_PLUS/wavecal_J1228_det3.npz +0 -0
  72. pyreduce_astro-0.7/pyreduce/instruments/HARPN/__init__.py +203 -0
  73. pyreduce_astro-0.7/pyreduce/instruments/HARPN/config.yaml +140 -0
  74. pyreduce_astro-0.7/pyreduce/instruments/HARPN/settings.json +21 -0
  75. pyreduce_astro-0.7/pyreduce/instruments/HARPN/wavecal_harpn_2D.npz +0 -0
  76. pyreduce_astro-0.7/pyreduce/instruments/HARPN/wavecal_harpn_fibB_2D.npz +0 -0
  77. pyreduce-astro-0.4.37/pyreduce/instruments/harps.py → pyreduce_astro-0.7/pyreduce/instruments/HARPS/__init__.py +51 -34
  78. pyreduce_astro-0.7/pyreduce/instruments/HARPS/config.yaml +144 -0
  79. pyreduce_astro-0.7/pyreduce/instruments/HARPS/mask_blue.fits.gz +0 -0
  80. pyreduce_astro-0.7/pyreduce/instruments/HARPS/mask_red.fits.gz +0 -0
  81. pyreduce-astro-0.4.37/pyreduce/settings/settings_HARPS.json → pyreduce_astro-0.7/pyreduce/instruments/HARPS/settings.json +24 -14
  82. pyreduce_astro-0.7/pyreduce/instruments/JWST_MIRI/__init__.py +29 -0
  83. pyreduce_astro-0.7/pyreduce/instruments/JWST_MIRI/config.yaml +53 -0
  84. 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
  85. pyreduce-astro-0.4.37/pyreduce/settings/settings_JWST_MIRI.json → pyreduce_astro-0.7/pyreduce/instruments/JWST_MIRI/settings.json +25 -13
  86. pyreduce-astro-0.4.37/pyreduce/instruments/jwst_niriss.py → pyreduce_astro-0.7/pyreduce/instruments/JWST_NIRISS/__init__.py +19 -23
  87. pyreduce_astro-0.7/pyreduce/instruments/JWST_NIRISS/config.yaml +60 -0
  88. 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
  89. pyreduce-astro-0.4.37/pyreduce/settings/settings_JWST_NIRISS.json → pyreduce_astro-0.7/pyreduce/instruments/JWST_NIRISS/settings.json +24 -12
  90. pyreduce_astro-0.7/pyreduce/instruments/LICK_APF/__init__.py +34 -0
  91. pyreduce_astro-0.7/pyreduce/instruments/LICK_APF/config.yaml +60 -0
  92. 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
  93. pyreduce-astro-0.4.37/pyreduce/settings/settings_LICK_APF.json → pyreduce_astro-0.7/pyreduce/instruments/LICK_APF/settings.json +35 -23
  94. pyreduce-astro-0.4.37/pyreduce/instruments/mcdonald.py → pyreduce_astro-0.7/pyreduce/instruments/MCDONALD/__init__.py +28 -21
  95. pyreduce_astro-0.7/pyreduce/instruments/MCDONALD/config.yaml +56 -0
  96. pyreduce_astro-0.7/pyreduce/instruments/MCDONALD/mask.fits.gz +0 -0
  97. pyreduce_astro-0.7/pyreduce/instruments/MCDONALD/settings.json +69 -0
  98. pyreduce_astro-0.7/pyreduce/instruments/MCDONALD/wavecal.npz +0 -0
  99. pyreduce_astro-0.7/pyreduce/instruments/METIS_IFU/__init__.py +42 -0
  100. pyreduce_astro-0.7/pyreduce/instruments/METIS_IFU/config.yaml +62 -0
  101. pyreduce_astro-0.7/pyreduce/instruments/METIS_IFU/settings.json +76 -0
  102. pyreduce_astro-0.7/pyreduce/instruments/METIS_LSS/__init__.py +42 -0
  103. pyreduce_astro-0.7/pyreduce/instruments/METIS_LSS/config.yaml +62 -0
  104. pyreduce_astro-0.7/pyreduce/instruments/METIS_LSS/settings.json +4 -0
  105. pyreduce_astro-0.7/pyreduce/instruments/METIS_LSS/wavecal_l_2D.npz +0 -0
  106. pyreduce_astro-0.7/pyreduce/instruments/METIS_LSS/wavecal_m_2D.npz +0 -0
  107. pyreduce_astro-0.7/pyreduce/instruments/MICADO/__init__.py +42 -0
  108. pyreduce_astro-0.7/pyreduce/instruments/MICADO/config.yaml +62 -0
  109. pyreduce_astro-0.7/pyreduce/instruments/MICADO/settings.json +77 -0
  110. pyreduce_astro-0.7/pyreduce/instruments/MICADO/wavecal_HK_3arcsec_chip5.npz +0 -0
  111. pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/__init__.py +38 -0
  112. pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/bundle_centers_nir.yaml +92 -0
  113. pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/bundle_centers_vis1.yaml +69 -0
  114. pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/bundle_centers_vis2.yaml +72 -0
  115. pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/bundle_centers_vis3.yaml +87 -0
  116. pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/bundle_centers_vis4.yaml +87 -0
  117. pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/config.yaml +61 -0
  118. pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/mask_nir.fits.gz +0 -0
  119. pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/mosaic_fiber_positions.npz +0 -0
  120. pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/settings.json +25 -0
  121. pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/settings_VIS1.json +22 -0
  122. pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/settings_VIS2.json +4 -0
  123. pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/settings_VIS3.json +4 -0
  124. pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/settings_VIS4.json +4 -0
  125. pyreduce_astro-0.7/pyreduce/instruments/MOSAIC/settings_nir.json +21 -0
  126. pyreduce_astro-0.7/pyreduce/instruments/NEID/__init__.py +128 -0
  127. pyreduce_astro-0.7/pyreduce/instruments/NEID/config.yaml +60 -0
  128. pyreduce_astro-0.7/pyreduce/instruments/NEID/settings.json +71 -0
  129. pyreduce-astro-0.4.37/pyreduce/instruments/nirspec.py → pyreduce_astro-0.7/pyreduce/instruments/NIRSPEC/__init__.py +37 -38
  130. pyreduce_astro-0.7/pyreduce/instruments/NIRSPEC/config.yaml +63 -0
  131. pyreduce_astro-0.7/pyreduce/instruments/NIRSPEC/mask_nirspec.fits.gz +0 -0
  132. pyreduce-astro-0.4.37/pyreduce/settings/settings_NIRSPEC.json → pyreduce_astro-0.7/pyreduce/instruments/NIRSPEC/settings.json +24 -13
  133. pyreduce_astro-0.7/pyreduce/instruments/NTE/__init__.py +40 -0
  134. pyreduce_astro-0.7/pyreduce/instruments/NTE/config.yaml +55 -0
  135. pyreduce_astro-0.7/pyreduce/instruments/NTE/settings.json +60 -0
  136. pyreduce_astro-0.7/pyreduce/instruments/UVES/__init__.py +43 -0
  137. pyreduce_astro-0.7/pyreduce/instruments/UVES/config.yaml +65 -0
  138. pyreduce_astro-0.7/pyreduce/instruments/UVES/mask_blue.fits.gz +0 -0
  139. pyreduce_astro-0.7/pyreduce/instruments/UVES/mask_blue_binned_2_2.fits.gz +0 -0
  140. pyreduce_astro-0.7/pyreduce/instruments/UVES/mask_middle.fits.gz +0 -0
  141. pyreduce_astro-0.7/pyreduce/instruments/UVES/mask_middle_2x2_split.fits.gz +0 -0
  142. pyreduce_astro-0.7/pyreduce/instruments/UVES/mask_middle_binned_2_2.fits.gz +0 -0
  143. pyreduce_astro-0.7/pyreduce/instruments/UVES/mask_red.fits.gz +0 -0
  144. pyreduce_astro-0.7/pyreduce/instruments/UVES/mask_red_2x2.fits.gz +0 -0
  145. pyreduce_astro-0.7/pyreduce/instruments/UVES/mask_red_2x2_split.fits.gz +0 -0
  146. pyreduce_astro-0.7/pyreduce/instruments/UVES/mask_red_binned_2_2.fits.gz +0 -0
  147. pyreduce-astro-0.4.37/pyreduce/settings/settings_UVES.json → pyreduce_astro-0.7/pyreduce/instruments/UVES/settings.json +23 -13
  148. pyreduce_astro-0.7/pyreduce/instruments/XSHOOTER/__init__.py +37 -0
  149. pyreduce_astro-0.7/pyreduce/instruments/XSHOOTER/config.yaml +63 -0
  150. 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
  151. pyreduce-astro-0.4.37/pyreduce/settings/settings_XSHOOTER.json → pyreduce_astro-0.7/pyreduce/instruments/XSHOOTER/settings.json +31 -21
  152. pyreduce_astro-0.7/pyreduce/instruments/common.py +948 -0
  153. pyreduce_astro-0.7/pyreduce/instruments/defaults/atlas/thar.fits +4946 -13
  154. pyreduce_astro-0.7/pyreduce/instruments/defaults/atlas/thar_list.txt +4172 -0
  155. pyreduce_astro-0.7/pyreduce/instruments/defaults/atlas/une.fits +0 -0
  156. pyreduce_astro-0.7/pyreduce/instruments/defaults/config.yaml +57 -0
  157. pyreduce-astro-0.4.37/pyreduce/settings/settings_schema.json → pyreduce_astro-0.7/pyreduce/instruments/defaults/schema.json +231 -140
  158. pyreduce-astro-0.4.37/pyreduce/settings/settings_pyreduce.json → pyreduce_astro-0.7/pyreduce/instruments/defaults/settings.json +75 -27
  159. {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/instruments/filters.py +40 -14
  160. {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/instruments/instrument_info.py +23 -18
  161. pyreduce_astro-0.7/pyreduce/instruments/models.py +385 -0
  162. pyreduce_astro-0.7/pyreduce/pipeline.py +835 -0
  163. {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/rectify.py +25 -27
  164. pyreduce_astro-0.7/pyreduce/reduce.py +2542 -0
  165. pyreduce_astro-0.7/pyreduce/slit_curve.py +671 -0
  166. {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/tools/combine.py +8 -8
  167. pyreduce_astro-0.7/pyreduce/trace.py +1882 -0
  168. {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/util.py +161 -41
  169. {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/wavelength_calibration.py +601 -216
  170. pyreduce_astro-0.7/tools/argon.line +133 -0
  171. pyreduce_astro-0.7/tools/bpm_creator.py +123 -0
  172. pyreduce_astro-0.7/tools/convert_wavecal.py +38 -0
  173. pyreduce_astro-0.7/tools/create_wavelength_guess.py +530 -0
  174. pyreduce_astro-0.7/tools/download_files.py +84 -0
  175. pyreduce_astro-0.7/tools/ipy_startup.py +19 -0
  176. pyreduce_astro-0.7/tools/make_notebook.py +47 -0
  177. pyreduce_astro-0.7/tools/mosaic_vis_bundle_plot.py +66 -0
  178. pyreduce_astro-0.7/tools/neon.lin +4180 -0
  179. pyreduce_astro-0.7/tools/neon.line +477 -0
  180. pyreduce_astro-0.7/tools/plot_1d_vs_2d_extraction.py +162 -0
  181. pyreduce_astro-0.7/tools/plot_swath_debug.py +64 -0
  182. pyreduce_astro-0.7/tools/pymultispec.py +267 -0
  183. pyreduce_astro-0.7/tools/thar.npz +0 -0
  184. pyreduce_astro-0.7/tools/wavecal_creator.py +28 -0
  185. pyreduce_astro-0.7/tools/wavecal_creator_from_existing.py +103 -0
  186. pyreduce_astro-0.7/tools/xshooter_nir.json +74 -0
  187. pyreduce_astro-0.7/uv.lock +2138 -0
  188. pyreduce-astro-0.4.37/MANIFEST.in +0 -20
  189. pyreduce-astro-0.4.37/PKG-INFO +0 -52
  190. pyreduce-astro-0.4.37/README.md +0 -39
  191. pyreduce-astro-0.4.37/codemeta.json +0 -53
  192. pyreduce-astro-0.4.37/pyreduce/__main__.py +0 -106
  193. pyreduce-astro-0.4.37/pyreduce/_version.py +0 -21
  194. pyreduce-astro-0.4.37/pyreduce/clib/build_extract.py +0 -75
  195. pyreduce-astro-0.4.37/pyreduce/configuration.py +0 -185
  196. pyreduce-astro-0.4.37/pyreduce/cwrappers.py +0 -313
  197. pyreduce-astro-0.4.37/pyreduce/datasets.py +0 -224
  198. pyreduce-astro-0.4.37/pyreduce/instruments/common.json +0 -45
  199. pyreduce-astro-0.4.37/pyreduce/instruments/common.py +0 -647
  200. pyreduce-astro-0.4.37/pyreduce/instruments/crires_plus.json +0 -62
  201. pyreduce-astro-0.4.37/pyreduce/instruments/crires_plus.py +0 -201
  202. pyreduce-astro-0.4.37/pyreduce/instruments/harps.json +0 -82
  203. pyreduce-astro-0.4.37/pyreduce/instruments/instrument_schema.json +0 -221
  204. pyreduce-astro-0.4.37/pyreduce/instruments/jwst_miri.json +0 -53
  205. pyreduce-astro-0.4.37/pyreduce/instruments/jwst_miri.py +0 -36
  206. pyreduce-astro-0.4.37/pyreduce/instruments/jwst_niriss.json +0 -52
  207. pyreduce-astro-0.4.37/pyreduce/instruments/lick_apf.json +0 -53
  208. pyreduce-astro-0.4.37/pyreduce/instruments/lick_apf.py +0 -43
  209. pyreduce-astro-0.4.37/pyreduce/instruments/mcdonald.json +0 -59
  210. pyreduce-astro-0.4.37/pyreduce/instruments/nirspec.json +0 -56
  211. pyreduce-astro-0.4.37/pyreduce/instruments/uves.json +0 -59
  212. pyreduce-astro-0.4.37/pyreduce/instruments/uves.py +0 -43
  213. pyreduce-astro-0.4.37/pyreduce/instruments/xshooter.json +0 -66
  214. pyreduce-astro-0.4.37/pyreduce/instruments/xshooter.py +0 -44
  215. pyreduce-astro-0.4.37/pyreduce/make_shear.py +0 -602
  216. pyreduce-astro-0.4.37/pyreduce/masks/mask_HARPS_blue.fits.gz +0 -0
  217. pyreduce-astro-0.4.37/pyreduce/masks/mask_HARPS_blue_new.fits.gz +0 -0
  218. pyreduce-astro-0.4.37/pyreduce/masks/mask_HARPS_red.fits.gz +0 -0
  219. pyreduce-astro-0.4.37/pyreduce/masks/mask_HARPS_red_new.fits.gz +0 -0
  220. pyreduce-astro-0.4.37/pyreduce/masks/mask_ctio_chiron.fits.gz +0 -0
  221. pyreduce-astro-0.4.37/pyreduce/masks/mask_elodie.fits.gz +0 -0
  222. pyreduce-astro-0.4.37/pyreduce/masks/mask_feros3.fits.gz +0 -0
  223. pyreduce-astro-0.4.37/pyreduce/masks/mask_flames_giraffe.fits.gz +0 -0
  224. pyreduce-astro-0.4.37/pyreduce/masks/mask_harps_blue.fits.gz +0 -0
  225. pyreduce-astro-0.4.37/pyreduce/masks/mask_harps_red.fits.gz +0 -0
  226. pyreduce-astro-0.4.37/pyreduce/masks/mask_hds_blue.fits.gz +0 -0
  227. pyreduce-astro-0.4.37/pyreduce/masks/mask_hds_red.fits.gz +0 -0
  228. pyreduce-astro-0.4.37/pyreduce/masks/mask_het_hrs_2x5.fits.gz +0 -0
  229. pyreduce-astro-0.4.37/pyreduce/masks/mask_nes.fits.gz +0 -0
  230. pyreduce-astro-0.4.37/pyreduce/masks/mask_nirspec_nirspec.fits.gz +0 -0
  231. pyreduce-astro-0.4.37/pyreduce/masks/mask_sarg.fits.gz +0 -0
  232. pyreduce-astro-0.4.37/pyreduce/masks/mask_sarg_2x2a.fits.gz +0 -0
  233. pyreduce-astro-0.4.37/pyreduce/masks/mask_sarg_2x2b.fits.gz +0 -0
  234. pyreduce-astro-0.4.37/pyreduce/masks/mask_subaru_hds_red.fits.gz +0 -0
  235. pyreduce-astro-0.4.37/pyreduce/masks/mask_uves_blue.fits.gz +0 -0
  236. pyreduce-astro-0.4.37/pyreduce/masks/mask_uves_blue_binned_2_2.fits.gz +0 -0
  237. pyreduce-astro-0.4.37/pyreduce/masks/mask_uves_middle.fits.gz +0 -0
  238. pyreduce-astro-0.4.37/pyreduce/masks/mask_uves_middle_2x2_split.fits.gz +0 -0
  239. pyreduce-astro-0.4.37/pyreduce/masks/mask_uves_middle_binned_2_2.fits.gz +0 -0
  240. pyreduce-astro-0.4.37/pyreduce/masks/mask_uves_red.fits.gz +0 -0
  241. pyreduce-astro-0.4.37/pyreduce/masks/mask_uves_red_2x2.fits.gz +0 -0
  242. pyreduce-astro-0.4.37/pyreduce/masks/mask_uves_red_2x2_split.fits.gz +0 -0
  243. pyreduce-astro-0.4.37/pyreduce/masks/mask_uves_red_binned_2_2.fits.gz +0 -0
  244. pyreduce-astro-0.4.37/pyreduce/reduce.py +0 -1933
  245. pyreduce-astro-0.4.37/pyreduce/settings/settings_CRIRES_PLUS.json +0 -56
  246. pyreduce-astro-0.4.37/pyreduce/settings/settings_MCDONALD.json +0 -52
  247. pyreduce-astro-0.4.37/pyreduce/trace_orders.py +0 -604
  248. pyreduce-astro-0.4.37/pyreduce_astro.egg-info/PKG-INFO +0 -52
  249. pyreduce-astro-0.4.37/pyreduce_astro.egg-info/SOURCES.txt +0 -147
  250. pyreduce-astro-0.4.37/pyreduce_astro.egg-info/dependency_links.txt +0 -1
  251. pyreduce-astro-0.4.37/pyreduce_astro.egg-info/requires.txt +0 -11
  252. pyreduce-astro-0.4.37/pyreduce_astro.egg-info/top_level.txt +0 -1
  253. pyreduce-astro-0.4.37/requirements.txt +0 -17
  254. pyreduce-astro-0.4.37/setup.cfg +0 -20
  255. pyreduce-astro-0.4.37/setup.py +0 -77
  256. pyreduce-astro-0.4.37/test/test_bias.py +0 -68
  257. pyreduce-astro-0.4.37/test/test_clib_build.py +0 -5
  258. pyreduce-astro-0.4.37/test/test_clipnflip.py +0 -108
  259. pyreduce-astro-0.4.37/test/test_combine.py +0 -129
  260. pyreduce-astro-0.4.37/test/test_configuration.py +0 -66
  261. pyreduce-astro-0.4.37/test/test_continuum.py +0 -71
  262. pyreduce-astro-0.4.37/test/test_cwrappers.py +0 -115
  263. pyreduce-astro-0.4.37/test/test_echelle.py +0 -185
  264. pyreduce-astro-0.4.37/test/test_extract.py +0 -379
  265. pyreduce-astro-0.4.37/test/test_flat.py +0 -78
  266. pyreduce-astro-0.4.37/test/test_instruments.py +0 -106
  267. pyreduce-astro-0.4.37/test/test_mask.py +0 -23
  268. pyreduce-astro-0.4.37/test/test_normflat.py +0 -51
  269. pyreduce-astro-0.4.37/test/test_orders.py +0 -85
  270. pyreduce-astro-0.4.37/test/test_reduce.py +0 -75
  271. pyreduce-astro-0.4.37/test/test_scatter.py +0 -68
  272. pyreduce-astro-0.4.37/test/test_science.py +0 -75
  273. pyreduce-astro-0.4.37/test/test_shear.py +0 -136
  274. pyreduce-astro-0.4.37/test/test_util.py +0 -5
  275. pyreduce-astro-0.4.37/test/test_wavecal.py +0 -59
  276. pyreduce-astro-0.4.37/versioneer.py +0 -1822
  277. {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/LICENSE +0 -0
  278. {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/clib/__init__.py +0 -0
  279. /pyreduce-astro-0.4.37/pyreduce/wavecal/harps_blue_2D.npz → /pyreduce_astro-0.7/pyreduce/instruments/HARPS/wavecal_blue_2D.npz +0 -0
  280. /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
  281. /pyreduce-astro-0.4.37/pyreduce/wavecal/harps_red_2D.npz → /pyreduce_astro-0.7/pyreduce/instruments/HARPS/wavecal_red_2D.npz +0 -0
  282. /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
  283. /pyreduce-astro-0.4.37/pyreduce/wavecal/nirspec_K2.npz → /pyreduce_astro-0.7/pyreduce/instruments/NIRSPEC/wavecal_K2.npz +0 -0
  284. /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
  285. /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
  286. /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
  287. /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
  288. /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
  289. /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
  290. /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
  291. /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
  292. /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
  293. /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
  294. /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
  295. /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
  296. /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
  297. /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
  298. /pyreduce-astro-0.4.37/pyreduce/wavecal/xshooter_nir.npz → /pyreduce_astro-0.7/pyreduce/instruments/XSHOOTER/wavecal_nir.npz +0 -0
  299. {pyreduce-astro-0.4.37 → pyreduce_astro-0.7}/pyreduce/instruments/__init__.py +0 -0
  300. {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