第14章 软件与方法选择
第14章 软件实现、交叉检查与方法选择
第三方包的能力边界、最小案例和可重复计算记录
14.1 软件能力对照
| 软件 | 主要环境 | 适合任务 | 不直接承担 |
|---|---|---|---|
| EasySpin | MATLAB | CW谱、耦合自旋体系、脉冲响应和自定义动力学 | 通用PDS背景与距离反演工作流 |
| DeerLab | Python | PDS前向模型、参数化/非参数拟合、全局分析和不确定度 | 谱仪采集相位循环 |
| DeerAnalysis | GUI及当前发布环境 | 交互式PDS处理、常规距离反演和结果浏览 | 自旋哈密顿量全谱模拟 |
| DeerNet | 神经网络模块 | 时间迹到距离分布的独立对照 | 任意超出训练分布的物理模型 |
| MMMx/chiLife | MATLAB/Python | 自旋标签rotamer及结构距离预测 | 实验背景和脉冲选择函数 |
14.2 DeerLab具体案例:4-pulse DEER联合拟合
本例使用DeerLab 1.2.0构造一条带均匀三维背景的4-pulse DEER时间迹,并在加入固定随机种子的高斯噪声后,联合拟合高斯距离分布、调制深度、有效浓度和重聚时间。案例的用途是核对参数单位、实验路径定义、拟合对象和区间输出;数据为合成数据,不代表仪器测量。
已执行 Python环境中已完成前向计算与拟合。时间单位为μs,距离单位为nm,浓度单位为μM;随机种子固定为20260915。
14.2.1 计算条件与选择依据
| 项目 | 设置 | 本例中的作用 |
|---|---|---|
| 实验模型 | ex_4pdeer(0.50, 3.50, pathways=[1]) | 显式定义主偶极路径及其重聚时间 |
| 时间轴 | 0.10–3.996 μs,步长0.008 μs | 覆盖约4 μs的偶极演化,同时避免把负时间段写入本例 |
| 距离网格 | 1.50–5.99 nm,步长0.01 nm | 包围3.20 nm主峰并留出核函数计算边界 |
| 距离模型 | 单高斯,均值3.20 nm,标准差0.18 nm | 使峰位和峰宽具有可直接核对的设定值 |
| 背景与调制 | 70 μM,调制深度0.35 | 检验距离参数与背景、调制参数的联合估计 |
| 噪声 | 独立高斯噪声,σ=0.003 | 使区间估计与残差检查具有有限噪声条件 |
4-pulse DEER适用于此例,是因为两类自旋包可按pump和observer通道建模,目标距离落在常规脉冲偶极谱时间窗内,且单路径模型足以描述所构造的数据。若数据来自5-pulse或7-pulse DEER,应把相应次路径及其重聚时间写入实验模型,不能直接复用本例的单路径设定。
14.2.2 完整Python脚本
import json
from pathlib import Path
import deerlab as dl
import matplotlib.pyplot as plt
import numpy as np
OUTDIR = Path(__file__).resolve().parent
rng = np.random.default_rng(20260915)
# 4-pulse DEER timing and grids (time in microseconds, distance in nanometers)
tau1, tau2 = 0.50, 3.50
t = np.arange(0.10, tau1 + tau2, 0.008)
r = np.arange(1.50, 6.00, 0.01)
experiment = dl.ex_4pdeer(tau1, tau2, pathways=[1])
# Parametric distance model plus homogeneous intermolecular background
model = dl.dipolarmodel(t, r, Pmodel=dl.dd_gauss, experiment=experiment)
truth = dict(mean=3.20, std=0.18, conc=70.0,
scale=1.0, mod=0.35, reftime=tau1)
V_clean = model(**truth)
V = V_clean + rng.normal(0.0, 0.003, t.size)
# Joint fit of distance, modulation depth, background concentration and refocusing time
fit = dl.fit(model, V, reg=False)
Pfit = fit.evaluate(dl.dd_gauss, r)
Pfit /= np.trapezoid(Pfit, r)
residual = V - fit.model
summary = {
'deerlab_version': dl.__VERSION__,
'truth': truth,
'fit': {
'mean_nm': float(fit.mean),
'std_nm': float(fit.std),
'conc_uM': float(fit.conc),
'modulation_depth': float(fit.mod),
'reftime_us': float(fit.reftime),
'rms': float(np.sqrt(np.mean(residual**2))),
'mean_95ci_nm': np.asarray(fit.meanUncert.ci(95)).tolist(),
'std_95ci_nm': np.asarray(fit.stdUncert.ci(95)).tolist(),
},
}
(OUTDIR / 'deerlab_case_results.json').write_text(
json.dumps(summary, indent=2, ensure_ascii=False), encoding='utf-8')
fig, ax = plt.subplots(2, 1, figsize=(7.2, 6.0), constrained_layout=True)
ax[0].plot(t, V, '.', ms=2.1, color='#7a838a', label='synthetic data')
ax[0].plot(t, fit.model, lw=1.8, color='#285f8d', label='joint fit')
ax[0].set(xlabel='Time / μs', ylabel='V(t) / a.u.')
ax[0].legend(frameon=False)
ax[1].plot(r, Pfit, lw=2.0, color='#8d3b3b')
ax[1].axvline(truth['mean'], lw=1.0, ls='--', color='#53616c')
ax[1].set(xlabel='Distance / nm', ylabel='P(r) / nm⁻¹', xlim=(2.4, 4.0))
fig.savefig(OUTDIR / 'deerlab_case.svg', format='svg', metadata={'Date': None})
14.2.3 数值结果
| 拟合量 | 设定值 | 拟合值 | 95%区间 |
|---|---|---|---|
| 平均距离 | 3.200 nm | 3.2009 nm | 3.1981–3.2037 nm |
| 分布标准差 | 0.180 nm | 0.1775 nm | 0.1737–0.1812 nm |
| 有效浓度 | 70.0 μM | 70.60 μM | 本例未单列 |
| 调制深度 | 0.350 | 0.3492 | 本例未单列 |
| 重聚时间 | 0.500 μs | 0.4995 μs | 本例未单列 |
| 残差RMS | 噪声σ = 0.003 | 0.002944 | — |
14.2.4 结果解释与实验数据替换
平均距离和分布宽度均恢复到设定值附近,残差RMS为0.002944,与注入噪声的标准差0.003相当,说明本例中的前向模型与生成模型相容。该结果只验证代码路线及单位映射。实验数据还需经过复数相位、时间零点、异常点和采集序列检查。
替换为实测Bruker文件时,可使用t, V = dl.deerload("sample.DTA")读取时间轴和信号,并在建立模型前保存原始复数数据。若采用非参数距离分布,可移除Pmodel=dl.dd_gauss并启用相应正则化;输出中应增加正则化选择、点态区间和背景模型敏感性。
14.3 DeerAnalysis:交互处理与复查
DeerAnalysis适合交互检查时间零点、背景范围、Tikhonov参数和距离分布。2026版公开仓库说明其采用重新设计的界面,并结合DeerLab与DeerNet。正式项目应保存软件版本、项目文件、导出时间迹和处理设置,截图只能作为附加记录。
| 操作 | 建议保存 | 复查条件 |
|---|---|---|
| 相位与零点 | 校正前后复数数据 | 虚部和零点邻域无系统结构 |
| 背景拟合 | 模型、拟合区间及参数 | 改变区间后主结论稳定 |
| Tikhonov | L-curve及多个\(\alpha\) | 主峰不依赖单个正则化点 |
| DeerNet | 网络输出和区间 | 与物理模型的差异得到解释 |
14.4 DeerNet:神经网络结果的定位
DeerNet由模拟数据库训练,可快速给出距离分布及不确定度估计。它适合作为独立分析通道和异常提示。训练数据覆盖的背景、噪声、距离范围和实验类型决定其适用范围;多路径、高自旋谐波、强取向选择和明显交换作用需要单独确认。
神经网络与Tikhonov结果一致时,可以增加对主峰位置的信心;两者不一致时,应返回复数时间迹、背景、路径和训练分布适用性。结果差异不能通过简单平均处理。
14.5 EasySpin具体案例:CW耦合谱与脉冲自旋动力学
本节设置三个可执行案例。CW案例用pepper计算双亚硝基的距离及交换耦合扫描;Rabi案例用spidyan计算单自旋在有限矩形脉冲下的纵向磁化;Hahn echo案例用saffron对亚硝基粉末体系和整形脉冲进行回波瞬态计算。
本节脚本可复制到已安装EasySpin的MATLAB环境中手动运行。运行前应确认EasySpin已加入MATLAB搜索路径,并依据所用版本核对函数参数。示例输出用于比较距离、交换耦合、脉冲长度和脉冲形状对连续波谱或时间域信号的影响。
14.5.1 模型设置与距离映射
| 电子距离 | Sys.dip | 预期谱学效应 |
|---|---|---|
| 1.2 nm | 30.116 MHz | 偶极张量最大,双标谱相对参照谱出现最明显的展宽和线形重分配 |
| 1.5 nm | 15.419 MHz | 偶极效应处于中间水平,适合检查交换项与偶极项的相关性 |
| 2.0 nm | 6.505 MHz | 偶极贡献减弱,线宽、g/A应变和基线误差更易影响距离判别 |
Sys.dip的标量形式在EasySpin中展开为轴对称主值[D D -2D];Sys.J采用 (+J\mathbf S_1\cdot\mathbf S_2) 的哈密顿量约定。脚本中的两个亚硝基具有相同且共轴的g与A张量,因此属于刚性、简化的双自由基测试模型。实际蛋白标签应加入两标签相对取向、rotamer分布、g/A应变及可能的距离分布。
14.5.2 完整MATLAB脚本
clear; clc;
% EasySpin concrete case: X-band CW spectra of two coupled nitroxides
% Units: g dimensionless, A/J/dip in MHz, field in mT, mwFreq in GHz
rlist = [1.2 1.5 2.0]; % electron-electron distances / nm
gN = [2.009 2.006 2.002];
AN = [20 20 100]; % one 14N hyperfine tensor / MHz
Exp.mwFreq = 9.5;
Exp.Range = [330 350];
Exp.nPoints = 4096;
Opt.Method = 'matrix';
% Single-nitroxide reference
Ref.S = 1/2;
Ref.g = gN;
Ref.Nucs = '14N';
Ref.A = AN;
Ref.lwpp = 0.12;
[B,spcRef] = pepper(Ref,Exp,Opt);
spcRef = spcRef/max(abs(spcRef));
% Biradical distance scan. Scalar Sys.dip denotes [D D -2D].
spcDip = zeros(Exp.nPoints,numel(rlist));
for k = 1:numel(rlist)
Sys.S = [1/2 1/2];
Sys.g = [gN; gN];
Sys.Nucs = '14N,14N';
Sys.A = [AN 0 0 0; 0 0 0 AN];
Sys.dip = 52.04/rlist(k)^3; % point-dipole D / MHz
Sys.J = 0; % +J*S1.S2 convention
Sys.lwpp = 0.12;
[B,spcDip(:,k)] = pepper(Sys,Exp,Opt);
spcDip(:,k) = spcDip(:,k)/max(abs(spcDip(:,k)));
end
figure(1); clf
plot(B,spcRef,'k--','LineWidth',1.1); hold on
plot(B,spcDip,'LineWidth',1.2)
xlabel('Magnetic field / mT'); ylabel('Normalized first derivative')
legend('single nitroxide','1.2 nm','1.5 nm','2.0 nm')
% Exchange-coupling sensitivity at a fixed 1.5 nm distance
Jlist = [0 5 20]; % MHz
Sys.dip = 52.04/1.5^3;
spcJ = zeros(Exp.nPoints,numel(Jlist));
for k = 1:numel(Jlist)
Sys.J = Jlist(k);
[B,spcJ(:,k)] = pepper(Sys,Exp,Opt);
spcJ(:,k) = spcJ(:,k)/max(abs(spcJ(:,k)));
end
figure(2); clf
plot(B,spcJ,'LineWidth',1.2)
xlabel('Magnetic field / mT'); ylabel('Normalized first derivative')
legend('J = 0 MHz','J = 5 MHz','J = 20 MHz')
14.5.3 输出读取与拟合扩展
| 输出 | 判读内容 | 实验用途 |
|---|---|---|
| 距离扫描谱 | 耦合增强时谱翼、转折点和三线结构的共同变化 | 确认双标谱变化可由偶极耦合解释的程度 |
| 交换扫描谱 | 固定偶极项后,交换耦合引起的线位和整体线形变化 | 检查仅以偶极展宽换算距离的偏差 |
| 单标参照谱 | g、A和本征线宽 | 约束双标拟合中的共享谱学参数 |
| 残差与参数轮廓 | $r$、$J$、线宽和张量应变间的相关性 | 给出可辨识区间,避免只报告单个最佳距离 |
实验全谱拟合可用EasySpin的esfit或外部优化器,把单标和双标数据作为联合目标函数。g、A和部分线宽由单标谱约束,双标谱增加距离分布及J项。小于约1.5–2.0 nm的刚性双自由基适合采用此路线;距离增大后偶极线形变化快速减弱,脉冲偶极谱通常更合适。
14.5.4 脉冲案例A:Rabi振荡与π/2、π脉宽标定
Rabi案例使用单个共振电子自旋和30 MHz矩形微波脉冲,按1 ns步长扫描脉冲长度。检测算符设为{'z1'},输出脉冲结束时的纵向磁化。共振且忽略弛豫时,理论关系为
| 量 | 理论值 | 模拟检查 |
|---|---|---|
| Rabi周期 | 33.33 ns | 相邻纵向磁化极大值的间隔 |
| π/2脉宽 | 8.33 ns | 首次 $M_z=0$ 的位置 |
| π脉宽 | 16.67 ns | 首次 $M_z=-M_z(0)$ 的位置 |
| 2π脉宽 | 33.33 ns | 纵向磁化首次返回初值 |
clear; clc; clf
% EasySpin pulse case A: Rabi oscillation with spidyan
Sys.ZeemanFreq = 9.500; % resonance frequency / GHz
Pulse.Type = 'rectangular';
Pulse.tp = 0.001; % initial pulse length / µs
Pulse.Amplitude = 30; % nutation frequency / MHz
Exp.Sequence = {Pulse};
Exp.mwFreq = 9.500; % carrier frequency / GHz
Exp.DetWindow = 0; % detect immediately after pulse
Exp.DetOperator = {'z1'}; % longitudinal electron magnetization
Exp.nPoints = 99;
Exp.Dim1 = {'p1.tp' 0.001}; % scan pulse 1 length in 1 ns steps
[tp,Mz] = spidyan(Sys,Exp);
figure(1); clf
plot(tp*1e3,real(Mz),'LineWidth',1.3)
xlabel('Pulse length / ns')
ylabel('<S_z> / normalized units')
title('Rabi oscillation, 30 MHz B_1')
grid on
该脚本用于检查脉宽、$B_1$与翻转角之间的映射。实验nutation曲线还包含 $B_1$空间不均匀、离共振、自旋包分布、谐振器瞬态和弛豫,因此振荡包络不能直接归属于单一 $T_2$。可在脚本中增加Sys.T1、Sys.T2及频率偏移扫描,分别检查弛豫和失谐影响。
14.5.5 脉冲案例B:整形脉冲亚硝基Hahn echo
Hahn echo案例采用亚硝基 $S=1/2$、$I=1$ 自旋哈密顿量,在324.9 mT和9.1 GHz条件下使用±120 MHz扫频的quarter-sine/linear脉冲。π/2脉冲长度为0.200 μs,π脉冲长度为0.100 μs,脉冲间边沿延迟为0.200 μs。
| EasySpin对象 | 本例设置 | 物理含义 |
|---|---|---|
p90.Frequency | [-120, 120] MHz | 相对载频的扫频范围 |
p90.trise | 0.030 μs | quarter-sine边沿平滑时间 |
Exp.Sequence | {p90 tau p180 tau+p180.tp} | EasySpin延迟按前一事件末端至后一事件起点定义;补加π脉冲时长使检测窗位于回波中心附近 |
Exp.DetWindow | [-0.15, 0.15] μs | 回波中心两侧的复数瞬态窗口 |
Opt.GridSize | 30 | 粉末取向平均网格,正式计算需做收敛性检查 |
clear; clc; clf
% EasySpin pulse case B: nitroxide Hahn echo with shaped pulses
Sys.S = 1/2;
Sys.g = [2.009 2.006 2.002];
Sys.Nucs = '14N';
Sys.A = [11 11 95]; % MHz
Exp.Field = 324.9; % mT
Exp.mwFreq = 9.1; % GHz
% Quarter-sine-edged linear chirp excitation pulse
p90.Type = 'quartersin/linear';
p90.tp = 0.200; % µs
p90.Flip = pi/2;
p90.Frequency = [-120 120]; % MHz relative to carrier
p90.trise = 0.030; % µs
% Refocusing pulse with the same sweep range
p180 = p90;
p180.tp = 0.100; % µs
p180.Flip = pi;
tau = 0.200; % µs
Exp.Sequence = {p90 tau p180 tau+p180.tp};
Exp.DetWindow = [-0.15 0.15]; % echo transient window / µs
Exp.DetPhase = pi;
Opt.GridSize = 30; % powder-orientation grid
Opt.Verbosity = true;
[t,echo] = saffron(Sys,Exp,Opt);
figure(2); clf
plot(t,real(echo),'LineWidth',1.3); hold on
plot(t,imag(echo),'LineWidth',1.0)
xlabel('Detection time / µs')
ylabel('Echo signal / a.u.')
legend('I','Q')
title('Nitroxide Hahn-echo transient')
grid on
该案例用于比较I/Q回波、整形脉冲覆盖和取向平均。改变扫频范围可检查脉冲带宽不足引起的谱包选择;改变GridSize可识别离散取向采样产生的伪回波;把整形脉冲替换为矩形脉冲可比较有限带宽条件下的回波幅度和相位。
14.5.6 EasySpin脉冲函数的适用边界
| 函数 | 适合对象 | 本报告案例 | 限制条件 |
|---|---|---|---|
spidyan | 有限脉冲、任意事件序列、状态轨迹和自定义检测 | Rabi振荡 | 一次调用处理单一自旋包;粉末谱需显式循环或另用saffron |
saffron | 单电子体系的脉冲EPR/ENDOR、粉末平均和瞬态 | 亚硝基Hahn echo | 当前文档限定为单电子自旋体系;双电子PDS需另建传播模型 |
evolve | 密度矩阵在理想脉冲与自由演化阶段的传播 | 本节未单列 | 脉冲有限带宽和整形波形需由更完整的传播方法处理 |
这两个脉冲案例覆盖实验前置校准与回波形成,尚未把4-pulse DEER、DQC或RIDME完整序列写成EasySpin双电子计算程序。此类PDS模拟需同时处理两个电子、自旋包选择、pump/observer频率、粉末取向、路径选择和相位循环,适合作为独立计算模块开发。
14.6 MMMx与chiLife:标签构象到预测距离
标签建模软件从分子结构和位点生成rotamer集合,计算电子自旋中心间的预测分布。其输出用于比较结构状态、选择标签位点和解释峰宽。实验选择权重、标记失败、聚集和背景不包含在常规rotamer计算中。
| 输入 | 输出 | 需与实验共同检查 |
|---|---|---|
| PDB/结构模型 | 位点局部空间和标签可达体积 | 结构状态及缺失残基 |
| 标签类型与rotamer库 | 标签构象和权重 | 温度、溶剂和局部相互作用 |
| 两个标记位点 | 预测\(P_{calc}(r)\) | 实验选择函数和反演分辨 |
| 多结构状态 | 各状态距离分布 | 状态比例及共享标签模型 |
14.7 案例组合与后续扩展
| 案例 | 选用方法的理由 | 说明的实验问题 | 扩展数据 |
|---|---|---|---|
| EasySpin双亚硝基CW | 1.2–2.0 nm短距离会改变整条CW线形,且$J$项可能不可忽略 | 双标展宽中可归属于偶极耦合的部分及$D/J$相关性 | 单标谱、温度系列、刚性分子尺 |
| EasySpin Rabi | 脉宽扫描直接连接 $B_1$、nutation频率和翻转角 | π/2、π脉宽标定及失谐、弛豫、$B_1$不均匀的影响 | 实测nutation数据、谐振器瞬态和功率标定 |
| EasySpin Hahn echo | 有限扫频脉冲和粉末取向共同决定可检测回波 | 整形脉冲覆盖、I/Q相位、检测窗及取向网格收敛 | 实测反转轮廓、回波瞬态和场位系列 |
| DeerLab 4-pulse DEER | 频率分离的自旋包和约4 μs时间窗适合标准单路径模型 | 距离峰位、分布宽度、调制深度和背景可在同一前向模型中估计 | 实测复数时间迹、背景候选模型、重复测量 |
| MMMx/chiLife结构比较 | 实验给出电子自旋距离,结构解释还需标签rotamer映射 | 候选构象的距离分布及状态比例与实验分布的相容程度 | PDB、标签类型、位点与结构状态集合 |
EasySpin三项案例和DeerLab案例均给出完整代码,DeerLab案例同时给出实际运行结果。结构标签案例需要指定PDB、标记位点和标签类型,适合在后续具体样品章节中建立,避免用任意结构产生没有项目含义的示例。
14.8 方法与软件选择矩阵
| 实验条件 | 实验方法 | 分析工具组合 | 最低检查 |
|---|---|---|---|
| 短距离且CW展宽明显 | CW全谱分析 | EasySpin+联合拟合脚本 | 单标对照、\(D/J\)轮廓 |
| 谱包可频率分离 | 4p DEER | DeerLab或DeerAnalysis+DeerNet对照 | 反转轮廓、背景和零点 |
| 长时间窗受Hahn衰减限制 | 5p/7p DEER | DeerLab多路径模型 | 路径幅度和回波交叉 |
| 同类自旋谱线高度重叠 | DQC或SIFTER | EasySpin有限脉冲检查+DeerLab自定义核 | 宽带覆盖和过滤组分 |
| 宽谱金属伙伴且\(T_1\)合适 | RIDME | DeerLab谐波模型+混合时间全局拟合 | overtone coefficients |
| 刚性标签或金属中心取向明显 | 多场位PDS | EasySpin选择函数+全局前向模型 | g/A/ZFS与Euler角 |
| 需要连接结构模型 | 任一可靠PDS方法 | DeerLab+MMMx/chiLife | 电子中心与骨架距离区分 |
14.9 软件结果的三级检查
| 级别 | 内容 | 通过条件 |
|---|---|---|
| A级 | 同一软件内的残差、参数轮廓和模型比较 | 残差无系统结构,参数区间有限 |
| B级 | 两种计算路线处理同一时间迹 | 主距离与主要状态结论一致 |
| C级 | 实验条件或结构对照 | 浓度、场位、标签或独立结构数据给出相容结果 |
软件间一致只覆盖计算实现。实验伪影、错误序列模型或共同的前提错误可能在多个软件中产生相似结果,因此仍需实验对照。
14.10 可重复计算记录
| 记录项 | 内容 |
|---|---|
| 环境 | 操作系统、MATLAB/Python版本、软件包版本和依赖 |
| 输入 | 原始文件校验值、单位、通道和元数据 |
| 预处理 | 相位、零点、裁剪、异常点和归一化 |
| 模型 | 核函数、背景、路径、谐波、取向和约束 |
| 输出 | 拟合曲线、残差、参数表、距离分布及区间 |
| 结构 | PDB版本、标签库、位点和rotamer设置 |
14.11 本章结论
第三方软件可以覆盖谱学模拟、PDS反演、神经网络对照和标签结构建模,无需从头开发全部算法。项目仍需编写数据导入、单位统一、元数据保存、批处理和结果汇总代码。采集相位循环、硬件时序和目标谱仪校准不由这些分析包代替。