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
@@ -1,40 +1,15 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
|
3
|
-
|
4
|
-
# Copyright (c) 2016-2020 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__ = "12/02/2020"
|
2
|
+
from __future__ import annotations
|
3
|
+
|
29
4
|
|
30
5
|
import functools
|
31
6
|
import logging
|
32
|
-
import typing
|
33
7
|
|
34
8
|
from silx.gui import qt
|
35
9
|
from silx.gui.dialog.DataFileDialog import DataFileDialog
|
36
10
|
from silx.utils.enum import Enum as _Enum
|
37
11
|
|
12
|
+
from nxtomomill.io.utils import convert_str_to_tuple
|
38
13
|
from tomwer.core.process.reconstruction.nabu.plane import NabuPlane
|
39
14
|
from tomwer.core.process.reconstruction.nabu.nabuslices import NabuSliceMode
|
40
15
|
from tomwer.core.process.reconstruction.nabu.utils import (
|
@@ -50,6 +25,8 @@ from tomwer.gui.utils.scrollarea import (
|
|
50
25
|
QDoubleSpinBoxIgnoreWheel,
|
51
26
|
QSpinBoxIgnoreWheel,
|
52
27
|
)
|
28
|
+
from tomwer.gui.utils.RangeWidget import RangeWidget
|
29
|
+
from tomwer.gui import icons
|
53
30
|
from tomwer.utils import docstring
|
54
31
|
|
55
32
|
_logger = logging.getLogger(__name__)
|
@@ -61,20 +38,31 @@ class SliceGroupBox(qt.QGroupBox):
|
|
61
38
|
sigSlicesChanged = qt.Signal()
|
62
39
|
"""Signal emitted when the selected slices change"""
|
63
40
|
|
64
|
-
def __init__(self, parent
|
41
|
+
def __init__(self, parent):
|
65
42
|
qt.QGroupBox.__init__(self, "slices", parent)
|
66
43
|
self.setCheckable(True)
|
67
|
-
|
68
44
|
self.setLayout(qt.QHBoxLayout())
|
69
|
-
|
45
|
+
# mode
|
46
|
+
self._modeCB = QComboBoxIgnoreWheel(parent=self)
|
70
47
|
for mode in NabuSliceMode:
|
71
48
|
self._modeCB.addItem(mode.value)
|
72
49
|
self.layout().addWidget(self._modeCB)
|
73
50
|
self._modeCB.setFocusPolicy(qt.Qt.FocusPolicy.NoFocus)
|
74
51
|
|
52
|
+
# slice line edit
|
75
53
|
self._sliceQLE = SelectionLineEdit(parent=self, allow_negative_indices=True)
|
76
54
|
self.layout().addWidget(self._sliceQLE)
|
77
55
|
|
56
|
+
# warning icon
|
57
|
+
warningIcon = icons.getQIcon("warning")
|
58
|
+
self._noSliceWarning = qt.QLabel("")
|
59
|
+
self._noSliceWarning.setPixmap(warningIcon.pixmap(20, state=qt.QIcon.On))
|
60
|
+
self._noSliceWarning.setToolTip(
|
61
|
+
"no slice defined, No slice reconstruction will be done"
|
62
|
+
)
|
63
|
+
self.layout().addWidget(self._noSliceWarning)
|
64
|
+
|
65
|
+
# spacer
|
78
66
|
spacer = qt.QWidget(parent=self)
|
79
67
|
spacer.setSizePolicy(qt.QSizePolicy.Minimum, qt.QSizePolicy.Expanding)
|
80
68
|
self.layout().addWidget(spacer)
|
@@ -83,22 +71,36 @@ class SliceGroupBox(qt.QGroupBox):
|
|
83
71
|
self.setChecked(True)
|
84
72
|
self.setMode(NabuSliceMode.MIDDLE)
|
85
73
|
self._sliceQLE.setVisible(False)
|
74
|
+
self._noSliceWarning.setVisible(False)
|
86
75
|
|
87
76
|
# connect signal / slot
|
88
|
-
self._modeCB.currentIndexChanged.connect(self.
|
77
|
+
self._modeCB.currentIndexChanged.connect(self._updateSliceQLEVisibility)
|
89
78
|
self._modeCB.currentIndexChanged.connect(self.sigSlicesChanged)
|
90
79
|
self._sliceQLE.editingFinished.connect(self.sigSlicesChanged)
|
80
|
+
self._sliceQLE.textChanged.connect(self._updateNoSliceWarningVisibility)
|
91
81
|
self.toggled.connect(self.sigSlicesChanged)
|
92
82
|
|
93
|
-
def
|
83
|
+
def _updateSliceQLEVisibility(self, *args, **kwargs):
|
94
84
|
self._sliceQLE.setVisible(self.getMode() == NabuSliceMode.OTHER)
|
85
|
+
self._updateNoSliceWarningVisibility()
|
86
|
+
|
87
|
+
def _updateNoSliceWarningVisibility(self):
|
88
|
+
def no_other_slice_defined() -> bool:
|
89
|
+
slices_defined = self._sliceQLE.text().replace(" ", "")
|
90
|
+
slices_defined = self._sliceQLE.text().replace(",", "")
|
91
|
+
slices_defined = self._sliceQLE.text().replace(";", "")
|
92
|
+
return slices_defined == ""
|
93
|
+
|
94
|
+
self._noSliceWarning.setVisible(
|
95
|
+
self.getMode() is NabuSliceMode.OTHER and no_other_slice_defined()
|
96
|
+
)
|
95
97
|
|
96
98
|
def setMode(self, mode: NabuSliceMode):
|
97
99
|
mode = NabuSliceMode.from_value(mode)
|
98
100
|
item_index = self._modeCB.findText(mode.value)
|
99
101
|
self._modeCB.setCurrentIndex(item_index)
|
100
102
|
old = self.blockSignals(True)
|
101
|
-
self.
|
103
|
+
self._updateSliceQLEVisibility()
|
102
104
|
self.blockSignals(old)
|
103
105
|
|
104
106
|
def getMode(self) -> NabuSliceMode:
|
@@ -279,7 +281,8 @@ class AnglesFileWidget(qt.QWidget):
|
|
279
281
|
|
280
282
|
class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
|
281
283
|
"""
|
282
|
-
Widget to define the configuration of nabu reconstruction processing
|
284
|
+
Widget to define the configuration of nabu reconstruction processing and dataset configuration.
|
285
|
+
At the gui side the "dataset" section as no real reason to be on its own. So we melt the two there.
|
283
286
|
"""
|
284
287
|
|
285
288
|
sigConfChanged = qt.Signal(str)
|
@@ -287,7 +290,7 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
|
|
287
290
|
modified
|
288
291
|
"""
|
289
292
|
|
290
|
-
def __init__(self, parent
|
293
|
+
def __init__(self, parent):
|
291
294
|
qt.QWidget.__init__(self, parent, stage=_NabuStages.PRE)
|
292
295
|
_NabuStageConfigBase.__init__(self, stage=_NabuStages.PRE)
|
293
296
|
self.setLayout(qt.QGridLayout())
|
@@ -295,7 +298,7 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
|
|
295
298
|
self.__optimizationIteAlgo = "chambolle-pock"
|
296
299
|
|
297
300
|
# slices to be reconstructed online
|
298
|
-
self._slicesWidget = SliceGroupBox(parent=self
|
301
|
+
self._slicesWidget = SliceGroupBox(parent=self)
|
299
302
|
self.layout().addWidget(self._slicesWidget, 0, 0, 1, 2)
|
300
303
|
# ignore listener of the mouse for the slice widget, can
|
301
304
|
# come with an issue as we are on a scroll area
|
@@ -305,7 +308,7 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
|
|
305
308
|
self._axisLabel = qt.QLabel("reconstruction plane", self)
|
306
309
|
self._axisLabel.setToolTip("Over which axis the slice must be picked")
|
307
310
|
self.layout().addWidget(self._axisLabel)
|
308
|
-
self._axisQCB =
|
311
|
+
self._axisQCB = QComboBoxIgnoreWheel(self)
|
309
312
|
axis_tooltips = {
|
310
313
|
NabuPlane.YZ.value: "along axis x (aka axis 2 - expected to be slow)",
|
311
314
|
NabuPlane.XZ.value: "along axis y (aka axis 1 - expected to be slow)",
|
@@ -323,7 +326,7 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
|
|
323
326
|
# method
|
324
327
|
self._methodLabel = qt.QLabel("method", self)
|
325
328
|
self.layout().addWidget(self._methodLabel, 2, 0, 1, 1)
|
326
|
-
self._methodQCB = QComboBoxIgnoreWheel(parent=self
|
329
|
+
self._methodQCB = QComboBoxIgnoreWheel(parent=self)
|
327
330
|
for method in _NabuReconstructionMethods:
|
328
331
|
self._methodQCB.addItem(method.value)
|
329
332
|
self.layout().addWidget(self._methodQCB, 2, 1, 1, 1)
|
@@ -333,7 +336,7 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
|
|
333
336
|
# angle_offset
|
334
337
|
self._labelOffsetLabel = qt.QLabel("angle offset (in degree)", self)
|
335
338
|
self.layout().addWidget(self._labelOffsetLabel, 3, 0, 1, 1)
|
336
|
-
self._angleOffsetQDSB = QDoubleSpinBoxIgnoreWheel(self
|
339
|
+
self._angleOffsetQDSB = QDoubleSpinBoxIgnoreWheel(self)
|
337
340
|
self._angleOffsetQDSB.setMaximum(-180)
|
338
341
|
self._angleOffsetQDSB.setMaximum(180)
|
339
342
|
self.layout().addWidget(self._angleOffsetQDSB, 3, 1, 1, 1)
|
@@ -343,7 +346,7 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
|
|
343
346
|
# fbp filter type
|
344
347
|
self._fbpFilterCB = qt.QCheckBox("fbp filter", self)
|
345
348
|
self.layout().addWidget(self._fbpFilterCB, 4, 0, 1, 1)
|
346
|
-
self._fbpFilterType = QComboBoxIgnoreWheel(self
|
349
|
+
self._fbpFilterType = QComboBoxIgnoreWheel(self)
|
347
350
|
for filter_type in _NabuFBPFilterType:
|
348
351
|
self._fbpFilterType.addItem(filter_type.value)
|
349
352
|
self.layout().addWidget(self._fbpFilterType, 4, 1, 1, 1)
|
@@ -353,7 +356,7 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
|
|
353
356
|
# padding type
|
354
357
|
self._paddingTypeLabel = qt.QLabel("padding type", self)
|
355
358
|
self.layout().addWidget(self._paddingTypeLabel, 5, 0, 1, 1)
|
356
|
-
self._paddingType = QComboBoxIgnoreWheel(self
|
359
|
+
self._paddingType = QComboBoxIgnoreWheel(self)
|
357
360
|
for fbp_padding_type in _NabuPaddingType:
|
358
361
|
self._paddingType.addItem(fbp_padding_type.value)
|
359
362
|
self.layout().addWidget(self._paddingType, 5, 1, 1, 1)
|
@@ -377,7 +380,7 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
|
|
377
380
|
|
378
381
|
# binning - subsampling
|
379
382
|
self._binSubSamplingGB = _BinSubSampling(
|
380
|
-
"binning and
|
383
|
+
"binning and sub-sampling", parent=self
|
381
384
|
)
|
382
385
|
self.layout().addWidget(self._binSubSamplingGB, 9, 0, 1, 2)
|
383
386
|
|
@@ -445,6 +448,19 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
|
|
445
448
|
self.registerWidget(self._angleFileLabel, "advanced")
|
446
449
|
self.registerWidget(self._anglesFileWidget, "advanced")
|
447
450
|
|
451
|
+
# exclude projections: [A, B] (if user want's to skip projection from degree A to degree B (included))
|
452
|
+
self._excludeProjectionsQCB = qt.QCheckBox("exclude projections angles", self)
|
453
|
+
self.layout().addWidget(self._excludeProjectionsQCB, 24, 0, 1, 1)
|
454
|
+
self._excludeProjectionsWidget = RangeWidget(self)
|
455
|
+
self._excludeProjectionsWidget.setRange(0.0, 360.0)
|
456
|
+
self._excludeProjectionsWidget.setSuffix("º")
|
457
|
+
self._excludeProjectionsWidget.setToolTip(
|
458
|
+
"Projections with a rotation in [a, b] range will be ignored."
|
459
|
+
)
|
460
|
+
self.layout().addWidget(self._excludeProjectionsWidget, 24, 1, 1, 1)
|
461
|
+
self.registerWidget(self._excludeProjectionsQCB, "advanced")
|
462
|
+
self.registerWidget(self._excludeProjectionsWidget, "advanced")
|
463
|
+
|
448
464
|
# spacer for style
|
449
465
|
spacer = qt.QWidget(self)
|
450
466
|
spacer.setSizePolicy(qt.QSizePolicy.Minimum, qt.QSizePolicy.Expanding)
|
@@ -466,6 +482,7 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
|
|
466
482
|
self._positivityConstraintCB.setChecked(True)
|
467
483
|
self._clipOuterCircleCB.setChecked(False)
|
468
484
|
self._centeredAxisCB.setChecked(False)
|
485
|
+
self._excludeProjectionsWidget.setEnabled(False)
|
469
486
|
|
470
487
|
# connect signal / slot
|
471
488
|
self._axisQCB.currentIndexChanged.connect(self._slicesChanged)
|
@@ -485,6 +502,13 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
|
|
485
502
|
self._anglesFileWidget._qle.textChanged.connect(self._anglesFilechanged)
|
486
503
|
self._clipOuterCircleCB.toggled.connect(self._clipOuterCircleChanged)
|
487
504
|
self._centeredAxisCB.toggled.connect(self._centeredAxisChanged)
|
505
|
+
self._excludeProjectionsQCB.toggled.connect(self._excludeProjectionsChanged)
|
506
|
+
self._excludeProjectionsQCB.toggled.connect(
|
507
|
+
self._excludeProjectionsWidget.setEnabled
|
508
|
+
)
|
509
|
+
self._excludeProjectionsWidget.sigChanged.connect(
|
510
|
+
self._excludeProjectionsChanged
|
511
|
+
)
|
488
512
|
|
489
513
|
def getSlices(self):
|
490
514
|
return self._slicesWidget.getSlices()
|
@@ -542,6 +566,9 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
|
|
542
566
|
def _anglesFilechanged(self, *args, **kwargs):
|
543
567
|
self._signalConfChanged("angles_file")
|
544
568
|
|
569
|
+
def _excludeProjectionsChanged(self):
|
570
|
+
self._signalConfChanged("exclude_projections")
|
571
|
+
|
545
572
|
def setScan(self, scan):
|
546
573
|
raise NotImplementedError()
|
547
574
|
|
@@ -556,10 +583,10 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
|
|
556
583
|
def getAngleOffset(self) -> float:
|
557
584
|
return self._angleOffsetQDSB.value()
|
558
585
|
|
559
|
-
def setAngleOffset(self, value:
|
586
|
+
def setAngleOffset(self, value: str | float):
|
560
587
|
self._angleOffsetQDSB.setValue(float(value))
|
561
588
|
|
562
|
-
def getFBPFilterType(self) ->
|
589
|
+
def getFBPFilterType(self) -> _NabuFBPFilterType | None:
|
563
590
|
if self._fbpFilterCB.isChecked():
|
564
591
|
return _NabuFBPFilterType.from_value(self._fbpFilterType.currentText())
|
565
592
|
else:
|
@@ -599,13 +626,13 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
|
|
599
626
|
def isPreconditioningFilterEnable(self):
|
600
627
|
return self._preconditioningFilter.isChecked()
|
601
628
|
|
602
|
-
def setPreconditioningFilterEnable(self, enable:
|
629
|
+
def setPreconditioningFilterEnable(self, enable: bool | int):
|
603
630
|
self._preconditioningFilter.setChecked(bool(enable))
|
604
631
|
|
605
632
|
def isPositivityConstraintEnable(self):
|
606
633
|
return self._positivityConstraintCB.isChecked()
|
607
634
|
|
608
|
-
def setPositivityConstraintEnable(self, enable:
|
635
|
+
def setPositivityConstraintEnable(self, enable: bool | int):
|
609
636
|
self._positivityConstraintCB.setChecked(bool(enable))
|
610
637
|
|
611
638
|
def getTranslationMvtFile(self):
|
@@ -654,10 +681,27 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
|
|
654
681
|
"""return over which axis we expect to do the reconstruction"""
|
655
682
|
return NabuPlane.from_value(self._axisQCB.currentText())
|
656
683
|
|
657
|
-
def setNabuPlane(self, axis:
|
684
|
+
def setNabuPlane(self, axis: str | NabuPlane):
|
658
685
|
axis = NabuPlane.from_value(axis)
|
659
686
|
self._axisQCB.setCurrentText(axis.value)
|
660
687
|
|
688
|
+
def getExcludeProjections(self) -> tuple:
|
689
|
+
if self._excludeProjectionsQCB.isChecked():
|
690
|
+
return self._excludeProjectionsWidget.getRange()
|
691
|
+
else:
|
692
|
+
return tuple()
|
693
|
+
|
694
|
+
def setExcludeProjections(self, projections: tuple):
|
695
|
+
if not isinstance(projections, tuple):
|
696
|
+
raise TypeError(
|
697
|
+
f"projections should be an instance of tuple. Got {type(projections)}"
|
698
|
+
)
|
699
|
+
if len(projections) == 0:
|
700
|
+
self._excludeProjectionsQCB.setChecked(False)
|
701
|
+
else:
|
702
|
+
self._excludeProjectionsQCB.setChecked(True)
|
703
|
+
self._excludeProjectionsWidget.setRange(*projections)
|
704
|
+
|
661
705
|
@docstring(_NabuStageConfigBase)
|
662
706
|
def getConfiguration(self) -> dict:
|
663
707
|
fbp_filter_type = self.getFBPFilterType()
|
@@ -687,9 +731,22 @@ class _NabuReconstructionConfig(qt.QWidget, _NabuStageConfigBase):
|
|
687
731
|
return config
|
688
732
|
|
689
733
|
def getDatasetConfiguration(self) -> dict:
|
690
|
-
|
734
|
+
exclude_projections = self.getExcludeProjections()
|
735
|
+
if len(exclude_projections) == 0:
|
736
|
+
exclude_projections = ""
|
737
|
+
else:
|
738
|
+
exclude_projections = f"angular_range={str(list(exclude_projections))}"
|
739
|
+
config = self._binSubSamplingGB.getConfiguration()
|
740
|
+
config["exclude_projections"] = exclude_projections
|
741
|
+
return config
|
691
742
|
|
692
743
|
def setDatasetConfiguration(self, config):
|
744
|
+
exclude_proj = config.pop("exclude_projections", None)
|
745
|
+
if exclude_proj is not None:
|
746
|
+
if isinstance(exclude_proj, str):
|
747
|
+
exclude_proj = exclude_proj.replace("angular_range=", "")
|
748
|
+
exclude_proj = convert_str_to_tuple(exclude_proj)
|
749
|
+
self.setExcludeProjections(exclude_proj)
|
693
750
|
return self._binSubSamplingGB.setConfiguration(config)
|
694
751
|
|
695
752
|
@docstring(_NabuStageConfigBase)
|
@@ -791,7 +848,7 @@ class _SubRegionEditor(qt.QObject):
|
|
791
848
|
def layout(self):
|
792
849
|
return self._layout
|
793
850
|
|
794
|
-
def getSubRegionMin(self) ->
|
851
|
+
def getSubRegionMin(self) -> int | None:
|
795
852
|
"""
|
796
853
|
|
797
854
|
:return: None if region is unbounded else the value of the bound
|
@@ -801,7 +858,7 @@ class _SubRegionEditor(qt.QObject):
|
|
801
858
|
else:
|
802
859
|
return None
|
803
860
|
|
804
|
-
def getSubRegionMax(self) ->
|
861
|
+
def getSubRegionMax(self) -> int | None:
|
805
862
|
"""
|
806
863
|
|
807
864
|
:return: None if region is unbounded else the value of the bound
|
@@ -811,7 +868,7 @@ class _SubRegionEditor(qt.QObject):
|
|
811
868
|
else:
|
812
869
|
return None
|
813
870
|
|
814
|
-
def setSubRegionMin(self, sub_region_min:
|
871
|
+
def setSubRegionMin(self, sub_region_min: int | None) -> None:
|
815
872
|
"""
|
816
873
|
|
817
874
|
:param min: if min is None or -1 wr will expand it to - infinity
|
@@ -843,20 +900,14 @@ class _SubRegionEditor(qt.QObject):
|
|
843
900
|
"""
|
844
901
|
|
845
902
|
:return: min, max
|
846
|
-
:rtype: tuple
|
847
903
|
"""
|
848
904
|
return self.getSubRegionMin(), self.getSubRegionMax()
|
849
905
|
|
850
906
|
def setSubRegion(
|
851
907
|
self,
|
852
|
-
sub_region_min:
|
853
|
-
sub_region_max:
|
908
|
+
sub_region_min: int | None,
|
909
|
+
sub_region_max: int | None,
|
854
910
|
):
|
855
|
-
"""
|
856
|
-
|
857
|
-
:param tuple min:
|
858
|
-
:param tuple max:
|
859
|
-
"""
|
860
911
|
self.setSubRegionMin(sub_region_min)
|
861
912
|
self.setSubRegionMax(sub_region_max)
|
862
913
|
|
@@ -957,11 +1008,11 @@ class _BinSubSampling(qt.QGroupBox):
|
|
957
1008
|
binningChanged = qt.Signal()
|
958
1009
|
"""signal emitted when binning change"""
|
959
1010
|
|
960
|
-
def __init__(self, text, parent
|
1011
|
+
def __init__(self, text, parent):
|
961
1012
|
qt.QGroupBox.__init__(self, text)
|
962
1013
|
self.setLayout(qt.QFormLayout())
|
963
1014
|
# horizontal binning
|
964
|
-
self._hBinningSB = QSpinBoxIgnoreWheel(self
|
1015
|
+
self._hBinningSB = QSpinBoxIgnoreWheel(self)
|
965
1016
|
self._hBinningSB.setMinimum(1)
|
966
1017
|
self._hBinningSB.setMaximum(3)
|
967
1018
|
self.layout().addRow("horizontal binning", self._hBinningSB)
|
@@ -971,11 +1022,11 @@ class _BinSubSampling(qt.QGroupBox):
|
|
971
1022
|
self._vBinningSB.setMaximum(100)
|
972
1023
|
# self.layout().addRow('vertical binning', self._vBinningSB)
|
973
1024
|
self._vBinningSB.setVisible(False)
|
974
|
-
# projection
|
975
|
-
self._projSubsamplingSB = QSpinBoxIgnoreWheel(self
|
1025
|
+
# projection sub-sampling
|
1026
|
+
self._projSubsamplingSB = QSpinBoxIgnoreWheel(self)
|
976
1027
|
self._projSubsamplingSB.setMinimum(1)
|
977
1028
|
self._projSubsamplingSB.setMaximum(100)
|
978
|
-
self.layout().addRow("projection
|
1029
|
+
self.layout().addRow("projection sub-sampling", self._projSubsamplingSB)
|
979
1030
|
|
980
1031
|
# connect signal / slot
|
981
1032
|
self._vBinningSB.valueChanged.connect(self._valueUpdated)
|
@@ -1,34 +1,9 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
|
3
|
-
|
4
|
-
# Copyright (c) 2016-2017 European Synchrotron Radiation Facility
|
5
|
-
#
|
6
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
-
# of this software and associated documentation files (the "Software"), to deal
|
8
|
-
# in the Software without restriction, including without limitation the rights
|
9
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
-
# copies of the Software, and to permit persons to whom the Software is
|
11
|
-
# furnished to do so, subject to the following conditions:
|
12
|
-
#
|
13
|
-
# The above copyright notice and this permission notice shall be included in
|
14
|
-
# all copies or substantial portions of the Software.
|
15
|
-
#
|
16
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
|
-
# THE SOFTWARE.
|
23
|
-
#
|
24
|
-
# ###########################################################################*/
|
25
|
-
|
26
|
-
__authors__ = ["H. Payno"]
|
27
|
-
__license__ = "MIT"
|
28
|
-
__date__ = "04/03/2019"
|
2
|
+
from __future__ import annotations
|
3
|
+
|
29
4
|
|
30
5
|
import functools
|
31
|
-
import
|
6
|
+
from typing import Iterable
|
32
7
|
|
33
8
|
from silx.gui import qt
|
34
9
|
|
@@ -168,7 +143,7 @@ class NabuFlowControl(qt.QWidget):
|
|
168
143
|
"""
|
169
144
|
change visibility of the widgets relative to initialization process
|
170
145
|
|
171
|
-
:param
|
146
|
+
:param visible:
|
172
147
|
"""
|
173
148
|
self._iniProcessWidgets.setVisible(visible)
|
174
149
|
|
@@ -176,40 +151,34 @@ class NabuFlowControl(qt.QWidget):
|
|
176
151
|
"""
|
177
152
|
change visibility of the widgets relative to pre processing process
|
178
153
|
|
179
|
-
:param
|
154
|
+
:param visible:
|
180
155
|
"""
|
181
156
|
self._preProcessWidgets.setVisible(visible)
|
182
157
|
|
183
|
-
def setPhaseVisible(self, visible):
|
158
|
+
def setPhaseVisible(self, visible: bool):
|
184
159
|
"""
|
185
160
|
change visibility of the widgets relative to pre processing process
|
186
|
-
|
187
|
-
:param bool visible:
|
188
161
|
"""
|
189
162
|
self._phaseProcessWidgets.setVisible(visible)
|
190
163
|
|
191
|
-
def setProcVisible(self, visible):
|
164
|
+
def setProcVisible(self, visible: bool):
|
192
165
|
"""
|
193
166
|
change visibility of the widgets relative to processing process
|
194
|
-
|
195
|
-
:param bool visible:
|
196
167
|
"""
|
197
168
|
self._processWidgets.setVisible(visible)
|
198
169
|
|
199
|
-
def setPostVisible(self, visible):
|
170
|
+
def setPostVisible(self, visible: bool):
|
200
171
|
"""
|
201
172
|
change visibility of the widgets relative to post processing process
|
202
|
-
|
203
|
-
:param bool visible:
|
204
173
|
"""
|
205
174
|
self._postProcessWidgets.setVisible(visible)
|
206
175
|
|
207
|
-
def setIniProcessing(self, processes:
|
176
|
+
def setIniProcessing(self, processes: Iterable, icons: Iterable):
|
208
177
|
"""
|
209
178
|
Defines the processing to execute for initialization
|
210
179
|
|
211
|
-
:param
|
212
|
-
:param
|
180
|
+
:param processes: processes to display
|
181
|
+
:param icons: icons associated to the processes if any
|
213
182
|
"""
|
214
183
|
draggability = [False] * len(processes)
|
215
184
|
self._iniProcessWidgets.setProcesses(
|
@@ -217,11 +186,11 @@ class NabuFlowControl(qt.QWidget):
|
|
217
186
|
)
|
218
187
|
self.setIniprocVisible(len(processes) != 0)
|
219
188
|
|
220
|
-
def setPreProcessing(self, processes:
|
189
|
+
def setPreProcessing(self, processes: Iterable, icons: Iterable):
|
221
190
|
"""
|
222
191
|
|
223
|
-
:param
|
224
|
-
:param
|
192
|
+
:param processes: processes to display
|
193
|
+
:param icons: icons associated to the processes if any
|
225
194
|
"""
|
226
195
|
draggability = [False] * len(processes)
|
227
196
|
self._preProcessWidgets.setProcesses(
|
@@ -229,11 +198,11 @@ class NabuFlowControl(qt.QWidget):
|
|
229
198
|
)
|
230
199
|
self.setPreProcVisible(len(processes) != 0)
|
231
200
|
|
232
|
-
def setPhaseProcessing(self, processes:
|
201
|
+
def setPhaseProcessing(self, processes: Iterable, icons: Iterable):
|
233
202
|
"""
|
234
203
|
|
235
|
-
:param
|
236
|
-
:param
|
204
|
+
:param processes: processes to display
|
205
|
+
:param icons: icons associated to the processes if any
|
237
206
|
"""
|
238
207
|
draggability = [False] * len(processes)
|
239
208
|
self._phaseProcessWidgets.setProcesses(
|
@@ -241,11 +210,11 @@ class NabuFlowControl(qt.QWidget):
|
|
241
210
|
)
|
242
211
|
self.setPhaseVisible(len(processes) != 0)
|
243
212
|
|
244
|
-
def setProcessing(self, processes:
|
213
|
+
def setProcessing(self, processes: Iterable, icons: Iterable):
|
245
214
|
"""
|
246
215
|
|
247
|
-
:param
|
248
|
-
:param
|
216
|
+
:param processes: processes to display
|
217
|
+
:param icons: icons associated to the processes if any
|
249
218
|
"""
|
250
219
|
draggability = [False] * len(processes)
|
251
220
|
self._processWidgets.setProcesses(
|
@@ -253,11 +222,11 @@ class NabuFlowControl(qt.QWidget):
|
|
253
222
|
)
|
254
223
|
self.setProcVisible(len(processes) != 0)
|
255
224
|
|
256
|
-
def setPostProcessing(self, processes:
|
225
|
+
def setPostProcessing(self, processes: Iterable, icons: Iterable):
|
257
226
|
"""
|
258
227
|
|
259
|
-
:param
|
260
|
-
:param
|
228
|
+
:param processes: processes to display
|
229
|
+
:param icons: icons associated to the processes if any
|
261
230
|
"""
|
262
231
|
draggability = [False] * len(processes)
|
263
232
|
self._postProcessWidgets.setProcesses(
|
@@ -293,13 +262,15 @@ class NabuFlowControl(qt.QWidget):
|
|
293
262
|
"""
|
294
263
|
return self._postProcessWidgets.getFlow()
|
295
264
|
|
296
|
-
def getFlow(self):
|
265
|
+
def getFlow(self) -> dict:
|
297
266
|
"""
|
267
|
+
Returns the concatenation of pre-processing, processing, and post-processing flows.
|
268
|
+
|
269
|
+
:return: Dictionary where the keys are Nabu stages, and the values are lists of flows for each stage.
|
270
|
+
:rtype: dict
|
298
271
|
|
299
|
-
|
300
|
-
|
301
|
-
:rtype: dict. keys are nabu stage, values are list of flow for each
|
302
|
-
stage.
|
272
|
+
This method fetches the processing flows for all stages and returns them
|
273
|
+
as a dictionary, allowing easy access to the current configuration.
|
303
274
|
"""
|
304
275
|
return {
|
305
276
|
_NabuStages.INI: self._iniProcessWidget.getFlow(),
|
@@ -309,11 +280,10 @@ class NabuFlowControl(qt.QWidget):
|
|
309
280
|
_NabuStages.POST: self._processWidgets.getFlow(),
|
310
281
|
}
|
311
282
|
|
312
|
-
def getProcessFocused(self):
|
283
|
+
def getProcessFocused(self) -> tuple:
|
313
284
|
"""
|
314
285
|
|
315
286
|
:return: the process under focus
|
316
|
-
:rtype: tuple (stage or None, None or process_id (str or class))
|
317
287
|
"""
|
318
288
|
stages = (
|
319
289
|
_NabuStages.INI,
|