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/gui/focalplane.py
DELETED
|
@@ -1,1285 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
This modules yields to widgets in which the focal plane is visualised. The combobox
|
|
3
|
-
below the plot can be used to choose the coordinate system used in the plot: focal-plane
|
|
4
|
-
coordinates, pixel coordinates, and field angles. A blue cirle denotes the edge of the
|
|
5
|
-
FOV.
|
|
6
|
-
"""
|
|
7
|
-
import logging
|
|
8
|
-
from math import atan
|
|
9
|
-
from math import degrees
|
|
10
|
-
from math import radians
|
|
11
|
-
|
|
12
|
-
import matplotlib.pyplot as plt
|
|
13
|
-
import matplotlib.ticker as ticker
|
|
14
|
-
import numpy as np
|
|
15
|
-
from PyQt5.QtGui import QFont
|
|
16
|
-
from PyQt5.QtWidgets import QComboBox
|
|
17
|
-
from PyQt5.QtWidgets import QGridLayout
|
|
18
|
-
from PyQt5.QtWidgets import QGroupBox
|
|
19
|
-
from PyQt5.QtWidgets import QLabel
|
|
20
|
-
from PyQt5.QtWidgets import QSizePolicy
|
|
21
|
-
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
|
|
22
|
-
from matplotlib.figure import Figure
|
|
23
|
-
|
|
24
|
-
from egse.coordinates import ccd_to_focal_plane_coordinates
|
|
25
|
-
from egse.coordinates import focal_plane_coordinates_to_angles
|
|
26
|
-
from egse.gui.formatter import degree_formatter
|
|
27
|
-
from egse.settings import Settings
|
|
28
|
-
from egse.setup import load_setup
|
|
29
|
-
|
|
30
|
-
FONT = QFont("Helvetica", 18)
|
|
31
|
-
|
|
32
|
-
FOV_SETTINGS = Settings.load("Field-Of-View")
|
|
33
|
-
MODULE_LOGGER = logging.getLogger(__name__)
|
|
34
|
-
|
|
35
|
-
COORDINATE_SYSTEMS = {
|
|
36
|
-
"Focal plane": "Focal-plane coordinates [mm]",
|
|
37
|
-
"Pixels": "Pixel coordinates",
|
|
38
|
-
"Angles": "Angles"
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
PIXEL_SIZE = CCD_SETTINGS = Settings.load("CCD").PIXEL_SIZE / 1000 # Pixel size [mm]
|
|
42
|
-
ZEROPOINT = Settings.load("CCD").ZEROPOINT # CCD zeropoint (x, y) [mm]
|
|
43
|
-
NUM_ROWS = Settings.load("CCD").NUM_ROWS
|
|
44
|
-
NUM_COLUMNS = Settings.load("CCD").NUM_COLUMNS
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
class FocalPlane(FigureCanvas):
|
|
48
|
-
|
|
49
|
-
"""
|
|
50
|
-
FigureCanvas showing the focal plane, with a blue circle indicating the field-of-view.
|
|
51
|
-
The available coordinate systems are:
|
|
52
|
-
- pixel coordinates [pixels],
|
|
53
|
-
- focal-plane coordinates [mm],
|
|
54
|
-
- and field angles [degrees].
|
|
55
|
-
"""
|
|
56
|
-
|
|
57
|
-
def __init__(self, parent=None, dpi=100):
|
|
58
|
-
|
|
59
|
-
"""
|
|
60
|
-
Initialisation of a plot of the focal plane, with a blue circle indicating the
|
|
61
|
-
field-of-view.
|
|
62
|
-
"""
|
|
63
|
-
|
|
64
|
-
setup = load_setup()
|
|
65
|
-
|
|
66
|
-
self.fee_side = setup.camera.fee.ccd_sides.enum
|
|
67
|
-
self.ccd_id = setup.camera.fee.ccd_numbering.CCD_ID
|
|
68
|
-
|
|
69
|
-
self.figure = Figure()
|
|
70
|
-
self.ax = self.figure.add_subplot(111)
|
|
71
|
-
|
|
72
|
-
FigureCanvas.__init__(self, self.figure)
|
|
73
|
-
self.setParent(parent)
|
|
74
|
-
|
|
75
|
-
FigureCanvas.setSizePolicy(
|
|
76
|
-
self, QSizePolicy.Expanding, QSizePolicy.Expanding)
|
|
77
|
-
FigureCanvas.updateGeometry(self)
|
|
78
|
-
|
|
79
|
-
def change_to_focal_plane_coordinates(self):
|
|
80
|
-
|
|
81
|
-
"""
|
|
82
|
-
Preparation of the plot to show the source position in focal-plane coordinates:
|
|
83
|
-
|
|
84
|
-
- clear the plot;
|
|
85
|
-
- draw a blue circle, indicating the size of the field-of view;
|
|
86
|
-
- configure the axes and grid lines;
|
|
87
|
-
- draw the CCDs and their readout registers;
|
|
88
|
-
- add the CCD codes.
|
|
89
|
-
|
|
90
|
-
The draw() method should be called in the sub-classes.
|
|
91
|
-
"""
|
|
92
|
-
|
|
93
|
-
self.coordinate_system = COORDINATE_SYSTEMS["Focal plane"]
|
|
94
|
-
|
|
95
|
-
self.figure.delaxes(self.ax)
|
|
96
|
-
self.ax = self.figure.add_subplot(111)
|
|
97
|
-
self.ax.set_aspect(1)
|
|
98
|
-
|
|
99
|
-
# Circle indicating the size of the FOV [mm]
|
|
100
|
-
|
|
101
|
-
self.circle = plt.Circle(
|
|
102
|
-
(0, 0), FOV_SETTINGS.RADIUS_MM, color='b', fill=False, label="FOV", linewidth=1)
|
|
103
|
-
self.ax.add_artist(self.circle)
|
|
104
|
-
|
|
105
|
-
# Range
|
|
106
|
-
|
|
107
|
-
limit = 85
|
|
108
|
-
self.ax.set_xlim([-limit, limit])
|
|
109
|
-
self.ax.set_ylim([-limit, limit])
|
|
110
|
-
|
|
111
|
-
self.ax.set_xlabel("$x_{FP} [mm]$", fontsize=10)
|
|
112
|
-
self.ax.xaxis.set_label_coords(1.085, 0.45)
|
|
113
|
-
self.ax.set_ylabel("$y_{FP} [mm]$", fontsize=10, rotation=0)
|
|
114
|
-
self.ax.yaxis.set_label_coords(0.47, 1.05)
|
|
115
|
-
|
|
116
|
-
# Make sure the axes cross at the origin
|
|
117
|
-
|
|
118
|
-
self.ax.axvline(x=0, color="k", linewidth=1)
|
|
119
|
-
self.ax.axhline(y=0, color="k", linewidth=1)
|
|
120
|
-
|
|
121
|
-
self.ax.spines['left'].set_position('center')
|
|
122
|
-
self.ax.spines['bottom'].set_position('center')
|
|
123
|
-
self.ax.spines['right'].set_color('none')
|
|
124
|
-
self.ax.spines['top'].set_color('none')
|
|
125
|
-
|
|
126
|
-
xmin, xmax = self.ax.get_xlim()
|
|
127
|
-
ymin, ymax = self.ax.get_ylim()
|
|
128
|
-
|
|
129
|
-
self.ax.arrow(xmin, 0, xmax-xmin+7, 0., fc='k', ec='k', lw=1,
|
|
130
|
-
head_width=3, head_length=5, overhang=0.3,
|
|
131
|
-
length_includes_head=True, clip_on=False)
|
|
132
|
-
|
|
133
|
-
self.ax.arrow(0, ymin, 0., ymax-ymin+7, fc='k', ec='k', lw=1,
|
|
134
|
-
head_width=3, head_length=5, overhang=0.3,
|
|
135
|
-
length_includes_head=True, clip_on=False)
|
|
136
|
-
|
|
137
|
-
# Readout registers
|
|
138
|
-
|
|
139
|
-
self.ax.plot([-ZEROPOINT[0], ZEROPOINT[1]], [-ZEROPOINT[1], -
|
|
140
|
-
ZEROPOINT[1]], color="k", linewidth=3) # Upper left CCD
|
|
141
|
-
self.ax.plot([ZEROPOINT[1], ZEROPOINT[1]], [-ZEROPOINT[0],
|
|
142
|
-
ZEROPOINT[1]], color="k", linewidth=3) # Lower left CCD
|
|
143
|
-
self.ax.plot([ZEROPOINT[0], -ZEROPOINT[1]], [ZEROPOINT[1],
|
|
144
|
-
ZEROPOINT[1]], color="k", linewidth=3) # Lower right CCD
|
|
145
|
-
self.ax.plot([-ZEROPOINT[1], -ZEROPOINT[1]], [ZEROPOINT[0], -
|
|
146
|
-
ZEROPOINT[1]], color="k", linewidth=3) # Upper right CCD
|
|
147
|
-
|
|
148
|
-
# CCD middle
|
|
149
|
-
|
|
150
|
-
self.ax.plot([ZEROPOINT[0] - NUM_COLUMNS / 2 * PIXEL_SIZE, ZEROPOINT[0] - NUM_COLUMNS / 2 * PIXEL_SIZE],
|
|
151
|
-
[-ZEROPOINT[0], ZEROPOINT[1]], color="k", linewidth=1,
|
|
152
|
-
linestyle="dotted") # Upper left CCD
|
|
153
|
-
self.ax.plot([-ZEROPOINT[1], ZEROPOINT[0]],
|
|
154
|
-
[ZEROPOINT[0] - NUM_COLUMNS / 2 * PIXEL_SIZE, ZEROPOINT[0] - NUM_COLUMNS / 2 * PIXEL_SIZE],
|
|
155
|
-
color="k", linewidth=1, linestyle="dotted") # Lower left CCD
|
|
156
|
-
self.ax.plot([-ZEROPOINT[0] + NUM_COLUMNS / 2 * PIXEL_SIZE, -ZEROPOINT[0] + NUM_COLUMNS / 2 * PIXEL_SIZE],
|
|
157
|
-
[-ZEROPOINT[1], ZEROPOINT[0]], color="k", linewidth=1,
|
|
158
|
-
linestyle="dotted") # Lower right CCD
|
|
159
|
-
self.ax.plot([-ZEROPOINT[0], ZEROPOINT[1]],
|
|
160
|
-
[-ZEROPOINT[0] + NUM_COLUMNS / 2 * PIXEL_SIZE, -ZEROPOINT[0] + NUM_COLUMNS / 2 * PIXEL_SIZE],
|
|
161
|
-
color="k", linewidth=1, linestyle="dotted") # Upper right CCD
|
|
162
|
-
|
|
163
|
-
# CCD codes
|
|
164
|
-
|
|
165
|
-
self.ax.text(-80, 70, self.ccd_id[2]) # Upper left CCD
|
|
166
|
-
self.ax.text(-80, -75, self.ccd_id[3]) # Lower left CCD
|
|
167
|
-
self.ax.text(60, -75, self.ccd_id[0]) # Lower right CCD
|
|
168
|
-
self.ax.text(60, 70, self.ccd_id[1]) # Upper right CCD
|
|
169
|
-
|
|
170
|
-
self.ax.text(-30, 10, self.fee_side.LEFT_SIDE.name, rotation=180) # Upper leftCCD, left side
|
|
171
|
-
self.ax.text(-75, 10, self.fee_side.RIGHT_SIDE.name, rotation=180) # Upper left CCD, right side
|
|
172
|
-
self.ax.text(-20, -15, self.fee_side.LEFT_SIDE.name, rotation=-90) # Lower left CCD, left side
|
|
173
|
-
self.ax.text(-20, -75, self.fee_side.RIGHT_SIDE.name, rotation=-90) # Lower left CCD, right side
|
|
174
|
-
self.ax.text(10, -15, self.fee_side.LEFT_SIDE.name) # Lower right CCD, left side
|
|
175
|
-
self.ax.text(50, -15, self.fee_side.RIGHT_SIDE.name) # Lower right CCD, right side
|
|
176
|
-
self.ax.text(10, 10, self.fee_side.LEFT_SIDE.name, rotation=90) # Upper right CCD, left side
|
|
177
|
-
self.ax.text(10, 50, self.fee_side.RIGHT_SIDE.name, rotation=90) # Upper right CCD, right side
|
|
178
|
-
|
|
179
|
-
self.ax.plot([-ZEROPOINT[0], ZEROPOINT[1], ZEROPOINT[1], -ZEROPOINT[0], -ZEROPOINT[0]],
|
|
180
|
-
[ZEROPOINT[0], ZEROPOINT[0], -ZEROPOINT[1], -ZEROPOINT[1], ZEROPOINT[0]],
|
|
181
|
-
color="k", linewidth=1) # Upper left CCD
|
|
182
|
-
self.ax.plot([-ZEROPOINT[0], ZEROPOINT[1], ZEROPOINT[1], -ZEROPOINT[0], -ZEROPOINT[0]],
|
|
183
|
-
[-ZEROPOINT[0], - ZEROPOINT[0], ZEROPOINT[1], ZEROPOINT[1], -ZEROPOINT[0]],
|
|
184
|
-
color="k", linewidth=1) # Lower left CCD
|
|
185
|
-
self.ax.plot([-ZEROPOINT[1], ZEROPOINT[0], ZEROPOINT[0], -ZEROPOINT[1], -ZEROPOINT[1]],
|
|
186
|
-
[-ZEROPOINT[0], - ZEROPOINT[0], ZEROPOINT[1], ZEROPOINT[1], -ZEROPOINT[0]],
|
|
187
|
-
color="k", linewidth=1) # Lower right CCD
|
|
188
|
-
self.ax.plot([-ZEROPOINT[1], ZEROPOINT[0], ZEROPOINT[0], -ZEROPOINT[1], -ZEROPOINT[1]],
|
|
189
|
-
[ZEROPOINT[0], ZEROPOINT[0], -ZEROPOINT[1], -ZEROPOINT[1], ZEROPOINT[0]],
|
|
190
|
-
color="k", linewidth=1) # Upper right CCD
|
|
191
|
-
|
|
192
|
-
# Grid lines
|
|
193
|
-
|
|
194
|
-
self.ax.grid(color="lightgray", linewidth=0.5)
|
|
195
|
-
|
|
196
|
-
ticks = np.arange(-80, 90, 20)
|
|
197
|
-
ticks = np.delete(ticks, 4)
|
|
198
|
-
self.ax.set_xticks(ticks)
|
|
199
|
-
self.ax.set_yticks(ticks)
|
|
200
|
-
|
|
201
|
-
def change_to_pixel_coordinates(self):
|
|
202
|
-
|
|
203
|
-
"""
|
|
204
|
-
Preparation of the plot to show the source position in pixel coordinates:
|
|
205
|
-
|
|
206
|
-
- clear the plot;
|
|
207
|
-
- draw a blue circle, indicating the size of the field-of view;
|
|
208
|
-
- configure the axes and grid lines;
|
|
209
|
-
- draw the CCDs and their readout registers;
|
|
210
|
-
- add the CCD codes.
|
|
211
|
-
|
|
212
|
-
The draw() method should be called in the sub-classes.
|
|
213
|
-
"""
|
|
214
|
-
|
|
215
|
-
self.coordinate_system = COORDINATE_SYSTEMS["Pixels"]
|
|
216
|
-
|
|
217
|
-
self.figure.delaxes(self.ax)
|
|
218
|
-
self.ax = self.figure.add_subplot(111)
|
|
219
|
-
self.ax.set_aspect(1)
|
|
220
|
-
|
|
221
|
-
# Circle indicating the size of the FOV [mm]
|
|
222
|
-
|
|
223
|
-
self.circle = plt.Circle(
|
|
224
|
-
(0, 0), FOV_SETTINGS.RADIUS_PIXELS, color='b', fill=False, label="FOV", linewidth=1)
|
|
225
|
-
self.ax.add_artist(self.circle)
|
|
226
|
-
|
|
227
|
-
# Range
|
|
228
|
-
# If we do it like this, the circle will have the same size on screen when
|
|
229
|
-
# switching between coordinate systems
|
|
230
|
-
|
|
231
|
-
limit = 85 / PIXEL_SIZE
|
|
232
|
-
self.ax.set_xlim([-limit, limit])
|
|
233
|
-
self.ax.set_ylim([-limit, limit])
|
|
234
|
-
|
|
235
|
-
self.ax.set_xlabel("$x_{CCD} [pixels]$", fontsize=10)
|
|
236
|
-
self.ax.xaxis.set_label_coords(1.085, 0.45)
|
|
237
|
-
self.ax.set_ylabel("$y_{CCD} [pixels]$", fontsize=10, rotation=0)
|
|
238
|
-
self.ax.yaxis.set_label_coords(0.47, 1.05)
|
|
239
|
-
|
|
240
|
-
# Make sure the axes cross at the origin
|
|
241
|
-
|
|
242
|
-
self.ax.axvline(x=0, color="k", linewidth=1)
|
|
243
|
-
self.ax.axhline(y=0, color="k", linewidth=1)
|
|
244
|
-
|
|
245
|
-
self.ax.spines['left'].set_position('center')
|
|
246
|
-
self.ax.spines['bottom'].set_position('center')
|
|
247
|
-
self.ax.spines['right'].set_color('none')
|
|
248
|
-
self.ax.spines['top'].set_color('none')
|
|
249
|
-
|
|
250
|
-
xmin, xmax = self.ax.get_xlim()
|
|
251
|
-
ymin, ymax = self.ax.get_ylim()
|
|
252
|
-
|
|
253
|
-
self.ax.arrow(xmin, 0, xmax-xmin+7/PIXEL_SIZE, 0., fc='k', ec='k', lw=1,
|
|
254
|
-
head_width=3/PIXEL_SIZE, head_length=5/PIXEL_SIZE,
|
|
255
|
-
length_includes_head=True, clip_on=False)
|
|
256
|
-
|
|
257
|
-
self.ax.arrow(0, ymin, 0., ymax-ymin+7/PIXEL_SIZE, fc='k', ec='k', lw=1,
|
|
258
|
-
head_width=3/PIXEL_SIZE, head_length=5/PIXEL_SIZE, overhang=0.3,
|
|
259
|
-
length_includes_head=True, clip_on=False)
|
|
260
|
-
|
|
261
|
-
# Readout registers
|
|
262
|
-
|
|
263
|
-
self.ax.plot([-ZEROPOINT[0] / PIXEL_SIZE, ZEROPOINT[1] / PIXEL_SIZE],
|
|
264
|
-
[-ZEROPOINT[1] / PIXEL_SIZE, -ZEROPOINT[1] / PIXEL_SIZE],
|
|
265
|
-
color="k", linewidth=3) # Upper left CCD
|
|
266
|
-
self.ax.plot([ZEROPOINT[1] / PIXEL_SIZE, ZEROPOINT[1] / PIXEL_SIZE],
|
|
267
|
-
[-ZEROPOINT[0] / PIXEL_SIZE, ZEROPOINT[1] / PIXEL_SIZE],
|
|
268
|
-
color="k", linewidth=3) # Lower left CCD
|
|
269
|
-
self.ax.plot([ZEROPOINT[0] / PIXEL_SIZE, -ZEROPOINT[1] / PIXEL_SIZE],
|
|
270
|
-
[ZEROPOINT[1] / PIXEL_SIZE, ZEROPOINT[1] / PIXEL_SIZE],
|
|
271
|
-
color="k", linewidth=3) # Lower right CCD
|
|
272
|
-
self.ax.plot([-ZEROPOINT[1] / PIXEL_SIZE, -ZEROPOINT[1] / PIXEL_SIZE],
|
|
273
|
-
[ZEROPOINT[0] / PIXEL_SIZE, -ZEROPOINT[1] / PIXEL_SIZE],
|
|
274
|
-
color="k", linewidth=3) # Upper right CCD
|
|
275
|
-
|
|
276
|
-
# CCD middle
|
|
277
|
-
|
|
278
|
-
self.ax.plot([ZEROPOINT[0] / PIXEL_SIZE - NUM_COLUMNS / 2, ZEROPOINT[0] / PIXEL_SIZE - NUM_COLUMNS / 2],
|
|
279
|
-
[-ZEROPOINT[0] / PIXEL_SIZE, ZEROPOINT[1] / PIXEL_SIZE],
|
|
280
|
-
color="k", linewidth=1, linestyle="dotted") # Upper left CCD
|
|
281
|
-
self.ax.plot([-ZEROPOINT[1] / PIXEL_SIZE, ZEROPOINT[0] / PIXEL_SIZE],
|
|
282
|
-
[ZEROPOINT[0] / PIXEL_SIZE - NUM_COLUMNS / 2, ZEROPOINT[0] / PIXEL_SIZE - NUM_COLUMNS / 2],
|
|
283
|
-
color="k", linewidth=1, linestyle="dotted") # Lower left CCD
|
|
284
|
-
self.ax.plot([-ZEROPOINT[0] / PIXEL_SIZE + NUM_COLUMNS / 2, -ZEROPOINT[0] / PIXEL_SIZE + NUM_COLUMNS / 2],
|
|
285
|
-
[-ZEROPOINT[1] / PIXEL_SIZE, ZEROPOINT[0] / PIXEL_SIZE],
|
|
286
|
-
color="k", linewidth=1, linestyle="dotted") # Lower right CCD
|
|
287
|
-
self.ax.plot([-ZEROPOINT[0] / PIXEL_SIZE, ZEROPOINT[1] / PIXEL_SIZE],
|
|
288
|
-
[-ZEROPOINT[0] / PIXEL_SIZE + NUM_COLUMNS / 2, -ZEROPOINT[0] / PIXEL_SIZE + NUM_COLUMNS / 2],
|
|
289
|
-
color="k", linewidth=1, linestyle="dotted") # Upper right CCD
|
|
290
|
-
|
|
291
|
-
# CCD codes
|
|
292
|
-
|
|
293
|
-
self.ax.text(-80 / PIXEL_SIZE, 70 / PIXEL_SIZE, self.ccd_id[2]) # Upper left CCD
|
|
294
|
-
self.ax.text(-80 / PIXEL_SIZE, -75 / PIXEL_SIZE, self.ccd_id[3]) # Lower left CCD
|
|
295
|
-
self.ax.text(60 / PIXEL_SIZE, -75 / PIXEL_SIZE, self.ccd_id[0]) # Lower right CCD
|
|
296
|
-
self.ax.text(60 / PIXEL_SIZE, 70 / PIXEL_SIZE, self.ccd_id[1]) # Upper right CCD
|
|
297
|
-
|
|
298
|
-
self.ax.text(-30 / PIXEL_SIZE, 10 / PIXEL_SIZE, self.fee_side.LEFT_SIDE.name, rotation=180) # Upper left CCD, left side
|
|
299
|
-
self.ax.text(-75 / PIXEL_SIZE, 10 / PIXEL_SIZE, self.fee_side.RIGHT_SIDE.name, rotation=180) # Upper left CCD, right side
|
|
300
|
-
self.ax.text(-20 / PIXEL_SIZE, -15 / PIXEL_SIZE, self.fee_side.LEFT_SIDE.name, rotation=-90) # Lower left CCD, left side
|
|
301
|
-
self.ax.text(-20 / PIXEL_SIZE, -75 / PIXEL_SIZE, self.fee_side.RIGHT_SIDE.name, rotation=-90) # Lower left CCD, right side
|
|
302
|
-
self.ax.text(10 / PIXEL_SIZE, -15 / PIXEL_SIZE, self.fee_side.LEFT_SIDE.name) # Lower right CCD, left side
|
|
303
|
-
self.ax.text(50 / PIXEL_SIZE, -15 / PIXEL_SIZE, self.fee_side.RIGHT_SIDE.name) # Lower right CCD, right side
|
|
304
|
-
self.ax.text(10 / PIXEL_SIZE, 10 / PIXEL_SIZE, self.fee_side.LEFT_SIDE.name, rotation=90) # Upper right CCD, left side
|
|
305
|
-
self.ax.text(10 / PIXEL_SIZE, 50 / PIXEL_SIZE, self.fee_side.RIGHT_SIDE.name, rotation=90) # Upper right CCD, right side
|
|
306
|
-
|
|
307
|
-
self.ax.plot([-ZEROPOINT[0] / PIXEL_SIZE, ZEROPOINT[1] / PIXEL_SIZE, ZEROPOINT[1] / PIXEL_SIZE, -ZEROPOINT[0] / PIXEL_SIZE, -ZEROPOINT[0] / PIXEL_SIZE],
|
|
308
|
-
[ZEROPOINT[0] / PIXEL_SIZE, ZEROPOINT[0] / PIXEL_SIZE, -ZEROPOINT[1] / PIXEL_SIZE, -ZEROPOINT[1] / PIXEL_SIZE, ZEROPOINT[0] / PIXEL_SIZE],
|
|
309
|
-
color="k", linewidth=1) # Upper left CCD
|
|
310
|
-
self.ax.plot([-ZEROPOINT[0] / PIXEL_SIZE, ZEROPOINT[1] / PIXEL_SIZE, ZEROPOINT[1] / PIXEL_SIZE, -ZEROPOINT[0] / PIXEL_SIZE, -ZEROPOINT[0] / PIXEL_SIZE],
|
|
311
|
-
[-ZEROPOINT[0] / PIXEL_SIZE, -ZEROPOINT[0] / PIXEL_SIZE, ZEROPOINT[1] / PIXEL_SIZE, ZEROPOINT[1] / PIXEL_SIZE, -ZEROPOINT[0] / PIXEL_SIZE],
|
|
312
|
-
color="k", linewidth=1) # Lower left CCD
|
|
313
|
-
self.ax.plot([-ZEROPOINT[1] / PIXEL_SIZE, ZEROPOINT[0] / PIXEL_SIZE, ZEROPOINT[0] / PIXEL_SIZE, -ZEROPOINT[1] / PIXEL_SIZE, -ZEROPOINT[1] / PIXEL_SIZE],
|
|
314
|
-
[-ZEROPOINT[0] / PIXEL_SIZE, -ZEROPOINT[0] / PIXEL_SIZE, ZEROPOINT[1] / PIXEL_SIZE, ZEROPOINT[1] / PIXEL_SIZE, -ZEROPOINT[0] / PIXEL_SIZE],
|
|
315
|
-
color="k", linewidth=1) # Lower right CCD
|
|
316
|
-
self.ax.plot([-ZEROPOINT[1] / PIXEL_SIZE, ZEROPOINT[0] / PIXEL_SIZE, ZEROPOINT[0] / PIXEL_SIZE, -ZEROPOINT[1] / PIXEL_SIZE, -ZEROPOINT[1] / PIXEL_SIZE],
|
|
317
|
-
[ZEROPOINT[0] / PIXEL_SIZE, ZEROPOINT[0] / PIXEL_SIZE, -ZEROPOINT[1] / PIXEL_SIZE, -ZEROPOINT[1] / PIXEL_SIZE, ZEROPOINT[0] / PIXEL_SIZE],
|
|
318
|
-
color="k", linewidth=1) # Upper right CCD
|
|
319
|
-
|
|
320
|
-
# Grid lines
|
|
321
|
-
|
|
322
|
-
ticks = np.arange(-4000, 5000, 1000)
|
|
323
|
-
ticks = np.delete(ticks, 4)
|
|
324
|
-
self.ax.set_xticks(ticks)
|
|
325
|
-
self.ax.set_yticks(ticks)
|
|
326
|
-
self.ax.grid(color="lightgray", linewidth=0.5)
|
|
327
|
-
|
|
328
|
-
def change_to_angle_coordinates(self):
|
|
329
|
-
|
|
330
|
-
"""
|
|
331
|
-
Preparation of the plot to show the source position in angle coordinates:
|
|
332
|
-
|
|
333
|
-
- clear the plot;
|
|
334
|
-
- draw a blue circle, indicating the size of the field-of view;
|
|
335
|
-
- configure the axes and grid lines;
|
|
336
|
-
- draw the CCDs and their readout registers;
|
|
337
|
-
- add the CCD codes.
|
|
338
|
-
|
|
339
|
-
The draw() method should be called in the sub-classes.
|
|
340
|
-
"""
|
|
341
|
-
|
|
342
|
-
self.coordinate_system = COORDINATE_SYSTEMS["Angles"]
|
|
343
|
-
|
|
344
|
-
self.figure.delaxes(self.ax)
|
|
345
|
-
self.ax = self.figure.add_subplot(111, projection="polar")
|
|
346
|
-
self.ax.set_aspect(1)
|
|
347
|
-
|
|
348
|
-
# Circle indicating the size of the FOV [mm]
|
|
349
|
-
|
|
350
|
-
self.circle = plt.Circle(
|
|
351
|
-
(0, 0), FOV_SETTINGS.RADIUS_DEGREES, color='b', fill=False, label="FOV", linewidth=1,
|
|
352
|
-
transform=self.ax.transData._b)
|
|
353
|
-
self.ax.add_artist(self.circle)
|
|
354
|
-
|
|
355
|
-
# Range
|
|
356
|
-
# If we do it like this, the circle will have the same size on screen when
|
|
357
|
-
# switching between coordinate systems
|
|
358
|
-
|
|
359
|
-
limit = degrees(atan(85 / FOV_SETTINGS.FOCAL_LENGTH))
|
|
360
|
-
|
|
361
|
-
self.ax.set_rlim([0, limit])
|
|
362
|
-
|
|
363
|
-
# CCD codes
|
|
364
|
-
|
|
365
|
-
theta, phi = focal_plane_coordinates_to_angles(-30, 10)
|
|
366
|
-
self.ax.text(radians(phi), theta, self.fee_side.LEFT_SIDE.name, rotation=180) # Upper left CCD, left side
|
|
367
|
-
theta, phi = focal_plane_coordinates_to_angles(-75, 10)
|
|
368
|
-
self.ax.text(radians(phi), theta, self.fee_side.RIGHT_SIDE.name, rotation=180) # Upper left CCD, right side
|
|
369
|
-
theta, phi = focal_plane_coordinates_to_angles(-20, -15)
|
|
370
|
-
self.ax.text(radians(phi), theta, self.fee_side.LEFT_SIDE.name, rotation=-90) # Lower left CCD, left side
|
|
371
|
-
theta, phi = focal_plane_coordinates_to_angles(-20, -75)
|
|
372
|
-
self.ax.text(radians(phi), theta, self.fee_side.RIGHT_SIDE.name, rotation=-90) # Lower left CCD, right side
|
|
373
|
-
theta, phi = focal_plane_coordinates_to_angles(10, -15)
|
|
374
|
-
self.ax.text(radians(phi), theta, self.fee_side.LEFT_SIDE.name) # Lower right CCD, left side
|
|
375
|
-
theta, phi = focal_plane_coordinates_to_angles(50, -15)
|
|
376
|
-
self.ax.text(radians(phi), theta, self.fee_side.RIGHT_SIDE.name) # Lower right CCD, right side
|
|
377
|
-
theta, phi = focal_plane_coordinates_to_angles(10, 10)
|
|
378
|
-
self.ax.text(radians(phi), theta, self.fee_side.LEFT_SIDE.name, rotation=90) # Upper right CCD, left side
|
|
379
|
-
theta, phi = focal_plane_coordinates_to_angles(10, 50)
|
|
380
|
-
self.ax.text(radians(phi), theta, self.fee_side.RIGHT_SIDE.name, rotation=90) # Upper right CCD, right side
|
|
381
|
-
|
|
382
|
-
self.ax.text(radians(135), 22, self.ccd_id[2], ha="center") # Upper left CCD
|
|
383
|
-
self.ax.text(radians(-135), 22, self.ccd_id[3], ha="center", va="top") # Lower left CCD
|
|
384
|
-
self.ax.text(radians(-45), 22, self.ccd_id[0], ha="center", va="top") # Lower right CCD
|
|
385
|
-
self.ax.text(radians(45), 22, self.ccd_id[1], ha="center") # Upper right CCD
|
|
386
|
-
|
|
387
|
-
(theta1_ccd1, phi1_ccd1) = focal_plane_coordinates_to_angles(-ZEROPOINT[0], -ZEROPOINT[1])
|
|
388
|
-
(theta2_ccd1, phi2_ccd1) = focal_plane_coordinates_to_angles(ZEROPOINT[1], -ZEROPOINT[1])
|
|
389
|
-
(theta3_ccd1, phi3_ccd1) = focal_plane_coordinates_to_angles(ZEROPOINT[1], ZEROPOINT[0])
|
|
390
|
-
(theta4_ccd1, phi4_ccd1) = focal_plane_coordinates_to_angles(-ZEROPOINT[0], ZEROPOINT[0])
|
|
391
|
-
|
|
392
|
-
phi1_ccd1 = radians(phi1_ccd1)
|
|
393
|
-
phi2_ccd1 = radians(phi2_ccd1)
|
|
394
|
-
phi3_ccd1 = radians(phi3_ccd1)
|
|
395
|
-
phi4_ccd1 = radians(phi4_ccd1)
|
|
396
|
-
|
|
397
|
-
self.ax.plot([phi1_ccd1, phi2_ccd1], [theta1_ccd1, theta2_ccd1], color="k", linewidth=3)
|
|
398
|
-
self.ax.plot([phi1_ccd1, phi2_ccd1, phi3_ccd1, phi4_ccd1, phi1_ccd1],
|
|
399
|
-
[theta1_ccd1, theta2_ccd1, theta3_ccd1, theta4_ccd1, theta1_ccd1], color="k", linewidth=1)
|
|
400
|
-
|
|
401
|
-
(theta1_ccd2, phi1_ccd2) = focal_plane_coordinates_to_angles(ZEROPOINT[1], -ZEROPOINT[0])
|
|
402
|
-
(theta2_ccd2, phi2_ccd2) = focal_plane_coordinates_to_angles(ZEROPOINT[1], ZEROPOINT[1])
|
|
403
|
-
(theta3_ccd2, phi3_ccd2) = focal_plane_coordinates_to_angles(-ZEROPOINT[0], ZEROPOINT[1])
|
|
404
|
-
(theta4_ccd2, phi4_ccd2) = focal_plane_coordinates_to_angles(-ZEROPOINT[0], -ZEROPOINT[0])
|
|
405
|
-
|
|
406
|
-
phi1_ccd2 = radians(phi1_ccd2)
|
|
407
|
-
phi2_ccd2 = radians(phi2_ccd2)
|
|
408
|
-
phi3_ccd2 = radians(phi3_ccd2)
|
|
409
|
-
phi4_ccd2 = radians(phi4_ccd2)
|
|
410
|
-
|
|
411
|
-
self.ax.plot([phi1_ccd2, phi2_ccd2], [theta1_ccd2, theta2_ccd2], color="k", linewidth=3)
|
|
412
|
-
self.ax.plot([phi1_ccd2, phi2_ccd2, phi3_ccd2, phi4_ccd2, phi1_ccd2],
|
|
413
|
-
[theta1_ccd2, theta2_ccd2, theta3_ccd2, theta4_ccd2, theta1_ccd2], color="k", linewidth=1)
|
|
414
|
-
|
|
415
|
-
(theta1_ccd3, phi1_ccd3) = focal_plane_coordinates_to_angles(ZEROPOINT[0], ZEROPOINT[1])
|
|
416
|
-
(theta2_ccd3, phi2_ccd3) = focal_plane_coordinates_to_angles(-ZEROPOINT[1], ZEROPOINT[1])
|
|
417
|
-
(theta3_ccd3, phi3_ccd3) = focal_plane_coordinates_to_angles(-ZEROPOINT[1], -ZEROPOINT[0])
|
|
418
|
-
(theta4_ccd3, phi4_ccd3) = focal_plane_coordinates_to_angles(ZEROPOINT[0], -ZEROPOINT[0])
|
|
419
|
-
|
|
420
|
-
phi1_ccd3 = radians(phi1_ccd3)
|
|
421
|
-
phi2_ccd3 = radians(phi2_ccd3)
|
|
422
|
-
phi3_ccd3 = radians(phi3_ccd3)
|
|
423
|
-
phi4_ccd3 = radians(phi4_ccd3)
|
|
424
|
-
|
|
425
|
-
self.ax.plot([phi1_ccd3, phi2_ccd3], [theta1_ccd3, theta2_ccd3], color="k", linewidth=3)
|
|
426
|
-
self.ax.plot([phi1_ccd3, phi2_ccd3, phi3_ccd3, phi4_ccd3, phi1_ccd3],
|
|
427
|
-
[theta1_ccd3, theta2_ccd3, theta3_ccd3, theta4_ccd3, theta1_ccd3], color="k", linewidth=1)
|
|
428
|
-
|
|
429
|
-
(theta1_ccd4, phi1_ccd4) = focal_plane_coordinates_to_angles(-ZEROPOINT[1], ZEROPOINT[0])
|
|
430
|
-
(theta2_ccd4, phi2_ccd4) = focal_plane_coordinates_to_angles(-ZEROPOINT[1], -ZEROPOINT[1])
|
|
431
|
-
(theta3_ccd4, phi3_ccd4) = focal_plane_coordinates_to_angles(ZEROPOINT[0], -ZEROPOINT[1])
|
|
432
|
-
(theta4_ccd4, phi4_ccd4) = focal_plane_coordinates_to_angles(ZEROPOINT[0], ZEROPOINT[0])
|
|
433
|
-
|
|
434
|
-
phi1_ccd4 = radians(phi1_ccd4)
|
|
435
|
-
phi2_ccd4 = radians(phi2_ccd4)
|
|
436
|
-
phi3_ccd4 = radians(phi3_ccd4)
|
|
437
|
-
phi4_ccd4 = radians(phi4_ccd4)
|
|
438
|
-
|
|
439
|
-
self.ax.plot([phi1_ccd4, phi2_ccd4], [theta1_ccd4, theta2_ccd4], color="k", linewidth=3)
|
|
440
|
-
self.ax.plot([phi1_ccd4, phi2_ccd4, phi3_ccd4, phi4_ccd4, phi1_ccd4],
|
|
441
|
-
[theta1_ccd4, theta2_ccd4, theta3_ccd4, theta4_ccd4, theta1_ccd4], color="k", linewidth=1)
|
|
442
|
-
|
|
443
|
-
# CCD middle
|
|
444
|
-
|
|
445
|
-
(theta1, phi1) = focal_plane_coordinates_to_angles((ZEROPOINT[1] - ZEROPOINT[0]) / 2, -ZEROPOINT[1])
|
|
446
|
-
(theta2, phi2) = focal_plane_coordinates_to_angles((ZEROPOINT[1] - ZEROPOINT[0]) / 2, ZEROPOINT[0])
|
|
447
|
-
phi1 = radians(phi1)
|
|
448
|
-
phi2 = radians(phi2)
|
|
449
|
-
self.ax.plot([phi1, phi2], [theta1, theta2], color="k", linewidth=1, linestyle="dotted") # Upper left CCD
|
|
450
|
-
|
|
451
|
-
(theta1, phi1) = focal_plane_coordinates_to_angles(ZEROPOINT[0], -(ZEROPOINT[1] - ZEROPOINT[0]) / 2)
|
|
452
|
-
(theta2, phi2) = focal_plane_coordinates_to_angles(-ZEROPOINT[1], -(ZEROPOINT[1] - ZEROPOINT[0]) / 2)
|
|
453
|
-
phi1 = radians(phi1)
|
|
454
|
-
phi2 = radians(phi2)
|
|
455
|
-
self.ax.plot([phi1, phi2], [theta1, theta2], color="k", linewidth=1, linestyle="dotted") # Lower left CCD
|
|
456
|
-
|
|
457
|
-
(theta1, phi1) = focal_plane_coordinates_to_angles(-(ZEROPOINT[1] - ZEROPOINT[0]) / 2, ZEROPOINT[1])
|
|
458
|
-
(theta2, phi2) = focal_plane_coordinates_to_angles(-(ZEROPOINT[1] - ZEROPOINT[0]) / 2, -ZEROPOINT[0])
|
|
459
|
-
phi1 = radians(phi1)
|
|
460
|
-
phi2 = radians(phi2)
|
|
461
|
-
self.ax.plot([phi1, phi2], [theta1, theta2], color="k", linewidth=1, linestyle="dotted") # Lower right CCD
|
|
462
|
-
|
|
463
|
-
(theta1, phi1) = focal_plane_coordinates_to_angles(-ZEROPOINT[0], (ZEROPOINT[1] - ZEROPOINT[0]) / 2)
|
|
464
|
-
(theta2, phi2) = focal_plane_coordinates_to_angles(ZEROPOINT[1], (ZEROPOINT[1] - ZEROPOINT[0]) / 2)
|
|
465
|
-
phi1 = radians(phi1)
|
|
466
|
-
phi2 = radians(phi2)
|
|
467
|
-
self.ax.plot([phi1, phi2], [theta1, theta2], color="k", linewidth=1, linestyle="dotted") # Uoper right CCD
|
|
468
|
-
|
|
469
|
-
# Grid lines
|
|
470
|
-
|
|
471
|
-
tick = [self.ax.get_rmax(), self.ax.get_rmax() * 0.]
|
|
472
|
-
for t in np.deg2rad(np.arange(0, 360, 15)):
|
|
473
|
-
self.ax.plot([t, t], tick, lw=0.72, color="lightgray")
|
|
474
|
-
|
|
475
|
-
tick = [self.ax.get_rmax(), self.ax.get_rmax() * 0.]
|
|
476
|
-
for t in np.deg2rad(np.arange(0, 360, 45)):
|
|
477
|
-
self.ax.plot([t, t], tick, lw=0.72, color="k")
|
|
478
|
-
|
|
479
|
-
ticks = np.arange(2, 20, 2)
|
|
480
|
-
self.ax.set_rticks(ticks)
|
|
481
|
-
|
|
482
|
-
self.ax.yaxis.set_major_formatter(
|
|
483
|
-
ticker.FuncFormatter(degree_formatter))
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
class FocalPlaneWithSubField(FocalPlane):
|
|
487
|
-
|
|
488
|
-
"""
|
|
489
|
-
FigureCanvas showing the focal plane, with a blue circle indicating the field-of-view.
|
|
490
|
-
The available coordinate systems are:
|
|
491
|
-
- pixel coordinates [pixels],
|
|
492
|
-
- focal-plane coordinates [mm],
|
|
493
|
-
- and field angles [degrees].
|
|
494
|
-
|
|
495
|
-
Possibility to draw the position of the sub-field on the focal plane.
|
|
496
|
-
"""
|
|
497
|
-
|
|
498
|
-
def __init__(self):
|
|
499
|
-
|
|
500
|
-
"""
|
|
501
|
-
Initialisation of a plot of the focal plane, with a blue circle indicating the
|
|
502
|
-
field-of-view.
|
|
503
|
-
"""
|
|
504
|
-
|
|
505
|
-
super(FocalPlaneWithSubField, self).__init__()
|
|
506
|
-
|
|
507
|
-
self.subfield_is_drawn = False
|
|
508
|
-
self.ccd_code = None
|
|
509
|
-
self.zeropoint_row = None
|
|
510
|
-
self.zeropoint_column = None
|
|
511
|
-
self.num_rows = None
|
|
512
|
-
self.num_columns = None
|
|
513
|
-
|
|
514
|
-
self.change_to_pixel_coordinates()
|
|
515
|
-
|
|
516
|
-
def set_subfield(self, ccd_code=None, zeropoint_row=None, zeropoint_column=None, num_rows=None, num_columns=None):
|
|
517
|
-
|
|
518
|
-
"""
|
|
519
|
-
First-time drawing of the sub-field (in pixel coordinates). All information is stored in
|
|
520
|
-
variables and the sub-field is shown as a red rectangle on the focal plane.
|
|
521
|
-
|
|
522
|
-
:param ccd_code: Code of the CCD on which the sub-field is located.
|
|
523
|
-
|
|
524
|
-
:param zeropoint_row: Row coordinate of the origin of the sub-field in the CCD coordinate system
|
|
525
|
-
of the given CCD [pixels].
|
|
526
|
-
|
|
527
|
-
:param zeropoint_column: Column coordinate of the origin of the sub-field in the CCD coordinate system
|
|
528
|
-
of the given CCD [pixels].
|
|
529
|
-
|
|
530
|
-
:param num_rows: Number of rows in the sub-field [pixels].
|
|
531
|
-
|
|
532
|
-
:param num_columns: Number of columns in the sub-field [pixels].
|
|
533
|
-
"""
|
|
534
|
-
|
|
535
|
-
self.ccd_code = ccd_code
|
|
536
|
-
self.zeropoint_row = zeropoint_row
|
|
537
|
-
self.zeropoint_column = zeropoint_column
|
|
538
|
-
self.num_rows = num_rows
|
|
539
|
-
self.num_columns = num_columns
|
|
540
|
-
|
|
541
|
-
if self.coordinate_system == COORDINATE_SYSTEMS["Focal plane"]:
|
|
542
|
-
self.change_to_focal_plane_coordinates
|
|
543
|
-
elif self.coordinate_system == COORDINATE_SYSTEMS["Pixels"]:
|
|
544
|
-
self.change_to_pixel_coordinates()
|
|
545
|
-
elif self.coordinate_system == COORDINATE_SYSTEMS["Angles"]:
|
|
546
|
-
self.change_to_angle_coordinates()
|
|
547
|
-
|
|
548
|
-
def change_to_pixel_coordinates(self):
|
|
549
|
-
|
|
550
|
-
"""
|
|
551
|
-
Preparation of the plot to show the source position in pixel coordinates:
|
|
552
|
-
|
|
553
|
-
- clear the plot;
|
|
554
|
-
- draw a blue circle, indicating the size of the field-of view;
|
|
555
|
-
- configure the axes and grid lines;
|
|
556
|
-
- draw the CCDs and their readout registers;
|
|
557
|
-
- add the CCD codes;
|
|
558
|
-
|
|
559
|
-
and re-draw the sub-field (if any).
|
|
560
|
-
"""
|
|
561
|
-
|
|
562
|
-
super().change_to_pixel_coordinates()
|
|
563
|
-
self.subfield_is_drawn = False
|
|
564
|
-
|
|
565
|
-
self.update_subfield()
|
|
566
|
-
|
|
567
|
-
self.draw()
|
|
568
|
-
|
|
569
|
-
def change_to_focal_plane_coordinates(self):
|
|
570
|
-
|
|
571
|
-
"""
|
|
572
|
-
Preparation of the plot to show the source position in focal-plane coordinates:
|
|
573
|
-
|
|
574
|
-
- clear the plot;
|
|
575
|
-
- draw a blue circle, indicating the size of the field-of view;
|
|
576
|
-
- configure the axes and grid lines;
|
|
577
|
-
- draw the CCDs and their readout registers;
|
|
578
|
-
- add the CCD codes;
|
|
579
|
-
|
|
580
|
-
and re-draw the sub-field (if any).
|
|
581
|
-
"""
|
|
582
|
-
|
|
583
|
-
super().change_to_focal_plane_coordinates()
|
|
584
|
-
self.subfield_is_drawn = False
|
|
585
|
-
|
|
586
|
-
self.update_subfield()
|
|
587
|
-
|
|
588
|
-
self.draw()
|
|
589
|
-
|
|
590
|
-
def change_to_angle_coordinates(self):
|
|
591
|
-
|
|
592
|
-
"""
|
|
593
|
-
Preparation of the plot to show the source position in angle coordinates:
|
|
594
|
-
|
|
595
|
-
- clear the plot;
|
|
596
|
-
- draw a blue circle, indicating the size of the field-of view;
|
|
597
|
-
- configure the axes and grid lines;
|
|
598
|
-
- draw the CCDs and their readout registers;
|
|
599
|
-
- add the CCD codes;
|
|
600
|
-
|
|
601
|
-
and re-draw the sub-field (if any).
|
|
602
|
-
"""
|
|
603
|
-
|
|
604
|
-
super().change_to_angle_coordinates()
|
|
605
|
-
self.subfield_is_drawn = False
|
|
606
|
-
|
|
607
|
-
self.update_subfield()
|
|
608
|
-
|
|
609
|
-
self.draw()
|
|
610
|
-
|
|
611
|
-
def update_subfield(self):
|
|
612
|
-
|
|
613
|
-
# Remove the sub-field (if needed)
|
|
614
|
-
|
|
615
|
-
if self.subfield_is_drawn:
|
|
616
|
-
|
|
617
|
-
self.ax.lines[-1].remove()
|
|
618
|
-
self.subfield_is_drawn = False
|
|
619
|
-
|
|
620
|
-
if self.ccd_code is None:
|
|
621
|
-
self.draw()
|
|
622
|
-
return
|
|
623
|
-
|
|
624
|
-
# Draw the sub-field
|
|
625
|
-
|
|
626
|
-
(x_fp_1, y_fp_1) = ccd_to_focal_plane_coordinates(
|
|
627
|
-
self.zeropoint_row, self.zeropoint_column, self.ccd_code)
|
|
628
|
-
(x_fp_2, y_fp_2) = ccd_to_focal_plane_coordinates(
|
|
629
|
-
self.zeropoint_row + self.num_rows, self.zeropoint_column, self.ccd_code)
|
|
630
|
-
(x_fp_3, y_fp_3) = ccd_to_focal_plane_coordinates(
|
|
631
|
-
self.zeropoint_row + self.num_rows, self.zeropoint_column + self.num_columns, self.ccd_code)
|
|
632
|
-
(x_fp_4, y_fp_4) = ccd_to_focal_plane_coordinates(
|
|
633
|
-
self.zeropoint_row, self.zeropoint_column + self.num_columns, self.ccd_code)
|
|
634
|
-
|
|
635
|
-
if self.coordinate_system == COORDINATE_SYSTEMS["Focal plane"]:
|
|
636
|
-
|
|
637
|
-
self.ax.plot([x_fp_1, x_fp_2], [y_fp_1, y_fp_2], "r-")
|
|
638
|
-
self.ax.plot([x_fp_2, x_fp_3], [y_fp_2, y_fp_3], "r-")
|
|
639
|
-
self.ax.plot([x_fp_3, x_fp_4], [y_fp_3, y_fp_4], "r-")
|
|
640
|
-
self.ax.plot([x_fp_4, x_fp_1], [y_fp_4, y_fp_1], "r-")
|
|
641
|
-
|
|
642
|
-
elif self.coordinate_system == COORDINATE_SYSTEMS["Pixels"]:
|
|
643
|
-
|
|
644
|
-
self.ax.plot([x_fp_1 / PIXEL_SIZE, x_fp_2 / PIXEL_SIZE], [y_fp_1 / PIXEL_SIZE, y_fp_2 / PIXEL_SIZE], "r-")
|
|
645
|
-
self.ax.plot([x_fp_2 / PIXEL_SIZE, x_fp_3 / PIXEL_SIZE], [y_fp_2 / PIXEL_SIZE, y_fp_3 / PIXEL_SIZE], "r-")
|
|
646
|
-
self.ax.plot([x_fp_3 / PIXEL_SIZE, x_fp_4 / PIXEL_SIZE], [y_fp_3 / PIXEL_SIZE, y_fp_4 / PIXEL_SIZE], "r-")
|
|
647
|
-
self.ax.plot([x_fp_4 / PIXEL_SIZE, x_fp_1 / PIXEL_SIZE], [y_fp_4 / PIXEL_SIZE, y_fp_1 / PIXEL_SIZE], "r-")
|
|
648
|
-
|
|
649
|
-
elif self.coordinate_system == COORDINATE_SYSTEMS["Angles"]:
|
|
650
|
-
|
|
651
|
-
(theta1, phi1) = focal_plane_coordinates_to_angles(x_fp_1, y_fp_1)
|
|
652
|
-
(theta2, phi2) = focal_plane_coordinates_to_angles(x_fp_2, y_fp_2)
|
|
653
|
-
(theta3, phi3) = focal_plane_coordinates_to_angles(x_fp_3, y_fp_3)
|
|
654
|
-
(theta4, phi4) = focal_plane_coordinates_to_angles(x_fp_4, y_fp_4)
|
|
655
|
-
|
|
656
|
-
phi1 = radians(phi1)
|
|
657
|
-
phi2 = radians(phi2)
|
|
658
|
-
phi3 = radians(phi3)
|
|
659
|
-
phi4 = radians(phi4)
|
|
660
|
-
|
|
661
|
-
self.ax.plot([phi1, phi2], [theta1, theta2], "r-")
|
|
662
|
-
self.ax.plot([phi2, phi3], [theta2, theta3], "r-")
|
|
663
|
-
self.ax.plot([phi3, phi4], [theta3, theta4], "r-")
|
|
664
|
-
self.ax.plot([phi4, phi1], [theta4, theta1], "r-")
|
|
665
|
-
|
|
666
|
-
self.subfield_is_drawn = True
|
|
667
|
-
|
|
668
|
-
self.draw()
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
class FocalPlaneWithSourcePosition(FocalPlane):
|
|
672
|
-
|
|
673
|
-
"""
|
|
674
|
-
FigureCanvas showing the focal plane, with a blue circle indicating the field-of-view.
|
|
675
|
-
The available coordinate systems are:
|
|
676
|
-
- pixel coordinates [pixels],
|
|
677
|
-
- focal-plane coordinates [mm],
|
|
678
|
-
- and field angles [degrees].
|
|
679
|
-
|
|
680
|
-
Possibility to draw the source position on the focal plane.
|
|
681
|
-
"""
|
|
682
|
-
|
|
683
|
-
def __init__(self):
|
|
684
|
-
|
|
685
|
-
"""
|
|
686
|
-
Initialisation of a plot of the focal plane, with a blue circle indicating the
|
|
687
|
-
field-of-view.
|
|
688
|
-
"""
|
|
689
|
-
|
|
690
|
-
super(FocalPlaneWithSourcePosition, self).__init__()
|
|
691
|
-
|
|
692
|
-
self.source_position_is_drawn = False
|
|
693
|
-
self.x_fp = None
|
|
694
|
-
self.y_fp = None
|
|
695
|
-
|
|
696
|
-
self.change_to_pixel_coordinates()
|
|
697
|
-
|
|
698
|
-
def change_to_pixel_coordinates(self):
|
|
699
|
-
|
|
700
|
-
"""
|
|
701
|
-
Preparation of the plot to show the source position in pixel coordinates:
|
|
702
|
-
|
|
703
|
-
- clear the plot;
|
|
704
|
-
- draw a blue circle, indicating the size of the field-of view;
|
|
705
|
-
- configure the axes and grid lines;
|
|
706
|
-
- draw the CCDs and their readout registers;
|
|
707
|
-
- add the CCD codes;
|
|
708
|
-
|
|
709
|
-
and re-draw the source position (if any).
|
|
710
|
-
"""
|
|
711
|
-
|
|
712
|
-
super().change_to_pixel_coordinates()
|
|
713
|
-
self.source_position_is_drawn = False
|
|
714
|
-
|
|
715
|
-
self.update_source_position(self.x_fp, self.y_fp)
|
|
716
|
-
|
|
717
|
-
self.draw()
|
|
718
|
-
|
|
719
|
-
def change_to_focal_plane_coordinates(self):
|
|
720
|
-
|
|
721
|
-
"""
|
|
722
|
-
Preparation of the plot to show the source position in focal-plane coordinates:
|
|
723
|
-
|
|
724
|
-
- clear the plot;
|
|
725
|
-
- draw a blue circle, indicating the size of the field-of view;
|
|
726
|
-
- configure the axes and grid lines;
|
|
727
|
-
- draw the CCDs and their readout registers;
|
|
728
|
-
- add the CCD codes;
|
|
729
|
-
|
|
730
|
-
and re-draw the source position (if any).
|
|
731
|
-
"""
|
|
732
|
-
|
|
733
|
-
super().change_to_focal_plane_coordinates()
|
|
734
|
-
self.source_position_is_drawn = False
|
|
735
|
-
|
|
736
|
-
self.update_source_position(self.x_fp, self.y_fp)
|
|
737
|
-
|
|
738
|
-
self.draw()
|
|
739
|
-
|
|
740
|
-
def change_to_angle_coordinates(self):
|
|
741
|
-
|
|
742
|
-
"""
|
|
743
|
-
Preparation of the plot to show the source position in angle coordinates:
|
|
744
|
-
|
|
745
|
-
- clear the plot;
|
|
746
|
-
- draw a blue circle, indicating the size of the field-of view;
|
|
747
|
-
- configure the axes and grid lines;
|
|
748
|
-
- draw the CCDs and their readout registers;
|
|
749
|
-
- add the CCD codes;
|
|
750
|
-
|
|
751
|
-
and re-draw the source position (if any).
|
|
752
|
-
"""
|
|
753
|
-
|
|
754
|
-
super().change_to_angle_coordinates()
|
|
755
|
-
self.source_position_is_drawn = False
|
|
756
|
-
|
|
757
|
-
self.update_source_position(self.x_fp, self.y_fp)
|
|
758
|
-
|
|
759
|
-
self.draw()
|
|
760
|
-
|
|
761
|
-
def update_source_position(self, x_fp, y_fp):
|
|
762
|
-
|
|
763
|
-
"""
|
|
764
|
-
Add a red dot at the position with the given focal-plane coordinates. In case
|
|
765
|
-
a source position had been marked before, that red dot must be removed first.
|
|
766
|
-
|
|
767
|
-
:param x_fp: Focal-plane x-coordinate of the new source position [mm].
|
|
768
|
-
|
|
769
|
-
:param y_fp: Focal-plane y-coordinate of the new source position [mm].
|
|
770
|
-
"""
|
|
771
|
-
|
|
772
|
-
# Remove the previously visited location (if needed)
|
|
773
|
-
|
|
774
|
-
if self.source_position_is_drawn:
|
|
775
|
-
|
|
776
|
-
self.ax.lines[-1].remove()
|
|
777
|
-
self.source_position_is_drawn = False
|
|
778
|
-
|
|
779
|
-
if (x_fp is None) or (y_fp is None):
|
|
780
|
-
return
|
|
781
|
-
|
|
782
|
-
# Outside the FOV
|
|
783
|
-
|
|
784
|
-
if abs(x_fp) > FOV_SETTINGS.RADIUS_MM and abs(y_fp) > FOV_SETTINGS.RADIUS_MM:
|
|
785
|
-
|
|
786
|
-
self.ax.plot([0], [0], color="white")
|
|
787
|
-
|
|
788
|
-
# Put a red dot at the new source position
|
|
789
|
-
|
|
790
|
-
if self.coordinate_system == COORDINATE_SYSTEMS["Focal plane"]:
|
|
791
|
-
|
|
792
|
-
self.ax.plot([x_fp], [y_fp], "ro")
|
|
793
|
-
|
|
794
|
-
elif self.coordinate_system == COORDINATE_SYSTEMS["Pixels"]:
|
|
795
|
-
|
|
796
|
-
self.ax.plot([x_fp / PIXEL_SIZE], [y_fp / PIXEL_SIZE], "ro")
|
|
797
|
-
|
|
798
|
-
elif self.coordinate_system == COORDINATE_SYSTEMS["Angles"]:
|
|
799
|
-
|
|
800
|
-
(theta, phi) = focal_plane_coordinates_to_angles(x_fp, y_fp)
|
|
801
|
-
|
|
802
|
-
self.ax.plot([radians(phi)], [theta], "ro")
|
|
803
|
-
|
|
804
|
-
self.source_position_is_drawn = True
|
|
805
|
-
self.x_fp = x_fp
|
|
806
|
-
self.y_fp = y_fp
|
|
807
|
-
|
|
808
|
-
self.draw()
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
class FocalPlaneWithVisitedPositions(FocalPlane):
|
|
812
|
-
|
|
813
|
-
"""
|
|
814
|
-
FigureCanvas showing the focal plane, with a blue circle indicating the field-of-view.
|
|
815
|
-
The available coordinate systems are:
|
|
816
|
-
- pixel coordinates [pixels],
|
|
817
|
-
- focal-plane coordinates [mm],
|
|
818
|
-
- and field angles [degrees].
|
|
819
|
-
|
|
820
|
-
Possibility to draw the visited positions of the sub-field on the focal plane.
|
|
821
|
-
"""
|
|
822
|
-
|
|
823
|
-
def __init__(self):
|
|
824
|
-
|
|
825
|
-
"""
|
|
826
|
-
Initialisation of a plot of the focal plane, with a blue circle indicating the
|
|
827
|
-
field-of-view.
|
|
828
|
-
"""
|
|
829
|
-
|
|
830
|
-
super(FocalPlaneWithVisitedPositions, self).__init__()
|
|
831
|
-
|
|
832
|
-
self.visited_x_fp = np.array([])
|
|
833
|
-
self.visited_y_fp = np.array([])
|
|
834
|
-
|
|
835
|
-
self.change_to_pixel_coordinates()
|
|
836
|
-
|
|
837
|
-
def change_to_pixel_coordinates(self):
|
|
838
|
-
|
|
839
|
-
"""
|
|
840
|
-
Preparation of the plot to show the source position in pixel coordinates:
|
|
841
|
-
|
|
842
|
-
- clear the plot;
|
|
843
|
-
- draw a blue circle, indicating the size of the field-of view;
|
|
844
|
-
- configure the axes and grid lines;
|
|
845
|
-
- draw the CCDs and their readout registers;
|
|
846
|
-
- add the CCD codes;
|
|
847
|
-
|
|
848
|
-
and re-draw the visited positions (if any).
|
|
849
|
-
"""
|
|
850
|
-
|
|
851
|
-
super().change_to_pixel_coordinates()
|
|
852
|
-
|
|
853
|
-
# Re-draw the visited positions in the new coordinate system
|
|
854
|
-
|
|
855
|
-
self.redraw_visited_positions()
|
|
856
|
-
|
|
857
|
-
self.draw()
|
|
858
|
-
|
|
859
|
-
def change_to_focal_plane_coordinates(self):
|
|
860
|
-
|
|
861
|
-
"""
|
|
862
|
-
Preparation of the plot to show the source position in focal-plane coordinates:
|
|
863
|
-
|
|
864
|
-
- clear the plot;
|
|
865
|
-
- draw a blue circle, indicating the size of the field-of view;
|
|
866
|
-
- configure the axes and grid lines;
|
|
867
|
-
- draw the CCDs and their readout registers;
|
|
868
|
-
- add the CCD codes;
|
|
869
|
-
|
|
870
|
-
and re-draw the visited postiions (if any).
|
|
871
|
-
"""
|
|
872
|
-
|
|
873
|
-
super().change_to_focal_plane_coordinates()
|
|
874
|
-
|
|
875
|
-
# Re-draw the visited positions in the new coordinate system
|
|
876
|
-
|
|
877
|
-
self.redraw_visited_positions()
|
|
878
|
-
|
|
879
|
-
self.draw()
|
|
880
|
-
|
|
881
|
-
def change_to_angle_coordinates(self):
|
|
882
|
-
|
|
883
|
-
"""
|
|
884
|
-
Preparation of the plot to show the source position in angle coordinates:
|
|
885
|
-
|
|
886
|
-
- clear the plot;
|
|
887
|
-
- draw a blue circle, indicating the size of the field-of view;
|
|
888
|
-
- configure the axes and grid lines;
|
|
889
|
-
- draw the CCDs and their readout registers;
|
|
890
|
-
- add the CCD codes;
|
|
891
|
-
|
|
892
|
-
and re-draw the visited positions (if any).
|
|
893
|
-
"""
|
|
894
|
-
|
|
895
|
-
super().change_to_angle_coordinates()
|
|
896
|
-
|
|
897
|
-
# Re-draw the visited positions in the new coordinate system
|
|
898
|
-
|
|
899
|
-
self.redraw_visited_positions()
|
|
900
|
-
|
|
901
|
-
self.draw()
|
|
902
|
-
|
|
903
|
-
def visit_position(self, x_fp, y_fp, redraw=False):
|
|
904
|
-
|
|
905
|
-
"""
|
|
906
|
-
Add a red dot at the position with the given focal-plane coordinates. If you are not
|
|
907
|
-
in re-drawing mode, keep track of this new position in the list of visited positions.
|
|
908
|
-
|
|
909
|
-
:param x: Focal-plane x-coordinate of the new visited position [mm].
|
|
910
|
-
|
|
911
|
-
:param y: Focal-plane y-coordinate of the new visited position [mm].
|
|
912
|
-
|
|
913
|
-
:param redraw: If False, the given position should not be added to the list of visited
|
|
914
|
-
positions (as it is already in there); otherwise, the list of visited
|
|
915
|
-
positions must be expanded with the given position.
|
|
916
|
-
"""
|
|
917
|
-
|
|
918
|
-
if len(self.visited_x_fp) > 0:
|
|
919
|
-
|
|
920
|
-
self.ax.lines[-1].set_color("blue")
|
|
921
|
-
|
|
922
|
-
# Outside the FOV
|
|
923
|
-
|
|
924
|
-
if abs(x_fp) > FOV_SETTINGS.RADIUS_MM and abs(y_fp) > FOV_SETTINGS.RADIUS_MM:
|
|
925
|
-
|
|
926
|
-
self.ax.plot([0], [0], color="white")
|
|
927
|
-
|
|
928
|
-
# Put a red dot at the new source position
|
|
929
|
-
|
|
930
|
-
if self.coordinate_system == COORDINATE_SYSTEMS["Focal plane"]:
|
|
931
|
-
|
|
932
|
-
self.ax.plot([x_fp], [y_fp], "ro")
|
|
933
|
-
|
|
934
|
-
elif self.coordinate_system == COORDINATE_SYSTEMS["Pixels"]:
|
|
935
|
-
|
|
936
|
-
self.ax.plot([x_fp / PIXEL_SIZE], [y_fp / PIXEL_SIZE], "ro")
|
|
937
|
-
|
|
938
|
-
elif self.coordinate_system == COORDINATE_SYSTEMS["Angles"]:
|
|
939
|
-
|
|
940
|
-
(theta, phi) = focal_plane_coordinates_to_angles(x_fp, y_fp)
|
|
941
|
-
|
|
942
|
-
self.ax.plot([radians(phi)], [theta], "ro")
|
|
943
|
-
|
|
944
|
-
if not redraw:
|
|
945
|
-
|
|
946
|
-
self.visited_x_fp = np.append(self.visited_x_fp, x_fp)
|
|
947
|
-
self.visited_y_fp = np.append(self.visited_y_fp, y_fp)
|
|
948
|
-
|
|
949
|
-
self.draw()
|
|
950
|
-
|
|
951
|
-
def redraw_visited_positions(self):
|
|
952
|
-
|
|
953
|
-
"""
|
|
954
|
-
Re-draw the visited positions in the current coordinate system.
|
|
955
|
-
"""
|
|
956
|
-
|
|
957
|
-
for (x_fp, y_fp) in zip(self.visited_x_fp, self.visited_y_fp):
|
|
958
|
-
self.visit_position(x_fp, y_fp, redraw=True)
|
|
959
|
-
|
|
960
|
-
def clear_visited_positions(self):
|
|
961
|
-
""" Clear all visited positions."""
|
|
962
|
-
|
|
963
|
-
num_points = len(self.visited_x_fp)
|
|
964
|
-
while num_points > 0:
|
|
965
|
-
# del self.ax.lines[-1] # TODO
|
|
966
|
-
self.ax.lines[-1].remove()
|
|
967
|
-
num_points -= 1
|
|
968
|
-
|
|
969
|
-
self.visited_x_fp = np.array([])
|
|
970
|
-
self.visited_y_fp = np.array([])
|
|
971
|
-
|
|
972
|
-
self.draw()
|
|
973
|
-
############################################
|
|
974
|
-
# Focal plane + combobox (coordinate system)
|
|
975
|
-
############################################
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
class FocalPlaneWidget(QGroupBox):
|
|
979
|
-
|
|
980
|
-
"""
|
|
981
|
-
Widget with a FigureCanvas (plot window) showing the focal plane, with a blue circle
|
|
982
|
-
indicating the field-of-view. Below the plot window, you can find a combobox to choose
|
|
983
|
-
the coordinate system to use in the plot. The available coordinate systems are:
|
|
984
|
-
- pixel coordinates [pixels],
|
|
985
|
-
- focal-plane coordinates [mm],
|
|
986
|
-
- and field angles [degrees].
|
|
987
|
-
"""
|
|
988
|
-
|
|
989
|
-
def __init__(self):
|
|
990
|
-
|
|
991
|
-
"""
|
|
992
|
-
Initialisation of a plot of the focal plane, with a blue circle indicating the
|
|
993
|
-
field-of-view. Below the plot you can find a spinner to choose the coordinate
|
|
994
|
-
system to be used in the plot.
|
|
995
|
-
"""
|
|
996
|
-
|
|
997
|
-
super(FocalPlaneWidget, self).__init__("Focal Plane")
|
|
998
|
-
|
|
999
|
-
self.setFont(FONT)
|
|
1000
|
-
|
|
1001
|
-
layout = QGridLayout()
|
|
1002
|
-
|
|
1003
|
-
# Focal plane
|
|
1004
|
-
|
|
1005
|
-
self.focal_plane = self.get_focal_plane()
|
|
1006
|
-
|
|
1007
|
-
# Combobox (coordinate system)
|
|
1008
|
-
|
|
1009
|
-
coordinate_system_combobox = QComboBox(self)
|
|
1010
|
-
coordinate_system_combobox.setFont(FONT)
|
|
1011
|
-
coordinate_system_combobox.addItem(COORDINATE_SYSTEMS["Pixels"])
|
|
1012
|
-
coordinate_system_combobox.addItem(COORDINATE_SYSTEMS["Angles"])
|
|
1013
|
-
coordinate_system_combobox.addItem(COORDINATE_SYSTEMS["Focal plane"])
|
|
1014
|
-
coordinate_system_combobox.currentTextChanged.connect(self.update_coordinate_system)
|
|
1015
|
-
|
|
1016
|
-
coordinate_label = QLabel("Coordinate system")
|
|
1017
|
-
coordinate_label.setFont(FONT)
|
|
1018
|
-
coordinate_label.setStatusTip("Coordinate system to use in the plot")
|
|
1019
|
-
|
|
1020
|
-
# Putting everything together
|
|
1021
|
-
|
|
1022
|
-
layout.addWidget(self.focal_plane)
|
|
1023
|
-
layout.addWidget(coordinate_label)
|
|
1024
|
-
layout.addWidget(coordinate_system_combobox)
|
|
1025
|
-
|
|
1026
|
-
self.setLayout(layout)
|
|
1027
|
-
|
|
1028
|
-
def update_coordinate_system(self, value):
|
|
1029
|
-
|
|
1030
|
-
"""
|
|
1031
|
-
Switch to the given coordinate system to use in the plot. Currently implemented are
|
|
1032
|
-
focal-plane coordinates, pixel coordinates, and field angles. This means that the plot
|
|
1033
|
-
needs to be cleared and re-built in the specified coordinate system.
|
|
1034
|
-
|
|
1035
|
-
:param value: Name of the coordinate system to switch to.
|
|
1036
|
-
"""
|
|
1037
|
-
|
|
1038
|
-
# Focal-plane coordinates
|
|
1039
|
-
|
|
1040
|
-
if value == COORDINATE_SYSTEMS["Focal plane"]:
|
|
1041
|
-
|
|
1042
|
-
self.focal_plane.change_to_focal_plane_coordinates()
|
|
1043
|
-
|
|
1044
|
-
# Field angles
|
|
1045
|
-
|
|
1046
|
-
elif value == COORDINATE_SYSTEMS["Angles"]:
|
|
1047
|
-
|
|
1048
|
-
self.focal_plane.change_to_angle_coordinates()
|
|
1049
|
-
|
|
1050
|
-
# Pixel coordinates
|
|
1051
|
-
|
|
1052
|
-
elif value == COORDINATE_SYSTEMS["Pixels"]:
|
|
1053
|
-
|
|
1054
|
-
self.focal_plane.change_to_pixel_coordinates()
|
|
1055
|
-
|
|
1056
|
-
def get_focal_plane(self):
|
|
1057
|
-
|
|
1058
|
-
"""
|
|
1059
|
-
Returns the widget with the focal plane only (so without the combobox to
|
|
1060
|
-
choose the coordinate system).
|
|
1061
|
-
|
|
1062
|
-
:return: Widget with the focal plane only (so without the combobox to
|
|
1063
|
-
choose the coordinate system).
|
|
1064
|
-
"""
|
|
1065
|
-
|
|
1066
|
-
return None
|
|
1067
|
-
|
|
1068
|
-
def change_to_focal_plane_coordinates(self):
|
|
1069
|
-
|
|
1070
|
-
"""
|
|
1071
|
-
Preparation of the plot to show the source position in focal-plane coordinates:
|
|
1072
|
-
|
|
1073
|
-
- clear the plot;
|
|
1074
|
-
- draw a blue circle, indicating the size of the field-of view;
|
|
1075
|
-
- configure the axes and grid lines;
|
|
1076
|
-
- draw the CCDs and their readout registers;
|
|
1077
|
-
- add the CCD codes.
|
|
1078
|
-
"""
|
|
1079
|
-
|
|
1080
|
-
self.focal_plane.change_to_focal_plane_coordinates()
|
|
1081
|
-
|
|
1082
|
-
def change_to_pixel_coordinates(self):
|
|
1083
|
-
|
|
1084
|
-
"""
|
|
1085
|
-
Preparation of the plot to show the source position in pixel coordinates:
|
|
1086
|
-
|
|
1087
|
-
- clear the plot;
|
|
1088
|
-
- draw a blue circle, indicating the size of the field-of view;
|
|
1089
|
-
- configure the axes and grid lines;
|
|
1090
|
-
- draw the CCDs and their readout registers;
|
|
1091
|
-
- add the CCD codes.
|
|
1092
|
-
"""
|
|
1093
|
-
|
|
1094
|
-
self.focal_plane.change_to_pixel_coordinates()
|
|
1095
|
-
|
|
1096
|
-
def change_to_angle_coordinates(self):
|
|
1097
|
-
|
|
1098
|
-
"""
|
|
1099
|
-
Preparation of the plot to show the source position in angle coordinates:
|
|
1100
|
-
|
|
1101
|
-
- clear the plot;
|
|
1102
|
-
- draw a blue circle, indicating the size of the field-of view;
|
|
1103
|
-
- configure the axes and grid lines;
|
|
1104
|
-
- draw the CCDs and their readout registers;
|
|
1105
|
-
- add the CCD codes.
|
|
1106
|
-
"""
|
|
1107
|
-
|
|
1108
|
-
self.focal_plane.change_to_angle_coordinates()
|
|
1109
|
-
|
|
1110
|
-
def get_widget(self):
|
|
1111
|
-
|
|
1112
|
-
"""
|
|
1113
|
-
Returns the widget itself.
|
|
1114
|
-
|
|
1115
|
-
:return: Widget itself.
|
|
1116
|
-
"""
|
|
1117
|
-
|
|
1118
|
-
return self
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
class FocalPlaneWidgetWithSubField(FocalPlaneWidget):
|
|
1122
|
-
|
|
1123
|
-
"""
|
|
1124
|
-
Widget with a FigureCanvas (plot window) showing the focal plane, with a blue circle
|
|
1125
|
-
indicating the field-of-view. Below the plot window, you can find a combobox to choose
|
|
1126
|
-
the coordinate system to use in the plot. The available coordinate systems are:
|
|
1127
|
-
- pixel coordinates [pixels],
|
|
1128
|
-
- focal-plane coordinates [mm],
|
|
1129
|
-
- and field angles [degrees].
|
|
1130
|
-
|
|
1131
|
-
Possibility to draw the position of the sub-field on the focal plane.
|
|
1132
|
-
"""
|
|
1133
|
-
|
|
1134
|
-
def __init__(self, ccd_code=None, zeropoint_row=None, zeropoint_column=None, num_rows=None, num_columns=None):
|
|
1135
|
-
|
|
1136
|
-
"""
|
|
1137
|
-
Initialisation of a plot of the focal plane, with a blue circle indicating the
|
|
1138
|
-
field-of-view. Below the plot you can find a spinner to choose the coordinate
|
|
1139
|
-
system to be used in the plot.
|
|
1140
|
-
|
|
1141
|
-
In the plot window, the position of tbe sub-field will be plotted.
|
|
1142
|
-
|
|
1143
|
-
:param ccd_code: Code of the CCD on which the sub-field is located.
|
|
1144
|
-
|
|
1145
|
-
:param zeropoint_row: Row coordinate of the origin of the sub-field in the CCD coordinate system
|
|
1146
|
-
of the given CCD [pixels].
|
|
1147
|
-
|
|
1148
|
-
:param zeropoint_column: Column coordinate of the origin of the sub-field in the CCD coordinate system
|
|
1149
|
-
of the given CCD [pixels].
|
|
1150
|
-
|
|
1151
|
-
:param num_rows: Number of rows in the sub-field [pixels].
|
|
1152
|
-
|
|
1153
|
-
:param num_columns: Number of columns in the sub-field [pixels].
|
|
1154
|
-
"""
|
|
1155
|
-
|
|
1156
|
-
super(FocalPlaneWidgetWithSubField, self).__init__()
|
|
1157
|
-
|
|
1158
|
-
self.setStatusTip(
|
|
1159
|
-
"Position of the sub-field on the focal plane, based on the FITS header")
|
|
1160
|
-
|
|
1161
|
-
self.focal_plane.set_subfield(ccd_code=ccd_code, zeropoint_row=zeropoint_row,
|
|
1162
|
-
zeropoint_column=zeropoint_column, num_rows=num_rows, num_columns=num_columns)
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
def get_focal_plane(self):
|
|
1166
|
-
|
|
1167
|
-
"""
|
|
1168
|
-
Returns the widget with the focal plane only (so without the combobox to
|
|
1169
|
-
choose the coordinate system).
|
|
1170
|
-
|
|
1171
|
-
:return: Widget with the focal plane only (so without the combobox to
|
|
1172
|
-
choose the coordinate system).
|
|
1173
|
-
"""
|
|
1174
|
-
|
|
1175
|
-
return FocalPlaneWithSubField()
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
class FocalPlaneWidgetWithSourcePosition(FocalPlaneWidget):
|
|
1179
|
-
|
|
1180
|
-
"""
|
|
1181
|
-
Widget with a FigureCanvas (plot window) showing the focal plane, with a blue circle
|
|
1182
|
-
indicating the field-of-view. Below the plot window, you can find a combobox to choose
|
|
1183
|
-
the coordinate system to use in the plot. The available coordinate systems are:
|
|
1184
|
-
- pixel coordinates [pixels],
|
|
1185
|
-
- focal-plane coordinates [mm],
|
|
1186
|
-
- and field angles [degrees].
|
|
1187
|
-
|
|
1188
|
-
Possibility to draw the source position on the focal plane.
|
|
1189
|
-
"""
|
|
1190
|
-
|
|
1191
|
-
def __init__(self):
|
|
1192
|
-
|
|
1193
|
-
"""
|
|
1194
|
-
Initialisation of a plot of the focal plane, with a blue circle indicating the
|
|
1195
|
-
field-of-view. Below the plot you can find a spinner to choose the coordinate
|
|
1196
|
-
system to be used in the plot.
|
|
1197
|
-
|
|
1198
|
-
In the plot window, the position of tbe sub-field will be plotted.
|
|
1199
|
-
"""
|
|
1200
|
-
|
|
1201
|
-
super(FocalPlaneWidgetWithSourcePosition, self).__init__()
|
|
1202
|
-
|
|
1203
|
-
self.setStatusTip(
|
|
1204
|
-
"Position of the source on the focal plane, based on the position of the mechanisms")
|
|
1205
|
-
|
|
1206
|
-
def update_source_position(self, x_fp, y_fp):
|
|
1207
|
-
|
|
1208
|
-
"""
|
|
1209
|
-
Add a red dot at the position with the given focal-plane coordinates. In case
|
|
1210
|
-
a source position had been marked before, that red dot must be removed first.
|
|
1211
|
-
|
|
1212
|
-
:param x_fp: Focal-plane x-coordinate of the new source position [mm].
|
|
1213
|
-
|
|
1214
|
-
:param y_fp: Focal-plane y-coordinate of the new source position [mm].
|
|
1215
|
-
"""
|
|
1216
|
-
|
|
1217
|
-
self.focal_plane.update_source_position(x_fp, y_fp)
|
|
1218
|
-
|
|
1219
|
-
def get_focal_plane(self):
|
|
1220
|
-
"""
|
|
1221
|
-
Returns the widget with the focal plane only (so without the combobox to
|
|
1222
|
-
choose the coordinate system).
|
|
1223
|
-
|
|
1224
|
-
:return: Widget with the focal plane only (so without the combobox to
|
|
1225
|
-
choose the coordinate system).
|
|
1226
|
-
"""
|
|
1227
|
-
|
|
1228
|
-
return FocalPlaneWithSourcePosition()
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
class FocalPlaneWidgetWithVisitedPositions(FocalPlaneWidget):
|
|
1232
|
-
|
|
1233
|
-
"""
|
|
1234
|
-
Widget with a FigureCanvas (plot window) showing the focal plane, with a blue circle
|
|
1235
|
-
indicating the field-of-view. Below the plot window, you can find a combobox to choose
|
|
1236
|
-
the coordinate system to use in the plot. The available coordinate systems are:
|
|
1237
|
-
- pixel coordinates [pixels],
|
|
1238
|
-
- focal-plane coordinates [mm],
|
|
1239
|
-
- and field angles [degrees].
|
|
1240
|
-
|
|
1241
|
-
Possibility to draw the visited positions on the focal plane.
|
|
1242
|
-
"""
|
|
1243
|
-
|
|
1244
|
-
def __init__(self):
|
|
1245
|
-
|
|
1246
|
-
"""
|
|
1247
|
-
Initialisation of a plot of the focal plane, with a blue circle indicating the
|
|
1248
|
-
field-of-view. Below the plot you can find a spinner to choose the coordinate
|
|
1249
|
-
system to be used in the plot.
|
|
1250
|
-
|
|
1251
|
-
In the plot window, the visited positions will be plotted.
|
|
1252
|
-
"""
|
|
1253
|
-
|
|
1254
|
-
super(FocalPlaneWidgetWithVisitedPositions, self).__init__()
|
|
1255
|
-
|
|
1256
|
-
self.setToolTip("Visited positions")
|
|
1257
|
-
|
|
1258
|
-
def visit_position(self, x_fp, y_fp):
|
|
1259
|
-
|
|
1260
|
-
"""
|
|
1261
|
-
Add a red dot at the position with the given focal-plane coordinates.
|
|
1262
|
-
|
|
1263
|
-
:param x: Focal-plane x-coordinate of the new visited position [mm].
|
|
1264
|
-
|
|
1265
|
-
:param y: Focal-plane y-coordinate of the new visited position [mm].
|
|
1266
|
-
"""
|
|
1267
|
-
|
|
1268
|
-
self.focal_plane.visit_position(x_fp, y_fp)
|
|
1269
|
-
|
|
1270
|
-
def get_focal_plane(self):
|
|
1271
|
-
|
|
1272
|
-
"""
|
|
1273
|
-
Returns the widget with the focal plane only (so without the combobox to
|
|
1274
|
-
choose the coordinate system).
|
|
1275
|
-
|
|
1276
|
-
:return: Widget with the focal plane only (so without the combobox to
|
|
1277
|
-
choose the coordinate system).
|
|
1278
|
-
"""
|
|
1279
|
-
|
|
1280
|
-
return FocalPlaneWithVisitedPositions()
|
|
1281
|
-
|
|
1282
|
-
def clear_visited_positions(self):
|
|
1283
|
-
""" Clear all visited positions."""
|
|
1284
|
-
|
|
1285
|
-
self.focal_plane.clear_visited_positions()
|