Source code for analyzer.postprocessing.exporting

from __future__ import annotations

import functools as ft
from analyzer.utils.structure_tools import dotFormat, dictToDot
from .processors import BasePostprocessor
from attrs import define
import pickle as pkl
from pathlib import Path
import lz4.frame
import numpy as np
from analyzer.core.serialization import converter


[docs] def exportItem( item, meta, output_path, compressed=True, ): ret = {"metadata": meta, "item": item} ret = converter.unstructure(ret) output_path = Path(output_path) output_path.parent.mkdir(exist_ok=True, parents=True) if compressed: with lz4.frame.open(output_path, "wb") as f: pkl.dump(ret, f) else: with open(output_path, "wb") as f: pkl.dump(ret, f)
@define
[docs] class Dump(BasePostprocessor):
[docs] output_name: str
[docs] compressed: bool = True
[docs] def getRunFuncs(self, group, prefix=None): if len(group) != 1: raise RuntimeError() item, meta = group[0] output_path = dotFormat( self.output_name, **dict(dictToDot(meta)), prefix=prefix ) yield ft.partial( exportItem, item.histogram, dict(meta), output_path, compressed=self.compressed, )
[docs] def writeNumpy(path, data, order, mask_fill_value=0): path = Path(path) path.parent.mkdir(exist_ok=True, parents=True) def fill(x): if isinstance(x, np.ma.MaskedArray): return x.filled(mask_fill_value) return x data = np.stack([fill(data[key]) for key in order], axis=1) np.save(path, data)
@define
[docs] class DumpNumpy(BasePostprocessor):
[docs] output_name: str
[docs] order: list[str]
[docs] mask_fill_value: float = 0
[docs] def getRunFuncs(self, group, prefix=None): if len(group) != 1: raise RuntimeError() item, meta = group[0] output_path = dotFormat( self.output_name, **dict(dictToDot(meta)), prefix=prefix ) yield ft.partial( writeNumpy, output_path, item.data, self.order, mask_fill_value=self.mask_fill_value, )