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_FNNMR_PLUGIN_EXENMR_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  阅读(21)  评论(0)    收藏  举报