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,48 +1,16 @@
|
|
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__ = "04/03/2019"
|
29
|
-
|
1
|
+
from __future__ import annotations
|
30
2
|
|
31
3
|
import logging
|
32
|
-
import os
|
33
4
|
from collections import namedtuple
|
34
|
-
from typing import Union
|
35
5
|
|
36
|
-
import h5py
|
37
6
|
import numpy
|
38
7
|
from silx.io.url import DataUrl
|
39
|
-
from silx.utils.deprecation import deprecated
|
40
8
|
from silx.utils.enum import Enum as _Enum
|
41
9
|
from tomoscan.esrf.scan.utils import get_data
|
42
10
|
|
43
|
-
from tomwer.core.process.
|
11
|
+
from tomwer.core.process.reconstruction.utils.cor import relative_pos_to_absolute
|
12
|
+
from tomwer.core.process.reconstruction.axis.side import Side
|
44
13
|
from tomwer.core.scan.scanbase import TomwerScanBase
|
45
|
-
from tomwer.core.utils.spec import getParametersFromParOrInfo
|
46
14
|
|
47
15
|
from .anglemode import CorAngleMode
|
48
16
|
from .mode import AxisMode, AXIS_MODE_METADATAS
|
@@ -110,13 +78,14 @@ class AxisResource(object):
|
|
110
78
|
"""Paganin configuration for axis calculation. To simplify we have only one
|
111
79
|
static configuration for now. Otherwise complicate stuff"""
|
112
80
|
|
113
|
-
def __init__(self, url):
|
81
|
+
def __init__(self, url: None | DataUrl, angle: float | None = None):
|
114
82
|
assert url is None or isinstance(url, DataUrl)
|
115
83
|
assert url is None or url.is_valid()
|
116
84
|
self.__url = url
|
117
85
|
self.__raw_data = None
|
118
86
|
self.__norme_data = None
|
119
87
|
self.__norm_paganin = None
|
88
|
+
self.__angle = angle
|
120
89
|
|
121
90
|
def __str__(self):
|
122
91
|
return f"{type(self)}, url: {self.__url.path() if self.__url else None}"
|
@@ -149,6 +118,10 @@ class AxisResource(object):
|
|
149
118
|
def normalized_data(self, data):
|
150
119
|
self.__norme_data = data
|
151
120
|
|
121
|
+
@property
|
122
|
+
def angle(self) -> float | None:
|
123
|
+
return self.__angle
|
124
|
+
|
152
125
|
def normalize_data(self, scan, log_):
|
153
126
|
"""Normalize data for axis calculation"""
|
154
127
|
if not isinstance(scan, TomwerScanBase):
|
@@ -183,8 +156,7 @@ class AxisResource(object):
|
|
183
156
|
def normalized_data_paganin(self):
|
184
157
|
"""
|
185
158
|
|
186
|
-
:return: data processed by the
|
187
|
-
:rtype: 2D numpy.array
|
159
|
+
:return: data processed by the Pagagin phase retrieval
|
188
160
|
"""
|
189
161
|
if self.__url is None:
|
190
162
|
return None
|
@@ -216,7 +188,7 @@ class AxisResource(object):
|
|
216
188
|
|
217
189
|
class AxisRP:
|
218
190
|
"""
|
219
|
-
Configuration class for a tomwer :class:`
|
191
|
+
Configuration class for a tomwer :class:`AxisTask`
|
220
192
|
|
221
193
|
note: every modification on the parameters will process a call fo changed
|
222
194
|
except `axis_url_1` and `axis_url_2` which will produce a call to the
|
@@ -240,11 +212,12 @@ class AxisRP:
|
|
240
212
|
"FINE_STEP_X",
|
241
213
|
"SCALE_IMG2_TO_IMG1",
|
242
214
|
"NEAR_POSITION",
|
215
|
+
"MOTOR_OFFSET",
|
216
|
+
"X_ROTATION_AXIS_PIXEL_POSITION",
|
243
217
|
"SINOGRAM_SUBSAMPLING",
|
244
218
|
"PADDING_MODE",
|
245
219
|
"FLIP_LR",
|
246
220
|
"COMPOSITE_OPTS",
|
247
|
-
"SIDE",
|
248
221
|
"COR_OPTIONS",
|
249
222
|
)
|
250
223
|
|
@@ -259,17 +232,18 @@ class AxisRP:
|
|
259
232
|
None is not processing"""
|
260
233
|
self.__angle_mode = CorAngleMode.use_0_180
|
261
234
|
"""Angle to use for radios"""
|
235
|
+
self.__x_rotation_axis_pixel_position = None
|
236
|
+
"""rotation axis position obtained from motor"""
|
237
|
+
self.__x_rotation_axis_pos_px_offset = 0.0
|
238
|
+
"""motor offset to be used to compute the 'estimated_cor' from 'x_rotation_axis_pixel_position'"""
|
262
239
|
self.__estimated_cor = 0.0
|
263
|
-
"""
|
240
|
+
"""Estimated position of the center of rotation. Given by the user or computed from 'x_rotation_axis_pixel_position' and 'pixel_offset'"""
|
264
241
|
self.__axis_url_1 = AxisResource(url=None)
|
265
242
|
"""first data url to use for axis cor calculation"""
|
266
243
|
self.__axis_url_2 = AxisResource(url=None)
|
267
244
|
"""second data url to use for axis cor calculation"""
|
268
245
|
self.__calculation_input_type = AxisCalculationInput.transmission
|
269
246
|
"""Type of input (emission, absorption, with or without paganin)"""
|
270
|
-
self.__use_sinogram = False
|
271
|
-
"""Do we want to use the sinogram of the radios for computing center
|
272
|
-
of rotation"""
|
273
247
|
self.__sinogram_line = "middle"
|
274
248
|
"""Line of the radios to use for getting the sinogram"""
|
275
249
|
self.__sinogram_subsampling = 10
|
@@ -278,17 +252,14 @@ class AxisRP:
|
|
278
252
|
self.__look_at_stdmax = False
|
279
253
|
"""do the near search at X position which as the max Y column standard
|
280
254
|
deviation"""
|
281
|
-
self.
|
255
|
+
self.__composite_window_size = 5
|
282
256
|
"""do the near search in an X window of size +-near_wx"""
|
283
|
-
self.
|
257
|
+
self.__composite_fine_step = 0.1
|
284
258
|
"""shift step x for fine shifting image"""
|
285
259
|
self.__scale_img2_to_img1 = False
|
286
260
|
"""do image scaling"""
|
287
261
|
self.__padding_mode = None
|
288
262
|
self.__frame_width = None
|
289
|
-
self.__side = "right"
|
290
|
-
"""side of the cor. Requested by nabu cor algorithms growing-window
|
291
|
-
and sliding-window"""
|
292
263
|
self.__flip_lr = True
|
293
264
|
self.__composite_options = {
|
294
265
|
"theta": DEFAULT_CMP_THETA,
|
@@ -308,41 +279,11 @@ class AxisRP:
|
|
308
279
|
|
309
280
|
@mode.setter
|
310
281
|
def mode(self, mode):
|
311
|
-
|
312
|
-
try:
|
313
|
-
name = mode
|
314
|
-
if name in ("global_", "global"):
|
315
|
-
name = AxisMode.global_.name
|
316
|
-
elif name == "accurate":
|
317
|
-
_logger.info(
|
318
|
-
f"convert axis mode {name} to {AxisMode.centered.name} (renamed)"
|
319
|
-
)
|
320
|
-
name = AxisMode.centered.name
|
321
|
-
elif name == "growing-window":
|
322
|
-
_logger.warning(
|
323
|
-
f"growing-window mode has been removed. Replace it by {AxisMode.growing_window_radios.value}"
|
324
|
-
)
|
325
|
-
name = AxisMode.growing_window_radios.name
|
326
|
-
elif name == "sliding-window":
|
327
|
-
_logger.warning(
|
328
|
-
f"sliding-window mode has been removed. Replace it by {AxisMode.sliding_window_radios.value}"
|
329
|
-
)
|
330
|
-
name = AxisMode.sliding_window_radios.name
|
331
|
-
try:
|
332
|
-
_mode = getattr(AxisMode, name)
|
333
|
-
except Exception:
|
334
|
-
_mode = AxisMode.from_value(name)
|
335
|
-
except Exception:
|
336
|
-
raise ValueError(f"Fail to create axis mode from {mode}")
|
337
|
-
else:
|
338
|
-
if not isinstance(mode, AxisMode):
|
339
|
-
raise TypeError(f"mode is expected to be an instance of {AxisMode}")
|
340
|
-
_mode = mode
|
341
|
-
self.__mode = _mode
|
282
|
+
self.__mode = AxisMode.from_value(mode)
|
342
283
|
self.changed()
|
343
284
|
|
344
285
|
@property
|
345
|
-
def frame_width(self) ->
|
286
|
+
def frame_width(self) -> float | None:
|
346
287
|
return self.__frame_width
|
347
288
|
|
348
289
|
@frame_width.setter
|
@@ -369,11 +310,6 @@ class AxisRP:
|
|
369
310
|
self.__angle_mode = mode
|
370
311
|
self.changed()
|
371
312
|
|
372
|
-
@property
|
373
|
-
@deprecated(replacement="relative_cor_value", since_version="0.7")
|
374
|
-
def value_ref_tomwer(self):
|
375
|
-
return self.relative_cor_value
|
376
|
-
|
377
313
|
@property
|
378
314
|
def relative_cor_value(self):
|
379
315
|
return self.__relative_value
|
@@ -385,7 +321,7 @@ class AxisRP:
|
|
385
321
|
def set_relative_value(self, value):
|
386
322
|
if not isinstance(value, (int, float, str, type(None))):
|
387
323
|
raise TypeError(
|
388
|
-
f"value is expected to be an instance of {int} {float}, {str} or {None}. {type(value)} provided"
|
324
|
+
f"value is expected to be an instance of {int}, {float}, {str}, or {None}. {type(value)} provided"
|
389
325
|
)
|
390
326
|
if value is None:
|
391
327
|
changed = self.__relative_value is not None
|
@@ -400,41 +336,46 @@ class AxisRP:
|
|
400
336
|
else:
|
401
337
|
self.__relative_value = float(value)
|
402
338
|
if self.frame_width is not None:
|
403
|
-
self.__absolute_value = (
|
404
|
-
self.__relative_value
|
339
|
+
self.__absolute_value = relative_pos_to_absolute(
|
340
|
+
relative_pos=self.__relative_value, det_width=self.frame_width
|
405
341
|
)
|
406
342
|
self.changed()
|
407
343
|
|
408
|
-
@deprecated(replacement="set_relative_value", since_version="0.7")
|
409
|
-
def set_value_ref_tomwer(self, value):
|
410
|
-
self.set_relative_value(value=value)
|
411
|
-
|
412
|
-
@property
|
413
|
-
@deprecated(replacement="absolute_cor_value", since_version="0.7")
|
414
|
-
def value_ref_nabu(self):
|
415
|
-
return self.__absolute_value
|
416
|
-
|
417
344
|
@property
|
418
|
-
def estimated_cor(self):
|
345
|
+
def estimated_cor(self) -> Side | float | None:
|
419
346
|
return self.__estimated_cor
|
420
347
|
|
421
348
|
@estimated_cor.setter
|
422
|
-
def estimated_cor(self, value):
|
349
|
+
def estimated_cor(self, value: Side | float | None):
|
350
|
+
try:
|
351
|
+
value = Side.from_value(value)
|
352
|
+
except ValueError:
|
353
|
+
pass
|
423
354
|
if self.__estimated_cor != value:
|
424
355
|
self.__estimated_cor = value
|
425
356
|
self.changed()
|
426
357
|
|
427
358
|
@property
|
428
|
-
def
|
429
|
-
return self.
|
430
|
-
|
431
|
-
@
|
432
|
-
def
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
359
|
+
def x_rotation_axis_pos_px_offset(self) -> float:
|
360
|
+
return self.__x_rotation_axis_pos_px_offset
|
361
|
+
|
362
|
+
@x_rotation_axis_pos_px_offset.setter
|
363
|
+
def x_rotation_axis_pos_px_offset(self, value: float):
|
364
|
+
assert isinstance(
|
365
|
+
value, float
|
366
|
+
), f"x_rotation_axis_pos_px_offset should be a float. Got {type(value)}"
|
367
|
+
self.__x_rotation_axis_pos_px_offset = value
|
368
|
+
|
369
|
+
@property
|
370
|
+
def x_rotation_axis_pixel_position(self) -> float | None:
|
371
|
+
return self.__x_rotation_axis_pixel_position
|
372
|
+
|
373
|
+
@x_rotation_axis_pixel_position.setter
|
374
|
+
def x_rotation_axis_pixel_position(self, value: float | None):
|
375
|
+
assert isinstance(
|
376
|
+
value, (float, type(None))
|
377
|
+
), f"x_rotation_axis_pixel_position should be None or a float. Got{type(value)}"
|
378
|
+
self.__x_rotation_axis_pixel_position = value
|
438
379
|
|
439
380
|
@property
|
440
381
|
def axis_url_1(self):
|
@@ -518,16 +459,6 @@ class AxisRP:
|
|
518
459
|
self.__calculation_input_type = type_
|
519
460
|
self.changed()
|
520
461
|
|
521
|
-
@property
|
522
|
-
def use_sinogram(self):
|
523
|
-
return self.__use_sinogram
|
524
|
-
|
525
|
-
@use_sinogram.setter
|
526
|
-
def use_sinogram(self, sinogram):
|
527
|
-
if self.__use_sinogram != sinogram:
|
528
|
-
self.__use_sinogram = sinogram
|
529
|
-
self.changed()
|
530
|
-
|
531
462
|
@property
|
532
463
|
def sinogram_line(self):
|
533
464
|
return self.__sinogram_line
|
@@ -568,23 +499,24 @@ class AxisRP:
|
|
568
499
|
self.__look_at_stdmax = stdmax
|
569
500
|
|
570
501
|
@property
|
571
|
-
def
|
572
|
-
return self.
|
502
|
+
def composite_window_size(self):
|
503
|
+
return self.__composite_window_size
|
573
504
|
|
574
|
-
@
|
575
|
-
def
|
576
|
-
if self.
|
577
|
-
self.
|
505
|
+
@composite_window_size.setter
|
506
|
+
def composite_window_size(self, width):
|
507
|
+
if self.__composite_window_size != width:
|
508
|
+
self.__composite_window_size = width
|
578
509
|
self.changed()
|
579
510
|
|
580
511
|
@property
|
581
|
-
def
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
512
|
+
def composite_fine_step(self):
|
513
|
+
"""Fine step along x axis"""
|
514
|
+
return self.__composite_fine_step
|
515
|
+
|
516
|
+
@composite_fine_step.setter
|
517
|
+
def composite_fine_step(self, step_size):
|
518
|
+
if self.__composite_fine_step != step_size:
|
519
|
+
self.__composite_fine_step = step_size
|
588
520
|
self.changed()
|
589
521
|
|
590
522
|
@property
|
@@ -620,7 +552,7 @@ class AxisRP:
|
|
620
552
|
@composite_options.setter
|
621
553
|
def composite_options(self, opts: dict) -> None:
|
622
554
|
"""
|
623
|
-
:param
|
555
|
+
:param opts: options to use for the composite COR search
|
624
556
|
:raises:
|
625
557
|
* KeyError if some provided keys are not handled
|
626
558
|
* TypeError if opts is not an instance of dictionary
|
@@ -641,7 +573,7 @@ class AxisRP:
|
|
641
573
|
"near_pos",
|
642
574
|
"near_width",
|
643
575
|
):
|
644
|
-
raise KeyError(f"{key} is not
|
576
|
+
raise KeyError(f"{key} is not recognized")
|
645
577
|
self.__composite_options = opts
|
646
578
|
|
647
579
|
@property
|
@@ -655,102 +587,9 @@ class AxisRP:
|
|
655
587
|
self.changed()
|
656
588
|
|
657
589
|
def changed(self):
|
658
|
-
"""callback to overwrite when the
|
590
|
+
"""callback to overwrite when the parameter value changed"""
|
659
591
|
pass
|
660
592
|
|
661
|
-
def set_position_frm_par_file(self, file_path, entry=None, force=False):
|
662
|
-
"""Set position value from a file
|
663
|
-
|
664
|
-
:param str file_path: path to the par file
|
665
|
-
:param bool force: if True, force the mode to read and set
|
666
|
-
`position_value` to None if failed to read the file.
|
667
|
-
Otherwise only `mode` and `position_value` when the
|
668
|
-
file read succeed.
|
669
|
-
"""
|
670
|
-
|
671
|
-
def get_position_in_file():
|
672
|
-
if not os.path.isfile(file_path):
|
673
|
-
raise ValueError(file_path, "is not a valid file path")
|
674
|
-
|
675
|
-
if h5py.is_hdf5(file_path):
|
676
|
-
return self.get_cor_position_frm_tomwer_file(
|
677
|
-
file_path=file_path, entry=entry
|
678
|
-
)
|
679
|
-
elif file_path.lower().endswith(".par") or file_path.lower().endswith(
|
680
|
-
".info"
|
681
|
-
):
|
682
|
-
_dict = getParametersFromParOrInfo(file_path)
|
683
|
-
if self.AXIS_POSITION_PAR_KEY.lower() not in _dict:
|
684
|
-
err = f"fail to find `{self.AXIS_POSITION_PAR_KEY}` in {file_path}"
|
685
|
-
_logger.info(err)
|
686
|
-
raise KeyError(err)
|
687
|
-
else:
|
688
|
-
return _dict[self.AXIS_POSITION_PAR_KEY.lower()]
|
689
|
-
else:
|
690
|
-
with open(file_path, mode="r") as fd:
|
691
|
-
l1 = fd.readline()
|
692
|
-
values = l1.split(" ")
|
693
|
-
if len(values) > 0:
|
694
|
-
try:
|
695
|
-
res = float(values[0])
|
696
|
-
except Exception:
|
697
|
-
_logger.info(
|
698
|
-
f"fail to load center of rotation from {file_path}"
|
699
|
-
)
|
700
|
-
return None
|
701
|
-
else:
|
702
|
-
return res
|
703
|
-
|
704
|
-
if force:
|
705
|
-
try:
|
706
|
-
position = get_position_in_file()
|
707
|
-
except (KeyError, ValueError) as e:
|
708
|
-
_logger.warning(e)
|
709
|
-
position = None
|
710
|
-
else:
|
711
|
-
position = get_position_in_file()
|
712
|
-
|
713
|
-
changed = self.mode != AxisMode.read or position != self.relative_cor_value
|
714
|
-
self.mode = AxisMode.read
|
715
|
-
if position is None:
|
716
|
-
self.set_relative_value(None)
|
717
|
-
else:
|
718
|
-
self.set_relative_value(float(position))
|
719
|
-
|
720
|
-
if changed:
|
721
|
-
self.changed()
|
722
|
-
|
723
|
-
@staticmethod
|
724
|
-
def get_cor_position_frm_tomwer_file(
|
725
|
-
file_path: str, entry=None
|
726
|
-
) -> Union[None, float]:
|
727
|
-
"""
|
728
|
-
Parse the given .h5 file, looking for axis processes. If found some
|
729
|
-
then return the first value discover
|
730
|
-
|
731
|
-
:param str file_path: tomwer processes file (.h5)
|
732
|
-
:return: center of rotation or none
|
733
|
-
:rtype: Union[None, float]
|
734
|
-
"""
|
735
|
-
from .axis import AxisTask # avoid cyclic import
|
736
|
-
|
737
|
-
processes = Task.get_processes_frm_type(
|
738
|
-
process_file=file_path, process_type=AxisTask, entry=entry
|
739
|
-
)
|
740
|
-
if len(processes) == 0:
|
741
|
-
_logger.warning("failed to find any information on center " "of rotation")
|
742
|
-
return None
|
743
|
-
elif len(processes) > 1:
|
744
|
-
_logger.info("found more than one value computed for " "center of rotation")
|
745
|
-
_logger.info(
|
746
|
-
f"load center of rotation from {file_path}: {processes[0].results['center_of_rotation']}"
|
747
|
-
)
|
748
|
-
cor = processes[0].results["center_of_rotation"]
|
749
|
-
if cor in [None, ""]:
|
750
|
-
return None
|
751
|
-
else:
|
752
|
-
return float(cor)
|
753
|
-
|
754
593
|
def n_url(self):
|
755
594
|
"""
|
756
595
|
|
@@ -781,21 +620,27 @@ class AxisRP:
|
|
781
620
|
"POSITION_VALUE": self.relative_cor_value,
|
782
621
|
"CALC_INPUT_TYPE": self.calculation_input_type.to_dict(),
|
783
622
|
"ANGLE_MODE": self.angle_mode.value,
|
784
|
-
"
|
785
|
-
|
623
|
+
"SINOGRAM_LINE": (
|
624
|
+
self.sinogram_line if self.mode.requires_sinogram_index() else ""
|
625
|
+
),
|
786
626
|
"SINOGRAM_SUBSAMPLING": self.sinogram_subsampling,
|
787
627
|
"AXIS_URL_1": axis_urls_1,
|
788
628
|
"AXIS_URL_2": axis_urls_2,
|
789
629
|
"LOOK_AT_STDMAX": self.look_at_stdmax,
|
790
|
-
"NEAR_WX": self.
|
791
|
-
"FINE_STEP_X": self.
|
630
|
+
"NEAR_WX": self.composite_window_size,
|
631
|
+
"FINE_STEP_X": self.composite_fine_step,
|
792
632
|
"SCALE_IMG2_TO_IMG1": self.scale_img2_to_img1,
|
793
|
-
"NEAR_POSITION":
|
633
|
+
"NEAR_POSITION": (
|
634
|
+
self.estimated_cor.value
|
635
|
+
if isinstance(self.estimated_cor, Side)
|
636
|
+
else self.estimated_cor
|
637
|
+
),
|
794
638
|
"PADDING_MODE": self.padding_mode,
|
795
639
|
"FLIP_LR": self.flip_lr,
|
796
640
|
"COMPOSITE_OPTS": self.composite_options,
|
797
|
-
"SIDE": self.side,
|
798
641
|
"COR_OPTIONS": self.extra_cor_options,
|
642
|
+
"MOTOR_OFFSET": self.x_rotation_axis_pos_px_offset,
|
643
|
+
"X_ROTATION_AXIS_PIXEL_POSITION": self.x_rotation_axis_pixel_position,
|
799
644
|
}
|
800
645
|
return _dict
|
801
646
|
|
@@ -820,8 +665,6 @@ class AxisRP:
|
|
820
665
|
self.calculation_input_type = AxisCalculationInput.from_value(
|
821
666
|
_dict["CALC_INPUT_TYPE"]
|
822
667
|
)
|
823
|
-
if "USE_SINOGRAM" in _dict:
|
824
|
-
self.use_sinogram = _dict["USE_SINOGRAM"]
|
825
668
|
if "ANGLE_MODE" in _dict:
|
826
669
|
self.angle_mode = CorAngleMode.from_value(_dict["ANGLE_MODE"])
|
827
670
|
if "SINOGRAM_LINE" in _dict:
|
@@ -833,13 +676,13 @@ class AxisRP:
|
|
833
676
|
if "LOOK_AT_STDMAX" in _dict:
|
834
677
|
self.look_at_stdmax = _dict["LOOK_AT_STDMAX"]
|
835
678
|
if "NEAR_WX" in _dict:
|
836
|
-
self.
|
679
|
+
self.composite_window_size = _dict["NEAR_WX"]
|
837
680
|
if "FINE_STEP_X" in _dict:
|
838
|
-
self.
|
681
|
+
self.composite_fine_step = _dict["FINE_STEP_X"]
|
839
682
|
if "SCALE_IMG2_TO_IMG1" in _dict:
|
840
683
|
self.scale_img2_to_img1 = _dict["SCALE_IMG2_TO_IMG1"]
|
841
684
|
if "NEAR_POSITION" in _dict:
|
842
|
-
self.estimated_cor =
|
685
|
+
self.estimated_cor = _dict["NEAR_POSITION"]
|
843
686
|
if "SINOGRAM_SUBSAMPLING" in _dict:
|
844
687
|
self.sinogram_subsampling = _dict["SINOGRAM_SUBSAMPLING"]
|
845
688
|
if "PADDING_MODE" in _dict:
|
@@ -848,8 +691,6 @@ class AxisRP:
|
|
848
691
|
self.flip_lr = bool(_dict["FLIP_LR"])
|
849
692
|
if "COMPOSITE_OPTS" in _dict:
|
850
693
|
self.composite_options = _dict["COMPOSITE_OPTS"]
|
851
|
-
if "SIDE" in _dict:
|
852
|
-
self.side = _dict["SIDE"]
|
853
694
|
self.extra_cor_options = _dict.get("COR_OPTIONS", "")
|
854
695
|
|
855
696
|
def copy(self, axis_params, copy_axis_url=True, copy_flip_lr=True):
|
@@ -858,17 +699,17 @@ class AxisRP:
|
|
858
699
|
self.frame_width = axis_params.frame_width
|
859
700
|
self.set_relative_value(axis_params.relative_cor_value)
|
860
701
|
self.calculation_input_type = axis_params.calculation_input_type
|
861
|
-
self.use_sinogram = axis_params.use_sinogram
|
862
702
|
self.angle_mode = axis_params.angle_mode
|
863
703
|
self.sinogram_line = axis_params.sinogram_line
|
864
704
|
self.sinogram_subsampling = axis_params.sinogram_subsampling
|
865
705
|
self.look_at_stdmax = axis_params.look_at_stdmax
|
866
|
-
self.
|
867
|
-
self.
|
706
|
+
self.composite_window_size = axis_params.composite_window_size
|
707
|
+
self.composite_fine_step = axis_params.composite_fine_step
|
868
708
|
self.scale_img2_to_img1 = axis_params.scale_img2_to_img1
|
869
709
|
self.estimated_cor = axis_params.estimated_cor
|
710
|
+
self.x_rotation_axis_pixel_position = axis_params.x_rotation_axis_pixel_position
|
711
|
+
self.x_rotation_axis_pos_px_offset = axis_params.x_rotation_axis_pos_px_offset
|
870
712
|
self.padding_mode = axis_params.padding_mode
|
871
|
-
self.side = axis_params.side
|
872
713
|
self.composite_options = axis_params.composite_options
|
873
714
|
self.extra_cor_options = axis_params.extra_cor_options
|
874
715
|
if copy_axis_url:
|
@@ -895,56 +736,63 @@ class AxisRP:
|
|
895
736
|
AxisMode.sliding_window_radios,
|
896
737
|
AxisMode.sliding_window_sinogram,
|
897
738
|
):
|
898
|
-
extra_info = f"side: {self.
|
739
|
+
extra_info = f"side: {self.estimated_cor}"
|
899
740
|
results = ", ".join((results, extra_info))
|
900
741
|
return results
|
901
742
|
|
902
743
|
def get_nabu_cor_options_as_dict(self) -> str:
|
903
744
|
options = {}
|
904
|
-
|
905
|
-
|
906
|
-
|
907
|
-
|
908
|
-
|
909
|
-
|
910
|
-
|
911
|
-
|
912
|
-
|
913
|
-
|
914
|
-
|
745
|
+
# provide side. Scalar if a first guess is provided else a value in ('left', 'right', 'center', 'all')
|
746
|
+
if (
|
747
|
+
isinstance(self.estimated_cor, Side)
|
748
|
+
and AXIS_MODE_METADATAS[self.mode].valid_sides
|
749
|
+
):
|
750
|
+
options["side"] = self.estimated_cor.value
|
751
|
+
elif AXIS_MODE_METADATAS[self.mode].allows_estimated_cor_as_numerical_value:
|
752
|
+
options["side"] = self.estimated_cor
|
753
|
+
|
754
|
+
if self.mode in (AxisMode.composite_coarse_to_fine, AxisMode.near):
|
755
|
+
options["near_width"] = self.composite_options.get(
|
756
|
+
"near_width", DEFAULT_CMP_NEAR_WIDTH
|
757
|
+
)
|
758
|
+
options["theta_interval"] = self.composite_options.get(
|
759
|
+
"theta_interval", DEFAULT_CMP_THETA
|
760
|
+
)
|
761
|
+
options["oversampling"] = self.composite_options.get(
|
762
|
+
"oversampling", DEFAULT_CMP_OVERSAMPLING
|
763
|
+
)
|
764
|
+
options["n_subsampling_y"] = self.composite_options.get(
|
765
|
+
"n_subsampling_y", DEFAULT_CMP_N_SUBSAMPLING_Y
|
766
|
+
)
|
767
|
+
options["take_log"] = self.composite_options.get(
|
768
|
+
"take_log", DEFAULT_CMP_TAKE_LOG
|
769
|
+
)
|
915
770
|
|
916
|
-
|
917
|
-
|
918
|
-
|
771
|
+
# provide radio indices or sinogram index
|
772
|
+
if self.mode.requires_radio_indices:
|
773
|
+
# warning: nabu expect radio angles to be in rad, in nxtomo and tomwer they are in degrees
|
774
|
+
options["radio_angles"] = (
|
775
|
+
numpy.deg2rad(self.axis_url_1.angle or 0.0),
|
776
|
+
numpy.deg2rad(self.axis_url_2.angle or 180.0),
|
777
|
+
)
|
778
|
+
if self.mode.requires_sinogram_index:
|
779
|
+
options["slice_idx"] = self.sinogram_line
|
919
780
|
|
920
781
|
# append "extra_cor_options" to already handled cor options
|
782
|
+
# expected values: low_pass, high_pass
|
921
783
|
extra_cor_options = self.extra_cor_options.replace(" ", "")
|
922
784
|
|
923
785
|
if extra_cor_options != "":
|
924
786
|
for opt in self.extra_cor_options.replace(" ", "").split(";"):
|
925
787
|
if len(opt.split("=")) == 2:
|
926
788
|
key, value = opt.split("=")
|
927
|
-
|
789
|
+
if key in ("low_pass", "high_pass"):
|
790
|
+
value = float(value)
|
791
|
+
options[key] = value
|
792
|
+
else:
|
793
|
+
_logger.warning(
|
794
|
+
f"key {key} is not recognized by nabu. Ignore it."
|
795
|
+
)
|
928
796
|
else:
|
929
|
-
_logger.info(f"ignore option {opt}. Invalid
|
797
|
+
_logger.info(f"ignore option {opt}. Invalid syntax")
|
930
798
|
return options
|
931
|
-
|
932
|
-
@deprecated(replacement="get_nabu_cor_options_as_str", since_version="1.1")
|
933
|
-
def get_nabu_cor_options(self) -> str:
|
934
|
-
return self.get_nabu_cor_options_as_str()
|
935
|
-
|
936
|
-
def get_nabu_cor_options_as_str(self) -> str:
|
937
|
-
"""return cor option for nabu"""
|
938
|
-
|
939
|
-
def cast_key_value(key, value):
|
940
|
-
if key in ("side",):
|
941
|
-
return f"{key}='{value}'"
|
942
|
-
else:
|
943
|
-
return f"{key}={value}"
|
944
|
-
|
945
|
-
return " ; ".join(
|
946
|
-
[
|
947
|
-
cast_key_value(key, value)
|
948
|
-
for key, value in self.get_nabu_cor_options_as_dict().items()
|
949
|
-
]
|
950
|
-
)
|
@@ -1,32 +1,4 @@
|
|
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__ = "15/10/2019"
|
29
|
-
|
30
2
|
|
31
3
|
from silx.utils.enum import Enum as _Enum
|
32
4
|
|