PyDIET 0.9.3__py3-none-any.whl

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 (177) hide show
  1. pydiet/__init__.py +12 -0
  2. pydiet/api_client/__init__.py +6 -0
  3. pydiet/api_client/client.py +57 -0
  4. pydiet/cmd/__init__.py +9 -0
  5. pydiet/cmd/start.py +107 -0
  6. pydiet/data/data_config.toml +242 -0
  7. pydiet/data/description.txt +1 -0
  8. pydiet/data/instruments/description.txt +1 -0
  9. pydiet/data/instruments/megacam/default +0 -0
  10. pydiet/data/instruments/megacam/description.txt +1 -0
  11. pydiet/data/instruments/megacam/detector/description.txt +1 -0
  12. pydiet/data/instruments/megacam/detector/qe/MegaCam_QE.average.fits +0 -0
  13. pydiet/data/instruments/megacam/detector/qe/description.txt +2 -0
  14. pydiet/data/instruments/megacam/filters/CaHK.MP9303.fits +0 -0
  15. pydiet/data/instruments/megacam/filters/Ha.MP9603.fits +0 -0
  16. pydiet/data/instruments/megacam/filters/HaOFF.MP9604.fits +0 -0
  17. pydiet/data/instruments/megacam/filters/M4112.MP9403.fits +0 -0
  18. pydiet/data/instruments/megacam/filters/M4376.MP9404.fits +0 -0
  19. pydiet/data/instruments/megacam/filters/OIII.MP9501.fits +0 -0
  20. pydiet/data/instruments/megacam/filters/OIIIOFF.MP9502.fits +0 -0
  21. pydiet/data/instruments/megacam/filters/description.txt +1 -0
  22. pydiet/data/instruments/megacam/filters/g.MP9402.fits +0 -0
  23. pydiet/data/instruments/megacam/filters/gri.MP9605.fits +0 -0
  24. pydiet/data/instruments/megacam/filters/i.MP9703.fits +0 -0
  25. pydiet/data/instruments/megacam/filters/r.MP9602.fits +0 -0
  26. pydiet/data/instruments/megacam/filters/u.MP9302.fits +0 -0
  27. pydiet/data/instruments/megacam/filters/z.MP9901.fits +0 -0
  28. pydiet/data/instruments/megacam/optics/description.txt +2 -0
  29. pydiet/data/instruments/megacam/optics/transmission/MegaPrime_transmission.fits +0 -0
  30. pydiet/data/instruments/megacam/optics/transmission/description.txt +2 -0
  31. pydiet/data/instruments/wircam/description.txt +1 -0
  32. pydiet/data/instruments/wircam/detector/description.txt +1 -0
  33. pydiet/data/instruments/wircam/detector/qe/WIRCam_QE.average.fits +0 -0
  34. pydiet/data/instruments/wircam/detector/qe/description.txt +2 -0
  35. pydiet/data/instruments/wircam/filters/BrG.WC8305.fits +0 -0
  36. pydiet/data/instruments/wircam/filters/CH4Off.WC8204.fits +0 -0
  37. pydiet/data/instruments/wircam/filters/CH4On.WC8203.fits +0 -0
  38. pydiet/data/instruments/wircam/filters/CO.WC8306.fits +0 -0
  39. pydiet/data/instruments/wircam/filters/H.WC8201.fits +0 -0
  40. pydiet/data/instruments/wircam/filters/H.WC8202.fits +0 -0
  41. pydiet/data/instruments/wircam/filters/H2.WC8304.fits +0 -0
  42. pydiet/data/instruments/wircam/filters/J.WC8101.fits +0 -0
  43. pydiet/data/instruments/wircam/filters/J.WC8103.fits +0 -0
  44. pydiet/data/instruments/wircam/filters/Kcont.WC8303.fits +0 -0
  45. pydiet/data/instruments/wircam/filters/Ks.WC8301.fits +0 -0
  46. pydiet/data/instruments/wircam/filters/Ks.WC8302.fits +0 -0
  47. pydiet/data/instruments/wircam/filters/LowOH1.WC8104.fits +0 -0
  48. pydiet/data/instruments/wircam/filters/LowOH2.WC8102.fits +0 -0
  49. pydiet/data/instruments/wircam/filters/W.WC8105.fits +0 -0
  50. pydiet/data/instruments/wircam/filters/Y.WC8002.fits +0 -0
  51. pydiet/data/instruments/wircam/filters/description.txt +1 -0
  52. pydiet/data/instruments/wircam/optics/description.txt +2 -0
  53. pydiet/data/instruments/wircam/optics/transmission/WIRCam_transmission.fits +0 -0
  54. pydiet/data/instruments/wircam/optics/transmission/description.txt +2 -0
  55. pydiet/data/sites/description.txt +1 -0
  56. pydiet/data/sites/mko/default +0 -0
  57. pydiet/data/sites/mko/description.txt +2 -0
  58. pydiet/data/sites/mko/emission/MKO_emission.bright.AM1.0.fits +0 -0
  59. pydiet/data/sites/mko/emission/MKO_emission.bright.AM1.1.fits +0 -0
  60. pydiet/data/sites/mko/emission/MKO_emission.bright.AM1.2.fits +0 -0
  61. pydiet/data/sites/mko/emission/MKO_emission.bright.AM1.3.fits +0 -0
  62. pydiet/data/sites/mko/emission/MKO_emission.bright.AM1.4.fits +0 -0
  63. pydiet/data/sites/mko/emission/MKO_emission.bright.AM1.5.fits +0 -0
  64. pydiet/data/sites/mko/emission/MKO_emission.bright.AM1.6.fits +0 -0
  65. pydiet/data/sites/mko/emission/MKO_emission.bright.AM1.7.fits +0 -0
  66. pydiet/data/sites/mko/emission/MKO_emission.bright.AM1.8.fits +0 -0
  67. pydiet/data/sites/mko/emission/MKO_emission.bright.AM1.9.fits +0 -0
  68. pydiet/data/sites/mko/emission/MKO_emission.bright.AM2.0.fits +0 -0
  69. pydiet/data/sites/mko/emission/MKO_emission.bright.AM2.5.fits +0 -0
  70. pydiet/data/sites/mko/emission/MKO_emission.bright.AM3.0.fits +0 -0
  71. pydiet/data/sites/mko/emission/MKO_emission.dark.AM1.0.fits +0 -0
  72. pydiet/data/sites/mko/emission/MKO_emission.dark.AM1.1.fits +0 -0
  73. pydiet/data/sites/mko/emission/MKO_emission.dark.AM1.2.fits +0 -0
  74. pydiet/data/sites/mko/emission/MKO_emission.dark.AM1.3.fits +0 -0
  75. pydiet/data/sites/mko/emission/MKO_emission.dark.AM1.4.fits +0 -0
  76. pydiet/data/sites/mko/emission/MKO_emission.dark.AM1.5.fits +0 -0
  77. pydiet/data/sites/mko/emission/MKO_emission.dark.AM1.6.fits +0 -0
  78. pydiet/data/sites/mko/emission/MKO_emission.dark.AM1.7.fits +0 -0
  79. pydiet/data/sites/mko/emission/MKO_emission.dark.AM1.8.fits +0 -0
  80. pydiet/data/sites/mko/emission/MKO_emission.dark.AM1.9.fits +0 -0
  81. pydiet/data/sites/mko/emission/MKO_emission.dark.AM2.0.fits +0 -0
  82. pydiet/data/sites/mko/emission/MKO_emission.dark.AM2.5.fits +0 -0
  83. pydiet/data/sites/mko/emission/MKO_emission.dark.AM3.0.fits +0 -0
  84. pydiet/data/sites/mko/emission/MKO_emission.grey.AM1.0.fits +0 -0
  85. pydiet/data/sites/mko/emission/MKO_emission.grey.AM1.1.fits +0 -0
  86. pydiet/data/sites/mko/emission/MKO_emission.grey.AM1.2.fits +0 -0
  87. pydiet/data/sites/mko/emission/MKO_emission.grey.AM1.3.fits +0 -0
  88. pydiet/data/sites/mko/emission/MKO_emission.grey.AM1.4.fits +0 -0
  89. pydiet/data/sites/mko/emission/MKO_emission.grey.AM1.5.fits +0 -0
  90. pydiet/data/sites/mko/emission/MKO_emission.grey.AM1.6.fits +0 -0
  91. pydiet/data/sites/mko/emission/MKO_emission.grey.AM1.7.fits +0 -0
  92. pydiet/data/sites/mko/emission/MKO_emission.grey.AM1.8.fits +0 -0
  93. pydiet/data/sites/mko/emission/MKO_emission.grey.AM1.9.fits +0 -0
  94. pydiet/data/sites/mko/emission/MKO_emission.grey.AM2.0.fits +0 -0
  95. pydiet/data/sites/mko/emission/MKO_emission.grey.AM2.5.fits +0 -0
  96. pydiet/data/sites/mko/emission/MKO_emission.grey.AM3.0.fits +0 -0
  97. pydiet/data/sites/mko/emission/description.txt +5 -0
  98. pydiet/data/sites/mko/transmission/MKO_transmission.AM1.0.fits +0 -0
  99. pydiet/data/sites/mko/transmission/MKO_transmission.AM1.1.fits +0 -0
  100. pydiet/data/sites/mko/transmission/MKO_transmission.AM1.2.fits +0 -0
  101. pydiet/data/sites/mko/transmission/MKO_transmission.AM1.3.fits +0 -0
  102. pydiet/data/sites/mko/transmission/MKO_transmission.AM1.4.fits +0 -0
  103. pydiet/data/sites/mko/transmission/MKO_transmission.AM1.5.fits +0 -0
  104. pydiet/data/sites/mko/transmission/MKO_transmission.AM1.6.fits +0 -0
  105. pydiet/data/sites/mko/transmission/MKO_transmission.AM1.7.fits +0 -0
  106. pydiet/data/sites/mko/transmission/MKO_transmission.AM1.8.fits +0 -0
  107. pydiet/data/sites/mko/transmission/MKO_transmission.AM1.9.fits +0 -0
  108. pydiet/data/sites/mko/transmission/MKO_transmission.AM2.0.fits +0 -0
  109. pydiet/data/sites/mko/transmission/MKO_transmission.AM2.5.fits +0 -0
  110. pydiet/data/sites/mko/transmission/MKO_transmission.AM3.0.fits +0 -0
  111. pydiet/data/sites/mko/transmission/MKO_transmission.AM3.5.fits +0 -0
  112. pydiet/data/sites/mko/transmission/MKO_transmission.AM4.0.fits +0 -0
  113. pydiet/data/sites/mko/transmission/MKO_transmission.AM4.5.fits +0 -0
  114. pydiet/data/sites/mko/transmission/MKO_transmission.AM5.0.fits +0 -0
  115. pydiet/data/sites/mko/transmission/description.txt +5 -0
  116. pydiet/data/telescopes/cfht/default +0 -0
  117. pydiet/data/telescopes/cfht/description.txt +1 -0
  118. pydiet/data/telescopes/cfht/emission/description.txt +2 -0
  119. pydiet/data/telescopes/cfht/transmission/CFHT_M1_transmission.fits +0 -0
  120. pydiet/data/telescopes/cfht/transmission/description.txt +1 -0
  121. pydiet/data/telescopes/description.txt +1 -0
  122. pydiet/package.py +55 -0
  123. pydiet/py.typed +0 -0
  124. pydiet/server/__init__.py +9 -0
  125. pydiet/server/app.py +369 -0
  126. pydiet/server/config/__init__.py +51 -0
  127. pydiet/server/config/config.py +330 -0
  128. pydiet/server/config/fields.py +49 -0
  129. pydiet/server/config/settings.py +166 -0
  130. pydiet/server/data.py +31 -0
  131. pydiet/server/datafiles.py +367 -0
  132. pydiet/server/image.py +342 -0
  133. pydiet/server/models/__init__.py +34 -0
  134. pydiet/server/models/dataconfig.py +195 -0
  135. pydiet/server/models/default.py +9 -0
  136. pydiet/server/models/exceptions.py +9 -0
  137. pydiet/server/models/instrument.py +314 -0
  138. pydiet/server/models/query.py +172 -0
  139. pydiet/server/models/response.py +97 -0
  140. pydiet/server/models/types.py +35 -0
  141. pydiet/server/photsys.py +71 -0
  142. pydiet/server/response.py +237 -0
  143. pydiet/server/types/__init__.py +8 -0
  144. pydiet/server/types/quantity.py +532 -0
  145. pydiet/server/types/string.py +318 -0
  146. pydiet/templates/common/base.html +80 -0
  147. pydiet/templates/common/plot_filter.html +17 -0
  148. pydiet/templates/common/privacy.html +132 -0
  149. pydiet/templates/common/settings.html +23 -0
  150. pydiet/templates/common/terms.html +101 -0
  151. pydiet/templates/megacam/etc_form.html +319 -0
  152. pydiet/templates/megacam/etc_results.html +190 -0
  153. pydiet/templates/wircam/etc_form.html +319 -0
  154. pydiet/templates/wircam/etc_results.html +190 -0
  155. pydiet/web_client/css/style.css +221 -0
  156. pydiet/web_client/dist/pydiet.js +31 -0
  157. pydiet/web_client/images/logo.svg +6 -0
  158. pydiet/web_client/images/megacam/background.jpg +0 -0
  159. pydiet/web_client/images/megacam/logo.png +0 -0
  160. pydiet/web_client/images/wircam/background.jpg +0 -0
  161. pydiet/web_client/images/wircam/logo.png +0 -0
  162. pydiet/web_client/js/dom.js +51 -0
  163. pydiet/web_client/js/etc.js +63 -0
  164. pydiet/web_client/js/fetch.js +49 -0
  165. pydiet/web_client/js/instrument.js +62 -0
  166. pydiet/web_client/js/main.js +15 -0
  167. pydiet/web_client/js/plot.js +88 -0
  168. pydiet/web_client/js/settings.js +57 -0
  169. pydiet/web_client/js/theme.js +43 -0
  170. pydiet/web_client/js/url.js +12 -0
  171. pydiet/web_client/jsdoc.json +20 -0
  172. pydiet/web_client/package.json +83 -0
  173. pydiet-0.9.3.dist-info/METADATA +118 -0
  174. pydiet-0.9.3.dist-info/RECORD +177 -0
  175. pydiet-0.9.3.dist-info/WHEEL +4 -0
  176. pydiet-0.9.3.dist-info/entry_points.txt +5 -0
  177. pydiet-0.9.3.dist-info/licenses/LICENSE +21 -0
pydiet/__init__.py ADDED
@@ -0,0 +1,12 @@
1
+ """
2
+ PyDIET
3
+ ======
4
+
5
+ [CFHT](https://www.cfht.hawaii.edu)'s new Direct Imaging Exposure Time calculator.
6
+ """
7
+ # Copyright CFHT/CNRS
8
+ # Licensed under the MIT license
9
+
10
+ from .api_client.client import Client
11
+ from .server.models import ETCQueryModel, ETCResponseModel
12
+
@@ -0,0 +1,6 @@
1
+ """
2
+ PyDIET API client subpackage
3
+ """
4
+ # Copyright (c) 2024 - 2026 DAp/CEA/AIM/OSUPS/UParisSaclay
5
+ # Licensed under the MIT licence
6
+
@@ -0,0 +1,57 @@
1
+ #! /usr/bin/python3
2
+ """
3
+ Python client functions for harvesting results from the PyDIET ETC
4
+ """
5
+ # Copyright (c) 2024 - 2026 CFHT/CNRS/CEA-AIM/OSUPS-UParisSaclay
6
+ # Licensed under the MIT licence
7
+
8
+ from typing import Optional
9
+
10
+ import httpx
11
+ from pydantic import ValidationError
12
+
13
+ from ..server.models.query import ETCQueryModel
14
+ from ..server.models.response import ETCResponseModel
15
+ from ..server.config import settings
16
+
17
+
18
+ class Client:
19
+ def __init__(self, api_url: Optional[str]=None) -> None:
20
+ self.api_url = f"http://{settings['host']}" \
21
+ f":{settings['port']}{settings['api_path']}" if api_url is None \
22
+ else api_url
23
+
24
+
25
+ def query(
26
+ self,
27
+ query: ETCQueryModel,
28
+ timeout: float=10.) -> ETCResponseModel:
29
+ headers: dict[str, str] = {"Accept": "application/json"}
30
+ print(f"{self.api_url}/{query.instrument.value}")
31
+ try:
32
+ with httpx.Client(timeout=timeout, headers=headers) as client:
33
+ response = client.get(
34
+ f"{self.api_url}/{query.instrument.value}",
35
+ params=query.model_dump(
36
+ exclude={"instrument"},
37
+ exclude_none=True,
38
+ mode="json"
39
+ )
40
+ )
41
+ response.raise_for_status()
42
+ payload = response.json()
43
+ except httpx.HTTPStatusError as exc:
44
+ raise RuntimeError(
45
+ f"HTTP error {exc.response.status_code}: {exc.response.text}"
46
+ ) from exc
47
+ except httpx.HTTPError as exc:
48
+ raise RuntimeError(f"Transport error: {exc}") from exc
49
+ except ValueError as exc:
50
+ raise RuntimeError("Response was not valid JSON") from exc
51
+
52
+ try:
53
+ return ETCResponseModel.model_validate(payload)
54
+ except ValidationError as exc:
55
+ raise RuntimeError(f"Invalid response schema: {exc}") from exc
56
+
57
+
pydiet/cmd/__init__.py ADDED
@@ -0,0 +1,9 @@
1
+ """
2
+ PyDIET
3
+ ======
4
+
5
+ [CFHT](https://www.cfht.hawaii.edu)'s new Direct Imaging Exposure Time calculator.
6
+ """
7
+ # Copyright CFHT/CNRS
8
+ # Licensed under the MIT license
9
+
pydiet/cmd/start.py ADDED
@@ -0,0 +1,107 @@
1
+ #! /usr/bin/python3
2
+ """
3
+ Start script (renamed as :program:`pydiet`).
4
+ """
5
+ # Copyright CFHT/CNRS/CEA/UParisSaclay
6
+ # Licensed under the MIT licence
7
+ from sys import exit
8
+ from threading import Thread
9
+ from time import sleep
10
+ from urllib.request import urlopen
11
+ from urllib.error import URLError
12
+ import webbrowser
13
+
14
+ from uvicorn import run
15
+
16
+ from pydiet.server import config
17
+
18
+
19
+ def start_server(
20
+ app: str="pydiet.server.app:create_app",
21
+ host: str="localhost",
22
+ port: int=8009,
23
+ root_path: str="",
24
+ workers: int=4,
25
+ access_log: bool=False,
26
+ reload: bool=True
27
+ ):
28
+ """
29
+ Start the Uvicorn server in application factory mode.
30
+
31
+ Parameters
32
+ ----------
33
+ app: str, optional
34
+ Name of the ASGI app callable.
35
+ host: str, optional
36
+ Host name or IP address.
37
+ port: int, optional
38
+ Port.
39
+ root_path: str | ~pathlib.Path, optional
40
+ ASGI root_path.
41
+ workers: int, optional
42
+ Number of workers.
43
+ access_log: bool, optional
44
+ Display access log.
45
+ reload: bool, optional
46
+ Enable auto-reload (turns off multiple workers).
47
+ """
48
+ run(
49
+ app,
50
+ host=host,
51
+ port=port,
52
+ root_path=root_path,
53
+ access_log=access_log,
54
+ workers=workers,
55
+ reload=reload,
56
+ factory=True
57
+ )
58
+ return
59
+
60
+
61
+ def open_browser_when_ready(host: str, port: int, root_path: str, api_path: str):
62
+ """
63
+ Start a browser session once the server is up and running.
64
+ """
65
+ link = f"http://{host}:{port}{root_path or ''}"
66
+ f"{config.settings['root_path'] or ''}"
67
+ while True:
68
+ try:
69
+ # succeeds only when server is actually up
70
+ urlopen(f"{link}{api_path}/health", timeout=2)
71
+ break
72
+ except URLError:
73
+ sleep(0.5)
74
+ webbrowser.open(link)
75
+
76
+
77
+ def main() -> int:
78
+ """
79
+ Set up configuration and start the PyDIET server.
80
+ """
81
+ if config.settings["browser"]:
82
+ # Start watcher thread to open browser when server is ready
83
+ Thread(
84
+ target=open_browser_when_ready,
85
+ args=(
86
+ config.settings["host"],
87
+ config.settings["port"],
88
+ config.settings["root_path"],
89
+ config.settings["api_path"]
90
+ ),
91
+ daemon=True,
92
+ ).start()
93
+
94
+ # Start the server itself
95
+ start_server(
96
+ host=config.settings["host"],
97
+ port=config.settings["port"],
98
+ root_path=config.settings["root_path"],
99
+ access_log=config.settings["access_log"],
100
+ reload=config.settings["reload"],
101
+ workers=config.settings["workers"]
102
+ )
103
+ return 0
104
+
105
+ if __name__ == "__main__":
106
+ exit(main())
107
+
@@ -0,0 +1,242 @@
1
+ #
2
+ # Data configuration for PyDIET
3
+ #
4
+ # The format is TOML (https://toml.io)
5
+ # Numerical quantities must be written as strings and support physical units
6
+
7
+ # Parent path for all data files
8
+ path = "data"
9
+
10
+ ####################### Table array of observatory sites ######################
11
+
12
+ [[sites]]
13
+ default = true
14
+ id = 'mko'
15
+ name = "Mauna Kea Observatories"
16
+ description = "Mauna Kea Observatories, Hawaii, USA"
17
+ altitude = "4205 m"
18
+ path = "sites/mko"
19
+ [sites.transmission]
20
+ # Atmospheric transmission at Mauna Kea Observatories at various airmasses:
21
+ # - Computed by E.Bertin (2025) using MODTRAN6, using the default "tropical"
22
+ # atmosphere and the "rural" aerosol model settings.
23
+ # - Pointing upward from an altitude of 4204m.
24
+ # - CO2 concentration set to 430ppm.
25
+ path = "transmission"
26
+ files = [
27
+ { vars = {am = 1.0}, file = "MKO_transmission.AM1.0.fits", default=true },
28
+ { vars = {am = 1.1}, file = "MKO_transmission.AM1.1.fits" },
29
+ { vars = {am = 1.2}, file = "MKO_transmission.AM1.2.fits" },
30
+ { vars = {am = 1.3}, file = "MKO_transmission.AM1.3.fits" },
31
+ { vars = {am = 1.4}, file = "MKO_transmission.AM1.4.fits" },
32
+ { vars = {am = 1.5}, file = "MKO_transmission.AM1.5.fits" },
33
+ { vars = {am = 1.6}, file = "MKO_transmission.AM1.6.fits" },
34
+ { vars = {am = 1.7}, file = "MKO_transmission.AM1.7.fits" },
35
+ { vars = {am = 1.8}, file = "MKO_transmission.AM1.8.fits" },
36
+ { vars = {am = 1.9}, file = "MKO_transmission.AM1.9.fits" },
37
+ { vars = {am = 2.0}, file = "MKO_transmission.AM2.0.fits" },
38
+ { vars = {am = 2.5}, file = "MKO_transmission.AM2.5.fits" },
39
+ { vars = {am = 3.0}, file = "MKO_transmission.AM3.0.fits" },
40
+ { vars = {am = 3.5}, file = "MKO_transmission.AM3.5.fits" },
41
+ { vars = {am = 4.0}, file = "MKO_transmission.AM4.0.fits" },
42
+ { vars = {am = 4.5}, file = "MKO_transmission.AM4.5.fits" },
43
+ { vars = {am = 5.0}, file = "MKO_transmission.AM5.0.fits" }
44
+ ]
45
+ [sites.emission]
46
+ # Sky emission models
47
+ path = "emission"
48
+ files = [
49
+ # ESO SkyCalc sky emission model computed with default settings
50
+ # (except for the Moon set at -90 deg elevation).
51
+ { vars = {sky='dark', am=1.0}, file = "MKO_emission.dark.AM1.0.fits", default=true },
52
+ { vars = {sky='dark', am=1.1}, file = "MKO_emission.dark.AM1.1.fits" },
53
+ { vars = {sky='dark', am=1.2}, file = "MKO_emission.dark.AM1.2.fits" },
54
+ { vars = {sky='dark', am=1.3}, file = "MKO_emission.dark.AM1.3.fits" },
55
+ { vars = {sky='dark', am=1.4}, file = "MKO_emission.dark.AM1.4.fits" },
56
+ { vars = {sky='dark', am=1.5}, file = "MKO_emission.dark.AM1.5.fits" },
57
+ { vars = {sky='dark', am=1.6}, file = "MKO_emission.dark.AM1.6.fits" },
58
+ { vars = {sky='dark', am=1.7}, file = "MKO_emission.dark.AM1.7.fits" },
59
+ { vars = {sky='dark', am=1.8}, file = "MKO_emission.dark.AM1.8.fits" },
60
+ { vars = {sky='dark', am=1.9}, file = "MKO_emission.dark.AM1.9.fits" },
61
+ { vars = {sky='dark', am=2.0}, file = "MKO_emission.dark.AM2.0.fits" },
62
+ { vars = {sky='dark', am=2.5}, file = "MKO_emission.dark.AM2.5.fits" },
63
+ { vars = {sky='dark', am=3.0}, file = "MKO_emission.dark.AM3.0.fits" },
64
+ # ESO SkyCalc sky emission model with 30% Moon component
65
+ # (66.4 deg phase at 45 deg elevation and 45 deg distance).
66
+ { vars = {sky='grey', am=1.0}, file = "MKO_emission.grey.AM1.0.fits" },
67
+ { vars = {sky='grey', am=1.1}, file = "MKO_emission.grey.AM1.1.fits" },
68
+ { vars = {sky='grey', am=1.2}, file = "MKO_emission.grey.AM1.2.fits" },
69
+ { vars = {sky='grey', am=1.3}, file = "MKO_emission.grey.AM1.3.fits" },
70
+ { vars = {sky='grey', am=1.4}, file = "MKO_emission.grey.AM1.4.fits" },
71
+ { vars = {sky='grey', am=1.5}, file = "MKO_emission.grey.AM1.5.fits" },
72
+ { vars = {sky='grey', am=1.6}, file = "MKO_emission.grey.AM1.6.fits" },
73
+ { vars = {sky='grey', am=1.7}, file = "MKO_emission.grey.AM1.7.fits" },
74
+ { vars = {sky='grey', am=1.8}, file = "MKO_emission.grey.AM1.8.fits" },
75
+ { vars = {sky='grey', am=1.9}, file = "MKO_emission.grey.AM1.9.fits" },
76
+ { vars = {sky='grey', am=2.0}, file = "MKO_emission.grey.AM2.0.fits" },
77
+ { vars = {sky='grey', am=2.5}, file = "MKO_emission.grey.AM2.5.fits" },
78
+ { vars = {sky='grey', am=3.0}, file = "MKO_emission.grey.AM3.0.fits" },
79
+ # ESO SkyCalc sky emission model with 60% Moon component
80
+ # (101.5 deg phase, at 45 deg elevation and 45 deg distance).
81
+ { vars = {sky='bright', am=1.0}, file = "MKO_emission.bright.AM1.0.fits", default=true },
82
+ { vars = {sky='bright', am=1.1}, file = "MKO_emission.bright.AM1.1.fits" },
83
+ { vars = {sky='bright', am=1.2}, file = "MKO_emission.bright.AM1.2.fits" },
84
+ { vars = {sky='bright', am=1.3}, file = "MKO_emission.bright.AM1.3.fits" },
85
+ { vars = {sky='bright', am=1.4}, file = "MKO_emission.bright.AM1.4.fits" },
86
+ { vars = {sky='bright', am=1.5}, file = "MKO_emission.bright.AM1.5.fits" },
87
+ { vars = {sky='bright', am=1.6}, file = "MKO_emission.bright.AM1.6.fits" },
88
+ { vars = {sky='bright', am=1.7}, file = "MKO_emission.bright.AM1.7.fits" },
89
+ { vars = {sky='bright', am=1.8}, file = "MKO_emission.bright.AM1.8.fits" },
90
+ { vars = {sky='bright', am=1.9}, file = "MKO_emission.bright.AM1.9.fits" },
91
+ { vars = {sky='bright', am=2.0}, file = "MKO_emission.bright.AM2.0.fits" },
92
+ { vars = {sky='bright', am=2.5}, file = "MKO_emission.bright.AM2.5.fits" },
93
+ { vars = {sky='bright', am=3.0}, file = "MKO_emission.bright.AM3.0.fits" }
94
+ ]
95
+
96
+
97
+ ######################### Table array of telescopes ###########################
98
+
99
+ [[telescopes]]
100
+ default = true
101
+ id = 'cfht'
102
+ name = "CFHT"
103
+ description = "Canada-France-Hawaii 3.6m telescope"
104
+ path = "telescopes/cfht"
105
+ # Full collecting area _including_ possible mirror hole and spider branches
106
+ collecting_area = "10.134 m2" # from CFHT's observatory manual: 3.592m diameter
107
+ # Default obstruction area (only used if not specified for the instrument)
108
+ obstruction_area = "0.974 m2" # 0.951m diameter hole and 4x5cm spider branches
109
+ [telescopes.transmission]
110
+ # Transmission curves for the CFHT 3.6m telescope
111
+ path = "transmission"
112
+ files = [ {file = "CFHT_M1_transmission.fits"} ]
113
+ [telescopes.emission]
114
+ # Emission curves for the CFHT 3.6m telescope
115
+ temperatures = ["273 K"]
116
+
117
+
118
+ ########################## Table array of instruments #########################
119
+
120
+ [[instruments]]
121
+ # MegaCam/MegaPrime instrument. All infos derived from the MegaCam web pages at
122
+ # https://www.cfht.hawaii.edu/Instruments/Imaging/Megacam/index.html
123
+ default = true
124
+ id = 'megacam'
125
+ name = "MegaCam"
126
+ description = "The MegaPrime/MegaCam instrument"
127
+ path = "instruments/megacam"
128
+ wavelength_range = "[250., 1050.] nm"
129
+ obstruction_area = "2.112 m2" # Forged by subtracting
130
+ overhead = "40 s"
131
+ site_id = 'mko'
132
+ telescope_id = 'cfht'
133
+ [instruments.optics]
134
+ # MegaPrime/MegaCam optical properties
135
+ path = "optics"
136
+ [instruments.optics.transmission]
137
+ # Transmission as a function of wavelength for all MegaPrime optical components
138
+ path = "transmission"
139
+ files = [ {file = "MegaPrime_transmission.fits"} ]
140
+ [instruments.optics.emission]
141
+ # Emission as a function of wavelength for all MegaPrime optical components
142
+ temperatures = ["273 K"] # Typical temperature of the corrector optics
143
+ [instruments.filters]
144
+ path = "filters"
145
+ [instruments.filters.transmission]
146
+ vars = ['id']
147
+ files = [
148
+ {id = 'u', name = "u", file = "u.MP9302.fits"},
149
+ {id = 'g', name = "g", file = "g.MP9402.fits"},
150
+ {id = 'r', name = "r", file = "r.MP9602.fits", default=true},
151
+ {id = 'i', name = "i", file = "i.MP9703.fits"},
152
+ {id = 'z', name = "z", file = "z.MP9901.fits"},
153
+ {id = 'gri', name = "gri", file = "gri.MP9605.fits"},
154
+ {id = 'cahk', name = "CaHK", file = "CaHK.MP9303.fits"},
155
+ {id = 'oiii', name = "OIII", file = "OIII.MP9501.fits"},
156
+ {id = 'oiiioff', name = "OIII off", file = "OIIIOFF.MP9502.fits"},
157
+ {id = 'ha', name = "Ha", file = "Ha.MP9603.fits"},
158
+ {id = 'haoff', name = "Ha off", file = "HaOFF.MP9604.fits"},
159
+ {id = 'm4112', name = "M4112", file = "M4112.MP9403.fits"},
160
+ {id = 'm4376', name = "M4376", file = "M4376.MP9404.fits"}
161
+ ]
162
+ [instruments.filters.emission]
163
+ # Emission as a function of wavelength for all MegaPrime optical components
164
+ temperatures = ["273 K"] # Typical temperature of the corrector optics
165
+ [instruments.detector]
166
+ # Average MegaCam E2V CCD characteristics
167
+ path = "detector"
168
+ gain = "1.62 electron/adu"
169
+ ron = "5. electron"
170
+ scale = "[0.186, 0.186] arcsec/pix"
171
+ full_well = "240000 electron"
172
+ range = "65536 adu"
173
+ bias = "1200. adu"
174
+ [instruments.detector.transmission]
175
+ path = "qe"
176
+ # Average MegaCam CCD quantum efficiency as a function of wavelength
177
+ files = [ {file = "MegaCam_QE.average.fits"} ]
178
+ [instruments.detector.emission]
179
+ temperatures = ["153 K"]
180
+
181
+
182
+ [[instruments]]
183
+ # WIRCam instrument. Most infos derived from the WIRCam web pages at
184
+ # https://www.cfht.hawaii.edu/Instruments/Imaging/WIRCam/
185
+ id = 'wircam'
186
+ name = "WIRCam"
187
+ description = "The WIRCam instrument"
188
+ path = "instruments/wircam"
189
+ wavelength_range = "[900., 2600.] nm"
190
+ obstruction_area = "1.734 m2" # Forged by subtracting 8.4m2 from 10.134 m2
191
+ overhead = "10. s"
192
+ site_id = 'mko'
193
+ telescope_id = 'cfht'
194
+ [instruments.optics]
195
+ # WIRCam optical properties
196
+ path = "optics"
197
+ [instruments.optics.transmission]
198
+ # Transmission as a function of wavelength for all WIRCam optical components
199
+ path = "transmission"
200
+ files = [ {file = "WIRCam_transmission.fits"} ]
201
+ [instruments.optics.emission]
202
+ # Emission as a function of wavelength for all WIRCam optical components
203
+ temperatures = ["273 K"]
204
+ [instruments.filters]
205
+ path = "filters"
206
+ [instruments.filters.transmission]
207
+ vars = ['id']
208
+ files = [
209
+ {id = 'y', name = "Y", file = "Y.WC8002.fits", default=true},
210
+ {id = 'j', name = "J", file = "J.WC8103.fits"},
211
+ {id = 'h', name = "H", file = "H.WC8202.fits"},
212
+ {id = 'ks', name = "Ks", file = "Ks.WC8302.fits"},
213
+ {id = 'h2', name = "H2 (1-0)", file = "H2.WC8304.fits"},
214
+ {id = 'lowoh1', name = "Low OH1", file = "LowOH1.WC8104.fits"},
215
+ {id = 'lowoh2', name = "Low OH2", file = "LowOH2.WC8102.fits"},
216
+ {id = 'ch4on', name = "CH4 on", file = "CH4On.WC8203.fits"},
217
+ {id = 'ch4off', name = "CH4 off", file = "CH4Off.WC8204.fits"},
218
+ {id = 'kcont', name = "K cont.", file = "Kcont.WC8303.fits"},
219
+ {id = 'brg', name = "Br.gamma", file = "BrG.WC8305.fits"},
220
+ {id = 'w', name = "W", file = "W.WC8105.fits"}
221
+ ]
222
+ [instruments.filters.emission]
223
+ temperatures = ["80 K"]
224
+ [instruments.detector]
225
+ # Average WIRCam Hawaii-2RG CMOS characteristics
226
+ gain = "3.7 electron/adu"
227
+ ron = "30. electron"
228
+ scale = "[0.306, 0.306] arcsec/pix"
229
+ path = "detector"
230
+ full_well = "130000 electron"
231
+ range = "65536 adu"
232
+ bias = "0. adu"
233
+ [instruments.detector.transmission]
234
+ path = "qe"
235
+ # Average Hawaii-2RG quantum efficiency as a function of wavelength from the
236
+ # science-grade sample of Finger+2006, which has a 2.5 μm cut-off; see
237
+ # https://info.cfht.hawaii.edu/display/~bertin/WIRCam+quantum+efficiency+curve
238
+ files = [ {file = "WIRCam_QE.average.fits"} ]
239
+ [instruments.detector.emission]
240
+ temperatures = ["80 K"]
241
+
242
+
@@ -0,0 +1 @@
1
+ Root folder for PyDIET data.
@@ -0,0 +1 @@
1
+ Instrument data.
File without changes
@@ -0,0 +1 @@
1
+ The MegaPrime/MegaCam instrument.
@@ -0,0 +1 @@
1
+ MegaCam CCD and readout electronics properties.
@@ -0,0 +1,2 @@
1
+ Average MegaCam CCD quantum efficiency as a function of wavelength.
2
+
@@ -0,0 +1 @@
1
+ MegaPrime/MegaCam filter set.
@@ -0,0 +1,2 @@
1
+ MegaPrime/MegaCam optical properties.
2
+
@@ -0,0 +1,2 @@
1
+ Transmission curve of the MegaPrime/MegaCam optics (wide-field corrector + camera window).
2
+
@@ -0,0 +1 @@
1
+ The WIRCam camera.
@@ -0,0 +1 @@
1
+ WIRCam detector and readout electronics properties.
@@ -0,0 +1,2 @@
1
+ Average Hawaii-2RG (with 2.5 micron cutoff) quantum efficiency as a function of wavelength, from Finger et al. 2006.
2
+
@@ -0,0 +1 @@
1
+ WIRCam filter set.
@@ -0,0 +1,2 @@
1
+ MegaPrime/MegaCam optical properties.
2
+
@@ -0,0 +1,2 @@
1
+ Transmission curve of the WIRCam optics, excluding the tip-tilt plate.
2
+
@@ -0,0 +1 @@
1
+ Observation site data.
File without changes
@@ -0,0 +1,2 @@
1
+ Mauna Kea Observatories (4205m), Hawaii, USA.
2
+