tomwer 1.2.1__py3-none-any.whl → 1.3.12__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/tutorials/icat_publication.ows +58 -0
- orangecontrib/tomwer/widgets/__init__.py +11 -11
- orangecontrib/tomwer/widgets/control/DataDiscoveryOW.py +2 -2
- orangecontrib/tomwer/widgets/control/DataListOW.py +9 -7
- orangecontrib/tomwer/widgets/control/DataListenerOW.py +6 -6
- orangecontrib/tomwer/widgets/control/DataSelectorOW.py +21 -10
- orangecontrib/tomwer/widgets/control/DataValidatorOW.py +6 -6
- orangecontrib/tomwer/widgets/control/EDF2NXTomomillOW.py +24 -7
- orangecontrib/tomwer/widgets/control/EmailOW.py +4 -4
- orangecontrib/tomwer/widgets/control/NXTomomillMixIn.py +3 -3
- orangecontrib/tomwer/widgets/control/NXTomomillOW.py +64 -23
- orangecontrib/tomwer/widgets/control/NXtomoConcatenate.py +20 -8
- orangecontrib/tomwer/widgets/control/NotifierOW.py +1 -0
- orangecontrib/tomwer/widgets/control/SingleTomoObjOW.py +6 -6
- orangecontrib/tomwer/widgets/control/VolumeSelector.py +7 -4
- orangecontrib/tomwer/widgets/control/VolumeSymLinkOW.py +182 -182
- orangecontrib/tomwer/widgets/debugtools/DatasetGeneratorOW.py +5 -5
- orangecontrib/tomwer/widgets/edit/DarkFlatPatchOW.py +4 -4
- orangecontrib/tomwer/widgets/edit/ImageKeyEditorOW.py +3 -3
- orangecontrib/tomwer/widgets/edit/ImageKeyUpgraderOW.py +8 -1
- orangecontrib/tomwer/widgets/edit/NXtomoEditorOW.py +3 -3
- orangecontrib/tomwer/widgets/edit/test/test_nxtomo_editor.py +3 -3
- orangecontrib/tomwer/widgets/icat/PublishProcessedDataOW.py +115 -0
- orangecontrib/tomwer/widgets/icat/RawDataScreenshotCreatorOW.py +98 -0
- orangecontrib/tomwer/widgets/icat/SaveToGalleryAndPublishOW.py +129 -0
- orangecontrib/tomwer/widgets/icat/__init__.py +13 -0
- orangecontrib/tomwer/widgets/icat/icons/add_gallery.png +0 -0
- orangecontrib/tomwer/widgets/icat/icons/add_gallery.svg +82 -0
- orangecontrib/tomwer/widgets/icat/icons/publish_processed_data.png +0 -0
- orangecontrib/tomwer/widgets/icat/icons/publish_processed_data.svg +95 -0
- orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.png +0 -0
- orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.svg +143 -0
- orangecontrib/tomwer/widgets/icons/tomwer_data_portal.png +0 -0
- orangecontrib/tomwer/widgets/icons/tomwer_data_portal.svg +76 -0
- orangecontrib/tomwer/widgets/reconstruction/AxisOW.py +22 -20
- orangecontrib/tomwer/widgets/reconstruction/CastNabuVolumeOW.py +19 -3
- orangecontrib/tomwer/widgets/reconstruction/NabuHelicalPrepareWeightsDoubleOW.py +184 -169
- orangecontrib/tomwer/widgets/reconstruction/NabuOW.py +23 -0
- orangecontrib/tomwer/widgets/reconstruction/NabuVolumeOW.py +39 -5
- orangecontrib/tomwer/widgets/reconstruction/SAAxisOW.py +18 -22
- orangecontrib/tomwer/widgets/reconstruction/SADeltaBetaOW.py +18 -26
- orangecontrib/tomwer/widgets/reconstruction/SinoNormOW.py +15 -19
- orangecontrib/tomwer/widgets/visualization/DataViewerOW.py +9 -9
- orangecontrib/tomwer/widgets/visualization/DiffViewerOW.py +1 -1
- orangecontrib/tomwer/widgets/visualization/LivesliceOW.py +1 -1
- orangecontrib/tomwer/widgets/visualization/NXtomoMetadataViewerOW.py +3 -3
- orangecontrib/tomwer/widgets/visualization/SinogramViewerOW.py +0 -1
- orangecontrib/tomwer/widgets/visualization/VolumeViewerOW.py +3 -29
- tomwer/__main__.py +7 -64
- tomwer/app/axis.py +3 -3
- tomwer/app/canvas.py +8 -0
- tomwer/app/canvas_launcher/config.py +16 -14
- tomwer/app/canvas_launcher/environ.py +1 -0
- tomwer/app/canvas_launcher/mainwindow.py +4 -1
- tomwer/app/darkref.py +1 -1
- tomwer/app/darkrefpatch.py +1 -1
- tomwer/app/diffframe.py +3 -3
- tomwer/app/imagekeyeditor.py +5 -5
- tomwer/app/imagekeyupgrader.py +5 -5
- tomwer/app/intensitynormalization.py +14 -13
- tomwer/app/{saaxis.py → multicor.py} +3 -3
- tomwer/app/{sadeltabeta.py → multipag.py} +3 -3
- tomwer/app/nabuapp.py +0 -11
- tomwer/app/radiostack.py +6 -4
- tomwer/app/samplemoved.py +3 -2
- tomwer/app/scanviewer.py +4 -2
- tomwer/app/sinogramviewer.py +3 -2
- tomwer/app/slicestack.py +3 -2
- tomwer/app/zstitching.py +88 -6
- tomwer/core/cluster/cluster.py +26 -0
- tomwer/core/log/logger.py +7 -5
- tomwer/core/process/conditions/filters.py +1 -1
- tomwer/core/process/control/datalistener/datalistener.py +19 -14
- tomwer/core/process/control/datawatcher/edfdwprocess.py +0 -9
- tomwer/core/process/control/nxtomoconcatenate.py +13 -13
- tomwer/core/process/control/nxtomomill.py +92 -34
- tomwer/core/process/control/scantransfer.py +20 -43
- tomwer/core/process/control/scanvalidator.py +3 -2
- tomwer/core/process/control/test/test_concatenate_nxtomos.py +9 -9
- tomwer/core/process/control/test/test_email.py +4 -4
- tomwer/core/process/control/test/test_h52nx_process.py +59 -7
- tomwer/core/process/control/test/test_volume_link.py +64 -64
- tomwer/core/process/control/timer.py +1 -1
- tomwer/core/process/control/volumesymlink.py +200 -200
- tomwer/core/process/edit/darkflatpatch.py +14 -15
- tomwer/core/process/edit/imagekeyeditor.py +41 -39
- tomwer/core/process/icat/__init__.py +0 -0
- tomwer/core/process/icat/createscreenshots.py +100 -0
- tomwer/core/process/icat/gallery.py +377 -0
- tomwer/core/process/icat/icatbase.py +36 -0
- tomwer/core/process/icat/publish.py +228 -0
- tomwer/core/process/icat/screenshots.py +27 -0
- tomwer/core/process/output.py +52 -0
- tomwer/core/process/reconstruction/axis/axis.py +280 -69
- tomwer/core/process/reconstruction/axis/mode.py +163 -48
- tomwer/core/process/reconstruction/axis/params.py +29 -21
- tomwer/core/process/reconstruction/darkref/darkrefs.py +41 -127
- tomwer/core/process/reconstruction/darkref/darkrefscopy.py +4 -3
- tomwer/core/process/reconstruction/darkref/params.py +1 -1
- tomwer/core/process/reconstruction/nabu/castvolume.py +4 -4
- tomwer/core/process/reconstruction/nabu/helical.py +9 -5
- tomwer/core/process/reconstruction/nabu/nabucommon.py +71 -78
- tomwer/core/process/reconstruction/nabu/nabuscores.py +425 -53
- tomwer/core/process/reconstruction/nabu/nabuslices.py +114 -93
- tomwer/core/process/reconstruction/nabu/nabuvolume.py +54 -27
- tomwer/core/process/reconstruction/nabu/plane.py +9 -0
- tomwer/core/process/reconstruction/nabu/settings.py +2 -2
- tomwer/core/process/reconstruction/nabu/utils.py +164 -26
- tomwer/core/process/reconstruction/output.py +108 -0
- tomwer/core/process/reconstruction/saaxis/saaxis.py +238 -264
- tomwer/core/process/reconstruction/sadeltabeta/sadeltabeta.py +151 -87
- tomwer/core/process/reconstruction/scores/params.py +7 -4
- tomwer/core/process/reconstruction/scores/scores.py +13 -0
- tomwer/core/process/reconstruction/test/test_axis_params.py +2 -2
- tomwer/core/process/reconstruction/test/test_darkref.py +3 -3
- tomwer/core/process/reconstruction/test/test_darkref_copy.py +7 -7
- tomwer/core/process/reconstruction/test/test_saaxis.py +3 -4
- tomwer/core/process/reconstruction/test/test_sadeltabeta.py +2 -2
- tomwer/core/process/stitching/nabustitcher.py +13 -12
- tomwer/core/process/task.py +34 -26
- tomwer/core/process/test/test_axis.py +13 -12
- tomwer/core/process/test/test_dark_and_flat.py +10 -7
- tomwer/core/process/test/test_data_transfer.py +10 -8
- tomwer/core/process/test/test_nabu.py +14 -6
- tomwer/core/process/test/test_normalization.py +4 -4
- tomwer/core/scan/blissscan.py +3 -3
- tomwer/core/scan/edfscan.py +13 -10
- tomwer/core/scan/hdf5scan.py +19 -530
- tomwer/core/scan/nxtomoscan.py +534 -0
- tomwer/core/scan/scanbase.py +72 -44
- tomwer/core/scan/scanfactory.py +13 -13
- tomwer/core/scan/test/test_edf.py +2 -2
- tomwer/core/scan/test/test_future_scan.py +3 -3
- tomwer/core/scan/test/test_h5.py +18 -16
- tomwer/core/scan/test/test_process_registration.py +4 -40
- tomwer/core/scan/test/test_scan.py +5 -78
- tomwer/core/settings.py +22 -2
- tomwer/core/test/test_scanutils.py +8 -7
- tomwer/core/test/test_utils.py +35 -28
- tomwer/core/tomwer_object.py +1 -1
- tomwer/core/utils/__init__.py +0 -466
- tomwer/core/utils/deprecation.py +1 -1
- tomwer/core/utils/dictutils.py +14 -0
- tomwer/core/utils/lbsram.py +35 -0
- tomwer/core/utils/nxtomoutils.py +1 -1
- tomwer/core/utils/scanutils.py +6 -6
- tomwer/core/utils/spec.py +263 -0
- tomwer/core/volume/edfvolume.py +6 -6
- tomwer/core/volume/hdf5volume.py +6 -6
- tomwer/core/volume/jp2kvolume.py +6 -6
- tomwer/core/volume/rawvolume.py +6 -6
- tomwer/core/volume/tiffvolume.py +12 -12
- tomwer/core/volume/volumefactory.py +2 -2
- tomwer/gui/cluster/slurm.py +274 -65
- tomwer/gui/cluster/supervisor.py +12 -0
- tomwer/gui/cluster/test/test_cluster.py +14 -2
- tomwer/gui/cluster/test/test_supervisor.py +3 -3
- tomwer/gui/configuration/__init__.py +0 -0
- tomwer/gui/{reconstruction/nabu → configuration}/action.py +1 -32
- tomwer/gui/configuration/level.py +22 -0
- tomwer/gui/control/actions.py +54 -0
- tomwer/gui/control/datalist.py +83 -16
- tomwer/gui/control/datalistener.py +4 -16
- tomwer/gui/control/datawatcher/controlwidget.py +2 -4
- tomwer/gui/control/datawatcher/datawatcher.py +1 -24
- tomwer/gui/control/{email.py → emailnotifier.py} +9 -18
- tomwer/gui/control/history.py +2 -2
- tomwer/gui/control/observations.py +2 -2
- tomwer/gui/control/reducedarkflatselector.py +9 -9
- tomwer/gui/control/selectorwidgetbase.py +36 -9
- tomwer/gui/control/serie/seriecreator.py +5 -22
- tomwer/gui/control/test/test_email.py +1 -1
- tomwer/gui/control/test/test_scanvalidator.py +6 -5
- tomwer/gui/control/test/test_single_tomo_obj.py +3 -3
- tomwer/gui/control/tomoobjdisplaymode.py +8 -0
- tomwer/gui/debugtools/datasetgenerator.py +3 -3
- tomwer/gui/edit/dkrfpatch.py +20 -26
- tomwer/gui/edit/imagekeyeditor.py +11 -12
- tomwer/gui/edit/nxtomoeditor.py +111 -44
- tomwer/gui/edit/nxtomowarmer.py +7 -6
- tomwer/gui/edit/test/test_dkrf_patch.py +13 -13
- tomwer/gui/edit/test/test_image_key_editor.py +3 -3
- tomwer/gui/edit/test/test_nx_editor.py +40 -16
- tomwer/gui/icat/__init__.py +0 -0
- tomwer/gui/icat/createscreenshots.py +80 -0
- tomwer/gui/icat/gallery.py +214 -0
- tomwer/gui/icat/publish.py +187 -0
- tomwer/gui/imagefromfile.py +2 -2
- tomwer/gui/qfolderdialog.py +24 -1
- tomwer/gui/reconstruction/axis/CompareImages.py +88 -168
- tomwer/gui/reconstruction/axis/axis.py +171 -57
- tomwer/gui/reconstruction/axis/radioaxis.py +122 -257
- tomwer/gui/reconstruction/darkref/darkrefcopywidget.py +3 -2
- tomwer/gui/reconstruction/darkref/darkrefwidget.py +2 -1
- tomwer/gui/reconstruction/nabu/castvolume.py +14 -3
- tomwer/gui/reconstruction/nabu/check.py +9 -9
- tomwer/gui/reconstruction/nabu/helical.py +29 -12
- tomwer/gui/reconstruction/nabu/nabuconfig/base.py +2 -4
- tomwer/gui/reconstruction/nabu/nabuconfig/nabuconfig.py +2 -1
- tomwer/gui/reconstruction/nabu/nabuconfig/output.py +126 -35
- tomwer/gui/reconstruction/nabu/nabuconfig/phase.py +39 -32
- tomwer/gui/reconstruction/nabu/nabuconfig/preprocessing.py +222 -31
- tomwer/gui/reconstruction/nabu/nabuconfig/reconstruction.py +57 -27
- tomwer/gui/reconstruction/nabu/nabuflow.py +12 -20
- tomwer/gui/reconstruction/nabu/slices.py +10 -11
- tomwer/gui/reconstruction/nabu/volume.py +22 -10
- tomwer/gui/reconstruction/normalization/intensity.py +18 -48
- tomwer/gui/reconstruction/saaxis/corrangeselector.py +8 -24
- tomwer/gui/reconstruction/saaxis/dimensionwidget.py +1 -1
- tomwer/gui/reconstruction/saaxis/saaxis.py +9 -21
- tomwer/gui/reconstruction/sadeltabeta/saadeltabeta.py +45 -12
- tomwer/gui/reconstruction/scores/control.py +2 -9
- tomwer/gui/reconstruction/scores/scoreplot.py +13 -11
- tomwer/gui/reconstruction/test/test_axis.py +41 -16
- tomwer/gui/reconstruction/test/test_nabu.py +31 -9
- tomwer/gui/reconstruction/test/test_saaxis.py +3 -3
- tomwer/gui/reconstruction/test/test_sadeltabeta.py +12 -2
- tomwer/gui/settings.py +5 -28
- tomwer/gui/stackplot.py +2 -5
- tomwer/gui/stitching/action.py +49 -0
- tomwer/gui/stitching/config/axisparams.py +7 -24
- tomwer/gui/stitching/config/output.py +10 -8
- tomwer/gui/stitching/config/positionoveraxis.py +22 -23
- tomwer/gui/stitching/normalization.py +117 -0
- tomwer/gui/stitching/stitchandbackground.py +4 -6
- tomwer/gui/stitching/stitching.py +267 -45
- tomwer/gui/stitching/stitching_preview.py +62 -55
- tomwer/gui/stitching/stitching_raw.py +13 -12
- tomwer/gui/stitching/z_stitching/fineestimation.py +0 -60
- tomwer/gui/utils/buttons.py +112 -29
- tomwer/gui/utils/inputwidget.py +43 -25
- tomwer/gui/utils/lineselector/lineselector.py +1 -1
- tomwer/gui/utils/scandescription.py +4 -0
- tomwer/gui/utils/step.py +144 -0
- tomwer/gui/utils/unitsystem.py +2 -5
- tomwer/gui/utils/vignettes.py +176 -15
- tomwer/gui/visualization/dataviewer.py +48 -35
- tomwer/gui/visualization/diffviewer/diffviewer.py +7 -16
- tomwer/gui/visualization/diffviewer/shiftwidget.py +2 -5
- tomwer/gui/visualization/scanoverview.py +1 -1
- tomwer/gui/visualization/sinogramviewer.py +20 -36
- tomwer/gui/visualization/test/test_diffviewer.py +3 -3
- tomwer/gui/visualization/test/test_nx_tomo_metadata_viewer.py +4 -4
- tomwer/gui/visualization/test/test_sinogramviewer.py +2 -2
- tomwer/gui/visualization/test/test_stacks.py +3 -3
- tomwer/gui/visualization/test/test_volumeviewer.py +65 -67
- tomwer/gui/visualization/volumeviewer.py +114 -113
- tomwer/io/utils/h5pyutils.py +3 -3
- tomwer/io/utils/raw_and_processed_data.py +84 -0
- tomwer/io/utils/tomoobj.py +4 -6
- tomwer/io/utils/utils.py +7 -7
- tomwer/resources/gui/icons/parameters.svg +1 -1
- tomwer/resources/gui/icons/ruler.png +0 -0
- tomwer/resources/gui/icons/ruler.svg +273 -0
- tomwer/resources/gui/icons/short_description.png +0 -0
- tomwer/resources/gui/icons/short_description.svg +58 -0
- tomwer/resources/gui/icons/url.png +0 -0
- tomwer/resources/gui/icons/url.svg +58 -0
- tomwer/resources/gui/illustrations/no_rot.svg +1 -1
- tomwer/synctools/stacks/edit/darkflatpatch.py +19 -14
- tomwer/synctools/stacks/edit/imagekeyeditor.py +2 -2
- tomwer/synctools/stacks/reconstruction/axis.py +4 -4
- tomwer/synctools/stacks/reconstruction/castvolume.py +22 -7
- tomwer/synctools/stacks/reconstruction/dkrefcopy.py +25 -20
- tomwer/synctools/stacks/reconstruction/nabu.py +2 -2
- tomwer/synctools/stacks/reconstruction/normalization.py +2 -2
- tomwer/synctools/stacks/reconstruction/saaxis.py +2 -2
- tomwer/synctools/stacks/reconstruction/sadeltabeta.py +2 -2
- tomwer/synctools/test/test_darkRefs.py +7 -58
- tomwer/synctools/test/test_foldertransfer.py +6 -6
- tomwer/synctools/utils/scanstages.py +6 -6
- tomwer/tests/conftest.py +34 -0
- tomwer/tests/datasets.py +13 -0
- tomwer/tests/test_scripts.py +91 -41
- tomwer/tests/utils.py +5 -0
- tomwer/third_part/WaitingOverlay.py +110 -0
- tomwer/third_part/__init__.py +0 -0
- tomwer/version.py +2 -2
- tomwer-1.3.12-py3.11-nspkg.pth +1 -0
- {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/METADATA +73 -58
- {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/RECORD +287 -286
- {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/WHEEL +1 -1
- orangecontrib/tomwer/widgets/reconstruction/TofuOW.py +0 -197
- orangecontrib/tomwer/widgets/reconstruction/icons/XY_lamino.svg +0 -168
- orangecontrib/tomwer/widgets/reconstruction/icons/XZ_lamino.svg +0 -275
- orangecontrib/tomwer/widgets/reconstruction/icons/YZ_lamino.svg +0 -182
- tomwer/app/lamino.py +0 -143
- tomwer/core/process/reconstruction/lamino/__init__.py +0 -1
- tomwer/core/process/reconstruction/lamino/tofu.py +0 -1000
- tomwer/core/process/test/test_lamino.py +0 -76
- tomwer/core/test/test_lamino.py +0 -92
- tomwer/gui/reconstruction/lamino/__init__.py +0 -31
- tomwer/gui/reconstruction/lamino/tofu/TofuOptionLoader.py +0 -107
- tomwer/gui/reconstruction/lamino/tofu/__init__.py +0 -1
- tomwer/gui/reconstruction/lamino/tofu/misc.py +0 -148
- tomwer/gui/reconstruction/lamino/tofu/projections.py +0 -896
- tomwer/gui/reconstruction/lamino/tofu/settings.py +0 -75
- tomwer/gui/reconstruction/lamino/tofu/tofu.py +0 -432
- tomwer/gui/reconstruction/lamino/tofu/tofuexpert.py +0 -567
- tomwer/gui/reconstruction/lamino/tofu/tofuoutput.py +0 -760
- tomwer/gui/reconstruction/test/test_lamino.py +0 -189
- tomwer/resources/gui/icons/esrf_1.svg +0 -307
- tomwer/resources/gui/icons/lamino_parameters.svg +0 -70
- tomwer/resources/gui/icons/triangle.svg +0 -80
- tomwer/resources/gui/illustrations/lamino_angle.png +0 -0
- tomwer/resources/gui/illustrations/lamino_angle.svg +0 -509
- tomwer/resources/gui/illustrations/lamino_beta_angle.png +0 -0
- tomwer/resources/gui/illustrations/lamino_beta_angle.svg +0 -97
- tomwer/resources/gui/illustrations/lamino_theta_angle.png +0 -0
- tomwer/resources/gui/illustrations/lamino_theta_angle.svg +0 -368
- tomwer/resources/gui/illustrations/manual_slice.png +0 -0
- tomwer/resources/gui/illustrations/manual_slice.svg +0 -221
- tomwer/resources/gui/illustrations/psi_angle.png +0 -0
- tomwer/resources/gui/illustrations/psi_angle.svg +0 -479
- tomwer/resources/gui/illustrations/rotation_center.png +0 -0
- tomwer/resources/gui/illustrations/rotation_center.svg +0 -276
- tomwer/resources/gui/illustrations/slice_stack.png +0 -0
- tomwer/resources/gui/illustrations/slice_stack.svg +0 -266
- tomwer/resources/gui/illustrations/xy_slice.png +0 -0
- tomwer/resources/gui/illustrations/xy_slice.svg +0 -269
- tomwer/resources/gui/illustrations/xz_slice.png +0 -0
- tomwer/resources/gui/illustrations/xz_slice.svg +0 -270
- tomwer/resources/gui/illustrations/yz_slice.png +0 -0
- tomwer/resources/gui/illustrations/yz_slice.svg +0 -270
- tomwer/synctools/stacks/reconstruction/lamino.py +0 -233
- tomwer/synctools/test/test_scanstages.py +0 -162
- tomwer/tests/utils/__init__.py +0 -247
- tomwer/tests/utils/utilstest.py +0 -220
- tomwer-1.2.1-py3.11-nspkg.pth +0 -1
- /tomwer/core/process/control/{email.py → emailnotifier.py} +0 -0
- {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/LICENSE +0 -0
- {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/entry_points.txt +0 -0
- {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/namespace_packages.txt +0 -0
- {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,58 @@
|
|
1
|
+
<?xml version='1.0' encoding='utf-8'?>
|
2
|
+
<scheme version="2.0" title="Reconstruction of a volume and publication to icat" description="">
|
3
|
+
<nodes>
|
4
|
+
<node id="0" name="scan selector" qualified_name="orangecontrib.tomwer.widgets.control.DataSelectorOW.DataSelectorOW" project_name="tomwer" version="" title="scan selector" position="(150, 150)" />
|
5
|
+
<node id="1" name="reduced darks and flats" qualified_name="orangecontrib.tomwer.widgets.reconstruction.DarkRefAndCopyOW.DarkRefAndCopyOW" project_name="tomwer" version="" title="reduced darks and flats" position="(324.0, 183.0)" />
|
6
|
+
<node id="2" name="default center of rotation" qualified_name="orangecontrib.tomwer.widgets.reconstruction.AxisOW.AxisOW" project_name="tomwer" version="" title="default center of rotation" position="(490.0, 218.0)" />
|
7
|
+
<node id="3" name="nabu slice reconstruction" qualified_name="orangecontrib.tomwer.widgets.reconstruction.NabuOW.NabuOW" project_name="tomwer" version="" title="nabu slice reconstruction" position="(649.0, 261.0)" />
|
8
|
+
<node id="4" name="data viewer" qualified_name="orangecontrib.tomwer.widgets.visualization.DataViewerOW.DataViewerOW" project_name="tomwer" version="" title="data viewer" position="(818.0, 248.0)" />
|
9
|
+
<node id="5" name="nabu volume reconstruction" qualified_name="orangecontrib.tomwer.widgets.reconstruction.NabuVolumeOW.NabuVolumeOW" project_name="tomwer" version="" title="nabu volume reconstruction" position="(812.0, 391.0)" />
|
10
|
+
<node id="6" name="volume viewer" qualified_name="orangecontrib.tomwer.widgets.visualization.VolumeViewerOW.VolumeViewerOW" project_name="tomwer" version="" title="volume viewer" position="(986.75, 383.25)" />
|
11
|
+
<node id="7" name="create raw data screenshots" qualified_name="orangecontrib.tomwer.widgets.icat.RawDataScreenshotCreatorOW.RawDataScreenshotCreatorOW" project_name="tomwer" version="" title="create raw data screenshots" position="(321.0, 509.0)" />
|
12
|
+
<node id="8" name="save to gallery and publish" qualified_name="orangecontrib.tomwer.widgets.icat.SaveToGalleryAndPublishOW.SaveToGalleryAndPublishOW" project_name="tomwer" version="" title="save to gallery and publish" position="(506.0, 510.0)" />
|
13
|
+
<node id="9" name="save to gallery and publish" qualified_name="orangecontrib.tomwer.widgets.icat.SaveToGalleryAndPublishOW.SaveToGalleryAndPublishOW" project_name="tomwer" version="" title="save to gallery and publish (1)" position="(731.0, 514.0)" />
|
14
|
+
<node id="10" name="Publish processed data to icat" qualified_name="orangecontrib.tomwer.widgets.icat.PublishProcessedDataOW.PublishProcessedDataOW" project_name="tomwer" version="" title="Publish processed data to icat" position="(990.0, 514.0)" />
|
15
|
+
</nodes>
|
16
|
+
<links>
|
17
|
+
<link id="0" source_node_id="0" sink_node_id="1" source_channel="data" sink_channel="data" enabled="true" source_channel_id="data" sink_channel_id="data" />
|
18
|
+
<link id="1" source_node_id="1" sink_node_id="2" source_channel="data" sink_channel="data" enabled="true" source_channel_id="data" sink_channel_id="data" />
|
19
|
+
<link id="2" source_node_id="2" sink_node_id="3" source_channel="data" sink_channel="data" enabled="true" source_channel_id="data" sink_channel_id="data" />
|
20
|
+
<link id="3" source_node_id="3" sink_node_id="4" source_channel="data" sink_channel="data" enabled="true" source_channel_id="data" sink_channel_id="data" />
|
21
|
+
<link id="4" source_node_id="3" sink_node_id="5" source_channel="data" sink_channel="data" enabled="true" source_channel_id="data" sink_channel_id="data" />
|
22
|
+
<link id="5" source_node_id="5" sink_node_id="6" source_channel="data" sink_channel="data" enabled="true" source_channel_id="data" sink_channel_id="data" />
|
23
|
+
<link id="6" source_node_id="0" sink_node_id="7" source_channel="data" sink_channel="data" enabled="true" source_channel_id="data" sink_channel_id="data" />
|
24
|
+
<link id="7" source_node_id="7" sink_node_id="8" source_channel="screenshots" sink_channel="screenshots" enabled="true" source_channel_id="screenshots" sink_channel_id="screenshots" />
|
25
|
+
<link id="8" source_node_id="3" sink_node_id="9" source_channel="screenshots" sink_channel="screenshots" enabled="true" source_channel_id="screenshots" sink_channel_id="screenshots" />
|
26
|
+
<link id="9" source_node_id="5" sink_node_id="10" source_channel="data" sink_channel="data" enabled="true" source_channel_id="data" sink_channel_id="data" />
|
27
|
+
</links>
|
28
|
+
<annotations>
|
29
|
+
<arrow id="0" start="(267.0, 56.0)" end="(194.0, 105.0)" fill="#C1272D" />
|
30
|
+
<text id="1" type="text/plain" rect="(276.25, 17.75, 150.0, 31.0)" font-family="Ubuntu" font-size="16">provide dataset</text>
|
31
|
+
<text id="2" type="text/plain" rect="(146.0, 597.0, 168.0, 89.0)" font-family="Cantarell" font-size="16">create screenshot for raw projection, raw falt and raw dark</text>
|
32
|
+
<text id="3" type="text/plain" rect="(413.0, 612.0, 215.0, 62.0)" font-family="Cantarell" font-size="16">save screenshot to the gallry and publish to icat</text>
|
33
|
+
<arrow id="4" start="(630.0, 605.0)" end="(674.0, 573.0)" fill="#C1272D" />
|
34
|
+
<arrow id="5" start="(475.99999999999994, 612.0)" end="(477.99999999999994, 568.0)" fill="#C1272D" />
|
35
|
+
<arrow id="6" start="(607.0, 387.0)" end="(671.0, 395.0)" fill="#C1272D" />
|
36
|
+
<text id="7" type="text/plain" rect="(449.0, 350.0, 150.0, 51.0)" font-family="Cantarell" font-size="16">screenshot of the reconstructed slice</text>
|
37
|
+
<arrow id="8" start="(235.0, 592.0)" end="(281.0, 521.0)" fill="#C1272D" />
|
38
|
+
<text id="9" type="text/plain" rect="(901.0, 618.0, 179.0, 70.0)" font-family="Cantarell" font-size="16">publish reconstructed volume to icat</text>
|
39
|
+
<arrow id="10" start="(980.0, 621.0)" end="(981.0, 579.0)" fill="#C1272D" />
|
40
|
+
</annotations>
|
41
|
+
<thumbnail />
|
42
|
+
<node_properties>
|
43
|
+
<properties node_id="0" format="literal">{'_scanIDs': [], 'controlAreaVisible': True, 'savedWidgetGeometry': None, '__version__': 1}</properties>
|
44
|
+
<properties node_id="1" format="literal">{'_ewoks_default_inputs': {'data': None, 'dark_ref_params': None}, 'controlAreaVisible': True, 'savedWidgetGeometry': None, '__version__': 1}</properties>
|
45
|
+
<properties node_id="2" format="literal">{'_ewoks_default_inputs': {'data': None, 'axis_params': {'MODE': 'manual', 'POSITION_VALUE': None, 'CALC_INPUT_TYPE': 'transmission_nopag', 'ANGLE_MODE': '0-180', 'USE_SINOGRAM': False, 'SINOGRAM_LINE': '', 'SINOGRAM_SUBSAMPLING': 10, 'AXIS_URL_1': '', 'AXIS_URL_2': '', 'LOOK_AT_STDMAX': False, 'NEAR_WX': 5, 'FINE_STEP_X': 0.1, 'SCALE_IMG2_TO_IMG1': False, 'NEAR_POSITION': 0.0, 'PADDING_MODE': 'edge', 'FLIP_LR': True, 'COMPOSITE_OPTS': {'theta': 10, 'n_subsampling_y': 10, 'oversampling': 4, 'take_log': True, 'near_pos': 0, 'near_width': 20}, 'SIDE': 'all', 'COR_OPTIONS': ''}, 'gui': {'mode_is_lock': False, 'value_is_lock': False, 'auto_update_estimated_cor': True}}, 'controlAreaVisible': True, 'savedWidgetGeometry': None, '__version__': 1}</properties>
|
46
|
+
<properties node_id="3" format="literal">{'_ewoks_default_inputs': {'data': None, 'nabu_params': None}, 'controlAreaVisible': True, 'savedWidgetGeometry': None, '__version__': 1}</properties>
|
47
|
+
<properties node_id="4" format="literal">{'_viewer_config': {}, 'controlAreaVisible': True, 'savedWidgetGeometry': None, '__version__': 1}</properties>
|
48
|
+
<properties node_id="5" format="literal">{'_ewoks_default_inputs': {'data': None, 'nabu_volume_params': None, 'nabu_params': None}, 'controlAreaVisible': True, 'savedWidgetGeometry': None, '__version__': 1}</properties>
|
49
|
+
<properties node_id="6" format="literal">{'controlAreaVisible': True, 'savedWidgetGeometry': None, '__version__': 1}</properties>
|
50
|
+
<properties node_id="7" format="literal">{'_ewoks_default_inputs': {}, '_ewoks_execinfo': {}, '_ewoks_varinfo': {}, 'controlAreaVisible': True, 'default_inputs': {}, 'savedWidgetGeometry': None, '__version__': 1}</properties>
|
51
|
+
<properties node_id="8" format="literal">{'_ewoks_default_inputs': {}, '_ewoks_execinfo': {}, '_ewoks_varinfo': {}, 'controlAreaVisible': True, 'default_inputs': {}, 'savedWidgetGeometry': None, '__version__': 1}</properties>
|
52
|
+
<properties node_id="9" format="literal">{'_ewoks_default_inputs': {}, '_ewoks_execinfo': {}, '_ewoks_varinfo': {}, 'controlAreaVisible': True, 'default_inputs': {}, 'savedWidgetGeometry': None, '__version__': 1}</properties>
|
53
|
+
<properties node_id="10" format="literal">{'_ewoks_default_inputs': {}, '_ewoks_execinfo': {}, '_ewoks_varinfo': {}, 'controlAreaVisible': True, 'default_inputs': {}, 'savedWidgetGeometry': None, '__version__': 1}</properties>
|
54
|
+
</node_properties>
|
55
|
+
<session_state>
|
56
|
+
<window_groups />
|
57
|
+
</session_state>
|
58
|
+
</scheme>
|
@@ -22,9 +22,10 @@
|
|
22
22
|
#
|
23
23
|
#############################################################################
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
|
25
|
+
try:
|
26
|
+
from orangecanvas.utils.pkgmeta import get_distribution
|
27
|
+
except ImportError:
|
28
|
+
from pkg_resources import get_distribution
|
28
29
|
|
29
30
|
ICON = "../widgets/icons/tomwer.png"
|
30
31
|
|
@@ -33,12 +34,13 @@ BACKGROUND = "#C0CCFF"
|
|
33
34
|
|
34
35
|
# Entry point for main Orange categories/widgets discovery
|
35
36
|
def widget_discovery(discovery):
|
36
|
-
dist =
|
37
|
+
dist = get_distribution("tomwer")
|
37
38
|
pkgs = [
|
38
39
|
"orangecontrib.tomwer.widgets.cluster",
|
39
40
|
"orangecontrib.tomwer.widgets.control",
|
40
41
|
"orangecontrib.tomwer.widgets.debugtools",
|
41
42
|
"orangecontrib.tomwer.widgets.edit",
|
43
|
+
# "orangecontrib.tomwer.widgets.icat",
|
42
44
|
"orangecontrib.tomwer.widgets.reconstruction",
|
43
45
|
# "orangecontrib.tomwer.widgets.stitching",
|
44
46
|
"orangecontrib.tomwer.widgets.visualization",
|
@@ -53,11 +55,9 @@ WIDGET_HELP_PATH = (
|
|
53
55
|
# You still need to build help pages using
|
54
56
|
# make htmlhelp
|
55
57
|
# inside doc folder
|
56
|
-
(
|
57
|
-
#
|
58
|
-
#
|
59
|
-
#
|
60
|
-
|
61
|
-
(f"{sysconfig.get_path('data')}/help/tomwer/index.html", None),
|
62
|
-
("http://www.silx.org/pub/doc/tomwer/htmlhelp/0.9/", None),
|
58
|
+
# (
|
59
|
+
# "/home/payno/Documents/dev/tomography/tomwer/build/html/canvas/widgets/widgets.html",
|
60
|
+
# None,
|
61
|
+
# ),
|
62
|
+
("https://tomwer.readthedocs.io/en/latest/canvas/widgets/widgets.html", None),
|
63
63
|
)
|
@@ -13,7 +13,7 @@ import tomwer.core.process.control.datadiscovery
|
|
13
13
|
from orangecontrib.tomwer.widgets.utils import WidgetLongProcessing
|
14
14
|
from tomwer.core.scan.blissscan import BlissScan
|
15
15
|
from tomwer.core.scan.edfscan import EDFTomoScan
|
16
|
-
from tomwer.core.scan.
|
16
|
+
from tomwer.core.scan.nxtomoscan import NXtomoScan
|
17
17
|
from tomwer.core.scan.scanbase import TomwerScanBase
|
18
18
|
from tomwer.core.scan.scanfactory import ScanFactory
|
19
19
|
from tomwer.core.scan.scantype import ScanType
|
@@ -217,7 +217,7 @@ class _DiscoverThread(qt.QThread):
|
|
217
217
|
):
|
218
218
|
self.sigDataFound.emit(scan)
|
219
219
|
elif (
|
220
|
-
isinstance(scan,
|
220
|
+
isinstance(scan, NXtomoScan)
|
221
221
|
and self._research_type is ScanType.NX_TOMO
|
222
222
|
):
|
223
223
|
self.sigDataFound.emit(scan)
|
@@ -35,9 +35,9 @@ from orangewidget.widget import Input, Output, OWBaseWidget
|
|
35
35
|
from silx.gui import qt
|
36
36
|
|
37
37
|
import tomwer.core.process.control.scanlist
|
38
|
-
from tomwer.core.scan.
|
38
|
+
from tomwer.core.scan.nxtomoscan import NXtomoScan
|
39
39
|
from tomwer.core.scan.scanbase import TomwerScanBase
|
40
|
-
from tomwer.gui.control.datalist import
|
40
|
+
from tomwer.gui.control.datalist import GenericScanListWindow
|
41
41
|
|
42
42
|
logger = logging.getLogger(__name__)
|
43
43
|
|
@@ -73,19 +73,21 @@ class DataListOW(OWBaseWidget, openclass=True):
|
|
73
73
|
:param parent: the parent widget
|
74
74
|
"""
|
75
75
|
super().__init__(parent)
|
76
|
-
|
76
|
+
|
77
|
+
self.widget = GenericScanListWindow(parent=self)
|
78
|
+
self.widget.setWindowFlags(qt.Qt.Widget)
|
77
79
|
self.widget.sigUpdated.connect(self._updateSettings)
|
78
80
|
self._loadSettings()
|
79
81
|
layout = gui.vBox(self.mainArea, self.name).layout()
|
80
82
|
layout.addWidget(self.widget)
|
81
|
-
self.widget._sendButton.clicked.connect(self._sendList)
|
83
|
+
self.widget._widget._sendButton.clicked.connect(self._sendList)
|
82
84
|
|
83
85
|
# expose API
|
84
86
|
self.n_scan = self.widget.n_scan
|
85
87
|
|
86
88
|
# alias used for the 'simple workflow' for now
|
87
89
|
self.start = self._sendList
|
88
|
-
self.clear = self.widget.clear
|
90
|
+
self.clear = self.widget._widget.clear
|
89
91
|
|
90
92
|
def _sendList(self):
|
91
93
|
"""Send a signal for each list to the next widget"""
|
@@ -107,8 +109,8 @@ class DataListOW(OWBaseWidget, openclass=True):
|
|
107
109
|
# kept for backward compatibility since 0.11. To be removed on the future version.
|
108
110
|
if "@" in scan:
|
109
111
|
entry, file_path = scan.split("@")
|
110
|
-
|
111
|
-
self.add(
|
112
|
+
nxtomo_scan = NXtomoScan(entry=entry, scan=file_path)
|
113
|
+
self.add(nxtomo_scan)
|
112
114
|
else:
|
113
115
|
self.add(scan)
|
114
116
|
|
@@ -258,12 +258,12 @@ class DataListenerOW(
|
|
258
258
|
|
259
259
|
def _jsonRPCConfigChanged(self):
|
260
260
|
self._blissConfiguration = self._widget.getBlissServerConfiguration()
|
261
|
-
self._static_input[ # pylint: disable=E1137
|
262
|
-
|
263
|
-
|
264
|
-
self._static_input[ # pylint: disable=E1137
|
265
|
-
|
266
|
-
|
261
|
+
self._static_input["bliss_server_configuration"] = ( # pylint: disable=E1137
|
262
|
+
self._widget.getBlissServerConfiguration()
|
263
|
+
)
|
264
|
+
self._static_input["output_dir"] = ( # pylint: disable=E1137
|
265
|
+
self._widget.getOutputFolder()
|
266
|
+
)
|
267
267
|
if self.is_active():
|
268
268
|
self.activate(False)
|
269
269
|
self.activate(True)
|
@@ -35,7 +35,7 @@ from orangewidget.widget import Input, Output, OWBaseWidget
|
|
35
35
|
from silx.gui import qt
|
36
36
|
|
37
37
|
import tomwer.core.process.control.scanselector
|
38
|
-
from tomwer.core.scan.
|
38
|
+
from tomwer.core.scan.nxtomoscan import NXtomoScan
|
39
39
|
from tomwer.core.scan.scanbase import TomwerScanBase
|
40
40
|
from tomwer.gui.control.scanselectorwidget import ScanSelectorWidget
|
41
41
|
|
@@ -72,22 +72,21 @@ class DataSelectorOW(OWBaseWidget, openclass=True):
|
|
72
72
|
super().__init__(parent)
|
73
73
|
|
74
74
|
self.widget = ScanSelectorWidget(parent=self)
|
75
|
+
self.widget.setWindowFlags(qt.Qt.Widget)
|
75
76
|
self._loadSettings()
|
76
77
|
|
77
78
|
self.widget.sigUpdated.connect(self._updateSettings)
|
78
79
|
self.widget.sigSelectionChanged.connect(self.changeSelection)
|
79
80
|
layout = gui.vBox(self.mainArea, self.name).layout()
|
80
81
|
layout.addWidget(self.widget)
|
81
|
-
# expose API
|
82
|
-
self.setActiveScan = self.widget.setActiveData
|
83
|
-
self.selectAll = self.widget.selectAll
|
84
|
-
self.n_scan = self.widget.n_scan
|
85
|
-
self.add = self.widget.add
|
86
82
|
|
87
83
|
@Inputs.data
|
88
84
|
def addScan(self, scan, *args, **kwargs):
|
85
|
+
self.add(scan)
|
86
|
+
|
87
|
+
def add(self, scan):
|
89
88
|
if scan is not None:
|
90
|
-
self.widget.add(scan)
|
89
|
+
self.widget.add(scan=scan)
|
91
90
|
|
92
91
|
def changeSelection(self, list_objs):
|
93
92
|
if list_objs is None:
|
@@ -105,7 +104,9 @@ class DataSelectorOW(OWBaseWidget, openclass=True):
|
|
105
104
|
"""send output signals for each selected items"""
|
106
105
|
sItem = self.widget.dataList.selectedItems()
|
107
106
|
if sItem and len(sItem) >= 1:
|
108
|
-
selection = [
|
107
|
+
selection = [
|
108
|
+
_item.data(qt.Qt.UserRole).get_identifier().to_str() for _item in sItem
|
109
|
+
]
|
109
110
|
self.changeSelection(list_objs=selection)
|
110
111
|
|
111
112
|
def _loadSettings(self):
|
@@ -114,8 +115,8 @@ class DataSelectorOW(OWBaseWidget, openclass=True):
|
|
114
115
|
# kept for backward compatibility since 0.11. To be removed on the future version.
|
115
116
|
if "@" in scan:
|
116
117
|
entry, file_path = scan.split("@")
|
117
|
-
|
118
|
-
self.addScan(
|
118
|
+
nxtomo_scan = NXtomoScan(entry=entry, scan=file_path)
|
119
|
+
self.addScan(nxtomo_scan)
|
119
120
|
else:
|
120
121
|
self.addScan(scan)
|
121
122
|
|
@@ -132,3 +133,13 @@ class DataSelectorOW(OWBaseWidget, openclass=True):
|
|
132
133
|
self.widget.removeSelectedDatasets()
|
133
134
|
else:
|
134
135
|
super().keyPressEvent(event)
|
136
|
+
|
137
|
+
# expose API
|
138
|
+
def setActiveScan(self, data):
|
139
|
+
self.widget.setActiveData(data=data)
|
140
|
+
|
141
|
+
def selectAll(self):
|
142
|
+
return self.widget.selectAll()
|
143
|
+
|
144
|
+
def n_scan(self):
|
145
|
+
return self.widget.n_scan()
|
@@ -166,12 +166,12 @@ class DataValidatorOW(SuperviseOW):
|
|
166
166
|
def _updateSettings(self):
|
167
167
|
viewer = self._widget._centralWidget
|
168
168
|
self._viewer_config["mode"] = viewer.getDisplayMode() # pylint: disable=E1137
|
169
|
-
self._viewer_config[ # pylint: disable=E1137
|
170
|
-
|
171
|
-
|
172
|
-
self._viewer_config[ # pylint: disable=E1137
|
173
|
-
|
174
|
-
|
169
|
+
self._viewer_config["slice_opt"] = ( # pylint: disable=E1137
|
170
|
+
viewer.getSliceOption()
|
171
|
+
)
|
172
|
+
self._viewer_config["radio_opt"] = ( # pylint: disable=E1137
|
173
|
+
viewer.getRadioOption()
|
174
|
+
)
|
175
175
|
|
176
176
|
def _setSettings(self, settings):
|
177
177
|
viewer = self._widget._centralWidget
|
@@ -38,7 +38,7 @@ from orangecontrib.tomwer.orange.managedprocess import TomwerWithStackStack
|
|
38
38
|
from orangecontrib.tomwer.widgets.control.NXTomomillMixIn import NXTomomillMixIn
|
39
39
|
from tomwer.core.process.control.nxtomomill import EDFToNxProcess
|
40
40
|
from tomwer.core.scan.edfscan import EDFTomoScan
|
41
|
-
from tomwer.core.scan.
|
41
|
+
from tomwer.core.scan.nxtomoscan import NXtomoScan
|
42
42
|
from tomwer.gui.control.datalist import EDFDataListMainWindow
|
43
43
|
|
44
44
|
logger = logging.getLogger(__name__)
|
@@ -54,7 +54,7 @@ class EDF2NXOW(
|
|
54
54
|
to HDF5scan.
|
55
55
|
"""
|
56
56
|
|
57
|
-
name = "edf2nx-
|
57
|
+
name = "nxtomomill - edf2nx (Spec-EDF)"
|
58
58
|
id = "orange.widgets.tomwer.control.NXTomomillOW.EDF2NXOW"
|
59
59
|
description = "Convert folders with .edf to .nx"
|
60
60
|
icon = "icons/edf2nx.svg"
|
@@ -79,6 +79,12 @@ class EDF2NXOW(
|
|
79
79
|
|
80
80
|
LOGGER = logger
|
81
81
|
|
82
|
+
_ewoks_inputs_to_hide_from_orange = (
|
83
|
+
"edf_to_nx_configuration",
|
84
|
+
"progress",
|
85
|
+
"serialize_output_data",
|
86
|
+
)
|
87
|
+
|
82
88
|
def __init__(self, parent=None):
|
83
89
|
self.__configuration_cache = None
|
84
90
|
# cache updated for each folder in order to match `_execute_ewoks_task` design
|
@@ -89,7 +95,7 @@ class EDF2NXOW(
|
|
89
95
|
self.widget = EDFDataListMainWindow(parent=self)
|
90
96
|
_layout.addWidget(self.widget)
|
91
97
|
# for edf default output path is still the 'near to input file'
|
92
|
-
self.widget._dialog._nxTomomillOutputWidget.
|
98
|
+
self.widget._dialog._nxTomomillOutputWidget._inScanFolder.setChecked(True)
|
93
99
|
# add 'convert auto' check box
|
94
100
|
self._convertAutoCB = qt.QCheckBox(
|
95
101
|
"convert automatically when edf scan send through 'edf scan' channel", self
|
@@ -109,7 +115,12 @@ class EDF2NXOW(
|
|
109
115
|
edf_to_nx_configuration=EDFConfig().to_dict(),
|
110
116
|
)
|
111
117
|
|
112
|
-
self.task_output_changed_callbacks
|
118
|
+
if isinstance(self.task_output_changed_callbacks, set):
|
119
|
+
self.task_output_changed_callbacks.add(self._notify_state)
|
120
|
+
elif isinstance(self.task_output_changed_callbacks, list):
|
121
|
+
self.task_output_changed_callbacks.append(self._notify_state)
|
122
|
+
else:
|
123
|
+
raise NotImplementedError
|
113
124
|
|
114
125
|
# handle settings
|
115
126
|
self._loadSettings()
|
@@ -175,8 +186,14 @@ class EDF2NXOW(
|
|
175
186
|
edf_to_nx_configuration=self.__configuration_cache.to_dict()
|
176
187
|
)
|
177
188
|
|
178
|
-
self.notify_on_going(scan=
|
179
|
-
|
189
|
+
self.notify_on_going(scan=NXtomoScan(output_file, output_entry))
|
190
|
+
try:
|
191
|
+
self._execute_ewoks_task( # pylint: disable=E1123
|
192
|
+
propagate=True,
|
193
|
+
log_missing_inputs=False,
|
194
|
+
)
|
195
|
+
except Exception:
|
196
|
+
self._execute_ewoks_task(propagate=True) # pylint: disable=E1123
|
180
197
|
|
181
198
|
def get_task_inputs(self):
|
182
199
|
return {
|
@@ -204,7 +221,7 @@ class EDF2NXOW(
|
|
204
221
|
task_suceeded = task_executor.succeeded
|
205
222
|
config = task_executor.current_task.inputs.edf_to_nx_configuration
|
206
223
|
config = EDFConfig.from_dict(config)
|
207
|
-
scan =
|
224
|
+
scan = NXtomoScan(
|
208
225
|
config.output_file,
|
209
226
|
"entry",
|
210
227
|
)
|
@@ -4,14 +4,14 @@ from orangewidget.settings import Setting
|
|
4
4
|
from silx.gui import qt
|
5
5
|
from ewoksorange.bindings.owwidgets import OWEwoksWidgetNoThread
|
6
6
|
|
7
|
-
import tomwer.core.process.control.
|
8
|
-
from tomwer.gui.control.
|
9
|
-
from tomwer.core.utils import concatenate_dict
|
7
|
+
import tomwer.core.process.control.emailnotifier
|
8
|
+
from tomwer.gui.control.emailnotifier import Emailwidget
|
9
|
+
from tomwer.core.utils.dictutils import concatenate_dict
|
10
10
|
|
11
11
|
|
12
12
|
class EmailOW(
|
13
13
|
OWEwoksWidgetNoThread,
|
14
|
-
ewokstaskclass=tomwer.core.process.control.
|
14
|
+
ewokstaskclass=tomwer.core.process.control.emailnotifier.TomoEmailTask,
|
15
15
|
):
|
16
16
|
"""
|
17
17
|
This widget will browse a folder and sub folder to find valid tomo scan project.
|
@@ -36,9 +36,9 @@ class NXTomomillMixIn:
|
|
36
36
|
assert (
|
37
37
|
self.CONFIG_CLS is not None
|
38
38
|
), "inheriting classes are expected to redefine CONFIG_CLS"
|
39
|
-
self._ewoks_default_inputs[
|
40
|
-
|
41
|
-
|
39
|
+
self._ewoks_default_inputs["nxtomomill_cfg_file"] = (
|
40
|
+
cfg_file # pylint: disable=E1137
|
41
|
+
)
|
42
42
|
|
43
43
|
if os.path.exists(cfg_file):
|
44
44
|
try:
|
@@ -39,9 +39,12 @@ from orangecontrib.tomwer.orange.managedprocess import TomwerWithStackStack
|
|
39
39
|
from orangecontrib.tomwer.widgets.control.NXTomomillMixIn import NXTomomillMixIn
|
40
40
|
from tomwer.core.process.control.nxtomomill import H5ToNxProcess
|
41
41
|
from tomwer.core.scan.blissscan import BlissScan
|
42
|
-
from tomwer.core.scan.
|
42
|
+
from tomwer.core.scan.nxtomoscan import NXtomoScan, NXtomoScanIdentifier
|
43
43
|
from tomwer.gui.control.datalist import BlissHDF5DataListMainWindow
|
44
44
|
from tomwer.gui.control.nxtomomill import NXTomomillInput, OverwriteMessage
|
45
|
+
from tomwer.core.process.output import ProcessDataOutputDirMode
|
46
|
+
from ewoksorange.bindings.owwidgets import invalid_data
|
47
|
+
|
45
48
|
|
46
49
|
logger = logging.getLogger(__name__)
|
47
50
|
|
@@ -56,7 +59,7 @@ class NXTomomillOW(
|
|
56
59
|
to HDF5scan.
|
57
60
|
"""
|
58
61
|
|
59
|
-
name = "bliss
|
62
|
+
name = "nxtomomill h52nx (bliss-HDF5)"
|
60
63
|
id = "orange.widgets.tomwer.control.NXTomomillOW.NXTomomillOW"
|
61
64
|
description = (
|
62
65
|
"Read a bliss .h5 file and extract from it all possible"
|
@@ -74,6 +77,7 @@ class NXTomomillOW(
|
|
74
77
|
"NXTomo",
|
75
78
|
"tomography",
|
76
79
|
"nxtomomill",
|
80
|
+
"h52nx",
|
77
81
|
]
|
78
82
|
|
79
83
|
want_main_area = True
|
@@ -84,6 +88,12 @@ class NXTomomillOW(
|
|
84
88
|
|
85
89
|
LOGGER = logger
|
86
90
|
|
91
|
+
_ewoks_inputs_to_hide_from_orange = (
|
92
|
+
"h5_to_nx_configuration",
|
93
|
+
"progress",
|
94
|
+
"serialize_output_data",
|
95
|
+
)
|
96
|
+
|
87
97
|
def __init__(self, parent=None):
|
88
98
|
TomwerWithStackStack.__init__(self, parent=parent)
|
89
99
|
NXTomomillMixIn.__init__(self)
|
@@ -113,7 +123,12 @@ class NXTomomillOW(
|
|
113
123
|
self.update_default_inputs(
|
114
124
|
h5_to_nx_configuration=HDF5Config().to_dict(),
|
115
125
|
)
|
116
|
-
self.task_output_changed_callbacks
|
126
|
+
if isinstance(self.task_output_changed_callbacks, set):
|
127
|
+
self.task_output_changed_callbacks.add(self._notify_state)
|
128
|
+
elif isinstance(self.task_output_changed_callbacks, list):
|
129
|
+
self.task_output_changed_callbacks.append(self._notify_state)
|
130
|
+
else:
|
131
|
+
raise NotImplementedError
|
117
132
|
|
118
133
|
# handle settings
|
119
134
|
self._loadSettings()
|
@@ -124,13 +139,14 @@ class NXTomomillOW(
|
|
124
139
|
# kept for backward compatibility since 0.11. To be removed on the future version.
|
125
140
|
if "@" in scan:
|
126
141
|
entry, file_path = scan.split("@")
|
127
|
-
|
128
|
-
self.add(
|
142
|
+
nxtomo_scan = NXtomoScan(entry=entry, scan=file_path)
|
143
|
+
self.add(nxtomo_scan)
|
129
144
|
else:
|
130
145
|
self._scans.append(scan)
|
131
|
-
self.
|
132
|
-
|
133
|
-
|
146
|
+
output_dir = self.widget.getOutputFolder()
|
147
|
+
if isinstance(output_dir, ProcessDataOutputDirMode):
|
148
|
+
output_dir = output_dir.value
|
149
|
+
self._ewoks_default_inputs["output_dir"] = output_dir # pylint: disable=E1137
|
134
150
|
|
135
151
|
@property
|
136
152
|
def request_input(self):
|
@@ -152,15 +168,13 @@ class NXTomomillOW(
|
|
152
168
|
"""
|
153
169
|
# for now we want to avoid propagation any processing.
|
154
170
|
# task will be executed only when the user validates the dialog
|
155
|
-
|
156
|
-
if
|
157
|
-
if not isinstance(
|
158
|
-
raise TypeError(
|
159
|
-
|
160
|
-
)
|
161
|
-
self.add(h5_scan.path)
|
171
|
+
bliss_scan = super().get_task_inputs().get("bliss_scan", None)
|
172
|
+
if bliss_scan is not None:
|
173
|
+
if not isinstance(bliss_scan, BlissScan):
|
174
|
+
raise TypeError("bliss_scan is expected to be an instance of BlissScan")
|
175
|
+
self.add(bliss_scan.master_file)
|
162
176
|
|
163
|
-
def _convertAndSend(self, bliss_url):
|
177
|
+
def _convertAndSend(self, bliss_url: str):
|
164
178
|
"""
|
165
179
|
|
166
180
|
:param str bliss_url: string at entry@file format
|
@@ -170,7 +184,7 @@ class NXTomomillOW(
|
|
170
184
|
copy(self.get_default_input_values()["h5_to_nx_configuration"])
|
171
185
|
)
|
172
186
|
|
173
|
-
identifier =
|
187
|
+
identifier = NXtomoScanIdentifier.from_str(bliss_url)
|
174
188
|
bliss_scan = BlissScan(
|
175
189
|
master_file=identifier.file_path,
|
176
190
|
entry=identifier.data_path,
|
@@ -235,7 +249,13 @@ class NXTomomillOW(
|
|
235
249
|
self.update_default_inputs(
|
236
250
|
h5_to_nx_configuration=self.__configuration_cache.to_dict()
|
237
251
|
)
|
238
|
-
|
252
|
+
try:
|
253
|
+
self._execute_ewoks_task( # pylint: disable=E1123
|
254
|
+
propagate=True,
|
255
|
+
log_missing_inputs=False,
|
256
|
+
)
|
257
|
+
except Exception:
|
258
|
+
self._execute_ewoks_task(propagate=True) # pylint: disable=E1123
|
239
259
|
|
240
260
|
def _loadSettings(self):
|
241
261
|
for scan in self._scans:
|
@@ -279,23 +299,27 @@ class NXTomomillOW(
|
|
279
299
|
# reset the GUI for input (reset all the cache for answers)
|
280
300
|
self._canOverwriteOutputs = False
|
281
301
|
for bliss_url in self.widget.datalist.selectedItems():
|
282
|
-
|
302
|
+
data = bliss_url.data(qt.Qt.UserRole)
|
303
|
+
assert isinstance(data, NXtomoScan)
|
304
|
+
identifier = data.get_identifier()
|
283
305
|
self._inputGUI.setBlissScan(
|
284
306
|
entry=identifier.data_path, file_path=identifier.file_path
|
285
307
|
)
|
286
|
-
self._convertAndSend(
|
308
|
+
self._convertAndSend(identifier.to_str())
|
287
309
|
|
288
310
|
def _sendAll(self):
|
289
311
|
"""Send a signal for each scan found to the next widget"""
|
290
312
|
self._inputGUI = NXTomomillInput()
|
291
313
|
# reset the GUI for input (reset all the cache for answers)
|
292
314
|
self._canOverwriteOutputs = False
|
293
|
-
for bliss_url in self.widget.datalist.
|
294
|
-
|
315
|
+
for bliss_url in self.widget.datalist._myitems.values():
|
316
|
+
data = bliss_url.data(qt.Qt.UserRole)
|
317
|
+
identifier = data.get_identifier()
|
318
|
+
assert isinstance(data, NXtomoScan)
|
295
319
|
self._inputGUI.setBlissScan(
|
296
320
|
entry=identifier.data_path, file_path=identifier.file_path
|
297
321
|
)
|
298
|
-
self._convertAndSend(
|
322
|
+
self._convertAndSend(identifier.to_str())
|
299
323
|
|
300
324
|
def _notify_state(self):
|
301
325
|
try:
|
@@ -310,3 +334,20 @@ class NXTomomillOW(
|
|
310
334
|
self.notify_failed(scan=scan)
|
311
335
|
except Exception as e:
|
312
336
|
logger.error(f"failed to handle task finished callback. Raiseon is {e}")
|
337
|
+
|
338
|
+
def trigger_downstream(self) -> None:
|
339
|
+
for ewoksname, var in self.get_task_outputs().items():
|
340
|
+
# note: for now we want to trigger 'data' for each items of 'datas'
|
341
|
+
if ewoksname == "serie" and not (
|
342
|
+
invalid_data.is_invalid_data(var.value) or var.value is None
|
343
|
+
):
|
344
|
+
for data in var.value:
|
345
|
+
data_channel = self._get_output_signal("data")
|
346
|
+
data_channel.send(data)
|
347
|
+
serie_channel = self._get_output_signal("serie")
|
348
|
+
# then send the list of value / serie (also know as datas)
|
349
|
+
serie_channel.send(var.value)
|
350
|
+
elif ewoksname == "data" and not (
|
351
|
+
invalid_data.is_invalid_data(var.value) or var.value is None
|
352
|
+
):
|
353
|
+
pass # handle by 'serie' in this case
|