nabu 2024.2.9__py3-none-any.whl → 2024.2.11__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 +1 -1
- nabu/pipeline/fullfield/chunked.py +1 -1
- nabu/reconstruction/rings_cuda.py +41 -13
- nabu/stitching/config.py +1 -0
- nabu/stitching/stitcher/dumper/__init__.py +1 -0
- nabu/stitching/stitcher/dumper/postprocessing.py +105 -1
- nabu/stitching/stitcher/post_processing.py +14 -4
- nabu/stitching/stitcher/pre_processing.py +1 -1
- nabu/stitching/stitcher/single_axis.py +7 -6
- nabu/stitching/stitcher/z_stitcher.py +8 -4
- {nabu-2024.2.9.dist-info → nabu-2024.2.11.dist-info}/METADATA +3 -2
- {nabu-2024.2.9.dist-info → nabu-2024.2.11.dist-info}/RECORD +16 -17
- {nabu-2024.2.9.dist-info → nabu-2024.2.11.dist-info}/WHEEL +1 -1
- nabu/resources/tests/test_extract.py +0 -9
- {nabu-2024.2.9.dist-info → nabu-2024.2.11.dist-info}/entry_points.txt +0 -0
- {nabu-2024.2.9.dist-info → nabu-2024.2.11.dist-info/licenses}/LICENSE +0 -0
- {nabu-2024.2.9.dist-info → nabu-2024.2.11.dist-info}/top_level.txt +0 -0
nabu/__init__.py
CHANGED
@@ -781,7 +781,7 @@ class ChunkedPipeline:
|
|
781
781
|
@pipeline_step("sino_deringer", "Removing rings on sinograms")
|
782
782
|
def _destripe_sinos(self):
|
783
783
|
sinos = np.rollaxis(self.radios, 1, 0) # view
|
784
|
-
self.sino_deringer.remove_rings(sinos)
|
784
|
+
self.sino_deringer.remove_rings(sinos)
|
785
785
|
|
786
786
|
@pipeline_step("reconstruction", "Reconstruction")
|
787
787
|
def _reconstruct(self):
|
@@ -264,13 +264,7 @@ class CudaSinoMeanDeringer(SinoMeanDeringer):
|
|
264
264
|
filename=get_cuda_srcfile("normalization.cu"),
|
265
265
|
signature="PPiii",
|
266
266
|
)
|
267
|
-
self.
|
268
|
-
self._mean_kernel_grid = [updiv(a, b) for a, b in zip(self.sinos_shape[::-1], self._mean_kernel_block)]
|
269
|
-
self._mean_kernel_args = [self.d_sino_profile, np.int32(self.n_x), np.int32(self.n_angles), np.int32(self.n_z)]
|
270
|
-
self._mean_kernel_kwargs = {
|
271
|
-
"grid": self._mean_kernel_grid,
|
272
|
-
"block": self._mean_kernel_block,
|
273
|
-
}
|
267
|
+
self._set_kernel_args_normalization()
|
274
268
|
|
275
269
|
self._op_kernel = self.processing.kernel(
|
276
270
|
"inplace_generic_op_3Dby1D",
|
@@ -278,9 +272,25 @@ class CudaSinoMeanDeringer(SinoMeanDeringer):
|
|
278
272
|
signature="PPiii",
|
279
273
|
options=["-DGENERIC_OP=%d" % (3 if self.mode == "divide" else 1)],
|
280
274
|
)
|
281
|
-
self.
|
282
|
-
|
283
|
-
|
275
|
+
self._set_kernel_args_mult()
|
276
|
+
|
277
|
+
def _set_kernel_args_normalization(self, blk_z=32, n_z=None):
|
278
|
+
n_z = n_z or self.n_z
|
279
|
+
self._mean_kernel_block = (32, 1, blk_z)
|
280
|
+
sinos_shape_xyz = self.sinos_shape[1:][::-1] + (n_z,)
|
281
|
+
self._mean_kernel_grid = [updiv(a, b) for a, b in zip(sinos_shape_xyz, self._mean_kernel_block)]
|
282
|
+
self._mean_kernel_args = [self.d_sino_profile, np.int32(self.n_x), np.int32(self.n_angles), np.int32(n_z)]
|
283
|
+
self._mean_kernel_kwargs = {
|
284
|
+
"grid": self._mean_kernel_grid,
|
285
|
+
"block": self._mean_kernel_block,
|
286
|
+
}
|
287
|
+
|
288
|
+
def _set_kernel_args_mult(self, blk_z=4, n_z=None):
|
289
|
+
n_z = n_z or self.n_z
|
290
|
+
self._op_kernel_block = (16, 16, blk_z)
|
291
|
+
sinos_shape_xyz = self.sinos_shape[1:][::-1] + (n_z,)
|
292
|
+
self._op_kernel_grid = [updiv(a, b) for a, b in zip(sinos_shape_xyz, self._op_kernel_block)]
|
293
|
+
self._op_kernel_args = [self.d_sino_profile, np.int32(self.n_x), np.int32(self.n_angles), np.int32(n_z)]
|
284
294
|
self._op_kernel_kwargs = {
|
285
295
|
"grid": self._op_kernel_grid,
|
286
296
|
"block": self._op_kernel_block,
|
@@ -315,23 +325,41 @@ class CudaSinoMeanDeringer(SinoMeanDeringer):
|
|
315
325
|
self.d_sino_profile[:] = sino_profile_p[self._pad_left : -self._pad_right]
|
316
326
|
return self.d_sino_profile
|
317
327
|
|
328
|
+
def _remove_rings_sino(self, d_sino):
|
329
|
+
self._mean_kernel(d_sino, *self._mean_kernel_args, **self._mean_kernel_kwargs)
|
330
|
+
self._apply_filter(self.d_sino_profile)
|
331
|
+
self._op_kernel(d_sino, *self._op_kernel_args, **self._op_kernel_kwargs)
|
332
|
+
|
318
333
|
def remove_rings_sinogram(self, sino, output=None):
|
319
334
|
#
|
320
335
|
if output is not None:
|
321
336
|
raise NotImplementedError
|
322
337
|
#
|
323
338
|
if not (sino.flags.c_contiguous):
|
339
|
+
# If the sinogram (or stack of sinogram) is not C-Contiguous, we'll proceed by looping over each
|
340
|
+
# C-Contiguous sinogram
|
324
341
|
d_sino = self.processing.allocate_array("d_sino", sino.shape, np.float32)
|
325
342
|
d_sino[:] = sino[:]
|
326
343
|
else:
|
327
344
|
d_sino = sino
|
328
|
-
self.
|
329
|
-
self._apply_filter(self.d_sino_profile)
|
330
|
-
self._op_kernel(d_sino, *self._op_kernel_args, **self._op_kernel_kwargs)
|
345
|
+
self._remove_rings_sino(d_sino)
|
331
346
|
if not (sino.flags.c_contiguous):
|
332
347
|
sino[:] = self.processing.d_sino[:]
|
333
348
|
return sino
|
334
349
|
|
335
350
|
def remove_rings_sinograms(self, sinograms):
|
351
|
+
if sinograms.flags.c_contiguous:
|
352
|
+
self._remove_rings_sino(sinograms)
|
353
|
+
return sinograms
|
354
|
+
|
355
|
+
# If the stack of sinograms is not C-Contiguous, we have to proceed by looping over each C-Contiguous sinogram
|
356
|
+
# (i.e don't copy the entire stack, just one sinogram at a time)
|
357
|
+
self._set_kernel_args_normalization(blk_z=1, n_z=1)
|
358
|
+
self._set_kernel_args_mult(blk_z=1, n_z=1)
|
336
359
|
for i in range(sinograms.shape[0]):
|
337
360
|
self.remove_rings_sinogram(sinograms[i])
|
361
|
+
self._set_kernel_args_normalization()
|
362
|
+
self._set_kernel_args_mult()
|
363
|
+
return sinograms
|
364
|
+
|
365
|
+
remove_rings = remove_rings_sinograms
|
nabu/stitching/config.py
CHANGED
@@ -411,6 +411,7 @@ class NormalizationBySample:
|
|
411
411
|
@dataclass
|
412
412
|
class SlurmConfig:
|
413
413
|
"configuration for slurm jobs"
|
414
|
+
|
414
415
|
partition: str = "" # note: must stay empty to make by default we don't use slurm (use by the configuration file)
|
415
416
|
mem: str = "128"
|
416
417
|
n_jobs: int = 1
|
@@ -161,7 +161,7 @@ class OutputVolumeNoDDContext(OutputVolumeContext):
|
|
161
161
|
|
162
162
|
class PostProcessingStitchingDumper(DumperBase):
|
163
163
|
"""
|
164
|
-
dumper to be used when save data
|
164
|
+
dumper to be used when save data during post-processing stitching (on reconstructed volume). Output is expected to be an NXtomo
|
165
165
|
"""
|
166
166
|
|
167
167
|
OutputDatasetContext = OutputVolumeContext
|
@@ -220,6 +220,110 @@ class PostProcessingStitchingDumper(DumperBase):
|
|
220
220
|
)
|
221
221
|
|
222
222
|
|
223
|
+
class PostProcessingStitchingDumperWithCache(PostProcessingStitchingDumper):
|
224
|
+
"""
|
225
|
+
PostProcessingStitchingDumper with intermediate cache in order to speed up writting.
|
226
|
+
The cache is save to disk when full or when closing the dumper.
|
227
|
+
Mostly convenient for HDF5
|
228
|
+
"""
|
229
|
+
|
230
|
+
def __init__(self, configuration):
|
231
|
+
super().__init__(configuration)
|
232
|
+
self.__cache = None
|
233
|
+
"""cache as a numpy.ndarray"""
|
234
|
+
self.__cache_size = None
|
235
|
+
"""how many frame do we want to keep in memory before dumping to disk"""
|
236
|
+
self.__dump_axis = None
|
237
|
+
"""axis along which we load / save the data. Different of the stitching axis"""
|
238
|
+
self.__final_volume_shape = None
|
239
|
+
self.__output_frame_index = 0
|
240
|
+
self.__cache_index = 0
|
241
|
+
|
242
|
+
def init_cache(self, dump_axis, size, dtype):
|
243
|
+
if dump_axis not in (0, 1, 2):
|
244
|
+
raise ValueError(f"axis should be in (0, 1, 2). Got {dump_axis}")
|
245
|
+
|
246
|
+
self.__dump_axis = dump_axis
|
247
|
+
self.__cache_size = size
|
248
|
+
self.__cache = numpy.empty(
|
249
|
+
self._get_cache_shape(),
|
250
|
+
dtype=dtype,
|
251
|
+
)
|
252
|
+
|
253
|
+
def reset_cache(self):
|
254
|
+
self.__cache_index = 0
|
255
|
+
|
256
|
+
def set_final_volume_shape(self, shape):
|
257
|
+
self.__final_volume_shape = shape
|
258
|
+
|
259
|
+
def _get_cache_shape(self):
|
260
|
+
assert self.__final_volume_shape is not None, "final volume shape should already be defined"
|
261
|
+
if self.__dump_axis == 0:
|
262
|
+
return (
|
263
|
+
self.__cache_size,
|
264
|
+
self.__final_volume_shape[1],
|
265
|
+
self.__final_volume_shape[2],
|
266
|
+
)
|
267
|
+
elif self.__dump_axis == 1:
|
268
|
+
return (
|
269
|
+
self.__final_volume_shape[0],
|
270
|
+
self.__cache_size,
|
271
|
+
self.__final_volume_shape[2],
|
272
|
+
)
|
273
|
+
elif self.__dump_axis == 2:
|
274
|
+
return (
|
275
|
+
self.__final_volume_shape[0],
|
276
|
+
self.__final_volume_shape[1],
|
277
|
+
self.__cache_size,
|
278
|
+
)
|
279
|
+
else:
|
280
|
+
raise RuntimeError("dump axis should be defined before using the cache")
|
281
|
+
|
282
|
+
def save_stitched_frame(
|
283
|
+
self,
|
284
|
+
stitched_frame: numpy.ndarray,
|
285
|
+
composition_cls: dict,
|
286
|
+
i_frame: int,
|
287
|
+
axis: int,
|
288
|
+
):
|
289
|
+
"""save the frame to the volume. In this use case save the frame to the buffer. Waiting to be dump later.
|
290
|
+
We expect 'save_stitched_frame' to be called with contiguous frames (in the output volume space)
|
291
|
+
"""
|
292
|
+
index_cache = self.__cache_index
|
293
|
+
if self.__dump_axis == 0:
|
294
|
+
self.__cache[index_cache,] = stitched_frame
|
295
|
+
elif self.__dump_axis == 1:
|
296
|
+
self.__cache[:, index_cache, :] = stitched_frame
|
297
|
+
elif self.__dump_axis == 2:
|
298
|
+
self.__cache[:, :, index_cache] = stitched_frame
|
299
|
+
else:
|
300
|
+
raise RuntimeError("dump axis should be defined before using the cache")
|
301
|
+
self.__cache_index += 1
|
302
|
+
|
303
|
+
def dump_cache(self, nb_frames):
|
304
|
+
"""
|
305
|
+
dump the first nb_frames to disk
|
306
|
+
"""
|
307
|
+
output_dataset_start_index = self.__output_frame_index
|
308
|
+
output_dataset_end_index = self.__output_frame_index + nb_frames
|
309
|
+
if self.__dump_axis == 0:
|
310
|
+
self.output_dataset[output_dataset_start_index:output_dataset_end_index] = self.__cache[:nb_frames]
|
311
|
+
elif self.__dump_axis == 1:
|
312
|
+
self.output_dataset[
|
313
|
+
:,
|
314
|
+
output_dataset_start_index:output_dataset_end_index,
|
315
|
+
] = self.__cache[:, :nb_frames]
|
316
|
+
elif self.__dump_axis == 2:
|
317
|
+
self.output_dataset[:, :, output_dataset_start_index:output_dataset_end_index] = self.__cache[
|
318
|
+
:, :, :nb_frames
|
319
|
+
]
|
320
|
+
else:
|
321
|
+
raise RuntimeError("dump axis should be defined before using the cache")
|
322
|
+
|
323
|
+
self.__output_frame_index = output_dataset_end_index
|
324
|
+
self.reset_cache()
|
325
|
+
|
326
|
+
|
223
327
|
class PostProcessingStitchingDumperNoDD(PostProcessingStitchingDumper):
|
224
328
|
"""
|
225
329
|
same as PostProcessingStitchingDumper but prevent to do data duplication.
|
@@ -397,7 +397,7 @@ class PostProcessingStitching(SingleAxisStitcher):
|
|
397
397
|
|
398
398
|
data_type = self.get_output_data_type()
|
399
399
|
|
400
|
-
if self.progress:
|
400
|
+
if self.progress is not None:
|
401
401
|
self.progress.total = final_volume_shape[1]
|
402
402
|
|
403
403
|
y_index = 0
|
@@ -412,7 +412,7 @@ class PostProcessingStitching(SingleAxisStitcher):
|
|
412
412
|
"dtype": data_type,
|
413
413
|
"dumper": self.dumper,
|
414
414
|
}
|
415
|
-
from .dumper.postprocessing import PostProcessingStitchingDumperNoDD
|
415
|
+
from .dumper.postprocessing import PostProcessingStitchingDumperNoDD, PostProcessingStitchingDumperWithCache
|
416
416
|
|
417
417
|
# TODO: FIXME: for now not very elegant but in the case of avoiding data duplication
|
418
418
|
# we need to provide the the information about the stitched part shape.
|
@@ -421,7 +421,11 @@ class PostProcessingStitching(SingleAxisStitcher):
|
|
421
421
|
output_dataset_args["stitching_sources_arr_shapes"] = tuple(
|
422
422
|
[(abs(overlap), n_slices, self._stitching_constant_length) for overlap in self._axis_0_rel_final_shifts]
|
423
423
|
)
|
424
|
+
elif isinstance(self.dumper, PostProcessingStitchingDumperWithCache):
|
425
|
+
self.dumper.set_final_volume_shape(final_volume_shape)
|
424
426
|
|
427
|
+
bunch_size = 50
|
428
|
+
# how many frame to we stitch between two read from disk / save to disk
|
425
429
|
with self.dumper.OutputDatasetContext(**output_dataset_args):
|
426
430
|
# note: output_dataset is a HDF5 dataset if final volume is an HDF5 volume else is a numpy array
|
427
431
|
with _RawDatasetsContext(
|
@@ -431,11 +435,14 @@ class PostProcessingStitching(SingleAxisStitcher):
|
|
431
435
|
# note: raw_datasets can be numpy arrays or HDF5 dataset (in the case of HDF5Volume)
|
432
436
|
# to speed up we read by bunch of dataset. For numpy array this doesn't change anything
|
433
437
|
# but for HDF5 dataset this can speed up a lot the processing (depending on HDF5 dataset chuncks)
|
434
|
-
# note: we read
|
438
|
+
# note: we read through axis 1
|
435
439
|
if isinstance(self.dumper, PostProcessingStitchingDumperNoDD):
|
436
440
|
self.dumper.raw_regions_hdf5_dataset = raw_datasets
|
441
|
+
if isinstance(self.dumper, PostProcessingStitchingDumperWithCache):
|
442
|
+
self.dumper.init_cache(dump_axis=1, dtype=data_type, size=bunch_size)
|
443
|
+
|
437
444
|
for bunch_start, bunch_end in PostProcessingStitching._data_bunch_iterator(
|
438
|
-
slices=self._slices_to_stitch, bunch_size=
|
445
|
+
slices=self._slices_to_stitch, bunch_size=bunch_size
|
439
446
|
):
|
440
447
|
for data_frames in PostProcessingStitching._get_bunch_of_data(
|
441
448
|
bunch_start,
|
@@ -470,6 +477,9 @@ class PostProcessingStitching(SingleAxisStitcher):
|
|
470
477
|
self.progress.update()
|
471
478
|
y_index += 1
|
472
479
|
|
480
|
+
if isinstance(self.dumper, PostProcessingStitchingDumperWithCache):
|
481
|
+
self.dumper.dump_cache(nb_frames=(bunch_end - bunch_start))
|
482
|
+
|
473
483
|
# alias to general API
|
474
484
|
def _create_stitching(self, store_composition):
|
475
485
|
self._create_stitched_volume(store_composition=store_composition)
|
@@ -678,7 +678,7 @@ class PreProcessingStitching(SingleAxisStitcher):
|
|
678
678
|
scans_projections_indexes = []
|
679
679
|
for scan, reverse in zip(self.series, self.reading_orders):
|
680
680
|
scans_projections_indexes.append(sorted(scan.projections.keys(), reverse=(reverse == -1)))
|
681
|
-
if self.progress:
|
681
|
+
if self.progress is not None:
|
682
682
|
self.progress.total = self.get_n_slices_to_stitch()
|
683
683
|
|
684
684
|
if isinstance(self._slices_to_stitch, slice):
|
@@ -471,12 +471,13 @@ class SingleAxisStitcher(_StitcherBase, metaclass=_SingleAxisMetaClass):
|
|
471
471
|
pad_mode=pad_mode,
|
472
472
|
new_unstitched_axis_size=new_width,
|
473
473
|
)
|
474
|
-
dumper
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
474
|
+
if dumper is not None:
|
475
|
+
dumper.save_stitched_frame(
|
476
|
+
stitched_frame=stitched_frame,
|
477
|
+
composition_cls=composition_cls,
|
478
|
+
i_frame=i_frame,
|
479
|
+
axis=1,
|
480
|
+
)
|
480
481
|
|
481
482
|
if return_composition_cls:
|
482
483
|
return stitched_frame, composition_cls
|
@@ -1,6 +1,10 @@
|
|
1
1
|
from nabu.stitching.stitcher.pre_processing import PreProcessingStitching
|
2
2
|
from nabu.stitching.stitcher.post_processing import PostProcessingStitching
|
3
|
-
from .dumper import
|
3
|
+
from .dumper import (
|
4
|
+
PreProcessingStitchingDumper,
|
5
|
+
PostProcessingStitchingDumperNoDD,
|
6
|
+
PostProcessingStitchingDumperWithCache,
|
7
|
+
)
|
4
8
|
from nabu.stitching.stitcher.single_axis import _SingleAxisMetaClass
|
5
9
|
|
6
10
|
|
@@ -26,12 +30,12 @@ class PreProcessingZStitcher(
|
|
26
30
|
class PostProcessingZStitcher(
|
27
31
|
PostProcessingStitching,
|
28
32
|
metaclass=_SingleAxisMetaClass,
|
29
|
-
dumper_cls=
|
33
|
+
dumper_cls=PostProcessingStitchingDumperWithCache,
|
30
34
|
axis=0,
|
31
35
|
):
|
32
36
|
@property
|
33
37
|
def serie_label(self) -> str:
|
34
|
-
return "z-
|
38
|
+
return "z-series"
|
35
39
|
|
36
40
|
|
37
41
|
class PostProcessingZStitcherNoDD(
|
@@ -42,4 +46,4 @@ class PostProcessingZStitcherNoDD(
|
|
42
46
|
):
|
43
47
|
@property
|
44
48
|
def serie_label(self) -> str:
|
45
|
-
return "z-
|
49
|
+
return "z-series"
|
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.4
|
2
2
|
Name: nabu
|
3
|
-
Version: 2024.2.
|
3
|
+
Version: 2024.2.11
|
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>
|
@@ -78,6 +78,7 @@ Requires-Dist: sphinx; extra == "doc"
|
|
78
78
|
Requires-Dist: cloud_sptheme; extra == "doc"
|
79
79
|
Requires-Dist: myst-parser; extra == "doc"
|
80
80
|
Requires-Dist: nbsphinx; extra == "doc"
|
81
|
+
Dynamic: license-file
|
81
82
|
|
82
83
|
# Nabu
|
83
84
|
|
@@ -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=
|
4
|
+
nabu/__init__.py,sha256=pcf3vfOOGAWNkBnrtmOVzs63rfkJ3PfQoNhZsCBkDF0,271
|
5
5
|
nabu/tests.py,sha256=cew9OY2uTyncHI_HM32W8CP6B1GTGKaOW65XtMEqs7o,1417
|
6
6
|
nabu/testutils.py,sha256=VkSL9tbY0XEH49Z5OjDFFhzkSxrCv4UIuvSVFgegSUY,7632
|
7
7
|
nabu/utils.py,sha256=V1B_sD54XGNKn5pORa2yNCATyswOzybey3sv8BuIYWY,26355
|
@@ -137,7 +137,7 @@ nabu/pipeline/reader.py,sha256=wkxPHYOi_C8dHNc7kddB8AMtFuW7GjsP_tm6SJeHlEY,4792
|
|
137
137
|
nabu/pipeline/utils.py,sha256=0O1GLyYLQ8oA2ErI_T3BIfEVjP48dl-u_gl91eX7pjU,3543
|
138
138
|
nabu/pipeline/writer.py,sha256=MG_R1oU8Ff9NdKRHiBkLMz0CmvEXY47zBUE-DpjXElQ,8172
|
139
139
|
nabu/pipeline/fullfield/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
140
|
-
nabu/pipeline/fullfield/chunked.py,sha256=
|
140
|
+
nabu/pipeline/fullfield/chunked.py,sha256=NQ5ArZdw1kzTBczSPYm0u5iTAKMh73Z93O9vPNAn-HE,40891
|
141
141
|
nabu/pipeline/fullfield/chunked_cuda.py,sha256=Jdkk6ZIt3S6UZYbupHtSj2vrj3krWMcqRHHprfblDfk,5848
|
142
142
|
nabu/pipeline/fullfield/computations.py,sha256=AEp3qvwyY-l8-GzjH1E6kmcmU6OgDp6sB-mltq0Jnxg,9970
|
143
143
|
nabu/pipeline/fullfield/dataset_validator.py,sha256=Iy6oOnXnBldDcg0ifm_zzrzMQ6YdkR_hkHFySZgxbno,2943
|
@@ -233,7 +233,7 @@ nabu/reconstruction/projection.py,sha256=7WVPlYLUmCmB2yR1JYmVLJ5fZ3CMMKQ3vS9yuTU
|
|
233
233
|
nabu/reconstruction/reconstructor.py,sha256=16xxHcK4iie-uh-trf6x_IuvgxJKBvQRTE5B8tnc4F8,7358
|
234
234
|
nabu/reconstruction/reconstructor_cuda.py,sha256=m_3GzG44PRyiSEfTvYjgr5atLwl26hMfZOMyqTWxp0g,1644
|
235
235
|
nabu/reconstruction/rings.py,sha256=mpbCLuFM_6Uy9oNJkyQ8tZwhGhrbWtzRlArSRsC90bI,9527
|
236
|
-
nabu/reconstruction/rings_cuda.py,sha256=
|
236
|
+
nabu/reconstruction/rings_cuda.py,sha256=yWUQ-XK-2htZ59GM5aNORA4sjxUswEwWUZuWqKJXiNY,14878
|
237
237
|
nabu/reconstruction/sinogram.py,sha256=KTSGP_JJABf4Yr9l628HPbyWsBnpbnyGKyPEq3ZrPIE,17026
|
238
238
|
nabu/reconstruction/sinogram_cuda.py,sha256=DmTWdI9JhINjBpBuPiEt5mSqFmqu2FitIV94g3hSTAI,10659
|
239
239
|
nabu/reconstruction/sinogram_opencl.py,sha256=vxJa5BeOd2NVdUayXYfQGAfO1AEbJfTGotuijT8qgCs,1486
|
@@ -262,12 +262,11 @@ nabu/resources/templates/id16_holo.conf,sha256=sDd_rEJGZjOGVAsGub5sT2arfXDnc_sxy
|
|
262
262
|
nabu/resources/templates/id16a_fluo.conf,sha256=Nz1etzO2fSwksi7CThWJ5T1kZEdyBe8rMO7puNJ93Hc,542
|
263
263
|
nabu/resources/templates/id19_pag.conf,sha256=u4fFPEBprzOW9_5_ChkIgowQcYpLhjmA8Gwm5XgC4Jc,384
|
264
264
|
nabu/resources/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
265
|
-
nabu/resources/tests/test_extract.py,sha256=msYWFP96LjpEntq1ucTWgKZMhUvZcLpJ-AQB3oGOh2E,206
|
266
265
|
nabu/resources/tests/test_nxflatfield.py,sha256=XRGbYwqJv0NYAVQnAB224TwTZP_W2Bs3-yu0zQnDzEM,4179
|
267
266
|
nabu/resources/tests/test_units.py,sha256=F2jFTck-1UwYET1MwTtX6ntzYUosfwOJkugSencGgz8,2155
|
268
267
|
nabu/stitching/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
269
268
|
nabu/stitching/alignment.py,sha256=2ehpuWDz38AFAoJk3yA0DXf-18Kb329YaCCBBpa7Txc,9078
|
270
|
-
nabu/stitching/config.py,sha256=
|
269
|
+
nabu/stitching/config.py,sha256=C7O7np7nZryL6T33Mwe3sf7Ox75BHjoW78WmJ2TD53Q,52784
|
271
270
|
nabu/stitching/definitions.py,sha256=JbmYwXKxOTYCr2LDXbHO-uNE2OLOBm4ir9AQ7e-Q3lY,158
|
272
271
|
nabu/stitching/frame_composition.py,sha256=7HebOFzSBirJT-MG10T7dzR8Gu0YVwfJb27LDk8lln4,6687
|
273
272
|
nabu/stitching/overlap.py,sha256=JkLM8gNyacEY7BE9vyF8M28Rer97-ExK8ZEvOKeFbPw,17200
|
@@ -279,15 +278,15 @@ nabu/stitching/y_stitching.py,sha256=Urt2lBXokxXxX5HFHEiLBqC69yy5b_KyuKFoU8smah4
|
|
279
278
|
nabu/stitching/z_stitching.py,sha256=gNwj7qWvDFQaGroLVoQnKBPlbvr_CReUQEqxW15m2Ag,1835
|
280
279
|
nabu/stitching/stitcher/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
281
280
|
nabu/stitching/stitcher/base.py,sha256=t6nb9pWPQjijVjlUO-LHauPUxohjwhTkpo-X0Yj1VV8,4229
|
282
|
-
nabu/stitching/stitcher/post_processing.py,sha256=
|
283
|
-
nabu/stitching/stitcher/pre_processing.py,sha256=
|
284
|
-
nabu/stitching/stitcher/single_axis.py,sha256=
|
281
|
+
nabu/stitching/stitcher/post_processing.py,sha256=3sEF0M6A4uQPKdtYNXm3Fx8Zh3RREFbdryObhtu8M2c,26811
|
282
|
+
nabu/stitching/stitcher/pre_processing.py,sha256=pI1ypS6HVTwb-OBXPKT5tXv-wQa7noetesV2GuUHShg,51416
|
283
|
+
nabu/stitching/stitcher/single_axis.py,sha256=4nwdD66rGNqoABBwaB2f50Liv_vcMiT0Hfk2v_93Qmw,20033
|
285
284
|
nabu/stitching/stitcher/stitcher.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
286
285
|
nabu/stitching/stitcher/y_stitcher.py,sha256=KXwkyw6cCFcuSBCq5OyAait2Ob_5WRrtawrAlAhk60k,317
|
287
|
-
nabu/stitching/stitcher/z_stitcher.py,sha256=
|
288
|
-
nabu/stitching/stitcher/dumper/__init__.py,sha256=
|
286
|
+
nabu/stitching/stitcher/z_stitcher.py,sha256=pb8IezJOD9U7hTc6LCExRtkxOgBsUUCgf4G8yuvq11k,1397
|
287
|
+
nabu/stitching/stitcher/dumper/__init__.py,sha256=FcSlb-AvGWZHm_4x9GYvmTrB1488vKeHv6uVR1pKAa0,243
|
289
288
|
nabu/stitching/stitcher/dumper/base.py,sha256=hhImPme-E7_o_wXSduqVP0AeojpCj2QQjyfGGqmV6tc,3443
|
290
|
-
nabu/stitching/stitcher/dumper/postprocessing.py,sha256=
|
289
|
+
nabu/stitching/stitcher/dumper/postprocessing.py,sha256=sdwD6QgoSzTbaUnsNuhTuNqCXorTxQabkSLAXc1f9w0,18258
|
291
290
|
nabu/stitching/stitcher/dumper/preprocessing.py,sha256=7qOx27p92Tbbiah6gYEjkxfax7L8ictdrvzqfDm3vHo,2219
|
292
291
|
nabu/stitching/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
293
292
|
nabu/stitching/tests/test_alignment.py,sha256=MACak1ILOr8nRKeT0mWfMd-ZvhCl3SWjjcp6GjRbITc,2735
|
@@ -310,9 +309,9 @@ nabu/thirdparty/pore3d_deringer_munch.py,sha256=o4bisnFc-wMjuohWBT8wgWmfNehPQGtC
|
|
310
309
|
nabu/thirdparty/tomocupy_remove_stripe.py,sha256=Khe4zFf0kRzu65Yxnvq58gt1ljOztqJGdMDhVAiM7lM,24363
|
311
310
|
nabu/thirdparty/tomopy_phase.py,sha256=hK4oPpkogLOhv23XzzEXQY2u3r8fJvASY_bINVs6ERE,8634
|
312
311
|
nabu/thirdparty/tomwer_load_flats_darks.py,sha256=ZNoVAinUb_wGYbfvs_4BVnWsjsQmNxSvCh1bWhR2WWg,5611
|
313
|
-
nabu-2024.2.
|
314
|
-
nabu-2024.2.
|
315
|
-
nabu-2024.2.
|
316
|
-
nabu-2024.2.
|
317
|
-
nabu-2024.2.
|
318
|
-
nabu-2024.2.
|
312
|
+
nabu-2024.2.11.dist-info/licenses/LICENSE,sha256=1eAIPSnEsnSFNUODnLtNtQTs76exG3ZxJ1DJR6zoUBA,1066
|
313
|
+
nabu-2024.2.11.dist-info/METADATA,sha256=dsMISANCk2gHi-RZbdyIXTUkAbqsmMoQ3A_TXENN9nI,5537
|
314
|
+
nabu-2024.2.11.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
|
315
|
+
nabu-2024.2.11.dist-info/entry_points.txt,sha256=cJKGkBeykVL7uK3E4R0RLRqMXifTL2qdO573syPAvJc,1288
|
316
|
+
nabu-2024.2.11.dist-info/top_level.txt,sha256=fsm_N3eXLRZk2QXF9OSKPNDPFXOz8FAQjHh5avT3dok,9
|
317
|
+
nabu-2024.2.11.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|