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
tomwer/gui/utils/flow.py
CHANGED
@@ -1,35 +1,7 @@
|
|
1
|
-
|
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__ = ["H. Payno"]
|
27
|
-
__license__ = "MIT"
|
28
|
-
__date__ = "04/03/2019"
|
29
|
-
|
1
|
+
from __future__ import annotations
|
30
2
|
|
31
3
|
import functools
|
32
|
-
from typing import
|
4
|
+
from typing import Iterable
|
33
5
|
|
34
6
|
from silx.gui import qt
|
35
7
|
from silx.utils.enum import Enum as _Enum
|
@@ -194,7 +166,6 @@ class FlowCanvas(qt.QWidget):
|
|
194
166
|
Widget to describe a flow of process - pipeline
|
195
167
|
|
196
168
|
:param direction: direction can be vertical or horizontal
|
197
|
-
:type direction: Union[str,FlowDirection]
|
198
169
|
"""
|
199
170
|
|
200
171
|
sigWidgetActivated = qt.Signal()
|
@@ -204,7 +175,7 @@ class FlowCanvas(qt.QWidget):
|
|
204
175
|
active process anymore)"""
|
205
176
|
|
206
177
|
def __init__(
|
207
|
-
self, parent, direction:
|
178
|
+
self, parent, direction: str | FlowDirection, show_lock_state=True
|
208
179
|
) -> None:
|
209
180
|
qt.QWidget.__init__(self, parent=parent)
|
210
181
|
self._direction = FlowDirection.from_value(direction)
|
@@ -251,7 +222,6 @@ class FlowCanvas(qt.QWidget):
|
|
251
222
|
:param process_name: any object. Should implement the __str__ interface
|
252
223
|
to define the name if no icon is given
|
253
224
|
:return: process id in the process flow
|
254
|
-
:rtype: int
|
255
225
|
"""
|
256
226
|
if icon is None:
|
257
227
|
assert hasattr(process, "__str__")
|
@@ -292,7 +262,7 @@ class FlowCanvas(qt.QWidget):
|
|
292
262
|
def removeProcess(self, process_id: int) -> None:
|
293
263
|
"""
|
294
264
|
|
295
|
-
:param
|
265
|
+
:param process_id: id of the process to remove from the flow
|
296
266
|
"""
|
297
267
|
if process_id in self._dockers:
|
298
268
|
dockWidget = self._dockers[process_id]
|
@@ -304,12 +274,14 @@ class FlowCanvas(qt.QWidget):
|
|
304
274
|
for process_id in processes_id:
|
305
275
|
self.removeProcess(process_id=process_id)
|
306
276
|
|
307
|
-
def setProcesses(
|
277
|
+
def setProcesses(
|
278
|
+
self, processes: Iterable, icons: Iterable, draggability: Iterable
|
279
|
+
) -> None:
|
308
280
|
"""
|
309
281
|
|
310
|
-
:param
|
311
|
-
:param
|
312
|
-
:param
|
282
|
+
:param processes: processes of the flow
|
283
|
+
:param icons: icons associated to the flow
|
284
|
+
:param draggability: is the process draggable or not
|
313
285
|
:return:
|
314
286
|
"""
|
315
287
|
for process, icon, draggable in zip(processes, icons, draggability):
|
@@ -328,11 +300,10 @@ class FlowCanvas(qt.QWidget):
|
|
328
300
|
"""
|
329
301
|
|
330
302
|
:return: True if the canvas has a process active / focus ...
|
331
|
-
:rtype: bool
|
332
303
|
"""
|
333
304
|
return self.getProcessFocused() is not None
|
334
305
|
|
335
|
-
def getProcessFocused(self) ->
|
306
|
+
def getProcessFocused(self) -> int | None:
|
336
307
|
"""
|
337
308
|
|
338
309
|
:return: id of the process focus or None if no process focus
|
tomwer/gui/utils/gpu.py
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from nabu.cuda.utils import collect_cuda_gpus
|
4
|
+
from silx.gui import qt
|
5
|
+
|
6
|
+
|
7
|
+
class SelectGPUGroupBox(qt.QGroupBox):
|
8
|
+
"""Interface to select a (local) GPU"""
|
9
|
+
|
10
|
+
sigGPUChanged = qt.Signal()
|
11
|
+
"""Emit when the selected GPU changed"""
|
12
|
+
|
13
|
+
def __init__(self, parent=None, title="select (local) GPU"):
|
14
|
+
super().__init__(parent=parent, title=title)
|
15
|
+
self.setCheckable(True)
|
16
|
+
self.setLayout(qt.QFormLayout())
|
17
|
+
self.__cuda_gpus = collect_cuda_gpus() or {}
|
18
|
+
|
19
|
+
# warn user if no gpu found: reconstruction will work but will take way more time
|
20
|
+
if len(self.__cuda_gpus) == 0:
|
21
|
+
style = qt.QApplication.style()
|
22
|
+
icon = style.standardIcon(qt.QStyle.SP_MessageBoxWarning)
|
23
|
+
self.__iconLabel = qt.QLabel(parent=self)
|
24
|
+
self.__iconLabel.setPixmap(icon.pixmap(80, 80))
|
25
|
+
self.__noGPULabel = qt.QLabel("No cuda GPU detected")
|
26
|
+
self.__noGPULabel.setToolTip(
|
27
|
+
"No cuda GPU device detected. Reconstruction will be done on CPU which is much more slower"
|
28
|
+
)
|
29
|
+
self.layout().addRow(self.__iconLabel, self.__noGPULabel)
|
30
|
+
|
31
|
+
self._gpusCB = qt.QComboBox(self)
|
32
|
+
for gpu_id, gpu_desc in self.__cuda_gpus.items():
|
33
|
+
name = gpu_desc.get("name", f"unknown gpu {gpu_id}")
|
34
|
+
self._gpusCB.addItem(f"{name} (id-{gpu_id})", gpu_id)
|
35
|
+
self.layout().addRow(self._gpusCB)
|
36
|
+
|
37
|
+
# connect signal / slot
|
38
|
+
self._gpusCB.currentIndexChanged.connect(self.__GPUChanged)
|
39
|
+
|
40
|
+
@property
|
41
|
+
def cuda_gpus(self) -> dict:
|
42
|
+
return self.__cudaGPUs
|
43
|
+
|
44
|
+
def getSelectedGPUId(self) -> int | None:
|
45
|
+
if self.isChecked():
|
46
|
+
selected_gpu = self._gpusCB.currentIndex()
|
47
|
+
if selected_gpu == -1:
|
48
|
+
return None
|
49
|
+
else:
|
50
|
+
return self._gpusCB.itemData(selected_gpu, qt.Qt.UserRole)
|
51
|
+
else:
|
52
|
+
return None
|
53
|
+
|
54
|
+
def setSelectedGPUId(self, value: int):
|
55
|
+
cb_index = self._gpusCB.findData(value, role=qt.Qt.UserRole)
|
56
|
+
if cb_index >= 0:
|
57
|
+
self._gpusCB.setCurrentIndex(cb_index)
|
58
|
+
|
59
|
+
def __GPUChanged(self, *args, **kwargs):
|
60
|
+
self.sigGPUChanged.emit()
|
@@ -1,35 +1,10 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
# /*##########################################################################
|
3
|
-
# Copyright (C) 2017 European Synchrotron Radiation Facility
|
4
|
-
#
|
5
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
-
# of this software and associated documentation files (the "Software"), to deal
|
7
|
-
# in the Software without restriction, including without limitation the rights
|
8
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
-
# copies of the Software, and to permit persons to whom the Software is
|
10
|
-
# furnished to do so, subject to the following conditions:
|
11
|
-
#
|
12
|
-
# The above copyright notice and this permission notice shall be included in
|
13
|
-
# all copies or substantial portions of the Software.
|
14
|
-
#
|
15
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
-
# THE SOFTWARE.
|
22
|
-
#
|
23
|
-
#############################################################################*/
|
24
2
|
|
25
3
|
"""
|
26
4
|
Some utils GUI associated to illustrations
|
27
5
|
"""
|
28
6
|
|
29
|
-
|
30
|
-
__license__ = "MIT"
|
31
|
-
__date__ = "28/09/2018"
|
32
|
-
|
7
|
+
from __future__ import annotations
|
33
8
|
|
34
9
|
from silx.gui import qt
|
35
10
|
|
tomwer/gui/utils/inputwidget.py
CHANGED
@@ -1,34 +1,7 @@
|
|
1
|
-
|
2
|
-
# /*##########################################################################
|
3
|
-
# Copyright (C) 2017 European Synchrotron Radiation Facility
|
4
|
-
#
|
5
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
-
# of this software and associated documentation files (the "Software"), to deal
|
7
|
-
# in the Software without restriction, including without limitation the rights
|
8
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
-
# copies of the Software, and to permit persons to whom the Software is
|
10
|
-
# furnished to do so, subject to the following conditions:
|
11
|
-
#
|
12
|
-
# The above copyright notice and this permission notice shall be included in
|
13
|
-
# all copies or substantial portions of the Software.
|
14
|
-
#
|
15
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
-
# THE SOFTWARE.
|
22
|
-
#
|
23
|
-
#############################################################################*/
|
24
|
-
|
25
|
-
__authors__ = ["H.Payno"]
|
26
|
-
__license__ = "MIT"
|
27
|
-
__date__ = "16/08/2018"
|
1
|
+
from __future__ import annotations
|
28
2
|
|
29
3
|
import logging
|
30
4
|
import os
|
31
|
-
from typing import Optional, Union
|
32
5
|
|
33
6
|
import numpy
|
34
7
|
from nxtomomill.io.config import TomoEDFConfig as EDFConfig
|
@@ -39,6 +12,7 @@ from tomoscan.identifier import BaseIdentifier
|
|
39
12
|
|
40
13
|
from tomwer.gui import icons
|
41
14
|
from tomwer.gui.qlefilesystem import QLFileSystem
|
15
|
+
from tomwer.gui.utils.qt_utils import block_signals
|
42
16
|
from tomwer.io.utils import get_default_directory
|
43
17
|
from tomwer.core.volume.volumefactory import VolumeFactory
|
44
18
|
from tomwer.core.process.output import ProcessDataOutputDirMode
|
@@ -88,7 +62,7 @@ class SelectionLineEdit(qt.QWidget):
|
|
88
62
|
self._button = SelectionModeButton(parent=self)
|
89
63
|
self.layout().addWidget(self._button)
|
90
64
|
|
91
|
-
#
|
65
|
+
# QObject signal connections
|
92
66
|
self._qLineEdit.textChanged.connect(self._checkIfModeChanged)
|
93
67
|
self._button.sigModeChanged.connect(self._modeChanged)
|
94
68
|
|
@@ -135,12 +109,11 @@ class SelectionLineEdit(qt.QWidget):
|
|
135
109
|
return None
|
136
110
|
|
137
111
|
def _checkIfModeChanged(self, _str):
|
138
|
-
self._button
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
self._button.blockSignals(False)
|
112
|
+
with block_signals(self._button):
|
113
|
+
if _str.count(":") > 0:
|
114
|
+
self._button.mode = self.RANGE_MODE
|
115
|
+
else:
|
116
|
+
self._button.mode = self.LIST_MODE
|
144
117
|
|
145
118
|
def _modeChanged(self, mode):
|
146
119
|
if mode == self.RANGE_MODE:
|
@@ -148,24 +121,24 @@ class SelectionLineEdit(qt.QWidget):
|
|
148
121
|
elif mode == self.LIST_MODE:
|
149
122
|
text = "val1; val2; ..."
|
150
123
|
else:
|
151
|
-
raise ValueError("
|
124
|
+
raise ValueError("unknown mode")
|
152
125
|
|
153
|
-
self._qLineEdit
|
154
|
-
|
155
|
-
self._qLineEdit.blockSignals(False)
|
126
|
+
with block_signals(self._qLineEdit):
|
127
|
+
self._qLineEdit.setPlaceholderText(text)
|
156
128
|
|
157
129
|
|
158
130
|
class SelectionModeButton(qt.QToolButton):
|
159
131
|
"""Base class for Selection QAction.
|
160
132
|
|
161
|
-
:param
|
162
|
-
:param
|
163
|
-
:param
|
133
|
+
:param mode: the mode of selection of the action.
|
134
|
+
:param text: The name of this action to be used for menu label
|
135
|
+
:param tooltip: The text of the tooltip
|
164
136
|
:param triggered: The callback to connect to the action's triggered
|
165
137
|
signal or None for no callback.
|
166
138
|
"""
|
167
139
|
|
168
140
|
sigModeChanged = qt.Signal(str)
|
141
|
+
"""signal emit when the mode is changed"""
|
169
142
|
|
170
143
|
def __init__(self, parent=None, tooltip=None, triggered=None):
|
171
144
|
qt.QToolButton.__init__(self, parent)
|
@@ -223,6 +196,7 @@ class SelectionAction(qt.QAction):
|
|
223
196
|
"""
|
224
197
|
|
225
198
|
sigModeChanged = qt.Signal(str)
|
199
|
+
"""emit when the mode change"""
|
226
200
|
|
227
201
|
def __init__(self, mode, parent, text):
|
228
202
|
icon = icons.getQIcon("_".join([mode, "selection"]))
|
@@ -272,7 +246,6 @@ class NXTomomillOutputDirSelector(qt.QWidget):
|
|
272
246
|
|
273
247
|
tooltip = """Define the output directory of the nexus (.nx) file. Options are:
|
274
248
|
\n - same folder as scan: create the NXtomos at the same level as the bliss input file or spec folder
|
275
|
-
\n - 'RAW_DATA' folder: create NXtomos on the default 'RAW_DATA' folder (bliss default folder, nearby the 'raw' folder).
|
276
249
|
\n - 'PROCESSED_DATA' folder: create NXtomos on the default 'PROCESSED_DATA' folder (bliss default folder, nearby the 'raw' folder).
|
277
250
|
\n - user defined folder: users can provide their own folders using keywords for string formatting such as 'scan_dir_name', 'scan_basename' or 'scan_parent_dir_basename'
|
278
251
|
"""
|
@@ -287,11 +260,6 @@ class NXTomomillOutputDirSelector(qt.QWidget):
|
|
287
260
|
self._processedDataFolderRB.setToolTip(tooltip)
|
288
261
|
self.layout().addWidget(self._processedDataFolderRB, 1, 0, 1, 1)
|
289
262
|
self.__buttonGroup.addButton(self._processedDataFolderRB)
|
290
|
-
# output dir is the default 'reduced'folder
|
291
|
-
self._rawDataFolderRB = qt.QRadioButton("'RAW_DATA' folder", self)
|
292
|
-
self._rawDataFolderRB.setToolTip(tooltip)
|
293
|
-
self.layout().addWidget(self._rawDataFolderRB, 2, 0, 1, 1)
|
294
|
-
self.__buttonGroup.addButton(self._rawDataFolderRB)
|
295
263
|
# manual
|
296
264
|
self._manualRB = qt.QRadioButton("custom output directory", self)
|
297
265
|
self._manualRB.setToolTip(tooltip)
|
@@ -311,7 +279,6 @@ class NXTomomillOutputDirSelector(qt.QWidget):
|
|
311
279
|
self.__buttonGroup.buttonReleased.connect(self._updateVisiblity)
|
312
280
|
self._inScanFolder.toggled.connect(self.sigChanged)
|
313
281
|
self._processedDataFolderRB.toggled.connect(self.sigChanged)
|
314
|
-
self._rawDataFolderRB.toggled.connect(self.sigChanged)
|
315
282
|
self._manualRB.toggled.connect(self.sigChanged)
|
316
283
|
self._outputFolderQLE.editingFinished.connect(self.sigChanged)
|
317
284
|
|
@@ -338,38 +305,33 @@ class NXTomomillOutputDirSelector(qt.QWidget):
|
|
338
305
|
self._outputFolderQLE.setText(dialog.selectedFiles()[0])
|
339
306
|
self.sigChanged.emit()
|
340
307
|
|
341
|
-
def getOutputFolder(self) ->
|
308
|
+
def getOutputFolder(self) -> str | ProcessDataOutputDirMode:
|
342
309
|
if self._manualRB.isChecked():
|
343
310
|
return self._outputFolderQLE.text()
|
344
311
|
elif self._processedDataFolderRB.isChecked():
|
345
312
|
return ProcessDataOutputDirMode.PROCESSED_DATA_FOLDER
|
346
313
|
elif self._inScanFolder.isChecked():
|
347
314
|
return ProcessDataOutputDirMode.IN_SCAN_FOLDER
|
348
|
-
elif self._rawDataFolderRB.isChecked():
|
349
|
-
return ProcessDataOutputDirMode.RAW_DATA_FOLDER
|
350
315
|
else:
|
351
316
|
raise RuntimeError("Use case - h52nx output dir - not handled")
|
352
317
|
|
353
318
|
def setOutputFolder(self, output_folder: str):
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
else:
|
362
|
-
if default_output is ProcessDataOutputDirMode.IN_SCAN_FOLDER:
|
363
|
-
self._inScanFolder.setChecked(True)
|
364
|
-
elif default_output is ProcessDataOutputDirMode.PROCESSED_DATA_FOLDER:
|
365
|
-
self._processedDataFolderRB.setChecked(True)
|
366
|
-
elif default_output is ProcessDataOutputDirMode.RAW_DATA_FOLDER:
|
367
|
-
self._rawDataFolderRB.setChecked(True)
|
319
|
+
with block_signals(self):
|
320
|
+
self._manualRB.setChecked(output_folder is not None)
|
321
|
+
try:
|
322
|
+
default_output = ProcessDataOutputDirMode.from_value(output_folder)
|
323
|
+
except ValueError:
|
324
|
+
self._outputFolderQLE.setText(output_folder)
|
325
|
+
self._manualRB.setChecked(True)
|
368
326
|
else:
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
327
|
+
if default_output is ProcessDataOutputDirMode.IN_SCAN_FOLDER:
|
328
|
+
self._inScanFolder.setChecked(True)
|
329
|
+
elif default_output is ProcessDataOutputDirMode.PROCESSED_DATA_FOLDER:
|
330
|
+
self._processedDataFolderRB.setChecked(True)
|
331
|
+
else:
|
332
|
+
raise ValueError(f"default output not handled ({default_output})")
|
333
|
+
finally:
|
334
|
+
self._updateVisiblity()
|
373
335
|
|
374
336
|
|
375
337
|
class _ConfigFileSelector(qt.QWidget):
|
@@ -381,7 +343,7 @@ class _ConfigFileSelector(qt.QWidget):
|
|
381
343
|
|
382
344
|
def __init__(self, parent=None, try_load_cfg: bool = True):
|
383
345
|
"""
|
384
|
-
:param
|
346
|
+
:param try_load_cfg: If True then when a file path is provided will try to load the configuration using '_load_config' and display error if the file is malformed
|
385
347
|
"""
|
386
348
|
super().__init__(parent)
|
387
349
|
self._try_load_cfg = try_load_cfg
|
@@ -517,7 +479,7 @@ class OutputVolumeDefinition(qt.QWidget):
|
|
517
479
|
else:
|
518
480
|
return self.selectOutputFolder()
|
519
481
|
|
520
|
-
def selectOutputFile(self, extensions) ->
|
482
|
+
def selectOutputFile(self, extensions) -> str | None:
|
521
483
|
dialog = qt.QFileDialog(self)
|
522
484
|
dialog.setNameFilters(extensions)
|
523
485
|
if os.environ.get("TOMWER_DEFAULT_INPUT_DIR", None) and os.path.exists(
|
@@ -538,7 +500,7 @@ class OutputVolumeDefinition(qt.QWidget):
|
|
538
500
|
else:
|
539
501
|
return dialog.selectedFiles()
|
540
502
|
|
541
|
-
def selectOutputFolder(self) ->
|
503
|
+
def selectOutputFolder(self) -> str | None:
|
542
504
|
dialog = qt.QFileDialog(self)
|
543
505
|
dialog.setFileMode(qt.QFileDialog.DirectoryOnly)
|
544
506
|
if os.environ.get("TOMWER_DEFAULT_INPUT_DIR", None) and os.path.exists(
|
@@ -1,37 +1,8 @@
|
|
1
|
-
|
2
|
-
# Copyright (C) 20016-2017 European Synchrotron Radiation Facility
|
3
|
-
#
|
4
|
-
# This file is part of tomogui. Interface for tomography developed at
|
5
|
-
# the ESRF by the Software group.
|
6
|
-
#
|
7
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
8
|
-
# of this software and associated documentation files (the "Software"), to deal
|
9
|
-
# in the Software without restriction, including without limitation the rights
|
10
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
11
|
-
# copies of the Software, and to permit persons to whom the Software is
|
12
|
-
# furnished to do so, subject to the following conditions:
|
13
|
-
#
|
14
|
-
# The above copyright notice and this permission notice shall be included in
|
15
|
-
# all copies or substantial portions of the Software.
|
16
|
-
#
|
17
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
18
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
19
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
20
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
21
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
22
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
23
|
-
# THE SOFTWARE.
|
24
|
-
#
|
25
|
-
#############################################################################*/
|
26
|
-
|
27
|
-
__author__ = ["H. Payno"]
|
28
|
-
__license__ = "MIT"
|
29
|
-
__date__ = "15/09/2017"
|
1
|
+
from __future__ import annotations
|
30
2
|
|
31
3
|
import logging
|
32
4
|
from collections import OrderedDict
|
33
|
-
from
|
34
|
-
from typing import Optional, Union
|
5
|
+
from typing import Iterable
|
35
6
|
|
36
7
|
import numpy
|
37
8
|
from silx.gui import qt
|
@@ -45,11 +16,10 @@ class QSliceSelectorDialog(qt.QDialog):
|
|
45
16
|
The dialog used to select some slice indexes from a radio
|
46
17
|
|
47
18
|
:param QWidget parent: parent widget
|
48
|
-
:param
|
49
|
-
the user to select
|
19
|
+
:param n_required_slice: number of required slice we expect the user to select
|
50
20
|
"""
|
51
21
|
|
52
|
-
def __init__(self, parent, n_required_slice=None):
|
22
|
+
def __init__(self, parent, n_required_slice: int | None = None):
|
53
23
|
qt.QDialog.__init__(self, parent=parent)
|
54
24
|
self.setLayout(qt.QVBoxLayout())
|
55
25
|
self.setWindowTitle("select slices on radio")
|
@@ -73,7 +43,6 @@ class QSliceSelectorDialog(qt.QDialog):
|
|
73
43
|
"""
|
74
44
|
|
75
45
|
:param rows: define the selection
|
76
|
-
:type: Iterable
|
77
46
|
"""
|
78
47
|
if self.nRequiredSlice() is not None and len(selection) > self.nRequiredSlice():
|
79
48
|
raise ValueError(
|
@@ -94,7 +63,6 @@ class QSliceSelectorDialog(qt.QDialog):
|
|
94
63
|
"""
|
95
64
|
|
96
65
|
:return: the selection of slices to use
|
97
|
-
:rtype: tuple
|
98
66
|
"""
|
99
67
|
return self.mainWidget.getSelection()
|
100
68
|
|
@@ -107,7 +75,7 @@ class QSliceSelectorDialog(qt.QDialog):
|
|
107
75
|
else:
|
108
76
|
return qt.QDialog.exec_(self)
|
109
77
|
|
110
|
-
def nRequiredSlice(self) ->
|
78
|
+
def nRequiredSlice(self) -> int | None:
|
111
79
|
return self.mainWidget.nRequiredSlice()
|
112
80
|
|
113
81
|
|
@@ -129,7 +97,7 @@ class QLineSelector(qt.QWidget):
|
|
129
97
|
# connect signal / slot
|
130
98
|
self._plot.sigPlotSignal.connect(self._plotDrawEvent)
|
131
99
|
|
132
|
-
def nRequiredSlice(self) ->
|
100
|
+
def nRequiredSlice(self) -> int | None:
|
133
101
|
return self._n_required_slice
|
134
102
|
|
135
103
|
def setData(self, data: numpy.ndarray):
|
@@ -137,7 +105,6 @@ class QLineSelector(qt.QWidget):
|
|
137
105
|
Define the data from which we can select slices
|
138
106
|
|
139
107
|
:param data: data to plot
|
140
|
-
:type: numpy.ndarray
|
141
108
|
"""
|
142
109
|
self._has_data = True
|
143
110
|
self._plot.addImage(data)
|
@@ -147,7 +114,6 @@ class QLineSelector(qt.QWidget):
|
|
147
114
|
"""
|
148
115
|
|
149
116
|
:return: the selection of slices to use
|
150
|
-
:rtype: tuple
|
151
117
|
"""
|
152
118
|
res = []
|
153
119
|
for _, marker in self.__selection.items():
|
@@ -167,7 +133,6 @@ class QLineSelector(qt.QWidget):
|
|
167
133
|
"""
|
168
134
|
|
169
135
|
:param rows: define the selection
|
170
|
-
:type: Iterable
|
171
136
|
"""
|
172
137
|
assert type(rows) is not str
|
173
138
|
self._clear()
|
@@ -175,12 +140,11 @@ class QLineSelector(qt.QWidget):
|
|
175
140
|
for row in rows:
|
176
141
|
self.addSlice(row)
|
177
142
|
|
178
|
-
def addSlice(self, row:
|
143
|
+
def addSlice(self, row: float | int) -> None:
|
179
144
|
"""
|
180
145
|
Add the requested slice to the selection
|
181
146
|
|
182
147
|
:param row:
|
183
|
-
:type; Union[float, int]
|
184
148
|
"""
|
185
149
|
row_n = round(float(row))
|
186
150
|
|
@@ -210,12 +174,11 @@ class QLineSelector(qt.QWidget):
|
|
210
174
|
def _getLegend(self, row_n) -> str:
|
211
175
|
return str(round(float(row_n)))
|
212
176
|
|
213
|
-
def removeSlice(self, row:
|
177
|
+
def removeSlice(self, row: float | int) -> None:
|
214
178
|
"""
|
215
179
|
remove the requested slice from the selection
|
216
180
|
|
217
|
-
:param row:
|
218
|
-
:type; Union[float, int]
|
181
|
+
:param row: row containing the slice to be removed
|
219
182
|
"""
|
220
183
|
legend = self._getLegend(row_n=row)
|
221
184
|
if legend in self.__selection:
|
@@ -0,0 +1,81 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
import functools
|
3
|
+
from silx.utils.enum import Enum as _Enum
|
4
|
+
from silx.gui import qt
|
5
|
+
from tomwer.gui import icons
|
6
|
+
|
7
|
+
|
8
|
+
class LoadingMode(_Enum):
|
9
|
+
ON_SHOW_LOADING = "load when show requested"
|
10
|
+
LAZY_LOADING = "lazy loading"
|
11
|
+
ASAP_LOADING = "load ASAP"
|
12
|
+
|
13
|
+
def icon(self):
|
14
|
+
if self is self.ON_SHOW_LOADING:
|
15
|
+
return icons.getQIcon("low_speed")
|
16
|
+
elif self is self.LAZY_LOADING:
|
17
|
+
return icons.getQIcon("medium_low_speed")
|
18
|
+
elif self is self.ASAP_LOADING:
|
19
|
+
return icons.getQIcon("high_speed")
|
20
|
+
else:
|
21
|
+
raise ValueError(f"loading mode {self} not handled")
|
22
|
+
|
23
|
+
def tooltip(self):
|
24
|
+
if self is self.ON_SHOW_LOADING:
|
25
|
+
return "will load data only when requiring"
|
26
|
+
return icons.getQIcon("medium_low_speed")
|
27
|
+
elif self is self.LAZY_LOADING:
|
28
|
+
return "load data with reduce prefetch"
|
29
|
+
elif self is self.ASAP_LOADING:
|
30
|
+
return "load data as soon as possible"
|
31
|
+
else:
|
32
|
+
raise ValueError(f"loading mode {self} not handled")
|
33
|
+
|
34
|
+
|
35
|
+
class LoadingModeToolButton(qt.QToolButton):
|
36
|
+
"""Tool button to switch keep aspect ratio of a plot"""
|
37
|
+
|
38
|
+
sigLoadModeChanged = qt.Signal(str)
|
39
|
+
|
40
|
+
def __init__(self, parent=None):
|
41
|
+
super(LoadingModeToolButton, self).__init__(parent=parent)
|
42
|
+
menu = qt.QMenu(self)
|
43
|
+
|
44
|
+
action_lazy_loading = LazyLoadingAction(parent=self)
|
45
|
+
# by default icons are not visible from the menu. In this case we want to display it
|
46
|
+
action_lazy_loading.setIconVisibleInMenu(True)
|
47
|
+
fctLL = functools.partial(self.setLoadingMode, LoadingMode.LAZY_LOADING)
|
48
|
+
menu.addAction(action_lazy_loading)
|
49
|
+
|
50
|
+
action_asap_loading = ASAP_LoadingAction(parent=self)
|
51
|
+
action_asap_loading.setIconVisibleInMenu(True)
|
52
|
+
fctAL = functools.partial(self.setLoadingMode, LoadingMode.ASAP_LOADING)
|
53
|
+
menu.addAction(action_asap_loading)
|
54
|
+
|
55
|
+
self.setMenu(menu)
|
56
|
+
# connect signal / slot
|
57
|
+
action_lazy_loading.triggered.connect(fctLL)
|
58
|
+
action_asap_loading.triggered.connect(fctAL)
|
59
|
+
|
60
|
+
# set up
|
61
|
+
self.setPopupMode(qt.QToolButton.InstantPopup)
|
62
|
+
self.setLoadingMode(LoadingMode.LAZY_LOADING)
|
63
|
+
|
64
|
+
def setLoadingMode(self, loadingMode: LoadingMode | str):
|
65
|
+
loadingMode = LoadingMode(loadingMode)
|
66
|
+
assert loadingMode in LoadingMode
|
67
|
+
self.setIcon(loadingMode.icon())
|
68
|
+
self.setToolTip(loadingMode.tooltip())
|
69
|
+
self.sigLoadModeChanged.emit(loadingMode.value)
|
70
|
+
|
71
|
+
|
72
|
+
class LazyLoadingAction(qt.QAction):
|
73
|
+
def __init__(self, parent):
|
74
|
+
super().__init__("load data with small prefetch", parent=parent)
|
75
|
+
self.setIcon(LoadingMode.LAZY_LOADING.icon())
|
76
|
+
|
77
|
+
|
78
|
+
class ASAP_LoadingAction(qt.QAction):
|
79
|
+
def __init__(self, parent):
|
80
|
+
super().__init__("load data ASAP", parent=parent)
|
81
|
+
self.setIcon(LoadingMode.ASAP_LOADING.icon())
|
tomwer/gui/utils/qt_utils.py
CHANGED
@@ -2,6 +2,15 @@ from contextlib import contextmanager
|
|
2
2
|
|
3
3
|
from silx.gui import qt
|
4
4
|
|
5
|
+
if qt.BINDING == "PyQt5":
|
6
|
+
from PyQt5.QtTest import QSignalSpy # pylint: disable=E0401,E0611
|
7
|
+
elif qt.BINDING == "PySide6":
|
8
|
+
from PySide6.QtTest import QSignalSpy # pylint: disable=E0401,E0611
|
9
|
+
elif qt.BINDING == "PyQt6":
|
10
|
+
from PyQt6.QtTest import QSignalSpy # pylint: disable=E0401,E0611
|
11
|
+
else:
|
12
|
+
QSignalSpy = None
|
13
|
+
|
5
14
|
|
6
15
|
@contextmanager
|
7
16
|
def block_signals(w: qt.QWidget):
|