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/stacks.py
CHANGED
@@ -1,148 +1,113 @@
|
|
1
|
-
# /*##########################################################################
|
2
|
-
# Copyright (C) 2017 European Synchrotron Radiation Facility
|
3
|
-
#
|
4
|
-
# This file is part of the PyMca X-ray Fluorescence Toolkit 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
1
|
"""Some widget construction to check if a sample moved"""
|
27
2
|
|
28
|
-
|
29
|
-
__license__ = "MIT"
|
30
|
-
__date__ = "19/03/2018"
|
31
|
-
|
3
|
+
from __future__ import annotations
|
32
4
|
|
33
5
|
import logging
|
34
|
-
from collections import OrderedDict
|
35
|
-
from typing import Union
|
36
6
|
|
7
|
+
import sys
|
37
8
|
import h5py
|
38
9
|
from silx.gui import qt
|
39
|
-
from
|
40
|
-
from tomoscan.identifier import VolumeIdentifier
|
10
|
+
from silx.io.url import DataUrl
|
41
11
|
|
12
|
+
from .metadataloader import VolumeMetadataLoader
|
13
|
+
from tomwer.core.tomwer_object import TomwerObject
|
42
14
|
from tomwer.core.scan.scanbase import TomwerScanBase
|
43
15
|
from tomwer.core.scan.scanfactory import ScanFactory
|
44
|
-
from tomwer.
|
45
|
-
from tomwer.
|
16
|
+
from tomwer.core.volume.volumefactory import VolumeFactory
|
17
|
+
from tomwer.core.volume.volumebase import TomwerVolumeBase
|
18
|
+
from tomwer.io.utils.tomoobj import get_tomo_objs_instances
|
19
|
+
from tomwer.gui.dialog.QDataDialog import QDataDialog
|
20
|
+
from tomwer.gui.stackplot import QImageFileStackPlot
|
21
|
+
from tomwer.gui.utils.loadingmode import LoadingModeToolButton, LoadingMode
|
46
22
|
|
47
23
|
_logger = logging.getLogger(__name__)
|
48
24
|
|
49
25
|
|
50
26
|
class _ImageStack(qt.QMainWindow):
|
51
27
|
"""
|
52
|
-
|
53
|
-
|
54
|
-
(using the image stack of view in orange or a third software as silx view)
|
55
|
-
|
56
|
-
Options are:
|
57
|
-
- copy files or create sym link (set to sym link)
|
58
|
-
- overwrite if existing (set to False)
|
59
|
-
|
60
|
-
Behavior:
|
61
|
-
When the process receives a new data path ([scanPath]/[scan]) and if
|
62
|
-
no output folder has been defined manually them it will try to create
|
63
|
-
the folder [scanPath]/slices if not existing in order to redirect
|
64
|
-
the slices files.
|
65
|
-
If fails will ask for a directory.
|
66
|
-
If the output folder is already existing then move directly to the
|
67
|
-
copy.
|
28
|
+
Base class to :class:`SliceStack` and :class:`RadioStack` classes.
|
29
|
+
Define the common layout and interaction.
|
68
30
|
"""
|
69
31
|
|
32
|
+
METADATA_LOADER_CLASS = None
|
33
|
+
|
34
|
+
SHOW_SCAN_OVERVIEW = True
|
35
|
+
|
36
|
+
SHOW_VOLUME_METADATA_OVERVIEW = True
|
37
|
+
|
38
|
+
sigMetadataLoaded = qt.Signal()
|
39
|
+
|
70
40
|
def __init__(self, parent=None, backend=None):
|
71
|
-
|
41
|
+
|
42
|
+
super().__init__(parent)
|
43
|
+
|
72
44
|
self.setWindowFlags(qt.Qt.Widget)
|
73
|
-
self.
|
74
|
-
|
75
|
-
|
45
|
+
self._viewer = QImageFileStackPlot(
|
46
|
+
parent=self, backend=backend, show_overview=self.SHOW_SCAN_OVERVIEW
|
47
|
+
)
|
48
|
+
if not self.SHOW_VOLUME_METADATA_OVERVIEW:
|
49
|
+
self._viewer._reconsInfoDockWidget.hide()
|
76
50
|
self.setCentralWidget(self._viewer)
|
77
51
|
|
78
|
-
self.
|
52
|
+
self._actionsToolbar = qt.QToolBar()
|
53
|
+
self.addToolBar(qt.Qt.RightToolBarArea, self._actionsToolbar)
|
79
54
|
|
80
|
-
self.
|
81
|
-
self.
|
82
|
-
self.
|
83
|
-
self._dockWidgetMenu.setWidget(self._viewer.getControlWidget())
|
84
|
-
self.addDockWidget(qt.Qt.BottomDockWidgetArea, self._dockWidgetMenu)
|
55
|
+
self._clearAction = _ClearAction(parent=self._actionsToolbar)
|
56
|
+
self._actionsToolbar.addAction(self._clearAction)
|
57
|
+
self._clearAction.triggered.connect(self.clear)
|
85
58
|
|
86
|
-
|
87
|
-
self.
|
59
|
+
self._addTomoObjAction = _AddTomoObjectAction(parent=self._actionsToolbar)
|
60
|
+
self._actionsToolbar.addAction(self._addTomoObjAction)
|
61
|
+
self._addTomoObjAction.triggered.connect(self._callbackAddNewTomoObjFrmDialog)
|
88
62
|
|
89
|
-
self.
|
90
|
-
|
91
|
-
self._clearAction.triggered.connect(self.clear)
|
63
|
+
self._loadingMode = LoadingModeToolButton(parent=self)
|
64
|
+
self._actionsToolbar.addWidget(self._loadingMode)
|
92
65
|
|
93
|
-
|
94
|
-
|
95
|
-
self.
|
96
|
-
# expose API
|
97
|
-
self.setLoadingMode = self._viewer.setLoadingMode
|
98
|
-
self.setForceSync = self._viewer.setForceSync
|
66
|
+
# connect signal / slot
|
67
|
+
self.sigMetadataLoaded.connect(self._viewer._updateUrlInfos)
|
68
|
+
self._loadingMode.sigLoadModeChanged.connect(self.setLoadingMode)
|
99
69
|
|
100
|
-
|
70
|
+
def addTomoObj(self, tomo_obj: TomwerObject | str):
|
71
|
+
raise NotImplementedError
|
101
72
|
|
102
|
-
def
|
103
|
-
self._scans.add(scanID)
|
104
|
-
self._update()
|
73
|
+
def _callbackAddNewTomoObjFrmDialog(self) -> None:
|
105
74
|
|
106
|
-
def _addNewFolder(self):
|
107
75
|
dialog = QDataDialog(self, multiSelection=True)
|
76
|
+
dialog.setNameFilters(
|
77
|
+
[
|
78
|
+
"Any files (*)",
|
79
|
+
"HDF5 files (*.h5 *.hdf5 *.nx *.nxs *.nexus)",
|
80
|
+
"Nexus files (*.nx *.nxs *.nexus)",
|
81
|
+
]
|
82
|
+
)
|
108
83
|
|
109
84
|
if not dialog.exec_():
|
110
85
|
dialog.close()
|
111
86
|
return
|
112
87
|
|
113
|
-
|
114
|
-
self.addLeafScan(folder)
|
88
|
+
self._addTomoObjectsFromStrList(dialog.files_selected())
|
115
89
|
|
116
|
-
def
|
117
|
-
|
118
|
-
|
90
|
+
def _addTomoObjectsFromStrList(self, str_list: list[str]) -> None:
|
91
|
+
tomo_objects, _ = get_tomo_objs_instances(str_list)
|
92
|
+
for tomo_obj in tomo_objects:
|
93
|
+
self.addTomoObj(tomo_obj)
|
119
94
|
|
120
|
-
def
|
121
|
-
|
122
|
-
Parse all self._scans and find the images to be displayed on the widget
|
123
|
-
|
124
|
-
:return: images to display for each scan
|
125
|
-
:rtype: dict
|
126
|
-
"""
|
127
|
-
raise NotImplementedError("Base class")
|
95
|
+
def clear(self):
|
96
|
+
self._viewer.reset()
|
128
97
|
|
129
|
-
def
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
for scan in all_images:
|
134
|
-
try:
|
135
|
-
oScanSlices = OrderedDict(sorted(all_images[scan].items()))
|
136
|
-
for scan_slice in oScanSlices:
|
137
|
-
ordered_imgs.append(all_images[scan][scan_slice])
|
138
|
-
except TypeError:
|
139
|
-
# in case algorithm could extract recons index
|
140
|
-
ordered_imgs = ordered_imgs + list(all_images[scan].values())
|
141
|
-
self._viewer.setImages(ordered_imgs)
|
98
|
+
def close(self) -> None:
|
99
|
+
# clearing free the loading thread. Safer to remove them when closing
|
100
|
+
self.clear()
|
101
|
+
super().close()
|
142
102
|
|
143
|
-
def
|
144
|
-
|
145
|
-
|
103
|
+
def setLoadingMode(self, mode: LoadingMode | str) -> None:
|
104
|
+
mode = LoadingMode(mode)
|
105
|
+
if mode is LoadingMode.LAZY_LOADING:
|
106
|
+
# set to the default N_PRELOAD value
|
107
|
+
n_prefetch = self._viewer.N_PRELOAD
|
108
|
+
else:
|
109
|
+
n_prefetch = sys.maxsize
|
110
|
+
self._viewer.setNPrefetch(n_prefetch)
|
146
111
|
|
147
112
|
|
148
113
|
class _ClearAction(qt.QAction):
|
@@ -152,11 +117,11 @@ class _ClearAction(qt.QAction):
|
|
152
117
|
qt.QAction.__init__(self, icon, "Clear", parent)
|
153
118
|
|
154
119
|
|
155
|
-
class
|
120
|
+
class _AddTomoObjectAction(qt.QAction):
|
156
121
|
def __init__(self, parent):
|
157
122
|
style = qt.QApplication.instance().style()
|
158
123
|
icon = style.standardIcon(qt.QStyle.SP_DirIcon)
|
159
|
-
qt.QAction.__init__(self, icon, "Add", parent)
|
124
|
+
qt.QAction.__init__(self, icon, "Add tomo object", parent)
|
160
125
|
|
161
126
|
|
162
127
|
class SliceStack(_ImageStack):
|
@@ -164,38 +129,167 @@ class SliceStack(_ImageStack):
|
|
164
129
|
Widget displaying all slices contained in a list of acquisition folder
|
165
130
|
"""
|
166
131
|
|
167
|
-
|
132
|
+
SHOW_SCAN_OVERVIEW = False
|
133
|
+
|
134
|
+
SHOW_VOLUME_METADATA_OVERVIEW = True
|
135
|
+
|
136
|
+
METADATA_LOADER_CLASS = VolumeMetadataLoader
|
137
|
+
|
138
|
+
def __init__(self, parent=None, backend=None):
|
139
|
+
super().__init__(parent, backend)
|
140
|
+
self._loadingMetadataThreads = []
|
141
|
+
"list of thread processing metadata loading"
|
142
|
+
self._volume_id_to_urls: dict[str, tuple[DataUrl]] = {}
|
143
|
+
# allow user to edit the list (user can remove an url)
|
144
|
+
url_list = self._viewer._urlsTable._urlsTable
|
145
|
+
url_list.setEditable(True)
|
146
|
+
# allow multiple selection (more convenient when users want to remove a set of url)
|
147
|
+
# not for now: seems to have a bug on it
|
148
|
+
# url_list.setSelectionMode(qt.QAbstractItemView.MultiSelection)
|
149
|
+
|
150
|
+
@property
|
151
|
+
def url_to_volume_id(self, volume_id) -> str | None:
|
152
|
+
urls_to_volume_id = {
|
153
|
+
(value, key) for key, value in self._volume_id_to_urls.items()
|
154
|
+
}
|
155
|
+
return urls_to_volume_id.get(volume_id, None)
|
156
|
+
|
157
|
+
def getImagesUrls(self) -> dict[str, dict]:
|
168
158
|
"""
|
169
159
|
Parse all self._scans and find the images to be displayed on the widget
|
170
160
|
|
171
|
-
:return: images to display for each scan
|
172
|
-
|
161
|
+
:return: images to display for each scan. Key is the volume identifier, value is a dict
|
162
|
+
with index as key and DataUrl as value
|
173
163
|
"""
|
174
164
|
slices = {}
|
175
|
-
for
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
scan_obj = scan
|
180
|
-
if (
|
181
|
-
scan_obj.latest_reconstructions is not None
|
182
|
-
and len(scan_obj.latest_reconstructions) > 0
|
183
|
-
):
|
165
|
+
for volume in self._tomoObjects.values():
|
166
|
+
assert isinstance(volume, TomwerVolumeBase)
|
167
|
+
slices[volume.get_identifier().to_str()] = tuple(volume.browse_data_urls())
|
168
|
+
return slices
|
184
169
|
|
185
|
-
|
186
|
-
|
187
|
-
|
170
|
+
def __tomoObjIdToInstance(self, tomo_obj: TomwerObject | str) -> TomwerObject:
|
171
|
+
"""Convert a tomo obj to it TomwerObject"""
|
172
|
+
if isinstance(tomo_obj, str):
|
173
|
+
try:
|
174
|
+
tomo_obj = VolumeFactory.create_tomo_object_from_identifier(tomo_obj)
|
175
|
+
except (ValueError, TypeError) as e1:
|
176
|
+
try:
|
177
|
+
tomo_obj = ScanFactory.create_tomo_object_from_identifier(tomo_obj)
|
178
|
+
except (ValueError, TypeError) as e2:
|
179
|
+
raise ValueError(
|
180
|
+
f"Unable to create a tomo object from {tomo_obj}. Errors are {e1}, {e2}"
|
181
|
+
)
|
182
|
+
return tomo_obj
|
183
|
+
|
184
|
+
def addTomoObj(self, tomo_obj: TomwerObject | str):
|
185
|
+
tomo_obj = self.__tomoObjIdToInstance(tomo_obj=tomo_obj)
|
186
|
+
|
187
|
+
if isinstance(tomo_obj, TomwerScanBase):
|
188
|
+
reconstructed_volumes = (
|
189
|
+
tomo_obj.latest_reconstructions or tomo_obj.get_reconstructed_slices()
|
190
|
+
)
|
191
|
+
for volume_id in reconstructed_volumes:
|
192
|
+
if isinstance(volume_id, str):
|
193
|
+
volume_id_as_str = volume_id
|
194
|
+
else:
|
195
|
+
volume_id_as_str = volume_id.to_str()
|
196
|
+
self.addTomoObj(tomo_obj=volume_id_as_str)
|
197
|
+
elif isinstance(tomo_obj, TomwerVolumeBase):
|
198
|
+
self._addVolume(volume=tomo_obj)
|
199
|
+
# set the latest slice as the active one
|
200
|
+
try:
|
201
|
+
active_url = next(tomo_obj.browse_data_urls())
|
202
|
+
except StopIteration:
|
203
|
+
pass
|
204
|
+
else:
|
205
|
+
try:
|
206
|
+
self._viewer.setCurrentUrl(active_url)
|
207
|
+
except Exception:
|
208
|
+
# the url might not exist or might have been removed.
|
209
|
+
# Because each tome we add an object the urls are reset
|
210
|
+
# FIXME: in this case the urls must be updated instead of resetting
|
211
|
+
pass
|
212
|
+
else:
|
213
|
+
raise TypeError(f"tomo obj type is not handled ({type(tomo_obj)})")
|
214
|
+
|
215
|
+
def _addVolume(self, volume: TomwerVolumeBase):
|
216
|
+
new_urls = [url.path() for url in volume.browse_data_urls()]
|
217
|
+
self._volume_id_to_urls[volume.get_identifier().to_str()] = tuple(new_urls)
|
218
|
+
self._loadMetadata(volume)
|
219
|
+
|
220
|
+
# work around. See issue: TODO add silx issue
|
221
|
+
if self._viewer._urlIndexes is None:
|
222
|
+
current_urls = tuple()
|
223
|
+
else:
|
224
|
+
current_urls = self._viewer.getUrls() or tuple()
|
225
|
+
updated_urls = {*new_urls} | {*current_urls}
|
226
|
+
updated_urls = tuple([DataUrl(path=url_path) for url_path in updated_urls])
|
227
|
+
self._viewer.setUrls(updated_urls)
|
228
|
+
|
229
|
+
def setCurrentUrl(self, url: DataUrl):
|
230
|
+
if url in ("", None):
|
231
|
+
url = None
|
232
|
+
elif isinstance(url, str):
|
233
|
+
url = DataUrl(path=url)
|
234
|
+
elif not isinstance(url, DataUrl):
|
235
|
+
raise TypeError
|
236
|
+
if url is None:
|
237
|
+
pass
|
238
|
+
# FIXME: add a function to clear the metadata widget
|
239
|
+
super().setCurrentUrl(url)
|
240
|
+
|
241
|
+
# metadata loading
|
242
|
+
def _load(self, url: DataUrl):
|
243
|
+
# load the frame
|
244
|
+
super()._load()
|
245
|
+
# load metadata
|
246
|
+
url_path = url.path()
|
247
|
+
volume_id = self.url_to_volume_id(url_path)
|
248
|
+
if volume_id is None:
|
249
|
+
_logger.warning(f"Failed to find volume associated to {url_path}")
|
250
|
+
return
|
188
251
|
|
189
|
-
|
190
|
-
|
191
|
-
|
252
|
+
volume = VolumeFactory.create_tomo_object_from_identifier(volume_id)
|
253
|
+
if volume not in self._loadingMetadataThreads:
|
254
|
+
# if a thread is already loading metadata for this volume avoid launching another thread for it
|
255
|
+
self._loadMetadata(tomo_obj=volume)
|
256
|
+
|
257
|
+
def _loadMetadata(self, tomo_obj: TomwerObject):
|
258
|
+
if not isinstance(tomo_obj, TomwerObject):
|
259
|
+
raise TypeError(
|
260
|
+
f"volume should be an instance of {TomwerObject}. Got {type(tomo_obj)} instead"
|
261
|
+
)
|
262
|
+
loader = self.METADATA_LOADER_CLASS(
|
263
|
+
tomo_obj_identifier=tomo_obj.get_identifier().to_str(), parent=self
|
264
|
+
)
|
265
|
+
loader.finished.connect(self._metadataLoaded, qt.Qt.QueuedConnection)
|
266
|
+
self._loadingMetadataThreads.append(loader)
|
267
|
+
loader.start()
|
268
|
+
|
269
|
+
def _metadataLoaded(self):
|
270
|
+
sender = self.sender()
|
271
|
+
if sender in self._loadingMetadataThreads:
|
272
|
+
self._loadingMetadataThreads.remove(sender)
|
273
|
+
self._viewer.updateSliceMetadata(
|
274
|
+
{url.path(): sender.metadata for url in sender.volume.browse_data_urls()}
|
275
|
+
)
|
276
|
+
self.sigMetadataLoaded.emit()
|
277
|
+
|
278
|
+
def _freeMetadataLoadingThreads(self):
|
279
|
+
for thread in self._loadingMetadataThreads:
|
280
|
+
thread.blockSignals(True)
|
281
|
+
thread.wait(50)
|
282
|
+
self._loadingMetadataThreads.clear()
|
283
|
+
|
284
|
+
def close(self):
|
285
|
+
# clearing free the loading thread. Safer to remove them when closing
|
286
|
+
self._freeMetadataLoadingThreads()
|
287
|
+
super().close()
|
192
288
|
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
slices[str(scan)] = imgs
|
198
|
-
return slices
|
289
|
+
def clear(self):
|
290
|
+
self._volume_id_to_urls.clear()
|
291
|
+
self._freeMetadataLoadingThreads()
|
292
|
+
super().clear()
|
199
293
|
|
200
294
|
|
201
295
|
class RadioStack(_ImageStack):
|
@@ -203,15 +297,18 @@ class RadioStack(_ImageStack):
|
|
203
297
|
Widget displaying all radio contained in a list of acquisition folder
|
204
298
|
"""
|
205
299
|
|
206
|
-
|
300
|
+
SHOW_SCAN_OVERVIEW = True
|
301
|
+
|
302
|
+
SHOW_VOLUME_METADATA_OVERVIEW = False
|
303
|
+
|
304
|
+
def getImagesUrls(self) -> dict:
|
207
305
|
"""
|
208
306
|
Parse all self._scans and find the images to be displayed on the widget
|
209
307
|
|
210
308
|
:return: images to display for each scan
|
211
|
-
:rtype: dict
|
212
309
|
"""
|
213
310
|
slices = {}
|
214
|
-
for scan in self.
|
311
|
+
for scan in self._tomoObjects.values():
|
215
312
|
# manage hdf5
|
216
313
|
if isinstance(scan, TomwerScanBase):
|
217
314
|
imgs = scan.projections
|
@@ -238,3 +335,32 @@ class RadioStack(_ImageStack):
|
|
238
335
|
if len(imgs) > 0:
|
239
336
|
slices[scan] = imgs
|
240
337
|
return slices
|
338
|
+
|
339
|
+
def addTomoObj(self, tomo_obj: TomwerScanBase | str):
|
340
|
+
if isinstance(tomo_obj, str):
|
341
|
+
try:
|
342
|
+
tomo_obj = ScanFactory.create_tomo_object_from_identifier(tomo_obj)
|
343
|
+
except (ValueError, TypeError) as e:
|
344
|
+
_logger.error(
|
345
|
+
f"Fail to create a scan object from {tomo_obj}. Error is {e}"
|
346
|
+
)
|
347
|
+
if not isinstance(tomo_obj, TomwerScanBase):
|
348
|
+
raise TypeError(
|
349
|
+
f"tomo_obj should be an instance of {TomwerScanBase}. Get {type(tomo_obj)}"
|
350
|
+
)
|
351
|
+
self._addScan(scan=tomo_obj)
|
352
|
+
self._viewer.updateScanToUrl(
|
353
|
+
{url.path(): tomo_obj for url in tomo_obj.projections.values()}
|
354
|
+
)
|
355
|
+
|
356
|
+
def _addScan(self, scan: TomwerScanBase):
|
357
|
+
new_urls = tuple([url.path() for url in scan.projections.values()])
|
358
|
+
|
359
|
+
# work around. See issue: TODO add silx issue
|
360
|
+
if self._viewer._urlIndexes is None:
|
361
|
+
current_urls = tuple()
|
362
|
+
else:
|
363
|
+
current_urls = self._viewer.getUrls() or tuple()
|
364
|
+
updated_urls = {*new_urls} | {*current_urls}
|
365
|
+
updated_urls = tuple([DataUrl(path=url_path) for url_path in updated_urls])
|
366
|
+
self._viewer.setUrls(updated_urls)
|