Source code for bsb.simulation.results
import contextlib
import traceback
import typing
from ..reporting import warn
if typing.TYPE_CHECKING: # pragma: nocover
import neo
[docs]
class SimulationResult:
def __init__(self, simulation, filename=None):
from neo import Block, io
tree = simulation.__tree__()
with contextlib.suppress(KeyError):
del tree["post_prepare"]
if filename:
self.filename = filename
self.name = simulation.name
io = io.NixIO(filename, mode="rw")
io.write(Block(name=self.name, nix_name=self.name, config=tree))
for i, nixblock in enumerate(io.nix_file.blocks):
if self.name == nixblock.name:
self.block_id = i
io.close()
else:
self.block = Block(
name=simulation.name, nix_name=simulation.name, config=tree
)
self.recorders = []
@property
def analogsignals(self):
if hasattr(self, "block"):
return self.block.segments[0].analogsignals
@property
def spiketrains(self):
if hasattr(self, "block"):
return self.block.segments[0].spiketrains
[docs]
def add(self, recorder):
self.recorders.append(recorder)
[docs]
def create_recorder(self, flush: typing.Callable[["neo.core.Segment"], None]):
recorder = SimulationRecorder()
recorder.flush = flush
self.add(recorder)
return recorder
[docs]
def flush(self):
from neo import Segment, io
segment = Segment()
for recorder in self.recorders:
try:
recorder.flush(segment)
except Exception:
traceback.print_exc()
warn("Recorder errored out!")
if hasattr(self, "filename"):
io = io.NixIO(self.filename, mode="rw")
block = io.nix_file.blocks[self.block_id]
io._write_segment(segment, block)
io.close()
else:
self.block.segments.append(segment)
[docs]
def write(self, filename, mode):
from neo import io
if hasattr(self, "block"):
io.NixIO(filename, mode=mode).write(self.block)
[docs]
class SimulationRecorder:
[docs]
def flush(self, segment: "neo.core.Segment"):
raise NotImplementedError("Recorders need to implement the `flush` function.")
__all__ = ["SimulationResult", "SimulationRecorder"]