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
@@ -0,0 +1,59 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from silx.gui import qt
|
4
|
+
from nabu.stitching.config import dict_to_config_obj
|
5
|
+
from nabu.stitching.stitcher.z_stitcher import (
|
6
|
+
PreProcessingZStitcher,
|
7
|
+
PostProcessingZStitcher,
|
8
|
+
)
|
9
|
+
from nabu.stitching.stitcher.y_stitcher import PreProcessingYStitcher
|
10
|
+
|
11
|
+
|
12
|
+
class PreviewThread(qt.QThread):
|
13
|
+
"""
|
14
|
+
Thread to compute an overview of the stitching
|
15
|
+
"""
|
16
|
+
|
17
|
+
def __init__(self, stitching_config: dict, *args, **kwargs) -> None:
|
18
|
+
super().__init__(*args, **kwargs)
|
19
|
+
self._stitching_config = dict_to_config_obj(stitching_config)
|
20
|
+
self._output_identifier = None
|
21
|
+
self._frame_composition = None
|
22
|
+
self._final_tomo_objs_positions = None
|
23
|
+
# store position of all the tomo objects (scan, volumes) used for the final stitching (after shift refinement)
|
24
|
+
|
25
|
+
@property
|
26
|
+
def stitching_config(self):
|
27
|
+
return self._stitching_config
|
28
|
+
|
29
|
+
@property
|
30
|
+
def output_identifier(self):
|
31
|
+
return self._output_identifier
|
32
|
+
|
33
|
+
@property
|
34
|
+
def frame_composition(self):
|
35
|
+
return self._frame_composition
|
36
|
+
|
37
|
+
@property
|
38
|
+
def final_tomo_objs_positions(self) -> dict:
|
39
|
+
"""
|
40
|
+
:return: dict with tomo object identifier (str) as key and a tuple of position in pixel (axis_0_pos, axis_1_pos, axis_2_pos)
|
41
|
+
"""
|
42
|
+
return self._final_tomo_objs_positions
|
43
|
+
|
44
|
+
def run(self):
|
45
|
+
stitching_type = self.stitching_config.stitching_type
|
46
|
+
if stitching_type.value == "z-preproc":
|
47
|
+
stitcher = PreProcessingZStitcher(configuration=self.stitching_config)
|
48
|
+
elif stitching_type.value == "z-postproc":
|
49
|
+
stitcher = PostProcessingZStitcher(configuration=self.stitching_config)
|
50
|
+
elif stitching_type.value == "y-preproc":
|
51
|
+
stitcher = PreProcessingYStitcher(configuration=self.stitching_config)
|
52
|
+
else:
|
53
|
+
raise NotImplementedError
|
54
|
+
self._output_identifier = stitcher.stitch()
|
55
|
+
if self._output_identifier is not None:
|
56
|
+
self._output_identifier = self._output_identifier.to_str()
|
57
|
+
# store in cache the frame composition to be able to provide them to the PreviewPlot
|
58
|
+
self._frame_composition = stitcher.frame_composition
|
59
|
+
self._final_tomo_objs_positions = stitcher.get_final_axis_positions_in_px()
|
@@ -0,0 +1,57 @@
|
|
1
|
+
"""Define Interface for widget handling stitching over one axis"""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
from silx.gui import qt
|
6
|
+
|
7
|
+
|
8
|
+
class _SingleAxisMixIn:
|
9
|
+
"""Common API for widget able to handle stitching over one axis (no matter if it is 0, 1, 2 (aka z, y, x))"""
|
10
|
+
|
11
|
+
@property
|
12
|
+
def first_axis(self) -> int:
|
13
|
+
"""
|
14
|
+
Axis along which stitching is done. For stitching along z will return 0...
|
15
|
+
"""
|
16
|
+
return self._axis
|
17
|
+
|
18
|
+
@property
|
19
|
+
def second_axis(self) -> int:
|
20
|
+
"""
|
21
|
+
second axis involved in the stitching. In case of stitching along axis 0 the axis 1can also be involved (axis present in the camera reference)
|
22
|
+
"""
|
23
|
+
if self._axis == 0:
|
24
|
+
return 1
|
25
|
+
elif self._axis == 1:
|
26
|
+
return 0
|
27
|
+
else:
|
28
|
+
raise NotImplementedError
|
29
|
+
|
30
|
+
@property
|
31
|
+
def third_axis(self):
|
32
|
+
all_axis = {(0, 1, 2)}
|
33
|
+
all_axis.remove(self.first_axis)
|
34
|
+
all_axis.remove(self.second_axis)
|
35
|
+
return all_axis.pop()
|
36
|
+
|
37
|
+
@staticmethod
|
38
|
+
def axis_alias(axis: int):
|
39
|
+
if axis == 0:
|
40
|
+
return "z"
|
41
|
+
elif axis == 1:
|
42
|
+
return "y"
|
43
|
+
elif axis == 2:
|
44
|
+
return "z"
|
45
|
+
else:
|
46
|
+
raise ValueError(f"axis should be in (0, 1, 2). {axis} given")
|
47
|
+
|
48
|
+
|
49
|
+
class SingleAxisMetaClass(type(qt.QMainWindow), type(_SingleAxisMixIn)):
|
50
|
+
"""
|
51
|
+
Metaclass for single axis stitcher in order to aggregate dumper class and axis
|
52
|
+
"""
|
53
|
+
|
54
|
+
def __new__(mcls, name, bases, attrs, axis: int | None = None):
|
55
|
+
mcls = super().__new__(mcls, name, bases, attrs)
|
56
|
+
mcls._axis = axis # used from _SingleAxisMixIn interface
|
57
|
+
return mcls
|
@@ -1,4 +1,5 @@
|
|
1
|
-
from
|
1
|
+
from __future__ import annotations
|
2
|
+
|
2
3
|
from silx.gui import qt
|
3
4
|
from silx.gui.colors import Colormap
|
4
5
|
from tomwer.gui import icons as tomwer_icons
|
@@ -89,7 +90,7 @@ class StitchAndBackgroundAlphaMixIn:
|
|
89
90
|
else:
|
90
91
|
return 1.0
|
91
92
|
|
92
|
-
def getBackgroundImgAlpha(self) ->
|
93
|
+
def getBackgroundImgAlpha(self) -> float | None:
|
93
94
|
"""return 0.0 if there is no background image"""
|
94
95
|
if self._backGroundAction.isChecked():
|
95
96
|
return self._alphaChannelWidget.getAlphaBackgroundImg()
|
@@ -1,8 +1,14 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
1
3
|
import logging
|
2
|
-
from typing import Union
|
3
4
|
|
4
5
|
import numpy
|
5
|
-
|
6
|
+
|
7
|
+
try:
|
8
|
+
# nabu 2024
|
9
|
+
from nabu.stitching.frame_composition import ZFrameComposition as FrameComposition
|
10
|
+
except ImportError:
|
11
|
+
from nabu.stitching.frame_composition import FrameComposition
|
6
12
|
from silx.gui import qt
|
7
13
|
from tomwer.gui.utils.buttons import TapeMeasureToolButton
|
8
14
|
from tomoscan.esrf.scan.utils import get_data
|
@@ -61,12 +67,13 @@ class PreviewStitchingPlot(Plot2D, StitchAndBackgroundAlphaMixIn):
|
|
61
67
|
DEFAULT_STITCHED_IMG_ALPHA = 0.95
|
62
68
|
DEFAULT_BACKGROUND_IMG_ALPHA = 0.20
|
63
69
|
|
64
|
-
def __init__(self, parent=None) -> None:
|
70
|
+
def __init__(self, axis: int, parent=None) -> None:
|
65
71
|
super().__init__(parent=parent) # pylint: disable=E1123
|
66
72
|
self._waitingOverlay = WaitingOverlay(self)
|
67
73
|
self._waitingOverlay.setIconSize(qt.QSize(30, 30))
|
68
74
|
self._stitched_image = None
|
69
75
|
self._composition_background = None
|
76
|
+
self._axis = axis
|
70
77
|
|
71
78
|
# tune plot
|
72
79
|
self.setYAxisInverted(settings.Y_AXIS_DOWNWARD)
|
@@ -82,7 +89,7 @@ class PreviewStitchingPlot(Plot2D, StitchAndBackgroundAlphaMixIn):
|
|
82
89
|
self.setKeepDataAspectRatio(True)
|
83
90
|
self.getColorBarWidget().hide()
|
84
91
|
|
85
|
-
# tape
|
92
|
+
# tape measure action
|
86
93
|
self._tapeMeasureButton = TapeMeasureToolButton(parent=self, plot=self)
|
87
94
|
self._tapeMeasureButton.setCheckable(True)
|
88
95
|
self.toolBar().addWidget(self._tapeMeasureButton)
|
@@ -107,6 +114,10 @@ class PreviewStitchingPlot(Plot2D, StitchAndBackgroundAlphaMixIn):
|
|
107
114
|
# connect signal / slot
|
108
115
|
self._backGroundAction.toggled.connect(self._update)
|
109
116
|
|
117
|
+
@property
|
118
|
+
def axis(self) -> int:
|
119
|
+
return self._axis
|
120
|
+
|
110
121
|
def _popCurrentImageFullScreen(self):
|
111
122
|
from tomwer.gui.visualization.fullscreenplot import FullScreenStitching
|
112
123
|
|
@@ -119,40 +130,39 @@ class PreviewStitchingPlot(Plot2D, StitchAndBackgroundAlphaMixIn):
|
|
119
130
|
new_plot.setAlphaStitchedImg(self.getStitchedImgAlpha())
|
120
131
|
new_plot.setWindowTitle("Stitching")
|
121
132
|
|
122
|
-
# reuse the same colormap for
|
133
|
+
# reuse the same colormap for convenience (user modification on it will be applied everywhere)
|
123
134
|
new_plot.setDefaultColormap(self.getDefaultColormap())
|
124
135
|
new_plot.showFullScreen()
|
125
136
|
|
126
|
-
def setComposition(self, composition: dict,
|
137
|
+
def setComposition(self, composition: dict, shape: tuple, update=True):
|
127
138
|
self._composition_background = self.buildCompositionBackground(
|
128
|
-
composition,
|
139
|
+
composition,
|
140
|
+
shape=shape,
|
141
|
+
axis=self.axis,
|
129
142
|
)
|
130
143
|
if update:
|
131
144
|
self._updatePlot()
|
132
145
|
|
133
146
|
@staticmethod
|
134
|
-
def buildCompositionBackground(composition,
|
135
|
-
|
147
|
+
def buildCompositionBackground(composition, shape: tuple, axis: int):
|
148
|
+
assert axis in (0, 1, 2)
|
149
|
+
if "raw_composition" not in composition:
|
136
150
|
raise KeyError(
|
137
|
-
"composition is expected to have a '
|
151
|
+
"composition is expected to have a 'raw_composition' key with {FrameComposition} describing raw composition as key"
|
138
152
|
)
|
139
153
|
else:
|
140
|
-
|
141
|
-
assert isinstance(
|
142
|
-
if "
|
154
|
+
raw_composition = composition["raw_composition"]
|
155
|
+
assert isinstance(raw_composition, FrameComposition)
|
156
|
+
if "overlap_composition" not in composition:
|
143
157
|
raise KeyError(
|
144
|
-
"composition is expected to have a '
|
158
|
+
"composition is expected to have a 'overlap_composition' key with {FrameComposition} describing overlap composition as key"
|
145
159
|
)
|
146
160
|
else:
|
147
|
-
|
148
|
-
assert isinstance(
|
161
|
+
overlap_composition = composition["overlap_composition"]
|
162
|
+
assert isinstance(overlap_composition, FrameComposition)
|
149
163
|
|
150
164
|
background = numpy.zeros(
|
151
|
-
shape=
|
152
|
-
(raw_compositon.global_end_y[-1] - raw_compositon.global_start_y[0]),
|
153
|
-
frame_width,
|
154
|
-
4,
|
155
|
-
),
|
165
|
+
shape=shape,
|
156
166
|
)
|
157
167
|
assert background.ndim == 3
|
158
168
|
|
@@ -165,30 +175,26 @@ class PreviewStitchingPlot(Plot2D, StitchAndBackgroundAlphaMixIn):
|
|
165
175
|
yield magenta.red(), magenta.green(), magenta.blue(), 255
|
166
176
|
yield blue.red(), blue.green(), blue.blue(), 255
|
167
177
|
|
178
|
+
# composition is always done along y (in image space). So for stitching along y (in nxtomo space) we need to flip the two axis to apply the composition
|
179
|
+
print("shape is", shape)
|
168
180
|
colors_raw_frames = []
|
169
|
-
for _, color in zip(
|
181
|
+
for _, color in zip(raw_composition.local_end, get_next_color()):
|
170
182
|
colored_frame = numpy.full(
|
171
|
-
shape=
|
172
|
-
raw_compositon.global_end_y[-1] - raw_compositon.global_start_y[0],
|
173
|
-
frame_width,
|
174
|
-
4,
|
175
|
-
),
|
183
|
+
shape=shape,
|
176
184
|
fill_value=color,
|
177
185
|
)
|
178
186
|
colors_raw_frames.append(colored_frame)
|
179
187
|
|
180
|
-
|
188
|
+
overlap_composition.compose(
|
181
189
|
background,
|
182
190
|
colors_raw_frames,
|
183
191
|
)
|
184
192
|
return background
|
185
193
|
|
186
|
-
def setStitchedTomoObj(
|
187
|
-
self, tomo_obj_id: Union[BaseIdentifier, str], composition: dict
|
188
|
-
):
|
194
|
+
def setStitchedTomoObj(self, tomo_obj_id: BaseIdentifier | str, composition: dict):
|
189
195
|
"""
|
190
|
-
:param
|
191
|
-
:param
|
196
|
+
:param tomo_obj_id: identifier of the stitched object (scan of volume)
|
197
|
+
:param composition: composition used to create the stitched object
|
192
198
|
"""
|
193
199
|
if not isinstance(tomo_obj_id, (BaseIdentifier, str)):
|
194
200
|
raise TypeError(
|
@@ -207,7 +213,7 @@ class PreviewStitchingPlot(Plot2D, StitchAndBackgroundAlphaMixIn):
|
|
207
213
|
pass
|
208
214
|
|
209
215
|
if scan is not None:
|
210
|
-
if len(scan.projections) == 0:
|
216
|
+
if scan.projections is None or len(scan.projections) == 0:
|
211
217
|
_logger.error(
|
212
218
|
f"stitched scan {tomo_obj_id} doesn't contains any projections"
|
213
219
|
)
|
@@ -229,7 +235,9 @@ class PreviewStitchingPlot(Plot2D, StitchAndBackgroundAlphaMixIn):
|
|
229
235
|
|
230
236
|
assert self._stitched_image.ndim == 2
|
231
237
|
self._composition_background = self.buildCompositionBackground(
|
232
|
-
composition=composition,
|
238
|
+
composition=composition,
|
239
|
+
shape=(self._stitched_image.shape[0], self._stitched_image.shape[1], 4),
|
240
|
+
axis=self.axis,
|
233
241
|
)
|
234
242
|
self._update()
|
235
243
|
|
@@ -241,6 +249,6 @@ class PreviewStitchingPlot(Plot2D, StitchAndBackgroundAlphaMixIn):
|
|
241
249
|
def stitched_image(self):
|
242
250
|
return self._stitched_image
|
243
251
|
|
244
|
-
def setPixelSize(self, pixel_size:
|
252
|
+
def setPixelSize(self, pixel_size: tuple | float):
|
245
253
|
"""set the pixel size to be used by the ruler"""
|
246
254
|
self._tapeMeasureButton.setPixelSize(pixel_size_m=pixel_size)
|
@@ -1,7 +1,9 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
1
3
|
import logging
|
2
4
|
import weakref
|
3
5
|
import numpy
|
4
|
-
from typing import Any
|
6
|
+
from typing import Any
|
5
7
|
from contextlib import AbstractContextManager
|
6
8
|
|
7
9
|
from silx.gui import qt
|
@@ -109,7 +111,7 @@ class RawStitchingPlot(PlotWindow):
|
|
109
111
|
self._flipudFrames = flip
|
110
112
|
self._updateImages()
|
111
113
|
|
112
|
-
def setSliceForPreview(self, slice_for_preview:
|
114
|
+
def setSliceForPreview(self, slice_for_preview: str | int):
|
113
115
|
if self._slice_for_preview != slice_for_preview:
|
114
116
|
self._slice_for_preview = slice_for_preview
|
115
117
|
self._updateImages()
|
@@ -127,7 +129,7 @@ class RawStitchingPlot(PlotWindow):
|
|
127
129
|
return self._activated
|
128
130
|
|
129
131
|
@staticmethod
|
130
|
-
def getMinAxisPosition(tomo_obj:
|
132
|
+
def getMinAxisPosition(tomo_obj: TomwerObject | None, axis):
|
131
133
|
if tomo_obj is None or tomo_obj.stitching_metadata is None:
|
132
134
|
return 0
|
133
135
|
else:
|
@@ -0,0 +1,88 @@
|
|
1
|
+
import os
|
2
|
+
import tempfile
|
3
|
+
|
4
|
+
from tomoscan.series import Series
|
5
|
+
|
6
|
+
from tomwer.gui.stitching.StitchingWindow import ZStitchingWindow
|
7
|
+
from tomwer.gui.stitching.tests.utils import create_scans_z_series
|
8
|
+
from tomwer.tests.conftest import qtapp # noqa F401
|
9
|
+
|
10
|
+
|
11
|
+
def test_ZStitchingWindow(
|
12
|
+
qtapp, # noqa F811
|
13
|
+
tmp_path,
|
14
|
+
):
|
15
|
+
"""
|
16
|
+
Test ZStitchingWindow
|
17
|
+
|
18
|
+
* adding tom objects
|
19
|
+
* saving and loading settings (nabu-stitching configuration)
|
20
|
+
* editing tomo objects positions over stitching axis
|
21
|
+
* reset tomo objects positions
|
22
|
+
"""
|
23
|
+
|
24
|
+
window = ZStitchingWindow()
|
25
|
+
|
26
|
+
axis_0_positions = (90, 0.0, -90.0)
|
27
|
+
axis_2_positions = (0.0, 0.0, 0.0)
|
28
|
+
pixel_size = 1.0
|
29
|
+
|
30
|
+
input_dir = os.path.join(tmp_path, "input")
|
31
|
+
|
32
|
+
scans = create_scans_z_series(
|
33
|
+
output_dir=input_dir,
|
34
|
+
z_positions_m=axis_0_positions,
|
35
|
+
x_positions_m=axis_2_positions,
|
36
|
+
shifts=((0.0, 0.0), (-90.0, 0.0), (-180.0, 0.0)),
|
37
|
+
pixel_size=pixel_size,
|
38
|
+
raw_frame_width=280,
|
39
|
+
final_frame_width=100,
|
40
|
+
)
|
41
|
+
series = Series("z-series", scans)
|
42
|
+
|
43
|
+
window.show()
|
44
|
+
for scan in scans:
|
45
|
+
window.addTomoObj(scan)
|
46
|
+
window.clean()
|
47
|
+
window.setSeries(series)
|
48
|
+
|
49
|
+
# test dumping and loading configuration to a file
|
50
|
+
with tempfile.TemporaryDirectory() as dump_dir:
|
51
|
+
config_file = os.path.join(dump_dir, "configuration.cfg")
|
52
|
+
window._saveSettings(file_path=config_file)
|
53
|
+
assert os.path.exists(config_file)
|
54
|
+
window._loadSettings(config_file)
|
55
|
+
# remove configuration
|
56
|
+
window.clean()
|
57
|
+
assert len(window._widget._mainWidget.getTomoObjs()) == 0
|
58
|
+
# reload it
|
59
|
+
window._loadSettings(file_path=config_file)
|
60
|
+
assert len(window._widget._mainWidget.getTomoObjs()) == len(series)
|
61
|
+
|
62
|
+
assert window.getConfiguration()["stitching"]["axis_0_pos_px"] == [90, 0, -90]
|
63
|
+
|
64
|
+
# test editing axis position
|
65
|
+
widget_tomo_obj_0 = (
|
66
|
+
window._editTomoObjFirstAxisPositionsWidget._tomoObjtoTomoObjPosWidget[
|
67
|
+
scans[0].get_identifier().to_str()
|
68
|
+
]
|
69
|
+
)
|
70
|
+
|
71
|
+
window._editTomoObjFirstAxisPositionsWidget.setEditionMode("free")
|
72
|
+
widget_tomo_obj_0.setValue(10)
|
73
|
+
assert window.getConfiguration()["stitching"]["axis_0_pos_px"] == [10, 0, -90]
|
74
|
+
window._editTomoObjFirstAxisPositionsWidget.setEditionMode("downstream")
|
75
|
+
widget_tomo_obj_0.setValue(30)
|
76
|
+
assert window.getConfiguration()["stitching"]["axis_0_pos_px"] == [30, 20, -70]
|
77
|
+
window._editTomoObjFirstAxisPositionsWidget.setEditionMode("upstream")
|
78
|
+
widget_tomo_obj_2 = (
|
79
|
+
window._editTomoObjFirstAxisPositionsWidget._tomoObjtoTomoObjPosWidget[
|
80
|
+
scans[2].get_identifier().to_str()
|
81
|
+
]
|
82
|
+
)
|
83
|
+
widget_tomo_obj_2.setValue(-120)
|
84
|
+
assert window.getConfiguration()["stitching"]["axis_0_pos_px"] == [-20, -30, -120]
|
85
|
+
|
86
|
+
# test reset positions to initial positions
|
87
|
+
window._editTomoObjFirstAxisPositionsWidget._resetPositions()
|
88
|
+
assert window.getConfiguration()["stitching"]["axis_0_pos_px"] == [90, 0, -90]
|
@@ -0,0 +1,21 @@
|
|
1
|
+
from tomwer.tests.conftest import qtapp # noqa F401
|
2
|
+
from tomwer.core.volume.hdf5volume import HDF5Volume
|
3
|
+
from tomwer.gui.stitching.axisorderedlist import EditableOrderedTomoObjWidget
|
4
|
+
|
5
|
+
|
6
|
+
def test_axis_ordered_list_widget(
|
7
|
+
qtapp, # noqa F811
|
8
|
+
):
|
9
|
+
widget = EditableOrderedTomoObjWidget(axis=0)
|
10
|
+
volumes = tuple(
|
11
|
+
HDF5Volume(
|
12
|
+
file_path=f"my_volume{i}.hdf5",
|
13
|
+
data_path="my_volume",
|
14
|
+
)
|
15
|
+
for i in range(5)
|
16
|
+
)
|
17
|
+
[widget.addTomoObj(volume) for volume in volumes]
|
18
|
+
|
19
|
+
widget.setSelectedTomoObjs([volumes[1], volumes[-1]])
|
20
|
+
widget._callbackRemoveSelectedTomoObj()
|
21
|
+
assert widget.getTomoObjsAxisOrdered() == (volumes[0], volumes[2], volumes[3])
|
@@ -0,0 +1,27 @@
|
|
1
|
+
from tomwer.gui.stitching.normalization import NormalizationBySampleGroupBox
|
2
|
+
|
3
|
+
from tomwer.tests.conftest import qtapp # noqa F401
|
4
|
+
|
5
|
+
|
6
|
+
def test_FrameNormalizationWidget(
|
7
|
+
qtapp, # noqa F811
|
8
|
+
):
|
9
|
+
widget = NormalizationBySampleGroupBox()
|
10
|
+
assert widget.getConfiguration() == {
|
11
|
+
"active": True,
|
12
|
+
"side": "left",
|
13
|
+
"method": "median",
|
14
|
+
"width": 30,
|
15
|
+
"margin": 0,
|
16
|
+
}
|
17
|
+
|
18
|
+
new_config = {
|
19
|
+
"active": False,
|
20
|
+
"side": "left",
|
21
|
+
"method": "median",
|
22
|
+
"width": 30,
|
23
|
+
"margin": 0,
|
24
|
+
}
|
25
|
+
|
26
|
+
widget.setConfiguration(new_config)
|
27
|
+
assert widget.getConfiguration() == new_config
|
@@ -0,0 +1,68 @@
|
|
1
|
+
import os
|
2
|
+
|
3
|
+
import numpy
|
4
|
+
import pytest
|
5
|
+
from nabu.stitching.config import PreProcessedZStitchingConfiguration
|
6
|
+
from nabu.stitching.z_stitching import PreProcessZStitcher
|
7
|
+
from tomwer.tests.conftest import qtapp # noqa F401
|
8
|
+
|
9
|
+
from silx.image.phantomgenerator import PhantomGenerator
|
10
|
+
|
11
|
+
from tomwer.gui.stitching.stitching_preview import PreviewStitchingPlot
|
12
|
+
from tomwer.gui.stitching.tests.utils import create_scans_z_series
|
13
|
+
|
14
|
+
|
15
|
+
@pytest.mark.parametrize("flip_lr", (True, False))
|
16
|
+
@pytest.mark.parametrize("flip_ud", (True, False))
|
17
|
+
def test_preview(tmp_path, flip_lr, flip_ud, qtapp): # noqa F401
|
18
|
+
axis_0_positions = (90, 0.0, -90.0)
|
19
|
+
axis_2_positions = (0.0, 0.0, 0.0)
|
20
|
+
pixel_size = 1.0
|
21
|
+
|
22
|
+
output_file_path = os.path.join(str(tmp_path), "output", "stitched.nx")
|
23
|
+
input_dir = os.path.join(tmp_path, "input")
|
24
|
+
|
25
|
+
scans = create_scans_z_series(
|
26
|
+
output_dir=input_dir,
|
27
|
+
z_positions_m=axis_0_positions,
|
28
|
+
x_positions_m=axis_2_positions,
|
29
|
+
shifts=((0.0, 0.0), (-90.0, 0.0), (-180.0, 0.0)),
|
30
|
+
pixel_size=pixel_size,
|
31
|
+
raw_frame_width=280,
|
32
|
+
final_frame_width=100,
|
33
|
+
flip_lr=flip_lr,
|
34
|
+
flip_ud=flip_ud,
|
35
|
+
)
|
36
|
+
stitching_config = PreProcessedZStitchingConfiguration(
|
37
|
+
output_file_path=output_file_path,
|
38
|
+
output_data_path="entry_stitched",
|
39
|
+
overwrite_results=True,
|
40
|
+
slurm_config=None,
|
41
|
+
axis_0_pos_mm=numpy.array(axis_0_positions) / 1000,
|
42
|
+
axis_2_pos_mm=numpy.array(axis_2_positions) / 1000,
|
43
|
+
axis_0_pos_px=None,
|
44
|
+
axis_1_pos_px=None,
|
45
|
+
axis_2_pos_px=None,
|
46
|
+
input_scans=scans,
|
47
|
+
pixel_size=pixel_size,
|
48
|
+
)
|
49
|
+
widget = PreviewStitchingPlot(axis=0)
|
50
|
+
|
51
|
+
widget._backGroundAction.toggle()
|
52
|
+
|
53
|
+
stitcher = PreProcessZStitcher(configuration=stitching_config)
|
54
|
+
stitched_id = stitcher.stitch(store_composition=True)
|
55
|
+
assert stitched_id is not None
|
56
|
+
composition = stitcher.frame_composition
|
57
|
+
assert composition is not None
|
58
|
+
|
59
|
+
widget.setStitchedTomoObj(tomo_obj_id=stitched_id.to_str(), composition=composition)
|
60
|
+
assert widget.stitched_image is not None
|
61
|
+
assert widget.composition_background is not None
|
62
|
+
|
63
|
+
numpy.testing.assert_almost_equal(
|
64
|
+
widget.stitched_image,
|
65
|
+
PhantomGenerator.get2DPhantomSheppLogan(n=280).astype(numpy.float32) * 256.0,
|
66
|
+
)
|
67
|
+
|
68
|
+
widget._backGroundAction.toggle()
|
@@ -0,0 +1,110 @@
|
|
1
|
+
import os
|
2
|
+
import shutil
|
3
|
+
import tempfile
|
4
|
+
|
5
|
+
import numpy
|
6
|
+
|
7
|
+
from silx.gui import qt
|
8
|
+
from silx.gui.utils.testutils import TestCaseQt
|
9
|
+
from tomwer.core.utils.scanutils import MockNXtomo
|
10
|
+
from tomwer.core.volume.hdf5volume import HDF5Volume
|
11
|
+
from tomwer.gui.stitching.metadataholder import QStitchingMetadata
|
12
|
+
from tomwer.gui.stitching.stitching_raw import RawStitchingPlot, AlphaValuesTableWidget
|
13
|
+
|
14
|
+
|
15
|
+
def _createVolumes(axis_0_positions: tuple, root_dir: str):
|
16
|
+
volumes = []
|
17
|
+
for i_volume, axis_0_position in enumerate(axis_0_positions):
|
18
|
+
data = numpy.random.random(20 * 20).reshape(1, 20, 20)
|
19
|
+
volume = HDF5Volume(
|
20
|
+
file_path=os.path.join(root_dir, f"volume_{i_volume}.hdf5"),
|
21
|
+
data_path=f"entry_{i_volume}",
|
22
|
+
data=data,
|
23
|
+
)
|
24
|
+
volume.stitching_metadata = QStitchingMetadata(tomo_obj=volume)
|
25
|
+
volume.stitching_metadata.setPxPos(axis=0, value=axis_0_position)
|
26
|
+
volumes.append(volume)
|
27
|
+
return volumes
|
28
|
+
|
29
|
+
|
30
|
+
def _createScans(axis_0_positions: tuple, root_dir: str):
|
31
|
+
scans = []
|
32
|
+
for i_scan, axis_0_position in enumerate(axis_0_positions):
|
33
|
+
scan = MockNXtomo(
|
34
|
+
scan_path=os.path.join(root_dir, f"scan_{i_scan}"),
|
35
|
+
n_proj=20,
|
36
|
+
n_ini_proj=20,
|
37
|
+
dim=10,
|
38
|
+
).scan
|
39
|
+
scan.stitching_metadata = QStitchingMetadata(tomo_obj=scan)
|
40
|
+
scan.stitching_metadata.setPxPos(axis=0, value=axis_0_position)
|
41
|
+
scans.append(scan)
|
42
|
+
return scans
|
43
|
+
|
44
|
+
|
45
|
+
class TestPlotRawStitching(TestCaseQt):
|
46
|
+
"""Test RawStitchingPlot widget"""
|
47
|
+
|
48
|
+
def setUp(self):
|
49
|
+
super().setUp()
|
50
|
+
self._tmp_path = tempfile.mkdtemp()
|
51
|
+
self.widget = RawStitchingPlot(alpha_values=True)
|
52
|
+
|
53
|
+
def tearDown(self):
|
54
|
+
self.widget.setAttribute(qt.Qt.WA_DeleteOnClose)
|
55
|
+
self.widget.close()
|
56
|
+
self.widget = None
|
57
|
+
shutil.rmtree(self._tmp_path)
|
58
|
+
|
59
|
+
def testWithVolumes(self):
|
60
|
+
axis_0_positions = (0, 12, 50)
|
61
|
+
volumes = _createVolumes(
|
62
|
+
axis_0_positions=axis_0_positions, root_dir=self._tmp_path
|
63
|
+
)
|
64
|
+
assert len(volumes) == 3
|
65
|
+
self.widget.addTomoObj(volumes[0])
|
66
|
+
images = self.widget.getAllImages()
|
67
|
+
assert len(images) == 1
|
68
|
+
|
69
|
+
self.widget.setTomoObjs(volumes)
|
70
|
+
images = self.widget.getAllImages()
|
71
|
+
assert len(images) == len(volumes)
|
72
|
+
# silx is storing origins as x, y
|
73
|
+
origins = tuple([image.getOrigin()[1] for image in images])
|
74
|
+
assert tuple(sorted(origins)) == axis_0_positions
|
75
|
+
|
76
|
+
def testWithScans(self):
|
77
|
+
axis_0_positions = (0, 10, 20, 34)
|
78
|
+
scans = _createScans(axis_0_positions=axis_0_positions, root_dir=self._tmp_path)
|
79
|
+
self.widget.setActive(False)
|
80
|
+
self.widget.setTomoObjs(scans)
|
81
|
+
assert len(self.widget.getAllImages()) == 0
|
82
|
+
self.widget.setActive(True)
|
83
|
+
self.qapp.processEvents()
|
84
|
+
assert len(self.widget.getAllImages()) == len(scans)
|
85
|
+
|
86
|
+
|
87
|
+
class TestAlphaValuesTableWidget(TestCaseQt):
|
88
|
+
"""test AlphaValuesTableWidget"""
|
89
|
+
|
90
|
+
def setUp(self):
|
91
|
+
super().setUp()
|
92
|
+
self._tmp_path = tempfile.mkdtemp()
|
93
|
+
self.widget = AlphaValuesTableWidget()
|
94
|
+
|
95
|
+
def tearDown(self):
|
96
|
+
self.widget.setAttribute(qt.Qt.WA_DeleteOnClose)
|
97
|
+
self.widget.close()
|
98
|
+
self.widget = None
|
99
|
+
shutil.rmtree(self._tmp_path)
|
100
|
+
|
101
|
+
def testSettingTomoObj(self):
|
102
|
+
self.widget.setTomoObjs(
|
103
|
+
_createVolumes(axis_0_positions=(0, 12, 50), root_dir=self._tmp_path),
|
104
|
+
)
|
105
|
+
|
106
|
+
assert len(self.widget._sliders) == 3
|
107
|
+
self.widget.setTomoObjs(
|
108
|
+
_createScans(axis_0_positions=(89, 78), root_dir=self._tmp_path)
|
109
|
+
)
|
110
|
+
assert len(self.widget._sliders) == 2
|