tomwer 1.3.27__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.27.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.27.dist-info → tomwer-1.4.0.dist-info}/WHEEL +1 -1
- {tomwer-1.3.27.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 -1388
- tomwer/gui/test/__init__.py +0 -28
- tomwer/gui/test/test_axis_gui.py +0 -34
- tomwer/synctools/stacks/edit/darkflatpatch.py +0 -169
- tomwer/synctools/stacks/edit/imagekeyeditor.py +0 -135
- tomwer/third_part/WaitingOverlay.py +0 -110
- tomwer-1.3.27-py3.11-nspkg.pth +0 -1
- tomwer-1.3.27.dist-info/METADATA +0 -292
- tomwer-1.3.27.dist-info/RECORD +0 -785
- tomwer-1.3.27.dist-info/namespace_packages.txt +0 -1
- /orangecontrib/tomwer/{widgets/edit/test → tests}/__init__.py +0 -0
- {tomwer/core/process/control/test → orangecontrib/tomwer/tutorials/id16b}/__init__.py +0 -0
- {tomwer/core/process/icat → orangecontrib/tomwer/widgets/cluster/tests}/__init__.py +0 -0
- /orangecontrib/tomwer/widgets/control/icons/{tomoobjserie.png → tomoobjseries.png} +0 -0
- {tomwer/core/process/reconstruction/test → orangecontrib/tomwer/widgets/control/tests}/__init__.py +0 -0
- /orangecontrib/tomwer/widgets/{icat → dataportal}/icons/publish_processed_data.png +0 -0
- /orangecontrib/tomwer/widgets/{icat → dataportal}/icons/publish_processed_data.svg +0 -0
- {tomwer/core/process/test → orangecontrib/tomwer/widgets/debugtools/tests}/__init__.py +0 -0
- {tomwer/core/scan/test → orangecontrib/tomwer/widgets/edit/tests}/__init__.py +0 -0
- {tomwer/core/test → orangecontrib/tomwer/widgets/other/tests}/__init__.py +0 -0
- {tomwer/gui/cluster/test → orangecontrib/tomwer/widgets/reconstruction/tests}/__init__.py +0 -0
- {tomwer/gui/control/serie → orangecontrib/tomwer/widgets/stitching/tests}/__init__.py +0 -0
- {tomwer/gui/icat → orangecontrib/tomwer/widgets/tests}/__init__.py +0 -0
- {tomwer/gui/reconstruction/test → orangecontrib/tomwer/widgets/visualization/tests}/__init__.py +0 -0
- /tomwer/{synctools/stacks/edit → app/stitching}/__init__.py +0 -0
- /tomwer/{synctools/test → core/process/control/tests}/__init__.py +0 -0
- /tomwer/core/process/control/{test → tests}/test_email.py +0 -0
- /tomwer/core/process/control/{test → tests}/test_h52nx_process.py +0 -0
- /tomwer/{third_part → core/process/drac}/__init__.py +0 -0
- /tomwer/core/process/reconstruction/{test → tests}/test_axis_params.py +0 -0
- /tomwer/core/process/reconstruction/{test → tests}/test_darkref_copy.py +0 -0
- /tomwer/core/process/reconstruction/{test → tests}/test_paramsbase.py +0 -0
- /tomwer/core/scan/{test → tests}/test_scan.py +0 -0
- /tomwer/gui/control/{serie → series}/nxtomoconcatenate.py +0 -0
- /tomwer/gui/control/{test → tests}/test_datadiscovery.py +0 -0
- /tomwer/gui/control/{test → tests}/test_reducedarkflat_selector.py +0 -0
- /tomwer/gui/control/{test → tests}/test_single_tomo_obj.py +0 -0
- {orangecontrib/tomwer/widgets/edit/test → tomwer/tests/orangecontrib/tomwer/widgets/edit/tests}/test_image_key_upgrader.py +0 -0
- {tomwer-1.3.27.dist-info → tomwer-1.4.0.dist-info}/top_level.txt +0 -0
@@ -1,55 +1,20 @@
|
|
1
|
-
|
2
|
-
###########################################################################
|
3
|
-
# Copyright (C) 2016 European Synchrotron Radiation Facility
|
4
|
-
#
|
5
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
-
# of this software and associated documentation files (the "Software"), to deal
|
7
|
-
# in the Software without restriction, including without limitation the rights
|
8
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
-
# copies of the Software, and to permit persons to whom the Software is
|
10
|
-
# furnished to do so, subject to the following conditions:
|
11
|
-
#
|
12
|
-
# The above copyright notice and this permission notice shall be included in
|
13
|
-
# all copies or substantial portions of the Software.
|
14
|
-
#
|
15
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
-
# THE SOFTWARE.
|
22
|
-
#
|
23
|
-
#############################################################################
|
24
|
-
|
25
|
-
"""contain the AxisProcess
|
1
|
+
"""contain the AxisTask class
|
26
2
|
"""
|
27
3
|
|
28
|
-
|
29
|
-
__license__ = "MIT"
|
30
|
-
__date__ = "19/03/2019"
|
4
|
+
from __future__ import annotations
|
31
5
|
|
32
6
|
import logging
|
33
|
-
from typing import Optional, Union
|
34
7
|
|
35
|
-
import
|
36
|
-
from nabu.estimation.cor import (
|
37
|
-
CenterOfRotation,
|
38
|
-
CenterOfRotationAdaptiveSearch,
|
39
|
-
CenterOfRotationGrowingWindow,
|
40
|
-
CenterOfRotationSlidingWindow,
|
41
|
-
CenterOfRotationOctaveAccurate,
|
42
|
-
)
|
43
|
-
from nabu.pipeline.estimators import SinoCORFinder, CORFinder
|
8
|
+
from nabu.pipeline.estimators import estimate_cor
|
44
9
|
from nabu.resources.nxflatfield import update_dataset_info_flats_darks
|
45
10
|
from processview.core.manager import DatasetState, ProcessManager
|
46
11
|
from processview.core.superviseprocess import SuperviseProcess
|
47
|
-
from tomwer.core.utils.deprecation import deprecated_warning
|
48
12
|
|
49
13
|
import tomwer.version
|
50
14
|
from tomwer.core.process.reconstruction.utils.cor import absolute_pos_to_relative
|
51
15
|
from tomwer.core.process.task import Task
|
52
16
|
from tomwer.core.scan.nxtomoscan import NXtomoScan
|
17
|
+
from tomwer.core.scan.edfscan import EDFTomoScan
|
53
18
|
from tomwer.core.scan.scanbase import TomwerScanBase
|
54
19
|
from tomwer.core.scan.scanfactory import ScanFactory
|
55
20
|
from tomwer.core.utils import image, logconfig
|
@@ -68,19 +33,8 @@ from .params import (
|
|
68
33
|
)
|
69
34
|
from .projectiontype import ProjectionType
|
70
35
|
|
71
|
-
try:
|
72
|
-
from nabu.pipeline.estimators import CompositeCOREstimator
|
73
|
-
except ImportError:
|
74
|
-
has_composite_cor_finder = False
|
75
|
-
else:
|
76
|
-
has_composite_cor_finder = True
|
77
|
-
from silx.io.url import DataUrl
|
78
|
-
from silx.io.utils import h5py_read_dataset
|
79
|
-
from silx.io.utils import open as open_hdf5
|
80
|
-
|
81
36
|
_logger = logging.getLogger(__name__)
|
82
|
-
|
83
|
-
_logger.warning("No composite cor finder found at nabu level")
|
37
|
+
|
84
38
|
# vertically, work on a window having only a percentage of the frame.
|
85
39
|
pc_height = 10.0 / 100.0
|
86
40
|
# horizontally. Global method supposes the COR is more or less in center
|
@@ -89,9 +43,7 @@ pc_height = 10.0 / 100.0
|
|
89
43
|
pc_width = 50.0 / 100.0
|
90
44
|
|
91
45
|
|
92
|
-
def _absolute_pos_to_relative_with_warning(
|
93
|
-
absolute_pos: float, det_width: Optional[int]
|
94
|
-
):
|
46
|
+
def _absolute_pos_to_relative_with_warning(absolute_pos: float, det_width: int | None):
|
95
47
|
"""
|
96
48
|
nabu returns the value as absolute. tomwer needs it as relative
|
97
49
|
Also handle the case (unlikely) the detector width cannot be found
|
@@ -133,196 +85,7 @@ def adapt_tomwer_scan_to_nabu(scan: TomwerScanBase):
|
|
133
85
|
return dataset_infos
|
134
86
|
|
135
87
|
|
136
|
-
def
|
137
|
-
radio_1: numpy.ndarray,
|
138
|
-
radio_2: numpy.ndarray,
|
139
|
-
side: str,
|
140
|
-
padding_mode,
|
141
|
-
flip_frame_2_lr=True,
|
142
|
-
horz_fft_width=False,
|
143
|
-
):
|
144
|
-
"""
|
145
|
-
Call nabu.preproc.alignement.CenterOfRotationGrowingWindow.find_shift
|
146
|
-
|
147
|
-
:param radio_1:
|
148
|
-
:param radio_2:
|
149
|
-
:param padding_mode: padding mode
|
150
|
-
:param str side: side of the cor
|
151
|
-
:param bool flip_frame_2_lr: if True will left-right flip the second frame
|
152
|
-
:param horz_fft_width:
|
153
|
-
|
154
|
-
:return:
|
155
|
-
"""
|
156
|
-
nabu_class = CenterOfRotationGrowingWindow(horz_fft_width=horz_fft_width)
|
157
|
-
# value return is relative
|
158
|
-
res = nabu_class.find_shift(
|
159
|
-
img_1=radio_1,
|
160
|
-
img_2=numpy.fliplr(radio_2) if flip_frame_2_lr else radio_2,
|
161
|
-
side=side,
|
162
|
-
roi_yxhw=None,
|
163
|
-
padding_mode=padding_mode,
|
164
|
-
median_filt_shape=None,
|
165
|
-
)
|
166
|
-
if isinstance(res, numpy.ndarray):
|
167
|
-
if len(res) == 1:
|
168
|
-
return res[0]
|
169
|
-
else:
|
170
|
-
raise ValueError(
|
171
|
-
"nabu rsult is expected to be a scalar, numpy array found. Please upgrade nabu this issue is expected to be solved"
|
172
|
-
)
|
173
|
-
else:
|
174
|
-
return res
|
175
|
-
|
176
|
-
|
177
|
-
def compute_cor_nabu_growing_window_radios(
|
178
|
-
scan: TomwerScanBase,
|
179
|
-
):
|
180
|
-
"""
|
181
|
-
Call nabu.preproc.alignement.CenterOfRotationGrowingWindow.find_shift
|
182
|
-
|
183
|
-
:param TomwerScanBase scan:
|
184
|
-
|
185
|
-
:return:
|
186
|
-
"""
|
187
|
-
has_darks = scan.reduced_darks is not None and len(scan.reduced_darks) > 0
|
188
|
-
has_flats = scan.reduced_flats is not None and len(scan.reduced_flats) > 0
|
189
|
-
|
190
|
-
projection_angles = scan.get_proj_angle_url()
|
191
|
-
projection_angles_i = {
|
192
|
-
value.path(): key for key, value in projection_angles.items()
|
193
|
-
}
|
194
|
-
url_radio_1, url_radio_2 = AxisTask.get_inputs_urls(scan=scan)
|
195
|
-
angle_radio_1 = float(projection_angles_i[url_radio_1.url.path()])
|
196
|
-
angle_radio_2 = float(projection_angles_i[url_radio_2.url.path()])
|
197
|
-
radio_angles = tuple(numpy.radians((angle_radio_1, angle_radio_2)))
|
198
|
-
|
199
|
-
corfinder = CORFinder(
|
200
|
-
dataset_info=adapt_tomwer_scan_to_nabu(scan),
|
201
|
-
method="growing-window",
|
202
|
-
do_flatfield=has_darks and has_flats,
|
203
|
-
cor_options=scan.axis_params.get_nabu_cor_options_as_dict(),
|
204
|
-
radio_angles=radio_angles,
|
205
|
-
logger=_logger,
|
206
|
-
)
|
207
|
-
res = corfinder.find_cor() # Returns absolute cor
|
208
|
-
if isinstance(res, numpy.ndarray):
|
209
|
-
if len(res) == 1:
|
210
|
-
res = res[0]
|
211
|
-
else:
|
212
|
-
raise ValueError(
|
213
|
-
"nabu rsult is expected to be a scalar, numpy array found. Please upgrade nabu this issue is expected to be solved"
|
214
|
-
)
|
215
|
-
|
216
|
-
return _absolute_pos_to_relative_with_warning(
|
217
|
-
absolute_pos=res, det_width=scan.dim_1
|
218
|
-
)
|
219
|
-
|
220
|
-
|
221
|
-
def compute_cor_nabu_growing_window_sinogram(
|
222
|
-
scan: TomwerScanBase,
|
223
|
-
):
|
224
|
-
"""
|
225
|
-
Call nabu.preproc.alignement.CenterOfRotationGrowingWindow.find_shift
|
226
|
-
|
227
|
-
:param TomwerScanBase scan:
|
228
|
-
|
229
|
-
:return:
|
230
|
-
"""
|
231
|
-
has_darks = scan.reduced_darks is not None and len(scan.reduced_darks) > 0
|
232
|
-
has_flats = scan.reduced_flats is not None and len(scan.reduced_flats) > 0
|
233
|
-
|
234
|
-
corfinder = SinoCORFinder(
|
235
|
-
dataset_info=adapt_tomwer_scan_to_nabu(scan),
|
236
|
-
method="sino-growing-window",
|
237
|
-
slice_idx=scan.axis_params.sinogram_line or "middle",
|
238
|
-
subsampling=scan.axis_params.sinogram_subsampling,
|
239
|
-
do_flatfield=has_darks and has_flats,
|
240
|
-
cor_options=scan.axis_params.get_nabu_cor_options_as_dict(),
|
241
|
-
logger=_logger,
|
242
|
-
)
|
243
|
-
res = corfinder.find_cor()
|
244
|
-
if isinstance(res, numpy.ndarray):
|
245
|
-
if len(res) == 1:
|
246
|
-
res = res[0]
|
247
|
-
else:
|
248
|
-
raise ValueError(
|
249
|
-
"nabu rsult is expected to be a scalar, numpy array found. Please upgrade nabu this issue is expected to be solved"
|
250
|
-
)
|
251
|
-
|
252
|
-
return _absolute_pos_to_relative_with_warning(
|
253
|
-
absolute_pos=res, det_width=scan.dim_1
|
254
|
-
)
|
255
|
-
|
256
|
-
|
257
|
-
def compute_scan_sino_coarse_to_fine(scan):
|
258
|
-
"""
|
259
|
-
Compute center of rotation from `sino-coarse-to-fine` algorithm for given
|
260
|
-
scan
|
261
|
-
:param scan:
|
262
|
-
:return:
|
263
|
-
"""
|
264
|
-
has_darks = scan.reduced_darks is not None and len(scan.reduced_darks) > 0
|
265
|
-
has_flats = scan.reduced_flats is not None and len(scan.reduced_flats) > 0
|
266
|
-
|
267
|
-
corfinder = SinoCORFinder(
|
268
|
-
dataset_info=adapt_tomwer_scan_to_nabu(scan),
|
269
|
-
method=AxisMode.sino_coarse_to_fine.value,
|
270
|
-
slice_idx=scan.axis_params.sinogram_line or "middle",
|
271
|
-
subsampling=scan.axis_params.sinogram_subsampling,
|
272
|
-
do_flatfield=has_darks and has_flats,
|
273
|
-
cor_options=scan.axis_params.get_nabu_cor_options_as_dict(),
|
274
|
-
logger=_logger,
|
275
|
-
)
|
276
|
-
res = corfinder.find_cor()
|
277
|
-
return _absolute_pos_to_relative_with_warning(
|
278
|
-
absolute_pos=res, det_width=scan.dim_1
|
279
|
-
)
|
280
|
-
|
281
|
-
|
282
|
-
def compute_scan_composite_coarse_to_fine(scan: TomwerScanBase):
|
283
|
-
"""
|
284
|
-
Compute center of rotation from `sino-coarse-to-fine` algorithm for given
|
285
|
-
scan
|
286
|
-
:param scan:
|
287
|
-
:return:
|
288
|
-
"""
|
289
|
-
if not has_composite_cor_finder:
|
290
|
-
_logger.error("unable to find nabu CompositeCOREstimator")
|
291
|
-
return None
|
292
|
-
|
293
|
-
(
|
294
|
-
theta,
|
295
|
-
n_subsampling_y,
|
296
|
-
oversampling,
|
297
|
-
take_log,
|
298
|
-
near_pos,
|
299
|
-
near_width,
|
300
|
-
) = get_composite_options(scan)
|
301
|
-
|
302
|
-
# as the new corfinder is not yet merged in the main branch
|
303
|
-
# allow some tolerance for the "side" argument that is there only
|
304
|
-
# in the new one
|
305
|
-
|
306
|
-
cor_options = scan.axis_params.get_nabu_cor_options_as_dict()
|
307
|
-
for key in "low_pass", "high_pass":
|
308
|
-
if key in cor_options:
|
309
|
-
cor_options[key] = int(cor_options[key])
|
310
|
-
corfinder = CompositeCOREstimator(
|
311
|
-
dataset_info=adapt_tomwer_scan_to_nabu(scan),
|
312
|
-
theta_interval=theta,
|
313
|
-
n_subsampling_y=n_subsampling_y,
|
314
|
-
oversampling=oversampling,
|
315
|
-
cor_options=cor_options,
|
316
|
-
logger=_logger,
|
317
|
-
take_log=take_log,
|
318
|
-
)
|
319
|
-
res = corfinder.find_cor()
|
320
|
-
return _absolute_pos_to_relative_with_warning(
|
321
|
-
absolute_pos=res, det_width=scan.dim_1
|
322
|
-
)
|
323
|
-
|
324
|
-
|
325
|
-
def get_composite_options(scan):
|
88
|
+
def get_composite_options(scan) -> tuple:
|
326
89
|
theta = scan.axis_params.composite_options.get("theta", DEFAULT_CMP_THETA)
|
327
90
|
n_subsampling_y = scan.axis_params.composite_options.get(
|
328
91
|
"n_subsampling_y", DEFAULT_CMP_N_SUBSAMPLING_Y
|
@@ -339,446 +102,19 @@ def get_composite_options(scan):
|
|
339
102
|
return theta, n_subsampling_y, oversampling, take_log, near_pos, near_width
|
340
103
|
|
341
104
|
|
342
|
-
def
|
343
|
-
"""
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
:param `.TomoBase` scan: scan to process
|
348
|
-
:return: Union[float, None]
|
349
|
-
"""
|
350
|
-
if not scan.axis_params.use_sinogram:
|
351
|
-
radio_1, radio_2 = AxisTask.get_inputs(scan=scan)
|
352
|
-
if radio_1 is None or radio_2 is None:
|
353
|
-
raise NoAxisUrl("Unable to find projections for nabu axis calculation")
|
105
|
+
def read_scan_x_rotation_axis_pixel_position(scan: TomwerScanBase):
|
106
|
+
"""read center of rotation estimation from metadata"""
|
107
|
+
if isinstance(scan, EDFTomoScan):
|
108
|
+
raise TypeError("EDFTomoScan have not information about estimated cor position")
|
354
109
|
else:
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
scan.axis_params.padding_mode,
|
361
|
-
scan.axis_params.side,
|
362
|
-
scan.axis_params.use_sinogram,
|
363
|
-
)
|
364
|
-
)
|
365
|
-
|
366
|
-
if scan.axis_params.use_sinogram:
|
367
|
-
return compute_cor_nabu_growing_window_sinogram(scan=scan)
|
368
|
-
else:
|
369
|
-
return compute_cor_nabu_growing_window_radios(scan=scan)
|
370
|
-
|
371
|
-
|
372
|
-
def compute_cor_nabu_sliding_window(
|
373
|
-
radio_1: numpy.ndarray,
|
374
|
-
radio_2: numpy.ndarray,
|
375
|
-
side: str,
|
376
|
-
padding_mode,
|
377
|
-
flip_frame_2_lr=True,
|
378
|
-
horz_fft_width=False,
|
379
|
-
):
|
380
|
-
"""
|
381
|
-
Call nabu.preproc.alignement.CenterOfRotationSlidingWindow.find_shift
|
382
|
-
|
383
|
-
:param radio_1:
|
384
|
-
:param radio_2:
|
385
|
-
:param padding_mode:
|
386
|
-
:param str side: side of the cor
|
387
|
-
:param horz_fft_width:
|
388
|
-
:param bool flip_frame_2_lr: if True will left-right flip the second frame
|
389
|
-
:param half_acq_cor_guess: The approximate position of the rotation axis
|
390
|
-
from the image center. Optional. When given a
|
391
|
-
special algorithm is used which can work also
|
392
|
-
in half-tomo conditions.
|
393
|
-
|
394
|
-
:return:
|
395
|
-
"""
|
396
|
-
nabu_class = CenterOfRotationSlidingWindow(horz_fft_width=horz_fft_width)
|
397
|
-
res = nabu_class.find_shift(
|
398
|
-
img_1=radio_1,
|
399
|
-
img_2=numpy.fliplr(radio_2) if flip_frame_2_lr else radio_2,
|
400
|
-
side=side,
|
401
|
-
roi_yxhw=None,
|
402
|
-
padding_mode=padding_mode,
|
403
|
-
median_filt_shape=None,
|
404
|
-
)
|
405
|
-
return res
|
406
|
-
|
407
|
-
|
408
|
-
def compute_cor_nabu_sliding_window_radios(
|
409
|
-
scan,
|
410
|
-
):
|
411
|
-
"""
|
412
|
-
Call nabu.preproc.alignement.CenterOfRotationGrowingWindow.find_shift
|
413
|
-
|
414
|
-
:param TomwerScanBase scan:
|
415
|
-
|
416
|
-
:return:
|
417
|
-
"""
|
418
|
-
has_darks = scan.reduced_darks is not None and len(scan.reduced_darks) > 0
|
419
|
-
has_flats = scan.reduced_flats is not None and len(scan.reduced_flats) > 0
|
420
|
-
|
421
|
-
projection_angles = scan.get_proj_angle_url()
|
422
|
-
projection_angles_i = {
|
423
|
-
value.path(): key for key, value in projection_angles.items()
|
424
|
-
}
|
425
|
-
url_radio_1, url_radio_2 = AxisTask.get_inputs_urls(scan=scan)
|
426
|
-
angle_radio_1 = float(projection_angles_i[url_radio_1.url.path()])
|
427
|
-
angle_radio_2 = float(projection_angles_i[url_radio_2.url.path()])
|
428
|
-
radio_angles = tuple(numpy.radians((angle_radio_1, angle_radio_2)))
|
429
|
-
|
430
|
-
corfinder = CORFinder(
|
431
|
-
dataset_info=adapt_tomwer_scan_to_nabu(scan),
|
432
|
-
method="sliding-window",
|
433
|
-
do_flatfield=has_darks and has_flats,
|
434
|
-
cor_options=scan.axis_params.get_nabu_cor_options_as_dict(),
|
435
|
-
radio_angles=radio_angles,
|
436
|
-
logger=_logger,
|
437
|
-
)
|
438
|
-
res = corfinder.find_cor() # Returns absolute cor.
|
439
|
-
return _absolute_pos_to_relative_with_warning(
|
440
|
-
absolute_pos=res, det_width=scan.dim_1
|
441
|
-
)
|
442
|
-
|
443
|
-
|
444
|
-
def compute_cor_nabu_sliding_window_sinogram(
|
445
|
-
scan,
|
446
|
-
):
|
447
|
-
"""
|
448
|
-
Call nabu.preproc.alignement.CenterOfRotationGrowingWindow.find_shift
|
449
|
-
|
450
|
-
:param TomwerScanBase scan:
|
451
|
-
|
452
|
-
:return:
|
453
|
-
"""
|
454
|
-
has_darks = scan.reduced_darks is not None and len(scan.reduced_darks) > 0
|
455
|
-
has_flats = scan.reduced_flats is not None and len(scan.reduced_flats) > 0
|
456
|
-
|
457
|
-
corfinder = SinoCORFinder(
|
458
|
-
dataset_info=adapt_tomwer_scan_to_nabu(scan),
|
459
|
-
method="sino-sliding-window",
|
460
|
-
slice_idx=scan.axis_params.sinogram_line or "middle",
|
461
|
-
subsampling=scan.axis_params.sinogram_subsampling,
|
462
|
-
do_flatfield=has_darks and has_flats,
|
463
|
-
cor_options=scan.axis_params.get_nabu_cor_options_as_dict(),
|
464
|
-
logger=_logger,
|
465
|
-
)
|
466
|
-
res = corfinder.find_cor()
|
467
|
-
return _absolute_pos_to_relative_with_warning(
|
468
|
-
absolute_pos=res, det_width=scan.dim_1
|
469
|
-
)
|
470
|
-
|
471
|
-
|
472
|
-
def compute_scan_cor_nabu_sliding_window(scan):
|
473
|
-
"""
|
474
|
-
Call to nabu.preproc.alignment.CenterOfRotation from the scan axis_params
|
475
|
-
value.
|
476
|
-
|
477
|
-
:param `.TomoBase` scan: scan to process
|
478
|
-
:return: Union[float, None]
|
479
|
-
"""
|
480
|
-
if not scan.axis_params.use_sinogram:
|
481
|
-
radio_1, radio_2 = AxisTask.get_inputs(scan=scan)
|
482
|
-
if radio_1 is None or radio_2 is None:
|
483
|
-
raise NoAxisUrl("Unable to find projections for nabu axis calculation")
|
484
|
-
else:
|
485
|
-
radio_1 = radio_2 = None
|
486
|
-
|
487
|
-
_logger.info(
|
488
|
-
"compute scan axis from nabu CenterOfRotationSlidingWindow with padding "
|
489
|
-
"mode {} and side {}. Use sinogram: {}".format(
|
490
|
-
scan.axis_params.padding_mode,
|
491
|
-
scan.axis_params.side,
|
492
|
-
scan.axis_params.use_sinogram,
|
493
|
-
)
|
494
|
-
)
|
495
|
-
|
496
|
-
if scan.axis_params.use_sinogram:
|
497
|
-
return compute_cor_nabu_sliding_window_sinogram(scan=scan)
|
498
|
-
else:
|
499
|
-
return compute_cor_nabu_sliding_window_radios(scan=scan)
|
500
|
-
|
501
|
-
|
502
|
-
def compute_scan_fourier_angles(scan):
|
503
|
-
"""
|
504
|
-
run 'scan_fourier_angles' algorithm for the requested scan
|
505
|
-
"""
|
506
|
-
has_darks = scan.reduced_darks is not None and len(scan.reduced_darks) > 0
|
507
|
-
has_flats = scan.reduced_flats is not None and len(scan.reduced_flats) > 0
|
508
|
-
|
509
|
-
corfinder = SinoCORFinder(
|
510
|
-
dataset_info=adapt_tomwer_scan_to_nabu(scan),
|
511
|
-
method="fourier-angles",
|
512
|
-
slice_idx=scan.axis_params.sinogram_line or "middle",
|
513
|
-
subsampling=scan.axis_params.sinogram_subsampling,
|
514
|
-
do_flatfield=has_darks and has_flats,
|
515
|
-
cor_options=scan.axis_params.get_nabu_cor_options_as_dict(),
|
516
|
-
logger=_logger,
|
517
|
-
)
|
518
|
-
res = corfinder.find_cor()
|
519
|
-
return _absolute_pos_to_relative_with_warning(
|
520
|
-
absolute_pos=res, det_width=scan.dim_1
|
521
|
-
)
|
522
|
-
|
523
|
-
|
524
|
-
def compute_scan_octave_accurate_radios(
|
525
|
-
scan,
|
526
|
-
):
|
527
|
-
"""
|
528
|
-
Call nabu.preproc.alignement.CenterOfRotationGrowingWindow.find_shift
|
529
|
-
|
530
|
-
:param TomwerScanBase scan:
|
531
|
-
|
532
|
-
:return:
|
533
|
-
"""
|
534
|
-
has_darks = scan.reduced_darks is not None and len(scan.reduced_darks) > 0
|
535
|
-
has_flats = scan.reduced_flats is not None and len(scan.reduced_flats) > 0
|
536
|
-
|
537
|
-
has_darks = scan.reduced_darks is not None and len(scan.reduced_darks) > 0
|
538
|
-
has_flats = scan.reduced_flats is not None and len(scan.reduced_flats) > 0
|
539
|
-
|
540
|
-
projection_angles = scan.get_proj_angle_url()
|
541
|
-
projection_angles_i = {
|
542
|
-
value.path(): key for key, value in projection_angles.items()
|
543
|
-
}
|
544
|
-
url_radio_1, url_radio_2 = AxisTask.get_inputs_urls(scan=scan)
|
545
|
-
angle_radio_1 = float(projection_angles_i[url_radio_1.url.path()])
|
546
|
-
angle_radio_2 = float(projection_angles_i[url_radio_2.url.path()])
|
547
|
-
radio_angles = tuple(numpy.radians((angle_radio_1, angle_radio_2)))
|
548
|
-
|
549
|
-
corfinder = CORFinder(
|
550
|
-
dataset_info=adapt_tomwer_scan_to_nabu(scan),
|
551
|
-
method="octave-accurate",
|
552
|
-
do_flatfield=has_darks and has_flats,
|
553
|
-
cor_options=scan.axis_params.get_nabu_cor_options_as_dict(),
|
554
|
-
radio_angles=radio_angles,
|
555
|
-
logger=_logger,
|
556
|
-
)
|
557
|
-
res = corfinder.find_cor()
|
558
|
-
return _absolute_pos_to_relative_with_warning(
|
559
|
-
absolute_pos=res, det_width=scan.dim_1
|
560
|
-
)
|
561
|
-
|
562
|
-
|
563
|
-
def compute_scan_octave_accurate(scan):
|
564
|
-
"""
|
565
|
-
Compute center of rotation from `octave-accurate` algorithm
|
566
|
-
scan
|
567
|
-
:param scan:
|
568
|
-
:return:
|
569
|
-
"""
|
570
|
-
cor_options = scan.axis_params.get_nabu_cor_options_as_dict()
|
571
|
-
radio_1, radio_2 = AxisTask.get_inputs(scan=scan)
|
572
|
-
extra_options = {}
|
573
|
-
for key in "low_pass", "high_pass":
|
574
|
-
if key in cor_options:
|
575
|
-
extra_options[key] = float(cor_options[key])
|
576
|
-
|
577
|
-
corfinder = CenterOfRotationOctaveAccurate(cor_options=cor_options)
|
578
|
-
res = corfinder.find_shift(
|
579
|
-
img_1=radio_1,
|
580
|
-
img_2=numpy.fliplr(radio_2) if scan.axis_params.flip_lr else radio_2,
|
581
|
-
side=scan.axis_params.side,
|
582
|
-
padding_mode=scan.axis_params.padding_mode,
|
583
|
-
**extra_options,
|
584
|
-
)
|
110
|
+
res = scan.x_rotation_axis_pixel_position
|
111
|
+
if res is None:
|
112
|
+
_logger.error(
|
113
|
+
f"unable to find x_rotation_axis_pixel_position from {scan.get_identifier()}"
|
114
|
+
)
|
585
115
|
return res
|
586
116
|
|
587
117
|
|
588
|
-
def compute_cor_nabu_centered_radios(
|
589
|
-
scan,
|
590
|
-
):
|
591
|
-
"""
|
592
|
-
Call nabu.preproc.alignement.CenterOfRotationGrowingWindow.find_shift
|
593
|
-
|
594
|
-
:param TomwerScanBase scan:
|
595
|
-
|
596
|
-
:return:
|
597
|
-
"""
|
598
|
-
has_darks = scan.reduced_darks is not None and len(scan.reduced_darks) > 0
|
599
|
-
has_flats = scan.reduced_flats is not None and len(scan.reduced_flats) > 0
|
600
|
-
|
601
|
-
projection_angles = scan.get_proj_angle_url()
|
602
|
-
projection_angles_i = {
|
603
|
-
value.path(): key for key, value in projection_angles.items()
|
604
|
-
}
|
605
|
-
url_radio_1, url_radio_2 = AxisTask.get_inputs_urls(scan=scan)
|
606
|
-
angle_radio_1 = float(projection_angles_i[url_radio_1.url.path()])
|
607
|
-
angle_radio_2 = float(projection_angles_i[url_radio_2.url.path()])
|
608
|
-
radio_angles = tuple(numpy.radians((angle_radio_1, angle_radio_2)))
|
609
|
-
|
610
|
-
corfinder = CORFinder(
|
611
|
-
dataset_info=adapt_tomwer_scan_to_nabu(scan),
|
612
|
-
method="centered",
|
613
|
-
do_flatfield=has_darks and has_flats,
|
614
|
-
cor_options=scan.axis_params.get_nabu_cor_options_as_dict(),
|
615
|
-
radio_angles=radio_angles,
|
616
|
-
logger=_logger,
|
617
|
-
)
|
618
|
-
res = corfinder.find_cor()
|
619
|
-
return _absolute_pos_to_relative_with_warning(
|
620
|
-
absolute_pos=res, det_width=scan.dim_1
|
621
|
-
)
|
622
|
-
|
623
|
-
|
624
|
-
def compute_cor_nabu_centered(
|
625
|
-
radio_1: numpy.ndarray,
|
626
|
-
radio_2: numpy.ndarray,
|
627
|
-
padding_mode,
|
628
|
-
flip_frame_2_lr=True,
|
629
|
-
horz_fft_width=False,
|
630
|
-
vert_fft_width=False,
|
631
|
-
):
|
632
|
-
"""
|
633
|
-
Call nabu.preproc.alignement.CenterOfRotation.find_shift
|
634
|
-
|
635
|
-
:param radio_1:
|
636
|
-
:param radio_2:
|
637
|
-
:param padding_mode:
|
638
|
-
:param horz_fft_width:
|
639
|
-
:param bool flip_frame_2_lr: if True will left-right flip the second frame
|
640
|
-
:param half_acq_cor_guess: The approximate position of the rotation axis
|
641
|
-
from the image center. Optional. When given a
|
642
|
-
special algorithm is used which can work also
|
643
|
-
in half-tomo conditions.
|
644
|
-
|
645
|
-
:return:
|
646
|
-
"""
|
647
|
-
nabu_class = CenterOfRotation(
|
648
|
-
horz_fft_width=horz_fft_width, vert_fft_width=vert_fft_width
|
649
|
-
)
|
650
|
-
return nabu_class.find_shift(
|
651
|
-
img_1=radio_1,
|
652
|
-
img_2=numpy.fliplr(radio_2) if flip_frame_2_lr else radio_2,
|
653
|
-
roi_yxhw=None,
|
654
|
-
padding_mode=padding_mode,
|
655
|
-
median_filt_shape=None,
|
656
|
-
)
|
657
|
-
|
658
|
-
|
659
|
-
def compute_scan_cor_nabu_centered(scan):
|
660
|
-
"""
|
661
|
-
Call to nabu.preproc.alignment.CenterOfRotation from the scan axis_params
|
662
|
-
value.
|
663
|
-
|
664
|
-
:param `.TomoBase` scan: scan to process
|
665
|
-
:return: Union[float, None]
|
666
|
-
|
667
|
-
"""
|
668
|
-
assert scan.axis_params is not None
|
669
|
-
radio_1, radio_2 = AxisTask.get_inputs(scan=scan)
|
670
|
-
if radio_1 is None or radio_2 is None:
|
671
|
-
raise NoAxisUrl("Unable to find projections for nabu axis calculation")
|
672
|
-
|
673
|
-
_logger.info(
|
674
|
-
"compute scan axis from nabu CenterOfRotation with padding "
|
675
|
-
"mode %s" % scan.axis_params.padding_mode
|
676
|
-
)
|
677
|
-
|
678
|
-
return compute_cor_nabu_centered_radios(scan)
|
679
|
-
|
680
|
-
|
681
|
-
def compute_cor_nabu_global(
|
682
|
-
radio_1: numpy.ndarray,
|
683
|
-
radio_2: numpy.ndarray,
|
684
|
-
padding_mode,
|
685
|
-
flip_frame_2_lr=True,
|
686
|
-
horz_fft_width=False,
|
687
|
-
):
|
688
|
-
"""
|
689
|
-
Call nabu.preproc.alignement.CenterOfRotation.find_shift
|
690
|
-
|
691
|
-
:param radio_1:
|
692
|
-
:param radio_2:
|
693
|
-
:param padding_mode:
|
694
|
-
:param horz_fft_width:
|
695
|
-
:param bool flip_frame_2_lr: if True will left-right flip the second frame
|
696
|
-
:return:
|
697
|
-
"""
|
698
|
-
nabu_class = CenterOfRotationAdaptiveSearch(horz_fft_width=horz_fft_width)
|
699
|
-
return nabu_class.find_shift(
|
700
|
-
img_1=radio_1,
|
701
|
-
img_2=numpy.fliplr(radio_2) if flip_frame_2_lr else radio_2,
|
702
|
-
roi_yxhw=None,
|
703
|
-
padding_mode=padding_mode,
|
704
|
-
median_filt_shape=None,
|
705
|
-
)
|
706
|
-
|
707
|
-
|
708
|
-
def compute_cor_nabu_global_radios(
|
709
|
-
scan: TomwerScanBase,
|
710
|
-
):
|
711
|
-
"""
|
712
|
-
Call nabu.preproc.alignement.CenterOfRotationGrowingWindow.find_shift
|
713
|
-
|
714
|
-
:param TomwerScanBase scan:
|
715
|
-
|
716
|
-
:return:
|
717
|
-
"""
|
718
|
-
has_darks = scan.reduced_darks is not None and len(scan.reduced_darks) > 0
|
719
|
-
has_flats = scan.reduced_flats is not None and len(scan.reduced_flats) > 0
|
720
|
-
|
721
|
-
projection_angles = scan.get_proj_angle_url()
|
722
|
-
projection_angles_i = {
|
723
|
-
value.path(): key for key, value in projection_angles.items()
|
724
|
-
}
|
725
|
-
url_radio_1, url_radio_2 = AxisTask.get_inputs_urls(scan=scan)
|
726
|
-
angle_radio_1 = float(projection_angles_i[url_radio_1.url.path()])
|
727
|
-
angle_radio_2 = float(projection_angles_i[url_radio_2.url.path()])
|
728
|
-
radio_angles = tuple(numpy.radians((angle_radio_1, angle_radio_2)))
|
729
|
-
|
730
|
-
corfinder = CORFinder(
|
731
|
-
dataset_info=adapt_tomwer_scan_to_nabu(scan),
|
732
|
-
method="global",
|
733
|
-
do_flatfield=has_darks and has_flats,
|
734
|
-
cor_options=scan.axis_params.get_nabu_cor_options_as_dict(),
|
735
|
-
radio_angles=radio_angles,
|
736
|
-
logger=_logger,
|
737
|
-
)
|
738
|
-
res = corfinder.find_cor()
|
739
|
-
return _absolute_pos_to_relative_with_warning(
|
740
|
-
absolute_pos=res, det_width=scan.dim_1
|
741
|
-
)
|
742
|
-
|
743
|
-
|
744
|
-
def compute_scan_cor_nabu_global(scan):
|
745
|
-
"""
|
746
|
-
Call to nabu.preproc.alignment.CenterOfRotation from the scan axis_params
|
747
|
-
value.
|
748
|
-
|
749
|
-
:param `.TomoBase` scan: scan to process
|
750
|
-
:return: Union[float, None]
|
751
|
-
|
752
|
-
"""
|
753
|
-
assert scan.axis_params is not None
|
754
|
-
radio_1, radio_2 = AxisTask.get_inputs(scan=scan)
|
755
|
-
if radio_1 is None or radio_2 is None:
|
756
|
-
raise NoAxisUrl("Unable to find projections for nabu axis calculation")
|
757
|
-
|
758
|
-
_logger.info(
|
759
|
-
"compute scan axis from nabu CenterOfRotation with padding "
|
760
|
-
"mode %s" % scan.axis_params.padding_mode
|
761
|
-
)
|
762
|
-
return compute_cor_nabu_global_radios(scan)
|
763
|
-
|
764
|
-
|
765
|
-
def get_stdmax_column(x: numpy.ndarray) -> float:
|
766
|
-
"""
|
767
|
-
|
768
|
-
:param x:
|
769
|
-
:return: column index of the maximal standard deviation
|
770
|
-
"""
|
771
|
-
kernel_size = 5
|
772
|
-
length = len(x)
|
773
|
-
r = range(length - kernel_size)
|
774
|
-
y = numpy.empty(length - kernel_size)
|
775
|
-
for i in r:
|
776
|
-
s = numpy.std(x[i : i + kernel_size])
|
777
|
-
y[i] = s
|
778
|
-
|
779
|
-
return y.argmax()
|
780
|
-
|
781
|
-
|
782
118
|
class NoAxisUrl(Exception):
|
783
119
|
pass
|
784
120
|
|
@@ -792,25 +128,8 @@ class AxisTask(
|
|
792
128
|
):
|
793
129
|
"""
|
794
130
|
Process used to compute the center of rotation of a scan
|
795
|
-
|
796
|
-
:param axis_params: parameters to configure the axis process
|
797
|
-
:type: AxisRP
|
798
131
|
"""
|
799
132
|
|
800
|
-
_CALCULATIONS_METHODS = {
|
801
|
-
AxisMode.centered: compute_scan_cor_nabu_centered,
|
802
|
-
AxisMode.global_: compute_scan_cor_nabu_global,
|
803
|
-
AxisMode.sliding_window_sinogram: compute_scan_cor_nabu_sliding_window,
|
804
|
-
AxisMode.sliding_window_radios: compute_scan_cor_nabu_sliding_window,
|
805
|
-
AxisMode.growing_window_sinogram: compute_scan_cor_nabu_growing_window,
|
806
|
-
AxisMode.growing_window_radios: compute_scan_cor_nabu_growing_window,
|
807
|
-
AxisMode.sino_coarse_to_fine: compute_scan_sino_coarse_to_fine,
|
808
|
-
AxisMode.composite_coarse_to_fine: compute_scan_composite_coarse_to_fine,
|
809
|
-
AxisMode.near: compute_scan_composite_coarse_to_fine,
|
810
|
-
AxisMode.sino_fourier_angles: compute_scan_fourier_angles,
|
811
|
-
AxisMode.octave_accurate_radios: compute_scan_octave_accurate,
|
812
|
-
}
|
813
|
-
|
814
133
|
def __init__(
|
815
134
|
self,
|
816
135
|
process_id=None,
|
@@ -867,12 +186,12 @@ class AxisTask(
|
|
867
186
|
In this case we will lock the axis as defined 'fixed' with the current
|
868
187
|
value
|
869
188
|
|
870
|
-
:param
|
189
|
+
:param lock: if true lock the currently existing position value
|
871
190
|
"""
|
872
191
|
self._locked = lock
|
873
192
|
if lock:
|
874
193
|
self._recons_params_before_lock = self._axis_params.to_dict()
|
875
|
-
if self._axis_params
|
194
|
+
if self._axis_params != AxisMode.manual:
|
876
195
|
self._axis_params.mode = AxisMode.manual
|
877
196
|
else:
|
878
197
|
if self._recons_params_before_lock:
|
@@ -985,13 +304,12 @@ class AxisTask(
|
|
985
304
|
_logger.error(e)
|
986
305
|
|
987
306
|
@staticmethod
|
988
|
-
def
|
307
|
+
def get_input_radios(scan) -> tuple:
|
989
308
|
"""Make sure we have valid projections to be used for axis calculation
|
990
309
|
|
991
|
-
:param
|
310
|
+
:param scan: scan to check
|
992
311
|
:raise: NoAxisUrl if fails to found
|
993
|
-
:return:
|
994
|
-
:rtype: tuple of AxisResource
|
312
|
+
:return: tuple of AxisResource
|
995
313
|
"""
|
996
314
|
if (
|
997
315
|
scan.axis_params
|
@@ -999,16 +317,13 @@ class AxisTask(
|
|
999
317
|
and scan.axis_params.axis_url_1.url
|
1000
318
|
):
|
1001
319
|
return scan.axis_params.axis_url_1, scan.axis_params.axis_url_2
|
1002
|
-
|
1003
|
-
|
1004
|
-
mode=scan.axis_params.angle_mode
|
1005
|
-
)
|
1006
|
-
return _radio_1, _radio_2
|
320
|
+
|
321
|
+
return scan.get_opposite_projections(mode=scan.axis_params.angle_mode)
|
1007
322
|
|
1008
323
|
@staticmethod
|
1009
324
|
def get_inputs(scan):
|
1010
325
|
assert isinstance(scan, TomwerScanBase)
|
1011
|
-
radio_1, radio_2 = AxisTask.
|
326
|
+
radio_1, radio_2 = AxisTask.get_input_radios(scan=scan)
|
1012
327
|
if radio_1 and radio_2:
|
1013
328
|
mess = " ".join(
|
1014
329
|
("input radios are", radio_1.url.path(), "and", radio_2.url.path())
|
@@ -1040,8 +355,8 @@ class AxisTask(
|
|
1040
355
|
"""
|
1041
356
|
Compute the position value for the scan
|
1042
357
|
|
1043
|
-
:param
|
1044
|
-
:param
|
358
|
+
:param scan:
|
359
|
+
:param wait: used for threaded process. True if we want to end the
|
1045
360
|
computation before releasing hand.
|
1046
361
|
:return: scan as a TomoBase
|
1047
362
|
"""
|
@@ -1091,14 +406,8 @@ class AxisTask(
|
|
1091
406
|
self._axis_params.frame_width = scan.dim_1
|
1092
407
|
self._axis_params.set_relative_value(position)
|
1093
408
|
scan_name = scan.path or "undef scan"
|
1094
|
-
if scan.axis_params.use_sinogram:
|
1095
|
-
method = "sinogram"
|
1096
|
-
else:
|
1097
|
-
method = scan.axis_params.mode.value
|
1098
409
|
r_cor_value = scan.axis_params.relative_cor_value
|
1099
|
-
mess = (
|
1100
|
-
f"Compute axis position ({r_cor_value}) with {method} for {scan_name}"
|
1101
|
-
)
|
410
|
+
mess = f"Compute axis position ({r_cor_value}) with {scan.axis_params.mode.value}"
|
1102
411
|
_logger.info(mess)
|
1103
412
|
return scan
|
1104
413
|
|
@@ -1108,10 +417,10 @@ class AxisTask(
|
|
1108
417
|
else:
|
1109
418
|
raise NotImplementedError("mode not implemented yet")
|
1110
419
|
|
1111
|
-
def define_calculation_mode(self, mode, fct_pointer):
|
420
|
+
def define_calculation_mode(self, mode: AxisMode, fct_pointer):
|
1112
421
|
"""Register the function to call of the given mode
|
1113
422
|
|
1114
|
-
:param
|
423
|
+
:param mode: the mode to register
|
1115
424
|
:param fct_pointer: pointer to the function to call
|
1116
425
|
"""
|
1117
426
|
self._mode_calculation_fct[mode] = fct_pointer
|
@@ -1120,21 +429,31 @@ class AxisTask(
|
|
1120
429
|
"""
|
1121
430
|
|
1122
431
|
:param scan: scan for which we compute the center of rotation
|
1123
|
-
:type: TomoScan
|
1124
432
|
:return: position of the rotation axis. Use the `.AxisMode` defined
|
1125
|
-
by the `.ReconsParams` of the `.
|
1126
|
-
:rtype: float or None (if fail to compute the axis position)
|
433
|
+
by the `.ReconsParams` of the `.AxisTask`
|
1127
434
|
"""
|
1128
435
|
mode = self._axis_params.mode
|
1129
|
-
if mode
|
436
|
+
if mode is AxisMode.manual:
|
1130
437
|
# If mode is read or manual the position_value is not computed and
|
1131
438
|
# we will keep the actual one (should have been defined previously)
|
1132
439
|
res = self._axis_params.relative_cor_value
|
1133
|
-
elif mode
|
1134
|
-
|
1135
|
-
res = self._CALCULATIONS_METHODS[mode](scan)
|
440
|
+
elif mode is AxisMode.read:
|
441
|
+
res = read_scan_x_rotation_axis_pixel_position(scan=scan)
|
1136
442
|
else:
|
1137
|
-
|
443
|
+
has_darks = scan.reduced_darks is not None and len(scan.reduced_darks) > 0
|
444
|
+
has_flats = scan.reduced_flats is not None and len(scan.reduced_flats) > 0
|
445
|
+
|
446
|
+
res = estimate_cor(
|
447
|
+
method=mode.value,
|
448
|
+
dataset_info=adapt_tomwer_scan_to_nabu(scan=scan),
|
449
|
+
do_flatfield=has_darks and has_flats,
|
450
|
+
cor_options=scan.axis_params.get_nabu_cor_options_as_dict(),
|
451
|
+
)
|
452
|
+
# convert back to relative
|
453
|
+
res = _absolute_pos_to_relative_with_warning(
|
454
|
+
absolute_pos=res, det_width=scan.dim_1
|
455
|
+
)
|
456
|
+
|
1138
457
|
return res
|
1139
458
|
|
1140
459
|
@docstring(Task.program_name)
|
@@ -1151,79 +470,3 @@ class AxisTask(
|
|
1151
470
|
@staticmethod
|
1152
471
|
def definition():
|
1153
472
|
return "Compute center of rotation"
|
1154
|
-
|
1155
|
-
@staticmethod
|
1156
|
-
def get_cor_frm_process_file(
|
1157
|
-
process_file, entry, as_url=False
|
1158
|
-
) -> Union[None, float]:
|
1159
|
-
"""
|
1160
|
-
Read cor position from a tomwer_process file
|
1161
|
-
|
1162
|
-
:param process_file:
|
1163
|
-
:param entry:
|
1164
|
-
:return:
|
1165
|
-
"""
|
1166
|
-
if entry is None:
|
1167
|
-
with open_hdf5(process_file) as h5f:
|
1168
|
-
entries = AxisTask._get_process_nodes(root_node=h5f, process=AxisTask)
|
1169
|
-
if len(entries) == 0:
|
1170
|
-
_logger.info("unable to find a Axis process in %s" % process_file)
|
1171
|
-
return None
|
1172
|
-
elif len(entries) > 1:
|
1173
|
-
raise ValueError("several entry found, entry should be " "specify")
|
1174
|
-
else:
|
1175
|
-
entry = list(entries.keys())[0]
|
1176
|
-
_logger.info("take %s as default entry" % entry)
|
1177
|
-
|
1178
|
-
with open_hdf5(process_file) as h5f:
|
1179
|
-
axis_nodes = AxisTask._get_process_nodes(
|
1180
|
-
root_node=h5f[entry], process=AxisTask
|
1181
|
-
)
|
1182
|
-
index_to_path = {}
|
1183
|
-
for key, index in axis_nodes.items():
|
1184
|
-
index_to_path[index] = key
|
1185
|
-
|
1186
|
-
if len(axis_nodes) == 0:
|
1187
|
-
return None
|
1188
|
-
# take the last processed dark ref
|
1189
|
-
last_process_index = sorted(list(axis_nodes.values()))[-1]
|
1190
|
-
last_process_dark = index_to_path[last_process_index]
|
1191
|
-
if (len(index_to_path)) > 1:
|
1192
|
-
_logger.debug(
|
1193
|
-
"several processing found for dark-ref,"
|
1194
|
-
"take the last one: %s" % last_process_dark
|
1195
|
-
)
|
1196
|
-
|
1197
|
-
res = None
|
1198
|
-
if "results" in h5f[last_process_dark].keys():
|
1199
|
-
results_node = h5f[last_process_dark]["results"]
|
1200
|
-
if "center_of_rotation" in results_node.keys():
|
1201
|
-
if as_url:
|
1202
|
-
res = DataUrl(
|
1203
|
-
file_path=process_file,
|
1204
|
-
data_path="/".join((results_node, "center_of_rotation")),
|
1205
|
-
scheme="h5py",
|
1206
|
-
)
|
1207
|
-
else:
|
1208
|
-
res = h5py_read_dataset(results_node["center_of_rotation"])
|
1209
|
-
return res
|
1210
|
-
|
1211
|
-
|
1212
|
-
class AxisProcess(AxisTask):
|
1213
|
-
def __init__(
|
1214
|
-
self,
|
1215
|
-
process_id=None,
|
1216
|
-
varinfo=None,
|
1217
|
-
inputs=None,
|
1218
|
-
node_id=None,
|
1219
|
-
node_attrs=None,
|
1220
|
-
execinfo=None,
|
1221
|
-
):
|
1222
|
-
deprecated_warning(
|
1223
|
-
name="tomwer.core.process.reconstruction.axis.axis.AxisProcess",
|
1224
|
-
type_="class",
|
1225
|
-
reason="improve readibility",
|
1226
|
-
since_version="1.2",
|
1227
|
-
replacement="AxisTask",
|
1228
|
-
)
|
1229
|
-
super().__init__(process_id, varinfo, inputs, node_id, node_attrs, execinfo)
|