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,37 +1,9 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
# /*##########################################################################
|
3
|
-
#
|
4
|
-
# Copyright (c) 2016-2017 European Synchrotron Radiation Facility
|
5
|
-
#
|
6
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
-
# of this software and associated documentation files (the "Software"), to deal
|
8
|
-
# in the Software without restriction, including without limitation the rights
|
9
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
-
# copies of the Software, and to permit persons to whom the Software is
|
11
|
-
# furnished to do so, subject to the following conditions:
|
12
|
-
#
|
13
|
-
# The above copyright notice and this permission notice shall be included in
|
14
|
-
# all copies or substantial portions of the Software.
|
15
|
-
#
|
16
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
|
-
# THE SOFTWARE.
|
23
|
-
#
|
24
|
-
# ###########################################################################*/
|
25
2
|
"""
|
26
3
|
contains gui relative frame difference display
|
27
4
|
"""
|
28
5
|
from __future__ import annotations
|
29
6
|
|
30
|
-
__authors__ = ["H. Payno"]
|
31
|
-
__license__ = "MIT"
|
32
|
-
__date__ = "23/03/2022"
|
33
|
-
|
34
|
-
|
35
7
|
import functools
|
36
8
|
import logging
|
37
9
|
import os
|
@@ -47,7 +19,7 @@ from tomwer.core.scan.nxtomoscan import NXtomoScan
|
|
47
19
|
from tomwer.core.scan.scanbase import TomwerScanBase
|
48
20
|
from tomwer.core.scan.scanfactory import ScanFactory
|
49
21
|
from tomwer.core.utils.image import shift_img
|
50
|
-
from tomwer.gui.
|
22
|
+
from tomwer.gui.dialog.QDataDialog import QDataDialog
|
51
23
|
from tomwer.gui.reconstruction.axis.CompareImages import CompareImages as _CompareImages
|
52
24
|
from tomwer.gui.settings import Y_AXIS_DOWNWARD
|
53
25
|
from tomwer.gui.utils.completer import UrlCompleterDialog
|
@@ -170,7 +142,7 @@ class _FrameSelector(qt.QWidget):
|
|
170
142
|
if self._scan.alignment_projections is not None:
|
171
143
|
urls = self._scan.alignment_projections.values()
|
172
144
|
elif type_selected == self.FrameType.RECON_SLICES:
|
173
|
-
urls = self._scan.
|
145
|
+
urls = self._scan.get_reconstructed_slices()
|
174
146
|
else:
|
175
147
|
raise ValueError(f"Type {type_selected} not managed")
|
176
148
|
urls = sorted(urls, key=lambda url: url.path())
|
@@ -1,34 +1,9 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
|
3
|
-
#
|
4
|
-
# Copyright (c) 2016-2017 European Synchrotron Radiation Facility
|
5
|
-
#
|
6
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
-
# of this software and associated documentation files (the "Software"), to deal
|
8
|
-
# in the Software without restriction, including without limitation the rights
|
9
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
-
# copies of the Software, and to permit persons to whom the Software is
|
11
|
-
# furnished to do so, subject to the following conditions:
|
12
|
-
#
|
13
|
-
# The above copyright notice and this permission notice shall be included in
|
14
|
-
# all copies or substantial portions of the Software.
|
15
|
-
#
|
16
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
|
-
# THE SOFTWARE.
|
23
|
-
#
|
24
|
-
# ###########################################################################*/
|
2
|
+
|
25
3
|
"""
|
26
4
|
contains gui for diffviewer shift
|
27
5
|
"""
|
28
|
-
|
29
|
-
__authors__ = ["H. Payno"]
|
30
|
-
__license__ = "MIT"
|
31
|
-
__date__ = "07/12/2021"
|
6
|
+
from __future__ import annotations
|
32
7
|
|
33
8
|
|
34
9
|
import sys
|
@@ -193,11 +168,11 @@ class Relative2FramesShift(qt.QWidget, _FrameShiftsBase):
|
|
193
168
|
self._infoWidget.layout().addRow("shift", self._shiftsWidget)
|
194
169
|
self._xShiftQLE = qt.QDoubleSpinBox(self)
|
195
170
|
self._xShiftQLE.setPrefix("x:")
|
196
|
-
self._xShiftQLE.setSuffix("px")
|
171
|
+
self._xShiftQLE.setSuffix(" px")
|
197
172
|
self._xShiftQLE.setRange(self.RANGE_MIN_VALUE, self.RANGE_MAX_VALUE)
|
198
173
|
self._yShiftQLE = qt.QDoubleSpinBox(self)
|
199
174
|
self._yShiftQLE.setPrefix("y:")
|
200
|
-
self._yShiftQLE.setSuffix("px")
|
175
|
+
self._yShiftQLE.setSuffix(" px")
|
201
176
|
self._yShiftQLE.setRange(self.RANGE_MIN_VALUE, self.RANGE_MAX_VALUE)
|
202
177
|
self._shiftsWidget.layout().addWidget(self._xShiftQLE)
|
203
178
|
self._shiftsWidget.layout().addWidget(self._yShiftQLE)
|
@@ -1,5 +1,6 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
1
3
|
import weakref
|
2
|
-
from typing import Optional
|
3
4
|
from silx.gui import qt
|
4
5
|
from silx.gui.plot import Plot2D
|
5
6
|
from silx.gui.colors import Colormap
|
@@ -13,8 +14,7 @@ class FullScreenPlot2D(Plot2D):
|
|
13
14
|
"""
|
14
15
|
Window which goal is to display a single frame into full screen
|
15
16
|
|
16
|
-
:param master_colormap: optional colormap that could redefine values of the
|
17
|
-
current plot colormap
|
17
|
+
:param master_colormap: optional colormap that could redefine values of the current plot colormap
|
18
18
|
"""
|
19
19
|
|
20
20
|
def __init__(self, parent=None, backend=None, master_colormap=None):
|
@@ -53,7 +53,7 @@ class FullScreenPlot2D(Plot2D):
|
|
53
53
|
self._quitAction.triggered.connect(self.close)
|
54
54
|
|
55
55
|
@property
|
56
|
-
def master_colormap(self) ->
|
56
|
+
def master_colormap(self) -> Colormap | None:
|
57
57
|
if self.__master_colormap is None:
|
58
58
|
return None
|
59
59
|
else:
|
@@ -98,7 +98,7 @@ class FullScreenStitching(FullScreenPlot2D, StitchAndBackgroundAlphaMixIn):
|
|
98
98
|
background_img.setAlpha(self.getBackgroundImgAlpha())
|
99
99
|
|
100
100
|
@property
|
101
|
-
def mother_plot(self) ->
|
101
|
+
def mother_plot(self) -> Plot2D | None:
|
102
102
|
if self._mother_plot is None:
|
103
103
|
return None
|
104
104
|
else:
|
@@ -0,0 +1,403 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import os
|
4
|
+
import time
|
5
|
+
import logging
|
6
|
+
|
7
|
+
import numpy
|
8
|
+
import numpy.lib.npyio
|
9
|
+
|
10
|
+
from silx.gui import qt
|
11
|
+
from silx.gui.dialog.ColormapDialog import DisplayMode
|
12
|
+
from silx.gui.plot.ImageStack import ImageStack as _ImageStack
|
13
|
+
from silx.gui.plot.ImageStack import UrlLoader
|
14
|
+
from silx.io.url import DataUrl
|
15
|
+
from tomwer.core.utils.ftseriesutils import get_vol_file_shape
|
16
|
+
from tomwer.gui import icons
|
17
|
+
from tomwer.gui.visualization.fullscreenplot import FullScreenPlot2D
|
18
|
+
from tomwer.gui.visualization.reconstructionparameters import ReconstructionParameters
|
19
|
+
from tomwer.gui.visualization.scanoverview import ScanOverviewWidget
|
20
|
+
from tomwer.io.utils.utils import get_slice_data
|
21
|
+
from tomwer.core.scan.scanbase import TomwerScanBase
|
22
|
+
|
23
|
+
try:
|
24
|
+
from PIL import Image
|
25
|
+
except ImportError: # pragma: no cover
|
26
|
+
has_PIL = False # pragma: no cover
|
27
|
+
else:
|
28
|
+
has_PIL = True
|
29
|
+
|
30
|
+
_logger = logging.getLogger(__name__)
|
31
|
+
|
32
|
+
|
33
|
+
class ImageStack(_ImageStack):
|
34
|
+
"""
|
35
|
+
Image stack dedicated to data display.
|
36
|
+
|
37
|
+
It deal for example with data normalization...
|
38
|
+
"""
|
39
|
+
|
40
|
+
def __init__(self, parent, show_overview=True, backend=None):
|
41
|
+
self._sliceMetadata: dict[str, dict] = {}
|
42
|
+
# metadata associated to the slice. Key is the url (as str) and value is the dict containing metadata
|
43
|
+
self._urlToScan: dict[str, TomwerScanBase] = {}
|
44
|
+
# dict to link each slice to a scan id (in the case slices are raw projections - to set _scanOverviewDockerWidget)
|
45
|
+
|
46
|
+
self._normFct = None
|
47
|
+
self._url_indexes = None
|
48
|
+
super().__init__(parent)
|
49
|
+
self.getPlotWidget().setBackend(backend)
|
50
|
+
self.getPlotWidget().setKeepDataAspectRatio(True)
|
51
|
+
|
52
|
+
# tune colormap dialog to have histogram by default
|
53
|
+
colormapAction = self.getPlotWidget().getColormapAction()
|
54
|
+
colormapDialog = colormapAction.getColormapDialog()
|
55
|
+
colormapDialog.getHistogramWidget().setDisplayMode(DisplayMode.HISTOGRAM)
|
56
|
+
colormapAction.setColormapDialog(colormapDialog)
|
57
|
+
|
58
|
+
self.setUrlLoaderClass(_TomwerUrlLoader)
|
59
|
+
# hide axis to be display
|
60
|
+
self._plot.setAxesDisplayed(False)
|
61
|
+
self._loadSliceParams = False
|
62
|
+
self._resetZoom = True
|
63
|
+
|
64
|
+
# add dock widget for reconstruction parameters
|
65
|
+
self._reconsInfoDockWidget = qt.QDockWidget(parent=self)
|
66
|
+
self._reconsWidgetScrollArea = qt.QScrollArea(self)
|
67
|
+
self._reconsWidgetScrollArea.setWidgetResizable(True)
|
68
|
+
self._reconsWidget = ReconstructionParameters(self)
|
69
|
+
self._reconsWidgetScrollArea.setWidget(self._reconsWidget)
|
70
|
+
self._reconsInfoDockWidget.setWidget(self._reconsWidgetScrollArea)
|
71
|
+
self._reconsInfoDockWidget.setFeatures(qt.QDockWidget.DockWidgetMovable)
|
72
|
+
self.addDockWidget(qt.Qt.RightDockWidgetArea, self._reconsInfoDockWidget)
|
73
|
+
|
74
|
+
# add scan overview dock widget
|
75
|
+
if show_overview:
|
76
|
+
self._scanOverviewDockerWidget = qt.QDockWidget(parent=self)
|
77
|
+
self._scanOverviewDockerWidget.setMaximumHeight(300)
|
78
|
+
self._scanOverviewWidget = ScanOverviewWidget(self)
|
79
|
+
self._scanOverviewDockerWidget.setWidget(self._scanOverviewWidget)
|
80
|
+
self._scanOverviewDockerWidget.setFeatures(qt.QDockWidget.DockWidgetMovable)
|
81
|
+
self.addDockWidget(
|
82
|
+
qt.Qt.RightDockWidgetArea, self._scanOverviewDockerWidget
|
83
|
+
)
|
84
|
+
else:
|
85
|
+
self._scanOverviewWidget = None
|
86
|
+
self._scanOverviewDockerWidget = None
|
87
|
+
|
88
|
+
# add search
|
89
|
+
self._searchWidget = qt.QLineEdit(parent=self)
|
90
|
+
self._searchWidget.setPlaceholderText("search")
|
91
|
+
search_icon = icons.getQIcon("search")
|
92
|
+
self._searchWidget.addAction(search_icon, qt.QLineEdit.LeadingPosition)
|
93
|
+
# reorder urlsTable (include search QLineEdit)
|
94
|
+
self._urlsTable.layout().addWidget(self._searchWidget, 0, 1, 1, 2)
|
95
|
+
self._urlsTable.layout().addWidget(self._urlsTable._toggleButton, 1, 2, 1, 1)
|
96
|
+
self._urlsTable.layout().addWidget(self._urlsTable, 1, 1, 1, 2)
|
97
|
+
self._urlsTable._urlsTable.model()
|
98
|
+
|
99
|
+
# for now hide the "control"
|
100
|
+
self._urlsTable._toggleButton.hide()
|
101
|
+
|
102
|
+
# add an action to plot the url-image 'full size'
|
103
|
+
fullScreenIcon = icons.getQIcon("full_screen")
|
104
|
+
self._fullScreenAction = qt.QAction(fullScreenIcon, "pop up full screen")
|
105
|
+
self.getPlotWidget().toolBar().addAction(self._fullScreenAction)
|
106
|
+
self._fullScreenAction.triggered.connect(self._popCurrentImageFullScreen)
|
107
|
+
|
108
|
+
# set up
|
109
|
+
self.setAutoResetZoom(False)
|
110
|
+
|
111
|
+
# connect signal / slot
|
112
|
+
self.sigCurrentUrlChanged.connect(self.updateAllMetadataDisplayed)
|
113
|
+
self._searchWidget.textChanged.connect(self._filterUrlList)
|
114
|
+
|
115
|
+
def _filterUrlList(self, *args, **kwargs):
|
116
|
+
"""Filter the url list according to the 'searchWidget'"""
|
117
|
+
url_list = self._urlsTable._urlsTable
|
118
|
+
filter_str = self._searchWidget.text()
|
119
|
+
filter_str = filter_str.lstrip(" ").rstrip(" ")
|
120
|
+
for item_index in range(url_list.count()):
|
121
|
+
item = url_list.item(item_index)
|
122
|
+
item.setHidden(filter_str not in item.text())
|
123
|
+
|
124
|
+
def _popCurrentImageFullScreen(self, *args, **kwargs):
|
125
|
+
new_plot = FullScreenPlot2D()
|
126
|
+
active_image = self.getPlotWidget().getActiveImage()
|
127
|
+
if active_image is None or active_image.getData(copy=False) is None:
|
128
|
+
return
|
129
|
+
url = self.getCurrentUrl()
|
130
|
+
window_title = f"Plot of {url.path()}" if url is not None else "Image Plot"
|
131
|
+
|
132
|
+
new_plot.setWindowTitle(window_title)
|
133
|
+
# reuse the same colormap for convenience (user modification on it will be applied everywhere)
|
134
|
+
new_plot.setDefaultColormap(self.getPlotWidget().getDefaultColormap())
|
135
|
+
|
136
|
+
# add the current image
|
137
|
+
new_plot.addImage(active_image.getData(copy=True))
|
138
|
+
|
139
|
+
new_plot.showFullScreen()
|
140
|
+
|
141
|
+
def setScan(self, scan):
|
142
|
+
if self._scanOverviewWidget is not None:
|
143
|
+
self._scanOverviewWidget.setScan(scan=scan)
|
144
|
+
|
145
|
+
def getUrlListDockWidget(self):
|
146
|
+
return self._tableDockWidget
|
147
|
+
|
148
|
+
def resetZoom(self):
|
149
|
+
self._plot.resetZoom()
|
150
|
+
|
151
|
+
def setLimits(self, x_min, x_max, y_min, y_max):
|
152
|
+
self._plot.setLimits(xmin=x_min, ymin=y_min, xmax=x_max, ymax=y_max)
|
153
|
+
|
154
|
+
def getLimits(self):
|
155
|
+
limits = []
|
156
|
+
limits.extend(self._plot.getGraphXLimits())
|
157
|
+
limits.extend(self._plot.getGraphYLimits())
|
158
|
+
return tuple(limits)
|
159
|
+
|
160
|
+
def setSliceReconsParamsVisible(self, visible):
|
161
|
+
"""show or not information regarding the slice reconstructed"""
|
162
|
+
self._reconsInfoDockWidget.setVisible(visible)
|
163
|
+
self._loadSliceParams = visible
|
164
|
+
|
165
|
+
def setScanOverviewVisible(self, visible):
|
166
|
+
"""show or not overview of the scan"""
|
167
|
+
if self._scanOverviewDockerWidget is not None:
|
168
|
+
self._scanOverviewDockerWidget.setVisible(visible)
|
169
|
+
|
170
|
+
def setNormalizationFct(self, fct, url_indexes=None):
|
171
|
+
self._normFct = fct
|
172
|
+
self._url_indexes = url_indexes
|
173
|
+
|
174
|
+
def _urlLoaded(self) -> None:
|
175
|
+
"""
|
176
|
+
|
177
|
+
:param url: result of DataUrl.path() function
|
178
|
+
:return:
|
179
|
+
"""
|
180
|
+
sender = self.sender()
|
181
|
+
url = sender.url.path()
|
182
|
+
if self._urlIndexes is not None and url in self._urlIndexes:
|
183
|
+
data = sender.data
|
184
|
+
if data is None:
|
185
|
+
_logger.warning("no data found (is the url valid ?) " + url)
|
186
|
+
return
|
187
|
+
|
188
|
+
if data.ndim != 2:
|
189
|
+
if data.ndim == 3:
|
190
|
+
if data.shape[0] == 1:
|
191
|
+
# if reconstruction along z
|
192
|
+
data = data.reshape((data.shape[1], data.shape[2]))
|
193
|
+
elif data.shape[1] == 1:
|
194
|
+
# if reconstruction along y
|
195
|
+
data = data.reshape((data.shape[0], data.shape[2]))
|
196
|
+
elif data.shape[2] == 1:
|
197
|
+
# if reconstruction along z
|
198
|
+
data = data.reshape((data.shape[0], data.shape[1]))
|
199
|
+
else:
|
200
|
+
_logger.warning(f"Image Stack only manage 2D data. Url: {url}")
|
201
|
+
return
|
202
|
+
else:
|
203
|
+
_logger.warning(f"Image Stack only manage 2D data. Url: {url}")
|
204
|
+
return
|
205
|
+
if self._normFct is None:
|
206
|
+
self._urlData[url] = data
|
207
|
+
else:
|
208
|
+
norm_data = self._normFct(data, index=self._urlIndexes[url])
|
209
|
+
self._urlData[url] = norm_data
|
210
|
+
|
211
|
+
if self.getCurrentUrl().path() == url:
|
212
|
+
self._plot.addImage(self._urlData[url])
|
213
|
+
if hasattr(self, "getWaiterOverlay"):
|
214
|
+
self.getWaiterOverlay().hide()
|
215
|
+
else:
|
216
|
+
self._waitingOverlay.hide()
|
217
|
+
if self._resetZoom:
|
218
|
+
self._resetZoom = False
|
219
|
+
self._plot.resetZoom()
|
220
|
+
|
221
|
+
if sender in self._loadingThreads:
|
222
|
+
self._loadingThreads.remove(sender)
|
223
|
+
self.sigLoaded.emit(url)
|
224
|
+
|
225
|
+
def setResetZoomOnNextIteration(self, reset):
|
226
|
+
self._resetZoom = reset
|
227
|
+
|
228
|
+
def setCurrentUrl(self, url: DataUrl):
|
229
|
+
if url in ("", None):
|
230
|
+
url = None
|
231
|
+
elif isinstance(url, str):
|
232
|
+
url = DataUrl(path=url)
|
233
|
+
elif not isinstance(url, DataUrl):
|
234
|
+
raise TypeError
|
235
|
+
if url is None:
|
236
|
+
pass
|
237
|
+
elif self._loadSliceParams:
|
238
|
+
try:
|
239
|
+
self.setCurrentSliceMetadata(self._metadata.get(url.path(), None))
|
240
|
+
except Exception:
|
241
|
+
_logger.info(f"Failed to find any metadata for {url.path()}.")
|
242
|
+
super().setCurrentUrl(url)
|
243
|
+
|
244
|
+
def setUrls(self, urls: list):
|
245
|
+
self.clearSliceMetadata()
|
246
|
+
_ImageStack.setUrls(self, urls)
|
247
|
+
listWidget = self._urlsTable._urlsTable
|
248
|
+
items = []
|
249
|
+
for i in range(listWidget.count()):
|
250
|
+
# TODO: do this on the fly
|
251
|
+
item = listWidget.item(i)
|
252
|
+
try:
|
253
|
+
url = DataUrl(path=item.text())
|
254
|
+
except Exception:
|
255
|
+
_logger.info(
|
256
|
+
f"fail to deduce data of last modification for {item.text()}"
|
257
|
+
)
|
258
|
+
else:
|
259
|
+
if os.path.exists(url.file_path()):
|
260
|
+
lst_m = time.ctime(os.path.getmtime(url.file_path()))
|
261
|
+
item.setToolTip(f"last modification : {lst_m}")
|
262
|
+
items.append(listWidget.item(i))
|
263
|
+
|
264
|
+
def updateAllMetadataDisplayed(self):
|
265
|
+
# update widget related to image metadata.
|
266
|
+
current_url = self.getCurrentUrl()
|
267
|
+
if current_url is not None:
|
268
|
+
current_url = current_url.path()
|
269
|
+
|
270
|
+
self.setCurrentSliceMetadata(self._sliceMetadata.get(current_url, None))
|
271
|
+
current_scan = self._urlToScan.get(current_url, None)
|
272
|
+
if self._scanOverviewWidget:
|
273
|
+
self._scanOverviewWidget.setScan(current_scan)
|
274
|
+
|
275
|
+
def clearSliceMetadata(self):
|
276
|
+
self._sliceMetadata.clear()
|
277
|
+
|
278
|
+
def setCurrentSliceMetadata(self, metadata: dict | None) -> None:
|
279
|
+
self._reconsWidget.setVolumeMetadata(metadata)
|
280
|
+
|
281
|
+
def setSliceMetadata(self, metadata: dict[str, dict]) -> None:
|
282
|
+
self._sliceMetadata = metadata
|
283
|
+
self.updateAllMetadataDisplayed()
|
284
|
+
|
285
|
+
def updateSliceMetadata(self, metadata: dict[str, dict]) -> None:
|
286
|
+
self._sliceMetadata.update(metadata)
|
287
|
+
self.updateAllMetadataDisplayed()
|
288
|
+
|
289
|
+
def updateScanToUrl(self, scan_to_url: dict):
|
290
|
+
self._urlToScan.update(scan_to_url)
|
291
|
+
self.updateAllMetadataDisplayed()
|
292
|
+
|
293
|
+
# scan metadata loading
|
294
|
+
def reset(self):
|
295
|
+
super().reset()
|
296
|
+
self.clearSliceMetadata()
|
297
|
+
self._urlToScan.clear()
|
298
|
+
|
299
|
+
def _freeLoadingThreads(self):
|
300
|
+
# overwrite it because the default waiting time seems very low
|
301
|
+
# and make the CI fails
|
302
|
+
for thread in self._loadingThreads:
|
303
|
+
thread.blockSignals(True)
|
304
|
+
thread.wait(100)
|
305
|
+
self._loadingThreads.clear()
|
306
|
+
|
307
|
+
|
308
|
+
class _TomwerUrlLoader(UrlLoader):
|
309
|
+
"""
|
310
|
+
Thread use to load DataUrl
|
311
|
+
"""
|
312
|
+
|
313
|
+
def run(self):
|
314
|
+
if self.url.file_path().endswith(".vol"):
|
315
|
+
self.data = self._load_vol()
|
316
|
+
elif self.url.scheme() == "tomwer":
|
317
|
+
if has_PIL:
|
318
|
+
self.data = numpy.array(Image.open(self.url.file_path()))
|
319
|
+
if self.url.data_slice() is not None:
|
320
|
+
self.data = self.data[self.url.data_slice()]
|
321
|
+
else:
|
322
|
+
_logger.warning(
|
323
|
+
"need to install Pillow to read file " + self.url.file_path()
|
324
|
+
)
|
325
|
+
self.data = None
|
326
|
+
else:
|
327
|
+
try:
|
328
|
+
self.data = get_slice_data(self.url)
|
329
|
+
except IOError:
|
330
|
+
self.data = None
|
331
|
+
except ValueError:
|
332
|
+
self.data = None
|
333
|
+
_logger.warning(
|
334
|
+
f"Fail to open {self.url.path()}. Maybe the reconstruction failed."
|
335
|
+
)
|
336
|
+
except Exception as e:
|
337
|
+
self.data = None
|
338
|
+
_logger.error(
|
339
|
+
"Fail to load data from %s. Error is %s",
|
340
|
+
self.url.path(),
|
341
|
+
e,
|
342
|
+
)
|
343
|
+
|
344
|
+
def _load_vol(self):
|
345
|
+
"""
|
346
|
+
load a .vol file
|
347
|
+
"""
|
348
|
+
if self.url.file_path().lower().endswith(".vol.info"):
|
349
|
+
info_file = self.url.file_path()
|
350
|
+
raw_file = self.url.file_path().replace(".vol.info", ".vol")
|
351
|
+
else:
|
352
|
+
assert self.url.file_path().lower().endswith(".vol")
|
353
|
+
raw_file = self.url.file_path()
|
354
|
+
info_file = self.url.file_path().replace(".vol", ".vol.info")
|
355
|
+
|
356
|
+
if not os.path.exists(raw_file):
|
357
|
+
data = None
|
358
|
+
mess = f"Can't find raw data file {raw_file} associated with {info_file}"
|
359
|
+
_logger.warning(mess)
|
360
|
+
elif not os.path.exists(info_file):
|
361
|
+
mess = f"Can't find info file {info_file} associated with {raw_file}"
|
362
|
+
_logger.warning(mess)
|
363
|
+
data = None
|
364
|
+
else:
|
365
|
+
shape = get_vol_file_shape(info_file)
|
366
|
+
if None in shape:
|
367
|
+
_logger.warning(f"Fail to retrieve data shape for {info_file}.")
|
368
|
+
data = None
|
369
|
+
else:
|
370
|
+
try:
|
371
|
+
numpy.zeros(shape)
|
372
|
+
except MemoryError:
|
373
|
+
data = None
|
374
|
+
_logger.warning(
|
375
|
+
f"Raw file %s is too large for being read {raw_file}"
|
376
|
+
)
|
377
|
+
else:
|
378
|
+
data = numpy.fromfile(
|
379
|
+
raw_file, dtype=numpy.float32, count=-1, sep=""
|
380
|
+
)
|
381
|
+
try:
|
382
|
+
data = data.reshape(shape)
|
383
|
+
except ValueError:
|
384
|
+
_logger.warning(
|
385
|
+
f"unable to fix shape for raw file {raw_file}. Look for information in {info_file}"
|
386
|
+
)
|
387
|
+
try:
|
388
|
+
sqr = int(numpy.sqrt(len(data)))
|
389
|
+
shape = (1, sqr, sqr)
|
390
|
+
data = data.reshape(shape)
|
391
|
+
except ValueError:
|
392
|
+
_logger.info(
|
393
|
+
f"deduction of shape size for {raw_file} failed"
|
394
|
+
)
|
395
|
+
data = None
|
396
|
+
else:
|
397
|
+
_logger.warning(
|
398
|
+
f"try deducing shape size for {raw_file} might be an incorrect interpretation"
|
399
|
+
)
|
400
|
+
if self.url.data_slice() is None:
|
401
|
+
return data
|
402
|
+
else:
|
403
|
+
return data[self.url.data_slice()]
|
@@ -1,35 +1,6 @@
|
|
1
|
-
|
2
|
-
# /*##########################################################################
|
3
|
-
#
|
4
|
-
# Copyright (c) 2016-2017 European Synchrotron Radiation Facility
|
5
|
-
#
|
6
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
-
# of this software and associated documentation files (the "Software"), to deal
|
8
|
-
# in the Software without restriction, including without limitation the rights
|
9
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
-
# copies of the Software, and to permit persons to whom the Software is
|
11
|
-
# furnished to do so, subject to the following conditions:
|
12
|
-
#
|
13
|
-
# The above copyright notice and this permission notice shall be included in
|
14
|
-
# all copies or substantial portions of the Software.
|
15
|
-
#
|
16
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
|
-
# THE SOFTWARE.
|
23
|
-
#
|
24
|
-
# ###########################################################################*/
|
25
|
-
|
26
|
-
__authors__ = ["H. Payno"]
|
27
|
-
__license__ = "MIT"
|
28
|
-
__date__ = "31/03/2021"
|
29
|
-
|
1
|
+
from __future__ import annotations
|
30
2
|
|
31
3
|
import logging
|
32
|
-
from typing import Optional
|
33
4
|
from silx.gui import qt
|
34
5
|
from tomwer.core.utils.char import BETA_CHAR, DELTA_CHAR
|
35
6
|
|
@@ -47,14 +18,16 @@ class ReconstructionParameters(qt.QWidget):
|
|
47
18
|
# method
|
48
19
|
self._methodQLE = qt.QLineEdit("", self)
|
49
20
|
self.layout().addRow("method", self._methodQLE)
|
21
|
+
self._methodQLE.setReadOnly(True)
|
50
22
|
# paganin
|
51
23
|
self._paganinQLE = qt.QLineEdit("", self)
|
52
24
|
self._paganinQLE.setReadOnly(True)
|
53
25
|
self.layout().addRow("Phase method", self._paganinQLE)
|
54
26
|
# delta beta
|
27
|
+
self._deltaBetaLabel = qt.QLabel(" / ".join((DELTA_CHAR, BETA_CHAR)), self)
|
55
28
|
self._deltaBetaQLE = qt.QLineEdit("", self)
|
56
29
|
self._deltaBetaQLE.setReadOnly(True)
|
57
|
-
self.layout().addRow(
|
30
|
+
self.layout().addRow(self._deltaBetaLabel, self._deltaBetaQLE)
|
58
31
|
# distance
|
59
32
|
self._distanceQLE = qt.QLineEdit("", self)
|
60
33
|
self._distanceQLE.setReadOnly(True)
|
@@ -96,7 +69,16 @@ class ReconstructionParameters(qt.QWidget):
|
|
96
69
|
self._softwareVersionQLE = qt.QLabel("", self)
|
97
70
|
self.layout().addRow("software version", self._softwareVersionQLE)
|
98
71
|
|
99
|
-
|
72
|
+
# Connect signal for paganinQLE
|
73
|
+
self._paganinQLE.textChanged.connect(self._updateDeltaBetaVisibility)
|
74
|
+
|
75
|
+
def _updateDeltaBetaVisibility(self):
|
76
|
+
phase_method = self._paganinQLE.text()
|
77
|
+
display_delta_beta = phase_method in ("paganin", "CTF")
|
78
|
+
self._deltaBetaLabel.setVisible(display_delta_beta)
|
79
|
+
self._deltaBetaQLE.setVisible(display_delta_beta)
|
80
|
+
|
81
|
+
def setVolumeMetadata(self, metadata: dict | None):
|
100
82
|
if metadata is None:
|
101
83
|
metadata = {}
|
102
84
|
elif not isinstance(metadata, dict):
|