tomwer 1.2.8__py3-none-any.whl → 1.3.0a0__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 +1 -0
- orangecontrib/tomwer/widgets/control/DataDiscoveryOW.py +2 -2
- orangecontrib/tomwer/widgets/control/DataListOW.py +9 -7
- orangecontrib/tomwer/widgets/control/DataSelectorOW.py +21 -10
- orangecontrib/tomwer/widgets/control/EDF2NXTomomillOW.py +11 -5
- orangecontrib/tomwer/widgets/control/EmailOW.py +4 -4
- orangecontrib/tomwer/widgets/control/NXTomomillOW.py +31 -18
- orangecontrib/tomwer/widgets/control/NXtomoConcatenate.py +14 -7
- orangecontrib/tomwer/widgets/control/NotifierOW.py +1 -0
- orangecontrib/tomwer/widgets/control/VolumeSelector.py +7 -4
- orangecontrib/tomwer/widgets/control/VolumeSymLinkOW.py +182 -182
- orangecontrib/tomwer/widgets/debugtools/DatasetGeneratorOW.py +4 -4
- orangecontrib/tomwer/widgets/edit/DarkFlatPatchOW.py +4 -4
- orangecontrib/tomwer/widgets/edit/ImageKeyEditorOW.py +3 -3
- orangecontrib/tomwer/widgets/edit/ImageKeyUpgraderOW.py +2 -0
- 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 +9 -8
- orangecontrib/tomwer/widgets/reconstruction/CastNabuVolumeOW.py +3 -3
- orangecontrib/tomwer/widgets/reconstruction/NabuHelicalPrepareWeightsDoubleOW.py +179 -169
- orangecontrib/tomwer/widgets/reconstruction/NabuOW.py +23 -0
- orangecontrib/tomwer/widgets/reconstruction/NabuVolumeOW.py +39 -5
- orangecontrib/tomwer/widgets/reconstruction/SAAxisOW.py +7 -13
- orangecontrib/tomwer/widgets/reconstruction/SADeltaBetaOW.py +7 -17
- orangecontrib/tomwer/widgets/reconstruction/SinoNormOW.py +3 -4
- orangecontrib/tomwer/widgets/visualization/LivesliceOW.py +1 -1
- orangecontrib/tomwer/widgets/visualization/NXtomoMetadataViewerOW.py +3 -3
- orangecontrib/tomwer/widgets/visualization/VolumeViewerOW.py +3 -29
- tomwer/__main__.py +11 -58
- tomwer/app/canvas.py +8 -0
- tomwer/app/canvas_launcher/config.py +13 -11
- tomwer/app/darkref.py +1 -1
- tomwer/app/darkrefpatch.py +1 -1
- tomwer/app/imagekeyeditor.py +5 -5
- tomwer/app/imagekeyupgrader.py +5 -5
- tomwer/app/intensitynormalization.py +2 -2
- tomwer/app/radiostack.py +2 -2
- tomwer/app/zstitching.py +74 -3
- 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 +3 -3
- tomwer/core/process/control/nxtomoconcatenate.py +13 -13
- tomwer/core/process/control/nxtomomill.py +83 -25
- tomwer/core/process/control/scantransfer.py +11 -10
- 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 +6 -6
- tomwer/core/process/edit/imagekeyeditor.py +17 -18
- 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 +26 -0
- tomwer/core/process/output.py +52 -0
- tomwer/core/process/reconstruction/axis/axis.py +17 -10
- tomwer/core/process/reconstruction/axis/mode.py +4 -0
- tomwer/core/process/reconstruction/axis/params.py +9 -4
- tomwer/core/process/reconstruction/darkref/darkrefs.py +8 -6
- tomwer/core/process/reconstruction/darkref/darkrefscopy.py +1 -1
- tomwer/core/process/reconstruction/darkref/params.py +1 -1
- tomwer/core/process/reconstruction/lamino/tofu.py +4 -4
- tomwer/core/process/reconstruction/nabu/castvolume.py +1 -1
- tomwer/core/process/reconstruction/nabu/helical.py +9 -5
- tomwer/core/process/reconstruction/nabu/nabucommon.py +32 -62
- tomwer/core/process/reconstruction/nabu/nabuscores.py +387 -61
- tomwer/core/process/reconstruction/nabu/nabuslices.py +33 -21
- tomwer/core/process/reconstruction/nabu/nabuvolume.py +37 -14
- tomwer/core/process/reconstruction/nabu/settings.py +2 -2
- tomwer/core/process/reconstruction/nabu/utils.py +129 -24
- tomwer/core/process/reconstruction/output.py +108 -0
- tomwer/core/process/reconstruction/saaxis/saaxis.py +233 -263
- tomwer/core/process/reconstruction/sadeltabeta/sadeltabeta.py +140 -86
- tomwer/core/process/reconstruction/scores/params.py +4 -1
- 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 +3 -3
- 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 +2 -2
- tomwer/core/process/test/test_axis.py +6 -6
- tomwer/core/process/test/test_dark_and_flat.py +10 -7
- tomwer/core/process/test/test_data_transfer.py +7 -6
- tomwer/core/process/test/test_nabu.py +4 -4
- tomwer/core/process/test/test_normalization.py +2 -2
- tomwer/core/scan/edfscan.py +4 -1
- tomwer/core/scan/hdf5scan.py +19 -500
- tomwer/core/scan/nxtomoscan.py +532 -0
- tomwer/core/scan/scanbase.py +42 -20
- tomwer/core/scan/scanfactory.py +13 -13
- tomwer/core/scan/test/test_future_scan.py +2 -2
- tomwer/core/scan/test/test_h5.py +12 -10
- tomwer/core/scan/test/test_process_registration.py +2 -2
- tomwer/core/scan/test/test_scan.py +4 -3
- tomwer/core/settings.py +20 -0
- tomwer/core/test/test_scanutils.py +8 -7
- tomwer/core/test/test_utils.py +33 -26
- 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/volumefactory.py +2 -2
- tomwer/gui/cluster/slurm.py +260 -60
- tomwer/gui/cluster/test/test_cluster.py +13 -0
- tomwer/gui/cluster/test/test_supervisor.py +2 -2
- 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 +78 -16
- tomwer/gui/control/datalistener.py +4 -16
- 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 +1 -1
- 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 +2 -2
- tomwer/gui/control/tomoobjdisplaymode.py +8 -0
- tomwer/gui/debugtools/datasetgenerator.py +3 -3
- tomwer/gui/edit/dkrfpatch.py +16 -22
- tomwer/gui/edit/imagekeyeditor.py +8 -11
- tomwer/gui/edit/nxtomoeditor.py +111 -44
- tomwer/gui/edit/nxtomowarmer.py +4 -4
- tomwer/gui/edit/test/test_dkrf_patch.py +7 -7
- 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/reconstruction/axis/axis.py +171 -57
- tomwer/gui/reconstruction/axis/radioaxis.py +80 -95
- tomwer/gui/reconstruction/darkref/darkrefcopywidget.py +3 -2
- tomwer/gui/reconstruction/lamino/tofu/projections.py +1 -1
- tomwer/gui/reconstruction/lamino/tofu/tofuoutput.py +3 -6
- tomwer/gui/reconstruction/nabu/castvolume.py +1 -1
- 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/output.py +110 -33
- tomwer/gui/reconstruction/nabu/nabuconfig/phase.py +9 -12
- tomwer/gui/reconstruction/nabu/nabuconfig/preprocessing.py +219 -29
- tomwer/gui/reconstruction/nabu/nabuconfig/reconstruction.py +3 -6
- tomwer/gui/reconstruction/nabu/nabuflow.py +12 -20
- tomwer/gui/reconstruction/nabu/slices.py +6 -7
- tomwer/gui/reconstruction/nabu/volume.py +22 -10
- tomwer/gui/reconstruction/normalization/intensity.py +15 -23
- tomwer/gui/reconstruction/saaxis/corrangeselector.py +7 -23
- tomwer/gui/reconstruction/saaxis/dimensionwidget.py +1 -1
- tomwer/gui/reconstruction/saaxis/saaxis.py +7 -9
- tomwer/gui/reconstruction/sadeltabeta/saadeltabeta.py +2 -1
- tomwer/gui/reconstruction/scores/control.py +2 -9
- tomwer/gui/reconstruction/scores/scoreplot.py +11 -5
- tomwer/gui/reconstruction/test/test_axis.py +23 -12
- tomwer/gui/reconstruction/test/test_lamino.py +8 -3
- tomwer/gui/reconstruction/test/test_nabu.py +28 -9
- tomwer/gui/reconstruction/test/test_saaxis.py +3 -3
- tomwer/gui/reconstruction/test/test_sadeltabeta.py +2 -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 +265 -43
- tomwer/gui/stitching/stitching_preview.py +62 -5
- tomwer/gui/stitching/stitching_raw.py +2 -5
- tomwer/gui/stitching/z_stitching/fineestimation.py +0 -60
- tomwer/gui/utils/buttons.py +112 -29
- tomwer/gui/utils/inputwidget.py +33 -25
- 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 +1 -18
- 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 +1 -10
- 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 +2 -2
- tomwer/io/utils/raw_and_processed_data.py +84 -0
- tomwer/io/utils/tomoobj.py +4 -6
- 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/synctools/stacks/edit/darkflatpatch.py +2 -2
- tomwer/synctools/stacks/edit/imagekeyeditor.py +2 -2
- tomwer/synctools/stacks/reconstruction/axis.py +4 -4
- tomwer/synctools/stacks/reconstruction/castvolume.py +2 -2
- tomwer/synctools/stacks/reconstruction/dkrefcopy.py +4 -10
- 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 +92 -39
- tomwer/tests/utils.py +5 -0
- tomwer/version.py +3 -3
- {tomwer-1.2.8.dist-info → tomwer-1.3.0a0.dist-info}/METADATA +39 -44
- {tomwer-1.2.8.dist-info → tomwer-1.3.0a0.dist-info}/RECORD +248 -209
- tomwer/resources/gui/icons/esrf_1.svg +0 -307
- tomwer/resources/gui/icons/triangle.svg +0 -80
- tomwer/synctools/test/test_scanstages.py +0 -162
- tomwer/tests/utils/__init__.py +0 -247
- tomwer/tests/utils/utilstest.py +0 -220
- /tomwer/app/{saaxis.py → multicor.py} +0 -0
- /tomwer/app/{sadeltabeta.py → multipag.py} +0 -0
- /tomwer/core/process/control/{email.py → emailnotifier.py} +0 -0
- /tomwer-1.2.8-py3.11-nspkg.pth → /tomwer-1.3.0a0-py3.11-nspkg.pth +0 -0
- {tomwer-1.2.8.dist-info → tomwer-1.3.0a0.dist-info}/LICENSE +0 -0
- {tomwer-1.2.8.dist-info → tomwer-1.3.0a0.dist-info}/WHEEL +0 -0
- {tomwer-1.2.8.dist-info → tomwer-1.3.0a0.dist-info}/entry_points.txt +0 -0
- {tomwer-1.2.8.dist-info → tomwer-1.3.0a0.dist-info}/namespace_packages.txt +0 -0
- {tomwer-1.2.8.dist-info → tomwer-1.3.0a0.dist-info}/top_level.txt +0 -0
tomwer/core/scan/scanfactory.py
CHANGED
@@ -36,17 +36,17 @@ from urllib.parse import urlparse
|
|
36
36
|
|
37
37
|
import h5py
|
38
38
|
from tomoscan.esrf.identifier.url_utils import split_path
|
39
|
-
from tomoscan.esrf.scan.hdf5scan import HDF5TomoScan as _oHDF5TomoScan
|
40
39
|
from tomoscan.factory import Factory as _oScanFactory
|
41
40
|
from tomoscan.identifier import BaseIdentifier, ScanIdentifier, VolumeIdentifier
|
42
41
|
from tomoscan.scanbase import TomoScanBase
|
43
42
|
from tomoscan.tomoobject import TomoObject
|
43
|
+
from nxtomo.application.nxtomo import NXtomo
|
44
44
|
|
45
45
|
from tomwer.utils import docstring
|
46
46
|
|
47
47
|
from .blissscan import BlissScan
|
48
48
|
from .edfscan import EDFTomoScan, EDFTomoScanIdentifier
|
49
|
-
from .hdf5scan import
|
49
|
+
from .hdf5scan import NXtomoScan, NXtomoScanIdentifier
|
50
50
|
|
51
51
|
_logger = logging.getLogger(__name__)
|
52
52
|
|
@@ -93,7 +93,7 @@ class ScanFactory(object):
|
|
93
93
|
if scheme == "edf":
|
94
94
|
identifier = EDFTomoScanIdentifier.from_str(identifier=identifier)
|
95
95
|
elif scheme == "hdf5":
|
96
|
-
identifier =
|
96
|
+
identifier = NXtomoScanIdentifier.from_str(identifier=identifier)
|
97
97
|
else:
|
98
98
|
raise ValueError(f"Scheme {scheme} not recognized")
|
99
99
|
else:
|
@@ -111,7 +111,7 @@ class ScanFactory(object):
|
|
111
111
|
raise NotImplementedError()
|
112
112
|
elif scheme == "hdf5":
|
113
113
|
if tomo_type == ScanIdentifier.TOMO_TYPE:
|
114
|
-
return
|
114
|
+
return NXtomoScan.from_identifier(identifier=identifier)
|
115
115
|
else:
|
116
116
|
raise NotImplementedError()
|
117
117
|
else:
|
@@ -135,7 +135,7 @@ class ScanFactory(object):
|
|
135
135
|
if entry is not None and not entry.startswith("/"):
|
136
136
|
entry = "/" + entry
|
137
137
|
if os.path.isfile(scan_path) and ScanFactory.is_hdf5_tomo(scan_path):
|
138
|
-
valid_entries =
|
138
|
+
valid_entries = NXtomo.get_valid_entries(scan_path)
|
139
139
|
if entry is None:
|
140
140
|
if len(valid_entries) > 1:
|
141
141
|
_logger.warning(
|
@@ -148,7 +148,7 @@ class ScanFactory(object):
|
|
148
148
|
f"entry {entry} is invalid. Does it exists ? Is the "
|
149
149
|
f"file NXTomo compliant ?. Valid entry are {valid_entries}"
|
150
150
|
)
|
151
|
-
return
|
151
|
+
return NXtomoScan(scan=scan_path, entry=entry)
|
152
152
|
elif ScanFactory.is_edf_tomo(scan_path):
|
153
153
|
return EDFTomoScan(scan=scan_path)
|
154
154
|
elif accept_bliss_scan and BlissScan.is_bliss_file(scan_path):
|
@@ -169,12 +169,12 @@ class ScanFactory(object):
|
|
169
169
|
scan_path = scan_path.rstrip(os.path.sep)
|
170
170
|
if EDFTomoScan.is_tomoscan_dir(scan_path):
|
171
171
|
return (EDFTomoScan(scan=scan_path),)
|
172
|
-
elif
|
172
|
+
elif NXtomoScan.is_tomoscan_dir(scan_path):
|
173
173
|
scans = []
|
174
|
-
master_file =
|
175
|
-
entries =
|
174
|
+
master_file = NXtomoScan.get_master_file(scan_path=scan_path)
|
175
|
+
entries = NXtomo.get_valid_entries(master_file)
|
176
176
|
for entry in entries:
|
177
|
-
scans.append(
|
177
|
+
scans.append(NXtomoScan(scan=scan_path, entry=entry, index=None))
|
178
178
|
return tuple(scans)
|
179
179
|
elif accept_bliss_scan and BlissScan.is_bliss_file(scan_path):
|
180
180
|
scans = []
|
@@ -201,8 +201,8 @@ class ScanFactory(object):
|
|
201
201
|
)
|
202
202
|
elif _dict[TomoScanBase.DICT_TYPE_KEY] == EDFTomoScan._TYPE:
|
203
203
|
return EDFTomoScan(scan=None).load_from_dict(_dict)
|
204
|
-
elif _dict[TomoScanBase.DICT_TYPE_KEY] ==
|
205
|
-
return
|
204
|
+
elif _dict[TomoScanBase.DICT_TYPE_KEY] == NXtomoScan._TYPE:
|
205
|
+
return NXtomoScan.from_dict(_dict)
|
206
206
|
else:
|
207
207
|
raise ValueError(
|
208
208
|
f"Scan type {_dict[TomoScanBase.DICT_TYPE_KEY]} is not managed"
|
@@ -253,4 +253,4 @@ class ScanFactory(object):
|
|
253
253
|
if os.path.isfile(scan_path):
|
254
254
|
return h5py.is_hdf5(scan_path)
|
255
255
|
else:
|
256
|
-
return
|
256
|
+
return NXtomoScan.directory_contains_scan(scan_path)
|
@@ -33,12 +33,12 @@ import asyncio
|
|
33
33
|
import os
|
34
34
|
|
35
35
|
from tomwer.core.futureobject import FutureTomwerObject
|
36
|
-
from tomwer.core.utils.scanutils import
|
36
|
+
from tomwer.core.utils.scanutils import MockNXtomo
|
37
37
|
|
38
38
|
|
39
39
|
def test_simple_future_tomo_obj(tmpdir):
|
40
40
|
"""Simple test of the FutureTomwerScan API"""
|
41
|
-
scan =
|
41
|
+
scan = MockNXtomo(
|
42
42
|
scan_path=os.path.join(tmpdir, "scan_test"),
|
43
43
|
n_proj=10,
|
44
44
|
n_ini_proj=10,
|
tomwer/core/scan/test/test_h5.py
CHANGED
@@ -33,9 +33,9 @@ import shutil
|
|
33
33
|
import tempfile
|
34
34
|
import unittest
|
35
35
|
|
36
|
-
from tomwer.core.scan.
|
37
|
-
from tomwer.core.utils.scanutils import
|
38
|
-
from tomwer.tests.
|
36
|
+
from tomwer.core.scan.nxtomoscan import NXtomoScan
|
37
|
+
from tomwer.core.utils.scanutils import MockNXtomo
|
38
|
+
from tomwer.tests.datasets import TomwerCIDatasets
|
39
39
|
|
40
40
|
|
41
41
|
class TestHDF5Scan(unittest.TestCase):
|
@@ -46,11 +46,13 @@ class TestHDF5Scan(unittest.TestCase):
|
|
46
46
|
self._tmp_dir = tempfile.mkdtemp()
|
47
47
|
self.dataset_file = os.path.join(self._tmp_dir, "frm_edftomomill_twoentries.nx")
|
48
48
|
shutil.copyfile(
|
49
|
-
|
49
|
+
TomwerCIDatasets.get_dataset(
|
50
|
+
"h5_datasets/frm_edftomomill_twoentries.nx",
|
51
|
+
),
|
50
52
|
self.dataset_file,
|
51
53
|
)
|
52
54
|
assert os.path.isfile(self.dataset_file)
|
53
|
-
self.scan =
|
55
|
+
self.scan = NXtomoScan(scan=self.dataset_file, entry="entry0000")
|
54
56
|
|
55
57
|
def test_scan_dir(self):
|
56
58
|
assert self.scan.scan_dir_name() == self._tmp_dir.split(os.sep)[-1]
|
@@ -58,7 +60,7 @@ class TestHDF5Scan(unittest.TestCase):
|
|
58
60
|
def testFFInterval(self):
|
59
61
|
"""test the call to ff_interval"""
|
60
62
|
scan_path = os.path.join(self._tmp_dir, "my_scan_1")
|
61
|
-
scan_1 =
|
63
|
+
scan_1 = MockNXtomo(
|
62
64
|
scan_path=scan_path,
|
63
65
|
n_ini_proj=20,
|
64
66
|
n_proj=20,
|
@@ -71,7 +73,7 @@ class TestHDF5Scan(unittest.TestCase):
|
|
71
73
|
self.assertEqual(scan_1.ff_interval, 20)
|
72
74
|
|
73
75
|
scan_path2 = os.path.join(self._tmp_dir, "my_scan_2")
|
74
|
-
scan_2 =
|
76
|
+
scan_2 = MockNXtomo(
|
75
77
|
scan_path=scan_path2,
|
76
78
|
n_ini_proj=10,
|
77
79
|
n_proj=10,
|
@@ -86,9 +88,9 @@ class TestHDF5Scan(unittest.TestCase):
|
|
86
88
|
|
87
89
|
def test_working_directory():
|
88
90
|
"""test behavior of the working directory function"""
|
89
|
-
scan =
|
91
|
+
scan = NXtomoScan(scan=None, entry="my_entry")
|
90
92
|
assert scan.working_directory is None
|
91
|
-
scan =
|
93
|
+
scan = NXtomoScan(scan="/full/path/my_file.sh", entry="my_entry")
|
92
94
|
assert scan.working_directory == os.path.realpath("/full/path")
|
93
|
-
scan =
|
95
|
+
scan = NXtomoScan(scan="my_file.sh", entry="my_entry")
|
94
96
|
assert scan.working_directory == os.path.realpath(".")
|
@@ -35,7 +35,7 @@ import unittest
|
|
35
35
|
from tomoscan.io import HDF5File
|
36
36
|
|
37
37
|
from tomwer.core.process.task import Task
|
38
|
-
from tomwer.core.utils.scanutils import
|
38
|
+
from tomwer.core.utils.scanutils import MockNXtomo
|
39
39
|
|
40
40
|
|
41
41
|
class TestProcessRegistration(unittest.TestCase):
|
@@ -62,7 +62,7 @@ class TestProcessRegistration(unittest.TestCase):
|
|
62
62
|
|
63
63
|
def setUp(self):
|
64
64
|
self.tmp_dir = tempfile.mkdtemp()
|
65
|
-
self.scan =
|
65
|
+
self.scan = MockNXtomo(scan_path=self.tmp_dir, n_proj=2).scan
|
66
66
|
|
67
67
|
def tearDown(self):
|
68
68
|
shutil.rmtree(self.tmp_dir)
|
@@ -43,7 +43,7 @@ from tomwer.core.process.task import Task
|
|
43
43
|
from tomwer.core.scan.edfscan import EDFTomoScan
|
44
44
|
from tomwer.core.scan.scanfactory import ScanFactory
|
45
45
|
from tomwer.core.utils.scanutils import MockEDF
|
46
|
-
from tomwer.tests.
|
46
|
+
from tomwer.tests.datasets import TomwerCIDatasets
|
47
47
|
|
48
48
|
logging.disable(logging.INFO)
|
49
49
|
|
@@ -59,7 +59,9 @@ class TestScanFactory(unittest.TestCase):
|
|
59
59
|
ScanFactory.create_scan_object(scan_dir)
|
60
60
|
|
61
61
|
def test_scan_edf(self):
|
62
|
-
scan_dir =
|
62
|
+
scan_dir = TomwerCIDatasets.get_dataset(
|
63
|
+
"edf_datasets/test10",
|
64
|
+
)
|
63
65
|
scan = ScanFactory.create_scan_object(scan_dir)
|
64
66
|
self.assertTrue(isinstance(scan, EDFTomoScan))
|
65
67
|
|
@@ -102,7 +104,6 @@ class TestScanValidatorFindNabuFiles(unittest.TestCase):
|
|
102
104
|
ctf=ctf if delta_beta is not None else False,
|
103
105
|
db=delta_beta,
|
104
106
|
)
|
105
|
-
print("file_name is", file_name)
|
106
107
|
with self.subTest(
|
107
108
|
slice_index=slice_index,
|
108
109
|
pag_db=delta_beta,
|
tomwer/core/settings.py
CHANGED
@@ -92,6 +92,7 @@ class SlurmSettingsMode(_Enum):
|
|
92
92
|
CAST_VOLUME = "cast_volume"
|
93
93
|
SLICE_RECONSTRUCTION = "slice_reconstruction"
|
94
94
|
VOLUME_RECONSTRUCTION = "volume_reconstruction"
|
95
|
+
STITCHING = "stitching"
|
95
96
|
|
96
97
|
@staticmethod
|
97
98
|
def get_settings_class(mode):
|
@@ -106,6 +107,8 @@ class SlurmSettingsMode(_Enum):
|
|
106
107
|
return DefaultSlurmSettingsSliceReconstruction
|
107
108
|
elif mode is SlurmSettingsMode.VOLUME_RECONSTRUCTION:
|
108
109
|
return DefaultSlurmSettingsVolumeReconstruction
|
110
|
+
elif mode is SlurmSettingsMode.STITCHING:
|
111
|
+
return DefaultSlurmSettingsStitching
|
109
112
|
else:
|
110
113
|
raise ValueError(f"{mode} not handled")
|
111
114
|
|
@@ -141,6 +144,12 @@ class SlurmSettings:
|
|
141
144
|
"""Slurm cluster project name. `scan`, `process` and `info` will be format.
|
142
145
|
"""
|
143
146
|
|
147
|
+
MODULES_TO_LOAD = tuple() # in the future might be 'tomotools'. In this case we must remove the PYTHON_VENV
|
148
|
+
|
149
|
+
SBATCH_EXTRA_PARAMS = {
|
150
|
+
"export": "NONE", # value to provide to sbatch --export={}
|
151
|
+
}
|
152
|
+
|
144
153
|
|
145
154
|
class DefaultSlurmSettingsCastVolume(SlurmSettings):
|
146
155
|
"""
|
@@ -171,3 +180,14 @@ class DefaultSlurmSettingsVolumeReconstruction(SlurmSettings):
|
|
171
180
|
MEMORY_PER_WORKER = 256 # memory in GB
|
172
181
|
|
173
182
|
PARTITION = None
|
183
|
+
|
184
|
+
|
185
|
+
class DefaultSlurmSettingsStitching(SlurmSettings):
|
186
|
+
"""*
|
187
|
+
default proposed configuration for stitching
|
188
|
+
"""
|
189
|
+
N_JOBS = 15
|
190
|
+
|
191
|
+
PARTITION = "nice-long"
|
192
|
+
|
193
|
+
N_GPUS_PER_WORKER = 0
|
@@ -31,22 +31,23 @@ import os
|
|
31
31
|
import tempfile
|
32
32
|
import unittest
|
33
33
|
|
34
|
-
from
|
35
|
-
from tomwer.core.
|
34
|
+
from nxtomo.application.nxtomo import NXtomo
|
35
|
+
from tomwer.core.scan.nxtomoscan import NXtomoScan
|
36
|
+
from tomwer.core.utils.scanutils import MockNXtomo
|
36
37
|
|
37
38
|
|
38
|
-
class
|
39
|
-
"""Test the
|
39
|
+
class TestMockNXtomo(unittest.TestCase):
|
40
|
+
"""Test the MockNXtomo file"""
|
40
41
|
|
41
42
|
def test_creation(self):
|
42
43
|
folder = tempfile.mkdtemp()
|
43
|
-
mock =
|
44
|
+
mock = MockNXtomo(scan_path=folder, n_proj=10, n_ini_proj=10)
|
44
45
|
self.assertEqual(
|
45
46
|
mock.scan_master_file,
|
46
47
|
os.path.join(folder, os.path.basename(folder) + ".h5"),
|
47
48
|
)
|
48
|
-
tomoScan =
|
49
|
-
self.assertEqual(len(
|
49
|
+
tomoScan = NXtomoScan(mock.scan_path, entry=mock.scan_entry)
|
50
|
+
self.assertEqual(len(NXtomo.get_valid_entries(mock.scan_master_file)), 1)
|
50
51
|
tomoScan.update()
|
51
52
|
self.assertEqual(tomoScan.scan_range, 360)
|
52
53
|
self.assertEqual(len(tomoScan.projections), 10)
|
tomwer/core/test/test_utils.py
CHANGED
@@ -35,22 +35,29 @@ import unittest
|
|
35
35
|
|
36
36
|
import numpy
|
37
37
|
|
38
|
-
from tomwer.core import
|
38
|
+
from tomwer.core.utils import spec as spec_utils
|
39
39
|
from tomwer.core.utils.normalization import flatFieldCorrection
|
40
|
-
from tomwer.core.utils.scanutils import MockEDF,
|
41
|
-
from tomwer.tests.
|
40
|
+
from tomwer.core.utils.scanutils import MockEDF, MockNXtomo
|
41
|
+
from tomwer.tests.datasets import TomwerCIDatasets
|
42
42
|
|
43
43
|
|
44
44
|
class TestGetClosestEnergy(unittest.TestCase):
|
45
45
|
def setUp(self):
|
46
46
|
self.topSrcFolder = tempfile.mkdtemp()
|
47
47
|
self.dataSetID = "scan_3_"
|
48
|
-
self.dataDir =
|
48
|
+
self.dataDir = TomwerCIDatasets.get_dataset(
|
49
|
+
f"edf_datasets/{self.dataSetID}",
|
50
|
+
)
|
49
51
|
self.sourceS3 = os.path.join(self.topSrcFolder, self.dataSetID)
|
50
52
|
shutil.copytree(src=os.path.join(self.dataDir), dst=self.sourceS3)
|
51
53
|
|
52
54
|
self.sourceT01 = os.path.join(self.topSrcFolder, "test01")
|
53
|
-
shutil.copytree(
|
55
|
+
shutil.copytree(
|
56
|
+
src=TomwerCIDatasets.get_dataset(
|
57
|
+
"edf_datasets/test01",
|
58
|
+
),
|
59
|
+
dst=self.sourceT01,
|
60
|
+
)
|
54
61
|
self.S3XMLFile = os.path.join(self.sourceS3, "scan_3_.xml")
|
55
62
|
self.S3Ref0000 = os.path.join(self.sourceS3, "ref0000_0000.edf")
|
56
63
|
self.S3Ref0010 = os.path.join(self.sourceS3, "ref0000_0010.edf")
|
@@ -61,34 +68,42 @@ class TestGetClosestEnergy(unittest.TestCase):
|
|
61
68
|
def testEnergyFromEDF(self):
|
62
69
|
os.remove(self.S3XMLFile)
|
63
70
|
self.assertTrue(
|
64
|
-
|
71
|
+
spec_utils.getClosestEnergy(scan=self.sourceS3, refFile=self.S3Ref0000)
|
72
|
+
== 61
|
65
73
|
)
|
66
74
|
self.assertTrue(
|
67
|
-
|
75
|
+
spec_utils.getClosestEnergy(scan=self.sourceS3, refFile=self.S3Ref0010)
|
76
|
+
== 61
|
68
77
|
)
|
69
78
|
|
70
79
|
def testEnergyFromXML(self):
|
71
80
|
os.remove(self.S3Ref0000)
|
72
81
|
os.remove(self.S3Ref0010)
|
73
82
|
self.assertTrue(
|
74
|
-
|
83
|
+
spec_utils.getClosestEnergy(scan=self.sourceS3, refFile=self.S3Ref0000)
|
84
|
+
== 10
|
75
85
|
)
|
76
86
|
self.assertTrue(
|
77
|
-
|
87
|
+
spec_utils.getClosestEnergy(scan=self.sourceS3, refFile=self.S3Ref0010)
|
88
|
+
== 10
|
78
89
|
)
|
79
90
|
|
80
91
|
def testEnergyFromInfo(self):
|
81
|
-
self.assertTrue(
|
92
|
+
self.assertTrue(
|
93
|
+
spec_utils.getClosestEnergy(scan=self.sourceT01, refFile=None) == 19
|
94
|
+
)
|
82
95
|
|
83
96
|
def testDefaultEnergy(self):
|
84
97
|
os.remove(self.S3XMLFile)
|
85
98
|
os.remove(self.S3Ref0000)
|
86
99
|
os.remove(self.S3Ref0010)
|
87
100
|
self.assertTrue(
|
88
|
-
|
101
|
+
spec_utils.getClosestEnergy(scan=self.sourceS3, refFile=self.S3Ref0000)
|
102
|
+
is None
|
89
103
|
)
|
90
104
|
self.assertTrue(
|
91
|
-
|
105
|
+
spec_utils.getClosestEnergy(scan=self.sourceS3, refFile=self.S3Ref0010)
|
106
|
+
is None
|
92
107
|
)
|
93
108
|
|
94
109
|
|
@@ -96,7 +111,9 @@ class TestGetClosestSREnergy(unittest.TestCase):
|
|
96
111
|
def setUp(self):
|
97
112
|
self.topSrcFolder = tempfile.mkdtemp()
|
98
113
|
self.dataSetID = "test10"
|
99
|
-
self.dataDir =
|
114
|
+
self.dataDir = TomwerCIDatasets.get_dataset(
|
115
|
+
f"edf_datasets/{self.dataSetID}",
|
116
|
+
)
|
100
117
|
self.sourceT10 = os.path.join(self.topSrcFolder, self.dataSetID)
|
101
118
|
shutil.copytree(src=os.path.join(self.dataDir), dst=self.sourceT10)
|
102
119
|
self.T10XMLFile = os.path.join(self.sourceT10, "test10.xml")
|
@@ -106,16 +123,6 @@ class TestGetClosestSREnergy(unittest.TestCase):
|
|
106
123
|
def tearDown(self):
|
107
124
|
shutil.rmtree(self.topSrcFolder)
|
108
125
|
|
109
|
-
def testIntenistyFromInfo(self):
|
110
|
-
self.assertTrue(
|
111
|
-
utils.getClosestSRCurrent(scan_dir=self.sourceT10, refFile=None) == 101.3
|
112
|
-
)
|
113
|
-
|
114
|
-
def testDefaultIntensity(self):
|
115
|
-
os.remove(self.T10XMLFile)
|
116
|
-
os.remove(self.T10InfoFile)
|
117
|
-
self.assertTrue(utils.getClosestSRCurrent(scan_dir=self.sourceT10) is None)
|
118
|
-
|
119
126
|
|
120
127
|
class TestMockEDFScan(unittest.TestCase):
|
121
128
|
"""Test that mock scan are adapted to other unit test"""
|
@@ -254,8 +261,8 @@ class TestMockEDFScan(unittest.TestCase):
|
|
254
261
|
self.assertEqual(scan_dynamic[angle_id].file_path(), file_name)
|
255
262
|
|
256
263
|
|
257
|
-
class
|
258
|
-
"""Test
|
264
|
+
class TestMockNXtomo(unittest.TestCase):
|
265
|
+
"""Test MockNXtomo to check that the file produced is valid"""
|
259
266
|
|
260
267
|
def setUp(self) -> None:
|
261
268
|
self._folder = tempfile.mkdtemp()
|
@@ -266,7 +273,7 @@ class TestMockHDF5(unittest.TestCase):
|
|
266
273
|
def testSimpleMockCreationOneCall(self):
|
267
274
|
"""Test mock of an acquisition starting by one dark, then 10 ref,
|
268
275
|
then 20 radios, then 10 'final' ref and 2 alignment radio"""
|
269
|
-
mock =
|
276
|
+
mock = MockNXtomo(
|
270
277
|
scan_path=self._folder,
|
271
278
|
n_proj=20,
|
272
279
|
n_ini_proj=20,
|