cgse 2024.7.0__py3-none-any.whl → 2025.0.2__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 (664) hide show
  1. README.md +27 -0
  2. bump.py +85 -0
  3. cgse-2025.0.2.dist-info/METADATA +38 -0
  4. cgse-2025.0.2.dist-info/RECORD +5 -0
  5. {cgse-2024.7.0.dist-info → cgse-2025.0.2.dist-info}/WHEEL +1 -2
  6. cgse-2024.7.0.dist-info/COPYING +0 -674
  7. cgse-2024.7.0.dist-info/COPYING.LESSER +0 -165
  8. cgse-2024.7.0.dist-info/METADATA +0 -144
  9. cgse-2024.7.0.dist-info/RECORD +0 -660
  10. cgse-2024.7.0.dist-info/entry_points.txt +0 -75
  11. cgse-2024.7.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 -5238
  15. egse/aeu/aeu_awg.yaml +0 -265
  16. egse/aeu/aeu_crio.yaml +0 -273
  17. egse/aeu/aeu_cs.py +0 -627
  18. egse/aeu/aeu_devif.py +0 -321
  19. egse/aeu/aeu_main_ui.py +0 -903
  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 -233
  46. egse/alert/alertman_ui.py +0 -600
  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 -122
  51. egse/alert/gsm/beaglebone_protocol.py +0 -46
  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 -132
  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 -1058
  66. egse/confman/confman.yaml +0 -70
  67. egse/confman/confman_cs.py +0 -240
  68. egse/confman/confman_ui.py +0 -381
  69. egse/confman/setup_ui.py +0 -565
  70. egse/control.py +0 -632
  71. egse/coordinates/__init__.py +0 -534
  72. egse/coordinates/avoidance.py +0 -100
  73. egse/coordinates/cslmodel.py +0 -127
  74. egse/coordinates/laser_tracker_to_dict.py +0 -122
  75. egse/coordinates/point.py +0 -707
  76. egse/coordinates/pyplot.py +0 -194
  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 -1240
  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 -514
  110. egse/device.py +0 -269
  111. egse/dpu/__init__.py +0 -2698
  112. egse/dpu/ccd_ui.py +0 -514
  113. egse/dpu/dpu.py +0 -783
  114. egse/dpu/dpu.yaml +0 -153
  115. egse/dpu/dpu_cs.py +0 -272
  116. egse/dpu/dpu_ui.py +0 -671
  117. egse/dpu/fitsgen.py +0 -2096
  118. egse/dpu/fitsgen_ui.py +0 -399
  119. egse/dpu/hdf5_model.py +0 -332
  120. egse/dpu/hdf5_ui.py +0 -277
  121. egse/dpu/hdf5_viewer.py +0 -506
  122. egse/dpu/hk_ui.py +0 -468
  123. egse/dpu_commands.py +0 -81
  124. egse/dsi/__init__.py +0 -33
  125. egse/dsi/_libesl.py +0 -232
  126. egse/dsi/constants.py +0 -296
  127. egse/dsi/esl.py +0 -630
  128. egse/dsi/rmap.py +0 -444
  129. egse/dsi/rmapci.py +0 -39
  130. egse/dsi/spw.py +0 -335
  131. egse/dsi/spw_state.py +0 -29
  132. egse/dummy.py +0 -318
  133. egse/dyndummy.py +0 -179
  134. egse/env.py +0 -278
  135. egse/exceptions.py +0 -88
  136. egse/fdir/__init__.py +0 -26
  137. egse/fdir/fdir_manager.py +0 -85
  138. egse/fdir/fdir_manager.yaml +0 -37
  139. egse/fdir/fdir_manager_controller.py +0 -136
  140. egse/fdir/fdir_manager_cs.py +0 -164
  141. egse/fdir/fdir_manager_interface.py +0 -15
  142. egse/fdir/fdir_remote.py +0 -73
  143. egse/fdir/fdir_remote.yaml +0 -30
  144. egse/fdir/fdir_remote_controller.py +0 -30
  145. egse/fdir/fdir_remote_cs.py +0 -94
  146. egse/fdir/fdir_remote_interface.py +0 -9
  147. egse/fdir/fdir_remote_popup.py +0 -26
  148. egse/fee/__init__.py +0 -106
  149. egse/fee/f_fee_register.yaml +0 -43
  150. egse/fee/feesim.py +0 -914
  151. egse/fee/n_fee_hk.py +0 -768
  152. egse/fee/nfee.py +0 -188
  153. egse/filterwheel/__init__.py +0 -4
  154. egse/filterwheel/eksma/__init__.py +0 -49
  155. egse/filterwheel/eksma/fw8smc4.py +0 -657
  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 -82
  160. egse/filterwheel/eksma/fw8smc4_ui.py +0 -940
  161. egse/filterwheel/eksma/fw8smc5.py +0 -115
  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 -1065
  168. egse/filterwheel/eksma/testpythonfw.py +0 -215
  169. egse/fov/__init__.py +0 -65
  170. egse/fov/fov_hk.py +0 -710
  171. egse/fov/fov_ui.py +0 -859
  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 -138
  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 -1285
  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 -587
  194. egse/gui/states.py +0 -148
  195. egse/gui/stripchart.py +0 -729
  196. egse/gui/styles.qss +0 -48
  197. egse/gui/switch.py +0 -112
  198. egse/h5.py +0 -274
  199. egse/help/__init__.py +0 -0
  200. egse/help/help_ui.py +0 -126
  201. egse/hexapod/__init__.py +0 -32
  202. egse/hexapod/symetrie/__init__.py +0 -137
  203. egse/hexapod/symetrie/alpha.py +0 -874
  204. egse/hexapod/symetrie/dynalpha.py +0 -1387
  205. egse/hexapod/symetrie/hexapod_ui.py +0 -1516
  206. egse/hexapod/symetrie/pmac.py +0 -1010
  207. egse/hexapod/symetrie/pmac_regex.py +0 -83
  208. egse/hexapod/symetrie/puna.py +0 -1167
  209. egse/hexapod/symetrie/puna.yaml +0 -193
  210. egse/hexapod/symetrie/puna_cs.py +0 -195
  211. egse/hexapod/symetrie/puna_protocol.py +0 -134
  212. egse/hexapod/symetrie/puna_ui.py +0 -433
  213. egse/hexapod/symetrie/punaplus.py +0 -107
  214. egse/hexapod/symetrie/zonda.py +0 -872
  215. egse/hexapod/symetrie/zonda.yaml +0 -337
  216. egse/hexapod/symetrie/zonda_cs.py +0 -172
  217. egse/hexapod/symetrie/zonda_devif.py +0 -414
  218. egse/hexapod/symetrie/zonda_protocol.py +0 -123
  219. egse/hexapod/symetrie/zonda_ui.py +0 -449
  220. egse/hk.py +0 -791
  221. egse/icons/aeu-cs-start.svg +0 -117
  222. egse/icons/aeu-cs-stop.svg +0 -118
  223. egse/icons/aeu-cs.svg +0 -107
  224. egse/icons/aeu_cs-started.svg +0 -112
  225. egse/icons/aeu_cs-stopped.svg +0 -112
  226. egse/icons/aeu_cs.svg +0 -55
  227. egse/icons/alert.svg +0 -1
  228. egse/icons/arrow-double-left.png +0 -0
  229. egse/icons/arrow-double-right.png +0 -0
  230. egse/icons/arrow-up.svg +0 -11
  231. egse/icons/backward.svg +0 -1
  232. egse/icons/busy.svg +0 -1
  233. egse/icons/cleaning.svg +0 -115
  234. egse/icons/color-scheme.svg +0 -1
  235. egse/icons/cs-connected-alert.svg +0 -91
  236. egse/icons/cs-connected-disabled.svg +0 -43
  237. egse/icons/cs-connected.svg +0 -89
  238. egse/icons/cs-not-connected.svg +0 -44
  239. egse/icons/double-left-arrow.svg +0 -1
  240. egse/icons/double-right-arrow.svg +0 -1
  241. egse/icons/erase-disabled.svg +0 -19
  242. egse/icons/erase.svg +0 -59
  243. egse/icons/fitsgen-start.svg +0 -47
  244. egse/icons/fitsgen-stop.svg +0 -48
  245. egse/icons/fitsgen.svg +0 -1
  246. egse/icons/forward.svg +0 -1
  247. egse/icons/fov-hk-start.svg +0 -33
  248. egse/icons/fov-hk-stop.svg +0 -37
  249. egse/icons/fov-hk.svg +0 -1
  250. egse/icons/front-desk.svg +0 -1
  251. egse/icons/home-actioned.svg +0 -15
  252. egse/icons/home-disabled.svg +0 -15
  253. egse/icons/home.svg +0 -13
  254. egse/icons/info.svg +0 -1
  255. egse/icons/invalid.png +0 -0
  256. egse/icons/led-green.svg +0 -20
  257. egse/icons/led-grey.svg +0 -20
  258. egse/icons/led-orange.svg +0 -20
  259. egse/icons/led-red.svg +0 -20
  260. egse/icons/led-square-green.svg +0 -134
  261. egse/icons/led-square-grey.svg +0 -134
  262. egse/icons/led-square-orange.svg +0 -134
  263. egse/icons/led-square-red.svg +0 -134
  264. egse/icons/limit-switch-all-green.svg +0 -115
  265. egse/icons/limit-switch-all-red.svg +0 -117
  266. egse/icons/limit-switch-el+.svg +0 -116
  267. egse/icons/limit-switch-el-.svg +0 -117
  268. egse/icons/location-marker.svg +0 -1
  269. egse/icons/logo-dpu.svg +0 -48
  270. egse/icons/logo-gimbal.svg +0 -112
  271. egse/icons/logo-huber.svg +0 -23
  272. egse/icons/logo-ogse.svg +0 -31
  273. egse/icons/logo-puna.svg +0 -92
  274. egse/icons/logo-tcs.svg +0 -29
  275. egse/icons/logo-zonda.svg +0 -66
  276. egse/icons/maximize.svg +0 -1
  277. egse/icons/meter.svg +0 -1
  278. egse/icons/more.svg +0 -45
  279. egse/icons/n-fee-hk-start.svg +0 -24
  280. egse/icons/n-fee-hk-stop.svg +0 -25
  281. egse/icons/n-fee-hk.svg +0 -83
  282. egse/icons/observing-off.svg +0 -46
  283. egse/icons/observing-on.svg +0 -46
  284. egse/icons/open-document-hdf5.png +0 -0
  285. egse/icons/open-document-hdf5.svg +0 -21
  286. egse/icons/ops-mode.svg +0 -1
  287. egse/icons/play-green.svg +0 -17
  288. egse/icons/plugged-disabled.svg +0 -27
  289. egse/icons/plugged.svg +0 -21
  290. egse/icons/pm_ui.svg +0 -1
  291. egse/icons/power-button-green.svg +0 -27
  292. egse/icons/power-button-red.svg +0 -27
  293. egse/icons/power-button.svg +0 -27
  294. egse/icons/radar.svg +0 -1
  295. egse/icons/radioactive.svg +0 -2
  296. egse/icons/reload.svg +0 -1
  297. egse/icons/remote-control-off.svg +0 -28
  298. egse/icons/remote-control-on.svg +0 -28
  299. egse/icons/repeat-blue.svg +0 -15
  300. egse/icons/repeat.svg +0 -1
  301. egse/icons/settings.svg +0 -1
  302. egse/icons/shrink.svg +0 -1
  303. egse/icons/shutter.svg +0 -1
  304. egse/icons/sign-off.svg +0 -1
  305. egse/icons/sign-on.svg +0 -1
  306. egse/icons/sim-mode.svg +0 -1
  307. egse/icons/small-buttons-go.svg +0 -20
  308. egse/icons/small-buttons-minus.svg +0 -51
  309. egse/icons/small-buttons-plus.svg +0 -51
  310. egse/icons/sponge.svg +0 -220
  311. egse/icons/start-button-disabled.svg +0 -84
  312. egse/icons/start-button.svg +0 -50
  313. egse/icons/stop-button-disabled.svg +0 -84
  314. egse/icons/stop-button.svg +0 -50
  315. egse/icons/stop-red.svg +0 -17
  316. egse/icons/stop.svg +0 -1
  317. egse/icons/switch-disabled-square.svg +0 -87
  318. egse/icons/switch-disabled.svg +0 -15
  319. egse/icons/switch-off-square.svg +0 -87
  320. egse/icons/switch-off.svg +0 -72
  321. egse/icons/switch-on-square.svg +0 -87
  322. egse/icons/switch-on.svg +0 -61
  323. egse/icons/temperature-control.svg +0 -44
  324. egse/icons/th_ui_logo.svg +0 -1
  325. egse/icons/unplugged.svg +0 -23
  326. egse/icons/unvalid.png +0 -0
  327. egse/icons/user-interface.svg +0 -1
  328. egse/icons/vacuum.svg +0 -1
  329. egse/icons/valid.png +0 -0
  330. egse/icons/zoom-to-pixel-dark.svg +0 -64
  331. egse/icons/zoom-to-pixel-white.svg +0 -36
  332. egse/images/big-rotation-stage.png +0 -0
  333. egse/images/connected-100.png +0 -0
  334. egse/images/cross.svg +0 -6
  335. egse/images/disconnected-100.png +0 -0
  336. egse/images/gui-icon.png +0 -0
  337. egse/images/home.svg +0 -6
  338. egse/images/info-icon.png +0 -0
  339. egse/images/led-black.svg +0 -89
  340. egse/images/led-green.svg +0 -85
  341. egse/images/led-orange.svg +0 -85
  342. egse/images/led-red.svg +0 -85
  343. egse/images/load-icon.png +0 -0
  344. egse/images/load-setup.png +0 -0
  345. egse/images/load.png +0 -0
  346. egse/images/pause.png +0 -0
  347. egse/images/play-button.svg +0 -8
  348. egse/images/play.png +0 -0
  349. egse/images/process-status.png +0 -0
  350. egse/images/restart.png +0 -0
  351. egse/images/search.png +0 -0
  352. egse/images/sma.png +0 -0
  353. egse/images/start.png +0 -0
  354. egse/images/stop-button.svg +0 -8
  355. egse/images/stop.png +0 -0
  356. egse/images/switch-off.svg +0 -48
  357. egse/images/switch-on.svg +0 -48
  358. egse/images/undo.png +0 -0
  359. egse/images/update-button.svg +0 -11
  360. egse/imageviewer/exposureselection.py +0 -475
  361. egse/imageviewer/imageviewer.py +0 -198
  362. egse/imageviewer/matchfocalplane.py +0 -179
  363. egse/imageviewer/subfieldposition.py +0 -133
  364. egse/lampcontrol/__init__.py +0 -4
  365. egse/lampcontrol/beaglebone/beaglebone.py +0 -178
  366. egse/lampcontrol/beaglebone/beaglebone.yaml +0 -62
  367. egse/lampcontrol/beaglebone/beaglebone_cs.py +0 -106
  368. egse/lampcontrol/beaglebone/beaglebone_devif.py +0 -150
  369. egse/lampcontrol/beaglebone/beaglebone_protocol.py +0 -73
  370. egse/lampcontrol/energetiq/__init__.py +0 -22
  371. egse/lampcontrol/energetiq/eq99.yaml +0 -98
  372. egse/lampcontrol/energetiq/lampEQ99.py +0 -283
  373. egse/lampcontrol/energetiq/lampEQ99_cs.py +0 -128
  374. egse/lampcontrol/energetiq/lampEQ99_devif.py +0 -158
  375. egse/lampcontrol/energetiq/lampEQ99_encode_decode_errors.py +0 -73
  376. egse/lampcontrol/energetiq/lampEQ99_protocol.py +0 -71
  377. egse/lampcontrol/energetiq/lampEQ99_ui.py +0 -465
  378. egse/lib/CentOS-7/EtherSpaceLink_v34_86.dylib +0 -0
  379. egse/lib/CentOS-8/ESL-RMAP_v34_86.dylib +0 -0
  380. egse/lib/CentOS-8/EtherSpaceLink_v34_86.dylib +0 -0
  381. egse/lib/Debian/ESL-RMAP_v34_86.dylib +0 -0
  382. egse/lib/Debian/EtherSpaceLink_v34_86.dylib +0 -0
  383. egse/lib/Debian/libetherspacelink_v35_21.dylib +0 -0
  384. egse/lib/Linux/ESL-RMAP_v34_86.dylib +0 -0
  385. egse/lib/Linux/EtherSpaceLink_v34_86.dylib +0 -0
  386. egse/lib/Ubuntu-20/ESL-RMAP_v34_86.dylib +0 -0
  387. egse/lib/Ubuntu-20/EtherSpaceLink_v34_86.dylib +0 -0
  388. egse/lib/gssw/python3-gssw_2.2.3+31f63c9f-1_all.deb +0 -0
  389. egse/lib/ximc/__pycache__/pyximc.cpython-38 2.pyc +0 -0
  390. egse/lib/ximc/__pycache__/pyximc.cpython-38.pyc +0 -0
  391. egse/lib/ximc/libximc.framework/Frameworks/libbindy.dylib +0 -0
  392. egse/lib/ximc/libximc.framework/Frameworks/libxiwrapper.dylib +0 -0
  393. egse/lib/ximc/libximc.framework/Headers/ximc.h +0 -5510
  394. egse/lib/ximc/libximc.framework/Resources/Info.plist +0 -42
  395. egse/lib/ximc/libximc.framework/Resources/keyfile.sqlite +0 -0
  396. egse/lib/ximc/libximc.framework/libbindy.so +0 -0
  397. egse/lib/ximc/libximc.framework/libximc +0 -0
  398. egse/lib/ximc/libximc.framework/libximc.so +0 -0
  399. egse/lib/ximc/libximc.framework/libximc.so.7.0.0 +0 -0
  400. egse/lib/ximc/libximc.framework/libxiwrapper.so +0 -0
  401. egse/lib/ximc/pyximc.py +0 -922
  402. egse/listener.py +0 -179
  403. egse/logger/__init__.py +0 -243
  404. egse/logger/log_cs.py +0 -321
  405. egse/metrics.py +0 -102
  406. egse/mixin.py +0 -464
  407. egse/monitoring.py +0 -95
  408. egse/ni/alarms/__init__.py +0 -26
  409. egse/ni/alarms/cdaq9375.py +0 -300
  410. egse/ni/alarms/cdaq9375.yaml +0 -89
  411. egse/ni/alarms/cdaq9375_cs.py +0 -130
  412. egse/ni/alarms/cdaq9375_devif.py +0 -183
  413. egse/ni/alarms/cdaq9375_protocol.py +0 -48
  414. egse/obs_inspection.py +0 -165
  415. egse/observer.py +0 -41
  416. egse/obsid.py +0 -163
  417. egse/powermeter/__init__.py +0 -0
  418. egse/powermeter/ni/__init__.py +0 -38
  419. egse/powermeter/ni/cdaq9184.py +0 -224
  420. egse/powermeter/ni/cdaq9184.yaml +0 -73
  421. egse/powermeter/ni/cdaq9184_cs.py +0 -130
  422. egse/powermeter/ni/cdaq9184_devif.py +0 -201
  423. egse/powermeter/ni/cdaq9184_protocol.py +0 -48
  424. egse/powermeter/ni/cdaq9184_ui.py +0 -544
  425. egse/powermeter/thorlabs/__init__.py +0 -25
  426. egse/powermeter/thorlabs/pm100a.py +0 -380
  427. egse/powermeter/thorlabs/pm100a.yaml +0 -132
  428. egse/powermeter/thorlabs/pm100a_cs.py +0 -136
  429. egse/powermeter/thorlabs/pm100a_devif.py +0 -127
  430. egse/powermeter/thorlabs/pm100a_protocol.py +0 -80
  431. egse/powermeter/thorlabs/pm100a_ui.py +0 -725
  432. egse/process.py +0 -451
  433. egse/procman/__init__.py +0 -834
  434. egse/procman/cannot_start_process_popup.py +0 -43
  435. egse/procman/procman.yaml +0 -49
  436. egse/procman/procman_cs.py +0 -201
  437. egse/procman/procman_ui.py +0 -2081
  438. egse/protocol.py +0 -605
  439. egse/proxy.py +0 -531
  440. egse/randomwalk.py +0 -140
  441. egse/reg.py +0 -585
  442. egse/reload.py +0 -122
  443. egse/reprocess.py +0 -693
  444. egse/resource.py +0 -333
  445. egse/rmap.py +0 -406
  446. egse/rst.py +0 -135
  447. egse/search.py +0 -182
  448. egse/serialdevice.py +0 -190
  449. egse/services.py +0 -247
  450. egse/services.yaml +0 -68
  451. egse/settings.py +0 -379
  452. egse/settings.yaml +0 -980
  453. egse/setup.py +0 -1181
  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 -71
  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 -1401
  473. egse/stages/__init__.py +0 -12
  474. egse/stages/aerotech/ensemble.py +0 -245
  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 -188
  482. egse/stages/arun/smd3.py +0 -110
  483. egse/stages/arun/smd3.yaml +0 -68
  484. egse/stages/arun/smd3_controller.py +0 -470
  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 -920
  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 -113
  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 -1067
  500. egse/storage/persistence.py +0 -2295
  501. egse/storage/storage.yaml +0 -79
  502. egse/storage/storage_cs.py +0 -231
  503. egse/styles/dark.qss +0 -343
  504. egse/styles/default.qss +0 -48
  505. egse/synoptics/__init__.py +0 -417
  506. egse/synoptics/syn.yaml +0 -9
  507. egse/synoptics/syn_cs.py +0 -195
  508. egse/system.py +0 -1611
  509. egse/tcs/__init__.py +0 -14
  510. egse/tcs/tcs.py +0 -879
  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 -180
  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 -114
  522. egse/tempcontrol/agilent/agilent34970_devif.py +0 -182
  523. egse/tempcontrol/agilent/agilent34970_protocol.py +0 -96
  524. egse/tempcontrol/agilent/agilent34972.py +0 -111
  525. egse/tempcontrol/agilent/agilent34972.yaml +0 -44
  526. egse/tempcontrol/agilent/agilent34972_cs.py +0 -115
  527. egse/tempcontrol/agilent/agilent34972_devif.py +0 -189
  528. egse/tempcontrol/agilent/agilent34972_protocol.py +0 -98
  529. egse/tempcontrol/beaglebone/beaglebone.py +0 -341
  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 -134
  533. egse/tempcontrol/beaglebone/beaglebone_ui.py +0 -674
  534. egse/tempcontrol/digalox/digalox.py +0 -115
  535. egse/tempcontrol/digalox/digalox.yaml +0 -36
  536. egse/tempcontrol/digalox/digalox_cs.py +0 -108
  537. egse/tempcontrol/digalox/digalox_protocol.py +0 -56
  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 -79
  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 -76
  551. egse/tempcontrol/lakeshore/lsci_ui.py +0 -387
  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 -723
  559. egse/tempcontrol/srs/__init__.py +0 -22
  560. egse/tempcontrol/srs/ptc10.py +0 -867
  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 -116
  564. egse/tempcontrol/srs/ptc10_protocol.py +0 -39
  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 -159
  575. egse/vacuum/beaglebone/beaglebone_protocol.py +0 -192
  576. egse/vacuum/beaglebone/beaglebone_ui.py +0 -638
  577. egse/vacuum/instrutech/igm402.py +0 -91
  578. egse/vacuum/instrutech/igm402.yaml +0 -90
  579. egse/vacuum/instrutech/igm402_controller.py +0 -124
  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 -100
  585. egse/vacuum/keller/leo3.yaml +0 -38
  586. egse/vacuum/keller/leo3_controller.py +0 -81
  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 -313
  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 -701
  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 -37
  602. egse/vacuum/pfeiffer/tc400.py +0 -87
  603. egse/vacuum/pfeiffer/tc400.yaml +0 -83
  604. egse/vacuum/pfeiffer/tc400_controller.py +0 -136
  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 -35
  608. egse/vacuum/pfeiffer/tpg261.py +0 -80
  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 -59
  613. egse/vacuum/pfeiffer/tpg261_simulator.py +0 -23
  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 -52
  625. scripts/check_hdf5_files.py +0 -192
  626. scripts/check_register_sync.py +0 -47
  627. scripts/check_tcs_calib_coef.py +0 -90
  628. scripts/correct_ccd_cold_temperature_cal.py +0 -157
  629. scripts/create_hdf5_report.py +0 -293
  630. scripts/csl_model.py +0 -420
  631. scripts/csl_restore_setup.py +0 -229
  632. scripts/export-grafana-dashboards.py +0 -49
  633. scripts/fdir/cs_recovery/fdir_cs_recovery.py +0 -54
  634. scripts/fdir/fdir_table.yaml +0 -70
  635. scripts/fdir/fdir_test_recovery.py +0 -10
  636. scripts/fdir/hw_recovery/fdir_agilent_hw_recovery.py +0 -73
  637. scripts/fdir/limit_recovery/fdir_agilent_limit.py +0 -61
  638. scripts/fdir/limit_recovery/fdir_bb_heater_limit.py +0 -59
  639. scripts/fdir/limit_recovery/fdir_ensemble_limit.py +0 -33
  640. scripts/fdir/limit_recovery/fdir_pressure_limit_recovery.py +0 -71
  641. scripts/fix_csv.py +0 -80
  642. scripts/ias/correct_ccd_temp_cal_elfique.py +0 -43
  643. scripts/ias/correct_ccd_temp_cal_floreffe.py +0 -43
  644. scripts/ias/correct_trp_swap_achel.py +0 -199
  645. scripts/inta/correct_ccd_temp_cal_duvel.py +0 -43
  646. scripts/inta/correct_ccd_temp_cal_gueuze.py +0 -43
  647. scripts/n_fee_supply_voltage_calculation.py +0 -92
  648. scripts/playground.py +0 -30
  649. scripts/print_hdf5_hk_data.py +0 -68
  650. scripts/print_register_map.py +0 -43
  651. scripts/remove_lines_between_matches.py +0 -188
  652. scripts/sron/commanding/control_heaters.py +0 -44
  653. scripts/sron/commanding/pumpdown.py +0 -46
  654. scripts/sron/commanding/set_pid_setpoint.py +0 -19
  655. scripts/sron/commanding/shutdown_bbb_heaters.py +0 -10
  656. scripts/sron/commanding/shutdown_pumps.py +0 -33
  657. scripts/sron/correct_mgse_coordinates_brigand_chimay.py +0 -272
  658. scripts/sron/correct_trp_swap_brigand.py +0 -204
  659. scripts/sron/gimbal_conversions.py +0 -75
  660. scripts/sron/tm_gen/tm_gen_agilent.py +0 -37
  661. scripts/sron/tm_gen/tm_gen_heaters.py +0 -4
  662. scripts/sron/tm_gen/tm_gen_spid.py +0 -13
  663. scripts/update_operational_cgse.py +0 -268
  664. scripts/update_operational_cgse_old.py +0 -273
@@ -1,534 +0,0 @@
1
- import ast
2
- import logging
3
- import re
4
- from math import atan
5
- from math import atan2
6
- from math import cos
7
- from math import degrees
8
- from math import pow
9
- from math import radians
10
- from math import sin
11
- from math import sqrt
12
- from math import tan
13
- from typing import Dict
14
- from typing import List
15
- from typing import Optional
16
- from typing import Union
17
-
18
- import numpy as np
19
- from numpy.polynomial import Polynomial
20
-
21
- from egse.coordinates.referenceFrame import ReferenceFrame
22
- from egse.settings import Settings
23
- from egse.state import GlobalState
24
- from egse.setup import NavigableDict, load_setup, Setup
25
-
26
- logger = logging.getLogger(__name__)
27
-
28
- FOV_SETTINGS = Settings.load("Field-Of-View")
29
- CCD_SETTINGS = Settings.load("CCD")
30
-
31
-
32
- def undistorted_to_distorted_focal_plane_coordinates(
33
- x_undistorted, y_undistorted, distortion_coefficients, focal_length
34
- ):
35
- """
36
- Conversion from undistorted to distorted focal-plane coordinates. The distortion is a
37
- radial effect and is defined as the difference in radial distance to the optical axis
38
- between the distorted and undistorted coordinates, and can be expressed in terms of the
39
- undistorted radial distance r as follows:
40
-
41
- Δr = r * [(k1 * r**2) + (k2 * r**4) + (k3 * r**6)],
42
-
43
- where the distortion and r are expressed in normalised focal-plane coordinates (i.e. divided
44
- by the focal length, expressed in the same unit), and (k1, k2, k3) are the distortion
45
- coefficients.
46
-
47
- Args:
48
- x_undistorted: Undistorted x-coordinate on the focal plane [mm].
49
- y_undistorted: Undistorted y-coordinate on the focal plane [mm].
50
- distortion_coefficients: List of polynomial coefficients for the field distortion.
51
- focal_length: Focal length [mm].
52
- Returns:
53
- x_distorted: Distorted x-coordinate on the focal plane [mm].
54
- y_distorted: Distorted y-coordinate on the focal plane [mm].
55
- """
56
-
57
- # Distortion coefficients -> (0, 0, 0, k1, 0, k2, 0, k3)
58
-
59
- coefficients = [
60
- 0,
61
- 0,
62
- 0,
63
- distortion_coefficients[0],
64
- 0,
65
- distortion_coefficients[1],
66
- 0,
67
- distortion_coefficients[2],
68
- ]
69
- distortion_polynomial = Polynomial(coefficients)
70
-
71
- # Position on the focal plane:
72
- # - field angle [radians]
73
- # - radial distance from the optical axis [normalised pixels]
74
-
75
- angle = atan2(y_undistorted, x_undistorted)
76
- distance_undistorted = sqrt(pow(x_undistorted, 2) + pow(y_undistorted, 2)) / focal_length
77
-
78
- # Distortion [mm]
79
- # Source moves away from the optical axis (radially)
80
-
81
- distortion = distortion_polynomial(distance_undistorted) * focal_length
82
-
83
- # The field angle remains the same
84
-
85
- x_distorted = x_undistorted + cos(angle) * distortion
86
- y_distorted = y_undistorted + sin(angle) * distortion
87
-
88
- return x_distorted, y_distorted
89
-
90
-
91
- def distorted_to_undistorted_focal_plane_coordinates(
92
- x_distorted, y_distorted, inverse_distortion_coefficients, focal_length
93
- ):
94
- """
95
- Conversion from distorted to undistorted focal-plane coordinates. The inverse distortion is a
96
- radial effect and is defined as the difference in radial distance to the optical axis
97
- between the distorted and undistorted coordinates, and can be expressed in terms of the
98
- undistorted radial distance r as follows:
99
-
100
- Δr = r * [(k1 * r**2) + (k2 * r**4) + (k3 * r**6)],
101
-
102
- where the inverse distortion and r are expressed in normalised focal-plane coordinates (i.e. divided
103
- by the focal length, expressed in the same unit), and (k1, k2, k3) are the inverse distortion
104
- coefficients.
105
-
106
- Args:
107
- x_distorted: Distorted x-coordinate on the focal plane [mm].
108
- y_distorted: Distorted y-coordinate on the focal plane [mm].
109
- inverse_distortion_coefficients: List of polynomial coefficients for the inverse field distortion.
110
- focal_length: Focal length [mm].
111
- Returns:
112
- x_undistorted: Undistorted x-coordinate on the focal plane [mm].
113
- y_undistorted: Undistorted y-coordinate on the focal plane [mm].
114
- """
115
-
116
- # Inverse distortion coefficients -> (0, 0, 0, k1, 0, k2, 0, k3)
117
-
118
- coefficients = [
119
- 0,
120
- 0,
121
- 0,
122
- inverse_distortion_coefficients[0],
123
- 0,
124
- inverse_distortion_coefficients[1],
125
- 0,
126
- inverse_distortion_coefficients[2],
127
- ]
128
- inverse_distortion_polynomial = Polynomial(coefficients)
129
-
130
- # Position on the focal plane:
131
- # - field angle [radians]
132
- # - radial distance from the optical axis [normalised pixels]
133
-
134
- angle = atan2(y_distorted, x_distorted)
135
- distance_distorted = sqrt(pow(x_distorted, 2) + pow(y_distorted, 2)) / focal_length
136
-
137
- # Inverse distortion [mm]
138
- # Source moves towards the optical axis (radially) -> negative!
139
-
140
- inverse_distortion = inverse_distortion_polynomial(distance_distorted) * focal_length
141
-
142
- # The field angle remains the same
143
-
144
- x_undistorted = x_distorted + cos(angle) * inverse_distortion
145
- y_undistorted = y_distorted + sin(angle) * inverse_distortion
146
-
147
- return x_undistorted, y_undistorted
148
-
149
-
150
- def focal_plane_to_ccd_coordinates(x_fp, y_fp, setup: Setup = None):
151
- """
152
- Conversion from focal-plane to pixel coordinates on the appropriate CCD.
153
-
154
- Args:
155
- x_fp: Focal-plane x-coordinate [mm].
156
- y_fp: Focal-plane y-coordinate [mm].
157
- setup: Setup
158
- Returns:
159
- Pixel coordinates (row, column) and the corresponding CCD. If the given
160
- focal-plane coordinates do not fall on any CCD, (None, None, None) is
161
- returned.
162
- """
163
-
164
- if setup is None:
165
- setup = load_setup()
166
-
167
- if setup is not None:
168
- num_rows = setup.camera.ccd.num_rows
169
- num_cols = setup.camera.ccd.num_column
170
- else:
171
- num_rows = CCD_SETTINGS.NUM_ROWS
172
- num_cols = CCD_SETTINGS.NUM_COLUMNS
173
-
174
- for ccd_code in range(1, 5):
175
-
176
- (row, column) = __focal_plane_to_ccd_coordinates__(x_fp, y_fp, ccd_code)
177
-
178
- if (row < 0) or (column < 0):
179
- continue
180
-
181
- if (row >= num_rows) or (column >= num_cols):
182
- continue
183
-
184
- return row, column, ccd_code
185
-
186
- return None, None, None
187
-
188
-
189
- def __focal_plane_to_ccd_coordinates__(x_fp, y_fp, ccd_code):
190
- """
191
- Conversion from focal-plane coordinates to pixel coordinates on the given CCD.
192
-
193
- Args:
194
- x_fp: Focal-plane x-coordinate [mm].
195
- y_fp: Focal-plane y-coordinate [mm].
196
- ccd_code: Code of the CCD for which to calculate the pixel coordinates [1, 2, 3, 4].
197
- Returns:
198
- Pixel coordinates (row, column) on the given CCD.
199
- """
200
-
201
- setup = GlobalState.setup
202
-
203
- if setup is not None:
204
- ccd_orientation = setup.camera.ccd.orientation[int(ccd_code) - 1]
205
- pixel_size = setup.camera.ccd.pixel_size / 1000.0 # [mm]
206
- ccd_origin_x = GlobalState.setup.camera.ccd.origin_offset_x[int(ccd_code) - 1]
207
- ccd_origin_y = GlobalState.setup.camera.ccd.origin_offset_y[int(ccd_code) - 1]
208
- else:
209
- ccd_orientation = CCD_SETTINGS.ORIENTATION[int(ccd_code) - 1]
210
- pixel_size = CCD_SETTINGS.PIXEL_SIZE / 1000 # Pixel size [mm]
211
- ccd_origin_x = CCD_SETTINGS.ZEROPOINT[0]
212
- ccd_origin_y = CCD_SETTINGS.ZEROPOINT[1]
213
-
214
- ccd_angle = radians(ccd_orientation)
215
-
216
- # CCD coordinates [mm]
217
-
218
- row = ccd_origin_y - x_fp * sin(ccd_angle) + y_fp * cos(ccd_angle)
219
- column = ccd_origin_x + x_fp * cos(ccd_angle) + y_fp * sin(ccd_angle)
220
-
221
- row /= pixel_size
222
- column /= pixel_size
223
-
224
- return row, column
225
-
226
-
227
- def focal_plane_coordinates_to_angles(x_fp, y_fp):
228
- """
229
- Conversion from focal-plane coordinates to the gnomonic distance from the optical axis and
230
- the in-field angle.
231
-
232
- Args:
233
- x_fp: Focal-plane x-coordinate [mm].
234
- y_fp: Focal-plane y-coordinate [mm].
235
- Returns:
236
- Gnomonic distance from the optical axis and in-field angle [degrees].
237
- """
238
-
239
- setup = GlobalState.setup
240
-
241
- if setup is not None:
242
- focal_length_mm = GlobalState.setup.camera.fov.focal_length_mm
243
- else:
244
- focal_length_mm = FOV_SETTINGS.FOCAL_LENGTH
245
-
246
- theta = degrees(atan(sqrt(pow(x_fp, 2) + pow(y_fp, 2)) / focal_length_mm))
247
- phi = degrees(atan2(y_fp, x_fp))
248
-
249
- return theta, phi
250
-
251
-
252
- def ccd_to_focal_plane_coordinates(row, column, ccd_code):
253
- """
254
- Conversion from pixel-coordinates on the given CCD to focal-plane coordinates.
255
-
256
- Args:
257
- row: Row coordinate [pixels].
258
- column: Column coordinate [pixels].
259
- ccd_code: Code of the CCD for which the pixel coordinates are given.
260
- Returns:
261
- Focal-plane coordinates (x, y) [mm].
262
- """
263
-
264
- setup = GlobalState.setup
265
-
266
- if setup is not None:
267
- ccd_orientation = setup.camera.ccd.orientation[int(ccd_code) - 1]
268
- pixel_size_mm = setup.camera.ccd.pixel_size / 1000.0 # [mm]
269
- ccd_origin_x = GlobalState.setup.camera.ccd.origin_offset_x[int(ccd_code) - 1]
270
- ccd_origin_y = GlobalState.setup.camera.ccd.origin_offset_y[int(ccd_code) - 1]
271
- else:
272
- ccd_orientation = CCD_SETTINGS.ORIENTATION[int(ccd_code) - 1]
273
- pixel_size_mm = CCD_SETTINGS.PIXEL_SIZE / 1000 # Pixel size [mm]
274
- ccd_origin_x = CCD_SETTINGS.ZEROPOINT[0]
275
- ccd_origin_y = CCD_SETTINGS.ZEROPOINT[1]
276
-
277
- # Convert the pixel coordinates into [mm] coordinates
278
-
279
- row_mm = row * pixel_size_mm
280
- column_mm = column * pixel_size_mm
281
-
282
- # Convert the CCD coordinates into FP coordinates [mm]
283
-
284
- ccd_angle = radians(ccd_orientation)
285
-
286
- x_fp = (column_mm - ccd_origin_x) * cos(ccd_angle) - (row_mm - ccd_origin_y) * sin(ccd_angle)
287
- y_fp = (column_mm - ccd_origin_x) * sin(ccd_angle) + (row_mm - ccd_origin_y) * cos(ccd_angle)
288
-
289
- # That's it
290
-
291
- return x_fp, y_fp
292
-
293
- def angles_to_focal_plane_coordinates(theta, phi):
294
- """
295
- Conversion from the gnomonic distance from the optical axis and
296
- the in-field angle to focal-plane coordinates.
297
-
298
- Args:
299
- theta: Gnomonic distance from the optical axis [degrees].
300
- phi: In-field angle [degrees].
301
- Returns:
302
- Focal-plane coordinates (x, y) [mm].
303
- """
304
-
305
- setup = GlobalState.setup
306
-
307
- if setup is not None:
308
- focal_length_mm = GlobalState.setup.camera.fov.focal_length_mm
309
- else:
310
- focal_length_mm = FOV_SETTINGS.FOCAL_LENGTH
311
-
312
- distance = focal_length_mm * tan(radians(theta)) # [mm]
313
-
314
- phi_radians = radians(phi)
315
-
316
- x_fp = distance * cos(phi_radians)
317
- y_fp = distance * sin(phi_radians)
318
-
319
- return x_fp, y_fp
320
-
321
-
322
- def dict_to_ref_model(model_def: Union[Dict, List]) -> NavigableDict:
323
- """
324
- Creates a reference frames model from a dictionary or list of reference frame definitions.
325
-
326
- When a list is provided, the items in the list must be ReferenceFrames.
327
-
328
- The reference frame definitions are usually read from a YAML file or returned by a Setup,
329
- but can also be just ReferenceFrame objects.
330
-
331
- ReferenceFrame definitions have the following format:
332
-
333
- ```
334
- ReferenceFrame://(<definition>)
335
- ```
336
- where `<definition>` has the following elements, separated by '` | `':
337
- * a translation matrix
338
- * a rotation matrix
339
- * the name of the reference frame
340
- * the name of the reference for this reference frame
341
- * a dictionary of links
342
-
343
- Args:
344
- model_def (dict or list): the definition of the reference model
345
-
346
- Returns:
347
- A dictionary representing the reference frames model.
348
- """
349
-
350
- ref_model = NavigableDict({})
351
- ref_links = {}
352
-
353
- def create_ref_frame(name, data) -> Union[ReferenceFrame, str]:
354
-
355
- # This is a recursive function that creates a reference frame based on the given data.
356
- # * When the data is already a ReferenceFrame, it just returns data
357
- # * When data starts with the special string `ReferenceFrame//`, the data string is parsed
358
- # and a corresponding ReferenceFrame is returned
359
- # * When there is no match, the data is returned unaltered.
360
- #
361
- # SIDE EFFECT:
362
- # * In the process, the outer ref-model and ref_links are updated.
363
-
364
- if isinstance(data, ReferenceFrame):
365
- return data
366
-
367
- match = re.match(r"ReferenceFrame//\((.*)\)$", data)
368
- if not match:
369
- return data
370
-
371
- translation, rotation, name, ref_name, links = match[1].split(" | ")
372
-
373
- # all links are processed later..
374
-
375
- ref_links[name] = ast.literal_eval(links)
376
-
377
- if ref_name == name == "Master":
378
- ref_model.add(ref_name, ReferenceFrame.createMaster())
379
- return ref_model["Master"]
380
-
381
- if ref_name not in ref_model:
382
- ref_model.add(ref_name, create_ref_frame(ref_name, model_def[ref_name]))
383
-
384
- ref_frame = ReferenceFrame.fromTranslationRotation(
385
- deserialize_array(translation),
386
- deserialize_array(rotation),
387
- name=name,
388
- ref=ref_model[ref_name],
389
- )
390
-
391
- return ref_frame
392
-
393
- # if the given model_def is a list, turn it into a dict
394
-
395
- if isinstance(model_def, list):
396
- model_def = {frame.name: frame for frame in model_def}
397
-
398
- for key, value in model_def.items():
399
- if key not in ref_model:
400
- ref_model.add(key, create_ref_frame(key, value))
401
-
402
- # Process all the links
403
-
404
- for ref_name, link_names in ref_links.items():
405
- ref = ref_model[ref_name]
406
- for link_name in link_names:
407
- if link_name not in ref.linkedTo:
408
- ref.addLink(ref_model[link_name])
409
-
410
- return ref_model
411
-
412
-
413
- def ref_model_to_dict(ref_model) -> NavigableDict:
414
- """Creates a dictionary with reference frames definitions that define a reference model.
415
-
416
- Args:
417
- ref_model: A dictionary representing the reference frames model or a list of reference
418
- frames.
419
- Returns:
420
- A dictionary of reference frame definitions.
421
- """
422
-
423
- if isinstance(ref_model, dict):
424
- ref_model = ref_model.values()
425
-
426
- # take each key (which is a reference frame) and serialize it
427
-
428
- model_def = {}
429
-
430
- for ref in ref_model:
431
- translation, rotation = ref.getTranslationRotationVectors()
432
- links = [ref.name for ref in ref.linkedTo]
433
- model_def[ref.name] = (
434
- f"ReferenceFrame//("
435
- f"{serialize_array(translation, precision=6)} | "
436
- f"{serialize_array(rotation, precision=6)} | "
437
- f"{ref.name} | "
438
- f"{ref.ref.name} | "
439
- f"{links})"
440
- )
441
-
442
- return NavigableDict(model_def)
443
-
444
-
445
- def serialize_array(arr: Union[np.ndarray, list], precision: int = 4) -> str:
446
- """Returns a string representation of a numpy array.
447
-
448
- >>> serialize_array([1,2,3])
449
- '[1, 2, 3]'
450
- >>> serialize_array([[1,2,3], [4,5,6]])
451
- '[[1, 2, 3], [4, 5, 6]]'
452
- >>> serialize_array([[1,2.2,3], [4.3,5,6]])
453
- '[[1.0000, 2.2000, 3.0000], [4.3000, 5.0000, 6.0000]]'
454
- >>> serialize_array([[1,2.2,3], [4.3,5,6]], precision=2)
455
- '[[1.00, 2.20, 3.00], [4.30, 5.00, 6.00]]'
456
-
457
- Args:
458
- arr: a one or two dimensional numpy array or list.
459
- precision (int): number of digits of precision
460
- Returns:
461
- A string representing the input array.
462
- """
463
- if isinstance(arr, list):
464
- arr = np.array(arr)
465
- msg = np.array2string(
466
- arr,
467
- separator=", ",
468
- suppress_small=True,
469
- formatter={"float_kind": lambda x: f"{x:.{precision}f}"},
470
- ).replace("\n", "")
471
- return msg
472
-
473
-
474
- def deserialize_array(arr_str: str) -> Optional[np.ndarray]:
475
- """Returns a numpy array from the given string.
476
-
477
- The input string is interpreted as a one or two-dimensional array, with commas or spaces
478
- separating the columns, and semi-colons separating the rows.
479
-
480
- >>> deserialize_array('1,2,3')
481
- array([1, 2, 3])
482
- >>> deserialize_array('1 2 3')
483
- array([1, 2, 3])
484
- >>> deserialize_array('1,2,3;4,5,6')
485
- array([[1, 2, 3],
486
- [4, 5, 6]])
487
- >>> deserialize_array("[[1,2,3], [4,5,6]]")
488
- array([[1, 2, 3],
489
- [4, 5, 6]])
490
-
491
- Args:
492
- arr_str: string representation of a numpy array
493
- Returns:
494
- A one or two-dimensional numpy array or `None` when input string cannot be parsed into a
495
- numpy array.
496
- """
497
-
498
- import re
499
-
500
- arr_str = re.sub(r"\],\s*\[", "];[", arr_str)
501
- try:
502
- arr = np.array(_convert_from_string(arr_str))
503
- return arr if ";" in arr_str else arr.flatten()
504
- except ValueError as exc:
505
- logger.error(f"Input string could not be parsed into a numpy array: {exc}")
506
- return None
507
-
508
-
509
- def _convert_from_string(data):
510
-
511
- # This function was copied from:
512
- # https://github.com/numpy/numpy/blob/v1.19.0/numpy/matrixlib/defmatrix.py#L14
513
- # We include the function here because the np.matrix class is deprecated and will be removed.
514
- # This function is what we actually needed from np.matrix.
515
-
516
- for char in "[]":
517
- data = data.replace(char, "")
518
-
519
- rows = data.split(";")
520
- new_data = []
521
- count = 0
522
- for row in rows:
523
- trow = row.split(",")
524
- new_row = []
525
- for col in trow:
526
- temp = col.split()
527
- new_row.extend(map(ast.literal_eval, temp))
528
- if count == 0:
529
- n_cols = len(new_row)
530
- elif len(new_row) != n_cols:
531
- raise ValueError("Rows not the same size.")
532
- count += 1
533
- new_data.append(new_row)
534
- return new_data
@@ -1,100 +0,0 @@
1
- #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- """
4
- Created on Wed Sep 9 17:19:47 2020
5
-
6
- @author: pierre
7
- """
8
- import numpy as np
9
-
10
- from egse.coordinates.point import Points
11
- from egse.setup import Setup, load_setup
12
-
13
-
14
- def is_avoidance_ok(hexusr, hexobj, setup: Setup = None, verbose=False):
15
- """
16
- is_avoidance_ok(hexusr,hexobj,setup=None)
17
-
18
- INPUT
19
- hexusr : ReferenceFrame
20
- xy plane = maximal height of the FPA_SEN
21
- z axis pointing away from the FPA
22
-
23
- hexobj : ReferenceFrame
24
- xy plane = FPA_SEN
25
- z axis pointing towards L6
26
-
27
- setup : GlobalSetup.setup, optional
28
- if not provided, GlobalState.setup is used
29
-
30
-
31
- OUTPUT : Boolean indicating whether the FPA is outside the avoidance volume around L6
32
- """
33
-
34
- if setup is None:
35
- setup = load_setup()
36
-
37
- """
38
- A. HORIZONTAL AVOIDANCE
39
- Ensure that the center of L6, materialised by HEX_USR (incl. z-direction security wrt TOU_L6)
40
- stays within a given radius of the origin of FPA_SEN
41
- """
42
-
43
- # Clearance = the tolerance in every horizontal direction (3 mm; PLATO-KUL-PL-ICD-0001 v1.2)
44
- clearance_xy = setup.camera.fpa.avoidance.clearance_xy
45
-
46
- # l6xy = the projection of the origin of HEX_USR on the X-Y plane of FPA_SEN
47
- l6xy = hexusr.getOrigin().expressIn(hexobj)[:2]
48
-
49
- # !! This is a verification of the current situation --> need to replace by a simulation of the forthcoming
50
- # movement in the building block
51
- horizontal_check = ((l6xy[0]**2.+l6xy[1]**2.) < clearance_xy*clearance_xy)
52
-
53
- """
54
- B. VERTICAL AVOIDANCE
55
- Ensure that the CCD never hits L6.
56
- The definition of HEX_USR includes a tolerance below L6 (1.65 mm)
57
- We include a tolerance above FPA_SEN here (0.3 mm)
58
- We define a collection of points to act at the vertices of the avoidance volume above the FPA
59
- """
60
-
61
- # Clearance = vertical uncertainty on the CCD location (0.3 mm; PLATO-KUL-PL-ICD-0001 v1.2)
62
- clearance_z = setup.camera.fpa.avoidance.clearance_z
63
-
64
- # Vertices = Points representing the vertices of the avoidance volume above the FPA (60)
65
- vertices_nb = setup.camera.fpa.avoidance.vertices_nb
66
- # All vertices are on a circle of radius 'vertices_radius' (100 mm)
67
- vertices_radius = setup.camera.fpa.avoidance.vertices_radius
68
-
69
- angles = np.linspace(0, np.pi * 2, vertices_nb, endpoint=False)
70
- vertices_x = np.cos(angles) * vertices_radius
71
- vertices_y = np.sin(angles) * vertices_radius
72
- vertices_z = np.ones_like(angles) * clearance_z
73
-
74
- # The collection of Points defining the avoidance volume around FPA_SEN
75
- vert_obj = Points(coordinates=np.array([vertices_x, vertices_y, vertices_z]), ref=hexobj, name="vert_obj")
76
-
77
- # Their coordinates in HEX_USR
78
- # NB: vert_obj is a Points, vert_usr is an array
79
- vert_usr = vert_obj.expressIn(hexusr)
80
-
81
- # !! Same as above : this is verifying the current situation, not the one after a planned movement
82
- # Verify that all vertices ("protecting" FPA_SEN) are below the x-y plane of HEX_USR ("protecting" L6)
83
- vertical_check = (np.all(vert_usr[2, :] < 0.))
84
-
85
- if verbose:
86
- printdict = {True:"OK", False:"NOT OK"}
87
- print(f"HORIZONTAL AVOIDANCE: {printdict[horizontal_check]}")
88
- print(f" VERTICAL AVOIDANCE: {printdict[vertical_check]}")
89
-
90
- if verbose > 1:
91
- print(f"Points Coordinates")
92
- coobj = vert_obj.coordinates
93
- for i in range(vertices_nb):
94
- print(f"{i} OBJ {np.round(coobj[:3,i],6)} --> USR {np.round(vert_usr[:3,i],6)}")
95
- vert_z = vert_usr[2, :]
96
- vert_zi = np.where(vert_z == np.max(vert_z))
97
- print(f"#vertices at max z : {len(vert_zi[0])}")
98
- print(f"First one: vertex {vert_zi[0][0]} : {np.round(vert_usr[:3,vert_zi[0][0]],6)}")
99
-
100
- return horizontal_check and vertical_check