nabu 2024.1.7__py3-none-any.whl → 2024.1.8__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.
doc/doc_config.py ADDED
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env python
2
+
3
+ from nabu.resources.nabu_config import nabu_config
4
+
5
+
6
+ def generate(file_):
7
+ def write(content):
8
+ print(content, file=file_)
9
+ for section, values in nabu_config.items():
10
+ if section == "about":
11
+ continue
12
+ write("## %s\n" % section)
13
+ for key, val in values.items():
14
+ if val["type"] == "unsupported":
15
+ continue
16
+ write(val["help"] + "\n")
17
+ write(
18
+ "```ini\n%s = %s\n```"
19
+ % (key, val["default"])
20
+ )
21
+
22
+
23
+
24
+ if __name__ == "__main__":
25
+
26
+ import sys, os
27
+ print(os.path.abspath(__file__))
28
+ exit(0)
29
+
30
+ fname = "/tmp/test.md"
31
+ with open(fname, "w") as f:
32
+ generate(f)
nabu/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
- __version__ = "2024.1.7"
1
+ __version__ = "2024.1.8"
2
2
  __nabu_modules__ = [
3
3
  "app",
4
4
  "cuda",
@@ -575,10 +575,11 @@ class ChunkedPipeline:
575
575
  (self.radios_shape[1],) + self.sino_shape,
576
576
  source_sample_dist,
577
577
  sample_detector_dist,
578
- angles=options["angles"],
579
- # TODO one center for each angle to handle "x translations"
578
+ angles=-options["angles"],
580
579
  rot_center=options["rotation_axis_position"],
580
+ axis_correction=-options["axis_correction"],
581
581
  pixel_size=1,
582
+ scale_factor=1.0 / options["voxel_size_cm"][0],
582
583
  )
583
584
 
584
585
  self._allocate_recs(*self.process_config.rec_shape, n_slices=n_slices)
@@ -732,12 +733,16 @@ class ChunkedPipeline:
732
733
  """
733
734
 
734
735
  n_angles, n_z, n_x = self.radios.shape
736
+
737
+ # FIXME
735
738
  # can't do a discontiguous single copy...
736
739
  sinos_contig = self._allocate_array((n_z, n_angles, n_x), np.float32, "sinos_cone")
737
740
  for i in range(n_z):
738
741
  sinos_contig[i] = self.radios[:, i, :]
739
- #
742
+ # ---
740
743
 
744
+ # In principle radios are not cropped at this stage,
745
+ # so self.sub_region[2][0] can be used instead of self.get_slice_start_index() instead of self.sub_region[2][0]
741
746
  z_min, z_max = self.sub_region_xz[2:]
742
747
  n_z_tot = self.process_config.radio_shape(binning=True)[0]
743
748
 
@@ -517,10 +517,15 @@ class ProcessConfig(ProcessConfigBase):
517
517
  #
518
518
  # Translation movements
519
519
  #
520
+
520
521
  translations = dataset_info.translations
521
522
  if translations is not None:
522
- tasks.append("radios_movements")
523
- options["radios_movements"] = {"translation_movements": dataset_info.translations}
523
+ if np.max(np.abs(translations[:, 1])) < 1e-5:
524
+ self.logger.warning("No vertical translation greater than 1e-5 - disabling vertical shifts")
525
+ # horizontal movements are handled in backprojector
526
+ else:
527
+ tasks.append("radios_movements")
528
+ options["radios_movements"] = {"translation_movements": dataset_info.translations}
524
529
  #
525
530
  # Sinogram normalization (before half-tomo)
526
531
  #
@@ -359,6 +359,16 @@ class FullFieldReconstructor:
359
359
 
360
360
  return (max_overlap, 0)
361
361
 
362
+ def _compute_rotation_margin(self):
363
+ if "rotate_projections" in self.process_config.processing_steps:
364
+ # Partial radios rotation yields too much error in single-slice mode
365
+ # Forcing a big margin circumvents the problem
366
+ # This is likely to trigger the 'grouped mode', but perhaps grouped mode should always be used when rotating radios
367
+ nz, nx = self.process_config.radio_shape(binning=True)
368
+ return nz // 3, nx // 3
369
+ else:
370
+ return 0, 0
371
+
362
372
  def _ensure_good_chunk_size_and_margin(self):
363
373
  """
364
374
  Check that "chunk_size" and "margin" (if any) are a multiple of binning factor.
@@ -23,7 +23,9 @@ class ConebeamReconstructor:
23
23
  volume_shape=None,
24
24
  rot_center=None,
25
25
  relative_z_position=None,
26
+ axis_correction=None,
26
27
  pixel_size=None,
28
+ scale_factor=None,
27
29
  cuda_options=None,
28
30
  ):
29
31
  """
@@ -88,6 +90,7 @@ class ConebeamReconstructor:
88
90
  Optics Express. 24. 25129-25147. 10.1364/OE.24.025129.
89
91
  """
90
92
  self._init_cuda(cuda_options)
93
+ self.scale_factor = scale_factor
91
94
  self._init_geometry(
92
95
  sinos_shape,
93
96
  source_origin_dist,
@@ -97,6 +100,7 @@ class ConebeamReconstructor:
97
100
  volume_shape,
98
101
  rot_center,
99
102
  relative_z_position,
103
+ axis_correction,
100
104
  )
101
105
  self._alg_id = None
102
106
  self._vol_id = None
@@ -133,6 +137,7 @@ class ConebeamReconstructor:
133
137
  volume_shape,
134
138
  rot_center,
135
139
  relative_z_position,
140
+ axis_correction,
136
141
  ):
137
142
  self._set_sino_shape(sinos_shape)
138
143
  if angles is None:
@@ -153,6 +158,7 @@ class ConebeamReconstructor:
153
158
  if rot_center is not None:
154
159
  self._cor_shift = (self.prj_width - 1) / 2.0 - rot_center
155
160
  self._set_pixel_size(pixel_size)
161
+ self._axis_corrections = axis_correction
156
162
  self._create_astra_proj_geometry(relative_z_position)
157
163
 
158
164
  def _create_astra_proj_geometry(self, relative_z_position):
@@ -170,13 +176,26 @@ class ConebeamReconstructor:
170
176
  self.origin_detector_dist,
171
177
  )
172
178
  self.relative_z_position = relative_z_position or 0.0
179
+ # This will turn the geometry of type "cone" into a geometry of type "cone_vec"
173
180
  self.proj_geom = astra.geom_postalignment(self.proj_geom, (self._cor_shift, 0))
181
+ # (src, detector_center, u, v) = (srcX, srcY, srcZ, dX, dY, dZ, uX, uY, uZ, vX, vY, vZ)
182
+ vecs = self.proj_geom["Vectors"]
183
+
184
+ # To adapt the center of rotation:
185
+ # dX = cor_shift * cos(theta) - origin_detector_dist * sin(theta)
186
+ # dY = origin_detector_dist * cos(theta) + cor_shift * sin(theta)
187
+ if self._axis_corrections is not None:
188
+ # should we check that dX and dY match the above formulas ?
189
+ cor_shifts = self._cor_shift + self._axis_corrections
190
+ vecs[:, 3] = cor_shifts * np.cos(self.angles) - self.origin_detector_dist * np.sin(self.angles)
191
+ vecs[:, 4] = self.origin_detector_dist * np.cos(self.angles) + cor_shifts * np.sin(self.angles)
192
+
193
+ # To adapt the z position:
174
194
  # Component 2 of vecs is the z coordinate of the source, component 5 is the z component of the detector position
175
195
  # We need to re-create the same inclination of the cone beam, thus we need to keep the inclination of the two z positions.
176
196
  # The detector is centered on the rotation axis, thus moving it up or down, just moves it out of the reconstruction volume.
177
197
  # We can bring back the detector in the correct volume position, by applying a rigid translation of both the detector and the source.
178
198
  # The translation is exactly the amount that brought the detector up or down, but in the opposite direction.
179
- vecs = self.proj_geom["Vectors"]
180
199
  vecs[:, 2] = -self.relative_z_position
181
200
 
182
201
  def _set_output(self, volume):
@@ -229,6 +248,8 @@ class ConebeamReconstructor:
229
248
  result = self.cuda.get_array("output")
230
249
  if output is None:
231
250
  result = result.get()
251
+ if self.scale_factor is not None:
252
+ result *= np.float32(self.scale_factor) # in-place for pycuda
232
253
  self.cuda.recover_arrays_references(["sinos", "output"])
233
254
  return result
234
255
 
@@ -1,7 +1,7 @@
1
1
  import pytest
2
2
  import numpy as np
3
- from scipy.ndimage import gaussian_filter
4
- from nabu.utils import subdivide_into_overlapping_segment
3
+ from scipy.ndimage import gaussian_filter, shift
4
+ from nabu.utils import subdivide_into_overlapping_segment, clip_circle
5
5
 
6
6
  try:
7
7
  import astra
@@ -238,6 +238,65 @@ class TestCone:
238
238
  assert np.max(err_max_profile) < 2e-3
239
239
  assert np.max(err_median_profile) < 5e-6
240
240
 
241
+ def test_reconstruction_horizontal_translations(self):
242
+ n_z = n_y = n_x = 256
243
+ n_a = 500
244
+ src_orig_dist = 1000
245
+ orig_det_dist = 50
246
+
247
+ volume, cone_data = generate_hollow_cube_cone_sinograms(
248
+ vol_shape=(n_z, n_y, n_x),
249
+ n_angles=n_a,
250
+ src_orig_dist=src_orig_dist,
251
+ orig_det_dist=orig_det_dist,
252
+ apply_filter=False,
253
+ )
254
+
255
+ # Apply horizontal translations on projections. This could have been done directly with astra
256
+ shift_min, shift_max = -2, 5
257
+ shifts_float = (shift_max - shift_min) * np.random.rand(n_a) - shift_min
258
+ shifts_int = np.random.randint(shift_min, high=shift_max + 1, size=n_a)
259
+
260
+ reconstructor_args = [
261
+ cone_data.shape,
262
+ src_orig_dist,
263
+ orig_det_dist,
264
+ ]
265
+ reconstructor_kwargs = {
266
+ "volume_shape": volume.shape,
267
+ "cuda_options": {"ctx": self.ctx},
268
+ }
269
+ cone_reconstructor = ConebeamReconstructor(*reconstructor_args, **reconstructor_kwargs)
270
+ rec = cone_reconstructor.reconstruct(cone_data)
271
+
272
+ # Translations done with floating-point shift values give a blurring of the image that cannot be recovered.
273
+ # Error tolerance has to be higher for these shifts.
274
+ for shift_type, shifts, err_tol in [
275
+ ("integer shifts", shifts_int, 5e-3),
276
+ ("float shifts", shifts_float, 1.4e-1),
277
+ ]:
278
+ cone_data_shifted = np.zeros_like(cone_data)
279
+ [shift(cone_data[:, i, :], (0, shifts[i]), output=cone_data_shifted[:, i, :]) for i in range(n_a)]
280
+
281
+ # Reconstruct with horizontal shifts
282
+ cone_reconstructor_with_correction = ConebeamReconstructor(
283
+ *reconstructor_args,
284
+ axis_corrections=shifts,
285
+ **reconstructor_kwargs,
286
+ )
287
+
288
+ rec_with_correction = cone_reconstructor_with_correction.reconstruct(cone_data_shifted)
289
+
290
+ metric = lambda img: np.max(np.abs(clip_circle(img, radius=int(0.85 * img.shape[1] // 2))))
291
+ error_profile = np.array([metric(rec[i] - rec_with_correction[i]) for i in range(n_z)])
292
+ assert error_profile.max() < err_tol, "Max error with %s is too high" % shift_type
293
+
294
+ # import matplotlib.pyplot as plt
295
+ # plt.figure()
296
+ # plt.plot(np.arange(n_z), error_profile)
297
+ # plt.legend([shift_type])
298
+ # plt.show()
299
+
241
300
 
242
301
  def generate_hollow_cube_cone_sinograms(
243
302
  vol_shape, n_angles, src_orig_dist, orig_det_dist, prj_width=None, apply_filter=True
@@ -695,11 +695,6 @@ def test_DistributePostProcessZStitcher(tmp_path, configuration_dist, flip_ud):
695
695
  if complete:
696
696
  concatenate_volumes(output_volume=final_vol, volumes=tuple(reconstructed_sub_volumes), axis=1)
697
697
  final_vol.load_data(store=True)
698
- with h5py.File("debug.hdf5", mode="w") as h5f:
699
- h5f["raw_volume"] = raw_volume
700
- h5f["final_vol"] = final_vol.data
701
- h5f["volume1"] = volume_1.data
702
- h5f["volume2"] = volume_2.data
703
698
  numpy.testing.assert_almost_equal(
704
699
  raw_volume,
705
700
  final_vol.data,
@@ -925,14 +920,6 @@ def test_vol_z_stitching_with_alignment_axis_2(tmp_path, alignment_axis_2):
925
920
 
926
921
  assert output_volume.data.shape == (120, 4, 120)
927
922
 
928
- import h5py
929
-
930
- with h5py.File("input.h5", mode="w") as h5f:
931
- h5f["data"] = raw_volume
932
-
933
- with h5py.File("output.h5", mode="w") as h5f:
934
- h5f["data"] = output_volume.data
935
-
936
923
  if alignment_axis_2 == "center":
937
924
  numpy.testing.assert_array_almost_equal(raw_volume[:, :, 10:-10], output_volume.data[:, :, 10:-10])
938
925
  elif alignment_axis_2 == "left":
@@ -1975,7 +1975,7 @@ def stitch_vertically_raw_frames(
1975
1975
  | | Frame 2 | --------------
1976
1976
  | | |
1977
1977
  | --------------
1978
- \/
1978
+ |
1979
1979
 
1980
1980
  returns stitched_projection, raw_img_1, raw_img_2, computed_overlap
1981
1981
  proj_0 and pro_1 are already expected to be in a row. Having stitching_height_in_px in common. At top of proj_0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nabu
3
- Version: 2024.1.7
3
+ Version: 2024.1.8
4
4
  Summary: Nabu - Tomography software
5
5
  Author-email: Pierre Paleo <pierre.paleo@esrf.fr>, Henri Payno <henri.payno@esrf.fr>, Alessandro Mirone <mirone@esrf.fr>, Jérôme Lesaint <jerome.lesaint@esrf.fr>
6
6
  Maintainer-email: Pierre Paleo <pierre.paleo@esrf.fr>
@@ -49,7 +49,7 @@ Classifier: Topic :: Scientific/Engineering :: Medical Science Apps.
49
49
  Requires-Python: >=3.7
50
50
  Description-Content-Type: text/markdown
51
51
  License-File: LICENSE
52
- Requires-Dist: numpy >1.9.0
52
+ 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
@@ -66,7 +66,7 @@ Provides-Extra: full
66
66
  Requires-Dist: scikit-image ; extra == 'full'
67
67
  Requires-Dist: PyWavelets ; extra == 'full'
68
68
  Requires-Dist: glymur ; extra == 'full'
69
- Requires-Dist: pycuda ; extra == 'full'
69
+ Requires-Dist: pycuda <2024.1.1 ; extra == 'full'
70
70
  Requires-Dist: scikit-cuda ; extra == 'full'
71
71
  Requires-Dist: pycudwt ; extra == 'full'
72
72
  Requires-Dist: sluurp >=0.3 ; extra == 'full'
@@ -1,7 +1,8 @@
1
1
  doc/conf.py,sha256=3xtCarCHrXPr50GbeRDuH-o3Jzojw7mpr7vpGfZPLAE,3787
2
2
  doc/create_conf_doc.py,sha256=IVOdP70KvbW9WS_UQu3Iyd0YfS60E2fJ5IDtQ_s4cDw,1143
3
+ doc/doc_config.py,sha256=anqeOVjqE2e7eVzg7yuh9dvIneTkrA5doGl1cVBqT7Q,730
3
4
  doc/get_mathjax.py,sha256=VIvKRCdDuF2VoY8JD3mSey9XX13AZMmwTJBHdt1tUs4,1012
4
- nabu/__init__.py,sha256=syNuJVNxIJSDQ2NM6gqCh37LvuExshXotfyhoQEwQhc,270
5
+ nabu/__init__.py,sha256=DO4fHjlr5q2r3IDpkSpuzsOIMuHK5R3I2w91UQaUEdY,270
5
6
  nabu/tests.py,sha256=cew9OY2uTyncHI_HM32W8CP6B1GTGKaOW65XtMEqs7o,1417
6
7
  nabu/testutils.py,sha256=qqtGgkIhpOpXhgeoXlqCb91Rx-JlI4ALaDF6nt8YRRk,13298
7
8
  nabu/utils.py,sha256=w-xfRb6TFQpS-tao6nlvfmr962pmeec-WH1GltSUCrk,23767
@@ -31,7 +32,6 @@ nabu/app/shrink_dataset.py,sha256=P9dorO0Q-gPAWgSHyZi3XQp4jkMTJacDYzNvJY4oh98,35
31
32
  nabu/app/stitching.py,sha256=Ibp1oVokLVMz-VX762j1C0E88Di0YJvRt-b8NjGoe7g,3310
32
33
  nabu/app/utils.py,sha256=XUBRWDmth4i3BZHd27rfarFAUP7OEcsMeVmDJ6T4EXA,1178
33
34
  nabu/app/validator.py,sha256=IR-DcUV5h1Fc5CChBfBIaglrGpfKNICX7tGirAroMiw,3368
34
- nabu/app/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
35
  nabu/app/tests/test_reduce_dark_flat.py,sha256=T-_zyzD0-f2c5Z-tlzmRF5p3vPtyL2RFb-D5fIYYEoM,2641
36
36
  nabu/cuda/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
37
  nabu/cuda/convolution.py,sha256=n8KsJ7IZdPOs_K5QZC6qblnOvIKYwxtdt03oNa0GiMU,241
@@ -136,13 +136,13 @@ nabu/pipeline/processconfig.py,sha256=O0phgvfWtL9bg3_GE3cw9MZXS8PUy8z2rzhpoqP9U8
136
136
  nabu/pipeline/utils.py,sha256=NONAgBfTfUYvBNfoTqD33MAYaPZyCJL10SnR6B0lLec,3462
137
137
  nabu/pipeline/writer.py,sha256=0ts40VNN3RiRURvZ2gNqsigsAJuwcjnYF4RJ15qaMpI,7558
138
138
  nabu/pipeline/fullfield/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
139
- nabu/pipeline/fullfield/chunked.py,sha256=DdmSXI9BnWPrXG99MbzqQdJrh0DHlkuM8Dnv5xWkcM0,36873
139
+ nabu/pipeline/fullfield/chunked.py,sha256=IElD8g_KtYS7VOXuIEsRbdb9fMmtpB_AK7mAyejbEs0,37125
140
140
  nabu/pipeline/fullfield/chunked_cuda.py,sha256=aGzjY8MX6OL8auEj6Y0RfOGCmFnczsdfj6-8Net5AbQ,5645
141
141
  nabu/pipeline/fullfield/computations.py,sha256=VpIURVXh8EpNSfait_AIFM4Ci-GK_546Wkb-Wn9r31Y,9935
142
142
  nabu/pipeline/fullfield/dataset_validator.py,sha256=8B2lB9j7elF_NmOOOyr8UADVfC15Oofzy2AyWoPufQM,3265
143
143
  nabu/pipeline/fullfield/nabu_config.py,sha256=a0mMoLkvlvHgX6RmUS1m1UhJS-XB3O6wBCnkNoI90Cs,30358
144
- nabu/pipeline/fullfield/processconfig.py,sha256=TKQeHyImp5blhP4_lve8g5voDjSKAMNv7kelyB3e698,36143
145
- nabu/pipeline/fullfield/reconstruction.py,sha256=Km_ZDtoiDQdX3TdTh6E9bzS5hoMC0jYU5eZWodaLbIg,36627
144
+ nabu/pipeline/fullfield/processconfig.py,sha256=qSVeUvpt9BS2kR3zNk95_MGoLV4idiSJyYHlAPXbgTs,36405
145
+ nabu/pipeline/fullfield/reconstruction.py,sha256=b-ErQE__Ttz2XECJjmdoY6Msfh-lrUOPZCsAhn6p-nA,37150
146
146
  nabu/pipeline/helical/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
147
147
  nabu/pipeline/helical/dataset_validator.py,sha256=0YQc0hdYdpaXznFaKmlj9SIu7mNs0xXMejcRkhOZHaI,640
148
148
  nabu/pipeline/helical/fbp.py,sha256=0fAz-Fb0Rn_FzellvcS2cy-Wvm-5dxEf494YFt4pLws,5845
@@ -223,7 +223,7 @@ nabu/processing/tests/test_rotation.py,sha256=vedRXV9RePJywBKoyBkGANP1dhZCjphbYO
223
223
  nabu/processing/tests/test_transpose.py,sha256=hTG17wTaB5Wv6twbW3ZFhBv6BYfqJY7DTQPoO0-KdkM,2760
224
224
  nabu/processing/tests/test_unsharp.py,sha256=R3ovbwDDp3ccy2A8t6CcUVELXRWkED5EnQdN2FQOfQM,4391
225
225
  nabu/reconstruction/__init__.py,sha256=EmKVvx_-FJvzJngG4ielIC7FhMCpI1Waaflg_lF44tk,163
226
- nabu/reconstruction/cone.py,sha256=kVe1CWtkfOkeYH1jrSFVO9mON58p5BR1_MKxdmiEgbM,11028
226
+ nabu/reconstruction/cone.py,sha256=ET0xCoFRt5oD7IpzHNmlm-bX4eanBenH186VGTgLAj0,12159
227
227
  nabu/reconstruction/fbp.py,sha256=5GB7XCnxftSHq1ZBLjWi-7OTiyCU4qe-M4EPzvsoxLg,4829
228
228
  nabu/reconstruction/fbp_base.py,sha256=igY--_GiKGAcephOU1I8O1GjVcryJnReyywlgtROXW4,16833
229
229
  nabu/reconstruction/fbp_opencl.py,sha256=coEGLq65PCuvWnhAbIyLPHACkWjMB0XOceMp9ZIDWtc,3274
@@ -239,7 +239,7 @@ nabu/reconstruction/sinogram.py,sha256=KTSGP_JJABf4Yr9l628HPbyWsBnpbnyGKyPEq3ZrP
239
239
  nabu/reconstruction/sinogram_cuda.py,sha256=wS84AIy3T00d1kTtuJOQmA3hktbDVs4ybwB9haiBcoY,10623
240
240
  nabu/reconstruction/sinogram_opencl.py,sha256=p793N26VknU8KIZLtDgFY6HNx0TylemZ1YL4WKD3fHs,1403
241
241
  nabu/reconstruction/tests/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
242
- nabu/reconstruction/tests/test_cone.py,sha256=R9Q-o9jz5ZBRwpGRRDwWr4owrrI3bJow5f_x_toq_lw,11813
242
+ nabu/reconstruction/tests/test_cone.py,sha256=xrFsIFGmpE9txpR3d93upF2S4yS_53IjZdZEKaaYspg,14313
243
243
  nabu/reconstruction/tests/test_deringer.py,sha256=C5wj6RNzmpt_Cry4fonC8KXWvgPpcXfRbG8Bex_30S4,8380
244
244
  nabu/reconstruction/tests/test_fbp.py,sha256=p80zPCZkgJpERpqG5HHfbtbHBeqJUT8WY-q6FXOJJ7M,10053
245
245
  nabu/reconstruction/tests/test_filtering.py,sha256=PFJLQMDBQo-UuS_CfKrWZ_DdHarmVlcbsiZ_kmToWXY,4782
@@ -272,7 +272,7 @@ nabu/stitching/overlap.py,sha256=eXAKsILS5jwqFY62JhDijeNW8H50rP-yjdUUGqjj0aY,157
272
272
  nabu/stitching/sample_normalization.py,sha256=_radin_wxnuD3MMmZNAOKA__aPa2z3ss4TFbZeocpXc,2069
273
273
  nabu/stitching/slurm_utils.py,sha256=sZ-VQPh_YlJ1Lkh7ap8qxII0rBpZryMyoxE5Xn557t8,8906
274
274
  nabu/stitching/utils.py,sha256=kMn2JEMDhcBQMweSlM0rUd-037H7iNUURTFMhXOTzC8,23651
275
- nabu/stitching/z_stitching.py,sha256=RRrLUDiOrImj1wvun13RkEC9tYL3WvbCNzS66iSKMgg,103400
275
+ nabu/stitching/z_stitching.py,sha256=_DnPn4einJgzjqYu4u-LSwLAOoDgp5Jdu7iTYdsx9bw,103399
276
276
  nabu/stitching/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
277
277
  nabu/stitching/tests/test_alignment.py,sha256=MACak1ILOr8nRKeT0mWfMd-ZvhCl3SWjjcp6GjRbITc,2735
278
278
  nabu/stitching/tests/test_config.py,sha256=ttWuVB9Y_MM3_wGdKbcbYi_PG3vN87cL7o5zKsMzn9g,8490
@@ -281,16 +281,16 @@ nabu/stitching/tests/test_overlap.py,sha256=vfZuK32pclWL0Hg8u5NH0JoxKO28qk3ObRMm
281
281
  nabu/stitching/tests/test_sample_normalization.py,sha256=E49E_Quv-Qon6qSuaH9ZBZLqq4TPuBl8RqgB18Rwjc0,1348
282
282
  nabu/stitching/tests/test_slurm_utils.py,sha256=bbhCQd06R3irGB4B9r79KKlf0AlBchI53N2ldsXoAQQ,4950
283
283
  nabu/stitching/tests/test_utils.py,sha256=CjV0vPvXEchJ5vo6o7hGQA-PsOOAyAamuQ6fiHKCQ9M,641
284
- nabu/stitching/tests/test_z_stitching.py,sha256=8gio27FTULOX7bzypmdaAyVwQiO-JOwgBL1e9FwZUN4,42582
284
+ nabu/stitching/tests/test_z_stitching.py,sha256=7VbNb7LwAahkLrxmx4V1M292op3e8W5M5NMZ2KABhFw,42160
285
285
  nabu/thirdparty/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
286
286
  nabu/thirdparty/algotom_convert_sino.py,sha256=iZVRilvyqMyLTu8RKgbqDFUjObWW5X69rCARrnNizuI,13872
287
287
  nabu/thirdparty/pore3d_deringer_munch.py,sha256=o4bisnFc-wMjuohWBT8wgWmfNehPQGtCl6G2NebJlbg,4500
288
288
  nabu/thirdparty/tomocupy_remove_stripe.py,sha256=VgXHr2tzTAAGZix5pwhFfbPxj4tt3yXBcjCPNQSLPAg,22810
289
289
  nabu/thirdparty/tomopy_phase.py,sha256=hK4oPpkogLOhv23XzzEXQY2u3r8fJvASY_bINVs6ERE,8634
290
290
  nabu/thirdparty/tomwer_load_flats_darks.py,sha256=ZNoVAinUb_wGYbfvs_4BVnWsjsQmNxSvCh1bWhR2WWg,5611
291
- nabu-2024.1.7.dist-info/LICENSE,sha256=1eAIPSnEsnSFNUODnLtNtQTs76exG3ZxJ1DJR6zoUBA,1066
292
- nabu-2024.1.7.dist-info/METADATA,sha256=_Bv8vjCsYa3a926AT-jJHgEkvMprSL5LYjRNDbhzpiA,5224
293
- nabu-2024.1.7.dist-info/WHEEL,sha256=5sUXSg9e4bi7lTLOHcm6QEYwO5TIF1TNbTSVFVjcJcc,92
294
- nabu-2024.1.7.dist-info/entry_points.txt,sha256=cJKGkBeykVL7uK3E4R0RLRqMXifTL2qdO573syPAvJc,1288
295
- nabu-2024.1.7.dist-info/top_level.txt,sha256=fsm_N3eXLRZk2QXF9OSKPNDPFXOz8FAQjHh5avT3dok,9
296
- nabu-2024.1.7.dist-info/RECORD,,
291
+ nabu-2024.1.8.dist-info/LICENSE,sha256=1eAIPSnEsnSFNUODnLtNtQTs76exG3ZxJ1DJR6zoUBA,1066
292
+ nabu-2024.1.8.dist-info/METADATA,sha256=qlqJl5Qy-ajxs4_j-PfKcIvwds6vYOT9j8V21egtvQs,5237
293
+ nabu-2024.1.8.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
294
+ nabu-2024.1.8.dist-info/entry_points.txt,sha256=cJKGkBeykVL7uK3E4R0RLRqMXifTL2qdO573syPAvJc,1288
295
+ nabu-2024.1.8.dist-info/top_level.txt,sha256=fsm_N3eXLRZk2QXF9OSKPNDPFXOz8FAQjHh5avT3dok,9
296
+ nabu-2024.1.8.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.41.1)
2
+ Generator: bdist_wheel (0.42.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
File without changes