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
@@ -0,0 +1,319 @@
1
+ {#
2
+ # Jinja2 template for the PyDIET ETC form of the WIRCam instrument.
3
+ #
4
+ # Copyright CFHT/CNRS/OSUPS/CEA/UParisSaclay
5
+ # Licensed under the MIT licence
6
+ #}
7
+ <ion-card>
8
+ <img alt="" src="{{ root_path }}/client/images/{{ instrument }}/background.jpg" style="height: 100%; overflow: hidden; min-width: 1920px; width: 100%" />
9
+ <img alt="{{ instrument }} logo" src="{{ root_path }}/client/images/{{ instrument }}/logo.png" style="margin: -125px 0px 20px 10px; filter: drop-shadow(4px 4px 4px #000000);" />
10
+ <ion-card-content>
11
+ <form id="etc-form">
12
+ <ion-grid>
13
+ <ion-row class="ion-align-items-center">
14
+ <!----------------------------- compute -------------------------------->
15
+ <ion-col size-xl="2" size-lg="3" size-md="4" size-sm="6" size-xs="12">
16
+ <ion-item>
17
+ <ion-select onfocus="
18
+ /* Change use of SNR input to exposure time if SNR is output */
19
+ const snr=document.querySelector('.snr');
20
+ if (this.value=='snr') {
21
+ snr.name = 'etime';
22
+ snr.label = 'Exposure Time [ s ]';
23
+ } else {
24
+ snr.name = 'snr';
25
+ snr.label = 'Signal-to-Noise ratio';
26
+ }
27
+ " name="compute" label="Compute" width="200px" label-placement="floating" fill="solid" interface="popover" value="etime">
28
+ <ion-select-option value="etime">exposure time</ion-select-option>
29
+ <ion-select-option value="snr">SNR</ion-select-option>
30
+ </ion-select>
31
+ </ion-item>
32
+ </ion-col>
33
+
34
+ <!----------------------- Number of exposures -------------------------->
35
+ <ion-col size-xl="2" size-lg="3" size-md="4" size-sm="6" size-xs="12">
36
+ <ion-item>
37
+ <ion-input oninput="
38
+ /* Change use of SNR input to exposure time if SNR is output */
39
+ const stacking=document.querySelector('.stacking');
40
+ if (this.value > 1) {
41
+ stacking.classList.remove('ion-hide');
42
+ } else {
43
+ stacking.classList.add('ion-hide');
44
+ }
45
+ " name="exposures" label="Exposures" label-placement="floating" fill="solid" type="number" inputmode="numeric" min="1" step="1" value="1"></ion-input>
46
+ </ion-item>
47
+ </ion-col>
48
+
49
+ <!----------------------------- Stacking ------------------------------->
50
+ <ion-col class="stacking ion-hide" size-xl="2" size-lg="3" size-md="4" size-sm="6" size-xs="12">
51
+ <ion-item>
52
+ <ion-select name="stacking" label="Stacking" label-placement="floating" fill="solid" interface="popover" value="median">
53
+ <ion-select-option value="average">average</ion-select-option>
54
+ <ion-select-option value="median">median</ion-select-option>
55
+ </ion-select>
56
+ </ion-item>
57
+ </ion-col>
58
+
59
+ <!--------------------------- snr or etime ----------------------------->
60
+ <ion-col size-xl="2" size-lg="3" size-md="4" size-sm="6" size-xs="12">
61
+ <ion-item>
62
+ <ion-input class="snr" name="snr" label="Signal-to-Noise ratio" label-placement="floating" fill="solid" type="number" inputmode="decimal" min="0.0" step="0.1" value="10.0"></ion-input>
63
+ </ion-item>
64
+ </ion-col>
65
+
66
+ <!----------------------------- source --------------------------------->
67
+ <ion-col size-xl="2" size-lg="3" size-md="4" size-sm="6" size-xs="12">
68
+ <ion-item>
69
+ <ion-select onfocus="
70
+ /* Display galaxy-related inputs if the source type is 'galaxy' */
71
+ const gal=document.querySelectorAll('.galaxy'),
72
+ phot=document.querySelector('.photometry'),
73
+ bright=document.querySelector('.brightness');
74
+ if (this.value == 'galaxy')
75
+ gal.forEach(el => el.classList.remove('ion-hide'));
76
+ else
77
+ gal.forEach(el => el.classList.add('ion-hide'));
78
+ if (this.value == 'extended') {
79
+ phot.classList.add('ion-hide');
80
+ const slot = bright.querySelector(`[slot='label']`);
81
+ var label = slot.innerHTML;
82
+ if (!label.includes('arcsec'))
83
+ slot.innerHTML = label.includes(']') ?
84
+ label.replace(']', '.arcsec<sup>-2</sup>]')
85
+ : label + '.arcsec<sup>-2</sup>';
86
+ } else {
87
+ phot.classList.remove('ion-hide');
88
+ const slot = bright.querySelector(`[slot='label']`);
89
+ var label = slot.innerHTML;
90
+ slot.innerHTML = label.replace('.arcsec<sup>-2</sup>', '');
91
+ }
92
+ " class="source" name="source" label="Source type" label-placement="floating" fill="solid" interface="popover" value="point_source">
93
+ <ion-select-option value="point_source">point source</ion-select-option>
94
+ <ion-select-option value="galaxy">galaxy</ion-select-option>
95
+ <ion-select-option value="extended">extended</ion-select-option>
96
+ </ion-select>
97
+ </ion-item>
98
+ </ion-col>
99
+
100
+ <!-------------------------- sersic_radius ----------------------------->
101
+ <ion-col class="galaxy ion-hide" size-xl="2" size-lg="3" size-md="4" size-sm="6" size-xs="12">
102
+ <ion-item>
103
+ <ion-input name="sersic_radius" label="Sérsic Rₑ [ &quot; ]" label-placement="floating" fill="solid" type="number" inputmode="decimal" min="0.0" max="10.0" step="0.1" value="1.0"></ion-input>
104
+ </ion-item>
105
+ </ion-col>
106
+
107
+ <!-------------------------- sersic_index ------------------------------>
108
+ <ion-col class="galaxy ion-hide" size-xl="2" size-lg="3" size-md="4" size-sm="6" size-xs="12">
109
+ <ion-item>
110
+ <ion-input name="sersic_index" label="Sérsic index" label-placement="floating" fill="solid" type="number" inputmode="decimal" min="0.4" max="10.0" step="0.1" value="1.0"></ion-input>
111
+ </ion-item>
112
+ </ion-col>
113
+
114
+ <!----------------------------- seeing --------------------------------->
115
+ <ion-col size-xl="2" size-lg="3" size-md="4" size-sm="6" size-xs="12">
116
+ <ion-item>
117
+ <ion-input name="seeing" label="Seeing [ &quot; ]" label-placement="floating" fill="solid" type="number" inputmode="decimal" min="0.1" max="20.0" step="0.01" value="0.7"></ion-input>
118
+ </ion-item>
119
+ </ion-col>
120
+
121
+ <!----------------------------- filter --------------------------------->
122
+ <ion-col size-xl="2" size-lg="3" size-md="4" size-sm="6" size-xs="12">
123
+ <ion-item>
124
+ <ion-select onfocus="
125
+ /* Display filter upload menu if filter is 'upload'*/
126
+ const filt=document.querySelector('.filter-upload'),
127
+ inp=filt.querySelector('input');
128
+ if (this.value == 'upload') {
129
+ filt.classList.remove('ion-hide');
130
+ inp.required = true;
131
+ } else {
132
+ filt.classList.add('ion-hide');
133
+ inp.required = false;
134
+ inp.value = '';
135
+ }
136
+ " id=select-filters name="filter" label="Filter" label-placement="floating" fill="solid" interface="popover" value="J">
137
+ <ion-select-option value="">Choose filter</ion-select-option>
138
+ </ion-select>
139
+ </ion-item>
140
+ </ion-col>
141
+
142
+ <!--------------------------- filter file ------------------------------>
143
+ <ion-col class="filter-upload ion-hide" size-xl="2" size-lg="3" size-md="4" size-sm="6" size-xs="12">
144
+ <ion-item>
145
+ <input name="filter_upload" label="Filter upload" label-placement="floating" fill="solid" type="file" accept=".fits,.fit,application/fits"></ion-input>
146
+ </ion-item>
147
+ </ion-col>
148
+
149
+ <!--------------------------- brightness ------------------------------->
150
+ <ion-col size-xl="2" size-lg="3" size-md="4" size-sm="6" size-xs="12">
151
+ <ion-item>
152
+ <ion-input class="brightness" name="brightness" label-placement="floating" fill="solid" type="number" inputmode="decimal" min="-40.0" max="40.0" step="0.01" value="20.0">
153
+ <div slot="label">Source AB magnitude</div>
154
+ </ion-input>
155
+ </ion-item>
156
+ </ion-col>
157
+
158
+ <!------------------------------ unit ---------------------------------->
159
+ <ion-col size-xl="2" size-lg="3" size-md="4" size-sm="6" size-xs="12">
160
+ <ion-item>
161
+ <ion-select onfocus="
162
+ /* Change brightness label depending on unit */
163
+ const bright=document.querySelector('.brightness'),
164
+ slot=bright.querySelector(`[slot='label']`),
165
+ extended=document.querySelector('.source').value == 'extended';
166
+ if (this.value=='abmag' || this.value=='vegamag') {
167
+ slot.innerHTML = this.value=='vegamag' ?
168
+ 'Source Vega magnitude'
169
+ : 'Source AB magnitude';
170
+ if (extended && !slot.innerHTML.includes('arcsec'))
171
+ slot.innerHTML += '.arcsec<sup>-2</sup>';
172
+ bright.min = '-40.0';
173
+ bright.max = '40.0';
174
+ bright.step = '0.01';
175
+ } else if (this.value=='fmujy') {
176
+ slot.innerHTML = extended ?
177
+ 'Source flux density [μJy.arcsec<sup>-2</sup>]'
178
+ : 'Source flux density [μJy]';
179
+ bright.min = '0.0';
180
+ bright.max = '1000.0';
181
+ bright.step = 'any';
182
+ } else if (this.value=='flux') {
183
+ slot.innerHTML = extended ?
184
+ 'Source flux [10<sup>-15</sup> erg.s<sup>-1</sup>.cm<sup>-2</sup>.arcsec<sup>-2</sup>]'
185
+ : 'Source flux [10<sup>-15</sup> erg.s<sup>-1</sup>.cm<sup>-2</sup>]';
186
+ bright.min = '0.0';
187
+ bright.max = '100000.0';
188
+ bright.step = 'any';
189
+ }
190
+ " name="unit" label="Source unit" label-placement="floating" fill="solid" interface="popover" value="abmag">
191
+ <ion-select-option value="abmag">AB mag</ion-select-option>
192
+ <ion-select-option value="vegamag">Vega mag</ion-select-option>
193
+ <ion-select-option value="fmujy">μJy</ion-select-option>
194
+ <ion-select-option value="flux">flux</ion-select-option>
195
+ </ion-select>
196
+ </ion-item>
197
+ </ion-col>
198
+
199
+ <!--------------------------- photometry ------------------------------->
200
+ <ion-col class="photometry" size-xl="2" size-lg="3" size-md="4" size-sm="6" size-xs="12">
201
+ <ion-item>
202
+ <ion-select onfocus="
203
+ /* Display extra aperture inputs if photometry type is 'aperture' */
204
+ const aperture=document.querySelectorAll('.photometry-aperture');
205
+ if (this.value=='fixed_aperture')
206
+ aperture.forEach(el => el.classList.remove('ion-hide'));
207
+ else
208
+ aperture.forEach(el => el.classList.add('ion-hide'));
209
+ " name="photometry" label="Photometry type" label-placement="floating" fill="solid" interface="popover" value="model_fitting">
210
+ <ion-select-option value="model_fitting">model-fitting</ion-select-option>
211
+ <ion-select-option value="optimal_aperture">optimal aperture</ion-select-option>
212
+ <ion-select-option value="large_aperture">96% flux aperture</ion-select-option>
213
+ <ion-select-option value="fixed_aperture">fixed aperture</ion-select-option>
214
+ </ion-select>
215
+ </ion-item>
216
+ </ion-col>
217
+
218
+ <!---------------------------- aperture --------------------------->
219
+ <ion-col class="photometry-aperture ion-hide" size-xl="2" size-lg="3" size-md="4" size-sm="6" size-xs="12">
220
+ <ion-item>
221
+ <ion-input class="aperture" name="aperture" label="Aperture diameter [ &quot; ]" label-placement="floating" fill="solid" type="number" inputmode="decimal" min="0.1" max="15.0" step="0.1" value="3.0"></ion-input>
222
+ </ion-item>
223
+ </ion-col>
224
+
225
+ <!------------------------------ sky ----------------------------------->
226
+ <ion-col size-xl="2" size-lg="3" size-md="4" size-sm="6" size-xs="12">
227
+ <ion-item>
228
+ <ion-select onfocus="
229
+ /* Display extra sky inputs if the sky type is 'specify' */
230
+ const sky=document.querySelectorAll('.sky-specify');
231
+ if (this.value=='specify')
232
+ sky.forEach(el => el.classList.remove('ion-hide'));
233
+ else
234
+ sky.forEach(el => el.classList.add('ion-hide'));
235
+ " name="sky" label="Sky brightness" label-placement="floating" fill="solid" interface="popover" value="dark">
236
+ <ion-select-option value="dark">dark</ion-select-option>
237
+ <ion-select-option value="grey">grey</ion-select-option>
238
+ <ion-select-option value="bright">bright</ion-select-option>
239
+ <ion-select-option value="specify">specify</ion-select-option>
240
+ </ion-select>
241
+ </ion-item>
242
+ </ion-col>
243
+
244
+ <!--------------------------- sky_brightness --------------------------->
245
+ <ion-col class="sky-specify ion-hide" size-xl="2" size-lg="3" size-md="4" size-sm="6" size-xs="12">
246
+ <ion-item>
247
+ <ion-input class="sky-brightness" name="sky_brightness" label-placement="floating" fill="solid" type="number" inputmode="decimal" min="-40.0" max="40.0" step="0.1" value="22.0">
248
+ <div slot="label">Sky value AB mag.arcsec<sup>-2</sup></div>
249
+ </ion-input>
250
+ </ion-item>
251
+ </ion-col>
252
+
253
+ <!---------------------------- sky_unit ------------------------------->
254
+ <ion-col class="sky-specify ion-hide" size-xl="2" size-lg="3" size-md="4" size-sm="6" size-xs="12">
255
+ <ion-item>
256
+ <ion-select onfocus="
257
+ /* Change sky brightness label and limits depending on sky unit */
258
+ const sky=document.querySelector('.sky-brightness');
259
+ if (this.value=='abmag' || this.value=='vegamag') {
260
+ sky.querySelector(`[slot='label']`).innerHTML = this.value=='vegamag' ?
261
+ 'Sky value [Vega mag.arcsec<sup>-2</sup>]'
262
+ : 'Sky value [AB mag.arcsec<sup>-2</sup>]';
263
+ sky.min = '-40.0';
264
+ sky.max = '40.0';
265
+ sky.step = '0.1';
266
+ } else if (this.value=='fmegajy') {
267
+ sky.querySelector(`[slot='label']`).innerHTML = 'Sky value [MJy.str<sup>-1</sup>]'
268
+ sky.min = '0.0';
269
+ sky.max = '1000.0';
270
+ sky.step = 'any';
271
+ } else if (this.value=='flux') {
272
+ sky.querySelector(`[slot='label']`).innerHTML = 'Sky value [10<sup>-15</sup> erg.s<sup>-1</sup>.cm<sup>-2</sup>.arcsec<sup>-2</sup>]';
273
+ sky.min = '0.0';
274
+ sky.max = '100000.0';
275
+ sky.step = 'any';
276
+ } else if (this.value=='photons') {
277
+ sky.querySelector(`[slot='label']`).innerHTML = 'Sky value [photons.s<sup>-1</sup>.px<sup>-1</sup>]'
278
+ sky.min = '0.0';
279
+ sky.max = '1000.0';
280
+ sky.step = 'any';
281
+ }
282
+ " name="sky_unit" label="Sky unit" width="200px" label-placement="floating" fill="solid" interface="popover" value="abmag">
283
+ <ion-select-option value="abmag">AB mag.arcsec&dash;&sup2</ion-select-option>
284
+ <ion-select-option value="vegamag">Vega mag.arcsec&dash;&sup2</ion-select-option>
285
+ <ion-select-option value="fmegajy">MJy.str&dash;&sup1</ion-select-option>
286
+ <ion-select-option value="flux">flux.arcsec&dash;&sup2</ion-select-option>
287
+ <ion-select-option value="photons">photons.s&dash;&sup1.px&dash;&sup1</ion-select-option>
288
+ </ion-select>
289
+ </ion-item>
290
+ </ion-col>
291
+
292
+ <!---------------------------- airmass --------------------------------->
293
+ <ion-col size-xl="2" size-lg="3" size-md="4" size-sm="6" size-xs="12">
294
+ <ion-item>
295
+ <ion-input name="airmass" label="Airmass" label-placement="floating" fill="solid" type="number" inputmode="decimal" min="1.0" step="0.01" value="1.2"></ion-input>
296
+ </ion-item>
297
+ </ion-col>
298
+
299
+ <!--------------------------- transparency ----------------------------->
300
+ <ion-col size-xl="2" size-lg="3" size-md="4" size-sm="6" size-xs="12">
301
+ <ion-item>
302
+ <ion-input name="transparency" label="Transparency" label-placement="floating" fill="solid" type="number" inputmode="decimal" min="0.0" max="1.0" step="0.01" value="1.0"></ion-input>
303
+ </ion-item>
304
+ </ion-col>
305
+ </ion-row>
306
+ <ion-row>
307
+ <ion-col>
308
+ <ion-item lines="none">
309
+ <ion-button type="submit" fill="solid" size="default" slot="start">
310
+ Submit
311
+ </ion-button>
312
+ </ion-item>
313
+ </ion-col>
314
+ </ion-row>
315
+ </ion-grid>
316
+ </form>
317
+ </ion-card-content>
318
+ </ion-card>
319
+
@@ -0,0 +1,190 @@
1
+ {#
2
+ # Jinja2 template for PyDIET ETC results with the WIRCam instrument.
3
+ #
4
+ # Copyright CFHT/CNRS/OSUPS/CEA/UParisSaclay
5
+ # Licensed under the MIT licence
6
+ #}
7
+ <ion-modal id="etc-results-modal" is-open=true backdrop-dismiss=true>
8
+ <ion-content>
9
+ <ion-card>
10
+ <ion-card-header>
11
+ <ion-card-title>ETC estimate</ion-card-title>
12
+ <ion-button fill="clear" size="small" aria-label="Close"
13
+ onclick="document.getElementById('etc-results-modal').dismiss()"
14
+ style="position: absolute; top: 0.8em; right: 6px;">Close</ion-button>
15
+ </ion-card-header>
16
+ </ion-card>
17
+ <ion-card>
18
+ <ion-card-content>
19
+ <ion-grid>
20
+ <ion-row>
21
+ <ion-col>
22
+ <ion-icon name="videocam"></ion-icon>
23
+ <ion-label>
24
+ Instrument
25
+ </ion-label>
26
+ </ion-col>
27
+ <ion-col size="4">
28
+ <ion-label>
29
+ {{ r.instrument }}
30
+ </ion-label>
31
+ </ion-col>
32
+ </ion-row>
33
+ <ion-row style="color: var(--ion-color-secondary-contrast);">
34
+ <ion-col>
35
+ <ion-icon name="color-filter"></ion-icon>
36
+ <ion-label>
37
+ Filter
38
+ </ion-label>
39
+ </ion-col>
40
+ <ion-col size="4">
41
+ <ion-label>
42
+ {{ r.filter }}
43
+ </ion-label>
44
+ </ion-col>
45
+ </ion-row>
46
+ <ion-row>
47
+ <ion-col>
48
+ <ion-icon name="prism"></ion-icon>
49
+ <ion-label>
50
+ Pivot wavelength
51
+ </ion-label>
52
+ </ion-col>
53
+ <ion-col size="4">
54
+ <ion-label>
55
+ {% set spec = '{:.1f}' if r.lambda_pivot < 10000 else '{:.0f}' %}
56
+ {{ spec.format(r.lambda_pivot) }} nm
57
+ </ion-label>
58
+ </ion-col>
59
+ </ion-row>
60
+ <ion-row>
61
+ <ion-col>
62
+ <ion-icon name="pulse"></ion-icon>
63
+ <ion-label>
64
+ Rectangular bandwidth
65
+ </ion-label>
66
+ </ion-col>
67
+ <ion-col size="4">
68
+ <ion-label>
69
+ {% set spec = '{:.1f}' if r.bandwidth_rect < 10000 else '{:.0f}' %}
70
+ {{ spec.format(r.bandwidth_rect) }} nm
71
+ </ion-label>
72
+ </ion-col>
73
+ </ion-row>
74
+ <ion-row style="color: var(--ion-color-secondary-contrast);">
75
+ <ion-col>
76
+ <ion-icon name="cellular"></ion-icon>
77
+ <ion-label>
78
+ SNR
79
+ </ion-label>
80
+ </ion-col>
81
+ <ion-col size="4">
82
+ <ion-label>
83
+ {{ '{:.5n}'.format(r.snr) }}
84
+ </ion-label>
85
+ </ion-col>
86
+ </ion-row>
87
+ <ion-row style="color: var(--ion-color-secondary-contrast);">
88
+ <ion-col>
89
+ <ion-icon name="timer"></ion-icon>
90
+ <ion-label>
91
+ Exposure time
92
+ </ion-label>
93
+ </ion-col>
94
+ <ion-col size="4">
95
+ <ion-label>
96
+ {% set spec = '{:.3n}' if r.etime < 100 else '{:.0f}' %}
97
+ {{ spec.format(r.etime) }} s
98
+ </ion-label>
99
+ </ion-col>
100
+ </ion-row>
101
+ <ion-row>
102
+ <ion-col>
103
+ <ion-icon name="timer"></ion-icon>
104
+ <ion-label>
105
+ Background saturation time
106
+ </ion-label>
107
+ </ion-col>
108
+ <ion-col size="4">
109
+ <ion-label>
110
+ {% set spec = '{:.3n}' if r.etime_skysat < 100 else '{:.0f}' %}
111
+ {{ spec.format(r.etime_skysat) }} s
112
+ </ion-label>
113
+ </ion-col>
114
+ </ion-row>
115
+ <ion-row>
116
+ <ion-col>
117
+ <ion-icon name="timer"></ion-icon>
118
+ <ion-label>
119
+ Source saturation time
120
+ </ion-label>
121
+ </ion-col>
122
+ <ion-col size="4">
123
+ <ion-label>
124
+ {% set spec = '{:.3n}' if r.etime_sourcesat < 100 else '{:.0f}' %}
125
+ {{ spec.format(r.etime_sourcesat) }} s
126
+ </ion-label>
127
+ </ion-col>
128
+ </ion-row>
129
+ <ion-row style="color: var(--ion-color-secondary-contrast);">
130
+ <ion-col>
131
+ <ion-icon name="stopwatch"></ion-icon>
132
+ <ion-label>
133
+ Total time (including overheads)
134
+ </ion-label>
135
+ </ion-col>
136
+ <ion-col size="4">
137
+ <ion-label>
138
+ {% set spec = '{:.3n}' if r.ttime < 100 else '{:.0f}' %}
139
+ {{ spec.format(r.ttime) }} s
140
+ </ion-label>
141
+ </ion-col>
142
+ </ion-row>
143
+ <ion-row>
144
+ <ion-col>
145
+ <ion-icon name="speedometer"></ion-icon>
146
+ <ion-label>
147
+ Instrument zero-point (per second)
148
+ </ion-label>
149
+ </ion-col>
150
+ <ion-col size="4">
151
+ <ion-label>
152
+ {{ '{:.2f}'.format(r.zp) }} mag
153
+ </ion-label>
154
+ </ion-col>
155
+ </ion-row>
156
+ <ion-row>
157
+ <ion-col>
158
+ <ion-icon name="bulb"></ion-icon>
159
+ <ion-label>
160
+ Sky background
161
+ </ion-label>
162
+ </ion-col>
163
+ <ion-col size="4">
164
+ <ion-label>
165
+ {{ '{:.2f}'.format(r.sky_mag) }} mag.arcsec<sup>-2</sup>
166
+ </ion-label>
167
+ </ion-col>
168
+ </ion-row>
169
+ <ion-row class="ion-justify-content-between" height="180px">
170
+ <ion-col style="width:66%;">
171
+ <canvas id="filter-plot" height="180px" style="width:100%;"></canvas>
172
+ <script type="module">
173
+ plot_filter(
174
+ {{ r.filter_transmission | tojson }},
175
+ {{ r.atmosphere_transmission | tojson }},
176
+ document.querySelector('canvas#filter-plot')
177
+ );
178
+ </script>
179
+ </ion-col>
180
+ <ion-col size="4">
181
+ <ion-img src="{{ r.cutout }}" alt="source cutout" style="width:128px;height:128px;image-rendering:pixelated">
182
+ </ion-img>
183
+ </ion-col>
184
+ </ion-row>
185
+ </ion-grid>
186
+ </ion-card-content>
187
+ </ion-card>
188
+ </ion-content>
189
+ </ion-modal>
190
+