nabu 2024.1.8.post1__py3-none-any.whl → 2024.1.10__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.
nabu/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
- __version__ = "2024.1.8.post1"
1
+ __version__ = "2024.1.10"
2
2
  __nabu_modules__ = [
3
3
  "app",
4
4
  "cuda",
@@ -580,6 +580,8 @@ class ChunkedPipeline:
580
580
  axis_correction=(-options["axis_correction"] if options["axis_correction"] is not None else None),
581
581
  pixel_size=1,
582
582
  scale_factor=1.0 / options["voxel_size_cm"][0],
583
+ padding_mode=options["padding_type"],
584
+ slice_roi=self.process_config.rec_roi,
583
585
  )
584
586
 
585
587
  self._allocate_recs(*self.process_config.rec_shape, n_slices=n_slices)
@@ -128,7 +128,13 @@ def estimate_required_memory(
128
128
  if process_config.rec_params["method"] == "cone":
129
129
  # In cone-beam reconstruction, need both sinograms and reconstruction inside GPU.
130
130
  # That's big!
131
- total_memory_needed += 2 * data_volume_size
131
+ # Even more if padding is done at the nabu side.
132
+ if rec_config["padding_type"] == "zeros":
133
+ total_memory_needed += 2 * data_volume_size
134
+ else:
135
+ total_memory_needed += (
136
+ data_volume_size + get_next_power(2 * Nx) * Na * Nz * 4 * 4
137
+ ) # no idea why the last *4 is necessary
132
138
 
133
139
  if debug:
134
140
  print(
@@ -1,4 +1,5 @@
1
1
  import numpy as np
2
+ from ..utils import calc_padding_lengths1D, nextpow2
2
3
 
3
4
  try:
4
5
  import astra
@@ -7,6 +8,7 @@ try:
7
8
  except ImportError:
8
9
  __have_astra__ = False
9
10
  from ..cuda.processing import CudaProcessing
11
+ from ..processing.padding_cuda import CudaPadding
10
12
 
11
13
 
12
14
  class ConebeamReconstructor:
@@ -26,6 +28,8 @@ class ConebeamReconstructor:
26
28
  axis_correction=None,
27
29
  pixel_size=None,
28
30
  scale_factor=None,
31
+ padding_mode="zeros",
32
+ slice_roi=None,
29
33
  cuda_options=None,
30
34
  ):
31
35
  """
@@ -53,6 +57,8 @@ class ConebeamReconstructor:
53
57
  relative_z_position: float, optional
54
58
  Position of the central slice of the slab, with respect to the full stack of slices.
55
59
  By default it is set to zero, meaning that the current slab is assumed in the middle of the stack
60
+ axis_correction: array, optional
61
+ Array of the same size as the number of projections. Each corresponds to a horizontal displacement.
56
62
  pixel_size: float or tuple, optional
57
63
  Size of the pixel. Possible options:
58
64
  - Nothing is provided (default): in this case, all lengths are normalized with respect to the pixel size,
@@ -60,7 +66,18 @@ class ConebeamReconstructor:
60
66
  - A scalar number is provided: in this case it is the spacing between two pixels (in each dimension)
61
67
  - A tuple is provided: in this case it is the spacing between two pixels in both dimensions,
62
68
  vertically then horizontally, i.e (detector_spacing_y, detector_spacing_x)
63
-
69
+ scale_factor: float, optional
70
+ Post-reconstruction scale factor.
71
+ padding_mode: str, optional
72
+ How to pad the data before applying FDK. By default this is done by astra with zero-padding.
73
+ If padding_mode is other than "zeros", it will be done by nabu and the padded data is passed to astra
74
+ where no additional padding is done.
75
+ Beware that in its current implementation, this option almost doubles the memory needed.
76
+ slice_roi:
77
+ Whether to reconstruct only a region of interest for each horizontal slice.
78
+ This parameter must be in the form (start_x, end_x, start_y, end_y) with no negative values.
79
+ Note that the current implementation just crops the final reconstructed volume,
80
+ i.e there is no speed or memory benefit.
64
81
 
65
82
  Notes
66
83
  ------
@@ -91,8 +108,9 @@ class ConebeamReconstructor:
91
108
  """
92
109
  self._init_cuda(cuda_options)
93
110
  self.scale_factor = scale_factor
111
+ self._set_sino_shape(sinos_shape)
112
+ self._init_padding(padding_mode)
94
113
  self._init_geometry(
95
- sinos_shape,
96
114
  source_origin_dist,
97
115
  origin_detector_dist,
98
116
  pixel_size,
@@ -101,6 +119,7 @@ class ConebeamReconstructor:
101
119
  rot_center,
102
120
  relative_z_position,
103
121
  axis_correction,
122
+ slice_roi,
104
123
  )
105
124
  self._alg_id = None
106
125
  self._vol_id = None
@@ -116,6 +135,20 @@ class ConebeamReconstructor:
116
135
  self.sinos_shape = sinos_shape
117
136
  self.n_sinos, self.n_angles, self.prj_width = sinos_shape
118
137
 
138
+ def _init_padding(self, padding_mode):
139
+ self._pad_data = False
140
+ self.padding_mode = padding_mode
141
+ if padding_mode == "zeros":
142
+ return
143
+ self._pad_data = True
144
+ n_x = self.prj_width
145
+ x_pad_lens = calc_padding_lengths1D(n_x, nextpow2(n_x * 2))
146
+ self.padder = CudaPadding(
147
+ (self.n_angles, n_x), ((0, 0),) + (x_pad_lens,), mode=padding_mode, cuda_options={"ctx": self.cuda.ctx}
148
+ )
149
+ self._sinos_padded_shape = (self.n_sinos, self.n_angles, self.padder.padded_shape[-1])
150
+ self.prj_width = self.padder.padded_shape[-1] # will impact translations
151
+
119
152
  def _set_pixel_size(self, pixel_size):
120
153
  if pixel_size is None:
121
154
  det_spacing_y = det_spacing_x = 1
@@ -127,9 +160,32 @@ class ConebeamReconstructor:
127
160
  self._det_spacing_y = det_spacing_y
128
161
  self._det_spacing_x = det_spacing_x
129
162
 
163
+ def _set_slice_roi(self, slice_roi):
164
+ self.slice_roi = slice_roi
165
+ self._vol_geom_n_x = self.n_x
166
+ self._vol_geom_n_y = self.n_y
167
+ self._crop_data = True
168
+ if slice_roi is None:
169
+ return
170
+ start_x, end_x, start_y, end_y = slice_roi
171
+ if roi_is_centered(self.volume_shape[1:], (slice(start_y, end_y), slice(start_x, end_x))):
172
+ # For FDK, astra can only reconstruct subregion centered around the origin
173
+ self._vol_geom_n_x = self.n_x - start_x * 2
174
+ self._vol_geom_n_y = self.n_y - start_y * 2
175
+ else:
176
+ # self._crop_data = True
177
+ # self._output_cropped_shape = (
178
+ # self.n_z,
179
+ # np.arange(self.n_y)[start_x:end_x].size,
180
+ # np.arange(self.n_x)[start_y:end_y].size,
181
+ # )
182
+ raise NotImplementedError(
183
+ "Cone-beam geometry supports only slice_roi centered around origin (got slice_roi=%s with n_x=%d, n_y=%d)"
184
+ % (str(slice_roi), self.n_x, self.n_y)
185
+ )
186
+
130
187
  def _init_geometry(
131
188
  self,
132
- sinos_shape,
133
189
  source_origin_dist,
134
190
  origin_detector_dist,
135
191
  pixel_size,
@@ -138,8 +194,8 @@ class ConebeamReconstructor:
138
194
  rot_center,
139
195
  relative_z_position,
140
196
  axis_correction,
197
+ slice_roi,
141
198
  ):
142
- self._set_sino_shape(sinos_shape)
143
199
  if angles is None:
144
200
  self.angles = np.linspace(0, 2 * np.pi, self.n_angles, endpoint=True)
145
201
  else:
@@ -151,12 +207,13 @@ class ConebeamReconstructor:
151
207
  self.source_origin_dist = source_origin_dist
152
208
  self.origin_detector_dist = origin_detector_dist
153
209
  self.magnification = 1 + origin_detector_dist / source_origin_dist
154
- self.vol_geom = astra.create_vol_geom(self.n_y, self.n_x, self.n_z)
210
+ self._set_slice_roi(slice_roi)
211
+ self.vol_geom = astra.create_vol_geom(self._vol_geom_n_y, self._vol_geom_n_x, self.n_z)
155
212
  self.vol_shape = astra.geom_size(self.vol_geom)
156
213
  self._cor_shift = 0.0
157
214
  self.rot_center = rot_center
158
215
  if rot_center is not None:
159
- self._cor_shift = (self.prj_width - 1) / 2.0 - rot_center
216
+ self._cor_shift = (self.sinos_shape[-1] - 1) / 2.0 - rot_center
160
217
  self._set_pixel_size(pixel_size)
161
218
  self._axis_corrections = axis_correction
162
219
  self._create_astra_proj_geometry(relative_z_position)
@@ -200,7 +257,8 @@ class ConebeamReconstructor:
200
257
 
201
258
  def _set_output(self, volume):
202
259
  if volume is not None:
203
- self.cuda.check_array(volume, self.vol_shape)
260
+ expected_shape = self.vol_shape # if not (self._crop_data) else self._output_cropped_shape
261
+ self.cuda.check_array(volume, expected_shape)
204
262
  self.cuda.set_array("output", volume)
205
263
  if volume is None:
206
264
  self.cuda.allocate_array("output", self.vol_shape)
@@ -215,9 +273,16 @@ class ConebeamReconstructor:
215
273
  # TODO don't create new link/proj_id if ptr is the same ?
216
274
  # But it seems Astra modifies the input sinogram while doing FDK, so this might be not relevant
217
275
  d_sinos = self.cuda.get_array("sinos")
276
+
277
+ if self._pad_data:
278
+ sinos_padded = self.cuda.allocate_array("sinos_padded", self._sinos_padded_shape, dtype="f")
279
+ for i in range(self.n_sinos):
280
+ self.padder.pad(self.cuda.sinos[i], output=sinos_padded[i])
281
+ d_sinos = sinos_padded
282
+
218
283
  # self._proj_data_link = astra.data3d.GPULink(d_sinos.ptr, self.prj_width, self.n_angles, self.n_z, sinos.strides[-2])
219
284
  self._proj_data_link = astra.data3d.GPULink(
220
- d_sinos.ptr, self.prj_width, self.n_angles, self.n_sinos, sinos.strides[-2]
285
+ d_sinos.ptr, self.prj_width, self.n_angles, self.n_sinos, d_sinos.strides[-2]
221
286
  )
222
287
  self._proj_id = astra.data3d.link("-sino", self.proj_geom, self._proj_data_link)
223
288
 
@@ -250,13 +315,33 @@ class ConebeamReconstructor:
250
315
  result = result.get()
251
316
  if self.scale_factor is not None:
252
317
  result *= np.float32(self.scale_factor) # in-place for pycuda
318
+ # if self._crop_data:
319
+ # self.cuda.allocate_array("output_cropped", self._output_cropped_shape, dtype=np.float32)
320
+ # for i in range(self.n_z):
321
+ # output
253
322
  self.cuda.recover_arrays_references(["sinos", "output"])
254
323
  return result
255
324
 
256
325
  def __del__(self):
257
- if self._alg_id is not None:
326
+ if getattr(self, "_alg_id", None) is not None:
258
327
  astra.algorithm.delete(self._alg_id)
259
- if self._vol_id is not None:
328
+ if getattr(self, "_vol_id", None) is not None:
260
329
  astra.data3d.delete(self._vol_id)
261
- if self._proj_id is not None:
330
+ if getattr(self, "_proj_id", None) is not None:
262
331
  astra.data3d.delete(self._proj_id)
332
+
333
+
334
+ def selection_is_centered(size, start, stop):
335
+ """
336
+ Return True if (start, stop) define a selection that is centered on the middle of the array.
337
+ """
338
+ if stop > 0:
339
+ stop -= size
340
+ return stop == -start
341
+
342
+
343
+ def roi_is_centered(shape, slice_):
344
+ """
345
+ Return True if "slice_" define a selection that is centered on the middle of the array.
346
+ """
347
+ return all([selection_is_centered(shp, s.start, s.stop) for shp, s in zip(shape, slice_)])
@@ -297,9 +297,100 @@ class TestCone:
297
297
  # plt.legend([shift_type])
298
298
  # plt.show()
299
299
 
300
+ def test_padding_mode(self):
301
+ n_z = n_y = n_x = 256
302
+ n_a = 500
303
+ src_orig_dist = 1000
304
+ orig_det_dist = 50
305
+
306
+ volume, cone_data = generate_hollow_cube_cone_sinograms(
307
+ vol_shape=(n_z, n_y, n_x),
308
+ n_angles=n_a,
309
+ src_orig_dist=src_orig_dist,
310
+ orig_det_dist=orig_det_dist,
311
+ apply_filter=False,
312
+ )
313
+ reconstructor_args = [
314
+ cone_data.shape,
315
+ src_orig_dist,
316
+ orig_det_dist,
317
+ ]
318
+ reconstructor_kwargs = {
319
+ "volume_shape": volume.shape,
320
+ "cuda_options": {"ctx": self.ctx},
321
+ }
322
+ cone_reconstructor_zero_padding = ConebeamReconstructor(*reconstructor_args, **reconstructor_kwargs)
323
+ rec_z = cone_reconstructor_zero_padding.reconstruct(cone_data)
324
+
325
+ for padding_mode in ["edges"]:
326
+ cone_reconstructor = ConebeamReconstructor(
327
+ *reconstructor_args, padding_mode=padding_mode, **reconstructor_kwargs
328
+ )
329
+ rec = cone_reconstructor.reconstruct(cone_data)
330
+
331
+ metric = lambda img: np.max(np.abs(clip_circle(img, radius=int(0.85 * 128))))
332
+ error_profile = np.array([metric(rec[i] - rec_z[i]) for i in range(n_z)])
333
+ assert error_profile.max() < 3e-2, "Max error for padding=%s is too high" % padding_mode
334
+
335
+ # import matplotlib.pyplot as plt
336
+ # plt.figure()
337
+ # plt.plot(np.arange(n_z), error_profile)
338
+ # plt.legend([padding_mode])
339
+ # plt.show()
340
+
341
+ def test_roi(self):
342
+ n_z = n_y = n_x = 256
343
+ n_a = 500
344
+ src_orig_dist = 1000
345
+ orig_det_dist = 50
346
+
347
+ volume, cone_data = generate_hollow_cube_cone_sinograms(
348
+ vol_shape=(n_z, n_y, n_x),
349
+ n_angles=n_a,
350
+ src_orig_dist=src_orig_dist,
351
+ orig_det_dist=orig_det_dist,
352
+ apply_filter=False,
353
+ rot_center_shift=10,
354
+ )
355
+
356
+ reconstructor_args = [
357
+ cone_data.shape,
358
+ src_orig_dist,
359
+ orig_det_dist,
360
+ ]
361
+ reconstructor_kwargs = {
362
+ "volume_shape": volume.shape,
363
+ "rot_center": (n_x - 1) / 2 + 10,
364
+ "cuda_options": {"ctx": self.ctx},
365
+ }
366
+ cone_reconstructor_full = ConebeamReconstructor(*reconstructor_args, **reconstructor_kwargs)
367
+ ref = cone_reconstructor_full.reconstruct(cone_data)
368
+
369
+ # roi is in the form (start_x, end_x, start_y, end_y)
370
+ for roi in ((20, -20, 10, -10), (0, n_x, 0, n_y), (15, -15, 15, -15)):
371
+ # convert negative indices
372
+ start_x, end_x, start_y, end_y = roi
373
+ if start_y < 0:
374
+ start_y += n_y
375
+ if start_x < 0:
376
+ start_x += n_x
377
+
378
+ cone_reconstructor = ConebeamReconstructor(*reconstructor_args, slice_roi=roi, **reconstructor_kwargs)
379
+ rec = cone_reconstructor.reconstruct(cone_data)
380
+
381
+ assert np.allclose(rec, ref[:, roi[2] : roi[3], roi[0] : roi[1]]), "Something wrong with roi=%s" % (
382
+ str(roi)
383
+ )
384
+
300
385
 
301
386
  def generate_hollow_cube_cone_sinograms(
302
- vol_shape, n_angles, src_orig_dist, orig_det_dist, prj_width=None, apply_filter=True
387
+ vol_shape,
388
+ n_angles,
389
+ src_orig_dist,
390
+ orig_det_dist,
391
+ prj_width=None,
392
+ apply_filter=True,
393
+ rot_center_shift=None,
303
394
  ):
304
395
  # Adapted from Astra toolbox python samples
305
396
 
@@ -311,6 +402,8 @@ def generate_hollow_cube_cone_sinograms(
311
402
  angles = np.linspace(0, 2 * np.pi, n_angles, True)
312
403
 
313
404
  proj_geom = astra.create_proj_geom("cone", 1.0, 1.0, prj_width, prj_width, angles, src_orig_dist, orig_det_dist)
405
+ if rot_center_shift is not None:
406
+ proj_geom = astra.geom_postalignment(proj_geom, (-rot_center_shift, 0))
314
407
  magnification = 1 + orig_det_dist / src_orig_dist
315
408
 
316
409
  # hollow cube
@@ -1191,12 +1191,30 @@ class PreProcessZStitcher(ZStitcher):
1191
1191
  # handle sample
1192
1192
  n_frames = n_proj
1193
1193
  if False not in [isinstance(scan, NXtomoScan) for scan in self.z_serie]:
1194
+
1195
+ def get_sample_translation_for_projs(scan: NXtomoScan, attr):
1196
+ values = numpy.array(getattr(scan, attr))
1197
+ mask = scan.image_key_control == ImageKey.PROJECTION.value
1198
+ return values[mask]
1199
+
1194
1200
  # we consider the new x, y and z position to be at the center of the one created
1195
- x_translation = [scan.x_translation for scan in self.z_serie if scan.x_translation is not None]
1201
+ x_translation = [
1202
+ get_sample_translation_for_projs(scan, "x_translation")
1203
+ for scan in self.z_serie
1204
+ if scan.x_translation is not None
1205
+ ]
1196
1206
  nx_tomo.sample.x_translation = [numpy.asarray(x_translation).mean()] * n_frames
1197
- y_translation = [scan.y_translation for scan in self.z_serie if scan.y_translation is not None]
1207
+ y_translation = [
1208
+ get_sample_translation_for_projs(scan, "y_translation")
1209
+ for scan in self.z_serie
1210
+ if scan.y_translation is not None
1211
+ ]
1198
1212
  nx_tomo.sample.y_translation = [numpy.asarray(y_translation).mean()] * n_frames
1199
- z_translation = [scan.z_translation for scan in self.z_serie if scan.z_translation is not None]
1213
+ z_translation = [
1214
+ get_sample_translation_for_projs(scan, "z_translation")
1215
+ for scan in self.z_serie
1216
+ if scan.z_translation is not None
1217
+ ]
1200
1218
  nx_tomo.sample.z_translation = [numpy.asarray(z_translation).mean()] * n_frames
1201
1219
 
1202
1220
  nx_tomo.sample.name = self.z_serie[0].sample_name
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nabu
3
- Version: 2024.1.8.post1
3
+ Version: 2024.1.10
4
4
  Summary: Nabu - Tomography software
5
5
  Author-email: Pierre Paleo <pierre.paleo@esrf.fr>, Henri Payno <henri.payno@esrf.fr>, Alessandro Mirone <mirone@esrf.fr>, Jérôme Lesaint <jerome.lesaint@esrf.fr>
6
6
  Maintainer-email: Pierre Paleo <pierre.paleo@esrf.fr>
@@ -49,28 +49,28 @@ Classifier: Topic :: Scientific/Engineering :: Medical Science Apps.
49
49
  Requires-Python: >=3.7
50
50
  Description-Content-Type: text/markdown
51
51
  License-File: LICENSE
52
- Requires-Dist: numpy <2,>1.9.0
52
+ Requires-Dist: numpy<2,>1.9.0
53
53
  Requires-Dist: scipy
54
- Requires-Dist: h5py >=3.0
55
- Requires-Dist: silx >=0.15.0
56
- Requires-Dist: tomoscan >=2.0.4
54
+ Requires-Dist: h5py>=3.0
55
+ Requires-Dist: silx>=0.15.0
56
+ Requires-Dist: tomoscan>=2.0.4
57
57
  Requires-Dist: psutil
58
58
  Requires-Dist: pytest
59
59
  Requires-Dist: tifffile
60
60
  Provides-Extra: doc
61
- Requires-Dist: sphinx ; extra == 'doc'
62
- Requires-Dist: cloud-sptheme ; extra == 'doc'
63
- Requires-Dist: myst-parser ; extra == 'doc'
64
- Requires-Dist: nbsphinx ; extra == 'doc'
61
+ Requires-Dist: sphinx; extra == "doc"
62
+ Requires-Dist: cloud-sptheme; extra == "doc"
63
+ Requires-Dist: myst-parser; extra == "doc"
64
+ Requires-Dist: nbsphinx; extra == "doc"
65
65
  Provides-Extra: full
66
- Requires-Dist: scikit-image ; extra == 'full'
67
- Requires-Dist: PyWavelets ; extra == 'full'
68
- Requires-Dist: glymur ; extra == 'full'
69
- Requires-Dist: pycuda <2024.1.1 ; extra == 'full'
70
- Requires-Dist: scikit-cuda ; extra == 'full'
71
- Requires-Dist: pycudwt ; extra == 'full'
72
- Requires-Dist: sluurp >=0.3 ; extra == 'full'
73
- Requires-Dist: pyvkfft ; extra == 'full'
66
+ Requires-Dist: scikit-image; extra == "full"
67
+ Requires-Dist: PyWavelets; extra == "full"
68
+ Requires-Dist: glymur; extra == "full"
69
+ Requires-Dist: pycuda<2024.1.1; extra == "full"
70
+ Requires-Dist: scikit-cuda; extra == "full"
71
+ Requires-Dist: pycudwt; extra == "full"
72
+ Requires-Dist: sluurp>=0.3; extra == "full"
73
+ Requires-Dist: pyvkfft; extra == "full"
74
74
 
75
75
  # Nabu
76
76
 
@@ -1,7 +1,7 @@
1
1
  doc/conf.py,sha256=3xtCarCHrXPr50GbeRDuH-o3Jzojw7mpr7vpGfZPLAE,3787
2
2
  doc/create_conf_doc.py,sha256=IVOdP70KvbW9WS_UQu3Iyd0YfS60E2fJ5IDtQ_s4cDw,1143
3
3
  doc/get_mathjax.py,sha256=VIvKRCdDuF2VoY8JD3mSey9XX13AZMmwTJBHdt1tUs4,1012
4
- nabu/__init__.py,sha256=a500qUas56fWNfHAyhTfYfk9_vKjLbDgkoE1a-bLz_E,276
4
+ nabu/__init__.py,sha256=4kysNldwr4sj73bjmoKdGzQ-6tc8gz-0FLrOb1apyLk,271
5
5
  nabu/tests.py,sha256=cew9OY2uTyncHI_HM32W8CP6B1GTGKaOW65XtMEqs7o,1417
6
6
  nabu/testutils.py,sha256=qqtGgkIhpOpXhgeoXlqCb91Rx-JlI4ALaDF6nt8YRRk,13298
7
7
  nabu/utils.py,sha256=w-xfRb6TFQpS-tao6nlvfmr962pmeec-WH1GltSUCrk,23767
@@ -31,7 +31,6 @@ nabu/app/shrink_dataset.py,sha256=P9dorO0Q-gPAWgSHyZi3XQp4jkMTJacDYzNvJY4oh98,35
31
31
  nabu/app/stitching.py,sha256=Ibp1oVokLVMz-VX762j1C0E88Di0YJvRt-b8NjGoe7g,3310
32
32
  nabu/app/utils.py,sha256=XUBRWDmth4i3BZHd27rfarFAUP7OEcsMeVmDJ6T4EXA,1178
33
33
  nabu/app/validator.py,sha256=IR-DcUV5h1Fc5CChBfBIaglrGpfKNICX7tGirAroMiw,3368
34
- nabu/app/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
34
  nabu/app/tests/test_reduce_dark_flat.py,sha256=T-_zyzD0-f2c5Z-tlzmRF5p3vPtyL2RFb-D5fIYYEoM,2641
36
35
  nabu/cuda/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
36
  nabu/cuda/convolution.py,sha256=n8KsJ7IZdPOs_K5QZC6qblnOvIKYwxtdt03oNa0GiMU,241
@@ -136,9 +135,9 @@ nabu/pipeline/processconfig.py,sha256=O0phgvfWtL9bg3_GE3cw9MZXS8PUy8z2rzhpoqP9U8
136
135
  nabu/pipeline/utils.py,sha256=NONAgBfTfUYvBNfoTqD33MAYaPZyCJL10SnR6B0lLec,3462
137
136
  nabu/pipeline/writer.py,sha256=0ts40VNN3RiRURvZ2gNqsigsAJuwcjnYF4RJ15qaMpI,7558
138
137
  nabu/pipeline/fullfield/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
139
- nabu/pipeline/fullfield/chunked.py,sha256=2kDbDtg86H8edLjNp-TYwQMiTZvMx0UJ_3Wbkaet4Fo,37179
138
+ nabu/pipeline/fullfield/chunked.py,sha256=O6Wnw6B1nhA2yOdbOxqpEAdGnNdDGRYI2z0bBCB-yk0,37288
140
139
  nabu/pipeline/fullfield/chunked_cuda.py,sha256=aGzjY8MX6OL8auEj6Y0RfOGCmFnczsdfj6-8Net5AbQ,5645
141
- nabu/pipeline/fullfield/computations.py,sha256=VpIURVXh8EpNSfait_AIFM4Ci-GK_546Wkb-Wn9r31Y,9935
140
+ nabu/pipeline/fullfield/computations.py,sha256=eWbqtlXWKgcmCsKL1GgtaTVXBScY6MSrmtLd8h5dLng,10251
142
141
  nabu/pipeline/fullfield/dataset_validator.py,sha256=8B2lB9j7elF_NmOOOyr8UADVfC15Oofzy2AyWoPufQM,3265
143
142
  nabu/pipeline/fullfield/nabu_config.py,sha256=a0mMoLkvlvHgX6RmUS1m1UhJS-XB3O6wBCnkNoI90Cs,30358
144
143
  nabu/pipeline/fullfield/processconfig.py,sha256=qSVeUvpt9BS2kR3zNk95_MGoLV4idiSJyYHlAPXbgTs,36405
@@ -223,7 +222,7 @@ nabu/processing/tests/test_rotation.py,sha256=vedRXV9RePJywBKoyBkGANP1dhZCjphbYO
223
222
  nabu/processing/tests/test_transpose.py,sha256=hTG17wTaB5Wv6twbW3ZFhBv6BYfqJY7DTQPoO0-KdkM,2760
224
223
  nabu/processing/tests/test_unsharp.py,sha256=R3ovbwDDp3ccy2A8t6CcUVELXRWkED5EnQdN2FQOfQM,4391
225
224
  nabu/reconstruction/__init__.py,sha256=EmKVvx_-FJvzJngG4ielIC7FhMCpI1Waaflg_lF44tk,163
226
- nabu/reconstruction/cone.py,sha256=ET0xCoFRt5oD7IpzHNmlm-bX4eanBenH186VGTgLAj0,12159
225
+ nabu/reconstruction/cone.py,sha256=1Wq2XJuVTjHTjTsUng1Z9VE8IPV_4xLGkD6TtBGzHrs,16234
227
226
  nabu/reconstruction/fbp.py,sha256=5GB7XCnxftSHq1ZBLjWi-7OTiyCU4qe-M4EPzvsoxLg,4829
228
227
  nabu/reconstruction/fbp_base.py,sha256=igY--_GiKGAcephOU1I8O1GjVcryJnReyywlgtROXW4,16833
229
228
  nabu/reconstruction/fbp_opencl.py,sha256=coEGLq65PCuvWnhAbIyLPHACkWjMB0XOceMp9ZIDWtc,3274
@@ -239,7 +238,7 @@ nabu/reconstruction/sinogram.py,sha256=KTSGP_JJABf4Yr9l628HPbyWsBnpbnyGKyPEq3ZrP
239
238
  nabu/reconstruction/sinogram_cuda.py,sha256=wS84AIy3T00d1kTtuJOQmA3hktbDVs4ybwB9haiBcoY,10623
240
239
  nabu/reconstruction/sinogram_opencl.py,sha256=p793N26VknU8KIZLtDgFY6HNx0TylemZ1YL4WKD3fHs,1403
241
240
  nabu/reconstruction/tests/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
242
- nabu/reconstruction/tests/test_cone.py,sha256=oik4A75iJlvEACj63wpcxX1BfihHChMa1KAi_KbeRK0,14312
241
+ nabu/reconstruction/tests/test_cone.py,sha256=88n0vKrKJg26DbvH3ZtHtmOtqHFkjJxmELlBLLL5qMA,17594
243
242
  nabu/reconstruction/tests/test_deringer.py,sha256=C5wj6RNzmpt_Cry4fonC8KXWvgPpcXfRbG8Bex_30S4,8380
244
243
  nabu/reconstruction/tests/test_fbp.py,sha256=p80zPCZkgJpERpqG5HHfbtbHBeqJUT8WY-q6FXOJJ7M,10053
245
244
  nabu/reconstruction/tests/test_filtering.py,sha256=PFJLQMDBQo-UuS_CfKrWZ_DdHarmVlcbsiZ_kmToWXY,4782
@@ -272,7 +271,7 @@ nabu/stitching/overlap.py,sha256=YbPon4_n4lT678F1aFSHx-ButcSYYqlBFjDqfNA77T4,156
272
271
  nabu/stitching/sample_normalization.py,sha256=_radin_wxnuD3MMmZNAOKA__aPa2z3ss4TFbZeocpXc,2069
273
272
  nabu/stitching/slurm_utils.py,sha256=sZ-VQPh_YlJ1Lkh7ap8qxII0rBpZryMyoxE5Xn557t8,8906
274
273
  nabu/stitching/utils.py,sha256=kMn2JEMDhcBQMweSlM0rUd-037H7iNUURTFMhXOTzC8,23651
275
- nabu/stitching/z_stitching.py,sha256=_DnPn4einJgzjqYu4u-LSwLAOoDgp5Jdu7iTYdsx9bw,103399
274
+ nabu/stitching/z_stitching.py,sha256=E7qRRkayyAoJOAu94eIziVVLdz_6ecoBe9u1twbaVH4,103941
276
275
  nabu/stitching/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
277
276
  nabu/stitching/tests/test_alignment.py,sha256=MACak1ILOr8nRKeT0mWfMd-ZvhCl3SWjjcp6GjRbITc,2735
278
277
  nabu/stitching/tests/test_config.py,sha256=ttWuVB9Y_MM3_wGdKbcbYi_PG3vN87cL7o5zKsMzn9g,8490
@@ -288,9 +287,9 @@ nabu/thirdparty/pore3d_deringer_munch.py,sha256=o4bisnFc-wMjuohWBT8wgWmfNehPQGtC
288
287
  nabu/thirdparty/tomocupy_remove_stripe.py,sha256=VgXHr2tzTAAGZix5pwhFfbPxj4tt3yXBcjCPNQSLPAg,22810
289
288
  nabu/thirdparty/tomopy_phase.py,sha256=hK4oPpkogLOhv23XzzEXQY2u3r8fJvASY_bINVs6ERE,8634
290
289
  nabu/thirdparty/tomwer_load_flats_darks.py,sha256=ZNoVAinUb_wGYbfvs_4BVnWsjsQmNxSvCh1bWhR2WWg,5611
291
- nabu-2024.1.8.post1.dist-info/LICENSE,sha256=1eAIPSnEsnSFNUODnLtNtQTs76exG3ZxJ1DJR6zoUBA,1066
292
- nabu-2024.1.8.post1.dist-info/METADATA,sha256=ucBXicrROOJGGiOF06Zau08R8rykepXbor0Jg6YGaGY,5243
293
- nabu-2024.1.8.post1.dist-info/WHEEL,sha256=5sUXSg9e4bi7lTLOHcm6QEYwO5TIF1TNbTSVFVjcJcc,92
294
- nabu-2024.1.8.post1.dist-info/entry_points.txt,sha256=cJKGkBeykVL7uK3E4R0RLRqMXifTL2qdO573syPAvJc,1288
295
- nabu-2024.1.8.post1.dist-info/top_level.txt,sha256=fsm_N3eXLRZk2QXF9OSKPNDPFXOz8FAQjHh5avT3dok,9
296
- nabu-2024.1.8.post1.dist-info/RECORD,,
290
+ nabu-2024.1.10.dist-info/LICENSE,sha256=1eAIPSnEsnSFNUODnLtNtQTs76exG3ZxJ1DJR6zoUBA,1066
291
+ nabu-2024.1.10.dist-info/METADATA,sha256=AlQVC7OyK98VQa34vZGMJZLDz0w-Ho24nUOaTpucrvo,5220
292
+ nabu-2024.1.10.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
293
+ nabu-2024.1.10.dist-info/entry_points.txt,sha256=cJKGkBeykVL7uK3E4R0RLRqMXifTL2qdO573syPAvJc,1288
294
+ nabu-2024.1.10.dist-info/top_level.txt,sha256=fsm_N3eXLRZk2QXF9OSKPNDPFXOz8FAQjHh5avT3dok,9
295
+ nabu-2024.1.10.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.41.1)
2
+ Generator: setuptools (75.5.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
File without changes