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 +1 -1
- nabu/app/tests/__init__.py +0 -0
- nabu/pipeline/fullfield/chunked.py +3 -1
- nabu/pipeline/fullfield/computations.py +7 -1
- nabu/reconstruction/cone.py +96 -11
- nabu/reconstruction/tests/test_cone.py +95 -2
- nabu/stitching/overlap.py +1 -1
- {nabu-2024.1.8.dist-info → nabu-2024.1.9.dist-info}/METADATA +1 -1
- {nabu-2024.1.8.dist-info → nabu-2024.1.9.dist-info}/RECORD +13 -13
- {nabu-2024.1.8.dist-info → nabu-2024.1.9.dist-info}/WHEEL +1 -1
- doc/doc_config.py +0 -32
- {nabu-2024.1.8.dist-info → nabu-2024.1.9.dist-info}/LICENSE +0 -0
- {nabu-2024.1.8.dist-info → nabu-2024.1.9.dist-info}/entry_points.txt +0 -0
- {nabu-2024.1.8.dist-info → nabu-2024.1.9.dist-info}/top_level.txt +0 -0
nabu/__init__.py
CHANGED
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
|
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
|
-
|
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(
|
nabu/reconstruction/cone.py
CHANGED
@@ -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.
|
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.
|
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.
|
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,
|
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
|
326
|
+
if getattr(self, "_alg_id", None) is not None:
|
258
327
|
astra.algorithm.delete(self._alg_id)
|
259
|
-
if self
|
328
|
+
if getattr(self, "_vol_id", None) is not None:
|
260
329
|
astra.data3d.delete(self._vol_id)
|
261
|
-
if self
|
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
|
-
|
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,
|
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(
|
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.
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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.
|
292
|
-
nabu-2024.1.
|
293
|
-
nabu-2024.1.
|
294
|
-
nabu-2024.1.
|
295
|
-
nabu-2024.1.
|
296
|
-
nabu-2024.1.
|
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,,
|
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)
|
File without changes
|
File without changes
|
File without changes
|