nabu 2024.2.10__py3-none-any.whl → 2024.2.12__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- nabu/__init__.py +1 -1
- nabu/io/cast_volume.py +13 -0
- nabu/pipeline/fullfield/chunked.py +1 -1
- nabu/reconstruction/rings_cuda.py +41 -13
- nabu/resources/tests/test_extract.py +9 -0
- 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 +13 -3
- nabu/stitching/stitcher/single_axis.py +7 -6
- nabu/stitching/stitcher/z_stitcher.py +8 -4
- {nabu-2024.2.10.dist-info → nabu-2024.2.12.dist-info}/METADATA +5 -26
- {nabu-2024.2.10.dist-info → nabu-2024.2.12.dist-info}/RECORD +17 -16
- {nabu-2024.2.10.dist-info → nabu-2024.2.12.dist-info}/WHEEL +1 -1
- {nabu-2024.2.10.dist-info → nabu-2024.2.12.dist-info}/entry_points.txt +0 -0
- {nabu-2024.2.10.dist-info → nabu-2024.2.12.dist-info/licenses}/LICENSE +0 -0
- {nabu-2024.2.10.dist-info → nabu-2024.2.12.dist-info}/top_level.txt +0 -0
nabu/__init__.py
CHANGED
nabu/io/cast_volume.py
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
import os
|
2
|
+
|
3
|
+
from tomoscan.esrf.volume.singleframebase import VolumeSingleFrameBase
|
2
4
|
from nabu.misc.utils import rescale_data
|
3
5
|
from nabu.pipeline.params import files_formats
|
4
6
|
from tomoscan.volumebase import VolumeBase
|
@@ -176,6 +178,17 @@ def cast_volume(
|
|
176
178
|
if not isinstance(output_data_type, numpy.dtype):
|
177
179
|
raise TypeError(f"output_data_type is expected to be a {numpy.dtype}. {type(output_data_type)} provided")
|
178
180
|
|
181
|
+
# Make sure the output volume has the same "start_index" as input volume, if relevant
|
182
|
+
if isinstance(input_volume, VolumeSingleFrameBase) and isinstance(output_volume, VolumeSingleFrameBase):
|
183
|
+
try:
|
184
|
+
first_file_name = next(input_volume.browse_data_files())
|
185
|
+
start_idx = int(first_file_name.split(".")[0].split("_")[-1])
|
186
|
+
except (StopIteration, ValueError, TypeError):
|
187
|
+
# StopIteration: Input volume has no file - should not happen
|
188
|
+
# ValueError / TypeError: fail to convert to int, something wrong when extracting slice number (non-default file name scheme)
|
189
|
+
start_idx = 0
|
190
|
+
output_volume.start_index = start_idx
|
191
|
+
|
179
192
|
# start processing
|
180
193
|
# check for data_min and data_max
|
181
194
|
if data_min is None or data_max is None:
|
@@ -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.
|
@@ -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)
|
@@ -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,31 +1,10 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.4
|
2
2
|
Name: nabu
|
3
|
-
Version: 2024.2.
|
3
|
+
Version: 2024.2.12
|
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>
|
7
|
-
License: MIT
|
8
|
-
|
9
|
-
Copyright (c) 2020-2024 ESRF
|
10
|
-
|
11
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
12
|
-
of this software and associated documentation files (the "Software"), to deal
|
13
|
-
in the Software without restriction, including without limitation the rights
|
14
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
15
|
-
copies of the Software, and to permit persons to whom the Software is
|
16
|
-
furnished to do so, subject to the following conditions:
|
17
|
-
|
18
|
-
The above copyright notice and this permission notice shall be included in all
|
19
|
-
copies or substantial portions of the Software.
|
20
|
-
|
21
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
22
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
23
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
24
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
25
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
26
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
27
|
-
SOFTWARE.
|
28
|
-
|
7
|
+
License-Expression: MIT
|
29
8
|
Project-URL: Homepage, https://gitlab.esrf.fr/tomotools/nabu
|
30
9
|
Project-URL: Documentation, http://www.silx.org/pub/nabu/doc
|
31
10
|
Project-URL: Repository, https://gitlab.esrf.fr/tomotools/nabu/-/releases
|
@@ -40,7 +19,6 @@ Classifier: Programming Language :: Python :: 3.8
|
|
40
19
|
Classifier: Programming Language :: Python :: 3.9
|
41
20
|
Classifier: Programming Language :: Python :: 3.10
|
42
21
|
Classifier: Environment :: Console
|
43
|
-
Classifier: License :: OSI Approved :: MIT License
|
44
22
|
Classifier: Operating System :: Unix
|
45
23
|
Classifier: Operating System :: MacOS :: MacOS X
|
46
24
|
Classifier: Operating System :: POSIX
|
@@ -53,7 +31,7 @@ Requires-Dist: numpy<2,>1.9.0
|
|
53
31
|
Requires-Dist: scipy
|
54
32
|
Requires-Dist: h5py>=3.0
|
55
33
|
Requires-Dist: silx>=0.15.0
|
56
|
-
Requires-Dist: tomoscan>=2.1.
|
34
|
+
Requires-Dist: tomoscan>=2.1.5
|
57
35
|
Requires-Dist: psutil
|
58
36
|
Requires-Dist: pytest
|
59
37
|
Requires-Dist: tifffile
|
@@ -78,6 +56,7 @@ Requires-Dist: sphinx; extra == "doc"
|
|
78
56
|
Requires-Dist: cloud_sptheme; extra == "doc"
|
79
57
|
Requires-Dist: myst-parser; extra == "doc"
|
80
58
|
Requires-Dist: nbsphinx; extra == "doc"
|
59
|
+
Dynamic: license-file
|
81
60
|
|
82
61
|
# Nabu
|
83
62
|
|
@@ -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=YifF4GAurmjhWkdEHc0w9j48GNlcJSLObAKt0WNrcUo,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
|
@@ -77,7 +77,7 @@ nabu/estimation/tests/test_focus.py,sha256=cMxEeTLlfVHOvG_4oGMLpp6bVI6okYz0u4aNc
|
|
77
77
|
nabu/estimation/tests/test_tilt.py,sha256=PN4tnV3-XU2nNA608kQShaHugWn_-wbHzWCTnLIaCTk,1658
|
78
78
|
nabu/estimation/tests/test_translation.py,sha256=RkOnCYgk9DZGKlIka1snqTv4wbIz_nG7-EHAxnBHsJU,2999
|
79
79
|
nabu/io/__init__.py,sha256=AbQgj4-fCCHOKynO_PyAR9ejnFSuWKgroxxhxWVpjyQ,120
|
80
|
-
nabu/io/cast_volume.py,sha256=
|
80
|
+
nabu/io/cast_volume.py,sha256=LQkd3I_W9mpX_vIa7iAV-rcv2ZcCJ-NZ3EQuFAPYJSI,17504
|
81
81
|
nabu/io/detector_distortion.py,sha256=Or4icugi0fGRKWIG0I9hCuR1UZA5Cel25ZGY7cR2j4I,11744
|
82
82
|
nabu/io/reader.py,sha256=McWg7w04zrI0mt2z-BBwUr7rryMWYjdg7aHqbNeZ45A,40518
|
83
83
|
nabu/io/reader_helical.py,sha256=_6vZBH-US_VT7oOGJUtYXqPwFws7xZKcmdOthpwvlIQ,4477
|
@@ -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,11 +262,12 @@ 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
|
265
266
|
nabu/resources/tests/test_nxflatfield.py,sha256=XRGbYwqJv0NYAVQnAB224TwTZP_W2Bs3-yu0zQnDzEM,4179
|
266
267
|
nabu/resources/tests/test_units.py,sha256=F2jFTck-1UwYET1MwTtX6ntzYUosfwOJkugSencGgz8,2155
|
267
268
|
nabu/stitching/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
268
269
|
nabu/stitching/alignment.py,sha256=2ehpuWDz38AFAoJk3yA0DXf-18Kb329YaCCBBpa7Txc,9078
|
269
|
-
nabu/stitching/config.py,sha256=
|
270
|
+
nabu/stitching/config.py,sha256=C7O7np7nZryL6T33Mwe3sf7Ox75BHjoW78WmJ2TD53Q,52784
|
270
271
|
nabu/stitching/definitions.py,sha256=JbmYwXKxOTYCr2LDXbHO-uNE2OLOBm4ir9AQ7e-Q3lY,158
|
271
272
|
nabu/stitching/frame_composition.py,sha256=7HebOFzSBirJT-MG10T7dzR8Gu0YVwfJb27LDk8lln4,6687
|
272
273
|
nabu/stitching/overlap.py,sha256=JkLM8gNyacEY7BE9vyF8M28Rer97-ExK8ZEvOKeFbPw,17200
|
@@ -278,15 +279,15 @@ nabu/stitching/y_stitching.py,sha256=Urt2lBXokxXxX5HFHEiLBqC69yy5b_KyuKFoU8smah4
|
|
278
279
|
nabu/stitching/z_stitching.py,sha256=gNwj7qWvDFQaGroLVoQnKBPlbvr_CReUQEqxW15m2Ag,1835
|
279
280
|
nabu/stitching/stitcher/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
280
281
|
nabu/stitching/stitcher/base.py,sha256=t6nb9pWPQjijVjlUO-LHauPUxohjwhTkpo-X0Yj1VV8,4229
|
281
|
-
nabu/stitching/stitcher/post_processing.py,sha256=
|
282
|
+
nabu/stitching/stitcher/post_processing.py,sha256=3sEF0M6A4uQPKdtYNXm3Fx8Zh3RREFbdryObhtu8M2c,26811
|
282
283
|
nabu/stitching/stitcher/pre_processing.py,sha256=pI1ypS6HVTwb-OBXPKT5tXv-wQa7noetesV2GuUHShg,51416
|
283
|
-
nabu/stitching/stitcher/single_axis.py,sha256=
|
284
|
+
nabu/stitching/stitcher/single_axis.py,sha256=4nwdD66rGNqoABBwaB2f50Liv_vcMiT0Hfk2v_93Qmw,20033
|
284
285
|
nabu/stitching/stitcher/stitcher.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
285
286
|
nabu/stitching/stitcher/y_stitcher.py,sha256=KXwkyw6cCFcuSBCq5OyAait2Ob_5WRrtawrAlAhk60k,317
|
286
|
-
nabu/stitching/stitcher/z_stitcher.py,sha256=
|
287
|
-
nabu/stitching/stitcher/dumper/__init__.py,sha256=
|
287
|
+
nabu/stitching/stitcher/z_stitcher.py,sha256=pb8IezJOD9U7hTc6LCExRtkxOgBsUUCgf4G8yuvq11k,1397
|
288
|
+
nabu/stitching/stitcher/dumper/__init__.py,sha256=FcSlb-AvGWZHm_4x9GYvmTrB1488vKeHv6uVR1pKAa0,243
|
288
289
|
nabu/stitching/stitcher/dumper/base.py,sha256=hhImPme-E7_o_wXSduqVP0AeojpCj2QQjyfGGqmV6tc,3443
|
289
|
-
nabu/stitching/stitcher/dumper/postprocessing.py,sha256=
|
290
|
+
nabu/stitching/stitcher/dumper/postprocessing.py,sha256=sdwD6QgoSzTbaUnsNuhTuNqCXorTxQabkSLAXc1f9w0,18258
|
290
291
|
nabu/stitching/stitcher/dumper/preprocessing.py,sha256=7qOx27p92Tbbiah6gYEjkxfax7L8ictdrvzqfDm3vHo,2219
|
291
292
|
nabu/stitching/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
292
293
|
nabu/stitching/tests/test_alignment.py,sha256=MACak1ILOr8nRKeT0mWfMd-ZvhCl3SWjjcp6GjRbITc,2735
|
@@ -309,9 +310,9 @@ nabu/thirdparty/pore3d_deringer_munch.py,sha256=o4bisnFc-wMjuohWBT8wgWmfNehPQGtC
|
|
309
310
|
nabu/thirdparty/tomocupy_remove_stripe.py,sha256=Khe4zFf0kRzu65Yxnvq58gt1ljOztqJGdMDhVAiM7lM,24363
|
310
311
|
nabu/thirdparty/tomopy_phase.py,sha256=hK4oPpkogLOhv23XzzEXQY2u3r8fJvASY_bINVs6ERE,8634
|
311
312
|
nabu/thirdparty/tomwer_load_flats_darks.py,sha256=ZNoVAinUb_wGYbfvs_4BVnWsjsQmNxSvCh1bWhR2WWg,5611
|
312
|
-
nabu-2024.2.
|
313
|
-
nabu-2024.2.
|
314
|
-
nabu-2024.2.
|
315
|
-
nabu-2024.2.
|
316
|
-
nabu-2024.2.
|
317
|
-
nabu-2024.2.
|
313
|
+
nabu-2024.2.12.dist-info/licenses/LICENSE,sha256=1eAIPSnEsnSFNUODnLtNtQTs76exG3ZxJ1DJR6zoUBA,1066
|
314
|
+
nabu-2024.2.12.dist-info/METADATA,sha256=js11kdh6t1G64wHG9VEC9Pjhxb2305HB5GrmmkkPSX0,4266
|
315
|
+
nabu-2024.2.12.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
|
316
|
+
nabu-2024.2.12.dist-info/entry_points.txt,sha256=cJKGkBeykVL7uK3E4R0RLRqMXifTL2qdO573syPAvJc,1288
|
317
|
+
nabu-2024.2.12.dist-info/top_level.txt,sha256=fsm_N3eXLRZk2QXF9OSKPNDPFXOz8FAQjHh5avT3dok,9
|
318
|
+
nabu-2024.2.12.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|