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,35 +1,8 @@
|
|
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__ = "11/02/2020"
|
2
|
+
from __future__ import annotations
|
29
3
|
|
30
4
|
|
31
5
|
import logging
|
32
|
-
import typing
|
33
6
|
|
34
7
|
from silx.gui import qt
|
35
8
|
from silx.utils.enum import Enum as _Enum
|
@@ -40,6 +13,7 @@ from tomwer.gui.reconstruction.nabu.nabuconfig import base
|
|
40
13
|
from tomwer.gui.reconstruction.nabu.nabuconfig.ctf import CTFConfig
|
41
14
|
from tomwer.gui.utils.inputwidget import SelectionLineEdit
|
42
15
|
from tomwer.gui.utils.scrollarea import QComboBoxIgnoreWheel as QComboBox
|
16
|
+
from tomwer.gui import icons
|
43
17
|
from tomwer.utils import docstring
|
44
18
|
|
45
19
|
_logger = logging.getLogger(__name__)
|
@@ -63,7 +37,7 @@ class _NabuPhaseConfig(qt.QWidget, base._NabuStageConfigBase):
|
|
63
37
|
modified
|
64
38
|
"""
|
65
39
|
|
66
|
-
def __init__(self, parent
|
40
|
+
def __init__(self, parent):
|
67
41
|
qt.QWidget.__init__(self, parent, stage=_NabuStages.PHASE)
|
68
42
|
base._NabuStageConfigBase.__init__(self, stage=_NabuStages.PHASE)
|
69
43
|
self.setLayout(qt.QGridLayout())
|
@@ -71,19 +45,19 @@ class _NabuPhaseConfig(qt.QWidget, base._NabuStageConfigBase):
|
|
71
45
|
# phase method
|
72
46
|
self._methodLabel = qt.QLabel("method", self)
|
73
47
|
self.layout().addWidget(self._methodLabel, 1, 0, 1, 1)
|
74
|
-
self._methodCB = QComboBox(parent=self
|
48
|
+
self._methodCB = QComboBox(parent=self)
|
75
49
|
for method in _NabuPhaseMethod:
|
76
50
|
self._methodCB.addItem(method.value)
|
77
51
|
idx_ctf = self._methodCB.findText(_NabuPhaseMethod.CTF.value)
|
78
52
|
self._methodCB.setItemData(
|
79
|
-
idx_ctf, "Contrast
|
53
|
+
idx_ctf, "Contrast Transfer Function", qt.Qt.ToolTipRole
|
80
54
|
)
|
81
55
|
self.layout().addWidget(self._methodCB, 1, 1, 1, 3)
|
82
56
|
self.registerWidget(self._methodLabel, "required")
|
83
57
|
self.registerWidget(self._methodCB, "required")
|
84
58
|
|
85
59
|
# paganin & ctf options
|
86
|
-
self._paganinOpts = NabuPaganinConfig(parent=self
|
60
|
+
self._paganinOpts = NabuPaganinConfig(parent=self)
|
87
61
|
self.layout().addWidget(self._paganinOpts, 2, 0, 3, 3)
|
88
62
|
|
89
63
|
# unsharp options
|
@@ -118,6 +92,9 @@ class _NabuPhaseConfig(qt.QWidget, base._NabuStageConfigBase):
|
|
118
92
|
def _methodChanged(self, *args, **kwargs):
|
119
93
|
self._paganinOpts.setEnabled(self.getMethod() is not _NabuPhaseMethod.NONE)
|
120
94
|
self._ctfOpts.setEnabled(self.getMethod() is _NabuPhaseMethod.CTF)
|
95
|
+
self._unsharpOpts.setDiscourageUnsharpMask(
|
96
|
+
self.getMethod() is _NabuPhaseMethod.NONE
|
97
|
+
)
|
121
98
|
self.sigConfChanged.emit("method")
|
122
99
|
|
123
100
|
def _signalConfChanged(self, param):
|
@@ -186,7 +163,7 @@ class NabuPaganinConfig(qt.QWidget, base._NabuStageConfigBase):
|
|
186
163
|
modified
|
187
164
|
"""
|
188
165
|
|
189
|
-
def __init__(self, parent
|
166
|
+
def __init__(self, parent):
|
190
167
|
qt.QWidget.__init__(self, parent=parent, stage=_NabuStages.PHASE)
|
191
168
|
base._NabuStageConfigBase.__init__(self, stage=_NabuStages.PHASE)
|
192
169
|
self.setLayout(qt.QGridLayout())
|
@@ -205,7 +182,7 @@ class NabuPaganinConfig(qt.QWidget, base._NabuStageConfigBase):
|
|
205
182
|
# paganin padding_type
|
206
183
|
self._paddingLabel = qt.QLabel("padding", self)
|
207
184
|
self.layout().addWidget(self._paddingLabel, 2, 0, 1, 1)
|
208
|
-
self._paddingTypeCB = QComboBox(self
|
185
|
+
self._paddingTypeCB = QComboBox(self)
|
209
186
|
self._paddingTypeCB.setToolTip(
|
210
187
|
"Padding type for the filtering step " "in Paganin/CTR."
|
211
188
|
)
|
@@ -275,8 +252,12 @@ class NabuUnsharpConfig(qt.QWidget, base._NabuStageConfigBase):
|
|
275
252
|
def __init__(self, parent):
|
276
253
|
qt.QWidget.__init__(self, parent=parent, stage=_NabuStages.PHASE)
|
277
254
|
base._NabuStageConfigBase.__init__(self, stage=_NabuStages.PHASE)
|
255
|
+
self.__discourageUnSharpMask = False
|
278
256
|
self.setLayout(qt.QGridLayout())
|
279
257
|
|
258
|
+
warning_icon = icons.getQIcon("warning")
|
259
|
+
warning_unsharp_no_phase = "Warning: applying unsharp mask without phase retrieval can lead to 'noisy' reconstruction"
|
260
|
+
|
280
261
|
# unsharp coeff
|
281
262
|
self._unsharpCoeffCB = qt.QCheckBox("unsharp coeff", self)
|
282
263
|
self._unsharpCoeffCB.setToolTip(
|
@@ -293,6 +274,12 @@ class NabuUnsharpConfig(qt.QWidget, base._NabuStageConfigBase):
|
|
293
274
|
self.layout().addWidget(self._unsharpCoeffQLE, 0, 1, 1, 1)
|
294
275
|
self.registerWidget(self._unsharpCoeffCB, "optional")
|
295
276
|
self._unsharpCoeffOpt = self.registerWidget(self._unsharpCoeffQLE, "optional")
|
277
|
+
# unsharp coeff warning
|
278
|
+
self._unSharpCoeffWarning = qt.QLabel("")
|
279
|
+
self._unSharpCoeffWarning.setToolTip(warning_unsharp_no_phase)
|
280
|
+
self._unSharpCoeffWarning.setPixmap(warning_icon.pixmap(20, state=qt.QIcon.On))
|
281
|
+
self.layout().addWidget(self._unSharpCoeffWarning, 0, 2, 1, 1)
|
282
|
+
self.registerWidget(self._unSharpCoeffWarning, "optional")
|
296
283
|
|
297
284
|
# unsharp_sigma
|
298
285
|
self._unsharpSigmaCB = qt.QCheckBox("unsharp sigma", self)
|
@@ -308,6 +295,12 @@ class NabuUnsharpConfig(qt.QWidget, base._NabuStageConfigBase):
|
|
308
295
|
self.layout().addWidget(self._unsharpSigmaQLE, 1, 1, 1, 1)
|
309
296
|
self.registerWidget(self._unsharpSigmaCB, "optional")
|
310
297
|
self._unsharpSigmaOpt = self.registerWidget(self._unsharpSigmaQLE, "optional")
|
298
|
+
# unsharp coeff warning
|
299
|
+
self._unSharpSigmaWarning = qt.QLabel("")
|
300
|
+
self._unSharpSigmaWarning.setToolTip(warning_unsharp_no_phase)
|
301
|
+
self._unSharpSigmaWarning.setPixmap(warning_icon.pixmap(20, state=qt.QIcon.On))
|
302
|
+
self.layout().addWidget(self._unSharpSigmaWarning, 1, 2, 1, 1)
|
303
|
+
self.registerWidget(self._unSharpSigmaWarning, "optional")
|
311
304
|
|
312
305
|
# set up
|
313
306
|
self._unsharpCoeffCB.setChecked(False)
|
@@ -316,15 +309,18 @@ class NabuUnsharpConfig(qt.QWidget, base._NabuStageConfigBase):
|
|
316
309
|
self._unsharpSigmaQLE.setText(str(0.8))
|
317
310
|
self._showUnsharpCoeffQLE(False)
|
318
311
|
self._showUnsharpSigmaQLE(False)
|
312
|
+
self._updateUnsharpMaskWarning()
|
319
313
|
|
320
314
|
# signal / slot connection
|
321
315
|
## unsharp coeff
|
322
316
|
self._unsharpCoeffCB.toggled.connect(self._showUnsharpCoeffQLE)
|
323
317
|
self._unsharpCoeffCB.toggled.connect(self._unsharpCoeffChanged)
|
318
|
+
self._unsharpCoeffCB.toggled.connect(self._updateUnsharpMaskWarning)
|
324
319
|
self._unsharpCoeffQLE.editingFinished.connect(self._unsharpCoeffChanged)
|
325
320
|
## unsharp sigma
|
326
321
|
self._unsharpSigmaCB.toggled.connect(self._showUnsharpSigmaQLE)
|
327
322
|
self._unsharpSigmaCB.toggled.connect(self._unsharpSigmaChanged)
|
323
|
+
self._unsharpSigmaCB.toggled.connect(self._updateUnsharpMaskWarning)
|
328
324
|
self._unsharpSigmaQLE.editingFinished.connect(self._unsharpSigmaChanged)
|
329
325
|
|
330
326
|
def _unsharpCoeffChanged(self, *args, **kwargs):
|
@@ -348,7 +344,7 @@ class NabuUnsharpConfig(qt.QWidget, base._NabuStageConfigBase):
|
|
348
344
|
def _signalConfChanged(self, param):
|
349
345
|
self.sigConfChanged.emit(param)
|
350
346
|
|
351
|
-
def getUnsharpCoeff(self) ->
|
347
|
+
def getUnsharpCoeff(self) -> float | int:
|
352
348
|
if self.isUnsharpCoeffActive():
|
353
349
|
return float(self._unsharpCoeffQLE.text())
|
354
350
|
else:
|
@@ -361,7 +357,7 @@ class NabuUnsharpConfig(qt.QWidget, base._NabuStageConfigBase):
|
|
361
357
|
self._unsharpCoeffCB.setChecked(True)
|
362
358
|
self._unsharpCoeffQLE.setText(str(coeff))
|
363
359
|
|
364
|
-
def getUnsharpSigma(self) ->
|
360
|
+
def getUnsharpSigma(self) -> float | int:
|
365
361
|
if self.isUnsharpSigmaActive():
|
366
362
|
return float(self._unsharpSigmaQLE.text())
|
367
363
|
else:
|
@@ -385,3 +381,25 @@ class NabuUnsharpConfig(qt.QWidget, base._NabuStageConfigBase):
|
|
385
381
|
self.setUnsharpCoeff(float(conf["unsharp_coeff"]))
|
386
382
|
if "unsharp_sigma" in conf:
|
387
383
|
self.setUnsharpSigma(float(conf["unsharp_sigma"]))
|
384
|
+
|
385
|
+
def setDiscourageUnsharpMask(self, discourage: bool):
|
386
|
+
"""Should we discourage the user to apply unsharp mask.
|
387
|
+
This is the case if he tries to apply an unsharp mask without phase retrieval.
|
388
|
+
"""
|
389
|
+
self.__discourageUnSharpMask = discourage
|
390
|
+
|
391
|
+
def _updateUnsharpMaskWarning(self):
|
392
|
+
self._unSharpCoeffWarning.setVisible(
|
393
|
+
self.__discourageUnSharpMask and self._unsharpCoeffCB.isChecked()
|
394
|
+
)
|
395
|
+
self._unSharpSigmaWarning.setVisible(
|
396
|
+
self.__discourageUnSharpMask and self._unsharpSigmaCB.isChecked()
|
397
|
+
)
|
398
|
+
|
399
|
+
def setConfigurationLevel(self, level):
|
400
|
+
super().setConfigurationLevel(level)
|
401
|
+
# we also need to update the 'unsharp warning'
|
402
|
+
# note: at the moment if the basic configuration level is selected, without phase and some mask
|
403
|
+
# a warning will appear on bottom of the pahse GB. This is considered expected as this way we
|
404
|
+
# won't hide any warning.
|
405
|
+
self._updateUnsharpMaskWarning()
|
@@ -1,36 +1,8 @@
|
|
1
|
-
|
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__ = "06/12/2021"
|
29
|
-
|
1
|
+
from __future__ import annotations
|
30
2
|
|
31
3
|
import logging
|
32
|
-
from typing import Optional, Union
|
33
4
|
|
5
|
+
import sys
|
34
6
|
from silx.gui import qt
|
35
7
|
|
36
8
|
from tomwer.core.process.reconstruction.nabu.utils import (
|
@@ -56,7 +28,7 @@ class _NabuPreProcessingConfig(_NabuStageConfigBase, qt.QWidget):
|
|
56
28
|
modified
|
57
29
|
"""
|
58
30
|
|
59
|
-
def __init__(self, parent
|
31
|
+
def __init__(self, parent):
|
60
32
|
_NabuStageConfigBase.__init__(self, stage=_NabuStages.PRE)
|
61
33
|
qt.QWidget.__init__(self, parent)
|
62
34
|
self.setLayout(qt.QGridLayout())
|
@@ -75,7 +47,7 @@ class _NabuPreProcessingConfig(_NabuStageConfigBase, qt.QWidget):
|
|
75
47
|
self._dffSigmaLabel = qt.QLabel("sigma:", self)
|
76
48
|
self._dffSigmaLabel.setAlignment(qt.Qt.AlignRight)
|
77
49
|
self.layout().addWidget(self._dffSigmaLabel, 1, 2, 1, 1)
|
78
|
-
self._dffSigmaQDSB = QDoubleSpinBox(parent=self
|
50
|
+
self._dffSigmaQDSB = QDoubleSpinBox(parent=self)
|
79
51
|
self._dffSigmaQDSB.setMinimum(0.0)
|
80
52
|
self._dffSigmaQDSB.setDecimals(2)
|
81
53
|
self._dffSigmaQDSB.setSingleStep(0.1)
|
@@ -89,13 +61,13 @@ class _NabuPreProcessingConfig(_NabuStageConfigBase, qt.QWidget):
|
|
89
61
|
self.registerWidget(self._dffSigmaQDSB, "required"),
|
90
62
|
]
|
91
63
|
|
92
|
-
##
|
64
|
+
## sinogram ring correction
|
93
65
|
self._sinoRingCorrectionCB = qt.QLabel("rings removal method", self)
|
94
66
|
self._sinoRingCorrectionCB.setToolTip("Sinogram rings removal method")
|
95
67
|
self.layout().addWidget(self._sinoRingCorrectionCB, 2, 0, 1, 2)
|
96
68
|
self.registerWidget(self._sinoRingCorrectionCB, "required")
|
97
69
|
|
98
|
-
self._sinoRingCorrectionMthd = QComboBox(parent=self
|
70
|
+
self._sinoRingCorrectionMthd = QComboBox(parent=self)
|
99
71
|
for method in RingCorrectionMethod:
|
100
72
|
self._sinoRingCorrectionMthd.addItem(method.value)
|
101
73
|
## force method to be None by default
|
@@ -105,7 +77,7 @@ class _NabuPreProcessingConfig(_NabuStageConfigBase, qt.QWidget):
|
|
105
77
|
self.layout().addWidget(self._sinoRingCorrectionMthd, 2, 2, 1, 1)
|
106
78
|
self.registerWidget(self._sinoRingCorrectionMthd, "required")
|
107
79
|
|
108
|
-
self._sinoRingsOpts = SinoRingsOptions(parent=self
|
80
|
+
self._sinoRingsOpts = SinoRingsOptions(parent=self)
|
109
81
|
self.layout().addWidget(self._sinoRingsOpts, 3, 1, 1, 3)
|
110
82
|
|
111
83
|
## ccd filter
|
@@ -118,7 +90,7 @@ class _NabuPreProcessingConfig(_NabuStageConfigBase, qt.QWidget):
|
|
118
90
|
self._ccdHotspotLabel = qt.QLabel("threshold:", self)
|
119
91
|
self._ccdHotspotLabel.setAlignment(qt.Qt.AlignRight)
|
120
92
|
self.layout().addWidget(self._ccdHotspotLabel, 5, 2, 1, 1)
|
121
|
-
self._ccdThreshold = QDoubleSpinBox(self
|
93
|
+
self._ccdThreshold = QDoubleSpinBox(self)
|
122
94
|
self._ccdThreshold.setMinimum(0.0)
|
123
95
|
self._ccdThreshold.setMaximum(999999)
|
124
96
|
self._ccdThreshold.setSingleStep(0.01)
|
@@ -137,7 +109,9 @@ class _NabuPreProcessingConfig(_NabuStageConfigBase, qt.QWidget):
|
|
137
109
|
]
|
138
110
|
|
139
111
|
## sr current normalization
|
140
|
-
self._normalizeCurrent = qt.QCheckBox(
|
112
|
+
self._normalizeCurrent = qt.QCheckBox(
|
113
|
+
"Normalize by machine electric current", self
|
114
|
+
)
|
141
115
|
self._normalizeCurrent.setToolTip(
|
142
116
|
"Whether to normalize frames with Synchrotron Current. This can correct the effect of a beam refill not taken into account by flats."
|
143
117
|
)
|
@@ -153,7 +127,7 @@ class _NabuPreProcessingConfig(_NabuStageConfigBase, qt.QWidget):
|
|
153
127
|
self._clipMinLogValueLabel = qt.QLabel("log min clip value:", self)
|
154
128
|
self._clipMinLogValueLabel.setAlignment(qt.Qt.AlignRight)
|
155
129
|
self.layout().addWidget(self._clipMinLogValueLabel, 8, 2, 1, 1)
|
156
|
-
self._clipMinLogValue = QDoubleSpinBox(self
|
130
|
+
self._clipMinLogValue = QDoubleSpinBox(self)
|
157
131
|
self._clipMinLogValue.setMinimum(0.0)
|
158
132
|
self._clipMinLogValue.setMaximum(9999999)
|
159
133
|
self._clipMinLogValue.setSingleStep(0.01)
|
@@ -168,7 +142,7 @@ class _NabuPreProcessingConfig(_NabuStageConfigBase, qt.QWidget):
|
|
168
142
|
self._clipMaxLogValueLabel = qt.QLabel("log max clip value:", self)
|
169
143
|
self._clipMaxLogValueLabel.setAlignment(qt.Qt.AlignRight)
|
170
144
|
self.layout().addWidget(self._clipMaxLogValueLabel, 9, 2, 1, 1)
|
171
|
-
self._clipMaxLogValue = QDoubleSpinBox(self
|
145
|
+
self._clipMaxLogValue = QDoubleSpinBox(self)
|
172
146
|
self._clipMaxLogValue.setMinimum(0.0)
|
173
147
|
self._clipMaxLogValue.setMaximum(9999999)
|
174
148
|
self._clipMaxLogValue.setSingleStep(0.01)
|
@@ -375,6 +349,8 @@ class _NabuPreProcessingConfig(_NabuStageConfigBase, qt.QWidget):
|
|
375
349
|
"tilt_correction": tilt_correction,
|
376
350
|
"autotilt_options": autotilt_opts,
|
377
351
|
"normalize_srcurrent": int(self.getNormalizeCurrent()),
|
352
|
+
"rotate_projections_center": self._tiltCorrection.getRotateProjectionsCenter()
|
353
|
+
or "",
|
378
354
|
}
|
379
355
|
|
380
356
|
@docstring(_NabuStageConfigBase)
|
@@ -441,11 +417,16 @@ class _NabuPreProcessingConfig(_NabuStageConfigBase, qt.QWidget):
|
|
441
417
|
tilt_correction=tilt_correction, auto_tilt_options=autotilt_options
|
442
418
|
)
|
443
419
|
|
420
|
+
rotate_projections_center = conf.get("rotate_projections_center")
|
421
|
+
if rotate_projections_center == "":
|
422
|
+
rotate_projections_center = None
|
423
|
+
self._tiltCorrection.setRotateProjectionsCenter(rotate_projections_center)
|
424
|
+
|
444
425
|
|
445
426
|
class SinoRingsOptions(qt.QWidget):
|
446
427
|
_VO_DIMS = ("horizontaly", "horizontaly and vertically")
|
447
428
|
|
448
|
-
def __init__(self, parent=None,
|
429
|
+
def __init__(self, parent=None, *args, **kwargs):
|
449
430
|
super().__init__(parent, *args, **kwargs)
|
450
431
|
self._method = None
|
451
432
|
self.setLayout(qt.QFormLayout())
|
@@ -453,12 +434,12 @@ class SinoRingsOptions(qt.QWidget):
|
|
453
434
|
self.layout().setSpacing(0)
|
454
435
|
# munch parameters
|
455
436
|
self._sigmaMunchLabel = qt.QLabel("sigma", self)
|
456
|
-
self._sigmaMunch = QDoubleSpinBox(self
|
437
|
+
self._sigmaMunch = QDoubleSpinBox(self)
|
457
438
|
self._sigmaMunch.setRange(0.0, 2147483647)
|
458
439
|
self.layout().addRow(self._sigmaMunchLabel, self._sigmaMunch)
|
459
440
|
|
460
441
|
self._levelsMunchLabel = qt.QLabel("levels", self)
|
461
|
-
self._levelsMunch = QSpinBox(self
|
442
|
+
self._levelsMunch = QSpinBox(self)
|
462
443
|
self._levelsMunch.setRange(0, 2147483647)
|
463
444
|
self.layout().addRow(self._levelsMunchLabel, self._levelsMunch)
|
464
445
|
|
@@ -467,7 +448,7 @@ class SinoRingsOptions(qt.QWidget):
|
|
467
448
|
|
468
449
|
# vo parameters
|
469
450
|
self._snrVOLabel = qt.QLabel("snr", self)
|
470
|
-
self._snrVO = QDoubleSpinBox(self
|
451
|
+
self._snrVO = QDoubleSpinBox(self)
|
471
452
|
self._snrVO.setMinimum(0.0)
|
472
453
|
tooltip = "Ratio used to locate large stripes. Greater is less sensitive."
|
473
454
|
self._snrVO.setToolTip(tooltip)
|
@@ -475,7 +456,7 @@ class SinoRingsOptions(qt.QWidget):
|
|
475
456
|
self.layout().addRow(self._snrVOLabel, self._snrVO)
|
476
457
|
|
477
458
|
self._laSizeVOLabel = qt.QLabel("la_size", self)
|
478
|
-
self._laSizeVO = QSpinBox(self
|
459
|
+
self._laSizeVO = QSpinBox(self)
|
479
460
|
self._laSizeVO.setMinimum(0)
|
480
461
|
tooltip = "Window size of the median filter to remove large stripes."
|
481
462
|
self._laSizeVO.setToolTip(tooltip)
|
@@ -483,7 +464,7 @@ class SinoRingsOptions(qt.QWidget):
|
|
483
464
|
self.layout().addRow(self._laSizeVOLabel, self._laSizeVO)
|
484
465
|
|
485
466
|
self._smSizeVOLabel = qt.QLabel("sm_size", self)
|
486
|
-
self._smSizeVO = QSpinBox(self
|
467
|
+
self._smSizeVO = QSpinBox(self)
|
487
468
|
self._smSizeVO.setMinimum(0)
|
488
469
|
tooltip = "Window size of the median filter to remove small-to-medium stripes."
|
489
470
|
self._laSizeVO.setToolTip(tooltip)
|
@@ -491,18 +472,18 @@ class SinoRingsOptions(qt.QWidget):
|
|
491
472
|
self.layout().addRow(self._smSizeVOLabel, self._smSizeVO)
|
492
473
|
|
493
474
|
self._dimVOLabel = qt.QLabel("dimension", self)
|
494
|
-
self._dimVO = QComboBox(self
|
475
|
+
self._dimVO = QComboBox(self)
|
495
476
|
self._dimVO.addItems(self._VO_DIMS)
|
496
477
|
self.layout().addRow(self._dimVOLabel, self._dimVO)
|
497
478
|
|
498
479
|
# sino mean deringer
|
499
480
|
self._sigmaLowLabel = qt.QLabel("signal low", self)
|
500
|
-
self._sigmaLow = QDoubleSpinBox(self
|
481
|
+
self._sigmaLow = QDoubleSpinBox(self)
|
501
482
|
self._sigmaLow.setMinimum(0.0)
|
502
483
|
self._sigmaHighLabel = qt.QLabel("signal high", self)
|
503
484
|
self.layout().addRow(self._sigmaLowLabel, self._sigmaLow)
|
504
485
|
|
505
|
-
self._sigmaHigh = QDoubleSpinBox(self
|
486
|
+
self._sigmaHigh = QDoubleSpinBox(self)
|
506
487
|
self._sigmaHigh.setMinimum(0.0)
|
507
488
|
tooltip = (
|
508
489
|
"sigma low and sigma high values are defining the standard deviation of "
|
@@ -536,7 +517,7 @@ class SinoRingsOptions(qt.QWidget):
|
|
536
517
|
else:
|
537
518
|
raise NotImplementedError
|
538
519
|
|
539
|
-
def setVoDim(self, dim:
|
520
|
+
def setVoDim(self, dim: int | str):
|
540
521
|
if dim in ("1", 1, self._VO_DIMS[0]):
|
541
522
|
self._dimVO.setCurrentText(self._VO_DIMS[0])
|
542
523
|
elif dim in ("2", 2, self._VO_DIMS[1]):
|
@@ -691,24 +672,35 @@ class TiltCorrection(qt.QGroupBox):
|
|
691
672
|
"""
|
692
673
|
)
|
693
674
|
self.layout().addRow(self._autotiltOptsLabel, self._autoTiltOptions)
|
675
|
+
## `rotate_projections_center` option
|
676
|
+
self._rotateProjectionCenter = RotateProjectionCenterWidget(self)
|
677
|
+
self._rotateProjectionCenter.setToolTip(
|
678
|
+
"\n".join(
|
679
|
+
(
|
680
|
+
"Allows to correct detector tilt along beam orthogonal plan.",
|
681
|
+
"By default the center of rotation is the middle of each radio, i.e ((Nx-1)/2.0, (Ny-1)/2.0).",
|
682
|
+
)
|
683
|
+
)
|
684
|
+
)
|
685
|
+
self.layout().addRow(self._rotateProjectionCenter)
|
694
686
|
|
695
687
|
# set up
|
696
688
|
self._autoManualRB.setChecked(True)
|
697
689
|
|
698
690
|
# connect signal / slot
|
699
|
-
self._tiltManualRB.toggled.connect(self.
|
700
|
-
self._autoManualRB.toggled.connect(self.
|
691
|
+
self._tiltManualRB.toggled.connect(self._updateVisibility)
|
692
|
+
self._autoManualRB.toggled.connect(self._updateVisibility)
|
701
693
|
|
702
694
|
self._tiltManualRB.toggled.connect(self._changed)
|
703
695
|
self._autoManualRB.toggled.connect(self._changed)
|
704
696
|
self._angleValueSB.valueChanged.connect(self._changed)
|
705
697
|
|
706
|
-
self.
|
698
|
+
self._updateVisibility()
|
707
699
|
|
708
700
|
def _changed(self, *args, **kwargs):
|
709
701
|
self.sigChanged.emit()
|
710
702
|
|
711
|
-
def
|
703
|
+
def _updateVisibility(self):
|
712
704
|
self._angleValueSB.setEnabled(self._tiltManualRB.isChecked())
|
713
705
|
self._autoModeCB.setEnabled(self._autoManualRB.isChecked())
|
714
706
|
self._autotiltOptsLabel.setVisible(self._autoManualRB.isChecked())
|
@@ -726,7 +718,7 @@ class TiltCorrection(qt.QGroupBox):
|
|
726
718
|
return self._autoModeCB.currentText(), self._autoTiltOptions.text()
|
727
719
|
|
728
720
|
def setTiltCorrection(
|
729
|
-
self, tilt_correction: str, auto_tilt_options:
|
721
|
+
self, tilt_correction: str, auto_tilt_options: str | None = None
|
730
722
|
) -> None:
|
731
723
|
if tilt_correction in ("", None):
|
732
724
|
self.setChecked(False)
|
@@ -741,3 +733,60 @@ class TiltCorrection(qt.QGroupBox):
|
|
741
733
|
self._angleValueSB.setValue(float(tilt_correction))
|
742
734
|
if auto_tilt_options is not None:
|
743
735
|
self._autoTiltOptions.setText(auto_tilt_options)
|
736
|
+
|
737
|
+
def getRotateProjectionsCenter(self):
|
738
|
+
if self.isChecked():
|
739
|
+
return self._rotateProjectionCenter.getRotateProjectionsCenter()
|
740
|
+
else:
|
741
|
+
return None
|
742
|
+
|
743
|
+
def setRotateProjectionsCenter(self, values):
|
744
|
+
self._rotateProjectionCenter.setRotateProjectionsCenter(values=values)
|
745
|
+
|
746
|
+
|
747
|
+
class RotateProjectionCenterWidget(qt.QWidget):
|
748
|
+
|
749
|
+
RANGE_MIN_VALUE = -sys.float_info.max
|
750
|
+
RANGE_MAX_VALUE = sys.float_info.max
|
751
|
+
|
752
|
+
def __init__(self, parent: qt.QWidget | None = None) -> None:
|
753
|
+
super().__init__(parent)
|
754
|
+
self.setLayout(qt.QHBoxLayout())
|
755
|
+
self._label = qt.QLabel("rotate projections center")
|
756
|
+
self.layout().addWidget(self._label)
|
757
|
+
|
758
|
+
self._xQLE = qt.QDoubleSpinBox(self)
|
759
|
+
self._xQLE.setRange(
|
760
|
+
RotateProjectionCenterWidget.RANGE_MIN_VALUE,
|
761
|
+
RotateProjectionCenterWidget.RANGE_MAX_VALUE,
|
762
|
+
)
|
763
|
+
self._xQLE.setPrefix("x=")
|
764
|
+
self._xQLE.setToolTip("Value should be in [-radio width, radio width]")
|
765
|
+
self._xQLE.setSuffix("px")
|
766
|
+
self.layout().addWidget(self._xQLE)
|
767
|
+
|
768
|
+
self._yQLE = qt.QDoubleSpinBox(self)
|
769
|
+
self._yQLE.setRange(
|
770
|
+
RotateProjectionCenterWidget.RANGE_MIN_VALUE,
|
771
|
+
RotateProjectionCenterWidget.RANGE_MAX_VALUE,
|
772
|
+
)
|
773
|
+
self._yQLE.setPrefix("y=")
|
774
|
+
self._xQLE.setToolTip("Value should be in [-radio heigh, radio heigh]")
|
775
|
+
self._yQLE.setSuffix("px")
|
776
|
+
self.layout().addWidget(self._yQLE)
|
777
|
+
|
778
|
+
def getRotateProjectionsCenter(self) -> tuple | None:
|
779
|
+
if self._xQLE.value() == 0 and self._yQLE.value() == 0:
|
780
|
+
return None
|
781
|
+
else:
|
782
|
+
return (self._xQLE.value(), self._yQLE.value())
|
783
|
+
|
784
|
+
def setRotateProjectionsCenter(self, values: tuple[float] | None):
|
785
|
+
if values is None:
|
786
|
+
self._xQLE.setValue(0.0)
|
787
|
+
self._yQLE.setValue(0.0)
|
788
|
+
elif not isinstance(values, (tuple, list)) and len(values) != 2:
|
789
|
+
raise TypeError("values should be a tuple of two elements")
|
790
|
+
else:
|
791
|
+
self._xQLE.setValue(values[0])
|
792
|
+
self._yQLE.setValue(values[1])
|