tomwer 1.2.9__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.
Files changed (253) hide show
  1. orangecontrib/tomwer/tutorials/icat_publication.ows +58 -0
  2. orangecontrib/tomwer/widgets/__init__.py +1 -0
  3. orangecontrib/tomwer/widgets/control/DataDiscoveryOW.py +2 -2
  4. orangecontrib/tomwer/widgets/control/DataListOW.py +9 -7
  5. orangecontrib/tomwer/widgets/control/DataSelectorOW.py +21 -10
  6. orangecontrib/tomwer/widgets/control/EDF2NXTomomillOW.py +11 -5
  7. orangecontrib/tomwer/widgets/control/EmailOW.py +4 -4
  8. orangecontrib/tomwer/widgets/control/NXTomomillOW.py +31 -18
  9. orangecontrib/tomwer/widgets/control/NXtomoConcatenate.py +14 -7
  10. orangecontrib/tomwer/widgets/control/NotifierOW.py +1 -0
  11. orangecontrib/tomwer/widgets/control/VolumeSelector.py +7 -4
  12. orangecontrib/tomwer/widgets/control/VolumeSymLinkOW.py +182 -182
  13. orangecontrib/tomwer/widgets/debugtools/DatasetGeneratorOW.py +4 -4
  14. orangecontrib/tomwer/widgets/edit/DarkFlatPatchOW.py +4 -4
  15. orangecontrib/tomwer/widgets/edit/ImageKeyEditorOW.py +3 -3
  16. orangecontrib/tomwer/widgets/edit/ImageKeyUpgraderOW.py +2 -0
  17. orangecontrib/tomwer/widgets/edit/NXtomoEditorOW.py +3 -3
  18. orangecontrib/tomwer/widgets/edit/test/test_nxtomo_editor.py +3 -3
  19. orangecontrib/tomwer/widgets/icat/PublishProcessedDataOW.py +115 -0
  20. orangecontrib/tomwer/widgets/icat/RawDataScreenshotCreatorOW.py +98 -0
  21. orangecontrib/tomwer/widgets/icat/SaveToGalleryAndPublishOW.py +129 -0
  22. orangecontrib/tomwer/widgets/icat/__init__.py +13 -0
  23. orangecontrib/tomwer/widgets/icat/icons/add_gallery.png +0 -0
  24. orangecontrib/tomwer/widgets/icat/icons/add_gallery.svg +82 -0
  25. orangecontrib/tomwer/widgets/icat/icons/publish_processed_data.png +0 -0
  26. orangecontrib/tomwer/widgets/icat/icons/publish_processed_data.svg +95 -0
  27. orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.png +0 -0
  28. orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.svg +143 -0
  29. orangecontrib/tomwer/widgets/icons/tomwer_data_portal.png +0 -0
  30. orangecontrib/tomwer/widgets/icons/tomwer_data_portal.svg +76 -0
  31. orangecontrib/tomwer/widgets/reconstruction/AxisOW.py +9 -8
  32. orangecontrib/tomwer/widgets/reconstruction/CastNabuVolumeOW.py +3 -3
  33. orangecontrib/tomwer/widgets/reconstruction/NabuHelicalPrepareWeightsDoubleOW.py +179 -169
  34. orangecontrib/tomwer/widgets/reconstruction/NabuOW.py +23 -0
  35. orangecontrib/tomwer/widgets/reconstruction/NabuVolumeOW.py +39 -5
  36. orangecontrib/tomwer/widgets/reconstruction/SAAxisOW.py +7 -13
  37. orangecontrib/tomwer/widgets/reconstruction/SADeltaBetaOW.py +7 -17
  38. orangecontrib/tomwer/widgets/reconstruction/SinoNormOW.py +3 -4
  39. orangecontrib/tomwer/widgets/visualization/LivesliceOW.py +1 -1
  40. orangecontrib/tomwer/widgets/visualization/NXtomoMetadataViewerOW.py +3 -3
  41. orangecontrib/tomwer/widgets/visualization/VolumeViewerOW.py +3 -29
  42. tomwer/__main__.py +11 -58
  43. tomwer/app/canvas.py +8 -0
  44. tomwer/app/canvas_launcher/config.py +13 -11
  45. tomwer/app/darkref.py +1 -1
  46. tomwer/app/darkrefpatch.py +1 -1
  47. tomwer/app/imagekeyeditor.py +5 -5
  48. tomwer/app/imagekeyupgrader.py +5 -5
  49. tomwer/app/intensitynormalization.py +2 -2
  50. tomwer/app/radiostack.py +2 -2
  51. tomwer/app/zstitching.py +74 -3
  52. tomwer/core/cluster/cluster.py +26 -0
  53. tomwer/core/log/logger.py +7 -5
  54. tomwer/core/process/conditions/filters.py +1 -1
  55. tomwer/core/process/control/datalistener/datalistener.py +3 -3
  56. tomwer/core/process/control/nxtomoconcatenate.py +13 -13
  57. tomwer/core/process/control/nxtomomill.py +83 -25
  58. tomwer/core/process/control/scantransfer.py +11 -10
  59. tomwer/core/process/control/scanvalidator.py +3 -2
  60. tomwer/core/process/control/test/test_concatenate_nxtomos.py +9 -9
  61. tomwer/core/process/control/test/test_email.py +4 -4
  62. tomwer/core/process/control/test/test_h52nx_process.py +59 -7
  63. tomwer/core/process/control/test/test_volume_link.py +64 -64
  64. tomwer/core/process/control/timer.py +1 -1
  65. tomwer/core/process/control/volumesymlink.py +200 -200
  66. tomwer/core/process/edit/darkflatpatch.py +6 -6
  67. tomwer/core/process/edit/imagekeyeditor.py +17 -18
  68. tomwer/core/process/icat/__init__.py +0 -0
  69. tomwer/core/process/icat/createscreenshots.py +100 -0
  70. tomwer/core/process/icat/gallery.py +377 -0
  71. tomwer/core/process/icat/icatbase.py +36 -0
  72. tomwer/core/process/icat/publish.py +228 -0
  73. tomwer/core/process/icat/screenshots.py +26 -0
  74. tomwer/core/process/output.py +52 -0
  75. tomwer/core/process/reconstruction/axis/axis.py +17 -10
  76. tomwer/core/process/reconstruction/axis/mode.py +4 -0
  77. tomwer/core/process/reconstruction/axis/params.py +9 -4
  78. tomwer/core/process/reconstruction/darkref/darkrefs.py +8 -6
  79. tomwer/core/process/reconstruction/darkref/darkrefscopy.py +1 -1
  80. tomwer/core/process/reconstruction/darkref/params.py +1 -1
  81. tomwer/core/process/reconstruction/lamino/tofu.py +4 -4
  82. tomwer/core/process/reconstruction/nabu/castvolume.py +1 -1
  83. tomwer/core/process/reconstruction/nabu/helical.py +9 -5
  84. tomwer/core/process/reconstruction/nabu/nabucommon.py +32 -62
  85. tomwer/core/process/reconstruction/nabu/nabuscores.py +387 -61
  86. tomwer/core/process/reconstruction/nabu/nabuslices.py +33 -21
  87. tomwer/core/process/reconstruction/nabu/nabuvolume.py +37 -14
  88. tomwer/core/process/reconstruction/nabu/settings.py +2 -2
  89. tomwer/core/process/reconstruction/nabu/utils.py +129 -24
  90. tomwer/core/process/reconstruction/output.py +108 -0
  91. tomwer/core/process/reconstruction/saaxis/saaxis.py +233 -263
  92. tomwer/core/process/reconstruction/sadeltabeta/sadeltabeta.py +140 -86
  93. tomwer/core/process/reconstruction/scores/params.py +4 -1
  94. tomwer/core/process/reconstruction/scores/scores.py +13 -0
  95. tomwer/core/process/reconstruction/test/test_axis_params.py +2 -2
  96. tomwer/core/process/reconstruction/test/test_darkref.py +3 -3
  97. tomwer/core/process/reconstruction/test/test_darkref_copy.py +3 -3
  98. tomwer/core/process/reconstruction/test/test_saaxis.py +3 -4
  99. tomwer/core/process/reconstruction/test/test_sadeltabeta.py +2 -2
  100. tomwer/core/process/stitching/nabustitcher.py +2 -2
  101. tomwer/core/process/test/test_axis.py +6 -6
  102. tomwer/core/process/test/test_dark_and_flat.py +10 -7
  103. tomwer/core/process/test/test_data_transfer.py +7 -6
  104. tomwer/core/process/test/test_nabu.py +4 -4
  105. tomwer/core/process/test/test_normalization.py +2 -2
  106. tomwer/core/scan/edfscan.py +4 -1
  107. tomwer/core/scan/hdf5scan.py +19 -500
  108. tomwer/core/scan/nxtomoscan.py +532 -0
  109. tomwer/core/scan/scanbase.py +42 -20
  110. tomwer/core/scan/scanfactory.py +13 -13
  111. tomwer/core/scan/test/test_future_scan.py +2 -2
  112. tomwer/core/scan/test/test_h5.py +12 -10
  113. tomwer/core/scan/test/test_process_registration.py +2 -2
  114. tomwer/core/scan/test/test_scan.py +4 -3
  115. tomwer/core/settings.py +20 -0
  116. tomwer/core/test/test_scanutils.py +8 -7
  117. tomwer/core/test/test_utils.py +33 -26
  118. tomwer/core/utils/__init__.py +0 -466
  119. tomwer/core/utils/deprecation.py +1 -1
  120. tomwer/core/utils/dictutils.py +14 -0
  121. tomwer/core/utils/lbsram.py +35 -0
  122. tomwer/core/utils/nxtomoutils.py +1 -1
  123. tomwer/core/utils/scanutils.py +6 -6
  124. tomwer/core/utils/spec.py +263 -0
  125. tomwer/core/volume/volumefactory.py +2 -2
  126. tomwer/gui/cluster/slurm.py +260 -60
  127. tomwer/gui/cluster/test/test_cluster.py +13 -0
  128. tomwer/gui/cluster/test/test_supervisor.py +2 -2
  129. tomwer/gui/configuration/__init__.py +0 -0
  130. tomwer/gui/{reconstruction/nabu → configuration}/action.py +1 -32
  131. tomwer/gui/configuration/level.py +22 -0
  132. tomwer/gui/control/actions.py +54 -0
  133. tomwer/gui/control/datalist.py +78 -16
  134. tomwer/gui/control/datalistener.py +4 -16
  135. tomwer/gui/control/{email.py → emailnotifier.py} +9 -18
  136. tomwer/gui/control/history.py +2 -2
  137. tomwer/gui/control/observations.py +2 -2
  138. tomwer/gui/control/reducedarkflatselector.py +1 -1
  139. tomwer/gui/control/selectorwidgetbase.py +36 -9
  140. tomwer/gui/control/serie/seriecreator.py +5 -22
  141. tomwer/gui/control/test/test_email.py +1 -1
  142. tomwer/gui/control/test/test_scanvalidator.py +6 -5
  143. tomwer/gui/control/test/test_single_tomo_obj.py +2 -2
  144. tomwer/gui/control/tomoobjdisplaymode.py +8 -0
  145. tomwer/gui/debugtools/datasetgenerator.py +3 -3
  146. tomwer/gui/edit/dkrfpatch.py +16 -22
  147. tomwer/gui/edit/imagekeyeditor.py +8 -11
  148. tomwer/gui/edit/nxtomoeditor.py +111 -44
  149. tomwer/gui/edit/nxtomowarmer.py +4 -4
  150. tomwer/gui/edit/test/test_dkrf_patch.py +7 -7
  151. tomwer/gui/edit/test/test_image_key_editor.py +3 -3
  152. tomwer/gui/edit/test/test_nx_editor.py +40 -16
  153. tomwer/gui/icat/__init__.py +0 -0
  154. tomwer/gui/icat/createscreenshots.py +80 -0
  155. tomwer/gui/icat/gallery.py +214 -0
  156. tomwer/gui/icat/publish.py +187 -0
  157. tomwer/gui/reconstruction/axis/axis.py +171 -57
  158. tomwer/gui/reconstruction/axis/radioaxis.py +80 -95
  159. tomwer/gui/reconstruction/darkref/darkrefcopywidget.py +3 -2
  160. tomwer/gui/reconstruction/lamino/tofu/projections.py +1 -1
  161. tomwer/gui/reconstruction/lamino/tofu/tofuoutput.py +3 -6
  162. tomwer/gui/reconstruction/nabu/castvolume.py +1 -1
  163. tomwer/gui/reconstruction/nabu/check.py +9 -9
  164. tomwer/gui/reconstruction/nabu/helical.py +29 -12
  165. tomwer/gui/reconstruction/nabu/nabuconfig/base.py +2 -4
  166. tomwer/gui/reconstruction/nabu/nabuconfig/output.py +110 -33
  167. tomwer/gui/reconstruction/nabu/nabuconfig/phase.py +9 -12
  168. tomwer/gui/reconstruction/nabu/nabuconfig/preprocessing.py +219 -29
  169. tomwer/gui/reconstruction/nabu/nabuconfig/reconstruction.py +3 -6
  170. tomwer/gui/reconstruction/nabu/nabuflow.py +12 -20
  171. tomwer/gui/reconstruction/nabu/slices.py +6 -7
  172. tomwer/gui/reconstruction/nabu/volume.py +22 -10
  173. tomwer/gui/reconstruction/normalization/intensity.py +15 -23
  174. tomwer/gui/reconstruction/saaxis/corrangeselector.py +7 -23
  175. tomwer/gui/reconstruction/saaxis/dimensionwidget.py +1 -1
  176. tomwer/gui/reconstruction/saaxis/saaxis.py +7 -9
  177. tomwer/gui/reconstruction/sadeltabeta/saadeltabeta.py +2 -1
  178. tomwer/gui/reconstruction/scores/control.py +2 -9
  179. tomwer/gui/reconstruction/scores/scoreplot.py +11 -5
  180. tomwer/gui/reconstruction/test/test_axis.py +23 -12
  181. tomwer/gui/reconstruction/test/test_lamino.py +8 -3
  182. tomwer/gui/reconstruction/test/test_nabu.py +28 -9
  183. tomwer/gui/reconstruction/test/test_saaxis.py +3 -3
  184. tomwer/gui/reconstruction/test/test_sadeltabeta.py +2 -2
  185. tomwer/gui/settings.py +5 -28
  186. tomwer/gui/stackplot.py +2 -5
  187. tomwer/gui/stitching/action.py +49 -0
  188. tomwer/gui/stitching/config/axisparams.py +7 -24
  189. tomwer/gui/stitching/config/output.py +10 -8
  190. tomwer/gui/stitching/config/positionoveraxis.py +22 -23
  191. tomwer/gui/stitching/normalization.py +117 -0
  192. tomwer/gui/stitching/stitchandbackground.py +4 -6
  193. tomwer/gui/stitching/stitching.py +265 -43
  194. tomwer/gui/stitching/stitching_preview.py +62 -5
  195. tomwer/gui/stitching/stitching_raw.py +2 -5
  196. tomwer/gui/stitching/z_stitching/fineestimation.py +0 -60
  197. tomwer/gui/utils/buttons.py +112 -29
  198. tomwer/gui/utils/inputwidget.py +33 -25
  199. tomwer/gui/utils/scandescription.py +4 -0
  200. tomwer/gui/utils/step.py +144 -0
  201. tomwer/gui/utils/unitsystem.py +2 -5
  202. tomwer/gui/utils/vignettes.py +176 -15
  203. tomwer/gui/visualization/dataviewer.py +1 -4
  204. tomwer/gui/visualization/diffviewer/diffviewer.py +7 -16
  205. tomwer/gui/visualization/diffviewer/shiftwidget.py +2 -5
  206. tomwer/gui/visualization/scanoverview.py +1 -1
  207. tomwer/gui/visualization/sinogramviewer.py +1 -10
  208. tomwer/gui/visualization/test/test_diffviewer.py +3 -3
  209. tomwer/gui/visualization/test/test_nx_tomo_metadata_viewer.py +4 -4
  210. tomwer/gui/visualization/test/test_sinogramviewer.py +2 -2
  211. tomwer/gui/visualization/test/test_stacks.py +3 -3
  212. tomwer/gui/visualization/test/test_volumeviewer.py +2 -2
  213. tomwer/io/utils/raw_and_processed_data.py +84 -0
  214. tomwer/io/utils/tomoobj.py +4 -6
  215. tomwer/resources/gui/icons/ruler.png +0 -0
  216. tomwer/resources/gui/icons/ruler.svg +273 -0
  217. tomwer/resources/gui/icons/short_description.png +0 -0
  218. tomwer/resources/gui/icons/short_description.svg +58 -0
  219. tomwer/resources/gui/icons/url.png +0 -0
  220. tomwer/resources/gui/icons/url.svg +58 -0
  221. tomwer/synctools/stacks/edit/darkflatpatch.py +2 -2
  222. tomwer/synctools/stacks/edit/imagekeyeditor.py +2 -2
  223. tomwer/synctools/stacks/reconstruction/axis.py +4 -4
  224. tomwer/synctools/stacks/reconstruction/castvolume.py +2 -2
  225. tomwer/synctools/stacks/reconstruction/dkrefcopy.py +4 -10
  226. tomwer/synctools/stacks/reconstruction/nabu.py +2 -2
  227. tomwer/synctools/stacks/reconstruction/normalization.py +2 -2
  228. tomwer/synctools/stacks/reconstruction/saaxis.py +2 -2
  229. tomwer/synctools/stacks/reconstruction/sadeltabeta.py +2 -2
  230. tomwer/synctools/test/test_darkRefs.py +7 -58
  231. tomwer/synctools/test/test_foldertransfer.py +6 -6
  232. tomwer/synctools/utils/scanstages.py +6 -6
  233. tomwer/tests/conftest.py +34 -0
  234. tomwer/tests/datasets.py +13 -0
  235. tomwer/tests/test_scripts.py +92 -39
  236. tomwer/tests/utils.py +5 -0
  237. tomwer/version.py +3 -3
  238. {tomwer-1.2.9.dist-info → tomwer-1.3.0a0.dist-info}/METADATA +39 -39
  239. {tomwer-1.2.9.dist-info → tomwer-1.3.0a0.dist-info}/RECORD +248 -209
  240. tomwer/resources/gui/icons/esrf_1.svg +0 -307
  241. tomwer/resources/gui/icons/triangle.svg +0 -80
  242. tomwer/synctools/test/test_scanstages.py +0 -162
  243. tomwer/tests/utils/__init__.py +0 -247
  244. tomwer/tests/utils/utilstest.py +0 -220
  245. /tomwer/app/{saaxis.py → multicor.py} +0 -0
  246. /tomwer/app/{sadeltabeta.py → multipag.py} +0 -0
  247. /tomwer/core/process/control/{email.py → emailnotifier.py} +0 -0
  248. /tomwer-1.2.9-py3.11-nspkg.pth → /tomwer-1.3.0a0-py3.11-nspkg.pth +0 -0
  249. {tomwer-1.2.9.dist-info → tomwer-1.3.0a0.dist-info}/LICENSE +0 -0
  250. {tomwer-1.2.9.dist-info → tomwer-1.3.0a0.dist-info}/WHEEL +0 -0
  251. {tomwer-1.2.9.dist-info → tomwer-1.3.0a0.dist-info}/entry_points.txt +0 -0
  252. {tomwer-1.2.9.dist-info → tomwer-1.3.0a0.dist-info}/namespace_packages.txt +0 -0
  253. {tomwer-1.2.9.dist-info → tomwer-1.3.0a0.dist-info}/top_level.txt +0 -0
@@ -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 HDF5TomoScan, HDF5TomoScanIdentifier
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 = HDF5TomoScanIdentifier.from_str(identifier=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 HDF5TomoScan.from_identifier(identifier=identifier)
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 = _oHDF5TomoScan.get_valid_entries(scan_path)
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 HDF5TomoScan(scan=scan_path, entry=entry)
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 HDF5TomoScan.is_tomoscan_dir(scan_path):
172
+ elif NXtomoScan.is_tomoscan_dir(scan_path):
173
173
  scans = []
174
- master_file = HDF5TomoScan.get_master_file(scan_path=scan_path)
175
- entries = HDF5TomoScan.get_valid_entries(master_file)
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(HDF5TomoScan(scan=scan_path, entry=entry, index=None))
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] == HDF5TomoScan._TYPE:
205
- return HDF5TomoScan.from_dict(_dict)
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 HDF5TomoScan.directory_contains_scan(scan_path)
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 MockHDF5
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 = MockHDF5(
41
+ scan = MockNXtomo(
42
42
  scan_path=os.path.join(tmpdir, "scan_test"),
43
43
  n_proj=10,
44
44
  n_ini_proj=10,
@@ -33,9 +33,9 @@ import shutil
33
33
  import tempfile
34
34
  import unittest
35
35
 
36
- from tomwer.core.scan.hdf5scan import HDF5TomoScan
37
- from tomwer.core.utils.scanutils import MockHDF5
38
- from tomwer.tests.utils import UtilsTest
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
- UtilsTest.getH5Dataset(folderID="frm_edftomomill_twoentries.nx"),
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 = HDF5TomoScan(scan=self.dataset_file, entry="entry0000")
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 = MockHDF5(
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 = MockHDF5(
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 = HDF5TomoScan(scan=None, entry="my_entry")
91
+ scan = NXtomoScan(scan=None, entry="my_entry")
90
92
  assert scan.working_directory is None
91
- scan = HDF5TomoScan(scan="/full/path/my_file.sh", entry="my_entry")
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 = HDF5TomoScan(scan="my_file.sh", entry="my_entry")
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 MockHDF5
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 = MockHDF5(scan_path=self.tmp_dir, n_proj=2).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.utils import UtilsTest
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 = UtilsTest.getEDFDataset("test10")
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 tomwer.core.scan.hdf5scan import HDF5TomoScan
35
- from tomwer.core.utils.scanutils import MockHDF5
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 TestMockHDF5(unittest.TestCase):
39
- """Test the MockHDF5 file"""
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 = MockHDF5(scan_path=folder, n_proj=10, n_ini_proj=10)
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 = HDF5TomoScan(mock.scan_path, entry=mock.scan_entry)
49
- self.assertEqual(len(HDF5TomoScan.get_valid_entries(mock.scan_master_file)), 1)
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)
@@ -35,22 +35,29 @@ import unittest
35
35
 
36
36
  import numpy
37
37
 
38
- from tomwer.core import utils
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, MockHDF5
41
- from tomwer.tests.utils import UtilsTest
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 = UtilsTest.getEDFDataset(self.dataSetID)
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(src=UtilsTest.getEDFDataset("test01"), dst=self.sourceT01)
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
- utils.getClosestEnergy(scan=self.sourceS3, refFile=self.S3Ref0000) == 61
71
+ spec_utils.getClosestEnergy(scan=self.sourceS3, refFile=self.S3Ref0000)
72
+ == 61
65
73
  )
66
74
  self.assertTrue(
67
- utils.getClosestEnergy(scan=self.sourceS3, refFile=self.S3Ref0010) == 61
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
- utils.getClosestEnergy(scan=self.sourceS3, refFile=self.S3Ref0000) == 10
83
+ spec_utils.getClosestEnergy(scan=self.sourceS3, refFile=self.S3Ref0000)
84
+ == 10
75
85
  )
76
86
  self.assertTrue(
77
- utils.getClosestEnergy(scan=self.sourceS3, refFile=self.S3Ref0010) == 10
87
+ spec_utils.getClosestEnergy(scan=self.sourceS3, refFile=self.S3Ref0010)
88
+ == 10
78
89
  )
79
90
 
80
91
  def testEnergyFromInfo(self):
81
- self.assertTrue(utils.getClosestEnergy(scan=self.sourceT01, refFile=None) == 19)
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
- utils.getClosestEnergy(scan=self.sourceS3, refFile=self.S3Ref0000) is None
101
+ spec_utils.getClosestEnergy(scan=self.sourceS3, refFile=self.S3Ref0000)
102
+ is None
89
103
  )
90
104
  self.assertTrue(
91
- utils.getClosestEnergy(scan=self.sourceS3, refFile=self.S3Ref0010) is None
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 = UtilsTest.getEDFDataset(self.dataSetID)
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 TestMockHDF5(unittest.TestCase):
258
- """Test MockHDF5 to check that the file produced is valid"""
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 = MockHDF5(
276
+ mock = MockNXtomo(
270
277
  scan_path=self._folder,
271
278
  n_proj=20,
272
279
  n_ini_proj=20,