模块化概念
从版本 12 开始,OSP Suite 引入了全新的模块化概念用于在 MoBi 中构建模型。这一新概念允许用户通过将模型拆分为更小、可管理的组件——称为模块(module)——来更高效地创建、共享和复用模型。
本节概述模块化概念,特别适合熟悉 MoBi 早期版本的用户。它解释了使用模块的优势、如何创建和管理模块,以及模块组合的规则。
一个展示如何在实际中使用模块化概念的示例工作流可参见此处。
MoBi 项目结构
新概念改变了模型结构的组织方式和组合为模拟的方式。OSP Suite V12 之前版本中,MoBi 项目有两层组织结构——构建单元(BB)组合为模拟;新模块化概念将结构扩展为模块、构建单元和模拟三个层级。
一个 MoBi 项目包含以下内容:
- PK-Sim 模块
- 从 PK-Sim PBPK 模型创建的模块。作为最佳实践,PK-Sim 模块不应被修改。所有对模型的更改/扩展都应在所谓的扩展模块(见下文)中进行。当用户编辑 PK-Sim 模块时,它会被转换为扩展模块。
- 扩展模块
- 可编辑的模块,包含用户对模型结构所做的任何更改。
- 个体
- 表达谱
- 模拟:由 (0-n) 个 PK-Sim 模块、(0-n) 个扩展模块、(0-1) 个个体和 (0-n) 个表达谱组合而成。至少需要选择一个模块(PK-Sim 或扩展)才能创建模拟。
每个模块由构建单元组成,BB 类型包括:空间结构(SS)(0-1)、分子 (0-1)、反应 (0-1)、被动运输 (PT) (0-1)、观察器 (0-1)、事件 (0-1)、参数值 (PV) (0-n) 和初始条件 (IC) (0-n)。每个模块包含零个或恰好一个每种类型的 BB,但 PV 和 IC BB 除外——一个模块中可以存在多个 PV 和 IC BB。
为方便项目组织,可以在模块浏览器中将模块分组到文件夹中。
PK-Sim 模块
MoBi 中的项目可以基于从 PK-Sim 导出的 PBPK 模型。此类模型在 MoBi 中以PK-Sim 模块的形式呈现,包含所有 BB 类型。PK-Sim 模块默认不可编辑。如果用户决定编辑 PK-Sim 模块,该 PK-Sim 模块将被转换为扩展模块。一个项目可以包含多个或不包含 PK-Sim 模块。
将 PK-Sim 模型导出到 MoBi 时,会创建一个 PK-Sim 模块、一个个体的以及 (0-n) 个表达谱 BB。
扩展模块
每个 MoBi 项目可以包含任意数量的扩展模块。扩展模块可以添加或修改默认 PK-Sim 模型结构的任何部分——空间结构、分子、反应等。
在扩展模块中添加新容器(如新器官)或分子时,需要注意:只有在模拟中使用的任何 IC BB 中存在该分子-容器组合的条目时,分子才会在容器中被创建。因此,在扩展模块中添加分子或容器时,应相应地扩展 IC BB。
创建新模块可以从零开始("创建新模块"会创建一个包含空 BB 的模块),也可以通过克隆模块("克隆模块")来完成。模块可以保存为 *.pkml 文件,模块中的 BB 可以从 *.pkml 文件加载。
(个体)参数的位置
与之前的版本相比,V12 在将 PBPK 模型导入 MoBi 时,个体参数的存储方式和位置发生了一些变化。
- 所有物种中均存在且在所有物种和个体中具有相同值或相同公式的空间结构参数,直接存储在空间结构 BB 中,包含固定值或显式公式。例如:
Organism|Thickness (endothelium)(常量值)或Organism|Weight of blood organs(求和公式)。 - 仅在特定物种中存在的参数(例如
Organism|Lumen|Duodenum|Thickness_p1仅存在于人类物种中,大鼠中没有;Organism|Lumen|Duodenum|Default thickness of gut wall存在于大鼠中但人类中没有),或具有物种特异性不同值(Organism|Acidic phosphatidyl content in blood cells[mg/g] - RR),或在群体中存在变异(如Organism|Fat|Volume),这些参数不位于空间结构 BB 中,而仅在个体中。这些参数在模拟创建步骤中被添加到模拟结构中。
为方便起见,在空间结构编辑器中通过在"显示来自个体的参数"框中选择一个个体的,可以显示个体中定义的参数。
图:选择了个体的空间结构视图
个体中定义的参数以灰色背景显示,不能在空间结构编辑器中编辑。你会注意到某些参数的值为 NaN。这些参数由当前无法求值的方程定义,例如因为它们依赖于同样定义在个体中的其他参数。这些参数的值将在模拟创建后计算。
参数值构建单元
另一个重要变化(与之前版本相比):PV BB 应仅包含与存储在其他 BB 中的值不同的参数值。在大多数情况下,将 PK-Sim 模型导入 MoBi 时,PV BB 将为空。例外情况是用户在 PK-Sim 模拟中修改了不属于任何 PK-Sim BB 的参数值(例如 咪达唑仑 PBPK 模型中的肠道渗透性)。这些"模拟参数"会被转移到 PV BB 中。
从模块创建模拟与组合规则
多个模块可以组合创建模拟。为简化表述,特定的模块组合称为模型配置。从模块创建模拟时,扩展模块会扩展或覆盖之前的模块。用户可以选择多个 PK-Sim 模块,或 PK-Sim 模块与扩展模块的组合,或仅使用扩展模块。模块的选择会产生一个模块层级,模块选择的顺序决定了覆盖/扩展操作的顺序。即:多个 PK-Sim 模块始终扩展为一个共同的 PK-Sim 模块,选定的扩展模块 1 扩展/覆盖共同的 PK-Sim 模块,选定的扩展模块 2 覆盖/扩展"共同 PK-Sim 模块 + 扩展模块 1"的组合,以此类推。
如果模型配置包含 PK-Sim 模块,用户必须选择一个个体,并可以包含表达谱。对于每个包含至少一个 IC 或 PV BB 的模块,用户可以选择一个(或不选)IC 和/或 PV BB。
在模拟创建过程中,模块被组合为共同的模型结构。实体通过其绝对路径(对于空间结构中的容器、参数和分子值)或名称(对于邻域、被动运输、分子等)进行组合(扩展或覆盖)。结果是一个表示所选模块组合的模拟。
模块可以定义两种组合行为——覆盖(overwrite)或扩展(extend)。以下各节描述不同构建单元的合并方式以及覆盖和扩展模式之间的差异(如果有的话)。
空间结构
合并行为"覆盖"
当组合模块 A 和 B(层级为 A ← B)时,模块 B 中的所有容器将覆盖模块 A 中相同路径的容器。覆盖时,如果覆盖模块中不存在某个容器的后代,则该容器的所有后代都会被移除(即替换整个树结构)。例如:如果模块 A 有一个容器 Organism|Container 1,包含两个子容器 Container 2 和 Container 3(绝对路径:Organism|Container 1|Container 2 和 Organism|Container 1|Container 3),而模块 B 有一个 Organism|Container 1 但没有任何子容器,则最终模型将包含 Organism|Container 1,但不包含子容器 Container 2 和 Container 3。Organism|Container 1 将仅具有模块 B 中定义的参数,而不具有模块 A 中的参数。
- 参数将按其绝对路径被覆盖。如果两个模块都有参数
Organism|Container 1|Param,则使用模块B中的参数。 - 容器类型(物理或逻辑)将被覆盖。
- 容器(包括邻域)的标签将被覆盖。如果
Organism|Container 1在模块A中有标签"Tag A",在模块B中有标签"Tag B",则最终模型中Organism|Container 1将仅具有标签"Tag B"。 - 公式永远不会被覆盖(即使在"覆盖"模式下也是如此)。这意味着,如果模块
B定义的公式与模块A中的公式同名,则更新的公式仅用于模块B中定义的参数,而不用于使用该公式的其他参数。 - 邻域将按名称被覆盖。其参数、标签和邻居将被覆盖。
合并行为"扩展"
当组合模块 A 和 B(层级为 A ← B)时,模块 B 中的所有容器和参数将被添加到模块 A 中。例如:如果模块 A 有一个容器 Organism|Container 1,包含两个子容器 Container 2 和 Container 3(绝对路径:Organism|Container 1|Container 2 和 Organism|Container 1|Container 3),而模块 B 有一个 Organism|Container 1 但没有子容器,则最终模型将包含 Organism|Container 1(具有两个模块中定义的参数),以及子容器 Organism|Container 1|Container 2 和 Organism|Container 1|Container 3。
- 参数始终被覆盖。如果两个模块都有参数
Organism|Container 1|Param,则使用模块B中的参数。这适用于参数的所有属性(值、公式、单位、标签等)。 - 容器类型将被覆盖。如果
Organism|Container 1在模块A中是"物理"的,在模块B中是"逻辑"的,则最终模型中该容器将是"逻辑"的。 - 标签将被扩展。如果
Organism|Container 1在模块A中有标签"Tag A",在模块B中有标签"Tag B",则最终模型中Organism|Container 1将同时具有标签"Tag A"和"Tag B"。 - 邻域将被扩展(如添加新参数、标签)。
分子
分子始终按名称覆盖。因此,如果分子在扩展模块中定义,它必须包含所有必需的参数。不能仅添加部分参数(在合并行为"扩展"中),同时保留层级较高模块中的参数。
反应
反应始终按名称覆盖。因此,如果反应在扩展模块中定义,它必须包含所有必需的参数。不能仅添加部分参数(在合并行为"扩展"中),同时保留层级较高模块中的参数。
被动运输
合并行为"覆盖"
- 动力学选项卡中的方程被覆盖。
- 参数列表被覆盖。这也意味着层级较低模块中未定义的参数将被移除。
- "源"和"目标"列表的运算符(和/或)被覆盖。
- 源和目标列表被覆盖(即可以移除源/目标条件)。
- 分子的包含/排除列表始终被扩展。但"全部"复选框的行为被覆盖。
当前被动运输的组合行为可能看起来不一致且有些令人困惑。关于此主题的讨论仍在进行中,可在 GitHub 上跟踪。
合并行为"扩展"
目前,被动运输的"扩展"合并行为与"覆盖"相同。
观察器
合并行为"覆盖"
- 监控选项卡中的方程被覆盖。
- "在容器中"列表被覆盖,包括运算符(和/或)。
- 分子的包含/排除列表始终被扩展。但"全部"复选框的行为被覆盖。
当前观察器的组合行为可能看起来不一致且有些令人困惑。关于此主题的讨论仍在进行中,可在 GitHub 上跟踪。
合并行为"扩展"
目前,观察器的"扩展"合并行为与"覆盖"相同。
事件
考虑以下情况:
- 模块
A有一个事件Event 1,模块B也有一个事件Event 1。模块A中的事件具有容器条件Events,模块B中的事件具有容器条件Organism。模块A中的事件有参数Param 1,模块B中的事件有参数Param 2。创建模拟时,这些事件根据各自的容器条件分别创建。因此,模拟将包含两个名为
Event 1的事件——一个在Events节点中(参数为Param 1),另一个在Organism节点中(参数为Param 2),与合并行为无关。 - 如果模块
B中的事件具有容器条件Events或Organism:- 合并行为覆盖:最终模型将在容器
Events和Organism中都包含Event 1,但仅有Param 2(Organism|Event 1仅在模块B中定义,Events|Event 1在两个模块中都有定义,将被模块B中的事件覆盖)。 - 合并行为扩展:最终模型将在容器
Events中包含事件Event 1(参数为Param 1和Param 2,因为Events|Event 1在两个模块中都有定义,将被扩展),在容器Organism中包含Event 1(参数为Param 2)。
- 合并行为覆盖:最终模型将在容器
事件的容器条件不会以任何方式组合。不同模块中的事件根据各自的容器条件分别生成,只有在同一容器中创建时才会合并(覆盖或扩展)。
此行为将在未来版本中更改,以允许跨模块更直接地组合事件。
对于具有相同最终绝对路径(由容器条件生成)的事件,适用以下规则:
合并行为"覆盖"
事件的完整树结构被覆盖。这意味着:
- 参数列表被覆盖。仅使用层级较低模块中定义的参数。
- 给药分子被覆盖。
- 事件的所有子节点(如 ProtocolSchemaItem、Application_StartEvent 等)被覆盖。
对于每个事件:
- 事件起始条件方程被覆盖。
- 事件起始条件 — "一次性"复选框被覆盖。
- 赋值列表被覆盖。
合并行为"扩展"
事件的树结构被扩展。这意味着:
- 参数列表被扩展。如果同一参数在多个模块中定义,则使用层级较低模块中的参数。
- 给药分子被扩展。
如果不同模块中定义了不同的分子,这将导致事件格式错误!
对于每个事件:
- 事件起始条件方程:不应用更改!
- 事件起始条件 — "一次性"复选框:不应用更改!
- 赋值列表被覆盖。
- 新节点(事件、容器等)被添加。
参数值
模拟中参数的最终值或公式按以下顺序确定:
- 构建单元中定义的值:首先使用参数所在 BB 中定义的值。例如,
CYP3A4|Reference concentration在分子 BB 中设为 1 µmol/l。如果仅使用此分子 BB 创建模拟,且未选择表达谱或 PV BB,则值为 1 µmol/l。 - 个体中定义的值。如果选择了一个个体,则应用个体中的值。当将个体应用于仅 PK-Sim 模块时,个体中定义的参数不存在于 PK-Sim 模块的空间结构中。这些参数在创建模拟时被添加到模型中。
一个特殊情况是,扩展模块在空间结构中显式定义了一个也存在于个体中的参数。在这种情况下,个体中的值将覆盖扩展模块中定义的值(或公式)。要覆盖个体中定义的参数(例如将器官体积定义为年龄相关表而非常量值),请在扩展模块的"参数值"部分定义该参数。
- 表达谱中定义的值。如果选择了表达谱,则应用表达谱中的值。例如,
CYP3A4|Reference concentration在分子 BB 中设为 1 µmol/l,在表达谱中设为 4.32 µmol/l。如果使用包含分子 BB 模块和表达谱创建模拟,则值为 4.32 µmol/l(覆盖分子 BB 中的值)。 - PV BB 中定义的值。如果选择了包含 PV BB 的模块,则应用 PV BB 中的值。如果多个模块包含相同参数条目的 PV BB,则使用最后一个模块的值。例如,如果扩展模块中
CYP3A4 Reference concentration的值为 2 µmol/l,模拟使用分子 BB 模块(值 1 µmol/l)、表达谱模块(值 4.32 µmol/l)和 PV BB 模块(值 2 µmol/l)创建,则模拟中的值将为 2 µmol/l。
初始条件
模拟中分子的最终起始值或公式按以下顺序确定:
- 分子 BB 中定义的值。按分子 BB 中定义的起始值。
- 表达谱中定义的值。对于蛋白质,使用表达谱中定义的值(包括起始值的公式)。
- IC BB 中定义的值。如果多个模块的 IC BB 中有相同分子的条目,则使用最后一个模块的值。如果 IC BB 中有与表达谱相同的分子/容器组合条目,则应用 IC BB 中的值。
提交/更新更改
从模拟向构建单元提交更改以及用构建单元的更改更新模拟的工作流已更改。
用构建单元的更改更新模拟
如果模拟中使用的构建单元在模拟创建后被更改,模拟将自动标记为"过时"。要用构建单元的更改更新模拟,只需右键单击模拟并选择"从构建单元更新"。这将调用从构建单元重新创建模拟,应用自模拟创建以来对所有构建单元的任何更改。在模拟中对参数值或起始值所做的任何更改都将丢失!
不再可能仅更新选定的构建单元。
从模拟向构建单元提交更改
在模拟中对参数值或起始值的更改可以提交到参数/起始值所属的构建单元(BB)。为此,右键单击模拟并选择"提交到构建单元"。
参数值的更改被提交到模拟配置中最后一个模块的选定参数值(PV)构建单元。如果最后一个模块不包含 PV BB,或该模块未选择 PV BB,将创建新的 PV BB。
当提交仅从 PK-Sim 模块创建的模拟中的更改时,最后一个 PK-Sim 模块将被转换为扩展模块。为避免此情况,应创建一个包含更改的新扩展模块,然后使用该扩展模块创建模拟。
分子初始条件(IC)的更改处理方式类似。它们被提交到模拟配置中最后一个模块的选定 IC BB。如果最后一个模块不包含 IC BB,或该模块未选择 IC BB,将创建新的 IC BB。
对构建单元的结构性更改(如添加/删除反应、分子、容器等)不能通过从模拟提交"过时"版本的构建单元来还原。只有参数值和初始条件的更改可以被提交。
最佳实践
OSP 软件最适合开发基于生理动力学(PBK)建模框架的复杂定量系统药理学/毒理学(QSP/T)模型。随着模块化概念的引入,此类模型的开发变得更加高效、透明和可持续。为充分利用新概念,应考虑以下最佳实践。
- 如果化合物之间不相互作用的,考虑为每个化合物设置单独的 PK-Sim 模块。这允许在 MoBi 模拟中灵活组合已建模的化合物。
- 对于药物-药物相互作用(DDI)模型,化合物应包含在同一个 PK-Sim 模块中,并在 PK-Sim 中定义相互作用。
组合两个 PK-Sim 模块不会自动创建两个模块中化合物之间的相互作用,即使其中一个化合物是 DDI 的促变剂。相互作用必须在 PK-Sim 中定义,且化合物必须包含在同一个 PK-Sim 模块中。
- PK-Sim 模块永远不应被修改。任何修改和/或扩展都应作为单独的模块实现。
- 扩展模块应尽可能通用。即,应尽可能通过最少的调整与任何 PK-Sim 模块兼容。
- 避免跨模块的信息重复——仅实现与其他模块的差异!
- 可以组合具有不同模型结构的 PBPK 模型(即组合小分子模型与大分子模型)。在此情况下,小分子模型必须在大分子模型之前选择。否则,由于缺少参数,模拟创建将失败。
项目转换
要充分利用新的模块化概念以及 MoBi 中对个体和表达谱的支持,需要使用 PK-Sim V12 创建的 PBPK 模型。对于使用之前版本创建的 PK-Sim 项目,必须从快照重新创建项目。在 PK-Sim V12 中打开项目,导出为快照,然后从快照重新加载(参见文档)。此后,项目中的所有模拟都将具有新结构,将其发送到 MoBi 将正确传输个体和表达谱。
- 从
*.pkml文件加载模拟时,将创建一个包含整个模型的模块。 - 打开使用之前版本创建的 MoBi 项目时:
- 如果项目恰好包含每种类型一个构建单元(即一个空间结构 BB、一个反应 BB、一个分子 BB 等),将创建一个包含所有构建单元的单一模块。
- 如果项目包含多个同类型的构建单元,将为每个构建单元创建一个模块。
由于模拟配置的新结构,使用之前版本 MoBi 创建的模拟中对参数值或初始条件的更改无法提交到构建单元。打开使用之前版本 MoBi 创建的项目时,模拟将被标记为"过时",并显示警告。