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,31 +1,5 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
|
3
|
-
#
|
4
|
-
# Copyright (c) 2016-2017 European Synchrotron Radiation Facility
|
5
|
-
#
|
6
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
-
# of this software and associated documentation files (the "Software"), to deal
|
8
|
-
# in the Software without restriction, including without limitation the rights
|
9
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
-
# copies of the Software, and to permit persons to whom the Software is
|
11
|
-
# furnished to do so, subject to the following conditions:
|
12
|
-
#
|
13
|
-
# The above copyright notice and this permission notice shall be included in
|
14
|
-
# all copies or substantial portions of the Software.
|
15
|
-
#
|
16
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
|
-
# THE SOFTWARE.
|
23
|
-
#
|
24
|
-
# ###########################################################################*/
|
25
|
-
|
26
|
-
__authors__ = ["H. Payno"]
|
27
|
-
__license__ = "MIT"
|
28
|
-
__date__ = "12/12/2018"
|
2
|
+
from __future__ import annotations
|
29
3
|
|
30
4
|
|
31
5
|
import logging
|
@@ -0,0 +1,12 @@
|
|
1
|
+
from ewokscore.task import Task as EwoksTask
|
2
|
+
|
3
|
+
|
4
|
+
class _TomoobjseriesPlaceHolder(
|
5
|
+
EwoksTask, input_names=["series"], output_names=["series"]
|
6
|
+
):
|
7
|
+
"""
|
8
|
+
task to define a tomography 'serie'
|
9
|
+
"""
|
10
|
+
|
11
|
+
def run(self):
|
12
|
+
self.outputs.s = self.inputs.series
|
@@ -0,0 +1,37 @@
|
|
1
|
+
import numpy
|
2
|
+
from silx.utils.enum import Enum as _Enum
|
3
|
+
|
4
|
+
|
5
|
+
class Binning(_Enum):
|
6
|
+
ONE_BY_ONE = "1x1"
|
7
|
+
TWO_BY_TWO = "2x2"
|
8
|
+
FOUR_BY_FOUR = "4x4"
|
9
|
+
HEIGHT_BY_HEIGHT = "8x8"
|
10
|
+
SIXTEEN_BY_SIXTEEN = "16x16"
|
11
|
+
THIRTY_TWO_BY_THIRTY_TWO = "32x32"
|
12
|
+
SIXTY_FOUR_BY_SIXTY_FOUR = "64x64"
|
13
|
+
ONE_HUNDRED_TWENTY_HEIGHT_BY_ONE_HUNDRED_TWENTY_HEIGHT = "128x128"
|
14
|
+
|
15
|
+
@staticmethod
|
16
|
+
def _bin_data(data, binning):
|
17
|
+
if not isinstance(data, numpy.ndarray):
|
18
|
+
raise TypeError("data should be a numpy array")
|
19
|
+
if not data.ndim == 2:
|
20
|
+
raise ValueError("data is expected to be 2d")
|
21
|
+
binning = Binning.from_value(binning)
|
22
|
+
if binning is Binning.ONE_BY_ONE:
|
23
|
+
return data
|
24
|
+
elif binning is Binning.TWO_BY_TWO:
|
25
|
+
return data[::2, ::2]
|
26
|
+
elif binning is Binning.FOUR_BY_FOUR:
|
27
|
+
return data[::4, ::4]
|
28
|
+
elif binning is Binning.HEIGHT_BY_HEIGHT:
|
29
|
+
return data[::8, ::8]
|
30
|
+
elif binning is Binning.SIXTEEN_BY_SIXTEEN:
|
31
|
+
return data[::16, ::16]
|
32
|
+
elif binning is Binning.THIRTY_TWO_BY_THIRTY_TWO:
|
33
|
+
return data[::32, ::32]
|
34
|
+
elif binning is Binning.SIXTY_FOUR_BY_SIXTY_FOUR:
|
35
|
+
return data[::64, ::64]
|
36
|
+
else:
|
37
|
+
raise NotImplementedError
|
@@ -0,0 +1,170 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import os
|
4
|
+
import numpy
|
5
|
+
import logging
|
6
|
+
from PIL import Image
|
7
|
+
from silx.io.url import DataUrl
|
8
|
+
|
9
|
+
from .binning import Binning
|
10
|
+
from .output import OutputFormat
|
11
|
+
|
12
|
+
from tomoscan.utils.io import filter_esrf_mounting_points
|
13
|
+
from tomoscan.esrf.scan.utils import get_data, from_bliss_original_file_to_raw
|
14
|
+
|
15
|
+
from tomwer.core.process.drac.output import DATASET_GALLERY_DIR_NAME
|
16
|
+
from tomwer.core.tomwer_object import TomwerObject
|
17
|
+
from tomwer.core.scan.scanbase import TomwerScanBase
|
18
|
+
|
19
|
+
|
20
|
+
_logger = logging.getLogger(__name__)
|
21
|
+
|
22
|
+
__all__ = [
|
23
|
+
"DracDatasetBase",
|
24
|
+
]
|
25
|
+
|
26
|
+
|
27
|
+
class DracDatasetBase:
|
28
|
+
"""
|
29
|
+
Abstract class for a drac dataset (that should be publish to the data portal).
|
30
|
+
A drac dataset is defined by the following elements:
|
31
|
+
* a directory
|
32
|
+
* metadata
|
33
|
+
"""
|
34
|
+
|
35
|
+
def __init__(self, data_dir: str, tomo_obj: TomwerObject) -> None:
|
36
|
+
"""
|
37
|
+
:param data_dir: directory containing processed data
|
38
|
+
:param tomo_obj: tomwer object referee for the processing
|
39
|
+
"""
|
40
|
+
self._data_dir = filter_esrf_mounting_points(data_dir)
|
41
|
+
self._tomo_obj = tomo_obj
|
42
|
+
self._gallery_file_binning = Binning.TWO_BY_TWO
|
43
|
+
self._gallery_output_format = OutputFormat.PNG
|
44
|
+
self._gallery_overwrite = True
|
45
|
+
|
46
|
+
@property
|
47
|
+
def gallery_output_binning(self) -> Binning:
|
48
|
+
"Binning factor to be used when saving gallery images"
|
49
|
+
return self._gallery_file_binning
|
50
|
+
|
51
|
+
@gallery_output_binning.setter
|
52
|
+
def gallery_output_binning(self, binning: Binning):
|
53
|
+
binning = Binning(binning)
|
54
|
+
self._gallery_file_binning = binning
|
55
|
+
|
56
|
+
@property
|
57
|
+
def gallery_output_format(self) -> OutputFormat:
|
58
|
+
"Output format of the images stored in the gallery"
|
59
|
+
return self._gallery_output_format
|
60
|
+
|
61
|
+
@gallery_output_format.setter
|
62
|
+
def gallery_output_format(self, format: OutputFormat):
|
63
|
+
format = OutputFormat(format)
|
64
|
+
self._gallery_output_format = format
|
65
|
+
|
66
|
+
@property
|
67
|
+
def gallery_overwrite(self) -> bool:
|
68
|
+
return self._gallery_overwrite
|
69
|
+
|
70
|
+
@gallery_overwrite.setter
|
71
|
+
def gallery_overwrite(self, overwrite: bool) -> None:
|
72
|
+
self._gallery_overwrite = overwrite
|
73
|
+
|
74
|
+
@property
|
75
|
+
def dataset_name(self) -> str:
|
76
|
+
"""
|
77
|
+
Return the name of the dataset to be given to the drac dataset.
|
78
|
+
A drac dataset is store according to a (dataset_path, dataset_name). By default if several are pushed with the same key,
|
79
|
+
only the most recent one will be stored
|
80
|
+
"""
|
81
|
+
raise NotImplementedError("Base class")
|
82
|
+
|
83
|
+
def get_gallery_dir(self) -> str:
|
84
|
+
return os.path.join(self.data_dir, DATASET_GALLERY_DIR_NAME)
|
85
|
+
|
86
|
+
def build_gallery(self):
|
87
|
+
"""callback to build the drac-dataset gallery"""
|
88
|
+
pass
|
89
|
+
|
90
|
+
@property
|
91
|
+
def data_dir(self):
|
92
|
+
return self._data_dir
|
93
|
+
|
94
|
+
@property
|
95
|
+
def tomo_obj(self):
|
96
|
+
return self._tomo_obj
|
97
|
+
|
98
|
+
@property
|
99
|
+
def metadata(self) -> dict:
|
100
|
+
raise NotImplementedError("Base class")
|
101
|
+
|
102
|
+
@property
|
103
|
+
def bliss_raw_datasets(self) -> tuple[str]:
|
104
|
+
raise NotImplementedError("Base class")
|
105
|
+
|
106
|
+
@staticmethod
|
107
|
+
def from_scan_to_raws(scan: TomwerScanBase) -> tuple[str]:
|
108
|
+
assert isinstance(
|
109
|
+
scan, TomwerScanBase
|
110
|
+
), f"scan should be an instance of {TomwerScanBase}. Got {type(scan)}"
|
111
|
+
bliss_original_files = scan.get_bliss_original_files()
|
112
|
+
if bliss_original_files is None:
|
113
|
+
bliss_original_files = ()
|
114
|
+
return tuple(
|
115
|
+
[
|
116
|
+
from_bliss_original_file_to_raw(bliss_original_file)
|
117
|
+
for bliss_original_file in bliss_original_files
|
118
|
+
]
|
119
|
+
)
|
120
|
+
|
121
|
+
def to_dict(self):
|
122
|
+
return {
|
123
|
+
"output_dir": self.data_dir,
|
124
|
+
"drac_metadata": self.metadata,
|
125
|
+
}
|
126
|
+
|
127
|
+
def save_to_gallery(
|
128
|
+
self,
|
129
|
+
output_file_name: str,
|
130
|
+
image: numpy.ndarray | DataUrl,
|
131
|
+
lower_bound: float | None = None,
|
132
|
+
upper_bound: float | None = None,
|
133
|
+
) -> None:
|
134
|
+
format = self.gallery_output_format
|
135
|
+
overwrite = self.gallery_overwrite
|
136
|
+
binning = self.gallery_output_binning
|
137
|
+
|
138
|
+
gallery_dir = self.get_gallery_dir()
|
139
|
+
os.makedirs(gallery_dir, exist_ok=True)
|
140
|
+
|
141
|
+
if isinstance(image, DataUrl):
|
142
|
+
image = get_data(image)
|
143
|
+
|
144
|
+
if image.ndim == 3 and image.shape[0] == 1:
|
145
|
+
image = image.reshape(image.shape[1:])
|
146
|
+
elif image.ndim != 2:
|
147
|
+
raise ValueError(f"Only 2D grayscale images are handled. Got {image.shape}")
|
148
|
+
|
149
|
+
# If both bounds are provided, apply clamping and normalization
|
150
|
+
# If not it will use the min/max of each image
|
151
|
+
if lower_bound is not None and upper_bound is not None:
|
152
|
+
image = numpy.clip(image, lower_bound, upper_bound)
|
153
|
+
image = image - lower_bound
|
154
|
+
image *= 255.0 / (upper_bound - lower_bound)
|
155
|
+
else:
|
156
|
+
min_val, max_val = image.min(), image.max()
|
157
|
+
image = image - min_val
|
158
|
+
if max_val > min_val: # Avoid division by zero if image is constant
|
159
|
+
image *= 255.0 / (max_val - min_val)
|
160
|
+
|
161
|
+
# Binning the data if required
|
162
|
+
image = Binning._bin_data(data=image, binning=binning)
|
163
|
+
|
164
|
+
# Convert to a PIL Image and save
|
165
|
+
img = Image.fromarray(image.astype(numpy.uint8), mode="L")
|
166
|
+
if not output_file_name.endswith(f".{format.value}"):
|
167
|
+
output_file_name = output_file_name + f".{format.value}"
|
168
|
+
if not overwrite and os.path.exists(output_file_name):
|
169
|
+
raise OSError(f"File already exists ({output_file_name})")
|
170
|
+
img.save(output_file_name)
|
@@ -0,0 +1,109 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import os
|
4
|
+
|
5
|
+
from nxtomomill.converter.hdf5.utils import PROCESSED_DATA_DIR_NAME, RAW_DATA_DIR_NAME
|
6
|
+
|
7
|
+
from tomwer.io.utils.raw_and_processed_data import to_processed_data_path
|
8
|
+
from tomwer.core.scan.scanbase import TomwerScanBase
|
9
|
+
from .output import DATASET_GALLERY_DIR_NAME, PROPOSAL_GALLERY_DIR_NAME
|
10
|
+
|
11
|
+
__all__ = ["deduce_dataset_gallery_location", "deduce_proposal_GALLERY_location"]
|
12
|
+
|
13
|
+
|
14
|
+
def deduce_dataset_gallery_location(scan_obj: TomwerScanBase) -> str:
|
15
|
+
"""
|
16
|
+
From scan path deduce the 'dataset' path to the gallery.
|
17
|
+
Warning: dataset gallery is different then the 'proposal' gallery
|
18
|
+
"""
|
19
|
+
if not isinstance(scan_obj, TomwerScanBase):
|
20
|
+
raise TypeError(f"'scan_obj' is expected to be an instance of {TomwerScanBase}")
|
21
|
+
|
22
|
+
file_path = os.path.abspath(scan_obj.path)
|
23
|
+
|
24
|
+
split_path = file_path.split(os.sep)
|
25
|
+
# reverse it to find the lower level value of 'PROCESSED_DATA_DIR_NAME' or 'RAW_DATA_DIR_NAME' if by any 'chance' has several in the path
|
26
|
+
# then we will replace the 'lower one' in the string. This is where the GALLERY will be added
|
27
|
+
split_path = split_path[::-1]
|
28
|
+
# check if already contain in a "PROCESSED_DATA" directory
|
29
|
+
try:
|
30
|
+
index_processed_data = split_path.index(PROCESSED_DATA_DIR_NAME)
|
31
|
+
except ValueError:
|
32
|
+
pass
|
33
|
+
index_processed_data = None
|
34
|
+
try:
|
35
|
+
index_raw_data = split_path.index(RAW_DATA_DIR_NAME)
|
36
|
+
except ValueError:
|
37
|
+
# if the value is not in the list
|
38
|
+
index_raw_data = None
|
39
|
+
|
40
|
+
if index_processed_data is None and index_raw_data is None:
|
41
|
+
# if not in any "PROCESSED_DATA" or "RAW_DATA" directory
|
42
|
+
return scan_obj.get_relative_file(
|
43
|
+
file_name=DATASET_GALLERY_DIR_NAME, with_dataset_prefix=False
|
44
|
+
)
|
45
|
+
elif index_processed_data is not None and index_raw_data is not None:
|
46
|
+
if index_raw_data > index_processed_data:
|
47
|
+
# if PROCESSED_DATA lower in the path than RAW_DATA
|
48
|
+
split_path[index_processed_data] = RAW_DATA_DIR_NAME
|
49
|
+
# reorder path to original
|
50
|
+
split_path = list(split_path[::-1])
|
51
|
+
split_path.append(DATASET_GALLERY_DIR_NAME)
|
52
|
+
# move it to PROCESSED_DATA when possible
|
53
|
+
path = os.sep.join(split_path)
|
54
|
+
path = to_processed_data_path(path)
|
55
|
+
return path
|
56
|
+
|
57
|
+
|
58
|
+
def deduce_proposal_GALLERY_location(scan_obj: TomwerScanBase) -> str:
|
59
|
+
"""
|
60
|
+
Policy: look if the scan_obj.path is in 'PROCESSED_DATA_DIR_NAME' or 'RAW_DATA_DIR_NAME' directories.
|
61
|
+
If find any (before any 'GALLERY_DIR_NAME' directory) replace it "GALLERY_DIR_NAME".
|
62
|
+
If none of those are found then create it at the same level as the scan
|
63
|
+
|
64
|
+
:param scan_obj: scan_obj for which we want the GALLERY directory
|
65
|
+
:return: gallery path (to save screenshots for example)
|
66
|
+
"""
|
67
|
+
if not isinstance(scan_obj, TomwerScanBase):
|
68
|
+
raise TypeError(f"'scan_obj' is expected to be an instance of {TomwerScanBase}")
|
69
|
+
|
70
|
+
file_path = os.path.abspath(scan_obj.path)
|
71
|
+
|
72
|
+
split_path = file_path.split(os.sep)
|
73
|
+
# reverse it to find the lower level value of 'PROCESSED_DATA_DIR_NAME' or 'RAW_DATA_DIR_NAME' if by any 'chance' has several in the path
|
74
|
+
# then we will replace the 'lower one' in the string. This is where the GALLERY will be added
|
75
|
+
split_path = split_path[::-1]
|
76
|
+
# check if already contain in a "PROCESSED_DATA" directory
|
77
|
+
try:
|
78
|
+
index_processed_data = split_path.index(PROCESSED_DATA_DIR_NAME)
|
79
|
+
except ValueError:
|
80
|
+
pass
|
81
|
+
index_processed_data = None
|
82
|
+
try:
|
83
|
+
index_raw_data = split_path.index(RAW_DATA_DIR_NAME)
|
84
|
+
except ValueError:
|
85
|
+
# if the value is not in the list
|
86
|
+
index_raw_data = None
|
87
|
+
|
88
|
+
if index_processed_data is None and index_raw_data is None:
|
89
|
+
# if not in any "PROCESSED_DATA" or "RAW_DATA" directory
|
90
|
+
return scan_obj.get_relative_file(
|
91
|
+
file_name=PROPOSAL_GALLERY_DIR_NAME, with_dataset_prefix=False
|
92
|
+
)
|
93
|
+
elif index_processed_data is not None and index_raw_data is not None:
|
94
|
+
if index_raw_data > index_processed_data:
|
95
|
+
# if PROCESSED_DATA lower in the path than RAW_DATA
|
96
|
+
split_path[index_processed_data] = PROPOSAL_GALLERY_DIR_NAME
|
97
|
+
else:
|
98
|
+
# if RAW_DATA lower in the path than PROCESSED_DATA
|
99
|
+
split_path[index_raw_data] = PROPOSAL_GALLERY_DIR_NAME
|
100
|
+
elif index_raw_data is not None:
|
101
|
+
# if the path contains only PROCESSED_DATA or RAW_DATA (expected behavior for online acquistion)
|
102
|
+
split_path[index_raw_data] = PROPOSAL_GALLERY_DIR_NAME
|
103
|
+
else:
|
104
|
+
assert index_processed_data is not None, "index_processed_data is None"
|
105
|
+
split_path[index_processed_data] = PROPOSAL_GALLERY_DIR_NAME
|
106
|
+
|
107
|
+
# reorder path to original
|
108
|
+
split_path = split_path[::-1]
|
109
|
+
return os.sep.join(split_path)
|
@@ -0,0 +1,147 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import os
|
4
|
+
import numpy
|
5
|
+
from .dracbase import DracDatasetBase
|
6
|
+
from tomoscan.esrf.volume.singleframebase import VolumeSingleFrameBase
|
7
|
+
from tomwer.core.scan.scanbase import TomwerScanBase
|
8
|
+
from tomwer.core.volume.volumebase import TomwerVolumeBase
|
9
|
+
from tomwer.core.process.reconstruction.nabu.plane import NabuPlane
|
10
|
+
from tomwer.core.process.reconstruction.output import (
|
11
|
+
PROCESS_FOLDER_RECONSTRUCTED_VOLUMES,
|
12
|
+
)
|
13
|
+
|
14
|
+
|
15
|
+
__all__ = ["DracReconstructedVolumeDataset"]
|
16
|
+
|
17
|
+
|
18
|
+
class DracReconstructedVolumeDataset(DracDatasetBase):
|
19
|
+
"""
|
20
|
+
Class to associate reconstructed volume(s) to an drac (processed) dataset
|
21
|
+
"""
|
22
|
+
|
23
|
+
def __init__(self, tomo_obj: TomwerVolumeBase, source_scan: TomwerScanBase) -> None:
|
24
|
+
if not isinstance(tomo_obj, TomwerVolumeBase):
|
25
|
+
raise TypeError(
|
26
|
+
f"tomo_obj should be an instance of {TomwerVolumeBase}. Got {type(tomo_obj)}"
|
27
|
+
)
|
28
|
+
|
29
|
+
super().__init__(tomo_obj=tomo_obj, data_dir=tomo_obj.icat_data_dir)
|
30
|
+
self._n_slices_per_axis = 3
|
31
|
+
self.__source_scan = source_scan
|
32
|
+
self.__bliss_raw_dataset = self.from_scan_to_raws(scan=self.__source_scan)
|
33
|
+
|
34
|
+
@staticmethod
|
35
|
+
def make_serializable(obj):
|
36
|
+
"""
|
37
|
+
Recursively convert numpy arrays to lists and replace string "None" with None in a given object.
|
38
|
+
"""
|
39
|
+
if isinstance(obj, dict):
|
40
|
+
return {
|
41
|
+
key: DracReconstructedVolumeDataset.make_serializable(value)
|
42
|
+
for key, value in obj.items()
|
43
|
+
}
|
44
|
+
elif isinstance(obj, (list, tuple)):
|
45
|
+
return [
|
46
|
+
DracReconstructedVolumeDataset.make_serializable(item) for item in obj
|
47
|
+
]
|
48
|
+
elif isinstance(obj, numpy.ndarray):
|
49
|
+
return obj.tolist()
|
50
|
+
else:
|
51
|
+
return obj
|
52
|
+
|
53
|
+
@property
|
54
|
+
def metadata(self) -> dict:
|
55
|
+
assert isinstance(self.tomo_obj, TomwerVolumeBase)
|
56
|
+
metadata = self.tomo_obj.build_drac_metadata()
|
57
|
+
metadata["Sample_name"] = self.source_scan.sample_name
|
58
|
+
return metadata
|
59
|
+
|
60
|
+
@property
|
61
|
+
def dataset_name(self) -> str:
|
62
|
+
"""name to give to the drac (processed) dataset."""
|
63
|
+
return PROCESS_FOLDER_RECONSTRUCTED_VOLUMES
|
64
|
+
|
65
|
+
@property
|
66
|
+
def source_scan(self) -> TomwerScanBase:
|
67
|
+
return self.__source_scan
|
68
|
+
|
69
|
+
@property
|
70
|
+
def bliss_raw_datasets(self) -> tuple[str]:
|
71
|
+
return self.__bliss_raw_dataset
|
72
|
+
|
73
|
+
@property
|
74
|
+
def n_slices_per_axis(self) -> int:
|
75
|
+
"number of slices to sample per axis"
|
76
|
+
return self._n_slices_per_axis
|
77
|
+
|
78
|
+
@n_slices_per_axis.setter
|
79
|
+
def n_slices_per_axis(self, n: int) -> None:
|
80
|
+
self._n_slices_per_axis = n
|
81
|
+
|
82
|
+
def get_slices_to_extract(self) -> tuple[tuple[int, tuple[int]]]:
|
83
|
+
"""
|
84
|
+
Compute the slices to be retrieve along each dimension according to 'n_slices_per_axis'
|
85
|
+
|
86
|
+
return tuple (A) is a two elements tuple. First element if the axis (B).
|
87
|
+
Second is the tuple of indices to extract along the axis (B)
|
88
|
+
indices are equally spaced in each dimensions
|
89
|
+
"""
|
90
|
+
result: list[tuple[int, tuple[int]]] = []
|
91
|
+
volume = self.tomo_obj
|
92
|
+
if not isinstance(volume, TomwerVolumeBase):
|
93
|
+
raise TypeError(
|
94
|
+
f"Volume is expected to be an instance of {TomwerVolumeBase}. Got {type(volume)}"
|
95
|
+
)
|
96
|
+
volume_shape = volume.get_volume_shape()
|
97
|
+
for axis, axis_len in enumerate(volume_shape):
|
98
|
+
for slice_index in numpy.linspace(
|
99
|
+
0, axis_len, endpoint=False, num=self.n_slices_per_axis + 1
|
100
|
+
)[1:]:
|
101
|
+
result.append((axis, numpy.round(slice_index).astype(numpy.uint16)))
|
102
|
+
return tuple(result)
|
103
|
+
|
104
|
+
def build_gallery(self):
|
105
|
+
gallery_dir = self.get_gallery_dir()
|
106
|
+
volume = self.tomo_obj
|
107
|
+
slices = volume.get_slices(slices=self.get_slices_to_extract())
|
108
|
+
|
109
|
+
# Stack all slices into a single array to compute the global percentiles
|
110
|
+
all_slices = numpy.concatenate([slice_ for slice_ in slices.values()])
|
111
|
+
lower_bound = numpy.percentile(all_slices, 1)
|
112
|
+
upper_bound = numpy.percentile(all_slices, 99)
|
113
|
+
|
114
|
+
for (axis, slice_index), slice_ in slices.items():
|
115
|
+
self.save_to_gallery(
|
116
|
+
output_file_name=self.get_output_file_name(
|
117
|
+
output_dir=gallery_dir,
|
118
|
+
axis=axis,
|
119
|
+
slice_index=slice_index,
|
120
|
+
volume=volume,
|
121
|
+
),
|
122
|
+
image=slice_,
|
123
|
+
lower_bound=lower_bound,
|
124
|
+
upper_bound=upper_bound,
|
125
|
+
)
|
126
|
+
|
127
|
+
@staticmethod
|
128
|
+
def get_output_file_name(
|
129
|
+
output_dir: str, axis: int, slice_index: int, volume: TomwerVolumeBase
|
130
|
+
) -> str:
|
131
|
+
axis = NabuPlane.from_value(axis)
|
132
|
+
if isinstance(volume, VolumeSingleFrameBase):
|
133
|
+
basename = volume.get_volume_basename()
|
134
|
+
else:
|
135
|
+
basename = os.path.splitext(os.path.basename(volume.data_url.file_path()))[
|
136
|
+
0
|
137
|
+
]
|
138
|
+
axis_folder = os.path.join(
|
139
|
+
os.path.abspath(output_dir),
|
140
|
+
str(axis.value),
|
141
|
+
)
|
142
|
+
os.makedirs(axis_folder, exist_ok=True)
|
143
|
+
# warning: for ordering drac needs to have the axis in a dedicated folder
|
144
|
+
return os.path.join(
|
145
|
+
axis_folder,
|
146
|
+
f"{basename}_capture_{axis.value}_{str(slice_index).zfill(6)}",
|
147
|
+
)
|
@@ -0,0 +1,118 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
import logging
|
3
|
+
|
4
|
+
from tomwer.core.process.task import Task
|
5
|
+
from tomwer.core.process.drac.dracbase import DracDatasetBase
|
6
|
+
|
7
|
+
from processview.core.manager import DatasetState, ProcessManager
|
8
|
+
|
9
|
+
try:
|
10
|
+
from pyicat_plus.client.main import IcatClient # noqa F401
|
11
|
+
except ImportError:
|
12
|
+
has_pyicat_plus = False
|
13
|
+
else:
|
14
|
+
has_pyicat_plus = True
|
15
|
+
|
16
|
+
_logger = logging.getLogger(__name__)
|
17
|
+
|
18
|
+
__all__ = [
|
19
|
+
"PublishICatDatasetTask",
|
20
|
+
]
|
21
|
+
|
22
|
+
|
23
|
+
class PublishICatDatasetTask(
|
24
|
+
Task,
|
25
|
+
input_names=(
|
26
|
+
"data_portal_processed_datasets",
|
27
|
+
"beamline",
|
28
|
+
"proposal",
|
29
|
+
"dataset",
|
30
|
+
),
|
31
|
+
optional_input_names=(
|
32
|
+
"dry_run",
|
33
|
+
"__process__",
|
34
|
+
),
|
35
|
+
):
|
36
|
+
"""
|
37
|
+
publish a list of 'IcatDataBase' instances.
|
38
|
+
|
39
|
+
`IcatDataBase` provide API to retrieve data and metadata to be publish
|
40
|
+
|
41
|
+
input field:
|
42
|
+
* data_portal_processed_datasets: list of 'DracDatasetBase' instances.
|
43
|
+
* beamline: name of the beamline (bm05, id19...)
|
44
|
+
* proposal: proposal name
|
45
|
+
"""
|
46
|
+
|
47
|
+
def run(self):
|
48
|
+
for icat_data in self.inputs.data_portal_processed_datasets:
|
49
|
+
if not isinstance(icat_data, DracDatasetBase):
|
50
|
+
raise TypeError(f"icat_data should be an instance of {DracDatasetBase}")
|
51
|
+
|
52
|
+
# build gallery (if needed by the icat data)
|
53
|
+
|
54
|
+
process = self.get_input_value("__process__", None)
|
55
|
+
|
56
|
+
if process is not None and icat_data.tomo_obj is not None:
|
57
|
+
ProcessManager().notify_dataset_state(
|
58
|
+
dataset=icat_data.tomo_obj,
|
59
|
+
process=process(),
|
60
|
+
state=DatasetState.ON_GOING,
|
61
|
+
)
|
62
|
+
|
63
|
+
icat_data.build_gallery()
|
64
|
+
|
65
|
+
try:
|
66
|
+
self.publish_to_data_portal(
|
67
|
+
path=icat_data.data_dir,
|
68
|
+
metadata=icat_data.metadata,
|
69
|
+
raw=icat_data.bliss_raw_datasets,
|
70
|
+
dataset=icat_data.dataset_name,
|
71
|
+
)
|
72
|
+
|
73
|
+
except Exception as e:
|
74
|
+
if process is not None and icat_data.tomo_obj is not None:
|
75
|
+
ProcessManager().notify_dataset_state(
|
76
|
+
dataset=icat_data.tomo_obj,
|
77
|
+
process=process(),
|
78
|
+
state=DatasetState.FAILED,
|
79
|
+
)
|
80
|
+
raise e
|
81
|
+
else:
|
82
|
+
if process is not None and icat_data.tomo_obj is not None:
|
83
|
+
ProcessManager().notify_dataset_state(
|
84
|
+
dataset=icat_data.tomo_obj,
|
85
|
+
process=process(),
|
86
|
+
state=DatasetState.SUCCEED,
|
87
|
+
)
|
88
|
+
|
89
|
+
def publish_to_data_portal(self, path: str, metadata: dict, raw: str, dataset: str):
|
90
|
+
"""publish path to data_portal (drac) with given metadata"""
|
91
|
+
if not self.inputs.dry_run:
|
92
|
+
if not has_pyicat_plus:
|
93
|
+
raise RuntimeError(
|
94
|
+
"pyicat_plus not installed it. Please install it to be able to publish dataset to icat"
|
95
|
+
)
|
96
|
+
icat_client = IcatClient(
|
97
|
+
metadata_urls=("bcu-mq-01.esrf.fr:61613", "bcu-mq-02.esrf.fr:61613")
|
98
|
+
)
|
99
|
+
|
100
|
+
_logger.info(
|
101
|
+
"publish to icat: %s",
|
102
|
+
{
|
103
|
+
"path": path,
|
104
|
+
"beamline": self.inputs.beamline,
|
105
|
+
"proposal": self.inputs.proposal,
|
106
|
+
"raw": raw,
|
107
|
+
"dataset": dataset,
|
108
|
+
"metadata": metadata,
|
109
|
+
},
|
110
|
+
)
|
111
|
+
icat_client.store_processed_data(
|
112
|
+
beamline=self.inputs.beamline,
|
113
|
+
proposal=self.inputs.proposal,
|
114
|
+
dataset=dataset,
|
115
|
+
path=path,
|
116
|
+
metadata=metadata,
|
117
|
+
raw=raw,
|
118
|
+
)
|