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