diff --git a/core/functions/test_hdf.py b/core/functions/test_hdf.py index 6d2f8d022c8bb9fe60796ee72e638b1c5e3cd89a..683c005b2f319afb7f3d1f20c9969b6c49dd4a59 100644 --- a/core/functions/test_hdf.py +++ b/core/functions/test_hdf.py @@ -10,8 +10,6 @@ f = h5py.File( ) tracks = f["/extraction/general/None/area"][()] cell = Cells.from_source("/home/alan/Documents/sync_docs/PhD/tmp/DO6MS2_003store.h5") -from postprocessor.core.picker import Picker, PickerParameters +from postprocessor.core.processes.picker import Picker, PickerParameters -picker = Picker( - signals=pd.DataFrame(tracks), cells=cell, parameters=PickerParameters.default() -) +picker = Picker(cells=cell, parameters=PickerParameters.default()) diff --git a/core/io/writer.py b/core/io/writer.py index de1660e095d144f55f8d09248e4ced6e0f83619c..480c7e0306a99e0e8b5814e652ad7f2166d7ca2e 100644 --- a/core/io/writer.py +++ b/core/io/writer.py @@ -1,9 +1,12 @@ -import numpy as np +import h5py import pandas as pd -def Writer(filename): +from postprocessor.core.io.base import BridgeH5 + + +def Writer(BridgeH5): def __init__(self, filename): - self._file = h5py.File(filename) + self._hdf = h5py.File(filename, "a") def write(self, address, data): self._file.add_group(address) diff --git a/core/processes/base.py b/core/processes/base.py index a53cee6d08dbbd289963e40311c6adea0f03ab60..8412fdb5f25404f30e6988327974dc4c44de200b 100644 --- a/core/processes/base.py +++ b/core/processes/base.py @@ -35,9 +35,15 @@ class ProcessABC(ABC): "Base class for processes" def __init__(self, parameters): + self._parameters = parameters + for k, v in parameters.to_dict().items(): # access parameters directly setattr(self, k, v) + @property + def parameters(self): + return self._parameters + @abstractmethod def run(self): pass diff --git a/core/processes/picker.py b/core/processes/picker.py index 26a0320b3d79165e5e43a14a699805f7a1ffde5c..9342ff17a95ced03b007cdc20cb75fccb27a268b 100644 --- a/core/processes/picker.py +++ b/core/processes/picker.py @@ -6,7 +6,7 @@ import pandas as pd from core.cells import CellsHDF -from postprocessor.core.base import ParametersABC, ProcessABC +from postprocessor.core.processes.base import ParametersABC, ProcessABC from postprocessor.core.functions.tracks import max_ntps, max_nonstop_ntps diff --git a/core/processor.py b/core/processor.py index f1e006cfd34b2651e47d5ae43d7e87639b2af410..9e433076c1ba64bdf1a96fe9ea51d1bf67c65cb6 100644 --- a/core/processor.py +++ b/core/processor.py @@ -1,29 +1,54 @@ +from typing import List, Dict, Union import pandas as pd -from postprocessor.core.base import ParametersABC -from core import Cells + +from postprocessor.core.processes.base import ParametersABC +from postprocessor.core.processes.merger import MergerParameters, Merger +from postprocessor.core.processes.picker import PickerParameters, Picker +from postprocessor.core.io.writer import Writer +from postprocessor.core.io.signal import Signal + +from core.cells import Cells class PostProParameters(ParametersABC): """ Anthology of parameters used for postprocessing + :merger: + :picker: parameters for picker + :processes: List of processes that can be found in ./processes + :datasets: Dictionary """ - def __init__(self, merger=None, picker=None, processes=None, datasets=None): - self.merger = merger - self.picker = picker - self.processes = processes + def __init__(self, merger=None, picker=None, processes=[], datasets=None): + self.merger: MergerParameters = merger + self.picker: PickerParameters = picker + self.processes: List = processes - self.datasets = datasets + self.datasets: Dict = datasets def __getitem__(self, item): return getattr(self, item) + @classmethod + def default(cls, kind=None): + if kind == "defaults" or kind == None: + return cls( + merger=MergerParameters.default(), + picker=PickerParameters.default(), + datasets={ + "merger": "/extraction/general/None/area", + "picker": "/extraction/general/None/area", + "processes": [], + }, + ) + class PostProcessor: def __init__(self, fname, parameters, signals): self.parameters = parameters - self._signals = Signals(fname) + self._writer = Writer(fname) + self.datasets = parameters["datasets"] self.merger = Merger(parameters["merger"]) self.picker = Picker( @@ -39,40 +64,3 @@ class PostProcessor: for process, dataset in zip(self.processes, self.datasets["processes"]): process_result = process.run(signals.get_dataset(dataset)) self.writer.write(process_result, dataset) - - -class Signals: - """ - Class that fetches data from the hdf5 storage for post-processing - """ - - def __init__(self, file): - self._hdf = h5py.File(file, "r") - - def __getitem__(self, dataset): - dset = self._hdf[dataset][()] - attrs = self._hdf[dataset].attrs - first_dataset = "/" + dataset.split("/")[0] + "/" - timepoints = self._hdf[first_dataset].attrs["processed_timepoints"] - - if "cell_label" in self._hdf[dataset].attrs: - ids = pd.MultiIndex.from_tuples( - zip(attrs["trap"], attrs["cell_label"]), names=["trap", "cell_label"] - ) - else: - ids = pd.Index(attrs["trap"], names=["trap"]) - - return pd.DataFrame(dset, index=ids, columns=timepoints) - - @staticmethod - def _if_ext_or_post(name): - if name.startswith("extraction") or name.startswith("postprocessing"): - if len(name.split("/")) > 3: - return name - - @property - def datasets(self): - return signals._hdf.visit(self._if_ext_or_post) - - def close(self): - self._hdf.close()