nabu 2024.1.8__py3-none-any.whl → 2024.1.9__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.1.8"
1
+ __version__ = "2024.1.9"
2
2
  __nabu_modules__ = [
3
3
  "app",
4
4
  "cuda",
File without changes
@@ -577,9 +577,11 @@ class ChunkedPipeline:
577
577
  sample_detector_dist,
578
578
  angles=-options["angles"],
579
579
  rot_center=options["rotation_axis_position"],
580
- axis_correction=-options["axis_correction"],
580
+ axis_correction=(-options["axis_correction"] if options["axis_correction"] is not None else None),
581
581
  pixel_size=1,
582
582
  scale_factor=1.0 / options["voxel_size_cm"][0],
583
+ padding_mode=options["padding_type"],
584
+ slice_roi=self.process_config.rec_roi,
583
585
  )
584
586
 
585
587
  self._allocate_recs(*self.process_config.rec_shape, n_slices=n_slices)
@@ -128,7 +128,13 @@ def estimate_required_memory(
128
128
  if process_config.rec_params["method"] == "cone":
129
129
  # In cone-beam reconstruction, need both sinograms and reconstruction inside GPU.
130
130
  # That's big!
131
- total_memory_needed += 2 * data_volume_size
131
+ # Even more if padding is done at the nabu side.
132
+ if rec_config["padding_type"] == "zeros":
133
+ total_memory_needed += 2 * data_volume_size
134
+ else:
135
+ total_memory_needed += (
136
+ data_volume_size + get_next_power(2 * Nx) * Na * Nz * 4 * 4
137
+ ) # no idea why the last *4 is necessary
132
138
 
133
139
  if debug:
134
140
  print(
@@ -1,4 +1,5 @@
1
1
  import numpy as np
2
+ from ..utils import calc_padding_lengths1D, nextpow2
2
3
 
3
4
  try:
4
5
  import astra
@@ -7,6 +8,7 @@ try:
7
8
  except ImportError:
8
9
  __have_astra__ = False
9
10
  from ..cuda.processing import CudaProcessing
11
+ from ..processing.padding_cuda import CudaPadding
10
12
 
11
13
 
12
14
  class ConebeamReconstructor:
@@ -26,6 +28,8 @@ class ConebeamReconstructor:
26
28
  axis_correction=None,
27
29
  pixel_size=None,
28
30
  scale_factor=None,
31
+ padding_mode="zeros",
32
+ slice_roi=None,
29
33
  cuda_options=None,
30
34
  ):
31
35
  """
@@ -53,6 +57,8 @@ class ConebeamReconstructor:
53
57
  relative_z_position: float, optional
54
58
  Position of the central slice of the slab, with respect to the full stack of slices.
55
59
  By default it is set to zero, meaning that the current slab is assumed in the middle of the stack
60
+ axis_correction: array, optional
61
+ Array of the same size as the number of projections. Each corresponds to a horizontal displacement.
56
62
  pixel_size: float or tuple, optional
57
63
  Size of the pixel. Possible options:
58
64
  - Nothing is provided (default): in this case, all lengths are normalized with respect to the pixel size,
@@ -60,7 +66,18 @@ class ConebeamReconstructor:
60
66
  - A scalar number is provided: in this case it is the spacing between two pixels (in each dimension)
61
67
  - A tuple is provided: in this case it is the spacing between two pixels in both dimensions,
62
68
  vertically then horizontally, i.e (detector_spacing_y, detector_spacing_x)
63
-
69
+ scale_factor: float, optional
70
+ Post-reconstruction scale factor.
71
+ padding_mode: str, optional
72
+ How to pad the data before applying FDK. By default this is done by astra with zero-padding.
73
+ If padding_mode is other than "zeros", it will be done by nabu and the padded data is passed to astra
74
+ where no additional padding is done.
75
+ Beware that in its current implementation, this option almost doubles the memory needed.
76
+ slice_roi:
77
+ Whether to reconstruct only a region of interest for each horizontal slice.
78
+ This parameter must be in the form (start_x, end_x, start_y, end_y) with no negative values.
79
+ Note that the current implementation just crops the final reconstructed volume,
80
+ i.e there is no speed or memory benefit.
64
81
 
65
82
  Notes
66
83
  ------
@@ -91,8 +108,9 @@ class ConebeamReconstructor:
91
108
  """
92
109
  self._init_cuda(cuda_options)
93
110
  self.scale_factor = scale_factor
111
+ self._set_sino_shape(sinos_shape)
112
+ self._init_padding(padding_mode)
94
113
  self._init_geometry(
95
- sinos_shape,
96
114
  source_origin_dist,
97
115
  origin_detector_dist,
98
116
  pixel_size,
@@ -101,6 +119,7 @@ class ConebeamReconstructor:
101
119
  rot_center,
102
120
  relative_z_position,
103
121
  axis_correction,
122
+ slice_roi,
104
123
  )
105
124
  self._alg_id = None
106
125
  self._vol_id = None
@@ -116,6 +135,20 @@ class ConebeamReconstructor:
116
135
  self.sinos_shape = sinos_shape
117
136
  self.n_sinos, self.n_angles, self.prj_width = sinos_shape
118
137
 
138
+ def _init_padding(self, padding_mode):
139
+ self._pad_data = False
140
+ self.padding_mode = padding_mode
141
+ if padding_mode == "zeros":
142
+ return
143
+ self._pad_data = True
144
+ n_x = self.prj_width
145
+ x_pad_lens = calc_padding_lengths1D(n_x, nextpow2(n_x * 2))
146
+ self.padder = CudaPadding(
147
+ (self.n_angles, n_x), ((0, 0),) + (x_pad_lens,), mode=padding_mode, cuda_options={"ctx": self.cuda.ctx}
148
+ )
149
+ self._sinos_padded_shape = (self.n_sinos, self.n_angles, self.padder.padded_shape[-1])
150
+ self.prj_width = self.padder.padded_shape[-1] # will impact translations
151
+
119
152
  def _set_pixel_size(self, pixel_size):
120
153
  if pixel_size is None:
121
154
  det_spacing_y = det_spacing_x = 1
@@ -127,9 +160,32 @@ class ConebeamReconstructor:
127
160
  self._det_spacing_y = det_spacing_y
128
161
  self._det_spacing_x = det_spacing_x
129
162
 
163
+ def _set_slice_roi(self, slice_roi):
164
+ self.slice_roi = slice_roi
165
+ self._vol_geom_n_x = self.n_x
166
+ self._vol_geom_n_y = self.n_y
167
+ self._crop_data = True
168
+ if slice_roi is None:
169
+ return
170
+ start_x, end_x, start_y, end_y = slice_roi
171
+ if roi_is_centered(self.volume_shape[1:], (slice(start_y, end_y), slice(start_x, end_x))):
172
+ # For FDK, astra can only reconstruct subregion centered around the origin
173
+ self._vol_geom_n_x = self.n_x - start_x * 2
174
+ self._vol_geom_n_y = self.n_y - start_y * 2
175
+ else:
176
+ # self._crop_data = True
177
+ # self._output_cropped_shape = (
178
+ # self.n_z,
179
+ # np.arange(self.n_y)[start_x:end_x].size,
180
+ # np.arange(self.n_x)[start_y:end_y].size,
181
+ # )
182
+ raise NotImplementedError(
183
+ "Cone-beam geometry supports only slice_roi centered around origin (got slice_roi=%s with n_x=%d, n_y=%d)"
184
+ % (str(slice_roi), self.n_x, self.n_y)
185
+ )
186
+
130
187
  def _init_geometry(
131
188
  self,
132
- sinos_shape,
133
189
  source_origin_dist,
134
190
  origin_detector_dist,
135
191
  pixel_size,
@@ -138,8 +194,8 @@ class ConebeamReconstructor:
138
194
  rot_center,
139
195
  relative_z_position,
140
196
  axis_correction,
197
+ slice_roi,
141
198
  ):
142
- self._set_sino_shape(sinos_shape)
143
199
  if angles is None:
144
200
  self.angles = np.linspace(0, 2 * np.pi, self.n_angles, endpoint=True)
145
201
  else:
@@ -151,12 +207,13 @@ class ConebeamReconstructor:
151
207
  self.source_origin_dist = source_origin_dist
152
208
  self.origin_detector_dist = origin_detector_dist
153
209
  self.magnification = 1 + origin_detector_dist / source_origin_dist
154
- self.vol_geom = astra.create_vol_geom(self.n_y, self.n_x, self.n_z)
210
+ self._set_slice_roi(slice_roi)
211
+ self.vol_geom = astra.create_vol_geom(self._vol_geom_n_y, self._vol_geom_n_x, self.n_z)
155
212
  self.vol_shape = astra.geom_size(self.vol_geom)
156
213
  self._cor_shift = 0.0
157
214
  self.rot_center = rot_center
158
215
  if rot_center is not None:
159
- self._cor_shift = (self.prj_width - 1) / 2.0 - rot_center
216
+ self._cor_shift = (self.sinos_shape[-1] - 1) / 2.0 - rot_center
160
217
  self._set_pixel_size(pixel_size)
161
218
  self._axis_corrections = axis_correction
162
219
  self._create_astra_proj_geometry(relative_z_position)
@@ -200,7 +257,8 @@ class ConebeamReconstructor:
200
257
 
201
258
  def _set_output(self, volume):
202
259
  if volume is not None:
203
- self.cuda.check_array(volume, self.vol_shape)
260
+ expected_shape = self.vol_shape # if not (self._crop_data) else self._output_cropped_shape
261
+ self.cuda.check_array(volume, expected_shape)
204
262
  self.cuda.set_array("output", volume)
205
263
  if volume is None:
206
264
  self.cuda.allocate_array("output", self.vol_shape)
@@ -215,9 +273,16 @@ class ConebeamReconstructor:
215
273
  # TODO don't create new link/proj_id if ptr is the same ?
216
274
  # But it seems Astra modifies the input sinogram while doing FDK, so this might be not relevant
217
275
  d_sinos = self.cuda.get_array("sinos")
276
+
277
+ if self._pad_data:
278
+ sinos_padded = self.cuda.allocate_array("sinos_padded", self._sinos_padded_shape, dtype="f")
279
+ for i in range(self.n_sinos):
280
+ self.padder.pad(self.cuda.sinos[i], output=sinos_padded[i])
281
+ d_sinos = sinos_padded
282
+
218
283
  # self._proj_data_link = astra.data3d.GPULink(d_sinos.ptr, self.prj_width, self.n_angles, self.n_z, sinos.strides[-2])
219
284
  self._proj_data_link = astra.data3d.GPULink(
220
- d_sinos.ptr, self.prj_width, self.n_angles, self.n_sinos, sinos.strides[-2]
285
+ d_sinos.ptr, self.prj_width, self.n_angles, self.n_sinos, d_sinos.strides[-2]
221
286
  )
222
287
  self._proj_id = astra.data3d.link("-sino", self.proj_geom, self._proj_data_link)
223
288
 
@@ -250,13 +315,33 @@ class ConebeamReconstructor:
250
315
  result = result.get()
251
316
  if self.scale_factor is not None:
252
317
  result *= np.float32(self.scale_factor) # in-place for pycuda
318
+ # if self._crop_data:
319
+ # self.cuda.allocate_array("output_cropped", self._output_cropped_shape, dtype=np.float32)
320
+ # for i in range(self.n_z):
321
+ # output
253
322
  self.cuda.recover_arrays_references(["sinos", "output"])
254
323
  return result
255
324
 
256
325
  def __del__(self):
257
- if self._alg_id is not None:
326
+ if getattr(self, "_alg_id", None) is not None:
258
327
  astra.algorithm.delete(self._alg_id)
259
- if self._vol_id is not None:
328
+ if getattr(self, "_vol_id", None) is not None:
260
329
  astra.data3d.delete(self._vol_id)
261
- if self._proj_id is not None:
330
+ if getattr(self, "_proj_id", None) is not None:
262
331
  astra.data3d.delete(self._proj_id)
332
+
333
+
334
+ def selection_is_centered(size, start, stop):
335
+ """
336
+ Return True if (start, stop) define a selection that is centered on the middle of the array.
337
+ """
338
+ if stop > 0:
339
+ stop -= size
340
+ return stop == -start
341
+
342
+
343
+ def roi_is_centered(shape, slice_):
344
+ """
345
+ Return True if "slice_" define a selection that is centered on the middle of the array.
346
+ """
347
+ return all([selection_is_centered(shp, s.start, s.stop) for shp, s in zip(shape, slice_)])
@@ -281,7 +281,7 @@ class TestCone:
281
281
  # Reconstruct with horizontal shifts
282
282
  cone_reconstructor_with_correction = ConebeamReconstructor(
283
283
  *reconstructor_args,
284
- axis_corrections=shifts,
284
+ axis_correction=shifts,
285
285
  **reconstructor_kwargs,
286
286
  )
287
287
 
@@ -297,9 +297,100 @@ class TestCone:
297
297
  # plt.legend([shift_type])
298
298
  # plt.show()
299
299
 
300
+ def test_padding_mode(self):
301
+ n_z = n_y = n_x = 256
302
+ n_a = 500
303
+ src_orig_dist = 1000
304
+ orig_det_dist = 50
305
+
306
+ volume, cone_data = generate_hollow_cube_cone_sinograms(
307
+ vol_shape=(n_z, n_y, n_x),
308
+ n_angles=n_a,
309
+ src_orig_dist=src_orig_dist,
310
+ orig_det_dist=orig_det_dist,
311
+ apply_filter=False,
312
+ )
313
+ reconstructor_args = [
314
+ cone_data.shape,
315
+ src_orig_dist,
316
+ orig_det_dist,
317
+ ]
318
+ reconstructor_kwargs = {
319
+ "volume_shape": volume.shape,
320
+ "cuda_options": {"ctx": self.ctx},
321
+ }
322
+ cone_reconstructor_zero_padding = ConebeamReconstructor(*reconstructor_args, **reconstructor_kwargs)
323
+ rec_z = cone_reconstructor_zero_padding.reconstruct(cone_data)
324
+
325
+ for padding_mode in ["edges"]:
326
+ cone_reconstructor = ConebeamReconstructor(
327
+ *reconstructor_args, padding_mode=padding_mode, **reconstructor_kwargs
328
+ )
329
+ rec = cone_reconstructor.reconstruct(cone_data)
330
+
331
+ metric = lambda img: np.max(np.abs(clip_circle(img, radius=int(0.85 * 128))))
332
+ error_profile = np.array([metric(rec[i] - rec_z[i]) for i in range(n_z)])
333
+ assert error_profile.max() < 3e-2, "Max error for padding=%s is too high" % padding_mode
334
+
335
+ # import matplotlib.pyplot as plt
336
+ # plt.figure()
337
+ # plt.plot(np.arange(n_z), error_profile)
338
+ # plt.legend([padding_mode])
339
+ # plt.show()
340
+
341
+ def test_roi(self):
342
+ n_z = n_y = n_x = 256
343
+ n_a = 500
344
+ src_orig_dist = 1000
345
+ orig_det_dist = 50
346
+
347
+ volume, cone_data = generate_hollow_cube_cone_sinograms(
348
+ vol_shape=(n_z, n_y, n_x),
349
+ n_angles=n_a,
350
+ src_orig_dist=src_orig_dist,
351
+ orig_det_dist=orig_det_dist,
352
+ apply_filter=False,
353
+ rot_center_shift=10,
354
+ )
355
+
356
+ reconstructor_args = [
357
+ cone_data.shape,
358
+ src_orig_dist,
359
+ orig_det_dist,
360
+ ]
361
+ reconstructor_kwargs = {
362
+ "volume_shape": volume.shape,
363
+ "rot_center": (n_x - 1) / 2 + 10,
364
+ "cuda_options": {"ctx": self.ctx},
365
+ }
366
+ cone_reconstructor_full = ConebeamReconstructor(*reconstructor_args, **reconstructor_kwargs)
367
+ ref = cone_reconstructor_full.reconstruct(cone_data)
368
+
369
+ # roi is in the form (start_x, end_x, start_y, end_y)
370
+ for roi in ((20, -20, 10, -10), (0, n_x, 0, n_y), (15, -15, 15, -15)):
371
+ # convert negative indices
372
+ start_x, end_x, start_y, end_y = roi
373
+ if start_y < 0:
374
+ start_y += n_y
375
+ if start_x < 0:
376
+ start_x += n_x
377
+
378
+ cone_reconstructor = ConebeamReconstructor(*reconstructor_args, slice_roi=roi, **reconstructor_kwargs)
379
+ rec = cone_reconstructor.reconstruct(cone_data)
380
+
381
+ assert np.allclose(rec, ref[:, roi[2] : roi[3], roi[0] : roi[1]]), "Something wrong with roi=%s" % (
382
+ str(roi)
383
+ )
384
+
300
385
 
301
386
  def generate_hollow_cube_cone_sinograms(
302
- vol_shape, n_angles, src_orig_dist, orig_det_dist, prj_width=None, apply_filter=True
387
+ vol_shape,
388
+ n_angles,
389
+ src_orig_dist,
390
+ orig_det_dist,
391
+ prj_width=None,
392
+ apply_filter=True,
393
+ rot_center_shift=None,
303
394
  ):
304
395
  # Adapted from Astra toolbox python samples
305
396
 
@@ -311,6 +402,8 @@ def generate_hollow_cube_cone_sinograms(
311
402
  angles = np.linspace(0, 2 * np.pi, n_angles, True)
312
403
 
313
404
  proj_geom = astra.create_proj_geom("cone", 1.0, 1.0, prj_width, prj_width, angles, src_orig_dist, orig_det_dist)
405
+ if rot_center_shift is not None:
406
+ proj_geom = astra.geom_postalignment(proj_geom, (-rot_center_shift, 0))
314
407
  magnification = 1 + orig_det_dist / src_orig_dist
315
408
 
316
409
  # hollow cube
nabu/stitching/overlap.py CHANGED
@@ -301,7 +301,7 @@ def check_overlaps(frames: Union[tuple, numpy.ndarray], positions: tuple, axis:
301
301
  if raise_error:
302
302
  raise ValueError(error_msg)
303
303
  else:
304
- _logger.error(raise_error)
304
+ _logger.error(error_msg)
305
305
 
306
306
  # convert each frame to appropriate bounding box according to the axis
307
307
  def convert_to_bb(frame: numpy.ndarray, position: tuple, axis: int):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nabu
3
- Version: 2024.1.8
3
+ Version: 2024.1.9
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>
@@ -1,8 +1,7 @@
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
4
3
  doc/get_mathjax.py,sha256=VIvKRCdDuF2VoY8JD3mSey9XX13AZMmwTJBHdt1tUs4,1012
5
- nabu/__init__.py,sha256=DO4fHjlr5q2r3IDpkSpuzsOIMuHK5R3I2w91UQaUEdY,270
4
+ nabu/__init__.py,sha256=hocwYzVbHilZVlwb2HfL232A1uxBLouRbjQWv0nq_Ng,270
6
5
  nabu/tests.py,sha256=cew9OY2uTyncHI_HM32W8CP6B1GTGKaOW65XtMEqs7o,1417
7
6
  nabu/testutils.py,sha256=qqtGgkIhpOpXhgeoXlqCb91Rx-JlI4ALaDF6nt8YRRk,13298
8
7
  nabu/utils.py,sha256=w-xfRb6TFQpS-tao6nlvfmr962pmeec-WH1GltSUCrk,23767
@@ -32,6 +31,7 @@ nabu/app/shrink_dataset.py,sha256=P9dorO0Q-gPAWgSHyZi3XQp4jkMTJacDYzNvJY4oh98,35
32
31
  nabu/app/stitching.py,sha256=Ibp1oVokLVMz-VX762j1C0E88Di0YJvRt-b8NjGoe7g,3310
33
32
  nabu/app/utils.py,sha256=XUBRWDmth4i3BZHd27rfarFAUP7OEcsMeVmDJ6T4EXA,1178
34
33
  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,9 +136,9 @@ 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=IElD8g_KtYS7VOXuIEsRbdb9fMmtpB_AK7mAyejbEs0,37125
139
+ nabu/pipeline/fullfield/chunked.py,sha256=O6Wnw6B1nhA2yOdbOxqpEAdGnNdDGRYI2z0bBCB-yk0,37288
140
140
  nabu/pipeline/fullfield/chunked_cuda.py,sha256=aGzjY8MX6OL8auEj6Y0RfOGCmFnczsdfj6-8Net5AbQ,5645
141
- nabu/pipeline/fullfield/computations.py,sha256=VpIURVXh8EpNSfait_AIFM4Ci-GK_546Wkb-Wn9r31Y,9935
141
+ nabu/pipeline/fullfield/computations.py,sha256=eWbqtlXWKgcmCsKL1GgtaTVXBScY6MSrmtLd8h5dLng,10251
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
144
  nabu/pipeline/fullfield/processconfig.py,sha256=qSVeUvpt9BS2kR3zNk95_MGoLV4idiSJyYHlAPXbgTs,36405
@@ -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=ET0xCoFRt5oD7IpzHNmlm-bX4eanBenH186VGTgLAj0,12159
226
+ nabu/reconstruction/cone.py,sha256=1Wq2XJuVTjHTjTsUng1Z9VE8IPV_4xLGkD6TtBGzHrs,16234
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=xrFsIFGmpE9txpR3d93upF2S4yS_53IjZdZEKaaYspg,14313
242
+ nabu/reconstruction/tests/test_cone.py,sha256=88n0vKrKJg26DbvH3ZtHtmOtqHFkjJxmELlBLLL5qMA,17594
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
@@ -268,7 +268,7 @@ nabu/stitching/alignment.py,sha256=MSj-6npGfUnD3C5R5rqKwTogVRUDPmJuEZkPG9hMiUY,6
268
268
  nabu/stitching/config.py,sha256=t7mkRrkdHKMz0x-lg0f5-IOAO829A6BvKH8WUAuSAps,51333
269
269
  nabu/stitching/definitions.py,sha256=RyqzZY3KLwN4j0SkOFA-T1aicPbO2jBrqfWdz-1djxk,130
270
270
  nabu/stitching/frame_composition.py,sha256=OGM9cLrLfEP5_hvhDbNq_zr2wdMeAuTTNlVqZk-qVBU,5889
271
- nabu/stitching/overlap.py,sha256=eXAKsILS5jwqFY62JhDijeNW8H50rP-yjdUUGqjj0aY,15700
271
+ nabu/stitching/overlap.py,sha256=YbPon4_n4lT678F1aFSHx-ButcSYYqlBFjDqfNA77T4,15698
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
@@ -288,9 +288,9 @@ nabu/thirdparty/pore3d_deringer_munch.py,sha256=o4bisnFc-wMjuohWBT8wgWmfNehPQGtC
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.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,,
291
+ nabu-2024.1.9.dist-info/LICENSE,sha256=1eAIPSnEsnSFNUODnLtNtQTs76exG3ZxJ1DJR6zoUBA,1066
292
+ nabu-2024.1.9.dist-info/METADATA,sha256=SE80zwpzgCSLc4Fsw_DNJtDcUs8_74dQTjrACHcQjkE,5237
293
+ nabu-2024.1.9.dist-info/WHEEL,sha256=5sUXSg9e4bi7lTLOHcm6QEYwO5TIF1TNbTSVFVjcJcc,92
294
+ nabu-2024.1.9.dist-info/entry_points.txt,sha256=cJKGkBeykVL7uK3E4R0RLRqMXifTL2qdO573syPAvJc,1288
295
+ nabu-2024.1.9.dist-info/top_level.txt,sha256=fsm_N3eXLRZk2QXF9OSKPNDPFXOz8FAQjHh5avT3dok,9
296
+ nabu-2024.1.9.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.42.0)
2
+ Generator: bdist_wheel (0.41.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
doc/doc_config.py DELETED
@@ -1,32 +0,0 @@
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)