21
21
from connectomics .common import bounding_box
22
22
from connectomics .volume import subvolume
23
23
from connectomics .volume import subvolume_processor
24
-
25
24
import numpy as np
26
25
from scipy import spatial
27
26
from sofima import map_utils
@@ -54,13 +53,14 @@ class ReconcileCrossBlockMaps(subvolume_processor.SubvolumeProcessor):
54
53
55
54
def __init__ (
56
55
self ,
57
- cross_block_volinfo ,
58
- cross_block_inv_volinfo ,
59
- last_inv_volinfo ,
60
- main_inv_volinfo ,
61
- z_map ,
62
- stride ,
63
- xy_overlap = 128 ,
56
+ cross_block_volinfo : str ,
57
+ cross_block_inv_volinfo : str ,
58
+ last_inv_volinfo : str ,
59
+ main_inv_volinfo : str ,
60
+ z_map : dict [int | str , int | str ],
61
+ stride : int ,
62
+ xy_overlap : int = 128 ,
63
+ backward : bool = False ,
64
64
input_volinfo = None ,
65
65
):
66
66
"""Constructor.
@@ -80,6 +80,8 @@ def __init__(
80
80
in pixels of the output volume
81
81
xy_overlap: neighboring subvolume overlap in the XY directions, in units
82
82
of pixels of main input volume
83
+ backward: whether the mesh was solved in backward mode (proceeding from
84
+ higher z coordinates towards lower ones)
83
85
input_volinfo: path to the high-res input volume (unused)
84
86
"""
85
87
del input_volinfo
@@ -91,6 +93,7 @@ def __init__(
91
93
self ._z_map = {int (k ): int (v ) for k , v in z_map .items ()}
92
94
self ._sorted_z = list (sorted (self ._z_map .keys ()))
93
95
self ._stride = stride
96
+ self ._backward = backward
94
97
95
98
def _open_volume (self , path : str ) -> Any :
96
99
"""Returns a CZYX-shaped ndarray-like object."""
@@ -146,17 +149,30 @@ def _interpolate(
146
149
'cross_block' volume
147
150
done: set of 'z' section coordinates that have already been processed
148
151
"""
149
- xblock_post = load_xblock (self ._z_map [z1 ])
150
- if z0 > 0 :
152
+ if self ._backward :
153
+ xblock_post = load_xblock (self ._z_map [z0 ])
154
+ else :
155
+ xblock_post = load_xblock (self ._z_map [z1 ])
156
+
157
+ if not self ._backward and z0 > 0 :
151
158
xblock_pre = load_xblock (self ._z_map [z0 ])
152
159
xblock_pre_inv = load_xblock_inv (self ._z_map [z0 ])
160
+ elif self ._backward and z1 < self ._sorted_z [- 1 ]:
161
+ xblock_pre = load_xblock (self ._z_map [z1 ])
162
+ xblock_pre_inv = load_xblock_inv (self ._z_map [z1 ])
153
163
else :
154
164
xblock_pre_inv = xblock_pre = np .zeros_like (xblock_post )
155
165
156
- if z1 != self ._sorted_z [- 1 ]:
157
- block_end_inv = load_last_inv (z1 )
166
+ if self ._backward :
167
+ if z0 != self ._sorted_z [0 ]:
168
+ block_end_inv = load_last_inv (z0 )
169
+ else :
170
+ block_end_inv = load_main_inv (z0 )
158
171
else :
159
- block_end_inv = load_main_inv (z1 )
172
+ if z1 != self ._sorted_z [- 1 ]:
173
+ block_end_inv = load_last_inv (z1 )
174
+ else :
175
+ block_end_inv = load_main_inv (z1 )
160
176
161
177
flat_box = bounding_box .BoundingBox (
162
178
start = box .start , size = (box .size [0 ], box .size [1 ], 1 )
@@ -201,19 +217,29 @@ def _interpolate(
201
217
self ._stride ,
202
218
)
203
219
204
- b = z1 - z0
220
+ block_size = z1 - z0
205
221
for z in range (max (box .start [2 ], z0 ), min (box .end [2 ], z1 + 1 )):
206
222
i = z - z0
207
223
# Each section can be processed only once.
208
224
if z in done :
209
225
continue
210
226
rel_z = z - box .start [2 ]
211
227
212
- if i == b :
213
- data [:, rel_z : rel_z + 1 , ...] = xblock_post
228
+ if i == block_size :
229
+ data [:, rel_z : rel_z + 1 , ...] = (
230
+ xblock_pre if self ._backward else xblock_post
231
+ )
214
232
elif i == 0 :
215
- data [:, rel_z : rel_z + 1 , ...] = xblock_pre
233
+ data [:, rel_z : rel_z + 1 , ...] = (
234
+ xblock_post if self ._backward else xblock_pre
235
+ )
216
236
else :
237
+
238
+ if self ._backward :
239
+ scale = (block_size - i ) / block_size
240
+ else :
241
+ scale = i / block_size
242
+
217
243
try :
218
244
# The output coordinate map here is the inverse of the argument
219
245
# passed to warp() in the comment above, i.e.:
@@ -230,7 +256,7 @@ def _interpolate(
230
256
interior_aligned ,
231
257
flat_box ,
232
258
self ._stride ,
233
- offset * i / b ,
259
+ offset * scale ,
234
260
flat_box ,
235
261
self ._stride ,
236
262
)
0 commit comments