quasar-models 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 (129) hide show
  1. quasar_models-0.1.0/PKG-INFO +24 -0
  2. quasar_models-0.1.0/README.md +0 -0
  3. quasar_models-0.1.0/pyproject.toml +60 -0
  4. quasar_models-0.1.0/setup.cfg +4 -0
  5. quasar_models-0.1.0/setup.py +123 -0
  6. quasar_models-0.1.0/src/quasar_models/__init__.py +42 -0
  7. quasar_models-0.1.0/src/quasar_models/_core/convolution/__init__.py +231 -0
  8. quasar_models-0.1.0/src/quasar_models/_core/convolution/utils.c +31271 -0
  9. quasar_models-0.1.0/src/quasar_models/_core/convolution/utils.pxd +57 -0
  10. quasar_models-0.1.0/src/quasar_models/_core/modeling/balmer/__init__.py +202 -0
  11. quasar_models-0.1.0/src/quasar_models/_core/modeling/balmer/continuum/__init__.py +92 -0
  12. quasar_models-0.1.0/src/quasar_models/_core/modeling/balmer/continuum/evaluate.c +28527 -0
  13. quasar_models-0.1.0/src/quasar_models/_core/modeling/balmer/continuum/evaluate.pxd +33 -0
  14. quasar_models-0.1.0/src/quasar_models/_core/modeling/balmer/evaluate.c +27915 -0
  15. quasar_models-0.1.0/src/quasar_models/_core/modeling/balmer/evaluate.pxd +32 -0
  16. quasar_models-0.1.0/src/quasar_models/_core/modeling/balmer/fit_deriv.c +32689 -0
  17. quasar_models-0.1.0/src/quasar_models/_core/modeling/balmer/fit_deriv.pxd +177 -0
  18. quasar_models-0.1.0/src/quasar_models/_core/modeling/balmer/series/__init__.py +35 -0
  19. quasar_models-0.1.0/src/quasar_models/_core/modeling/balmer/series/evaluate.c +27200 -0
  20. quasar_models-0.1.0/src/quasar_models/_core/modeling/balmer/series/evaluate.pxd +9 -0
  21. quasar_models-0.1.0/src/quasar_models/_core/modeling/balmer/utils.py +140 -0
  22. quasar_models-0.1.0/src/quasar_models/_core/modeling/gaussian/__init__.py +151 -0
  23. quasar_models-0.1.0/src/quasar_models/_core/modeling/gaussian/evaluate.c +28259 -0
  24. quasar_models-0.1.0/src/quasar_models/_core/modeling/gaussian/evaluate.pxd +39 -0
  25. quasar_models-0.1.0/src/quasar_models/_core/modeling/gaussian/fit_deriv.c +33241 -0
  26. quasar_models-0.1.0/src/quasar_models/_core/modeling/gaussian/fit_deriv.pxd +201 -0
  27. quasar_models-0.1.0/src/quasar_models/_core/modeling/gaussian/utils.py +226 -0
  28. quasar_models-0.1.0/src/quasar_models/_core/modeling/host/__init__.py +131 -0
  29. quasar_models-0.1.0/src/quasar_models/_core/modeling/host/evaluate.c +27723 -0
  30. quasar_models-0.1.0/src/quasar_models/_core/modeling/host/evaluate.pxd +26 -0
  31. quasar_models-0.1.0/src/quasar_models/_core/modeling/host/fit_deriv.c +28847 -0
  32. quasar_models-0.1.0/src/quasar_models/_core/modeling/host/fit_deriv.pxd +63 -0
  33. quasar_models-0.1.0/src/quasar_models/_core/modeling/host/utils.py +122 -0
  34. quasar_models-0.1.0/src/quasar_models/_core/modeling/iron/__init__.py +360 -0
  35. quasar_models-0.1.0/src/quasar_models/_core/modeling/iron/evaluate.c +28376 -0
  36. quasar_models-0.1.0/src/quasar_models/_core/modeling/iron/evaluate.pxd +50 -0
  37. quasar_models-0.1.0/src/quasar_models/_core/modeling/iron/fit_deriv.c +43073 -0
  38. quasar_models-0.1.0/src/quasar_models/_core/modeling/iron/fit_deriv.pxd +488 -0
  39. quasar_models-0.1.0/src/quasar_models/_core/modeling/iron/utils.py +138 -0
  40. quasar_models-0.1.0/src/quasar_models/_core/modeling/powerlaw/__init__.py +36 -0
  41. quasar_models-0.1.0/src/quasar_models/_core/modeling/powerlaw/evaluate.c +27316 -0
  42. quasar_models-0.1.0/src/quasar_models/_core/modeling/powerlaw/evaluate.pxd +7 -0
  43. quasar_models-0.1.0/src/quasar_models/_core/modeling/powerlaw/fit_deriv.c +27660 -0
  44. quasar_models-0.1.0/src/quasar_models/_core/modeling/powerlaw/fit_deriv.pxd +23 -0
  45. quasar_models-0.1.0/src/quasar_models/_core/modeling/powerlaw/utils.py +91 -0
  46. quasar_models-0.1.0/src/quasar_models/_core/modeling/split/__init__.py +139 -0
  47. quasar_models-0.1.0/src/quasar_models/_core/modeling/split/evaluate.c +27187 -0
  48. quasar_models-0.1.0/src/quasar_models/_core/modeling/split/evaluate.pxd +9 -0
  49. quasar_models-0.1.0/src/quasar_models/_core/modeling/split/fit_deriv.c +29549 -0
  50. quasar_models-0.1.0/src/quasar_models/_core/modeling/split/fit_deriv.pxd +69 -0
  51. quasar_models-0.1.0/src/quasar_models/_core/modeling/template/__init__.py +15 -0
  52. quasar_models-0.1.0/src/quasar_models/_core/modeling/template/cytemplate.c +31308 -0
  53. quasar_models-0.1.0/src/quasar_models/_core/modeling/template/cytemplate.pxd +113 -0
  54. quasar_models-0.1.0/src/quasar_models/_core/modeling/template/evaluate.c +28045 -0
  55. quasar_models-0.1.0/src/quasar_models/_core/modeling/template/evaluate.pxd +26 -0
  56. quasar_models-0.1.0/src/quasar_models/_core/modeling/template/fit_deriv.c +29212 -0
  57. quasar_models-0.1.0/src/quasar_models/_core/modeling/template/fit_deriv.pxd +62 -0
  58. quasar_models-0.1.0/src/quasar_models/_core/modeling/template/utils.py +93 -0
  59. quasar_models-0.1.0/src/quasar_models/_core/modeling/utils.py +178 -0
  60. quasar_models-0.1.0/src/quasar_models/_core/modeling/vprofilecopy/__init__.py +81 -0
  61. quasar_models-0.1.0/src/quasar_models/_core/modeling/vprofilecopy/evaluate.c +27521 -0
  62. quasar_models-0.1.0/src/quasar_models/_core/modeling/vprofilecopy/evaluate.pxd +21 -0
  63. quasar_models-0.1.0/src/quasar_models/_core/modeling/vprofilecopy/fit_deriv.c +28779 -0
  64. quasar_models-0.1.0/src/quasar_models/_core/modeling/vprofilecopy/fit_deriv.pxd +45 -0
  65. quasar_models-0.1.0/src/quasar_models/_core/modeling/vprofilecopy/utils.py +258 -0
  66. quasar_models-0.1.0/src/quasar_models/_core/utils.c +25036 -0
  67. quasar_models-0.1.0/src/quasar_models/_core/utils.pxd +23 -0
  68. quasar_models-0.1.0/src/quasar_models/balmer/__init__.py +21 -0
  69. quasar_models-0.1.0/src/quasar_models/balmer/balmer_model.py +594 -0
  70. quasar_models-0.1.0/src/quasar_models/balmer/continuum/__init__.py +37 -0
  71. quasar_models-0.1.0/src/quasar_models/balmer/continuum/balmer_continuum_template.py +210 -0
  72. quasar_models-0.1.0/src/quasar_models/balmer/continuum/io.py +165 -0
  73. quasar_models-0.1.0/src/quasar_models/balmer/continuum/setup.py +134 -0
  74. quasar_models-0.1.0/src/quasar_models/balmer/series/__init__.py +37 -0
  75. quasar_models-0.1.0/src/quasar_models/balmer/series/balmer_series_template.py +321 -0
  76. quasar_models-0.1.0/src/quasar_models/balmer/series/io.py +222 -0
  77. quasar_models-0.1.0/src/quasar_models/balmer/series/setup.py +192 -0
  78. quasar_models-0.1.0/src/quasar_models/cli/main.py +37 -0
  79. quasar_models-0.1.0/src/quasar_models/cli/utils.py +195 -0
  80. quasar_models-0.1.0/src/quasar_models/continuum/__init__.py +3 -0
  81. quasar_models-0.1.0/src/quasar_models/continuum/powerlaw.py +525 -0
  82. quasar_models-0.1.0/src/quasar_models/host/__init__.py +24 -0
  83. quasar_models-0.1.0/src/quasar_models/host/host_galaxy_model.py +316 -0
  84. quasar_models-0.1.0/src/quasar_models/host/host_galaxy_template.py +120 -0
  85. quasar_models-0.1.0/src/quasar_models/host/io.py +114 -0
  86. quasar_models-0.1.0/src/quasar_models/host/setup.py +130 -0
  87. quasar_models-0.1.0/src/quasar_models/iron/__init__.py +24 -0
  88. quasar_models-0.1.0/src/quasar_models/iron/create_template.py +157 -0
  89. quasar_models-0.1.0/src/quasar_models/iron/io.py +90 -0
  90. quasar_models-0.1.0/src/quasar_models/iron/iron_model.py +488 -0
  91. quasar_models-0.1.0/src/quasar_models/iron/iron_template.py +162 -0
  92. quasar_models-0.1.0/src/quasar_models/iron/setup.py +473 -0
  93. quasar_models-0.1.0/src/quasar_models/iron/utils.py +117 -0
  94. quasar_models-0.1.0/src/quasar_models/line/__init__.py +47 -0
  95. quasar_models-0.1.0/src/quasar_models/line/gaussian.py +644 -0
  96. quasar_models-0.1.0/src/quasar_models/line/instantiation_utils.py +152 -0
  97. quasar_models-0.1.0/src/quasar_models/line/line.py +142 -0
  98. quasar_models-0.1.0/src/quasar_models/line/vprofilecopies/__init__.py +35 -0
  99. quasar_models-0.1.0/src/quasar_models/line/vprofilecopies/_vprofilecopy.py +611 -0
  100. quasar_models-0.1.0/src/quasar_models/line/vprofilecopies/vprofilecopies.py +262 -0
  101. quasar_models-0.1.0/src/quasar_models/modeling/__init__.py +27 -0
  102. quasar_models-0.1.0/src/quasar_models/modeling/base_model.py +172 -0
  103. quasar_models-0.1.0/src/quasar_models/modeling/fitting/__init__.py +19 -0
  104. quasar_models-0.1.0/src/quasar_models/modeling/fitting/emcee.py +297 -0
  105. quasar_models-0.1.0/src/quasar_models/modeling/fitting/nonlinear.py +166 -0
  106. quasar_models-0.1.0/src/quasar_models/modeling/fitting/utils.py +203 -0
  107. quasar_models-0.1.0/src/quasar_models/modeling/interpolated_sequential_model.py +196 -0
  108. quasar_models-0.1.0/src/quasar_models/modeling/prepare_model.py +238 -0
  109. quasar_models-0.1.0/src/quasar_models/modeling/prepared_sequential_model.py +60 -0
  110. quasar_models-0.1.0/src/quasar_models/modeling/sequential_model.py +585 -0
  111. quasar_models-0.1.0/src/quasar_models/modeling/stop_conditions.py +137 -0
  112. quasar_models-0.1.0/src/quasar_models/modeling/template/__init__.py +19 -0
  113. quasar_models-0.1.0/src/quasar_models/modeling/template/base_template.py +518 -0
  114. quasar_models-0.1.0/src/quasar_models/modeling/template/evaluation.py +217 -0
  115. quasar_models-0.1.0/src/quasar_models/modeling/template/io.py +247 -0
  116. quasar_models-0.1.0/src/quasar_models/modeling/template/template_model.py +158 -0
  117. quasar_models-0.1.0/src/quasar_models/modeling/utils.py +215 -0
  118. quasar_models-0.1.0/src/quasar_models/utils/astropy.py +192 -0
  119. quasar_models-0.1.0/src/quasar_models/utils/interpolation.py +19 -0
  120. quasar_models-0.1.0/src/quasar_models/utils/linear_regression.py +90 -0
  121. quasar_models-0.1.0/src/quasar_models/utils/masking.py +64 -0
  122. quasar_models-0.1.0/src/quasar_models/utils/serialization.py +227 -0
  123. quasar_models-0.1.0/src/quasar_models/utils/setup_utils.py +39 -0
  124. quasar_models-0.1.0/src/quasar_models.egg-info/PKG-INFO +24 -0
  125. quasar_models-0.1.0/src/quasar_models.egg-info/SOURCES.txt +127 -0
  126. quasar_models-0.1.0/src/quasar_models.egg-info/dependency_links.txt +1 -0
  127. quasar_models-0.1.0/src/quasar_models.egg-info/requires.txt +16 -0
  128. quasar_models-0.1.0/src/quasar_models.egg-info/top_level.txt +1 -0
  129. quasar_models-0.1.0/tests/test_raster.py +82 -0
@@ -0,0 +1,24 @@
1
+ Metadata-Version: 2.1
2
+ Name: quasar-models
3
+ Version: 0.1.0
4
+ Author-email: Liam <liam_deburca@me.com>
5
+ Project-URL: Repository, https://github.com/liamdeburca/quasar-models
6
+ Classifier: Programming Language :: Python :: 3
7
+ Classifier: Programming Language :: Python :: 3.12
8
+ Requires-Python: >=3.12
9
+ Description-Content-Type: text/markdown
10
+ Requires-Dist: quasar-typing==0.1.0
11
+ Requires-Dist: quasar-utils==0.1.0
12
+ Requires-Dist: matplotlib==3.10.0
13
+ Requires-Dist: pydantic==2.12
14
+ Requires-Dist: astropy==7.0
15
+ Requires-Dist: numpy==1.26
16
+ Requires-Dist: scipy==1.16
17
+ Requires-Dist: click==8.5.0
18
+ Requires-Dist: emcee==3.1.6
19
+ Requires-Dist: lazy-imports==1.2.0
20
+ Provides-Extra: dev
21
+ Requires-Dist: pytest==9.1.1; extra == "dev"
22
+ Requires-Dist: pytest-cov==7.1.0; extra == "dev"
23
+ Requires-Dist: black==26.10.1; extra == "dev"
24
+ Requires-Dist: isort==9.0.2; extra == "dev"
File without changes
@@ -0,0 +1,60 @@
1
+ [build-system]
2
+ requires = [
3
+ "wheel",
4
+ "setuptools==72.1.0",
5
+ "Cython==3.0.12",
6
+ "numpy==1.26",
7
+ ]
8
+ build-backend = "setuptools.build_meta"
9
+
10
+ [project]
11
+ name = "quasar-models"
12
+ authors = [{name = "Liam", email = "liam_deburca@me.com"}]
13
+ version = "0.1.0"
14
+ readme = "README.md"
15
+ requires-python = ">=3.12"
16
+ classifiers = [
17
+ "Programming Language :: Python :: 3",
18
+ "Programming Language :: Python :: 3.12",
19
+ ]
20
+ dependencies = [
21
+ "quasar-typing==0.1.0",
22
+ "quasar-utils==0.1.0",
23
+
24
+ "matplotlib==3.10.0",
25
+ "pydantic==2.12",
26
+ "astropy==7.0",
27
+ "numpy==1.26",
28
+ "scipy==1.16",
29
+ "click==8.5.0",
30
+ "emcee==3.1.6",
31
+ "lazy-imports==1.2.0",
32
+ ]
33
+
34
+ [project.optional-dependencies]
35
+ dev = [
36
+ "pytest==9.1.1",
37
+ "pytest-cov==7.1.0",
38
+ "black==26.10.1",
39
+ "isort==9.0.2",
40
+ ]
41
+
42
+ [project.urls]
43
+ Repository = "https://github.com/liamdeburca/quasar-models"
44
+
45
+ [tool.setuptools]
46
+ package-dir = {"" = "src"}
47
+
48
+ [tool.setuptools.packages.find]
49
+ where = ["src"]
50
+
51
+ [tool.ruff]
52
+ line-length = 79
53
+
54
+ [lint.pyupgrade]
55
+ keep-runtime-typing = true
56
+
57
+ [tool.pytest.ini_options]
58
+ markers = [
59
+ "benchmark: test benchmarks different methods",
60
+ ]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,123 @@
1
+ from Cython.Build import cythonize
2
+ from numpy import get_include
3
+ from setuptools import Extension, find_packages, setup
4
+
5
+ setup(
6
+ name="quasar_models",
7
+ packages=find_packages(where="src"),
8
+ package_dir={"": "src"},
9
+ ext_modules=cythonize(
10
+ [
11
+ # Array utils
12
+ Extension(
13
+ "quasar_models._core.utils",
14
+ sources=["src/quasar_models/_core/utils.pyx"],
15
+ ),
16
+ # Powerlaw
17
+ Extension(
18
+ "quasar_models._core.modeling.powerlaw.evaluate",
19
+ sources=["src/quasar_models/_core/modeling/powerlaw/evaluate.pyx"],
20
+ ),
21
+ Extension(
22
+ "quasar_models._core.modeling.powerlaw.fit_deriv",
23
+ sources=["src/quasar_models/_core/modeling/powerlaw/fit_deriv.pyx"],
24
+ ),
25
+ # Gaussian
26
+ Extension(
27
+ "quasar_models._core.modeling.gaussian.evaluate",
28
+ sources=["src/quasar_models/_core/modeling/gaussian/evaluate.pyx"],
29
+ ),
30
+ Extension(
31
+ "quasar_models._core.modeling.gaussian.fit_deriv",
32
+ sources=["src/quasar_models/_core/modeling/gaussian/fit_deriv.pyx"],
33
+ ),
34
+ # VProfileCopy
35
+ Extension(
36
+ "quasar_models._core.modeling.vprofilecopy.evaluate",
37
+ sources=["src/quasar_models/_core/modeling/vprofilecopy/evaluate.pyx"],
38
+ ),
39
+ Extension(
40
+ "quasar_models._core.modeling.vprofilecopy.fit_deriv",
41
+ sources=["src/quasar_models/_core/modeling/vprofilecopy/fit_deriv.pyx"],
42
+ ),
43
+ # Convolution
44
+ Extension(
45
+ "quasar_models._core.convolution.utils",
46
+ sources=["src/quasar_models/_core/convolution/utils.pyx"],
47
+ ),
48
+ # Template
49
+ Extension(
50
+ "quasar_models._core.modeling.template.evaluate",
51
+ sources=["src/quasar_models/_core/modeling/template/evaluate.pyx"],
52
+ ),
53
+ Extension(
54
+ "quasar_models._core.modeling.template.fit_deriv",
55
+ sources=["src/quasar_models/_core/modeling/template/fit_deriv.pyx"],
56
+ ),
57
+ Extension(
58
+ "quasar_models._core.modeling.template.cytemplate",
59
+ sources=["src/quasar_models/_core/modeling/template/cytemplate.pyx"],
60
+ ),
61
+ # Host
62
+ Extension(
63
+ "quasar_models._core.modeling.host.evaluate",
64
+ sources=["src/quasar_models/_core/modeling/host/evaluate.pyx"],
65
+ ),
66
+ Extension(
67
+ "quasar_models._core.modeling.host.fit_deriv",
68
+ sources=["src/quasar_models/_core/modeling/host/fit_deriv.pyx"],
69
+ ),
70
+ # Split
71
+ Extension(
72
+ "quasar_models._core.modeling.split.evaluate",
73
+ sources=["src/quasar_models/_core/modeling/split/evaluate.pyx"],
74
+ ),
75
+ Extension(
76
+ "quasar_models._core.modeling.split.fit_deriv",
77
+ sources=["src/quasar_models/_core/modeling/split/fit_deriv.pyx"],
78
+ ),
79
+ # Iron
80
+ Extension(
81
+ "quasar_models._core.modeling.iron.evaluate",
82
+ sources=["src/quasar_models/_core/modeling/iron/evaluate.pyx"],
83
+ ),
84
+ Extension(
85
+ "quasar_models._core.modeling.iron.fit_deriv",
86
+ sources=["src/quasar_models/_core/modeling/iron/fit_deriv.pyx"],
87
+ ),
88
+ # Balmer - Continuum
89
+ Extension(
90
+ "quasar_models._core.modeling.balmer.continuum.evaluate",
91
+ sources=[
92
+ "src/quasar_models/_core/modeling/balmer/continuum/evaluate.pyx"
93
+ ],
94
+ ),
95
+ # Balmer - Series
96
+ Extension(
97
+ "quasar_models._core.modeling.balmer.series.evaluate",
98
+ sources=["src/quasar_models/_core/modeling/balmer/series/evaluate.pyx"],
99
+ ),
100
+ # Balmer
101
+ Extension(
102
+ "quasar_models._core.modeling.balmer.evaluate",
103
+ sources=["src/quasar_models/_core/modeling/balmer/evaluate.pyx"],
104
+ ),
105
+ Extension(
106
+ "quasar_models._core.modeling.balmer.fit_deriv",
107
+ sources=["src/quasar_models/_core/modeling/balmer/fit_deriv.pyx"],
108
+ ),
109
+ ],
110
+ language_level=3,
111
+ compiler_directives={
112
+ "boundscheck": False,
113
+ "wraparound": False,
114
+ "cdivision": True,
115
+ "warn.undeclared": False,
116
+ "warn.unreachable": False,
117
+ },
118
+ force=True, # Tabula rasa
119
+ include_path=["src"], # Necessary for cimporing .pxd files
120
+ ),
121
+ include_dirs=[get_include()],
122
+ package_data={"quasar_models._core": ["**/*.pxd"]},
123
+ )
@@ -0,0 +1,42 @@
1
+ import sys
2
+ from typing import TYPE_CHECKING
3
+
4
+ from lazy_imports import LazyImporter
5
+
6
+ _import_structure: dict[str, list[str]] = {
7
+ "balmer": [
8
+ "BalmerModel",
9
+ "BaModel",
10
+ ],
11
+ "continuum": [
12
+ "PlModel",
13
+ "PowerLawModel",
14
+ ],
15
+ "host": [
16
+ "HgModel",
17
+ "HostGalaxyModel",
18
+ ],
19
+ "iron": [
20
+ "FeModel",
21
+ "IronModel",
22
+ ],
23
+ "line": [
24
+ "EmModel",
25
+ "GaussianModel",
26
+ "VProfileCopy",
27
+ ],
28
+ }
29
+
30
+ if TYPE_CHECKING:
31
+ from .balmer import BalmerModel, BaModel # noqa: F401
32
+ from .continuum import PlModel, PowerLawModel # noqa: F401
33
+ from .host import HgModel, HostGalaxyModel # noqa: F401
34
+ from .iron import FeModel, IronModel # noqa: F401
35
+ from .line import EmModel, GaussianModel, VProfileCopy # noqa: F401
36
+
37
+ else:
38
+ sys.modules[__name__] = LazyImporter(
39
+ __name__,
40
+ __file__,
41
+ _import_structure,
42
+ )
@@ -0,0 +1,231 @@
1
+ from quasar_typing.numpy import FloatMatrix, FloatVector
2
+
3
+ from .utils import convolve as _convolve
4
+ from .utils import convolve_deriv as _convolve_deriv
5
+ from .utils import convolve_signal as _convolve_signal
6
+ from .utils import convolve_signal2d as _convolve_signal2d
7
+ from .utils import identify_closest_idx as _identify_closest_idx
8
+ from .utils import (
9
+ identify_closest_idx_for_deriv as _identify_closest_idx_for_deriv,
10
+ )
11
+ from .utils import kernel as _kernel
12
+ from .utils import kernel_deriv as _kernel_deriv
13
+ from .utils import pixels as _pixels
14
+ from .utils import scale as _scale
15
+
16
+
17
+ def scale(fwhm: float, sigma_res: float) -> float:
18
+ """
19
+ Parameters
20
+ ----------
21
+ fwhm : float
22
+ FWHM (km/s) of the template.
23
+ sigma_res : float
24
+ Velocity resolution (c) of the spectrum.
25
+
26
+ Returns
27
+ -------
28
+ float
29
+ """
30
+ return _scale(fwhm, sigma_res)
31
+
32
+
33
+ def pixels(scale: float, n_scales: float) -> FloatVector:
34
+ """
35
+ Parameters
36
+ ----------
37
+ scale : float
38
+ n_scales : float
39
+
40
+ Returns
41
+ -------
42
+ FloatVector
43
+ """
44
+ return _pixels(scale, n_scales)
45
+
46
+
47
+ def kernel(fwhm: float, sigma_res: float, n_scales: float) -> FloatVector:
48
+ """
49
+ Calculate the Gaussian kernel used for convolution.
50
+
51
+ Parameters
52
+ ----------
53
+ fwhm : float
54
+ FWHM (km/s) of the template.
55
+ sigma_res : float
56
+ Velocity resolution (c) of the spectrum.
57
+ n_scales : float
58
+
59
+ Returns
60
+ -------
61
+ FloatVector
62
+ """
63
+ return _kernel(fwhm, sigma_res, n_scales)
64
+
65
+
66
+ def kernel_deriv(
67
+ fwhm: float, sigma_res: float, n_scales: float
68
+ ) -> FloatVector:
69
+ """
70
+ Calculate the derivative of the Gaussian kernel used for convolution w.r.t.
71
+ FWHM.
72
+
73
+ Parameters
74
+ ----------
75
+ fwhm : float
76
+ FWHM (km/s) of the template.
77
+ sigma_res : float
78
+ Velocity resolution (c) of the spectrum.
79
+ n_scales : float
80
+
81
+ Returns
82
+ -------
83
+ FloatVector
84
+ """
85
+ return _kernel_deriv(fwhm, sigma_res, n_scales)
86
+
87
+
88
+ def convolve_signal(signal: FloatVector, kernel: FloatVector) -> FloatVector:
89
+ """
90
+ Convolve a signal with a kernel.
91
+
92
+ Parameters
93
+ ----------
94
+ signal : FloatVector
95
+ Signal to be convolved.
96
+ kernel : FloatVector
97
+ Kernel to convolve with the signal.
98
+
99
+ Returns
100
+ -------
101
+ FloatVector
102
+ Convolved signal.
103
+ """
104
+ return _convolve_signal(signal, kernel)
105
+
106
+
107
+ def convolve_signal2d(
108
+ signal2d: FloatMatrix, kernel: FloatVector
109
+ ) -> FloatVector:
110
+ """
111
+ Convolve a 2D signal with a kernel.
112
+
113
+ Parameters
114
+ ----------
115
+ signal2d : FloatMatrix
116
+ 2D signal to be convolved.
117
+ kernel : FloatVector
118
+ Kernel to convolve with the signal.
119
+
120
+ Returns
121
+ -------
122
+ FloatVector
123
+ Convolved signal.
124
+ """
125
+ return _convolve_signal2d(signal2d, kernel)
126
+
127
+
128
+ def identify_closest_idx(fwhm: FloatVector, fwhm_final: float) -> int:
129
+ """
130
+ Find the index of the closest FWHM value in an array to a given FWHM value.
131
+
132
+ Parameters
133
+ ----------
134
+ fwhm : FloatVector
135
+ Array of FWHM values.
136
+ fwhm_final : float
137
+ Target FWHM value to find the closest index for.
138
+
139
+ Returns
140
+ -------
141
+ int
142
+ Index of the closest element.
143
+ """
144
+ return _identify_closest_idx(fwhm, fwhm_final)
145
+
146
+
147
+ def identify_closest_idx_for_deriv(
148
+ fwhm: FloatVector, fwhm_final: float
149
+ ) -> int:
150
+ """
151
+ Find the index of the closest FWHM value in an array to a given FWHM value.
152
+
153
+ This function is specifically used for derivative calculations as it ensures
154
+ that if 'fwhm_final' lies in the 'fwhm' array, the index is shifted
155
+ downwards to guarantee convolution.
156
+
157
+ Parameters
158
+ ----------
159
+ fwhm : FloatVector
160
+ Array of FWHM values.
161
+ fwhm_final : float
162
+ Target FWHM value to find the closest index for.
163
+
164
+ Returns
165
+ -------
166
+ int
167
+ Index of the element.
168
+ """
169
+ return _identify_closest_idx_for_deriv(fwhm, fwhm_final)
170
+
171
+
172
+ def convolve(
173
+ data: FloatMatrix,
174
+ fwhm: FloatVector,
175
+ fwhm_final: float,
176
+ sigma_res: float,
177
+ n_scales: float,
178
+ ) -> FloatVector:
179
+ """
180
+ Find the index of the closest FWHM value and convolve the corresponding data
181
+ array.
182
+
183
+ Parameters
184
+ ----------
185
+ data : FloatMatrix
186
+ 2D array of data to be convolved.
187
+ fwhm : FloatVector
188
+ Array of FWHM values corresponding to the data.
189
+ fwhm_final : float
190
+ Target FWHM value for convolution.
191
+ sigma_res : float
192
+ Velocity resolution (c) of the spectrum.
193
+ n_scales : float
194
+
195
+ Returns
196
+ -------
197
+ FloatVector
198
+ Convolved data array.
199
+ """
200
+ return _convolve(data, fwhm, fwhm_final, sigma_res, n_scales)
201
+
202
+
203
+ def convolve_deriv(
204
+ data: FloatMatrix,
205
+ fwhm: FloatVector,
206
+ fwhm_final: float,
207
+ sigma_res: float,
208
+ n_scales: float,
209
+ ) -> FloatVector:
210
+ """
211
+ Find the index the closest FWHM value and calculate the derivative of the
212
+ convolved data array w.r.t. FWHM.
213
+
214
+ Parameters
215
+ ----------
216
+ data : FloatMatrix
217
+ 2D array of data to be convolved.
218
+ fwhm : FloatVector
219
+ Array of FWHM values corresponding to the data.
220
+ fwhm_final : float
221
+ Target FWHM value for convolution.
222
+ sigma_res : float
223
+ Velocity resolution (c) of the spectrum.
224
+ n_scales : float
225
+
226
+ Returns
227
+ -------
228
+ FloatVector
229
+ Derivative of the convolved data array w.r.t. FWHM.
230
+ """
231
+ return _convolve_deriv(data, fwhm, fwhm_final, sigma_res, n_scales)