zjb.main.manager.project 源代码
from typing import Any
from traits.api import List, Str
from zjb._traits.types import Instance, TypedInstance
from zjb.dos.data import Data
from ..data.correlation import SpaceCorrelation
from ..dtb.atlas import Atlas
from ..dtb.dtb import DTB
from ..dtb.dtb_model import DTBModel
from ..dtb.dynamics_model import DynamicsModel
from ..dtb.subject import Subject
from ..simulation.monitor import Raw
ProjectInstance = TypedInstance["Project"]("Project", allow_none=False, module=__name__) # type: ignore
[文档]
class Project(Data):
"""
项目类,用于管理和组织与工作空间中项目相关的所有元素,如子项目、被试、DTB模型、DTB等。
Attributes
----------
name : Str
项目的名称。
parent : ProjectInstance
父项目的引用。
children : List(ProjectInstance)
子项目列表。
subjects : List(Instance(Subject))
项目中包含的被试列表。
models : List(Instance(DTBModel))
项目中包含的DTB模型列表。
dtbs : List(Instance(DTB))
项目中包含的DTB列表。
data : List
项目中包含的其他数据,入分析结果等
"""
name = Str()
parent = ProjectInstance
children = List(ProjectInstance)
subjects = List(Instance(Subject))
models = List(Instance(DTBModel))
dtbs = List(Instance(DTB))
data = List()
[文档]
def unbind(self):
"""解除项目与其子元素的绑定关系"""
if not self._manager:
return
for child in self.children:
child.unbind()
for subject in self.subjects:
subject.unbind()
for model in self.models:
model.unbind()
for dtb in self.dtbs:
dtb.unbind()
self._manager.unbind(self)
[文档]
def available_subjects(self) -> list[Subject]:
"""列出项目中所有可用的被试(包括父项目中的可用被试)
Returns
-------
list[Subject]
可用被试列表
"""
subjects = self.subjects
if parent := self.parent:
subjects += parent.available_subjects()
return subjects
[文档]
def available_models(self) -> list[DTBModel]:
"""列出项目中所有可用的DTB模型(包括父项目中的可用DTB模型)
Returns
-------
list[DTBModel]
可用DTB模型列表
"""
models = self.models
if parent := self.parent:
models += parent.available_models()
return models
[文档]
def available_dtbs(self) -> list[DTB]:
"""列出项目中所有可用的数字孪生脑(包括父项目中的可用数字孪生脑)
Returns
-------
list[DTB]
可用数字孪生脑列表
"""
dtbs = self.dtbs
if parent := self.parent:
dtbs += parent.available_dtbs()
return dtbs
[文档]
def add_project(self, name: str, **kwargs: Any) -> "Project":
"""新建并添加一个子项目
Parameters
----------
name : str
子项目名
**kwargs: Any
子项目的其他特征
Returns
-------
Project
新建并添加的子项目实例
"""
child = Project(name=name, parent=self, **kwargs)
self.children += [child]
return child
[文档]
def add_subject(self, name: str, **kwargs: Any) -> Subject:
"""新建并添加一个被试
Parameters
----------
name : str
被试名
**kwargs: Any
被是的其他特征
Returns
-------
Subject
新建并添加的被试实例
"""
subject = Subject(name=name, **kwargs)
self.subjects += [subject]
return subject
[文档]
def add_model(
self,
name: str,
atlas: Atlas,
dynamics: DynamicsModel,
monitors: "list[Monitor] | None" = None,
**kwargs: Any,
) -> DTBModel:
"""新建并添加一个DTB模型
Parameters
----------
name : str
模型名
atlas : Atlas
模型所用的图谱
dynamics : DynamicsModel
模型所用的动力学
monitors : list[Monitor] | None, optional
模型输出结果的监测器列表, None表示使用默认的监测器, by default None
**kwargs: Any
DTB模型的其他特征
Returns
-------
DTBModel
新建并添加的DTB模型实例
"""
if monitors is None:
monitors = [Raw(expression=state) for state in dynamics.state_variables]
model = DTBModel(
name=name, atlas=atlas, dynamics=dynamics, monitors=monitors, **kwargs
)
self.models += [model]
return model
[文档]
def add_dtb(
self,
name: str,
subject: Subject,
model: DTBModel,
connectivity: SpaceCorrelation,
**kwargs: Any,
) -> DTB:
"""新建并添加一个DTB
Parameters
----------
name : str
DTB名称
subject : Subject
DTB关联的被试
model : DTBModel
DTB所用的模型
connectivity : SpaceCorrelation
DTB所用的连接矩阵
**kwargs: Any
DTB的其他特征
Returns
-------
DTB
新建并添加的DTB实例
"""
dtb = DTB(
name=name, subject=subject, model=model, connectivity=connectivity, **kwargs
)
self.dtbs += [dtb]
return dtb
[文档]
def remove_project(self, project: "Project"):
"""移除一个子项目
Parameters
----------
project : Project
要移除的项目
Raises
------
ValueError
要移除的项目不属于本项目
"""
children = self.children
if project not in children:
raise ValueError(f"The project does not belong to this project.")
children.remove(project)
self.children = children
project.unbind()
[文档]
def remove_subject(self, subject: Subject):
"""移除一个被试
Parameters
----------
subject : Subject
要移除的被试
Raises
------
ValueError
要移除的被试不属于本项目
"""
subjects = self.subjects
if subject not in subjects:
raise ValueError(f"The subject does not belong to this project.")
subjects.remove(subject)
self.subjects = subjects
subject.unbind()
[文档]
def remove_model(self, model: DTBModel):
"""移除一个DTB模型
Parameters
----------
model : DTBModel
要移除的DTB模型
Raises
------
ValueError
要移除的DTB模型不属于本项目
"""
models = self.models
if model not in models:
raise ValueError(f"The model does not belong to this project.")
models.remove(model)
self.models = models
model.unbind()
[文档]
def remove_dtb(self, dtb: DTB):
"""移除一个DTB
Parameters
----------
dtb : DTB
要移除的DTB
Raises
------
ValueError
要移除的DTB不属于本项目
"""
dtbs = self.dtbs
if dtb not in dtbs:
raise ValueError(f"The dtb does not belong to this project.")
dtbs.remove(dtb)
self.dtbs = dtbs
dtb.unbind()