tomwer 1.3.26__py3-none-any.whl → 1.4.0__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.
- orangecontrib/tomwer/orange/managedprocess.py +1 -29
- orangecontrib/tomwer/orange/settings.py +2 -28
- orangecontrib/tomwer/tests/TestAcquisition.py +220 -0
- orangecontrib/tomwer/tutorials/append_raw_darks_and_flats_frames_to_NXtomos.ows +2 -2
- orangecontrib/tomwer/tutorials/copy_reduced_darks_and_flats_meth1.ows +1 -1
- orangecontrib/tomwer/tutorials/{icat_publication.ows → drac_publication.ows} +7 -21
- orangecontrib/tomwer/tutorials/id16b/ID16b_full_volume.ows +22 -0
- orangecontrib/tomwer/tutorials/id16b/ID16b_insitu.ows +302 -0
- orangecontrib/tomwer/tutorials/id16b/ID16b_normalization.ows +218 -0
- orangecontrib/tomwer/tutorials/simple_volume_to_slurm_reconstruction.ows +29 -24
- orangecontrib/tomwer/tutorials/test_cor.ows +19 -0
- orangecontrib/tomwer/tutorials/volume_casting_on_slurm.ows +54 -0
- orangecontrib/tomwer/widgets/__init__.py +3 -5
- orangecontrib/tomwer/widgets/cluster/FutureSupervisorOW.py +35 -54
- orangecontrib/tomwer/widgets/cluster/SlurmClusterOW.py +1 -31
- orangecontrib/tomwer/widgets/control/AdvancementOW.py +1 -29
- orangecontrib/tomwer/widgets/control/DataDiscoveryOW.py +5 -4
- orangecontrib/tomwer/widgets/control/DataListenerOW.py +1 -29
- orangecontrib/tomwer/widgets/control/DataSelectorOW.py +11 -30
- orangecontrib/tomwer/widgets/control/DataTransfertOW.py +2 -28
- orangecontrib/tomwer/widgets/control/DataValidatorOW.py +1 -28
- orangecontrib/tomwer/widgets/control/DataWatcherOW.py +1 -28
- orangecontrib/tomwer/widgets/control/EDF2NXTomomillOW.py +48 -51
- orangecontrib/tomwer/widgets/control/EmailOW.py +12 -2
- orangecontrib/tomwer/widgets/control/FilterOW.py +1 -28
- orangecontrib/tomwer/widgets/control/NXTomomillOW.py +37 -53
- orangecontrib/tomwer/widgets/control/NXtomoConcatenate.py +21 -20
- orangecontrib/tomwer/widgets/control/NotifierOW.py +9 -28
- orangecontrib/tomwer/widgets/control/ReduceDarkFlatSelectorOW.py +3 -2
- orangecontrib/tomwer/widgets/control/SingleTomoObjOW.py +1 -27
- orangecontrib/tomwer/widgets/control/TimerOW.py +9 -28
- orangecontrib/tomwer/widgets/control/TomoObjSeriesOW.py +58 -0
- orangecontrib/tomwer/widgets/control/VolumeSelector.py +8 -30
- orangecontrib/tomwer/widgets/control/icons/nxtomomill.svg +173 -119
- orangecontrib/tomwer/widgets/control/icons/reduced_darkflat_selector.png +0 -0
- orangecontrib/tomwer/widgets/control/icons/reduced_darkflat_selector.svg +55 -195
- orangecontrib/tomwer/widgets/control/icons/{tomoobjserie.svg → tomoobjseries.svg} +2 -2
- orangecontrib/tomwer/widgets/dataportal/PublishProcessedDataOW.py +172 -0
- orangecontrib/tomwer/widgets/{icat → dataportal}/__init__.py +2 -2
- orangecontrib/tomwer/widgets/debugtools/DatasetGeneratorOW.py +2 -29
- orangecontrib/tomwer/widgets/debugtools/ObjectInspectorOW.py +1 -29
- orangecontrib/tomwer/widgets/edit/DarkFlatPatchOW.py +48 -73
- orangecontrib/tomwer/widgets/edit/ImageKeyEditorOW.py +48 -75
- orangecontrib/tomwer/widgets/edit/ImageKeyUpgraderOW.py +5 -30
- orangecontrib/tomwer/widgets/edit/NXtomoEditorOW.py +51 -52
- orangecontrib/tomwer/widgets/other/PythonScriptOW.py +22 -10
- orangecontrib/tomwer/widgets/reconstruction/AxisOW.py +51 -60
- orangecontrib/tomwer/widgets/reconstruction/CastNabuVolumeOW.py +22 -68
- orangecontrib/tomwer/widgets/reconstruction/DarkRefAndCopyOW.py +3 -30
- orangecontrib/tomwer/widgets/reconstruction/NabuHelicalPrepareWeightsDoubleOW.py +21 -19
- orangecontrib/tomwer/widgets/reconstruction/NabuOW.py +7 -70
- orangecontrib/tomwer/widgets/reconstruction/NabuVolumeOW.py +41 -84
- orangecontrib/tomwer/widgets/reconstruction/SAAxisOW.py +15 -40
- orangecontrib/tomwer/widgets/reconstruction/SADeltaBetaOW.py +13 -35
- orangecontrib/tomwer/widgets/reconstruction/SinoNormOW.py +2 -30
- orangecontrib/tomwer/widgets/stitching/ZStitchingConfigOW.py +11 -11
- orangecontrib/tomwer/widgets/utils.py +2 -29
- orangecontrib/tomwer/widgets/visualization/DataViewerOW.py +1 -27
- orangecontrib/tomwer/widgets/visualization/DiffViewerOW.py +1 -27
- orangecontrib/tomwer/widgets/visualization/NXtomoMetadataViewerOW.py +1 -1
- orangecontrib/tomwer/widgets/visualization/RadioStackOW.py +2 -28
- orangecontrib/tomwer/widgets/visualization/SampleMovedOW.py +1 -27
- orangecontrib/tomwer/widgets/visualization/SinogramViewerOW.py +1 -27
- orangecontrib/tomwer/widgets/visualization/SliceStackOW.py +2 -28
- tomwer/__init__.py +3 -28
- tomwer/__main__.py +8 -4
- tomwer/app/__init__.py +2 -0
- tomwer/app/axis.py +8 -10
- tomwer/app/canvas.py +23 -29
- tomwer/app/canvas_launcher/config.py +14 -102
- tomwer/app/canvas_launcher/environ.py +5 -8
- tomwer/app/canvas_launcher/mainwindow.py +175 -69
- tomwer/app/canvas_launcher/splash.py +1 -3
- tomwer/app/canvas_launcher/utils.py +47 -0
- tomwer/app/canvas_launcher/widgetsscheme.py +3 -10
- tomwer/app/diffframe.py +2 -0
- tomwer/app/imagekeyeditor.py +2 -1
- tomwer/app/imagekeyupgrader.py +2 -0
- tomwer/app/multicor.py +5 -2
- tomwer/app/multipag.py +16 -5
- tomwer/app/nabuapp.py +2 -1
- tomwer/app/nxtomoeditor.py +17 -12
- tomwer/app/patchrawdarkflat.py +2 -0
- tomwer/app/radiostack.py +3 -2
- tomwer/app/reducedarkflat.py +3 -0
- tomwer/app/samplemoved.py +2 -0
- tomwer/app/scanviewer.py +2 -0
- tomwer/app/sinogramviewer.py +2 -0
- tomwer/app/slicestack.py +11 -13
- tomwer/app/stitching/common.py +431 -0
- tomwer/app/stopdatalistener.py +3 -0
- tomwer/app/ystitching.py +26 -0
- tomwer/app/zstitching.py +8 -363
- tomwer/core/__init__.py +2 -28
- tomwer/core/cluster/__init__.py +3 -0
- tomwer/core/cluster/cluster.py +10 -26
- tomwer/core/futureobject.py +17 -43
- tomwer/core/log/__init__.py +2 -0
- tomwer/core/log/processlog.py +0 -28
- tomwer/core/process/cluster/supervisor.py +52 -34
- tomwer/core/process/conditions/filters.py +3 -28
- tomwer/core/process/control/datalistener/datalistener.py +7 -75
- tomwer/core/process/control/datalistener/rpcserver.py +8 -38
- tomwer/core/process/control/datawatcher/datawatcher.py +11 -40
- tomwer/core/process/control/datawatcher/datawatcherobserver.py +30 -64
- tomwer/core/process/control/datawatcher/datawatcherprocess.py +11 -32
- tomwer/core/process/control/datawatcher/edfdwprocess.py +2 -27
- tomwer/core/process/control/datawatcher/hdf5dwprocess.py +1 -26
- tomwer/core/process/control/datawatcher/status.py +1 -26
- tomwer/core/process/control/emailnotifier.py +11 -23
- tomwer/core/process/control/nxtomoconcatenate.py +20 -18
- tomwer/core/process/control/nxtomomill.py +9 -44
- tomwer/core/process/control/scanlist.py +0 -27
- tomwer/core/process/control/scantransfer.py +15 -13
- tomwer/core/process/control/scanvalidator.py +4 -30
- tomwer/core/process/control/{test → tests}/test_concatenate_nxtomos.py +5 -5
- tomwer/core/process/control/timer.py +1 -27
- tomwer/core/process/control/tomoobjseries.py +12 -0
- tomwer/core/process/drac/binning.py +37 -0
- tomwer/core/process/drac/dracbase.py +170 -0
- tomwer/core/process/drac/gallery.py +109 -0
- tomwer/core/process/drac/output.py +12 -0
- tomwer/core/process/drac/processeddataset.py +147 -0
- tomwer/core/process/drac/publish.py +118 -0
- tomwer/core/process/drac/rawdataset.py +142 -0
- tomwer/core/process/drac/tests/test_gallery.py +71 -0
- tomwer/core/process/drac/tests/test_icat_processed_dataset.py +80 -0
- tomwer/core/process/drac/tests/test_icat_raw_dataset.py +90 -0
- tomwer/core/process/edit/darkflatpatch.py +1 -28
- tomwer/core/process/edit/imagekeyeditor.py +4 -32
- tomwer/core/process/edit/nxtomoeditor.py +307 -0
- tomwer/core/process/edit/tests/test_darkflatpatch.py +243 -0
- tomwer/core/process/edit/tests/test_imagekey_editor.py +99 -0
- tomwer/core/process/output.py +9 -2
- tomwer/core/process/reconstruction/__init__.py +0 -26
- tomwer/core/process/reconstruction/axis/anglemode.py +1 -29
- tomwer/core/process/reconstruction/axis/axis.py +47 -804
- tomwer/core/process/reconstruction/axis/mode.py +89 -25
- tomwer/core/process/reconstruction/axis/params.py +131 -283
- tomwer/core/process/reconstruction/axis/projectiontype.py +0 -28
- tomwer/core/process/reconstruction/axis/side.py +8 -0
- tomwer/core/process/reconstruction/darkref/darkrefs.py +14 -39
- tomwer/core/process/reconstruction/darkref/darkrefscopy.py +7 -39
- tomwer/core/process/reconstruction/darkref/params.py +1 -28
- tomwer/core/process/reconstruction/nabu/castvolume.py +19 -34
- tomwer/core/process/reconstruction/nabu/nabucommon.py +18 -43
- tomwer/core/process/reconstruction/nabu/nabuscores.py +64 -68
- tomwer/core/process/reconstruction/nabu/nabuslices.py +63 -105
- tomwer/core/process/reconstruction/nabu/nabuvolume.py +44 -70
- tomwer/core/process/reconstruction/nabu/plane.py +10 -0
- tomwer/core/process/reconstruction/nabu/settings.py +1 -28
- tomwer/core/process/reconstruction/nabu/target.py +0 -28
- tomwer/core/process/reconstruction/nabu/test/test_castvolume.py +116 -0
- tomwer/core/process/reconstruction/nabu/test/test_nabu_utils.py +277 -0
- tomwer/core/process/reconstruction/nabu/test/test_nabunormalization.py +199 -0
- tomwer/core/process/reconstruction/nabu/utils.py +11 -60
- tomwer/core/process/reconstruction/normalization/normalization.py +2 -32
- tomwer/core/process/reconstruction/normalization/params.py +3 -35
- tomwer/core/process/reconstruction/output.py +14 -19
- tomwer/core/process/reconstruction/paramsbase.py +4 -33
- tomwer/core/process/reconstruction/saaxis/params.py +5 -33
- tomwer/core/process/reconstruction/saaxis/saaxis.py +22 -51
- tomwer/core/process/reconstruction/sadeltabeta/params.py +2 -31
- tomwer/core/process/reconstruction/sadeltabeta/sadeltabeta.py +18 -46
- tomwer/core/process/reconstruction/scores/params.py +9 -39
- tomwer/core/process/reconstruction/scores/scores.py +10 -42
- tomwer/core/process/reconstruction/tests/__init__.py +0 -0
- tomwer/core/process/reconstruction/tests/test_axis.py +46 -0
- tomwer/core/process/reconstruction/tests/test_darkref.py +33 -0
- tomwer/core/process/reconstruction/{test → tests}/test_saaxis.py +1 -27
- tomwer/core/process/reconstruction/tests/test_sadeltabeta.py +48 -0
- tomwer/core/process/reconstruction/{test → tests}/test_utils.py +4 -4
- tomwer/core/process/reconstruction/utils/cor.py +8 -4
- tomwer/core/process/script/python.py +1 -27
- tomwer/core/process/script/tests/test_script.py +41 -0
- tomwer/core/process/stitching/metadataholder.py +5 -4
- tomwer/core/process/stitching/nabustitcher.py +35 -5
- tomwer/core/process/stitching/tests/test_metadataholder.py +17 -0
- tomwer/core/process/task.py +20 -63
- tomwer/core/process/tests/__init__.py +0 -0
- tomwer/core/process/{test → tests}/test_conditions.py +1 -28
- tomwer/core/process/{test → tests}/test_dark_and_flat.py +1 -27
- tomwer/core/process/{test → tests}/test_data_listener.py +1 -27
- tomwer/core/process/{test → tests}/test_data_transfer.py +2 -28
- tomwer/core/process/{test → tests}/test_data_watcher.py +1 -27
- tomwer/core/process/{test → tests}/test_nabu.py +2 -33
- tomwer/core/process/{test → tests}/test_normalization.py +1 -26
- tomwer/core/process/{test → tests}/test_timer.py +1 -27
- tomwer/core/process/utils.py +2 -31
- tomwer/core/process/visualization/dataviewer.py +1 -26
- tomwer/core/process/visualization/diffviewer.py +1 -26
- tomwer/core/process/visualization/imagestackviewer.py +0 -26
- tomwer/core/process/visualization/radiostack.py +0 -26
- tomwer/core/process/visualization/samplemoved.py +0 -28
- tomwer/core/process/visualization/sinogramviewer.py +0 -27
- tomwer/core/process/visualization/slicestack.py +0 -28
- tomwer/core/process/visualization/tests/test_data_viewer.py +12 -0
- tomwer/core/process/visualization/tests/test_diff_viewer.py +12 -0
- tomwer/core/process/visualization/tests/test_image_stack_viewer.py +14 -0
- tomwer/core/process/visualization/tests/test_radio_stack.py +12 -0
- tomwer/core/process/visualization/tests/test_sample_moved.py +14 -0
- tomwer/core/process/visualization/tests/test_sinogram_viewer.py +13 -0
- tomwer/core/process/visualization/tests/test_slice_stack.py +13 -0
- tomwer/core/process/visualization/tests/test_volume_viewer.py +12 -0
- tomwer/core/process/visualization/volumeviewer.py +0 -29
- tomwer/core/scan/__init__.py +3 -27
- tomwer/core/scan/blissscan.py +5 -34
- tomwer/core/scan/edfscan.py +19 -53
- tomwer/core/scan/hdf5scan.py +2 -2
- tomwer/core/scan/nxtomoscan.py +48 -54
- tomwer/core/scan/scanbase.py +107 -203
- tomwer/core/scan/scanfactory.py +11 -41
- tomwer/core/scan/tests/__init__.py +0 -0
- tomwer/core/scan/tests/test_edf.py +25 -0
- tomwer/core/scan/tests/test_future_scan.py +35 -0
- tomwer/core/scan/tests/test_nxtomoscan.py +143 -0
- tomwer/core/scan/tests/test_process_registration.py +64 -0
- tomwer/core/settings.py +18 -40
- tomwer/core/tests/__init__.py +0 -0
- tomwer/core/tests/test_scanutils.py +26 -0
- tomwer/core/{test → tests}/test_utils.py +1 -28
- tomwer/core/tomwer_object.py +4 -0
- tomwer/core/utils/__init__.py +2 -0
- tomwer/core/utils/char.py +0 -28
- tomwer/core/utils/deprecation.py +12 -38
- tomwer/core/utils/dictutils.py +1 -3
- tomwer/core/utils/ftseriesutils.py +1 -27
- tomwer/core/utils/gpu.py +0 -28
- tomwer/core/utils/image.py +8 -39
- tomwer/core/utils/locker.py +1 -28
- tomwer/core/utils/logconfig.py +0 -27
- tomwer/core/utils/normalization.py +4 -31
- tomwer/core/utils/nxtomoutils.py +8 -38
- tomwer/core/utils/resource.py +0 -26
- tomwer/core/utils/scanutils.py +23 -52
- tomwer/core/utils/slurm.py +7 -30
- tomwer/core/utils/spec.py +6 -6
- tomwer/core/utils/tests/__init__.py +0 -0
- tomwer/core/utils/tests/test_image.py +30 -0
- tomwer/core/utils/tests/test_nxtomo.py +38 -0
- tomwer/core/utils/tests/test_scan_utils.py +46 -0
- tomwer/core/utils/tests/test_time.py +6 -0
- tomwer/core/utils/threads.py +0 -26
- tomwer/core/utils/time.py +0 -27
- tomwer/core/volume/__init__.py +4 -0
- tomwer/core/volume/edfvolume.py +1 -28
- tomwer/core/volume/hdf5volume.py +1 -28
- tomwer/core/volume/jp2kvolume.py +1 -27
- tomwer/core/volume/rawvolume.py +1 -28
- tomwer/core/volume/tests/test_volumes.py +21 -0
- tomwer/core/volume/tiffvolume.py +1 -28
- tomwer/core/volume/volumebase.py +5 -0
- tomwer/core/volume/volumefactory.py +7 -33
- tomwer/gui/__init__.py +0 -28
- tomwer/gui/cluster/__init__.py +2 -0
- tomwer/gui/cluster/slurm.py +297 -95
- tomwer/gui/cluster/supervisor.py +1 -27
- tomwer/gui/cluster/tests/__init__.py +0 -0
- tomwer/gui/cluster/{test → tests}/test_cluster.py +21 -26
- tomwer/gui/cluster/{test → tests}/test_supervisor.py +1 -27
- tomwer/gui/conditions/__init__.py +2 -0
- tomwer/gui/conditions/filter.py +1 -26
- tomwer/gui/configuration/__init__.py +2 -0
- tomwer/gui/control/__init__.py +2 -0
- tomwer/gui/control/actions.py +2 -28
- tomwer/gui/control/datadiscovery.py +4 -3
- tomwer/gui/control/datalist.py +64 -69
- tomwer/gui/control/datalistener.py +1 -39
- tomwer/gui/control/datareacheractions.py +1 -28
- tomwer/gui/control/datatransfert.py +2 -29
- tomwer/gui/control/datavalidator.py +3 -37
- tomwer/gui/control/datawatcher/__init__.py +0 -28
- tomwer/gui/control/datawatcher/configuration.py +1 -28
- tomwer/gui/control/datawatcher/datawatcher.py +3 -32
- tomwer/gui/control/datawatcher/datawatcherobserver.py +2 -28
- tomwer/gui/control/history.py +5 -35
- tomwer/gui/control/nxtomomill.py +3 -30
- tomwer/gui/control/observations.py +61 -55
- tomwer/gui/control/reducedarkflatselector.py +24 -20
- tomwer/gui/control/scanselectorwidget.py +2 -28
- tomwer/gui/control/selectorwidgetbase.py +17 -17
- tomwer/gui/control/series/__init__.py +0 -0
- tomwer/gui/control/{serie/seriecreator.py → series/seriescreator.py} +214 -235
- tomwer/gui/control/series/serieswaiter.py +0 -0
- tomwer/gui/control/series/test/test_creator.py +424 -0
- tomwer/gui/control/series/test/test_nxtomo_concatenate.py +21 -0
- tomwer/gui/control/singletomoobj.py +1 -1
- tomwer/gui/control/tests/__init__.py +0 -0
- tomwer/gui/control/tests/test_datalist.py +47 -0
- tomwer/gui/control/{test → tests}/test_datalistener.py +1 -28
- tomwer/gui/control/tests/test_datavalidator.py +27 -0
- tomwer/gui/control/{test → tests}/test_inputwidget.py +1 -27
- tomwer/gui/control/tests/test_process_manager.py +38 -0
- tomwer/gui/control/tests/test_scan_observations.py +23 -0
- tomwer/gui/control/tests/test_scanselector.py +42 -0
- tomwer/gui/control/{test → tests}/test_scanvalidator.py +1 -27
- tomwer/gui/control/{test → tests}/test_volume_dialog.py +2 -30
- tomwer/gui/control/{test → tests}/test_volumeselector.py +1 -27
- tomwer/gui/control/volumeselectorwidget.py +2 -30
- tomwer/gui/dataportal/__init__.py +2 -0
- tomwer/gui/{icat → dataportal}/createscreenshots.py +3 -2
- tomwer/gui/dataportal/gallery.py +133 -0
- tomwer/gui/dataportal/outputformat.py +0 -0
- tomwer/gui/dataportal/publish.py +96 -0
- tomwer/gui/dataportal/tests/test_create_screenshots_gui.py +23 -0
- tomwer/gui/dataportal/tests/test_gallery_gui.py +21 -0
- tomwer/gui/debugtools/__init__.py +2 -0
- tomwer/gui/debugtools/datasetgenerator.py +1 -30
- tomwer/gui/debugtools/objectinspector.py +1 -29
- tomwer/gui/dialog/QDataDialog.py +89 -0
- tomwer/gui/{qfolderdialog.py → dialog/QVolumeDialog.py} +8 -107
- tomwer/gui/dialog/__init__.py +1 -0
- tomwer/gui/edit/__init__.py +2 -0
- tomwer/gui/edit/dkrfpatch.py +52 -87
- tomwer/gui/edit/imagekeyeditor.py +18 -54
- tomwer/gui/edit/nxtomoeditor.py +113 -300
- tomwer/gui/edit/nxtomowarmer.py +3 -2
- tomwer/gui/edit/tests/__init__.py +0 -0
- tomwer/gui/edit/{test → tests}/test_dkrf_patch.py +3 -29
- tomwer/gui/edit/{test → tests}/test_image_key_editor.py +1 -27
- tomwer/gui/edit/{test → tests}/test_nx_editor.py +45 -23
- tomwer/gui/fonts.py +5 -0
- tomwer/gui/icons.py +28 -66
- tomwer/gui/illustrations.py +4 -34
- tomwer/gui/imagefromfile.py +5 -30
- tomwer/gui/metadataloader.py +36 -0
- tomwer/gui/qconfigfile.py +3 -0
- tomwer/gui/qlefilesystem.py +3 -0
- tomwer/gui/reconstruction/__init__.py +2 -0
- tomwer/gui/reconstruction/axis/AxisMainWindow.py +275 -0
- tomwer/gui/reconstruction/axis/AxisOptionsWidget.py +313 -0
- tomwer/gui/reconstruction/axis/AxisSettingsWidget.py +797 -0
- tomwer/gui/reconstruction/axis/AxisWidget.py +534 -0
- tomwer/gui/reconstruction/axis/CalculationWidget.py +218 -0
- tomwer/gui/reconstruction/axis/CompareImages.py +11 -44
- tomwer/gui/reconstruction/axis/ControlWidget.py +285 -0
- tomwer/gui/reconstruction/axis/EstimatedCORWidget.py +394 -0
- tomwer/gui/reconstruction/axis/EstimatedCorComboBox.py +118 -0
- tomwer/gui/reconstruction/axis/InputWidget.py +347 -0
- tomwer/gui/reconstruction/axis/ManualFramesSelection.py +168 -0
- tomwer/gui/reconstruction/axis/__init__.py +2 -2
- tomwer/gui/reconstruction/darkref/__init__.py +0 -27
- tomwer/gui/reconstruction/darkref/darkrefcopywidget.py +5 -34
- tomwer/gui/reconstruction/darkref/darkrefwidget.py +1 -27
- tomwer/gui/reconstruction/nabu/castvolume.py +40 -59
- tomwer/gui/reconstruction/nabu/check.py +7 -33
- tomwer/gui/reconstruction/nabu/nabuconfig/base.py +7 -34
- tomwer/gui/reconstruction/nabu/nabuconfig/ctf.py +6 -5
- tomwer/gui/reconstruction/nabu/nabuconfig/nabuconfig.py +10 -69
- tomwer/gui/reconstruction/nabu/nabuconfig/output.py +3 -47
- tomwer/gui/reconstruction/nabu/nabuconfig/phase.py +54 -36
- tomwer/gui/reconstruction/nabu/nabuconfig/preprocessing.py +103 -54
- tomwer/gui/reconstruction/nabu/nabuconfig/reconstruction.py +116 -65
- tomwer/gui/reconstruction/nabu/nabuflow.py +31 -61
- tomwer/gui/reconstruction/nabu/platform.py +94 -0
- tomwer/gui/reconstruction/nabu/slices.py +81 -45
- tomwer/gui/reconstruction/nabu/slurm.py +1 -27
- tomwer/gui/reconstruction/nabu/test/test_cast_volume.py +82 -0
- tomwer/gui/reconstruction/nabu/test/test_check.py +66 -0
- tomwer/gui/reconstruction/nabu/test/test_ctf.py +46 -0
- tomwer/gui/reconstruction/nabu/test/test_helical.py +21 -0
- tomwer/gui/reconstruction/nabu/test/test_nabu_preprocessing.py +81 -0
- tomwer/gui/reconstruction/nabu/volume.py +62 -90
- tomwer/gui/reconstruction/normalization/intensity.py +5 -32
- tomwer/gui/reconstruction/normalization/test/test_intensity.py +89 -0
- tomwer/gui/reconstruction/saaxis/corrangeselector.py +32 -56
- tomwer/gui/reconstruction/saaxis/dimensionwidget.py +56 -96
- tomwer/gui/reconstruction/saaxis/saaxis.py +17 -38
- tomwer/gui/reconstruction/saaxis/sliceselector.py +8 -39
- tomwer/gui/reconstruction/sadeltabeta/saadeltabeta.py +19 -37
- tomwer/gui/reconstruction/scores/control.py +2 -30
- tomwer/gui/reconstruction/scores/scoreplot.py +23 -49
- tomwer/gui/reconstruction/tests/__init__.py +0 -0
- tomwer/gui/reconstruction/{test → tests}/test_axis.py +23 -49
- tomwer/gui/reconstruction/{test → tests}/test_nabu.py +16 -31
- tomwer/gui/reconstruction/{test → tests}/test_saaxis.py +10 -37
- tomwer/gui/reconstruction/{test → tests}/test_sadeltabeta.py +1 -26
- tomwer/gui/samplemoved/__init__.py +2 -30
- tomwer/gui/samplemoved/selectiontable.py +3 -33
- tomwer/gui/settings.py +7 -0
- tomwer/gui/stackplot.py +33 -661
- tomwer/gui/stacks.py +261 -135
- tomwer/gui/stitching/SingleAxisStitchingWidget.py +326 -0
- tomwer/gui/stitching/StitchingOptionsWidget.py +438 -0
- tomwer/gui/stitching/StitchingWindow.py +586 -0
- tomwer/gui/stitching/__init__.py +2 -0
- tomwer/gui/stitching/alignment.py +90 -0
- tomwer/gui/stitching/axisorderedlist.py +44 -34
- tomwer/gui/stitching/config/axisparams.py +25 -11
- tomwer/gui/stitching/config/output.py +6 -5
- tomwer/gui/stitching/config/positionoveraxis.py +313 -51
- tomwer/gui/stitching/config/stitchingstrategies.py +22 -16
- tomwer/gui/stitching/config/tests/test_axisparams.py +25 -0
- tomwer/gui/stitching/config/tomoobjdetails.py +3 -5
- tomwer/gui/stitching/normalization.py +1 -0
- tomwer/gui/stitching/preview.py +59 -0
- tomwer/gui/stitching/singleaxis.py +57 -0
- tomwer/gui/stitching/stitchandbackground.py +3 -2
- tomwer/gui/stitching/stitching_preview.py +44 -36
- tomwer/gui/stitching/stitching_raw.py +5 -3
- tomwer/gui/stitching/tests/test_ZStitchingWindow.py +88 -0
- tomwer/gui/stitching/tests/test_axis_ordered_list.py +21 -0
- tomwer/gui/stitching/tests/test_normalization.py +27 -0
- tomwer/gui/stitching/tests/test_preview.py +68 -0
- tomwer/gui/stitching/tests/test_stitching_raw.py +110 -0
- tomwer/gui/stitching/tests/utils.py +92 -0
- tomwer/gui/stitching/utils.py +14 -0
- tomwer/gui/stitching/z_stitching/fineestimation.py +5 -33
- tomwer/gui/stitching/z_stitching/tests/test_fine_estimation.py +35 -0
- tomwer/gui/stitching/z_stitching/tests/test_raw_estimation.py +215 -0
- tomwer/gui/stitching/z_stitching/tests/test_stitching_window.py +51 -0
- tomwer/gui/tests/__init__.py +0 -0
- tomwer/gui/tests/test_axis_gui.py +43 -0
- tomwer/gui/{test → tests}/test_qfolder_dialog.py +1 -1
- tomwer/gui/utils/RangeWidget.py +44 -0
- tomwer/gui/utils/buttons.py +4 -3
- tomwer/gui/utils/completer.py +2 -33
- tomwer/gui/utils/flow.py +11 -40
- tomwer/gui/utils/gpu.py +60 -0
- tomwer/gui/utils/illustrations.py +1 -26
- tomwer/gui/utils/inputwidget.py +35 -73
- tomwer/gui/utils/lineselector/lineselector.py +9 -46
- tomwer/gui/utils/loadingmode.py +81 -0
- tomwer/gui/utils/qt_utils.py +9 -0
- tomwer/gui/utils/sandboxes.py +1 -26
- tomwer/gui/utils/scandescription.py +2 -31
- tomwer/gui/utils/scrollarea.py +6 -55
- tomwer/gui/utils/slider.py +4 -28
- tomwer/gui/utils/splashscreen.py +0 -28
- tomwer/gui/utils/step.py +14 -13
- tomwer/gui/utils/tests/test_completer.py +41 -0
- tomwer/gui/utils/tests/test_line_selector.py +21 -0
- tomwer/gui/utils/tests/test_splashscreen.py +8 -0
- tomwer/gui/utils/tests/test_vignettes.py +68 -0
- tomwer/gui/utils/unitsystem.py +15 -69
- tomwer/gui/utils/utils.py +4 -5
- tomwer/gui/utils/vignettes.py +10 -41
- tomwer/gui/utils/waiterthread.py +0 -26
- tomwer/gui/visualization/__init__.py +2 -0
- tomwer/gui/visualization/dataviewer.py +68 -421
- tomwer/gui/visualization/diffviewer/diffviewer.py +2 -30
- tomwer/gui/visualization/diffviewer/shiftwidget.py +4 -29
- tomwer/gui/visualization/fullscreenplot.py +5 -5
- tomwer/gui/visualization/imagestack.py +403 -0
- tomwer/gui/visualization/nxtomometadata.py +0 -4
- tomwer/gui/visualization/reconstructionparameters.py +14 -32
- tomwer/gui/visualization/scanoverview.py +33 -66
- tomwer/gui/visualization/sinogramviewer.py +2 -28
- tomwer/gui/visualization/test/__init__.py +0 -28
- tomwer/gui/visualization/test/test_dataviewer.py +1 -28
- tomwer/gui/visualization/test/test_diffviewer.py +1 -28
- tomwer/gui/visualization/test/test_nx_tomo_metadata_viewer.py +0 -5
- tomwer/gui/visualization/test/test_reconstruction_parameters.py +1 -27
- tomwer/gui/visualization/test/test_sinogramviewer.py +1 -28
- tomwer/gui/visualization/test/test_stacks.py +184 -115
- tomwer/gui/visualization/test/test_volumeviewer.py +3 -2
- tomwer/gui/visualization/tomoobjoverview.py +2 -2
- tomwer/gui/visualization/volumeoverview.py +3 -2
- tomwer/gui/visualization/volumeviewer.py +47 -43
- tomwer/io/__init__.py +2 -0
- tomwer/io/utils/h5pyutils.py +1 -27
- tomwer/io/utils/test/test_raw_and_processed_data.py +10 -0
- tomwer/io/utils/test/test_utils.py +67 -0
- tomwer/io/utils/utils.py +2 -31
- tomwer/resources/__init__.py +13 -33
- tomwer/resources/gui/icons/edit_downstream.svg +114 -0
- tomwer/resources/gui/icons/edit_upstream.svg +112 -0
- tomwer/resources/gui/icons/free_edition.svg +23 -0
- tomwer/resources/gui/icons/icat_gallery_opts.png +0 -0
- tomwer/resources/gui/icons/icat_gallery_opts.svg +80 -0
- tomwer/resources/gui/icons/search.png +0 -0
- tomwer/resources/gui/icons/search.svg +23 -0
- tomwer/resources/gui/icons/warning.png +0 -0
- tomwer/synctools/__init__.py +2 -0
- tomwer/synctools/axis.py +1 -27
- tomwer/synctools/darkref.py +1 -26
- tomwer/synctools/datalistener.py +1 -27
- tomwer/synctools/datatransfert.py +2 -27
- tomwer/synctools/imageloaderthread.py +1 -28
- tomwer/synctools/rsyncmanager.py +1 -25
- tomwer/synctools/saaxis.py +1 -26
- tomwer/synctools/sadeltabeta.py +1 -26
- tomwer/synctools/stacks/control/datalistener.py +1 -26
- tomwer/synctools/stacks/processingstack.py +4 -33
- tomwer/synctools/stacks/reconstruction/axis.py +6 -53
- tomwer/synctools/stacks/reconstruction/castvolume.py +12 -43
- tomwer/synctools/stacks/reconstruction/dkrefcopy.py +4 -27
- tomwer/synctools/stacks/reconstruction/nabu.py +3 -28
- tomwer/synctools/stacks/reconstruction/normalization.py +2 -27
- tomwer/synctools/stacks/reconstruction/saaxis.py +2 -27
- tomwer/synctools/stacks/reconstruction/sadeltabeta.py +2 -27
- tomwer/synctools/tests/__init__.py +0 -0
- tomwer/synctools/{test → tests}/test_darkRefs.py +16 -40
- tomwer/synctools/{test → tests}/test_foldertransfer.py +2 -33
- tomwer/synctools/utils/scanstages.py +2 -31
- tomwer/tests/__init__.py +1 -0
- tomwer/tests/app/test_stitching.py +95 -0
- tomwer/tests/datasets.py +1 -5
- tomwer/tests/orangecontrib/tomwer/widgets/cluster/tests/test_future_supervisorow.py +48 -0
- tomwer/tests/orangecontrib/tomwer/widgets/cluster/tests/test_slurm_clusterow.py +40 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_advancement.py +8 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_data_validator.py +55 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datadiscovery.py +129 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datalistener.py +111 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_dataselector.py +69 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datawatcher.py +411 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_emailow.py +29 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_notifier.py +24 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_nxtomo_concatenate_ow.py +64 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_nxtomomill.py +133 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_reduce_dark_flat_selector.py +40 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_singletomoobj.py +40 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_timerow.py +25 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_tomoobj_series.py +96 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_volume_selector.py +69 -0
- orangecontrib/tomwer/widgets/edit/test/test_image_key_editor.py → tomwer/tests/orangecontrib/tomwer/widgets/debugtools/tests/test_dataset_generator.py +17 -16
- tomwer/tests/orangecontrib/tomwer/widgets/debugtools/tests/test_object_inspector.py +36 -0
- {orangecontrib/tomwer/widgets/edit/test → tomwer/tests/orangecontrib/tomwer/widgets/edit/tests}/test_dark_flat_patch.py +1 -27
- tomwer/tests/orangecontrib/tomwer/widgets/edit/tests/test_image_key_editor.py +30 -0
- tomwer/tests/orangecontrib/tomwer/widgets/edit/tests/test_nxtomo_editor.py +138 -0
- tomwer/tests/orangecontrib/tomwer/widgets/other/tests/test_pythonscript.py +31 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_axis.py +199 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_cast_volumeow.py +58 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_dark_refs_widget.py +136 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_delta_beta_selector.py +15 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_i_norm.py +200 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_helical_prepare_weights_double.py +20 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_volume.py +74 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_widget.py +107 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_sa_delta_beta.py +194 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_saaxis.py +194 -0
- tomwer/tests/orangecontrib/tomwer/widgets/stitching/tests/test_zstitching.py +313 -0
- tomwer/tests/orangecontrib/tomwer/widgets/tests/test_conditions.py +85 -0
- tomwer/tests/orangecontrib/tomwer/widgets/tests/test_darkref.py +225 -0
- tomwer/tests/orangecontrib/tomwer/widgets/tests/test_foldertransfert.py +105 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_dataviewerow.py +57 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_diffviewerow.py +39 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_nxtomo_metadata_viewer.py +29 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_radio_stackow.py +31 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_sample_movedow.py +46 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_sinogram_viewerow.py +31 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_slice_stackow.py +31 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_volume_viewerow.py +32 -0
- tomwer/tests/test_ewoks/test_conversion.py +104 -0
- tomwer/tests/test_ewoks/test_single_node_execution.py +87 -0
- tomwer/tests/test_ewoks/test_workflows.py +138 -0
- tomwer/utils.py +11 -39
- tomwer/version.py +2 -2
- {tomwer-1.3.26.dist-info → tomwer-1.4.0.dist-info}/LICENSE +3 -3
- tomwer-1.4.0.dist-info/METADATA +337 -0
- tomwer-1.4.0.dist-info/RECORD +912 -0
- {tomwer-1.3.26.dist-info → tomwer-1.4.0.dist-info}/WHEEL +1 -1
- {tomwer-1.3.26.dist-info → tomwer-1.4.0.dist-info}/entry_points.txt +1 -0
- orangecontrib/tomwer/widgets/control/DataListOW.py +0 -129
- orangecontrib/tomwer/widgets/control/TomoObjSerieOW.py +0 -86
- orangecontrib/tomwer/widgets/control/VolumeSymLinkOW.py +0 -182
- orangecontrib/tomwer/widgets/edit/test/test_nxtomo_editor.py +0 -141
- orangecontrib/tomwer/widgets/icat/PublishProcessedDataOW.py +0 -115
- orangecontrib/tomwer/widgets/icat/RawDataScreenshotCreatorOW.py +0 -98
- orangecontrib/tomwer/widgets/icat/SaveToGalleryAndPublishOW.py +0 -129
- orangecontrib/tomwer/widgets/icat/icons/add_gallery.png +0 -0
- orangecontrib/tomwer/widgets/icat/icons/add_gallery.svg +0 -82
- orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.png +0 -0
- orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.svg +0 -143
- orangecontrib/tomwer/widgets/visualization/LivesliceOW.py +0 -87
- orangecontrib/tomwer/widgets/visualization/icons/liveslice.png +0 -0
- orangecontrib/tomwer/widgets/visualization/icons/liveslice.svg +0 -110
- tomwer/core/log/logger.py +0 -130
- tomwer/core/process/control/test/test_volume_link.py +0 -74
- tomwer/core/process/control/tomoobjserie.py +0 -12
- tomwer/core/process/control/volumesymlink.py +0 -200
- tomwer/core/process/icat/createscreenshots.py +0 -100
- tomwer/core/process/icat/gallery.py +0 -377
- tomwer/core/process/icat/icatbase.py +0 -36
- tomwer/core/process/icat/publish.py +0 -228
- tomwer/core/process/icat/screenshots.py +0 -27
- tomwer/core/process/reconstruction/test/test_darkref.py +0 -60
- tomwer/core/process/reconstruction/test/test_sadeltabeta.py +0 -74
- tomwer/core/process/test/test_axis.py +0 -309
- tomwer/core/process/visualization/liveslice.py +0 -6
- tomwer/core/progress.py +0 -100
- tomwer/core/scan/test/test_edf.py +0 -53
- tomwer/core/scan/test/test_future_scan.py +0 -61
- tomwer/core/scan/test/test_h5.py +0 -96
- tomwer/core/scan/test/test_process_registration.py +0 -109
- tomwer/core/test/test_scanutils.py +0 -53
- tomwer/gui/control/emailnotifier.py +0 -174
- tomwer/gui/control/serie/seriewaiter.py +0 -28
- tomwer/gui/control/test/__init__.py +0 -28
- tomwer/gui/control/test/test_datalist.py +0 -96
- tomwer/gui/control/test/test_datavalidator.py +0 -54
- tomwer/gui/control/test/test_email.py +0 -35
- tomwer/gui/control/test/test_process_manager.py +0 -65
- tomwer/gui/control/test/test_scanselector.py +0 -67
- tomwer/gui/edit/test/__init__.py +0 -28
- tomwer/gui/icat/gallery.py +0 -214
- tomwer/gui/icat/publish.py +0 -187
- tomwer/gui/reconstruction/axis/axis.py +0 -733
- tomwer/gui/reconstruction/axis/radioaxis.py +0 -2467
- tomwer/gui/stitching/stitching.py +0 -1392
- tomwer/gui/test/__init__.py +0 -28
- tomwer/gui/test/test_axis_gui.py +0 -34
- tomwer/synctools/stacks/edit/darkflatpatch.py +0 -169
- tomwer/synctools/stacks/edit/imagekeyeditor.py +0 -135
- tomwer/third_part/WaitingOverlay.py +0 -110
- tomwer-1.3.26-py3.11-nspkg.pth +0 -1
- tomwer-1.3.26.dist-info/METADATA +0 -292
- tomwer-1.3.26.dist-info/RECORD +0 -785
- tomwer-1.3.26.dist-info/namespace_packages.txt +0 -1
- /orangecontrib/tomwer/{widgets/edit/test → tests}/__init__.py +0 -0
- {tomwer/core/process/control/test → orangecontrib/tomwer/tutorials/id16b}/__init__.py +0 -0
- {tomwer/core/process/icat → orangecontrib/tomwer/widgets/cluster/tests}/__init__.py +0 -0
- /orangecontrib/tomwer/widgets/control/icons/{tomoobjserie.png → tomoobjseries.png} +0 -0
- {tomwer/core/process/reconstruction/test → orangecontrib/tomwer/widgets/control/tests}/__init__.py +0 -0
- /orangecontrib/tomwer/widgets/{icat → dataportal}/icons/publish_processed_data.png +0 -0
- /orangecontrib/tomwer/widgets/{icat → dataportal}/icons/publish_processed_data.svg +0 -0
- {tomwer/core/process/test → orangecontrib/tomwer/widgets/debugtools/tests}/__init__.py +0 -0
- {tomwer/core/scan/test → orangecontrib/tomwer/widgets/edit/tests}/__init__.py +0 -0
- {tomwer/core/test → orangecontrib/tomwer/widgets/other/tests}/__init__.py +0 -0
- {tomwer/gui/cluster/test → orangecontrib/tomwer/widgets/reconstruction/tests}/__init__.py +0 -0
- {tomwer/gui/control/serie → orangecontrib/tomwer/widgets/stitching/tests}/__init__.py +0 -0
- {tomwer/gui/icat → orangecontrib/tomwer/widgets/tests}/__init__.py +0 -0
- {tomwer/gui/reconstruction/test → orangecontrib/tomwer/widgets/visualization/tests}/__init__.py +0 -0
- /tomwer/{synctools/stacks/edit → app/stitching}/__init__.py +0 -0
- /tomwer/{synctools/test → core/process/control/tests}/__init__.py +0 -0
- /tomwer/core/process/control/{test → tests}/test_email.py +0 -0
- /tomwer/core/process/control/{test → tests}/test_h52nx_process.py +0 -0
- /tomwer/{third_part → core/process/drac}/__init__.py +0 -0
- /tomwer/core/process/reconstruction/{test → tests}/test_axis_params.py +0 -0
- /tomwer/core/process/reconstruction/{test → tests}/test_darkref_copy.py +0 -0
- /tomwer/core/process/reconstruction/{test → tests}/test_paramsbase.py +0 -0
- /tomwer/core/scan/{test → tests}/test_scan.py +0 -0
- /tomwer/gui/control/{serie → series}/nxtomoconcatenate.py +0 -0
- /tomwer/gui/control/{test → tests}/test_datadiscovery.py +0 -0
- /tomwer/gui/control/{test → tests}/test_reducedarkflat_selector.py +0 -0
- /tomwer/gui/control/{test → tests}/test_single_tomo_obj.py +0 -0
- {orangecontrib/tomwer/widgets/edit/test → tomwer/tests/orangecontrib/tomwer/widgets/edit/tests}/test_image_key_upgrader.py +0 -0
- {tomwer-1.3.26.dist-info → tomwer-1.4.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,218 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import logging
|
4
|
+
|
5
|
+
from silx.gui import qt
|
6
|
+
|
7
|
+
from tomwer.core.scan.scanbase import TomwerScanBase
|
8
|
+
from tomwer.core.process.reconstruction.axis import mode as axis_mode
|
9
|
+
from tomwer.gui.utils.buttons import PadlockButton
|
10
|
+
from tomwer.gui.utils.qt_utils import block_signals
|
11
|
+
from tomwer.synctools.axis import QAxisRP
|
12
|
+
from tomwer.gui.utils.scrollarea import QComboBoxIgnoreWheel
|
13
|
+
from tomwer.gui.reconstruction.axis.EstimatedCORWidget import EstimatedCORWidget
|
14
|
+
|
15
|
+
_logger = logging.getLogger(__name__)
|
16
|
+
|
17
|
+
|
18
|
+
class CalculationWidget(qt.QWidget):
|
19
|
+
"""
|
20
|
+
Main widget to select the algorithm to use for COR calculation
|
21
|
+
Used as a tab of the AxisSettingsTabWidget
|
22
|
+
"""
|
23
|
+
|
24
|
+
sigModeChanged = qt.Signal(str)
|
25
|
+
"""signal emitted when the algorithm for computing COR changed"""
|
26
|
+
|
27
|
+
sigLockModeChanged = qt.Signal(bool)
|
28
|
+
"""signal emitted when the mode has been lock or unlock"""
|
29
|
+
sigUpdateXRotAxisPixelPosOnNewScan = qt.Signal()
|
30
|
+
sigYAxisInvertedChanged = qt.Signal(bool)
|
31
|
+
|
32
|
+
def __init__(self, parent, axis_params):
|
33
|
+
assert isinstance(axis_params, QAxisRP)
|
34
|
+
qt.QWidget.__init__(self, parent)
|
35
|
+
self._axis_params = None
|
36
|
+
self.setLayout(qt.QVBoxLayout())
|
37
|
+
|
38
|
+
# algorithm
|
39
|
+
self._modeWidget = qt.QWidget(parent=self)
|
40
|
+
self._modeWidget.setLayout(qt.QHBoxLayout())
|
41
|
+
self.layout().addWidget(self._modeWidget)
|
42
|
+
|
43
|
+
self.__rotAxisSelLabel = qt.QLabel("algorithm to compute cor")
|
44
|
+
self._modeWidget.layout().addWidget(self.__rotAxisSelLabel)
|
45
|
+
self._qcbPosition = QComboBoxIgnoreWheel(self)
|
46
|
+
|
47
|
+
algorithm_groups = (
|
48
|
+
# radio group
|
49
|
+
(
|
50
|
+
axis_mode.AxisMode.centered,
|
51
|
+
axis_mode.AxisMode.global_,
|
52
|
+
axis_mode.AxisMode.growing_window_radios,
|
53
|
+
axis_mode.AxisMode.sliding_window_radios,
|
54
|
+
axis_mode.AxisMode.octave_accurate_radios,
|
55
|
+
),
|
56
|
+
# sino group
|
57
|
+
(
|
58
|
+
axis_mode.AxisMode.growing_window_sinogram,
|
59
|
+
axis_mode.AxisMode.sino_coarse_to_fine,
|
60
|
+
axis_mode.AxisMode.sliding_window_sinogram,
|
61
|
+
axis_mode.AxisMode.fourier_angles,
|
62
|
+
),
|
63
|
+
# composite coarse to fine
|
64
|
+
(
|
65
|
+
axis_mode.AxisMode.composite_coarse_to_fine,
|
66
|
+
axis_mode.AxisMode.near,
|
67
|
+
),
|
68
|
+
# read
|
69
|
+
(axis_mode.AxisMode.read,),
|
70
|
+
# manual
|
71
|
+
(axis_mode.AxisMode.manual,),
|
72
|
+
)
|
73
|
+
current_pos = 0
|
74
|
+
for i_grp, algorithm_group in enumerate(algorithm_groups):
|
75
|
+
if i_grp != 0:
|
76
|
+
self._qcbPosition.insertSeparator(current_pos)
|
77
|
+
current_pos += 1
|
78
|
+
for cor_algorithm in algorithm_group:
|
79
|
+
self._qcbPosition.addItem(cor_algorithm.value)
|
80
|
+
idx = self._qcbPosition.findText(cor_algorithm.value)
|
81
|
+
self._qcbPosition.setItemData(
|
82
|
+
idx,
|
83
|
+
axis_mode.AXIS_MODE_METADATAS[cor_algorithm].tooltip,
|
84
|
+
qt.Qt.ToolTipRole,
|
85
|
+
)
|
86
|
+
current_pos += 1
|
87
|
+
|
88
|
+
self._modeWidget.layout().addWidget(self._qcbPosition)
|
89
|
+
|
90
|
+
# method lock button
|
91
|
+
self._lockMethodPB = PadlockButton(parent=self._modeWidget)
|
92
|
+
self._lockMethodPB.setToolTip(
|
93
|
+
"Lock the method to compute the cor. \n"
|
94
|
+
"This will automatically call the "
|
95
|
+
"defined algorithm each time a scan is received."
|
96
|
+
)
|
97
|
+
self._modeWidget.layout().addWidget(self._lockMethodPB)
|
98
|
+
|
99
|
+
# estimated cor
|
100
|
+
self._estimatedCorWidget = EstimatedCORWidget(self, axis_params=axis_params)
|
101
|
+
self.layout().addWidget(self._estimatedCorWidget)
|
102
|
+
|
103
|
+
# connect signal / slot
|
104
|
+
self._qcbPosition.currentIndexChanged.connect(self._modeChanged)
|
105
|
+
self._lockMethodPB.sigLockChanged.connect(self.lockMode)
|
106
|
+
self._estimatedCorWidget.sigUpdateXRotAxisPixelPosOnNewScan.connect(
|
107
|
+
self.sigUpdateXRotAxisPixelPosOnNewScan
|
108
|
+
)
|
109
|
+
self._estimatedCorWidget.sigYAxisInvertedChanged.connect(
|
110
|
+
self.sigYAxisInvertedChanged
|
111
|
+
)
|
112
|
+
|
113
|
+
# set up interface
|
114
|
+
self._estimatedCorWidget._updateVisibleSides(mode=self.getMode())
|
115
|
+
self.setAxisParams(axis_params)
|
116
|
+
|
117
|
+
def getMethodLockPB(self) -> qt.QPushButton:
|
118
|
+
return self._lockMethodPB
|
119
|
+
|
120
|
+
def setEstimatedCorValue(self, value):
|
121
|
+
self._estimatedCorWidget.setEstimatedCor(value=value)
|
122
|
+
# note: force to update the side values.
|
123
|
+
self._estimatedCorWidget._updateVisibleSides(mode=self.getMode())
|
124
|
+
|
125
|
+
def getEstimatedCor(self):
|
126
|
+
return self._estimatedCorWidget.getEstimatedCor()
|
127
|
+
|
128
|
+
def updateXRotationAxisPixelPositionOnNewScan(self) -> bool:
|
129
|
+
return self._estimatedCorWidget.updateXRotationAxisPixelPositionOnNewScan()
|
130
|
+
|
131
|
+
def setUpdateXRotationAxisPixelPositionOnNewScan(self, update: bool):
|
132
|
+
self._estimatedCorWidget.setUpdateXRotationAxisPixelPositionOnNewScan(
|
133
|
+
update=update
|
134
|
+
)
|
135
|
+
|
136
|
+
def _modeChanged(self, *args, **kwargs):
|
137
|
+
mode = self.getMode()
|
138
|
+
with block_signals(self._qcbPosition):
|
139
|
+
with block_signals(self._axis_params):
|
140
|
+
self._estimatedCorWidget._updateVisibleSides(mode)
|
141
|
+
self._axis_params.mode = mode.value
|
142
|
+
self._axis_params.changed()
|
143
|
+
self.sigModeChanged.emit(mode.value)
|
144
|
+
|
145
|
+
def isModeLock(self):
|
146
|
+
return self._lockMethodPB.isLocked()
|
147
|
+
|
148
|
+
def setModeLock(self, mode=None):
|
149
|
+
"""set a specific mode and lock it.
|
150
|
+
|
151
|
+
:param mode: mode to lock. If None then keep the current mode
|
152
|
+
"""
|
153
|
+
if mode is not None:
|
154
|
+
mode = axis_mode.AxisMode.from_value(mode)
|
155
|
+
if mode is None and axis_mode.AXIS_MODE_METADATAS[self.getMode()].is_lockable():
|
156
|
+
raise ValueError(
|
157
|
+
"Unable to lock the current mode is not an automatic algorithm"
|
158
|
+
)
|
159
|
+
elif (
|
160
|
+
mode != self.getMode() and axis_mode.AXIS_MODE_METADATAS[mode].is_lockable()
|
161
|
+
):
|
162
|
+
raise ValueError("Unable to lock %s this is not a lockable mode")
|
163
|
+
|
164
|
+
if mode is not None:
|
165
|
+
self.setMode(mode)
|
166
|
+
if not self._lockMethodPB.isLocked():
|
167
|
+
with block_signals(self._lockMethodPB):
|
168
|
+
self._lockMethodPB.setLock(True)
|
169
|
+
self.lockMode(True)
|
170
|
+
|
171
|
+
def lockMode(self, lock):
|
172
|
+
with block_signals(self._lockMethodPB):
|
173
|
+
self._lockMethodPB.setLock(lock)
|
174
|
+
self._qcbPosition.setEnabled(not lock)
|
175
|
+
|
176
|
+
self.sigLockModeChanged.emit(lock)
|
177
|
+
|
178
|
+
def getMode(self):
|
179
|
+
"""Return algorithm to use for axis calculation"""
|
180
|
+
return axis_mode.AxisMode.from_value(self._qcbPosition.currentText())
|
181
|
+
|
182
|
+
def setMode(self, mode: axis_mode.AxisMode):
|
183
|
+
if mode == self.getMode():
|
184
|
+
# when set mode the estimated cor might changed.
|
185
|
+
# that we want to avoid.
|
186
|
+
return
|
187
|
+
with block_signals(self._qcbPosition):
|
188
|
+
index = self._qcbPosition.findText(mode.value)
|
189
|
+
if index >= 0:
|
190
|
+
self._qcbPosition.setCurrentIndex(index)
|
191
|
+
else:
|
192
|
+
raise ValueError("Unable to find mode", mode)
|
193
|
+
self._lockMethodPB.setVisible(mode not in (axis_mode.AxisMode.manual,))
|
194
|
+
mode_metadata = axis_mode.AXIS_MODE_METADATAS[mode]
|
195
|
+
estimated_cor_widget_visible = (
|
196
|
+
mode_metadata.allows_estimated_cor_as_numerical_value
|
197
|
+
or len(mode_metadata.valid_sides) > 0
|
198
|
+
)
|
199
|
+
self._estimatedCorWidget.setVisible(estimated_cor_widget_visible)
|
200
|
+
self._estimatedCorWidget._updateVisibleSides(mode=mode)
|
201
|
+
|
202
|
+
def setAxisParams(self, axis):
|
203
|
+
with block_signals(self):
|
204
|
+
if self._axis_params is not None:
|
205
|
+
self._axis_params.sigChanged.disconnect(self._axis_params_changed)
|
206
|
+
self._axis_params = axis
|
207
|
+
if self._axis_params.mode in (axis_mode.AxisMode.manual,):
|
208
|
+
# those mode cannot be handled by the auto calculation dialog
|
209
|
+
self._axis_params.mode = axis_mode.AxisMode.growing_window_radios
|
210
|
+
self._axis_params.sigChanged.connect(self._axis_params_changed)
|
211
|
+
self._axis_params_changed()
|
212
|
+
|
213
|
+
def _axis_params_changed(self, *args, **kwargs):
|
214
|
+
self.setMode(self._axis_params.mode)
|
215
|
+
|
216
|
+
def setScan(self, scan: TomwerScanBase | None):
|
217
|
+
self._estimatedCorWidget.setPixelSize(pixel_size_m=scan.x_pixel_size)
|
218
|
+
self._estimatedCorWidget.setImageWidth(image_width=scan.dim_1)
|
@@ -1,31 +1,5 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
|
3
|
-
#
|
4
|
-
# Copyright (c) 2016-2017 European Synchrotron Radiation Facility
|
5
|
-
#
|
6
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
-
# of this software and associated documentation files (the "Software"), to deal
|
8
|
-
# in the Software without restriction, including without limitation the rights
|
9
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
-
# copies of the Software, and to permit persons to whom the Software is
|
11
|
-
# furnished to do so, subject to the following conditions:
|
12
|
-
#
|
13
|
-
# The above copyright notice and this permission notice shall be included in
|
14
|
-
# all copies or substantial portions of the Software.
|
15
|
-
#
|
16
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
|
-
# THE SOFTWARE.
|
23
|
-
#
|
24
|
-
# ###########################################################################*/
|
25
|
-
|
26
|
-
__authors__ = ["v. Valls", "H. Payno"]
|
27
|
-
__license__ = "MIT"
|
28
|
-
__date__ = "26/02/2019"
|
2
|
+
from __future__ import annotations
|
29
3
|
|
30
4
|
import logging
|
31
5
|
import weakref
|
@@ -100,7 +74,7 @@ class CompareImagesStatusBar(qt.QStatusBar):
|
|
100
74
|
Use :meth:`setCompareWidget` to connect this toolbar to a specific
|
101
75
|
:class:`CompareImages` widget.
|
102
76
|
|
103
|
-
:param
|
77
|
+
:param parent: Parent of this widget.
|
104
78
|
"""
|
105
79
|
|
106
80
|
def __init__(self, parent=None):
|
@@ -127,7 +101,7 @@ class CompareImagesStatusBar(qt.QStatusBar):
|
|
127
101
|
"""
|
128
102
|
Connect this tool bar to a specific :class:`CompareImages` widget.
|
129
103
|
|
130
|
-
:param
|
104
|
+
:param widget: The widget to connect with.
|
131
105
|
"""
|
132
106
|
compareWidget = self.getCompareWidget()
|
133
107
|
if compareWidget is not None:
|
@@ -142,11 +116,8 @@ class CompareImagesStatusBar(qt.QStatusBar):
|
|
142
116
|
compareWidget.getPlot().sigPlotSignal.connect(self.__plotSignalReceived)
|
143
117
|
compareWidget.sigConfigurationChanged.connect(self.__dataChanged)
|
144
118
|
|
145
|
-
def getCompareWidget(self):
|
146
|
-
"""Returns the connected widget.
|
147
|
-
|
148
|
-
:rtype: CompareImages
|
149
|
-
"""
|
119
|
+
def getCompareWidget(self) -> CompareImages:
|
120
|
+
"""Returns the connected widget."""
|
150
121
|
if self.__compareWidget is None:
|
151
122
|
return None
|
152
123
|
else:
|
@@ -167,13 +138,12 @@ class CompareImagesStatusBar(qt.QStatusBar):
|
|
167
138
|
"""Called when internal data from the connected widget changes."""
|
168
139
|
self._updateStatusBar()
|
169
140
|
|
170
|
-
def _formatData(self, data):
|
141
|
+
def _formatData(self, data: int | float | None) -> str:
|
171
142
|
"""Format pixel of an image.
|
172
143
|
|
173
144
|
It supports intensity, RGB, and RGBA.
|
174
145
|
|
175
|
-
:param
|
176
|
-
:rtype: str
|
146
|
+
:param data: Value of a pixel
|
177
147
|
"""
|
178
148
|
if data is None:
|
179
149
|
return "-"
|
@@ -287,11 +257,11 @@ class CompareImagesToolBar(qt.QToolBar):
|
|
287
257
|
if widget is not None:
|
288
258
|
widget.setVisualizationMode(mode)
|
289
259
|
|
290
|
-
def setCompareWidget(self, widget):
|
260
|
+
def setCompareWidget(self, widget: None | CompareImages):
|
291
261
|
"""
|
292
262
|
Connect this tool bar to a specific :class:`CompareImages` widget.
|
293
263
|
|
294
|
-
:param
|
264
|
+
:param widget: The widget to connect the toolbar with.
|
295
265
|
"""
|
296
266
|
compareWidget = self.getCompareWidget()
|
297
267
|
if compareWidget is not None:
|
@@ -308,11 +278,8 @@ class CompareImagesToolBar(qt.QToolBar):
|
|
308
278
|
widget.sigConfigurationChanged.connect(self.__updateSelectedActions)
|
309
279
|
self.__updateSelectedActions()
|
310
280
|
|
311
|
-
def getCompareWidget(self):
|
312
|
-
"""Returns the connected widget.
|
313
|
-
|
314
|
-
:rtype: CompareImages
|
315
|
-
"""
|
281
|
+
def getCompareWidget(self) -> CompareImages:
|
282
|
+
"""Returns the connected widget."""
|
316
283
|
if self.__compareWidget is None:
|
317
284
|
return None
|
318
285
|
else:
|
@@ -0,0 +1,285 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import logging
|
4
|
+
import numpy
|
5
|
+
|
6
|
+
from silx.gui import qt
|
7
|
+
|
8
|
+
from tomwer.core.process.reconstruction.utils.cor import (
|
9
|
+
absolute_pos_to_relative,
|
10
|
+
relative_pos_to_absolute,
|
11
|
+
)
|
12
|
+
from tomwer.gui.utils.buttons import PadlockButton
|
13
|
+
from tomwer.gui.settings import EDITING_BACKGROUND_COLOR
|
14
|
+
from tomwer.synctools.axis import QAxisRP
|
15
|
+
|
16
|
+
_logger = logging.getLogger(__file__)
|
17
|
+
|
18
|
+
|
19
|
+
class ControlWidget(qt.QWidget):
|
20
|
+
"""
|
21
|
+
Widget to lock, compute or validate the cor position and display it value as absolute or relative
|
22
|
+
This is the widget displayed at the bottom of the AxisOW
|
23
|
+
"""
|
24
|
+
|
25
|
+
sigComputationRequest = qt.Signal()
|
26
|
+
"""Signal emitted when user request a computation from the settings"""
|
27
|
+
|
28
|
+
sigValidateRequest = qt.Signal()
|
29
|
+
"""Signal emitted when user validate the current settings"""
|
30
|
+
|
31
|
+
sigLockCORValueChanged = qt.Signal(bool)
|
32
|
+
"""Signal emitted when the user lock the cor value. Param: True if lock"""
|
33
|
+
|
34
|
+
def __init__(self, parent):
|
35
|
+
qt.QWidget.__init__(self, parent)
|
36
|
+
self.setLayout(qt.QVBoxLayout())
|
37
|
+
|
38
|
+
# display 'center' information
|
39
|
+
self._positionInfo = _PositionInfoWidget(parent=self)
|
40
|
+
self.layout().addWidget(self._positionInfo)
|
41
|
+
|
42
|
+
self._buttons = qt.QWidget(parent=self)
|
43
|
+
self._buttons.setLayout(qt.QHBoxLayout())
|
44
|
+
self.layout().addWidget(self._buttons)
|
45
|
+
|
46
|
+
self._lockBut = PadlockButton(parent=self)
|
47
|
+
self._lockBut.setAutoDefault(False)
|
48
|
+
self._lockBut.setDefault(False)
|
49
|
+
|
50
|
+
self._buttons.layout().addWidget(self._lockBut)
|
51
|
+
self._lockLabel = qt.QLabel("lock cor value", parent=self)
|
52
|
+
self._buttons.layout().addWidget(self._lockLabel)
|
53
|
+
|
54
|
+
spacer = qt.QWidget(self)
|
55
|
+
spacer.setSizePolicy(qt.QSizePolicy.Expanding, qt.QSizePolicy.Minimum)
|
56
|
+
self._buttons.layout().addWidget(spacer)
|
57
|
+
|
58
|
+
self._computeBut = qt.QPushButton("compute", parent=self)
|
59
|
+
self._buttons.layout().addWidget(self._computeBut)
|
60
|
+
style = qt.QApplication.style()
|
61
|
+
applyIcon = style.standardIcon(qt.QStyle.SP_DialogApplyButton)
|
62
|
+
self._applyBut = qt.QPushButton(applyIcon, "validate", parent=self)
|
63
|
+
self._buttons.layout().addWidget(self._applyBut)
|
64
|
+
self.layout().addWidget(self._buttons)
|
65
|
+
|
66
|
+
# set up
|
67
|
+
self._positionInfo.setPosition(None, None)
|
68
|
+
|
69
|
+
# make connection
|
70
|
+
self._computeBut.pressed.connect(self._needComputation)
|
71
|
+
self._applyBut.pressed.connect(self._validate)
|
72
|
+
self._lockBut.sigLockChanged.connect(self._lockValueChanged)
|
73
|
+
|
74
|
+
def hideLockButton(self) -> None:
|
75
|
+
self._lockLabel.hide()
|
76
|
+
self._lockBut.hide()
|
77
|
+
|
78
|
+
def hideApplyButton(self) -> None:
|
79
|
+
self._applyBut.hide()
|
80
|
+
|
81
|
+
def _lockValueChanged(self):
|
82
|
+
self.sigLockCORValueChanged.emit(self._lockBut.isLocked())
|
83
|
+
self._computeBut.setEnabled(not self._lockBut.isLocked())
|
84
|
+
|
85
|
+
def _needComputation(self, *arg, **kwargs):
|
86
|
+
"""callback when the radio line changed"""
|
87
|
+
self.sigComputationRequest.emit()
|
88
|
+
|
89
|
+
def _validate(self):
|
90
|
+
self.sigValidateRequest.emit()
|
91
|
+
|
92
|
+
def setPosition(self, relative_cor, abs_cor):
|
93
|
+
self._positionInfo.setPosition(relative_cor=relative_cor, abs_cor=abs_cor)
|
94
|
+
|
95
|
+
def _updateAbsolutePosition(self, width):
|
96
|
+
self._positionInfo._updateAbsolutePosition(width=width)
|
97
|
+
|
98
|
+
def _updateRelativePosition(self, width):
|
99
|
+
self._positionInfo._updateRelativePosition(width=width)
|
100
|
+
|
101
|
+
def isValueLock(self):
|
102
|
+
return self._lockBut.isLocked()
|
103
|
+
|
104
|
+
def setValueLock(self, lock):
|
105
|
+
self._lockBut.setLock(lock)
|
106
|
+
|
107
|
+
|
108
|
+
class _PositionInfoValidator(qt.QDoubleValidator):
|
109
|
+
def validate(self, a0: str, a1: int):
|
110
|
+
if "..." in a0 or a0 == "?":
|
111
|
+
return (qt.QDoubleValidator.Acceptable, a0, a1)
|
112
|
+
else:
|
113
|
+
return super().validate(a0, a1)
|
114
|
+
|
115
|
+
|
116
|
+
class _PositionInfoWidget(qt.QWidget):
|
117
|
+
"""Widget used to display information relative to the current position"""
|
118
|
+
|
119
|
+
sigRelativeValueSet = qt.Signal(float)
|
120
|
+
"""Emit when the user define manually the relative value"""
|
121
|
+
sigAbsolueValueSet = qt.Signal(float)
|
122
|
+
"""Emit when the user define manually the absolute value"""
|
123
|
+
|
124
|
+
def __init__(self, parent, axis=None):
|
125
|
+
self._axis_params = None
|
126
|
+
self._defaultBackgroundColor = None
|
127
|
+
qt.QWidget.__init__(self, parent)
|
128
|
+
self.setLayout(qt.QGridLayout())
|
129
|
+
centerLabel = qt.QLabel("center", parent=self)
|
130
|
+
centerLabel.setSizePolicy(qt.QSizePolicy.Minimum, qt.QSizePolicy.Minimum)
|
131
|
+
font = centerLabel.font()
|
132
|
+
font.setBold(True)
|
133
|
+
centerLabel.setFont(font)
|
134
|
+
|
135
|
+
self.layout().addWidget(centerLabel, 0, 0, 1, 1)
|
136
|
+
self.layout().addWidget(qt.QLabel(" (relative):"), 0, 1, 1, 1)
|
137
|
+
|
138
|
+
self._relativePositionQLE = qt.QLineEdit("", parent=self)
|
139
|
+
self._positionValidator = _PositionInfoValidator(self)
|
140
|
+
self._relativePositionQLE.setValidator(self._positionValidator)
|
141
|
+
self._relativePositionQLE.setSizePolicy(
|
142
|
+
qt.QSizePolicy.Expanding, qt.QSizePolicy.Minimum
|
143
|
+
)
|
144
|
+
self._relativePositionQLE.setStyleSheet("color: red")
|
145
|
+
self.layout().addWidget(self._relativePositionQLE, 0, 2, 1, 1)
|
146
|
+
|
147
|
+
centerLabel = qt.QLabel("center", parent=self)
|
148
|
+
centerLabel.setSizePolicy(qt.QSizePolicy.Minimum, qt.QSizePolicy.Minimum)
|
149
|
+
font = centerLabel.font()
|
150
|
+
font.setBold(False)
|
151
|
+
centerLabel.setFont(font)
|
152
|
+
|
153
|
+
self.layout().addWidget(centerLabel, 1, 0, 1, 1)
|
154
|
+
self.layout().addWidget(qt.QLabel(" (absolute):"), 1, 1, 1, 1)
|
155
|
+
self._absolutePositionQLE = qt.QLineEdit("", parent=self)
|
156
|
+
self._absolutePositionQLE.setValidator(self._positionValidator)
|
157
|
+
self._absolutePositionQLE.setSizePolicy(
|
158
|
+
qt.QSizePolicy.Expanding, qt.QSizePolicy.Minimum
|
159
|
+
)
|
160
|
+
self._absolutePositionQLE.setStyleSheet("color: #ff8c00")
|
161
|
+
self.layout().addWidget(self._absolutePositionQLE, 1, 2, 1, 1)
|
162
|
+
|
163
|
+
if axis:
|
164
|
+
self.setAxisParams(axis)
|
165
|
+
|
166
|
+
# connect signal / slot
|
167
|
+
self._relativePositionQLE.textEdited.connect(
|
168
|
+
self._userStartEditingRelativePosition
|
169
|
+
)
|
170
|
+
self._relativePositionQLE.editingFinished.connect(
|
171
|
+
self._userUpdatedRelativePosition
|
172
|
+
)
|
173
|
+
self._absolutePositionQLE.textEdited.connect(
|
174
|
+
self._userStartEditingAbsolutePosition
|
175
|
+
)
|
176
|
+
|
177
|
+
self._absolutePositionQLE.editingFinished.connect(
|
178
|
+
self._userUpdatedAbsolutePosition
|
179
|
+
)
|
180
|
+
|
181
|
+
def _getDefaultBackgroundColor(self):
|
182
|
+
if self._defaultBackgroundColor is None:
|
183
|
+
self._defaultBackgroundColor = self.palette().color(
|
184
|
+
self._absolutePositionQLE.backgroundRole()
|
185
|
+
)
|
186
|
+
return self._defaultBackgroundColor
|
187
|
+
|
188
|
+
def _userStartEditingRelativePosition(self, *args, **kwargs):
|
189
|
+
palette = self.palette()
|
190
|
+
palette.setColor(
|
191
|
+
self._relativePositionQLE.backgroundRole(), EDITING_BACKGROUND_COLOR
|
192
|
+
)
|
193
|
+
self._relativePositionQLE.setPalette(palette)
|
194
|
+
|
195
|
+
def _userStartEditingAbsolutePosition(self, *args, **kwargs):
|
196
|
+
palette = self.palette()
|
197
|
+
palette.setColor(
|
198
|
+
self._absolutePositionQLE.backgroundRole(), EDITING_BACKGROUND_COLOR
|
199
|
+
)
|
200
|
+
self._absolutePositionQLE.setPalette(palette)
|
201
|
+
|
202
|
+
def _userUpdatedRelativePosition(self, *args, **kwargs):
|
203
|
+
palette = self.palette()
|
204
|
+
palette.setColor(
|
205
|
+
self._relativePositionQLE.backgroundRole(),
|
206
|
+
self._getDefaultBackgroundColor(),
|
207
|
+
)
|
208
|
+
self._relativePositionQLE.setPalette(palette)
|
209
|
+
if self._relativePositionQLE.text().startswith((".", "?")):
|
210
|
+
return
|
211
|
+
else:
|
212
|
+
value = float(self._relativePositionQLE.text())
|
213
|
+
# make sure we only emit the signal if the value changed (and when the Qline has been edited).
|
214
|
+
if self._axis_params.relative_cor_value is None or (
|
215
|
+
self._axis_params is not None
|
216
|
+
and not numpy.isclose(
|
217
|
+
value, self._axis_params.relative_cor_value, atol=1e-3
|
218
|
+
)
|
219
|
+
):
|
220
|
+
self.sigRelativeValueSet.emit(value)
|
221
|
+
|
222
|
+
def _userUpdatedAbsolutePosition(self, *args, **kwargs):
|
223
|
+
palette = self.palette()
|
224
|
+
palette.setColor(
|
225
|
+
self._absolutePositionQLE.backgroundRole(),
|
226
|
+
self._getDefaultBackgroundColor(),
|
227
|
+
)
|
228
|
+
self._absolutePositionQLE.setPalette(palette)
|
229
|
+
if self._absolutePositionQLE.text().startswith((".", "?")):
|
230
|
+
return
|
231
|
+
else:
|
232
|
+
value = float(self._absolutePositionQLE.text())
|
233
|
+
# make sure we only emit the signal if the value changed (and when the Qline has been edited).
|
234
|
+
if self._axis_params.absolute_cor_value is None or (
|
235
|
+
self._axis_params is not None
|
236
|
+
and not numpy.isclose(
|
237
|
+
value, self._axis_params.absolute_cor_value, atol=1e-3
|
238
|
+
)
|
239
|
+
):
|
240
|
+
self.sigAbsolueValueSet.emit(value)
|
241
|
+
|
242
|
+
def setAxisParams(self, axis):
|
243
|
+
assert isinstance(axis, QAxisRP)
|
244
|
+
if axis == self._axis_params:
|
245
|
+
return
|
246
|
+
self._axis_params = axis
|
247
|
+
|
248
|
+
def getPosition(self):
|
249
|
+
return float(self._relativePositionQLE.text())
|
250
|
+
|
251
|
+
def setPosition(self, relative_cor: float | None, abs_cor: float | None):
|
252
|
+
if relative_cor is None:
|
253
|
+
self._relativePositionQLE.setText("?")
|
254
|
+
elif isinstance(relative_cor, str):
|
255
|
+
self._relativePositionQLE.setText(relative_cor)
|
256
|
+
else:
|
257
|
+
self._relativePositionQLE.setText(f"{relative_cor:.3f}")
|
258
|
+
if abs_cor is None:
|
259
|
+
self._absolutePositionQLE.setText("?")
|
260
|
+
else:
|
261
|
+
self._absolutePositionQLE.setText(f"{abs_cor:.3f}")
|
262
|
+
|
263
|
+
def _updateAbsolutePosition(self, width):
|
264
|
+
if width is not None:
|
265
|
+
try:
|
266
|
+
rel_value = float(self._relativePositionQLE.text())
|
267
|
+
except Exception:
|
268
|
+
return
|
269
|
+
else:
|
270
|
+
abs_value = relative_pos_to_absolute(
|
271
|
+
relative_pos=float(rel_value), det_width=width
|
272
|
+
)
|
273
|
+
self._absolutePositionQLE.setText(str(abs_value))
|
274
|
+
|
275
|
+
def _updateRelativePosition(self, width):
|
276
|
+
if width is not None:
|
277
|
+
try:
|
278
|
+
abs_value = float(self._absolutePositionQLE.text())
|
279
|
+
except Exception:
|
280
|
+
return
|
281
|
+
else:
|
282
|
+
rel_value = absolute_pos_to_relative(
|
283
|
+
absolute_pos=float(abs_value), det_width=width
|
284
|
+
)
|
285
|
+
self._relativePositionQLE.setText(str(rel_value))
|