tomwer 1.3.27__py3-none-any.whl → 1.4.0rc0__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 +48 -49
- 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 +40 -85
- 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 -7
- 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 +7 -4
- 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 +63 -111
- tomwer/core/process/reconstruction/axis/mode.py +5 -3
- tomwer/core/process/reconstruction/axis/params.py +5 -146
- tomwer/core/process/reconstruction/axis/projectiontype.py +0 -28
- 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 +47 -48
- tomwer/core/process/reconstruction/nabu/nabuslices.py +59 -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 +18 -47
- tomwer/core/process/reconstruction/sadeltabeta/params.py +2 -31
- tomwer/core/process/reconstruction/sadeltabeta/sadeltabeta.py +16 -44
- 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/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_axis.py +1 -79
- 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 +4 -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 +46 -54
- tomwer/core/scan/scanbase.py +104 -200
- 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/{test → tests}/test_process_registration.py +1 -28
- 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/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 +264 -0
- tomwer/gui/reconstruction/axis/AxisOptionsWidget.py +153 -0
- tomwer/gui/reconstruction/axis/AxisSettingsWidget.py +776 -0
- tomwer/gui/reconstruction/axis/AxisWidget.py +526 -0
- tomwer/gui/reconstruction/axis/CalculationWidget.py +374 -0
- tomwer/gui/reconstruction/axis/CompareImages.py +11 -44
- tomwer/gui/reconstruction/axis/ControlWidget.py +277 -0
- tomwer/gui/reconstruction/axis/InputWidget.py +491 -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 +16 -49
- 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 +19 -48
- 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 +8 -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 +23 -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 +4 -32
- 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 +27 -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 +2 -31
- tomwer/synctools/stacks/reconstruction/castvolume.py +12 -43
- tomwer/synctools/stacks/reconstruction/dkrefcopy.py +3 -26
- tomwer/synctools/stacks/reconstruction/nabu.py +1 -26
- tomwer/synctools/stacks/reconstruction/normalization.py +1 -26
- tomwer/synctools/stacks/reconstruction/saaxis.py +1 -26
- tomwer/synctools/stacks/reconstruction/sadeltabeta.py +1 -26
- 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 +215 -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 +3 -3
- {tomwer-1.3.27.dist-info → tomwer-1.4.0rc0.dist-info}/LICENSE +3 -3
- tomwer-1.4.0rc0.dist-info/METADATA +337 -0
- tomwer-1.4.0rc0.dist-info/RECORD +909 -0
- {tomwer-1.3.27.dist-info → tomwer-1.4.0rc0.dist-info}/WHEEL +1 -1
- {tomwer-1.3.27.dist-info → tomwer-1.4.0rc0.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/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/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 -1388
- 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.27-py3.11-nspkg.pth +0 -1
- tomwer-1.3.27.dist-info/METADATA +0 -292
- tomwer-1.3.27.dist-info/RECORD +0 -785
- tomwer-1.3.27.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/process/reconstruction/{test → tests}/test_utils.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.27.dist-info → tomwer-1.4.0rc0.dist-info}/top_level.txt +0 -0
tomwer/gui/utils/vignettes.py
CHANGED
@@ -1,42 +1,11 @@
|
|
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 to select a slice in a volume
|
27
3
|
"""
|
28
4
|
|
29
|
-
|
30
|
-
__authors__ = [
|
31
|
-
"H. Payno",
|
32
|
-
]
|
33
|
-
|
34
|
-
__license__ = "MIT"
|
35
|
-
__date__ = "26/02/2021"
|
36
|
-
|
5
|
+
from __future__ import annotations
|
37
6
|
|
38
7
|
import logging
|
39
|
-
from typing import Iterable
|
8
|
+
from typing import Iterable
|
40
9
|
|
41
10
|
import numpy
|
42
11
|
from silx.gui import qt
|
@@ -128,7 +97,7 @@ class VignettesQDialog(qt.QDialog):
|
|
128
97
|
(2D numpy.array, score) as value.
|
129
98
|
Where the 2D numpy.array is the frame to display and the score if the
|
130
99
|
"indicator" score to display with the frame.
|
131
|
-
:param
|
100
|
+
:param scores: with score as key and a tuple (url|numpy array, ComputedScore) as value
|
132
101
|
:param ScoreMethod score_method: score kind to be display
|
133
102
|
"""
|
134
103
|
self._vignettesWidget.setScores(scores=scores, score_method=score_method)
|
@@ -149,14 +118,14 @@ class VignettesQDialog(qt.QDialog):
|
|
149
118
|
self._vignettesWidget.close()
|
150
119
|
super().reject()
|
151
120
|
|
152
|
-
def getNColumn(self) ->
|
121
|
+
def getNColumn(self) -> int | None:
|
153
122
|
n_column = self._nbColumnCB.currentText()
|
154
123
|
if n_column == self.AUTO_NB_COLUMN:
|
155
124
|
return None
|
156
125
|
else:
|
157
126
|
return int(n_column)
|
158
127
|
|
159
|
-
def setNbColumn(self, value:
|
128
|
+
def setNbColumn(self, value: int | str):
|
160
129
|
if value not in self.COLUMN_VALUES:
|
161
130
|
raise ValueError(
|
162
131
|
f"Unhandled number of column requested ({value}). Valid values are {self.COLUMN_VALUES}"
|
@@ -203,10 +172,10 @@ class VignettesWidget(qt.QWidget):
|
|
203
172
|
"""
|
204
173
|
Widget to display all the frames.
|
205
174
|
|
206
|
-
:param
|
207
|
-
:param
|
175
|
+
:param parent:
|
176
|
+
:param value_name: name of the values for which we are looking for the
|
208
177
|
best one
|
209
|
-
:param
|
178
|
+
:param score_name: name of the score computed
|
210
179
|
:param score_format: None or str that can be formatted to display the
|
211
180
|
score
|
212
181
|
:param value_format: None or str that can be formatted to display the
|
@@ -317,7 +286,7 @@ class VignettesWidget(qt.QWidget):
|
|
317
286
|
(2D numpy.array, score) as value.
|
318
287
|
Where the 2D numpy.array is the frame to display and the score if the
|
319
288
|
"indicator" score to display with the frame.
|
320
|
-
:param
|
289
|
+
:param scores: with score as key and a tuple (url|numpy array, ComputedScore) as value
|
321
290
|
:param ScoreMethod score_method: score kind to be display
|
322
291
|
"""
|
323
292
|
if len(scores) < 1:
|
@@ -437,7 +406,7 @@ class Vignette(qt.QToolButton):
|
|
437
406
|
value,
|
438
407
|
value_name: str,
|
439
408
|
score_name: str,
|
440
|
-
data:
|
409
|
+
data: DataUrl | numpy.array,
|
441
410
|
score: float,
|
442
411
|
frame_color: qt.QColor,
|
443
412
|
score_format=None,
|
tomwer/gui/utils/waiterthread.py
CHANGED
@@ -1,26 +1,4 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
# /*##########################################################################
|
3
|
-
# Copyright (C) 2016 European Synchrotron Radiation Facility
|
4
|
-
#
|
5
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
-
# of this software and associated documentation files (the "Software"), to deal
|
7
|
-
# in the Software without restriction, including without limitation the rights
|
8
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
-
# copies of the Software, and to permit persons to whom the Software is
|
10
|
-
# furnished to do so, subject to the following conditions:
|
11
|
-
#
|
12
|
-
# The above copyright notice and this permission notice shall be included in
|
13
|
-
# all copies or substantial portions of the Software.
|
14
|
-
#
|
15
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
-
# THE SOFTWARE.
|
22
|
-
#
|
23
|
-
#############################################################################*/
|
24
2
|
|
25
3
|
"""
|
26
4
|
This module is used to manage observations. Initially on files.
|
@@ -28,10 +6,6 @@ Observations are runned on a thread and run each n seconds.
|
|
28
6
|
They are manage by thread and signals
|
29
7
|
"""
|
30
8
|
|
31
|
-
__authors__ = ["H.Payno"]
|
32
|
-
__license__ = "MIT"
|
33
|
-
__date__ = "09/02/2017"
|
34
|
-
|
35
9
|
|
36
10
|
import time
|
37
11
|
|
@@ -1,66 +1,13 @@
|
|
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__ = "13/08/2021"
|
29
|
-
|
30
|
-
import logging
|
31
1
|
import weakref
|
32
2
|
|
33
3
|
from silx.gui import qt
|
34
|
-
from silx.gui.dialog.ColormapDialog import DisplayMode
|
35
|
-
from silx.gui.plot.ImageStack import ImageStack as _ImageStack
|
36
|
-
from silx.gui.plot.ImageStack import UrlLoader
|
37
|
-
from silx.io.url import DataUrl
|
38
4
|
from silx.utils.enum import Enum as _Enum
|
39
5
|
|
40
6
|
from tomwer.core.scan.scanbase import TomwerScanBase
|
41
|
-
from tomwer.core.utils.ftseriesutils import get_vol_file_shape
|
42
7
|
from tomwer.core.volume.volumebase import TomwerVolumeBase
|
43
8
|
from tomwer.core.volume.volumefactory import VolumeFactory
|
44
|
-
from tomwer.gui import icons
|
45
9
|
from tomwer.gui.settings import Y_AXIS_DOWNWARD
|
46
|
-
from tomwer.gui.visualization.
|
47
|
-
from tomwer.gui.visualization.reconstructionparameters import ReconstructionParameters
|
48
|
-
from tomwer.gui.visualization.scanoverview import ScanOverviewWidget
|
49
|
-
from tomwer.io.utils.utils import get_slice_data
|
50
|
-
|
51
|
-
try:
|
52
|
-
from PIL import Image
|
53
|
-
except ImportError: # pragma: no cover
|
54
|
-
has_PIL = False # pragma: no cover
|
55
|
-
else:
|
56
|
-
has_PIL = True
|
57
|
-
import os
|
58
|
-
import time
|
59
|
-
|
60
|
-
import numpy
|
61
|
-
import numpy.lib.npyio
|
62
|
-
|
63
|
-
_logger = logging.getLogger(__name__)
|
10
|
+
from tomwer.gui.visualization.imagestack import ImageStack
|
64
11
|
|
65
12
|
|
66
13
|
class DataViewer(qt.QMainWindow):
|
@@ -109,6 +56,7 @@ class DataViewer(qt.QMainWindow):
|
|
109
56
|
but in our case we cannot afford it as it will take too much memory.
|
110
57
|
So we will disconnect the callback (self._viewer.setCurrentUrlIndex) until the slider is active
|
111
58
|
and reactivate it afterwards
|
59
|
+
|
112
60
|
"""
|
113
61
|
self._viewer._slider.sigCurrentUrlIndexChanged.disconnect(
|
114
62
|
self._viewer.setCurrentUrlIndex
|
@@ -186,7 +134,6 @@ class DataViewer(qt.QMainWindow):
|
|
186
134
|
|
187
135
|
def _updateDisplay(self):
|
188
136
|
"""Update display of the viewer"""
|
189
|
-
# TODO: add a param visible for frames
|
190
137
|
self._viewer.setSliceReconsParamsVisible(
|
191
138
|
self.getDisplayMode() is _DisplayMode.SLICES
|
192
139
|
)
|
@@ -195,74 +142,75 @@ class DataViewer(qt.QMainWindow):
|
|
195
142
|
)
|
196
143
|
if self._scan is None or self._scan() is None:
|
197
144
|
self._viewer.reset()
|
198
|
-
|
199
|
-
assert isinstance(self._scan(), TomwerScanBase)
|
200
|
-
slices_metadata = {}
|
201
|
-
if self.getDisplayMode() is _DisplayMode.RADIOS:
|
202
|
-
# update the normalization function from the viewer if needed
|
203
|
-
if self.getRadioOption() is _RadioMode.NORMALIZED:
|
204
|
-
url_to_index = {
|
205
|
-
v.path(): k for k, v in self._scan().projections.items()
|
206
|
-
}
|
207
|
-
self._viewer.setNormalizationFct(
|
208
|
-
self._scan().data_flat_field_correction,
|
209
|
-
url_indexes=url_to_index,
|
210
|
-
)
|
211
|
-
else:
|
212
|
-
self._viewer.setNormalizationFct(None)
|
145
|
+
return
|
213
146
|
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
else:
|
227
|
-
volume = VolumeFactory.create_tomo_object_from_identifier(
|
228
|
-
identifier=identifier
|
229
|
-
)
|
230
|
-
urls = list(volume.browse_data_urls())
|
231
|
-
try:
|
232
|
-
metadata = volume.metadata or volume.load_metadata()
|
233
|
-
except Exception:
|
234
|
-
metadata = None
|
235
|
-
slices_urls.extend(urls)
|
236
|
-
slices_metadata.update({url.path(): metadata for url in urls})
|
237
|
-
|
238
|
-
slices = slices_urls
|
239
|
-
|
240
|
-
elif self.getDisplayMode() is _DisplayMode.DARKS:
|
241
|
-
self._viewer.setNormalizationFct(None)
|
242
|
-
slices = self._scan().darks
|
243
|
-
elif self.getDisplayMode() is _DisplayMode.FLATS:
|
244
|
-
self._viewer.setNormalizationFct(None)
|
245
|
-
slices = self._scan().flats
|
246
|
-
elif self.getDisplayMode() is _DisplayMode.REDUCED_DARKS:
|
247
|
-
self._viewer.setNormalizationFct(None)
|
248
|
-
slices = self._scan().load_reduced_darks(return_as_url=True)
|
249
|
-
elif self.getDisplayMode() is _DisplayMode.REDUCED_FLATS:
|
250
|
-
self._viewer.setNormalizationFct(None)
|
251
|
-
slices = self._scan().load_reduced_flats(return_as_url=True)
|
147
|
+
assert isinstance(self._scan(), TomwerScanBase)
|
148
|
+
slices_metadata = {}
|
149
|
+
if self.getDisplayMode() is _DisplayMode.RADIOS:
|
150
|
+
# update the normalization function from the viewer if needed
|
151
|
+
if self.getRadioOption() is _RadioMode.NORMALIZED:
|
152
|
+
url_to_index = {
|
153
|
+
v.path(): k for k, v in self._scan().projections.items()
|
154
|
+
}
|
155
|
+
self._viewer.setNormalizationFct(
|
156
|
+
self._scan().data_flat_field_correction,
|
157
|
+
url_indexes=url_to_index,
|
158
|
+
)
|
252
159
|
else:
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
if slices is not None and len(slices) > 0:
|
261
|
-
# TODO: set metadata as well ??? For each url get the metadata as a dict ???
|
262
|
-
self._viewer.setMetadatas(slices_metadata)
|
263
|
-
self._viewer.setUrls(slices)
|
160
|
+
self._viewer.setNormalizationFct(None)
|
161
|
+
|
162
|
+
slices = self._scan().projections
|
163
|
+
elif self.getDisplayMode() is _DisplayMode.SLICES:
|
164
|
+
self._viewer.setNormalizationFct(None)
|
165
|
+
if self.getSliceOption() is _SliceMode.LATEST:
|
166
|
+
slices = self._scan().latest_reconstructions
|
264
167
|
else:
|
265
|
-
self.
|
168
|
+
slices = self._scan().get_reconstructed_slices()
|
169
|
+
# convert volumes identifiers to DataUrl
|
170
|
+
slices_urls = []
|
171
|
+
for identifier in slices:
|
172
|
+
if isinstance(identifier, TomwerVolumeBase):
|
173
|
+
volume = identifier
|
174
|
+
else:
|
175
|
+
volume = VolumeFactory.create_tomo_object_from_identifier(
|
176
|
+
identifier=identifier
|
177
|
+
)
|
178
|
+
urls = list(volume.browse_data_urls())
|
179
|
+
try:
|
180
|
+
metadata = volume.metadata or volume.load_metadata()
|
181
|
+
except Exception:
|
182
|
+
metadata = None
|
183
|
+
slices_urls.extend(urls)
|
184
|
+
slices_metadata.update({url.path(): metadata for url in urls})
|
185
|
+
|
186
|
+
slices = slices_urls
|
187
|
+
|
188
|
+
elif self.getDisplayMode() is _DisplayMode.DARKS:
|
189
|
+
self._viewer.setNormalizationFct(None)
|
190
|
+
slices = self._scan().darks
|
191
|
+
elif self.getDisplayMode() is _DisplayMode.FLATS:
|
192
|
+
self._viewer.setNormalizationFct(None)
|
193
|
+
slices = self._scan().flats
|
194
|
+
elif self.getDisplayMode() is _DisplayMode.REDUCED_DARKS:
|
195
|
+
self._viewer.setNormalizationFct(None)
|
196
|
+
slices = self._scan().load_reduced_darks(return_as_url=True)
|
197
|
+
elif self.getDisplayMode() is _DisplayMode.REDUCED_FLATS:
|
198
|
+
self._viewer.setNormalizationFct(None)
|
199
|
+
slices = self._scan().load_reduced_flats(return_as_url=True)
|
200
|
+
else:
|
201
|
+
raise ValueError("DisplayMode should be RADIOS or SLICES")
|
202
|
+
|
203
|
+
if isinstance(slices, dict):
|
204
|
+
slices = [
|
205
|
+
value for key, value in sorted(slices.items(), key=lambda item: item[0])
|
206
|
+
]
|
207
|
+
if slices is not None and len(slices) > 0:
|
208
|
+
# warning: 'setUrls' will clean metadata so we need to first set the urls
|
209
|
+
self._viewer.setUrls(slices)
|
210
|
+
self._viewer.setSliceMetadata(slices_metadata)
|
211
|
+
else:
|
212
|
+
self._viewer.reset()
|
213
|
+
self._viewer._filterUrlList()
|
266
214
|
|
267
215
|
def clear(self):
|
268
216
|
self._scan = None
|
@@ -420,304 +368,3 @@ class DisplayControl(qt.QWidget):
|
|
420
368
|
|
421
369
|
def clear(self):
|
422
370
|
self._scanQLE.clear()
|
423
|
-
|
424
|
-
|
425
|
-
class ImageStack(_ImageStack):
|
426
|
-
"""
|
427
|
-
Image stack dedicated to data display.
|
428
|
-
|
429
|
-
It deal for example with data normalization...
|
430
|
-
"""
|
431
|
-
|
432
|
-
def __init__(self, parent, show_overview=True, backend=None):
|
433
|
-
self._normFct = None
|
434
|
-
self._url_indexes = None
|
435
|
-
super().__init__(parent)
|
436
|
-
self.getPlotWidget().setBackend(backend)
|
437
|
-
|
438
|
-
# tune colormap dialog to have histogram by default
|
439
|
-
colormapAction = self.getPlotWidget().getColormapAction()
|
440
|
-
colormapDialog = colormapAction.getColormapDialog()
|
441
|
-
colormapDialog.getHistogramWidget().setDisplayMode(DisplayMode.HISTOGRAM)
|
442
|
-
colormapAction.setColormapDialog(colormapDialog)
|
443
|
-
|
444
|
-
self.setUrlLoaderClass(_TomwerUrlLoader)
|
445
|
-
# hide axis to be display
|
446
|
-
self._plot.setAxesDisplayed(False)
|
447
|
-
self._loadSliceParams = False
|
448
|
-
self._resetZoom = True
|
449
|
-
|
450
|
-
# add dock widget for reconstruction parameters
|
451
|
-
self._reconsInfoDockWidget = qt.QDockWidget(parent=self)
|
452
|
-
self._reconsWidgetScrollArea = qt.QScrollArea(self)
|
453
|
-
self._reconsWidgetScrollArea.setWidgetResizable(True)
|
454
|
-
self._reconsWidget = ReconstructionParameters(self)
|
455
|
-
self._reconsWidgetScrollArea.setWidget(self._reconsWidget)
|
456
|
-
self._reconsInfoDockWidget.setWidget(self._reconsWidgetScrollArea)
|
457
|
-
self._reconsInfoDockWidget.setFeatures(qt.QDockWidget.DockWidgetMovable)
|
458
|
-
self.addDockWidget(qt.Qt.RightDockWidgetArea, self._reconsInfoDockWidget)
|
459
|
-
|
460
|
-
# add scan overview dock widget
|
461
|
-
if show_overview:
|
462
|
-
self._scanOverviewDockerWidget = qt.QDockWidget(parent=self)
|
463
|
-
self._scanOverviewDockerWidget.setMaximumHeight(300)
|
464
|
-
self._scanOverviewWidget = ScanOverviewWidget(self)
|
465
|
-
self._scanOverviewDockerWidget.setWidget(self._scanOverviewWidget)
|
466
|
-
self._scanOverviewDockerWidget.setFeatures(qt.QDockWidget.DockWidgetMovable)
|
467
|
-
self.addDockWidget(
|
468
|
-
qt.Qt.RightDockWidgetArea, self._scanOverviewDockerWidget
|
469
|
-
)
|
470
|
-
else:
|
471
|
-
self._scanOverviewWidget = None
|
472
|
-
self._scanOverviewDockerWidget = None
|
473
|
-
|
474
|
-
# for now hide the "control"
|
475
|
-
self._urlsTable._toggleButton.hide()
|
476
|
-
|
477
|
-
# add an action to plot the url-image 'full size'
|
478
|
-
fullScreenIcon = icons.getQIcon("full_screen")
|
479
|
-
self._fullScreenAction = qt.QAction(fullScreenIcon, "pop up full screen")
|
480
|
-
self.getPlotWidget().toolBar().addAction(self._fullScreenAction)
|
481
|
-
self._fullScreenAction.triggered.connect(self._popCurrentImageFullScreen)
|
482
|
-
|
483
|
-
# set up
|
484
|
-
self.setAutoResetZoom(False)
|
485
|
-
|
486
|
-
def _popCurrentImageFullScreen(self, *args, **kwargs):
|
487
|
-
new_plot = FullScreenPlot2D()
|
488
|
-
active_image = self.getPlotWidget().getActiveImage()
|
489
|
-
if active_image is None or active_image.getData(copy=False) is None:
|
490
|
-
return
|
491
|
-
url = self.getCurrentUrl()
|
492
|
-
window_title = f"Plot of {url.path()}" if url is not None else "Image Plot"
|
493
|
-
|
494
|
-
new_plot.setWindowTitle(window_title)
|
495
|
-
# reuse the same colormap for conveniance (user modification on it will be applied everywhere)
|
496
|
-
new_plot.setDefaultColormap(self.getPlotWidget().getDefaultColormap())
|
497
|
-
|
498
|
-
# add the current image
|
499
|
-
new_plot.addImage(active_image.getData(copy=True))
|
500
|
-
|
501
|
-
new_plot.showFullScreen()
|
502
|
-
|
503
|
-
def setScan(self, scan):
|
504
|
-
if self._scanOverviewWidget is not None:
|
505
|
-
self._scanOverviewWidget.setScan(scan=scan)
|
506
|
-
|
507
|
-
def getUrlListDockWidget(self):
|
508
|
-
return self._tableDockWidget
|
509
|
-
|
510
|
-
def resetZoom(self):
|
511
|
-
self._plot.resetZoom()
|
512
|
-
|
513
|
-
def setLimits(self, x_min, x_max, y_min, y_max):
|
514
|
-
self._plot.setLimits(xmin=x_min, ymin=y_min, xmax=x_max, ymax=y_max)
|
515
|
-
|
516
|
-
def getLimits(self):
|
517
|
-
limits = []
|
518
|
-
limits.extend(self._plot.getGraphXLimits())
|
519
|
-
limits.extend(self._plot.getGraphYLimits())
|
520
|
-
return tuple(limits)
|
521
|
-
|
522
|
-
def setSliceReconsParamsVisible(self, visible):
|
523
|
-
"""show or not information regarding the slice reconstructed"""
|
524
|
-
self._reconsInfoDockWidget.setVisible(visible)
|
525
|
-
self._loadSliceParams = visible
|
526
|
-
|
527
|
-
def setScanOverviewVisible(self, visible):
|
528
|
-
"""show or not overview of the scan"""
|
529
|
-
if self._scanOverviewDockerWidget is not None:
|
530
|
-
self._scanOverviewDockerWidget.setVisible(visible)
|
531
|
-
|
532
|
-
def setNormalizationFct(self, fct, url_indexes=None):
|
533
|
-
self._normFct = fct
|
534
|
-
self._url_indexes = url_indexes
|
535
|
-
|
536
|
-
def _urlLoaded(self) -> None:
|
537
|
-
"""
|
538
|
-
|
539
|
-
:param url: result of DataUrl.path() function
|
540
|
-
:return:
|
541
|
-
"""
|
542
|
-
sender = self.sender()
|
543
|
-
url = sender.url.path()
|
544
|
-
if self._urlIndexes is not None and url in self._urlIndexes:
|
545
|
-
data = sender.data
|
546
|
-
if data is None:
|
547
|
-
_logger.warning("no data found (is the url valid ?) " + url)
|
548
|
-
return
|
549
|
-
|
550
|
-
if data.ndim != 2:
|
551
|
-
if data.ndim == 3:
|
552
|
-
if data.shape[0] == 1:
|
553
|
-
# if reconstruction along z
|
554
|
-
data = data.reshape((data.shape[1], data.shape[2]))
|
555
|
-
elif data.shape[1] == 1:
|
556
|
-
# if reconstruction along y
|
557
|
-
data = data.reshape((data.shape[0], data.shape[2]))
|
558
|
-
elif data.shape[2] == 1:
|
559
|
-
# if reconstruction along z
|
560
|
-
data = data.reshape((data.shape[0], data.shape[1]))
|
561
|
-
else:
|
562
|
-
_logger.warning(f"Image Stack only manage 2D data. Url: {url}")
|
563
|
-
return
|
564
|
-
else:
|
565
|
-
_logger.warning(f"Image Stack only manage 2D data. Url: {url}")
|
566
|
-
return
|
567
|
-
if self._normFct is None:
|
568
|
-
self._urlData[url] = data
|
569
|
-
else:
|
570
|
-
norm_data = self._normFct(data, index=self._urlIndexes[url])
|
571
|
-
self._urlData[url] = norm_data
|
572
|
-
|
573
|
-
if self.getCurrentUrl().path() == url:
|
574
|
-
self._plot.addImage(self._urlData[url])
|
575
|
-
if hasattr(self, "getWaiterOverlay"):
|
576
|
-
self.getWaiterOverlay().hide()
|
577
|
-
else:
|
578
|
-
self._waitingOverlay.hide()
|
579
|
-
if self._resetZoom:
|
580
|
-
self._resetZoom = False
|
581
|
-
self._plot.resetZoom()
|
582
|
-
|
583
|
-
if sender in self._loadingThreads:
|
584
|
-
self._loadingThreads.remove(sender)
|
585
|
-
self.sigLoaded.emit(url)
|
586
|
-
|
587
|
-
def setResetZoomOnNextIteration(self, reset):
|
588
|
-
self._resetZoom = reset
|
589
|
-
|
590
|
-
def setCurrentUrl(self, url: DataUrl):
|
591
|
-
if url in ("", None):
|
592
|
-
url = None
|
593
|
-
elif isinstance(url, str):
|
594
|
-
url = DataUrl(path=url)
|
595
|
-
elif not isinstance(url, DataUrl):
|
596
|
-
raise TypeError
|
597
|
-
if url is None:
|
598
|
-
pass
|
599
|
-
# FIXME: add a function to clear the metadata widget
|
600
|
-
elif self._loadSliceParams:
|
601
|
-
try:
|
602
|
-
self._reconsWidget.setVolumeMetadata(
|
603
|
-
self._metadatas.get(url.path(), None)
|
604
|
-
)
|
605
|
-
except Exception:
|
606
|
-
_logger.info(f"Failed to find any metadata for {url.path()}.")
|
607
|
-
super().setCurrentUrl(url)
|
608
|
-
|
609
|
-
def setUrls(self, urls: list):
|
610
|
-
_ImageStack.setUrls(self, urls)
|
611
|
-
listWidget = self._urlsTable._urlsTable
|
612
|
-
items = []
|
613
|
-
for i in range(listWidget.count()):
|
614
|
-
# TODO: do this on the fly
|
615
|
-
item = listWidget.item(i)
|
616
|
-
try:
|
617
|
-
url = DataUrl(path=item.text())
|
618
|
-
except Exception:
|
619
|
-
_logger.info(
|
620
|
-
f"fail to deduce data of last modification for {item.text()}"
|
621
|
-
)
|
622
|
-
else:
|
623
|
-
if os.path.exists(url.file_path()):
|
624
|
-
lst_m = time.ctime(os.path.getmtime(url.file_path()))
|
625
|
-
item.setToolTip(f"last modification : {lst_m}")
|
626
|
-
items.append(listWidget.item(i))
|
627
|
-
|
628
|
-
def setMetadatas(self, metadatas: dict):
|
629
|
-
"""
|
630
|
-
:param dict metadata: for each url define a dict of the metadata
|
631
|
-
"""
|
632
|
-
self._metadatas = metadatas
|
633
|
-
|
634
|
-
|
635
|
-
class _TomwerUrlLoader(UrlLoader):
|
636
|
-
"""
|
637
|
-
Thread use to load DataUrl
|
638
|
-
"""
|
639
|
-
|
640
|
-
def run(self):
|
641
|
-
if self.url.file_path().endswith(".vol"):
|
642
|
-
self.data = self._load_vol()
|
643
|
-
elif self.url.scheme() == "tomwer":
|
644
|
-
if has_PIL:
|
645
|
-
self.data = numpy.array(Image.open(self.url.file_path()))
|
646
|
-
if self.url.data_slice() is not None:
|
647
|
-
self.data = self.data[self.url.data_slice()]
|
648
|
-
else:
|
649
|
-
_logger.warning(
|
650
|
-
"need to install Pillow to read file " + self.url.file_path()
|
651
|
-
)
|
652
|
-
self.data = None
|
653
|
-
else:
|
654
|
-
try:
|
655
|
-
self.data = get_slice_data(self.url)
|
656
|
-
except IOError:
|
657
|
-
self.data = None
|
658
|
-
except ValueError:
|
659
|
-
self.data = None
|
660
|
-
_logger.warning(
|
661
|
-
f"Fail to open {self.url.path()}. Maybe the reconstruction failed."
|
662
|
-
)
|
663
|
-
|
664
|
-
def _load_vol(self):
|
665
|
-
"""
|
666
|
-
load a .vol file
|
667
|
-
"""
|
668
|
-
if self.url.file_path().lower().endswith(".vol.info"):
|
669
|
-
info_file = self.url.file_path()
|
670
|
-
raw_file = self.url.file_path().replace(".vol.info", ".vol")
|
671
|
-
else:
|
672
|
-
assert self.url.file_path().lower().endswith(".vol")
|
673
|
-
raw_file = self.url.file_path()
|
674
|
-
info_file = self.url.file_path().replace(".vol", ".vol.info")
|
675
|
-
|
676
|
-
if not os.path.exists(raw_file):
|
677
|
-
data = None
|
678
|
-
mess = f"Can't find raw data file {raw_file} associated with {info_file}"
|
679
|
-
_logger.warning(mess)
|
680
|
-
elif not os.path.exists(info_file):
|
681
|
-
mess = f"Can't find info file {info_file} associated with {raw_file}"
|
682
|
-
_logger.warning(mess)
|
683
|
-
data = None
|
684
|
-
else:
|
685
|
-
shape = get_vol_file_shape(info_file)
|
686
|
-
if None in shape:
|
687
|
-
_logger.warning(f"Fail to retrieve data shape for {info_file}.")
|
688
|
-
data = None
|
689
|
-
else:
|
690
|
-
try:
|
691
|
-
numpy.zeros(shape)
|
692
|
-
except MemoryError:
|
693
|
-
data = None
|
694
|
-
_logger.warning(
|
695
|
-
f"Raw file %s is too large for being read {raw_file}"
|
696
|
-
)
|
697
|
-
else:
|
698
|
-
data = numpy.fromfile(
|
699
|
-
raw_file, dtype=numpy.float32, count=-1, sep=""
|
700
|
-
)
|
701
|
-
try:
|
702
|
-
data = data.reshape(shape)
|
703
|
-
except ValueError:
|
704
|
-
_logger.warning(
|
705
|
-
f"unable to fix shape for raw file {raw_file}. Look for information in {info_file}"
|
706
|
-
)
|
707
|
-
try:
|
708
|
-
sqr = int(numpy.sqrt(len(data)))
|
709
|
-
shape = (1, sqr, sqr)
|
710
|
-
data = data.reshape(shape)
|
711
|
-
except ValueError:
|
712
|
-
_logger.info(
|
713
|
-
f"deduction of shape size for {raw_file} failed"
|
714
|
-
)
|
715
|
-
data = None
|
716
|
-
else:
|
717
|
-
_logger.warning(
|
718
|
-
f"try deducing shape size for {raw_file} might be an incorrect interpretation"
|
719
|
-
)
|
720
|
-
if self.url.data_slice() is None:
|
721
|
-
return data
|
722
|
-
else:
|
723
|
-
return data[self.url.data_slice()]
|