tomwer 1.3.26__py3-none-any.whl → 1.4.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- orangecontrib/tomwer/orange/managedprocess.py +1 -29
- orangecontrib/tomwer/orange/settings.py +2 -28
- orangecontrib/tomwer/tests/TestAcquisition.py +220 -0
- orangecontrib/tomwer/tutorials/append_raw_darks_and_flats_frames_to_NXtomos.ows +2 -2
- orangecontrib/tomwer/tutorials/copy_reduced_darks_and_flats_meth1.ows +1 -1
- orangecontrib/tomwer/tutorials/{icat_publication.ows → drac_publication.ows} +7 -21
- orangecontrib/tomwer/tutorials/id16b/ID16b_full_volume.ows +22 -0
- orangecontrib/tomwer/tutorials/id16b/ID16b_insitu.ows +302 -0
- orangecontrib/tomwer/tutorials/id16b/ID16b_normalization.ows +218 -0
- orangecontrib/tomwer/tutorials/simple_volume_to_slurm_reconstruction.ows +29 -24
- orangecontrib/tomwer/tutorials/test_cor.ows +19 -0
- orangecontrib/tomwer/tutorials/volume_casting_on_slurm.ows +54 -0
- orangecontrib/tomwer/widgets/__init__.py +3 -5
- orangecontrib/tomwer/widgets/cluster/FutureSupervisorOW.py +35 -54
- orangecontrib/tomwer/widgets/cluster/SlurmClusterOW.py +1 -31
- orangecontrib/tomwer/widgets/control/AdvancementOW.py +1 -29
- orangecontrib/tomwer/widgets/control/DataDiscoveryOW.py +5 -4
- orangecontrib/tomwer/widgets/control/DataListenerOW.py +1 -29
- orangecontrib/tomwer/widgets/control/DataSelectorOW.py +11 -30
- orangecontrib/tomwer/widgets/control/DataTransfertOW.py +2 -28
- orangecontrib/tomwer/widgets/control/DataValidatorOW.py +1 -28
- orangecontrib/tomwer/widgets/control/DataWatcherOW.py +1 -28
- orangecontrib/tomwer/widgets/control/EDF2NXTomomillOW.py +48 -51
- orangecontrib/tomwer/widgets/control/EmailOW.py +12 -2
- orangecontrib/tomwer/widgets/control/FilterOW.py +1 -28
- orangecontrib/tomwer/widgets/control/NXTomomillOW.py +37 -53
- orangecontrib/tomwer/widgets/control/NXtomoConcatenate.py +21 -20
- orangecontrib/tomwer/widgets/control/NotifierOW.py +9 -28
- orangecontrib/tomwer/widgets/control/ReduceDarkFlatSelectorOW.py +3 -2
- orangecontrib/tomwer/widgets/control/SingleTomoObjOW.py +1 -27
- orangecontrib/tomwer/widgets/control/TimerOW.py +9 -28
- orangecontrib/tomwer/widgets/control/TomoObjSeriesOW.py +58 -0
- orangecontrib/tomwer/widgets/control/VolumeSelector.py +8 -30
- orangecontrib/tomwer/widgets/control/icons/nxtomomill.svg +173 -119
- orangecontrib/tomwer/widgets/control/icons/reduced_darkflat_selector.png +0 -0
- orangecontrib/tomwer/widgets/control/icons/reduced_darkflat_selector.svg +55 -195
- orangecontrib/tomwer/widgets/control/icons/{tomoobjserie.svg → tomoobjseries.svg} +2 -2
- orangecontrib/tomwer/widgets/dataportal/PublishProcessedDataOW.py +172 -0
- orangecontrib/tomwer/widgets/{icat → dataportal}/__init__.py +2 -2
- orangecontrib/tomwer/widgets/debugtools/DatasetGeneratorOW.py +2 -29
- orangecontrib/tomwer/widgets/debugtools/ObjectInspectorOW.py +1 -29
- orangecontrib/tomwer/widgets/edit/DarkFlatPatchOW.py +48 -73
- orangecontrib/tomwer/widgets/edit/ImageKeyEditorOW.py +48 -75
- orangecontrib/tomwer/widgets/edit/ImageKeyUpgraderOW.py +5 -30
- orangecontrib/tomwer/widgets/edit/NXtomoEditorOW.py +51 -52
- orangecontrib/tomwer/widgets/other/PythonScriptOW.py +22 -10
- orangecontrib/tomwer/widgets/reconstruction/AxisOW.py +51 -60
- orangecontrib/tomwer/widgets/reconstruction/CastNabuVolumeOW.py +22 -68
- orangecontrib/tomwer/widgets/reconstruction/DarkRefAndCopyOW.py +3 -30
- orangecontrib/tomwer/widgets/reconstruction/NabuHelicalPrepareWeightsDoubleOW.py +21 -19
- orangecontrib/tomwer/widgets/reconstruction/NabuOW.py +7 -70
- orangecontrib/tomwer/widgets/reconstruction/NabuVolumeOW.py +41 -84
- orangecontrib/tomwer/widgets/reconstruction/SAAxisOW.py +15 -40
- orangecontrib/tomwer/widgets/reconstruction/SADeltaBetaOW.py +13 -35
- orangecontrib/tomwer/widgets/reconstruction/SinoNormOW.py +2 -30
- orangecontrib/tomwer/widgets/stitching/ZStitchingConfigOW.py +11 -11
- orangecontrib/tomwer/widgets/utils.py +2 -29
- orangecontrib/tomwer/widgets/visualization/DataViewerOW.py +1 -27
- orangecontrib/tomwer/widgets/visualization/DiffViewerOW.py +1 -27
- orangecontrib/tomwer/widgets/visualization/NXtomoMetadataViewerOW.py +1 -1
- orangecontrib/tomwer/widgets/visualization/RadioStackOW.py +2 -28
- orangecontrib/tomwer/widgets/visualization/SampleMovedOW.py +1 -27
- orangecontrib/tomwer/widgets/visualization/SinogramViewerOW.py +1 -27
- orangecontrib/tomwer/widgets/visualization/SliceStackOW.py +2 -28
- tomwer/__init__.py +3 -28
- tomwer/__main__.py +8 -4
- tomwer/app/__init__.py +2 -0
- tomwer/app/axis.py +8 -10
- tomwer/app/canvas.py +23 -29
- tomwer/app/canvas_launcher/config.py +14 -102
- tomwer/app/canvas_launcher/environ.py +5 -8
- tomwer/app/canvas_launcher/mainwindow.py +175 -69
- tomwer/app/canvas_launcher/splash.py +1 -3
- tomwer/app/canvas_launcher/utils.py +47 -0
- tomwer/app/canvas_launcher/widgetsscheme.py +3 -10
- tomwer/app/diffframe.py +2 -0
- tomwer/app/imagekeyeditor.py +2 -1
- tomwer/app/imagekeyupgrader.py +2 -0
- tomwer/app/multicor.py +5 -2
- tomwer/app/multipag.py +16 -5
- tomwer/app/nabuapp.py +2 -1
- tomwer/app/nxtomoeditor.py +17 -12
- tomwer/app/patchrawdarkflat.py +2 -0
- tomwer/app/radiostack.py +3 -2
- tomwer/app/reducedarkflat.py +3 -0
- tomwer/app/samplemoved.py +2 -0
- tomwer/app/scanviewer.py +2 -0
- tomwer/app/sinogramviewer.py +2 -0
- tomwer/app/slicestack.py +11 -13
- tomwer/app/stitching/common.py +431 -0
- tomwer/app/stopdatalistener.py +3 -0
- tomwer/app/ystitching.py +26 -0
- tomwer/app/zstitching.py +8 -363
- tomwer/core/__init__.py +2 -28
- tomwer/core/cluster/__init__.py +3 -0
- tomwer/core/cluster/cluster.py +10 -26
- tomwer/core/futureobject.py +17 -43
- tomwer/core/log/__init__.py +2 -0
- tomwer/core/log/processlog.py +0 -28
- tomwer/core/process/cluster/supervisor.py +52 -34
- tomwer/core/process/conditions/filters.py +3 -28
- tomwer/core/process/control/datalistener/datalistener.py +7 -75
- tomwer/core/process/control/datalistener/rpcserver.py +8 -38
- tomwer/core/process/control/datawatcher/datawatcher.py +11 -40
- tomwer/core/process/control/datawatcher/datawatcherobserver.py +30 -64
- tomwer/core/process/control/datawatcher/datawatcherprocess.py +11 -32
- tomwer/core/process/control/datawatcher/edfdwprocess.py +2 -27
- tomwer/core/process/control/datawatcher/hdf5dwprocess.py +1 -26
- tomwer/core/process/control/datawatcher/status.py +1 -26
- tomwer/core/process/control/emailnotifier.py +11 -23
- tomwer/core/process/control/nxtomoconcatenate.py +20 -18
- tomwer/core/process/control/nxtomomill.py +9 -44
- tomwer/core/process/control/scanlist.py +0 -27
- tomwer/core/process/control/scantransfer.py +15 -13
- tomwer/core/process/control/scanvalidator.py +4 -30
- tomwer/core/process/control/{test → tests}/test_concatenate_nxtomos.py +5 -5
- tomwer/core/process/control/timer.py +1 -27
- tomwer/core/process/control/tomoobjseries.py +12 -0
- tomwer/core/process/drac/binning.py +37 -0
- tomwer/core/process/drac/dracbase.py +170 -0
- tomwer/core/process/drac/gallery.py +109 -0
- tomwer/core/process/drac/output.py +12 -0
- tomwer/core/process/drac/processeddataset.py +147 -0
- tomwer/core/process/drac/publish.py +118 -0
- tomwer/core/process/drac/rawdataset.py +142 -0
- tomwer/core/process/drac/tests/test_gallery.py +71 -0
- tomwer/core/process/drac/tests/test_icat_processed_dataset.py +80 -0
- tomwer/core/process/drac/tests/test_icat_raw_dataset.py +90 -0
- tomwer/core/process/edit/darkflatpatch.py +1 -28
- tomwer/core/process/edit/imagekeyeditor.py +4 -32
- tomwer/core/process/edit/nxtomoeditor.py +307 -0
- tomwer/core/process/edit/tests/test_darkflatpatch.py +243 -0
- tomwer/core/process/edit/tests/test_imagekey_editor.py +99 -0
- tomwer/core/process/output.py +9 -2
- tomwer/core/process/reconstruction/__init__.py +0 -26
- tomwer/core/process/reconstruction/axis/anglemode.py +1 -29
- tomwer/core/process/reconstruction/axis/axis.py +47 -804
- tomwer/core/process/reconstruction/axis/mode.py +89 -25
- tomwer/core/process/reconstruction/axis/params.py +131 -283
- tomwer/core/process/reconstruction/axis/projectiontype.py +0 -28
- tomwer/core/process/reconstruction/axis/side.py +8 -0
- tomwer/core/process/reconstruction/darkref/darkrefs.py +14 -39
- tomwer/core/process/reconstruction/darkref/darkrefscopy.py +7 -39
- tomwer/core/process/reconstruction/darkref/params.py +1 -28
- tomwer/core/process/reconstruction/nabu/castvolume.py +19 -34
- tomwer/core/process/reconstruction/nabu/nabucommon.py +18 -43
- tomwer/core/process/reconstruction/nabu/nabuscores.py +64 -68
- tomwer/core/process/reconstruction/nabu/nabuslices.py +63 -105
- tomwer/core/process/reconstruction/nabu/nabuvolume.py +44 -70
- tomwer/core/process/reconstruction/nabu/plane.py +10 -0
- tomwer/core/process/reconstruction/nabu/settings.py +1 -28
- tomwer/core/process/reconstruction/nabu/target.py +0 -28
- tomwer/core/process/reconstruction/nabu/test/test_castvolume.py +116 -0
- tomwer/core/process/reconstruction/nabu/test/test_nabu_utils.py +277 -0
- tomwer/core/process/reconstruction/nabu/test/test_nabunormalization.py +199 -0
- tomwer/core/process/reconstruction/nabu/utils.py +11 -60
- tomwer/core/process/reconstruction/normalization/normalization.py +2 -32
- tomwer/core/process/reconstruction/normalization/params.py +3 -35
- tomwer/core/process/reconstruction/output.py +14 -19
- tomwer/core/process/reconstruction/paramsbase.py +4 -33
- tomwer/core/process/reconstruction/saaxis/params.py +5 -33
- tomwer/core/process/reconstruction/saaxis/saaxis.py +22 -51
- tomwer/core/process/reconstruction/sadeltabeta/params.py +2 -31
- tomwer/core/process/reconstruction/sadeltabeta/sadeltabeta.py +18 -46
- tomwer/core/process/reconstruction/scores/params.py +9 -39
- tomwer/core/process/reconstruction/scores/scores.py +10 -42
- tomwer/core/process/reconstruction/tests/__init__.py +0 -0
- tomwer/core/process/reconstruction/tests/test_axis.py +46 -0
- tomwer/core/process/reconstruction/tests/test_darkref.py +33 -0
- tomwer/core/process/reconstruction/{test → tests}/test_saaxis.py +1 -27
- tomwer/core/process/reconstruction/tests/test_sadeltabeta.py +48 -0
- tomwer/core/process/reconstruction/{test → tests}/test_utils.py +4 -4
- tomwer/core/process/reconstruction/utils/cor.py +8 -4
- tomwer/core/process/script/python.py +1 -27
- tomwer/core/process/script/tests/test_script.py +41 -0
- tomwer/core/process/stitching/metadataholder.py +5 -4
- tomwer/core/process/stitching/nabustitcher.py +35 -5
- tomwer/core/process/stitching/tests/test_metadataholder.py +17 -0
- tomwer/core/process/task.py +20 -63
- tomwer/core/process/tests/__init__.py +0 -0
- tomwer/core/process/{test → tests}/test_conditions.py +1 -28
- tomwer/core/process/{test → tests}/test_dark_and_flat.py +1 -27
- tomwer/core/process/{test → tests}/test_data_listener.py +1 -27
- tomwer/core/process/{test → tests}/test_data_transfer.py +2 -28
- tomwer/core/process/{test → tests}/test_data_watcher.py +1 -27
- tomwer/core/process/{test → tests}/test_nabu.py +2 -33
- tomwer/core/process/{test → tests}/test_normalization.py +1 -26
- tomwer/core/process/{test → tests}/test_timer.py +1 -27
- tomwer/core/process/utils.py +2 -31
- tomwer/core/process/visualization/dataviewer.py +1 -26
- tomwer/core/process/visualization/diffviewer.py +1 -26
- tomwer/core/process/visualization/imagestackviewer.py +0 -26
- tomwer/core/process/visualization/radiostack.py +0 -26
- tomwer/core/process/visualization/samplemoved.py +0 -28
- tomwer/core/process/visualization/sinogramviewer.py +0 -27
- tomwer/core/process/visualization/slicestack.py +0 -28
- tomwer/core/process/visualization/tests/test_data_viewer.py +12 -0
- tomwer/core/process/visualization/tests/test_diff_viewer.py +12 -0
- tomwer/core/process/visualization/tests/test_image_stack_viewer.py +14 -0
- tomwer/core/process/visualization/tests/test_radio_stack.py +12 -0
- tomwer/core/process/visualization/tests/test_sample_moved.py +14 -0
- tomwer/core/process/visualization/tests/test_sinogram_viewer.py +13 -0
- tomwer/core/process/visualization/tests/test_slice_stack.py +13 -0
- tomwer/core/process/visualization/tests/test_volume_viewer.py +12 -0
- tomwer/core/process/visualization/volumeviewer.py +0 -29
- tomwer/core/scan/__init__.py +3 -27
- tomwer/core/scan/blissscan.py +5 -34
- tomwer/core/scan/edfscan.py +19 -53
- tomwer/core/scan/hdf5scan.py +2 -2
- tomwer/core/scan/nxtomoscan.py +48 -54
- tomwer/core/scan/scanbase.py +107 -203
- tomwer/core/scan/scanfactory.py +11 -41
- tomwer/core/scan/tests/__init__.py +0 -0
- tomwer/core/scan/tests/test_edf.py +25 -0
- tomwer/core/scan/tests/test_future_scan.py +35 -0
- tomwer/core/scan/tests/test_nxtomoscan.py +143 -0
- tomwer/core/scan/tests/test_process_registration.py +64 -0
- tomwer/core/settings.py +18 -40
- tomwer/core/tests/__init__.py +0 -0
- tomwer/core/tests/test_scanutils.py +26 -0
- tomwer/core/{test → tests}/test_utils.py +1 -28
- tomwer/core/tomwer_object.py +4 -0
- tomwer/core/utils/__init__.py +2 -0
- tomwer/core/utils/char.py +0 -28
- tomwer/core/utils/deprecation.py +12 -38
- tomwer/core/utils/dictutils.py +1 -3
- tomwer/core/utils/ftseriesutils.py +1 -27
- tomwer/core/utils/gpu.py +0 -28
- tomwer/core/utils/image.py +8 -39
- tomwer/core/utils/locker.py +1 -28
- tomwer/core/utils/logconfig.py +0 -27
- tomwer/core/utils/normalization.py +4 -31
- tomwer/core/utils/nxtomoutils.py +8 -38
- tomwer/core/utils/resource.py +0 -26
- tomwer/core/utils/scanutils.py +23 -52
- tomwer/core/utils/slurm.py +7 -30
- tomwer/core/utils/spec.py +6 -6
- tomwer/core/utils/tests/__init__.py +0 -0
- tomwer/core/utils/tests/test_image.py +30 -0
- tomwer/core/utils/tests/test_nxtomo.py +38 -0
- tomwer/core/utils/tests/test_scan_utils.py +46 -0
- tomwer/core/utils/tests/test_time.py +6 -0
- tomwer/core/utils/threads.py +0 -26
- tomwer/core/utils/time.py +0 -27
- tomwer/core/volume/__init__.py +4 -0
- tomwer/core/volume/edfvolume.py +1 -28
- tomwer/core/volume/hdf5volume.py +1 -28
- tomwer/core/volume/jp2kvolume.py +1 -27
- tomwer/core/volume/rawvolume.py +1 -28
- tomwer/core/volume/tests/test_volumes.py +21 -0
- tomwer/core/volume/tiffvolume.py +1 -28
- tomwer/core/volume/volumebase.py +5 -0
- tomwer/core/volume/volumefactory.py +7 -33
- tomwer/gui/__init__.py +0 -28
- tomwer/gui/cluster/__init__.py +2 -0
- tomwer/gui/cluster/slurm.py +297 -95
- tomwer/gui/cluster/supervisor.py +1 -27
- tomwer/gui/cluster/tests/__init__.py +0 -0
- tomwer/gui/cluster/{test → tests}/test_cluster.py +21 -26
- tomwer/gui/cluster/{test → tests}/test_supervisor.py +1 -27
- tomwer/gui/conditions/__init__.py +2 -0
- tomwer/gui/conditions/filter.py +1 -26
- tomwer/gui/configuration/__init__.py +2 -0
- tomwer/gui/control/__init__.py +2 -0
- tomwer/gui/control/actions.py +2 -28
- tomwer/gui/control/datadiscovery.py +4 -3
- tomwer/gui/control/datalist.py +64 -69
- tomwer/gui/control/datalistener.py +1 -39
- tomwer/gui/control/datareacheractions.py +1 -28
- tomwer/gui/control/datatransfert.py +2 -29
- tomwer/gui/control/datavalidator.py +3 -37
- tomwer/gui/control/datawatcher/__init__.py +0 -28
- tomwer/gui/control/datawatcher/configuration.py +1 -28
- tomwer/gui/control/datawatcher/datawatcher.py +3 -32
- tomwer/gui/control/datawatcher/datawatcherobserver.py +2 -28
- tomwer/gui/control/history.py +5 -35
- tomwer/gui/control/nxtomomill.py +3 -30
- tomwer/gui/control/observations.py +61 -55
- tomwer/gui/control/reducedarkflatselector.py +24 -20
- tomwer/gui/control/scanselectorwidget.py +2 -28
- tomwer/gui/control/selectorwidgetbase.py +17 -17
- tomwer/gui/control/series/__init__.py +0 -0
- tomwer/gui/control/{serie/seriecreator.py → series/seriescreator.py} +214 -235
- tomwer/gui/control/series/serieswaiter.py +0 -0
- tomwer/gui/control/series/test/test_creator.py +424 -0
- tomwer/gui/control/series/test/test_nxtomo_concatenate.py +21 -0
- tomwer/gui/control/singletomoobj.py +1 -1
- tomwer/gui/control/tests/__init__.py +0 -0
- tomwer/gui/control/tests/test_datalist.py +47 -0
- tomwer/gui/control/{test → tests}/test_datalistener.py +1 -28
- tomwer/gui/control/tests/test_datavalidator.py +27 -0
- tomwer/gui/control/{test → tests}/test_inputwidget.py +1 -27
- tomwer/gui/control/tests/test_process_manager.py +38 -0
- tomwer/gui/control/tests/test_scan_observations.py +23 -0
- tomwer/gui/control/tests/test_scanselector.py +42 -0
- tomwer/gui/control/{test → tests}/test_scanvalidator.py +1 -27
- tomwer/gui/control/{test → tests}/test_volume_dialog.py +2 -30
- tomwer/gui/control/{test → tests}/test_volumeselector.py +1 -27
- tomwer/gui/control/volumeselectorwidget.py +2 -30
- tomwer/gui/dataportal/__init__.py +2 -0
- tomwer/gui/{icat → dataportal}/createscreenshots.py +3 -2
- tomwer/gui/dataportal/gallery.py +133 -0
- tomwer/gui/dataportal/outputformat.py +0 -0
- tomwer/gui/dataportal/publish.py +96 -0
- tomwer/gui/dataportal/tests/test_create_screenshots_gui.py +23 -0
- tomwer/gui/dataportal/tests/test_gallery_gui.py +21 -0
- tomwer/gui/debugtools/__init__.py +2 -0
- tomwer/gui/debugtools/datasetgenerator.py +1 -30
- tomwer/gui/debugtools/objectinspector.py +1 -29
- tomwer/gui/dialog/QDataDialog.py +89 -0
- tomwer/gui/{qfolderdialog.py → dialog/QVolumeDialog.py} +8 -107
- tomwer/gui/dialog/__init__.py +1 -0
- tomwer/gui/edit/__init__.py +2 -0
- tomwer/gui/edit/dkrfpatch.py +52 -87
- tomwer/gui/edit/imagekeyeditor.py +18 -54
- tomwer/gui/edit/nxtomoeditor.py +113 -300
- tomwer/gui/edit/nxtomowarmer.py +3 -2
- tomwer/gui/edit/tests/__init__.py +0 -0
- tomwer/gui/edit/{test → tests}/test_dkrf_patch.py +3 -29
- tomwer/gui/edit/{test → tests}/test_image_key_editor.py +1 -27
- tomwer/gui/edit/{test → tests}/test_nx_editor.py +45 -23
- tomwer/gui/fonts.py +5 -0
- tomwer/gui/icons.py +28 -66
- tomwer/gui/illustrations.py +4 -34
- tomwer/gui/imagefromfile.py +5 -30
- tomwer/gui/metadataloader.py +36 -0
- tomwer/gui/qconfigfile.py +3 -0
- tomwer/gui/qlefilesystem.py +3 -0
- tomwer/gui/reconstruction/__init__.py +2 -0
- tomwer/gui/reconstruction/axis/AxisMainWindow.py +275 -0
- tomwer/gui/reconstruction/axis/AxisOptionsWidget.py +313 -0
- tomwer/gui/reconstruction/axis/AxisSettingsWidget.py +797 -0
- tomwer/gui/reconstruction/axis/AxisWidget.py +534 -0
- tomwer/gui/reconstruction/axis/CalculationWidget.py +218 -0
- tomwer/gui/reconstruction/axis/CompareImages.py +11 -44
- tomwer/gui/reconstruction/axis/ControlWidget.py +285 -0
- tomwer/gui/reconstruction/axis/EstimatedCORWidget.py +394 -0
- tomwer/gui/reconstruction/axis/EstimatedCorComboBox.py +118 -0
- tomwer/gui/reconstruction/axis/InputWidget.py +347 -0
- tomwer/gui/reconstruction/axis/ManualFramesSelection.py +168 -0
- tomwer/gui/reconstruction/axis/__init__.py +2 -2
- tomwer/gui/reconstruction/darkref/__init__.py +0 -27
- tomwer/gui/reconstruction/darkref/darkrefcopywidget.py +5 -34
- tomwer/gui/reconstruction/darkref/darkrefwidget.py +1 -27
- tomwer/gui/reconstruction/nabu/castvolume.py +40 -59
- tomwer/gui/reconstruction/nabu/check.py +7 -33
- tomwer/gui/reconstruction/nabu/nabuconfig/base.py +7 -34
- tomwer/gui/reconstruction/nabu/nabuconfig/ctf.py +6 -5
- tomwer/gui/reconstruction/nabu/nabuconfig/nabuconfig.py +10 -69
- tomwer/gui/reconstruction/nabu/nabuconfig/output.py +3 -47
- tomwer/gui/reconstruction/nabu/nabuconfig/phase.py +54 -36
- tomwer/gui/reconstruction/nabu/nabuconfig/preprocessing.py +103 -54
- tomwer/gui/reconstruction/nabu/nabuconfig/reconstruction.py +116 -65
- tomwer/gui/reconstruction/nabu/nabuflow.py +31 -61
- tomwer/gui/reconstruction/nabu/platform.py +94 -0
- tomwer/gui/reconstruction/nabu/slices.py +81 -45
- tomwer/gui/reconstruction/nabu/slurm.py +1 -27
- tomwer/gui/reconstruction/nabu/test/test_cast_volume.py +82 -0
- tomwer/gui/reconstruction/nabu/test/test_check.py +66 -0
- tomwer/gui/reconstruction/nabu/test/test_ctf.py +46 -0
- tomwer/gui/reconstruction/nabu/test/test_helical.py +21 -0
- tomwer/gui/reconstruction/nabu/test/test_nabu_preprocessing.py +81 -0
- tomwer/gui/reconstruction/nabu/volume.py +62 -90
- tomwer/gui/reconstruction/normalization/intensity.py +5 -32
- tomwer/gui/reconstruction/normalization/test/test_intensity.py +89 -0
- tomwer/gui/reconstruction/saaxis/corrangeselector.py +32 -56
- tomwer/gui/reconstruction/saaxis/dimensionwidget.py +56 -96
- tomwer/gui/reconstruction/saaxis/saaxis.py +17 -38
- tomwer/gui/reconstruction/saaxis/sliceselector.py +8 -39
- tomwer/gui/reconstruction/sadeltabeta/saadeltabeta.py +19 -37
- tomwer/gui/reconstruction/scores/control.py +2 -30
- tomwer/gui/reconstruction/scores/scoreplot.py +23 -49
- tomwer/gui/reconstruction/tests/__init__.py +0 -0
- tomwer/gui/reconstruction/{test → tests}/test_axis.py +23 -49
- tomwer/gui/reconstruction/{test → tests}/test_nabu.py +16 -31
- tomwer/gui/reconstruction/{test → tests}/test_saaxis.py +10 -37
- tomwer/gui/reconstruction/{test → tests}/test_sadeltabeta.py +1 -26
- tomwer/gui/samplemoved/__init__.py +2 -30
- tomwer/gui/samplemoved/selectiontable.py +3 -33
- tomwer/gui/settings.py +7 -0
- tomwer/gui/stackplot.py +33 -661
- tomwer/gui/stacks.py +261 -135
- tomwer/gui/stitching/SingleAxisStitchingWidget.py +326 -0
- tomwer/gui/stitching/StitchingOptionsWidget.py +438 -0
- tomwer/gui/stitching/StitchingWindow.py +586 -0
- tomwer/gui/stitching/__init__.py +2 -0
- tomwer/gui/stitching/alignment.py +90 -0
- tomwer/gui/stitching/axisorderedlist.py +44 -34
- tomwer/gui/stitching/config/axisparams.py +25 -11
- tomwer/gui/stitching/config/output.py +6 -5
- tomwer/gui/stitching/config/positionoveraxis.py +313 -51
- tomwer/gui/stitching/config/stitchingstrategies.py +22 -16
- tomwer/gui/stitching/config/tests/test_axisparams.py +25 -0
- tomwer/gui/stitching/config/tomoobjdetails.py +3 -5
- tomwer/gui/stitching/normalization.py +1 -0
- tomwer/gui/stitching/preview.py +59 -0
- tomwer/gui/stitching/singleaxis.py +57 -0
- tomwer/gui/stitching/stitchandbackground.py +3 -2
- tomwer/gui/stitching/stitching_preview.py +44 -36
- tomwer/gui/stitching/stitching_raw.py +5 -3
- tomwer/gui/stitching/tests/test_ZStitchingWindow.py +88 -0
- tomwer/gui/stitching/tests/test_axis_ordered_list.py +21 -0
- tomwer/gui/stitching/tests/test_normalization.py +27 -0
- tomwer/gui/stitching/tests/test_preview.py +68 -0
- tomwer/gui/stitching/tests/test_stitching_raw.py +110 -0
- tomwer/gui/stitching/tests/utils.py +92 -0
- tomwer/gui/stitching/utils.py +14 -0
- tomwer/gui/stitching/z_stitching/fineestimation.py +5 -33
- tomwer/gui/stitching/z_stitching/tests/test_fine_estimation.py +35 -0
- tomwer/gui/stitching/z_stitching/tests/test_raw_estimation.py +215 -0
- tomwer/gui/stitching/z_stitching/tests/test_stitching_window.py +51 -0
- tomwer/gui/tests/__init__.py +0 -0
- tomwer/gui/tests/test_axis_gui.py +43 -0
- tomwer/gui/{test → tests}/test_qfolder_dialog.py +1 -1
- tomwer/gui/utils/RangeWidget.py +44 -0
- tomwer/gui/utils/buttons.py +4 -3
- tomwer/gui/utils/completer.py +2 -33
- tomwer/gui/utils/flow.py +11 -40
- tomwer/gui/utils/gpu.py +60 -0
- tomwer/gui/utils/illustrations.py +1 -26
- tomwer/gui/utils/inputwidget.py +35 -73
- tomwer/gui/utils/lineselector/lineselector.py +9 -46
- tomwer/gui/utils/loadingmode.py +81 -0
- tomwer/gui/utils/qt_utils.py +9 -0
- tomwer/gui/utils/sandboxes.py +1 -26
- tomwer/gui/utils/scandescription.py +2 -31
- tomwer/gui/utils/scrollarea.py +6 -55
- tomwer/gui/utils/slider.py +4 -28
- tomwer/gui/utils/splashscreen.py +0 -28
- tomwer/gui/utils/step.py +14 -13
- tomwer/gui/utils/tests/test_completer.py +41 -0
- tomwer/gui/utils/tests/test_line_selector.py +21 -0
- tomwer/gui/utils/tests/test_splashscreen.py +8 -0
- tomwer/gui/utils/tests/test_vignettes.py +68 -0
- tomwer/gui/utils/unitsystem.py +15 -69
- tomwer/gui/utils/utils.py +4 -5
- tomwer/gui/utils/vignettes.py +10 -41
- tomwer/gui/utils/waiterthread.py +0 -26
- tomwer/gui/visualization/__init__.py +2 -0
- tomwer/gui/visualization/dataviewer.py +68 -421
- tomwer/gui/visualization/diffviewer/diffviewer.py +2 -30
- tomwer/gui/visualization/diffviewer/shiftwidget.py +4 -29
- tomwer/gui/visualization/fullscreenplot.py +5 -5
- tomwer/gui/visualization/imagestack.py +403 -0
- tomwer/gui/visualization/nxtomometadata.py +0 -4
- tomwer/gui/visualization/reconstructionparameters.py +14 -32
- tomwer/gui/visualization/scanoverview.py +33 -66
- tomwer/gui/visualization/sinogramviewer.py +2 -28
- tomwer/gui/visualization/test/__init__.py +0 -28
- tomwer/gui/visualization/test/test_dataviewer.py +1 -28
- tomwer/gui/visualization/test/test_diffviewer.py +1 -28
- tomwer/gui/visualization/test/test_nx_tomo_metadata_viewer.py +0 -5
- tomwer/gui/visualization/test/test_reconstruction_parameters.py +1 -27
- tomwer/gui/visualization/test/test_sinogramviewer.py +1 -28
- tomwer/gui/visualization/test/test_stacks.py +184 -115
- tomwer/gui/visualization/test/test_volumeviewer.py +3 -2
- tomwer/gui/visualization/tomoobjoverview.py +2 -2
- tomwer/gui/visualization/volumeoverview.py +3 -2
- tomwer/gui/visualization/volumeviewer.py +47 -43
- tomwer/io/__init__.py +2 -0
- tomwer/io/utils/h5pyutils.py +1 -27
- tomwer/io/utils/test/test_raw_and_processed_data.py +10 -0
- tomwer/io/utils/test/test_utils.py +67 -0
- tomwer/io/utils/utils.py +2 -31
- tomwer/resources/__init__.py +13 -33
- tomwer/resources/gui/icons/edit_downstream.svg +114 -0
- tomwer/resources/gui/icons/edit_upstream.svg +112 -0
- tomwer/resources/gui/icons/free_edition.svg +23 -0
- tomwer/resources/gui/icons/icat_gallery_opts.png +0 -0
- tomwer/resources/gui/icons/icat_gallery_opts.svg +80 -0
- tomwer/resources/gui/icons/search.png +0 -0
- tomwer/resources/gui/icons/search.svg +23 -0
- tomwer/resources/gui/icons/warning.png +0 -0
- tomwer/synctools/__init__.py +2 -0
- tomwer/synctools/axis.py +1 -27
- tomwer/synctools/darkref.py +1 -26
- tomwer/synctools/datalistener.py +1 -27
- tomwer/synctools/datatransfert.py +2 -27
- tomwer/synctools/imageloaderthread.py +1 -28
- tomwer/synctools/rsyncmanager.py +1 -25
- tomwer/synctools/saaxis.py +1 -26
- tomwer/synctools/sadeltabeta.py +1 -26
- tomwer/synctools/stacks/control/datalistener.py +1 -26
- tomwer/synctools/stacks/processingstack.py +4 -33
- tomwer/synctools/stacks/reconstruction/axis.py +6 -53
- tomwer/synctools/stacks/reconstruction/castvolume.py +12 -43
- tomwer/synctools/stacks/reconstruction/dkrefcopy.py +4 -27
- tomwer/synctools/stacks/reconstruction/nabu.py +3 -28
- tomwer/synctools/stacks/reconstruction/normalization.py +2 -27
- tomwer/synctools/stacks/reconstruction/saaxis.py +2 -27
- tomwer/synctools/stacks/reconstruction/sadeltabeta.py +2 -27
- tomwer/synctools/tests/__init__.py +0 -0
- tomwer/synctools/{test → tests}/test_darkRefs.py +16 -40
- tomwer/synctools/{test → tests}/test_foldertransfer.py +2 -33
- tomwer/synctools/utils/scanstages.py +2 -31
- tomwer/tests/__init__.py +1 -0
- tomwer/tests/app/test_stitching.py +95 -0
- tomwer/tests/datasets.py +1 -5
- tomwer/tests/orangecontrib/tomwer/widgets/cluster/tests/test_future_supervisorow.py +48 -0
- tomwer/tests/orangecontrib/tomwer/widgets/cluster/tests/test_slurm_clusterow.py +40 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_advancement.py +8 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_data_validator.py +55 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datadiscovery.py +129 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datalistener.py +111 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_dataselector.py +69 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datawatcher.py +411 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_emailow.py +29 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_notifier.py +24 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_nxtomo_concatenate_ow.py +64 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_nxtomomill.py +133 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_reduce_dark_flat_selector.py +40 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_singletomoobj.py +40 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_timerow.py +25 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_tomoobj_series.py +96 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_volume_selector.py +69 -0
- orangecontrib/tomwer/widgets/edit/test/test_image_key_editor.py → tomwer/tests/orangecontrib/tomwer/widgets/debugtools/tests/test_dataset_generator.py +17 -16
- tomwer/tests/orangecontrib/tomwer/widgets/debugtools/tests/test_object_inspector.py +36 -0
- {orangecontrib/tomwer/widgets/edit/test → tomwer/tests/orangecontrib/tomwer/widgets/edit/tests}/test_dark_flat_patch.py +1 -27
- tomwer/tests/orangecontrib/tomwer/widgets/edit/tests/test_image_key_editor.py +30 -0
- tomwer/tests/orangecontrib/tomwer/widgets/edit/tests/test_nxtomo_editor.py +138 -0
- tomwer/tests/orangecontrib/tomwer/widgets/other/tests/test_pythonscript.py +31 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_axis.py +199 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_cast_volumeow.py +58 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_dark_refs_widget.py +136 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_delta_beta_selector.py +15 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_i_norm.py +200 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_helical_prepare_weights_double.py +20 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_volume.py +74 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_widget.py +107 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_sa_delta_beta.py +194 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_saaxis.py +194 -0
- tomwer/tests/orangecontrib/tomwer/widgets/stitching/tests/test_zstitching.py +313 -0
- tomwer/tests/orangecontrib/tomwer/widgets/tests/test_conditions.py +85 -0
- tomwer/tests/orangecontrib/tomwer/widgets/tests/test_darkref.py +225 -0
- tomwer/tests/orangecontrib/tomwer/widgets/tests/test_foldertransfert.py +105 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_dataviewerow.py +57 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_diffviewerow.py +39 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_nxtomo_metadata_viewer.py +29 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_radio_stackow.py +31 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_sample_movedow.py +46 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_sinogram_viewerow.py +31 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_slice_stackow.py +31 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_volume_viewerow.py +32 -0
- tomwer/tests/test_ewoks/test_conversion.py +104 -0
- tomwer/tests/test_ewoks/test_single_node_execution.py +87 -0
- tomwer/tests/test_ewoks/test_workflows.py +138 -0
- tomwer/utils.py +11 -39
- tomwer/version.py +2 -2
- {tomwer-1.3.26.dist-info → tomwer-1.4.0.dist-info}/LICENSE +3 -3
- tomwer-1.4.0.dist-info/METADATA +337 -0
- tomwer-1.4.0.dist-info/RECORD +912 -0
- {tomwer-1.3.26.dist-info → tomwer-1.4.0.dist-info}/WHEEL +1 -1
- {tomwer-1.3.26.dist-info → tomwer-1.4.0.dist-info}/entry_points.txt +1 -0
- orangecontrib/tomwer/widgets/control/DataListOW.py +0 -129
- orangecontrib/tomwer/widgets/control/TomoObjSerieOW.py +0 -86
- orangecontrib/tomwer/widgets/control/VolumeSymLinkOW.py +0 -182
- orangecontrib/tomwer/widgets/edit/test/test_nxtomo_editor.py +0 -141
- orangecontrib/tomwer/widgets/icat/PublishProcessedDataOW.py +0 -115
- orangecontrib/tomwer/widgets/icat/RawDataScreenshotCreatorOW.py +0 -98
- orangecontrib/tomwer/widgets/icat/SaveToGalleryAndPublishOW.py +0 -129
- orangecontrib/tomwer/widgets/icat/icons/add_gallery.png +0 -0
- orangecontrib/tomwer/widgets/icat/icons/add_gallery.svg +0 -82
- orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.png +0 -0
- orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.svg +0 -143
- orangecontrib/tomwer/widgets/visualization/LivesliceOW.py +0 -87
- orangecontrib/tomwer/widgets/visualization/icons/liveslice.png +0 -0
- orangecontrib/tomwer/widgets/visualization/icons/liveslice.svg +0 -110
- tomwer/core/log/logger.py +0 -130
- tomwer/core/process/control/test/test_volume_link.py +0 -74
- tomwer/core/process/control/tomoobjserie.py +0 -12
- tomwer/core/process/control/volumesymlink.py +0 -200
- tomwer/core/process/icat/createscreenshots.py +0 -100
- tomwer/core/process/icat/gallery.py +0 -377
- tomwer/core/process/icat/icatbase.py +0 -36
- tomwer/core/process/icat/publish.py +0 -228
- tomwer/core/process/icat/screenshots.py +0 -27
- tomwer/core/process/reconstruction/test/test_darkref.py +0 -60
- tomwer/core/process/reconstruction/test/test_sadeltabeta.py +0 -74
- tomwer/core/process/test/test_axis.py +0 -309
- tomwer/core/process/visualization/liveslice.py +0 -6
- tomwer/core/progress.py +0 -100
- tomwer/core/scan/test/test_edf.py +0 -53
- tomwer/core/scan/test/test_future_scan.py +0 -61
- tomwer/core/scan/test/test_h5.py +0 -96
- tomwer/core/scan/test/test_process_registration.py +0 -109
- tomwer/core/test/test_scanutils.py +0 -53
- tomwer/gui/control/emailnotifier.py +0 -174
- tomwer/gui/control/serie/seriewaiter.py +0 -28
- tomwer/gui/control/test/__init__.py +0 -28
- tomwer/gui/control/test/test_datalist.py +0 -96
- tomwer/gui/control/test/test_datavalidator.py +0 -54
- tomwer/gui/control/test/test_email.py +0 -35
- tomwer/gui/control/test/test_process_manager.py +0 -65
- tomwer/gui/control/test/test_scanselector.py +0 -67
- tomwer/gui/edit/test/__init__.py +0 -28
- tomwer/gui/icat/gallery.py +0 -214
- tomwer/gui/icat/publish.py +0 -187
- tomwer/gui/reconstruction/axis/axis.py +0 -733
- tomwer/gui/reconstruction/axis/radioaxis.py +0 -2467
- tomwer/gui/stitching/stitching.py +0 -1392
- tomwer/gui/test/__init__.py +0 -28
- tomwer/gui/test/test_axis_gui.py +0 -34
- tomwer/synctools/stacks/edit/darkflatpatch.py +0 -169
- tomwer/synctools/stacks/edit/imagekeyeditor.py +0 -135
- tomwer/third_part/WaitingOverlay.py +0 -110
- tomwer-1.3.26-py3.11-nspkg.pth +0 -1
- tomwer-1.3.26.dist-info/METADATA +0 -292
- tomwer-1.3.26.dist-info/RECORD +0 -785
- tomwer-1.3.26.dist-info/namespace_packages.txt +0 -1
- /orangecontrib/tomwer/{widgets/edit/test → tests}/__init__.py +0 -0
- {tomwer/core/process/control/test → orangecontrib/tomwer/tutorials/id16b}/__init__.py +0 -0
- {tomwer/core/process/icat → orangecontrib/tomwer/widgets/cluster/tests}/__init__.py +0 -0
- /orangecontrib/tomwer/widgets/control/icons/{tomoobjserie.png → tomoobjseries.png} +0 -0
- {tomwer/core/process/reconstruction/test → orangecontrib/tomwer/widgets/control/tests}/__init__.py +0 -0
- /orangecontrib/tomwer/widgets/{icat → dataportal}/icons/publish_processed_data.png +0 -0
- /orangecontrib/tomwer/widgets/{icat → dataportal}/icons/publish_processed_data.svg +0 -0
- {tomwer/core/process/test → orangecontrib/tomwer/widgets/debugtools/tests}/__init__.py +0 -0
- {tomwer/core/scan/test → orangecontrib/tomwer/widgets/edit/tests}/__init__.py +0 -0
- {tomwer/core/test → orangecontrib/tomwer/widgets/other/tests}/__init__.py +0 -0
- {tomwer/gui/cluster/test → orangecontrib/tomwer/widgets/reconstruction/tests}/__init__.py +0 -0
- {tomwer/gui/control/serie → orangecontrib/tomwer/widgets/stitching/tests}/__init__.py +0 -0
- {tomwer/gui/icat → orangecontrib/tomwer/widgets/tests}/__init__.py +0 -0
- {tomwer/gui/reconstruction/test → orangecontrib/tomwer/widgets/visualization/tests}/__init__.py +0 -0
- /tomwer/{synctools/stacks/edit → app/stitching}/__init__.py +0 -0
- /tomwer/{synctools/test → core/process/control/tests}/__init__.py +0 -0
- /tomwer/core/process/control/{test → tests}/test_email.py +0 -0
- /tomwer/core/process/control/{test → tests}/test_h52nx_process.py +0 -0
- /tomwer/{third_part → core/process/drac}/__init__.py +0 -0
- /tomwer/core/process/reconstruction/{test → tests}/test_axis_params.py +0 -0
- /tomwer/core/process/reconstruction/{test → tests}/test_darkref_copy.py +0 -0
- /tomwer/core/process/reconstruction/{test → tests}/test_paramsbase.py +0 -0
- /tomwer/core/scan/{test → tests}/test_scan.py +0 -0
- /tomwer/gui/control/{serie → series}/nxtomoconcatenate.py +0 -0
- /tomwer/gui/control/{test → tests}/test_datadiscovery.py +0 -0
- /tomwer/gui/control/{test → tests}/test_reducedarkflat_selector.py +0 -0
- /tomwer/gui/control/{test → tests}/test_single_tomo_obj.py +0 -0
- {orangecontrib/tomwer/widgets/edit/test → tomwer/tests/orangecontrib/tomwer/widgets/edit/tests}/test_image_key_upgrader.py +0 -0
- {tomwer-1.3.26.dist-info → tomwer-1.4.0.dist-info}/top_level.txt +0 -0
@@ -1,57 +1,29 @@
|
|
1
|
-
|
2
|
-
# /*##########################################################################
|
3
|
-
#
|
4
|
-
# Copyright (c) 2016-2017 European Synchrotron Radiation Facility
|
5
|
-
#
|
6
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
-
# of this software and associated documentation files (the "Software"), to deal
|
8
|
-
# in the Software without restriction, including without limitation the rights
|
9
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
-
# copies of the Software, and to permit persons to whom the Software is
|
11
|
-
# furnished to do so, subject to the following conditions:
|
12
|
-
#
|
13
|
-
# The above copyright notice and this permission notice shall be included in
|
14
|
-
# all copies or substantial portions of the Software.
|
15
|
-
#
|
16
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
|
-
# THE SOFTWARE.
|
23
|
-
#
|
24
|
-
# ###########################################################################*/
|
25
|
-
|
26
|
-
__authors__ = ["H. Payno"]
|
27
|
-
__license__ = "MIT"
|
28
|
-
__date__ = "12/01/2022"
|
29
|
-
|
1
|
+
from __future__ import annotations
|
30
2
|
|
31
3
|
import logging
|
32
4
|
from contextlib import AbstractContextManager
|
33
|
-
from typing import Iterable
|
5
|
+
from typing import Iterable
|
34
6
|
|
35
7
|
from silx.gui import qt
|
36
8
|
from silx.gui.utils import blockSignals
|
37
9
|
from silx.utils.enum import Enum as _Enum
|
38
|
-
from tomoscan.
|
10
|
+
from tomoscan.series import Series
|
39
11
|
|
40
12
|
from tomwer.core.scan.scanbase import TomwerScanBase
|
41
13
|
from tomwer.core.scan.scanfactory import ScanFactory
|
42
14
|
from tomwer.core.tomwer_object import TomwerObject
|
43
15
|
from tomwer.core.volume.volumefactory import VolumeFactory
|
44
16
|
from tomwer.gui.control.datalist import TomoObjList
|
45
|
-
from tomwer.gui.
|
17
|
+
from tomwer.gui.dialog.QDataDialog import QDataDialog
|
46
18
|
from tomwer.gui.visualization.tomoobjoverview import TomoObjOverview
|
47
19
|
|
48
20
|
_logger = logging.getLogger(__name__)
|
49
21
|
|
50
22
|
|
51
|
-
class
|
52
|
-
|
23
|
+
class SeriesWidgetDialog(qt.QDialog):
|
24
|
+
sigSeriesSelected = qt.Signal(Series)
|
53
25
|
"""
|
54
|
-
emit when a
|
26
|
+
emit when a series is selected / triggered by the user
|
55
27
|
"""
|
56
28
|
|
57
29
|
def __init__(self, *args, **kwargs) -> None:
|
@@ -59,108 +31,110 @@ class SerieWidgetDialog(qt.QDialog):
|
|
59
31
|
|
60
32
|
self.setLayout(qt.QVBoxLayout())
|
61
33
|
# add list
|
62
|
-
self._widget =
|
34
|
+
self._widget = SeriesWidget()
|
63
35
|
self.layout().addWidget(self._widget)
|
64
36
|
# add buttons
|
65
37
|
self._buttons = qt.QDialogButtonBox(parent=self)
|
66
|
-
self._selectButton = qt.QPushButton("Select (active)
|
38
|
+
self._selectButton = qt.QPushButton("Select (active) series", parent=self)
|
67
39
|
self._buttons.addButton(self._selectButton, qt.QDialogButtonBox.ActionRole)
|
68
40
|
self.layout().addWidget(self._buttons)
|
69
41
|
|
70
42
|
# connect signal / slot
|
71
|
-
self._selectButton.released.connect(self.
|
43
|
+
self._selectButton.released.connect(self._seriesSelected)
|
72
44
|
|
73
|
-
def
|
74
|
-
return self._widget.
|
45
|
+
def getSelectedSeries(self) -> Series | None:
|
46
|
+
return self._widget.getSelectedSeries()
|
75
47
|
|
76
|
-
def
|
77
|
-
|
78
|
-
if
|
79
|
-
self.
|
48
|
+
def _seriesSelected(self, *args, **kwargs):
|
49
|
+
series = self.getSelectedSeries()
|
50
|
+
if series is not None:
|
51
|
+
self.sigSeriesSelected.emit(series)
|
80
52
|
|
81
53
|
# expose API
|
82
54
|
def add(self, tomo_obj):
|
83
55
|
self._widget.add(tomo_obj=tomo_obj)
|
84
56
|
|
85
57
|
|
86
|
-
class
|
87
|
-
|
88
|
-
"""signal emit when the current
|
58
|
+
class SeriesWidget(qt.QTabWidget):
|
59
|
+
sigCurrentSeriesChanged = qt.Signal()
|
60
|
+
"""signal emit when the current series changes"""
|
89
61
|
|
90
62
|
sigHistoryChanged = qt.Signal()
|
91
|
-
"""signal emit when the history changed (a
|
63
|
+
"""signal emit when the history changed (a series has been added or removed"""
|
92
64
|
|
93
|
-
|
94
|
-
"""Signal
|
65
|
+
sigSeriesSend = qt.Signal(Series)
|
66
|
+
"""Signal emit when a series has been send"""
|
95
67
|
|
96
68
|
_HISTORY_MODE = "history"
|
97
|
-
_DEFINITION_MODE = "
|
69
|
+
_DEFINITION_MODE = "series definition"
|
98
70
|
|
99
71
|
def __init__(self, parent=None) -> None:
|
100
72
|
super().__init__(parent)
|
101
|
-
self.setWindowTitle("
|
102
|
-
self.
|
103
|
-
self.addTab(self.
|
104
|
-
self._historyWidget =
|
73
|
+
self.setWindowTitle("series of scans")
|
74
|
+
self._seriesDefinitionWidget = SeriesDefinition(parent=self)
|
75
|
+
self.addTab(self._seriesDefinitionWidget, self._DEFINITION_MODE)
|
76
|
+
self._historyWidget = SeriesHistoryDialog(parent=self)
|
105
77
|
self._historyWidget.setWindowFlags(qt.Qt.Widget)
|
106
78
|
self.addTab(self._historyWidget, self._HISTORY_MODE)
|
107
79
|
|
108
|
-
#
|
109
|
-
self._historyWidget.
|
110
|
-
self._historyWidget.
|
80
|
+
# connect signal / slot
|
81
|
+
self._historyWidget.sigEditSeries.connect(self._seriesEditionRequested)
|
82
|
+
self._historyWidget.sigSeriesSend.connect(self.sigSeriesSend)
|
111
83
|
self._historyWidget.sigHistoryUpdated.connect(self._repeatHistoryUpdated)
|
112
|
-
self.
|
113
|
-
self.
|
114
|
-
self.
|
84
|
+
self._seriesDefinitionWidget.sigSeriesChanged.connect(self._repeatSeriesChanged)
|
85
|
+
self._seriesDefinitionWidget.sigSeriesSend.connect(self.sigSeriesSend)
|
86
|
+
self._seriesDefinitionWidget.sigSeriesSend.connect(
|
87
|
+
self._historyWidget.addSeries
|
88
|
+
)
|
115
89
|
|
116
90
|
def getHistoryWidget(self):
|
117
91
|
return self._historyWidget
|
118
92
|
|
119
93
|
def getDefinitionWidget(self):
|
120
|
-
return self.
|
94
|
+
return self._seriesDefinitionWidget
|
121
95
|
|
122
|
-
def
|
123
|
-
return self.
|
96
|
+
def getSelectedSeries(self) -> Series | None:
|
97
|
+
return self._seriesDefinitionWidget.getSelectedSeries()
|
124
98
|
|
125
|
-
def setMode(self, mode: str, definition_mode:
|
99
|
+
def setMode(self, mode: str, definition_mode: str | None = None):
|
126
100
|
valid_modes = (self._HISTORY_MODE, self._DEFINITION_MODE)
|
127
101
|
if mode == self._HISTORY_MODE:
|
128
102
|
self.setCurrentWidget(self._historyWidget)
|
129
103
|
elif mode == self._DEFINITION_MODE:
|
130
|
-
self.setCurrentWidget(self.
|
131
|
-
self.
|
104
|
+
self.setCurrentWidget(self._seriesDefinitionWidget)
|
105
|
+
self._seriesDefinitionWidget.setMode(definition_mode)
|
132
106
|
else:
|
133
107
|
raise ValueError(
|
134
108
|
f"mode {mode} is no recognized. Valid modes are {valid_modes}"
|
135
109
|
)
|
136
110
|
|
137
|
-
def
|
138
|
-
if not isinstance(
|
139
|
-
raise TypeError(f"
|
140
|
-
self.setMode("
|
141
|
-
self.getDefinitionWidget().getManualDefinitionWidget().
|
111
|
+
def _seriesEditionRequested(self, series: Series):
|
112
|
+
if not isinstance(series, Series):
|
113
|
+
raise TypeError(f"series is expected to be a series not {type(series)}")
|
114
|
+
self.setMode("series definition", "manual")
|
115
|
+
self.getDefinitionWidget().getManualDefinitionWidget().setSeries(series)
|
142
116
|
|
143
|
-
def
|
144
|
-
self.
|
117
|
+
def _repeatSeriesChanged(self, *args, **kwargs):
|
118
|
+
self.sigCurrentSeriesChanged.emit()
|
145
119
|
|
146
120
|
def _repeatHistoryUpdated(self, *args, **kwargs):
|
147
121
|
self.sigHistoryChanged.emit()
|
148
122
|
|
149
123
|
def add(self, tomo_obj):
|
150
|
-
return self.
|
124
|
+
return self._seriesDefinitionWidget.addTomoObj(tomo_obj)
|
151
125
|
|
152
126
|
|
153
|
-
class
|
127
|
+
class _SeriesDefinitionMode(_Enum):
|
154
128
|
MANUAL = "manual"
|
155
129
|
AUTO = "auto"
|
156
130
|
|
157
131
|
|
158
|
-
class
|
159
|
-
|
160
|
-
|
132
|
+
class SeriesDefinition(qt.QWidget):
|
133
|
+
sigSeriesChanged = qt.Signal()
|
134
|
+
"""signal emit when a the series defined manually changed"""
|
161
135
|
|
162
|
-
|
163
|
-
|
136
|
+
sigSeriesSend = qt.Signal(Series)
|
137
|
+
"""Signal emited when a series has been send"""
|
164
138
|
|
165
139
|
def __init__(self, parent=None) -> None:
|
166
140
|
super().__init__(parent)
|
@@ -170,41 +144,43 @@ class SerieDefinition(qt.QWidget):
|
|
170
144
|
self.layout().addWidget(self._modeLabel, 0, 0, 1, 1)
|
171
145
|
|
172
146
|
self._modeCB = qt.QComboBox(self)
|
173
|
-
for mode in
|
147
|
+
for mode in _SeriesDefinitionMode.values():
|
174
148
|
self._modeCB.addItem(mode)
|
175
149
|
self.layout().addWidget(self._modeCB, 0, 1, 1, 1)
|
176
150
|
|
177
|
-
self._manualDefWidget =
|
151
|
+
self._manualDefWidget = SeriesManualFromTomoObj(parent=self)
|
178
152
|
self.layout().addWidget(self._manualDefWidget, 1, 0, 1, 2)
|
179
153
|
self._manualDefWidget.setWindowFlags(qt.Qt.Widget)
|
180
154
|
|
181
|
-
self._automaticDefWidget =
|
155
|
+
self._automaticDefWidget = SeriesAutomaticDefinitionWidget(parent=self)
|
182
156
|
self.layout().addWidget(self._automaticDefWidget, 2, 0, 1, 2)
|
183
157
|
|
184
158
|
# connect signal / slot
|
185
159
|
self._modeCB.currentIndexChanged.connect(self._updateVisibility)
|
186
|
-
self._manualDefWidget.
|
160
|
+
self._manualDefWidget._newSeriesWidget.sigUpdated.connect(self.sigSeriesChanged)
|
187
161
|
|
188
162
|
# set up
|
189
163
|
self._updateVisibility()
|
190
164
|
|
191
|
-
def
|
192
|
-
if self.getMode() ==
|
193
|
-
return self._manualDefWidget.
|
165
|
+
def getSelectedSeries(self) -> Series | None:
|
166
|
+
if self.getMode() == _SeriesDefinitionMode.MANUAL:
|
167
|
+
return self._manualDefWidget.getSeries()
|
194
168
|
else:
|
195
169
|
raise ValueError(f"mode {self.getMode()} is not handled yet")
|
196
170
|
|
197
171
|
def getMode(self) -> str:
|
198
|
-
return
|
172
|
+
return _SeriesDefinitionMode.from_value(self._modeCB.currentText())
|
199
173
|
|
200
174
|
def setMode(self, mode: str):
|
201
|
-
mode =
|
175
|
+
mode = _SeriesDefinitionMode.from_value(mode)
|
202
176
|
idx = self._modeCB.findText(mode.value)
|
203
177
|
self._modeCB.setCurrentIndex(idx)
|
204
178
|
|
205
179
|
def _updateVisibility(self):
|
206
|
-
self._manualDefWidget.setVisible(self.getMode() ==
|
207
|
-
self._automaticDefWidget.setVisible(
|
180
|
+
self._manualDefWidget.setVisible(self.getMode() == _SeriesDefinitionMode.MANUAL)
|
181
|
+
self._automaticDefWidget.setVisible(
|
182
|
+
self.getMode() == _SeriesDefinitionMode.AUTO
|
183
|
+
)
|
208
184
|
|
209
185
|
def getManualDefinitionWidget(self):
|
210
186
|
return self._manualDefWidget
|
@@ -212,24 +188,24 @@ class SerieDefinition(qt.QWidget):
|
|
212
188
|
def getAutoDefinitionWidget(self):
|
213
189
|
return self._automaticDefWidget
|
214
190
|
|
215
|
-
def
|
216
|
-
self._manualDefWidget.
|
191
|
+
def createManualSeries(self):
|
192
|
+
self._manualDefWidget.createSeries()
|
217
193
|
|
218
194
|
def addTomoObj(self, tomo_obj: TomwerObject):
|
219
195
|
self._manualDefWidget.addTomoObj(tomo_obj=tomo_obj)
|
220
196
|
|
221
|
-
def
|
222
|
-
self._manualDefWidget.
|
197
|
+
def setSeriesName(self, name: str):
|
198
|
+
self._manualDefWidget.setSeriesName(name=name)
|
223
199
|
|
224
200
|
|
225
|
-
class
|
201
|
+
class _SeriesDefinitionTree(qt.QWidget):
|
226
202
|
"""
|
227
|
-
Tree used to define manually
|
203
|
+
Tree used to define manually series of scan.
|
228
204
|
Drag and drop of files is handled
|
229
205
|
"""
|
230
206
|
|
231
207
|
sigUpdated = qt.Signal()
|
232
|
-
"""Signal emit when the
|
208
|
+
"""Signal emit when the series is updated"""
|
233
209
|
|
234
210
|
class SignalBlocker(AbstractContextManager):
|
235
211
|
"""Simple context manager to hide / show button dialogs"""
|
@@ -254,15 +230,15 @@ class _SerieDefinitionTree(qt.QWidget):
|
|
254
230
|
self._tree = qt.QTreeWidget(self)
|
255
231
|
self._tree.setSelectionMode(qt.QAbstractItemView.MultiSelection)
|
256
232
|
self._tree.setColumnCount(2)
|
257
|
-
self._tree.setHeaderLabels(("
|
233
|
+
self._tree.setHeaderLabels(("series", "scan ids"))
|
258
234
|
self._tree.setItemsExpandable(False)
|
259
235
|
self.layout().addWidget(self._tree)
|
260
236
|
|
261
237
|
# set up the tree with the serie name that will stay during the entire
|
262
238
|
# life time of the tree
|
263
|
-
self.
|
264
|
-
self.
|
265
|
-
self.
|
239
|
+
self._seriesItem = qt.QTreeWidgetItem(self._tree)
|
240
|
+
self._seriesItem.setFlags(self._seriesItem.flags() | qt.Qt.ItemIsEditable)
|
241
|
+
self._seriesItem.setExpanded(True)
|
266
242
|
|
267
243
|
self.setAcceptDrops(True)
|
268
244
|
|
@@ -270,22 +246,22 @@ class _SerieDefinitionTree(qt.QWidget):
|
|
270
246
|
self._tree.itemChanged.connect(self._updated)
|
271
247
|
|
272
248
|
# set up
|
273
|
-
self.
|
249
|
+
self.setSeriesName(name=serie_name)
|
274
250
|
|
275
251
|
# expose API
|
276
252
|
self.itemChanged = self._tree.itemChanged
|
277
253
|
|
278
254
|
@property
|
279
255
|
def rootItem(self):
|
280
|
-
return self.
|
256
|
+
return self._seriesItem
|
281
257
|
|
282
|
-
def
|
258
|
+
def setSeriesName(self, name: str):
|
283
259
|
with self.SignalBlocker(self):
|
284
|
-
self.
|
260
|
+
self._seriesItem.setText(0, name)
|
285
261
|
self.sigUpdated.emit()
|
286
262
|
|
287
|
-
def
|
288
|
-
return self.
|
263
|
+
def getSeriesName(self):
|
264
|
+
return self._seriesItem.text(0)
|
289
265
|
|
290
266
|
def addTomoObj(self, tomo_obj: TomwerObject):
|
291
267
|
if not isinstance(tomo_obj, TomwerObject):
|
@@ -324,16 +300,16 @@ class _SerieDefinitionTree(qt.QWidget):
|
|
324
300
|
def n_tomo_objs(self):
|
325
301
|
return len(self._tomo_objs)
|
326
302
|
|
327
|
-
def
|
328
|
-
if not isinstance(
|
303
|
+
def setSeries(self, series: Series) -> None:
|
304
|
+
if not isinstance(series, Series):
|
329
305
|
raise TypeError(
|
330
|
-
f"serie is expected to be an instance of {
|
306
|
+
f"serie is expected to be an instance of {Series} not {type(series)}"
|
331
307
|
)
|
332
308
|
|
333
309
|
with self.SignalBlocker(self):
|
334
310
|
self.clearTomoObjs()
|
335
|
-
self.
|
336
|
-
for tomo_obj in
|
311
|
+
self.setSeriesName(series.name)
|
312
|
+
for tomo_obj in series:
|
337
313
|
if isinstance(tomo_obj, str):
|
338
314
|
try:
|
339
315
|
tomo_obj = ScanFactory.create_tomo_object_from_identifier(
|
@@ -354,10 +330,10 @@ class _SerieDefinitionTree(qt.QWidget):
|
|
354
330
|
self.addTomoObj(tomo_obj)
|
355
331
|
self.sigUpdated.emit()
|
356
332
|
|
357
|
-
def
|
333
|
+
def getSeries(self, use_identifiers=False) -> Series:
|
358
334
|
scans = [scan for scan, _ in self._tomo_objs.values()]
|
359
|
-
return
|
360
|
-
name=self.
|
335
|
+
return Series(
|
336
|
+
name=self.getSeriesName(),
|
361
337
|
iterable=scans,
|
362
338
|
use_identifiers=use_identifiers,
|
363
339
|
)
|
@@ -378,7 +354,7 @@ class _SerieDefinitionTree(qt.QWidget):
|
|
378
354
|
if scan_item is not None:
|
379
355
|
scan_item.setSelected(True)
|
380
356
|
|
381
|
-
def _getTomoObjItem(self, tomo_obj: TomwerObject) ->
|
357
|
+
def _getTomoObjItem(self, tomo_obj: TomwerObject) -> qt.QTreeWidgetItem | None:
|
382
358
|
if not isinstance(tomo_obj, TomwerObject):
|
383
359
|
raise TypeError(
|
384
360
|
f"scan is expected to be an instance of {TomwerObject} not {type(tomo_obj)}"
|
@@ -404,7 +380,7 @@ class _SerieDefinitionTree(qt.QWidget):
|
|
404
380
|
def clearSelection(self) -> None:
|
405
381
|
self._tree.selectionModel().clearSelection()
|
406
382
|
|
407
|
-
def addScanFromNxFile(self, file_: str, entry:
|
383
|
+
def addScanFromNxFile(self, file_: str, entry: str | None = None):
|
408
384
|
try:
|
409
385
|
if entry is None:
|
410
386
|
scans = ScanFactory.create_scan_objects(scan_path=file_)
|
@@ -452,18 +428,19 @@ class _SerieDefinitionTree(qt.QWidget):
|
|
452
428
|
qt.QListWidget.dragMoveEvent(self, event)
|
453
429
|
|
454
430
|
|
455
|
-
class
|
431
|
+
class SeriesManualControlDialog(qt.QDialog):
|
456
432
|
"""
|
457
|
-
Same as the :class:`
|
458
|
-
This include a `create
|
433
|
+
Same as the :class:`SeriesManualDefinitionDialog` but with control of the serie.
|
434
|
+
This include a `create series` and a `create series and clear button`
|
459
435
|
"""
|
460
436
|
|
461
|
-
|
437
|
+
sigSeriesSend = qt.Signal(Series)
|
438
|
+
"""Signal emit when a series has been send"""
|
462
439
|
|
463
440
|
def __init__(self, parent=None) -> None:
|
464
441
|
super().__init__(parent)
|
465
442
|
self.setLayout(qt.QVBoxLayout())
|
466
|
-
self._mainWidget =
|
443
|
+
self._mainWidget = SeriesManualDefinitionDialog(parent=self)
|
467
444
|
self._mainWidget.setWindowFlags(qt.Qt.Widget)
|
468
445
|
self.layout().addWidget(self._mainWidget)
|
469
446
|
|
@@ -472,32 +449,32 @@ class SerieManualControlDialog(qt.QDialog):
|
|
472
449
|
self._buttons.addButton(self._createButton, qt.QDialogButtonBox.ActionRole)
|
473
450
|
|
474
451
|
# connect signal / slot
|
475
|
-
self._createButton.clicked.connect(self.
|
452
|
+
self._createButton.clicked.connect(self._sendSeries)
|
476
453
|
self.layout().addWidget(self._buttons)
|
477
454
|
|
478
455
|
# expose API
|
479
456
|
self.sigUpdated = self._mainWidget.sigUpdated
|
480
457
|
|
481
|
-
def
|
482
|
-
self.
|
458
|
+
def _sendSeries(self):
|
459
|
+
self.sigSeriesSend.emit(self._mainWidget.getSeries())
|
483
460
|
|
484
461
|
@property
|
485
462
|
def n_tomo_objs(self):
|
486
463
|
return self._mainWidget.n_tomo_objs
|
487
464
|
|
488
|
-
def
|
489
|
-
self._mainWidget.
|
465
|
+
def setSeriesName(self, name: str):
|
466
|
+
self._mainWidget.setSeriesName(name=name)
|
490
467
|
|
491
|
-
def
|
492
|
-
return self._mainWidget.
|
468
|
+
def getSeriesName(self) -> str:
|
469
|
+
return self._mainWidget.getSeriesName()
|
493
470
|
|
494
|
-
def
|
495
|
-
self._mainWidget.
|
471
|
+
def setSeries(self, series: Series) -> None:
|
472
|
+
self._mainWidget.setSeries(series)
|
496
473
|
|
497
|
-
def
|
498
|
-
return self._mainWidget.
|
474
|
+
def getSeries(self, *args, **kwargs) -> Series:
|
475
|
+
return self._mainWidget.getSeries(*args, **kwargs)
|
499
476
|
|
500
|
-
def addScanFromNxFile(self, file_: str, entry:
|
477
|
+
def addScanFromNxFile(self, file_: str, entry: str | None = None):
|
501
478
|
return self._mainWidget.addScanFromNxFile(file_=file_, entry=entry)
|
502
479
|
|
503
480
|
def removeSelectedScans(self) -> None:
|
@@ -515,14 +492,14 @@ class SerieManualControlDialog(qt.QDialog):
|
|
515
492
|
def removeScan(self, scan: TomwerScanBase) -> None:
|
516
493
|
self._mainWidget.removeTomoObj(scan=scan)
|
517
494
|
|
518
|
-
def
|
519
|
-
self._mainWidget.
|
495
|
+
def clearSeries(self) -> None:
|
496
|
+
self._mainWidget.clearSeries()
|
520
497
|
|
521
|
-
def
|
522
|
-
self.
|
498
|
+
def createSeries(self):
|
499
|
+
self.sigSeriesSend.emit(self.getSeries())
|
523
500
|
|
524
501
|
|
525
|
-
class
|
502
|
+
class SeriesManualFromTomoObj(qt.QWidget):
|
526
503
|
def __init__(self, parent=None) -> None:
|
527
504
|
super().__init__(parent)
|
528
505
|
style = qt.QApplication.style()
|
@@ -552,11 +529,11 @@ class SerieManualFromTomoObj(qt.QWidget):
|
|
552
529
|
self._leftArrowButton.setFixedWidth(30)
|
553
530
|
self.layout().addWidget(self._leftArrowButton, 2, 2, 1, 1)
|
554
531
|
|
555
|
-
# new
|
556
|
-
self.
|
532
|
+
# new series
|
533
|
+
self._newSeriesWidget = NewSeriesWidget(self)
|
557
534
|
self._newSerieWidgetScrollArea = qt.QScrollArea(self)
|
558
535
|
self._newSerieWidgetScrollArea.setWidgetResizable(True)
|
559
|
-
self._newSerieWidgetScrollArea.setWidget(self.
|
536
|
+
self._newSerieWidgetScrollArea.setWidget(self._newSeriesWidget)
|
560
537
|
self.layout().addWidget(self._newSerieWidgetScrollArea, 0, 3, 4, 2)
|
561
538
|
|
562
539
|
# tomo obj details
|
@@ -574,18 +551,17 @@ class SerieManualFromTomoObj(qt.QWidget):
|
|
574
551
|
def selectedTomoObjects(self) -> tuple:
|
575
552
|
"""
|
576
553
|
:return: tuple of tomo object selected on the list
|
577
|
-
:rtype: tuple
|
578
554
|
"""
|
579
555
|
items = self._tomoObjList.selectedItems()
|
580
556
|
return [item.data(qt.Qt.UserRole) for item in items]
|
581
557
|
|
582
558
|
def _removeSelectedObjs(self, *args, **kwargs):
|
583
559
|
for tomo_obj in self.selectedTomoObjects():
|
584
|
-
self.
|
560
|
+
self._newSeriesWidget.removeTomoObjToCurrentSeries(tomo_obj)
|
585
561
|
|
586
562
|
def _addSelectedObjs(self, *args, **kwargs):
|
587
563
|
for tomo_obj in self.selectedTomoObjects():
|
588
|
-
self.
|
564
|
+
self._newSeriesWidget.addTomoObjToCurrentSeries(tomo_obj)
|
589
565
|
|
590
566
|
def _updateTomoObjInfos(self, *args, **kwargs):
|
591
567
|
# should
|
@@ -597,23 +573,23 @@ class SerieManualFromTomoObj(qt.QWidget):
|
|
597
573
|
self._tomoObjInfos.setTomoObj(None)
|
598
574
|
|
599
575
|
# expose API
|
600
|
-
def
|
601
|
-
self.
|
576
|
+
def setSeries(self, series: Series):
|
577
|
+
self._newSeriesWidget.setSeries(series=series)
|
602
578
|
|
603
|
-
def
|
604
|
-
return self.
|
579
|
+
def getSeries(self, *args, **kwargs) -> Series:
|
580
|
+
return self._newSeriesWidget.getSeries(*args, **kwargs)
|
605
581
|
|
606
582
|
def addTomoObj(self, tomo_obj):
|
607
583
|
self._tomoObjList.add(tomo_obj)
|
608
584
|
|
609
|
-
def
|
610
|
-
self.
|
585
|
+
def addToCurrentSeries(self, tomo_obj):
|
586
|
+
self._newSeriesWidget.addTomoObjToCurrentSeries(tomo_obj)
|
611
587
|
|
612
|
-
def
|
613
|
-
self.
|
588
|
+
def setSeriesName(self, name: str):
|
589
|
+
self._newSeriesWidget.setSeriesName(name=name)
|
614
590
|
|
615
591
|
|
616
|
-
class
|
592
|
+
class NewSeriesWidget(qt.QWidget):
|
617
593
|
sigNameChanged = qt.Signal()
|
618
594
|
"""Emit when serie name changed"""
|
619
595
|
|
@@ -622,7 +598,7 @@ class NewSerieWidget(qt.QWidget):
|
|
622
598
|
Emit when the serie has been updated by the tree
|
623
599
|
"""
|
624
600
|
|
625
|
-
|
601
|
+
DEFAULT_SERIES_NAME = "my_series"
|
626
602
|
|
627
603
|
def __init__(self, parent=None) -> None:
|
628
604
|
super().__init__(parent)
|
@@ -630,12 +606,14 @@ class NewSerieWidget(qt.QWidget):
|
|
630
606
|
|
631
607
|
self._nameWidget = qt.QWidget(self)
|
632
608
|
self._nameWidget.setLayout(qt.QHBoxLayout())
|
633
|
-
self._nameWidget.layout().addWidget(qt.QLabel("
|
634
|
-
self._nameQLE = qt.QLineEdit(self.
|
609
|
+
self._nameWidget.layout().addWidget(qt.QLabel("series name", self))
|
610
|
+
self._nameQLE = qt.QLineEdit(self.DEFAULT_SERIES_NAME, self)
|
635
611
|
self._nameWidget.layout().addWidget(self._nameQLE)
|
636
612
|
self.layout().addWidget(self._nameWidget)
|
637
613
|
|
638
|
-
self._serieTree =
|
614
|
+
self._serieTree = _SeriesDefinitionTree(
|
615
|
+
self, serie_name=self.DEFAULT_SERIES_NAME
|
616
|
+
)
|
639
617
|
self.layout().addWidget(self._serieTree)
|
640
618
|
|
641
619
|
# Signal / slot connection
|
@@ -643,17 +621,17 @@ class NewSerieWidget(qt.QWidget):
|
|
643
621
|
self._serieTree.sigUpdated.connect(self.sigUpdated)
|
644
622
|
self._nameQLE.textChanged.connect(self._nameChangedOnQLE)
|
645
623
|
|
646
|
-
def
|
624
|
+
def setSeries(self, series: Series) -> None:
|
647
625
|
with blockSignals(self._nameQLE):
|
648
|
-
self._nameQLE.setText(
|
649
|
-
self._serieTree.
|
626
|
+
self._nameQLE.setText(series.name)
|
627
|
+
self._serieTree.setSeries(series=series)
|
650
628
|
|
651
|
-
def
|
652
|
-
return self._serieTree.
|
629
|
+
def getSeries(self, *args, **kwargs) -> Series:
|
630
|
+
return self._serieTree.getSeries(*args, **kwargs)
|
653
631
|
|
654
632
|
def _nameChangedOnQLE(self, name):
|
655
633
|
with blockSignals(self._serieTree):
|
656
|
-
self._serieTree.
|
634
|
+
self._serieTree.setSeriesName(name)
|
657
635
|
self.sigNameChanged.emit()
|
658
636
|
|
659
637
|
def _handleItemUpdate(self, item, column):
|
@@ -663,35 +641,36 @@ class NewSerieWidget(qt.QWidget):
|
|
663
641
|
self.blockSignals(old)
|
664
642
|
self.sigUpdated.emit()
|
665
643
|
|
666
|
-
def
|
644
|
+
def addTomoObjToCurrentSeries(self, tomo_obj: TomwerObject):
|
667
645
|
assert isinstance(
|
668
646
|
tomo_obj, TomwerObject
|
669
647
|
), f"invalid type {type(tomo_obj)}. {TomwerObject} expected"
|
670
648
|
self._serieTree.addTomoObj(tomo_obj)
|
671
649
|
|
672
|
-
def
|
650
|
+
def removeTomoObjToCurrentSeries(self, tomo_obj: TomwerObject):
|
673
651
|
assert isinstance(
|
674
652
|
tomo_obj, TomwerObject
|
675
653
|
), f"invalid type {type(tomo_obj)}. {TomwerObject} expected"
|
676
654
|
self._serieTree.removeTomoObj(tomo_obj)
|
677
655
|
|
678
|
-
def
|
679
|
-
return self._serieTree.
|
656
|
+
def getSeriesName(self) -> str:
|
657
|
+
return self._serieTree.getSeriesName()
|
680
658
|
|
681
|
-
def
|
682
|
-
self._serieTree.
|
659
|
+
def setSeriesName(self, name: str):
|
660
|
+
self._serieTree.setSeriesName(name=name)
|
683
661
|
|
684
662
|
|
685
|
-
class
|
663
|
+
class SeriesManualDefinitionDialog(qt.QDialog):
|
686
664
|
"""Dialog to define a serie manually"""
|
687
665
|
|
688
666
|
sigUpdated = qt.Signal()
|
667
|
+
"""emit when serie is updated"""
|
689
668
|
|
690
669
|
def __init__(self, parent=None) -> None:
|
691
670
|
super().__init__(parent)
|
692
671
|
self.setLayout(qt.QVBoxLayout())
|
693
672
|
|
694
|
-
self.
|
673
|
+
self._newSeriesWidget = NewSeriesWidget(self)
|
695
674
|
|
696
675
|
self._buttons = qt.QDialogButtonBox(parent=self)
|
697
676
|
|
@@ -711,34 +690,34 @@ class SerieManualDefinitionDialog(qt.QDialog):
|
|
711
690
|
self.layout().addWidget(self._buttons)
|
712
691
|
|
713
692
|
# connect signal / slot
|
714
|
-
self.
|
715
|
-
self.
|
693
|
+
self._newSeriesWidget.sigNameChanged.connect(self._nameChanged)
|
694
|
+
self._newSeriesWidget.sigUpdated.connect(self.sigUpdated)
|
716
695
|
self._addScanButton.clicked.connect(self.addScanFromFileDialog)
|
717
696
|
self._removeSelectedButton.clicked.connect(self.removeSelectedTomoObjs)
|
718
|
-
self._clearButton.clicked.connect(self.
|
697
|
+
self._clearButton.clicked.connect(self.clearSeries)
|
719
698
|
|
720
699
|
@property
|
721
700
|
def n_tomo_objs(self):
|
722
|
-
serieTree = self.
|
701
|
+
serieTree = self._newSeriesWidget._serieTree
|
723
702
|
return serieTree.n_tomo_objs
|
724
703
|
|
725
704
|
def _nameChanged(self, new_name):
|
726
|
-
serieTree = self.
|
705
|
+
serieTree = self._newSeriesWidget._serieTree
|
727
706
|
with blockSignals(self._serieTree):
|
728
|
-
serieTree.
|
707
|
+
serieTree.setSeriesName(name=new_name)
|
729
708
|
self.sigUpdated.emit()
|
730
709
|
|
731
|
-
def
|
732
|
-
self.
|
710
|
+
def setSeriesName(self, name: str):
|
711
|
+
self._newSeriesWidget.setSeriesName(name=name)
|
733
712
|
|
734
|
-
def
|
735
|
-
return self.
|
713
|
+
def getSeriesName(self) -> str:
|
714
|
+
return self._newSeriesWidget.getSeriesName()
|
736
715
|
|
737
|
-
def
|
738
|
-
self.
|
716
|
+
def setSeries(self, series: Series) -> None:
|
717
|
+
self._newSeriesWidget.setSeries(series)
|
739
718
|
|
740
|
-
def
|
741
|
-
return self.
|
719
|
+
def getSeries(self, *args, **kwargs) -> Series:
|
720
|
+
return self._newSeriesWidget.getSeries(*args, **kwargs)
|
742
721
|
|
743
722
|
def addScanFromFileDialog(self) -> None:
|
744
723
|
dialog = QDataDialog(self, multiSelection=True)
|
@@ -751,70 +730,70 @@ class SerieManualDefinitionDialog(qt.QDialog):
|
|
751
730
|
for folder in foldersSelected:
|
752
731
|
self.addScanFromNxFile(file_=folder, entry=None)
|
753
732
|
|
754
|
-
def addScanFromNxFile(self, file_: str, entry:
|
755
|
-
serieTree = self.
|
733
|
+
def addScanFromNxFile(self, file_: str, entry: str | None = None):
|
734
|
+
serieTree = self._newSeriesWidget._serieTree
|
756
735
|
return serieTree.addScanFromNxFile(file_=file_, entry=entry)
|
757
736
|
|
758
737
|
def removeSelectedTomoObjs(self) -> None:
|
759
|
-
serieTree = self.
|
738
|
+
serieTree = self._newSeriesWidget._serieTree
|
760
739
|
return serieTree.removeSelectedTomoObjs()
|
761
740
|
|
762
741
|
def getSelectedTomoObjs(self) -> tuple:
|
763
|
-
serieTree = self.
|
742
|
+
serieTree = self._newSeriesWidget._serieTree
|
764
743
|
return serieTree.getSelectedTomoObjs()
|
765
744
|
|
766
745
|
def setSelectedTomoObjs(self, scans: Iterable) -> None:
|
767
|
-
serieTree = self.
|
746
|
+
serieTree = self._newSeriesWidget._serieTree
|
768
747
|
serieTree.setSelectedTomoObjs(objs=scans)
|
769
748
|
|
770
749
|
def addTomoObj(self, scan: TomwerScanBase) -> None:
|
771
|
-
serieTree = self.
|
750
|
+
serieTree = self._newSeriesWidget._serieTree
|
772
751
|
return serieTree.addTomoObj(tomo_obj=scan)
|
773
752
|
|
774
753
|
def removeTomoObj(self, scan: TomwerScanBase) -> None:
|
775
|
-
serieTree = self.
|
754
|
+
serieTree = self._newSeriesWidget._serieTree
|
776
755
|
serieTree.removeTomoObj(tomo_obj=scan)
|
777
756
|
|
778
|
-
def
|
779
|
-
serieTree = self.
|
757
|
+
def clearSeries(self) -> None:
|
758
|
+
serieTree = self._newSeriesWidget._serieTree
|
780
759
|
serieTree.clearTomoObjs()
|
781
760
|
|
782
761
|
|
783
|
-
class
|
762
|
+
class SeriesAutomaticDefinitionWidget(qt.QWidget):
|
784
763
|
pass
|
785
764
|
|
786
765
|
|
787
|
-
class
|
766
|
+
class SeriesTree(qt.QWidget):
|
788
767
|
"""
|
789
|
-
Widget used to define a scan
|
768
|
+
Widget used to define a scan series from a list of scans.
|
790
769
|
"""
|
791
770
|
|
792
771
|
def __init__(self, parent=None, scans=tuple()) -> None:
|
793
772
|
self._series = {}
|
794
|
-
# associated
|
773
|
+
# associated series name (key) to tuple (series, QTreeWidgetItem)
|
795
774
|
super().__init__(parent)
|
796
775
|
self.setLayout(qt.QVBoxLayout())
|
797
776
|
self._tree = qt.QTreeWidget(self)
|
798
777
|
self._tree.setSelectionMode(qt.QAbstractItemView.MultiSelection)
|
799
778
|
self._tree.setColumnCount(2)
|
800
|
-
self._tree.setHeaderLabels(("
|
779
|
+
self._tree.setHeaderLabels(("series", "scan ids"))
|
801
780
|
self.layout().addWidget(self._tree)
|
802
781
|
|
803
782
|
# set up
|
804
|
-
[self.
|
783
|
+
[self.addSeries(scan) for scan in scans]
|
805
784
|
|
806
|
-
def
|
807
|
-
if not isinstance(
|
785
|
+
def addSeries(self, series: Series):
|
786
|
+
if not isinstance(series, Series):
|
808
787
|
raise TypeError(
|
809
|
-
f"{
|
788
|
+
f"{series} is expected to be an instance of {Series} not {type(series)}"
|
810
789
|
)
|
811
|
-
if
|
812
|
-
self.
|
790
|
+
if series.name in self._series:
|
791
|
+
self.removeSeries(self._series[series.name][0])
|
813
792
|
|
814
793
|
root_item = qt.QTreeWidgetItem(self._tree)
|
815
|
-
root_item.setText(0,
|
816
|
-
self._series[
|
817
|
-
for obj in
|
794
|
+
root_item.setText(0, series.name)
|
795
|
+
self._series[series.name] = (series, root_item)
|
796
|
+
for obj in series:
|
818
797
|
scan_item = qt.QTreeWidgetItem(root_item)
|
819
798
|
if isinstance(obj, TomwerObject):
|
820
799
|
text = obj.get_identifier().to_str()
|
@@ -823,13 +802,13 @@ class SerieTree(qt.QWidget):
|
|
823
802
|
scan_item.setText(1, text)
|
824
803
|
scan_item.setFlags(qt.Qt.NoItemFlags)
|
825
804
|
|
826
|
-
def
|
827
|
-
if not isinstance(
|
805
|
+
def removeSeries(self, series: Series):
|
806
|
+
if not isinstance(series, Series):
|
828
807
|
raise TypeError(
|
829
|
-
f"{
|
808
|
+
f"{series} is expected to be an instance of {Series} not {type(series)}"
|
830
809
|
)
|
831
|
-
if
|
832
|
-
_, serie_item = self._series.pop(
|
810
|
+
if series.name in self._series:
|
811
|
+
_, serie_item = self._series.pop(series.name)
|
833
812
|
root = self._tree.invisibleRootItem()
|
834
813
|
root.removeChild(serie_item)
|
835
814
|
|
@@ -848,35 +827,35 @@ class SerieTree(qt.QWidget):
|
|
848
827
|
def setSelectedSeries(self, series):
|
849
828
|
self.clearSelection()
|
850
829
|
for serie in series:
|
851
|
-
serie_item = self.
|
830
|
+
serie_item = self._getSeriesItem(serie)
|
852
831
|
if serie_item is not None:
|
853
832
|
serie_item.setSelected(True)
|
854
833
|
|
855
|
-
def
|
856
|
-
if not isinstance(
|
834
|
+
def _getSeriesItem(self, series: Series) -> qt.QTreeWidgetItem | None:
|
835
|
+
if not isinstance(series, Series):
|
857
836
|
raise TypeError(
|
858
|
-
f"serie is expected to be an instance of {
|
837
|
+
f"serie is expected to be an instance of {Series} not {type(series)}"
|
859
838
|
)
|
860
|
-
return self._series.get(
|
839
|
+
return self._series.get(series.name, (None, None))[1]
|
861
840
|
|
862
841
|
def getSelectedSeries(self) -> tuple():
|
863
842
|
"""return selected series"""
|
864
843
|
selected = []
|
865
|
-
for _, (
|
844
|
+
for _, (series, item) in self._series.items():
|
866
845
|
if item.isSelected():
|
867
|
-
selected.append(
|
846
|
+
selected.append(series)
|
868
847
|
return tuple(selected)
|
869
848
|
|
870
849
|
def removeSelected(self) -> None:
|
871
|
-
for
|
872
|
-
self.
|
850
|
+
for series in self.getSelectedSeries():
|
851
|
+
self.removeSeries(series)
|
873
852
|
|
874
853
|
|
875
|
-
class
|
876
|
-
|
854
|
+
class SeriesHistoryDialog(qt.QDialog):
|
855
|
+
sigSeriesSend = qt.Signal(Series)
|
877
856
|
"""signal emit when a serie has been selected by the user"""
|
878
857
|
|
879
|
-
|
858
|
+
sigEditSeries = qt.Signal(Series)
|
880
859
|
"""Signal emit when user request to edit a serie"""
|
881
860
|
|
882
861
|
sigHistoryUpdated = qt.Signal()
|
@@ -886,7 +865,7 @@ class SerieHistoryDialog(qt.QDialog):
|
|
886
865
|
super().__init__(parent)
|
887
866
|
self.setLayout(qt.QVBoxLayout())
|
888
867
|
|
889
|
-
self._serieList =
|
868
|
+
self._serieList = SeriesTree(self)
|
890
869
|
self.layout().addWidget(self._serieList)
|
891
870
|
|
892
871
|
self._buttons = qt.QDialogButtonBox(parent=self)
|
@@ -911,15 +890,15 @@ class SerieHistoryDialog(qt.QDialog):
|
|
911
890
|
self._clearButton.clicked.connect(self.clearSelection)
|
912
891
|
self._editButton.clicked.connect(self.editSelected)
|
913
892
|
|
914
|
-
def
|
893
|
+
def addSeries(self, serie: Series):
|
915
894
|
old = self.blockSignals(True)
|
916
|
-
self._serieList.
|
895
|
+
self._serieList.addSeries(serie)
|
917
896
|
self.blockSignals(old)
|
918
897
|
self.sigHistoryUpdated.emit()
|
919
898
|
|
920
|
-
def
|
899
|
+
def removeSeries(self, serie: Series):
|
921
900
|
old = self.blockSignals(True)
|
922
|
-
self._serieList.
|
901
|
+
self._serieList.removeSeries(serie)
|
923
902
|
self.blockSignals(old)
|
924
903
|
self.sigHistoryUpdated.emit()
|
925
904
|
|
@@ -934,7 +913,7 @@ class SerieHistoryDialog(qt.QDialog):
|
|
934
913
|
|
935
914
|
def sendSelected(self):
|
936
915
|
for serie in self.getSelectedSeries():
|
937
|
-
self.
|
916
|
+
self.sigSeriesSend.emit(serie)
|
938
917
|
|
939
918
|
def editSelected(self):
|
940
919
|
selected = self.getSelectedSeries()
|
@@ -944,7 +923,7 @@ class SerieHistoryDialog(qt.QDialog):
|
|
944
923
|
_logger.warning(
|
945
924
|
"more than one serie selected for edition. Will only edit the first one"
|
946
925
|
)
|
947
|
-
self.
|
926
|
+
self.sigEditSeries.emit(selected[0])
|
948
927
|
|
949
928
|
def removeSelected(self):
|
950
929
|
old = self.blockSignals(True)
|