spectro-kernel 0.1.0__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 (198) hide show
  1. spectro_kernel-0.1.0/.gitignore +223 -0
  2. spectro_kernel-0.1.0/CHANGELOG.md +363 -0
  3. spectro_kernel-0.1.0/LICENSE +21 -0
  4. spectro_kernel-0.1.0/PKG-INFO +229 -0
  5. spectro_kernel-0.1.0/README.md +151 -0
  6. spectro_kernel-0.1.0/docs/concepts/algorithms.md +115 -0
  7. spectro_kernel-0.1.0/docs/concepts/architecture.md +90 -0
  8. spectro_kernel-0.1.0/docs/concepts/data-types.md +116 -0
  9. spectro_kernel-0.1.0/docs/concepts/pipelines.md +108 -0
  10. spectro_kernel-0.1.0/docs/contributing.md +66 -0
  11. spectro_kernel-0.1.0/docs/cookbook/bess-dashboard.md +118 -0
  12. spectro_kernel-0.1.0/docs/cookbook/multi-star-viewer.md +338 -0
  13. spectro_kernel-0.1.0/docs/cookbook/web-playground.md +87 -0
  14. spectro_kernel-0.1.0/docs/gen_catalogue.py +113 -0
  15. spectro_kernel-0.1.0/docs/getting-started.md +117 -0
  16. spectro_kernel-0.1.0/docs/index.md +63 -0
  17. spectro_kernel-0.1.0/docs/notebooks/aurora-line-monitor.md +105 -0
  18. spectro_kernel-0.1.0/docs/notebooks/be-star-variability.md +71 -0
  19. spectro_kernel-0.1.0/docs/notebooks/claude-mcp-end-to-end.md +142 -0
  20. spectro_kernel-0.1.0/docs/notebooks/exoplanet-transit-rv.md +128 -0
  21. spectro_kernel-0.1.0/docs/notebooks/full-reduction-walkthrough.md +163 -0
  22. spectro_kernel-0.1.0/docs/notebooks/native-vs-easyspec-showdown.md +177 -0
  23. spectro_kernel-0.1.0/docs/notebooks/your-first-sb2.md +96 -0
  24. spectro_kernel-0.1.0/docs/reference.md +94 -0
  25. spectro_kernel-0.1.0/docs/tutorials/add-an-algorithm.md +123 -0
  26. spectro_kernel-0.1.0/docs/tutorials/analyse-a-spectrum.md +116 -0
  27. spectro_kernel-0.1.0/docs/tutorials/discover-the-catalogue.md +116 -0
  28. spectro_kernel-0.1.0/docs/tutorials/first-spectrum.md +152 -0
  29. spectro_kernel-0.1.0/docs/usage/cli.md +98 -0
  30. spectro_kernel-0.1.0/docs/usage/library.md +125 -0
  31. spectro_kernel-0.1.0/docs/usage/mcp.md +115 -0
  32. spectro_kernel-0.1.0/docs/why.md +119 -0
  33. spectro_kernel-0.1.0/pyproject.toml +104 -0
  34. spectro_kernel-0.1.0/src/spectro_kernel/__init__.py +89 -0
  35. spectro_kernel-0.1.0/src/spectro_kernel/adapters/__init__.py +8 -0
  36. spectro_kernel-0.1.0/src/spectro_kernel/adapters/easyspec.py +47 -0
  37. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/__init__.py +20 -0
  38. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/_common.py +56 -0
  39. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/advanced/__init__.py +1 -0
  40. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/advanced/aperture_photometry.py +132 -0
  41. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/advanced/disentangle_sb2.py +165 -0
  42. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/catalogs/__init__.py +1 -0
  43. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/catalogs/gaia.py +106 -0
  44. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/catalogs/simbad.py +113 -0
  45. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/catalogs/vizier.py +89 -0
  46. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/continuum/__init__.py +1 -0
  47. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/continuum/compare_normalisations.py +116 -0
  48. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/continuum/normalize_edges.py +59 -0
  49. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/continuum/normalize_max.py +42 -0
  50. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/continuum/normalize_percentile.py +54 -0
  51. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/continuum/normalize_polynomial.py +62 -0
  52. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/continuum/subtract_continuum.py +56 -0
  53. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/corrections/__init__.py +1 -0
  54. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/corrections/air_vacuum.py +90 -0
  55. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/corrections/barycentric.py +118 -0
  56. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/corrections/doppler_shift.py +52 -0
  57. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/corrections/extinction_correct_easyspec.py +140 -0
  58. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/corrections/fit_telluric_scaling.py +150 -0
  59. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/corrections/flux_calibrate_easyspec.py +206 -0
  60. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/corrections/remove_telluric.py +92 -0
  61. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/corrections/synth_telluric.py +125 -0
  62. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/exports/__init__.py +1 -0
  63. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/exports/export_csv.py +56 -0
  64. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/exports/export_fits.py +56 -0
  65. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/exports/export_hdf5.py +73 -0
  66. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/exports/export_votable.py +54 -0
  67. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/extraction/__init__.py +1 -0
  68. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/extraction/easyspec_extract.py +207 -0
  69. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/io/__init__.py +1 -0
  70. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/io/read_ascii.py +42 -0
  71. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/io/read_echelle.py +223 -0
  72. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/io/read_fits.py +40 -0
  73. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/io/read_votable.py +39 -0
  74. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/lines/__init__.py +1 -0
  75. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/lines/_profiles.py +187 -0
  76. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/lines/catalogs.py +77 -0
  77. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/lines/compare_line_fits.py +136 -0
  78. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/lines/detect.py +142 -0
  79. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/lines/equivalent_width.py +84 -0
  80. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/lines/fit_gaussian.py +44 -0
  81. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/lines/fit_lorentzian.py +44 -0
  82. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/lines/fit_voigt.py +45 -0
  83. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/quality/__init__.py +1 -0
  84. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/quality/compare_snr_methods.py +109 -0
  85. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/quality/snr_der.py +52 -0
  86. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/quality/snr_edge.py +65 -0
  87. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/quality/snr_linear_fit.py +55 -0
  88. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/reduction/__init__.py +1 -0
  89. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/reduction/_easyspec_apply.py +93 -0
  90. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/reduction/_easyspec_helpers.py +162 -0
  91. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/reduction/bias_combine.py +64 -0
  92. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/reduction/clip_cosmic_rays.py +86 -0
  93. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/reduction/dark_subtract.py +69 -0
  94. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/reduction/easyspec_bias.py +85 -0
  95. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/reduction/easyspec_cosmic_ray.py +90 -0
  96. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/reduction/easyspec_dark.py +72 -0
  97. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/reduction/easyspec_flat.py +74 -0
  98. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/reduction/easyspec_flat_normalize.py +86 -0
  99. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/reduction/easyspec_subtract_bias.py +81 -0
  100. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/reduction/easyspec_subtract_dark.py +79 -0
  101. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/reduction/extract_spectrum_sum.py +91 -0
  102. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/reduction/flat_normalize.py +69 -0
  103. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/reduction/subtract_sky_2d.py +130 -0
  104. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/reduction/wavelength_calibrate.py +86 -0
  105. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/rv/__init__.py +1 -0
  106. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/rv/cross_correlate.py +131 -0
  107. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/rv/fit_keplerian_orbit.py +202 -0
  108. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/rv/measure.py +85 -0
  109. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/rv/precision_bouchy.py +78 -0
  110. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/smoothing/__init__.py +1 -0
  111. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/smoothing/compare_smoothings.py +98 -0
  112. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/smoothing/smooth_gaussian.py +45 -0
  113. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/smoothing/smooth_savgol.py +62 -0
  114. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/stacking/__init__.py +1 -0
  115. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/stacking/merge_echelle_orders.py +140 -0
  116. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/stacking/stack.py +78 -0
  117. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/timeseries/__init__.py +1 -0
  118. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/timeseries/lomb_scargle.py +124 -0
  119. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/timeseries/phase_fold.py +58 -0
  120. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/transforms/__init__.py +1 -0
  121. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/transforms/clip_sigma.py +76 -0
  122. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/transforms/extract_region.py +41 -0
  123. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/transforms/mask_range.py +54 -0
  124. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/transforms/resample.py +91 -0
  125. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/transforms/resample_flux_conserving.py +123 -0
  126. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/viz/__init__.py +1 -0
  127. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/viz/plot_3d_surface.py +95 -0
  128. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/viz/plot_animation.py +132 -0
  129. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/viz/plot_dynamic_spectrum.py +94 -0
  130. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/viz/plot_plotly.py +129 -0
  131. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/wavelength_calibration/__init__.py +1 -0
  132. spectro_kernel-0.1.0/src/spectro_kernel/algorithms/wavelength_calibration/easyspec_wavelength.py +147 -0
  133. spectro_kernel-0.1.0/src/spectro_kernel/base.py +201 -0
  134. spectro_kernel-0.1.0/src/spectro_kernel/cli.py +339 -0
  135. spectro_kernel-0.1.0/src/spectro_kernel/errors.py +51 -0
  136. spectro_kernel-0.1.0/src/spectro_kernel/io/__init__.py +21 -0
  137. spectro_kernel-0.1.0/src/spectro_kernel/io/ascii.py +124 -0
  138. spectro_kernel-0.1.0/src/spectro_kernel/io/fits.py +225 -0
  139. spectro_kernel-0.1.0/src/spectro_kernel/io/votable.py +81 -0
  140. spectro_kernel-0.1.0/src/spectro_kernel/pipeline.py +306 -0
  141. spectro_kernel-0.1.0/src/spectro_kernel/presets/__init__.py +7 -0
  142. spectro_kernel-0.1.0/src/spectro_kernel/presets/catalog/analysis/balmer_quick.yaml +35 -0
  143. spectro_kernel-0.1.0/src/spectro_kernel/presets/catalog/analysis/quality_report.yaml +24 -0
  144. spectro_kernel-0.1.0/src/spectro_kernel/presets/catalog/analysis/rv_quick.yaml +21 -0
  145. spectro_kernel-0.1.0/src/spectro_kernel/presets/catalog/analysis/snr_check.yaml +21 -0
  146. spectro_kernel-0.1.0/src/spectro_kernel/presets/catalog/analysis/time_series_overview.yaml +27 -0
  147. spectro_kernel-0.1.0/src/spectro_kernel/presets/catalog/reduction/full_reduction_easyspec.yaml +68 -0
  148. spectro_kernel-0.1.0/src/spectro_kernel/presets/loader.py +83 -0
  149. spectro_kernel-0.1.0/src/spectro_kernel/py.typed +0 -0
  150. spectro_kernel-0.1.0/src/spectro_kernel/registry.py +281 -0
  151. spectro_kernel-0.1.0/src/spectro_kernel/types/__init__.py +31 -0
  152. spectro_kernel-0.1.0/src/spectro_kernel/types/catalog.py +54 -0
  153. spectro_kernel-0.1.0/src/spectro_kernel/types/context.py +124 -0
  154. spectro_kernel-0.1.0/src/spectro_kernel/types/enums.py +55 -0
  155. spectro_kernel-0.1.0/src/spectro_kernel/types/history.py +51 -0
  156. spectro_kernel-0.1.0/src/spectro_kernel/types/image.py +62 -0
  157. spectro_kernel-0.1.0/src/spectro_kernel/types/line.py +82 -0
  158. spectro_kernel-0.1.0/src/spectro_kernel/types/spectrum.py +175 -0
  159. spectro_kernel-0.1.0/src/spectro_kernel/types/timeseries.py +96 -0
  160. spectro_kernel-0.1.0/src/spectro_kernel/version.py +3 -0
  161. spectro_kernel-0.1.0/src/spectro_mcp/__init__.py +22 -0
  162. spectro_kernel-0.1.0/src/spectro_mcp/__main__.py +80 -0
  163. spectro_kernel-0.1.0/src/spectro_mcp/auth.py +88 -0
  164. spectro_kernel-0.1.0/src/spectro_mcp/auto_tools.py +341 -0
  165. spectro_kernel-0.1.0/src/spectro_mcp/observability.py +133 -0
  166. spectro_kernel-0.1.0/src/spectro_mcp/py.typed +0 -0
  167. spectro_kernel-0.1.0/src/spectro_mcp/server.py +76 -0
  168. spectro_kernel-0.1.0/src/spectro_mcp/session.py +187 -0
  169. spectro_kernel-0.1.0/tests/conftest.py +66 -0
  170. spectro_kernel-0.1.0/tests/reference/conftest.py +52 -0
  171. spectro_kernel-0.1.0/tests/reference/data/.gitkeep +1 -0
  172. spectro_kernel-0.1.0/tests/reference/data/README.md +57 -0
  173. spectro_kernel-0.1.0/tests/reference/data/sun/sun_reference_stis_002.fits +3 -0
  174. spectro_kernel-0.1.0/tests/reference/data/vega/alpha_lyr_stis_011.fits +3 -0
  175. spectro_kernel-0.1.0/tests/reference/test_known_answers.py +151 -0
  176. spectro_kernel-0.1.0/tests/reference/test_sun.py +63 -0
  177. spectro_kernel-0.1.0/tests/reference/test_vega.py +63 -0
  178. spectro_kernel-0.1.0/tests/unit/test_base.py +57 -0
  179. spectro_kernel-0.1.0/tests/unit/test_cli.py +81 -0
  180. spectro_kernel-0.1.0/tests/unit/test_combine.py +61 -0
  181. spectro_kernel-0.1.0/tests/unit/test_continuum.py +40 -0
  182. spectro_kernel-0.1.0/tests/unit/test_corrections.py +60 -0
  183. spectro_kernel-0.1.0/tests/unit/test_easyspec_wrappers.py +181 -0
  184. spectro_kernel-0.1.0/tests/unit/test_io.py +54 -0
  185. spectro_kernel-0.1.0/tests/unit/test_line_profiles.py +54 -0
  186. spectro_kernel-0.1.0/tests/unit/test_lines.py +50 -0
  187. spectro_kernel-0.1.0/tests/unit/test_mcp.py +105 -0
  188. spectro_kernel-0.1.0/tests/unit/test_mcp_production.py +140 -0
  189. spectro_kernel-0.1.0/tests/unit/test_misc_algorithms.py +124 -0
  190. spectro_kernel-0.1.0/tests/unit/test_pipeline.py +88 -0
  191. spectro_kernel-0.1.0/tests/unit/test_quality.py +38 -0
  192. spectro_kernel-0.1.0/tests/unit/test_registry.py +129 -0
  193. spectro_kernel-0.1.0/tests/unit/test_smoothing.py +41 -0
  194. spectro_kernel-0.1.0/tests/unit/test_timeseries.py +32 -0
  195. spectro_kernel-0.1.0/tests/unit/test_transforms.py +43 -0
  196. spectro_kernel-0.1.0/tests/unit/test_types.py +64 -0
  197. spectro_kernel-0.1.0/tests/unit/test_viz.py +36 -0
  198. spectro_kernel-0.1.0/website/README.md +71 -0
@@ -0,0 +1,223 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[codz]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py.cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ .pybuilder/
76
+ target/
77
+
78
+ # Jupyter Notebook
79
+ .ipynb_checkpoints
80
+
81
+ # IPython
82
+ profile_default/
83
+ ipython_config.py
84
+
85
+ # pyenv
86
+ # For a library or package, you might want to ignore these files since the code is
87
+ # intended to run in multiple environments; otherwise, check them in:
88
+ # .python-version
89
+
90
+ # pipenv
91
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
93
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
94
+ # install all needed dependencies.
95
+ # Pipfile.lock
96
+
97
+ # UV
98
+ # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
99
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
100
+ # commonly ignored for libraries.
101
+ # uv.lock
102
+
103
+ # poetry
104
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
105
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
106
+ # commonly ignored for libraries.
107
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
108
+ # poetry.lock
109
+ # poetry.toml
110
+
111
+ # pdm
112
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
113
+ # pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
114
+ # https://pdm-project.org/en/latest/usage/project/#working-with-version-control
115
+ # pdm.lock
116
+ # pdm.toml
117
+ .pdm-python
118
+ .pdm-build/
119
+
120
+ # pixi
121
+ # Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
122
+ # pixi.lock
123
+ # Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
124
+ # in the .venv directory. It is recommended not to include this directory in version control.
125
+ .pixi
126
+
127
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
128
+ __pypackages__/
129
+
130
+ # Celery stuff
131
+ celerybeat-schedule
132
+ celerybeat.pid
133
+
134
+ # Redis
135
+ *.rdb
136
+ *.aof
137
+ *.pid
138
+
139
+ # RabbitMQ
140
+ mnesia/
141
+ rabbitmq/
142
+ rabbitmq-data/
143
+
144
+ # ActiveMQ
145
+ activemq-data/
146
+
147
+ # SageMath parsed files
148
+ *.sage.py
149
+
150
+ # Environments
151
+ .env
152
+ .envrc
153
+ .venv
154
+ env/
155
+ venv/
156
+ ENV/
157
+ env.bak/
158
+ venv.bak/
159
+
160
+ # Spyder project settings
161
+ .spyderproject
162
+ .spyproject
163
+
164
+ # Rope project settings
165
+ .ropeproject
166
+
167
+ # mkdocs documentation
168
+ /site
169
+
170
+ # mypy
171
+ .mypy_cache/
172
+ .dmypy.json
173
+ dmypy.json
174
+
175
+ # Pyre type checker
176
+ .pyre/
177
+
178
+ # pytype static type analyzer
179
+ .pytype/
180
+
181
+ # Cython debug symbols
182
+ cython_debug/
183
+
184
+ # PyCharm
185
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
186
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
187
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
188
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
189
+ # .idea/
190
+
191
+ # Abstra
192
+ # Abstra is an AI-powered process automation framework.
193
+ # Ignore directories containing user credentials, local state, and settings.
194
+ # Learn more at https://abstra.io/docs
195
+ .abstra/
196
+
197
+ # Visual Studio Code
198
+ # Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
199
+ # that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
200
+ # and can be added to the global gitignore or merged into this file. However, if you prefer,
201
+ # you could uncomment the following to ignore the entire vscode folder
202
+ # .vscode/
203
+ # Temporary file for partial code execution
204
+ tempCodeRunnerFile.py
205
+
206
+ # Ruff stuff:
207
+ .ruff_cache/
208
+
209
+ # PyPI configuration file
210
+ .pypirc
211
+
212
+ # Marimo
213
+ marimo/_static/
214
+ marimo/_lsp/
215
+ __marimo__/
216
+
217
+ # Streamlit
218
+ .streamlit/secrets.toml
219
+
220
+ # Local-only working docs (deployment runbooks, internal design notes).
221
+ # These are kept on disk for the maintainer but never committed: not on
222
+ # GitHub, not in the PyPI sdist, not on the docs site.
223
+ stuff/
@@ -0,0 +1,363 @@
1
+ # Changelog
2
+
3
+ All notable changes to `spectro-kernel` are documented here. Format follows
4
+ [Keep a Changelog](https://keepachangelog.com/); the project follows Semantic Versioning.
5
+ Until `1.0.0` the public API may change between minor versions.
6
+
7
+ ## [Unreleased]
8
+
9
+ ### Changed — keep deployment runbooks + internal design notes out of the public artefacts
10
+
11
+ - Moved `SPECTRO_KERNEL_IMPLEMENTATION.md`, `SPECTRO_PLATFORM_PROPOSAL.md`,
12
+ and the four deployment cookbook entries (`deploy-overview.md`,
13
+ `deploy-do.md`, `deploy-netlify.md`, `publish-pypi.md`) out of the
14
+ tracked tree into a local-only `stuff/` directory (gitignored).
15
+ - Effect: these documents stay on the maintainer's disk for reference but
16
+ no longer ship in the PyPI sdist, no longer appear on the docs site,
17
+ and are not visible to anyone who clones the repository.
18
+ - The `mkdocs.yml` nav and a handful of cross-references in
19
+ README/docs/ROADMAP were updated to drop the now-broken links.
20
+
21
+ ### Added — twelfth pass (algorithm source inspection)
22
+
23
+ - **Wrapper-source audit** — every catalogue entry can now be inspected
24
+ from the outside:
25
+ - Python: `spectro_kernel.registry.get_algorithm_source(name)` returns
26
+ `{name, class_name, module, path, repo_relative_path, github_url,
27
+ backend, source}` — the wrapper's class, its file on disk, a GitHub
28
+ permalink, and the file contents as a string.
29
+ - CLI: `spectro source <name>` prints the source with a header
30
+ pointing at the local path and the GitHub URL; add `--url-only` to
31
+ print just the link, or `--json` for the structured payload.
32
+ - MCP: a new `get_algorithm_source` transverse tool returns the same
33
+ JSON, so an agent can fetch and reason about the wrapper code it is
34
+ about to call.
35
+ - Use case: when a wrapper delegates to an external library
36
+ (``backend = "easyspec" / "astropy" / "scipy"``), the user can quickly
37
+ confirm what the glue does and where to read the upstream code.
38
+ - 4 new unit tests (registry + CLI), suite size 115 → 119.
39
+
40
+ ### Added — eleventh pass (Tier B: DAG pipelines, échelle, sky subtraction, Keplerian, telluric fit, MCP uploads)
41
+
42
+ - **DAG pipelines.** `PipelineStep.depends_on: list[str]` opt-in; when any
43
+ step declares dependencies the pipeline is executed in topological order
44
+ (Kahn's algorithm) instead of the declared sequence. Cycles and unknown
45
+ labels error at build time. Existing presets are untouched — no
46
+ `depends_on`, no behaviour change. `PipelineBuilder.add(..., depends_on=[…])`
47
+ and the YAML `depends_on:` field both supported.
48
+ - **Échelle support — two new algorithms.**
49
+ - `read_echelle_fits` (`io`, backend `astropy`): handles multi-extension
50
+ `BinTableHDU` files and 2D images with per-order WCS; populates
51
+ `ctx.spectra` (sorted by central wavelength).
52
+ - `merge_echelle_orders` (`stacking`, backend `numpy`): resamples orders
53
+ onto a common log-λ grid, averages overlaps with inverse-variance
54
+ weighting (falls back to plain mean when uncertainties are absent),
55
+ leaves inter-order gaps as `NaN`. Three weighting modes:
56
+ `uncertainty` / `mean` / `first`.
57
+ - **`subtract_sky_2d`** (`preprocessing`, backend `numpy`): long-slit sky
58
+ subtraction — per-column polynomial fit through off-trace rows, default
59
+ order 1. Stores median sky level in metrics.
60
+ - **`fit_keplerian_orbit`** (`radial_velocity`, backend `scipy`):
61
+ single-companion Keplerian fit `(P, K, e, ω, T₀, γ)` with bounded
62
+ least-squares. Auto-detects an initial period via `astropy.LombScargle`
63
+ when the user does not provide one. Outputs full element set + RMS
64
+ residual + χ² in `ctx.extras['keplerian_orbit']`.
65
+ - **`fit_telluric_scaling`** (`correction`, backend `scipy`): given a
66
+ template transmission spectrum (from `synth_telluric` or supplied
67
+ directly) and an observed spectrum, fits the Beer-Lambert airmass
68
+ exponent that best removes the telluric bands. Restricts the residual
69
+ to pixels inside the bands (default threshold T < 0.9). Chain into
70
+ `remove_telluric_division` to apply.
71
+ - **MCP file upload tools.** Two new transverse MCP tools:
72
+ - `request_upload_url(session_id, filename, content_type)` returns a
73
+ pre-signed PUT URL plus a matching GET URL. Configured via env vars
74
+ `SPECTRO_MCP_S3_BUCKET` (required), `SPECTRO_MCP_S3_ENDPOINT` (DO
75
+ Spaces / MinIO), `SPECTRO_MCP_S3_REGION`, `SPECTRO_MCP_S3_PREFIX`,
76
+ `SPECTRO_MCP_S3_URL_TTL`. Gracefully reports a clear error if the
77
+ server is not configured or `boto3` is missing.
78
+ - `load_spectrum_from_url(session_id, url, format_hint)` downloads the
79
+ file (256 MiB cap) and loads it as the session's working spectrum.
80
+ The downloaded file is removed after loading.
81
+ - **Tests.** 7 new unit tests covering: DAG topological order, DAG cycle
82
+ detection, DAG unknown-label rejection, échelle overlap averaging,
83
+ telluric airmass recovery on a synthetic injection, 2D sky subtraction
84
+ zero-ing the background, Keplerian RV recovery on a synthetic orbit.
85
+ Suite size 108 → 115 tests, all green; ruff clean; `mkdocs build
86
+ --strict` clean.
87
+
88
+ ### Added — tenth pass (Dependabot fix, Sun fixture, Netlify guide, 2 last notebooks)
89
+
90
+ - **Dependabot alerts cleared.** Bumped Vite 5 → 6.3.6 in
91
+ `website/package.json` — kills the moderate `esbuild` advisory
92
+ (GHSA-67mh-4wv8-2f99) without breaking the build. `npm audit` clean,
93
+ `pip-audit` clean.
94
+ - **Second LFS fixture — CALSPEC Sun** (`sun_reference_stis_002.fits`,
95
+ ~37 KB) committed to `tests/reference/data/sun/`. New `sun_fits_path`
96
+ fixture in `tests/reference/conftest.py` and a `test_sun.py` module that
97
+ verifies loading, SNR, Na D detection and a H-alpha fit on real data.
98
+ - **Step-by-step deployment guides — polished**:
99
+ - `docs/cookbook/deploy-do.md` — now reflects the production hardening
100
+ that landed in Tier 1 (env vars `SPECTRO_MCP_API_KEY`,
101
+ `SPECTRO_MCP_RATE_PER_MINUTE`, `SPECTRO_MCP_REDIS_URL`, `SENTRY_DSN`)
102
+ instead of describing them as future work.
103
+ - `docs/cookbook/deploy-netlify.md` (new) — full Netlify walkthrough for
104
+ the React + Vite website (UI path + CLI path), custom domain, continuous
105
+ deploy, costs, plus how to wire the playground to your DO MCP across
106
+ origins.
107
+ - **Tier 3 notebooks — completed**:
108
+ - *Native vs EasySpec showdown* — same operations through both backends
109
+ on the same bytes, tied to `compare_*` helpers; spells out when each
110
+ side wins.
111
+ - *Claude + spectro-kernel end-to-end* — Claude Desktop config, the first
112
+ conversation, the tools that get called under the hood, what works and
113
+ what doesn't (browser FITS upload, long jobs, image rendering).
114
+
115
+ Counts: 70 algorithms across 22 categories; 6 presets; 7 notebooks;
116
+ 121 tests passing + 4 new on-Sun reference tests (1 skipped without Redis);
117
+ ruff clean; mkdocs --strict clean; 2 LFS fixtures pushed.
118
+
119
+ ### Added — ninth pass (3 comparators, 2 notebooks, real LFS fixture)
120
+
121
+ - **3 shelf comparators**:
122
+ - `compare_snr_methods` (quality) — runs `snr_der` + `snr_edge` +
123
+ `snr_linear_fit` on the same spectrum; the spread is recorded as a
124
+ metric so big disagreement flags a noisy or contaminated input.
125
+ - `compare_smoothings` (smoothing) — runs `smooth_savgol` + `smooth_gaussian`
126
+ side by side, stashes each output in `ctx.extras['smoothings']` plus
127
+ pairwise RMS.
128
+ - `compare_line_fits` (line_fitting) — fits one line with Gaussian /
129
+ Lorentzian / Voigt; reports R² of each and the best profile by R².
130
+ - **2 new notebooks** in `docs/notebooks/`:
131
+ - *Aurora line monitor* — five short exposures, detect aurorae lines, fit
132
+ the [O I] 5577 green-line amplitude, render the `time_series_overview`
133
+ preset.
134
+ - *Exoplanet transit RV* — synthesise a Rossiter-McLaughlin signal,
135
+ recover with `cross_correlate_rv`, fit a sine, compare with the truth.
136
+ - **First LFS-tracked fixture** — CALSPEC Vega FITS (~280 KB) lands under
137
+ `tests/reference/data/vega/alpha_lyr_stis_011.fits` via the `.gitattributes`
138
+ patterns. `tests/reference/conftest.py` now prefers the local file and falls
139
+ back to the Astropy on-the-fly download when it is missing or replaced by an
140
+ LFS pointer.
141
+ - `BENCHMARKS.md` regenerated with Vega rows alongside the synthetic ones.
142
+
143
+ Counts: 70 algorithms across 22 categories; 6 presets; 4 comparators on the
144
+ guided shelf; 121 tests passing (1 skipped without Redis); ruff clean;
145
+ mkdocs --strict clean.
146
+
147
+ ### Added — eighth pass (flux calibration, full-reduction preset, LFS, benchmarks, playground)
148
+
149
+ EasySpec shelf is now end-to-end (raw FITS → flux-calibrated 1D), and the
150
+ roadmap's Tier 3 polish items land:
151
+
152
+ - `flux_calibrate_easyspec` (flux_calibration) — wraps
153
+ ``std_star_normalization`` + ``target_flux_calibration``. Final step of an
154
+ easyspec reduction; turns ADU/s into erg/s/cm²/Å using a bundled standard-star
155
+ archive (calspec, oke1990, …).
156
+ - `full_reduction_easyspec` preset — template YAML chaining the 8 EasySpec
157
+ steps that need fixed inputs (combines, applies, CR, extract). User patches
158
+ `__REPLACE__` placeholders with their runtime paths before calling
159
+ `PipelineBuilder.from_config()`. Wavelength + extinction + flux calibration
160
+ stay separate (per-observation metadata).
161
+ - New notebook **Full reduction walkthrough** — every step of the chain in one
162
+ page.
163
+ - **Git LFS scaffold** — `.gitattributes` pinning `tests/reference/data/**/*.fits`
164
+ (and friends) to LFS, plus `tests/reference/data/README.md` documenting the
165
+ contributor / consumer workflow. Reference tests fall back to Astropy's
166
+ on-the-fly download when LFS fixtures are absent.
167
+ - **`scripts/bench.py`** + first `BENCHMARKS.md` — per-algorithm median timing
168
+ on a synthetic spectrum (and optional CALSPEC Vega). Useful for catching
169
+ performance regressions across versions.
170
+ - **Web playground** — `website/playground/index.html`, a no-build HTML page
171
+ that talks JSON-RPC to a `spectro-mcp` server (check `/health`, load a
172
+ spectrum by path, chain algorithms, see JSON output). Documented in
173
+ `docs/cookbook/web-playground.md`.
174
+
175
+ Counts: 67 algorithms across 22 categories; 6 presets; 121 tests passing
176
+ (1 skipped without Redis); ruff clean; mkdocs --strict clean.
177
+
178
+ ### Added — seventh pass (EasySpec extraction chain — raw FITS → flux-corrected 1D)
179
+
180
+ The shelf now spans the full CCD-to-1D-spectrum chain end-to-end:
181
+
182
+ - `extract_spectrum_easyspec` (extraction) — wraps
183
+ ``import_data`` + ``tracing`` + ``extracting`` into one call. Gaussian-weighted
184
+ aperture extraction with Monte-Carlo error estimation; the result is a 1D
185
+ Spectrum1D on a pixel-index axis, ready for wavelength calibration.
186
+ - `wavelength_calibrate_easyspec` (wavelength_calibration) — fits a polynomial
187
+ from user-supplied lamp-peak identifications and applies it to
188
+ ``ctx.spectrum.wavelength``. easyspec's diagnostic path is called when
189
+ possible; the numpy.polyfit fallback guarantees the wrapper works in isolation.
190
+ - `extinction_correct_easyspec` (correction) — applies easyspec's bundled
191
+ atmospheric extinction curves (lapalma, kpno, paranal, …) to ``ctx.spectrum``.
192
+ Wavelengths are wrapped as astropy Quantities to match easyspec's expectations.
193
+
194
+ New ``algorithms/wavelength_calibration/`` and ``algorithms/extraction/``
195
+ sub-packages with their ``__init__.py``.
196
+
197
+ Counts: 66 algorithms across 21 categories; 11 EasySpec wrappers in total
198
+ (masters · applies · extraction · wavelength · extinction); 121 tests passing
199
+ (1 skipped without Redis); ruff clean; mkdocs --strict clean.
200
+
201
+ ### Added — sixth pass (EasySpec apply wrappers complete the reduction shelf)
202
+
203
+ The four image-level apply operations join the EasySpec shelf, completing the
204
+ roadmap "EasySpec wrappers" item end-to-end. Same patterns as the combine
205
+ wrappers (paths or in-memory ImageFrames, temp-dir staging, headless plotting,
206
+ silenced stdout); each one is a thin shim over the helper.
207
+
208
+ - `subtract_bias_easyspec` (preprocessing) — wraps ``cleaning.debias``.
209
+ - `subtract_dark_easyspec` (preprocessing) — wraps ``cleaning.sub_dark``.
210
+ - `flat_normalize_easyspec` (preprocessing) — wraps ``cleaning.flatten``;
211
+ auto-normalises the input flat by its median unless told otherwise.
212
+ - `cosmic_ray_remove_easyspec` (cosmic_ray) — wraps
213
+ ``cleaning.CR_and_gain_corrections``; gain/read-noise from FITS header or
214
+ explicit parameters.
215
+
216
+ Plus `reduction/_easyspec_apply.py` factoring stage-target / resolve-master /
217
+ result-unpacking, so each wrapper file stays ~50 lines.
218
+
219
+ Counts: 63 algorithms across 21 categories; 118 tests passing (1 skipped
220
+ without Redis); ruff clean.
221
+
222
+ ### Added — fifth pass (Tier 2 underway: telluric, presets, comparator, notebooks)
223
+
224
+ - `synth_telluric` (corrections): synthesise a transmission template from the
225
+ dominant H₂O / O₂ bands, with Beer-Lambert airmass scaling. Pairs with
226
+ `remove_telluric_division`.
227
+ - `compare_normalisations` (continuum, meta-algorithm): run every
228
+ `normalize_*` variant on the same spectrum, store each result in
229
+ `ctx.extras['normalisations']`, and compute pairwise RMS — turns the "shelf"
230
+ choice into a guided one.
231
+ - 3 new pipeline presets in `presets/catalog/analysis/`:
232
+ - `rv_quick` — normalise + measure H-alpha radial velocity.
233
+ - `quality_report` — all three SNR estimators (DER, edge, linear-fit).
234
+ - `time_series_overview` — stack + dynamic spectrum + 3D surface + animation.
235
+ - 2 notebook-style tutorials in `docs/notebooks/`:
236
+ - *Be-star variability* — synthesise multi-night H-alpha, run the
237
+ `time_series_overview` preset, inspect variability metrics.
238
+ - *Your first SB2* — synthesise a 6-epoch SB2, recover both components with
239
+ `disentangle_sb2`.
240
+
241
+ Counts: 59 algorithms across 21 categories; 5 presets; 114 tests passing
242
+ (1 skipped without Redis); ruff clean; mkdocs `--strict` clean.
243
+
244
+ ### Added — fourth pass (Tier 1 complete: reference tests, production MCP, EasySpec shelf)
245
+
246
+ Closes the three Tier-1 items in `ROADMAP.md`:
247
+
248
+ - **Reference scientific tests** — new `tests/reference/` directory with a
249
+ CALSPEC Vega download/cache fixture and acceptance tests that verify
250
+ `read_fits`, `snr_der`, continuum-normalised fitting and H-alpha detection
251
+ work on the canonical A0V standard. Auto-skip without network.
252
+ - **Production-grade MCP** — the API-key middleware (`SPECTRO_MCP_API_KEY`),
253
+ sliding-window rate limit (`SPECTRO_MCP_RATE_PER_MINUTE`) and Redis-backed
254
+ session storage (`SPECTRO_MCP_REDIS_URL`) were already implemented; now
255
+ covered by tests (`test_mcp_production.py`) including a Redis-backend
256
+ lifecycle test that auto-skips when no Redis is reachable.
257
+ - **EasySpec shelf, expanded** — extracted a shared helper
258
+ (`reduction/_easyspec_helpers.py`) that handles temp-directory staging,
259
+ headless matplotlib, and silenced stdout. `bias_combine_easyspec`
260
+ refactored onto it; added `dark_combine_easyspec` and
261
+ `flat_combine_easyspec`. End-to-end tests on synthetic FITS files.
262
+
263
+ Counts: 57 algorithms across 21 categories; 113 tests passing (1 skipped
264
+ without Redis); ruff clean.
265
+
266
+ ### Added — third pass (55 algorithms, 21 categories)
267
+
268
+ - **5 more algorithms** rounding out the table:
269
+ - `plot_3d_surface_plotly`: 3D surface of stacked spectra (Plotly).
270
+ - `plot_animation_plotly`: animated Plotly figure that plays through `ctx.spectra`.
271
+ - `disentangle_sb2`: iterative wavelength-domain disentangling of an SB2 binary,
272
+ on a log-wavelength grid (Simon & Sturm 1994 spirit).
273
+ - `aperture_photometry`: differential aperture photometry on a 2D image, with
274
+ sky-annulus background subtraction (photutils).
275
+ - `bias_combine_easyspec`: first concrete EasySpec shelf wrapper — same operation
276
+ as the native `bias_combine`, routed through `easyspec.cleaning.master`.
277
+ - `algorithms/advanced/` category populated (`disentangle_sb2`,
278
+ `aperture_photometry`).
279
+ - `pyproject.toml`: `reduction` extra now also brings `photutils` for image-mode
280
+ algorithms.
281
+
282
+ ### Added — second pass (50 algorithms, 20 categories, cloud-ready MCP)
283
+
284
+ - **14 new algorithms** raising the catalogue from 36 to 50 across 20 categories:
285
+ - I/O & export: `export_hdf5` (h5py).
286
+ - Resampling: `resample_flux_conserving` (specutils wrapper).
287
+ - Time-series viz: `plot_dynamic_spectrum` (Plotly heatmap of stacked spectra).
288
+ - Catalogues: `vizier_query`, `gaia_query` (astroquery).
289
+ - Radial velocity: `cross_correlate_rv` (scipy.signal cross-correlation in log-λ space),
290
+ `rv_precision_bouchy` (analytical photon-noise limit).
291
+ - Corrections: `remove_telluric_division`.
292
+ - CCD reduction: `bias_combine`, `dark_subtract`, `flat_normalize`,
293
+ `clip_cosmic_rays` (L.A.Cosmic / astroscrappy with a median-filter fallback),
294
+ `extract_spectrum_sum`, `wavelength_calibrate_polynomial`.
295
+ - `adapters/easyspec.py`: scaffold for parallel "shelf" wrappers around the easyspec
296
+ CCD-reduction toolkit. Documented integration plan; native algorithms cover the
297
+ same operations today.
298
+ - **MCP server, production hardening**:
299
+ - API-key auth middleware (`SPECTRO_MCP_API_KEY` env var).
300
+ - Sliding-window rate limiting (`SPECTRO_MCP_RATE_PER_MINUTE`).
301
+ - Redis-backed session storage (`SPECTRO_MCP_REDIS_URL`); in-memory backend remains
302
+ the default.
303
+ - `/health` and `/metrics` (Prometheus text format) endpoints via FastMCP's
304
+ `custom_route`.
305
+ - Structured JSON logging on every tool call (audit trail).
306
+ - Optional Sentry init (`SENTRY_DSN` env var).
307
+ - **Reference scientific tests** (`tests/reference/`) — closed-form expected answers
308
+ with documented tolerances for SNR, line fitting, EW, Lomb-Scargle, continuum
309
+ normalisation, line identification, cross-correlation RV and flux preservation.
310
+ - `pyproject.toml`: new `reduction` extra (easyspec, astroscrappy, ccdproc, matplotlib),
311
+ `monitoring` extra (sentry-sdk), `redis` and `uvicorn[standard]` in the `mcp` extra,
312
+ `h5py` in `storage`, `specutils` lifted into core deps.
313
+
314
+ ### Added — first pass
315
+
316
+ - Provenance metadata on every algorithm — a `backend` field (the library it leans on:
317
+ astropy / specutils / astroquery / scipy / numpy / plotly) and `references` (literature
318
+ citations) — surfaced in `describe_algorithm`, `spectro describe`, the MCP tool
319
+ descriptions and the documentation.
320
+ - Full MkDocs Material documentation site: "Why spectro-kernel?" (vs astropy/specutils),
321
+ concepts with diagrams, per-access-path guides, tutorials, and an algorithm-catalogue
322
+ page generated from the live registry. Read the Docs config and a docs CI workflow.
323
+
324
+ ## [0.1.0] - 2026-05-22
325
+
326
+ Initial foundation release.
327
+
328
+ ### Added
329
+ - Core types: `Spectrum1D`, `ImageFrame`, `WorkContext`, `ProcessingStep`,
330
+ `LineFitResult`, `Periodogram`, `AlgorithmCategory`.
331
+ - Plugin registry: `@register_algorithm`, `list_algorithms`, `get_algorithm`,
332
+ `describe_algorithm`, with automatic algorithm discovery.
333
+ - `BaseAlgorithm` / `AlgorithmOutput` with a reproducibility-aware `execute()` wrapper
334
+ (parameter merging, input/output hashing, audit trail).
335
+ - `Pipeline` / `PipelineBuilder` / `PipelineResult` for composable, reproducible runs.
336
+ - FITS and ASCII I/O (`read_fits`, `write_fits`, `read_ascii_spectrum`,
337
+ `write_ascii_spectrum`) with WCS reconstruction and local-path/URL support.
338
+ - Algorithm catalogue — 36 algorithms across 15 categories (33 with the core install;
339
+ `simbad_query` needs `[catalogs]`, the Plotly plots need `[viz]`):
340
+ - I/O: `read_fits`, `read_ascii_spectrum`, `read_votable_spectrum`.
341
+ - Continuum: `normalize_polynomial`, `normalize_percentile`, `normalize_max`,
342
+ `normalize_edges`, `subtract_continuum`.
343
+ - Quality: `snr_der`, `snr_edge`, `snr_linear_fit`.
344
+ - Smoothing: `smooth_savgol`, `smooth_gaussian`.
345
+ - Transforms: `resample_linear`, `extract_region`, `clip_sigma`, `mask_range`.
346
+ - Lines: `detect_lines`, `fit_gaussian_line`, `fit_lorentzian_line`,
347
+ `fit_voigt_line`, `equivalent_width`.
348
+ - Corrections: `barycentric_correction`, `doppler_shift`, `air_to_vacuum`,
349
+ `vacuum_to_air`.
350
+ - Radial velocity: `measure_radial_velocity`.
351
+ - Stacking: `stack_spectra`. Time series: `lomb_scargle`, `phase_fold`.
352
+ - Catalogues: `simbad_query` (with `[catalogs]`).
353
+ - Visualisation: `plot_spectrum_plotly`, `plot_overlay_plotly` (with `[viz]`).
354
+ - Export: `export_csv`, `export_fits`, `export_votable`.
355
+ - Shared Gaussian/Lorentzian/Voigt profile-fitting core (`lines/_profiles.py`).
356
+ - VOTable I/O (`read_votable_spectrum`, `write_votable_spectrum`).
357
+ - Spectral line catalogues: Balmer, telluric, nebular, aurorae.
358
+ - YAML presets with loader (`snr_check`, `balmer_quick`).
359
+ - `spectro` CLI: `list`, `describe`, `run`, `pipeline`, `presets`, `info`.
360
+ - `spectro_mcp` MCP server auto-exposing the catalogue as tools (`[mcp]` extra).
361
+
362
+ [Unreleased]: https://github.com/matthieulel/spectro-kernel/compare/v0.1.0...HEAD
363
+ [0.1.0]: https://github.com/matthieulel/spectro-kernel/releases/tag/v0.1.0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 spectro-kernel contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.