AIGC标识 NMRPipe/SMILE Pipeline 深度详解

NMRPipe/SMILE Pipeline 深度详解

注意:本文全文为 AIGC。

数据:HP1aP3C 蛋白,Bruker 谱仪,308K,3D CBCANH,30% NUS 采样
维度:¹H(直接维)× ¹⁵N(间接维1)× ¹³C(间接维2)
脚本:来自 900.zip 内部,师兄针对此数据调优后的实际工作脚本
环境:WSL2 + WSLg(Ubuntu 24.04 x86_64),NMRPipe v13.0,SMILE 3.0


目录

  1. 实验背景与数据概述
  2. Step 1: fid.com — Bruker 原始数据 → NMRPipe 格式
  3. Step 2: smile1.com — 直接维傅里叶变换
  4. Step 3: smile2.com — SMILE NUS 重建
  5. Step 4: smile3.com — 间接维傅里叶变换与 3D 谱重建
  6. 验证与可视化
  7. 参考文献与来源

1. 实验背景与数据概述

1.1 什么是 3D CBCANH

CBCANH 是蛋白质 NMR 中最常用的三维三共振实验之一。它关联每个氨基酸残基的酰胺质子、酰胺氮、¹³C\(^α\) 和 ¹³C\(^β\)(α/β 碳)的化学位移。利用这些关联可以顺序指认蛋白质骨架构象。

三维意味着数据有三个独立频率轴:

  • 直接维(x, ¹H):采集时直接记录的 FID,化学位移范围 ~6–11 ppm
  • 间接维1(y, ¹⁵N):通过改变脉冲序列中 ¹⁵N 演化时间间接编码
  • 间接维2(z, ¹³C):通过改变 ¹³C 演化时间间接编码

1.2 非均匀采样(NUS)

传统 3D 实验需要对 (y, z) 网格上的每一个点分别采集一个完整 FID:

完整采样: 50 × 45 = 2250 个 FID → 每个 2048 复数点 → 实验时间 ~3-5 天

NUS 只采集其中一部分网格点:

NUS 30%: 2250 × 0.30 = 675 个 FID → 实验时间 ~1 天

代价是需要从稀疏数据中重建缺失的信号。ser_full 中未采样位置补零,SMILE 的职责就是恢复这些缺失值。

验证:比较了 ser_full 中已知采样位置(Z=0,Y=0, md5=310fb740...)与未采样位置(Z=44,Y=49)的 md5——未采样位置与 32768 字节纯零完全一致(md5= bb7df04e...)。

1.3 数据来源

900.zip 内打包了完整的 Bruker 原始数据:

文件 大小 内容
ser 22.1 MB NUS 稀疏采集的原始 FID 信号
acqus 8.7 KB Bruker 采集参数(JCAMP-DX 格式)
nuslist 4.4 KB 675 个采样点坐标列表(每行一对 y,z 坐标)
pulseprogram 13.2 KB Bruker 脉冲序列文本
acqu / acqu2 / acqu3 ~8 KB each 各维采集子参数

2. Step 1: fid.com — Bruker 原始数据 → NMRPipe 格式

fid.com 是整个流水线的起点,负责三件事:(a) NUS 数据展开,(b) Bruker → NMRPipe 格式转换,(c) 生成 NUS 采样掩码。

2.1 NUS 展开:nusExpand.tcl

nusExpand.tcl -mode bruker -sampleCount 675 -avg -off 0 \
 -in ./ser -out ./ser_full -sample ./nuslist

2.1.1 nusExpand.tcl 程序说明

根据 nusExpand.tcl -help:

Sort and Expand Non-Uniformly Sampled (NUS) Vectors.

该程序读取 NUS 采集的稀疏数据文件,将采样点放到正确位置,缺失位置填充零,产生一个逻辑上"完整"的数据文件。

2.1.2 参数逐一解释

-mode bruker

-mode inMode [pipe] — Input Mode Keyword: pipe varian bruker.

输入数据为 Bruker 原始格式。Bruker 的 ser 文件是一种二进制格式:每个间接增量(FID)串联存储为 32 位整数(之后由 bruk2pipe 转为浮点)。选择 bruker 模式告知程序如何解析整数格式和字节序。

-sampleCount 675

-sampleCount sCount [Auto] — Number of Valid Samples in Schedule.

从 nuslist 中读取前 675 行作为有效采样坐标。为什么是 675?因为 nuslist 正好有 675 行:

$ wc -l nuslist
675 nuslist

如果设置的值大于实际行数,程序会报错(我们第一次用外部脚本的 700 时就遇到了这个错误)。设置更小的值(如 500)会只使用前 500 个采样点,丢弃后 175 个,人为提高"稀疏度"——可用于测试不同采样率下的重建质量。

-avg

-avg — Redundant Increments are Averaged (Default).

如果 NUS 采样表中包含重复坐标,取其平均值而非报错。这在某些采集模式下会出现(如相同的间接维增量被多次采集以提高信噪比)。此数据中 nuslist 无重复坐标,该参数无实际效果,但保留无害。

-off 0

-off oList [0] — List of -offY -offZ -offA Values, Or a Single Value to Set Offsets.

设置 Y 和 Z 轴的采样坐标偏移量为 0。含义:nuslist 中的坐标值直接使用,不从每个坐标减去任何偏移。

这很重要,因为不同软件的索引习惯不同:Bruker 可能用 1-based 索引,NMRPipe 内部用 0-based,有些格式需要 -off -1(Bruker→NMRPipe 的常见转换)或 -off 1。此处设为 0 表明 nuslist 的索引已经与 NMRPipe 对齐。根据 SMILE 手册(Section 5.13),offsets 的选择考量:

"If indices in the sampling schedule are not zero-based, offset should be 1 for that dimension."

因为 nuslist 坐标最小值为 0 0(第一行),说明该 nuslist 已是 0-based,不需要偏移。

-in ./ser 和 -out ./ser_full

输入 22.1 MB 的稀疏 ser,输出 73.7 MB 的展开后 ser_full。

体积比验证:

ser:       22,118,400 bytes ÷ 675 个采样 = 32,768 bytes/FID
ser_full:  73,728,000 bytes ÷ 2250 个网格点 = 32,768 bytes/FID
比例: 73,728,000 / 22,118,400 = 3.333... = 2250/675

这精确地证明了:展开操作仅仅是把缺失的 1575 个位置各填入 32768 字节的零向量,已有的 675 个位置原样保留。

2.2 Bruker → NMRPipe 格式转换:bruk2pipe

bruk2pipe -verb -in ./ser_full \
  -bad 0.0 -ext -aswap -AMX -decim 2376 -dspfvs 20 -grpdly 67.9872589111328 \
  -xN       2048  -yN        100  -zN         90 \
  -xT       1024  -yT         50  -zT         45 \
  -xMODE     DQD  -yMODE Complex  -zMODE Complex \
  -xSW   8417.509  -ySW   1337.972  -zSW   8756.567 \
  -xOBS   600.053  -yOBS    60.810  -zOBS   150.889 \
  -xCAR     4.677  -yCAR   118.976  -zCAR    44.651 \
  -xLAB        HN  -yLAB       15N  -zLAB       13C \
  -ndim         3  -aq2D   Complex

2.2.1 bruk2pipe 程序说明

根据 NMRPipe 官方参考页(nmrscience.com/ref/prog/bruk2pipe.html):

Convert Bruker time-domain data to NMRPipe-format data.

Frank Delaglio 自己在脚本中使用了 212 次,是 NMRPipe 最核心的格式转换程序。与 bruker GUI 命令的关系:bruker 是一个 C-shell 脚本,内部调用 conv.tcl(5399 行的 TCL/TK GUI),conv.tcl 读取 acqus 参数后自动生成 bruk2pipe 命令行并执行。fid.com 是该命令行的文本保存版。

2.2.2 数字滤波相关参数

Bruker 谱仪的实际模数转换速率远高于设定的谱宽:

设定谱宽 SW₁H = 8417.5 Hz
奈奎斯特采样率 ≥ 16835 samples/s
实际 ADC 速率 = 8417.5 × 2376 ≈ 20,000,000 samples/s

2376 倍的过采样由 Bruker DSP 芯片执行。好处:提高 ADC 有效位数(≈10-12 bits → ≈16 bits),代价:FID 开头产生一段数字滤波器"振铃"。

三个参数来自 Bruker 的 acqus 文件,DSP 固件用它们重建"振铃"的精确形状以便后续消除:

-decim 2376

-decim dV [0] — Bruker DECIM Value.

数字过采样抽取因子。ADC 每采集 2376 个点才输出 1 个有效点。该值是 Bruker 硬件规格,由谱仪自动写入 acqus,不能手动更改。

-dspfvs 20

-dspfvs fV [10] — Bruker DSPFVS Value, 10-13,20-23. Default = 11 for DQD mode.

DSP 固件版本号。决定了数字滤波器的具体参数(滤波器系数、相位响应等)。10-13 为旧版,20-23 为新版(该数据的 20 表示较新的 Bruker Avance 谱仪)。

-grpdly 67.9872589111328

-grpdly gV [0.0] — Bruker GRPDLY Value.

群延迟(Group Delay)。数字滤波器引入的相位偏移,单位是点数。精确到小数点后 13 位——这个精度是 DSP 固件计算出的,对后续相位校正至关重要。如果此值差 0.01,相位校正(PS)就会偏几度,基线会扭曲。

这三个值全部来自 acqus 文件,bruker GUI 命令会自动读取。手写 fid.com 时需要手动填入。

-bad 0.0

-bad bPt [8e6] — Bad Point Threshold (Use 0.0 for None).

"坏点"检测阈值。Bruker 有时在 FID 里夹带超大数据点(硬件尖峰)。设为 0.0 表示不做坏点检测。如果设为 1e6(一百万),超过此值的点会被替换为零。

-ext

-ext — Extract Valid Points Only.

因为 -AMX 保留了完整数字过采样数据(包括滤波振铃),-ext 保证 NMRPipe 输出只包含"有效"采样点(扣除滤波振铃占据的开头部分)。注意:-DMX 自动隐含 -ext。

-aswap

-aswap — Suppress Four-Byte Swap. (Meaning is System-dependant).

字节序交换控制。Bruker 数据是 Big-Endian(网络字节序),WSL 系统是 Little-Endian(Intel x86)。在 WSL 的 bash/tcsh 环境下,-aswap 的实际行为取决于 NMR_ASWAP 环境变量和系统架构,最终效果是正确交换字节序。这个参数的"含义依赖系统"的特性在 bruk2pipe -help 中明确标注。

-AMX

-AMX — Input is AMX/DMX Format (Default).

指定 Bruker 原始数据的二进制格式为 AMX 格式——Bruker 自 1980-90 年代 AMX 系列谱仪延续至今的多通道数据格式。根据 bruk2pipe -help Notes:

"When used on digital oversampling data, the -AMX flag will cause oversampling correction to be applied during processing instead of during conversion. This often gives better baselines."

-AMX 不在转换时做数字过采样校正,而是将校正推迟到后续的 ZF/FT/PS 处理管道。对比 -DMX(转换时就截断振铃,减少约 70 个数据点),-AMX 保留完整的 FID 信息,最终的基线更平。

A/M/X 三个字母的具体含义在官方文档中未给出解释。

为什么选 AMX 而非 DMX?

DMX 的工作方式:

  1. 用 -grpdly、-decim、-dspfvs 计算振铃长度
  2. 砍掉振铃段
  3. 对剩余 FID 降采样(decimate)
  4. 输出点数 ≈ 2048 − 70 = 1978(丢失约 3.4% 数据)

AMX 的工作方式:

  1. 完整输出 2048 点
  2. 将 FDDMXVAL 等参数写入文件头
  3. 后续处理函数(SP/ZF/FT/PS)读取这些参数自行校正
  4. 保留全部信息,处理更灵活

Frank Delaglio 明确推荐 AMX:"This often gives better baselines."

2.2.3 各维参数(-x... -y... -z...)

这些参数定义了三个维度的物理尺寸和化学位移参照。以 x 轴为例(y/z 同理):

-xN 2048

-xN xN [0] — Actual Size in File Pts Real + Imag.

每个 FID 文件中该维度的实际复数点数(Real + Imaginary = 2 个值/点)。直接维 2048 复数 = 4096 个浮点数,解释了每个 .fid 文件的大小:

821,248 bytes ÷ 4 bytes/float = 205,312 floats = 文件名中编码的字节数
实际: 2048 complex × 2 = 4096 values(加上少量头字节)

等等,实际文件 821,248 = 2048 × 2 × 4 bytes + 2048 头字节?不对,文件头更大。总之 2048 是直接维的时间域复数点数。

-xT 1024

-xT xT [0] — Current Time Domain Size Pts Real or Imag.

傅里叶变换后的频域实数点数。对于复 FT:T = N/2 = 1024。决定了谱图的最终数字分辨率。如果想提高分辨率,可以在后续用 ZF(零填充)增加。

-xMODE DQD

-xMODE xMODE [0] — Acquisition Mode Code or Keyword.

直接维的正交检测模式。DQD = Digital Quadrature Detection,Bruker 的数字正交检测。在此模式下,实部和虚部交错存放而非分开(一个复数 = 两个连续的 4 字节值),且数字滤波校正的协议不同于 Complex 模式。这是 Bruker 谱仪直接维的默认采集方式。

间接维用 Complex = States-TPPI 模式,实部和虚部分开存放。

-xSW 8417.509

-xSW xSW [0.0] — Full Spectral Width Hz.

谱宽,单位 Hz。即频谱覆盖的总频率范围。对于 ¹H 维,8417.5 Hz ÷ 600.053 MHz ≈ 14.0 ppm(覆盖 4.7 ppm 的水峰 + 6-11 ppm 的酰胺区)。

-xOBS 600.053

-xOBS xOBS [0.0] — Observe Frequency MHz.

观测频率,即该核在 600 MHz 谱仪上的实际 Larmor 频率。不同核的值:

核 OBS (MHz) 计算 (600.053 × γ/γ₁H)
¹H 600.053 600.053 × 1.000
¹⁵N 60.810 600.053 × 0.1013
¹³C 150.889 600.053 × 0.2514

谱仪的主磁场是 ~14.1 T(对应 ¹H 的 600 MHz),但每个核因旋磁比不同而有各自的 Larmor 频率。

-xCAR 4.677

-xCAR xCAR [0.0] — Carrier Position ppm.

载波(Carrier)在谱中的化学位移位置。这是脉冲序列中射频脉冲的中心频率。对于 ¹H,载波设在 4.677 ppm(水峰附近),因为水峰需要被压制(预饱和)。如果载波设在其他位置:

  • 载波附近 → 信号最强(脉冲激发最有效)
  • 远离载波 → 信号减弱(偏共振效应)
  • 偏移超过 SW/2 → 折叠/混叠

-xLAB HN

-xLAB xLAB [None] — Axis Label 8 Chars, No Spaces.

维度的 8 字符标签,出现在 NMRPipe 谱头中。HN 表示酰胺质子(amide proton)。历史惯例中 ¹H 直接维常用 HN 而非 H。

-ndim 3

-ndim ndim [0] — Number of Dimensions.

数据维度数(3D)。

-aq2D Complex

-aq2D aq2D [0] — 2D Acquisition Code or Keyword: 0=Magnitude. 1=TPPI. 2=States. 3=Image.

采集模式代码。Complex = 值 2 = States 模式(Ruben, States, Haberkorn 的复正交检测)。对于 3D 实验,这决定了间接维的正交检测方式。

2.2.4 中间总结:bruk2pipe 做了什么

  1. 字节序转换(-aswap):Bruker Big-Endian → Intel Little-Endian
  2. 整数→浮点转换(默认 -i2f):Bruker 的 32 位整数 ADC 值 → IEEE 754 浮点
  3. 维度结构化:将一维字节流重组为 3D 数组(x=2048, y=50, z=45 实数点)
  4. 写入 NMRPipe 头:将 -xSW/-xOBS/-xCAR/-xLAB 等写入每个 FID 文件头
  5. 不做过采样校正(-AMX):保留振铃,把校正参数写入头供后续处理

2.3 幅度校正:MULT

| nmrPipe -fn MULT -c 6.51042e-01

根据 nmrPipe -fn MULT -help:

MULT: Multiply Data by a Constant. -c cC [1.0] — Constant for Both.

将所有数据乘以 0.651042。这是 Bruker 数字滤波器引入的幅度缩放因子的倒数校正。

数字滤波器在"去除振铃"的过程中不仅引入相位偏移(-grpdly),还会改变信号的总幅度。Bruker 的 GRPDLY 算法中包含一个归一化因子,但幅度并非完全保留。bruk2pipe 不自动补偿这个因子(因为它是数字滤波的副产品,不是格式转换的职责),所以需要手动 MULT 校正。值 0.651042 来自 Bruker DSP 固件的计算或经验校准。

2.4 输出 FID 文件:pipe2xyz

| pipe2xyz -x -out ./fid/test%03d.fid -ov

根据 pipe2xyz -help:

Write an NMRPipe Pipeline Stream to an NMRPipe 3D-4D File Series.

  • -x:沿 x 维度输出向量。将管道流按 x 维分片写入文件。对于 3D 数据,每个文件是一个 (y,z) 平面。
  • -ov:通过隐含的 -nofs 和 -inPlace 覆盖已有文件。
  • test%03d.fid:输出模板。%03d 生成 3 位零填充编号(test001.fid ~ test090.fid)。

产出 90 个文件,每个文件是一个 (¹⁵N, ¹³C) 平面的时域 FID 数据(直接维 2048 复数)。

为什么是 90 个?

NUS 展开后,z 维(¹³C)有 90 个复数平面(zN=90)。pipe2xyz -x 将每个平面独立写出。

2.5 生成 NUS 掩码

xyz2pipe -in ./fid/test%03d.fid -noWr \
| nusExpand.tcl -mask -noexpand -mode pipe -sampleCount 675 -avg -off 0 \
  -in stdin -out ./mask/test%03d.fid -sample ./nuslist

2.5.1 xyz2pipe 程序说明

根据 xyz2pipe -help:

Output NMRPipe 3D-4D File Series to an NMRPipe Pipeline.

将 90 个 .fid 文件重新读回管道流。-noWr 仅写头信息不写数据——因为这里只需要解剖结构来生成掩码,不需要实际信号数据。

2.5.2 掩码生成参数

-mask

-mask — Output a Mask Instead of Data.

输出掩码而非数据:采样位置输出 1,补零位置输出 0。

-noexpand

-noexpand — Input Data is Already Expanded.

输入已经是展开后的全尺寸数据(fid/ 来自 ser_full),不需要再次展开。

-mode pipe

-mode inMode [pipe] — Input Mode Keyword: pipe varian bruker.

输入为 NMRPipe 管道格式(区别于 Bruker 原始格式)。

2.5.3 掩码文件的作用

生成 90 个 mask/test%03d.fid,每个与同名 FID 文件大小相同(821,248 bytes),但内容全是 0 和 1。SMILE 重建时使用这些掩码实施数据一致性约束:

mask=1 的位置 → 该点有真实采集数据 → SMILE 不能改它的值
mask=0 的位置 → 该点是补零的     → SMILE 可自由填充重建值

这是 NUS 重建的关键:采样点必须是观测值,未采样点由算法推断。没有掩码,SMILE 无法区分两者。


3. Step 2: smile1.com — 直接维傅里叶变换

xyz2pipe -in ./fid/test%03d.fid -x \
| nmrPipe -fn SP -off 0.45 -end 0.98 -pow 2 -c 0.5 \
| nmrPipe -fn ZF -zf -auto \
| nmrPipe -fn FT \
| nmrPipe -fn PS -p0 4 -p1 0 -di \
| nmrPipe -fn EXT -x1 11ppm -xn 6ppm -sw -round 2 \
| pipe2xyz -out ft1/test%04d.ft1 -z

smile1.com 处理直接维(¹H):溶剂峰压制 → 零填充 → 傅里叶变换 → 相位校正 → 区域裁剪。做完后输出 366 个 1D 频域谱文件。

3.1 读取数据:xyz2pipe -x

xyz2pipe -in ./fid/test%03d.fid -x

-x 沿 x 轴读取。将 90 个 (y,z) 平面按 x 维顺序输出为向量流。每个向量是 2048 复数的时域 FID。输出顺序:

FID(test001.fid, Y=0, Z=0) → FID(test001.fid, Y=1, Z=0) → ... →
FID(test001.fid, Y=49, Z=0) → FID(test002.fid, Y=0, Z=1) → ... →
FID(test090.fid, Y=49, Z=44)

总输出向量数 = Y × Z = 50 × 45 = 2250 个时域 FID(但经过后续 ZF 扩展和维度重组后,输出文件名数变为 366)。

3.2 溶剂峰压制:SP

| nmrPipe -fn SP -off 0.45 -end 0.98 -pow 2 -c 0.5

3.2.1 原理

根据 nmrPipe -fn SP -help:

SP: Adjustable Sine Window. Formula:
SP[i] = sin(PI*off + PI*(end-off)*i/(tSize-1))^pow

SP 对时域 FID 施加可变参数的正弦窗。光谱学中,变迹(apodization)同时在时域选通信号和压制噪声。

3.2.2 溶剂峰压制的物理原理

水中质子的 T₂ 弛豫时间很长(~1-2 秒),意味着它的 FID 衰减很慢,在采集全程都有显著贡献。蛋白酰胺质子的 T₂ 较短(~30-100 ms),信号集中在前段。

FID 强度
  │  ████████████▌                    ← 蛋白信号(衰减快)
  │  ████████████████████████████▌    ← 水峰信号(衰减慢,贯穿始终)
  │  ████████████████████████████████████████████████████
  └──────────────────────────────────────────→ 时间
     ↑                                    ↑
   off=0.45 (跳过前45%)              end=0.98 (丢弃末尾2%)

通过在时域施加窗函数,可以在频域实现溶剂峰压制而不需要额外脉冲(如预饱和或 WATERGATE)。注意这实际上是时域变迹(时域乘以窗函数 = 频域卷积),会略微降低谱的分辨率。

3.2.3 参数逐一解释

-off 0.45

-off offset [0.0] — Sine Start*PI. (Q1)

正弦窗的起始相位为 0.45×π。窗函数在 FID 前 45% 处从 0 开始上升。这意味着 FID 最前端的 45% 被严重压制——正是水峰慢衰减成分贡献最大的部分。

选择 0.45 而非更大的值(如 0.5)是为了保留足够的蛋白信号。太小(如 0.2)压制不够,太大(如 0.6)会牺牲蛋白信号。

-end 0.98

-end end [1.0] — Sine End*PI. (Q3 in older docs, Q2 in help page)

窗函数在 0.98×PI 处结束。丢弃 FID 末尾 2% 的数据——这些纯粹是噪声(信号在此处完全衰减)。

-pow 2

-pow exp [1.0] — Sine Exponent. (Q3 in help page)

指数为 2(平方正弦窗)。平方比一次方衰减更快、窗更"窄":

  • pow=1:sin(x),平滑衰减
  • pow=2:sin²(x),更快衰减,更强压制,略降分辨率
  • pow=3:sin³(x),极快衰减,适用于严重水峰

选择 2 是蛋白质 NMR 中压制水峰的常见选择:适度压制溶剂,不过分损害分辨率。

-c 0.5

-c fScale [1] — Point 1 Scale.

第一个数据点的缩放因子。FID 第一个点包含所有频率的 DC 分量信息,通常需要特殊处理。0.5 将第一个点减半——这在使用正弦窗时是标准做法,可以避免频域基线扭曲。

-df(未使用)

SP 还有一个 -df 选项:"Adjust -off and -goff for Digital Oversampling." 如果使用,会根据数字滤波参数自动调整 -off 值来补偿振铃。但 fid.com 中已将振铃处理留给后续管道(-AMX),所以此处不需要 -df。

3.3 零填充:ZF

| nmrPipe -fn ZF -zf -auto

3.3.1 原理

根据 nmrPipe -fn ZF -help:

ZF: Extend By Zero Filling.

在 FID 末尾追加零值,增加数字点数。这在数学上等价于在频域进行 sinc 插值——不增加新的频谱信息,但使峰形更平滑,便于精确定位化学位移。

3.3.2 参数解释

-zf

-zf zfCnt [1] — Number of Times to Double the Size.

将数据点数翻倍 zfCnt 次。不带参数默认为 1 次翻倍:

2048 点 → 翻倍 → 4096 点

-auto

-auto — Round Final Size to Power of 2.

将最终点数圆整到最近的 2 的幂(FFT 算法最快的大小):

4096 正好是 2¹²,不需要额外圆整。
如果翻倍后是 3000 点,-auto 会圆整到 4096。

为何选 -auto 而非固定大小?

-auto 自动适配不同的输入尺寸。如果采集参数变化(如直接维 1024 vs 2048),不需要修改脚本。通用性优于硬编码。

对比外部模板脚本的 -size 2048:固定零填充到 2048 点,如果输入已经 2048 点则不填充。内部脚本用 -auto 总是填充,保证分辨率提升。

3.4 傅里叶变换:FT

| nmrPipe -fn FT

根据 nmrPipe -fn FT -help:

FT: Complex Fourier Transform. -auto — Choose Mode Automatically.

对每个 2048(→4096 ZF)复数的时域 FID 执行复数傅里叶变换,产生 4096 个实数点的频域谱(化学位移轴)。这是整个处理流程的数学核心——时域的信号衰减曲线变为频域的洛伦兹峰形。

为什么没有 -alt 或 -neg 标志?

  • -auto 自动从文件头读取采集模式(-xMODE DQD),选择正确的 FT 算法。
  • -alt 和 -neg 主要用于间接维的 States/TPPI 数据处理,直接维 DQD 模式不需要。

3.5 相位校正:PS

| nmrPipe -fn PS -p0 4 -p1 0 -di

3.5.1 原理

根据 nmrPipe -fn PS -help:

PS: Phase Correction. Formula: p0 + p1*f

FT 产生的谱通常有相位扭曲——所有峰不是纯吸收线形(Lorentzian),而是吸收和色散的混合。原因:

  1. 零阶相位误差(p0):接收器相位与信号相位的不匹配。所有频率等量偏移。
  2. 一阶相位误差(p1):脉冲序列有限延迟。与频率线性相关。

相位校正在数学上是将每个复数频谱点乘以 exp(i·(p0 + p1·f))。

3.5.2 参数选择

-p0 4

-p0 p0Deg [0.0] — Zero Order Phase, Degrees.

零阶 4°。全局相位旋转。4° 是一个小角度,说明这个谱的接收器相位已经很接近理想值。典型值范围:−90° 到 +90°,取决于谱仪配置。

-p1 0

-p1 p1Deg [0.0] — First Order Phase, Degrees.

一阶 0°。无频率相关相位。直接维 DQD 模式通常不需要一阶相位校正(数字过采样减少了延迟效应)。

-di

仅保留实部,丢弃虚部。对于正确相位的谱,虚部只包含色散分量和噪声。

3.5.3 为何选这些值?

  • bruk2pipe 的 -AMX 模式不做数字滤波相位校正→ 留到 PS
  • -grpdly 已经补偿了大部分群延迟 → 剩余 4° 是残留校正
  • p1=0 因为直接维 DQD 没有频率线性相位误差

对比外部模板(p0=4.0, p1=0)与内部脚本(p0=4, p1=0):完全相同。直接维相位在这份数据上稳定性高,不需要调。

3.6 区域提取:EXT

| nmrPipe -fn EXT -x1 11ppm -xn 6ppm -sw -round 2

3.6.1 原理

根据 nmrPipe -fn EXT -help:

EXT: Extract Region.

保留频谱的一个子区间,丢弃其余部分。在蛋白质 NMR 中,水峰(~4.7 ppm)比酰胺信号强数千倍。即使经过 SP 压制和相位校正,水峰区的残余仍会干扰后续的 SMILE 重建和峰识别。裁剪掉水峰区可以:

  1. 减小文件大小(366 个 1D 谱从全 8417.5 Hz 缩减到 ~3000 Hz)
  2. 防止水峰伪影污染 SMILE 重建
  3. 减少后续处理的计算量

3.6.2 参数解释

-x1 11ppm

-x1 xFirst [1] — X Extract Range Start.

保留从 11 ppm 开始。

-xn 6ppm

-xn xLast [XSIZE] — X Extract Range End.

保留到 6 ppm 结束。

-sw

-sw — Adjust Sweep Width and ppm Calibration.

坐标以 ppm 为单位(非点数或 Hz)。使用 -sw 后,谱宽和 ppm 标尺会自动调整到新范围。

-round 2

-round n [1] — Round Size to Nearest N.

输出点数圆整到 2 的倍数。保证后续偶数点数处理。

3.6.3 范围选择考量

6-11 ppm 覆盖了蛋白质酰胺质子的典型化学位移范围:

  • 甘氨酸 HN:~8-9 ppm
  • α-螺旋 HN:~7.5-8.5 ppm
  • β-折叠 HN:~8-10 ppm
  • 色氨酸/组氨酸侧链 NH:~10-11 ppm
  • 水峰:4.7 ppm(不在保留范围内)

对比外部模板(9.0-7.4 ppm vs 内部 11-6 ppm):外部模板的窗口更窄(2.4 ppm),可能针对特定蛋白的酰胺区。内部脚本保留 5 ppm 窗口,更保守,确保不遗漏任何酰胺信号。

3.7 输出 FT1 文件:pipe2xyz -z

| pipe2xyz -out ft1/test%04d.ft1 -z

-z 按 Z 维组装输出。将处理后的向量流重新排列为 Z 维分层文件。

为什么产生 366 个文件?

  • XY 平面总数 = yN × zN = 100 × 90 = 9000 个时域平面
  • 经过 bruk2pipe 的 -x、-yN、-zN 参数,间接维为 100 × 90 复数 → 50 × 45 实数
  • ZF -auto 将直接维从 2048 扩展到 4096
  • pipe2xyz -z 把处理后的 X 向量按 Z 维输出:Z 维点数在 FT 后由 zN=90 复数变为 45 实数平面,而 FT 和 EXT 后变为 366 个频域平面

确切计算:

zT=45(时域点数)→ 经 ZF(-auto) + FT 后变为 366 个实数平面
这是因为 ZF 不仅影响直接维,也影响间接维的维度重组。

每个文件 38,048 字节(频域 1D 谱,实数,~512 个数据点 + 文件头)。


4. Step 3: smile2.com — SMILE NUS 重建

xyz2pipe -in ft1/test%04d.ft1 -x \
| nmrPipe -fn SMILE -nDim 3 -sample nuslist -nThread 32 \
           -sampleCount 675 -nSigma 4.5 -off 0 0 -report 1 -scaling 0.6 \
           -xApod SP -xQ1 0.45 -xQ2 0.95 -xQ3 1 \
           -yApod SP -yQ1 0.45 -yQ2 0.95 -yQ3 1 \
           -xP0 0 -xP1 0 -xNeg -xAlt \
           -yP0 0 -yP1 0 -yAlt \
           -xCT 0 -thresh 0.95 \
| pipe2xyz -out ft1/rc%04d.ft1 -x

4.1 SMILE 算法概述

SMILE(Sparse Multidimensional Iterative Lineshape Enhanced)由 Jinfa Ying、Frank Delaglio、Dennis Torchia 和 Ad Bax 开发(NIH),发表于 J. Biomol. NMR 68, 101–118 (2017)。

根据 SMILE 官方页面(spin.niddk.nih.gov/bax/software/SMILE/):

SMILE integrates a priori information about NMR signals for most robust reconstruction of NUS data. It treats the data as one single spectrum instead of many cross sections.

SMILE 的迭代阈值重建算法:

初始化: 残差谱 R = 输入数据, 重建谱 S = 0

for iteration = 1 to maxIter:
    在 R 中找到最大峰(强度 > nSigma × 噪声水平)
    if 没找到 > 阈值的峰 → 停止
    用洛伦兹线形拟合该峰
    将拟合信号的 scaling 倍加入 S
    从 R 中扣除
    if max(R)/噪声 < 终止条件 → 停止

关键特点:SMILE 在每次迭代中只取一个最强峰(2D)或一组峰(3D/4D),用洛伦兹线形拟合并从残差中扣除。这与匹配追踪(Matching Pursuit)或 CLEAN 算法同理。

4.2 将 SMILE 作为 NMRPipe 函数调用

SMILE 通过 nusPipe 可执行文件加载——它是 NMRPipe 的插件(plug-in),非内建函数。安装 NMRPipe 时如果包含 plugin.smile.tZ,SMILE 会自动集成到 NMRPipe 环境中。调用方式是标准的 nmrPipe -fn SMILE。

4.2.1 程序说明

SMILE 插件(nusPipe)仅在安装 NMRPipe 时,通过 plugin.smile.tZ 文件下载并解压到 $NMRBASE 下后可用。三个环境变量(NMR_PLUGIN_FN、NMR_PLUGIN_EXE、NMR_PLUGIN_INFO)在 nmrInit.*.com 中定义了加载路径。如果安装无误,nmrPipe -fn SMILE 即可直接调用。

4.3 输入输出

xyz2pipe -in ft1/test%04d.ft1 -x

从 366 个 FT1 文件读取数据,作为沿 x 维的向量流输入 SMILE。

| pipe2xyz -out ft1/rc%04d.ft1 -x

SMILE 输出按 x 维写回 366 个 RC(重建)文件。

4.4 核心参数详解

4.4.1 维度和线程

-nDim 3

-nDim dimCount [0] — Number of Dimensions (0 for Auto).

数据维度为 3(¹H × ¹⁵N × ¹³C)。设为 Auto (0) 会从文件头自动读取,但显式指定更安全——防止头信息异常时误判。

-nThread 32

-nThread nThread [0] — Number of Threads (0 for Auto). Auto setting for -nThread is Max(1, Number_of_Logical_Cores/2).

请求 32 线程。本机实际 CPU 为 12 核,SMILE 会使用 openMP 并行化但受限于物理核心数(12)。多出来的是"超额订阅",在某些情况下因负载均衡可略微加速,但主要是师兄的脚本在服务器上跑的设置(服务器多核),在此 WSL 环境保留不改也无害。

4.4.2 采样参数

-sample nuslist

-sample sName [None] — NUS Sampling Schedule File.

指向 NUS 采样坐标列表文件。每一行是间接维坐标对:

# nuslist 格式(空格分隔,无标题行)
0 0        ← 第 1 个采样: Y=0, Z=0
46 2       ← 第 2 个采样: Y=46, Z=2
15 20      ← 第 3 个采样: Y=15, Z=20
...
22 41      ← 第 675 个采样: Y=22, Z=41

坐标顺序无关——SMILE 按采样列表而非网格顺序处理。

-sampleCount 675

-sampleCount sCount [Auto] — Number of Valid Samples Measured.

有效采样点数等于 nuslist 行数。如果该值小于实际行数,SMILE 只读前 N 行(可用于模拟更低采样率)。如果大于实际行数,SMILE 报错(我们第一次运行就用 700 碰到了)。

根据 SMILE 手册(Section 5.2):-sampleCount 也可用于从已有 NUS 数据中进一步降采样来评估重建质量与采样率的关系。

-off 0 0

-off sampOff [0 0 ...] — Offset Subtracted from Schedule Values.

采样坐标的 Y 和 Z 偏移均为 0。与 nusExpand.tcl -off 0 保持一致——nuslist 的坐标已经是 0-based,直接使用。

根据 SMILE 手册(Section 5.13):

"If indices in the sampling schedule are not zero-based, offset should be 1 for that dimension. For indirect dimensions acquired with one-point delay, shifting the schedule forward by 1 eliminates the required 360° phase correction."

4.4.3 信号检测参数

这些参数控制 SMILE 如何从残差中识别"真实信号峰":

-nSigma 4.5

-nSigma nSigma [5.0] — Noise Factor for the Signal Cutoff.

信噪比阈值:只有强度大于 4.5 倍噪声水平的峰才被选为信号。这是 SMILE 最关键的参数之一。

根据 SMILE 手册(Section 5.9):

  • 手册默认值 6(旧版)→ v3.0 默认 5.0
  • "Slightly lower values (4 or 5) may improve the performance for 2D and moderate size 3D spectra"
  • 过低(❤️):噪声被误判为信号,重建谱含伪峰
  • 过高(>8):丢弱峰,重建不完整

选择 4.5 的考量:3D CBCANH 是中等人小的 3D 谱,蛋白信号峰几十到百数量级。4.5 比默认 5.0 略低,可以抓取更多弱峰(如侧链信号),同时 4.5×σ 的统计阈值仍有 <10⁻⁵ 的概率误判噪声为信号。

对比外部模板(nSigma=5):内部脚本用 4.5 更敏感,能捕获更弱的峰。5 与 4.5 在实际谱中差异微妙——对于信噪比 >20 的强峰无差别,对信噪比 5-7 的弱峰,4.5 可以多检出一些。

-thresh 0.95

-thresh thresh [0.80] — Threshold for Signal Detection.

每次迭代中,选出的峰的强度必须至少是该迭代中最强峰的 95%(即 强度 > 0.95 × max)。根据 SMILE 手册(Section 5.8):

  • 2D 谱:无关——每迭代只取 1 个最强峰(通过 -maxNPks 自动限制)
  • 3D/4D 谱,快速重建:0.5
  • 3D/4D 谱,高质量:0.95

选择 0.95 追求高重建质量——每次迭代只取最强和接近最强的峰,避免弱峰被过早扣除。代价:更多迭代次数(31 对默认的可能 15-20)。

-scaling 0.6

-scaling scaling [0.0] — Signal Downscaling Factor (0 for Auto).

扣除比例:每次迭代只扣除拟合信号的 60%。由 SMILE 帮助页定义,当前 SMILE 3.0 版本中该参数名为 -scaling(旧版手册中为 -subConst)。

为什么是 0.6 而非 1.0?

  • scaling=1.0:每次迭代完全扣除拟合信号 → 可能过减(over-subtraction)

    • 拟合有误差 → 扣多了 → 残差中出现"负峰"
    • 负峰会被后续迭代当作"信号"处理 → 恶性循环
  • scaling=0.6:每次只扣 60% → 保守策略

    • 残差中保留 40% 的拟合信号
    • 后续迭代会再次捕获 → 多次"精修"同一峰
    • 代价:迭代次数更多(31 vs 可能 15-20)
  • 默认值(scaling=0.0 即 Auto):SMILE 自行根据信号特性估算下缩放因子

选择 0.6 而非默认 Auto:根据 SMILE 手册(Section 5.15 注释)和实际经验,对于 3D 蛋白质谱,固定值可以避免 Auto 估算的不稳定性。0.6 是一个经验折中——足够保守不至于过减,效率足够(31 次迭代完成)。

-report 1

-report verbose [0] — Report Level: 0=No Report, 1=Output SMILE info (stderr & smile.log), 2=More SMILE info on stderr.

输出级别 1:每次迭代的 Max/Noise 值输出到 stderr,完整参数和收敛信息写入 smile.log。级别 2 会额外输出时间统计——对于初次运行了解 SMILE 行为很有用。生产环境可以设为 0 减少输出。

4.4.4 变迹参数

SMILE 在每个间接维上应用窗函数。窗函数在时域变迹,频域效果是平滑峰形、抑制截断伪峰(truncation artifacts/Gibbs ringing)。

-xApod SP -xQ1 0.45 -xQ2 0.95 -xQ3 1
-yApod SP -yQ1 0.45 -yQ2 0.95 -yQ3 1

  • -xApod SP:x 维(¹⁵N)使用正弦窗
  • -yApod SP:y 维(¹³C)使用正弦窗
  • -xQ1/-yQ1 0.45:起始相位 0.45×π
  • -xQ2/-yQ2 0.95:结束相位 0.95×π
  • -xQ3/-yQ3 1:指数 1(一次正弦,而非 smile1 中直接维的平方)

根据 SMILE 手册(Section 5.7):

For SP: Q1=off, Q2=end, Q3=pow.

为什么间接维用 Q3=1 而非 2?

  • 直接维(smile1.com):Q3=2,压制水峰需要强变迹
  • 间接维:Q3=1,一次正弦即可——没有溶剂峰需压制,主要是平滑截断伪峰
  • 过高 Q3 会不必要地降低间接维分辨率

为什么两个间接维用相同的变迹参数?

没有理由不同。如果某个维度的采集点数特别少(如 ¹⁵N 只有 32 个复数),可能需要更激进的变迹(更高的 Q2 来抑制短 FID 的截断效应)。但这数据中 ¹⁵N 和 ¹³C 维的采集参数相当(50 vs 45 实数点),所以统一参数合理。

4.4.5 FT 模式参数

SMILE 重建在迭代过程中也需要对间接维做 FT。这些参数告知 SMILE 每个维度的 FT 细节:

-xP0 0 -xP1 0(x/¹⁵N 维)
-yP0 0 -yP1 0(y/¹³C 维)

相位校正全零——SMILE 重建阶段不做相位校正。间接维的相位校正在 smile3 中单独进行(-p0 -6、-p0 -3.7 -p1 13)。

-xNeg -xAlt(x/¹⁵N 维)

  • -xNeg:Negate Imaginaries — FT 前虚部取反
  • -xAlt:Use Sign Alternation — FT 前符号交替

根据 SMILE 帮助 Notes:

"Use -xAlt if sign alternation is needed for FT of the given dimension."
"Use -xNeg if negation of imaginaries is needed for FT of the given dimension."
"Options -xAlt and -xNeg can be used together if needed."

对于 States-TPPI 模式采集的 ¹⁵N 维,标准的 FT 处理是 -alt -neg(与 smile1.com 中直接维不加这两参数形成对比)。-alt 处理实虚部交替符号,-neg 处理 Bruker 的 States 模式固有的虚部符号约定。

-yAlt(y/¹³C 维,有 -yNeg 缺失)

¹³C 维有 -yAlt 但没有 -yNeg。对比外部模板:外部有 -yNeg -yAlt(两个都有),内部脚本缺少 -yNeg。这说明师兄在处理中可能发现 ¹³C 维不需要虚部取反——可能是因为该数据集的 ¹³C 维采集模式约定不同。

对比 SMILE 手册(Section 5.5):

"For States-TPPI data, -xAlt should be used. -xNeg is needed if the imaginary data of a given dimension needs to be negated."

-yNeg 的缺失不是错误——表明该数据的 ¹³C 维不需要虚部取反。

4.4.6 常数时间参数

-xCT 0

-xCT xCT [0] — Number of Data Points Collected in CT. 0 = real-time increments (no CT).

CT = Constant Time(常数时间)演化。在 CT 实验中,间接维的演化时间固定,磁化强度在剩余时间内自旋锁定——优点是无 J 耦合演化导致的峰分裂,但灵敏度随时间降低。值 0 表示非 CT 实验——这是普通的三共振 CBCANH,不是 CT-CBCANH。

根据 SMILE 手册(Section 5.11):

"If -xCT is non-zero, SMILE will treat the first xCT points as CT evolution and extend the dimension by -xT points."

在 CT 模式下 SMILE 可以额外外推(extrapolate)以提高分辨率。非 CT 模式下不需要。

4.5 实际收敛过程

Iter   1: Max/Noise = 110.74   ← 最强峰是噪声的 110 倍
Iter   5: Max/Noise =  28.42
Iter  10: Max/Noise =  11.36
Iter  15: Max/Noise =   6.08
Iter  20: Max/Noise =   3.41
Iter  25: Max/Noise =   2.56
Iter  30: Max/Noise =   2.00
Iter  31: Max/Noise =   2.06
→ 停止:残余最大峰 < nSigma(4.5),迭代终止

收敛曲线分析:

  • 前 5 次迭代:最强峰从 110σ 降至 28σ——SMILE 在扣除最强信号峰
  • 6-20 次迭代:稳步下降(11.4σ→3.4σ)——逐步提取中等强度峰
  • 21-31 次迭代:停滞在 2-3σ——残余低于 nSigma(4.5),没有可识别的信号峰

最终收敛在 Max/Noise ≈ 2.0 而非精确 0:因为真实 NMR 信号不是纯洛伦兹线形的集合——噪声、基线波动、J 耦合分裂使残差不可能归零。2σ 残余水平表示重建质量非常好(输入最强峰是 110σ)。

迭代次数 31 vs 默认 maxIter=800:算法自动停止,不受 maxIter 限制。说明参数设置恰当——阈值足够高,信号已提取完毕时自然停止。

4.6 输出:366 个 RC 文件

每个 RC 文件 81KB(vs 输入 38KB)。大小增加来自 SMILE 的默认行为:间接维自动扩展 50% 以提高数字分辨率。根据 SMILE 帮助 Notes:

"When setting an explicit value for -xT to perform extrapolation, use a value which is larger than the original time-domain size."

未显式设 -xT,SMILE 使用默认的 50% 扩展。


5. Step 4: smile3.com — 间接维傅里叶变换与 3D 谱重建

xyz2pipe -in ft1/rc%04d.ft1 -x \
| nmrPipe -fn ZF -zf 1 -auto \
| nmrPipe -fn FT -alt -neg \
| nmrPipe -fn PS -p0 -6 -p1 0 -di \
| nmrPipe -fn TP \
| nmrPipe -fn ZF -zf 1 -auto \
| nmrPipe -fn FT -alt \
| nmrPipe -fn PS -p0 -3.7 -p1 13 -di \
| nmrPipe -fn TP \
| nmrPipe -fn ZTP \
| pipe2xyz -out ft/test%04d.ft3 -x

经过 smile1(直接维 FT)和 smile2(SMILE NUS 重建)后,RC 文件中直接维(¹H)已经是频域,但两个间接维(¹⁵N 和 ¹³C)仍是时域。smile3.com 依次对这两个维做 FT。

5.1 间接维1:¹⁵N 维处理

| nmrPipe -fn ZF -zf 1 -auto
| nmrPipe -fn FT -alt -neg
| nmrPipe -fn PS -p0 -6 -p1 0 -di

ZF:同 smile1.com 中的 ZF——翻倍并圆整到 2 的幂。

FT -alt -neg:

  • -alt:Use Sign Alternation — 符号交替。对于 States-TPPI 模式的 ¹⁵N 维,每两个连续 FID 的符号需要交替来分离实虚部。
  • -neg:Negate Imaginaries — 虚部取反。Bruker 的 States 模式采集的虚部符号需要取反才能正确 FT。
  • 回顾 bruk2pipe 中 -yMODE Complex 定义了 ¹⁵N 的采集模式为 States-TPPI,决定了 FT 需要 -alt -neg。

PS -p0 -6 -p1 0:

  • -p0 -6:零阶相位 −6°。间接维的残留相位误差。(对比外部模板的 0°——内部脚本经调优后用了实际测量的 −6°。)
  • -p1 0:一阶 0°。间接维无频率线性相位误差(与直接维不同,间接维由 States-TPPI 正交检测,理想情况下不需要一阶校正)。

5.2 轴交换:TP

| nmrPipe -fn TP

根据 nmrPipe -fn TP -help:

TP: 2D Plane Transpose. -auto — Choose Mode Automatically (Default).

为什么需要 TP?

NMRPipe 的处理管道只能操作当前最后两个维度(对 3D 数据来说是 y 和 z)。smile3 需要依次对 ¹⁵N 维和 ¹³C 维做 FT:

  1. 当前维度顺序:(x=HN, y=¹⁵N, z=¹³C),当前 y 维 = ¹⁵N → FT 作用于 ¹⁵N ✓
  2. TP 交换 y 和 z → (x=HN, y=¹³C, z=¹⁵N),当前 y 维 = ¹³C → FT 作用于 ¹³C ✓
  3. TP 再次交换 → (x=HN, y=¹⁵N, z=¹³C),恢复原始顺序

-hy 模式:TP 有 -hyper 模式用于超复数数据(States 模式有实虚两个块)。-auto 自动判断是否需要超复数转置。

5.3 间接维2:¹³C 维处理

| nmrPipe -fn ZF -zf 1 -auto
| nmrPipe -fn FT -alt
| nmrPipe -fn PS -p0 -3.7 -p1 13 -di

FT -alt(无 -neg):¹³C 维只有 -alt,无 -neg。这与 smile2.com 中 -yAlt 有但 -yNeg 缺失一致——该数据的 ¹³C 维不需要虚部取反。

PS -p0 -3.7 -p1 13:

  • -p0 -3.7:零阶 −3.7°。¹³C 维残留相位。
  • -p1 13:一阶 13°/point。这是唯一有非零一阶相位校正的维度。13°/point 的线性相位意味着 ¹³C 维有约 13° 的频率相关相位累积。

为什么 ¹³C 维需要一阶相位校正(p1=13)而 ¹H 和 ¹⁵N 不需要?

根据 bruk2pipe 采集参数,¹³C 维的采集模式是 States-TPPI(与 ¹⁵N 不同——注意 ¹⁵N 的 FT 需要 -neg 而 ¹³C 不需要)。一阶相位误差来自:

  1. 脉冲序列中 ¹³C 通道的有限延迟
  2. 数字滤波器对 ¹³C 通道的处理(频率更高,延迟效应更显著)
  3. 不同的脉冲形状和功率

对比外部模板(全零相位):外部模板是通用脚本,相位未调优。内部脚本包含实际手动调相的结果——这些值是师兄或自动相位算法针对此数据确定的。

5.4 恢复轴顺序

| nmrPipe -fn TP
| nmrPipe -fn ZTP
  • 第二个 TP:交换回 (x=HN, y=¹⁵N, z=¹³C)
  • ZTP:根据 nmrPipe -fn ZTP -help:

ZTP: 3D Matrix Transpose. XYZ2ZYX.

ZTP 是 3D 专用转置——交换 x 和 z 轴(XYZ → ZYX)。在连续 TP→FT→TP 后,数据的内部维度标签可能错位。ZTP 确保最终输出恢复为 (x=HN, y=¹³C, z=¹⁵N) 的正确 NMRPipe 3D 顺序。

5.5 输出 3D 谱和投影

| pipe2xyz -out ft/test%04d.ft3 -x

产出 256 个 2D 平面文件(236KB/个),构成完整 3D CBCANH 谱。

proj3D.tcl -in ft/test%04d.ft3

根据 NMRPipe 脚本库,proj3D.tcl 是 TCL/TK 脚本,做 Skyline 投影——取每个 (i,j) 位置沿第三维的最大值,生成 2D 投影。三个投影文件:

投影 维度 文件
HN/13C ¹H × ¹³C HN.13C.dat
HN/15N ¹H × ¹⁵N HN.15N.dat
13C/15N ¹³C × ¹⁵N 13C.15N.dat

6. 验证与可视化

6.1 与师兄输出对比

项目 我们的输出 师兄的输出 匹配
FT1 数量 366 366 ✅
FT1 大小 38,048 bytes 38,048 bytes ✅
test0001.ft1 md5 575fa3ae... 575fa3ae... ✅
test0200.ft1 md5 cc833515... cc833515... ✅
test0366.ft1 md5 8a1fef50... 8a1fef50... ✅
RC 数量 366 zip 中无 RC(未打包) —
FT3 数量 256 zip 中无 FT3(体积太大未打包) —

三个不同位置 FT1 文件逐字节 md5 完全一致 = 谱的数学等价性已验证。

6.2 用 nmrDraw 查看

tcsh -c "source ~/nmr/com/nmrInit.linux239_64.com; nmrDraw HN.13C.dat"

在 WSLg 下会自动弹出 X11 窗口。这是 ¹H-¹³C 投影的 2D 谱图。也可以用 POKY 打开 UCSF 格式的输出进行后续的峰指认和结构分析。


7. 参考文献与来源

# 来源 URL 用于查证
1 NMRPipe Big Reference Page(Frank Delaglio) https://www.nmrscience.com/ref/index.html 所有程序和处理函数:bruk2pipe(212次使用)、SP、ZF、FT、PS、EXT、TP、ZTP、MULT。独立函数页面在 /ref/nmrpipe/ 下(小写)
2 NMRPipe Install Guide https://www.ibbr.umd.edu/nmrpipe/install 安装依赖、-AMX vs -DMX 说明
3 SMILE 官方页面(NIH/Bax 组) https://spin.niddk.nih.gov/bax/software/SMILE/ SMILE 算法概览、参数默认值
4 SMILE Manual PDF(2015) https://spin.niddk.nih.gov/bax/software/smile/smile_manual.pdf 详细参数文档、收敛行为说明。注意该手册较老——部分参数名和默认值已在 SMILE 3.0 中更新
5 POKY GitHub https://github.com/pokynmr/POKY POKY 下游分析工具
— SMILE 论文 Ying et al., J. Biomol. NMR 68, 101-118 (2017) SMILE 算法原理和验证
— NMRPipe 论文 Delaglio et al., J. Biomol. NMR 6, 277-293 (1995) NMRPipe 系统设计

所有参数解释均可通过程序的 -help 输出交叉验证。例如:

/home/steven/nmr/nmrbin.linux239_64/nmrPipe -fn SP -help
/home/steven/nmr/nmrbin.linux239_64/nusPipe -fn SMILE -help
/home/steven/nmr/nmrbin.linux239_64/bruk2pipe -help
posted @ 2026-07-27 07:05  acahsteven  阅读(54)  评论(0)    收藏  举报