zjb.main.simulation.monitor 源代码
from abc import abstractmethod
from pathlib import Path
from typing import TYPE_CHECKING, Any, Callable
from mako.template import Template
from traits.api import ABCMetaHasTraits, Float, HasPrivateTraits, Int, Str
TEMPLATE = Template(
filename=str(Path(__file__).parent / "_templates" / "monitors.mako")
)
[文档]
class Monitor(HasPrivateTraits, metaclass=ABCMetaHasTraits):
"""
监视器的抽象基类,用于定义监视器的基本接口。
Attributes
----------
expression : Str
监视器中采样的表达式。
"""
expression = Str(required=True)
[文档]
@abstractmethod
def render_init(self, name: str, env: dict[str, Any]) -> str:
...
[文档]
@abstractmethod
def render_sample(self, name: str, env: dict[str, Any]) -> str:
...
if TYPE_CHECKING:
RENDER_FUNC_TYPE = Callable[[Monitor, str, dict[str, Any]], str]
class _TemplateMonitor(Monitor):
"""
模板监视器类,提供基于Mako模板的监视器实现。
Attributes
----------
_template_name : str
模板文件中定义的模板名称。
"""
_template_name = ""
def render_init(self, name: str, env: dict[str, Any]) -> str:
"""根据模板渲染初始化代码。"""
return TEMPLATE.get_def(self._template_name + "_init").render( # type: ignore
name=name, monitor=self, env=env
) # type: ignore
def render_sample(self, name: str, env: dict[str, Any]) -> str:
"""根据模板渲染采样代码。"""
return TEMPLATE.get_def(self._template_name + "_sample").render( # type: ignore
name=name, monitor=self, env=env
) # type: ignore
[文档]
class Raw(_TemplateMonitor):
"""原始监测器, 采样仿真的原始数据"""
_template_name = "raw"
[文档]
class SubSample(_TemplateMonitor):
"""下采样监测器, 间隔时间步采样"""
_template_name = "sub_sample"
# 采样间隔, 每仿真`sample_interval`个时间步采样一次
sample_interval = Int(10)
[文档]
class TemporalAverage(_TemplateMonitor):
"""时间平均监测器, 采样固定时间间隔的平均值"""
_template_name = "temporal_average"
# 采样间隔, 每仿真`sample_interval`个时间步采样一次
sample_interval = Int(10)
[文档]
class BOLD(_TemplateMonitor):
"""BOLD信号监测器, 使用血氧气球模型将采样数据转化为BOLD信号"""
_template_name = "bold"
taus = Float(0.65)
tauf = Float(0.41)
tauo = Float(0.98)
alpha = Float(0.32)
Eo = Float(0.4)
TE = Float(0.04)
vo = Float(0.04)
sample_interval = Int(10000)
MONITOR_DICT = {
"raw": Raw,
"sub_sample": SubSample,
"temporal_average": TemporalAverage,
"bold": BOLD,
}