first version of loading data

This commit is contained in:
Jan Grewe 2021-01-15 13:48:38 +01:00
parent ce756b5327
commit 56ea425a38
3 changed files with 83 additions and 4 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

@ -1,8 +1,12 @@
import os import os
import nixio as nix import nixio as nix
import numpy as np
from enum import Enum from enum import Enum
import datetime as dt import datetime as dt
from numpy.core.defchararray import not_equal
from nixview.constants import io_chunksize as chunksize
class ItemDescriptor(): class ItemDescriptor():
def __init__(self, name=None, id=None, type=None, value=None, definition=None, block_id=None, entity_type=None, shape=None, metadata=None, data_type=None, source_id=None, created_at=None, updated_at=None) -> None: def __init__(self, name=None, id=None, type=None, value=None, definition=None, block_id=None, entity_type=None, shape=None, metadata=None, data_type=None, source_id=None, created_at=None, updated_at=None) -> None:
@ -104,6 +108,54 @@ class NodeType(Enum):
Feature="Feature" Feature="Feature"
class DataView():
def __init__(self, item_descriptor, file_handler) -> None:
super().__init__()
self._item_descriptor = item_descriptor
self._file_handler = file_handler
self._buffer = None
self._full_shape = item_descriptor.shape
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:
return
data = self._file_handler.request_data(self._item_descriptor, self._offset, self._count)
if data is not None and self._buffer is None:
self._buffer = data
self._offset = data.shape
else:
print("need to fetch more!")
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
@property
def fully_loaded(self):
return self._buffer is not None and self._full_shape == self._buffer.shape
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
class Singleton(type): class Singleton(type):
_instances = {} _instances = {}
def __call__(cls, *args, **kwargs): def __call__(cls, *args, **kwargs):
@ -195,6 +247,17 @@ class FileHandler(metaclass=Singleton):
def filename(self): def filename(self):
return self._filename return self._filename
def request_data(self, entity_descriptor, offset=None, count=None):
entity = self._entity_buffer.get(entity_descriptor.id)
if entity is None:
print("need to do something else")
for i, (o, c) in enumerate(zip(offset, count)):
if o + c > entity.shape[i]:
count[i] = entity.shape[i] - o
seg = tuple([slice(o, o + c) for o, c in zip(offset, count)])
print(seg)
return entity[seg]
def request_section_descriptor(self, id): def request_section_descriptor(self, id):
fs = self._entity_buffer.get(id) fs = self._entity_buffer.get(id)
if fs is None: if fs is None:
@ -271,6 +334,13 @@ class FileHandler(metaclass=Singleton):
src = e.source if hasattr(e, "source") else None src = e.source if hasattr(e, "source") else None
itd.source_id = src.id if src is not None else None itd.source_id = src.id if src is not None else None
infos.append(itd) infos.append(itd)
if entity_type == NodeType.DataArray:
itd.value = "%s %s entries" % (str(e.shape), e.dtype)
elif entity_type == NodeType.Tag:
point_or_segment = "segment" if e.extent else "point"
start = str(e.position)
end = ("to " + str(tuple(np.array(e.position) + np.array(e.extent)))) if e.extent else ""
itd.value = "tags %s %s %s" %(point_or_segment, start, end)
# TODO set the value to something meaningful for the various entity types # TODO set the value to something meaningful for the various entity types
return infos return infos

View File

@ -4,11 +4,12 @@ import matplotlib
matplotlib.use('Qt5Agg') matplotlib.use('Qt5Agg')
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg
from matplotlib.figure import Figure from matplotlib.figure import Figure
import nixio as nix
import numpy as np import numpy as np
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
from matplotlib.widgets import Slider from matplotlib.widgets import Slider
import nixio as nix
from nixview.file_handler import FileHandler, DataView
@ -323,8 +324,9 @@ class MplCanvas(FigureCanvasQTAgg):
class PlotScreen(QWidget): class PlotScreen(QWidget):
close_signal = pyqtSignal() close_signal = pyqtSignal()
def __init__(self, parent) -> None: def __init__(self, parent=None) -> None:
super().__init__(parent=parent) super().__init__(parent=parent)
self._file_handler = FileHandler()
sc = MplCanvas(self, width=5, height=4, dpi=100) sc = MplCanvas(self, width=5, height=4, dpi=100)
sc.axes.plot([0,1,2,3,4], [10,1,20,3,40]) sc.axes.plot([0,1,2,3,4], [10,1,20,3,40])
@ -335,9 +337,16 @@ class PlotScreen(QWidget):
close_btn.clicked.connect(self.on_close) close_btn.clicked.connect(self.on_close)
self.layout().addWidget(close_btn) self.layout().addWidget(close_btn)
self._data_view = None
def on_close(self): def on_close(self):
self.close_signal.emit() self.close_signal.emit()
def plot(self, item): def plot(self, item):
print("plot!", item) print("plot!", item)
print(item.entity_type, item.shape)
self._data_view = DataView(item, self._file_handler)
self._data_view.request_more()
print(self._data_view)