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
@@ -0,0 +1,347 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import logging
|
4
|
+
|
5
|
+
from silx.gui import qt
|
6
|
+
|
7
|
+
from tomwer.core.process.reconstruction.axis import mode as axis_mode
|
8
|
+
from tomwer.core.process.reconstruction.axis.anglemode import CorAngleMode
|
9
|
+
from tomwer.gui.utils.scrollarea import QComboBoxIgnoreWheel
|
10
|
+
from tomwer.core.scan.scanbase import TomwerScanBase
|
11
|
+
from tomwer.gui.utils.qt_utils import block_signals
|
12
|
+
from tomwer.synctools.axis import QAxisRP
|
13
|
+
from .ManualFramesSelection import ManualFramesSelection
|
14
|
+
|
15
|
+
_logger = logging.getLogger(__name__)
|
16
|
+
|
17
|
+
|
18
|
+
class InputWidget(qt.QWidget):
|
19
|
+
"""
|
20
|
+
Widget used to define the radios or the sinogram to be used for computing the cor
|
21
|
+
Used as a tab of the AxisSettingsTabWidget
|
22
|
+
"""
|
23
|
+
|
24
|
+
sigChanged = qt.Signal()
|
25
|
+
"""Signal emitted when input changed"""
|
26
|
+
|
27
|
+
_sigUrlChanged = qt.Signal()
|
28
|
+
"""Signal emit when url to be used changed"""
|
29
|
+
|
30
|
+
def __init__(self, parent=None, axis_params=None):
|
31
|
+
assert isinstance(axis_params, QAxisRP)
|
32
|
+
self._blockUpdateAxisParams = False
|
33
|
+
super().__init__(parent)
|
34
|
+
self.setLayout(qt.QVBoxLayout())
|
35
|
+
|
36
|
+
# radio input
|
37
|
+
self._radioGB = qt.QGroupBox(self)
|
38
|
+
self._radioGB.setTitle("radios")
|
39
|
+
self._radioGB.setLayout(qt.QVBoxLayout())
|
40
|
+
self._radioGB.setCheckable(True)
|
41
|
+
self.layout().addWidget(self._radioGB)
|
42
|
+
## angle mode
|
43
|
+
self._angleModeWidget = _AngleSelectionWidget(
|
44
|
+
parent=self, axis_params=axis_params
|
45
|
+
)
|
46
|
+
self._radioGB.layout().addWidget(self._angleModeWidget)
|
47
|
+
self._axis_params = axis_params
|
48
|
+
|
49
|
+
# sinogram input
|
50
|
+
self._sinogramGB = qt.QGroupBox(self)
|
51
|
+
self._sinogramGB.setLayout(qt.QFormLayout())
|
52
|
+
|
53
|
+
self._sinogramGB.setTitle("sinogram")
|
54
|
+
self._sinogramGB.setCheckable(True)
|
55
|
+
self.layout().addWidget(self._sinogramGB)
|
56
|
+
## sinogram line
|
57
|
+
self._sinogramLineSB = _SliceSelector(self)
|
58
|
+
self._sinogramGB.layout().addRow("line", self._sinogramLineSB)
|
59
|
+
## sinogram subsampling
|
60
|
+
self._sinogramSubsampling = qt.QSpinBox(self)
|
61
|
+
self._sinogramSubsampling.setRange(1, 1000)
|
62
|
+
self._sinogramSubsampling.setValue(10)
|
63
|
+
self._sinogramGB.layout().addRow("subsampling", self._sinogramSubsampling)
|
64
|
+
|
65
|
+
self._spacer = qt.QWidget(self)
|
66
|
+
self._spacer.setSizePolicy(qt.QSizePolicy.Minimum, qt.QSizePolicy.Expanding)
|
67
|
+
self.layout().addWidget(self._spacer)
|
68
|
+
|
69
|
+
# set up
|
70
|
+
self._sinogramGB.setChecked(False)
|
71
|
+
|
72
|
+
# connect signal / slot
|
73
|
+
self._sinogramGB.toggled.connect(self._sinogramChecked)
|
74
|
+
self._radioGB.toggled.connect(self._radiosChecked)
|
75
|
+
self._sinogramSubsampling.valueChanged.connect(self._changed)
|
76
|
+
self._sinogramLineSB.sigChanged.connect(self._changed)
|
77
|
+
self._angleModeWidget.sigChanged.connect(self._sigUrlChanged)
|
78
|
+
|
79
|
+
def setScan(self, scan: TomwerScanBase):
|
80
|
+
if scan is not None:
|
81
|
+
self._angleModeWidget.setScan(scan)
|
82
|
+
self._angleModeWidget.setScanRange(scan.scan_range)
|
83
|
+
|
84
|
+
def setAxisParams(self, axis_params):
|
85
|
+
with block_signals(axis_params):
|
86
|
+
with block_signals(self._axis_params):
|
87
|
+
self._blockUpdateAxisParams = True
|
88
|
+
|
89
|
+
if axis_params is not None:
|
90
|
+
assert isinstance(axis_params, QAxisRP)
|
91
|
+
with block_signals(self._sinogramGB):
|
92
|
+
self._sinogramChecked(
|
93
|
+
axis_params.mode.requires_sinogram_index(), on_load=True
|
94
|
+
)
|
95
|
+
self._sinogramLineSB.setSlice(axis_params.sinogram_line)
|
96
|
+
self._sinogramSubsampling.setValue(axis_params.sinogram_subsampling)
|
97
|
+
self._angleModeWidget.setAxisParams(axis_params)
|
98
|
+
self._axis_params = axis_params
|
99
|
+
|
100
|
+
self._blockUpdateAxisParams = False
|
101
|
+
|
102
|
+
def getSinogramLine(self) -> str | int:
|
103
|
+
return self._sinogramLineSB.getSlice()
|
104
|
+
|
105
|
+
def getSinogramSubsampling(self) -> int:
|
106
|
+
return self._sinogramSubsampling.value()
|
107
|
+
|
108
|
+
def _sinogramChecked(self, checked, on_load=False):
|
109
|
+
with block_signals(self._radioGB):
|
110
|
+
with block_signals(self._sinogramGB):
|
111
|
+
if checked:
|
112
|
+
self._radioGB.setChecked(False)
|
113
|
+
self._sinogramGB.setChecked(True)
|
114
|
+
elif self._radioGB.isEnabled():
|
115
|
+
self._radioGB.setChecked(not checked)
|
116
|
+
elif on_load:
|
117
|
+
self._sinogramGB.setChecked(checked)
|
118
|
+
else:
|
119
|
+
# ignore it if radio disabled
|
120
|
+
self._sinogramGB.setChecked(True)
|
121
|
+
self._changed()
|
122
|
+
|
123
|
+
def _radiosChecked(self, checked, on_load=False):
|
124
|
+
with block_signals(self._radioGB):
|
125
|
+
with block_signals(self._sinogramGB):
|
126
|
+
if checked:
|
127
|
+
self._sinogramGB.setChecked(False)
|
128
|
+
self._radioGB.setChecked(True)
|
129
|
+
elif self._sinogramGB.isEnabled():
|
130
|
+
self._sinogramGB.setChecked(not checked)
|
131
|
+
elif on_load:
|
132
|
+
self._radioGB.setChecked(checked)
|
133
|
+
else:
|
134
|
+
# ignore it if sinogram disabled
|
135
|
+
self._radioGB.setChecked(True)
|
136
|
+
self._changed()
|
137
|
+
|
138
|
+
def _changed(self, *args, **kwargs):
|
139
|
+
self._updateAxisParams()
|
140
|
+
self.sigChanged.emit()
|
141
|
+
|
142
|
+
def _updateAxisParams(self):
|
143
|
+
if not self._blockUpdateAxisParams:
|
144
|
+
self._axis_params.sinogram_line = self.getSinogramLine()
|
145
|
+
self._axis_params.sinogram_subsampling = self.getSinogramSubsampling()
|
146
|
+
|
147
|
+
def setValidInputs(self, modes: list | tuple):
|
148
|
+
"""
|
149
|
+
Define possible inputs.
|
150
|
+
|
151
|
+
:raises: ValueError if modes are invalid
|
152
|
+
"""
|
153
|
+
modes = set(modes)
|
154
|
+
for mode in modes:
|
155
|
+
try:
|
156
|
+
axis_mode._InputType.from_value(mode)
|
157
|
+
except Exception:
|
158
|
+
raise ValueError(
|
159
|
+
f"mode {mode} should be an instance of {axis_mode._InputType}"
|
160
|
+
)
|
161
|
+
if len(modes) == 2:
|
162
|
+
self._sinogramGB.setEnabled(True)
|
163
|
+
self._radioGB.setEnabled(True)
|
164
|
+
elif len(modes) > 2:
|
165
|
+
raise ValueError(f"invalid input {modes}")
|
166
|
+
elif len(modes) < 0:
|
167
|
+
raise ValueError("modes is empty")
|
168
|
+
else:
|
169
|
+
mode = axis_mode._InputType.from_value(modes.pop())
|
170
|
+
if mode is axis_mode._InputType.SINOGRAM:
|
171
|
+
self._sinogramGB.setEnabled(True)
|
172
|
+
self._radioGB.setEnabled(False)
|
173
|
+
self._sinogramGB.setChecked(True)
|
174
|
+
elif mode is axis_mode._InputType.RADIOS_X2:
|
175
|
+
self._radioGB.setEnabled(True)
|
176
|
+
self._sinogramGB.setEnabled(False)
|
177
|
+
self._radioGB.setChecked(True)
|
178
|
+
elif mode is axis_mode._InputType.COMPOSITE:
|
179
|
+
# those mode are neither sinogram neither radio. Now one of the two will be checked but without any much meaning
|
180
|
+
self._radioGB.setEnabled(False)
|
181
|
+
self._sinogramGB.setEnabled(False)
|
182
|
+
else:
|
183
|
+
raise ValueError(f"Nothing implemented for {mode.value}")
|
184
|
+
|
185
|
+
|
186
|
+
class _AngleSelectionWidget(qt.QWidget):
|
187
|
+
"""Group box to select the angle to used for cor calculation
|
188
|
+
(0-180, 90-270 or manual)"""
|
189
|
+
|
190
|
+
sigChanged = qt.Signal()
|
191
|
+
"""signal emitted when the selected angle changed"""
|
192
|
+
|
193
|
+
def __init__(self, parent=None, axis_params=None):
|
194
|
+
assert isinstance(axis_params, QAxisRP)
|
195
|
+
qt.QWidget.__init__(
|
196
|
+
self,
|
197
|
+
parent=parent,
|
198
|
+
)
|
199
|
+
self.setLayout(qt.QVBoxLayout())
|
200
|
+
self._groupBoxMode = qt.QGroupBox(
|
201
|
+
self, title="Angles to use for axis calculation"
|
202
|
+
)
|
203
|
+
self._groupBoxMode.setLayout(qt.QHBoxLayout())
|
204
|
+
self.layout().addWidget(self._groupBoxMode)
|
205
|
+
|
206
|
+
self._corButtonsGps = qt.QButtonGroup(parent=self)
|
207
|
+
self._corButtonsGps.setExclusive(True)
|
208
|
+
self._qrbCOR_0_180 = qt.QRadioButton("0-180", parent=self)
|
209
|
+
self._groupBoxMode.layout().addWidget(self._qrbCOR_0_180)
|
210
|
+
self._qrbCOR_90_270 = qt.QRadioButton("90-270", parent=self)
|
211
|
+
self._qrbCOR_90_270.setToolTip(
|
212
|
+
"pick radio closest to angles 90° and "
|
213
|
+
"270°. If disable mean that the scan "
|
214
|
+
"range is 180°"
|
215
|
+
)
|
216
|
+
self._groupBoxMode.layout().addWidget(self._qrbCOR_90_270)
|
217
|
+
self._qrbCOR_manual = qt.QRadioButton("other", parent=self)
|
218
|
+
self._qrbCOR_manual.setVisible(True)
|
219
|
+
self._groupBoxMode.layout().addWidget(self._qrbCOR_manual)
|
220
|
+
# add all button to the button group
|
221
|
+
for b in (self._qrbCOR_0_180, self._qrbCOR_90_270, self._qrbCOR_manual):
|
222
|
+
self._corButtonsGps.addButton(b)
|
223
|
+
|
224
|
+
self.setAxisParams(axis_params)
|
225
|
+
|
226
|
+
self._manualFrameSelection = ManualFramesSelection(self)
|
227
|
+
self.layout().addWidget(self._manualFrameSelection)
|
228
|
+
self._manualFrameSelection.setVisible(False)
|
229
|
+
|
230
|
+
# connect signal / Slot
|
231
|
+
self._corButtonsGps.buttonClicked.connect(self._angleModeChanged)
|
232
|
+
self._manualFrameSelection.sigChanged.connect(self._changed)
|
233
|
+
|
234
|
+
def setScan(self, scan: TomwerScanBase):
|
235
|
+
if scan is not None:
|
236
|
+
self.setScanRange(scan.scan_range)
|
237
|
+
self._manualFrameSelection.setScan(scan=scan)
|
238
|
+
|
239
|
+
def setScanRange(self, scanRange):
|
240
|
+
if scanRange == 180:
|
241
|
+
self._qrbCOR_90_270.setEnabled(False)
|
242
|
+
# force using 0-180 if was using 90-270
|
243
|
+
if self._qrbCOR_90_270.isChecked():
|
244
|
+
self._qrbCOR_0_180.setChecked(True)
|
245
|
+
self._axis_params.angle_mode = CorAngleMode.use_0_180
|
246
|
+
else:
|
247
|
+
self._qrbCOR_90_270.setEnabled(True)
|
248
|
+
|
249
|
+
def setAngleMode(self, mode):
|
250
|
+
"""
|
251
|
+
|
252
|
+
:param mode: mode to use (can be manual , 90-270 or 0-180)
|
253
|
+
"""
|
254
|
+
assert isinstance(mode, CorAngleMode)
|
255
|
+
if mode == CorAngleMode.use_0_180:
|
256
|
+
self._qrbCOR_0_180.setChecked(True)
|
257
|
+
elif mode == CorAngleMode.use_90_270:
|
258
|
+
self._qrbCOR_90_270.setChecked(True)
|
259
|
+
else:
|
260
|
+
self._qrbCOR_manual.setChecked(True)
|
261
|
+
|
262
|
+
def getAngleMode(self) -> CorAngleMode:
|
263
|
+
"""
|
264
|
+
|
265
|
+
:return: the angle to use for the axis calculation
|
266
|
+
"""
|
267
|
+
if self._qrbCOR_90_270.isChecked():
|
268
|
+
return CorAngleMode.use_90_270
|
269
|
+
elif self._qrbCOR_0_180.isChecked():
|
270
|
+
return CorAngleMode.use_0_180
|
271
|
+
else:
|
272
|
+
return CorAngleMode.manual_selection
|
273
|
+
|
274
|
+
def setAxisParams(self, axis_params):
|
275
|
+
with block_signals(self):
|
276
|
+
self._axis_params = axis_params
|
277
|
+
# set up
|
278
|
+
self.setAngleMode(axis_params.angle_mode)
|
279
|
+
|
280
|
+
def _angleModeChanged(self, *args, **kwargs):
|
281
|
+
self._axis_params.angle_mode = self.getAngleMode()
|
282
|
+
if self.getAngleMode() is CorAngleMode.manual_selection:
|
283
|
+
self._axis_params.angle_mode_extra = (
|
284
|
+
self._manualFrameSelection.getFramesUrl()
|
285
|
+
)
|
286
|
+
else:
|
287
|
+
self._axis_params.angle_mode_extra = None
|
288
|
+
self._manualFrameSelection.setVisible(
|
289
|
+
self.getAngleMode() is CorAngleMode.manual_selection
|
290
|
+
)
|
291
|
+
self._changed()
|
292
|
+
|
293
|
+
def _changed(self):
|
294
|
+
self.sigChanged.emit()
|
295
|
+
|
296
|
+
|
297
|
+
class _SliceSelector(qt.QWidget):
|
298
|
+
sigChanged = qt.Signal()
|
299
|
+
"""signal emit when the selected slice change"""
|
300
|
+
|
301
|
+
def __init__(self, parent):
|
302
|
+
qt.QWidget.__init__(self, parent)
|
303
|
+
self.setLayout(qt.QHBoxLayout())
|
304
|
+
self.setContentsMargins(0, 0, 0, 0)
|
305
|
+
self.layout().setContentsMargins(0, 0, 0, 0)
|
306
|
+
self._modeCB = QComboBoxIgnoreWheel(self)
|
307
|
+
self._modeCB.addItem("middle")
|
308
|
+
self._modeCB.addItem("other")
|
309
|
+
self.layout().addWidget(self._modeCB)
|
310
|
+
self._otherSB = qt.QSpinBox(self)
|
311
|
+
self._otherSB.setRange(0, 10000)
|
312
|
+
self.layout().addWidget(self._otherSB)
|
313
|
+
|
314
|
+
# connect signal / slot
|
315
|
+
self._otherSB.valueChanged.connect(self._valueChanged)
|
316
|
+
self._modeCB.currentIndexChanged.connect(self._modeChanged)
|
317
|
+
# set up
|
318
|
+
self._modeChanged()
|
319
|
+
|
320
|
+
def getSlice(self) -> int | str:
|
321
|
+
"return a specific slice index or 'middle'"
|
322
|
+
if self.getMode() == "middle":
|
323
|
+
return "middle"
|
324
|
+
else:
|
325
|
+
return self._otherSB.value()
|
326
|
+
|
327
|
+
def setSlice(self, slice_):
|
328
|
+
if slice_ is None:
|
329
|
+
return
|
330
|
+
if slice_ == "middle":
|
331
|
+
idx = self._modeCB.findText("middle")
|
332
|
+
self._modeCB.setCurrentIndex(idx)
|
333
|
+
else:
|
334
|
+
idx = self._modeCB.findText("other")
|
335
|
+
self._modeCB.setCurrentIndex(idx)
|
336
|
+
self._otherSB.setValue(slice_)
|
337
|
+
self.sigChanged.emit()
|
338
|
+
|
339
|
+
def getMode(self):
|
340
|
+
return self._modeCB.currentText()
|
341
|
+
|
342
|
+
def _valueChanged(self):
|
343
|
+
self.sigChanged.emit()
|
344
|
+
|
345
|
+
def _modeChanged(self, *args, **kwargs):
|
346
|
+
self._otherSB.setVisible(self.getMode() == "other")
|
347
|
+
self._valueChanged()
|
@@ -0,0 +1,168 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import logging
|
4
|
+
from bisect import bisect_left
|
5
|
+
|
6
|
+
from silx.gui import qt
|
7
|
+
from silx.io.url import DataUrl
|
8
|
+
|
9
|
+
from tomwer.core.scan.scanbase import TomwerScanBase
|
10
|
+
|
11
|
+
_logger = logging.getLogger(__name__)
|
12
|
+
|
13
|
+
|
14
|
+
class ManualFramesSelection(qt.QWidget):
|
15
|
+
"""Allows to select frame - angle to be used."""
|
16
|
+
|
17
|
+
sigChanged = qt.Signal()
|
18
|
+
"""Signal emit when the frame selection changes"""
|
19
|
+
|
20
|
+
def __init__(self, parent=None) -> None:
|
21
|
+
super().__init__(parent)
|
22
|
+
self._anglesAvailable = []
|
23
|
+
# cache of the angles available from the current defined frames. Must be sorted !!!
|
24
|
+
self.setLayout(qt.QGridLayout())
|
25
|
+
self.layout().addWidget(qt.QLabel("frame 1", self), 0, 0, 1, 1)
|
26
|
+
self._frame1CB = qt.QComboBox(self)
|
27
|
+
self._frame1CB.setEditable(True)
|
28
|
+
self.layout().addWidget(self._frame1CB, 0, 1, 1, 1)
|
29
|
+
|
30
|
+
self.layout().addWidget(qt.QLabel("frame 2", self), 1, 0, 1, 1)
|
31
|
+
self._frame2CB = qt.QComboBox(self)
|
32
|
+
self._frame2CB.setEditable(True)
|
33
|
+
self.layout().addWidget(self._frame2CB, 1, 1, 1, 1)
|
34
|
+
self._findAssociatedAnglePB = qt.QPushButton("+180°", self)
|
35
|
+
button_180_font = self.font()
|
36
|
+
button_180_font.setPixelSize(10)
|
37
|
+
self._findAssociatedAnglePB.setFont(button_180_font)
|
38
|
+
self._findAssociatedAnglePB.setFixedWidth(30)
|
39
|
+
self._findAssociatedAnglePB.setSizePolicy(
|
40
|
+
qt.QSizePolicy.Minimum, qt.QSizePolicy.Minimum
|
41
|
+
)
|
42
|
+
self.layout().addWidget(self._findAssociatedAnglePB, 1, 2, 1, 1)
|
43
|
+
self._flipLRCB = qt.QCheckBox("flip L-R")
|
44
|
+
self._flipLRCB.setChecked(True)
|
45
|
+
self.layout().addWidget(self._flipLRCB, 1, 3, 1, 1)
|
46
|
+
|
47
|
+
self._flipLRCB.toggled.connect(self._changed)
|
48
|
+
self._frame1CB.currentIndexChanged.connect(self._changed)
|
49
|
+
self._frame2CB.currentIndexChanged.connect(self._changed)
|
50
|
+
self._findAssociatedAnglePB.released.connect(self._findAssociatedAngle)
|
51
|
+
|
52
|
+
def _findAssociatedAngle(self):
|
53
|
+
if self._frame1CB.count() == 0 or len(self._anglesAvailable) == 0:
|
54
|
+
_logger.warning("no angles available, unable to get '+180°' frame")
|
55
|
+
else:
|
56
|
+
angle = float(self._frame1CB.currentText())
|
57
|
+
# look for the closest 'associated' angle.
|
58
|
+
# as the angles are not limited to [0-360] we need to check for any value.
|
59
|
+
# if the angle is on the first part of the acquisition we expect to find it near angle +180
|
60
|
+
# if it is on the second part (for 360 degree) we expect to find it on the first part (0-180)
|
61
|
+
closest_pls_180_angle = self._getClosestAssociatedAngle(
|
62
|
+
angle + 180.0, self._anglesAvailable
|
63
|
+
)
|
64
|
+
score_add = abs(closest_pls_180_angle - angle)
|
65
|
+
closest_minus_180_angle = self._getClosestAssociatedAngle(
|
66
|
+
angle - 180.0, self._anglesAvailable
|
67
|
+
)
|
68
|
+
score_sub = abs(closest_minus_180_angle - angle)
|
69
|
+
if score_add >= score_sub:
|
70
|
+
closest_180_angle = closest_pls_180_angle
|
71
|
+
else:
|
72
|
+
closest_180_angle = closest_minus_180_angle
|
73
|
+
item_idx = self._frame2CB.findText(self._angleToStr(closest_180_angle))
|
74
|
+
if item_idx < 0:
|
75
|
+
_logger.error(f"Unable to find item for angle {closest_180_angle}")
|
76
|
+
else:
|
77
|
+
self._frame2CB.setCurrentIndex(item_idx)
|
78
|
+
|
79
|
+
@staticmethod
|
80
|
+
def _getClosestAssociatedAngle(angle: float, angles: tuple) -> float:
|
81
|
+
"""
|
82
|
+
return the angle closest angle to 'angle' from 'angles'
|
83
|
+
|
84
|
+
:warning: angles should be already sorted !!!
|
85
|
+
"""
|
86
|
+
if angles is None or len(angles) == 0:
|
87
|
+
return None
|
88
|
+
if angle in angles:
|
89
|
+
return angle
|
90
|
+
pos = bisect_left(angles, angle)
|
91
|
+
if pos == 0:
|
92
|
+
return angles[0]
|
93
|
+
elif pos > len(angles) - 1:
|
94
|
+
return angles[-1]
|
95
|
+
else:
|
96
|
+
left_angle = angles[pos - 1]
|
97
|
+
right_angle = angles[pos]
|
98
|
+
if abs(right_angle - angle) > abs(left_angle - angle):
|
99
|
+
return left_angle
|
100
|
+
else:
|
101
|
+
return right_angle
|
102
|
+
|
103
|
+
def _changed(self):
|
104
|
+
self.sigChanged.emit()
|
105
|
+
|
106
|
+
@staticmethod
|
107
|
+
def _angleToStr(angle: float) -> str:
|
108
|
+
return f"{float(angle):0.3f}"
|
109
|
+
|
110
|
+
def setScan(self, scan: TomwerScanBase | None) -> None:
|
111
|
+
self._anglesAvailable.clear()
|
112
|
+
self._frame1CB.clear()
|
113
|
+
self._frame2CB.clear()
|
114
|
+
if scan is None:
|
115
|
+
return
|
116
|
+
current_angle1 = self._getFrame1Angle()
|
117
|
+
current_angle2 = self._getFrame2Angle()
|
118
|
+
for proj_angle, proj_url in scan.get_proj_angle_url().items():
|
119
|
+
try:
|
120
|
+
angle = self._angleToStr(proj_angle)
|
121
|
+
except Exception:
|
122
|
+
angle = proj_angle
|
123
|
+
else:
|
124
|
+
self._anglesAvailable.append(float(proj_angle))
|
125
|
+
self._frame1CB.addItem(angle, proj_url)
|
126
|
+
self._frame2CB.addItem(angle, proj_url)
|
127
|
+
|
128
|
+
self._anglesAvailable.sort()
|
129
|
+
|
130
|
+
idx = self._frame1CB.findText(current_angle1)
|
131
|
+
if idx >= 0:
|
132
|
+
self._frame1CB.setCurrentIndex(idx)
|
133
|
+
if current_angle1 == current_angle2:
|
134
|
+
# if the two current angle are close then we consider it is better to look for angleX - angleX + 180 angles
|
135
|
+
# instead of finding back angles
|
136
|
+
self._findAssociatedAngle()
|
137
|
+
else:
|
138
|
+
idx = self._frame1CB.findText(current_angle1)
|
139
|
+
if idx >= 0:
|
140
|
+
self._frame1CB.setCurrentIndex(idx)
|
141
|
+
|
142
|
+
idx = self._frame2CB.findText(current_angle2)
|
143
|
+
if idx >= 0:
|
144
|
+
self._frame2CB.setCurrentIndex(idx)
|
145
|
+
|
146
|
+
def getFramesUrl(self, as_txt=False) -> tuple:
|
147
|
+
"""
|
148
|
+
Return a tuple of (frame 1 url, frame 2 url). Url can be None
|
149
|
+
"""
|
150
|
+
if as_txt:
|
151
|
+
return self.getFrame1Url().path(), self.getFrame2Url().path()
|
152
|
+
else:
|
153
|
+
return self.getFrame1Url(), self.getFrame2Url()
|
154
|
+
|
155
|
+
def getFrame1Url(self) -> DataUrl | None:
|
156
|
+
return self._frame1CB.currentData()
|
157
|
+
|
158
|
+
def getFrame2Url(self) -> DataUrl | None:
|
159
|
+
return self._frame2CB.currentData()
|
160
|
+
|
161
|
+
def _getFrame1Angle(self) -> str | None:
|
162
|
+
return self._frame1CB.currentText()
|
163
|
+
|
164
|
+
def _getFrame2Angle(self) -> str | None:
|
165
|
+
return self._frame2CB.currentText()
|
166
|
+
|
167
|
+
def isFrame2LRFLip(self):
|
168
|
+
return self._flipLRCB.isChecked()
|
@@ -1,2 +1,2 @@
|
|
1
|
-
from .
|
2
|
-
from .
|
1
|
+
from .AxisMainWindow import AxisMainWindow # noqa F401
|
2
|
+
from .AxisWidget import AxisWidget # noqa F401
|
@@ -1,27 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
# /*##########################################################################
|
3
|
-
#
|
4
|
-
# Copyright (c) 2016-2017 European Synchrotron Radiation Facility
|
5
|
-
#
|
6
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
-
# of this software and associated documentation files (the "Software"), to deal
|
8
|
-
# in the Software without restriction, including without limitation the rights
|
9
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
-
# copies of the Software, and to permit persons to whom the Software is
|
11
|
-
# furnished to do so, subject to the following conditions:
|
12
|
-
#
|
13
|
-
# The above copyright notice and this permission notice shall be included in
|
14
|
-
# all copies or substantial portions of the Software.
|
15
|
-
#
|
16
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
|
-
# THE SOFTWARE.
|
23
|
-
#
|
24
|
-
# ###########################################################################*/
|
25
|
-
__authors__ = ["H. Payno"]
|
26
|
-
__license__ = "MIT"
|
27
|
-
__date__ = "09/02/2018"
|
@@ -1,36 +1,7 @@
|
|
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__ = ["C. Nemoz", "H. Payno"]
|
27
|
-
__license__ = "MIT"
|
28
|
-
__date__ = "13/08/2021"
|
29
|
-
|
1
|
+
from __future__ import annotations
|
30
2
|
|
31
3
|
import logging
|
32
4
|
import shutil
|
33
|
-
from typing import Union
|
34
5
|
|
35
6
|
from silx.gui import qt
|
36
7
|
from silx.gui.dialog.DataFileDialog import DataFileDialog
|
@@ -169,7 +140,7 @@ class RefCopyWidget(qt.QGroupBox):
|
|
169
140
|
"""
|
170
141
|
|
171
142
|
:param parent: Qt parent
|
172
|
-
:param
|
143
|
+
:param save_dir: where the dark and flats 'references' are stored
|
173
144
|
"""
|
174
145
|
qt.QGroupBox.__init__(self, "activate", parent)
|
175
146
|
self.__save_dir = save_dir
|
@@ -180,7 +151,7 @@ class RefCopyWidget(qt.QGroupBox):
|
|
180
151
|
"""
|
181
152
|
The copy action happen after the reduced (computed) darks and flats. It can be activate or not. \n\n
|
182
153
|
Reduced darks and / or flats can be registered and then copy to scan without darks or flat. \n
|
183
|
-
You can set manually Darks and flat (button displayed when the mode auto is
|
154
|
+
You can set manually Darks and flat (button displayed when the mode auto is unchecked.) \n
|
184
155
|
Otherwise if the mode 'auto' is activated then each time he meets scan with dark and / or flat it will register those as the one to be copied. \n
|
185
156
|
|
186
157
|
Then each time the copy action meets scan without reduced dark and / or flat it will copy them. \n
|
@@ -306,8 +277,8 @@ class RefCopyWidget(qt.QGroupBox):
|
|
306
277
|
"""
|
307
278
|
return self.isChecked()
|
308
279
|
|
309
|
-
def save_darks_to_be_copied(self, darks:
|
280
|
+
def save_darks_to_be_copied(self, darks: DataUrl | dict):
|
310
281
|
DarkRefsCopy.save_darks_to_be_copied(data=darks, save_dir=self.__save_dir)
|
311
282
|
|
312
|
-
def save_flats_to_be_copied(self, flats:
|
283
|
+
def save_flats_to_be_copied(self, flats: DataUrl | dict):
|
313
284
|
DarkRefsCopy.save_flats_to_be_copied(data=flats, save_dir=self.__save_dir)
|
@@ -1,31 +1,5 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
|
3
|
-
#
|
4
|
-
# Copyright (c) 2016-2017 European Synchrotron Radiation Facility
|
5
|
-
#
|
6
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
-
# of this software and associated documentation files (the "Software"), to deal
|
8
|
-
# in the Software without restriction, including without limitation the rights
|
9
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
-
# copies of the Software, and to permit persons to whom the Software is
|
11
|
-
# furnished to do so, subject to the following conditions:
|
12
|
-
#
|
13
|
-
# The above copyright notice and this permission notice shall be included in
|
14
|
-
# all copies or substantial portions of the Software.
|
15
|
-
#
|
16
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
|
-
# THE SOFTWARE.
|
23
|
-
#
|
24
|
-
# ###########################################################################*/
|
25
|
-
|
26
|
-
__authors__ = ["H. Payno"]
|
27
|
-
__license__ = "MIT"
|
28
|
-
__date__ = "10/01/2018"
|
2
|
+
from __future__ import annotations
|
29
3
|
|
30
4
|
|
31
5
|
import logging
|