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 +1 -1
- nabu/estimation/cor.py +6 -1
- nabu/estimation/cor_sino.py +1 -3
- nabu/pipeline/estimators.py +2 -38
- nabu/pipeline/fullfield/chunked.py +2 -6
- nabu/pipeline/tests/test_estimators.py +2 -6
- nabu/pipeline/writer.py +0 -7
- nabu/resources/dataset_analyzer.py +13 -18
- {nabu-2024.2.0.dist-info → nabu-2024.2.0rc1.dist-info}/METADATA +2 -2
- {nabu-2024.2.0.dist-info → nabu-2024.2.0rc1.dist-info}/RECORD +14 -14
- {nabu-2024.2.0.dist-info → nabu-2024.2.0rc1.dist-info}/LICENSE +0 -0
- {nabu-2024.2.0.dist-info → nabu-2024.2.0rc1.dist-info}/WHEEL +0 -0
- {nabu-2024.2.0.dist-info → nabu-2024.2.0rc1.dist-info}/entry_points.txt +0 -0
- {nabu-2024.2.0.dist-info → nabu-2024.2.0rc1.dist-info}/top_level.txt +0 -0
nabu/__init__.py
CHANGED
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.
|
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
|
|
nabu/estimation/cor_sino.py
CHANGED
@@ -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
|
-
|
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)
|
nabu/pipeline/estimators.py
CHANGED
@@ -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
|
-
|
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
|
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
|
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
|
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
|
-
|
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.
|
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.
|
315
|
-
return {k: readers[k].load_data()[0] for k in self.
|
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.
|
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.
|
322
|
-
return {k: readers[k].load_data()[0] for k in self.
|
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.
|
369
|
-
frames_to_take = self.
|
370
|
-
elif len(self.
|
371
|
-
frames_to_take = self.
|
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
|
-
|
413
|
-
|
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.
|
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.
|
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=
|
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=
|
68
|
-
nabu/estimation/cor_sino.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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.
|
315
|
-
nabu-2024.2.
|
316
|
-
nabu-2024.2.
|
317
|
-
nabu-2024.2.
|
318
|
-
nabu-2024.2.
|
319
|
-
nabu-2024.2.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|