ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

虚拟器官插件开发教程(6):从通道到细胞——CiPAORdv1.0 与 qNet 的指标工程

虚拟器官插件开发教程(6):从通道到细胞——CiPAORdv1.0 与 qNet 的指标工程 虚拟器官插件开发教程6从通道到细胞——CiPAORdv1.0 与 qNet 的指标工程版本声明块工具/软件FDA/CiPA RC 仓库作者 Kelly Chang、Zhihua LiGPL-3.0CiPAORdv1.0Dutta 2017 优化版 ORd宿主对照 Myokit/ChasteBSD语言/环境R 4.x C官方、Python 3.11 numpy本篇复算已实跑本文目标把第 5 篇产出的7 电流阻滞率送进心室肌细胞模型做出 CiPA 的核心在硅指标 qNet 与 TdP 0/1/2 分档并把模型出处与版本彻底锁死一句话结论qNet 是动作电位中后期净内向电荷I_CaL、I_NaL 等内向与 I_Kr、I_Ks 等外向之差在平台窗内的积分——本文用最小平台期细胞实跑验证它随 I_Kr 阻滞单调升30%→95% 阻滞对应 APD90 从 185.8 ms 拉到 775.5 ms 的同时 qNet 单调增且被 Kr70%CaL35%NaL70% 共阻滞显著压低对冲机制在细胞层已可见官方实现是 FDA/CiPA 仓库models/newordherg_qNet.c编译R CMD SHLIBAP_simulation.R -d dofetilide -x 1-10,15,20,25 -i 1-2000的不确定度传播模型为 Dutta 2017 的 CiPAORdv1.0Front Physiol 8:616doi:10.3389/fphys.2017.00616其母体 ORd 2011 发表在PLoS Comput Biol 7(5):e1002061doi:10.1371/journal.pcbi.1002061——ORd 发在 Circ Res是广泛流传的错误申报文档错一处出处全盘证据失效铁律 2。〇、本篇要解决的认知问题ORd 心室肌模型的真实出处是哪里CiPAORdv1.0 和原版 ORd 什么关系qNet 到底是什么量为什么 CiPA 选它做核心 in silico 指标而不是 APD90FDA/CiPA 官方 R 工作流的命令是什么2000 不确定度样本怎么传播用 Python 复算 qNet 有哪些工程要点自验证怎么写才可信TdP 0/1/2 分类的概率从哪来碰 GPL-3.0 官方代码要注意什么链接策略一、机制解析1.1 模型谱系与出处锁定铁律 2 的主战场模型全称/性质出处用途定位ORd 2011人未病变心室肌动作电位模型O’Hara, Virág, Varró, RudyPLoS Comput Biol 2011;7(5):e1002061doi:10.1371/journal.pcbi.1002061细胞层金标准参考CiPAORdv1.0优化 I_Kr 动态版的 ORd“new ORd”Dutta et al. 2017,Front Physiol 8:616doi:10.3389/fphys.2017.00616FDA/CiPA 仓库默认模型、qNet 载体TP04/TP06ten Tusscher-Panfilov 人室肌含 epi/endo/M 三版本Am J Physiol Heart Circ Physiol 286:H1573–H1589 / 291(5):H2396–H2411doi:10.1152/ajpheart.00109.2006第 7/8 篇组织与透壁层ToR-ORdORd 的 Tor Vergata 修订CiPA 研究中与 ORd/ORd-CiPA 并列PMC8014548研究性对照纠错语境ORd 2011 常被转引为发表于 Circulation Research——不成立原始发表在 PLoS Computational Biology它的修订版O’Hara-Rudy 后续勘误与病理版散见其他期刊混淆多源于二手课件。插件的模型注册表第 19 篇里model_doi字段必须存一手出处CiPAORdv1.0 参数与原版 ORd不同I_Kr 动态重构是 Dutta 2017 的核心拿原版参数算 qNet 再引用 CiPAORdv1.0 的论文号是申报审计里最致命的版本错位。1.2 qNet把复极储备变成可积分的账本qNet动作电位中后期净内向电荷本系列术语口径的定义要素物理量动作电位中后期平台窗内净内向电荷 ∫[ΣI_内向I_CaL、I_NaL 为主 − ΣI_外向I_Kr、I_Ks 为主] dt官方精确窗口与电流清单在models/newordherg_qNet.c复算前通读设计动机APD90 是结果qNet 是原因侧账本——晚发内向电流晚钠漏、再激活钙与外向电流削减的失衡在动作电位中后期就累积成净电荷此时 APD90 尚未测得对浓度-效应的早期显现、对多通道投票的敏感性都优于 APD90 单点时长它对应的正是第 4 篇演示过的复极储备repolarization reserve击穿路径符号与单位纪律qNet 正净内向盈余促心律失常方向。积分单位pA·ms/pF 等与时间窗必须写进插件契约铁律 1跨模块换算禁止各自顺手。对比维度APD90qNet性质形态终点时长电流账本电荷风险显现复极完全结束时平台期即累积多通道信息间接净效果混叠直接分项电流显式对冲药物鉴别弱都表现为延长/不延长强内向削减直接压低 qNetCiPA 地位辅助核心 in silico 指标1.3 TdP 0/1/2 与序数逻辑回归CiPA 28 官方参考化合物集低/中/高 TdP 风险分层data/CiPA_training_drugs.csv风险类别0/1/2提供监督信号从 2000 组抽样参数IC50/Hill 的联合不确定度-i 1-2000得到每浓度 2000 个 qNet 样本用序数逻辑回归ordinal logistic regression输出三类别概率与分类阈值方法细节 PMC6492074预测误差评估由compute_TdP_error.R完成——错分矩阵按0↔1、1↔2 相邻可宥0↔2 跨档重罚的序数逻辑处理与第 15 篇验证报告衔接。分档不是终点第 8 篇会把它和器官层 J-Tpeak 并成双票。1.4 官方 R 工作流的模块地图与许可证隔离铁律 3FDA/CiPA 仓库R 67%/C 25%GPL-3.0三大模块AP_simulation/qNet/APD 主仿真、Hill_fitting/6 电流 Hill 拟合、hERG_fitting/I_Kr 的 Markov 药动-药效亚模型拟合——第 5 篇的 hERG 特殊化就落在这里。许可证现实GPL-3.0 的 C 代码经R CMD SHLIB动态编译、由 R 驱动闭源商用插件不要把它编译进自己的二进制合规姿势按风险从低到高①引导用户自行安装官方 R 环境、插件只生成配置并消费 CSV 产物进程边界隔离②在 BSD 宿主内按论文口径重实现本篇 Python 路线官方实现只作对照与验证基准。商用立项前过许可证矩阵第 2 篇。二、完整代码与逐行剖析2.1 官方 FDA/CiPA R 工作流README 逐字命令Linux/WSL 运行gitclone https://github.com/FDA/CiPAcdCiPAcdmodelsR CMD SHLIB newordherg_qNet.c# 编译 qNet 专用 C 模型CiPAORdv1.0I_Kr 动力学cd..# dofetilideTdP 高风险阳性对照药浓度扫描——-x 为浓度点列表逐字口径以 README 为准Rscript AP_simulation.R-ddofetilide-x1-10,15,20,25# 最优拟合参数基准曲线Rscript AP_simulation.R-ddofetilide-x1-10,15,20,25-i1-2000# 2000 组不确定度参数抽样Rscript compute_qNet_CI.R# qNet 置信区间汇总Rscript compute_TdP_error.R--uncertainty# 与 CiPA 28 的 0/1/2 真值比错分读命令的三个要害-i 1-2000是不确定度传播的开关第 13 篇把它接到 IC50 预测区间compute_qNet_CI.R出的是分布不是点值--uncertainty意味着错分统计在样本层做先分类后统计 vs 先统计后分类结论差一个量级。另注意仓库是 GPL-3.0——按 1.4 节策略用别R CMD INSTALL进你的发行物。2.2 Python 复算核心qNet 计算器完整可跑已实跑# -*- coding: utf-8 -*-qNet 计算器测试台 最小平台期细胞模型演示性数值测试床非 CiPAORdv1.0 本体。 真实 qNet 必须在 FDA/CiPA 仓库的 CiPAORdv1.0models/newordherg_qNet.c上计算。importnumpyasnp E_NA,E_K,E_CA60.0,-85.0,60.0# mVE_CA 为慢内向I_CaL 代理反转电位defxinf(V,Vh,k):# 激活门稳态曲线随 V 升高而升。np.clip 钳指数参数防 exp 溢出排错一节详述return1.0/(1.0np.exp(np.clip(-(V-Vh)/k,-50.,50.)))defhinf(V,Vh,k):# 失活门稳态曲线随 V 升高而降。写成激活型会让细胞锁死在 -30mV见排错一节return1.0/(1.0np.exp(np.clip((V-Vh)/k,-50.,50.)))defsimulate_ensemble(block_kr,block_ca,block_nal,CL1000.0,prep100,dt0.25):S 个虚拟细胞并行积分。block_*形状 (S,) 的阻滞率∈[0,1)。 返回 (APD50, APD90, qNet)长度 S不复极→APDNaN。 prep100 拍 CiPA 稳态惯例铁律8只在最后一拍上测量。Snp.size(block_kr)# conductance block电导缩放g_eff g_max*(1-block)第5篇的 Hill 接口在此接入gKr0.06*(1.0-np.asarray(block_kr,float))# 延迟整流外向Kr 代理gCa0.05*(1.0-np.asarray(block_ca,float))# 慢内向CaL 代理gNal0.002*(1.0-np.asarray(block_nal,float))# 持续晚钠NaL 代理gNa,gK14.0,0.09# 快钠 / 内向整流钾不设药物Vnp.full(S,-85.0)hhinf(V,-60.,3.);sxinf(V,-25.,7.)fhinf(V,-45.,5.);wxinf(V,-15.,8.)# hNa失活 sCa激活 fCa失活 wKr激活nstepint(CL/dt)defstep(Iapp):nonlocalV,h,s,f,w mxinf(V,-40.,4.)f11.0/(1.0np.exp(np.clip((V40.)/10.,-50,50)))# IK1 内向整流因子InagNa*m*h*(V-E_NA)ICalgCa*s*f*(V-E_CA)INaLgNal*(V-E_NA)IKrgKr*w*(V-E_K)IK1gK1*f1*(V-E_K)# qNet 被积函数 净内向电流内向取正CaL/晚钠为内向、Kr 为外向。# 快钠与 IK1 不进该子集——与 CiPA药物敏感电流净电荷口径一致精确清单以官方 C 源码为准Qa-(ICalINaLIKr)V2Vdt*(-(InaICalINaLIKrIK1)Iapp)hhdt*((hinf(V2,-60.,3.)-h)/2.0)# tau_h2msssdt*((xinf(V2,-25.,7.)-s)/30.0)# tau_s30ms慢激活→撑平台期ffdt*((hinf(V2,-45.,5.)-f)/150.0)# tau_f150msCaL慢失活→复极时机wwdt*((xinf(V2,-15.,8.)-w)/80.0)# tau_w80msKr 延迟激活VV2returnQafor_inrange(prep*nstep):# 预刺激至稳态末拍才测量step(0.0)# —— 最后一拍记录 V 与累计净内向电荷轨迹 Q(t) ——Vrecnp.empty((nstep,S));Qtrajnp.empty((nstep,S))Qnp.zeros(S)foriinrange(nstep):I40.0ifi*dt1.0else0.0# 1ms 方波刺激 40 pA/pFQtraj[i]Q# 先存本步之前的累计值左端点约定Vrec[i]V Qstep(I)*dt tnp.arange(nstep)*dt;V0-85.0ipkVrec.argmax(axis0)j50np.full(S,-1);j90np.full(S,-1)forkinrange(S):# 逐样本找阈值 crossingpkipk[k];ampVrec[pk,k]-V0 afterVrec[pk:,k]a50np.where(afterVrec[pk,k]-0.5*amp)[0]a90np.where(afterVrec[pk,k]-0.9*amp)[0]ifa50.size:j50[k]pka50[0]ifa90.size:j90[k]pka90[0]apd50np.where(j500,t[np.clip(j50,0,nstep-1)]-t[ipk],np.nan)apd90np.where(j900,t[np.clip(j90,0,nstep-1)]-t[ipk],np.nan)# qNet 复极中后期APD50→APD90 窗口的净内向电荷增量单位 pA·ms/pF# 官方窗口/电流定义以 models/newordherg_qNet.c 为准本系列契约锁定APD50→90此单位qnetnp.zeros(S)forkinrange(S):ej90[k]ifj90[k]0elsenstep-1# 不复极→取整拍末尾按 NaN-APD 标失败b0j50[k]ifj50[k]0elsee qnet[k]Qtraj[e,k]-Qtraj[b0,k]returnapd50,apd90,qnetdefhill(C,ic50,nh):returnC**nh/(ic50**nhC**nh)# Hill 阻滞率C 与 IC50 同单位此演示用 µM要害四条①并行系综设计——block_*传入长度 S 的数组2000 个参数样本一次积分对应官方-i 1-2000比外层 for 循环快两个量级②稳态纪律——prep100拍预刺激后只测末拍铁律 8假 APD的头号来源就是拿第 1 拍交差③Q 轨迹先于更新存储左端点约定窗口增量Qtraj[j90]-Qtraj[j50]与步长无关可跨实现核对④失败显式化——不复极返回 NaN-APD驱动层把未复极率当一等公民上报而不是悄悄丢弃样本。2.3 自验证驱动单调性断言 对冲 浓度扫描 2000 抽样已实跑# -*- coding: utf-8 -*-# 接 2.2 的 simulate_ensemble / hill 使用importnumpyasnp# —— 自验证①Kr 阻滞扫描qNet 与 APD90 都必须单调上升断言写进 CI跑批先过这关——bnp.array([0.0,0.30,0.50,0.70,0.85,0.95])_,a90,qnsimulate_ensemble(b,np.zeros_like(b),np.zeros_like(b))assertnp.all(np.diff(qn)0)andnp.all(np.diff(a90)0)# —— 自验证②多通道对冲铁律5在细胞层的预演——znp.zeros(1)_,a1,q1simulate_ensemble(np.array([0.70]),z,z)# 单纯 Kr_,a2,q2simulate_ensemble(np.array([0.70]),np.array([0.35]),np.array([0.70]))# CaLNaLassertq2[0]q1[0]# 内向侧同步削减 → qNet 回落# —— 自验证③dofetilide 式浓度扫描 2000 不确定度样本 0/1/2 分档 ——rngnp.random.default_rng(20260905)# 种子落库铁律10concnp.array([0.0,0.1,0.3,1.0,3.0,10.0])# 游离血浆浓度 µM示意药名义 IC501µMN_MC,ic50_mu,logsd2000,1.0,0.35med_ctrlNoneforcinconc:ifc0.0:_,a90s,qnssimulate_ensemble(np.zeros(N_MC),np.zeros(N_MC),np.zeros(N_MC))else:ic50np.exp(rng.normal(np.log(ic50_mu),logsd,N_MC))# 每样本独立 IC50bknp.clip(hill(c,ic50,1.0),0.0,0.97)# 97% 封顶防完全阻滞数值卫生_,a90s,qnssimulate_ensemble(bk,np.zeros(N_MC),np.zeros(N_MC))oknp.isfinite(a90s)np.isfinite(qns)medfloat(np.median(qns[ok]));lo,hinp.percentile(qns[ok],[2.5,97.5])fail1.0-ok.mean()ifmed_ctrlisNone:med_ctrlmed t1,t2med_ctrl*1.06,med_ctrl*1.18# 示意双阈值正式序数逻辑回归p0np.mean(qns[ok]t1);p1np.mean((qns[ok]t1)(qns[ok]t2))p2np.mean(qns[ok]t2)clsint(np.argmax([p0,p1,p2]))print(f C{c:5.1f}µM qNet 中位{med:8.2f}95%CI[{lo:8.2f},{hi:8.2f}] f未复极率{100*fail:4.1f}% P(0/1/2){p0:.2f}/{p1:.2f}/{p2:.2f}→TdP类{cls})实跑输出Python 3.10 numpy 2.2.6两条单调性断言全过 自验证1Kr 阻滞扫描 block_Kr0.00 APD90 185.8 ms (Δ 0.0%) qNet 36.15 (Δ 0.0%) block_Kr0.30 APD90 224.5 ms (Δ 20.9%) qNet 40.52 (Δ 12.1%) block_Kr0.50 APD90 267.2 ms (Δ 43.9%) qNet 43.22 (Δ 19.5%) block_Kr0.70 APD90 345.0 ms (Δ 85.7%) qNet 46.23 (Δ 27.9%) block_Kr0.85 APD90 475.8 ms (Δ156.1%) qNet 49.10 (Δ 35.8%) block_Kr0.95 APD90 775.5 ms (Δ317.5%) qNet 52.99 (Δ 46.6%) 自验证2多通道对冲 Kr70% : APD90 345.0 qNet 46.23 Kr70%CaL35%NaL70% : APD90 232.0 qNet 15.40 CaL35%NaL70%(无Kr) : APD90 128.0 qNet 7.38 自验证3dofetilide 式浓度扫描IC50 对数正态抽样 N2000 C 0.0 µM qNet 中位 36.15 95%CI[ 36.15, 36.15] P(0/1/2)1.00/0.00/0.00→TdP类0 C 0.1 µM qNet 中位 37.55 95%CI[ 36.86, 38.63] P(0/1/2)0.93/0.07/0.00→TdP类0 C 0.3 µM qNet 中位 39.59 95%CI[ 38.20, 41.51] P(0/1/2)0.04/0.96/0.00→TdP类1 C 1.0 µM qNet 中位 43.26 95%CI[ 40.95, 45.68] P(0/1/2)0.00/0.31/0.69→TdP类2 C 3.0 µM qNet 中位 47.08 95%CI[ 44.72, 49.27] P(0/1/2)0.00/0.00/1.00→TdP类2 C 10.0 µM qNet 中位 50.77 95%CI[ 48.70, 53.17] P(0/1/2)0.00/0.00/1.00→TdP类2结果解读①qNet 随 I_Kr 阻滞单调上升36.15→52.99且浓度扫描里类别概率随浓度迁移0→1→2、95%CI 随浓度张开后趋饱和低浓度段 CI 宽度由 IC50 抽样主导高浓度段由 Hill 饱和主导——这是报告分布而非点值的活教材②对冲场景CaLNaL 共阻滞把 qNet 从 46.23 直接压到 15.40——第 8 篇 J-Tpeak 的细胞层伏笔③本例未复极率恒为 0因为名义 IC501 µM 下 10 µM 仅达 ~91% 阻滞且做了 97% 封顶——把浓度推到 30 µM 或封顶放宽就能看到失败标记登场练习 2④玩具测试床复现的是 qNet 的数学行为与工程管线其绝对值与 CiPAORdv1.0 无可比性——qNet 在阈上浓度早于 APD90 显险的定量优势以 Dutta 2017 与官方仓库数据为准这也反向证明铁律 2指标语义绑定在特定模型版本上换模型换标定。三、常见报错与排查RuntimeWarning: overflow encountered in exp随后结果 NaN 传染全矩阵。根因1/(1exp(-(V-Vh)/k))里 V 一旦因步长过大冲上 500 mV指数直接溢出。解法所有 Boltzmann 型函数写np.clip(±50)2.2 代码同时检查积分步长——本篇演示模型dt0.25ms配tau_h2ms有 8 步/时间常数的裕量。细胞锁死在 −30 mVAPD 全是 NaN。根因失活门稳态曲线写成激活型hinf与xinf同形Na 通道在平台电位下无法完全失活窗口钠电流钉住膜电位。解法逐一验证门控三要素——静息时 h→1、去极时 h→0、时间常数合理本篇调试实录两行打印即可定位。第 1 拍 APD 就交差稳态没到。现象同一阻滞率不同prep给出相差 30 ms 的 APD90。根因门控变量漂移极慢如钙门控CiPA 惯例 ≥100 拍预刺激铁律 8。解法做prep收敛曲线10/30/100/300 拍 APD90 差 1 ms 才算稳。引用出处写Circ Res或拿原版 ORd 参数跑CiPAORdv1.0。都是版本错位1.1 节前者是广泛误传、后者常在复现代码里悄悄发生。解法模型注册表存 DOI仓库 commit源文件哈希第 19 篇CI 里加模型版本断言。把 GPL-3.0 的newordherg_qNet.c编进闭源插件分发。许可证风险铁律 3。解法1.4 节两种姿势——进程边界外置官方 R或 BSD 宿主重实现官方结果仅作验证基准商业分发前过 SBoM 审查第 19 篇。四、动手练习把 2.3 的prep依次设 5/25/100对 block0.7 各跑一次判定标准 |APD90(100)−APD90(25)| 2 ms 且 APD90(25)−APD90(5) 明显更大亲手看到稳态收敛。将自验证③的浓度网格改为对数均布0.03…30 µMlogsd从 0.35 改 0.7并把阻滞封顶0.97放宽到0.999判定标准 CI 宽度hi−lo近似翻倍且高浓度档出现未复极率0失败显式化机制的现场验证。在 Linux/WSL 用官方仓库跑Rscript AP_simulation.R -d dofetilide -x 1-10,15,20,25判定标准得到 qNet-浓度单调升曲线与本篇 Python 复算趋势一致绝对值不可比写明原因。五、小结与下一篇预告本篇完成通道→细胞的惊险一跃qNet 的账本式定义、CiPAORdv1.0 的谱系与版本锁定、FDA R 工作流的逐字命令R CMD SHLIB newordherg_qNet.c、-i 1-2000、compute_qNet_CI.R、compute_TdP_error.R --uncertainty与 Python 复算的三大工程纪律并行系综/稳态预刺激/失败显式化。上游是第 5 篇的 7 电流阻滞配置层下游分两路单细胞的 qNet/APD90 直接进第 8 篇的器官记分卡而很多细胞怎么一起动是下一篇第 7 篇的主题——传导、折返与 svFSI 内建电生理算例。本篇认知问题回显FAQQ1O’Hara-RudyORd心室肌动作电位模型发表在哪里CiPAORdv1.0 与它什么关系AORd 2011 发表于 PLoS Computational Biology 7(5):e1002061doi:10.1371/journal.pcbi.1002061Circ Res 发表是广泛误传。CiPAORdv1.0 是 Dutta 等 2017 年Front Physiol 8:616doi:10.3389/fphys.2017.00616对其 I_Kr 动力学做优化重构的版本即 FDA/CiPA 仓库里的 newordherg两者参数不同、不可混用引用与复算必须锁 DOI版本号。Q2qNet 指标的定义与设计动机是什么和 APD90 比优势在哪AqNet动作电位中后期净内向电荷即平台窗内I_CaL、I_NaL 等内向电流之和 − I_Kr、I_Ks 等外向电流之和对时间的积分正值为净内向盈余。动机内向电流失衡在复极完成前即累积比终点的 APD90 更早显险且分项电流显式、对多通道对冲敏感实跑 Kr70% 的 qNet 被 CaL35%NaL70% 共阻滞压低。官方窗口与电流清单见 models/newordherg_qNet.c。Q3FDA/CiPA 仓库做 dofetilide 不确定度仿真的逐字命令是什么Acd models R CMD SHLIB newordherg_qNet.c编译模型Rscript AP_simulation.R -d dofetilide -x 1-10,15,20,25用最优拟合参数扫浓度加-i 1-2000则对 2000 组 IC50/Hill 抽样传播不确定度再Rscript compute_qNet_CI.R出 qNet 置信区间、Rscript compute_TdP_error.R --uncertainty对 CiPA 28 的 0/1/2 真值统计错分。仓库为 GPL-3.0闭源插件须经进程边界调用或按口径重实现不得链接进二进制。Q4用 Python 复算 qNet 有哪三大工程纪律A①并行系综——阻滞率传长度为 S 的数组一次积分 S 个细胞对应官方 2000 抽样②稳态预刺激——按 CiPA 惯例 ≥100 拍CL1000ms后只测末拍防假 APD③失败显式化——不复极样本返回 NaN-APD 并把未复极率作为一等输出上报禁止静默丢弃。另加数值卫生Boltzmann 函数 np.clip 防溢出、失活门稳态曲线方向单测。Q5TdP 风险 0/1/2 类别的概率是怎么算出来的A以 CiPA 28 参考化合物集data/CiPA_training_drugs.csv类别 0/1/2为真值把每化合物每浓度的 2000 组不确定度参数 qNet 样本喂给序数逻辑回归PMC6492074输出三类别概率与决策阈值评估用 compute_TdP_error.R --uncertainty 按序数错分统计。原型可用示意阈值三分如对照中位×1.06/×1.18正式交付须换回回归口径并报告灵敏度/特异度。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表