lfast-etc 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 (49) hide show
  1. lfast_etc-0.1.0/LICENSE +28 -0
  2. lfast_etc-0.1.0/PKG-INFO +135 -0
  3. lfast_etc-0.1.0/README.md +102 -0
  4. lfast_etc-0.1.0/pyproject.toml +51 -0
  5. lfast_etc-0.1.0/setup.cfg +4 -0
  6. lfast_etc-0.1.0/src/lfast_etc/__init__.py +27 -0
  7. lfast_etc-0.1.0/src/lfast_etc/constants.py +23 -0
  8. lfast_etc-0.1.0/src/lfast_etc/data/config/bench_1200_28p7_o1.toml +18 -0
  9. lfast_etc-0.1.0/src/lfast_etc/data/config/bench_1200_28p7_o2.toml +18 -0
  10. lfast_etc-0.1.0/src/lfast_etc/data/config/bench_316_63p4_o9.toml +18 -0
  11. lfast_etc-0.1.0/src/lfast_etc/data/config/bench_316_7p0_o1.toml +18 -0
  12. lfast_etc-0.1.0/src/lfast_etc/data/config/bench_316_7p0_o2.toml +18 -0
  13. lfast_etc-0.1.0/src/lfast_etc/data/config/bench_3300vph_o1.toml +18 -0
  14. lfast_etc-0.1.0/src/lfast_etc/data/config/bench_400_4p2_o1.toml +18 -0
  15. lfast_etc-0.1.0/src/lfast_etc/data/config/bench_600_13p9_o1.toml +18 -0
  16. lfast_etc-0.1.0/src/lfast_etc/data/config/bench_600_13p9_o2.toml +18 -0
  17. lfast_etc-0.1.0/src/lfast_etc/data/config/bench_740vph_o1.toml +18 -0
  18. lfast_etc-0.1.0/src/lfast_etc/data/config/bench_740vph_o2.toml +18 -0
  19. lfast_etc-0.1.0/src/lfast_etc/data/config/bench_860_30p9_o1.toml +18 -0
  20. lfast_etc-0.1.0/src/lfast_etc/data/config/bench_860_30p9_o2.toml +18 -0
  21. lfast_etc-0.1.0/src/lfast_etc/data/config/bench_860_30p9_o3.toml +18 -0
  22. lfast_etc-0.1.0/src/lfast_etc/data/config/bench_r1800.toml +20 -0
  23. lfast_etc-0.1.0/src/lfast_etc/data/config/cshell_r18000.toml +19 -0
  24. lfast_etc-0.1.0/src/lfast_etc/data/config/cshell_r21500.toml +17 -0
  25. lfast_etc-0.1.0/src/lfast_etc/data/config/cshell_r43000.toml +17 -0
  26. lfast_etc-0.1.0/src/lfast_etc/data/sky/skytable_secz1.3.fits +9516 -31
  27. lfast_etc-0.1.0/src/lfast_etc/data/throughput/Eta_fib_value_18.npy +0 -0
  28. lfast_etc-0.1.0/src/lfast_etc/data/throughput/Eta_fib_value_50.npy +0 -0
  29. lfast_etc-0.1.0/src/lfast_etc/data/throughput/Eta_fib_wavelength.npy +0 -0
  30. lfast_etc-0.1.0/src/lfast_etc/data/throughput/Kopt_value_18.npy +0 -0
  31. lfast_etc-0.1.0/src/lfast_etc/data/throughput/Kopt_value_50.npy +0 -0
  32. lfast_etc-0.1.0/src/lfast_etc/data/throughput/Kopt_wavelength.npy +0 -0
  33. lfast_etc-0.1.0/src/lfast_etc/etc.py +466 -0
  34. lfast_etc-0.1.0/src/lfast_etc/instrument.py +116 -0
  35. lfast_etc-0.1.0/src/lfast_etc/plotting.py +203 -0
  36. lfast_etc-0.1.0/src/lfast_etc/sky.py +77 -0
  37. lfast_etc-0.1.0/src/lfast_etc/source.py +197 -0
  38. lfast_etc-0.1.0/src/lfast_etc/telescope.py +164 -0
  39. lfast_etc-0.1.0/src/lfast_etc/web/__init__.py +0 -0
  40. lfast_etc-0.1.0/src/lfast_etc/web/app.py +248 -0
  41. lfast_etc-0.1.0/src/lfast_etc/web/templates/index.html +148 -0
  42. lfast_etc-0.1.0/src/lfast_etc.egg-info/PKG-INFO +135 -0
  43. lfast_etc-0.1.0/src/lfast_etc.egg-info/SOURCES.txt +47 -0
  44. lfast_etc-0.1.0/src/lfast_etc.egg-info/dependency_links.txt +1 -0
  45. lfast_etc-0.1.0/src/lfast_etc.egg-info/entry_points.txt +2 -0
  46. lfast_etc-0.1.0/src/lfast_etc.egg-info/requires.txt +24 -0
  47. lfast_etc-0.1.0/src/lfast_etc.egg-info/top_level.txt +1 -0
  48. lfast_etc-0.1.0/tests/test_etc.py +404 -0
  49. lfast_etc-0.1.0/tests/test_web.py +104 -0
@@ -0,0 +1,28 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2026, Schmidt Observatories
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ 1. Redistributions of source code must retain the above copyright notice, this
9
+ list of conditions and the following disclaimer.
10
+
11
+ 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ this list of conditions and the following disclaimer in the documentation
13
+ and/or other materials provided with the distribution.
14
+
15
+ 3. Neither the name of the copyright holder nor the names of its
16
+ contributors may be used to endorse or promote products derived from
17
+ this software without specific prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,135 @@
1
+ Metadata-Version: 2.4
2
+ Name: lfast-etc
3
+ Version: 0.1.0
4
+ Summary: Exposure Time Calculator for the LFAST telescope array (WIYN Bench spectrograph and CSHELL).
5
+ Author-email: Gudmundur Stefansson <gstefansson@schmidtsciences.org>
6
+ License-Expression: BSD-3-Clause
7
+ Project-URL: Homepage, https://github.com/schmidt-observatories/lfast-etc
8
+ Requires-Python: >=3.11
9
+ Description-Content-Type: text/markdown
10
+ License-File: LICENSE
11
+ Requires-Dist: numpy>=2.0
12
+ Requires-Dist: scipy>=1.10
13
+ Requires-Dist: astropy>=5.3
14
+ Requires-Dist: matplotlib>=3.7
15
+ Provides-Extra: web
16
+ Requires-Dist: flask>=3; extra == "web"
17
+ Requires-Dist: bokeh>=3.4; extra == "web"
18
+ Provides-Extra: docs
19
+ Requires-Dist: sphinx>=7; extra == "docs"
20
+ Requires-Dist: pydata-sphinx-theme>=0.15; extra == "docs"
21
+ Requires-Dist: nbsphinx; extra == "docs"
22
+ Requires-Dist: sphinx-design; extra == "docs"
23
+ Requires-Dist: sphinx-copybutton; extra == "docs"
24
+ Requires-Dist: myst-parser; extra == "docs"
25
+ Requires-Dist: ipykernel; extra == "docs"
26
+ Provides-Extra: dev
27
+ Requires-Dist: pytest; extra == "dev"
28
+ Requires-Dist: nbformat; extra == "dev"
29
+ Requires-Dist: nbclient; extra == "dev"
30
+ Requires-Dist: ipykernel; extra == "dev"
31
+ Requires-Dist: jupyter; extra == "dev"
32
+ Dynamic: license-file
33
+
34
+ ![Logo](docs/logo_schmidt_observatory_system.png)
35
+
36
+ # lfast-etc
37
+
38
+ Exposure Time Calculator for the **LFAST** telescope array at Kitt Peak (nominally 20 x 0.726 m
39
+ unit telescopes feeding one spectrograph through an 18 um fiber combiner), with two instruments:
40
+ the **WIYN Bench** spectrograph (visible; the 15 grating/order modes of the
41
+ [WIYN configuration table](https://www.wiyn.org/Instruments/wiynbench.html) that reach 400 nm, scaled from the
42
+ reference 600 @ 10.1 deg mode by `scripts/build_bench_presets.py`) and **CSHELL** (1.08-1.75 um, R up to 43,000).
43
+
44
+ The number of telescopes, the fiber, and every instrument parameter are plain inputs, so the
45
+ calculator follows the array design as it evolves. The physics is the per-resolution-element model
46
+ of the reference LFAST ETC notebook (2026-10-12) with the Choi et al. (2026, SPIE 14147)
47
+ throughput model; the test-suite reproduces that notebook to 1e-6.
48
+
49
+ ## Install
50
+
51
+ Requires Python >= 3.11 and numpy >= 2.0.
52
+
53
+ ```sh
54
+ git clone git@github.com:schmidt-observatories/lfast-etc.git
55
+ cd lfast-etc
56
+ pip install -e . # core
57
+ pip install -e ".[web]" # + browser ETC
58
+ pip install -e ".[docs]" # + Sphinx docs
59
+ ```
60
+
61
+ ## Quick start
62
+
63
+ ```python
64
+ from lfast_etc import LFASTETC, Source, Telescope
65
+
66
+ etc = LFASTETC("bench_r1800", n_telescopes=20) # presets: list_instruments()
67
+ star = Source.blackbody(5800, mag=15, band="V")
68
+ res = etc.exptime(star, snr=50) # per resolution element
69
+ res.plot(); res.summary(); res.at(550.0); res.to_table()
70
+
71
+ res = etc.snr(star, exptime=600, n_exp=3) # SNR for 600 s in 3 reads
72
+ res.plot_noise_budget(); res.plot_spectrum() # what limits you; what the spectrum looks like
73
+ etc.plot_throughput(); etc.plot_sky(); star.plot()
74
+ etc.limiting_magnitude(star, exptime=900, snr=10, wavelength=(500, 650))
75
+ etc.snr_grid(star, mags, exptimes, wavelength=(500, 650)) # sensitivity map
76
+
77
+ # scale the array
78
+ LFASTETC("cshell_r43000", telescope=Telescope(n_telescopes=40, fiber="18um"),
79
+ wavelength_min_nm=1081, wavelength_max_nm=1086)
80
+ ```
81
+
82
+ Everything is per resolution element; SNR per pixel is lower by about `sqrt(pixels_per_resel)`.
83
+ The bundled sky is grey time (moon up), so faint-end numbers are 0.3-0.5 mag pessimistic for
84
+ dark time. The docs (`docs/`, build with `make html`) have a quick start, the concepts, every
85
+ preset, the physics and its known limitations, and a plot gallery.
86
+
87
+ ## Browser ETC
88
+
89
+ ```sh
90
+ pip install -e ".[web]"
91
+ lfast-etc-web --port 5000 # http://127.0.0.1:5000 (JSON at /api/calc?...)
92
+ ```
93
+
94
+ ## Notebooks
95
+
96
+ `notebooks/` holds executed examples, written as a walkthrough for someone new to the package.
97
+ Start with 01 (the whole API, with checks and exercises at the end). 01-05 are rebuilt with
98
+ `python scripts/build_notebooks.py`: quick start, sensitivity maps and array scaling, stellar
99
+ metallicity, transient classification, exoplanet atmospheres (He 10830) with CSHELL. 06-10
100
+ (`python scripts/build_science_notebooks.py`) compare science cases versus the array size
101
+ (20 telescopes, 10 m equivalent = 200, 30 m equivalent = 1720): array-scaling overview,
102
+ LSST-era time domain, Galactic archaeology, stellar activity and flares, CSHELL NIR science.
103
+ The notebooks are generated from those scripts; edit the scripts, not the `.ipynb` files.
104
+
105
+ ## Docs
106
+
107
+ ```sh
108
+ pip install -e ".[docs]"
109
+ cd docs && make html # needs pandoc on PATH for the notebooks
110
+ ```
111
+
112
+ ## Tests
113
+
114
+ ```sh
115
+ pytest
116
+ ```
117
+
118
+ CI (GitHub Actions) runs the tests on Python 3.11-3.13 and builds the docs on every push and
119
+ pull request. Bugs and planned features are tracked in the
120
+ [issues](https://github.com/schmidt-observatories/lfast-etc/issues), labelled by area and priority.
121
+
122
+ ## Layout
123
+
124
+ ```
125
+ src/lfast_etc/ package (etc.py, source.py, telescope.py, instrument.py, sky.py, plotting.py)
126
+ src/lfast_etc/data/ throughput curves, SkyCalc table, instrument presets (TOML)
127
+ src/lfast_etc/web/ Flask + Bokeh browser ETC
128
+ notebooks/ executed example notebooks
129
+ docs/ Sphinx site
130
+ tests/ pytest, including the regression test against the reference notebook
131
+ ```
132
+
133
+ ## License
134
+
135
+ BSD 3-Clause. See [LICENSE](LICENSE).
@@ -0,0 +1,102 @@
1
+ ![Logo](docs/logo_schmidt_observatory_system.png)
2
+
3
+ # lfast-etc
4
+
5
+ Exposure Time Calculator for the **LFAST** telescope array at Kitt Peak (nominally 20 x 0.726 m
6
+ unit telescopes feeding one spectrograph through an 18 um fiber combiner), with two instruments:
7
+ the **WIYN Bench** spectrograph (visible; the 15 grating/order modes of the
8
+ [WIYN configuration table](https://www.wiyn.org/Instruments/wiynbench.html) that reach 400 nm, scaled from the
9
+ reference 600 @ 10.1 deg mode by `scripts/build_bench_presets.py`) and **CSHELL** (1.08-1.75 um, R up to 43,000).
10
+
11
+ The number of telescopes, the fiber, and every instrument parameter are plain inputs, so the
12
+ calculator follows the array design as it evolves. The physics is the per-resolution-element model
13
+ of the reference LFAST ETC notebook (2026-10-12) with the Choi et al. (2026, SPIE 14147)
14
+ throughput model; the test-suite reproduces that notebook to 1e-6.
15
+
16
+ ## Install
17
+
18
+ Requires Python >= 3.11 and numpy >= 2.0.
19
+
20
+ ```sh
21
+ git clone git@github.com:schmidt-observatories/lfast-etc.git
22
+ cd lfast-etc
23
+ pip install -e . # core
24
+ pip install -e ".[web]" # + browser ETC
25
+ pip install -e ".[docs]" # + Sphinx docs
26
+ ```
27
+
28
+ ## Quick start
29
+
30
+ ```python
31
+ from lfast_etc import LFASTETC, Source, Telescope
32
+
33
+ etc = LFASTETC("bench_r1800", n_telescopes=20) # presets: list_instruments()
34
+ star = Source.blackbody(5800, mag=15, band="V")
35
+ res = etc.exptime(star, snr=50) # per resolution element
36
+ res.plot(); res.summary(); res.at(550.0); res.to_table()
37
+
38
+ res = etc.snr(star, exptime=600, n_exp=3) # SNR for 600 s in 3 reads
39
+ res.plot_noise_budget(); res.plot_spectrum() # what limits you; what the spectrum looks like
40
+ etc.plot_throughput(); etc.plot_sky(); star.plot()
41
+ etc.limiting_magnitude(star, exptime=900, snr=10, wavelength=(500, 650))
42
+ etc.snr_grid(star, mags, exptimes, wavelength=(500, 650)) # sensitivity map
43
+
44
+ # scale the array
45
+ LFASTETC("cshell_r43000", telescope=Telescope(n_telescopes=40, fiber="18um"),
46
+ wavelength_min_nm=1081, wavelength_max_nm=1086)
47
+ ```
48
+
49
+ Everything is per resolution element; SNR per pixel is lower by about `sqrt(pixels_per_resel)`.
50
+ The bundled sky is grey time (moon up), so faint-end numbers are 0.3-0.5 mag pessimistic for
51
+ dark time. The docs (`docs/`, build with `make html`) have a quick start, the concepts, every
52
+ preset, the physics and its known limitations, and a plot gallery.
53
+
54
+ ## Browser ETC
55
+
56
+ ```sh
57
+ pip install -e ".[web]"
58
+ lfast-etc-web --port 5000 # http://127.0.0.1:5000 (JSON at /api/calc?...)
59
+ ```
60
+
61
+ ## Notebooks
62
+
63
+ `notebooks/` holds executed examples, written as a walkthrough for someone new to the package.
64
+ Start with 01 (the whole API, with checks and exercises at the end). 01-05 are rebuilt with
65
+ `python scripts/build_notebooks.py`: quick start, sensitivity maps and array scaling, stellar
66
+ metallicity, transient classification, exoplanet atmospheres (He 10830) with CSHELL. 06-10
67
+ (`python scripts/build_science_notebooks.py`) compare science cases versus the array size
68
+ (20 telescopes, 10 m equivalent = 200, 30 m equivalent = 1720): array-scaling overview,
69
+ LSST-era time domain, Galactic archaeology, stellar activity and flares, CSHELL NIR science.
70
+ The notebooks are generated from those scripts; edit the scripts, not the `.ipynb` files.
71
+
72
+ ## Docs
73
+
74
+ ```sh
75
+ pip install -e ".[docs]"
76
+ cd docs && make html # needs pandoc on PATH for the notebooks
77
+ ```
78
+
79
+ ## Tests
80
+
81
+ ```sh
82
+ pytest
83
+ ```
84
+
85
+ CI (GitHub Actions) runs the tests on Python 3.11-3.13 and builds the docs on every push and
86
+ pull request. Bugs and planned features are tracked in the
87
+ [issues](https://github.com/schmidt-observatories/lfast-etc/issues), labelled by area and priority.
88
+
89
+ ## Layout
90
+
91
+ ```
92
+ src/lfast_etc/ package (etc.py, source.py, telescope.py, instrument.py, sky.py, plotting.py)
93
+ src/lfast_etc/data/ throughput curves, SkyCalc table, instrument presets (TOML)
94
+ src/lfast_etc/web/ Flask + Bokeh browser ETC
95
+ notebooks/ executed example notebooks
96
+ docs/ Sphinx site
97
+ tests/ pytest, including the regression test against the reference notebook
98
+ ```
99
+
100
+ ## License
101
+
102
+ BSD 3-Clause. See [LICENSE](LICENSE).
@@ -0,0 +1,51 @@
1
+ [build-system]
2
+ requires = ["setuptools>=77", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "lfast-etc"
7
+ version = "0.1.0"
8
+ authors = [{ name = "Gudmundur Stefansson", email = "gstefansson@schmidtsciences.org" }]
9
+ description = "Exposure Time Calculator for the LFAST telescope array (WIYN Bench spectrograph and CSHELL)."
10
+ readme = "README.md"
11
+ license = "BSD-3-Clause"
12
+ requires-python = ">=3.11"
13
+ dependencies = [
14
+ "numpy>=2.0",
15
+ "scipy>=1.10",
16
+ "astropy>=5.3",
17
+ "matplotlib>=3.7",
18
+ ]
19
+
20
+ [project.optional-dependencies]
21
+ web = ["flask>=3", "bokeh>=3.4"]
22
+ docs = [
23
+ "sphinx>=7", "pydata-sphinx-theme>=0.15", "nbsphinx", "sphinx-design",
24
+ "sphinx-copybutton", "myst-parser", "ipykernel",
25
+ ] # plus the pandoc binary on PATH
26
+ dev = ["pytest", "nbformat", "nbclient", "ipykernel", "jupyter"]
27
+
28
+ [project.scripts]
29
+ lfast-etc-web = "lfast_etc.web.app:main"
30
+
31
+ [project.urls]
32
+ Homepage = "https://github.com/schmidt-observatories/lfast-etc"
33
+
34
+ [tool.setuptools]
35
+ package-dir = { "" = "src" }
36
+ include-package-data = true
37
+
38
+ [tool.setuptools.packages.find]
39
+ where = ["src"]
40
+
41
+ [tool.setuptools.package-data]
42
+ "lfast_etc" = [
43
+ "data/throughput/*.npy",
44
+ "data/sky/*.fits",
45
+ "data/config/*.toml",
46
+ "web/templates/*.html",
47
+ ]
48
+
49
+ [tool.pytest.ini_options]
50
+ testpaths = ["tests"]
51
+ pythonpath = ["tests"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,27 @@
1
+ """lfast_etc: Exposure Time Calculator for the LFAST telescope array.
2
+
3
+ Quick start::
4
+
5
+ from lfast_etc import LFASTETC, Source
6
+ etc = LFASTETC("bench_r1800", n_telescopes=20)
7
+ src = Source.blackbody(5800, mag=15, band="V")
8
+ res = etc.exptime(src, snr=50)
9
+ res.plot()
10
+ """
11
+ import importlib.metadata
12
+
13
+ try:
14
+ __version__ = importlib.metadata.version("lfast-etc")
15
+ except importlib.metadata.PackageNotFoundError: # pragma: no cover
16
+ __version__ = "0.0.0"
17
+
18
+ from .instrument import Instrument, list_instruments
19
+ from .telescope import Telescope
20
+ from .source import Source, BANDS
21
+ from .sky import Sky
22
+ from .etc import LFASTETC, ETCResult
23
+
24
+ __all__ = [
25
+ "__version__", "LFASTETC", "ETCResult", "Instrument", "list_instruments",
26
+ "Telescope", "Source", "Sky", "BANDS",
27
+ ]
@@ -0,0 +1,23 @@
1
+ """Physical constants (SI) and package data paths."""
2
+ from pathlib import Path
3
+ import numpy as np
4
+
5
+ H_PLANCK = 6.62607015e-34 # J s
6
+ C_LIGHT = 2.99792458e8 # m/s
7
+ K_BOLTZMANN = 1.380649e-23 # J/K
8
+
9
+ DATA_DIR = Path(__file__).parent / "data"
10
+
11
+
12
+ def positive(name, value, allow_zero=False):
13
+ """Validate a scalar parameter at the public boundary; returns it as float."""
14
+ try:
15
+ v = float(value)
16
+ except (TypeError, ValueError):
17
+ raise ValueError(f"{name} must be a number, got {value!r}") from None
18
+ if not np.isfinite(v) or v < 0 or (v == 0 and not allow_zero):
19
+ raise ValueError(f"{name} must be {'>= 0' if allow_zero else '> 0'}, got {value!r}")
20
+ return v
21
+ THROUGHPUT_DIR = DATA_DIR / "throughput"
22
+ SKY_DIR = DATA_DIR / "sky"
23
+ CONFIG_DIR = DATA_DIR / "config"
@@ -0,0 +1,18 @@
1
+ # WIYN Bench spectrograph, 1200 @ 28.7 grating, order 1, blaze peak 7500 A.
2
+ # Row of https://www.wiyn.org/Instruments/wiynbench.html; generated by
3
+ # scripts/build_bench_presets.py from the bench_r1800 anchor (see that script).
4
+ # Table coverage 1231 A, red-cable resolution 1.19 A at 2x2 binning.
5
+ [instrument]
6
+ name = "bench_1200_28p7_o1"
7
+ description = "WIYN Bench, 1200 @ 28.7 deg, order 1, 688-812 nm, R~6910"
8
+ wavelength_min_nm = 688.5
9
+ wavelength_max_nm = 811.5
10
+ resolving_power = 6910
11
+ pixels_per_resel = 2.2 # dispersion direction only, as bench_r1800
12
+ spectrograph_efficiency = 0.229 # grating peak efficiency 55% vs 72% for the 600 @ 10.1 anchor
13
+ slit_throughput = 1.0
14
+ qe = 0.75 # placeholder flat QE, as bench_r1800
15
+ dark_current = 3.0e-4 # e-/s/pix
16
+ read_noise = 3.7 # e-/pix
17
+ full_well = 100000.0 # placeholder
18
+ min_exptime = 1.0
@@ -0,0 +1,18 @@
1
+ # WIYN Bench spectrograph, 1200 @ 28.7 grating, order 2, blaze peak 4000 A.
2
+ # Row of https://www.wiyn.org/Instruments/wiynbench.html; generated by
3
+ # scripts/build_bench_presets.py from the bench_r1800 anchor (see that script).
4
+ # Table coverage 615 A, red-cable resolution 0.58 A at 2x2 binning.
5
+ [instrument]
6
+ name = "bench_1200_28p7_o2"
7
+ description = "WIYN Bench, 1200 @ 28.7 deg, order 2, 400-431 nm, R~7560 (clipped at 400 nm)"
8
+ wavelength_min_nm = 400.0
9
+ wavelength_max_nm = 430.8
10
+ resolving_power = 7561
11
+ pixels_per_resel = 2.2 # dispersion direction only, as bench_r1800
12
+ spectrograph_efficiency = 0.229 # grating peak efficiency 55% vs 72% for the 600 @ 10.1 anchor
13
+ slit_throughput = 1.0
14
+ qe = 0.75 # placeholder flat QE, as bench_r1800
15
+ dark_current = 3.0e-4 # e-/s/pix
16
+ read_noise = 3.7 # e-/pix
17
+ full_well = 100000.0 # placeholder
18
+ min_exptime = 1.0
@@ -0,0 +1,18 @@
1
+ # WIYN Bench spectrograph, 316 @ 63.4 grating, order 9, blaze peak 6563 A.
2
+ # Row of https://www.wiyn.org/Instruments/wiynbench.html; generated by
3
+ # scripts/build_bench_presets.py from the bench_r1800 anchor (see that script).
4
+ # Table coverage 250 A, red-cable resolution 0.23 A at 2x2 binning.
5
+ [instrument]
6
+ name = "bench_316_63p4_o9"
7
+ description = "WIYN Bench, 316 @ 63.4 deg, order 9, 644-669 nm, R~31280"
8
+ wavelength_min_nm = 643.8
9
+ wavelength_max_nm = 668.8
10
+ resolving_power = 31284
11
+ pixels_per_resel = 2.2 # dispersion direction only, as bench_r1800
12
+ spectrograph_efficiency = 0.208 # grating peak efficiency 50% vs 72% for the 600 @ 10.1 anchor
13
+ slit_throughput = 1.0
14
+ qe = 0.75 # placeholder flat QE, as bench_r1800
15
+ dark_current = 3.0e-4 # e-/s/pix
16
+ read_noise = 3.7 # e-/pix
17
+ full_well = 100000.0 # placeholder
18
+ min_exptime = 1.0
@@ -0,0 +1,18 @@
1
+ # WIYN Bench spectrograph, 316 @ 7.0 grating, order 1, blaze peak 7500 A.
2
+ # Row of https://www.wiyn.org/Instruments/wiynbench.html; generated by
3
+ # scripts/build_bench_presets.py from the bench_r1800 anchor (see that script).
4
+ # Table coverage 5290 A, red-cable resolution 5.72 A at 2x2 binning.
5
+ [instrument]
6
+ name = "bench_316_7p0_o1"
7
+ description = "WIYN Bench, 316 @ 7.0 deg, order 1, 486-1014 nm, R~1440"
8
+ wavelength_min_nm = 485.5
9
+ wavelength_max_nm = 1014.5
10
+ resolving_power = 1438
11
+ pixels_per_resel = 2.2 # dispersion direction only, as bench_r1800
12
+ spectrograph_efficiency = 0.292 # grating peak efficiency 70% vs 72% for the 600 @ 10.1 anchor
13
+ slit_throughput = 1.0
14
+ qe = 0.75 # placeholder flat QE, as bench_r1800
15
+ dark_current = 3.0e-4 # e-/s/pix
16
+ read_noise = 3.7 # e-/pix
17
+ full_well = 100000.0 # placeholder
18
+ min_exptime = 1.0
@@ -0,0 +1,18 @@
1
+ # WIYN Bench spectrograph, 316 @ 7.0 grating, order 2, blaze peak 3750 A.
2
+ # Row of https://www.wiyn.org/Instruments/wiynbench.html; generated by
3
+ # scripts/build_bench_presets.py from the bench_r1800 anchor (see that script).
4
+ # Table coverage 2645 A, red-cable resolution 2.86 A at 2x2 binning.
5
+ [instrument]
6
+ name = "bench_316_7p0_o2"
7
+ description = "WIYN Bench, 316 @ 7.0 deg, order 2, 400-507 nm, R~1440 (clipped at 400 nm)"
8
+ wavelength_min_nm = 400.0
9
+ wavelength_max_nm = 507.2
10
+ resolving_power = 1438
11
+ pixels_per_resel = 2.2 # dispersion direction only, as bench_r1800
12
+ spectrograph_efficiency = 0.292 # grating peak efficiency 70% vs 72% for the 600 @ 10.1 anchor
13
+ slit_throughput = 1.0
14
+ qe = 0.75 # placeholder flat QE, as bench_r1800
15
+ dark_current = 3.0e-4 # e-/s/pix
16
+ read_noise = 3.7 # e-/pix
17
+ full_well = 100000.0 # placeholder
18
+ min_exptime = 1.0
@@ -0,0 +1,18 @@
1
+ # WIYN Bench spectrograph, 3300 VPH grating, order 1, blaze peak 5120 A.
2
+ # Row of https://www.wiyn.org/Instruments/wiynbench.html; generated by
3
+ # scripts/build_bench_presets.py from the bench_r1800 anchor (see that script).
4
+ # Table coverage 273 A, red-cable resolution 0.31 A at 2x2 binning.
5
+ [instrument]
6
+ name = "bench_3300vph_o1"
7
+ description = "WIYN Bench, 3300 VPH, order 1, 498-526 nm, R~18110"
8
+ wavelength_min_nm = 498.4
9
+ wavelength_max_nm = 525.6
10
+ resolving_power = 18108
11
+ pixels_per_resel = 2.2 # dispersion direction only, as bench_r1800
12
+ spectrograph_efficiency = 0.300 # no peak efficiency listed for the VPH gratings: anchor value kept
13
+ slit_throughput = 1.0
14
+ qe = 0.75 # placeholder flat QE, as bench_r1800
15
+ dark_current = 3.0e-4 # e-/s/pix
16
+ read_noise = 3.7 # e-/pix
17
+ full_well = 100000.0 # placeholder
18
+ min_exptime = 1.0
@@ -0,0 +1,18 @@
1
+ # WIYN Bench spectrograph, 400 @ 4.2 grating, order 1, blaze peak 5000 A.
2
+ # Row of https://www.wiyn.org/Instruments/wiynbench.html; generated by
3
+ # scripts/build_bench_presets.py from the bench_r1800 anchor (see that script).
4
+ # Table coverage 4199 A, red-cable resolution 4.56 A at 2x2 binning.
5
+ [instrument]
6
+ name = "bench_400_4p2_o1"
7
+ description = "WIYN Bench, 400 @ 4.2 deg, order 1, 400-710 nm, R~1200 (clipped at 400 nm) (not recommended by WIYN: hard to focus over the range)"
8
+ wavelength_min_nm = 400.0
9
+ wavelength_max_nm = 710.0
10
+ resolving_power = 1202
11
+ pixels_per_resel = 2.2 # dispersion direction only, as bench_r1800
12
+ spectrograph_efficiency = 0.292 # grating peak efficiency 70% vs 72% for the 600 @ 10.1 anchor
13
+ slit_throughput = 1.0
14
+ qe = 0.75 # placeholder flat QE, as bench_r1800
15
+ dark_current = 3.0e-4 # e-/s/pix
16
+ read_noise = 3.7 # e-/pix
17
+ full_well = 100000.0 # placeholder
18
+ min_exptime = 1.0
@@ -0,0 +1,18 @@
1
+ # WIYN Bench spectrograph, 600 @ 13.9 grating, order 1, blaze peak 7500 A.
2
+ # Row of https://www.wiyn.org/Instruments/wiynbench.html; generated by
3
+ # scripts/build_bench_presets.py from the bench_r1800 anchor (see that script).
4
+ # Table coverage 2724 A, red-cable resolution 2.86 A at 2x2 binning.
5
+ [instrument]
6
+ name = "bench_600_13p9_o1"
7
+ description = "WIYN Bench, 600 @ 13.9 deg, order 1, 614-886 nm, R~2880"
8
+ wavelength_min_nm = 613.8
9
+ wavelength_max_nm = 886.2
10
+ resolving_power = 2875
11
+ pixels_per_resel = 2.2 # dispersion direction only, as bench_r1800
12
+ spectrograph_efficiency = 0.292 # grating peak efficiency 70% vs 72% for the 600 @ 10.1 anchor
13
+ slit_throughput = 1.0
14
+ qe = 0.75 # placeholder flat QE, as bench_r1800
15
+ dark_current = 3.0e-4 # e-/s/pix
16
+ read_noise = 3.7 # e-/pix
17
+ full_well = 100000.0 # placeholder
18
+ min_exptime = 1.0
@@ -0,0 +1,18 @@
1
+ # WIYN Bench spectrograph, 600 @ 13.9 grating, order 2, blaze peak 3800 A.
2
+ # Row of https://www.wiyn.org/Instruments/wiynbench.html; generated by
3
+ # scripts/build_bench_presets.py from the bench_r1800 anchor (see that script).
4
+ # Table coverage 1362 A, red-cable resolution 1.43 A at 2x2 binning.
5
+ [instrument]
6
+ name = "bench_600_13p9_o2"
7
+ description = "WIYN Bench, 600 @ 13.9 deg, order 2, 400-448 nm, R~2910 (clipped at 400 nm)"
8
+ wavelength_min_nm = 400.0
9
+ wavelength_max_nm = 448.1
10
+ resolving_power = 2913
11
+ pixels_per_resel = 2.2 # dispersion direction only, as bench_r1800
12
+ spectrograph_efficiency = 0.292 # grating peak efficiency 70% vs 72% for the 600 @ 10.1 anchor
13
+ slit_throughput = 1.0
14
+ qe = 0.75 # placeholder flat QE, as bench_r1800
15
+ dark_current = 3.0e-4 # e-/s/pix
16
+ read_noise = 3.7 # e-/pix
17
+ full_well = 100000.0 # placeholder
18
+ min_exptime = 1.0
@@ -0,0 +1,18 @@
1
+ # WIYN Bench spectrograph, 740 VPH grating, order 1, blaze peak 8798 A.
2
+ # Row of https://www.wiyn.org/Instruments/wiynbench.html; generated by
3
+ # scripts/build_bench_presets.py from the bench_r1800 anchor (see that script).
4
+ # Table coverage 2152 A, red-cable resolution 2.68 A at 2x2 binning.
5
+ [instrument]
6
+ name = "bench_740vph_o1"
7
+ description = "WIYN Bench, 740 VPH, order 1, 772-987 nm, R~3600"
8
+ wavelength_min_nm = 772.2
9
+ wavelength_max_nm = 987.4
10
+ resolving_power = 3599
11
+ pixels_per_resel = 2.2 # dispersion direction only, as bench_r1800
12
+ spectrograph_efficiency = 0.300 # no peak efficiency listed for the VPH gratings: anchor value kept
13
+ slit_throughput = 1.0
14
+ qe = 0.75 # placeholder flat QE, as bench_r1800
15
+ dark_current = 3.0e-4 # e-/s/pix
16
+ read_noise = 3.7 # e-/pix
17
+ full_well = 100000.0 # placeholder
18
+ min_exptime = 1.0
@@ -0,0 +1,18 @@
1
+ # WIYN Bench spectrograph, 740 VPH grating, order 2, blaze peak 5000 A.
2
+ # Row of https://www.wiyn.org/Instruments/wiynbench.html; generated by
3
+ # scripts/build_bench_presets.py from the bench_r1800 anchor (see that script).
4
+ # Table coverage 1076 A, red-cable resolution 1.34 A at 2x2 binning.
5
+ [instrument]
6
+ name = "bench_740vph_o2"
7
+ description = "WIYN Bench, 740 VPH, order 2, 446-554 nm, R~4090"
8
+ wavelength_min_nm = 446.2
9
+ wavelength_max_nm = 553.8
10
+ resolving_power = 4091
11
+ pixels_per_resel = 2.2 # dispersion direction only, as bench_r1800
12
+ spectrograph_efficiency = 0.300 # no peak efficiency listed for the VPH gratings: anchor value kept
13
+ slit_throughput = 1.0
14
+ qe = 0.75 # placeholder flat QE, as bench_r1800
15
+ dark_current = 3.0e-4 # e-/s/pix
16
+ read_noise = 3.7 # e-/pix
17
+ full_well = 100000.0 # placeholder
18
+ min_exptime = 1.0
@@ -0,0 +1,18 @@
1
+ # WIYN Bench spectrograph, 860 @ 30.9 grating, order 1, blaze peak 10800 A.
2
+ # Row of https://www.wiyn.org/Instruments/wiynbench.html; generated by
3
+ # scripts/build_bench_presets.py from the bench_r1800 anchor (see that script).
4
+ # Table coverage 1680 A, red-cable resolution 1.64 A at 2x2 binning.
5
+ [instrument]
6
+ name = "bench_860_30p9_o1"
7
+ description = "WIYN Bench, 860 @ 30.9 deg, order 1, 996-1164 nm, R~7220"
8
+ wavelength_min_nm = 996.0
9
+ wavelength_max_nm = 1164.0
10
+ resolving_power = 7220
11
+ pixels_per_resel = 2.2 # dispersion direction only, as bench_r1800
12
+ spectrograph_efficiency = 0.271 # grating peak efficiency 65% vs 72% for the 600 @ 10.1 anchor
13
+ slit_throughput = 1.0
14
+ qe = 0.75 # placeholder flat QE, as bench_r1800
15
+ dark_current = 3.0e-4 # e-/s/pix
16
+ read_noise = 3.7 # e-/pix
17
+ full_well = 100000.0 # placeholder
18
+ min_exptime = 1.0
@@ -0,0 +1,18 @@
1
+ # WIYN Bench spectrograph, 860 @ 30.9 grating, order 2, blaze peak 6000 A.
2
+ # Row of https://www.wiyn.org/Instruments/wiynbench.html; generated by
3
+ # scripts/build_bench_presets.py from the bench_r1800 anchor (see that script).
4
+ # Table coverage 840 A, red-cable resolution 0.77 A at 2x2 binning.
5
+ [instrument]
6
+ name = "bench_860_30p9_o2"
7
+ description = "WIYN Bench, 860 @ 30.9 deg, order 2, 558-642 nm, R~8540"
8
+ wavelength_min_nm = 558.0
9
+ wavelength_max_nm = 642.0
10
+ resolving_power = 8543
11
+ pixels_per_resel = 2.2 # dispersion direction only, as bench_r1800
12
+ spectrograph_efficiency = 0.271 # grating peak efficiency 65% vs 72% for the 600 @ 10.1 anchor
13
+ slit_throughput = 1.0
14
+ qe = 0.75 # placeholder flat QE, as bench_r1800
15
+ dark_current = 3.0e-4 # e-/s/pix
16
+ read_noise = 3.7 # e-/pix
17
+ full_well = 100000.0 # placeholder
18
+ min_exptime = 1.0
@@ -0,0 +1,18 @@
1
+ # WIYN Bench spectrograph, 860 @ 30.9 grating, order 3, blaze peak 4000 A.
2
+ # Row of https://www.wiyn.org/Instruments/wiynbench.html; generated by
3
+ # scripts/build_bench_presets.py from the bench_r1800 anchor (see that script).
4
+ # Table coverage 560 A, red-cable resolution 0.52 A at 2x2 binning.
5
+ [instrument]
6
+ name = "bench_860_30p9_o3"
7
+ description = "WIYN Bench, 860 @ 30.9 deg, order 3, 400-428 nm, R~8430 (clipped at 400 nm)"
8
+ wavelength_min_nm = 400.0
9
+ wavelength_max_nm = 428.0
10
+ resolving_power = 8434
11
+ pixels_per_resel = 2.2 # dispersion direction only, as bench_r1800
12
+ spectrograph_efficiency = 0.271 # grating peak efficiency 65% vs 72% for the 600 @ 10.1 anchor
13
+ slit_throughput = 1.0
14
+ qe = 0.75 # placeholder flat QE, as bench_r1800
15
+ dark_current = 3.0e-4 # e-/s/pix
16
+ read_noise = 3.7 # e-/pix
17
+ full_well = 100000.0 # placeholder
18
+ min_exptime = 1.0