tomwer 1.3.26__py3-none-any.whl → 1.4.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- orangecontrib/tomwer/orange/managedprocess.py +1 -29
- orangecontrib/tomwer/orange/settings.py +2 -28
- orangecontrib/tomwer/tests/TestAcquisition.py +220 -0
- orangecontrib/tomwer/tutorials/append_raw_darks_and_flats_frames_to_NXtomos.ows +2 -2
- orangecontrib/tomwer/tutorials/copy_reduced_darks_and_flats_meth1.ows +1 -1
- orangecontrib/tomwer/tutorials/{icat_publication.ows → drac_publication.ows} +7 -21
- orangecontrib/tomwer/tutorials/id16b/ID16b_full_volume.ows +22 -0
- orangecontrib/tomwer/tutorials/id16b/ID16b_insitu.ows +302 -0
- orangecontrib/tomwer/tutorials/id16b/ID16b_normalization.ows +218 -0
- orangecontrib/tomwer/tutorials/simple_volume_to_slurm_reconstruction.ows +29 -24
- orangecontrib/tomwer/tutorials/test_cor.ows +19 -0
- orangecontrib/tomwer/tutorials/volume_casting_on_slurm.ows +54 -0
- orangecontrib/tomwer/widgets/__init__.py +3 -5
- orangecontrib/tomwer/widgets/cluster/FutureSupervisorOW.py +35 -54
- orangecontrib/tomwer/widgets/cluster/SlurmClusterOW.py +1 -31
- orangecontrib/tomwer/widgets/control/AdvancementOW.py +1 -29
- orangecontrib/tomwer/widgets/control/DataDiscoveryOW.py +5 -4
- orangecontrib/tomwer/widgets/control/DataListenerOW.py +1 -29
- orangecontrib/tomwer/widgets/control/DataSelectorOW.py +11 -30
- orangecontrib/tomwer/widgets/control/DataTransfertOW.py +2 -28
- orangecontrib/tomwer/widgets/control/DataValidatorOW.py +1 -28
- orangecontrib/tomwer/widgets/control/DataWatcherOW.py +1 -28
- orangecontrib/tomwer/widgets/control/EDF2NXTomomillOW.py +48 -51
- orangecontrib/tomwer/widgets/control/EmailOW.py +12 -2
- orangecontrib/tomwer/widgets/control/FilterOW.py +1 -28
- orangecontrib/tomwer/widgets/control/NXTomomillOW.py +37 -53
- orangecontrib/tomwer/widgets/control/NXtomoConcatenate.py +21 -20
- orangecontrib/tomwer/widgets/control/NotifierOW.py +9 -28
- orangecontrib/tomwer/widgets/control/ReduceDarkFlatSelectorOW.py +3 -2
- orangecontrib/tomwer/widgets/control/SingleTomoObjOW.py +1 -27
- orangecontrib/tomwer/widgets/control/TimerOW.py +9 -28
- orangecontrib/tomwer/widgets/control/TomoObjSeriesOW.py +58 -0
- orangecontrib/tomwer/widgets/control/VolumeSelector.py +8 -30
- orangecontrib/tomwer/widgets/control/icons/nxtomomill.svg +173 -119
- orangecontrib/tomwer/widgets/control/icons/reduced_darkflat_selector.png +0 -0
- orangecontrib/tomwer/widgets/control/icons/reduced_darkflat_selector.svg +55 -195
- orangecontrib/tomwer/widgets/control/icons/{tomoobjserie.svg → tomoobjseries.svg} +2 -2
- orangecontrib/tomwer/widgets/dataportal/PublishProcessedDataOW.py +172 -0
- orangecontrib/tomwer/widgets/{icat → dataportal}/__init__.py +2 -2
- orangecontrib/tomwer/widgets/debugtools/DatasetGeneratorOW.py +2 -29
- orangecontrib/tomwer/widgets/debugtools/ObjectInspectorOW.py +1 -29
- orangecontrib/tomwer/widgets/edit/DarkFlatPatchOW.py +48 -73
- orangecontrib/tomwer/widgets/edit/ImageKeyEditorOW.py +48 -75
- orangecontrib/tomwer/widgets/edit/ImageKeyUpgraderOW.py +5 -30
- orangecontrib/tomwer/widgets/edit/NXtomoEditorOW.py +51 -52
- orangecontrib/tomwer/widgets/other/PythonScriptOW.py +22 -10
- orangecontrib/tomwer/widgets/reconstruction/AxisOW.py +51 -60
- orangecontrib/tomwer/widgets/reconstruction/CastNabuVolumeOW.py +22 -68
- orangecontrib/tomwer/widgets/reconstruction/DarkRefAndCopyOW.py +3 -30
- orangecontrib/tomwer/widgets/reconstruction/NabuHelicalPrepareWeightsDoubleOW.py +21 -19
- orangecontrib/tomwer/widgets/reconstruction/NabuOW.py +7 -70
- orangecontrib/tomwer/widgets/reconstruction/NabuVolumeOW.py +41 -84
- orangecontrib/tomwer/widgets/reconstruction/SAAxisOW.py +15 -40
- orangecontrib/tomwer/widgets/reconstruction/SADeltaBetaOW.py +13 -35
- orangecontrib/tomwer/widgets/reconstruction/SinoNormOW.py +2 -30
- orangecontrib/tomwer/widgets/stitching/ZStitchingConfigOW.py +11 -11
- orangecontrib/tomwer/widgets/utils.py +2 -29
- orangecontrib/tomwer/widgets/visualization/DataViewerOW.py +1 -27
- orangecontrib/tomwer/widgets/visualization/DiffViewerOW.py +1 -27
- orangecontrib/tomwer/widgets/visualization/NXtomoMetadataViewerOW.py +1 -1
- orangecontrib/tomwer/widgets/visualization/RadioStackOW.py +2 -28
- orangecontrib/tomwer/widgets/visualization/SampleMovedOW.py +1 -27
- orangecontrib/tomwer/widgets/visualization/SinogramViewerOW.py +1 -27
- orangecontrib/tomwer/widgets/visualization/SliceStackOW.py +2 -28
- tomwer/__init__.py +3 -28
- tomwer/__main__.py +8 -4
- tomwer/app/__init__.py +2 -0
- tomwer/app/axis.py +8 -10
- tomwer/app/canvas.py +23 -29
- tomwer/app/canvas_launcher/config.py +14 -102
- tomwer/app/canvas_launcher/environ.py +5 -8
- tomwer/app/canvas_launcher/mainwindow.py +175 -69
- tomwer/app/canvas_launcher/splash.py +1 -3
- tomwer/app/canvas_launcher/utils.py +47 -0
- tomwer/app/canvas_launcher/widgetsscheme.py +3 -10
- tomwer/app/diffframe.py +2 -0
- tomwer/app/imagekeyeditor.py +2 -1
- tomwer/app/imagekeyupgrader.py +2 -0
- tomwer/app/multicor.py +5 -2
- tomwer/app/multipag.py +16 -5
- tomwer/app/nabuapp.py +2 -1
- tomwer/app/nxtomoeditor.py +17 -12
- tomwer/app/patchrawdarkflat.py +2 -0
- tomwer/app/radiostack.py +3 -2
- tomwer/app/reducedarkflat.py +3 -0
- tomwer/app/samplemoved.py +2 -0
- tomwer/app/scanviewer.py +2 -0
- tomwer/app/sinogramviewer.py +2 -0
- tomwer/app/slicestack.py +11 -13
- tomwer/app/stitching/common.py +431 -0
- tomwer/app/stopdatalistener.py +3 -0
- tomwer/app/ystitching.py +26 -0
- tomwer/app/zstitching.py +8 -363
- tomwer/core/__init__.py +2 -28
- tomwer/core/cluster/__init__.py +3 -0
- tomwer/core/cluster/cluster.py +10 -26
- tomwer/core/futureobject.py +17 -43
- tomwer/core/log/__init__.py +2 -0
- tomwer/core/log/processlog.py +0 -28
- tomwer/core/process/cluster/supervisor.py +52 -34
- tomwer/core/process/conditions/filters.py +3 -28
- tomwer/core/process/control/datalistener/datalistener.py +7 -75
- tomwer/core/process/control/datalistener/rpcserver.py +8 -38
- tomwer/core/process/control/datawatcher/datawatcher.py +11 -40
- tomwer/core/process/control/datawatcher/datawatcherobserver.py +30 -64
- tomwer/core/process/control/datawatcher/datawatcherprocess.py +11 -32
- tomwer/core/process/control/datawatcher/edfdwprocess.py +2 -27
- tomwer/core/process/control/datawatcher/hdf5dwprocess.py +1 -26
- tomwer/core/process/control/datawatcher/status.py +1 -26
- tomwer/core/process/control/emailnotifier.py +11 -23
- tomwer/core/process/control/nxtomoconcatenate.py +20 -18
- tomwer/core/process/control/nxtomomill.py +9 -44
- tomwer/core/process/control/scanlist.py +0 -27
- tomwer/core/process/control/scantransfer.py +15 -13
- tomwer/core/process/control/scanvalidator.py +4 -30
- tomwer/core/process/control/{test → tests}/test_concatenate_nxtomos.py +5 -5
- tomwer/core/process/control/timer.py +1 -27
- tomwer/core/process/control/tomoobjseries.py +12 -0
- tomwer/core/process/drac/binning.py +37 -0
- tomwer/core/process/drac/dracbase.py +170 -0
- tomwer/core/process/drac/gallery.py +109 -0
- tomwer/core/process/drac/output.py +12 -0
- tomwer/core/process/drac/processeddataset.py +147 -0
- tomwer/core/process/drac/publish.py +118 -0
- tomwer/core/process/drac/rawdataset.py +142 -0
- tomwer/core/process/drac/tests/test_gallery.py +71 -0
- tomwer/core/process/drac/tests/test_icat_processed_dataset.py +80 -0
- tomwer/core/process/drac/tests/test_icat_raw_dataset.py +90 -0
- tomwer/core/process/edit/darkflatpatch.py +1 -28
- tomwer/core/process/edit/imagekeyeditor.py +4 -32
- tomwer/core/process/edit/nxtomoeditor.py +307 -0
- tomwer/core/process/edit/tests/test_darkflatpatch.py +243 -0
- tomwer/core/process/edit/tests/test_imagekey_editor.py +99 -0
- tomwer/core/process/output.py +9 -2
- tomwer/core/process/reconstruction/__init__.py +0 -26
- tomwer/core/process/reconstruction/axis/anglemode.py +1 -29
- tomwer/core/process/reconstruction/axis/axis.py +47 -804
- tomwer/core/process/reconstruction/axis/mode.py +89 -25
- tomwer/core/process/reconstruction/axis/params.py +131 -283
- tomwer/core/process/reconstruction/axis/projectiontype.py +0 -28
- tomwer/core/process/reconstruction/axis/side.py +8 -0
- tomwer/core/process/reconstruction/darkref/darkrefs.py +14 -39
- tomwer/core/process/reconstruction/darkref/darkrefscopy.py +7 -39
- tomwer/core/process/reconstruction/darkref/params.py +1 -28
- tomwer/core/process/reconstruction/nabu/castvolume.py +19 -34
- tomwer/core/process/reconstruction/nabu/nabucommon.py +18 -43
- tomwer/core/process/reconstruction/nabu/nabuscores.py +64 -68
- tomwer/core/process/reconstruction/nabu/nabuslices.py +63 -105
- tomwer/core/process/reconstruction/nabu/nabuvolume.py +44 -70
- tomwer/core/process/reconstruction/nabu/plane.py +10 -0
- tomwer/core/process/reconstruction/nabu/settings.py +1 -28
- tomwer/core/process/reconstruction/nabu/target.py +0 -28
- tomwer/core/process/reconstruction/nabu/test/test_castvolume.py +116 -0
- tomwer/core/process/reconstruction/nabu/test/test_nabu_utils.py +277 -0
- tomwer/core/process/reconstruction/nabu/test/test_nabunormalization.py +199 -0
- tomwer/core/process/reconstruction/nabu/utils.py +11 -60
- tomwer/core/process/reconstruction/normalization/normalization.py +2 -32
- tomwer/core/process/reconstruction/normalization/params.py +3 -35
- tomwer/core/process/reconstruction/output.py +14 -19
- tomwer/core/process/reconstruction/paramsbase.py +4 -33
- tomwer/core/process/reconstruction/saaxis/params.py +5 -33
- tomwer/core/process/reconstruction/saaxis/saaxis.py +22 -51
- tomwer/core/process/reconstruction/sadeltabeta/params.py +2 -31
- tomwer/core/process/reconstruction/sadeltabeta/sadeltabeta.py +18 -46
- tomwer/core/process/reconstruction/scores/params.py +9 -39
- tomwer/core/process/reconstruction/scores/scores.py +10 -42
- tomwer/core/process/reconstruction/tests/__init__.py +0 -0
- tomwer/core/process/reconstruction/tests/test_axis.py +46 -0
- tomwer/core/process/reconstruction/tests/test_darkref.py +33 -0
- tomwer/core/process/reconstruction/{test → tests}/test_saaxis.py +1 -27
- tomwer/core/process/reconstruction/tests/test_sadeltabeta.py +48 -0
- tomwer/core/process/reconstruction/{test → tests}/test_utils.py +4 -4
- tomwer/core/process/reconstruction/utils/cor.py +8 -4
- tomwer/core/process/script/python.py +1 -27
- tomwer/core/process/script/tests/test_script.py +41 -0
- tomwer/core/process/stitching/metadataholder.py +5 -4
- tomwer/core/process/stitching/nabustitcher.py +35 -5
- tomwer/core/process/stitching/tests/test_metadataholder.py +17 -0
- tomwer/core/process/task.py +20 -63
- tomwer/core/process/tests/__init__.py +0 -0
- tomwer/core/process/{test → tests}/test_conditions.py +1 -28
- tomwer/core/process/{test → tests}/test_dark_and_flat.py +1 -27
- tomwer/core/process/{test → tests}/test_data_listener.py +1 -27
- tomwer/core/process/{test → tests}/test_data_transfer.py +2 -28
- tomwer/core/process/{test → tests}/test_data_watcher.py +1 -27
- tomwer/core/process/{test → tests}/test_nabu.py +2 -33
- tomwer/core/process/{test → tests}/test_normalization.py +1 -26
- tomwer/core/process/{test → tests}/test_timer.py +1 -27
- tomwer/core/process/utils.py +2 -31
- tomwer/core/process/visualization/dataviewer.py +1 -26
- tomwer/core/process/visualization/diffviewer.py +1 -26
- tomwer/core/process/visualization/imagestackviewer.py +0 -26
- tomwer/core/process/visualization/radiostack.py +0 -26
- tomwer/core/process/visualization/samplemoved.py +0 -28
- tomwer/core/process/visualization/sinogramviewer.py +0 -27
- tomwer/core/process/visualization/slicestack.py +0 -28
- tomwer/core/process/visualization/tests/test_data_viewer.py +12 -0
- tomwer/core/process/visualization/tests/test_diff_viewer.py +12 -0
- tomwer/core/process/visualization/tests/test_image_stack_viewer.py +14 -0
- tomwer/core/process/visualization/tests/test_radio_stack.py +12 -0
- tomwer/core/process/visualization/tests/test_sample_moved.py +14 -0
- tomwer/core/process/visualization/tests/test_sinogram_viewer.py +13 -0
- tomwer/core/process/visualization/tests/test_slice_stack.py +13 -0
- tomwer/core/process/visualization/tests/test_volume_viewer.py +12 -0
- tomwer/core/process/visualization/volumeviewer.py +0 -29
- tomwer/core/scan/__init__.py +3 -27
- tomwer/core/scan/blissscan.py +5 -34
- tomwer/core/scan/edfscan.py +19 -53
- tomwer/core/scan/hdf5scan.py +2 -2
- tomwer/core/scan/nxtomoscan.py +48 -54
- tomwer/core/scan/scanbase.py +107 -203
- tomwer/core/scan/scanfactory.py +11 -41
- tomwer/core/scan/tests/__init__.py +0 -0
- tomwer/core/scan/tests/test_edf.py +25 -0
- tomwer/core/scan/tests/test_future_scan.py +35 -0
- tomwer/core/scan/tests/test_nxtomoscan.py +143 -0
- tomwer/core/scan/tests/test_process_registration.py +64 -0
- tomwer/core/settings.py +18 -40
- tomwer/core/tests/__init__.py +0 -0
- tomwer/core/tests/test_scanutils.py +26 -0
- tomwer/core/{test → tests}/test_utils.py +1 -28
- tomwer/core/tomwer_object.py +4 -0
- tomwer/core/utils/__init__.py +2 -0
- tomwer/core/utils/char.py +0 -28
- tomwer/core/utils/deprecation.py +12 -38
- tomwer/core/utils/dictutils.py +1 -3
- tomwer/core/utils/ftseriesutils.py +1 -27
- tomwer/core/utils/gpu.py +0 -28
- tomwer/core/utils/image.py +8 -39
- tomwer/core/utils/locker.py +1 -28
- tomwer/core/utils/logconfig.py +0 -27
- tomwer/core/utils/normalization.py +4 -31
- tomwer/core/utils/nxtomoutils.py +8 -38
- tomwer/core/utils/resource.py +0 -26
- tomwer/core/utils/scanutils.py +23 -52
- tomwer/core/utils/slurm.py +7 -30
- tomwer/core/utils/spec.py +6 -6
- tomwer/core/utils/tests/__init__.py +0 -0
- tomwer/core/utils/tests/test_image.py +30 -0
- tomwer/core/utils/tests/test_nxtomo.py +38 -0
- tomwer/core/utils/tests/test_scan_utils.py +46 -0
- tomwer/core/utils/tests/test_time.py +6 -0
- tomwer/core/utils/threads.py +0 -26
- tomwer/core/utils/time.py +0 -27
- tomwer/core/volume/__init__.py +4 -0
- tomwer/core/volume/edfvolume.py +1 -28
- tomwer/core/volume/hdf5volume.py +1 -28
- tomwer/core/volume/jp2kvolume.py +1 -27
- tomwer/core/volume/rawvolume.py +1 -28
- tomwer/core/volume/tests/test_volumes.py +21 -0
- tomwer/core/volume/tiffvolume.py +1 -28
- tomwer/core/volume/volumebase.py +5 -0
- tomwer/core/volume/volumefactory.py +7 -33
- tomwer/gui/__init__.py +0 -28
- tomwer/gui/cluster/__init__.py +2 -0
- tomwer/gui/cluster/slurm.py +297 -95
- tomwer/gui/cluster/supervisor.py +1 -27
- tomwer/gui/cluster/tests/__init__.py +0 -0
- tomwer/gui/cluster/{test → tests}/test_cluster.py +21 -26
- tomwer/gui/cluster/{test → tests}/test_supervisor.py +1 -27
- tomwer/gui/conditions/__init__.py +2 -0
- tomwer/gui/conditions/filter.py +1 -26
- tomwer/gui/configuration/__init__.py +2 -0
- tomwer/gui/control/__init__.py +2 -0
- tomwer/gui/control/actions.py +2 -28
- tomwer/gui/control/datadiscovery.py +4 -3
- tomwer/gui/control/datalist.py +64 -69
- tomwer/gui/control/datalistener.py +1 -39
- tomwer/gui/control/datareacheractions.py +1 -28
- tomwer/gui/control/datatransfert.py +2 -29
- tomwer/gui/control/datavalidator.py +3 -37
- tomwer/gui/control/datawatcher/__init__.py +0 -28
- tomwer/gui/control/datawatcher/configuration.py +1 -28
- tomwer/gui/control/datawatcher/datawatcher.py +3 -32
- tomwer/gui/control/datawatcher/datawatcherobserver.py +2 -28
- tomwer/gui/control/history.py +5 -35
- tomwer/gui/control/nxtomomill.py +3 -30
- tomwer/gui/control/observations.py +61 -55
- tomwer/gui/control/reducedarkflatselector.py +24 -20
- tomwer/gui/control/scanselectorwidget.py +2 -28
- tomwer/gui/control/selectorwidgetbase.py +17 -17
- tomwer/gui/control/series/__init__.py +0 -0
- tomwer/gui/control/{serie/seriecreator.py → series/seriescreator.py} +214 -235
- tomwer/gui/control/series/serieswaiter.py +0 -0
- tomwer/gui/control/series/test/test_creator.py +424 -0
- tomwer/gui/control/series/test/test_nxtomo_concatenate.py +21 -0
- tomwer/gui/control/singletomoobj.py +1 -1
- tomwer/gui/control/tests/__init__.py +0 -0
- tomwer/gui/control/tests/test_datalist.py +47 -0
- tomwer/gui/control/{test → tests}/test_datalistener.py +1 -28
- tomwer/gui/control/tests/test_datavalidator.py +27 -0
- tomwer/gui/control/{test → tests}/test_inputwidget.py +1 -27
- tomwer/gui/control/tests/test_process_manager.py +38 -0
- tomwer/gui/control/tests/test_scan_observations.py +23 -0
- tomwer/gui/control/tests/test_scanselector.py +42 -0
- tomwer/gui/control/{test → tests}/test_scanvalidator.py +1 -27
- tomwer/gui/control/{test → tests}/test_volume_dialog.py +2 -30
- tomwer/gui/control/{test → tests}/test_volumeselector.py +1 -27
- tomwer/gui/control/volumeselectorwidget.py +2 -30
- tomwer/gui/dataportal/__init__.py +2 -0
- tomwer/gui/{icat → dataportal}/createscreenshots.py +3 -2
- tomwer/gui/dataportal/gallery.py +133 -0
- tomwer/gui/dataportal/outputformat.py +0 -0
- tomwer/gui/dataportal/publish.py +96 -0
- tomwer/gui/dataportal/tests/test_create_screenshots_gui.py +23 -0
- tomwer/gui/dataportal/tests/test_gallery_gui.py +21 -0
- tomwer/gui/debugtools/__init__.py +2 -0
- tomwer/gui/debugtools/datasetgenerator.py +1 -30
- tomwer/gui/debugtools/objectinspector.py +1 -29
- tomwer/gui/dialog/QDataDialog.py +89 -0
- tomwer/gui/{qfolderdialog.py → dialog/QVolumeDialog.py} +8 -107
- tomwer/gui/dialog/__init__.py +1 -0
- tomwer/gui/edit/__init__.py +2 -0
- tomwer/gui/edit/dkrfpatch.py +52 -87
- tomwer/gui/edit/imagekeyeditor.py +18 -54
- tomwer/gui/edit/nxtomoeditor.py +113 -300
- tomwer/gui/edit/nxtomowarmer.py +3 -2
- tomwer/gui/edit/tests/__init__.py +0 -0
- tomwer/gui/edit/{test → tests}/test_dkrf_patch.py +3 -29
- tomwer/gui/edit/{test → tests}/test_image_key_editor.py +1 -27
- tomwer/gui/edit/{test → tests}/test_nx_editor.py +45 -23
- tomwer/gui/fonts.py +5 -0
- tomwer/gui/icons.py +28 -66
- tomwer/gui/illustrations.py +4 -34
- tomwer/gui/imagefromfile.py +5 -30
- tomwer/gui/metadataloader.py +36 -0
- tomwer/gui/qconfigfile.py +3 -0
- tomwer/gui/qlefilesystem.py +3 -0
- tomwer/gui/reconstruction/__init__.py +2 -0
- tomwer/gui/reconstruction/axis/AxisMainWindow.py +275 -0
- tomwer/gui/reconstruction/axis/AxisOptionsWidget.py +313 -0
- tomwer/gui/reconstruction/axis/AxisSettingsWidget.py +797 -0
- tomwer/gui/reconstruction/axis/AxisWidget.py +534 -0
- tomwer/gui/reconstruction/axis/CalculationWidget.py +218 -0
- tomwer/gui/reconstruction/axis/CompareImages.py +11 -44
- tomwer/gui/reconstruction/axis/ControlWidget.py +285 -0
- tomwer/gui/reconstruction/axis/EstimatedCORWidget.py +394 -0
- tomwer/gui/reconstruction/axis/EstimatedCorComboBox.py +118 -0
- tomwer/gui/reconstruction/axis/InputWidget.py +347 -0
- tomwer/gui/reconstruction/axis/ManualFramesSelection.py +168 -0
- tomwer/gui/reconstruction/axis/__init__.py +2 -2
- tomwer/gui/reconstruction/darkref/__init__.py +0 -27
- tomwer/gui/reconstruction/darkref/darkrefcopywidget.py +5 -34
- tomwer/gui/reconstruction/darkref/darkrefwidget.py +1 -27
- tomwer/gui/reconstruction/nabu/castvolume.py +40 -59
- tomwer/gui/reconstruction/nabu/check.py +7 -33
- tomwer/gui/reconstruction/nabu/nabuconfig/base.py +7 -34
- tomwer/gui/reconstruction/nabu/nabuconfig/ctf.py +6 -5
- tomwer/gui/reconstruction/nabu/nabuconfig/nabuconfig.py +10 -69
- tomwer/gui/reconstruction/nabu/nabuconfig/output.py +3 -47
- tomwer/gui/reconstruction/nabu/nabuconfig/phase.py +54 -36
- tomwer/gui/reconstruction/nabu/nabuconfig/preprocessing.py +103 -54
- tomwer/gui/reconstruction/nabu/nabuconfig/reconstruction.py +116 -65
- tomwer/gui/reconstruction/nabu/nabuflow.py +31 -61
- tomwer/gui/reconstruction/nabu/platform.py +94 -0
- tomwer/gui/reconstruction/nabu/slices.py +81 -45
- tomwer/gui/reconstruction/nabu/slurm.py +1 -27
- tomwer/gui/reconstruction/nabu/test/test_cast_volume.py +82 -0
- tomwer/gui/reconstruction/nabu/test/test_check.py +66 -0
- tomwer/gui/reconstruction/nabu/test/test_ctf.py +46 -0
- tomwer/gui/reconstruction/nabu/test/test_helical.py +21 -0
- tomwer/gui/reconstruction/nabu/test/test_nabu_preprocessing.py +81 -0
- tomwer/gui/reconstruction/nabu/volume.py +62 -90
- tomwer/gui/reconstruction/normalization/intensity.py +5 -32
- tomwer/gui/reconstruction/normalization/test/test_intensity.py +89 -0
- tomwer/gui/reconstruction/saaxis/corrangeselector.py +32 -56
- tomwer/gui/reconstruction/saaxis/dimensionwidget.py +56 -96
- tomwer/gui/reconstruction/saaxis/saaxis.py +17 -38
- tomwer/gui/reconstruction/saaxis/sliceselector.py +8 -39
- tomwer/gui/reconstruction/sadeltabeta/saadeltabeta.py +19 -37
- tomwer/gui/reconstruction/scores/control.py +2 -30
- tomwer/gui/reconstruction/scores/scoreplot.py +23 -49
- tomwer/gui/reconstruction/tests/__init__.py +0 -0
- tomwer/gui/reconstruction/{test → tests}/test_axis.py +23 -49
- tomwer/gui/reconstruction/{test → tests}/test_nabu.py +16 -31
- tomwer/gui/reconstruction/{test → tests}/test_saaxis.py +10 -37
- tomwer/gui/reconstruction/{test → tests}/test_sadeltabeta.py +1 -26
- tomwer/gui/samplemoved/__init__.py +2 -30
- tomwer/gui/samplemoved/selectiontable.py +3 -33
- tomwer/gui/settings.py +7 -0
- tomwer/gui/stackplot.py +33 -661
- tomwer/gui/stacks.py +261 -135
- tomwer/gui/stitching/SingleAxisStitchingWidget.py +326 -0
- tomwer/gui/stitching/StitchingOptionsWidget.py +438 -0
- tomwer/gui/stitching/StitchingWindow.py +586 -0
- tomwer/gui/stitching/__init__.py +2 -0
- tomwer/gui/stitching/alignment.py +90 -0
- tomwer/gui/stitching/axisorderedlist.py +44 -34
- tomwer/gui/stitching/config/axisparams.py +25 -11
- tomwer/gui/stitching/config/output.py +6 -5
- tomwer/gui/stitching/config/positionoveraxis.py +313 -51
- tomwer/gui/stitching/config/stitchingstrategies.py +22 -16
- tomwer/gui/stitching/config/tests/test_axisparams.py +25 -0
- tomwer/gui/stitching/config/tomoobjdetails.py +3 -5
- tomwer/gui/stitching/normalization.py +1 -0
- tomwer/gui/stitching/preview.py +59 -0
- tomwer/gui/stitching/singleaxis.py +57 -0
- tomwer/gui/stitching/stitchandbackground.py +3 -2
- tomwer/gui/stitching/stitching_preview.py +44 -36
- tomwer/gui/stitching/stitching_raw.py +5 -3
- tomwer/gui/stitching/tests/test_ZStitchingWindow.py +88 -0
- tomwer/gui/stitching/tests/test_axis_ordered_list.py +21 -0
- tomwer/gui/stitching/tests/test_normalization.py +27 -0
- tomwer/gui/stitching/tests/test_preview.py +68 -0
- tomwer/gui/stitching/tests/test_stitching_raw.py +110 -0
- tomwer/gui/stitching/tests/utils.py +92 -0
- tomwer/gui/stitching/utils.py +14 -0
- tomwer/gui/stitching/z_stitching/fineestimation.py +5 -33
- tomwer/gui/stitching/z_stitching/tests/test_fine_estimation.py +35 -0
- tomwer/gui/stitching/z_stitching/tests/test_raw_estimation.py +215 -0
- tomwer/gui/stitching/z_stitching/tests/test_stitching_window.py +51 -0
- tomwer/gui/tests/__init__.py +0 -0
- tomwer/gui/tests/test_axis_gui.py +43 -0
- tomwer/gui/{test → tests}/test_qfolder_dialog.py +1 -1
- tomwer/gui/utils/RangeWidget.py +44 -0
- tomwer/gui/utils/buttons.py +4 -3
- tomwer/gui/utils/completer.py +2 -33
- tomwer/gui/utils/flow.py +11 -40
- tomwer/gui/utils/gpu.py +60 -0
- tomwer/gui/utils/illustrations.py +1 -26
- tomwer/gui/utils/inputwidget.py +35 -73
- tomwer/gui/utils/lineselector/lineselector.py +9 -46
- tomwer/gui/utils/loadingmode.py +81 -0
- tomwer/gui/utils/qt_utils.py +9 -0
- tomwer/gui/utils/sandboxes.py +1 -26
- tomwer/gui/utils/scandescription.py +2 -31
- tomwer/gui/utils/scrollarea.py +6 -55
- tomwer/gui/utils/slider.py +4 -28
- tomwer/gui/utils/splashscreen.py +0 -28
- tomwer/gui/utils/step.py +14 -13
- tomwer/gui/utils/tests/test_completer.py +41 -0
- tomwer/gui/utils/tests/test_line_selector.py +21 -0
- tomwer/gui/utils/tests/test_splashscreen.py +8 -0
- tomwer/gui/utils/tests/test_vignettes.py +68 -0
- tomwer/gui/utils/unitsystem.py +15 -69
- tomwer/gui/utils/utils.py +4 -5
- tomwer/gui/utils/vignettes.py +10 -41
- tomwer/gui/utils/waiterthread.py +0 -26
- tomwer/gui/visualization/__init__.py +2 -0
- tomwer/gui/visualization/dataviewer.py +68 -421
- tomwer/gui/visualization/diffviewer/diffviewer.py +2 -30
- tomwer/gui/visualization/diffviewer/shiftwidget.py +4 -29
- tomwer/gui/visualization/fullscreenplot.py +5 -5
- tomwer/gui/visualization/imagestack.py +403 -0
- tomwer/gui/visualization/nxtomometadata.py +0 -4
- tomwer/gui/visualization/reconstructionparameters.py +14 -32
- tomwer/gui/visualization/scanoverview.py +33 -66
- tomwer/gui/visualization/sinogramviewer.py +2 -28
- tomwer/gui/visualization/test/__init__.py +0 -28
- tomwer/gui/visualization/test/test_dataviewer.py +1 -28
- tomwer/gui/visualization/test/test_diffviewer.py +1 -28
- tomwer/gui/visualization/test/test_nx_tomo_metadata_viewer.py +0 -5
- tomwer/gui/visualization/test/test_reconstruction_parameters.py +1 -27
- tomwer/gui/visualization/test/test_sinogramviewer.py +1 -28
- tomwer/gui/visualization/test/test_stacks.py +184 -115
- tomwer/gui/visualization/test/test_volumeviewer.py +3 -2
- tomwer/gui/visualization/tomoobjoverview.py +2 -2
- tomwer/gui/visualization/volumeoverview.py +3 -2
- tomwer/gui/visualization/volumeviewer.py +47 -43
- tomwer/io/__init__.py +2 -0
- tomwer/io/utils/h5pyutils.py +1 -27
- tomwer/io/utils/test/test_raw_and_processed_data.py +10 -0
- tomwer/io/utils/test/test_utils.py +67 -0
- tomwer/io/utils/utils.py +2 -31
- tomwer/resources/__init__.py +13 -33
- tomwer/resources/gui/icons/edit_downstream.svg +114 -0
- tomwer/resources/gui/icons/edit_upstream.svg +112 -0
- tomwer/resources/gui/icons/free_edition.svg +23 -0
- tomwer/resources/gui/icons/icat_gallery_opts.png +0 -0
- tomwer/resources/gui/icons/icat_gallery_opts.svg +80 -0
- tomwer/resources/gui/icons/search.png +0 -0
- tomwer/resources/gui/icons/search.svg +23 -0
- tomwer/resources/gui/icons/warning.png +0 -0
- tomwer/synctools/__init__.py +2 -0
- tomwer/synctools/axis.py +1 -27
- tomwer/synctools/darkref.py +1 -26
- tomwer/synctools/datalistener.py +1 -27
- tomwer/synctools/datatransfert.py +2 -27
- tomwer/synctools/imageloaderthread.py +1 -28
- tomwer/synctools/rsyncmanager.py +1 -25
- tomwer/synctools/saaxis.py +1 -26
- tomwer/synctools/sadeltabeta.py +1 -26
- tomwer/synctools/stacks/control/datalistener.py +1 -26
- tomwer/synctools/stacks/processingstack.py +4 -33
- tomwer/synctools/stacks/reconstruction/axis.py +6 -53
- tomwer/synctools/stacks/reconstruction/castvolume.py +12 -43
- tomwer/synctools/stacks/reconstruction/dkrefcopy.py +4 -27
- tomwer/synctools/stacks/reconstruction/nabu.py +3 -28
- tomwer/synctools/stacks/reconstruction/normalization.py +2 -27
- tomwer/synctools/stacks/reconstruction/saaxis.py +2 -27
- tomwer/synctools/stacks/reconstruction/sadeltabeta.py +2 -27
- tomwer/synctools/tests/__init__.py +0 -0
- tomwer/synctools/{test → tests}/test_darkRefs.py +16 -40
- tomwer/synctools/{test → tests}/test_foldertransfer.py +2 -33
- tomwer/synctools/utils/scanstages.py +2 -31
- tomwer/tests/__init__.py +1 -0
- tomwer/tests/app/test_stitching.py +95 -0
- tomwer/tests/datasets.py +1 -5
- tomwer/tests/orangecontrib/tomwer/widgets/cluster/tests/test_future_supervisorow.py +48 -0
- tomwer/tests/orangecontrib/tomwer/widgets/cluster/tests/test_slurm_clusterow.py +40 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_advancement.py +8 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_data_validator.py +55 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datadiscovery.py +129 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datalistener.py +111 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_dataselector.py +69 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datawatcher.py +411 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_emailow.py +29 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_notifier.py +24 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_nxtomo_concatenate_ow.py +64 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_nxtomomill.py +133 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_reduce_dark_flat_selector.py +40 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_singletomoobj.py +40 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_timerow.py +25 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_tomoobj_series.py +96 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_volume_selector.py +69 -0
- orangecontrib/tomwer/widgets/edit/test/test_image_key_editor.py → tomwer/tests/orangecontrib/tomwer/widgets/debugtools/tests/test_dataset_generator.py +17 -16
- tomwer/tests/orangecontrib/tomwer/widgets/debugtools/tests/test_object_inspector.py +36 -0
- {orangecontrib/tomwer/widgets/edit/test → tomwer/tests/orangecontrib/tomwer/widgets/edit/tests}/test_dark_flat_patch.py +1 -27
- tomwer/tests/orangecontrib/tomwer/widgets/edit/tests/test_image_key_editor.py +30 -0
- tomwer/tests/orangecontrib/tomwer/widgets/edit/tests/test_nxtomo_editor.py +138 -0
- tomwer/tests/orangecontrib/tomwer/widgets/other/tests/test_pythonscript.py +31 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_axis.py +199 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_cast_volumeow.py +58 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_dark_refs_widget.py +136 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_delta_beta_selector.py +15 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_i_norm.py +200 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_helical_prepare_weights_double.py +20 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_volume.py +74 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_widget.py +107 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_sa_delta_beta.py +194 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_saaxis.py +194 -0
- tomwer/tests/orangecontrib/tomwer/widgets/stitching/tests/test_zstitching.py +313 -0
- tomwer/tests/orangecontrib/tomwer/widgets/tests/test_conditions.py +85 -0
- tomwer/tests/orangecontrib/tomwer/widgets/tests/test_darkref.py +225 -0
- tomwer/tests/orangecontrib/tomwer/widgets/tests/test_foldertransfert.py +105 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_dataviewerow.py +57 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_diffviewerow.py +39 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_nxtomo_metadata_viewer.py +29 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_radio_stackow.py +31 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_sample_movedow.py +46 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_sinogram_viewerow.py +31 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_slice_stackow.py +31 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_volume_viewerow.py +32 -0
- tomwer/tests/test_ewoks/test_conversion.py +104 -0
- tomwer/tests/test_ewoks/test_single_node_execution.py +87 -0
- tomwer/tests/test_ewoks/test_workflows.py +138 -0
- tomwer/utils.py +11 -39
- tomwer/version.py +2 -2
- {tomwer-1.3.26.dist-info → tomwer-1.4.0.dist-info}/LICENSE +3 -3
- tomwer-1.4.0.dist-info/METADATA +337 -0
- tomwer-1.4.0.dist-info/RECORD +912 -0
- {tomwer-1.3.26.dist-info → tomwer-1.4.0.dist-info}/WHEEL +1 -1
- {tomwer-1.3.26.dist-info → tomwer-1.4.0.dist-info}/entry_points.txt +1 -0
- orangecontrib/tomwer/widgets/control/DataListOW.py +0 -129
- orangecontrib/tomwer/widgets/control/TomoObjSerieOW.py +0 -86
- orangecontrib/tomwer/widgets/control/VolumeSymLinkOW.py +0 -182
- orangecontrib/tomwer/widgets/edit/test/test_nxtomo_editor.py +0 -141
- orangecontrib/tomwer/widgets/icat/PublishProcessedDataOW.py +0 -115
- orangecontrib/tomwer/widgets/icat/RawDataScreenshotCreatorOW.py +0 -98
- orangecontrib/tomwer/widgets/icat/SaveToGalleryAndPublishOW.py +0 -129
- orangecontrib/tomwer/widgets/icat/icons/add_gallery.png +0 -0
- orangecontrib/tomwer/widgets/icat/icons/add_gallery.svg +0 -82
- orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.png +0 -0
- orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.svg +0 -143
- orangecontrib/tomwer/widgets/visualization/LivesliceOW.py +0 -87
- orangecontrib/tomwer/widgets/visualization/icons/liveslice.png +0 -0
- orangecontrib/tomwer/widgets/visualization/icons/liveslice.svg +0 -110
- tomwer/core/log/logger.py +0 -130
- tomwer/core/process/control/test/test_volume_link.py +0 -74
- tomwer/core/process/control/tomoobjserie.py +0 -12
- tomwer/core/process/control/volumesymlink.py +0 -200
- tomwer/core/process/icat/createscreenshots.py +0 -100
- tomwer/core/process/icat/gallery.py +0 -377
- tomwer/core/process/icat/icatbase.py +0 -36
- tomwer/core/process/icat/publish.py +0 -228
- tomwer/core/process/icat/screenshots.py +0 -27
- tomwer/core/process/reconstruction/test/test_darkref.py +0 -60
- tomwer/core/process/reconstruction/test/test_sadeltabeta.py +0 -74
- tomwer/core/process/test/test_axis.py +0 -309
- tomwer/core/process/visualization/liveslice.py +0 -6
- tomwer/core/progress.py +0 -100
- tomwer/core/scan/test/test_edf.py +0 -53
- tomwer/core/scan/test/test_future_scan.py +0 -61
- tomwer/core/scan/test/test_h5.py +0 -96
- tomwer/core/scan/test/test_process_registration.py +0 -109
- tomwer/core/test/test_scanutils.py +0 -53
- tomwer/gui/control/emailnotifier.py +0 -174
- tomwer/gui/control/serie/seriewaiter.py +0 -28
- tomwer/gui/control/test/__init__.py +0 -28
- tomwer/gui/control/test/test_datalist.py +0 -96
- tomwer/gui/control/test/test_datavalidator.py +0 -54
- tomwer/gui/control/test/test_email.py +0 -35
- tomwer/gui/control/test/test_process_manager.py +0 -65
- tomwer/gui/control/test/test_scanselector.py +0 -67
- tomwer/gui/edit/test/__init__.py +0 -28
- tomwer/gui/icat/gallery.py +0 -214
- tomwer/gui/icat/publish.py +0 -187
- tomwer/gui/reconstruction/axis/axis.py +0 -733
- tomwer/gui/reconstruction/axis/radioaxis.py +0 -2467
- tomwer/gui/stitching/stitching.py +0 -1392
- tomwer/gui/test/__init__.py +0 -28
- tomwer/gui/test/test_axis_gui.py +0 -34
- tomwer/synctools/stacks/edit/darkflatpatch.py +0 -169
- tomwer/synctools/stacks/edit/imagekeyeditor.py +0 -135
- tomwer/third_part/WaitingOverlay.py +0 -110
- tomwer-1.3.26-py3.11-nspkg.pth +0 -1
- tomwer-1.3.26.dist-info/METADATA +0 -292
- tomwer-1.3.26.dist-info/RECORD +0 -785
- tomwer-1.3.26.dist-info/namespace_packages.txt +0 -1
- /orangecontrib/tomwer/{widgets/edit/test → tests}/__init__.py +0 -0
- {tomwer/core/process/control/test → orangecontrib/tomwer/tutorials/id16b}/__init__.py +0 -0
- {tomwer/core/process/icat → orangecontrib/tomwer/widgets/cluster/tests}/__init__.py +0 -0
- /orangecontrib/tomwer/widgets/control/icons/{tomoobjserie.png → tomoobjseries.png} +0 -0
- {tomwer/core/process/reconstruction/test → orangecontrib/tomwer/widgets/control/tests}/__init__.py +0 -0
- /orangecontrib/tomwer/widgets/{icat → dataportal}/icons/publish_processed_data.png +0 -0
- /orangecontrib/tomwer/widgets/{icat → dataportal}/icons/publish_processed_data.svg +0 -0
- {tomwer/core/process/test → orangecontrib/tomwer/widgets/debugtools/tests}/__init__.py +0 -0
- {tomwer/core/scan/test → orangecontrib/tomwer/widgets/edit/tests}/__init__.py +0 -0
- {tomwer/core/test → orangecontrib/tomwer/widgets/other/tests}/__init__.py +0 -0
- {tomwer/gui/cluster/test → orangecontrib/tomwer/widgets/reconstruction/tests}/__init__.py +0 -0
- {tomwer/gui/control/serie → orangecontrib/tomwer/widgets/stitching/tests}/__init__.py +0 -0
- {tomwer/gui/icat → orangecontrib/tomwer/widgets/tests}/__init__.py +0 -0
- {tomwer/gui/reconstruction/test → orangecontrib/tomwer/widgets/visualization/tests}/__init__.py +0 -0
- /tomwer/{synctools/stacks/edit → app/stitching}/__init__.py +0 -0
- /tomwer/{synctools/test → core/process/control/tests}/__init__.py +0 -0
- /tomwer/core/process/control/{test → tests}/test_email.py +0 -0
- /tomwer/core/process/control/{test → tests}/test_h52nx_process.py +0 -0
- /tomwer/{third_part → core/process/drac}/__init__.py +0 -0
- /tomwer/core/process/reconstruction/{test → tests}/test_axis_params.py +0 -0
- /tomwer/core/process/reconstruction/{test → tests}/test_darkref_copy.py +0 -0
- /tomwer/core/process/reconstruction/{test → tests}/test_paramsbase.py +0 -0
- /tomwer/core/scan/{test → tests}/test_scan.py +0 -0
- /tomwer/gui/control/{serie → series}/nxtomoconcatenate.py +0 -0
- /tomwer/gui/control/{test → tests}/test_datadiscovery.py +0 -0
- /tomwer/gui/control/{test → tests}/test_reducedarkflat_selector.py +0 -0
- /tomwer/gui/control/{test → tests}/test_single_tomo_obj.py +0 -0
- {orangecontrib/tomwer/widgets/edit/test → tomwer/tests/orangecontrib/tomwer/widgets/edit/tests}/test_image_key_upgrader.py +0 -0
- {tomwer-1.3.26.dist-info → tomwer-1.4.0.dist-info}/top_level.txt +0 -0
tomwer/gui/edit/nxtomoeditor.py
CHANGED
@@ -1,25 +1,15 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
1
3
|
import logging
|
2
4
|
import weakref
|
3
|
-
from typing import Optional
|
4
|
-
from functools import lru_cache as cache
|
5
5
|
|
6
|
-
import h5py
|
7
6
|
import numpy
|
8
7
|
from silx.gui import qt
|
9
|
-
from silx.io.utils import h5py_read_dataset
|
10
|
-
from silx.io.dictdump import dicttonx
|
11
|
-
|
12
|
-
from tomoscan.io import HDF5File
|
13
|
-
from nxtomo.paths.nxtomo import get_paths as get_nexus_paths
|
14
|
-
from nxtomo.nxobject.nxdetector import ImageKey
|
15
|
-
from nxtomo.nxobject.nxdetector import FOV
|
16
|
-
from nxtomo.nxobject.nxtransformations import NXtransformations
|
17
|
-
from nxtomo.utils.transformation import (
|
18
|
-
build_matrix,
|
19
|
-
UDDetTransformation,
|
20
|
-
LRDetTransformation,
|
21
|
-
)
|
22
8
|
|
9
|
+
from nxtomo.nxobject.nxdetector import ImageKey, FOV
|
10
|
+
from nxtomo.utils.transformation import build_matrix
|
11
|
+
|
12
|
+
from tomwer.core.process.edit.nxtomoeditor import NXtomoEditorTask, NXtomoEditorKeys
|
23
13
|
from tomwer.core.scan.nxtomoscan import NXtomoScan
|
24
14
|
from tomwer.gui.utils.buttons import PadlockButton
|
25
15
|
from tomwer.gui.utils.scandescription import ScanNameLabelAndShape
|
@@ -30,6 +20,10 @@ _logger = logging.getLogger(__name__)
|
|
30
20
|
|
31
21
|
|
32
22
|
class NXtomoEditorDialog(qt.QDialog):
|
23
|
+
"""
|
24
|
+
Dialog embedding instances of NXtomoEditor and NXtomoProxyWarmer
|
25
|
+
"""
|
26
|
+
|
33
27
|
def __init__(self, parent=None, hide_lockers=True) -> None:
|
34
28
|
super().__init__(parent)
|
35
29
|
self.setLayout(qt.QVBoxLayout())
|
@@ -46,33 +40,40 @@ class NXtomoEditorDialog(qt.QDialog):
|
|
46
40
|
self.layout().addWidget(self._buttons)
|
47
41
|
|
48
42
|
# expose API
|
49
|
-
def setScan(self, scan):
|
43
|
+
def setScan(self, scan: NXtomoScan) -> None:
|
50
44
|
self.mainWidget.setScan(scan)
|
51
45
|
self._warmer.setScan(scan)
|
52
46
|
|
53
|
-
def overwriteNXtomo(self):
|
54
|
-
self.mainWidget.overwriteNXtomo()
|
55
|
-
|
56
47
|
def hasLockField(self) -> bool:
|
57
48
|
return self.mainWidget.hasLockField()
|
58
49
|
|
59
50
|
def getConfiguration(self) -> dict:
|
60
51
|
return self.mainWidget.getConfiguration()
|
61
52
|
|
62
|
-
def setConfiguration(self, config):
|
53
|
+
def setConfiguration(self, config: dict) -> None:
|
63
54
|
self.mainWidget.setConfiguration(config)
|
64
55
|
|
56
|
+
def getConfigurationForTask(self) -> dict:
|
57
|
+
return self.mainWidget.getConfigurationForTask()
|
58
|
+
|
65
59
|
|
66
60
|
class NXtomoEditor(qt.QWidget):
|
67
61
|
"""
|
68
|
-
|
62
|
+
Widget to edit a set of field from a NXtomo.
|
69
63
|
The preliminary goal is to let the user define pixel / voxel position and x and z positions
|
70
64
|
in order to simplify stitching down the line
|
71
65
|
|
72
|
-
As energy and
|
66
|
+
As energy and field of view was also often requested this part is also editable.
|
67
|
+
|
68
|
+
Each field contains a widget to define it values and a LockButton. The LockButton can be used to automate the
|
69
|
+
processing.
|
70
|
+
|
71
|
+
When the scan to edit is set each field widget will be updated **at the condition** the field is not locked.
|
72
|
+
Else existing value will be kept.
|
73
73
|
"""
|
74
74
|
|
75
75
|
sigEditingFinished = qt.Signal()
|
76
|
+
"""emit when edition is finished"""
|
76
77
|
|
77
78
|
def __init__(self, parent=None, hide_lockers=True):
|
78
79
|
super().__init__(parent)
|
@@ -227,70 +228,40 @@ class NXtomoEditor(qt.QWidget):
|
|
227
228
|
self._yFlippedCB.toggled.connect(self._editingFinished)
|
228
229
|
self._yFlippedLB.toggled.connect(self._editingFinished)
|
229
230
|
|
230
|
-
def
|
231
|
-
self.sigEditingFinished.emit()
|
232
|
-
|
233
|
-
def hasLockField(self) -> bool:
|
234
|
-
"""return True if the widget has at least one lock field"""
|
235
|
-
return True in [locker.isLocked() for locker in self._lockerPBs]
|
236
|
-
|
237
|
-
def hideLockers(self, hide: bool):
|
238
|
-
for locker in self._lockerPBs:
|
239
|
-
locker.setVisible(not hide)
|
240
|
-
|
241
|
-
def getEditableWidgets(self):
|
242
|
-
return self._editableWidgets
|
243
|
-
|
244
|
-
def setScan(self, scan):
|
245
|
-
if scan is None:
|
246
|
-
self._scan = scan
|
247
|
-
elif not isinstance(scan, NXtomoScan):
|
248
|
-
raise TypeError(
|
249
|
-
f"{scan} is expected to be an instance of {NXtomoScan}. Not {type(scan)}"
|
250
|
-
)
|
251
|
-
else:
|
252
|
-
self._scan = weakref.ref(scan)
|
253
|
-
self._scanInfoQLE.setScan(scan)
|
254
|
-
# scan will only be read and not kept
|
255
|
-
self.update_tree()
|
256
|
-
|
257
|
-
def getScan(self):
|
258
|
-
if self._scan is None or self._scan() is None:
|
259
|
-
return None
|
260
|
-
else:
|
261
|
-
return self._scan()
|
262
|
-
|
263
|
-
def update_tree(self):
|
231
|
+
def update_tree(self) -> None:
|
264
232
|
if self.getScan() is not None:
|
265
|
-
|
266
|
-
|
267
|
-
self._updateSample,
|
268
|
-
):
|
269
|
-
try:
|
270
|
-
fct()
|
271
|
-
except Exception as e:
|
272
|
-
_logger.info(e)
|
233
|
+
self._updateInstrument()
|
234
|
+
self._updateSample()
|
273
235
|
self._tree.resizeColumnToContents(0)
|
274
236
|
|
275
|
-
def _updateInstrument(self):
|
237
|
+
def _updateInstrument(self) -> None:
|
276
238
|
scan = self.getScan()
|
277
239
|
if scan is None:
|
278
240
|
return
|
279
241
|
else:
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
242
|
+
for name, fct in {
|
243
|
+
"energy": self._updateEnergy,
|
244
|
+
"pixel size": self._updatePixelSize,
|
245
|
+
"frame flips": self._updateFlipped,
|
246
|
+
"field of view": self._updateFieldOfView,
|
247
|
+
"sample-detector distance": self._updateDistance,
|
248
|
+
}.items():
|
249
|
+
try:
|
250
|
+
fct(scan=scan)
|
251
|
+
except Exception as e:
|
252
|
+
_logger.error(f"Failed to update {name}. Error is {e}")
|
285
253
|
|
286
|
-
def _updateSample(self):
|
254
|
+
def _updateSample(self) -> None:
|
287
255
|
scan = self.getScan()
|
288
256
|
if scan is None:
|
289
257
|
return
|
290
258
|
else:
|
291
|
-
|
259
|
+
try:
|
260
|
+
self._updateTranslations(scan=scan)
|
261
|
+
except Exception as e:
|
262
|
+
_logger.error(f"Fail to update translations. Error is {e}")
|
292
263
|
|
293
|
-
def _updateTranslations(self, scan: NXtomoScan):
|
264
|
+
def _updateTranslations(self, scan: NXtomoScan) -> None:
|
294
265
|
assert isinstance(scan, NXtomoScan)
|
295
266
|
|
296
267
|
# note: for now and in order to allow edition we expect to have at most a unique value. Will fail for helicoidal
|
@@ -313,32 +284,14 @@ class NXtomoEditor(qt.QWidget):
|
|
313
284
|
self._xTranslationQLE.setValue(x_translation)
|
314
285
|
self._zTranslationQLE.setValue(z_translation)
|
315
286
|
|
316
|
-
def _updateFieldOfView(self, scan):
|
287
|
+
def _updateFieldOfView(self, scan: NXtomoScan) -> None:
|
317
288
|
if not self._fieldOfViewLB.isLocked():
|
318
289
|
# if in ''auto mode: we want to overwrite the NXtomo existing value by the one of the GUI
|
319
290
|
idx = self._fieldOfViewCB.findText(FOV.from_value(scan.field_of_view).value)
|
320
291
|
if idx > 0:
|
321
292
|
self._fieldOfViewCB.setCurrentIndex(idx)
|
322
293
|
|
323
|
-
|
324
|
-
@cache(maxsize=None)
|
325
|
-
def _get_UD_flip_matrix():
|
326
|
-
return UDDetTransformation().as_matrix()
|
327
|
-
|
328
|
-
@staticmethod
|
329
|
-
@cache(maxsize=None)
|
330
|
-
def _get_LR_flip_matrix():
|
331
|
-
return LRDetTransformation().as_matrix()
|
332
|
-
|
333
|
-
@staticmethod
|
334
|
-
@cache(maxsize=None)
|
335
|
-
def _get_UD_AND_LR_flip_matrix():
|
336
|
-
return numpy.matmul(
|
337
|
-
NXtomoEditor._get_UD_flip_matrix(),
|
338
|
-
NXtomoEditor._get_LR_flip_matrix(),
|
339
|
-
)
|
340
|
-
|
341
|
-
def _updateFlipped(self, scan):
|
294
|
+
def _updateFlipped(self, scan: NXtomoScan) -> None:
|
342
295
|
transformations = list(scan.get_detector_transformations(tuple()))
|
343
296
|
transformation_matrix_det_space = build_matrix(transformations)
|
344
297
|
if transformation_matrix_det_space is None or numpy.allclose(
|
@@ -347,17 +300,17 @@ class NXtomoEditor(qt.QWidget):
|
|
347
300
|
flip_ud = False
|
348
301
|
flip_lr = False
|
349
302
|
elif numpy.array_equal(
|
350
|
-
transformation_matrix_det_space,
|
303
|
+
transformation_matrix_det_space, NXtomoEditorTask.Y_FLIP_MATRIX
|
351
304
|
):
|
352
305
|
flip_ud = True
|
353
306
|
flip_lr = False
|
354
307
|
elif numpy.allclose(
|
355
|
-
transformation_matrix_det_space,
|
308
|
+
transformation_matrix_det_space, NXtomoEditorTask.Z_FLIP_MATRIX
|
356
309
|
):
|
357
310
|
flip_ud = False
|
358
311
|
flip_lr = True
|
359
312
|
elif numpy.allclose(
|
360
|
-
transformation_matrix_det_space,
|
313
|
+
transformation_matrix_det_space, NXtomoEditorTask.Y_AND_Z_flip_MATRIX
|
361
314
|
):
|
362
315
|
flip_ud = True
|
363
316
|
flip_lr = True
|
@@ -372,19 +325,19 @@ class NXtomoEditor(qt.QWidget):
|
|
372
325
|
if (not self._yFlippedLB.isLocked()) and flip_ud is not None:
|
373
326
|
self._yFlippedCB.setChecked(flip_ud)
|
374
327
|
|
375
|
-
def _updateDistance(self, scan):
|
328
|
+
def _updateDistance(self, scan: NXtomoScan) -> None:
|
376
329
|
if not self._distanceLB.isLocked():
|
377
330
|
# if in ''auto mode: we want to overwrite the NXtomo existing value by the one of the GUI
|
378
331
|
self._distanceMetricEntry.setValue(scan.distance)
|
379
332
|
|
380
|
-
def _updateEnergy(self, scan):
|
333
|
+
def _updateEnergy(self, scan: NXtomoScan) -> None:
|
381
334
|
assert isinstance(scan, NXtomoScan)
|
382
335
|
if not self._energyLockerLB.isLocked():
|
383
336
|
# if in ''auto mode: we want to overwrite the NXtomo existing value by the one of the GUI
|
384
337
|
energy = scan.energy
|
385
338
|
self._energyEntry.setValue(energy)
|
386
339
|
|
387
|
-
def _updatePixelSize(self, scan):
|
340
|
+
def _updatePixelSize(self, scan: NXtomoScan) -> None:
|
388
341
|
assert isinstance(scan, NXtomoScan)
|
389
342
|
if not self._xPixelSizeLB.isLocked():
|
390
343
|
x_pixel_size = scan.x_pixel_size
|
@@ -393,6 +346,39 @@ class NXtomoEditor(qt.QWidget):
|
|
393
346
|
y_pixel_size = scan.y_pixel_size
|
394
347
|
self._yPixelSizeMetricEntry.setValue(y_pixel_size)
|
395
348
|
|
349
|
+
def _editingFinished(self, *args, **kwargs):
|
350
|
+
self.sigEditingFinished.emit()
|
351
|
+
|
352
|
+
def hasLockField(self) -> bool:
|
353
|
+
"""return True if the widget has at least one lock field"""
|
354
|
+
return True in [locker.isLocked() for locker in self._lockerPBs]
|
355
|
+
|
356
|
+
def hideLockers(self, hide: bool) -> None:
|
357
|
+
for locker in self._lockerPBs:
|
358
|
+
locker.setVisible(not hide)
|
359
|
+
|
360
|
+
def getEditableWidgets(self) -> tuple[qt.QWidget]:
|
361
|
+
return tuple(self._editableWidgets)
|
362
|
+
|
363
|
+
def setScan(self, scan: NXtomoScan | None) -> None:
|
364
|
+
if scan is None:
|
365
|
+
self._scan = scan
|
366
|
+
elif not isinstance(scan, NXtomoScan):
|
367
|
+
raise TypeError(
|
368
|
+
f"{scan} is expected to be an instance of {NXtomoScan}. Not {type(scan)}"
|
369
|
+
)
|
370
|
+
else:
|
371
|
+
self._scan = weakref.ref(scan)
|
372
|
+
self._scanInfoQLE.setScan(scan)
|
373
|
+
# scan will only be read and not kept
|
374
|
+
self.update_tree()
|
375
|
+
|
376
|
+
def getScan(self) -> NXtomoScan | None:
|
377
|
+
if self._scan is None or self._scan() is None:
|
378
|
+
return None
|
379
|
+
else:
|
380
|
+
return self._scan()
|
381
|
+
|
396
382
|
def getConfiguration(self) -> dict:
|
397
383
|
"""
|
398
384
|
Return a dict with field full name as key
|
@@ -401,37 +387,39 @@ class NXtomoEditor(qt.QWidget):
|
|
401
387
|
limitation: for now sample position are not handled because this is a 'corner case' for now
|
402
388
|
"""
|
403
389
|
return {
|
404
|
-
|
390
|
+
NXtomoEditorKeys.ENERGY: (
|
405
391
|
self._energyEntry.getValue(),
|
406
392
|
self._energyLockerLB.isLocked(),
|
407
393
|
),
|
408
|
-
|
394
|
+
NXtomoEditorKeys.X_PIXEL_SIZE: (
|
409
395
|
self._xPixelSizeMetricEntry.getValue(),
|
410
396
|
self._xPixelSizeLB.isLocked(),
|
411
397
|
),
|
412
|
-
|
398
|
+
NXtomoEditorKeys.Y_PIXEL_SIZE: (
|
413
399
|
self._yPixelSizeMetricEntry.getValue(),
|
414
400
|
self._yPixelSizeLB.isLocked(),
|
415
401
|
),
|
416
|
-
|
402
|
+
NXtomoEditorKeys.SAMPLE_DETECTOR_DISTANCE: (
|
417
403
|
self._distanceMetricEntry.getValue(),
|
418
404
|
self._distanceLB.isLocked(),
|
419
405
|
),
|
420
|
-
|
406
|
+
NXtomoEditorKeys.FIELD_OF_VIEW: (
|
421
407
|
self._fieldOfViewCB.currentText(),
|
422
408
|
self._fieldOfViewLB.isChecked(),
|
423
409
|
),
|
424
|
-
|
410
|
+
NXtomoEditorKeys.X_FLIPPED: (
|
425
411
|
self._xFlippedCB.isChecked(),
|
426
412
|
self._xFlippedLB.isChecked(),
|
427
413
|
),
|
428
|
-
|
414
|
+
NXtomoEditorKeys.Y_FLIPPED: (
|
429
415
|
self._yFlippedCB.isChecked(),
|
430
416
|
self._yFlippedLB.isChecked(),
|
431
417
|
),
|
418
|
+
NXtomoEditorKeys.X_TRANSLATION: (self._xTranslationQLE.getValue(),),
|
419
|
+
NXtomoEditorKeys.Z_TRANSLATION: (self._zTranslationQLE.getValue(),),
|
432
420
|
}
|
433
421
|
|
434
|
-
def setConfiguration(self, config: dict):
|
422
|
+
def setConfiguration(self, config: dict) -> None:
|
435
423
|
energy = config.get("instrument.beam.energy", None)
|
436
424
|
if energy is not None:
|
437
425
|
energy, energy_locked = energy
|
@@ -476,201 +464,27 @@ class NXtomoEditor(qt.QWidget):
|
|
476
464
|
self._yFlippedCB.setChecked(y_flipped)
|
477
465
|
self._yFlippedLB.setLock(y_flipped_locked)
|
478
466
|
|
479
|
-
def
|
480
|
-
self._tree.clear()
|
481
|
-
|
482
|
-
def overwriteNXtomo(self):
|
483
|
-
"""overwrite data on disk"""
|
484
|
-
scan = self.getScan()
|
485
|
-
if scan is None:
|
486
|
-
_logger.warning("no scan found to be saved")
|
487
|
-
return
|
488
|
-
nexus_paths = get_nexus_paths(scan.nexus_version)
|
489
|
-
assert isinstance(scan, NXtomoScan)
|
490
|
-
with HDF5File(scan.master_file, mode="a") as h5f:
|
491
|
-
entry = h5f[scan.entry]
|
492
|
-
# overwrite energy
|
493
|
-
energy = self._energyEntry.getValue()
|
494
|
-
self.__write_to_file(
|
495
|
-
entry=entry,
|
496
|
-
path=nexus_paths.ENERGY_PATH,
|
497
|
-
value=energy,
|
498
|
-
name="energy",
|
499
|
-
expected_type=float,
|
500
|
-
units="kev",
|
501
|
-
)
|
502
|
-
# overwrite x pixel size
|
503
|
-
self.__write_to_file(
|
504
|
-
entry=entry,
|
505
|
-
path=nexus_paths.X_PIXEL_SIZE_PATH,
|
506
|
-
value=self._xPixelSizeMetricEntry.getValue(),
|
507
|
-
name="x pixel size",
|
508
|
-
expected_type=float,
|
509
|
-
units="m",
|
510
|
-
)
|
511
|
-
# overwrite y pixel size
|
512
|
-
self.__write_to_file(
|
513
|
-
entry=entry,
|
514
|
-
path=nexus_paths.Y_PIXEL_SIZE_PATH,
|
515
|
-
value=self._yPixelSizeMetricEntry.getValue(),
|
516
|
-
name="y pixel size",
|
517
|
-
expected_type=float,
|
518
|
-
units="m",
|
519
|
-
)
|
520
|
-
n_frames = len(scan.image_key_control)
|
521
|
-
|
522
|
-
# overwrite x translation
|
523
|
-
self.__write_to_file(
|
524
|
-
entry=entry,
|
525
|
-
path=nexus_paths.X_TRANS_PATH,
|
526
|
-
value=self._xTranslationQLE.getValue(),
|
527
|
-
name="x translation",
|
528
|
-
expected_type=float,
|
529
|
-
n_value=n_frames,
|
530
|
-
units="m",
|
531
|
-
)
|
532
|
-
# overwrite z translation
|
533
|
-
self.__write_to_file(
|
534
|
-
entry=entry,
|
535
|
-
path=nexus_paths.Z_TRANS_PATH,
|
536
|
-
value=self._zTranslationQLE.getValue(),
|
537
|
-
name="z translation",
|
538
|
-
expected_type=float,
|
539
|
-
n_value=n_frames,
|
540
|
-
units="m",
|
541
|
-
)
|
542
|
-
# overwrite sample detector distance
|
543
|
-
self.__write_to_file(
|
544
|
-
entry=entry,
|
545
|
-
path=nexus_paths.DISTANCE_PATH,
|
546
|
-
value=self._distanceMetricEntry.getValue(),
|
547
|
-
name="z translation",
|
548
|
-
expected_type=float,
|
549
|
-
units="m",
|
550
|
-
)
|
551
|
-
# overwrite FOV
|
552
|
-
self.__write_to_file(
|
553
|
-
entry=entry,
|
554
|
-
path=nexus_paths.FOV_PATH,
|
555
|
-
value=self._fieldOfViewCB.currentText(),
|
556
|
-
name="field of view",
|
557
|
-
expected_type=str,
|
558
|
-
)
|
559
|
-
|
560
|
-
# solve NXtranformations
|
561
|
-
nx_transformations = NXtransformations()
|
562
|
-
if self._xFlippedCB.isChecked():
|
563
|
-
nx_transformations.add_transformation(LRDetTransformation())
|
564
|
-
if self._yFlippedCB.isChecked():
|
565
|
-
nx_transformations.add_transformation(UDDetTransformation())
|
566
|
-
|
567
|
-
nx_dict = nx_transformations.to_nx_dict(
|
568
|
-
nexus_path_version=scan.nexus_version,
|
569
|
-
data_path="/".join(
|
570
|
-
(
|
571
|
-
nexus_paths.INSTRUMENT_PATH,
|
572
|
-
nexus_paths.nx_instrument_paths.DETECTOR_PATH,
|
573
|
-
)
|
574
|
-
),
|
575
|
-
solve_empty_dependency=True,
|
576
|
-
)
|
577
|
-
if nexus_paths.nx_detector_paths.NX_TRANSFORMATIONS is not None:
|
578
|
-
# old NXtomo are not handling NX_TRANSFORMATIONS
|
579
|
-
detector_transformation_path = "/".join(
|
580
|
-
(
|
581
|
-
nexus_paths.INSTRUMENT_PATH,
|
582
|
-
nexus_paths.nx_instrument_paths.DETECTOR_PATH,
|
583
|
-
nexus_paths.nx_detector_paths.NX_TRANSFORMATIONS,
|
584
|
-
),
|
585
|
-
)
|
586
|
-
if detector_transformation_path in entry:
|
587
|
-
del entry[detector_transformation_path]
|
588
|
-
|
589
|
-
detector_transformation_path = "/".join(
|
590
|
-
(scan.entry, detector_transformation_path)
|
591
|
-
)
|
592
|
-
else:
|
593
|
-
_logger.debug(
|
594
|
-
"Old version of NXtomo found. No information about transformation will be saved"
|
595
|
-
)
|
596
|
-
detector_transformation_path = None
|
597
|
-
|
598
|
-
if detector_transformation_path is not None:
|
599
|
-
dicttonx(
|
600
|
-
nx_dict,
|
601
|
-
h5file=scan.master_file,
|
602
|
-
h5path=detector_transformation_path,
|
603
|
-
update_mode="replace",
|
604
|
-
mode="a",
|
605
|
-
)
|
606
|
-
|
607
|
-
# clear caches to make sure all modifications will be considered
|
608
|
-
scan.clear_caches()
|
609
|
-
scan.clear_frames_caches()
|
610
|
-
|
611
|
-
@staticmethod
|
612
|
-
def _newValueIsExistingValue(dataset: h5py.Dataset, new_value, units):
|
467
|
+
def getConfigurationForTask(self) -> dict:
|
613
468
|
"""
|
614
|
-
|
469
|
+
default configuration is stored as field: (field_value, filed_is_locked) when the task expects field_key: field_value
|
470
|
+
Because we need to be able to reload settings of the LockButton.
|
471
|
+
But the task doesn't care about it. She only want to know which field must be edited. So we need to filter the dict value.
|
615
472
|
"""
|
616
|
-
|
617
|
-
attrs = dataset.attrs
|
618
|
-
current_unit = attrs.get("units", attrs.get("unit", None))
|
619
|
-
if units != current_unit:
|
620
|
-
# if the unit is not the same, eithen if the value is the same we will overwrite it
|
621
|
-
return False
|
622
|
-
else:
|
623
|
-
if isinstance(new_value, numpy.ndarray) and isinstance(
|
624
|
-
current_value, numpy.ndarray
|
625
|
-
):
|
626
|
-
return numpy.array_equal(new_value, current_value)
|
627
|
-
elif numpy.isscalar(current_value) and numpy.isscalar(new_value):
|
628
|
-
return current_value == new_value
|
629
|
-
else:
|
630
|
-
return False
|
631
|
-
|
632
|
-
@staticmethod
|
633
|
-
def __write_to_file(
|
634
|
-
entry: h5py.Group, path: str, value, name, expected_type, n_value=1, units=None
|
635
|
-
):
|
636
|
-
if path is None:
|
637
|
-
# if the path does not exists (no handled by this version of nexus for example)
|
638
|
-
return
|
473
|
+
return {key: value[0] for key, value in self.getConfiguration().items()}
|
639
474
|
|
640
|
-
|
641
|
-
|
642
|
-
value = value.replace(" ", "")
|
643
|
-
if value.lower() == "none" or "..." in value:
|
644
|
-
# if value is not defined or is an array not overwrite by the user (case of the ... )
|
645
|
-
return
|
646
|
-
elif value is None:
|
647
|
-
pass
|
648
|
-
else:
|
649
|
-
try:
|
650
|
-
value = expected_type(value)
|
651
|
-
except (ValueError, TypeError) as e:
|
652
|
-
_logger.error(f"Fail to overwrite {name} of {entry.name}. Error is {e}")
|
653
|
-
return
|
654
|
-
|
655
|
-
if path in entry:
|
656
|
-
if NXtomoEditor._newValueIsExistingValue(
|
657
|
-
dataset=entry[path], new_value=value, units=units
|
658
|
-
):
|
659
|
-
# if no need to overwrite
|
660
|
-
return
|
661
|
-
else:
|
662
|
-
del entry[path]
|
663
|
-
if value is None:
|
664
|
-
return
|
665
|
-
elif n_value == 1:
|
666
|
-
entry[path] = value
|
667
|
-
else:
|
668
|
-
entry[path] = numpy.array([value] * n_value)
|
669
|
-
if units is not None:
|
670
|
-
entry[path].attrs["units"] = units
|
475
|
+
def clear(self) -> None:
|
476
|
+
self._tree.clear()
|
671
477
|
|
672
478
|
|
673
479
|
class _TranslationMetricEntry(MetricEntry):
|
480
|
+
"""
|
481
|
+
Widget to define a translation along one axis.
|
482
|
+
|
483
|
+
The behavior is limited at the moment.
|
484
|
+
* either the array contains a unique value on the array and a float is displayed
|
485
|
+
* either the array contains several unique values and then '...' will be displayed. Users cannot provide an array in this case.
|
486
|
+
"""
|
487
|
+
|
674
488
|
LOADED_ARRAY = "loaded array"
|
675
489
|
|
676
490
|
class TranslationValidator(qt.QDoubleValidator):
|
@@ -688,11 +502,10 @@ class _TranslationMetricEntry(MetricEntry):
|
|
688
502
|
super().__init__(name, default_unit=default_unit, parent=parent)
|
689
503
|
self._qlePixelSize.setValidator(self.TranslationValidator(self))
|
690
504
|
|
691
|
-
def getValue(self):
|
505
|
+
def getValue(self) -> float:
|
692
506
|
"""
|
693
507
|
|
694
508
|
:return: the value in meter
|
695
|
-
:rtype: float
|
696
509
|
"""
|
697
510
|
if "..." in self._qlePixelSize.text():
|
698
511
|
# in this case this is the representation of an array, we don;t wan't to overwrite it
|
@@ -715,7 +528,7 @@ class EnergyEntry(qt.QLineEdit):
|
|
715
528
|
a0 = str(a0)
|
716
529
|
super().setText(a0)
|
717
530
|
|
718
|
-
def getValue(self) ->
|
531
|
+
def getValue(self) -> float | None:
|
719
532
|
txt = self.text().replace(" ", "")
|
720
533
|
if txt in ("unknown", ""):
|
721
534
|
return None
|
tomwer/gui/edit/nxtomowarmer.py
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
from
|
1
|
+
from __future__ import annotations
|
2
|
+
|
2
3
|
import h5py
|
3
4
|
from silx.gui import qt
|
4
5
|
from silx.io.utils import open as open_hdf5
|
@@ -41,7 +42,7 @@ class NXtomoProxyWarmer(qt.QWidget):
|
|
41
42
|
# set up
|
42
43
|
self.setScan(None)
|
43
44
|
|
44
|
-
def setScan(self, scan:
|
45
|
+
def setScan(self, scan: NXtomoScan | None):
|
45
46
|
if scan is None:
|
46
47
|
self._activateWarning(False)
|
47
48
|
elif isinstance(scan, NXtomoScan):
|
File without changes
|
@@ -1,31 +1,5 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
|
3
|
-
#
|
4
|
-
# Copyright (c) 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__ = "28/10/2020"
|
2
|
+
from __future__ import annotations
|
29
3
|
|
30
4
|
|
31
5
|
import shutil
|
@@ -167,8 +141,8 @@ class TestDarkRefPatchWidget(TestCaseQt):
|
|
167
141
|
file_path=self._scanWithDarkAndRef.master_file,
|
168
142
|
data_path=self._scanWithDarkAndRef.entry,
|
169
143
|
)
|
170
|
-
self._widget.setStartDarkUrl(url,
|
171
|
-
self._widget.setStartFlatUrl(url,
|
144
|
+
self._widget.setStartDarkUrl(url, series_index=0)
|
145
|
+
self._widget.setStartFlatUrl(url, series_index=1)
|
172
146
|
self.assertTrue(self._widget.getStartDarkUrl() is not None)
|
173
147
|
self.assertTrue(self._widget.getStartDarkUrl().is_valid())
|
174
148
|
self.assertTrue(self._widget.getStartFlatUrl() is not None)
|
@@ -1,31 +1,5 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
|
3
|
-
#
|
4
|
-
# Copyright (c) 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__ = "28/10/2020"
|
2
|
+
from __future__ import annotations
|
29
3
|
|
30
4
|
|
31
5
|
import tempfile
|