nabu 2024.2.0__py3-none-any.whl → 2024.2.0rc1__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.0"
1
+ __version__ = "2024.2.0-rc1"
2
2
  __nabu_modules__ = [
3
3
  "app",
4
4
  "cuda",
nabu/estimation/cor.py CHANGED
@@ -239,7 +239,7 @@ class CenterOfRotationSlidingWindow(CenterOfRotation):
239
239
  win_2_start = img_width // 2 - window_shift
240
240
  else:
241
241
  abs_pos = int(side + img_width // 2)
242
- window_fraction = 0.1 # Hard-coded ?
242
+ window_fraction = 0.2 # Hard-coded ?
243
243
 
244
244
  window_width = round(window_fraction * img_width)
245
245
  window_shift = window_width // 2
@@ -1114,6 +1114,11 @@ class CenterOfRotationOctaveAccurate(CenterOfRotation):
1114
1114
  # ---
1115
1115
  self._check_img_pair_sizes(img_1, img_2)
1116
1116
 
1117
+ if side != "center":
1118
+ msg = "This method cannot handle half acquisition"
1119
+ self.logger.fatal(msg)
1120
+ raise ValueError(msg)
1121
+
1117
1122
  img_shape = img_2.shape
1118
1123
  roi_yxhw = self._determine_roi(img_shape, roi_yxhw)
1119
1124
 
@@ -91,7 +91,7 @@ class SinoCor:
91
91
  imax = i
92
92
  self.cor_abs = self.sx - (imax + window_width + 1.0) / 2.0
93
93
  self.cor_rel = self.sx / 2 - (imax + window_width + 1.0) / 2.0
94
- elif side == "left":
94
+ else:
95
95
  for i in nr:
96
96
  imout = self.data1[:, i : i + window_width] - self.data2[:, self.sx - window_width : self.sx]
97
97
  diff = imout.max() - imout.min()
@@ -100,8 +100,6 @@ class SinoCor:
100
100
  imax = i
101
101
  self.cor_abs = (imax + window_width - 1.0) / 2
102
102
  self.cor_rel = self.cor_abs - self.sx / 2.0 - 1
103
- else:
104
- raise ValueError(f"Invalid side given ({side}). should be 'left' or 'right'")
105
103
  if imax < 1:
106
104
  self.logger.warning("sliding width %d seems too large!" % window_width)
107
105
  self.rcor_abs = round(self.cor_abs)
@@ -31,21 +31,6 @@ from .params import cor_methods, tilt_methods
31
31
 
32
32
 
33
33
  def estimate_cor(method, dataset_info, do_flatfield=True, cor_options=None, logger=None):
34
- """
35
- High level function to compute the center of rotation (COR)
36
-
37
- Parameters
38
- ----------
39
- method: name of the method to be used for computing the center of rotation
40
- dataset_info: `nabu.resources.dataset_analyzer.DatasetAnalyzer`
41
- Dataset information structure
42
- do_flatfield: If True apply flat field to compute the center of rotation
43
- cor_options: optional dictionary that can contain the following keys:
44
- * slice_idx: index of the slice to use for computing the sinogram (for sinogram based algorithms)
45
- * subsampling subsampling
46
- * radio_angles: angles of the radios to use (for radio based algorithms)
47
- logger: logging object
48
- """
49
34
  logger = LoggerOrPrint(logger)
50
35
  cor_options = cor_options or {}
51
36
  check_supported(method, list(cor_methods.keys()), "COR estimation method")
@@ -71,7 +56,6 @@ def estimate_cor(method, dataset_info, do_flatfield=True, cor_options=None, logg
71
56
  dataset_info,
72
57
  do_flatfield=do_flatfield,
73
58
  cor_options=cor_options,
74
- radio_angles=cor_options.get("radio_angles", (0.0, np.pi)),
75
59
  logger=logger,
76
60
  )
77
61
  estimated_cor = cor_finder.find_cor()
@@ -82,7 +66,6 @@ def estimate_cor(method, dataset_info, do_flatfield=True, cor_options=None, logg
82
66
  slice_idx=cor_options.get("slice_idx", "middle"),
83
67
  subsampling=cor_options.get("subsampling", 10),
84
68
  do_flatfield=do_flatfield,
85
- take_log=cor_options.get("take_log", True),
86
69
  cor_options=cor_options,
87
70
  logger=logger,
88
71
  )
@@ -197,12 +180,6 @@ class CORFinder(CORFinderBase):
197
180
  self._init_radios()
198
181
  self._apply_flatfield()
199
182
  self._apply_tilt()
200
- # octave-accurate does not support half-acquisition scans,
201
- # but information on field of view is only known here with the "dataset_info" object.
202
- # Do the check here.
203
- if self.dataset_info.is_halftomo and method == "octave-accurate":
204
- raise ValueError("The CoR estimator 'octave-accurate' does not support half-acquisition scans")
205
- #
206
183
 
207
184
  def _init_radios(self):
208
185
  self.radios, self._radios_indices = get_radio_pair(
@@ -243,13 +220,6 @@ class CORFinder(CORFinderBase):
243
220
  # All find_shift() methods in self.search_methods have the same API with "img_1" and "img_2"
244
221
  cor_exec_kwargs = update_func_kwargs(self.cor_finder.find_shift, self.cor_options)
245
222
  cor_exec_kwargs["return_relative_to_middle"] = False
246
- # ----- FIXME -----
247
- # 'self.cor_options' can contain 'side="from_file"', and we should not modify it directly
248
- # because it's entered by the user.
249
- # Either make a copy of self.cor_options, or change the inspect() mechanism
250
- if cor_exec_kwargs.get("side", None) == "from_file":
251
- cor_exec_kwargs["side"] = self._lookup_side or "center"
252
- # ------
253
223
  if self._lookup_side is not None:
254
224
  cor_exec_kwargs["side"] = self._lookup_side
255
225
  self.logger.debug("%s.find_shift(%s)" % (self.cor_finder.__class__.__name__, str(cor_exec_kwargs)))
@@ -389,13 +359,7 @@ class SinoCORFinder(CORFinderBase):
389
359
 
390
360
  cor_exec_kwargs = update_func_kwargs(self.cor_finder.find_shift, self.cor_options)
391
361
  cor_exec_kwargs["return_relative_to_middle"] = False
392
- # FIXME
393
- # 'self.cor_options' can contain 'side="from_file"', and we should not modify it directly
394
- # because it's entered by the user.
395
- # Either make a copy of self.cor_options, or change the inspect() mechanism
396
- if cor_exec_kwargs["side"] == "from_file":
397
- cor_exec_kwargs["side"] = self._lookup_side or "center"
398
- #
362
+
399
363
  if self._lookup_side is not None:
400
364
  cor_exec_kwargs["side"] = self._lookup_side
401
365
 
@@ -490,7 +454,7 @@ class CompositeCORFinder(CORFinderBase):
490
454
  if (self.angle_max - self.angle_min) < 1.2 * np.pi:
491
455
  useful_span = None
492
456
  raise ValueError(
493
- f"""Sinogram-based Center of Rotation estimation can only be used for scans over more than 180 degrees.
457
+ f"""Sinogram-based Center of Rotation estimation can only be used for scans over more than 180 degrees.
494
458
  Your angular span was barely above 180 degrees, it was in fact {((self.angle_max - self.angle_min)/np.pi):.2f} x 180
495
459
  and it is not considered to be enough by the discriminating condition which requires at least 1.2 half-turns
496
460
  """
@@ -668,10 +668,7 @@ class ChunkedPipeline:
668
668
  "jpeg2000_compression_ratio": options["jpeg2000_compression_ratio"],
669
669
  "float_clip_values": options["float_clip_values"],
670
670
  "tiff_single_file": options.get("tiff_single_file", False),
671
- "single_output_file_initialized": getattr(
672
- self.process_config, "single_output_file_initialized", False
673
- ), # COMPAT.
674
- "writer_initialized": getattr(self.process_config, "_writer_initialized", False),
671
+ "single_output_file_initialized": getattr(self.process_config, "single_output_file_initialized", False),
675
672
  "raw_vol_metadata": {"voxelSize": self.dataset_info.pixel_size}, # legacy...
676
673
  }
677
674
  writer_extra_options.update(extra_options)
@@ -856,8 +853,7 @@ class ChunkedPipeline:
856
853
  self.writer.write_data(data)
857
854
  self.logger.info("Wrote %s" % self.writer.fname)
858
855
  self._write_histogram()
859
- self.process_config.single_output_file_initialized = True # COMPAT.
860
- self.process_config._writer_initialized = True
856
+ self.process_config.single_output_file_initialized = True
861
857
 
862
858
  def _write_histogram(self):
863
859
  if "histogram" not in self.processing_steps:
@@ -84,17 +84,13 @@ class TestCorNearPos:
84
84
 
85
85
  def test_cor_fourier_angles_standard(self):
86
86
  cor_options = extract_parameters(self.conf_std["reconstruction"].get("cor_options", None), sep=";")
87
- # TODO modify test files
88
- if "near_pos" in cor_options and "near" in cor_options.get("side", "") == "near":
89
- cor_options["side"] = cor_options["near_pos"]
90
- #
91
87
  for side in [None, "from_file", "center"]:
92
88
  if side is not None:
93
89
  cor_options.update({"side": side})
94
90
  finder = SinoCORFinder("fourier-angles", self.ds_std, do_flatfield=True, cor_options=cor_options)
95
91
  cor = finder.find_cor()
96
92
  message = f"Computed CoR {cor} and expected CoR {self.true_cor} do not coincide. Near_pos options was set to {cor_options.get('near_pos',None)}."
97
- assert np.isclose(self.true_cor + 0.5, cor, atol=self.abs_tol), message
93
+ assert np.isclose(self.true_cor, cor, atol=self.abs_tol), message
98
94
 
99
95
  def test_cor_sliding_bliss(self):
100
96
  cor_options = extract_parameters(self.conf_bliss["reconstruction"].get("cor_options", None), sep=";")
@@ -118,4 +114,4 @@ class TestCorNearPos:
118
114
  finder = SinoCORFinder("fourier-angles", self.ds_bliss, do_flatfield=True, cor_options=cor_options)
119
115
  cor = finder.find_cor()
120
116
  message = f"Computed CoR {cor} and expected CoR {self.true_cor} do not coincide. Near_pos options was set to {cor_options.get('near_pos',None)}."
121
- assert np.isclose(self.true_cor + 0.5, cor, atol=self.abs_tol), message
117
+ assert np.isclose(self.true_cor, cor, atol=self.abs_tol), message
nabu/pipeline/writer.py CHANGED
@@ -1,6 +1,5 @@
1
1
  from os import path
2
2
  from tomoscan.esrf import TIFFVolume, MultiTIFFVolume, EDFVolume, JP2KVolume
3
- from tomoscan.esrf.volume.singleframebase import VolumeSingleFrameBase
4
3
  from ..utils import check_supported, get_num_threads
5
4
  from ..resources.logger import LoggerOrPrint
6
5
  from ..io.writer import NXProcessWriter, HSTVolVolume, NXVolVolume
@@ -114,7 +113,6 @@ class WriterManager:
114
113
  return vol_writer.data_url.file_path()
115
114
 
116
115
  def _init_writer(self):
117
- self._writer_was_already_initialized = self.extra_options.get("writer_initialized", False)
118
116
  if self.file_format in ["tiff", "edf", "jp2", "hdf5"]:
119
117
  writer_kwargs = {
120
118
  "folder": self.output_dir,
@@ -145,11 +143,6 @@ class WriterManager:
145
143
  self._h5_entry = self.metadata.get("entry", "entry")
146
144
  self.writer = self._writer_classes[self.file_format](**writer_kwargs)
147
145
  self.fname = self.get_fname(self.writer)
148
- # In certain cases, tomoscan needs to remove any previous existing volume filess
149
- # and avoid calling 'clean_output_data' when writing downstream (for chunk processing)
150
- if isinstance(self.writer, VolumeSingleFrameBase):
151
- self.writer.skip_existing_data_files_removal = self._writer_was_already_initialized
152
- # ---
153
146
  if path.exists(self.fname):
154
147
  err = "File already exists: %s" % self.fname
155
148
  if self.overwrite:
@@ -52,7 +52,7 @@ class DatasetAnalyzer:
52
52
  "output_dir": None,
53
53
  "exclude_projections": None,
54
54
  "hdf5_entry": None,
55
- # "nx_version": 1.0,
55
+ "nx_version": 1.0,
56
56
  }
57
57
  # --
58
58
  advanced_options.update(extra_options)
@@ -302,7 +302,7 @@ class EDFDatasetAnalyzer(DatasetAnalyzer):
302
302
  return np.deg2rad(self.dataset_scanner.rotation_angle())
303
303
 
304
304
  def get_reduced_flats(self, **reader_kwargs):
305
- if self.raw_flats in [None, {}]:
305
+ if self.flats in [None, {}]:
306
306
  raise FileNotFoundError("No reduced flat ('refHST') found in %s" % self.location)
307
307
  # A few notes:
308
308
  # (1) In principle we could do the reduction (mean/median) from raw frames (ref_xxxx_yyyy)
@@ -311,15 +311,15 @@ class EDFDatasetAnalyzer(DatasetAnalyzer):
311
311
  # (eg. subsampling, binning, distortion correction...)
312
312
  # (3) The following spawns one reader instance per file, which is not elegant,
313
313
  # but in principle there are typically 1-2 reduced flats in a scan
314
- readers = {k: EDFStackReader([self.raw_flats[k].file_path()], **reader_kwargs) for k in self.raw_flats.keys()}
315
- return {k: readers[k].load_data()[0] for k in self.raw_flats.keys()}
314
+ readers = {k: EDFStackReader([self.flats[k].file_path()], **reader_kwargs) for k in self.flats.keys()}
315
+ return {k: readers[k].load_data()[0] for k in self.flats.keys()}
316
316
 
317
317
  def get_reduced_darks(self, **reader_kwargs):
318
318
  # See notes in get_reduced_flats() above
319
- if self.raw_darks in [None, {}]:
319
+ if self.darks in [None, {}]:
320
320
  raise FileNotFoundError("No reduced dark ('darkend.edf' or 'dark.edf') found in %s" % self.location)
321
- readers = {k: EDFStackReader([self.raw_darks[k].file_path()], **reader_kwargs) for k in self.raw_darks.keys()}
322
- return {k: readers[k].load_data()[0] for k in self.raw_darks.keys()}
321
+ readers = {k: EDFStackReader([self.darks[k].file_path()], **reader_kwargs) for k in self.darks.keys()}
322
+ return {k: readers[k].load_data()[0] for k in self.darks.keys()}
323
323
 
324
324
  @property
325
325
  def files(self):
@@ -365,10 +365,10 @@ class HDF5DatasetAnalyzer(DatasetAnalyzer):
365
365
  def _get_dataset_hdf5_url(self):
366
366
  if len(self.projections) > 0:
367
367
  frames_to_take = self.projections
368
- elif len(self.raw_flats) > 0:
369
- frames_to_take = self.raw_flats
370
- elif len(self.raw_darks) > 0:
371
- frames_to_take = self.raw_darks
368
+ elif len(self.flats) > 0:
369
+ frames_to_take = self.flats
370
+ elif len(self.darks) > 0:
371
+ frames_to_take = self.darks
372
372
  else:
373
373
  raise ValueError("No projections, no flats and no darks ?!")
374
374
  first_proj_idx = sorted(frames_to_take.keys())[0]
@@ -409,13 +409,8 @@ class HDF5DatasetAnalyzer(DatasetAnalyzer):
409
409
  slices: list of slice
410
410
  A list where each item is a slice.
411
411
  """
412
- name_to_attr = {
413
- "projections": self.projections,
414
- "flats": self.raw_flats,
415
- "darks": self.raw_darks,
416
- }
417
- check_supported(what, name_to_attr.keys(), "image type")
418
- images = name_to_attr[what] # dict
412
+ check_supported(what, ["projections", "flats", "darks"], "image type")
413
+ images = getattr(self, what) # dict
419
414
  # we can't directly use set() on slice() object (unhashable). Use tuples
420
415
  slices = set()
421
416
  for du in get_compacted_dataslices(images).values():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nabu
3
- Version: 2024.2.0
3
+ Version: 2024.2.0rc1
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>
@@ -53,7 +53,7 @@ Requires-Dist: numpy <2,>1.9.0
53
53
  Requires-Dist: scipy
54
54
  Requires-Dist: h5py >=3.0
55
55
  Requires-Dist: silx >=0.15.0
56
- Requires-Dist: tomoscan >=2.1.0
56
+ Requires-Dist: tomoscan >=2.1.0a14
57
57
  Requires-Dist: psutil
58
58
  Requires-Dist: pytest
59
59
  Requires-Dist: tifffile
@@ -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=BeM4pgh4eRU9T-E4ydnqad2Eo39KlEKYGhhvBOzjjGM,270
4
+ nabu/__init__.py,sha256=IjlfSehTIFckwK0pXQs5uRXr89VhP7Fm7q30c7f4tFk,274
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
@@ -64,8 +64,8 @@ nabu/cuda/src/transpose.cu,sha256=Enim7vLxTCFZbK3BmYdQ6ZatA_FLp6601VOSl8iGFjg,47
64
64
  nabu/cuda/tests/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
65
65
  nabu/estimation/__init__.py,sha256=HWE3ivArjlJx4FjFh2Q73VmpIyzod80KTmXvFo1AP1s,379
66
66
  nabu/estimation/alignment.py,sha256=DWe4PBLsAOt95m_UEinVXUhXyYDmV0NOHW-oHpVEjVk,21185
67
- nabu/estimation/cor.py,sha256=HcE0xw0ECSkx_kG30taw964rWZwh6lfgg8m9wnKdXik,50415
68
- nabu/estimation/cor_sino.py,sha256=Wh0t8Ak6h8kf3rn5azD1XqD4e0Xa90oZUy90n9Ory8c,19116
67
+ nabu/estimation/cor.py,sha256=Vdrne_fyvOlJuuBHpxmJLZbgPa6jx4VUqM-_91KtD5U,50577
68
+ nabu/estimation/cor_sino.py,sha256=ArVpZeCPsGwo8PR63MUBonel6U5s7TK_S2jU_qPLV1M,18997
69
69
  nabu/estimation/distortion.py,sha256=DEXizQpgHBXmrhbQ0kuEchicxmiDgmU2qrh8bCgSezg,4701
70
70
  nabu/estimation/focus.py,sha256=I2B5ODmGToE0-Y-B_6v1zJv7XcWdkXPZzrs2uYpiPlc,18029
71
71
  nabu/estimation/tilt.py,sha256=AaBBOzM2bVlScphCdORbfEi_mJjyuwkYvvDmr2Fosvg,8723
@@ -131,14 +131,14 @@ nabu/pipeline/config_validators.py,sha256=ocAKB26iRjm5qs1Ay4B_rgGcg8aZjAP34XpEZR
131
131
  nabu/pipeline/datadump.py,sha256=lK36YlsVSeE4fdkD7cgVCl4RKn-Wa9KYgOw4DNtH8Ow,6982
132
132
  nabu/pipeline/dataset_validator.py,sha256=etQw9NC_YGsdWCgjsn8aJ3WfvcRuJlLVZlWoqhvvo-8,9263
133
133
  nabu/pipeline/detector_distortion_provider.py,sha256=ru1AxbcuO-FA8FYooPBWgp1lzdSDUtzFUC1A_sS8jME,920
134
- nabu/pipeline/estimators.py,sha256=AZXDmz7hngbVEfytpcu3E2QkOG4IqtXjQN8uUMBJTa0,40298
134
+ nabu/pipeline/estimators.py,sha256=x2SLCDrpLFAmyDN6YNEmhfTdnEZIp92Odu2bhnweq6U,38324
135
135
  nabu/pipeline/params.py,sha256=EoovjCUTUXmj5HQ3qE0RhP7XD3cndaiT21TdvjTIhE8,3746
136
136
  nabu/pipeline/processconfig.py,sha256=3xx2Lc8uEzPAqSMwUncr4RCiCtKn2c7wnXXbPSn8GNo,7719
137
137
  nabu/pipeline/reader.py,sha256=wkxPHYOi_C8dHNc7kddB8AMtFuW7GjsP_tm6SJeHlEY,4792
138
138
  nabu/pipeline/utils.py,sha256=0O1GLyYLQ8oA2ErI_T3BIfEVjP48dl-u_gl91eX7pjU,3543
139
- nabu/pipeline/writer.py,sha256=MG_R1oU8Ff9NdKRHiBkLMz0CmvEXY47zBUE-DpjXElQ,8172
139
+ nabu/pipeline/writer.py,sha256=V4b6tGHMj5KpTl2RmDltSP-a-BEw5lfR96cBAdm_6FQ,7649
140
140
  nabu/pipeline/fullfield/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
141
- nabu/pipeline/fullfield/chunked.py,sha256=_LauzrZSMO0y6E1g_zYFweK8wb07u1p2JulrVDRnA04,40549
141
+ nabu/pipeline/fullfield/chunked.py,sha256=LxT9LxViYIihgy0N34BgY9uvMlupfJYiX9l6Hp2EdlA,40348
142
142
  nabu/pipeline/fullfield/chunked_cuda.py,sha256=Jdkk6ZIt3S6UZYbupHtSj2vrj3krWMcqRHHprfblDfk,5848
143
143
  nabu/pipeline/fullfield/computations.py,sha256=AEp3qvwyY-l8-GzjH1E6kmcmU6OgDp6sB-mltq0Jnxg,9970
144
144
  nabu/pipeline/fullfield/dataset_validator.py,sha256=Iy6oOnXnBldDcg0ifm_zzrzMQ6YdkR_hkHFySZgxbno,2943
@@ -159,7 +159,7 @@ nabu/pipeline/helical/processconfig.py,sha256=IlCfKkiclBmDDdT6Ail3aSj9Q7zV38YpFm
159
159
  nabu/pipeline/helical/span_strategy.py,sha256=7zV_Oo_liFiuv6m70o08XyoEIo_7QYs7MV7qtHFTgbc,25044
160
160
  nabu/pipeline/helical/weight_balancer.py,sha256=j0TGe50tbbsilQvml9CgMxeSy83CNaifHj-xuMGl8uE,3981
161
161
  nabu/pipeline/helical/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
162
- nabu/pipeline/tests/test_estimators.py,sha256=usi2Rp0zry5ADJV9k8nHhCqdDBSuHguZvyH-jkg-F48,6146
162
+ nabu/pipeline/tests/test_estimators.py,sha256=kU7R90b5dFMvXMzX8TsAGV61QKUzvws4kkMR_nEdlJs,5943
163
163
  nabu/pipeline/xrdct/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
164
164
  nabu/preproc/__init__.py,sha256=dKxvZvWZXjKS3iPRaSXiUeM2dNGIOyTlirq5pdAWY0Y,284
165
165
  nabu/preproc/alignment.py,sha256=WDSPIlogwPfQDTqEyRH_ovaQ7vCpnR6XE_Ycif1wP0I,379
@@ -250,7 +250,7 @@ nabu/reconstruction/tests/test_reconstructor.py,sha256=3p2Wk_OqgZqkNOkhK_NJWlHkO
250
250
  nabu/reconstruction/tests/test_sino_normalization.py,sha256=fGv5Dlidxgm8ZC70Nk6oqVgpY2jzOW9NJaGlo44IJOo,3692
251
251
  nabu/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
252
252
  nabu/resources/cor.py,sha256=-mcrTbj3G7o4PP5E_gIRo2j6_-ADmMkkOc_0CyQv84c,170
253
- nabu/resources/dataset_analyzer.py,sha256=e3AqYR9ORW9Q03mGYCiC66nXld-X0LPnx9E8X3zFIGU,18568
253
+ nabu/resources/dataset_analyzer.py,sha256=BSU03X-G8dBt_82OrNu83GYKL9Aj0hVD_JGPzbYpYeo,18379
254
254
  nabu/resources/gpu.py,sha256=GgpMb5umRQAUsEDEAefb4wSA5qm4JSMhkWmCEpW3X9g,5702
255
255
  nabu/resources/logger.py,sha256=-lOzhN_sU4R3BIfC69aMj2O8S_ocsvXsmwkhWlcxVEc,3758
256
256
  nabu/resources/nxflatfield.py,sha256=XlhLYj1TmSQ4s36W48kn0lNTvqXlFCuZxKHfTveltow,9225
@@ -311,9 +311,9 @@ nabu/thirdparty/pore3d_deringer_munch.py,sha256=o4bisnFc-wMjuohWBT8wgWmfNehPQGtC
311
311
  nabu/thirdparty/tomocupy_remove_stripe.py,sha256=Khe4zFf0kRzu65Yxnvq58gt1ljOztqJGdMDhVAiM7lM,24363
312
312
  nabu/thirdparty/tomopy_phase.py,sha256=hK4oPpkogLOhv23XzzEXQY2u3r8fJvASY_bINVs6ERE,8634
313
313
  nabu/thirdparty/tomwer_load_flats_darks.py,sha256=ZNoVAinUb_wGYbfvs_4BVnWsjsQmNxSvCh1bWhR2WWg,5611
314
- nabu-2024.2.0.dist-info/LICENSE,sha256=1eAIPSnEsnSFNUODnLtNtQTs76exG3ZxJ1DJR6zoUBA,1066
315
- nabu-2024.2.0.dist-info/METADATA,sha256=u-pY_1lM9XNtC-flH62tD52Vi6ZTMQFFZjICdc9YoyI,5538
316
- nabu-2024.2.0.dist-info/WHEEL,sha256=5sUXSg9e4bi7lTLOHcm6QEYwO5TIF1TNbTSVFVjcJcc,92
317
- nabu-2024.2.0.dist-info/entry_points.txt,sha256=cJKGkBeykVL7uK3E4R0RLRqMXifTL2qdO573syPAvJc,1288
318
- nabu-2024.2.0.dist-info/top_level.txt,sha256=fsm_N3eXLRZk2QXF9OSKPNDPFXOz8FAQjHh5avT3dok,9
319
- nabu-2024.2.0.dist-info/RECORD,,
314
+ nabu-2024.2.0rc1.dist-info/LICENSE,sha256=1eAIPSnEsnSFNUODnLtNtQTs76exG3ZxJ1DJR6zoUBA,1066
315
+ nabu-2024.2.0rc1.dist-info/METADATA,sha256=bGcyrOw9Xc9slZP_dMGa8JCNBlrwvSzNXpv4kenxTPY,5544
316
+ nabu-2024.2.0rc1.dist-info/WHEEL,sha256=5sUXSg9e4bi7lTLOHcm6QEYwO5TIF1TNbTSVFVjcJcc,92
317
+ nabu-2024.2.0rc1.dist-info/entry_points.txt,sha256=cJKGkBeykVL7uK3E4R0RLRqMXifTL2qdO573syPAvJc,1288
318
+ nabu-2024.2.0rc1.dist-info/top_level.txt,sha256=fsm_N3eXLRZk2QXF9OSKPNDPFXOz8FAQjHh5avT3dok,9
319
+ nabu-2024.2.0rc1.dist-info/RECORD,,