# bam2ab1 核心原理

## 概述

bam2ab1 是一个将 BAM 格式比对文件转换为 AB1 测序峰图文件的工具。AB1 是 Applied Biosystems 测序仪使用的标准格式，包含每个位置的荧光信号强度数据。

## 工作流程

```
BAM + FASTA → 碱基比对 → 堆叠计数 → 高斯建模 → AB1 文件
```

### 1. 数据输入

- **BAM 文件**：包含 reads 与参考序列的比对信息
- **FASTA 文件**：参考序列

bam2ab1 读取比对记录，过滤掉未比对、次优和嵌合 reads。

### 2. 多序列比对 (MSA) 构建

对于每个参考位置，构建一个虚拟的多序列比对矩阵：

```
refseq:   A C G T - A C G
reads[0]: A C - T - A C G
reads[1]: A C G T - A - G
reads[2]: A T G T A A C -
```

### 3. 碱基计数与归一化

对每个位置统计 A/G/C/T 的出现次数，并转换为比例：

```
位置 2: G=0, A=0, T=1, C=2  →  G=0%, A=0%, T=33%, C=67%
位置 3: G=2, A=0, T=0, C=0  →  G=67%, A=0%, T=0%, C=0%
```

### 4. 高斯峰模拟

测序仪检测到的信号是平滑的峰值。bam2ab1 使用高斯函数模拟这种信号：

```
信号(x) = (脉冲强度 / (σ√(2π))) × e^(-(x-μ)²/(2σ²))

其中:
- μ (mu): 峰值位置 (基于 peak_width 计算)
- σ (sigma): 峰值宽度 (随位置动态调整)
```

每个位置生成 4 个高斯峰（对应 G/A/T/C），然后积分得到离散的信号值。

### 5. AB1 文件生成

AB1 文件包含以下关键标签：

| 标签 | 含义 | 示例值 |
|------|------|--------|
| PLOC | 峰位置 | [10, 32, 54, ...] |
| FWO | 通道顺序 | "GATC" |
| LANE | 泳道号 | 42 |
| S/N% | 信噪比 | [53, 75, 79, 48] |
| SMPL | 样本名 | "sample" |
| PBAS | 碱基序列 | "ACGTACGT" |
| CMNT | 注释 | "Generated by bam2ab1" |
| DATA9-12 | 荧光信号 | [u16; n] 数组 |

## 删除压缩原理

对于存在 deletion 的区域，bam2ab1 会压缩峰间距：

```
正常:    p1 p2 p3 p4 p5 p6 p7
 deletion at p3:
         p1 p2 p3 p4 p5    (p3 位置的 deletion 被"压缩"显示)
```

通过 `Plp2Ab1WithDeletionShrink` 策略调整峰值位置，使得 deletion 区域的峰更密集。

## 插入识别原理

对于 insertion 区域，可以使用两种标识方式：

- **`--insIdent N`**: 插入区域显示为 N
- **`--insIdent acgt`**: 插入区域显示为实际碱基（基于最高比例）

## 示例

### 基本使用

```bash
bam2ab1 --bam alignment.bam --ref reference.fasta
```

输出: `alignment.ab1`

### 分块处理长序列

```bash
bam2ab1 --bam alignment.bam --ref reference.fasta \
        --chunkSize 500 --ovlpSize 50
```

每 500bp 生成一个文件，重叠 50bp：

```
alignment contig1.0-500.ab1
alignment contig1.450-950.ab1
alignment contig1.900-1400.ab1
...
```

### 插入区域标识

```bash
bam2ab1 --bam alignment.bam --ref reference.fasta --insIdent N
```

### 指定峰值宽度

```bash
bam2ab1 --bam alignment.bam --ref reference.fasta --width 15
```

## AB1 文件结构

```
ABIF Header (128 bytes)
├── Magic: "ABIF"
├── Version: 0x0100
└── Directory Entry

Tagged Data Entries
├── PLOC1  - 峰位置 (u16[])
├── FWO_1  - 通道顺序 (char[4])
├── LANE1  - 泳道号 (u16)
├── S/N%1  - 信噪比 (u16[4])
├── SMPL1  - 样本名 (pascal string)
├── PBAS1  - 碱基序列 (char[])
├── CMNT1  - 注释 (pascal string)
├── PDMF1  - 流动槽文件 (pascal string)
├── PDMF2  - 流动槽文件2 (pascal string)
├── DATA9  - G 通道信号 (u16[])
├── DATA10 - A 通道信号 (u16[])
├── DATA11 - T 通道信号 (u16[])
└── DATA12 - C 通道信号 (u16[])
```
