cgse 2024.7.0__py3-none-any.whl → 2025.0.1__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.1.dist-info/METADATA +38 -0
  4. cgse-2025.0.1.dist-info/RECORD +5 -0
  5. {cgse-2024.7.0.dist-info → cgse-2025.0.1.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
egse/coordinates/point.py DELETED
@@ -1,707 +0,0 @@
1
- """
2
- The point module provides two classes, a `Point` class which simply represents a point
3
- in the 3D space, and a `Points` class which is a collection of Point objects.
4
-
5
- A Point is defined with respect to a given reference frame and is given a name.
6
-
7
- Point objects defined in the same reference frame can be combined with the
8
- natural `+`, `-` , `+=` and `-=` operations.
9
-
10
- In order to work with 4x4 transformation matrices, the 3D [x,y,z] coordinates are
11
- automatically converted to a [x,y,z,1] coordinates array attribute.
12
-
13
- @author: Pierre Royer
14
- """
15
- import logging
16
- import random
17
- import string
18
-
19
- import numpy as np
20
-
21
- import egse.coordinates.transform3d_addon as t3add
22
-
23
- LOGGER = logging.getLogger(__name__)
24
-
25
-
26
- class Point:
27
- """
28
- A Point object represents a point in 3D space and is defined with respect to
29
- a given reference frame.
30
-
31
- .. note::
32
- There is no check that the randomly generated name is unique, so two Point
33
- objects can be different but have the same name.
34
-
35
- """
36
- debug = 0
37
-
38
- def __init__(self, coordinates, ref, name=None):
39
- """
40
- This initializes a Point object in a given reference frame.
41
-
42
- Args:
43
- coordinates (numpy.ndarray, list): 1x3 or 1x4 matrix defining this system in "ref" system
44
- (1x3 being x,y,z + an additional 1 for the affine operations)
45
-
46
- ref (ReferenceFrame): the reference system in which this Point object will be defined,
47
- if not given or None the master reference frame will be used
48
-
49
- """
50
-
51
- # Makes sure of format [x,y,z,1] and sets coordinates
52
- self.setCoordinates(coordinates)
53
-
54
- # set the reference frame of reference
55
- if ref is None:
56
- raise ValueError("A Point shall be defined with a reference frame, ref can not be None.")
57
- else:
58
- self.ref = ref
59
-
60
- self.setName(name)
61
-
62
- self.definition = [self.coordinates[:-1], self.ref, self.name]
63
-
64
- def __repr__(self):
65
- return f"{self.coordinates[:-1]} (ref {self.ref.name})"
66
-
67
- def __str__(self):
68
- return f"{self.coordinates[:-1]} (ref {self.ref.name}), name {self.name}"
69
-
70
- def __eq__(self, other):
71
- """
72
- Re-implements the == operator which by default checks if id(self) == id(other).
73
-
74
- Two Point objects are equal when:
75
-
76
- * their coordinates are equal
77
- * the reference system in which they are defined is equal
78
- * the name must not be equal
79
- """
80
- if self is other:
81
- return True
82
-
83
- if isinstance(other, Point):
84
- if not np.array_equal(self.coordinates, other.coordinates):
85
- return False
86
- if self.ref != other.ref:
87
- return False
88
- return True
89
- return NotImplemented
90
-
91
- def __hash__(self):
92
- return id(self.definition) // 16
93
-
94
- def isSame(self, other):
95
- """
96
- This checks if a Point is the same as another Point in a different reference frame.
97
-
98
- Two Point objects are the same when their position, i.e. coordinates, are equal
99
- after they have been expressed in the same reference frame.
100
-
101
- :param other: a Point object that you want to check
102
- :type other: Point
103
-
104
- :returns: True when the two Point objects are the same, False otherwise
105
-
106
- :raises TypeError: when other is not a compatible type, NotImplemented will returned
107
- which will result in a ```TypeError: unsupported operand type(s) for +:```.
108
- """
109
-
110
- if isinstance(other, Point):
111
- if self == other:
112
- return True
113
- else:
114
- if np.array_equal(self.coordinates, other.expressIn(self.ref)):
115
- return True
116
- return False
117
- return NotImplemented
118
-
119
- @staticmethod
120
- def __coords__(coordinates):
121
- """
122
- Formats 1x3 or 1x4 input lists or np.arrays into 1x4 np.array coordinates
123
- Static --> can be called 'from outside', without passing a Point object
124
- """
125
- if isinstance(coordinates, Point):
126
- return coordinates.coordinates
127
- elif isinstance(coordinates, (np.ndarray, list)):
128
- coordinates = list(coordinates)
129
- if len(coordinates) == 3:
130
- coordinates.append(1)
131
- return coordinates
132
- else:
133
- raise ValueError("input must be a list, numpy.ndarray or Point")
134
-
135
- def setName(self, name=None):
136
- """
137
- Set or change the name of a Point object.
138
-
139
- :param str name: the new name for the Point, if None, a random name will be generated.
140
-
141
- .. todo:: Should we care about the possibility the the generation of random names does not
142
- necessarily create a unique name for the Point?
143
- """
144
- if name is None:
145
- self.name = 'p'+''.join(random.choices(string.ascii_lowercase, k=3))
146
- else:
147
- self.name = name
148
-
149
- def setCoordinates(self, coordinates):
150
- """
151
- Set the coordinates of this Point object.
152
- """
153
- coordinates = Point.__coords__(coordinates)
154
- self.coordinates = np.array(coordinates)
155
-
156
- self.x = self.coordinates[0]
157
- self.y = self.coordinates[1]
158
- self.z = self.coordinates[2]
159
-
160
- def getCoordinates(self, ref=None):
161
- """
162
- Returns the coordinates of this Points object.
163
-
164
- If no reference frame is given, the coordinates of the Point will just be returned,
165
- other wise this method behaves the same as the ``expressIn(ref)`` method.
166
-
167
- :param ref: the Reference Frame in which the Point shall be defined
168
- :type ref: ReferenceFrame
169
- """
170
- if ref is None:
171
- return self.coordinates
172
- else:
173
- return self.expressIn(ref)
174
-
175
- def distanceTo(self, target):
176
- """
177
- Returns the distance of this Point object to the target. Target can be another Point,
178
- a ReferenceFrame object or a Numpy dnarray or list with coordinates.
179
- """
180
- from egse.coordinates.referenceFrame import ReferenceFrame
181
-
182
- if isinstance(target, Point):
183
- targetCoords = target.expressIn(self.ref)[:3]
184
- elif isinstance(target, ReferenceFrame):
185
- return np.linalg.norm(self.expressIn(target)[:3])
186
- elif isinstance(target, (np.ndarray, list)):
187
- if len(target) > 3:
188
- target = target[:3]
189
- targetCoords = target
190
- else:
191
- raise ValueError("input must be a list, numpy.ndarray, Point or ReferenceFrame")
192
-
193
- LOGGER.info(f"self={self.coordinates[:-1]}, target={targetCoords}")
194
-
195
- return np.linalg.norm(self.coordinates[:3]-targetCoords)
196
-
197
- def inPlaneDistanceTo(self,target,plane='xy'):
198
- """
199
- Returns the distance of this Point object to the target, considering 2 coordinates only!
200
-
201
- target: can be another Point, a ReferenceFrame object or a Numpy dnarray or list with coordinates.
202
-
203
- plane : must be in ['xy', 'xz', 'yz']
204
-
205
- NB: The xy, yz or xz plane used to project the points coordinates before
206
- computing the distances is taken from the coordinate system of "self"
207
- ==> pointA.inPlaneDistanceTo(pointB) != pointB.inPlaneDistanceTo(pointA)
208
- The first projects on the xy plane of pointA.ref, the second on the xy plane of pointB.ref
209
- """
210
- from egse.coordinates.referenceFrame import ReferenceFrame
211
-
212
- if isinstance(target, Point):
213
- targetCoords = target.expressIn(self.ref)
214
- elif isinstance(target, ReferenceFrame):
215
- targetCoords = target.getOrigin().expressIn(self)
216
- elif isinstance(target, (np.ndarray, list)):
217
- targetCoords = target
218
- else:
219
- raise ValueError("input must be a list, numpy.ndarray, Point or ReferenceFrame")
220
-
221
- LOGGER.info(f"self={self.coordinates[:-1]}, target={targetCoords}")
222
-
223
- planeSelect = {'xy':[0,1], 'xz':[0,2], 'yz':[1,2]}
224
-
225
- LOGGER.info(f"self.coordinates[planeSelect[plane]] {self.coordinates[planeSelect[plane]]}")
226
- LOGGER.info(f"targetCoords[planeSelect[plane]] {targetCoords[planeSelect[plane]]}")
227
- LOGGER.info(f"Difference {self.coordinates[planeSelect[plane]]-targetCoords[planeSelect[plane]]}")
228
-
229
- return np.linalg.norm(self.coordinates[planeSelect[plane]]-targetCoords[planeSelect[plane]])
230
-
231
- def distanceToPlane(self,plane="xy",ref=None):
232
- """
233
- distanceToPlane(self,plane="xy",ref=None)
234
-
235
- The target plane is defined by one of it coordinate planes: ["xy", "yz", "xz"]
236
-
237
- :param ref: reference frame
238
- :type ref: ReferenceFrame
239
-
240
- :param plane: in ["xy", "xz", "yz"]
241
- :type plane: str
242
-
243
- :returns: the distance from self to plane
244
- """
245
- if (ref is None) or (self.ref == ref):
246
- coordinates = self.coordinates[:-1]
247
- elif self.ref != ref:
248
- coordinates = self.expressIn(ref)
249
-
250
- outOfPlaneIndex = {'xy':2,'xz':1,'yz':0}
251
-
252
- return coordinates[outOfPlaneIndex[plane]]
253
-
254
- def __sub__(self,apoint):
255
- """
256
- Takes care for
257
- newPoint = self + point
258
- """
259
- if isinstance(apoint, Point):
260
-
261
- try:
262
- if apoint.ref != self.ref:
263
- raise ValueError
264
- except ValueError:
265
- print("WARNING: The points have different reference frames, returning NotImplemented")
266
- return NotImplemented
267
- newCoordinates = self.coordinates - apoint.coordinates
268
-
269
- elif isinstance(apoint, (np.ndarray, list)):
270
-
271
- newCoordinates = self.coordinates - Point.__coords__(apoint)
272
-
273
- # For the affine transforms, the 4th digit must be set to 1 (it has been modified above)
274
- newCoordinates[-1] = 1
275
-
276
- return Point(coordinates=newCoordinates,ref=self.ref)
277
-
278
- def __isub__(self,apoint):
279
- """
280
- Takes care for
281
- self += coordinates (modifies self in place)
282
- """
283
- if isinstance(apoint, Point):
284
-
285
- try:
286
- if apoint.ref != self.ref:
287
- raise ValueError
288
- except ValueError:
289
- print("WARNING: The points have different reference frames, returning NotImplemented")
290
- return NotImplemented
291
- newCoordinates = self.coordinates - apoint.coordinates
292
-
293
- elif isinstance(apoint, (np.ndarray, list)):
294
-
295
- newCoordinates = self.coordinates - Point.__coords__(apoint)
296
-
297
- # For the affine transforms, the 4th digit must be set to 1 (it has been modified above)
298
- newCoordinates[-1] = 1
299
-
300
- self.coordinates = newCoordinates
301
-
302
- return self
303
-
304
- def __add__(self,apoint):
305
- """
306
- Takes care for
307
- newPoint = self + point
308
- """
309
- if isinstance(apoint, Point):
310
-
311
- try:
312
- if apoint.ref != self.ref:
313
- print(f"DEBUG: {apoint} = {apoint.expressIn(self.ref)}")
314
- raise ValueError
315
- except ValueError:
316
- print("WARNING: The points have different reference frames, returning NotImplemented")
317
- return NotImplemented
318
- newCoordinates = self.coordinates + apoint.coordinates
319
-
320
- elif isinstance(apoint, (np.ndarray, list)):
321
-
322
- newCoordinates = self.coordinates + Point.__coords__(apoint)
323
-
324
- else:
325
- return NotImplemented
326
-
327
- # For the affine transforms, the 4th digit must be set to 1 (it has been modified above)
328
- newCoordinates[-1] = 1
329
-
330
- return Point(coordinates=newCoordinates,ref=self.ref)
331
-
332
- def __iadd__(self,apoint):
333
- """
334
- Takes care for
335
- self += coordinates (modifies self in place)
336
- """
337
- if isinstance(apoint, Point):
338
-
339
- try:
340
- if apoint.ref != self.ref:
341
- raise ValueError
342
- except ValueError:
343
- print("WARNING: The points have different reference frames, returning NotImplemented")
344
- return NotImplemented
345
- newCoordinates = self.coordinates + apoint.coordinates
346
-
347
- elif isinstance(apoint, (np.ndarray, list)):
348
-
349
- newCoordinates = self.coordinates + Point.__coords__(apoint)
350
-
351
- # For the affine transforms, the 4th digit must be set to 1 (it has been modified above)
352
- newCoordinates[-1] = 1
353
-
354
- self.coordinates = newCoordinates
355
-
356
- return self
357
-
358
- def expressIn(self,targetFrame):
359
- """
360
- expressIn(self,targetFrame)
361
- """
362
- if targetFrame == self.ref:
363
- """
364
- targetFrame == self.ref
365
- We're after the definition of self
366
- """
367
- result = self.coordinates
368
- else:
369
- """
370
- We're after the coordinates of self, i.e. the definition of self in targetFrame
371
-
372
- We know the coordinates in self.ref
373
- #We need to apply the transformation from targetFrame to self.ref
374
- self.ref --> self (self.transformation)
375
- """
376
- #transform = targetFrame.getTransformationFrom(self.ref)
377
- transform = self.ref.getPassiveTransformationTo(targetFrame)
378
- if self.debug: print("transform \n{0}".format(transform))
379
- result = np.dot(transform,self.coordinates)
380
- return result
381
-
382
- def changeRef(self,targetFrame):
383
- """
384
- We redefine self as attached to another reference frame
385
- . calculate self's coordinates in the new reference frame
386
- . update the definition
387
- """
388
- newCoordinates = self.expressIn(targetFrame)
389
- self.setCoordinates(newCoordinates)
390
- self.ref = targetFrame
391
- return
392
-
393
-
394
-
395
-
396
- class Points():
397
- """
398
- A Points object is a collection of Point objects.
399
-
400
- Points can be constructed from either a numpy.ndarray of shape 3 x n or 4 x n, or
401
- a list of Point objects. The coordinates of the Point objects are transferred to
402
- the desired ReferenceFrame and concatenated in the list order.
403
-
404
- When automatically generated a Points object name consists in a capital 'P' followed by
405
- three lower case letters. A Point can be extracted from a Points object by its
406
- position in the coordinates array (see below).
407
-
408
- """
409
- debug=0
410
- def __init__(self, coordinates, ref,name=None):
411
- """
412
- Points.__init__(self, coordinates, ref, name=None)
413
-
414
- Constructor
415
-
416
- coordinates : must be of one of the following type:
417
- * numpy.ndarray:
418
- 4xn matrix defining this system in "ref" system
419
- (3 being x,y,z + an additional 1 for the affine operations)
420
- * list of Point objects:
421
- the coordinates of the Point objects are extracted in the order of the list
422
- and concatenated in a numpy.ndarray
423
-
424
- ref : reference system in which self is defined
425
-
426
- Both parameters are mandatory.
427
- """
428
-
429
- # TODO: accept a list made of Point and Points rather than strictly Point
430
-
431
- if isinstance(coordinates, list):
432
- coordinateList = []
433
- for apoint in coordinates:
434
- if not isinstance(apoint, Point):
435
- raise ValueError("If the input is a list, all items in it must be Point(s) objects")
436
- coordinateList.append(apoint.expressIn(ref))
437
- self.setCoordinates(np.array(coordinateList).T)
438
- elif isinstance(coordinates, np.ndarray):
439
- self.setCoordinates(coordinates)
440
- else:
441
- raise ValueError("The input must be either a numpy.ndarray or a list of Point objects")
442
-
443
- self.ref = ref
444
-
445
- self.setName(name)
446
-
447
- return
448
-
449
- def __repr__(self):
450
- return "{0} (ref {1})".format(self.coordinates[:-1], self.ref.name)
451
-
452
- def __str__(self):
453
- return "{1} (ref {2}), name {0}".format(self.name, self.coordinates[:-1], self.ref.name)
454
-
455
- @staticmethod
456
- def __coords__(coordinates):
457
- """
458
- Formats 3xn or 4xn input lists or np.arrays into 4xn np.array coordinates
459
- Static --> can be called 'from outside', without passing a Points object
460
- """
461
- if isinstance(coordinates, Point):
462
- return coordinates.coordinates
463
- elif isinstance(coordinates, np.ndarray):
464
-
465
- if coordinates.shape[0] not in [3,4]:
466
- raise ValueError("Input coordinates array must be 3 x n or 4 x n")
467
-
468
- if coordinates.shape[0]==3:
469
- newCoords = np.ones([4,coordinates.shape[1]])
470
- newCoords[:3,:] = coordinates
471
- coordinates = newCoords
472
- return coordinates
473
- else:
474
- raise ValueError("input must be a list, numpy.ndarray or Point")
475
-
476
- def setName(self,name=None):
477
- if name is None:
478
- self.name = 'P'+ ''.join(random.choices(string.ascii_lowercase, k=2))+\
479
- ''.join(random.choices(string.ascii_uppercase, k=1))
480
- else:
481
- self.name = name
482
-
483
- def setCoordinates(self,coordinates):
484
- #coordinates = list(coordinates)
485
- #if len(coordinates)==3: coordinates.append(1)
486
- coordinates = Points.__coords__(coordinates)
487
- self.coordinates = coordinates
488
-
489
- self.x = self.coordinates[0,:]
490
- self.y = self.coordinates[1,:]
491
- self.z = self.coordinates[2,:]
492
-
493
- return
494
-
495
- def getCoordinates(self,ref=None):
496
- if ref is None:
497
- return self.coordinates
498
- else:
499
- return self.expressIn(ref)
500
-
501
- def expressIn(self,targetFrame):
502
- """
503
- expressIn(self,targetFrame)
504
- """
505
- if targetFrame == self.ref:
506
- """
507
- targetFrame == self.ref
508
- We're after the definition of self
509
- """
510
- result = self.coordinates
511
- else:
512
- """
513
- We're after the coordinates of self, i.e. the definition of self in targetFrame
514
-
515
- We know the coordinates in self.ref
516
- #We need to apply the transformation from targetFrame to self.ref
517
- self.ref --> self (self.transformation)
518
- """
519
- #transform = targetFrame.getTransformationFrom(self.ref)
520
- transform = self.ref.getPassiveTransformationTo(targetFrame)
521
- if self.debug: print("transform \n{0}".format(transform))
522
- result = np.dot(transform,self.coordinates)
523
- return result
524
-
525
- def changeRef(self,targetFrame):
526
- """
527
- We redefine self as attached to another reference frame
528
- . calculate self's coordinates in the new reference frame
529
- . update the definition
530
- """
531
- newCoordinates = self.expressIn(targetFrame)
532
- self.setCoordinates(newCoordinates)
533
- self.ref = targetFrame
534
- return
535
-
536
- def getPoint(self,index,name=None):
537
- """
538
- Returns the point with coordinates self.coordinates[:,index], in reference frame pts.ref
539
- """
540
- return Point(self.coordinates[:,index],ref=self.ref,name=name)
541
-
542
- get = getPoint
543
-
544
- def bestFittingPlane(self,fitPlane="xy", usesvd=False,verbose=True):
545
- """
546
- bestFittingPlane(self,fitPlane="xy", usesvd=False,verbose=True)
547
-
548
- fitPlane in ['xy,'yz','zx']
549
- usesvd see transform3d_addon.affine_matrix_from_points.__doc__
550
-
551
- OUTPUT
552
- returns the reference Frame having as X-Y plane the plane best fitting all points in self
553
- """
554
- # Import necessary due to a circular dependency between Point and ReferenceFrame
555
- from egse.coordinates.referenceFrame import ReferenceFrame
556
-
557
- debug=True
558
-
559
- a,b,c = self.fitPlane(fitPlane=fitPlane,verbose=verbose)
560
- #print (f"a {a}, b {b}, c {c}")
561
- #print()
562
-
563
- unitaxes = Points.fromPlaneParameters(a,b,c,ref=self.ref,plane=fitPlane)
564
- #print(f"Unitaxes coordinates \n{np.round(unitaxes.coordinates,3)}")
565
- #print()
566
-
567
-
568
- # unitaxes contain 3 unit axes and an origin
569
- # => the unit vectors do NOT belong to the target plane
570
- # => they must be translated before
571
- unitcoords = unitaxes.coordinates
572
- for ax in range(3):
573
- unitcoords[:3,ax] += unitcoords[:3,3]
574
-
575
- newaxes = Points(unitcoords, ref=self.ref)
576
-
577
- #print(f"newaxes {np.round(newaxes.coordinates,3)}")
578
-
579
- selfaxes = Points(np.identity(4),ref=self.ref)
580
-
581
- transform = t3add.affine_matrix_from_points(selfaxes.coordinates[:3,:], newaxes.coordinates[:3,:], shear=False, scale=False, usesvd=usesvd)
582
-
583
-
584
- if debug:
585
- transform2 = t3add.rigid_transform_3D(selfaxes.coordinates[:3,:], newaxes.coordinates[:3,:], verbose=verbose)
586
-
587
- if verbose:
588
- print()
589
- print(f"Transform \n{np.round(transform,3)}")
590
- if debug:
591
- print()
592
- print(f"Transform2 \n{np.round(transform2,3)}")
593
- print()
594
- print(f"Both methods consistent ? {np.allclose(transform, transform2)}")
595
-
596
- return ReferenceFrame(transformation=transform, ref=self.ref)
597
-
598
-
599
-
600
- def fitPlane(self,fitPlane="xy",verbose=True):
601
- """
602
- fitPlane(self,fitPlane="xy",verbose=True)
603
-
604
- :returns: the best fitting parameters a, b, c corresponding to the fitted plane
605
-
606
- :param fitPlane: defines the expression of the fitted plane in ['xy','yz','zx']:
607
- 'xy' : z = ax + by + c
608
- 'yz' : x = ay + bz + c
609
- 'zx' : y = az + bx + c
610
-
611
- :param verbose: default = True
612
- """
613
- xyz = [self.x,self.y,self.z]
614
-
615
- ndata = len(xyz[0])
616
-
617
- # Account for cases
618
- startingIndex={'xy':0,'yz':1,'zx':2}[fitPlane]
619
-
620
- # System matrix
621
- A = np.vstack([xyz[startingIndex],xyz[(startingIndex+1)%3], np.ones(ndata)]).T
622
-
623
- # Solve linear equations
624
- a, b, c = np.linalg.lstsq(A, xyz[(startingIndex+2)%3],rcond=None)[0]
625
-
626
- # Print results on screen
627
- if verbose:
628
- hprint = {'xy':'z = ax + by + c','yz':'x = ay + bz + c','zx':'y = az + bx + c'}
629
- print(f'{hprint[fitPlane]} : \n a = {a:7.3e} \n b = {b:7.3e} \n c = {c:7.3e}')
630
-
631
- return a,b,c
632
-
633
- @classmethod
634
- def fromPlaneParameters(cls,a,b,c,ref,plane='xy',verbose=False):
635
- """fromPlaneParameters(cls,a,b,c,ref,plane='xy',verbose=False)
636
-
637
- Returns a Points object describing the unit axes and the origin of the reference frame defined by
638
- the input parameters.
639
-
640
- :param plane: The plane definition depends on the "plane" parameter plane must be in ["xy","yz","zx"]
641
- 'xy' : z = ax + by + c (origin defined at x = y = 0)
642
- 'yz' : x = ay + bz + c --> NOT IMPLEMENTED
643
- 'zx' : y = az + bx + c --> NOT IMPLEMENTED
644
-
645
- :returns: A Points with 4 Point objects corresponding to
646
- - the 3 unit axes defining a coordinate system with this plane as "plane" plane
647
- - the origin
648
- in this order (origin last)
649
- """
650
- if plane != 'xy':
651
- print(f"WARNING: plane = {plane} NOT IMPLEMENTED")
652
- # p0 : on the Z-axis
653
- # x = y = 0
654
- p0 = np.array([0,0,c])
655
-
656
- # pxy : on the intersection between target plane and plane // to xy passing through z=c
657
- if np.abs(b)>1.e-5:
658
- # z = c, x = 1
659
- pxy = np.array([1,-a/float(b),c])
660
- else:
661
- # z = c, y = 1
662
- pxy = np.array([-b/float(a),1,c])
663
-
664
- # pyz : intersection of target plane and Y-Z plane
665
- # x = 0, y = 1
666
- pyz = np.array([0,1,b+c])
667
-
668
- """
669
- # pzx : intersection of target plane and Z-X plane
670
- if np.abs(a)>1.e-3:
671
- # y = 0, z = 1
672
- pzx = np.array([(1-c)/float(a),0,1])
673
- else:
674
- # y = 0, x = 1
675
- pzx = np.array([1,0,a+c])
676
- """
677
- #
678
- # xunit = unit vector from [0,0,0] along the intersection between target plane and plane // to xy passing through z=c
679
- xunit = (pxy - p0)/np.linalg.norm(pxy-p0)
680
- # ytemp = unit vector from [0,0,0] along the intersection between target plane and Y-Z plane
681
- # ytemp is in the target plane, but not perpendicular to xunit
682
- # its norm doesn't matter
683
- ytemp = (pyz - p0)#/np.linalg.norm(pyz-p0)
684
-
685
- # xunit and ytemp are both in the plane
686
- # => zunit is perpendicular to both
687
- zunit = np.cross(xunit,ytemp)
688
- zunit /= np.linalg.norm(zunit)
689
-
690
- # yunit completes the right handed reference frame
691
- # The renormalisation shouldn't be necessary...
692
- yunit = np.cross(zunit,xunit)
693
- yunit /= np.linalg.norm(yunit)
694
-
695
- xu = Point(xunit,ref=ref)
696
- yu = Point(yunit,ref=ref)
697
- zu = Point(zunit,ref=ref)
698
- origin = Point(p0,ref=ref)
699
-
700
- if verbose:
701
- print(f'xunit {xunit}')
702
- print(f'yunit {yunit}')
703
- print(f'zunit {zunit}')
704
- print(f'origin {p0}')
705
- print()
706
-
707
- return cls([xu,yu,zu,origin],ref=ref)