SAM形式とBAM形式

# はじめに

SAM/BAM ファイル形式についてごく簡単にまとめます。

# SAM/BAM形式とは

[bwa](https://github.com/lh3/bwa), STAR, hisat2 などのalignerで、FASTQファイルをリファレンスゲノムにマッピングした際に生成されるファイルです。Sam(Sequence Alignment/Map)はテキスト形式で、Bam(Binary Alignment/Map)はバイナリ形式です。

# 公式の仕様書

* [SAM/BAM and related specifications](https://samtools.github.io/hts-specs/)
    * [SAM v1](https://samtools.github.io/hts-specs/SAMv1.pdf)

* [SAM(file format) - Wikipedia](https://en.wikipedia.org/wiki/SAM_(file_format))

SAM/BAMは [BWA](https://github.com/lh3/bwa) や [Samtools](https://github.com/samtools/samtools) の開発者の [Heng Li](https://en.wikipedia.org/wiki/Heng_Li) さんが策定したファイル形式です。

* 元論文 [The Sequence Alignment/Map format and SAMtools](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2723002/)
* Heng Li's blog [SAM/BAM/samtools is 10 years old ](https://lh3.github.io/2018/12/21/sambamsamtools-is-10-years-old)

### 公式によるサンプル

アラインメントが以下のようだった場合

```
Coor     12345678901234  5678901234567890123456789012345
ref      AGCATGTTAGATAA**GATAGCTGTGCTAGTAGGCAGTCAGCGCCAT
+r001/1        TTAGATAAAGGATA*CTG
+r002         aaaAGATAA*GGATA
+r003       gcctaAGCTAA
+r004                     ATAGCT..............TCAGC
-r003                            ttagctTAGGC
-r001/2                                        CAGCGGCAT
```

対応するSamファイルは以下のようになる

```
@HD VN:1.6 SO:coordinate
@SQ SN:ref LN:45
r001   99 ref  7 30 8M2I4M1D3M = 37  39 TTAGATAAAGGATACTG *
r002    0 ref  9 30 3S6M1P1I4M *  0   0 AAAAGATAAGGATA    *
r003    0 ref  9 30 5S6M       *  0   0 GCCTAAGCTAA       * SA:Z:ref,29,-,6H5M,17,0;
r004    0 ref 16 30 6M14N5M    *  0   0 ATAGCTTCAGC       *
r003 2064 ref 29 17 6H5M       *  0   0 TAGGC             * SA:Z:ref,9,+,5S6M,30,1;
r001  147 ref 37 30 9M         =  7 -39 CAGCGGCAT         * NM:i:
```

# SAM/BAM形式

SAMはテキスト形式、BAMはバイナリ形式である。

## 各カラムの意味

1〜11は必須カラムで、項目がない場合は * または 0 を記入する。

| カラム番号 | カラム名 | タイプ | 意味                                         |
|----------|------------|--------|----------------------------------------------|
| 1          | QNAME | String | リードの名前                                     |
| 2          | FLAG  | Int    | アライメントの結果（後述）                         |
| 3          | RNAME | String | リファレンスゲノムの名前　染色体番号など              |
| 4          | POS   | Int    | リードがマップされた開始位置                        |
| 5          | MAPQ  | Int    | マッピングクオリティスコア                         |
| 6          | CIGAR | String | マッピング状況（後述）                             |
| 7          | RNEXT | String | ペアエンドの場合、相手方のリード名                  |
| 8          | PNEXT | Int    | ペアエンドの場合、相手方のマップされた開始位置        |
| 9          | TLEN  | Int    | ペアエンドの場合、インサートの長さ                  |
| 10         | SEQ   | String | 塩基配列データ                                  |
| 11         | QUAL  | String | Sequence Quality                               |
| 12         |       |        |マッピングソフトによる追加情報                     |

参考：Dr. Bonoの生命科学データ解析

## ヘッダー部分
「@」で始まるタグのあとに、アラインメントに関する情報が記載されている。

||||
|-----|----|------------------------------------------------------------------------------------------|
| @HD |    | ヘッダー                                                                                  |
|     | VN | SAMフォーマットのバージョン                                                                  |
|     | SO | アライメントのソート順。unknown, unsorted, queryname または coordinate のいずれか記載される |
|     | GO | グループ。none, query(QNAMEによって), reference(RNAME/POSによって)           |
|     | SS | Sub-sorting order |
| @SQ |    | リファレンス                                                                               |
|     | SN | リファレンス配列の名前                                                                       |
|     | LN | リファレンス配列の長さ                                                                       |
|     | AH | Indicates that this sequence is an alternate locus. |
|     | AN | Alternative reference sequence names. |
|     | AS | ゲノムアセンブリーID                                                                        |
|     | DS | 説明(Description)                                                                         |
|     | M5 | MD5 checksum                                                                             |
|     | SP | 生物種                                                                                    |
|     | TP | 分子トポロジー linear circular                                                             |
|     | UR | 配列のURI http ftp                                                                        |
| @RG |    | リードグループ                                                                              |
|     | ID | リードグループID                                                                            |
|     | BC | バーコード配列                                                                              |
|     | CN | sequencing center                                                                        |
|     | DS | 説明(Description)                                                                         |
|     | DT | 日付                                                                                      |
|     | FO | Flow order                                                                               |
|     | KS |                                                                                          |
|     | LB | Library                                                                                  |
|     | PG | 使用したプログラム                                                                          |
|     | PI | Predicted median insert size                                                             |
|     | PL | プラットフォーム CAPILLARY LS454 ILLUMINA SOLID HELICOS IONTORRENT ONT PACBIO               |
|     | PM | プラットフォーム（自由記述）                                                                  |
|     | PU | Platform unit                                                                            |
|     | SM | サンプル                                                                                   |
| @PG |    | プログラム                                                                                 |     |     | ID | マッピングを行ったプログラム                                                                  |
|     | PN | プログラムの名前                                                                            |
|     | CL | 使用したコマンド                                                                            |
|     | DS | 説明(Description)                                                                         |
|     | VN | プログラムのバージョン                                                                       |

* 参照元　https://bi.biopapyrus.jp/format/sam.html

## Flag

[ビットフィールド](https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%83%E3%83%88%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89)

| Integer  | Binary       | Description                                                              |
|----------|--------------|--------------------------------------------------------------------------|
| 1        | 000000000001 | ペアリードがある |
| 2        | 000000000010 | 両方マップされている |
| 4        | 000000000100 | read1 はマップされていない |
| 8        | 000000001000 | read2（相方） はマップされていない |
| 16       | 000000010000 | read1 は逆相補鎖にマップされている |
| 32       | 000000100000 | read2（相方） は逆相補鎖にマップされてる |
| 64       | 000001000000 | read1 である |
| 128      | 000010000000 | read2 である |
| 256      | 000100000000 | 複数個所にマップされている |
| 512      | 001000000000 | マッピングＱＶが低い |
| 1024     | 010000000000 | PCR or optical duplicate |
| 2048     | 100000000000 | supplementary alignment (e.g. aligner specific, could be a portion of a split read or a tied region)  |

* 参照元　http://crusade1096.web.fc2.com/sam.html （一部改変）

フラグの意味が知りたい場合下記の `samtools` のコマンドが使用できる。

```sh
samtools flags 2064
# 0x810	2064	REVERSE,SUPPLEMENTARY
```

## CIGAR
CIGARはinsertion, deletion, softclipなどの位置を表す。

|   |                                                                                            |
|---|--------------------------------------------------------------------------------------------|
| M | 参照配列に張り付いたリード。ただし、個々の塩基が参照配列と同じかどうかは感知しない。       |
| I | 挿入。                                                                                     |
| D | 欠失。                                                                                     |
| N | 間が飛んでいる。mRNAではイントロンがメイン。                                               |
| S | ソフトクリップ。張り付いていない端っこのリード。何が張り付いていないのかは明記されている。 |
| H | ハードクリップ。張り付いていない端っこのリード。何が張り付いていないのかは不明。           |
| P | padding。張り付いたリードの側で何かの欠失が起こっている。de novoがメイン？                 |
| = | 参照配列に張り付いたリードのうち、参照配列と同じ塩基。                                     |
| X | 参照配列に張り付いたリードのうち、参照配列とは違う塩基。                                   |

* 引用参照元 [SAM Formatのcigar列の読み方(samtoolsとか)](https://linux-bio.com/sam_format_cigar/)

# 基本操作

* 引用元 [SAMtoolsワンライナー覚書 - Palmsonntagmorgen](http://rnakato.hatenablog.jp/entry/2017/11/08/113245)

`samtools` は `-@ 4` などと書くとマルチコアで動いてくれることが多い。

SAM → BAM

```
samtools view -bS file.sam > file.bam
```

BAM → SAM

```
samtools view sample.bam > sample.sam
```

BAMファイルをソート

```
samtools sort sample.bam > sample.sort.bam
```

BAM indexを作成

```
samtools index sample.sort.bam
```

# SAM/BAM 関連ツール

日本語情報では上坂さんのサイトの情報が圧倒的

* [sam/bam関係のツールまとめ - macでインフォマティクス](http://kazumaxneo.hatenablog.com/entry/2017/06/19/225006)

この記事は以上です。
（この記事は17日のアドベントカレンダーのための下準備です）