tomwer 1.3.26__py3-none-any.whl → 1.4.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- orangecontrib/tomwer/orange/managedprocess.py +1 -29
- orangecontrib/tomwer/orange/settings.py +2 -28
- orangecontrib/tomwer/tests/TestAcquisition.py +220 -0
- orangecontrib/tomwer/tutorials/append_raw_darks_and_flats_frames_to_NXtomos.ows +2 -2
- orangecontrib/tomwer/tutorials/copy_reduced_darks_and_flats_meth1.ows +1 -1
- orangecontrib/tomwer/tutorials/{icat_publication.ows → drac_publication.ows} +7 -21
- orangecontrib/tomwer/tutorials/id16b/ID16b_full_volume.ows +22 -0
- orangecontrib/tomwer/tutorials/id16b/ID16b_insitu.ows +302 -0
- orangecontrib/tomwer/tutorials/id16b/ID16b_normalization.ows +218 -0
- orangecontrib/tomwer/tutorials/simple_volume_to_slurm_reconstruction.ows +29 -24
- orangecontrib/tomwer/tutorials/test_cor.ows +19 -0
- orangecontrib/tomwer/tutorials/volume_casting_on_slurm.ows +54 -0
- orangecontrib/tomwer/widgets/__init__.py +3 -5
- orangecontrib/tomwer/widgets/cluster/FutureSupervisorOW.py +35 -54
- orangecontrib/tomwer/widgets/cluster/SlurmClusterOW.py +1 -31
- orangecontrib/tomwer/widgets/control/AdvancementOW.py +1 -29
- orangecontrib/tomwer/widgets/control/DataDiscoveryOW.py +5 -4
- orangecontrib/tomwer/widgets/control/DataListenerOW.py +1 -29
- orangecontrib/tomwer/widgets/control/DataSelectorOW.py +11 -30
- orangecontrib/tomwer/widgets/control/DataTransfertOW.py +2 -28
- orangecontrib/tomwer/widgets/control/DataValidatorOW.py +1 -28
- orangecontrib/tomwer/widgets/control/DataWatcherOW.py +1 -28
- orangecontrib/tomwer/widgets/control/EDF2NXTomomillOW.py +48 -51
- orangecontrib/tomwer/widgets/control/EmailOW.py +12 -2
- orangecontrib/tomwer/widgets/control/FilterOW.py +1 -28
- orangecontrib/tomwer/widgets/control/NXTomomillOW.py +37 -53
- orangecontrib/tomwer/widgets/control/NXtomoConcatenate.py +21 -20
- orangecontrib/tomwer/widgets/control/NotifierOW.py +9 -28
- orangecontrib/tomwer/widgets/control/ReduceDarkFlatSelectorOW.py +3 -2
- orangecontrib/tomwer/widgets/control/SingleTomoObjOW.py +1 -27
- orangecontrib/tomwer/widgets/control/TimerOW.py +9 -28
- orangecontrib/tomwer/widgets/control/TomoObjSeriesOW.py +58 -0
- orangecontrib/tomwer/widgets/control/VolumeSelector.py +8 -30
- orangecontrib/tomwer/widgets/control/icons/nxtomomill.svg +173 -119
- orangecontrib/tomwer/widgets/control/icons/reduced_darkflat_selector.png +0 -0
- orangecontrib/tomwer/widgets/control/icons/reduced_darkflat_selector.svg +55 -195
- orangecontrib/tomwer/widgets/control/icons/{tomoobjserie.svg → tomoobjseries.svg} +2 -2
- orangecontrib/tomwer/widgets/dataportal/PublishProcessedDataOW.py +172 -0
- orangecontrib/tomwer/widgets/{icat → dataportal}/__init__.py +2 -2
- orangecontrib/tomwer/widgets/debugtools/DatasetGeneratorOW.py +2 -29
- orangecontrib/tomwer/widgets/debugtools/ObjectInspectorOW.py +1 -29
- orangecontrib/tomwer/widgets/edit/DarkFlatPatchOW.py +48 -73
- orangecontrib/tomwer/widgets/edit/ImageKeyEditorOW.py +48 -75
- orangecontrib/tomwer/widgets/edit/ImageKeyUpgraderOW.py +5 -30
- orangecontrib/tomwer/widgets/edit/NXtomoEditorOW.py +51 -52
- orangecontrib/tomwer/widgets/other/PythonScriptOW.py +22 -10
- orangecontrib/tomwer/widgets/reconstruction/AxisOW.py +51 -60
- orangecontrib/tomwer/widgets/reconstruction/CastNabuVolumeOW.py +22 -68
- orangecontrib/tomwer/widgets/reconstruction/DarkRefAndCopyOW.py +3 -30
- orangecontrib/tomwer/widgets/reconstruction/NabuHelicalPrepareWeightsDoubleOW.py +21 -19
- orangecontrib/tomwer/widgets/reconstruction/NabuOW.py +7 -70
- orangecontrib/tomwer/widgets/reconstruction/NabuVolumeOW.py +41 -84
- orangecontrib/tomwer/widgets/reconstruction/SAAxisOW.py +15 -40
- orangecontrib/tomwer/widgets/reconstruction/SADeltaBetaOW.py +13 -35
- orangecontrib/tomwer/widgets/reconstruction/SinoNormOW.py +2 -30
- orangecontrib/tomwer/widgets/stitching/ZStitchingConfigOW.py +11 -11
- orangecontrib/tomwer/widgets/utils.py +2 -29
- orangecontrib/tomwer/widgets/visualization/DataViewerOW.py +1 -27
- orangecontrib/tomwer/widgets/visualization/DiffViewerOW.py +1 -27
- orangecontrib/tomwer/widgets/visualization/NXtomoMetadataViewerOW.py +1 -1
- orangecontrib/tomwer/widgets/visualization/RadioStackOW.py +2 -28
- orangecontrib/tomwer/widgets/visualization/SampleMovedOW.py +1 -27
- orangecontrib/tomwer/widgets/visualization/SinogramViewerOW.py +1 -27
- orangecontrib/tomwer/widgets/visualization/SliceStackOW.py +2 -28
- tomwer/__init__.py +3 -28
- tomwer/__main__.py +8 -4
- tomwer/app/__init__.py +2 -0
- tomwer/app/axis.py +8 -10
- tomwer/app/canvas.py +23 -29
- tomwer/app/canvas_launcher/config.py +14 -102
- tomwer/app/canvas_launcher/environ.py +5 -8
- tomwer/app/canvas_launcher/mainwindow.py +175 -69
- tomwer/app/canvas_launcher/splash.py +1 -3
- tomwer/app/canvas_launcher/utils.py +47 -0
- tomwer/app/canvas_launcher/widgetsscheme.py +3 -10
- tomwer/app/diffframe.py +2 -0
- tomwer/app/imagekeyeditor.py +2 -1
- tomwer/app/imagekeyupgrader.py +2 -0
- tomwer/app/multicor.py +5 -2
- tomwer/app/multipag.py +16 -5
- tomwer/app/nabuapp.py +2 -1
- tomwer/app/nxtomoeditor.py +17 -12
- tomwer/app/patchrawdarkflat.py +2 -0
- tomwer/app/radiostack.py +3 -2
- tomwer/app/reducedarkflat.py +3 -0
- tomwer/app/samplemoved.py +2 -0
- tomwer/app/scanviewer.py +2 -0
- tomwer/app/sinogramviewer.py +2 -0
- tomwer/app/slicestack.py +11 -13
- tomwer/app/stitching/common.py +431 -0
- tomwer/app/stopdatalistener.py +3 -0
- tomwer/app/ystitching.py +26 -0
- tomwer/app/zstitching.py +8 -363
- tomwer/core/__init__.py +2 -28
- tomwer/core/cluster/__init__.py +3 -0
- tomwer/core/cluster/cluster.py +10 -26
- tomwer/core/futureobject.py +17 -43
- tomwer/core/log/__init__.py +2 -0
- tomwer/core/log/processlog.py +0 -28
- tomwer/core/process/cluster/supervisor.py +52 -34
- tomwer/core/process/conditions/filters.py +3 -28
- tomwer/core/process/control/datalistener/datalistener.py +7 -75
- tomwer/core/process/control/datalistener/rpcserver.py +8 -38
- tomwer/core/process/control/datawatcher/datawatcher.py +11 -40
- tomwer/core/process/control/datawatcher/datawatcherobserver.py +30 -64
- tomwer/core/process/control/datawatcher/datawatcherprocess.py +11 -32
- tomwer/core/process/control/datawatcher/edfdwprocess.py +2 -27
- tomwer/core/process/control/datawatcher/hdf5dwprocess.py +1 -26
- tomwer/core/process/control/datawatcher/status.py +1 -26
- tomwer/core/process/control/emailnotifier.py +11 -23
- tomwer/core/process/control/nxtomoconcatenate.py +20 -18
- tomwer/core/process/control/nxtomomill.py +9 -44
- tomwer/core/process/control/scanlist.py +0 -27
- tomwer/core/process/control/scantransfer.py +15 -13
- tomwer/core/process/control/scanvalidator.py +4 -30
- tomwer/core/process/control/{test → tests}/test_concatenate_nxtomos.py +5 -5
- tomwer/core/process/control/timer.py +1 -27
- tomwer/core/process/control/tomoobjseries.py +12 -0
- tomwer/core/process/drac/binning.py +37 -0
- tomwer/core/process/drac/dracbase.py +170 -0
- tomwer/core/process/drac/gallery.py +109 -0
- tomwer/core/process/drac/output.py +12 -0
- tomwer/core/process/drac/processeddataset.py +147 -0
- tomwer/core/process/drac/publish.py +118 -0
- tomwer/core/process/drac/rawdataset.py +142 -0
- tomwer/core/process/drac/tests/test_gallery.py +71 -0
- tomwer/core/process/drac/tests/test_icat_processed_dataset.py +80 -0
- tomwer/core/process/drac/tests/test_icat_raw_dataset.py +90 -0
- tomwer/core/process/edit/darkflatpatch.py +1 -28
- tomwer/core/process/edit/imagekeyeditor.py +4 -32
- tomwer/core/process/edit/nxtomoeditor.py +307 -0
- tomwer/core/process/edit/tests/test_darkflatpatch.py +243 -0
- tomwer/core/process/edit/tests/test_imagekey_editor.py +99 -0
- tomwer/core/process/output.py +9 -2
- tomwer/core/process/reconstruction/__init__.py +0 -26
- tomwer/core/process/reconstruction/axis/anglemode.py +1 -29
- tomwer/core/process/reconstruction/axis/axis.py +47 -804
- tomwer/core/process/reconstruction/axis/mode.py +89 -25
- tomwer/core/process/reconstruction/axis/params.py +131 -283
- tomwer/core/process/reconstruction/axis/projectiontype.py +0 -28
- tomwer/core/process/reconstruction/axis/side.py +8 -0
- tomwer/core/process/reconstruction/darkref/darkrefs.py +14 -39
- tomwer/core/process/reconstruction/darkref/darkrefscopy.py +7 -39
- tomwer/core/process/reconstruction/darkref/params.py +1 -28
- tomwer/core/process/reconstruction/nabu/castvolume.py +19 -34
- tomwer/core/process/reconstruction/nabu/nabucommon.py +18 -43
- tomwer/core/process/reconstruction/nabu/nabuscores.py +64 -68
- tomwer/core/process/reconstruction/nabu/nabuslices.py +63 -105
- tomwer/core/process/reconstruction/nabu/nabuvolume.py +44 -70
- tomwer/core/process/reconstruction/nabu/plane.py +10 -0
- tomwer/core/process/reconstruction/nabu/settings.py +1 -28
- tomwer/core/process/reconstruction/nabu/target.py +0 -28
- tomwer/core/process/reconstruction/nabu/test/test_castvolume.py +116 -0
- tomwer/core/process/reconstruction/nabu/test/test_nabu_utils.py +277 -0
- tomwer/core/process/reconstruction/nabu/test/test_nabunormalization.py +199 -0
- tomwer/core/process/reconstruction/nabu/utils.py +11 -60
- tomwer/core/process/reconstruction/normalization/normalization.py +2 -32
- tomwer/core/process/reconstruction/normalization/params.py +3 -35
- tomwer/core/process/reconstruction/output.py +14 -19
- tomwer/core/process/reconstruction/paramsbase.py +4 -33
- tomwer/core/process/reconstruction/saaxis/params.py +5 -33
- tomwer/core/process/reconstruction/saaxis/saaxis.py +22 -51
- tomwer/core/process/reconstruction/sadeltabeta/params.py +2 -31
- tomwer/core/process/reconstruction/sadeltabeta/sadeltabeta.py +18 -46
- tomwer/core/process/reconstruction/scores/params.py +9 -39
- tomwer/core/process/reconstruction/scores/scores.py +10 -42
- tomwer/core/process/reconstruction/tests/__init__.py +0 -0
- tomwer/core/process/reconstruction/tests/test_axis.py +46 -0
- tomwer/core/process/reconstruction/tests/test_darkref.py +33 -0
- tomwer/core/process/reconstruction/{test → tests}/test_saaxis.py +1 -27
- tomwer/core/process/reconstruction/tests/test_sadeltabeta.py +48 -0
- tomwer/core/process/reconstruction/{test → tests}/test_utils.py +4 -4
- tomwer/core/process/reconstruction/utils/cor.py +8 -4
- tomwer/core/process/script/python.py +1 -27
- tomwer/core/process/script/tests/test_script.py +41 -0
- tomwer/core/process/stitching/metadataholder.py +5 -4
- tomwer/core/process/stitching/nabustitcher.py +35 -5
- tomwer/core/process/stitching/tests/test_metadataholder.py +17 -0
- tomwer/core/process/task.py +20 -63
- tomwer/core/process/tests/__init__.py +0 -0
- tomwer/core/process/{test → tests}/test_conditions.py +1 -28
- tomwer/core/process/{test → tests}/test_dark_and_flat.py +1 -27
- tomwer/core/process/{test → tests}/test_data_listener.py +1 -27
- tomwer/core/process/{test → tests}/test_data_transfer.py +2 -28
- tomwer/core/process/{test → tests}/test_data_watcher.py +1 -27
- tomwer/core/process/{test → tests}/test_nabu.py +2 -33
- tomwer/core/process/{test → tests}/test_normalization.py +1 -26
- tomwer/core/process/{test → tests}/test_timer.py +1 -27
- tomwer/core/process/utils.py +2 -31
- tomwer/core/process/visualization/dataviewer.py +1 -26
- tomwer/core/process/visualization/diffviewer.py +1 -26
- tomwer/core/process/visualization/imagestackviewer.py +0 -26
- tomwer/core/process/visualization/radiostack.py +0 -26
- tomwer/core/process/visualization/samplemoved.py +0 -28
- tomwer/core/process/visualization/sinogramviewer.py +0 -27
- tomwer/core/process/visualization/slicestack.py +0 -28
- tomwer/core/process/visualization/tests/test_data_viewer.py +12 -0
- tomwer/core/process/visualization/tests/test_diff_viewer.py +12 -0
- tomwer/core/process/visualization/tests/test_image_stack_viewer.py +14 -0
- tomwer/core/process/visualization/tests/test_radio_stack.py +12 -0
- tomwer/core/process/visualization/tests/test_sample_moved.py +14 -0
- tomwer/core/process/visualization/tests/test_sinogram_viewer.py +13 -0
- tomwer/core/process/visualization/tests/test_slice_stack.py +13 -0
- tomwer/core/process/visualization/tests/test_volume_viewer.py +12 -0
- tomwer/core/process/visualization/volumeviewer.py +0 -29
- tomwer/core/scan/__init__.py +3 -27
- tomwer/core/scan/blissscan.py +5 -34
- tomwer/core/scan/edfscan.py +19 -53
- tomwer/core/scan/hdf5scan.py +2 -2
- tomwer/core/scan/nxtomoscan.py +48 -54
- tomwer/core/scan/scanbase.py +107 -203
- tomwer/core/scan/scanfactory.py +11 -41
- tomwer/core/scan/tests/__init__.py +0 -0
- tomwer/core/scan/tests/test_edf.py +25 -0
- tomwer/core/scan/tests/test_future_scan.py +35 -0
- tomwer/core/scan/tests/test_nxtomoscan.py +143 -0
- tomwer/core/scan/tests/test_process_registration.py +64 -0
- tomwer/core/settings.py +18 -40
- tomwer/core/tests/__init__.py +0 -0
- tomwer/core/tests/test_scanutils.py +26 -0
- tomwer/core/{test → tests}/test_utils.py +1 -28
- tomwer/core/tomwer_object.py +4 -0
- tomwer/core/utils/__init__.py +2 -0
- tomwer/core/utils/char.py +0 -28
- tomwer/core/utils/deprecation.py +12 -38
- tomwer/core/utils/dictutils.py +1 -3
- tomwer/core/utils/ftseriesutils.py +1 -27
- tomwer/core/utils/gpu.py +0 -28
- tomwer/core/utils/image.py +8 -39
- tomwer/core/utils/locker.py +1 -28
- tomwer/core/utils/logconfig.py +0 -27
- tomwer/core/utils/normalization.py +4 -31
- tomwer/core/utils/nxtomoutils.py +8 -38
- tomwer/core/utils/resource.py +0 -26
- tomwer/core/utils/scanutils.py +23 -52
- tomwer/core/utils/slurm.py +7 -30
- tomwer/core/utils/spec.py +6 -6
- tomwer/core/utils/tests/__init__.py +0 -0
- tomwer/core/utils/tests/test_image.py +30 -0
- tomwer/core/utils/tests/test_nxtomo.py +38 -0
- tomwer/core/utils/tests/test_scan_utils.py +46 -0
- tomwer/core/utils/tests/test_time.py +6 -0
- tomwer/core/utils/threads.py +0 -26
- tomwer/core/utils/time.py +0 -27
- tomwer/core/volume/__init__.py +4 -0
- tomwer/core/volume/edfvolume.py +1 -28
- tomwer/core/volume/hdf5volume.py +1 -28
- tomwer/core/volume/jp2kvolume.py +1 -27
- tomwer/core/volume/rawvolume.py +1 -28
- tomwer/core/volume/tests/test_volumes.py +21 -0
- tomwer/core/volume/tiffvolume.py +1 -28
- tomwer/core/volume/volumebase.py +5 -0
- tomwer/core/volume/volumefactory.py +7 -33
- tomwer/gui/__init__.py +0 -28
- tomwer/gui/cluster/__init__.py +2 -0
- tomwer/gui/cluster/slurm.py +297 -95
- tomwer/gui/cluster/supervisor.py +1 -27
- tomwer/gui/cluster/tests/__init__.py +0 -0
- tomwer/gui/cluster/{test → tests}/test_cluster.py +21 -26
- tomwer/gui/cluster/{test → tests}/test_supervisor.py +1 -27
- tomwer/gui/conditions/__init__.py +2 -0
- tomwer/gui/conditions/filter.py +1 -26
- tomwer/gui/configuration/__init__.py +2 -0
- tomwer/gui/control/__init__.py +2 -0
- tomwer/gui/control/actions.py +2 -28
- tomwer/gui/control/datadiscovery.py +4 -3
- tomwer/gui/control/datalist.py +64 -69
- tomwer/gui/control/datalistener.py +1 -39
- tomwer/gui/control/datareacheractions.py +1 -28
- tomwer/gui/control/datatransfert.py +2 -29
- tomwer/gui/control/datavalidator.py +3 -37
- tomwer/gui/control/datawatcher/__init__.py +0 -28
- tomwer/gui/control/datawatcher/configuration.py +1 -28
- tomwer/gui/control/datawatcher/datawatcher.py +3 -32
- tomwer/gui/control/datawatcher/datawatcherobserver.py +2 -28
- tomwer/gui/control/history.py +5 -35
- tomwer/gui/control/nxtomomill.py +3 -30
- tomwer/gui/control/observations.py +61 -55
- tomwer/gui/control/reducedarkflatselector.py +24 -20
- tomwer/gui/control/scanselectorwidget.py +2 -28
- tomwer/gui/control/selectorwidgetbase.py +17 -17
- tomwer/gui/control/series/__init__.py +0 -0
- tomwer/gui/control/{serie/seriecreator.py → series/seriescreator.py} +214 -235
- tomwer/gui/control/series/serieswaiter.py +0 -0
- tomwer/gui/control/series/test/test_creator.py +424 -0
- tomwer/gui/control/series/test/test_nxtomo_concatenate.py +21 -0
- tomwer/gui/control/singletomoobj.py +1 -1
- tomwer/gui/control/tests/__init__.py +0 -0
- tomwer/gui/control/tests/test_datalist.py +47 -0
- tomwer/gui/control/{test → tests}/test_datalistener.py +1 -28
- tomwer/gui/control/tests/test_datavalidator.py +27 -0
- tomwer/gui/control/{test → tests}/test_inputwidget.py +1 -27
- tomwer/gui/control/tests/test_process_manager.py +38 -0
- tomwer/gui/control/tests/test_scan_observations.py +23 -0
- tomwer/gui/control/tests/test_scanselector.py +42 -0
- tomwer/gui/control/{test → tests}/test_scanvalidator.py +1 -27
- tomwer/gui/control/{test → tests}/test_volume_dialog.py +2 -30
- tomwer/gui/control/{test → tests}/test_volumeselector.py +1 -27
- tomwer/gui/control/volumeselectorwidget.py +2 -30
- tomwer/gui/dataportal/__init__.py +2 -0
- tomwer/gui/{icat → dataportal}/createscreenshots.py +3 -2
- tomwer/gui/dataportal/gallery.py +133 -0
- tomwer/gui/dataportal/outputformat.py +0 -0
- tomwer/gui/dataportal/publish.py +96 -0
- tomwer/gui/dataportal/tests/test_create_screenshots_gui.py +23 -0
- tomwer/gui/dataportal/tests/test_gallery_gui.py +21 -0
- tomwer/gui/debugtools/__init__.py +2 -0
- tomwer/gui/debugtools/datasetgenerator.py +1 -30
- tomwer/gui/debugtools/objectinspector.py +1 -29
- tomwer/gui/dialog/QDataDialog.py +89 -0
- tomwer/gui/{qfolderdialog.py → dialog/QVolumeDialog.py} +8 -107
- tomwer/gui/dialog/__init__.py +1 -0
- tomwer/gui/edit/__init__.py +2 -0
- tomwer/gui/edit/dkrfpatch.py +52 -87
- tomwer/gui/edit/imagekeyeditor.py +18 -54
- tomwer/gui/edit/nxtomoeditor.py +113 -300
- tomwer/gui/edit/nxtomowarmer.py +3 -2
- tomwer/gui/edit/tests/__init__.py +0 -0
- tomwer/gui/edit/{test → tests}/test_dkrf_patch.py +3 -29
- tomwer/gui/edit/{test → tests}/test_image_key_editor.py +1 -27
- tomwer/gui/edit/{test → tests}/test_nx_editor.py +45 -23
- tomwer/gui/fonts.py +5 -0
- tomwer/gui/icons.py +28 -66
- tomwer/gui/illustrations.py +4 -34
- tomwer/gui/imagefromfile.py +5 -30
- tomwer/gui/metadataloader.py +36 -0
- tomwer/gui/qconfigfile.py +3 -0
- tomwer/gui/qlefilesystem.py +3 -0
- tomwer/gui/reconstruction/__init__.py +2 -0
- tomwer/gui/reconstruction/axis/AxisMainWindow.py +275 -0
- tomwer/gui/reconstruction/axis/AxisOptionsWidget.py +313 -0
- tomwer/gui/reconstruction/axis/AxisSettingsWidget.py +797 -0
- tomwer/gui/reconstruction/axis/AxisWidget.py +534 -0
- tomwer/gui/reconstruction/axis/CalculationWidget.py +218 -0
- tomwer/gui/reconstruction/axis/CompareImages.py +11 -44
- tomwer/gui/reconstruction/axis/ControlWidget.py +285 -0
- tomwer/gui/reconstruction/axis/EstimatedCORWidget.py +394 -0
- tomwer/gui/reconstruction/axis/EstimatedCorComboBox.py +118 -0
- tomwer/gui/reconstruction/axis/InputWidget.py +347 -0
- tomwer/gui/reconstruction/axis/ManualFramesSelection.py +168 -0
- tomwer/gui/reconstruction/axis/__init__.py +2 -2
- tomwer/gui/reconstruction/darkref/__init__.py +0 -27
- tomwer/gui/reconstruction/darkref/darkrefcopywidget.py +5 -34
- tomwer/gui/reconstruction/darkref/darkrefwidget.py +1 -27
- tomwer/gui/reconstruction/nabu/castvolume.py +40 -59
- tomwer/gui/reconstruction/nabu/check.py +7 -33
- tomwer/gui/reconstruction/nabu/nabuconfig/base.py +7 -34
- tomwer/gui/reconstruction/nabu/nabuconfig/ctf.py +6 -5
- tomwer/gui/reconstruction/nabu/nabuconfig/nabuconfig.py +10 -69
- tomwer/gui/reconstruction/nabu/nabuconfig/output.py +3 -47
- tomwer/gui/reconstruction/nabu/nabuconfig/phase.py +54 -36
- tomwer/gui/reconstruction/nabu/nabuconfig/preprocessing.py +103 -54
- tomwer/gui/reconstruction/nabu/nabuconfig/reconstruction.py +116 -65
- tomwer/gui/reconstruction/nabu/nabuflow.py +31 -61
- tomwer/gui/reconstruction/nabu/platform.py +94 -0
- tomwer/gui/reconstruction/nabu/slices.py +81 -45
- tomwer/gui/reconstruction/nabu/slurm.py +1 -27
- tomwer/gui/reconstruction/nabu/test/test_cast_volume.py +82 -0
- tomwer/gui/reconstruction/nabu/test/test_check.py +66 -0
- tomwer/gui/reconstruction/nabu/test/test_ctf.py +46 -0
- tomwer/gui/reconstruction/nabu/test/test_helical.py +21 -0
- tomwer/gui/reconstruction/nabu/test/test_nabu_preprocessing.py +81 -0
- tomwer/gui/reconstruction/nabu/volume.py +62 -90
- tomwer/gui/reconstruction/normalization/intensity.py +5 -32
- tomwer/gui/reconstruction/normalization/test/test_intensity.py +89 -0
- tomwer/gui/reconstruction/saaxis/corrangeselector.py +32 -56
- tomwer/gui/reconstruction/saaxis/dimensionwidget.py +56 -96
- tomwer/gui/reconstruction/saaxis/saaxis.py +17 -38
- tomwer/gui/reconstruction/saaxis/sliceselector.py +8 -39
- tomwer/gui/reconstruction/sadeltabeta/saadeltabeta.py +19 -37
- tomwer/gui/reconstruction/scores/control.py +2 -30
- tomwer/gui/reconstruction/scores/scoreplot.py +23 -49
- tomwer/gui/reconstruction/tests/__init__.py +0 -0
- tomwer/gui/reconstruction/{test → tests}/test_axis.py +23 -49
- tomwer/gui/reconstruction/{test → tests}/test_nabu.py +16 -31
- tomwer/gui/reconstruction/{test → tests}/test_saaxis.py +10 -37
- tomwer/gui/reconstruction/{test → tests}/test_sadeltabeta.py +1 -26
- tomwer/gui/samplemoved/__init__.py +2 -30
- tomwer/gui/samplemoved/selectiontable.py +3 -33
- tomwer/gui/settings.py +7 -0
- tomwer/gui/stackplot.py +33 -661
- tomwer/gui/stacks.py +261 -135
- tomwer/gui/stitching/SingleAxisStitchingWidget.py +326 -0
- tomwer/gui/stitching/StitchingOptionsWidget.py +438 -0
- tomwer/gui/stitching/StitchingWindow.py +586 -0
- tomwer/gui/stitching/__init__.py +2 -0
- tomwer/gui/stitching/alignment.py +90 -0
- tomwer/gui/stitching/axisorderedlist.py +44 -34
- tomwer/gui/stitching/config/axisparams.py +25 -11
- tomwer/gui/stitching/config/output.py +6 -5
- tomwer/gui/stitching/config/positionoveraxis.py +313 -51
- tomwer/gui/stitching/config/stitchingstrategies.py +22 -16
- tomwer/gui/stitching/config/tests/test_axisparams.py +25 -0
- tomwer/gui/stitching/config/tomoobjdetails.py +3 -5
- tomwer/gui/stitching/normalization.py +1 -0
- tomwer/gui/stitching/preview.py +59 -0
- tomwer/gui/stitching/singleaxis.py +57 -0
- tomwer/gui/stitching/stitchandbackground.py +3 -2
- tomwer/gui/stitching/stitching_preview.py +44 -36
- tomwer/gui/stitching/stitching_raw.py +5 -3
- tomwer/gui/stitching/tests/test_ZStitchingWindow.py +88 -0
- tomwer/gui/stitching/tests/test_axis_ordered_list.py +21 -0
- tomwer/gui/stitching/tests/test_normalization.py +27 -0
- tomwer/gui/stitching/tests/test_preview.py +68 -0
- tomwer/gui/stitching/tests/test_stitching_raw.py +110 -0
- tomwer/gui/stitching/tests/utils.py +92 -0
- tomwer/gui/stitching/utils.py +14 -0
- tomwer/gui/stitching/z_stitching/fineestimation.py +5 -33
- tomwer/gui/stitching/z_stitching/tests/test_fine_estimation.py +35 -0
- tomwer/gui/stitching/z_stitching/tests/test_raw_estimation.py +215 -0
- tomwer/gui/stitching/z_stitching/tests/test_stitching_window.py +51 -0
- tomwer/gui/tests/__init__.py +0 -0
- tomwer/gui/tests/test_axis_gui.py +43 -0
- tomwer/gui/{test → tests}/test_qfolder_dialog.py +1 -1
- tomwer/gui/utils/RangeWidget.py +44 -0
- tomwer/gui/utils/buttons.py +4 -3
- tomwer/gui/utils/completer.py +2 -33
- tomwer/gui/utils/flow.py +11 -40
- tomwer/gui/utils/gpu.py +60 -0
- tomwer/gui/utils/illustrations.py +1 -26
- tomwer/gui/utils/inputwidget.py +35 -73
- tomwer/gui/utils/lineselector/lineselector.py +9 -46
- tomwer/gui/utils/loadingmode.py +81 -0
- tomwer/gui/utils/qt_utils.py +9 -0
- tomwer/gui/utils/sandboxes.py +1 -26
- tomwer/gui/utils/scandescription.py +2 -31
- tomwer/gui/utils/scrollarea.py +6 -55
- tomwer/gui/utils/slider.py +4 -28
- tomwer/gui/utils/splashscreen.py +0 -28
- tomwer/gui/utils/step.py +14 -13
- tomwer/gui/utils/tests/test_completer.py +41 -0
- tomwer/gui/utils/tests/test_line_selector.py +21 -0
- tomwer/gui/utils/tests/test_splashscreen.py +8 -0
- tomwer/gui/utils/tests/test_vignettes.py +68 -0
- tomwer/gui/utils/unitsystem.py +15 -69
- tomwer/gui/utils/utils.py +4 -5
- tomwer/gui/utils/vignettes.py +10 -41
- tomwer/gui/utils/waiterthread.py +0 -26
- tomwer/gui/visualization/__init__.py +2 -0
- tomwer/gui/visualization/dataviewer.py +68 -421
- tomwer/gui/visualization/diffviewer/diffviewer.py +2 -30
- tomwer/gui/visualization/diffviewer/shiftwidget.py +4 -29
- tomwer/gui/visualization/fullscreenplot.py +5 -5
- tomwer/gui/visualization/imagestack.py +403 -0
- tomwer/gui/visualization/nxtomometadata.py +0 -4
- tomwer/gui/visualization/reconstructionparameters.py +14 -32
- tomwer/gui/visualization/scanoverview.py +33 -66
- tomwer/gui/visualization/sinogramviewer.py +2 -28
- tomwer/gui/visualization/test/__init__.py +0 -28
- tomwer/gui/visualization/test/test_dataviewer.py +1 -28
- tomwer/gui/visualization/test/test_diffviewer.py +1 -28
- tomwer/gui/visualization/test/test_nx_tomo_metadata_viewer.py +0 -5
- tomwer/gui/visualization/test/test_reconstruction_parameters.py +1 -27
- tomwer/gui/visualization/test/test_sinogramviewer.py +1 -28
- tomwer/gui/visualization/test/test_stacks.py +184 -115
- tomwer/gui/visualization/test/test_volumeviewer.py +3 -2
- tomwer/gui/visualization/tomoobjoverview.py +2 -2
- tomwer/gui/visualization/volumeoverview.py +3 -2
- tomwer/gui/visualization/volumeviewer.py +47 -43
- tomwer/io/__init__.py +2 -0
- tomwer/io/utils/h5pyutils.py +1 -27
- tomwer/io/utils/test/test_raw_and_processed_data.py +10 -0
- tomwer/io/utils/test/test_utils.py +67 -0
- tomwer/io/utils/utils.py +2 -31
- tomwer/resources/__init__.py +13 -33
- tomwer/resources/gui/icons/edit_downstream.svg +114 -0
- tomwer/resources/gui/icons/edit_upstream.svg +112 -0
- tomwer/resources/gui/icons/free_edition.svg +23 -0
- tomwer/resources/gui/icons/icat_gallery_opts.png +0 -0
- tomwer/resources/gui/icons/icat_gallery_opts.svg +80 -0
- tomwer/resources/gui/icons/search.png +0 -0
- tomwer/resources/gui/icons/search.svg +23 -0
- tomwer/resources/gui/icons/warning.png +0 -0
- tomwer/synctools/__init__.py +2 -0
- tomwer/synctools/axis.py +1 -27
- tomwer/synctools/darkref.py +1 -26
- tomwer/synctools/datalistener.py +1 -27
- tomwer/synctools/datatransfert.py +2 -27
- tomwer/synctools/imageloaderthread.py +1 -28
- tomwer/synctools/rsyncmanager.py +1 -25
- tomwer/synctools/saaxis.py +1 -26
- tomwer/synctools/sadeltabeta.py +1 -26
- tomwer/synctools/stacks/control/datalistener.py +1 -26
- tomwer/synctools/stacks/processingstack.py +4 -33
- tomwer/synctools/stacks/reconstruction/axis.py +6 -53
- tomwer/synctools/stacks/reconstruction/castvolume.py +12 -43
- tomwer/synctools/stacks/reconstruction/dkrefcopy.py +4 -27
- tomwer/synctools/stacks/reconstruction/nabu.py +3 -28
- tomwer/synctools/stacks/reconstruction/normalization.py +2 -27
- tomwer/synctools/stacks/reconstruction/saaxis.py +2 -27
- tomwer/synctools/stacks/reconstruction/sadeltabeta.py +2 -27
- tomwer/synctools/tests/__init__.py +0 -0
- tomwer/synctools/{test → tests}/test_darkRefs.py +16 -40
- tomwer/synctools/{test → tests}/test_foldertransfer.py +2 -33
- tomwer/synctools/utils/scanstages.py +2 -31
- tomwer/tests/__init__.py +1 -0
- tomwer/tests/app/test_stitching.py +95 -0
- tomwer/tests/datasets.py +1 -5
- tomwer/tests/orangecontrib/tomwer/widgets/cluster/tests/test_future_supervisorow.py +48 -0
- tomwer/tests/orangecontrib/tomwer/widgets/cluster/tests/test_slurm_clusterow.py +40 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_advancement.py +8 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_data_validator.py +55 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datadiscovery.py +129 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datalistener.py +111 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_dataselector.py +69 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_datawatcher.py +411 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_emailow.py +29 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_notifier.py +24 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_nxtomo_concatenate_ow.py +64 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_nxtomomill.py +133 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_reduce_dark_flat_selector.py +40 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_singletomoobj.py +40 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_timerow.py +25 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_tomoobj_series.py +96 -0
- tomwer/tests/orangecontrib/tomwer/widgets/control/tests/test_volume_selector.py +69 -0
- orangecontrib/tomwer/widgets/edit/test/test_image_key_editor.py → tomwer/tests/orangecontrib/tomwer/widgets/debugtools/tests/test_dataset_generator.py +17 -16
- tomwer/tests/orangecontrib/tomwer/widgets/debugtools/tests/test_object_inspector.py +36 -0
- {orangecontrib/tomwer/widgets/edit/test → tomwer/tests/orangecontrib/tomwer/widgets/edit/tests}/test_dark_flat_patch.py +1 -27
- tomwer/tests/orangecontrib/tomwer/widgets/edit/tests/test_image_key_editor.py +30 -0
- tomwer/tests/orangecontrib/tomwer/widgets/edit/tests/test_nxtomo_editor.py +138 -0
- tomwer/tests/orangecontrib/tomwer/widgets/other/tests/test_pythonscript.py +31 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_axis.py +199 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_cast_volumeow.py +58 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_dark_refs_widget.py +136 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_delta_beta_selector.py +15 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_i_norm.py +200 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_helical_prepare_weights_double.py +20 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_volume.py +74 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_nabu_widget.py +107 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_sa_delta_beta.py +194 -0
- tomwer/tests/orangecontrib/tomwer/widgets/reconstruction/tests/test_saaxis.py +194 -0
- tomwer/tests/orangecontrib/tomwer/widgets/stitching/tests/test_zstitching.py +313 -0
- tomwer/tests/orangecontrib/tomwer/widgets/tests/test_conditions.py +85 -0
- tomwer/tests/orangecontrib/tomwer/widgets/tests/test_darkref.py +225 -0
- tomwer/tests/orangecontrib/tomwer/widgets/tests/test_foldertransfert.py +105 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_dataviewerow.py +57 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_diffviewerow.py +39 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_nxtomo_metadata_viewer.py +29 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_radio_stackow.py +31 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_sample_movedow.py +46 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_sinogram_viewerow.py +31 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_slice_stackow.py +31 -0
- tomwer/tests/orangecontrib/tomwer/widgets/visualization/tests/test_volume_viewerow.py +32 -0
- tomwer/tests/test_ewoks/test_conversion.py +104 -0
- tomwer/tests/test_ewoks/test_single_node_execution.py +87 -0
- tomwer/tests/test_ewoks/test_workflows.py +138 -0
- tomwer/utils.py +11 -39
- tomwer/version.py +2 -2
- {tomwer-1.3.26.dist-info → tomwer-1.4.0.dist-info}/LICENSE +3 -3
- tomwer-1.4.0.dist-info/METADATA +337 -0
- tomwer-1.4.0.dist-info/RECORD +912 -0
- {tomwer-1.3.26.dist-info → tomwer-1.4.0.dist-info}/WHEEL +1 -1
- {tomwer-1.3.26.dist-info → tomwer-1.4.0.dist-info}/entry_points.txt +1 -0
- orangecontrib/tomwer/widgets/control/DataListOW.py +0 -129
- orangecontrib/tomwer/widgets/control/TomoObjSerieOW.py +0 -86
- orangecontrib/tomwer/widgets/control/VolumeSymLinkOW.py +0 -182
- orangecontrib/tomwer/widgets/edit/test/test_nxtomo_editor.py +0 -141
- orangecontrib/tomwer/widgets/icat/PublishProcessedDataOW.py +0 -115
- orangecontrib/tomwer/widgets/icat/RawDataScreenshotCreatorOW.py +0 -98
- orangecontrib/tomwer/widgets/icat/SaveToGalleryAndPublishOW.py +0 -129
- orangecontrib/tomwer/widgets/icat/icons/add_gallery.png +0 -0
- orangecontrib/tomwer/widgets/icat/icons/add_gallery.svg +0 -82
- orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.png +0 -0
- orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.svg +0 -143
- orangecontrib/tomwer/widgets/visualization/LivesliceOW.py +0 -87
- orangecontrib/tomwer/widgets/visualization/icons/liveslice.png +0 -0
- orangecontrib/tomwer/widgets/visualization/icons/liveslice.svg +0 -110
- tomwer/core/log/logger.py +0 -130
- tomwer/core/process/control/test/test_volume_link.py +0 -74
- tomwer/core/process/control/tomoobjserie.py +0 -12
- tomwer/core/process/control/volumesymlink.py +0 -200
- tomwer/core/process/icat/createscreenshots.py +0 -100
- tomwer/core/process/icat/gallery.py +0 -377
- tomwer/core/process/icat/icatbase.py +0 -36
- tomwer/core/process/icat/publish.py +0 -228
- tomwer/core/process/icat/screenshots.py +0 -27
- tomwer/core/process/reconstruction/test/test_darkref.py +0 -60
- tomwer/core/process/reconstruction/test/test_sadeltabeta.py +0 -74
- tomwer/core/process/test/test_axis.py +0 -309
- tomwer/core/process/visualization/liveslice.py +0 -6
- tomwer/core/progress.py +0 -100
- tomwer/core/scan/test/test_edf.py +0 -53
- tomwer/core/scan/test/test_future_scan.py +0 -61
- tomwer/core/scan/test/test_h5.py +0 -96
- tomwer/core/scan/test/test_process_registration.py +0 -109
- tomwer/core/test/test_scanutils.py +0 -53
- tomwer/gui/control/emailnotifier.py +0 -174
- tomwer/gui/control/serie/seriewaiter.py +0 -28
- tomwer/gui/control/test/__init__.py +0 -28
- tomwer/gui/control/test/test_datalist.py +0 -96
- tomwer/gui/control/test/test_datavalidator.py +0 -54
- tomwer/gui/control/test/test_email.py +0 -35
- tomwer/gui/control/test/test_process_manager.py +0 -65
- tomwer/gui/control/test/test_scanselector.py +0 -67
- tomwer/gui/edit/test/__init__.py +0 -28
- tomwer/gui/icat/gallery.py +0 -214
- tomwer/gui/icat/publish.py +0 -187
- tomwer/gui/reconstruction/axis/axis.py +0 -733
- tomwer/gui/reconstruction/axis/radioaxis.py +0 -2467
- tomwer/gui/stitching/stitching.py +0 -1392
- tomwer/gui/test/__init__.py +0 -28
- tomwer/gui/test/test_axis_gui.py +0 -34
- tomwer/synctools/stacks/edit/darkflatpatch.py +0 -169
- tomwer/synctools/stacks/edit/imagekeyeditor.py +0 -135
- tomwer/third_part/WaitingOverlay.py +0 -110
- tomwer-1.3.26-py3.11-nspkg.pth +0 -1
- tomwer-1.3.26.dist-info/METADATA +0 -292
- tomwer-1.3.26.dist-info/RECORD +0 -785
- tomwer-1.3.26.dist-info/namespace_packages.txt +0 -1
- /orangecontrib/tomwer/{widgets/edit/test → tests}/__init__.py +0 -0
- {tomwer/core/process/control/test → orangecontrib/tomwer/tutorials/id16b}/__init__.py +0 -0
- {tomwer/core/process/icat → orangecontrib/tomwer/widgets/cluster/tests}/__init__.py +0 -0
- /orangecontrib/tomwer/widgets/control/icons/{tomoobjserie.png → tomoobjseries.png} +0 -0
- {tomwer/core/process/reconstruction/test → orangecontrib/tomwer/widgets/control/tests}/__init__.py +0 -0
- /orangecontrib/tomwer/widgets/{icat → dataportal}/icons/publish_processed_data.png +0 -0
- /orangecontrib/tomwer/widgets/{icat → dataportal}/icons/publish_processed_data.svg +0 -0
- {tomwer/core/process/test → orangecontrib/tomwer/widgets/debugtools/tests}/__init__.py +0 -0
- {tomwer/core/scan/test → orangecontrib/tomwer/widgets/edit/tests}/__init__.py +0 -0
- {tomwer/core/test → orangecontrib/tomwer/widgets/other/tests}/__init__.py +0 -0
- {tomwer/gui/cluster/test → orangecontrib/tomwer/widgets/reconstruction/tests}/__init__.py +0 -0
- {tomwer/gui/control/serie → orangecontrib/tomwer/widgets/stitching/tests}/__init__.py +0 -0
- {tomwer/gui/icat → orangecontrib/tomwer/widgets/tests}/__init__.py +0 -0
- {tomwer/gui/reconstruction/test → orangecontrib/tomwer/widgets/visualization/tests}/__init__.py +0 -0
- /tomwer/{synctools/stacks/edit → app/stitching}/__init__.py +0 -0
- /tomwer/{synctools/test → core/process/control/tests}/__init__.py +0 -0
- /tomwer/core/process/control/{test → tests}/test_email.py +0 -0
- /tomwer/core/process/control/{test → tests}/test_h52nx_process.py +0 -0
- /tomwer/{third_part → core/process/drac}/__init__.py +0 -0
- /tomwer/core/process/reconstruction/{test → tests}/test_axis_params.py +0 -0
- /tomwer/core/process/reconstruction/{test → tests}/test_darkref_copy.py +0 -0
- /tomwer/core/process/reconstruction/{test → tests}/test_paramsbase.py +0 -0
- /tomwer/core/scan/{test → tests}/test_scan.py +0 -0
- /tomwer/gui/control/{serie → series}/nxtomoconcatenate.py +0 -0
- /tomwer/gui/control/{test → tests}/test_datadiscovery.py +0 -0
- /tomwer/gui/control/{test → tests}/test_reducedarkflat_selector.py +0 -0
- /tomwer/gui/control/{test → tests}/test_single_tomo_obj.py +0 -0
- {orangecontrib/tomwer/widgets/edit/test → tomwer/tests/orangecontrib/tomwer/widgets/edit/tests}/test_image_key_upgrader.py +0 -0
- {tomwer-1.3.26.dist-info → tomwer-1.4.0.dist-info}/top_level.txt +0 -0
@@ -1,377 +0,0 @@
|
|
1
|
-
import logging
|
2
|
-
import os
|
3
|
-
from math import floor
|
4
|
-
|
5
|
-
import numpy
|
6
|
-
from nxtomomill.converter.hdf5.utils import PROCESSED_DATA_DIR_NAME, RAW_DATA_DIR_NAME
|
7
|
-
from PIL import Image
|
8
|
-
from silx.io.url import DataUrl
|
9
|
-
from silx.utils.enum import Enum as _Enum
|
10
|
-
from tomoscan.esrf.scan.utils import get_data
|
11
|
-
from tomoscan.esrf.volume.hdf5volume import HDF5Volume
|
12
|
-
from tomoscan.esrf.volume.singleframebase import VolumeSingleFrameBase
|
13
|
-
|
14
|
-
from tomwer.io.utils.raw_and_processed_data import to_processed_data_path
|
15
|
-
from tomwer.core.scan.edfscan import EDFTomoScan
|
16
|
-
from tomwer.core.process.task import Task
|
17
|
-
from tomwer.core.scan.scanbase import TomwerScanBase
|
18
|
-
from tomwer.core.volume.volumebase import TomwerVolumeBase
|
19
|
-
from tomwer.core.process.icat.screenshots import IcatScreenshots
|
20
|
-
from tomwer.core.process.icat.publish import (
|
21
|
-
PublishProcessedDataFolderTask,
|
22
|
-
from_bliss_original_file_to_raw,
|
23
|
-
)
|
24
|
-
from processview.core.manager import DatasetState, ProcessManager
|
25
|
-
|
26
|
-
_logger = logging.getLogger(__name__)
|
27
|
-
|
28
|
-
PROPOSAL_GALLERY_DIR_NAME = "GALLERY"
|
29
|
-
DATASET_GALLERY_DIR_NAME = "gallery"
|
30
|
-
|
31
|
-
|
32
|
-
class OutputFormat(_Enum):
|
33
|
-
"""possible output format to save screenshots"""
|
34
|
-
|
35
|
-
PNG = "png"
|
36
|
-
JPEG = "jpg"
|
37
|
-
|
38
|
-
|
39
|
-
class Binning(_Enum):
|
40
|
-
ONE_BY_ONE = "1x1"
|
41
|
-
TWO_BY_TWO = "2x2"
|
42
|
-
FOUR_BY_FOUR = "4x4"
|
43
|
-
HEIGHT_BY_HEIGHT = "8x8"
|
44
|
-
SIXTEEN_BY_SIXTEEN = "16x16"
|
45
|
-
THIRTY_TWO_BY_THIRTY_TWO = "32x32"
|
46
|
-
SIXTY_FOUR_BY_SIXTY_FOUR = "64x64"
|
47
|
-
ONE_HUNDRED_TWENTY_HEIGHT_BY_ONE_HUNDRED_TWENTY_HEIGHT = "128x128"
|
48
|
-
|
49
|
-
@staticmethod
|
50
|
-
def _bin_data(data, binning):
|
51
|
-
if not isinstance(data, numpy.ndarray):
|
52
|
-
raise TypeError("data should be a numpy array")
|
53
|
-
if not data.ndim == 2:
|
54
|
-
raise ValueError("data is expected to be 2d")
|
55
|
-
binning = Binning.from_value(binning)
|
56
|
-
if binning is Binning.ONE_BY_ONE:
|
57
|
-
return data
|
58
|
-
elif binning is Binning.TWO_BY_TWO:
|
59
|
-
return data[::2, ::2]
|
60
|
-
elif binning is Binning.FOUR_BY_FOUR:
|
61
|
-
return data[::4, ::4]
|
62
|
-
elif binning is Binning.HEIGHT_BY_HEIGHT:
|
63
|
-
return data[::8, ::8]
|
64
|
-
elif binning is Binning.SIXTEEN_BY_SIXTEEN:
|
65
|
-
return data[::16, ::16]
|
66
|
-
elif binning is Binning.THIRTY_TWO_BY_THIRTY_TWO:
|
67
|
-
return data[::32, ::32]
|
68
|
-
elif binning is Binning.SIXTY_FOUR_BY_SIXTY_FOUR:
|
69
|
-
return data[::64, ::64]
|
70
|
-
else:
|
71
|
-
raise NotImplementedError
|
72
|
-
|
73
|
-
|
74
|
-
def deduce_dataset_gallery_location(scan_obj: TomwerScanBase) -> str:
|
75
|
-
"""
|
76
|
-
From scan path deduce the 'dataset' path to the gallery.
|
77
|
-
Warning: dataset gallery is different then the 'proposal' gallery
|
78
|
-
"""
|
79
|
-
if not isinstance(scan_obj, TomwerScanBase):
|
80
|
-
raise TypeError(f"'scan_obj' is expected to be an instance of {TomwerScanBase}")
|
81
|
-
|
82
|
-
file_path = os.path.abspath(scan_obj.path)
|
83
|
-
|
84
|
-
split_path = file_path.split(os.sep)
|
85
|
-
# 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
|
86
|
-
# then we will replace the 'lower one' in the string. This is where the GALLERY will be added
|
87
|
-
split_path = split_path[::-1]
|
88
|
-
# check if already contain in a "PROCESSED_DATA" directory
|
89
|
-
try:
|
90
|
-
index_processed_data = split_path.index(PROCESSED_DATA_DIR_NAME)
|
91
|
-
except ValueError:
|
92
|
-
pass
|
93
|
-
index_processed_data = None
|
94
|
-
try:
|
95
|
-
index_raw_data = split_path.index(RAW_DATA_DIR_NAME)
|
96
|
-
except ValueError:
|
97
|
-
# if the value is not in the list
|
98
|
-
index_raw_data = None
|
99
|
-
|
100
|
-
if index_processed_data is None and index_raw_data is None:
|
101
|
-
# if not in any "PROCESSED_DATA" or "RAW_DATA" directory
|
102
|
-
return scan_obj.get_relative_file(
|
103
|
-
file_name=DATASET_GALLERY_DIR_NAME, with_dataset_prefix=False
|
104
|
-
)
|
105
|
-
elif index_processed_data is not None and index_raw_data is not None:
|
106
|
-
if index_raw_data > index_processed_data:
|
107
|
-
# if PROCESSED_DATA lower in the path than RAW_DATA
|
108
|
-
split_path[index_processed_data] = RAW_DATA_DIR_NAME
|
109
|
-
# reorder path to original
|
110
|
-
split_path = list(split_path[::-1])
|
111
|
-
split_path.append(DATASET_GALLERY_DIR_NAME)
|
112
|
-
# move it to PPROCESSED_DATA when possible
|
113
|
-
path = os.sep.join(split_path)
|
114
|
-
path = to_processed_data_path(path)
|
115
|
-
return path
|
116
|
-
|
117
|
-
|
118
|
-
def deduce_proposal_GALLERY_location(scan_obj: TomwerScanBase) -> str:
|
119
|
-
"""
|
120
|
-
Policy: look if the scan_obj.path is in 'PROCESSED_DATA_DIR_NAME' or 'RAW_DATA_DIR_NAME' directories.
|
121
|
-
If find any (before any 'GALLERY_DIR_NAME' directory) replace it "GALLERY_DIR_NAME".
|
122
|
-
If none of those are found then create it at the same level as the scan
|
123
|
-
|
124
|
-
:param TomwerScanBase scan_obj: scan_obj for which we want the GALLERY directory
|
125
|
-
:return: gallery path (to save screeshots for example)
|
126
|
-
"""
|
127
|
-
if not isinstance(scan_obj, TomwerScanBase):
|
128
|
-
raise TypeError(f"'scan_obj' is expected to be an instance of {TomwerScanBase}")
|
129
|
-
|
130
|
-
file_path = os.path.abspath(scan_obj.path)
|
131
|
-
|
132
|
-
split_path = file_path.split(os.sep)
|
133
|
-
# 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
|
134
|
-
# then we will replace the 'lower one' in the string. This is where the GALLERY will be added
|
135
|
-
split_path = split_path[::-1]
|
136
|
-
# check if already contain in a "PROCESSED_DATA" directory
|
137
|
-
try:
|
138
|
-
index_processed_data = split_path.index(PROCESSED_DATA_DIR_NAME)
|
139
|
-
except ValueError:
|
140
|
-
pass
|
141
|
-
index_processed_data = None
|
142
|
-
try:
|
143
|
-
index_raw_data = split_path.index(RAW_DATA_DIR_NAME)
|
144
|
-
except ValueError:
|
145
|
-
# if the value is not in the list
|
146
|
-
index_raw_data = None
|
147
|
-
|
148
|
-
if index_processed_data is None and index_raw_data is None:
|
149
|
-
# if not in any "PROCESSED_DATA" or "RAW_DATA" directory
|
150
|
-
return scan_obj.get_relative_file(
|
151
|
-
file_name=PROPOSAL_GALLERY_DIR_NAME, with_dataset_prefix=False
|
152
|
-
)
|
153
|
-
elif index_processed_data is not None and index_raw_data is not None:
|
154
|
-
if index_raw_data > index_processed_data:
|
155
|
-
# if PROCESSED_DATA lower in the path than RAW_DATA
|
156
|
-
split_path[index_processed_data] = PROPOSAL_GALLERY_DIR_NAME
|
157
|
-
else:
|
158
|
-
# if RAW_DATA lower in the path than PROCESSED_DATA
|
159
|
-
split_path[index_raw_data] = PROPOSAL_GALLERY_DIR_NAME
|
160
|
-
elif index_raw_data is not None:
|
161
|
-
# if the path contains only PROCESSED_DATA or RAW_DATA (expected behavior for online acquistion)
|
162
|
-
split_path[index_raw_data] = PROPOSAL_GALLERY_DIR_NAME
|
163
|
-
else:
|
164
|
-
assert index_processed_data is not None, "index_processed_data is None"
|
165
|
-
split_path[index_processed_data] = PROPOSAL_GALLERY_DIR_NAME
|
166
|
-
|
167
|
-
# reorder path to original
|
168
|
-
split_path = split_path[::-1]
|
169
|
-
return os.sep.join(split_path)
|
170
|
-
|
171
|
-
|
172
|
-
def select_screenshot_from_volume(volume: TomwerVolumeBase) -> dict:
|
173
|
-
"""
|
174
|
-
return a subset of url for a volume.
|
175
|
-
Warning: this function will be called each time a nabu slice or a nabu volume is executer from orangecontrig.
|
176
|
-
So it must stay 'low processing' function to avoid slowing down everything
|
177
|
-
"""
|
178
|
-
if not isinstance(volume, TomwerVolumeBase):
|
179
|
-
raise TypeError(
|
180
|
-
f"volume is expected to be an instance of {TomwerVolumeBase}. Get {type(volume)}"
|
181
|
-
)
|
182
|
-
|
183
|
-
if isinstance(volume, VolumeSingleFrameBase):
|
184
|
-
volume_urls = tuple(volume.browse_data_urls())
|
185
|
-
# lets take the three equally spaced slices (3/6, 4/6 and 5/6)
|
186
|
-
n_slices = len(volume_urls)
|
187
|
-
# note: using a dict ensure to get a set of DataUrl in case an Url is used several time
|
188
|
-
# workaround: DataUrl is not hashable
|
189
|
-
screenshots = {
|
190
|
-
f"{os.path.splitext(os.path.basename(volume_urls[floor(i * n_slices / 6)].file_path()))}": volume_urls[
|
191
|
-
floor(i * n_slices / 6)
|
192
|
-
]
|
193
|
-
for i in range(2, 5)
|
194
|
-
}
|
195
|
-
return screenshots
|
196
|
-
elif isinstance(volume, HDF5Volume):
|
197
|
-
volume_url = next(volume.browse_data_urls())
|
198
|
-
n_slices = volume.get_volume_shape()[0]
|
199
|
-
# note: using a dict ensure to get a set of DataUrl in case an Url is used several time
|
200
|
-
# workaround: DataUrl is not hashable
|
201
|
-
screenshots = {
|
202
|
-
f"{os.path.splitext(os.path.basename(volume_url.file_path()))[0]}_{floor(i / 6 * n_slices)}": DataUrl(
|
203
|
-
file_path=volume_url.file_path(),
|
204
|
-
data_path=volume_url.data_path(),
|
205
|
-
scheme="silx",
|
206
|
-
data_slice=floor(i / 6 * n_slices),
|
207
|
-
)
|
208
|
-
for i in range(2, 5)
|
209
|
-
}
|
210
|
-
return screenshots
|
211
|
-
else:
|
212
|
-
_logger.warning(
|
213
|
-
f"volume {type(volume)} does not allow to create screenshot for now"
|
214
|
-
)
|
215
|
-
return ()
|
216
|
-
|
217
|
-
|
218
|
-
class SaveScreenshotsToGalleryTask(
|
219
|
-
Task,
|
220
|
-
input_names=("screenshots",), # screenshots as instance of :class:Screenshots
|
221
|
-
optional_input_names=("format", "overwrite", "binning"),
|
222
|
-
):
|
223
|
-
"""simple task to do the binding between orange design and 'SaveScreenshotsTask'"""
|
224
|
-
|
225
|
-
def run(self):
|
226
|
-
if not isinstance(self.inputs.screenshots, IcatScreenshots):
|
227
|
-
raise TypeError(
|
228
|
-
f"'screenshots' is expected to be an instance of {IcatScreenshots}. get {type(self.inputs.screenshots)}"
|
229
|
-
)
|
230
|
-
|
231
|
-
inputs = self.inputs.screenshots.to_dict()
|
232
|
-
if self.get_input_value("overwrite", None) is not None:
|
233
|
-
inputs["overwrite"] = self.inputs.overwrite
|
234
|
-
if self.get_input_value("format", None) is not None:
|
235
|
-
inputs["format"] = self.inputs.format
|
236
|
-
if self.get_input_value("binning", None) is not None:
|
237
|
-
inputs["binning"] = self.inputs.binning
|
238
|
-
task = SaveScreenshotsTask(
|
239
|
-
inputs=inputs,
|
240
|
-
)
|
241
|
-
task.run()
|
242
|
-
|
243
|
-
|
244
|
-
class SaveScreenshotsTask(
|
245
|
-
Task,
|
246
|
-
input_names=("screenshots_as_dict", "output_dir"),
|
247
|
-
optional_input_names=("format", "overwrite", "binning"),
|
248
|
-
):
|
249
|
-
"""Task which save a set of screenshot to the output_dir under required format"""
|
250
|
-
|
251
|
-
def run(self):
|
252
|
-
format = OutputFormat.from_value(
|
253
|
-
self.get_input_value("format", OutputFormat.PNG)
|
254
|
-
)
|
255
|
-
overwrite = self.get_input_value("overwrite", False)
|
256
|
-
binning = self.get_input_value("binning", Binning.ONE_BY_ONE)
|
257
|
-
|
258
|
-
os.makedirs(self.inputs.output_dir, exist_ok=True)
|
259
|
-
for screenshot_name, data_url in self.inputs.screenshots_as_dict.items():
|
260
|
-
if not isinstance(data_url, DataUrl):
|
261
|
-
raise TypeError("screenshot values are expected to DataUrl")
|
262
|
-
data = get_data(data_url)
|
263
|
-
if not isinstance(data, numpy.ndarray) and data.ndim != 2:
|
264
|
-
raise TypeError("screenshot are expected to be 2D numpy arrays")
|
265
|
-
if not isinstance(screenshot_name, str):
|
266
|
-
raise TypeError(
|
267
|
-
f"screenshot keys are expected to be str. Get {type(screenshot_name)}"
|
268
|
-
)
|
269
|
-
|
270
|
-
if data.ndim == 3 and data.shape[0] == 1:
|
271
|
-
data = data.reshape(data.shape[1:])
|
272
|
-
elif data.ndim != 2:
|
273
|
-
raise ValueError(
|
274
|
-
f"only 2D grayscale image are handled. Get {data.shape}"
|
275
|
-
)
|
276
|
-
# if qt is available use it as this is simpler and more powerful
|
277
|
-
# clamp data in 0-256
|
278
|
-
data = data.astype(numpy.float32)
|
279
|
-
data = Binning._bin_data(data=data, binning=binning)
|
280
|
-
data *= 255.0 / data.max()
|
281
|
-
|
282
|
-
# do a rescale else use qt instead
|
283
|
-
img = Image.fromarray(data, mode=None)
|
284
|
-
img = img.convert("L")
|
285
|
-
output_file = os.path.join(
|
286
|
-
self.inputs.output_dir,
|
287
|
-
".".join([screenshot_name, format.value]),
|
288
|
-
)
|
289
|
-
if not overwrite and os.path.exists(output_file):
|
290
|
-
raise OSError(f"File already exists ({output_file})")
|
291
|
-
img.save(output_file)
|
292
|
-
|
293
|
-
|
294
|
-
class SaveToGalleryAndPublishTask(
|
295
|
-
Task,
|
296
|
-
input_names=(
|
297
|
-
"screenshots",
|
298
|
-
"beamline",
|
299
|
-
"dataset",
|
300
|
-
"proposal",
|
301
|
-
"format",
|
302
|
-
),
|
303
|
-
optional_input_names=(
|
304
|
-
"dry_run",
|
305
|
-
"__process__",
|
306
|
-
),
|
307
|
-
):
|
308
|
-
def __init__(
|
309
|
-
self, varinfo=None, inputs=None, node_id=None, node_attrs=None, execinfo=None
|
310
|
-
):
|
311
|
-
super().__init__(varinfo, inputs, node_id, node_attrs, execinfo)
|
312
|
-
self._process = self.get_input_value("__process__", None)
|
313
|
-
self._task_save = SaveScreenshotsToGalleryTask(
|
314
|
-
inputs=inputs,
|
315
|
-
)
|
316
|
-
|
317
|
-
scan = self.inputs.screenshots.scan
|
318
|
-
if isinstance(scan, EDFTomoScan):
|
319
|
-
raise TypeError(
|
320
|
-
"scan is an EDFTomoScan. Not handled for publishing processed data to icat"
|
321
|
-
)
|
322
|
-
raw = from_bliss_original_file_to_raw(scan.get_bliss_orginal_files())
|
323
|
-
|
324
|
-
path = self.inputs.screenshots.data_dir
|
325
|
-
# path = os.path.dirname(self.inputs.screenshots.data_dir)
|
326
|
-
|
327
|
-
self._task_publish = PublishProcessedDataFolderTask(
|
328
|
-
inputs={
|
329
|
-
"beamline": self.inputs.beamline,
|
330
|
-
"dataset": self.inputs.dataset,
|
331
|
-
"proposal": self.inputs.proposal,
|
332
|
-
"path": path, # must be the dataset path
|
333
|
-
"raw": raw,
|
334
|
-
"dry_run": self.get_input_value("dry_run", False),
|
335
|
-
"metadata": self.inputs.screenshots.metadata,
|
336
|
-
},
|
337
|
-
)
|
338
|
-
|
339
|
-
def run(self):
|
340
|
-
if self._process is not None:
|
341
|
-
ProcessManager().notify_dataset_state(
|
342
|
-
dataset=self.inputs.screenshots.scan,
|
343
|
-
process=self._process(),
|
344
|
-
state=DatasetState.ON_GOING,
|
345
|
-
)
|
346
|
-
# save screenshots to gallery
|
347
|
-
try:
|
348
|
-
self._task_save.run()
|
349
|
-
except Exception as e:
|
350
|
-
if self._process is not None:
|
351
|
-
ProcessManager().notify_dataset_state(
|
352
|
-
dataset=self.inputs.screenshots.scan,
|
353
|
-
process=self._process(),
|
354
|
-
state=DatasetState.FAILED,
|
355
|
-
details=str(e),
|
356
|
-
)
|
357
|
-
raise e
|
358
|
-
|
359
|
-
# publication
|
360
|
-
try:
|
361
|
-
self._task_publish.run()
|
362
|
-
except Exception as e:
|
363
|
-
if self._process is not None:
|
364
|
-
ProcessManager().notify_dataset_state(
|
365
|
-
dataset=self.inputs.screenshots.scan,
|
366
|
-
process=self._process(),
|
367
|
-
state=DatasetState.FAILED,
|
368
|
-
details=str(e),
|
369
|
-
)
|
370
|
-
raise e
|
371
|
-
else:
|
372
|
-
if self._process is not None:
|
373
|
-
ProcessManager().notify_dataset_state(
|
374
|
-
dataset=self.inputs.screenshots.scan,
|
375
|
-
process=self._process(),
|
376
|
-
state=DatasetState.SUCCEED,
|
377
|
-
)
|
@@ -1,36 +0,0 @@
|
|
1
|
-
import weakref
|
2
|
-
from tomwer.core.scan.scanbase import TomwerScanBase
|
3
|
-
|
4
|
-
|
5
|
-
class IcatProcessedDataBase:
|
6
|
-
"""
|
7
|
-
Container class to get all the information about processed data to be publish
|
8
|
-
"""
|
9
|
-
|
10
|
-
def __init__(self, data_dir: str, scan: TomwerScanBase) -> None:
|
11
|
-
self._output_dir = data_dir
|
12
|
-
# output dir for the screenshots. The default is expected to be provided by the task creating the screenshot.
|
13
|
-
# it can be overwrite by the 'SaveScreenshotTask' if an output dir is provided
|
14
|
-
self._scan = weakref.ref(scan) if scan is not None else scan
|
15
|
-
|
16
|
-
@property
|
17
|
-
def data_dir(self):
|
18
|
-
return self._output_dir
|
19
|
-
|
20
|
-
@property
|
21
|
-
def scan(self):
|
22
|
-
return self._scan() if self._scan is not None else None
|
23
|
-
|
24
|
-
@property
|
25
|
-
def metadata(self) -> dict:
|
26
|
-
scan = self.scan
|
27
|
-
if scan is not None:
|
28
|
-
return scan.build_icat_metadata()
|
29
|
-
else:
|
30
|
-
return {}
|
31
|
-
|
32
|
-
def to_dict(self):
|
33
|
-
return {
|
34
|
-
"output_dir": self.data_dir,
|
35
|
-
"icat_metadata": self.metadata,
|
36
|
-
}
|
@@ -1,228 +0,0 @@
|
|
1
|
-
from __future__ import annotations
|
2
|
-
import os
|
3
|
-
import logging
|
4
|
-
|
5
|
-
from tomwer.core.process.task import Task
|
6
|
-
from tomwer.core.scan.scanbase import TomwerScanBase
|
7
|
-
from tomwer.core.scan.edfscan import EDFTomoScan
|
8
|
-
from tomwer.core.volume.hdf5volume import HDF5VolumeIdentifier
|
9
|
-
from tomwer.core.volume.rawvolume import RawVolumeIdentifier
|
10
|
-
from tomwer.io.utils.raw_and_processed_data import file_is_on_processed_data
|
11
|
-
from tomoscan.identifier import VolumeIdentifier
|
12
|
-
from tomoscan.esrf.volume.singleframebase import VolumeSingleFrameBase
|
13
|
-
|
14
|
-
from processview.core.manager import DatasetState, ProcessManager
|
15
|
-
|
16
|
-
try:
|
17
|
-
from pyicat_plus.client.main import IcatClient # noqa F401
|
18
|
-
except ImportError:
|
19
|
-
has_pyicat_plus = False
|
20
|
-
else:
|
21
|
-
has_pyicat_plus = True
|
22
|
-
|
23
|
-
_logger = logging.getLogger(__name__)
|
24
|
-
|
25
|
-
|
26
|
-
class PublishProcessedDataFolderTask(
|
27
|
-
Task,
|
28
|
-
input_names=(
|
29
|
-
"beamline",
|
30
|
-
"proposal",
|
31
|
-
"dataset",
|
32
|
-
"path",
|
33
|
-
"raw",
|
34
|
-
),
|
35
|
-
optional_input_names=(
|
36
|
-
"metadata",
|
37
|
-
"dry_run",
|
38
|
-
),
|
39
|
-
):
|
40
|
-
"""publish a list of volume to icat for the provided beamline && dataset && proposal"""
|
41
|
-
|
42
|
-
def run(self):
|
43
|
-
beamline = self.inputs.beamline
|
44
|
-
proposal = self.inputs.proposal
|
45
|
-
dataset = self.inputs.dataset
|
46
|
-
raw = self.inputs.raw
|
47
|
-
metadata = self.get_input_value("metadata", {})
|
48
|
-
path = self.inputs.path
|
49
|
-
dry_run = self.get_input_value("dry_run", False)
|
50
|
-
|
51
|
-
# checks (need because can be pass by a GUI and will set those values to empty string mostly)
|
52
|
-
missing = []
|
53
|
-
if beamline in (None, ""):
|
54
|
-
missing.append("beamline")
|
55
|
-
if proposal in (None, ""):
|
56
|
-
missing.append("proposal")
|
57
|
-
if dataset in (None, ""):
|
58
|
-
missing.append("dataset")
|
59
|
-
if raw is None or len(raw) == 0:
|
60
|
-
missing.append("raw")
|
61
|
-
|
62
|
-
if len(missing) > 0:
|
63
|
-
mess = f"Missing information about {','.join(missing)}"
|
64
|
-
_logger.error(mess)
|
65
|
-
raise ValueError(mess)
|
66
|
-
if not os.path.exists(path):
|
67
|
-
raise ValueError(f"path: {path} doesn't exists")
|
68
|
-
|
69
|
-
if not file_is_on_processed_data(str(path)):
|
70
|
-
# for now it is safer to limit the publication of metadata to the folder contained in 'PROCESSED_DATA'
|
71
|
-
raise ValueError(
|
72
|
-
f"processed data dir ({path}) is not in a PROCESSED_DATA folder. Cannot publish it"
|
73
|
-
)
|
74
|
-
# publish
|
75
|
-
if not has_pyicat_plus:
|
76
|
-
raise ImportError("pyicat_plus not installed")
|
77
|
-
|
78
|
-
if not dry_run:
|
79
|
-
print("will publish")
|
80
|
-
from pprint import pprint
|
81
|
-
|
82
|
-
pprint(
|
83
|
-
{
|
84
|
-
"beamline": beamline,
|
85
|
-
"proposal": proposal,
|
86
|
-
"dataset": dataset,
|
87
|
-
"path": path,
|
88
|
-
"metadata": metadata,
|
89
|
-
"raw": raw,
|
90
|
-
}
|
91
|
-
)
|
92
|
-
icat_client = IcatClient(
|
93
|
-
metadata_urls=("bcu-mq-01.esrf.fr:61613", "bcu-mq-02.esrf.fr:61613")
|
94
|
-
)
|
95
|
-
|
96
|
-
icat_client.store_processed_data(
|
97
|
-
beamline=beamline,
|
98
|
-
proposal=proposal,
|
99
|
-
dataset=dataset,
|
100
|
-
path=path,
|
101
|
-
metadata=metadata,
|
102
|
-
raw=raw,
|
103
|
-
)
|
104
|
-
|
105
|
-
|
106
|
-
class PublishReconstructedVolumeFromScanTask(
|
107
|
-
Task,
|
108
|
-
input_names=(
|
109
|
-
"data",
|
110
|
-
"beamline",
|
111
|
-
"proposal",
|
112
|
-
"dataset",
|
113
|
-
),
|
114
|
-
optional_input_names=(
|
115
|
-
"metadata",
|
116
|
-
"dry_run",
|
117
|
-
"__process__",
|
118
|
-
),
|
119
|
-
):
|
120
|
-
"""
|
121
|
-
Proxy to PublishProcessedDataTask
|
122
|
-
publish processed data from a 'TomwerScanBase' instance. We expect volume to be registered under 'latest_vol_reconstructions' property.
|
123
|
-
"""
|
124
|
-
|
125
|
-
def __init__(
|
126
|
-
self, varinfo=None, inputs=None, node_id=None, node_attrs=None, execinfo=None
|
127
|
-
):
|
128
|
-
super().__init__(varinfo, inputs, node_id, node_attrs, execinfo)
|
129
|
-
scan = self.inputs.data
|
130
|
-
|
131
|
-
if not isinstance(scan, TomwerScanBase):
|
132
|
-
raise TypeError(f"scan is expected to be an instance of {TomwerScanBase}")
|
133
|
-
if isinstance(scan, EDFTomoScan):
|
134
|
-
raise TypeError(
|
135
|
-
"EDFTomoScan is not handling for pushing processed data to icat"
|
136
|
-
)
|
137
|
-
else:
|
138
|
-
raw = from_bliss_original_file_to_raw(scan.get_bliss_orginal_files())
|
139
|
-
|
140
|
-
def get_volume_identifier_path_to_save(volume_identfier):
|
141
|
-
assert isinstance(volume_identfier, VolumeIdentifier)
|
142
|
-
if isinstance(
|
143
|
-
volume_identfier, (HDF5VolumeIdentifier, RawVolumeIdentifier)
|
144
|
-
):
|
145
|
-
return os.path.dirname(volume_identfier.file_path)
|
146
|
-
elif isinstance(volume_identfier, VolumeSingleFrameBase):
|
147
|
-
if volume_identfier.url is not None:
|
148
|
-
return volume_identfier.url.file_path()
|
149
|
-
elif volume_identfier.data_url.file_path() is not None:
|
150
|
-
return volume_identfier.data_url.file_path()
|
151
|
-
else:
|
152
|
-
raise ValueError(
|
153
|
-
f"identifier type {type(volume_identfier)} is not handled"
|
154
|
-
)
|
155
|
-
|
156
|
-
paths_to_save = set(
|
157
|
-
[
|
158
|
-
get_volume_identifier_path_to_save(volume_id)
|
159
|
-
for volume_id in scan.latest_vol_reconstructions
|
160
|
-
]
|
161
|
-
)
|
162
|
-
self._sub_tasks = [
|
163
|
-
PublishProcessedDataFolderTask(
|
164
|
-
inputs={
|
165
|
-
"beamline": self.inputs.beamline,
|
166
|
-
"proposal": self.inputs.proposal,
|
167
|
-
"dataset": self.inputs.dataset,
|
168
|
-
"path": path_to_save,
|
169
|
-
"raw": raw,
|
170
|
-
"metadata": scan.build_icat_metadata(),
|
171
|
-
"dry_run": self.get_input_value("dry_run", False),
|
172
|
-
}
|
173
|
-
)
|
174
|
-
for path_to_save in paths_to_save
|
175
|
-
]
|
176
|
-
|
177
|
-
def run(self):
|
178
|
-
scan = self.inputs.data
|
179
|
-
process = self.get_input_value("__process__", None)
|
180
|
-
|
181
|
-
if process is not None:
|
182
|
-
ProcessManager().notify_dataset_state(
|
183
|
-
dataset=scan,
|
184
|
-
process=process(),
|
185
|
-
state=DatasetState.ON_GOING,
|
186
|
-
)
|
187
|
-
|
188
|
-
try:
|
189
|
-
for sub_task in self._sub_tasks:
|
190
|
-
sub_task.run()
|
191
|
-
except Exception as e:
|
192
|
-
if process is not None:
|
193
|
-
ProcessManager().notify_dataset_state(
|
194
|
-
dataset=scan,
|
195
|
-
process=process(),
|
196
|
-
state=DatasetState.FAILED,
|
197
|
-
)
|
198
|
-
raise e
|
199
|
-
else:
|
200
|
-
if process is not None:
|
201
|
-
ProcessManager().notify_dataset_state(
|
202
|
-
dataset=scan,
|
203
|
-
process=process(),
|
204
|
-
state=DatasetState.SUCCEED,
|
205
|
-
)
|
206
|
-
|
207
|
-
|
208
|
-
def from_bliss_original_file_to_raw(bliss_original_files: tuple | None) -> tuple:
|
209
|
-
"""
|
210
|
-
convert NXtomo 'bliss_original_files' to icat raw parameter (folder containing the raw)
|
211
|
-
without '/mnt/multipath-shares' prefix
|
212
|
-
"""
|
213
|
-
if bliss_original_files is None:
|
214
|
-
return None
|
215
|
-
|
216
|
-
# TODO: FIXME
|
217
|
-
def fix_path(file_path):
|
218
|
-
path = os.path.dirname(file_path)
|
219
|
-
if "/mnt/multipath-shares" in path:
|
220
|
-
# no simple workaround. abspath return a path with '/mnt/multipath-shares'
|
221
|
-
_logger.info(
|
222
|
-
"looks like raw data is given with '/mnt/multipath-shares' prefix. Icat will fail on it. Must remove it. No proper other handling found :()"
|
223
|
-
)
|
224
|
-
# small workaround to fix abspath. Should not be the case anymore so raise an error
|
225
|
-
path.replace("/mnt/multipath-shares", "")
|
226
|
-
return path
|
227
|
-
|
228
|
-
return tuple([os.path.dirname(bliss_file) for bliss_file in bliss_original_files])
|
@@ -1,27 +0,0 @@
|
|
1
|
-
"""utils around screenshots.
|
2
|
-
"""
|
3
|
-
|
4
|
-
from .icatbase import IcatProcessedDataBase
|
5
|
-
from tomwer.core.scan.scanbase import TomwerScanBase
|
6
|
-
|
7
|
-
|
8
|
-
class IcatScreenshots(IcatProcessedDataBase):
|
9
|
-
"""Class to define an icat process publishing screenshot (so to the galery)"""
|
10
|
-
|
11
|
-
def __init__(self, data_dir: str, screenshots: dict, scan: TomwerScanBase) -> None:
|
12
|
-
super().__init__(data_dir, scan)
|
13
|
-
if not isinstance(screenshots, dict):
|
14
|
-
raise TypeError(
|
15
|
-
f"Screenshots is expected to be a dict. Get {type(screenshots)} instead."
|
16
|
-
)
|
17
|
-
|
18
|
-
self._screenshots = screenshots
|
19
|
-
|
20
|
-
@property
|
21
|
-
def screenshots(self):
|
22
|
-
return self._screenshots
|
23
|
-
|
24
|
-
def to_dict(self):
|
25
|
-
res = super().to_dict()
|
26
|
-
res["screenshots_as_dict"] = self.screenshots
|
27
|
-
return res
|