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
tomwer/core/scan/scanbase.py
CHANGED
@@ -1,41 +1,12 @@
|
|
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
|
-
|
26
|
-
__authors__ = ["H.Payno"]
|
27
|
-
__license__ = "MIT"
|
28
|
-
__date__ = "09/08/2018"
|
29
|
-
|
1
|
+
from __future__ import annotations
|
30
2
|
|
31
3
|
import io
|
32
4
|
import json
|
33
5
|
import logging
|
34
6
|
import os
|
35
|
-
import typing
|
36
7
|
from glob import glob
|
37
|
-
from typing import Optional
|
38
8
|
import functools
|
9
|
+
from typing import Iterable
|
39
10
|
|
40
11
|
import numpy
|
41
12
|
from silx.io.url import DataUrl
|
@@ -46,14 +17,15 @@ from tomoscan.identifier import VolumeIdentifier
|
|
46
17
|
from tomoscan.normalization import IntensityNormalization
|
47
18
|
from tomoscan.volumebase import VolumeBase
|
48
19
|
from tomoscan.identifier import BaseIdentifier
|
20
|
+
from tomoscan.esrf.volume.utils import guess_volumes
|
49
21
|
|
50
22
|
from tomwer.core.tomwer_object import TomwerObject
|
51
23
|
from tomwer.core.utils.ftseriesutils import orderFileByLastLastModification
|
52
24
|
from tomwer.core.utils.locker import FileLockerManager
|
53
|
-
from tomwer.
|
54
|
-
|
55
|
-
|
56
|
-
|
25
|
+
from tomwer.io.utils.raw_and_processed_data import (
|
26
|
+
to_raw_data_path,
|
27
|
+
to_processed_data_path,
|
28
|
+
)
|
57
29
|
|
58
30
|
logger = logging.getLogger(__name__)
|
59
31
|
|
@@ -111,6 +83,7 @@ class TomwerScanBase(TomwerObject):
|
|
111
83
|
self._latest_vol_reconstructions = []
|
112
84
|
"""list of url related to latest volume reconstruction from nabu"""
|
113
85
|
self._reconstruction_paths = set()
|
86
|
+
"""set of paths containing reconstructions of the scan. Make sure we have an entry point for it"""
|
114
87
|
self._proposal_name = None
|
115
88
|
|
116
89
|
def _clear_heavy_cache(self):
|
@@ -120,7 +93,7 @@ class TomwerScanBase(TomwerObject):
|
|
120
93
|
pass
|
121
94
|
|
122
95
|
@property
|
123
|
-
def working_directory(self) ->
|
96
|
+
def working_directory(self) -> str | None:
|
124
97
|
"""
|
125
98
|
working directory to use for this scan (for launching reconstruction for example)
|
126
99
|
"""
|
@@ -149,7 +122,7 @@ class TomwerScanBase(TomwerObject):
|
|
149
122
|
def _flat_field_correction(
|
150
123
|
self,
|
151
124
|
data,
|
152
|
-
index_proj:
|
125
|
+
index_proj: int | None,
|
153
126
|
dark,
|
154
127
|
flat1,
|
155
128
|
flat2,
|
@@ -160,7 +133,8 @@ class TomwerScanBase(TomwerObject):
|
|
160
133
|
compute flat field correction for a provided data from is index
|
161
134
|
one dark and two flats (require also indexes)
|
162
135
|
"""
|
163
|
-
|
136
|
+
if not isinstance(data, numpy.ndarray):
|
137
|
+
raise TypeError("data is expected to be an instance of numpy.ndarray")
|
164
138
|
can_process = True
|
165
139
|
|
166
140
|
if dark is None:
|
@@ -178,6 +152,8 @@ class TomwerScanBase(TomwerObject):
|
|
178
152
|
if self._notify_ffc_rsc_missing:
|
179
153
|
logger.warning("cannot make flat field correction, flat not found")
|
180
154
|
can_process = False
|
155
|
+
elif not isinstance(flat1, numpy.ndarray):
|
156
|
+
raise TypeError("flat1 is expected to be an instance of numpy.ndarray")
|
181
157
|
else:
|
182
158
|
if flat1.ndim != 2:
|
183
159
|
logger.error(
|
@@ -281,15 +257,15 @@ class TomwerScanBase(TomwerObject):
|
|
281
257
|
def projections_with_angle(self):
|
282
258
|
raise NotImplementedError("Base class")
|
283
259
|
|
284
|
-
def scan_dir_name(self) ->
|
260
|
+
def scan_dir_name(self) -> str | None:
|
285
261
|
"""return name of the directory containing the acquisition"""
|
286
262
|
raise NotImplementedError("Base class")
|
287
263
|
|
288
|
-
def scan_basename(self) ->
|
264
|
+
def scan_basename(self) -> str | None:
|
289
265
|
"""return basename of the directory containing the acquisition"""
|
290
266
|
raise NotImplementedError("Base class")
|
291
267
|
|
292
|
-
def scan_parent_dir_basename(self) ->
|
268
|
+
def scan_parent_dir_basename(self) -> str | None:
|
293
269
|
"""return parent basename of the directory containing the acquisition"""
|
294
270
|
raise NotImplementedError("Base class")
|
295
271
|
|
@@ -302,18 +278,7 @@ class TomwerScanBase(TomwerObject):
|
|
302
278
|
@functools.lru_cache(maxsize=3)
|
303
279
|
def get_opposite_projections(self, mode) -> tuple:
|
304
280
|
"""
|
305
|
-
Return the
|
306
|
-
|
307
|
-
:param: angles we want to use for COR calculation. Can be 0-180,
|
308
|
-
90-180 or manual. If manual will return the 'most' appropriate
|
309
|
-
:type: CorAngleMode
|
310
|
-
:param nearest: if True then, pick the closest angle from the requested
|
311
|
-
one. If False, return (None, None) if the the angles
|
312
|
-
does not exists.
|
313
|
-
:type: bool
|
314
|
-
:return: couple of `opposite` radios that can be used for axis
|
315
|
-
calculation.
|
316
|
-
:rtype: tuple(Optional[AxisResource], Optional[AxisResource])
|
281
|
+
Return the two best opposite projections for the required mode.
|
317
282
|
"""
|
318
283
|
radios_with_angle = self.projections_with_angle()
|
319
284
|
angles = numpy.array(
|
@@ -325,7 +290,7 @@ class TomwerScanBase(TomwerObject):
|
|
325
290
|
)
|
326
291
|
)
|
327
292
|
|
328
|
-
from
|
293
|
+
from tomwer.core.process.reconstruction.axis.anglemode import CorAngleMode
|
329
294
|
from ..process.reconstruction.axis.params import (
|
330
295
|
AxisResource,
|
331
296
|
) # avoid cyclic import
|
@@ -356,28 +321,22 @@ class TomwerScanBase(TomwerObject):
|
|
356
321
|
nearest_c1 = find_nearest(angles=angles, angle=couples[0])
|
357
322
|
nearest_c2 = find_nearest(angles=angles, angle=couples[1])
|
358
323
|
if nearest_c1 is not None and nearest_c2 is not None:
|
359
|
-
|
360
|
-
|
361
|
-
|
324
|
+
return (
|
325
|
+
AxisResource(radios_with_angle[nearest_c1], angle=nearest_c1),
|
326
|
+
AxisResource(radios_with_angle[nearest_c2], angle=nearest_c2),
|
327
|
+
)
|
362
328
|
else:
|
363
329
|
return None, None
|
364
330
|
|
365
|
-
def data_flat_field_correction(
|
331
|
+
def data_flat_field_correction(
|
332
|
+
self, data: numpy.ndarray, index: int | None = None
|
333
|
+
) -> numpy.ndarray:
|
366
334
|
"""Apply flat field correction on the given data
|
367
335
|
|
368
|
-
:param
|
369
|
-
:param
|
336
|
+
:param data: the data to apply correction on
|
337
|
+
:param index: index of the data in the acquisition
|
370
338
|
sequence
|
371
339
|
:return: corrected data
|
372
|
-
:rtype: numpy.ndarray
|
373
|
-
"""
|
374
|
-
raise NotImplementedError("Base class")
|
375
|
-
|
376
|
-
def getReconsParamList(self):
|
377
|
-
"""
|
378
|
-
|
379
|
-
:return: reconstruction parameters
|
380
|
-
:rtype: ReconsParamList
|
381
340
|
"""
|
382
341
|
raise NotImplementedError("Base class")
|
383
342
|
|
@@ -496,10 +455,10 @@ class TomwerScanBase(TomwerObject):
|
|
496
455
|
def equal(self, other):
|
497
456
|
"""
|
498
457
|
|
499
|
-
:param
|
458
|
+
:param other: instance to compare with
|
500
459
|
:return: True if instance are equivalent
|
501
|
-
|
502
|
-
|
460
|
+
|
461
|
+
:note: we cannot use the __eq__ function because this object need to be picklable
|
503
462
|
"""
|
504
463
|
return (
|
505
464
|
isinstance(other, self.__class__)
|
@@ -509,19 +468,19 @@ class TomwerScanBase(TomwerObject):
|
|
509
468
|
and self.path == other.path # pylint: disable=E1101
|
510
469
|
)
|
511
470
|
|
512
|
-
def get_sinogram(
|
471
|
+
def get_sinogram(
|
472
|
+
self, line: int, subsampling: int = 1, norm_method=None, **kwargs
|
473
|
+
) -> numpy.ndarray:
|
513
474
|
"""
|
514
475
|
extract the sinogram from projections
|
515
476
|
|
516
477
|
:param line: which sinogram we want
|
517
|
-
:type: int
|
518
478
|
:param subsampling: subsampling to apply on the sinogram
|
519
479
|
:return: sinogram from the radio lines
|
520
|
-
:rtype: numpy.array
|
521
480
|
"""
|
522
481
|
raise NotImplementedError("Base class")
|
523
482
|
|
524
|
-
def get_normed_sinogram(self, line, subsampling=1):
|
483
|
+
def get_normed_sinogram(self, line: int, subsampling: int = 1) -> numpy.ndarray:
|
525
484
|
"""
|
526
485
|
Util to get the sinogram normed with settings currently defined
|
527
486
|
on the 'intensity_normalization' property
|
@@ -564,50 +523,73 @@ class TomwerScanBase(TomwerObject):
|
|
564
523
|
Create the scan that will be generated if this scan is
|
565
524
|
copy to the output_dir
|
566
525
|
|
567
|
-
:param
|
526
|
+
:param output_dir:
|
568
527
|
"""
|
569
528
|
raise NotImplementedError("Base class")
|
570
529
|
|
571
|
-
def get_proj_angle_url(
|
530
|
+
def get_proj_angle_url(
|
531
|
+
self, use_cache: bool = True, *args, **kwargs
|
532
|
+
) -> dict[int | str, DataUrl]:
|
572
533
|
"""
|
573
|
-
retrieve the url for each projections (including the
|
534
|
+
retrieve the url for each projections (including the alignment /
|
574
535
|
return one) and associate to each (if possible) the angle.
|
575
536
|
Alignment angle are set as angle (1) to specify that this is an
|
576
537
|
alignment one.
|
577
|
-
:param
|
538
|
+
:param use_cache:
|
578
539
|
:return: dictionary with angle (str or int) as key and url as value
|
579
|
-
:rtype: dict
|
580
540
|
"""
|
581
541
|
raise NotImplementedError("Base class")
|
582
542
|
|
583
|
-
def
|
543
|
+
def get_reconstructed_slices(self) -> set[str]:
|
584
544
|
"""
|
585
|
-
|
586
|
-
|
587
|
-
:rtype: list
|
545
|
+
Return a set of all the reconstructed **slices** that can be discovered for the scan (it will only look for reconstructed slices and not the volumes!!!!)
|
546
|
+
slices are given as a string representing volume identifier
|
588
547
|
"""
|
589
548
|
from tomwer.core.process.reconstruction.output import (
|
590
|
-
|
549
|
+
PROCESS_FOLDER_RECONSTRUCTED_SLICES,
|
591
550
|
) # avoid cyclic import
|
592
551
|
|
593
|
-
|
552
|
+
all_recons_ids = set()
|
594
553
|
recons_paths = self.reconstruction_paths
|
554
|
+
# extend set reconstruction paths to some 'default' paths.
|
595
555
|
if self.working_directory:
|
596
|
-
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
)
|
556
|
+
# default output folder if using working directory
|
557
|
+
working_dir_output_folder = os.path.join(
|
558
|
+
self.working_directory,
|
559
|
+
PROCESS_FOLDER_RECONSTRUCTED_SLICES,
|
601
560
|
)
|
602
|
-
|
603
|
-
|
604
|
-
|
561
|
+
# add possible output folder: in raw_data (deprecated)
|
562
|
+
raw_data_output_folder = to_raw_data_path(working_dir_output_folder)
|
563
|
+
recons_paths.add(raw_data_output_folder)
|
564
|
+
# add expected output folder: in processed data
|
565
|
+
processed_data_output_folder = to_processed_data_path(
|
566
|
+
working_dir_output_folder
|
567
|
+
)
|
568
|
+
recons_paths.add(processed_data_output_folder)
|
605
569
|
|
606
|
-
|
607
|
-
|
608
|
-
|
609
|
-
else:
|
570
|
+
for path in recons_paths:
|
571
|
+
all_recons_ids.update(self.get_reconstructed_slices_from_path(path))
|
572
|
+
return all_recons_ids
|
610
573
|
|
574
|
+
def get_reconstructed_slices_from_path(self, path, check_url=False) -> set[str]:
|
575
|
+
"""
|
576
|
+
Look for some reconstructed slices at a specific position
|
577
|
+
slices are given as a string representing volume identifier
|
578
|
+
"""
|
579
|
+
if path is None or not os.path.exists(path):
|
580
|
+
return set()
|
581
|
+
|
582
|
+
volumes = guess_volumes(path) or ()
|
583
|
+
# note: guess_volumes will find a volume only if the path fits a volume location
|
584
|
+
# like a hdf5 file containing a volume or a top level EDF volume folder.
|
585
|
+
# In the case path = xxx/reconstructed_slices for example it returns an empty set.
|
586
|
+
if len(volumes) > 0:
|
587
|
+
return set(
|
588
|
+
[volume.get_identifier().to_str() for volume in guess_volumes(path)]
|
589
|
+
)
|
590
|
+
elif os.path.isdir(path):
|
591
|
+
# in the case the location is a folder and doesn't fit any volume
|
592
|
+
# we want to look into sub folders
|
611
593
|
from tomwer.core.process.reconstruction.saaxis.saaxis import (
|
612
594
|
DEFAULT_RECONS_FOLDER as MULTI_COR_DEFAULT_FOLDER,
|
613
595
|
)
|
@@ -619,35 +601,26 @@ class TomwerScanBase(TomwerObject):
|
|
619
601
|
)
|
620
602
|
|
621
603
|
res = set()
|
622
|
-
|
604
|
+
filtered_name = (
|
605
|
+
"steps_file_basename_nabu_sinogram_save_step",
|
606
|
+
MULTI_COR_DEFAULT_FOLDER,
|
607
|
+
MULTI_DB_DEFAULT_FOLDER,
|
608
|
+
NABU_CFG_FILE_FOLDER,
|
609
|
+
)
|
610
|
+
# filter files that we already know they won't contain any reconstructed volume
|
611
|
+
sub_files = filter(
|
612
|
+
lambda name: name not in filtered_name,
|
613
|
+
os.listdir(path),
|
614
|
+
)
|
615
|
+
for f in sub_files:
|
623
616
|
current_path = os.path.join(path, f)
|
624
|
-
|
625
|
-
|
626
|
-
current_path,
|
627
|
-
)
|
628
|
-
if volume is not None:
|
629
|
-
res.add(volume)
|
630
|
-
# avoid looking deeper if this doesn't look like a folder that could contain slices
|
631
|
-
elif (
|
632
|
-
f
|
633
|
-
in (
|
634
|
-
"matlab",
|
635
|
-
"steps_file_basename_nabu_sinogram_save_step",
|
636
|
-
MULTI_COR_DEFAULT_FOLDER,
|
637
|
-
MULTI_DB_DEFAULT_FOLDER,
|
638
|
-
NABU_CFG_FILE_FOLDER,
|
639
|
-
)
|
640
|
-
or f.endswith("_vol")
|
641
|
-
or "slice" not in f
|
642
|
-
):
|
643
|
-
pass
|
644
|
-
else:
|
645
|
-
res.update(
|
646
|
-
self.get_reconstructions_urls_from_path(
|
647
|
-
path=current_path, check_url=check_url
|
648
|
-
)
|
617
|
+
res.update(
|
618
|
+
self.get_reconstructed_slices_from_path(
|
619
|
+
path=current_path, check_url=check_url
|
649
620
|
)
|
621
|
+
)
|
650
622
|
return res
|
623
|
+
return set()
|
651
624
|
|
652
625
|
@property
|
653
626
|
def latest_reconstructions(self):
|
@@ -662,7 +635,7 @@ class TomwerScanBase(TomwerObject):
|
|
662
635
|
def clear_latest_reconstructions(self):
|
663
636
|
self._latest_reconstructions = []
|
664
637
|
|
665
|
-
def set_latest_reconstructions(self, urls:
|
638
|
+
def set_latest_reconstructions(self, urls: Iterable):
|
666
639
|
if urls is None:
|
667
640
|
self._latest_reconstructions = None
|
668
641
|
else:
|
@@ -670,7 +643,7 @@ class TomwerScanBase(TomwerObject):
|
|
670
643
|
[self._process_volume_url(url) for url in urls]
|
671
644
|
)
|
672
645
|
|
673
|
-
def add_latest_reconstructions(self, urls:
|
646
|
+
def add_latest_reconstructions(self, urls: Iterable):
|
674
647
|
self._latest_reconstructions.extend(urls)
|
675
648
|
|
676
649
|
def clear_latest_vol_reconstructions(self):
|
@@ -689,13 +662,11 @@ class TomwerScanBase(TomwerObject):
|
|
689
662
|
f"url should be a {VolumeIdentifier} or a string reprenseting a {VolumeIdentifier}. {type(url)} provided instead"
|
690
663
|
)
|
691
664
|
|
692
|
-
def set_latest_vol_reconstructions(self, volume_identifiers:
|
693
|
-
|
694
|
-
|
695
|
-
|
696
|
-
|
697
|
-
[self._process_volume_url(url) for url in volume_identifiers]
|
698
|
-
)
|
665
|
+
def set_latest_vol_reconstructions(self, volume_identifiers: Iterable | None):
|
666
|
+
volume_identifiers = volume_identifiers or tuple()
|
667
|
+
self._latest_vol_reconstructions = list(
|
668
|
+
[self._process_volume_url(url) for url in volume_identifiers]
|
669
|
+
)
|
699
670
|
|
700
671
|
def add_latest_vol_reconstructions(self, volume_identifiers: tuple):
|
701
672
|
assert isinstance(
|
@@ -774,11 +745,10 @@ class TomwerScanBase(TomwerObject):
|
|
774
745
|
f"set process_index from tomwer process file to {self._process_index}"
|
775
746
|
)
|
776
747
|
|
777
|
-
def get_nabu_dataset_info(self, binning=1, binning_z=1, proj_subsampling=1):
|
748
|
+
def get_nabu_dataset_info(self, binning=1, binning_z=1, proj_subsampling=1) -> dict:
|
778
749
|
"""
|
779
750
|
|
780
751
|
:return: nabu dataset descriptor
|
781
|
-
:rtype: dict
|
782
752
|
"""
|
783
753
|
raise NotImplementedError("Base class")
|
784
754
|
|
@@ -786,7 +756,7 @@ class TomwerScanBase(TomwerObject):
|
|
786
756
|
"""Return the equivalent DatasetAnalyzer for nabu"""
|
787
757
|
raise NotImplementedError("Base class")
|
788
758
|
|
789
|
-
def get_proposal_name(self) ->
|
759
|
+
def get_proposal_name(self) -> str | None:
|
790
760
|
return self._proposal_name
|
791
761
|
|
792
762
|
def set_proposal_name(self, proposal_name: str) -> None:
|
@@ -811,72 +781,6 @@ def _containsDigits(input_):
|
|
811
781
|
return any(char.isdigit() for char in input_)
|
812
782
|
|
813
783
|
|
814
|
-
def _get_reconstructed_single_file_volume(
|
815
|
-
file_, scan: TomwerScanBase, check_url=False
|
816
|
-
) -> Optional[VolumeBase]:
|
817
|
-
scan_basename = scan.get_process_file_name
|
818
|
-
scan_basename = scan.get_dataset_basename()
|
819
|
-
if scan_basename is None:
|
820
|
-
logger.error("TODO")
|
821
|
-
|
822
|
-
file_base_name = os.path.basename(file_)
|
823
|
-
if file_base_name.startswith(scan_basename) and "slice_" in file_base_name:
|
824
|
-
if file_.endswith(TomwerScanBase.VALID_RECONS_EXTENSION):
|
825
|
-
local_str = file_
|
826
|
-
|
827
|
-
for extension in TomwerScanBase.VALID_RECONS_EXTENSION:
|
828
|
-
if local_str.endswith(extension):
|
829
|
-
local_str = local_str.rsplit(extension, 1)[0]
|
830
|
-
break
|
831
|
-
if "slice_pag_" in local_str:
|
832
|
-
indexStr = local_str.split("slice_pag_")[-1].split("_")[0]
|
833
|
-
volume_basename = local_str.split("slice_pag_")[0] + "slice_pag_"
|
834
|
-
else:
|
835
|
-
indexStr = local_str.split("slice_")[-1].split("_")[0]
|
836
|
-
volume_basename = local_str.split("slice_")[0] + "slice_"
|
837
|
-
|
838
|
-
if _containsDigits(indexStr):
|
839
|
-
if extension == ".edf":
|
840
|
-
return EDFVolume(
|
841
|
-
folder=os.path.dirname(file_),
|
842
|
-
volume_basename=volume_basename,
|
843
|
-
)
|
844
|
-
|
845
|
-
if extension in (".jp2", ".jp2"):
|
846
|
-
return JP2KVolume(
|
847
|
-
folder=os.path.dirname(file_),
|
848
|
-
volume_basename=volume_basename,
|
849
|
-
data_extension=extension,
|
850
|
-
)
|
851
|
-
elif extension in (".tiff", ".tif"):
|
852
|
-
return TIFFVolume(
|
853
|
-
folder=os.path.dirname(file_),
|
854
|
-
volume_basename=volume_basename,
|
855
|
-
data_extension=extension,
|
856
|
-
)
|
857
|
-
elif extension in (
|
858
|
-
(".h5", ".hdf5", ".nx", ".nxs", ".nexus", ".nx5", ".hdf")
|
859
|
-
):
|
860
|
-
entry = getattr(scan, "entry", "entry")
|
861
|
-
volume = HDF5Volume(
|
862
|
-
file_path=os.path.abspath(file_),
|
863
|
-
data_path="/".join([entry, "reconstruction"]),
|
864
|
-
)
|
865
|
-
|
866
|
-
if check_url is True:
|
867
|
-
try:
|
868
|
-
with open_hdf5(os.path.abspath(file_)) as h5f:
|
869
|
-
if entry not in h5f:
|
870
|
-
logger.info("{volume} does not exists")
|
871
|
-
return None
|
872
|
-
except Exception:
|
873
|
-
logger.info("unable to check {volume}")
|
874
|
-
return None
|
875
|
-
else:
|
876
|
-
logger.info("{volume} checked")
|
877
|
-
return volume
|
878
|
-
|
879
|
-
|
880
784
|
class NormMethod(_Enum):
|
881
785
|
MANUAL_ROI = "manual ROI"
|
882
786
|
AUTO_ROI = "automatic ROI"
|
tomwer/core/scan/scanfactory.py
CHANGED
@@ -1,37 +1,8 @@
|
|
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
|
-
|
26
|
-
__authors__ = ["H.Payno"]
|
27
|
-
__license__ = "MIT"
|
28
|
-
__date__ = "27/02/2019"
|
29
|
-
|
1
|
+
from __future__ import annotations
|
30
2
|
|
31
3
|
import glob
|
32
4
|
import logging
|
33
5
|
import os
|
34
|
-
from typing import Union
|
35
6
|
from urllib.parse import urlparse
|
36
7
|
|
37
8
|
import h5py
|
@@ -56,12 +27,12 @@ class ScanFactory(object):
|
|
56
27
|
@docstring(_oScanFactory.create_scan_object)
|
57
28
|
@staticmethod
|
58
29
|
def create_tomo_object_from_identifier(
|
59
|
-
identifier:
|
30
|
+
identifier: str | BaseIdentifier,
|
60
31
|
) -> TomoObject:
|
61
32
|
"""
|
62
33
|
Create an instance of TomoScanBase from his identifier if possible
|
63
34
|
|
64
|
-
:param
|
35
|
+
:param identifier: identifier of the TomoScanBase
|
65
36
|
:raises: TypeError if identifier is not a str
|
66
37
|
:raises: ValueError if identifier cannot be converted back to an instance of TomoScanBase
|
67
38
|
"""
|
@@ -118,16 +89,17 @@ class ScanFactory(object):
|
|
118
89
|
raise ValueError(f"Scheme {scheme} not recognized")
|
119
90
|
|
120
91
|
@staticmethod
|
121
|
-
def create_scan_object(
|
92
|
+
def create_scan_object(
|
93
|
+
scan_path: str, entry: str | None = None, accept_bliss_scan: bool = False
|
94
|
+
) -> TomoScanBase:
|
122
95
|
"""
|
123
96
|
|
124
|
-
:param
|
97
|
+
:param scan_path: path to the scan directory or file
|
125
98
|
:param entry: entry on the file. Requested for hdf5 files
|
126
99
|
:param accept_bliss_scan: if True the factory can return some BlissScan
|
127
100
|
But this is only compatible with the
|
128
101
|
Tomomill processing.
|
129
102
|
:return: TomwerScanBase instance fitting the scan folder or scan path
|
130
|
-
:rtype: tomwer.core.scan.scanbase.TomwerScanBase
|
131
103
|
:raises: ValueError if scan_path is not containing a scan
|
132
104
|
"""
|
133
105
|
if scan_path is None:
|
@@ -209,23 +181,21 @@ class ScanFactory(object):
|
|
209
181
|
)
|
210
182
|
|
211
183
|
@staticmethod
|
212
|
-
def is_tomo_scandir(scan_path):
|
184
|
+
def is_tomo_scandir(scan_path: str) -> bool:
|
213
185
|
"""
|
214
186
|
|
215
|
-
:param
|
187
|
+
:param scan_path: path to the scan directory or file
|
216
188
|
:return: True if the given path / file is a tomo_scandir. For now yes by
|
217
189
|
default
|
218
|
-
:rtype: bool
|
219
190
|
"""
|
220
191
|
return True
|
221
192
|
|
222
193
|
@staticmethod
|
223
|
-
def is_edf_tomo(scan_path):
|
194
|
+
def is_edf_tomo(scan_path: str) -> bool:
|
224
195
|
"""
|
225
196
|
|
226
|
-
:param
|
197
|
+
:param scan_path: path to the scan directory or file
|
227
198
|
:return: True if given path define a tomo scan based on .edf file
|
228
|
-
:rtype: bool
|
229
199
|
"""
|
230
200
|
if scan_path and os.path.isdir(scan_path):
|
231
201
|
file_basename = os.path.basename(scan_path)
|
File without changes
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
from __future__ import annotations
|
3
|
+
|
4
|
+
import os
|
5
|
+
|
6
|
+
from tomwer.core.scan.edfscan import EDFTomoScan
|
7
|
+
from tomwer.core.utils.scanutils import MockEDF
|
8
|
+
|
9
|
+
|
10
|
+
def test_scan_dir(tmpdir):
|
11
|
+
full_path = os.path.join(tmpdir, "my", "aquisition", "folder")
|
12
|
+
MockEDF.fastMockAcquisition(full_path)
|
13
|
+
scan = EDFTomoScan(full_path)
|
14
|
+
assert scan.scan_dir_name() == "folder"
|
15
|
+
assert scan.scan_basename() == full_path
|
16
|
+
|
17
|
+
|
18
|
+
def test_working_directory():
|
19
|
+
"""test behavior of the working directory function"""
|
20
|
+
scan = EDFTomoScan(scan=None)
|
21
|
+
assert scan.working_directory is None
|
22
|
+
scan = EDFTomoScan(scan="my_folder")
|
23
|
+
assert scan.working_directory == os.path.abspath("my_folder")
|
24
|
+
scan = EDFTomoScan(scan="/full/path/to/my/folder")
|
25
|
+
assert scan.working_directory == os.path.abspath("/full/path/to/my/folder")
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
"""Unit test for the scan defined at the hdf5 format"""
|
4
|
+
from __future__ import annotations
|
5
|
+
|
6
|
+
import asyncio
|
7
|
+
import os
|
8
|
+
|
9
|
+
from tomwer.core.futureobject import FutureTomwerObject
|
10
|
+
from tomwer.core.utils.scanutils import MockNXtomo
|
11
|
+
|
12
|
+
|
13
|
+
def test_simple_future_tomo_obj(tmpdir):
|
14
|
+
"""Simple test of the FutureTomwerScan API"""
|
15
|
+
scan = MockNXtomo(
|
16
|
+
scan_path=os.path.join(tmpdir, "scan_test"),
|
17
|
+
n_proj=10,
|
18
|
+
n_ini_proj=10,
|
19
|
+
create_ini_dark=False,
|
20
|
+
create_ini_flat=False,
|
21
|
+
dim=10,
|
22
|
+
).scan
|
23
|
+
future = asyncio.Future()
|
24
|
+
future.set_result(None)
|
25
|
+
|
26
|
+
future_tomo_obj = FutureTomwerObject(
|
27
|
+
tomo_obj=scan,
|
28
|
+
futures=[
|
29
|
+
future,
|
30
|
+
],
|
31
|
+
)
|
32
|
+
|
33
|
+
future_tomo_obj.results()
|
34
|
+
assert future_tomo_obj.exceptions() is None
|
35
|
+
assert future_tomo_obj.cancelled() is False
|