nixview-python/nixview/util/dataview.py

64 lines
2.4 KiB
Python

import numpy as np
from nixview.constants import io_chunksize as chunksize
class DataView():
def __init__(self, item_descriptor, file_handler) -> None:
super().__init__()
self._item_descriptor = item_descriptor
self._file_handler = file_handler
self._full_shape = item_descriptor.shape
self._buffer = None
self._offset = np.zeros(len(self._full_shape), dtype=int)
self._count = None
self._max_dim = None
self.init_buffer()
self.request_more()
def request_more(self):
if self.fully_loaded:
print("all data fetched")
return
# first make sure, that the count is valid, i.e. inside data
valid_count = self._file_handler.valid_count(self._full_shape, self._offset, self._count)
sl = tuple([slice(o, o + c) for o, c in zip(self._offset, valid_count)])
self._buffer[sl] = self._file_handler.request_data(self._item_descriptor, self._offset,
valid_count)
self._offset = tuple([sum(x) for x in zip(self._offset, self._count)])
#if data is not None and self._buffer is None:
# self._buffer = data
# self._offset = data.shape
#else:
# from IPython import embed
# embed()
def init_buffer(self):
buffer_shape = np.zeros(len(self._full_shape), dtype=int)
max_dim_count = chunksize
max_dim = np.argmax(self._full_shape)
for i, d in enumerate(self._full_shape):
if i != max_dim:
buffer_shape[i] = self._full_shape[i]
max_dim_count /= self._full_shape[i]
buffer_shape[max_dim] = max_dim_count
self._count = buffer_shape
self._max_dim = max_dim
try:
self._buffer = np.empty(self._full_shape)
except:
raise ValueError("Cannot handle so many data points!") #FIXME
@property
def fully_loaded(self):
return self._buffer is not None and self._full_shape == self._offset
def __str__(self) -> str:
r = self._item_descriptor.name + " " + str(self._item_descriptor.entity_type)
r += "buffer size: " + str(self._buffer.shape) if self._buffer is not None else "" + "\n"
r += "chunk size:" + str(self._count)
r += "is fully loaded: " + str(self.fully_loaded)
return r