4
4
import json
5
5
import os
6
6
7
- from utils import block_compute
7
+ from typing import List
8
8
9
9
from flask import Flask , request , Response , send_file , jsonify
10
10
import numpy as np
11
11
12
12
APP = Flask (__name__ )
13
13
14
14
UPLOADS_PATH = "./uploads"
15
- BLOCK_SIZE = (256 , 256 , 256 )
15
+ BLOCK_SIZE = (64 , 64 , 64 )
16
16
17
17
18
- def file_compute (x_start , x_stop ,
18
+ def file_compute (
19
+ x_start , x_stop ,
20
+ y_start , y_stop ,
21
+ z_start , z_stop ,
22
+ origin = (0 , 0 , 0 ),
23
+ block_size = (256 , 256 , 256 )
24
+ ):
25
+ """
26
+ Which files do we need to pull for this volume?
27
+ """
28
+ # x
29
+
30
+ x_block_origins = [
31
+ b
32
+ for b in range (0 , x_stop + block_size [0 ], block_size [0 ])
33
+ if b > (x_start - block_size [0 ]) and b < x_stop
34
+ ]
35
+ y_block_origins = [
36
+ b
37
+ for b in range (0 , y_stop + block_size [1 ], block_size [1 ])
38
+ if b > (y_start - block_size [1 ]) and b < y_stop
39
+ ]
40
+ z_block_origins = [
41
+ b
42
+ for b in range (0 , z_stop + block_size [2 ], block_size [2 ])
43
+ if b > (z_start - block_size [2 ]) and b < z_stop
44
+ ]
45
+
46
+ files = []
47
+ for x in x_block_origins :
48
+ for y in y_block_origins :
49
+ for z in z_block_origins :
50
+ files .append ((x , y , z ))
51
+ return files
52
+
53
+ def block_compute (x_start , x_stop ,
19
54
y_start , y_stop ,
20
55
z_start , z_stop ,
21
56
origin = (0 , 0 , 0 ),
22
57
block_size = (256 , 256 , 256 )):
23
58
"""
24
- Which files do we need to pull for this box ?
59
+ What are the block-aligned indices for this volume ?
25
60
"""
26
61
# x
27
62
@@ -30,22 +65,34 @@ def file_compute(x_start, x_stop,
30
65
for b in range (0 , x_stop + block_size [0 ], block_size [0 ])
31
66
if b > (x_start - block_size [0 ]) and b < x_stop
32
67
]
68
+ x_block_origins [0 ] = max (x_block_origins [0 ], x_start )
69
+ x_block_origins [- 1 ] = min (x_block_origins [- 1 ], x_stop )
70
+
33
71
y_block_origins = [
34
72
b
35
73
for b in range (0 , y_stop + block_size [1 ], block_size [1 ])
36
74
if b > (y_start - block_size [1 ]) and b < y_stop
37
75
]
76
+ y_block_origins [0 ] = max (y_block_origins [0 ], y_start )
77
+ y_block_origins [- 1 ] = min (y_block_origins [- 1 ], y_stop )
78
+
38
79
z_block_origins = [
39
80
b
40
81
for b in range (0 , z_stop + block_size [2 ], block_size [2 ])
41
82
if b > (z_start - block_size [2 ]) and b < z_stop
42
83
]
84
+ z_block_origins [0 ] = max (z_block_origins [0 ], z_start )
85
+ z_block_origins [- 1 ] = min (z_block_origins [- 1 ], z_stop )
43
86
44
87
files = []
45
88
for x in x_block_origins :
46
89
for y in y_block_origins :
47
90
for z in z_block_origins :
48
- files .append ((x , y , z ))
91
+ files .append ((
92
+ (x , min (x_stop , x + block_size [0 ])),
93
+ (y , min (y_stop , y + block_size [1 ])),
94
+ (z , min (z_stop , z + block_size [2 ]))
95
+ ))
49
96
return files
50
97
51
98
@@ -84,7 +131,6 @@ def blockfile_indices(xs, ys, zs, origin=(0, 0, 0), block_size=(256, 256, 256)):
84
131
return inds
85
132
86
133
87
-
88
134
class StorageManager :
89
135
"""
90
136
Abstract class.
@@ -108,27 +154,35 @@ def setdata(self, data, col, exp, chan, res, xs, ys, zs):
108
154
origin = (0 , 0 , 0 ),
109
155
block_size = self .block_size
110
156
)
157
+ files = file_compute (
158
+ xs [0 ], xs [1 ], ys [0 ], ys [1 ], zs [0 ], zs [1 ],
159
+ origin = (0 , 0 , 0 ),
160
+ block_size = self .block_size ,
161
+ )
162
+ indices = blockfile_indices (
163
+ xs , ys , zs ,
164
+ origin = (0 , 0 , 0 ),
165
+ block_size = self .block_size
166
+ )
167
+
168
+ print (blocks )
111
169
112
- for b in blocks :
113
- # Check to see if the file already exists
114
-
115
- # TODO: All of this assumes 0-padded block alignment
116
- self .store (
117
- data [b [0 ][0 ] - xs [0 ]: b [0 ][1 ] - xs [0 ],
118
- b [1 ][0 ] - ys [0 ]: b [1 ][1 ] - ys [0 ],
119
- b [2 ][0 ] - zs [0 ]: b [2 ][1 ] - zs [0 ]],
120
- col , exp , chan , res , b
121
- )
122
-
123
- # if self._exists(col, exp, chan, res, b):
124
- # # Open file, add new data, write file
125
- # # data = self.read(col, exp, chan, res, b)
126
- # pass
127
- # else:
128
- # # Create the file with the appropriate contents
129
- # # and 0pad if necessary.
130
- # # pad0_data = np.zeros((self.block_size))
131
- # pass
170
+ for b , f , i in zip (blocks , files , indices ):
171
+ try :
172
+ data_partial = self .retrieve (col , exp , chan , res , f )
173
+ except :
174
+ data_partial = np .zeros (self .block_size , dtype = "uint8" )
175
+
176
+ data_partial [
177
+ i [0 ][0 ]:i [0 ][1 ],
178
+ i [1 ][0 ]:i [1 ][1 ],
179
+ i [2 ][0 ]:i [2 ][1 ],
180
+ ] = data [
181
+ (f [0 ] + i [0 ][0 ]) - xs [0 ]: (f [0 ] + i [0 ][1 ]) - xs [0 ],
182
+ (f [1 ] + i [1 ][0 ]) - ys [0 ]: (f [1 ] + i [1 ][1 ]) - ys [0 ],
183
+ (f [2 ] + i [2 ][0 ]) - zs [0 ]: (f [2 ] + i [2 ][1 ]) - zs [0 ],
184
+ ]
185
+ data_partial = self .store (data_partial , col , exp , chan , res , f )
132
186
133
187
def getdata (self , col , exp , chan , res , xs , ys , zs ):
134
188
"""
@@ -162,22 +216,18 @@ def getdata(self, col, exp, chan, res, xs, ys, zs):
162
216
i [1 ][0 ]:i [1 ][1 ],
163
217
i [2 ][0 ]:i [2 ][1 ],
164
218
]
165
- payload [
166
- f [0 ] + i [0 ][0 ]: f [0 ] + i [0 ][1 ],
167
- f [1 ] + i [1 ][0 ]: f [1 ] + i [1 ][1 ],
168
- f [2 ] + i [2 ][0 ]: f [2 ] + i [2 ][1 ],
169
- ] = data_partial
170
-
171
- except ValueError :
172
- payload [
173
- f [0 ] + i [0 ][0 ]: f [0 ] + i [0 ][1 ],
174
- f [1 ] + i [1 ][0 ]: f [1 ] + i [1 ][1 ],
175
- f [2 ] + i [2 ][0 ]: f [2 ] + i [2 ][1 ],
176
- ] = np .zeros (self .block_size , dtype = "uint8" )[
219
+ except :
220
+ data_partial = np .zeros (self .block_size , dtype = "uint8" )[
177
221
i [0 ][0 ]:i [0 ][1 ],
178
222
i [1 ][0 ]:i [1 ][1 ],
179
223
i [2 ][0 ]:i [2 ][1 ],
180
224
]
225
+ payload [
226
+ (f [0 ] + i [0 ][0 ]) - xs [0 ]: (f [0 ] + i [0 ][1 ]) - xs [0 ],
227
+ (f [1 ] + i [1 ][0 ]) - ys [0 ]: (f [1 ] + i [1 ][1 ]) - ys [0 ],
228
+ (f [2 ] + i [2 ][0 ]) - zs [0 ]: (f [2 ] + i [2 ][1 ]) - zs [0 ],
229
+ ] = data_partial
230
+
181
231
return payload
182
232
183
233
def store (self , data , col , exp , chan , res , b ):
@@ -188,7 +238,10 @@ def store(self, data, col, exp, chan, res, b):
188
238
fname = "{}/{}/{}/{}/{}-{}-{}-{}.npy" .format (
189
239
UPLOADS_PATH ,
190
240
col , exp , chan ,
191
- res , b [0 ], b [1 ], b [2 ],
241
+ res ,
242
+ (b [0 ], b [0 ] + self .block_size [0 ]),
243
+ (b [1 ], b [1 ] + self .block_size [1 ]),
244
+ (b [2 ], b [2 ] + self .block_size [2 ]),
192
245
)
193
246
# print(fname)
194
247
return np .save (fname , data )
0 commit comments