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 CHANGED
@@ -1,4 +1,4 @@
1
- __version__ = "2024.2.9"
1
+ __version__ = "2024.2.11"
2
2
  __nabu_modules__ = [
3
3
  "app",
4
4
  "cuda",
@@ -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) # TODO check it works with non-contiguous view
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._mean_kernel_block = (32, 1, 32)
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._op_kernel_block = (16, 16, 4)
282
- self._op_kernel_grid = [updiv(a, b) for a, b in zip(self.sinos_shape[::-1], self._op_kernel_block)]
283
- self._op_kernel_args = [self.d_sino_profile, np.int32(self.n_x), np.int32(self.n_angles), np.int32(self.n_z)]
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._mean_kernel(d_sino, *self._mean_kernel_args, **self._mean_kernel_kwargs)
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
@@ -1,3 +1,4 @@
1
1
  from .postprocessing import PostProcessingStitchingDumper
2
2
  from .postprocessing import PostProcessingStitchingDumperNoDD
3
+ from .postprocessing import PostProcessingStitchingDumperWithCache
3
4
  from .preprocessing import PreProcessingStitchingDumper
@@ -161,7 +161,7 @@ class OutputVolumeNoDDContext(OutputVolumeContext):
161
161
 
162
162
  class PostProcessingStitchingDumper(DumperBase):
163
163
  """
164
- dumper to be used when save data durint post-processing stitching (on recosntructed volume). Output is expected to be an NXtomo
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 trhough axis 1
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=50
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.save_stitched_frame(
475
- stitched_frame=stitched_frame,
476
- composition_cls=composition_cls,
477
- i_frame=i_frame,
478
- axis=1,
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 PreProcessingStitchingDumper, PostProcessingStitchingDumperNoDD, PostProcessingStitchingDumper
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=PostProcessingStitchingDumper,
33
+ dumper_cls=PostProcessingStitchingDumperWithCache,
30
34
  axis=0,
31
35
  ):
32
36
  @property
33
37
  def serie_label(self) -> str:
34
- return "z-serie"
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-serie"
49
+ return "z-series"
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: nabu
3
- Version: 2024.2.9
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=zC_MI_KzALbmsIMyTOjFfDsgHH2yb1ywfTdyPnYdFYU,270
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=UhNbaxfGgiTdeDdfSBPJhCd3Xo1bNR0EHfEHYf5SQxs,40939
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=yBGv_MITcWzD1VWLIchloV8IB43D_5Rxf1MoqYoTvMw,13704
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=CP5g3f4sXpUBLAlG7LRg-90Ebon-janurbuORgYGi1c,52783
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=PDjMaFRLsnX_UD-vVviiOjzQ8DRewaJ_06XVFp183zE,26154
283
- nabu/stitching/stitcher/pre_processing.py,sha256=RpaJcgP2bhxqRXiX6GQUps7WSy9ThzYa0PgAV4GgZR4,51404
284
- nabu/stitching/stitcher/single_axis.py,sha256=INsUgWmSKAcuFiE7NhJ72ChRLBqrlaUCSW6PG19XrYE,19978
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=S22nkQZ_6NwQm8h9mOhMvEZgUxXGQf6xadR5j6A91gI,1360
288
- nabu/stitching/stitcher/dumper/__init__.py,sha256=065KlsJai-Q3BnfuzmTP4XzO9wDV2a0CjlMdcV28Hc8,176
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=DShYc3hDfrUtyK2LEG9DNO42r9SdeUiMGEChKq-uNuM,14352
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.9.dist-info/LICENSE,sha256=1eAIPSnEsnSFNUODnLtNtQTs76exG3ZxJ1DJR6zoUBA,1066
314
- nabu-2024.2.9.dist-info/METADATA,sha256=IbwpeUPJlDnVH70Y0shTvexUML3YTap0wCiOw4lhWY4,5514
315
- nabu-2024.2.9.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
316
- nabu-2024.2.9.dist-info/entry_points.txt,sha256=cJKGkBeykVL7uK3E4R0RLRqMXifTL2qdO573syPAvJc,1288
317
- nabu-2024.2.9.dist-info/top_level.txt,sha256=fsm_N3eXLRZk2QXF9OSKPNDPFXOz8FAQjHh5avT3dok,9
318
- nabu-2024.2.9.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.0)
2
+ Generator: setuptools (78.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,9 +0,0 @@
1
- from nabu.utils import list_match_queries
2
-
3
-
4
- def test_list_match_queries():
5
-
6
- # entry0000 .... entry0099
7
- avail = ["entry%04d" % i for i in range(100)]
8
- query = "entry0000"
9
- list_match_queries()