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,34 +1,6 @@
|
|
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/08/2020"
|
29
|
-
|
30
|
-
|
31
|
-
import typing
|
2
|
+
from __future__ import annotations
|
3
|
+
|
32
4
|
from asyncio.log import logger
|
33
5
|
|
34
6
|
from silx.gui import qt
|
@@ -36,6 +8,7 @@ from silx.gui import qt
|
|
36
8
|
from tomwer.core.process.reconstruction.nabu.utils import (
|
37
9
|
_NabuStages,
|
38
10
|
)
|
11
|
+
from tomwer.core.utils.dictutils import concatenate_dict
|
39
12
|
from tomwer.gui import icons
|
40
13
|
from tomwer.gui.configuration.action import (
|
41
14
|
BasicConfigurationAction,
|
@@ -48,6 +21,11 @@ from tomwer.gui.reconstruction.nabu.nabuconfig.output import (
|
|
48
21
|
NabuOutputLocationWidget,
|
49
22
|
QNabuFileFormatComboBox,
|
50
23
|
)
|
24
|
+
from tomwer.gui.reconstruction.nabu.platform import NabuPlatformSettings
|
25
|
+
from tomwer.gui.settings import (
|
26
|
+
TAB_LABEL_RECONSTRUCTION_SETTINGS,
|
27
|
+
TAB_LABEL_PLATFORM_SETTINGS,
|
28
|
+
)
|
51
29
|
|
52
30
|
|
53
31
|
class SliceSelector(qt.QWidget):
|
@@ -57,6 +35,7 @@ class SliceSelector(qt.QWidget):
|
|
57
35
|
"""
|
58
36
|
|
59
37
|
valueChanged = qt.Signal()
|
38
|
+
"""emit when the slice value change"""
|
60
39
|
|
61
40
|
def __init__(
|
62
41
|
self, label, auto_alias, is_end, grid_layout, index_layout, parent=None
|
@@ -184,10 +163,10 @@ class NabuVolumeWidget(_NabuStageConfigBase, qt.QWidget):
|
|
184
163
|
)
|
185
164
|
self._redefineNabuFileFormat.setCheckable(True)
|
186
165
|
self._redefineNabuFileFormat.setLayout(qt.QVBoxLayout())
|
187
|
-
self.
|
188
|
-
self._redefineNabuFileFormat.layout().addWidget(self.
|
166
|
+
self._fileFormatCB = QNabuFileFormatComboBox(self._redefineNabuFileFormat)
|
167
|
+
self._redefineNabuFileFormat.layout().addWidget(self._fileFormatCB)
|
189
168
|
self.layout().addWidget(self._redefineNabuFileFormat, 4, 0, 1, 2)
|
190
|
-
self.registerWidget(self.
|
169
|
+
self.registerWidget(self._fileFormatCB, "advanced")
|
191
170
|
self.registerWidget(self._redefineNabuFileFormat, "advanced")
|
192
171
|
|
193
172
|
# redefine output location
|
@@ -202,35 +181,9 @@ class NabuVolumeWidget(_NabuStageConfigBase, qt.QWidget):
|
|
202
181
|
self.registerWidget(self._redefineNabuOutputLocation, "advanced")
|
203
182
|
self.registerWidget(self._outputLocationWidget, "advanced")
|
204
183
|
|
205
|
-
#
|
206
|
-
self.
|
207
|
-
self.layout().addWidget(self.
|
208
|
-
self.registerWidget(self._labelGPUFract, "advanced")
|
209
|
-
self._spbGPUFract = qt.QSpinBox(self)
|
210
|
-
self._spbGPUFract.setSingleStep(10)
|
211
|
-
self._spbGPUFract.setSuffix("%")
|
212
|
-
self._spbGPUFract.setMinimum(1)
|
213
|
-
self._spbGPUFract.setMaximum(100)
|
214
|
-
self.layout().addWidget(self._spbGPUFract, 50, 1, 1, 1)
|
215
|
-
self._spbGPUFract.setToolTip("Which fraction of GPU memory to use.")
|
216
|
-
self.registerWidget(self._spbGPUFract, "advanced")
|
217
|
-
|
218
|
-
# cpu percentage
|
219
|
-
self._labelCPUFract = qt.QLabel("CPU percentage usage", self)
|
220
|
-
self.layout().addWidget(self._labelCPUFract, 51, 0, 1, 1)
|
221
|
-
self.registerWidget(self._labelCPUFract, "advanced")
|
222
|
-
self._spbCPUFract = qt.QSpinBox(self)
|
223
|
-
self._spbCPUFract.setSingleStep(10)
|
224
|
-
self._spbCPUFract.setSuffix("%")
|
225
|
-
self._spbCPUFract.setMinimum(1)
|
226
|
-
self._spbCPUFract.setMaximum(100)
|
227
|
-
self.layout().addWidget(self._spbCPUFract, 52, 1, 1, 1)
|
228
|
-
self._spbCPUFract.setToolTip("Which fraction of CPU memory to use.")
|
229
|
-
self.registerWidget(self._spbCPUFract, "advanced")
|
230
|
-
|
231
|
-
# opt use phase paganin
|
232
|
-
self._usePhaseQCB = qt.QCheckBox("Use phase paganin")
|
233
|
-
self.layout().addWidget(self._usePhaseQCB, 53, 0, 1, 2)
|
184
|
+
# opt use phase Paganin
|
185
|
+
self._usePhaseQCB = qt.QCheckBox("Use phase Paganin")
|
186
|
+
self.layout().addWidget(self._usePhaseQCB, 52, 0, 1, 2)
|
234
187
|
self.registerWidget(self._usePhaseQCB, "advanced")
|
235
188
|
self._usePhaseQCB.setToolTip(
|
236
189
|
"Whether to use a margin when " "performing phase retrieval."
|
@@ -243,8 +196,6 @@ class NabuVolumeWidget(_NabuStageConfigBase, qt.QWidget):
|
|
243
196
|
|
244
197
|
# set up
|
245
198
|
self._histogramCB.setChecked(True)
|
246
|
-
self._spbGPUFract.setValue(90)
|
247
|
-
self._spbCPUFract.setValue(90)
|
248
199
|
self._usePhaseQCB.setChecked(True)
|
249
200
|
self._redefineNabuFileFormat.setChecked(False)
|
250
201
|
self._redefineNabuOutputLocation.setChecked(False)
|
@@ -253,8 +204,6 @@ class NabuVolumeWidget(_NabuStageConfigBase, qt.QWidget):
|
|
253
204
|
# connect signal / slot
|
254
205
|
self._fromSlice.valueChanged.connect(self._triggerSigConfChanged)
|
255
206
|
self._toSlice.valueChanged.connect(self._triggerSigConfChanged)
|
256
|
-
self._spbGPUFract.valueChanged.connect(self._triggerSigConfChanged)
|
257
|
-
self._spbCPUFract.valueChanged.connect(self._triggerSigConfChanged)
|
258
207
|
self._usePhaseQCB.toggled.connect(self._triggerSigConfChanged)
|
259
208
|
self._outputLocationWidget._outputDirQLE.editingFinished.connect(
|
260
209
|
self._triggerSigConfChanged
|
@@ -274,7 +223,7 @@ class NabuVolumeWidget(_NabuStageConfigBase, qt.QWidget):
|
|
274
223
|
else:
|
275
224
|
return None
|
276
225
|
|
277
|
-
def setNabuOutputLocation(self, location:
|
226
|
+
def setNabuOutputLocation(self, location: str | None):
|
278
227
|
if location is None:
|
279
228
|
self._redefineNabuOutputLocation.setChecked(False)
|
280
229
|
else:
|
@@ -287,37 +236,25 @@ class NabuVolumeWidget(_NabuStageConfigBase, qt.QWidget):
|
|
287
236
|
|
288
237
|
def getNabuFileFormat(self):
|
289
238
|
if self.redefineNabuFileFormat():
|
290
|
-
return self.
|
239
|
+
return self._fileFormatCB.currentText()
|
291
240
|
else:
|
292
241
|
return None
|
293
242
|
|
294
|
-
def setNabuFileFormat(self, file_format:
|
243
|
+
def setNabuFileFormat(self, file_format: str | None):
|
295
244
|
if file_format is None:
|
296
245
|
self._redefineNabuFileFormat.setChecked(False)
|
297
246
|
else:
|
298
247
|
assert isinstance(file_format, str)
|
299
248
|
self._redefineNabuFileFormat.setChecked(True)
|
300
|
-
idx = self.
|
249
|
+
idx = self._fileFormatCB.findText(file_format)
|
301
250
|
if idx < 0:
|
302
251
|
logger.error(f"unable to find file format {file_format}")
|
303
252
|
else:
|
304
|
-
self.
|
253
|
+
self._fileFormatCB.setCurrentIndex(idx)
|
305
254
|
|
306
255
|
def _triggerSigConfChanged(self, *args, **kwargs):
|
307
256
|
self.sigConfigChanged.emit()
|
308
257
|
|
309
|
-
def getCPUFract(self):
|
310
|
-
return self._spbCPUFract.value() / 100.0
|
311
|
-
|
312
|
-
def setCPUFract(self, value):
|
313
|
-
return self._spbCPUFract.setValue(int(value * 100.0))
|
314
|
-
|
315
|
-
def getGPUFract(self):
|
316
|
-
return self._spbGPUFract.value() / 100.0
|
317
|
-
|
318
|
-
def setGPUFract(self, value):
|
319
|
-
return self._spbGPUFract.setValue(int(value * 100.0))
|
320
|
-
|
321
258
|
def getStartZ(self):
|
322
259
|
return self._fromSlice.value()
|
323
260
|
|
@@ -352,8 +289,6 @@ class NabuVolumeWidget(_NabuStageConfigBase, qt.QWidget):
|
|
352
289
|
return {
|
353
290
|
"start_z": self.getStartZ(),
|
354
291
|
"end_z": self.getEndZ(),
|
355
|
-
"gpu_mem_fraction": self.getGPUFract(),
|
356
|
-
"cpu_mem_fraction": self.getCPUFract(),
|
357
292
|
"use_phase_margin": self.phasePaganinRequested(),
|
358
293
|
"postproc": {
|
359
294
|
"output_histogram": int(self.isHistogramRequested()),
|
@@ -369,10 +304,6 @@ class NabuVolumeWidget(_NabuStageConfigBase, qt.QWidget):
|
|
369
304
|
self.setStartZ(config["start_z"])
|
370
305
|
if "end_z" in config:
|
371
306
|
self.setEndZ(config["end_z"])
|
372
|
-
if "gpu_mem_fraction" in config:
|
373
|
-
self.setGPUFract(config["gpu_mem_fraction"])
|
374
|
-
if "cpu_mem_fraction" in config:
|
375
|
-
self.setCPUFract(config["cpu_mem_fraction"])
|
376
307
|
if "use_phase_margin" in config:
|
377
308
|
self.setPhasePaganinRequested(config["use_phase_margin"])
|
378
309
|
if "postproc" in config:
|
@@ -406,6 +337,47 @@ class NabuVolumeWidget(_NabuStageConfigBase, qt.QWidget):
|
|
406
337
|
return self._configuration_level
|
407
338
|
|
408
339
|
|
340
|
+
class NabuVolumeTabWidget(qt.QTabWidget):
|
341
|
+
"""
|
342
|
+
Widget that integrate the reconstruction settings and the platform (local) settings
|
343
|
+
"""
|
344
|
+
|
345
|
+
sigConfigChanged = qt.Signal()
|
346
|
+
|
347
|
+
def __init__(self, parent: qt.QWidget | None = ...) -> None:
|
348
|
+
super().__init__(parent)
|
349
|
+
self._configurationLevel = ConfigurationLevel.OPTIONAL
|
350
|
+
self._nabuSettingsWidget = NabuVolumeWidget(parent=self)
|
351
|
+
self.addTab(self._nabuSettingsWidget, TAB_LABEL_RECONSTRUCTION_SETTINGS)
|
352
|
+
|
353
|
+
self._platformSettingsWidget = NabuPlatformSettings(parent=self)
|
354
|
+
self.addTab(self._platformSettingsWidget, TAB_LABEL_PLATFORM_SETTINGS)
|
355
|
+
|
356
|
+
# connect signal / slot
|
357
|
+
self._nabuSettingsWidget.sigConfigChanged.connect(self.sigConfigChanged)
|
358
|
+
self._platformSettingsWidget.sigConfigChanged.connect(self.sigConfigChanged)
|
359
|
+
|
360
|
+
def getConfiguration(self) -> dict:
|
361
|
+
return concatenate_dict(
|
362
|
+
self._nabuSettingsWidget.getConfiguration(),
|
363
|
+
self._platformSettingsWidget.getConfiguration(),
|
364
|
+
)
|
365
|
+
|
366
|
+
def setConfiguration(self, config: dict) -> None:
|
367
|
+
self._nabuSettingsWidget.setConfiguration(config=config)
|
368
|
+
self._platformSettingsWidget.setConfiguration(config=config)
|
369
|
+
|
370
|
+
def setConfigurationLevel(self, level):
|
371
|
+
self._configurationLevel = ConfigurationLevel(level)
|
372
|
+
self._nabuSettingsWidget.setConfigurationLevel(level=self._configurationLevel)
|
373
|
+
self._platformSettingsWidget.setConfigurationLevel(
|
374
|
+
level=self._configurationLevel
|
375
|
+
)
|
376
|
+
|
377
|
+
def getConfigurationLevel(self):
|
378
|
+
return self._configuration_level
|
379
|
+
|
380
|
+
|
409
381
|
class NabuVolumeWindow(qt.QMainWindow):
|
410
382
|
"""
|
411
383
|
Widget to define settings for a volume reconstruction
|
@@ -419,7 +391,7 @@ class NabuVolumeWindow(qt.QMainWindow):
|
|
419
391
|
|
420
392
|
self.setWindowFlags(qt.Qt.Widget)
|
421
393
|
|
422
|
-
self._mainWidget =
|
394
|
+
self._mainWidget = NabuVolumeTabWidget(parent=self)
|
423
395
|
self.setCentralWidget(self._mainWidget)
|
424
396
|
|
425
397
|
# add toolbar
|
@@ -1,40 +1,11 @@
|
|
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
2
|
"""
|
26
3
|
contains gui relative to intensity normalization
|
27
4
|
"""
|
28
5
|
|
6
|
+
from __future__ import annotations
|
29
7
|
|
30
|
-
__authors__ = [
|
31
|
-
"H. Payno",
|
32
|
-
]
|
33
|
-
__license__ = "MIT"
|
34
|
-
__date__ = "23/06/2021"
|
35
8
|
|
36
|
-
|
37
|
-
import typing
|
38
9
|
import weakref
|
39
10
|
|
40
11
|
from silx.gui import qt
|
@@ -155,7 +126,7 @@ class SinoNormWindow(qt.QMainWindow):
|
|
155
126
|
else:
|
156
127
|
return None
|
157
128
|
|
158
|
-
def setScan(self, scan:
|
129
|
+
def setScan(self, scan: TomwerScanBase | None):
|
159
130
|
self._scan = weakref.ref(scan)
|
160
131
|
self._centralWidget.setScan(scan=scan)
|
161
132
|
self._optsWidget.setScan(scan=scan)
|
@@ -199,7 +170,7 @@ class _Viewer(qt.QTabWidget):
|
|
199
170
|
self._sinoView.sigSinoLoadEnded.connect(self._updateSinogramROI)
|
200
171
|
self._projView.sigROIChanged.connect(self._updateSinogramROI)
|
201
172
|
|
202
|
-
def setScan(self, scan:
|
173
|
+
def setScan(self, scan: TomwerScanBase | None):
|
203
174
|
"""
|
204
175
|
|
205
176
|
:param scan: scan to handle
|
@@ -685,6 +656,7 @@ class _NormIntensityControl(ControlWidget):
|
|
685
656
|
|
686
657
|
class _NormIntensityScalarValue(qt.QWidget):
|
687
658
|
sigValueChanged = qt.Signal(float)
|
659
|
+
"""emit when the scalar value to norm intensity change"""
|
688
660
|
|
689
661
|
def __init__(self, parent=None):
|
690
662
|
qt.QWidget.__init__(self, parent=parent)
|
@@ -711,6 +683,7 @@ class _NormIntensityDatasetWidget(qt.QWidget):
|
|
711
683
|
_FILE_PATH_LOCAL_VALUE = "scan master file"
|
712
684
|
|
713
685
|
sigConfigurationChanged = qt.Signal()
|
686
|
+
"""emit when configuration change"""
|
714
687
|
|
715
688
|
def __init__(self, parent=None):
|
716
689
|
qt.QWidget.__init__(self, parent)
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
from __future__ import annotations
|
3
|
+
|
4
|
+
import os
|
5
|
+
import shutil
|
6
|
+
import tempfile
|
7
|
+
|
8
|
+
from silx.gui import qt
|
9
|
+
from silx.gui.utils.testutils import TestCaseQt
|
10
|
+
|
11
|
+
from tomwer.core.process.reconstruction.normalization.params import (
|
12
|
+
Method as NormalizationMethod,
|
13
|
+
)
|
14
|
+
from tomwer.core.process.reconstruction.normalization.params import (
|
15
|
+
_ValueSource as NormalizationSource,
|
16
|
+
)
|
17
|
+
from tomwer.core.utils.scanutils import MockNXtomo
|
18
|
+
from tomwer.gui.reconstruction.normalization.intensity import SinoNormWindow
|
19
|
+
|
20
|
+
|
21
|
+
class TestNormIntensityWindow(TestCaseQt):
|
22
|
+
def setUp(self):
|
23
|
+
super(TestNormIntensityWindow, self).setUp()
|
24
|
+
self._widget = SinoNormWindow(parent=None)
|
25
|
+
self._tmp_dir = tempfile.mkdtemp()
|
26
|
+
scan_path = os.path.join(self._tmp_dir, "my_scan_2")
|
27
|
+
self.scan = MockNXtomo(
|
28
|
+
scan_path=scan_path,
|
29
|
+
n_ini_proj=10,
|
30
|
+
n_proj=10,
|
31
|
+
n_alignement_proj=2,
|
32
|
+
create_final_flat=False,
|
33
|
+
create_ini_dark=True,
|
34
|
+
create_ini_flat=True,
|
35
|
+
n_refs=1,
|
36
|
+
).scan
|
37
|
+
|
38
|
+
def tearDown(self):
|
39
|
+
self._widget.setAttribute(qt.Qt.WA_DeleteOnClose)
|
40
|
+
self._widget.close()
|
41
|
+
self.qapp.processEvents()
|
42
|
+
self._widget = None
|
43
|
+
shutil.rmtree(self._tmp_dir)
|
44
|
+
super(TestNormIntensityWindow, self).tearDown()
|
45
|
+
|
46
|
+
def test(self):
|
47
|
+
self._widget.setScan(self.scan)
|
48
|
+
self._widget.show()
|
49
|
+
self.qWaitForWindowExposed(self._widget)
|
50
|
+
self._widget.setCurrentMethod(NormalizationMethod.NONE)
|
51
|
+
self.qapp.processEvents()
|
52
|
+
assert self._widget.getConfiguration() == {"source": "none", "method": "none"}
|
53
|
+
|
54
|
+
self._widget.setCurrentMethod(NormalizationMethod.CHEBYSHEV)
|
55
|
+
self.qapp.processEvents()
|
56
|
+
assert self._widget.getConfiguration() == {
|
57
|
+
"method": "chebyshev",
|
58
|
+
"source": "none",
|
59
|
+
}
|
60
|
+
|
61
|
+
self._widget.setCurrentMethod(NormalizationMethod.SUBTRACTION)
|
62
|
+
self.qapp.processEvents()
|
63
|
+
self._widget.setCurrentSource(NormalizationSource.MANUAL_ROI)
|
64
|
+
self.qapp.processEvents()
|
65
|
+
output_configuration = self._widget.getConfiguration()
|
66
|
+
assert output_configuration["method"] == "subtraction"
|
67
|
+
assert output_configuration["source"] == "manual ROI"
|
68
|
+
assert "start_x" in output_configuration
|
69
|
+
assert "end_x" in output_configuration
|
70
|
+
assert "start_y" in output_configuration
|
71
|
+
assert "end_y" in output_configuration
|
72
|
+
assert "calc_fct" in output_configuration
|
73
|
+
self._widget.setCurrentMethod(NormalizationMethod.DIVISION)
|
74
|
+
self.qapp.processEvents()
|
75
|
+
self._widget.setCurrentSource(NormalizationSource.DATASET)
|
76
|
+
self.qapp.processEvents()
|
77
|
+
output_configuration = self._widget.getConfiguration()
|
78
|
+
assert output_configuration["method"] == "division"
|
79
|
+
assert output_configuration["source"] == "from dataset"
|
80
|
+
assert "dataset_url" in output_configuration
|
81
|
+
|
82
|
+
self._widget.setCurrentMethod(NormalizationMethod.DIVISION)
|
83
|
+
self.qapp.processEvents()
|
84
|
+
self._widget.setCurrentSource(NormalizationSource.MANUAL_SCALAR)
|
85
|
+
self.qapp.processEvents()
|
86
|
+
output_configuration = self._widget.getConfiguration()
|
87
|
+
assert output_configuration["method"] == "division"
|
88
|
+
assert output_configuration["source"] == "scalar"
|
89
|
+
assert "value" in output_configuration
|
@@ -1,43 +1,12 @@
|
|
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
1
|
"""
|
26
2
|
contains gui relative to semi-automatic axis calculation
|
27
3
|
"""
|
28
4
|
|
29
|
-
|
30
|
-
__authors__ = [
|
31
|
-
"H. Payno",
|
32
|
-
]
|
33
|
-
__license__ = "MIT"
|
34
|
-
__date__ = "26/02/2021"
|
35
|
-
|
5
|
+
from __future__ import annotations
|
36
6
|
|
37
7
|
import functools
|
38
8
|
import logging
|
39
9
|
import weakref
|
40
|
-
from typing import Union
|
41
10
|
|
42
11
|
import numpy
|
43
12
|
from silx.gui import icons as silxicons
|
@@ -47,6 +16,10 @@ from silx.gui.plot import items
|
|
47
16
|
from silx.utils.enum import Enum as _Enum
|
48
17
|
from tomoscan.esrf.scan.utils import get_data
|
49
18
|
|
19
|
+
from tomwer.core.process.reconstruction.utils.cor import (
|
20
|
+
absolute_pos_to_relative,
|
21
|
+
relative_pos_to_absolute,
|
22
|
+
)
|
50
23
|
from tomwer.core.process.reconstruction.saaxis.saaxis import ReconstructionMode
|
51
24
|
from tomwer.core.scan.scanbase import TomwerScanBase
|
52
25
|
from tomwer.gui import icons
|
@@ -54,6 +27,7 @@ from tomwer.gui.reconstruction.saaxis.sliceselector import SliceSelector
|
|
54
27
|
from tomwer.gui.utils.lineselector import QSliceSelectorDialog
|
55
28
|
from tomwer.gui.utils.slider import LogSlider
|
56
29
|
from tomwer.gui.visualization.sinogramviewer import SinogramViewer as _SinogramViewer
|
30
|
+
from tomwer.gui.fonts import FONT_MEDIUM, FONT_IMPORTANT
|
57
31
|
|
58
32
|
_logger = logging.getLogger(__name__)
|
59
33
|
|
@@ -137,10 +111,10 @@ class SinogramViewer(_SinogramViewer):
|
|
137
111
|
"""
|
138
112
|
For now we can only modify the estimated cor
|
139
113
|
|
140
|
-
:param
|
141
|
-
:param
|
142
|
-
:param
|
143
|
-
:param
|
114
|
+
:param min:
|
115
|
+
:param max:
|
116
|
+
:param estimated_cor:
|
117
|
+
:param display_n_recons: the grid created by all cor observe
|
144
118
|
:return:
|
145
119
|
"""
|
146
120
|
self._min = cor_min
|
@@ -333,7 +307,7 @@ class _ReconstructionModeGB(qt.QGroupBox):
|
|
333
307
|
else:
|
334
308
|
raise ValueError("No reconstruction mode selected")
|
335
309
|
|
336
|
-
def setReconstructionMode(self, mode:
|
310
|
+
def setReconstructionMode(self, mode: ReconstructionMode | str) -> None:
|
337
311
|
mode = ReconstructionMode.from_value(mode)
|
338
312
|
if mode is ReconstructionMode.TILT_CORRECTION:
|
339
313
|
self._tiltCorrectionRB.setChecked(True)
|
@@ -354,7 +328,7 @@ class _ReconstructionModeGB(qt.QGroupBox):
|
|
354
328
|
else:
|
355
329
|
raise ValueError(f"mode {mode} is not handled")
|
356
330
|
|
357
|
-
def setReconstructionSlices(self, slice_:
|
331
|
+
def setReconstructionSlices(self, slice_: dict | int | str):
|
358
332
|
slice_name = None
|
359
333
|
if slice_ == "middle" or isinstance(slice_, int) or len(slice_) == 1:
|
360
334
|
self.setReconstructionMode(ReconstructionMode.VERTICAL)
|
@@ -450,7 +424,7 @@ class _DetectionAccuracyGB(qt.QGroupBox):
|
|
450
424
|
def setResearchWidth(self, width: float):
|
451
425
|
"""set research width
|
452
426
|
|
453
|
-
:param
|
427
|
+
:param width: center of rotation research width
|
454
428
|
"""
|
455
429
|
return self._accuracySlider.setValue(width)
|
456
430
|
|
@@ -524,7 +498,9 @@ class _EstimatedCorWidget(qt.QGroupBox):
|
|
524
498
|
return 0.0
|
525
499
|
elif mode in ("abs", "absolute"):
|
526
500
|
if self._frameWidth is not None:
|
527
|
-
return
|
501
|
+
return relative_pos_to_absolute(
|
502
|
+
relative_pos=0.0, det_width=self._frameWidth
|
503
|
+
)
|
528
504
|
else:
|
529
505
|
return self._MIDDLE_COR_TXT
|
530
506
|
else:
|
@@ -550,7 +526,9 @@ class _EstimatedCorWidget(qt.QGroupBox):
|
|
550
526
|
old = self.blockSignals(True)
|
551
527
|
old_mcor = self._manualCORAbs.blockSignals(True)
|
552
528
|
self._manualCORAbs.setValue(
|
553
|
-
|
529
|
+
relative_pos_to_absolute(
|
530
|
+
relative_pos=self._manualCORRel.value(), det_width=self._frameWidth
|
531
|
+
)
|
554
532
|
)
|
555
533
|
self._manualCORAbs.blockSignals(old_mcor)
|
556
534
|
self.blockSignals(old)
|
@@ -560,26 +538,27 @@ class _EstimatedCorWidget(qt.QGroupBox):
|
|
560
538
|
old = self.blockSignals(True)
|
561
539
|
old_mcor = self._manualCORRel.blockSignals(True)
|
562
540
|
self._manualCORRel.setValue(
|
563
|
-
|
541
|
+
absolute_pos_to_relative(
|
542
|
+
absolute_pos=self._manualCORAbs.value(),
|
543
|
+
det_width=self._frameWidth,
|
544
|
+
)
|
564
545
|
)
|
565
546
|
self._manualCORRel.blockSignals(old_mcor)
|
566
547
|
self.blockSignals(old)
|
567
548
|
|
568
|
-
def setFrameWidth(self, width):
|
549
|
+
def setFrameWidth(self, width: float):
|
569
550
|
self._frameWidth = width
|
570
551
|
# if necessary auto reset of the absolute value
|
571
552
|
if self._manualCORAbs.value() == self._manualCORRel.value():
|
572
553
|
self._relativePositionChanged()
|
573
554
|
|
574
|
-
def getFrameWidth(self):
|
555
|
+
def getFrameWidth(self) -> float:
|
575
556
|
return self._frameWidth
|
576
557
|
|
577
|
-
def setCorValue(self, value):
|
558
|
+
def setCorValue(self, value: str | float) -> None:
|
578
559
|
"""
|
579
560
|
|
580
|
-
:param
|
581
|
-
relative value
|
582
|
-
:return:
|
561
|
+
:param value: if a float expected to be given as the relative value
|
583
562
|
"""
|
584
563
|
if value is None:
|
585
564
|
pass
|
@@ -590,7 +569,7 @@ class _EstimatedCorWidget(qt.QGroupBox):
|
|
590
569
|
self._manualCORRel.setValue(float(value))
|
591
570
|
self._manualCORRel.editingFinished.emit()
|
592
571
|
|
593
|
-
def setAbsoluteCorValue(self, value):
|
572
|
+
def setAbsoluteCorValue(self, value: str | float):
|
594
573
|
if value is None:
|
595
574
|
pass
|
596
575
|
elif value == self._MIDDLE_COR_TXT:
|
@@ -615,15 +594,12 @@ class SAAxisOptions(qt.QWidget):
|
|
615
594
|
sigConfigurationChanged = qt.Signal()
|
616
595
|
"""signal emitted when the configuration change"""
|
617
596
|
|
618
|
-
_FONT_IMPORTANT = qt.QFont("Arial", 12)
|
619
|
-
_FONT_MEDIUM = qt.QFont("Arial", 10)
|
620
|
-
|
621
597
|
def __init__(self, parent=None):
|
622
598
|
qt.QWidget.__init__(self, parent)
|
623
599
|
self.setLayout(qt.QVBoxLayout())
|
624
600
|
# reconstruction mode
|
625
601
|
self._reconstructionMode = _ReconstructionModeGB(parent=self)
|
626
|
-
self._reconstructionMode.setFont(
|
602
|
+
self._reconstructionMode.setFont(FONT_MEDIUM)
|
627
603
|
self.layout().addWidget(self._reconstructionMode)
|
628
604
|
|
629
605
|
# estimated cor
|
@@ -631,12 +607,12 @@ class SAAxisOptions(qt.QWidget):
|
|
631
607
|
self,
|
632
608
|
title="Estimated cor position (x axis)",
|
633
609
|
)
|
634
|
-
self._estimatedCorWidget.setFont(
|
610
|
+
self._estimatedCorWidget.setFont(FONT_IMPORTANT)
|
635
611
|
self.layout().addWidget(self._estimatedCorWidget)
|
636
612
|
|
637
613
|
# detection accuracy
|
638
614
|
self._detectionAccuracy = _DetectionAccuracyGB(parent=self)
|
639
|
-
self._detectionAccuracy.setFont(
|
615
|
+
self._detectionAccuracy.setFont(FONT_MEDIUM)
|
640
616
|
self.layout().addWidget(self._detectionAccuracy)
|
641
617
|
|
642
618
|
# number of reconstructions eq volume size
|
@@ -646,7 +622,7 @@ class SAAxisOptions(qt.QWidget):
|
|
646
622
|
self._nReconsSB = qt.QSpinBox(self._nReconsWidget)
|
647
623
|
self._nReconsSB.setRange(0, 2000)
|
648
624
|
self._nReconsSB.setValue(30)
|
649
|
-
self._nReconsWidget.setFont(
|
625
|
+
self._nReconsWidget.setFont(FONT_IMPORTANT)
|
650
626
|
self._nReconsWidget.layout().addRow("Number of reconstruction", self._nReconsSB)
|
651
627
|
self.layout().addWidget(self._nReconsWidget)
|
652
628
|
|