cgse 2023.38.0__py3-none-any.whl → 2024.1.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (653) hide show
  1. README.md +27 -0
  2. bump.py +77 -0
  3. cgse-2024.1.3.dist-info/METADATA +41 -0
  4. cgse-2024.1.3.dist-info/RECORD +5 -0
  5. {cgse-2023.38.0.dist-info → cgse-2024.1.3.dist-info}/WHEEL +1 -2
  6. cgse-2023.38.0.dist-info/COPYING +0 -674
  7. cgse-2023.38.0.dist-info/COPYING.LESSER +0 -165
  8. cgse-2023.38.0.dist-info/METADATA +0 -144
  9. cgse-2023.38.0.dist-info/RECORD +0 -649
  10. cgse-2023.38.0.dist-info/entry_points.txt +0 -75
  11. cgse-2023.38.0.dist-info/top_level.txt +0 -2
  12. egse/__init__.py +0 -12
  13. egse/__main__.py +0 -32
  14. egse/aeu/aeu.py +0 -5235
  15. egse/aeu/aeu_awg.yaml +0 -265
  16. egse/aeu/aeu_crio.yaml +0 -273
  17. egse/aeu/aeu_cs.py +0 -626
  18. egse/aeu/aeu_devif.py +0 -321
  19. egse/aeu/aeu_main_ui.py +0 -912
  20. egse/aeu/aeu_metrics.py +0 -131
  21. egse/aeu/aeu_protocol.py +0 -463
  22. egse/aeu/aeu_psu.yaml +0 -204
  23. egse/aeu/aeu_ui.py +0 -873
  24. egse/aeu/arbdata/FccdRead.arb +0 -2
  25. egse/aeu/arbdata/FccdRead_min_points.arb +0 -2
  26. egse/aeu/arbdata/HeaterSync_FccdRead.arb +0 -2
  27. egse/aeu/arbdata/HeaterSync_ccdRead25.arb +0 -2
  28. egse/aeu/arbdata/HeaterSync_ccdRead31_25.arb +0 -2
  29. egse/aeu/arbdata/HeaterSync_ccdRead37_50.arb +0 -2
  30. egse/aeu/arbdata/HeaterSync_ccdRead43_75.arb +0 -2
  31. egse/aeu/arbdata/HeaterSync_ccdRead50.arb +0 -2
  32. egse/aeu/arbdata/Heater_FccdRead_min_points.arb +0 -2
  33. egse/aeu/arbdata/ccdRead25.arb +0 -2
  34. egse/aeu/arbdata/ccdRead25_150ms.arb +0 -2
  35. egse/aeu/arbdata/ccdRead31_25.arb +0 -2
  36. egse/aeu/arbdata/ccdRead31_25_150ms.arb +0 -2
  37. egse/aeu/arbdata/ccdRead37_50.arb +0 -2
  38. egse/aeu/arbdata/ccdRead37_50_150ms.arb +0 -2
  39. egse/aeu/arbdata/ccdRead43_75.arb +0 -2
  40. egse/aeu/arbdata/ccdRead43_75_150ms.arb +0 -2
  41. egse/aeu/arbdata/ccdRead50.arb +0 -2
  42. egse/aeu/arbdata/ccdRead50_150ms.arb +0 -2
  43. egse/alert/__init__.py +0 -1049
  44. egse/alert/alertman.yaml +0 -37
  45. egse/alert/alertman_cs.py +0 -234
  46. egse/alert/alertman_ui.py +0 -603
  47. egse/alert/gsm/beaglebone.py +0 -138
  48. egse/alert/gsm/beaglebone.yaml +0 -51
  49. egse/alert/gsm/beaglebone_cs.py +0 -108
  50. egse/alert/gsm/beaglebone_devif.py +0 -130
  51. egse/alert/gsm/beaglebone_protocol.py +0 -48
  52. egse/bits.py +0 -318
  53. egse/camera.py +0 -44
  54. egse/collimator/__init__.py +0 -0
  55. egse/collimator/fcul/__init__.py +0 -0
  56. egse/collimator/fcul/ogse.py +0 -1077
  57. egse/collimator/fcul/ogse.yaml +0 -14
  58. egse/collimator/fcul/ogse_cs.py +0 -154
  59. egse/collimator/fcul/ogse_devif.py +0 -358
  60. egse/collimator/fcul/ogse_protocol.py +0 -129
  61. egse/collimator/fcul/ogse_sim.py +0 -431
  62. egse/collimator/fcul/ogse_ui.py +0 -1108
  63. egse/command.py +0 -699
  64. egse/config.py +0 -410
  65. egse/confman/__init__.py +0 -1015
  66. egse/confman/confman.yaml +0 -67
  67. egse/confman/confman_cs.py +0 -239
  68. egse/confman/confman_ui.py +0 -381
  69. egse/confman/setup_ui.py +0 -565
  70. egse/control.py +0 -442
  71. egse/coordinates/__init__.py +0 -531
  72. egse/coordinates/avoidance.py +0 -103
  73. egse/coordinates/cslmodel.py +0 -127
  74. egse/coordinates/laser_tracker_to_dict.py +0 -120
  75. egse/coordinates/point.py +0 -707
  76. egse/coordinates/pyplot.py +0 -195
  77. egse/coordinates/referenceFrame.py +0 -1279
  78. egse/coordinates/refmodel.py +0 -737
  79. egse/coordinates/rotationMatrix.py +0 -85
  80. egse/coordinates/transform3d_addon.py +0 -419
  81. egse/csl/__init__.py +0 -50
  82. egse/csl/commanding.py +0 -78
  83. egse/csl/icons/hexapod-connected-selected.svg +0 -30
  84. egse/csl/icons/hexapod-connected.svg +0 -30
  85. egse/csl/icons/hexapod-homing-selected.svg +0 -68
  86. egse/csl/icons/hexapod-homing.svg +0 -68
  87. egse/csl/icons/hexapod-retract-selected.svg +0 -56
  88. egse/csl/icons/hexapod-retract.svg +0 -51
  89. egse/csl/icons/hexapod-zero-selected.svg +0 -56
  90. egse/csl/icons/hexapod-zero.svg +0 -56
  91. egse/csl/icons/logo-puna.svg +0 -92
  92. egse/csl/icons/stop.svg +0 -1
  93. egse/csl/initialisation.py +0 -102
  94. egse/csl/mech_pos_settings.yaml +0 -18
  95. egse/das.py +0 -1247
  96. egse/das.yaml +0 -7
  97. egse/data/conf/SETUP_CSL_00000_170620_150000.yaml +0 -5
  98. egse/data/conf/SETUP_CSL_00001_170620_151010.yaml +0 -69
  99. egse/data/conf/SETUP_CSL_00002_170620_151020.yaml +0 -69
  100. egse/data/conf/SETUP_CSL_00003_170620_151030.yaml +0 -69
  101. egse/data/conf/SETUP_CSL_00004_170620_151040.yaml +0 -69
  102. egse/data/conf/SETUP_CSL_00005_170620_151050.yaml +0 -69
  103. egse/data/conf/SETUP_CSL_00006_170620_151060.yaml +0 -69
  104. egse/data/conf/SETUP_CSL_00007_170620_151070.yaml +0 -69
  105. egse/data/conf/SETUP_CSL_00008_170620_151080.yaml +0 -75
  106. egse/data/conf/SETUP_CSL_00010_210308_083016.yaml +0 -138
  107. egse/data/conf/SETUP_INTA_00000_170620_150000.yaml +0 -4
  108. egse/data/conf/SETUP_SRON_00000_170620_150000.yaml +0 -4
  109. egse/decorators.py +0 -415
  110. egse/device.py +0 -269
  111. egse/dpu/__init__.py +0 -2681
  112. egse/dpu/ccd_ui.py +0 -508
  113. egse/dpu/dpu.py +0 -786
  114. egse/dpu/dpu.yaml +0 -153
  115. egse/dpu/dpu_cs.py +0 -272
  116. egse/dpu/dpu_ui.py +0 -668
  117. egse/dpu/fitsgen.py +0 -2077
  118. egse/dpu/fitsgen_test.py +0 -752
  119. egse/dpu/fitsgen_ui.py +0 -399
  120. egse/dpu/hdf5_model.py +0 -332
  121. egse/dpu/hdf5_ui.py +0 -277
  122. egse/dpu/hdf5_viewer.py +0 -506
  123. egse/dpu/hk_ui.py +0 -468
  124. egse/dpu_commands.py +0 -81
  125. egse/dsi/constants.py +0 -220
  126. egse/dsi/esl.py +0 -870
  127. egse/dsi/rmap.py +0 -1042
  128. egse/dsi/rmapci.py +0 -37
  129. egse/dsi/spw.py +0 -154
  130. egse/dsi/spw_state.py +0 -29
  131. egse/dummy.py +0 -258
  132. egse/dyndummy.py +0 -179
  133. egse/env.py +0 -278
  134. egse/exceptions.py +0 -88
  135. egse/fdir/__init__.py +0 -28
  136. egse/fdir/fdir_manager.py +0 -85
  137. egse/fdir/fdir_manager.yaml +0 -51
  138. egse/fdir/fdir_manager_controller.py +0 -228
  139. egse/fdir/fdir_manager_cs.py +0 -164
  140. egse/fdir/fdir_manager_interface.py +0 -25
  141. egse/fdir/fdir_remote.py +0 -73
  142. egse/fdir/fdir_remote.yaml +0 -37
  143. egse/fdir/fdir_remote_controller.py +0 -50
  144. egse/fdir/fdir_remote_cs.py +0 -97
  145. egse/fdir/fdir_remote_interface.py +0 -14
  146. egse/fdir/fdir_remote_popup.py +0 -31
  147. egse/fee/__init__.py +0 -114
  148. egse/fee/f_fee_register.yaml +0 -43
  149. egse/fee/fee.py +0 -631
  150. egse/fee/feesim.py +0 -750
  151. egse/fee/n_fee_hk.py +0 -761
  152. egse/fee/nfee.py +0 -187
  153. egse/filterwheel/__init__.py +0 -4
  154. egse/filterwheel/eksma/__init__.py +0 -24
  155. egse/filterwheel/eksma/fw8smc4.py +0 -661
  156. egse/filterwheel/eksma/fw8smc4.yaml +0 -121
  157. egse/filterwheel/eksma/fw8smc4_cs.py +0 -144
  158. egse/filterwheel/eksma/fw8smc4_devif.py +0 -473
  159. egse/filterwheel/eksma/fw8smc4_protocol.py +0 -81
  160. egse/filterwheel/eksma/fw8smc4_ui.py +0 -940
  161. egse/filterwheel/eksma/fw8smc5.py +0 -111
  162. egse/filterwheel/eksma/fw8smc5.yaml +0 -105
  163. egse/filterwheel/eksma/fw8smc5_controller.py +0 -307
  164. egse/filterwheel/eksma/fw8smc5_cs.py +0 -141
  165. egse/filterwheel/eksma/fw8smc5_interface.py +0 -65
  166. egse/filterwheel/eksma/fw8smc5_simulator.py +0 -29
  167. egse/filterwheel/eksma/fw8smc5_ui.py +0 -1068
  168. egse/filterwheel/eksma/testpythonfw.py +0 -215
  169. egse/fov/__init__.py +0 -65
  170. egse/fov/fov_hk.py +0 -712
  171. egse/fov/fov_ui.py +0 -861
  172. egse/fov/fov_ui_controller.py +0 -140
  173. egse/fov/fov_ui_model.py +0 -200
  174. egse/fov/fov_ui_view.py +0 -345
  175. egse/gimbal/__init__.py +0 -32
  176. egse/gimbal/symetrie/__init__.py +0 -26
  177. egse/gimbal/symetrie/alpha.py +0 -586
  178. egse/gimbal/symetrie/generic_gimbal_ui.py +0 -1521
  179. egse/gimbal/symetrie/gimbal.py +0 -877
  180. egse/gimbal/symetrie/gimbal.yaml +0 -168
  181. egse/gimbal/symetrie/gimbal_cs.py +0 -183
  182. egse/gimbal/symetrie/gimbal_protocol.py +0 -135
  183. egse/gimbal/symetrie/gimbal_ui.py +0 -361
  184. egse/gimbal/symetrie/pmac.py +0 -1006
  185. egse/gimbal/symetrie/pmac_regex.py +0 -83
  186. egse/graph.py +0 -132
  187. egse/gui/__init__.py +0 -47
  188. egse/gui/buttons.py +0 -378
  189. egse/gui/focalplane.py +0 -1281
  190. egse/gui/formatter.py +0 -10
  191. egse/gui/led.py +0 -162
  192. egse/gui/limitswitch.py +0 -143
  193. egse/gui/mechanisms.py +0 -588
  194. egse/gui/states.py +0 -148
  195. egse/gui/stripchart.py +0 -729
  196. egse/gui/switch.py +0 -112
  197. egse/h5.py +0 -274
  198. egse/help/__init__.py +0 -0
  199. egse/help/help_ui.py +0 -126
  200. egse/hexapod/__init__.py +0 -32
  201. egse/hexapod/symetrie/__init__.py +0 -138
  202. egse/hexapod/symetrie/alpha.py +0 -874
  203. egse/hexapod/symetrie/dynalpha.py +0 -1387
  204. egse/hexapod/symetrie/hexapod_ui.py +0 -1516
  205. egse/hexapod/symetrie/pmac.py +0 -1010
  206. egse/hexapod/symetrie/pmac_regex.py +0 -83
  207. egse/hexapod/symetrie/puna.py +0 -1167
  208. egse/hexapod/symetrie/puna.yaml +0 -193
  209. egse/hexapod/symetrie/puna_cs.py +0 -196
  210. egse/hexapod/symetrie/puna_protocol.py +0 -131
  211. egse/hexapod/symetrie/puna_ui.py +0 -434
  212. egse/hexapod/symetrie/punaplus.py +0 -107
  213. egse/hexapod/symetrie/zonda.py +0 -872
  214. egse/hexapod/symetrie/zonda.yaml +0 -337
  215. egse/hexapod/symetrie/zonda_cs.py +0 -172
  216. egse/hexapod/symetrie/zonda_devif.py +0 -415
  217. egse/hexapod/symetrie/zonda_protocol.py +0 -119
  218. egse/hexapod/symetrie/zonda_ui.py +0 -449
  219. egse/hk.py +0 -765
  220. egse/icons/aeu-cs-start.svg +0 -117
  221. egse/icons/aeu-cs-stop.svg +0 -118
  222. egse/icons/aeu-cs.svg +0 -107
  223. egse/icons/aeu_cs-started.svg +0 -112
  224. egse/icons/aeu_cs-stopped.svg +0 -112
  225. egse/icons/aeu_cs.svg +0 -55
  226. egse/icons/alert.svg +0 -1
  227. egse/icons/arrow-double-left.png +0 -0
  228. egse/icons/arrow-double-right.png +0 -0
  229. egse/icons/arrow-up.svg +0 -11
  230. egse/icons/backward.svg +0 -1
  231. egse/icons/busy.svg +0 -1
  232. egse/icons/cleaning.svg +0 -115
  233. egse/icons/color-scheme.svg +0 -1
  234. egse/icons/cs-connected-alert.svg +0 -91
  235. egse/icons/cs-connected-disabled.svg +0 -43
  236. egse/icons/cs-connected.svg +0 -89
  237. egse/icons/cs-not-connected.svg +0 -44
  238. egse/icons/double-left-arrow.svg +0 -1
  239. egse/icons/double-right-arrow.svg +0 -1
  240. egse/icons/erase-disabled.svg +0 -19
  241. egse/icons/erase.svg +0 -59
  242. egse/icons/fitsgen-start.svg +0 -47
  243. egse/icons/fitsgen-stop.svg +0 -48
  244. egse/icons/fitsgen.svg +0 -1
  245. egse/icons/forward.svg +0 -1
  246. egse/icons/fov-hk-start.svg +0 -33
  247. egse/icons/fov-hk-stop.svg +0 -37
  248. egse/icons/fov-hk.svg +0 -1
  249. egse/icons/front-desk.svg +0 -1
  250. egse/icons/home-actioned.svg +0 -15
  251. egse/icons/home-disabled.svg +0 -15
  252. egse/icons/home.svg +0 -13
  253. egse/icons/info.svg +0 -1
  254. egse/icons/invalid.png +0 -0
  255. egse/icons/led-green.svg +0 -20
  256. egse/icons/led-grey.svg +0 -20
  257. egse/icons/led-orange.svg +0 -20
  258. egse/icons/led-red.svg +0 -20
  259. egse/icons/led-square-green.svg +0 -134
  260. egse/icons/led-square-grey.svg +0 -134
  261. egse/icons/led-square-orange.svg +0 -134
  262. egse/icons/led-square-red.svg +0 -134
  263. egse/icons/limit-switch-all-green.svg +0 -115
  264. egse/icons/limit-switch-all-red.svg +0 -117
  265. egse/icons/limit-switch-el+.svg +0 -116
  266. egse/icons/limit-switch-el-.svg +0 -117
  267. egse/icons/location-marker.svg +0 -1
  268. egse/icons/logo-dpu.svg +0 -48
  269. egse/icons/logo-gimbal.svg +0 -112
  270. egse/icons/logo-huber.svg +0 -23
  271. egse/icons/logo-ogse.svg +0 -31
  272. egse/icons/logo-puna.svg +0 -92
  273. egse/icons/logo-tcs.svg +0 -29
  274. egse/icons/logo-zonda.svg +0 -66
  275. egse/icons/maximize.svg +0 -1
  276. egse/icons/meter.svg +0 -1
  277. egse/icons/more.svg +0 -45
  278. egse/icons/n-fee-hk-start.svg +0 -24
  279. egse/icons/n-fee-hk-stop.svg +0 -25
  280. egse/icons/n-fee-hk.svg +0 -83
  281. egse/icons/observing-off.svg +0 -46
  282. egse/icons/observing-on.svg +0 -46
  283. egse/icons/open-document-hdf5.png +0 -0
  284. egse/icons/open-document-hdf5.svg +0 -21
  285. egse/icons/ops-mode.svg +0 -1
  286. egse/icons/play-green.svg +0 -17
  287. egse/icons/plugged-disabled.svg +0 -27
  288. egse/icons/plugged.svg +0 -21
  289. egse/icons/pm_ui.svg +0 -1
  290. egse/icons/power-button-green.svg +0 -27
  291. egse/icons/power-button-red.svg +0 -27
  292. egse/icons/power-button.svg +0 -27
  293. egse/icons/radar.svg +0 -1
  294. egse/icons/radioactive.svg +0 -2
  295. egse/icons/reload.svg +0 -1
  296. egse/icons/remote-control-off.svg +0 -28
  297. egse/icons/remote-control-on.svg +0 -28
  298. egse/icons/repeat-blue.svg +0 -15
  299. egse/icons/repeat.svg +0 -1
  300. egse/icons/settings.svg +0 -1
  301. egse/icons/shrink.svg +0 -1
  302. egse/icons/shutter.svg +0 -1
  303. egse/icons/sign-off.svg +0 -1
  304. egse/icons/sign-on.svg +0 -1
  305. egse/icons/sim-mode.svg +0 -1
  306. egse/icons/small-buttons-go.svg +0 -20
  307. egse/icons/small-buttons-minus.svg +0 -51
  308. egse/icons/small-buttons-plus.svg +0 -51
  309. egse/icons/sponge.svg +0 -220
  310. egse/icons/start-button-disabled.svg +0 -84
  311. egse/icons/start-button.svg +0 -50
  312. egse/icons/stop-button-disabled.svg +0 -84
  313. egse/icons/stop-button.svg +0 -50
  314. egse/icons/stop-red.svg +0 -17
  315. egse/icons/stop.svg +0 -1
  316. egse/icons/switch-disabled-square.svg +0 -87
  317. egse/icons/switch-disabled.svg +0 -15
  318. egse/icons/switch-off-square.svg +0 -87
  319. egse/icons/switch-off.svg +0 -72
  320. egse/icons/switch-on-square.svg +0 -87
  321. egse/icons/switch-on.svg +0 -61
  322. egse/icons/temperature-control.svg +0 -44
  323. egse/icons/th_ui_logo.svg +0 -1
  324. egse/icons/unplugged.svg +0 -23
  325. egse/icons/unvalid.png +0 -0
  326. egse/icons/user-interface.svg +0 -1
  327. egse/icons/vacuum.svg +0 -1
  328. egse/icons/valid.png +0 -0
  329. egse/icons/zoom-to-pixel-dark.svg +0 -64
  330. egse/icons/zoom-to-pixel-white.svg +0 -36
  331. egse/images/big-rotation-stage.png +0 -0
  332. egse/images/connected-100.png +0 -0
  333. egse/images/cross.svg +0 -6
  334. egse/images/disconnected-100.png +0 -0
  335. egse/images/gui-icon.png +0 -0
  336. egse/images/home.svg +0 -6
  337. egse/images/info-icon.png +0 -0
  338. egse/images/led-black.svg +0 -89
  339. egse/images/led-green.svg +0 -85
  340. egse/images/led-orange.svg +0 -85
  341. egse/images/led-red.svg +0 -85
  342. egse/images/load-icon.png +0 -0
  343. egse/images/load-setup.png +0 -0
  344. egse/images/load.png +0 -0
  345. egse/images/pause.png +0 -0
  346. egse/images/play-button.svg +0 -8
  347. egse/images/play.png +0 -0
  348. egse/images/process-status.png +0 -0
  349. egse/images/restart.png +0 -0
  350. egse/images/search.png +0 -0
  351. egse/images/sma.png +0 -0
  352. egse/images/start.png +0 -0
  353. egse/images/stop-button.svg +0 -8
  354. egse/images/stop.png +0 -0
  355. egse/images/switch-off.svg +0 -48
  356. egse/images/switch-on.svg +0 -48
  357. egse/images/undo.png +0 -0
  358. egse/images/update-button.svg +0 -11
  359. egse/imageviewer/exposureselection.py +0 -475
  360. egse/imageviewer/imageviewer.py +0 -198
  361. egse/imageviewer/matchfocalplane.py +0 -179
  362. egse/imageviewer/subfieldposition.py +0 -133
  363. egse/lampcontrol/__init__.py +0 -4
  364. egse/lampcontrol/beaglebone/beaglebone.py +0 -178
  365. egse/lampcontrol/beaglebone/beaglebone.yaml +0 -62
  366. egse/lampcontrol/beaglebone/beaglebone_cs.py +0 -106
  367. egse/lampcontrol/beaglebone/beaglebone_devif.py +0 -150
  368. egse/lampcontrol/beaglebone/beaglebone_protocol.py +0 -73
  369. egse/lampcontrol/energetiq/__init__.py +0 -22
  370. egse/lampcontrol/energetiq/eq99.yaml +0 -98
  371. egse/lampcontrol/energetiq/lampEQ99.py +0 -283
  372. egse/lampcontrol/energetiq/lampEQ99_cs.py +0 -128
  373. egse/lampcontrol/energetiq/lampEQ99_devif.py +0 -158
  374. egse/lampcontrol/energetiq/lampEQ99_encode_decode_errors.py +0 -73
  375. egse/lampcontrol/energetiq/lampEQ99_protocol.py +0 -69
  376. egse/lampcontrol/energetiq/lampEQ99_ui.py +0 -465
  377. egse/lib/CentOS-7/EtherSpaceLink_v34_86.dylib +0 -0
  378. egse/lib/CentOS-8/ESL-RMAP_v34_86.dylib +0 -0
  379. egse/lib/CentOS-8/EtherSpaceLink_v34_86.dylib +0 -0
  380. egse/lib/Debian/ESL-RMAP_v34_86.dylib +0 -0
  381. egse/lib/Debian/EtherSpaceLink_v34_86.dylib +0 -0
  382. egse/lib/Debian/libetherspacelink_v35_21.dylib +0 -0
  383. egse/lib/Linux/ESL-RMAP_v34_86.dylib +0 -0
  384. egse/lib/Linux/EtherSpaceLink_v34_86.dylib +0 -0
  385. egse/lib/Ubuntu-20/ESL-RMAP_v34_86.dylib +0 -0
  386. egse/lib/Ubuntu-20/EtherSpaceLink_v34_86.dylib +0 -0
  387. egse/lib/gssw/python3-gssw_2.2.3+31f63c9f-1_all.deb +0 -0
  388. egse/lib/macOS/ESL-RMAP_v34_86.dylib +0 -0
  389. egse/lib/macOS/EtherSpaceLink_v34_86.dylib +0 -0
  390. egse/lib/ximc/__pycache__/pyximc.cpython-38 2.pyc +0 -0
  391. egse/lib/ximc/__pycache__/pyximc.cpython-38.pyc +0 -0
  392. egse/lib/ximc/libximc.framework/Frameworks/libbindy.dylib +0 -0
  393. egse/lib/ximc/libximc.framework/Frameworks/libxiwrapper.dylib +0 -0
  394. egse/lib/ximc/libximc.framework/Headers/ximc.h +0 -5510
  395. egse/lib/ximc/libximc.framework/Resources/Info.plist +0 -42
  396. egse/lib/ximc/libximc.framework/Resources/keyfile.sqlite +0 -0
  397. egse/lib/ximc/libximc.framework/libbindy.so +0 -0
  398. egse/lib/ximc/libximc.framework/libximc +0 -0
  399. egse/lib/ximc/libximc.framework/libximc.so +0 -0
  400. egse/lib/ximc/libximc.framework/libximc.so.7.0.0 +0 -0
  401. egse/lib/ximc/libximc.framework/libxiwrapper.so +0 -0
  402. egse/lib/ximc/pyximc.py +0 -922
  403. egse/listener.py +0 -73
  404. egse/logger/__init__.py +0 -243
  405. egse/logger/log_cs.py +0 -321
  406. egse/metrics.py +0 -98
  407. egse/mixin.py +0 -464
  408. egse/monitoring.py +0 -95
  409. egse/ni/alarms/__init__.py +0 -26
  410. egse/ni/alarms/cdaq9375.py +0 -300
  411. egse/ni/alarms/cdaq9375.yaml +0 -89
  412. egse/ni/alarms/cdaq9375_cs.py +0 -130
  413. egse/ni/alarms/cdaq9375_devif.py +0 -183
  414. egse/ni/alarms/cdaq9375_protocol.py +0 -48
  415. egse/obs_inspection.py +0 -163
  416. egse/observer.py +0 -41
  417. egse/obsid.py +0 -163
  418. egse/powermeter/__init__.py +0 -0
  419. egse/powermeter/ni/__init__.py +0 -38
  420. egse/powermeter/ni/cdaq9184.py +0 -224
  421. egse/powermeter/ni/cdaq9184.yaml +0 -73
  422. egse/powermeter/ni/cdaq9184_cs.py +0 -130
  423. egse/powermeter/ni/cdaq9184_devif.py +0 -201
  424. egse/powermeter/ni/cdaq9184_protocol.py +0 -48
  425. egse/powermeter/ni/cdaq9184_ui.py +0 -544
  426. egse/powermeter/thorlabs/__init__.py +0 -25
  427. egse/powermeter/thorlabs/pm100a.py +0 -380
  428. egse/powermeter/thorlabs/pm100a.yaml +0 -132
  429. egse/powermeter/thorlabs/pm100a_cs.py +0 -136
  430. egse/powermeter/thorlabs/pm100a_devif.py +0 -127
  431. egse/powermeter/thorlabs/pm100a_protocol.py +0 -80
  432. egse/powermeter/thorlabs/pm100a_ui.py +0 -725
  433. egse/process.py +0 -451
  434. egse/procman/__init__.py +0 -811
  435. egse/procman/cannot_start_process_popup.py +0 -43
  436. egse/procman/procman.yaml +0 -49
  437. egse/procman/procman_cs.py +0 -201
  438. egse/procman/procman_ui.py +0 -2081
  439. egse/protocol.py +0 -603
  440. egse/proxy.py +0 -522
  441. egse/randomwalk.py +0 -140
  442. egse/reg.py +0 -585
  443. egse/reload.py +0 -122
  444. egse/reprocess.py +0 -675
  445. egse/resource.py +0 -333
  446. egse/rst.py +0 -135
  447. egse/search.py +0 -182
  448. egse/serialdevice.py +0 -190
  449. egse/services.py +0 -212
  450. egse/services.yaml +0 -51
  451. egse/settings.py +0 -379
  452. egse/settings.yaml +0 -980
  453. egse/setup.py +0 -1180
  454. egse/shutter/__init__.py +0 -0
  455. egse/shutter/thorlabs/__init__.py +0 -19
  456. egse/shutter/thorlabs/ksc101.py +0 -205
  457. egse/shutter/thorlabs/ksc101.yaml +0 -105
  458. egse/shutter/thorlabs/ksc101_cs.py +0 -136
  459. egse/shutter/thorlabs/ksc101_devif.py +0 -201
  460. egse/shutter/thorlabs/ksc101_protocol.py +0 -69
  461. egse/shutter/thorlabs/ksc101_ui.py +0 -548
  462. egse/shutter/thorlabs/sc10.py +0 -82
  463. egse/shutter/thorlabs/sc10.yaml +0 -52
  464. egse/shutter/thorlabs/sc10_controller.py +0 -81
  465. egse/shutter/thorlabs/sc10_cs.py +0 -108
  466. egse/shutter/thorlabs/sc10_interface.py +0 -25
  467. egse/shutter/thorlabs/sc10_simulator.py +0 -30
  468. egse/simulator.py +0 -41
  469. egse/slack.py +0 -61
  470. egse/socketdevice.py +0 -218
  471. egse/sockets.py +0 -218
  472. egse/spw.py +0 -1479
  473. egse/stages/__init__.py +0 -12
  474. egse/stages/aerotech/ensemble.py +0 -247
  475. egse/stages/aerotech/ensemble.yaml +0 -205
  476. egse/stages/aerotech/ensemble_controller.py +0 -275
  477. egse/stages/aerotech/ensemble_cs.py +0 -110
  478. egse/stages/aerotech/ensemble_interface.py +0 -132
  479. egse/stages/aerotech/ensemble_parameters.py +0 -433
  480. egse/stages/aerotech/ensemble_simulator.py +0 -27
  481. egse/stages/aerotech/mgse_sim.py +0 -193
  482. egse/stages/arun/smd3.py +0 -111
  483. egse/stages/arun/smd3.yaml +0 -68
  484. egse/stages/arun/smd3_controller.py +0 -472
  485. egse/stages/arun/smd3_cs.py +0 -112
  486. egse/stages/arun/smd3_interface.py +0 -53
  487. egse/stages/arun/smd3_simulator.py +0 -27
  488. egse/stages/arun/smd3_stop.py +0 -16
  489. egse/stages/huber/__init__.py +0 -49
  490. egse/stages/huber/smc9300.py +0 -904
  491. egse/stages/huber/smc9300.yaml +0 -63
  492. egse/stages/huber/smc9300_cs.py +0 -178
  493. egse/stages/huber/smc9300_devif.py +0 -345
  494. egse/stages/huber/smc9300_protocol.py +0 -111
  495. egse/stages/huber/smc9300_sim.py +0 -547
  496. egse/stages/huber/smc9300_ui.py +0 -973
  497. egse/state.py +0 -173
  498. egse/statemachine.py +0 -274
  499. egse/storage/__init__.py +0 -1004
  500. egse/storage/persistence.py +0 -2295
  501. egse/storage/storage.yaml +0 -72
  502. egse/storage/storage_cs.py +0 -214
  503. egse/styles/dark.qss +0 -343
  504. egse/styles/default.qss +0 -48
  505. egse/synoptics/__init__.py +0 -412
  506. egse/synoptics/syn.yaml +0 -9
  507. egse/synoptics/syn_cs.py +0 -195
  508. egse/system.py +0 -1408
  509. egse/tcs/__init__.py +0 -14
  510. egse/tcs/tcs.py +0 -874
  511. egse/tcs/tcs.yaml +0 -14
  512. egse/tcs/tcs_cs.py +0 -202
  513. egse/tcs/tcs_devif.py +0 -292
  514. egse/tcs/tcs_protocol.py +0 -177
  515. egse/tcs/tcs_sim.py +0 -177
  516. egse/tcs/tcs_ui.py +0 -543
  517. egse/tdms.py +0 -171
  518. egse/tempcontrol/__init__.py +0 -23
  519. egse/tempcontrol/agilent/agilent34970.py +0 -109
  520. egse/tempcontrol/agilent/agilent34970.yaml +0 -44
  521. egse/tempcontrol/agilent/agilent34970_cs.py +0 -116
  522. egse/tempcontrol/agilent/agilent34970_devif.py +0 -182
  523. egse/tempcontrol/agilent/agilent34970_protocol.py +0 -99
  524. egse/tempcontrol/agilent/agilent34972.py +0 -111
  525. egse/tempcontrol/agilent/agilent34972.yaml +0 -44
  526. egse/tempcontrol/agilent/agilent34972_cs.py +0 -117
  527. egse/tempcontrol/agilent/agilent34972_devif.py +0 -189
  528. egse/tempcontrol/agilent/agilent34972_protocol.py +0 -101
  529. egse/tempcontrol/beaglebone/beaglebone.py +0 -342
  530. egse/tempcontrol/beaglebone/beaglebone.yaml +0 -110
  531. egse/tempcontrol/beaglebone/beaglebone_cs.py +0 -117
  532. egse/tempcontrol/beaglebone/beaglebone_protocol.py +0 -135
  533. egse/tempcontrol/beaglebone/beaglebone_ui.py +0 -681
  534. egse/tempcontrol/digalox/digalox.py +0 -107
  535. egse/tempcontrol/digalox/digalox.yaml +0 -36
  536. egse/tempcontrol/digalox/digalox_cs.py +0 -112
  537. egse/tempcontrol/digalox/digalox_protocol.py +0 -55
  538. egse/tempcontrol/keithley/__init__.py +0 -33
  539. egse/tempcontrol/keithley/daq6510.py +0 -662
  540. egse/tempcontrol/keithley/daq6510.yaml +0 -105
  541. egse/tempcontrol/keithley/daq6510_cs.py +0 -163
  542. egse/tempcontrol/keithley/daq6510_devif.py +0 -343
  543. egse/tempcontrol/keithley/daq6510_protocol.py +0 -78
  544. egse/tempcontrol/keithley/daq6510_sim.py +0 -186
  545. egse/tempcontrol/lakeshore/__init__.py +0 -33
  546. egse/tempcontrol/lakeshore/lsci.py +0 -361
  547. egse/tempcontrol/lakeshore/lsci.yaml +0 -162
  548. egse/tempcontrol/lakeshore/lsci_cs.py +0 -174
  549. egse/tempcontrol/lakeshore/lsci_devif.py +0 -292
  550. egse/tempcontrol/lakeshore/lsci_protocol.py +0 -73
  551. egse/tempcontrol/lakeshore/lsci_ui.py +0 -389
  552. egse/tempcontrol/ni/__init__.py +0 -0
  553. egse/tempcontrol/spid/spid.py +0 -109
  554. egse/tempcontrol/spid/spid.yaml +0 -81
  555. egse/tempcontrol/spid/spid_controller.py +0 -279
  556. egse/tempcontrol/spid/spid_cs.py +0 -136
  557. egse/tempcontrol/spid/spid_protocol.py +0 -107
  558. egse/tempcontrol/spid/spid_ui.py +0 -727
  559. egse/tempcontrol/srs/__init__.py +0 -22
  560. egse/tempcontrol/srs/ptc10.py +0 -875
  561. egse/tempcontrol/srs/ptc10.yaml +0 -227
  562. egse/tempcontrol/srs/ptc10_cs.py +0 -128
  563. egse/tempcontrol/srs/ptc10_devif.py +0 -118
  564. egse/tempcontrol/srs/ptc10_protocol.py +0 -42
  565. egse/tempcontrol/srs/ptc10_ui.py +0 -906
  566. egse/ups/apc/apc.py +0 -236
  567. egse/ups/apc/apc.yaml +0 -45
  568. egse/ups/apc/apc_cs.py +0 -101
  569. egse/ups/apc/apc_protocol.py +0 -125
  570. egse/user.yaml +0 -7
  571. egse/vacuum/beaglebone/beaglebone.py +0 -149
  572. egse/vacuum/beaglebone/beaglebone.yaml +0 -44
  573. egse/vacuum/beaglebone/beaglebone_cs.py +0 -108
  574. egse/vacuum/beaglebone/beaglebone_devif.py +0 -164
  575. egse/vacuum/beaglebone/beaglebone_protocol.py +0 -193
  576. egse/vacuum/beaglebone/beaglebone_ui.py +0 -638
  577. egse/vacuum/instrutech/igm402.py +0 -92
  578. egse/vacuum/instrutech/igm402.yaml +0 -90
  579. egse/vacuum/instrutech/igm402_controller.py +0 -128
  580. egse/vacuum/instrutech/igm402_cs.py +0 -108
  581. egse/vacuum/instrutech/igm402_interface.py +0 -49
  582. egse/vacuum/instrutech/igm402_simulator.py +0 -36
  583. egse/vacuum/keller/kellerBus.py +0 -256
  584. egse/vacuum/keller/leo3.py +0 -102
  585. egse/vacuum/keller/leo3.yaml +0 -38
  586. egse/vacuum/keller/leo3_controller.py +0 -83
  587. egse/vacuum/keller/leo3_cs.py +0 -101
  588. egse/vacuum/keller/leo3_interface.py +0 -33
  589. egse/vacuum/mks/evision.py +0 -86
  590. egse/vacuum/mks/evision.yaml +0 -75
  591. egse/vacuum/mks/evision_cs.py +0 -101
  592. egse/vacuum/mks/evision_devif.py +0 -316
  593. egse/vacuum/mks/evision_interface.py +0 -60
  594. egse/vacuum/mks/evision_simulator.py +0 -24
  595. egse/vacuum/mks/evision_ui.py +0 -704
  596. egse/vacuum/pfeiffer/acp40.py +0 -87
  597. egse/vacuum/pfeiffer/acp40.yaml +0 -60
  598. egse/vacuum/pfeiffer/acp40_controller.py +0 -117
  599. egse/vacuum/pfeiffer/acp40_cs.py +0 -109
  600. egse/vacuum/pfeiffer/acp40_interface.py +0 -40
  601. egse/vacuum/pfeiffer/acp40_simulator.py +0 -39
  602. egse/vacuum/pfeiffer/tc400.py +0 -113
  603. egse/vacuum/pfeiffer/tc400.yaml +0 -83
  604. egse/vacuum/pfeiffer/tc400_controller.py +0 -140
  605. egse/vacuum/pfeiffer/tc400_cs.py +0 -109
  606. egse/vacuum/pfeiffer/tc400_interface.py +0 -70
  607. egse/vacuum/pfeiffer/tc400_simulator.py +0 -24
  608. egse/vacuum/pfeiffer/tpg261.py +0 -81
  609. egse/vacuum/pfeiffer/tpg261.yaml +0 -66
  610. egse/vacuum/pfeiffer/tpg261_controller.py +0 -150
  611. egse/vacuum/pfeiffer/tpg261_cs.py +0 -109
  612. egse/vacuum/pfeiffer/tpg261_interface.py +0 -60
  613. egse/vacuum/pfeiffer/tpg261_simulator.py +0 -24
  614. egse/version.py +0 -174
  615. egse/visitedpositions.py +0 -398
  616. egse/windowing.py +0 -213
  617. egse/zmq/__init__.py +0 -28
  618. egse/zmq/spw.py +0 -160
  619. egse/zmq_ser.py +0 -41
  620. scripts/alerts/cold.yaml +0 -278
  621. scripts/alerts/example_alerts.yaml +0 -54
  622. scripts/alerts/transition.yaml +0 -14
  623. scripts/alerts/warm.yaml +0 -49
  624. scripts/analyse_n_fee_hk_data.py +0 -44
  625. scripts/check_hdf5_files.py +0 -192
  626. scripts/check_register_sync.py +0 -47
  627. scripts/create_hdf5_report.py +0 -295
  628. scripts/csl_model.py +0 -436
  629. scripts/csl_restore_setup.py +0 -230
  630. scripts/export-grafana-dashboards.py +0 -50
  631. scripts/fdir/cs_recovery/fdir_cs_recovery.py +0 -59
  632. scripts/fdir/fdir_table.yaml +0 -70
  633. scripts/fdir/fdir_test_recovery.py +0 -11
  634. scripts/fdir/hw_recovery/fdir_agilent_hw_recovery.py +0 -73
  635. scripts/fdir/limit_recovery/fdir_agilent_limit.py +0 -64
  636. scripts/fdir/limit_recovery/fdir_bb_heater_limit.py +0 -61
  637. scripts/fdir/limit_recovery/fdir_ensemble_limit.py +0 -33
  638. scripts/fdir/limit_recovery/fdir_pressure_limit_recovery.py +0 -71
  639. scripts/fix_csv.py +0 -80
  640. scripts/n_fee_supply_voltage_calculation.py +0 -92
  641. scripts/playground.py +0 -30
  642. scripts/print_hdf5_hk_data.py +0 -68
  643. scripts/print_register_map.py +0 -43
  644. scripts/sron/commanding/control_heaters.py +0 -44
  645. scripts/sron/commanding/pumpdown.py +0 -46
  646. scripts/sron/commanding/set_pid_setpoint.py +0 -19
  647. scripts/sron/commanding/shutdown_bbb_heaters.py +0 -10
  648. scripts/sron/commanding/shutdown_pumps.py +0 -33
  649. scripts/sron/tm_gen/tm_gen_agilent.py +0 -38
  650. scripts/sron/tm_gen/tm_gen_heaters.py +0 -4
  651. scripts/sron/tm_gen/tm_gen_spid.py +0 -13
  652. scripts/update_operational_cgse.py +0 -268
  653. scripts/update_operational_cgse_old.py +0 -273
egse/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)