cgse 2023.38.0__py3-none-any.whl → 2024.1.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 (653) hide show
  1. README.md +27 -0
  2. bump.py +77 -0
  3. cgse-2024.1.3.dist-info/METADATA +41 -0
  4. cgse-2024.1.3.dist-info/RECORD +5 -0
  5. {cgse-2023.38.0.dist-info → cgse-2024.1.3.dist-info}/WHEEL +1 -2
  6. cgse-2023.38.0.dist-info/COPYING +0 -674
  7. cgse-2023.38.0.dist-info/COPYING.LESSER +0 -165
  8. cgse-2023.38.0.dist-info/METADATA +0 -144
  9. cgse-2023.38.0.dist-info/RECORD +0 -649
  10. cgse-2023.38.0.dist-info/entry_points.txt +0 -75
  11. cgse-2023.38.0.dist-info/top_level.txt +0 -2
  12. egse/__init__.py +0 -12
  13. egse/__main__.py +0 -32
  14. egse/aeu/aeu.py +0 -5235
  15. egse/aeu/aeu_awg.yaml +0 -265
  16. egse/aeu/aeu_crio.yaml +0 -273
  17. egse/aeu/aeu_cs.py +0 -626
  18. egse/aeu/aeu_devif.py +0 -321
  19. egse/aeu/aeu_main_ui.py +0 -912
  20. egse/aeu/aeu_metrics.py +0 -131
  21. egse/aeu/aeu_protocol.py +0 -463
  22. egse/aeu/aeu_psu.yaml +0 -204
  23. egse/aeu/aeu_ui.py +0 -873
  24. egse/aeu/arbdata/FccdRead.arb +0 -2
  25. egse/aeu/arbdata/FccdRead_min_points.arb +0 -2
  26. egse/aeu/arbdata/HeaterSync_FccdRead.arb +0 -2
  27. egse/aeu/arbdata/HeaterSync_ccdRead25.arb +0 -2
  28. egse/aeu/arbdata/HeaterSync_ccdRead31_25.arb +0 -2
  29. egse/aeu/arbdata/HeaterSync_ccdRead37_50.arb +0 -2
  30. egse/aeu/arbdata/HeaterSync_ccdRead43_75.arb +0 -2
  31. egse/aeu/arbdata/HeaterSync_ccdRead50.arb +0 -2
  32. egse/aeu/arbdata/Heater_FccdRead_min_points.arb +0 -2
  33. egse/aeu/arbdata/ccdRead25.arb +0 -2
  34. egse/aeu/arbdata/ccdRead25_150ms.arb +0 -2
  35. egse/aeu/arbdata/ccdRead31_25.arb +0 -2
  36. egse/aeu/arbdata/ccdRead31_25_150ms.arb +0 -2
  37. egse/aeu/arbdata/ccdRead37_50.arb +0 -2
  38. egse/aeu/arbdata/ccdRead37_50_150ms.arb +0 -2
  39. egse/aeu/arbdata/ccdRead43_75.arb +0 -2
  40. egse/aeu/arbdata/ccdRead43_75_150ms.arb +0 -2
  41. egse/aeu/arbdata/ccdRead50.arb +0 -2
  42. egse/aeu/arbdata/ccdRead50_150ms.arb +0 -2
  43. egse/alert/__init__.py +0 -1049
  44. egse/alert/alertman.yaml +0 -37
  45. egse/alert/alertman_cs.py +0 -234
  46. egse/alert/alertman_ui.py +0 -603
  47. egse/alert/gsm/beaglebone.py +0 -138
  48. egse/alert/gsm/beaglebone.yaml +0 -51
  49. egse/alert/gsm/beaglebone_cs.py +0 -108
  50. egse/alert/gsm/beaglebone_devif.py +0 -130
  51. egse/alert/gsm/beaglebone_protocol.py +0 -48
  52. egse/bits.py +0 -318
  53. egse/camera.py +0 -44
  54. egse/collimator/__init__.py +0 -0
  55. egse/collimator/fcul/__init__.py +0 -0
  56. egse/collimator/fcul/ogse.py +0 -1077
  57. egse/collimator/fcul/ogse.yaml +0 -14
  58. egse/collimator/fcul/ogse_cs.py +0 -154
  59. egse/collimator/fcul/ogse_devif.py +0 -358
  60. egse/collimator/fcul/ogse_protocol.py +0 -129
  61. egse/collimator/fcul/ogse_sim.py +0 -431
  62. egse/collimator/fcul/ogse_ui.py +0 -1108
  63. egse/command.py +0 -699
  64. egse/config.py +0 -410
  65. egse/confman/__init__.py +0 -1015
  66. egse/confman/confman.yaml +0 -67
  67. egse/confman/confman_cs.py +0 -239
  68. egse/confman/confman_ui.py +0 -381
  69. egse/confman/setup_ui.py +0 -565
  70. egse/control.py +0 -442
  71. egse/coordinates/__init__.py +0 -531
  72. egse/coordinates/avoidance.py +0 -103
  73. egse/coordinates/cslmodel.py +0 -127
  74. egse/coordinates/laser_tracker_to_dict.py +0 -120
  75. egse/coordinates/point.py +0 -707
  76. egse/coordinates/pyplot.py +0 -195
  77. egse/coordinates/referenceFrame.py +0 -1279
  78. egse/coordinates/refmodel.py +0 -737
  79. egse/coordinates/rotationMatrix.py +0 -85
  80. egse/coordinates/transform3d_addon.py +0 -419
  81. egse/csl/__init__.py +0 -50
  82. egse/csl/commanding.py +0 -78
  83. egse/csl/icons/hexapod-connected-selected.svg +0 -30
  84. egse/csl/icons/hexapod-connected.svg +0 -30
  85. egse/csl/icons/hexapod-homing-selected.svg +0 -68
  86. egse/csl/icons/hexapod-homing.svg +0 -68
  87. egse/csl/icons/hexapod-retract-selected.svg +0 -56
  88. egse/csl/icons/hexapod-retract.svg +0 -51
  89. egse/csl/icons/hexapod-zero-selected.svg +0 -56
  90. egse/csl/icons/hexapod-zero.svg +0 -56
  91. egse/csl/icons/logo-puna.svg +0 -92
  92. egse/csl/icons/stop.svg +0 -1
  93. egse/csl/initialisation.py +0 -102
  94. egse/csl/mech_pos_settings.yaml +0 -18
  95. egse/das.py +0 -1247
  96. egse/das.yaml +0 -7
  97. egse/data/conf/SETUP_CSL_00000_170620_150000.yaml +0 -5
  98. egse/data/conf/SETUP_CSL_00001_170620_151010.yaml +0 -69
  99. egse/data/conf/SETUP_CSL_00002_170620_151020.yaml +0 -69
  100. egse/data/conf/SETUP_CSL_00003_170620_151030.yaml +0 -69
  101. egse/data/conf/SETUP_CSL_00004_170620_151040.yaml +0 -69
  102. egse/data/conf/SETUP_CSL_00005_170620_151050.yaml +0 -69
  103. egse/data/conf/SETUP_CSL_00006_170620_151060.yaml +0 -69
  104. egse/data/conf/SETUP_CSL_00007_170620_151070.yaml +0 -69
  105. egse/data/conf/SETUP_CSL_00008_170620_151080.yaml +0 -75
  106. egse/data/conf/SETUP_CSL_00010_210308_083016.yaml +0 -138
  107. egse/data/conf/SETUP_INTA_00000_170620_150000.yaml +0 -4
  108. egse/data/conf/SETUP_SRON_00000_170620_150000.yaml +0 -4
  109. egse/decorators.py +0 -415
  110. egse/device.py +0 -269
  111. egse/dpu/__init__.py +0 -2681
  112. egse/dpu/ccd_ui.py +0 -508
  113. egse/dpu/dpu.py +0 -786
  114. egse/dpu/dpu.yaml +0 -153
  115. egse/dpu/dpu_cs.py +0 -272
  116. egse/dpu/dpu_ui.py +0 -668
  117. egse/dpu/fitsgen.py +0 -2077
  118. egse/dpu/fitsgen_test.py +0 -752
  119. egse/dpu/fitsgen_ui.py +0 -399
  120. egse/dpu/hdf5_model.py +0 -332
  121. egse/dpu/hdf5_ui.py +0 -277
  122. egse/dpu/hdf5_viewer.py +0 -506
  123. egse/dpu/hk_ui.py +0 -468
  124. egse/dpu_commands.py +0 -81
  125. egse/dsi/constants.py +0 -220
  126. egse/dsi/esl.py +0 -870
  127. egse/dsi/rmap.py +0 -1042
  128. egse/dsi/rmapci.py +0 -37
  129. egse/dsi/spw.py +0 -154
  130. egse/dsi/spw_state.py +0 -29
  131. egse/dummy.py +0 -258
  132. egse/dyndummy.py +0 -179
  133. egse/env.py +0 -278
  134. egse/exceptions.py +0 -88
  135. egse/fdir/__init__.py +0 -28
  136. egse/fdir/fdir_manager.py +0 -85
  137. egse/fdir/fdir_manager.yaml +0 -51
  138. egse/fdir/fdir_manager_controller.py +0 -228
  139. egse/fdir/fdir_manager_cs.py +0 -164
  140. egse/fdir/fdir_manager_interface.py +0 -25
  141. egse/fdir/fdir_remote.py +0 -73
  142. egse/fdir/fdir_remote.yaml +0 -37
  143. egse/fdir/fdir_remote_controller.py +0 -50
  144. egse/fdir/fdir_remote_cs.py +0 -97
  145. egse/fdir/fdir_remote_interface.py +0 -14
  146. egse/fdir/fdir_remote_popup.py +0 -31
  147. egse/fee/__init__.py +0 -114
  148. egse/fee/f_fee_register.yaml +0 -43
  149. egse/fee/fee.py +0 -631
  150. egse/fee/feesim.py +0 -750
  151. egse/fee/n_fee_hk.py +0 -761
  152. egse/fee/nfee.py +0 -187
  153. egse/filterwheel/__init__.py +0 -4
  154. egse/filterwheel/eksma/__init__.py +0 -24
  155. egse/filterwheel/eksma/fw8smc4.py +0 -661
  156. egse/filterwheel/eksma/fw8smc4.yaml +0 -121
  157. egse/filterwheel/eksma/fw8smc4_cs.py +0 -144
  158. egse/filterwheel/eksma/fw8smc4_devif.py +0 -473
  159. egse/filterwheel/eksma/fw8smc4_protocol.py +0 -81
  160. egse/filterwheel/eksma/fw8smc4_ui.py +0 -940
  161. egse/filterwheel/eksma/fw8smc5.py +0 -111
  162. egse/filterwheel/eksma/fw8smc5.yaml +0 -105
  163. egse/filterwheel/eksma/fw8smc5_controller.py +0 -307
  164. egse/filterwheel/eksma/fw8smc5_cs.py +0 -141
  165. egse/filterwheel/eksma/fw8smc5_interface.py +0 -65
  166. egse/filterwheel/eksma/fw8smc5_simulator.py +0 -29
  167. egse/filterwheel/eksma/fw8smc5_ui.py +0 -1068
  168. egse/filterwheel/eksma/testpythonfw.py +0 -215
  169. egse/fov/__init__.py +0 -65
  170. egse/fov/fov_hk.py +0 -712
  171. egse/fov/fov_ui.py +0 -861
  172. egse/fov/fov_ui_controller.py +0 -140
  173. egse/fov/fov_ui_model.py +0 -200
  174. egse/fov/fov_ui_view.py +0 -345
  175. egse/gimbal/__init__.py +0 -32
  176. egse/gimbal/symetrie/__init__.py +0 -26
  177. egse/gimbal/symetrie/alpha.py +0 -586
  178. egse/gimbal/symetrie/generic_gimbal_ui.py +0 -1521
  179. egse/gimbal/symetrie/gimbal.py +0 -877
  180. egse/gimbal/symetrie/gimbal.yaml +0 -168
  181. egse/gimbal/symetrie/gimbal_cs.py +0 -183
  182. egse/gimbal/symetrie/gimbal_protocol.py +0 -135
  183. egse/gimbal/symetrie/gimbal_ui.py +0 -361
  184. egse/gimbal/symetrie/pmac.py +0 -1006
  185. egse/gimbal/symetrie/pmac_regex.py +0 -83
  186. egse/graph.py +0 -132
  187. egse/gui/__init__.py +0 -47
  188. egse/gui/buttons.py +0 -378
  189. egse/gui/focalplane.py +0 -1281
  190. egse/gui/formatter.py +0 -10
  191. egse/gui/led.py +0 -162
  192. egse/gui/limitswitch.py +0 -143
  193. egse/gui/mechanisms.py +0 -588
  194. egse/gui/states.py +0 -148
  195. egse/gui/stripchart.py +0 -729
  196. egse/gui/switch.py +0 -112
  197. egse/h5.py +0 -274
  198. egse/help/__init__.py +0 -0
  199. egse/help/help_ui.py +0 -126
  200. egse/hexapod/__init__.py +0 -32
  201. egse/hexapod/symetrie/__init__.py +0 -138
  202. egse/hexapod/symetrie/alpha.py +0 -874
  203. egse/hexapod/symetrie/dynalpha.py +0 -1387
  204. egse/hexapod/symetrie/hexapod_ui.py +0 -1516
  205. egse/hexapod/symetrie/pmac.py +0 -1010
  206. egse/hexapod/symetrie/pmac_regex.py +0 -83
  207. egse/hexapod/symetrie/puna.py +0 -1167
  208. egse/hexapod/symetrie/puna.yaml +0 -193
  209. egse/hexapod/symetrie/puna_cs.py +0 -196
  210. egse/hexapod/symetrie/puna_protocol.py +0 -131
  211. egse/hexapod/symetrie/puna_ui.py +0 -434
  212. egse/hexapod/symetrie/punaplus.py +0 -107
  213. egse/hexapod/symetrie/zonda.py +0 -872
  214. egse/hexapod/symetrie/zonda.yaml +0 -337
  215. egse/hexapod/symetrie/zonda_cs.py +0 -172
  216. egse/hexapod/symetrie/zonda_devif.py +0 -415
  217. egse/hexapod/symetrie/zonda_protocol.py +0 -119
  218. egse/hexapod/symetrie/zonda_ui.py +0 -449
  219. egse/hk.py +0 -765
  220. egse/icons/aeu-cs-start.svg +0 -117
  221. egse/icons/aeu-cs-stop.svg +0 -118
  222. egse/icons/aeu-cs.svg +0 -107
  223. egse/icons/aeu_cs-started.svg +0 -112
  224. egse/icons/aeu_cs-stopped.svg +0 -112
  225. egse/icons/aeu_cs.svg +0 -55
  226. egse/icons/alert.svg +0 -1
  227. egse/icons/arrow-double-left.png +0 -0
  228. egse/icons/arrow-double-right.png +0 -0
  229. egse/icons/arrow-up.svg +0 -11
  230. egse/icons/backward.svg +0 -1
  231. egse/icons/busy.svg +0 -1
  232. egse/icons/cleaning.svg +0 -115
  233. egse/icons/color-scheme.svg +0 -1
  234. egse/icons/cs-connected-alert.svg +0 -91
  235. egse/icons/cs-connected-disabled.svg +0 -43
  236. egse/icons/cs-connected.svg +0 -89
  237. egse/icons/cs-not-connected.svg +0 -44
  238. egse/icons/double-left-arrow.svg +0 -1
  239. egse/icons/double-right-arrow.svg +0 -1
  240. egse/icons/erase-disabled.svg +0 -19
  241. egse/icons/erase.svg +0 -59
  242. egse/icons/fitsgen-start.svg +0 -47
  243. egse/icons/fitsgen-stop.svg +0 -48
  244. egse/icons/fitsgen.svg +0 -1
  245. egse/icons/forward.svg +0 -1
  246. egse/icons/fov-hk-start.svg +0 -33
  247. egse/icons/fov-hk-stop.svg +0 -37
  248. egse/icons/fov-hk.svg +0 -1
  249. egse/icons/front-desk.svg +0 -1
  250. egse/icons/home-actioned.svg +0 -15
  251. egse/icons/home-disabled.svg +0 -15
  252. egse/icons/home.svg +0 -13
  253. egse/icons/info.svg +0 -1
  254. egse/icons/invalid.png +0 -0
  255. egse/icons/led-green.svg +0 -20
  256. egse/icons/led-grey.svg +0 -20
  257. egse/icons/led-orange.svg +0 -20
  258. egse/icons/led-red.svg +0 -20
  259. egse/icons/led-square-green.svg +0 -134
  260. egse/icons/led-square-grey.svg +0 -134
  261. egse/icons/led-square-orange.svg +0 -134
  262. egse/icons/led-square-red.svg +0 -134
  263. egse/icons/limit-switch-all-green.svg +0 -115
  264. egse/icons/limit-switch-all-red.svg +0 -117
  265. egse/icons/limit-switch-el+.svg +0 -116
  266. egse/icons/limit-switch-el-.svg +0 -117
  267. egse/icons/location-marker.svg +0 -1
  268. egse/icons/logo-dpu.svg +0 -48
  269. egse/icons/logo-gimbal.svg +0 -112
  270. egse/icons/logo-huber.svg +0 -23
  271. egse/icons/logo-ogse.svg +0 -31
  272. egse/icons/logo-puna.svg +0 -92
  273. egse/icons/logo-tcs.svg +0 -29
  274. egse/icons/logo-zonda.svg +0 -66
  275. egse/icons/maximize.svg +0 -1
  276. egse/icons/meter.svg +0 -1
  277. egse/icons/more.svg +0 -45
  278. egse/icons/n-fee-hk-start.svg +0 -24
  279. egse/icons/n-fee-hk-stop.svg +0 -25
  280. egse/icons/n-fee-hk.svg +0 -83
  281. egse/icons/observing-off.svg +0 -46
  282. egse/icons/observing-on.svg +0 -46
  283. egse/icons/open-document-hdf5.png +0 -0
  284. egse/icons/open-document-hdf5.svg +0 -21
  285. egse/icons/ops-mode.svg +0 -1
  286. egse/icons/play-green.svg +0 -17
  287. egse/icons/plugged-disabled.svg +0 -27
  288. egse/icons/plugged.svg +0 -21
  289. egse/icons/pm_ui.svg +0 -1
  290. egse/icons/power-button-green.svg +0 -27
  291. egse/icons/power-button-red.svg +0 -27
  292. egse/icons/power-button.svg +0 -27
  293. egse/icons/radar.svg +0 -1
  294. egse/icons/radioactive.svg +0 -2
  295. egse/icons/reload.svg +0 -1
  296. egse/icons/remote-control-off.svg +0 -28
  297. egse/icons/remote-control-on.svg +0 -28
  298. egse/icons/repeat-blue.svg +0 -15
  299. egse/icons/repeat.svg +0 -1
  300. egse/icons/settings.svg +0 -1
  301. egse/icons/shrink.svg +0 -1
  302. egse/icons/shutter.svg +0 -1
  303. egse/icons/sign-off.svg +0 -1
  304. egse/icons/sign-on.svg +0 -1
  305. egse/icons/sim-mode.svg +0 -1
  306. egse/icons/small-buttons-go.svg +0 -20
  307. egse/icons/small-buttons-minus.svg +0 -51
  308. egse/icons/small-buttons-plus.svg +0 -51
  309. egse/icons/sponge.svg +0 -220
  310. egse/icons/start-button-disabled.svg +0 -84
  311. egse/icons/start-button.svg +0 -50
  312. egse/icons/stop-button-disabled.svg +0 -84
  313. egse/icons/stop-button.svg +0 -50
  314. egse/icons/stop-red.svg +0 -17
  315. egse/icons/stop.svg +0 -1
  316. egse/icons/switch-disabled-square.svg +0 -87
  317. egse/icons/switch-disabled.svg +0 -15
  318. egse/icons/switch-off-square.svg +0 -87
  319. egse/icons/switch-off.svg +0 -72
  320. egse/icons/switch-on-square.svg +0 -87
  321. egse/icons/switch-on.svg +0 -61
  322. egse/icons/temperature-control.svg +0 -44
  323. egse/icons/th_ui_logo.svg +0 -1
  324. egse/icons/unplugged.svg +0 -23
  325. egse/icons/unvalid.png +0 -0
  326. egse/icons/user-interface.svg +0 -1
  327. egse/icons/vacuum.svg +0 -1
  328. egse/icons/valid.png +0 -0
  329. egse/icons/zoom-to-pixel-dark.svg +0 -64
  330. egse/icons/zoom-to-pixel-white.svg +0 -36
  331. egse/images/big-rotation-stage.png +0 -0
  332. egse/images/connected-100.png +0 -0
  333. egse/images/cross.svg +0 -6
  334. egse/images/disconnected-100.png +0 -0
  335. egse/images/gui-icon.png +0 -0
  336. egse/images/home.svg +0 -6
  337. egse/images/info-icon.png +0 -0
  338. egse/images/led-black.svg +0 -89
  339. egse/images/led-green.svg +0 -85
  340. egse/images/led-orange.svg +0 -85
  341. egse/images/led-red.svg +0 -85
  342. egse/images/load-icon.png +0 -0
  343. egse/images/load-setup.png +0 -0
  344. egse/images/load.png +0 -0
  345. egse/images/pause.png +0 -0
  346. egse/images/play-button.svg +0 -8
  347. egse/images/play.png +0 -0
  348. egse/images/process-status.png +0 -0
  349. egse/images/restart.png +0 -0
  350. egse/images/search.png +0 -0
  351. egse/images/sma.png +0 -0
  352. egse/images/start.png +0 -0
  353. egse/images/stop-button.svg +0 -8
  354. egse/images/stop.png +0 -0
  355. egse/images/switch-off.svg +0 -48
  356. egse/images/switch-on.svg +0 -48
  357. egse/images/undo.png +0 -0
  358. egse/images/update-button.svg +0 -11
  359. egse/imageviewer/exposureselection.py +0 -475
  360. egse/imageviewer/imageviewer.py +0 -198
  361. egse/imageviewer/matchfocalplane.py +0 -179
  362. egse/imageviewer/subfieldposition.py +0 -133
  363. egse/lampcontrol/__init__.py +0 -4
  364. egse/lampcontrol/beaglebone/beaglebone.py +0 -178
  365. egse/lampcontrol/beaglebone/beaglebone.yaml +0 -62
  366. egse/lampcontrol/beaglebone/beaglebone_cs.py +0 -106
  367. egse/lampcontrol/beaglebone/beaglebone_devif.py +0 -150
  368. egse/lampcontrol/beaglebone/beaglebone_protocol.py +0 -73
  369. egse/lampcontrol/energetiq/__init__.py +0 -22
  370. egse/lampcontrol/energetiq/eq99.yaml +0 -98
  371. egse/lampcontrol/energetiq/lampEQ99.py +0 -283
  372. egse/lampcontrol/energetiq/lampEQ99_cs.py +0 -128
  373. egse/lampcontrol/energetiq/lampEQ99_devif.py +0 -158
  374. egse/lampcontrol/energetiq/lampEQ99_encode_decode_errors.py +0 -73
  375. egse/lampcontrol/energetiq/lampEQ99_protocol.py +0 -69
  376. egse/lampcontrol/energetiq/lampEQ99_ui.py +0 -465
  377. egse/lib/CentOS-7/EtherSpaceLink_v34_86.dylib +0 -0
  378. egse/lib/CentOS-8/ESL-RMAP_v34_86.dylib +0 -0
  379. egse/lib/CentOS-8/EtherSpaceLink_v34_86.dylib +0 -0
  380. egse/lib/Debian/ESL-RMAP_v34_86.dylib +0 -0
  381. egse/lib/Debian/EtherSpaceLink_v34_86.dylib +0 -0
  382. egse/lib/Debian/libetherspacelink_v35_21.dylib +0 -0
  383. egse/lib/Linux/ESL-RMAP_v34_86.dylib +0 -0
  384. egse/lib/Linux/EtherSpaceLink_v34_86.dylib +0 -0
  385. egse/lib/Ubuntu-20/ESL-RMAP_v34_86.dylib +0 -0
  386. egse/lib/Ubuntu-20/EtherSpaceLink_v34_86.dylib +0 -0
  387. egse/lib/gssw/python3-gssw_2.2.3+31f63c9f-1_all.deb +0 -0
  388. egse/lib/macOS/ESL-RMAP_v34_86.dylib +0 -0
  389. egse/lib/macOS/EtherSpaceLink_v34_86.dylib +0 -0
  390. egse/lib/ximc/__pycache__/pyximc.cpython-38 2.pyc +0 -0
  391. egse/lib/ximc/__pycache__/pyximc.cpython-38.pyc +0 -0
  392. egse/lib/ximc/libximc.framework/Frameworks/libbindy.dylib +0 -0
  393. egse/lib/ximc/libximc.framework/Frameworks/libxiwrapper.dylib +0 -0
  394. egse/lib/ximc/libximc.framework/Headers/ximc.h +0 -5510
  395. egse/lib/ximc/libximc.framework/Resources/Info.plist +0 -42
  396. egse/lib/ximc/libximc.framework/Resources/keyfile.sqlite +0 -0
  397. egse/lib/ximc/libximc.framework/libbindy.so +0 -0
  398. egse/lib/ximc/libximc.framework/libximc +0 -0
  399. egse/lib/ximc/libximc.framework/libximc.so +0 -0
  400. egse/lib/ximc/libximc.framework/libximc.so.7.0.0 +0 -0
  401. egse/lib/ximc/libximc.framework/libxiwrapper.so +0 -0
  402. egse/lib/ximc/pyximc.py +0 -922
  403. egse/listener.py +0 -73
  404. egse/logger/__init__.py +0 -243
  405. egse/logger/log_cs.py +0 -321
  406. egse/metrics.py +0 -98
  407. egse/mixin.py +0 -464
  408. egse/monitoring.py +0 -95
  409. egse/ni/alarms/__init__.py +0 -26
  410. egse/ni/alarms/cdaq9375.py +0 -300
  411. egse/ni/alarms/cdaq9375.yaml +0 -89
  412. egse/ni/alarms/cdaq9375_cs.py +0 -130
  413. egse/ni/alarms/cdaq9375_devif.py +0 -183
  414. egse/ni/alarms/cdaq9375_protocol.py +0 -48
  415. egse/obs_inspection.py +0 -163
  416. egse/observer.py +0 -41
  417. egse/obsid.py +0 -163
  418. egse/powermeter/__init__.py +0 -0
  419. egse/powermeter/ni/__init__.py +0 -38
  420. egse/powermeter/ni/cdaq9184.py +0 -224
  421. egse/powermeter/ni/cdaq9184.yaml +0 -73
  422. egse/powermeter/ni/cdaq9184_cs.py +0 -130
  423. egse/powermeter/ni/cdaq9184_devif.py +0 -201
  424. egse/powermeter/ni/cdaq9184_protocol.py +0 -48
  425. egse/powermeter/ni/cdaq9184_ui.py +0 -544
  426. egse/powermeter/thorlabs/__init__.py +0 -25
  427. egse/powermeter/thorlabs/pm100a.py +0 -380
  428. egse/powermeter/thorlabs/pm100a.yaml +0 -132
  429. egse/powermeter/thorlabs/pm100a_cs.py +0 -136
  430. egse/powermeter/thorlabs/pm100a_devif.py +0 -127
  431. egse/powermeter/thorlabs/pm100a_protocol.py +0 -80
  432. egse/powermeter/thorlabs/pm100a_ui.py +0 -725
  433. egse/process.py +0 -451
  434. egse/procman/__init__.py +0 -811
  435. egse/procman/cannot_start_process_popup.py +0 -43
  436. egse/procman/procman.yaml +0 -49
  437. egse/procman/procman_cs.py +0 -201
  438. egse/procman/procman_ui.py +0 -2081
  439. egse/protocol.py +0 -603
  440. egse/proxy.py +0 -522
  441. egse/randomwalk.py +0 -140
  442. egse/reg.py +0 -585
  443. egse/reload.py +0 -122
  444. egse/reprocess.py +0 -675
  445. egse/resource.py +0 -333
  446. egse/rst.py +0 -135
  447. egse/search.py +0 -182
  448. egse/serialdevice.py +0 -190
  449. egse/services.py +0 -212
  450. egse/services.yaml +0 -51
  451. egse/settings.py +0 -379
  452. egse/settings.yaml +0 -980
  453. egse/setup.py +0 -1180
  454. egse/shutter/__init__.py +0 -0
  455. egse/shutter/thorlabs/__init__.py +0 -19
  456. egse/shutter/thorlabs/ksc101.py +0 -205
  457. egse/shutter/thorlabs/ksc101.yaml +0 -105
  458. egse/shutter/thorlabs/ksc101_cs.py +0 -136
  459. egse/shutter/thorlabs/ksc101_devif.py +0 -201
  460. egse/shutter/thorlabs/ksc101_protocol.py +0 -69
  461. egse/shutter/thorlabs/ksc101_ui.py +0 -548
  462. egse/shutter/thorlabs/sc10.py +0 -82
  463. egse/shutter/thorlabs/sc10.yaml +0 -52
  464. egse/shutter/thorlabs/sc10_controller.py +0 -81
  465. egse/shutter/thorlabs/sc10_cs.py +0 -108
  466. egse/shutter/thorlabs/sc10_interface.py +0 -25
  467. egse/shutter/thorlabs/sc10_simulator.py +0 -30
  468. egse/simulator.py +0 -41
  469. egse/slack.py +0 -61
  470. egse/socketdevice.py +0 -218
  471. egse/sockets.py +0 -218
  472. egse/spw.py +0 -1479
  473. egse/stages/__init__.py +0 -12
  474. egse/stages/aerotech/ensemble.py +0 -247
  475. egse/stages/aerotech/ensemble.yaml +0 -205
  476. egse/stages/aerotech/ensemble_controller.py +0 -275
  477. egse/stages/aerotech/ensemble_cs.py +0 -110
  478. egse/stages/aerotech/ensemble_interface.py +0 -132
  479. egse/stages/aerotech/ensemble_parameters.py +0 -433
  480. egse/stages/aerotech/ensemble_simulator.py +0 -27
  481. egse/stages/aerotech/mgse_sim.py +0 -193
  482. egse/stages/arun/smd3.py +0 -111
  483. egse/stages/arun/smd3.yaml +0 -68
  484. egse/stages/arun/smd3_controller.py +0 -472
  485. egse/stages/arun/smd3_cs.py +0 -112
  486. egse/stages/arun/smd3_interface.py +0 -53
  487. egse/stages/arun/smd3_simulator.py +0 -27
  488. egse/stages/arun/smd3_stop.py +0 -16
  489. egse/stages/huber/__init__.py +0 -49
  490. egse/stages/huber/smc9300.py +0 -904
  491. egse/stages/huber/smc9300.yaml +0 -63
  492. egse/stages/huber/smc9300_cs.py +0 -178
  493. egse/stages/huber/smc9300_devif.py +0 -345
  494. egse/stages/huber/smc9300_protocol.py +0 -111
  495. egse/stages/huber/smc9300_sim.py +0 -547
  496. egse/stages/huber/smc9300_ui.py +0 -973
  497. egse/state.py +0 -173
  498. egse/statemachine.py +0 -274
  499. egse/storage/__init__.py +0 -1004
  500. egse/storage/persistence.py +0 -2295
  501. egse/storage/storage.yaml +0 -72
  502. egse/storage/storage_cs.py +0 -214
  503. egse/styles/dark.qss +0 -343
  504. egse/styles/default.qss +0 -48
  505. egse/synoptics/__init__.py +0 -412
  506. egse/synoptics/syn.yaml +0 -9
  507. egse/synoptics/syn_cs.py +0 -195
  508. egse/system.py +0 -1408
  509. egse/tcs/__init__.py +0 -14
  510. egse/tcs/tcs.py +0 -874
  511. egse/tcs/tcs.yaml +0 -14
  512. egse/tcs/tcs_cs.py +0 -202
  513. egse/tcs/tcs_devif.py +0 -292
  514. egse/tcs/tcs_protocol.py +0 -177
  515. egse/tcs/tcs_sim.py +0 -177
  516. egse/tcs/tcs_ui.py +0 -543
  517. egse/tdms.py +0 -171
  518. egse/tempcontrol/__init__.py +0 -23
  519. egse/tempcontrol/agilent/agilent34970.py +0 -109
  520. egse/tempcontrol/agilent/agilent34970.yaml +0 -44
  521. egse/tempcontrol/agilent/agilent34970_cs.py +0 -116
  522. egse/tempcontrol/agilent/agilent34970_devif.py +0 -182
  523. egse/tempcontrol/agilent/agilent34970_protocol.py +0 -99
  524. egse/tempcontrol/agilent/agilent34972.py +0 -111
  525. egse/tempcontrol/agilent/agilent34972.yaml +0 -44
  526. egse/tempcontrol/agilent/agilent34972_cs.py +0 -117
  527. egse/tempcontrol/agilent/agilent34972_devif.py +0 -189
  528. egse/tempcontrol/agilent/agilent34972_protocol.py +0 -101
  529. egse/tempcontrol/beaglebone/beaglebone.py +0 -342
  530. egse/tempcontrol/beaglebone/beaglebone.yaml +0 -110
  531. egse/tempcontrol/beaglebone/beaglebone_cs.py +0 -117
  532. egse/tempcontrol/beaglebone/beaglebone_protocol.py +0 -135
  533. egse/tempcontrol/beaglebone/beaglebone_ui.py +0 -681
  534. egse/tempcontrol/digalox/digalox.py +0 -107
  535. egse/tempcontrol/digalox/digalox.yaml +0 -36
  536. egse/tempcontrol/digalox/digalox_cs.py +0 -112
  537. egse/tempcontrol/digalox/digalox_protocol.py +0 -55
  538. egse/tempcontrol/keithley/__init__.py +0 -33
  539. egse/tempcontrol/keithley/daq6510.py +0 -662
  540. egse/tempcontrol/keithley/daq6510.yaml +0 -105
  541. egse/tempcontrol/keithley/daq6510_cs.py +0 -163
  542. egse/tempcontrol/keithley/daq6510_devif.py +0 -343
  543. egse/tempcontrol/keithley/daq6510_protocol.py +0 -78
  544. egse/tempcontrol/keithley/daq6510_sim.py +0 -186
  545. egse/tempcontrol/lakeshore/__init__.py +0 -33
  546. egse/tempcontrol/lakeshore/lsci.py +0 -361
  547. egse/tempcontrol/lakeshore/lsci.yaml +0 -162
  548. egse/tempcontrol/lakeshore/lsci_cs.py +0 -174
  549. egse/tempcontrol/lakeshore/lsci_devif.py +0 -292
  550. egse/tempcontrol/lakeshore/lsci_protocol.py +0 -73
  551. egse/tempcontrol/lakeshore/lsci_ui.py +0 -389
  552. egse/tempcontrol/ni/__init__.py +0 -0
  553. egse/tempcontrol/spid/spid.py +0 -109
  554. egse/tempcontrol/spid/spid.yaml +0 -81
  555. egse/tempcontrol/spid/spid_controller.py +0 -279
  556. egse/tempcontrol/spid/spid_cs.py +0 -136
  557. egse/tempcontrol/spid/spid_protocol.py +0 -107
  558. egse/tempcontrol/spid/spid_ui.py +0 -727
  559. egse/tempcontrol/srs/__init__.py +0 -22
  560. egse/tempcontrol/srs/ptc10.py +0 -875
  561. egse/tempcontrol/srs/ptc10.yaml +0 -227
  562. egse/tempcontrol/srs/ptc10_cs.py +0 -128
  563. egse/tempcontrol/srs/ptc10_devif.py +0 -118
  564. egse/tempcontrol/srs/ptc10_protocol.py +0 -42
  565. egse/tempcontrol/srs/ptc10_ui.py +0 -906
  566. egse/ups/apc/apc.py +0 -236
  567. egse/ups/apc/apc.yaml +0 -45
  568. egse/ups/apc/apc_cs.py +0 -101
  569. egse/ups/apc/apc_protocol.py +0 -125
  570. egse/user.yaml +0 -7
  571. egse/vacuum/beaglebone/beaglebone.py +0 -149
  572. egse/vacuum/beaglebone/beaglebone.yaml +0 -44
  573. egse/vacuum/beaglebone/beaglebone_cs.py +0 -108
  574. egse/vacuum/beaglebone/beaglebone_devif.py +0 -164
  575. egse/vacuum/beaglebone/beaglebone_protocol.py +0 -193
  576. egse/vacuum/beaglebone/beaglebone_ui.py +0 -638
  577. egse/vacuum/instrutech/igm402.py +0 -92
  578. egse/vacuum/instrutech/igm402.yaml +0 -90
  579. egse/vacuum/instrutech/igm402_controller.py +0 -128
  580. egse/vacuum/instrutech/igm402_cs.py +0 -108
  581. egse/vacuum/instrutech/igm402_interface.py +0 -49
  582. egse/vacuum/instrutech/igm402_simulator.py +0 -36
  583. egse/vacuum/keller/kellerBus.py +0 -256
  584. egse/vacuum/keller/leo3.py +0 -102
  585. egse/vacuum/keller/leo3.yaml +0 -38
  586. egse/vacuum/keller/leo3_controller.py +0 -83
  587. egse/vacuum/keller/leo3_cs.py +0 -101
  588. egse/vacuum/keller/leo3_interface.py +0 -33
  589. egse/vacuum/mks/evision.py +0 -86
  590. egse/vacuum/mks/evision.yaml +0 -75
  591. egse/vacuum/mks/evision_cs.py +0 -101
  592. egse/vacuum/mks/evision_devif.py +0 -316
  593. egse/vacuum/mks/evision_interface.py +0 -60
  594. egse/vacuum/mks/evision_simulator.py +0 -24
  595. egse/vacuum/mks/evision_ui.py +0 -704
  596. egse/vacuum/pfeiffer/acp40.py +0 -87
  597. egse/vacuum/pfeiffer/acp40.yaml +0 -60
  598. egse/vacuum/pfeiffer/acp40_controller.py +0 -117
  599. egse/vacuum/pfeiffer/acp40_cs.py +0 -109
  600. egse/vacuum/pfeiffer/acp40_interface.py +0 -40
  601. egse/vacuum/pfeiffer/acp40_simulator.py +0 -39
  602. egse/vacuum/pfeiffer/tc400.py +0 -113
  603. egse/vacuum/pfeiffer/tc400.yaml +0 -83
  604. egse/vacuum/pfeiffer/tc400_controller.py +0 -140
  605. egse/vacuum/pfeiffer/tc400_cs.py +0 -109
  606. egse/vacuum/pfeiffer/tc400_interface.py +0 -70
  607. egse/vacuum/pfeiffer/tc400_simulator.py +0 -24
  608. egse/vacuum/pfeiffer/tpg261.py +0 -81
  609. egse/vacuum/pfeiffer/tpg261.yaml +0 -66
  610. egse/vacuum/pfeiffer/tpg261_controller.py +0 -150
  611. egse/vacuum/pfeiffer/tpg261_cs.py +0 -109
  612. egse/vacuum/pfeiffer/tpg261_interface.py +0 -60
  613. egse/vacuum/pfeiffer/tpg261_simulator.py +0 -24
  614. egse/version.py +0 -174
  615. egse/visitedpositions.py +0 -398
  616. egse/windowing.py +0 -213
  617. egse/zmq/__init__.py +0 -28
  618. egse/zmq/spw.py +0 -160
  619. egse/zmq_ser.py +0 -41
  620. scripts/alerts/cold.yaml +0 -278
  621. scripts/alerts/example_alerts.yaml +0 -54
  622. scripts/alerts/transition.yaml +0 -14
  623. scripts/alerts/warm.yaml +0 -49
  624. scripts/analyse_n_fee_hk_data.py +0 -44
  625. scripts/check_hdf5_files.py +0 -192
  626. scripts/check_register_sync.py +0 -47
  627. scripts/create_hdf5_report.py +0 -295
  628. scripts/csl_model.py +0 -436
  629. scripts/csl_restore_setup.py +0 -230
  630. scripts/export-grafana-dashboards.py +0 -50
  631. scripts/fdir/cs_recovery/fdir_cs_recovery.py +0 -59
  632. scripts/fdir/fdir_table.yaml +0 -70
  633. scripts/fdir/fdir_test_recovery.py +0 -11
  634. scripts/fdir/hw_recovery/fdir_agilent_hw_recovery.py +0 -73
  635. scripts/fdir/limit_recovery/fdir_agilent_limit.py +0 -64
  636. scripts/fdir/limit_recovery/fdir_bb_heater_limit.py +0 -61
  637. scripts/fdir/limit_recovery/fdir_ensemble_limit.py +0 -33
  638. scripts/fdir/limit_recovery/fdir_pressure_limit_recovery.py +0 -71
  639. scripts/fix_csv.py +0 -80
  640. scripts/n_fee_supply_voltage_calculation.py +0 -92
  641. scripts/playground.py +0 -30
  642. scripts/print_hdf5_hk_data.py +0 -68
  643. scripts/print_register_map.py +0 -43
  644. scripts/sron/commanding/control_heaters.py +0 -44
  645. scripts/sron/commanding/pumpdown.py +0 -46
  646. scripts/sron/commanding/set_pid_setpoint.py +0 -19
  647. scripts/sron/commanding/shutdown_bbb_heaters.py +0 -10
  648. scripts/sron/commanding/shutdown_pumps.py +0 -33
  649. scripts/sron/tm_gen/tm_gen_agilent.py +0 -38
  650. scripts/sron/tm_gen/tm_gen_heaters.py +0 -4
  651. scripts/sron/tm_gen/tm_gen_spid.py +0 -13
  652. scripts/update_operational_cgse.py +0 -268
  653. scripts/update_operational_cgse_old.py +0 -273
egse/hk.py DELETED
@@ -1,765 +0,0 @@
1
- import csv
2
- import datetime
3
- import logging
4
- from enum import Enum
5
- from pathlib import Path
6
- from typing import Union
7
-
8
- import dateutil.parser as date_parser
9
- import numpy as np
10
-
11
- from egse.config import find_files
12
- from egse.env import get_data_storage_location
13
- from egse.obsid import ObservationIdentifier
14
- from egse.obsid import obsid_from_storage
15
- from egse.settings import Settings
16
- from egse.setup import SetupError
17
- from egse.state import GlobalState
18
- from egse.system import SECONDS_IN_A_DAY
19
- from egse.system import read_last_line
20
- from egse.system import read_last_lines
21
- from egse.system import str_to_datetime
22
- from egse.system import time_since_epoch_1958
23
-
24
- logger = logging.getLogger(__name__)
25
-
26
- SITE_ID = Settings.load("SITE").ID
27
-
28
-
29
- class TmDictionaryColumns(str, Enum):
30
- """ Enumeration of the relevant columns in the TM dictionary spreadsheet.
31
-
32
- The relevant columns are:
33
-
34
- - STORAGE_MNEMONIC: Column with the storage mnemonic of the process that generated the HK;
35
- - CORRECT_HK_NAMES: Column with the correct HK names (that can be used in `get_housekeeping`);
36
- - ORIGINAL_EGSE_HK_NAMES: Column with the names that were originally used in `get_housekeeping` the device
37
- protocol;
38
- - SYNOPTICS_ORIGIN_SRON: Column with the SRON-specific HK names (that will also be stored as synoptics);
39
- - SYNOPTICS_ORIGIN_IAS: Column with the IAS-specific HK names (that will also be stored as synoptics);
40
- - SYNOPTICS_ORIGIN_INTA: Column with the INTA-specific HK names (that will also be stored as synoptics);
41
- - CAL_OFFSET_B: Column with offset b for the linear calibration curve;
42
- - CAL_SLOPE_A: Column with slope a for the linear calibration curve;
43
- - TIMESTAMP_NAMES: Column with the name of the timestamps.
44
- - DASHBOARD: Column with the name of the dashboard that holds the HK metric
45
- """
46
-
47
- STORAGE_MNEMONIC = "Storage mnemonic"
48
- CORRECT_HK_NAMES = "CAM EGSE mnemonic"
49
- ORIGINAL_EGSE_HK_NAMES = "Original name in EGSE"
50
- SYNOPTICS_ORIGIN_CSL = "Origin of synoptics at CSL"
51
- SYNOPTICS_ORIGIN_SRON = " Origin of synoptics at SRON"
52
- SYNOPTICS_ORIGIN_IAS = " Origin of synoptics at IAS"
53
- SYNOPTICS_ORIGIN_INTA = " Origin of synoptics at INTA"
54
- CAL_OFFSET_B = "offset b cal1"
55
- CAL_SLOPE_A = "slope a cal1"
56
- TIMESTAMP_NAMES = "Name of corresponding timestamp"
57
- DESCRIPTION = "Description"
58
- DASHBOARD = "MON screen"
59
-
60
-
61
- class HKError(Exception):
62
- """An HK-specific error."""
63
- pass
64
-
65
-
66
- def get_housekeeping(hk_name: str, obsid: Union[ObservationIdentifier, str, int] = None, od: str = None,
67
- time_window: int = None, data_dir=None):
68
- """
69
- Returns the timestamp(s) and housekeeping value(s) for the housekeeping parameter with the given name.
70
-
71
- It is possible to indicate for which obsid or which OD the housekeeping is to be returned. If neither of them is
72
- specified, the latest daily files are used.
73
-
74
- When the time window has not been specified, the last timestamp and housekeeping value will be returned for the
75
- given OD. It is possible that a component stopped writing HK for some reason, and that the last housekeeping value
76
- is older than you would want. It is therefore important to inspect the corresponding timestamp.
77
-
78
- When the time window has been specified, the relevant housekeeping will be read:
79
-
80
- * determine the sampling rate (compare the timestamps for the last 2 lines in the housekeeping file);
81
- * determine how many samples we need to read (starting at the back);
82
- * read the required number of line, starting at the back;
83
- * for each of the read lines, append the timestamp and HK value to the arrays that will be returned
84
-
85
- Args:
86
- hk_name: Name of the housekeeping parameter.
87
- obsid: Observation identifier. This can be an ObservationIdentifier object, a string in format TEST_LAB or
88
- TEST_LAB_SETUP, or an integer representing the test ID; optional.
89
- od: Identifier for the OD (yyyymmdd); optional.
90
- time_window: Length of the time window over which to retrieve the housekeeping [s]. The time window ends at
91
- the moment this method is called. If not given, the latest housekeeping value is returned.
92
- data_dir: Folder (with sub-folders /daily and /obs) in which the HK files are stored. If this argument is not
93
- provided, the data_dir will be determined from the environment variable PLATO_DATA_STORAGE_LOCATION.
94
-
95
- Raises:
96
- A HKError when one of the following problems occur
97
- * no obsid nor an od argument was provided
98
- * no HK measures were found for the given parameter and obsid/od
99
-
100
- Returns:
101
- - If the time window has not been specified: the most recent timestamp and housekeeping value.
102
- - If the time window has been specified: an array of timestamps and an array of housekeeping values, belonging
103
- to the specified time window.
104
-
105
- """
106
-
107
- # Either specify the obsid or the OD (or neither of them) but not both
108
-
109
- if obsid is not None and od is not None:
110
-
111
- raise HKError(f"Both the obsid ({obsid}) and the OD ({od}) were specified.")
112
-
113
- # Specified obsid (as integer or as string)
114
-
115
- data_dir = data_dir or get_data_storage_location()
116
-
117
- if obsid:
118
-
119
- try:
120
- return _get_housekeeping_obsid(hk_name, data_dir, obsid=obsid, time_window=time_window)
121
- except (ValueError, StopIteration, FileNotFoundError) as exc:
122
- raise HKError(f"No HK found for {hk_name} for obsid {obsid} at {SITE_ID}") from exc
123
-
124
- # Specified OD
125
-
126
- if od:
127
-
128
- try:
129
- return _get_housekeeping_od(hk_name, data_dir, od=od, time_window=time_window)
130
- except (ValueError, StopIteration, FileNotFoundError) as exc:
131
- raise HKError(f"No HK found for {hk_name} for OD {od} at {SITE_ID}") from exc
132
-
133
- # Didn't specify neither the obsid nor the OD
134
-
135
- try:
136
- return _get_housekeeping_daily(hk_name, data_dir, time_window=time_window)
137
- except (ValueError, StopIteration, FileNotFoundError) as exc:
138
- raise HKError(f"No HK found for {hk_name} for today at {SITE_ID}") from exc
139
-
140
-
141
- def _get_housekeeping(hk_name: str, timestamp_name: str, hk_dir: str, files, time_window: int = None):
142
- """ Return the timestamp(s) and HK value(s) for the HK parameter with the given name, for the given files.
143
-
144
- When the time window has not been specified, the last timestamp and HK value will be returned for the given OD.
145
- It is possible that a component stopped writing HK for some reason, and that the last HK value is older than you
146
- would want. It is therefore important to inspect the corresponding timestamp.
147
-
148
- When the time window has been specified, the relevant HK will be read:
149
- - determine the sampling rate (compare the timestamps for the last 2 lines in the HK file);
150
- - determine how many samples we need to read (starting at the back);
151
- - read the required number of line, starting at the back;
152
- - for each of the read lines, append the timestamp and HK value to the arrays that will be returned
153
-
154
- Args:
155
- - hk_name: Name of the housekeeping parameter.
156
- - timestamp_name: Name of the corresponding timestamp.
157
- - hk_dir: Directory with the housekeeping files.
158
- - files: Relative filepath of the selected housekeeping files.
159
- - time_window: Length of the time window over which to retrieve the housekeeping [s]. The time window ends at
160
- the moment this method is called. If not given, the latest HK-value is returned.
161
-
162
- Returns:
163
- - If the time window has not been specified: the most recent timestamp and housekeeping value.
164
- - If the time window has been specified: an array of timestamps and an array of housekeeping values, belonging
165
- to the specified time window.
166
- """
167
-
168
- filename = files[-1]
169
-
170
- # Indices of the columns we need
171
-
172
- timestamp_index, hk_index = get_indices(hk_dir + filename, hk_name, timestamp_name)
173
-
174
- # No time window specified: return the last value
175
-
176
- if time_window is None:
177
-
178
- return get_last_non_empty(hk_dir + filename, timestamp_index, hk_index)
179
-
180
- # Time window specified
181
-
182
- else:
183
-
184
- # We will return an array of timestamps and an array of HK values
185
-
186
- timestamp_array = np.array([])
187
- hk_array = np.array([])
188
-
189
- with open(hk_dir + filename) as file:
190
-
191
- csv_reader = csv.reader(file)
192
- next(csv_reader)
193
- first_timepoint = next(csv_reader)[0].split(",")[timestamp_index] # Skip the header
194
-
195
- last_timepoint = read_last_line(hk_dir + filename).split(",")[timestamp_index]
196
- elapsed = (str_to_datetime(last_timepoint) - str_to_datetime(first_timepoint)).total_seconds()
197
-
198
- # The time window is shorter than the timespan covered by the file
199
-
200
- if time_window < elapsed:
201
-
202
- sampling_rate = get_sampling_rate(hk_dir + filename, timestamp_name) # Time between subsequent samples
203
- num_samples = int(round(time_window / sampling_rate))
204
-
205
- lines = read_last_lines(hk_dir + filename, num_samples)
206
-
207
- for line in lines:
208
-
209
- line = line.split(",")
210
-
211
- timestamp_array = np.append(timestamp_array, line[timestamp_index])
212
- hk_array = np.append(hk_array, line[hk_index])
213
-
214
- # The time window is longer than the timespan covered by the file: read all lines
215
-
216
- else:
217
-
218
- with open(hk_dir + filename) as file:
219
-
220
- csv_reader = csv.reader(file)
221
- next(csv_reader) # Skip the header
222
-
223
- for row in csv_reader:
224
-
225
- timestamp_array = np.append(timestamp_array, row[timestamp_index])
226
- hk_array = np.append(hk_array, row[hk_index])
227
-
228
- for index in range(len(timestamp_array)):
229
-
230
- timestamp_array[index] = time_since_epoch_1958(timestamp_array[index])
231
-
232
- return timestamp_array, hk_array
233
-
234
-
235
- def _get_housekeeping_od(hk_name: str, data_dir, od: str, time_window: int = None):
236
- """ Return the timestamp(s) and HK value(s) for the HK parameter with the given name, for the given OD.
237
-
238
- When the time window has not been specified, the last timestamp and HK value will be returned for the given OD.
239
- It is possible that a component stopped writing HK for some reason, and that the last HK value is older than you
240
- would want. It is therefore important to inspect the corresponding timestamp.
241
-
242
- When the time window has been specified, the relevant HK will be read:
243
- - determine the sampling rate (compare the timestamps for the last 2 lines in the HK file);
244
- - determine how many samples we need to read (starting at the back);
245
- - read the required number of line, starting at the back;
246
- - for each of the read lines, append the timestamp and HK value to the arrays that will be returned
247
-
248
- Args:
249
- - hk_name: Name of the housekeeping parameter.
250
- - data_dir: Folder (with sub-folders /daily and /obs) in which the HK files are stored.
251
- - od: Identifier for the OD (yyyymmdd).
252
- - time_window: Length of the time window over which to retrieve the housekeeping [s]. The time window ends at
253
- the moment this method is called. If not given, the latest HK-value is returned.
254
-
255
- Returns:
256
- - If the time window has not been specified: the most recent timestamp and HK value.
257
- - If the time window has been specified: an array of timestamps and an array of HK values, belonging to the
258
- specified time window.
259
- """
260
-
261
- hk_dir = f"{data_dir}/daily/" # Where the HK is stored
262
-
263
- try:
264
-
265
- origin, timestamp_name = get_hk_info(hk_name)
266
-
267
- except KeyError:
268
-
269
- raise HKError(f"Cannot determine which EGSE component generated HK parameter {hk_name}")
270
-
271
- hk_dir += f"{od}/"
272
- hk_files = [f"{od}_{SITE_ID}_{origin}.csv"]
273
-
274
- return _get_housekeeping(hk_name, timestamp_name, hk_dir, hk_files, time_window=time_window)
275
-
276
-
277
- def _get_housekeeping_obsid(hk_name: str, data_dir, obsid: Union[ObservationIdentifier, str, int],
278
- time_window: int = None):
279
- """ Return the timestamp(s) and HK value(s) for the HK parameter with the given name, for the given obsid.
280
-
281
- When the time window has not been specified, the last timestamp and HK value will be returned for the given obsid.
282
- It is possible that a component stopped writing HK for some reason, and that the last HK value is older than you
283
- would want. It is therefore important to inspect the corresponding timestamp.
284
-
285
- When the time window has been specified, the relevant HK will be read:
286
- - determine the sampling rate (compare the timestamps for the last 2 lines in the HK file);
287
- - determine how many samples we need to read (starting at the back);
288
- - read the required number of line, starting at the back;
289
- - for each of the read lines, append the timestamp and HK value to the arrays that will be returned
290
-
291
- Args:
292
- - hk_name: Name of the housekeeping parameter.
293
- - data_dir: Folder (with sub-folders /daily and /obs) in which the HK files are stored.
294
- - obsid: Observation identifier. This can be an ObservationIdentifier object, a string in format TEST_LAB or
295
- TEST_LAB_SETUP, or an integer representing the test ID.
296
- - time_window: Length of the time window over which to retrieve the housekeeping [s]. The time window ends at
297
- the moment this method is called. If not given, the latest HK-value is returned.
298
-
299
- Returns:
300
- - If the time window has not been specified: the most recent timestamp and HK value.
301
- - If the time window has been specified: an array of timestamps and an array of HK values, belonging to the
302
- specified time window.
303
- """
304
-
305
- hk_dir = f"{data_dir}/obs/" # Where the HK is stored
306
-
307
- try:
308
-
309
- origin, timestamp_name = get_hk_info(hk_name)
310
-
311
- except KeyError:
312
-
313
- raise HKError(f"Cannot determine which EGSE component generated HK parameter {hk_name}")
314
-
315
- obsid = obsid_from_storage(obsid, data_dir=data_dir) # Convert the obsid to the correct format
316
-
317
- hk_dir += f"{obsid}/"
318
- pattern = f"{obsid}_{origin}_*.csv"
319
- hk_files = sorted(find_files(pattern=pattern, root=hk_dir))
320
-
321
- if len(hk_files) == 0:
322
-
323
- raise HKError(f"No HK found for the {origin} at {SITE_ID} for obsid {obsid}")
324
-
325
- hk_files = [hk_files[-1].name]
326
-
327
- return _get_housekeeping(hk_name, timestamp_name, hk_dir, hk_files, time_window=time_window)
328
-
329
-
330
- def _get_housekeeping_daily(hk_name: str, data_dir, time_window: int = None):
331
- """ Return the timestamp(s) and HK value(s) for the HK parameter with the given name.
332
-
333
- When the time window has not been specified, the last timestamp and HK value will be returned. It is possible that
334
- a component stopped writing HK for some reason, and that the last HK value is older than you would want. It is
335
- therefore important to inspect the corresponding timestamp.
336
-
337
- When the time window has been specified, it is possible that we have to fetch the HK from multiple files,
338
- depending on the length of the time window:
339
-
340
- * Oldest file (i.e. the HK file in which the first timestamp in the specified time window is held): only part
341
- of it will have to be read (start reading at the back):
342
- - determine the filename;
343
- - determine the sampling rate (compare the timestamps for the last 2 lines in the HK file);
344
- - determine how many samples we need to read (starting at the back);
345
- - read the required number of line, starting at the back;
346
- - for each of the read lines, append the timestamp and HK value to the arrays that will be returned.
347
- * Any other files: entire file will have to be read:
348
- - determine the filename;
349
- - read all lines;
350
- - for each line: append the timestamp and HK value to the arrays that will be returned.
351
-
352
- Args:
353
- - hk_name: Name of the housekeeping parameter.
354
- - data_dir: Folder (with sub-folders /daily and /obs) in which the HK files are stored.
355
- - time_window: Length of the time window over which to retrieve the housekeeping [s]. The time window ends at
356
- the moment this method is called. If not given, the latest HK-value is returned.
357
-
358
- Returns:
359
- - If the time window has not been specified: the most recent timestamp and HK value.
360
- - If the time window has been specified: an array of timestamps and an array of HK values, belonging to the
361
- specified time window.
362
- """
363
-
364
- hk_dir = f"{data_dir}/daily/" # Where the HK is stored
365
-
366
- try:
367
-
368
- origin, timestamp_name = get_hk_info(hk_name)
369
-
370
- except KeyError:
371
-
372
- raise HKError(f"Cannot determine which EGSE component generated HK parameter {hk_name}")
373
-
374
- # No time window specified: return the last value
375
-
376
- if time_window is None:
377
-
378
- # Look for the last file of this component
379
-
380
- timestamp = datetime.datetime.now(tz=datetime.timezone.utc).strftime("%Y%m%d")
381
- hk_dir += f"{timestamp}/"
382
- filename = f"{timestamp}_{SITE_ID}_{origin}.csv"
383
-
384
- timestamp_index, hk_index = get_indices(hk_dir + filename, hk_name, timestamp_name)
385
- return get_last_non_empty(hk_dir + filename, timestamp_index, hk_index)
386
-
387
- # Time window specified
388
-
389
- else:
390
-
391
- # We will return an array of timestamps and an array of HK values
392
-
393
- timestamp_array = np.array([])
394
- hk_array = np.array([])
395
-
396
- # Go back in time from this very moment and determine:
397
- # - which timespan the most recent HK file covers (i.e. how much time has elapsed since midnight)
398
- # - what the time is at the start of the time window
399
-
400
- now = datetime.datetime.utcnow()
401
- elapsed_since_midnight = now.microsecond * 1e-6 + now.second + 60 * (now.minute + 60 * now.hour)
402
- start_time = now - datetime.timedelta(seconds=time_window)
403
- start_od = f"{start_time.year}{start_time.month:02d}{start_time.day:02d}"
404
-
405
- # Determine which columns will be needed from which file
406
-
407
- filename = f"{start_od}/{start_od}_{SITE_ID}_{origin}.csv"
408
-
409
- if Path(hk_dir + filename).exists():
410
-
411
- timestamp_index, hk_index = get_indices(hk_dir + filename, hk_name, timestamp_name)
412
-
413
- # Determine how many time samples you need to read in the first relevant HK file (starting from the back)
414
-
415
- sampling_rate = get_sampling_rate(hk_dir + filename, timestamp_name) # Time between subsequent samples
416
-
417
- if time_window <= elapsed_since_midnight:
418
-
419
- num_samples_first_day = int(round(time_window / sampling_rate))
420
-
421
- else:
422
-
423
- time_window_first_day = (time_window - elapsed_since_midnight) % SECONDS_IN_A_DAY
424
- num_samples_first_day = int(round(time_window_first_day / sampling_rate)) # TODO Round or floor?
425
-
426
- # Read the required number of lines in the relevant HK file (starting from the back of the file)
427
-
428
- lines_first_day = read_last_lines(hk_dir + filename, num_samples_first_day)
429
-
430
- for line in lines_first_day:
431
-
432
- line = line.split(",")
433
-
434
- timestamp_array = np.append(timestamp_array, line[timestamp_index])
435
- hk_array = np.append(hk_array, line[hk_index])
436
-
437
- # In case we also need to read more recent files
438
- # (those will have to be read entirely)
439
-
440
- else:
441
-
442
- logger.warning(f"No HK available for {origin} on "
443
- f"{start_time.day}/{start_time.month}/{start_time.year}")
444
-
445
- day = (start_time + datetime.timedelta(days=1)).date() # The day after the first day
446
- last_day = datetime.date(now.year, now.month, now.day) # Today
447
-
448
- while day <= last_day:
449
-
450
- od = f"{day.year}{day.month:02d}{day.day:02d}"
451
- filename = f"{od}/{od}_{SITE_ID}_{origin}.csv"
452
-
453
- if Path(hk_dir + filename).exists():
454
-
455
- with open(hk_dir + filename) as file:
456
-
457
- csv_reader = csv.reader(file)
458
-
459
- header = next(csv_reader) # Skip the header
460
- timestamp_index = header.index("timestamp")
461
- try:
462
- hk_index = header.index(hk_name)
463
- except ValueError:
464
- raise HKError(f"Cannot find column {hk_name} in {filename}")
465
-
466
- for row in csv_reader:
467
-
468
- timestamp_array = np.append(timestamp_array, row[timestamp_index])
469
- hk_array = np.append(hk_array, row[hk_index])
470
-
471
- else:
472
-
473
- logger.warning(f"No HK available for {origin} on {day.day}/{day.month}/{day.year}")
474
-
475
- day += datetime.timedelta(days=1)
476
-
477
- for index in range(len(timestamp_array)):
478
-
479
- timestamp_array[index] = time_since_epoch_1958(timestamp_array[index])
480
-
481
- return timestamp_array, hk_array
482
-
483
-
484
- def get_last_non_empty(filename: str, timestamp_index: int, hk_index: int):
485
- """ Return the timestamp and HK value for last real value.
486
-
487
- Args:
488
- - filename: HK file in which to look for the given HK parameter.
489
- - timestamp_index: Index of the column with the timestamps.
490
- - hk_index: Index of the column with the HK parameter with the given name.
491
-
492
- Returns: The timestamp and HK value with the last real value.
493
- """
494
-
495
- timestamp = None
496
- hk_value = " "
497
-
498
- filename = Path(filename)
499
-
500
- if not filename.exists():
501
- return None
502
-
503
- # Declaring variable to implement exponential search
504
-
505
- try:
506
-
507
- num_lines = 1
508
-
509
- while hk_value == " " or hk_value == "":
510
-
511
- pos = num_lines + 1
512
-
513
- # List to store last N lines
514
-
515
- lines = []
516
-
517
- with open(filename) as f:
518
-
519
- while len(lines) <= num_lines:
520
-
521
- try:
522
-
523
- f.seek(-pos, 2)
524
-
525
- except IOError:
526
-
527
- f.seek(0)
528
- break
529
-
530
- finally:
531
-
532
- lines = list(f)
533
-
534
- # Increasing value of variable exponentially
535
-
536
- pos *= 2
537
-
538
- last_line = lines[-num_lines].rstrip("\r").split(",")
539
- timestamp, hk_value = last_line[timestamp_index], last_line[hk_index]
540
-
541
- num_lines += 1
542
-
543
- return time_since_epoch_1958(timestamp), hk_value
544
-
545
- except IndexError:
546
- return None, None
547
-
548
-
549
- def get_indices(filename: str, hk_name: str, timestamp_name: str):
550
- """ Return the column number of the timestamp and given HK parameter in the given HK file.
551
-
552
- Args:
553
- - filename: HK file in which to look for the given HK parameter.
554
- - hk_name: Name of the HK parameter.
555
- - timestamp_name: Name of the corresponding timestamp.
556
-
557
- Returns:
558
- - Index of the column with the timestamps.
559
- - Index of the column with the HK parameter with the given name.
560
- """
561
-
562
- with open(filename, "r") as f:
563
-
564
- reader = csv.reader(f)
565
- header = next(reader) # Skip the header
566
-
567
- timestamp_index = header.index(timestamp_name)
568
- # timestamp_index = 0
569
-
570
- try:
571
-
572
- hk_index = header.index(hk_name)
573
-
574
- except ValueError:
575
-
576
- raise HKError(f"Cannot find column {hk_name} in {filename}")
577
-
578
- return timestamp_index, hk_index
579
-
580
-
581
- def get_sampling_rate(filename: str, timestamp_name: str):
582
- """ Return the sampling rate for the HK file with the given name [s].
583
-
584
- The sampling rate is determine as the difference between the timestamps of the last two lines of the HK file.
585
-
586
- Args:
587
- - filename: Name of the HK file. We do not check explicitly whether this file exists.
588
-
589
- Returns: Sampling rate for the HK file with the given name [s].
590
- """
591
-
592
- # Determine which column comprises the timestamp
593
-
594
- with open(filename, "r") as f:
595
-
596
- reader = csv.reader(f)
597
- header = next(reader) # Skip the header
598
-
599
- timestamp_index = header.index(timestamp_name)
600
-
601
- # Read the last 2 lines and extract the timestamps for these lines
602
-
603
- eof = read_last_lines(filename, 2)
604
-
605
- penultimate_timestamp = date_parser.parse(eof[0].split(",")[timestamp_index])
606
- last_timestamp = date_parser.parse(eof[1].split(",")[timestamp_index])
607
-
608
- # Calculate the sampling rate [s]
609
-
610
- return (last_timestamp - penultimate_timestamp).total_seconds()
611
-
612
- def convert_hk_names(original_hk: dict, conversion_dict: dict) -> dict:
613
- """
614
- Converts the names of the HK parameters in the given dictionary.
615
-
616
- The names/keys in the given dictionary of HK parameters (original_hk) are replaced by the names
617
- from the given conversion dictionary. The original dictionary is left unchanged, a new dictionary is
618
- returned.
619
-
620
- Args:
621
- - original_hk: Original dictionary of HK parameters.
622
- - conversion_dict: Dictionary with the original HK names as keys and the new HK names as values.
623
-
624
- Returns:
625
- A new dictionary of HK parameters with the corrected HK names.
626
- """
627
-
628
- converted_hk = {}
629
-
630
- for orig_key in original_hk:
631
-
632
- try:
633
- new_key = conversion_dict[orig_key]
634
- except KeyError:
635
- new_key = orig_key # no conversion, just copy the key:value pair
636
-
637
- converted_hk[new_key] = original_hk[orig_key]
638
-
639
- return converted_hk
640
-
641
-
642
- def read_conversion_dict(storage_mnemonic: str, use_site: bool = False):
643
- """ Read the HK spreadsheet and compose conversion dictionary for HK names.
644
-
645
- The spreadsheet contains the following information:
646
-
647
- - storage mnemonic of the component that generates the HK
648
- - original HK name (as is comes from the device itself)
649
- - HK name with the correct prefix
650
- - name of the column (in the HK file) with the corresponding timestamp
651
-
652
- Args:
653
- - storage_mnemonic: Storage mnemonic of the component for which to compose the conversion dictionary
654
- - use_site: Indicate whether or not the prefixes of the new HK names are TH-specific
655
-
656
- Returns: Dictionary with the original HK names as keys and the converted HK names as values.
657
- """
658
-
659
- try:
660
- hk_info_table = GlobalState.setup.telemetry.dictionary
661
- except AttributeError:
662
- raise SetupError("Version of the telemetry dictionary not specified in the current setup")
663
-
664
- storage_mnemonic_col = hk_info_table[TmDictionaryColumns.STORAGE_MNEMONIC].values
665
- correct_name_col = hk_info_table[TmDictionaryColumns.CORRECT_HK_NAMES].values
666
- original_name_col = hk_info_table[TmDictionaryColumns.ORIGINAL_EGSE_HK_NAMES].values
667
-
668
- selection = np.where(storage_mnemonic_col == storage_mnemonic)
669
-
670
- correct_name_col = correct_name_col[selection]
671
- original_name_col = original_name_col[selection]
672
-
673
- if use_site:
674
-
675
- th_prefix = f"G{SITE_ID}_"
676
-
677
- th_conversion_dict = {}
678
-
679
- for (original_name, correct_name) in zip(original_name_col, correct_name_col):
680
- if str.startswith(str(correct_name), th_prefix):
681
- th_conversion_dict[original_name] = correct_name
682
-
683
- return th_conversion_dict
684
-
685
- else:
686
-
687
- return dict(zip(original_name_col, correct_name_col))
688
-
689
-
690
- def get_hk_info(hk_name: str):
691
- """ Read the HK spreadsheet and extract information for the given HK parameter.
692
-
693
- The spreadsheet contains the following information:
694
-
695
- - storage mnemonic of the component that generates the HK
696
- - original HK name
697
- - HK name with the correct prefix
698
- - name of the column (in the HK file) with the corresponding timestamp
699
-
700
- Args:
701
- - hk_name: Name of the HK parameter.
702
-
703
- Returns:
704
- - storage mnemonic of the component that generates the given HK parameter
705
- - name of the column in the HK file with the corresponding timestamp
706
- """
707
-
708
- hk_info_table = GlobalState.setup.telemetry.dictionary
709
-
710
- storage_mnemonic = hk_info_table[TmDictionaryColumns.STORAGE_MNEMONIC].values
711
- hk_names = hk_info_table[TmDictionaryColumns.CORRECT_HK_NAMES].values
712
- timestamp_col = hk_info_table[TmDictionaryColumns.TIMESTAMP_NAMES].values
713
-
714
- selection = np.where(hk_names == hk_name)
715
-
716
- try:
717
- return storage_mnemonic[selection][0], timestamp_col[selection][0]
718
- except IndexError:
719
- raise HKError(f"HK parameter {hk_name} unknown")
720
-
721
-
722
- def get_storage_mnemonics():
723
- """ Return the list of the storage mnemonics from the TM dictionary.
724
-
725
- Returns: List of the storage mnemonics from the TM dictionary.
726
- """
727
-
728
- hk_info_table = GlobalState.setup.telemetry.dictionary
729
- storage_mnemonics = hk_info_table[TmDictionaryColumns.STORAGE_MNEMONIC].values
730
- return np.unique(storage_mnemonics)
731
-
732
-
733
- def get_housekeeping_names(name_filter=None, device_filter=None):
734
- """ Return HK names, storage mnemonic, and description.
735
-
736
- The TM dictionary is read into a Pandas DataFrame. If a device filter is given, only the rows pertaining to the
737
- given storage mnemonic are kept. If a name filter is given, only the rows for which the HK parameter name contains
738
- the given name filter are kept.
739
-
740
- The result is returned as a Pandas DataFrame with the following columns:
741
- - "CAM EGSE mnemonic": Name of the HK parameter;
742
- - "Storage mnemonic": Storage mnemonic of the device producing the HK;
743
- - "Description": Description of the HK parameter.
744
-
745
- Synopsis: get_housekeeping_names(name_filter="RAW", device_filter="N-FEE-HK")
746
-
747
- Args:
748
- - name_filter: Filter the HK dataframe, based on (a part of) the name of the HK parameter(s)
749
- - device: Filter the HK dataframe, based on the given storage mmenmonic
750
-
751
- Returns: Pandas DataFrame with the HK name, storage mnemonic, and description of the HK parameters that pass the
752
- given filter.
753
- """
754
-
755
- hk_info_table = GlobalState.setup.telemetry.dictionary
756
- hk_info_table.dropna(subset=[TmDictionaryColumns.CORRECT_HK_NAMES], inplace=True)
757
-
758
- if device_filter:
759
- hk_info_table = hk_info_table.loc[hk_info_table[TmDictionaryColumns.STORAGE_MNEMONIC] == device_filter]
760
-
761
- if name_filter:
762
- hk_info_table = hk_info_table.query(f'`{TmDictionaryColumns.CORRECT_HK_NAMES}`.str.contains("{name_filter}")')
763
-
764
- return hk_info_table[[TmDictionaryColumns.CORRECT_HK_NAMES, TmDictionaryColumns.STORAGE_MNEMONIC,
765
- TmDictionaryColumns.DESCRIPTION]]