アライメントデータの操作
アライメントデータ(SAM/BAMファイル)を操作するにはsamtoolsを利用する。
samtools # サブコマンド一覧表示 samtools view # サブコマンド使用法確認
samtools view
主にSAM/BAM変換に利用する。samtools view IN # 入力(IN): SAM/BAM (自動検出); 出力: SAM (aln) samtools view -S IN # 入力: SAM (以前の仕様ではSAM入力であることを明示する必要があった) samtools view -H IN # 出力: SAM (header) samtools view -h IN # 出力: SAM (header+aln) samtools view -b IN # 出力: BAM/圧縮(aln) samtools view -u IN # 出力: BAM/非圧縮(header+aln) # 使用例 samtools view -hb in.sam # SAM to BAM変換 samtools view -u IN | samtools xxxxx # samtools間パイプ接続 (時短処理)
またFLAGやMAPQの情報をもとにフィルタリングするために利用する。
samtools view -f FLAG IN # FLAGで指定した値を有つものを抽出 samtools view -F FLAG IN # FLAGで指定した値を有たないものを抽出 samtools view -q MAPQ IN # MAPQで指定したMAPQ値以上のものを抽出
samtools flags
FLAG情報を確認するために利用する。
samtools flags 147 # 147(10進数)は10010011(2進数), 第1,2,5,8bitが1(True)である. # 出力結果:0x93 147 PAIRED, PROPER, PAIR, REVERSE, READ2 # 逆変換 samtools flags read1,proper_pair # 出力結果:0x42 66 PROPER_PAIR,READ1
samtools sort
座標軸(coordinate sorted, CSRT)又は名前(name sorted, NSRT)でアライメントをソートする。 後述のsamtools indexやsamtools fixmateの入力データはそれぞれCSRTやNSRTである必要がある。samtools sort IN # 入力(IN): SAM/BAM; 出力: CSRT BAM/標準出力 samtools sort -n IN # 出力形式: NSRT BAM samtools sort IN -o out.bam # 出力先: ファイル samtools sort IN out.prefix # 以前の使用法 # 計算資源量指定を追加: -m memoryNumberG -@ thread
samtools index
特定領域にアライメントされたリードに効率的にランダムアクセスできるようにするためには、 samtools indexサブコマンドによりインデックスを作成する必要がある。
samtools index CSRT.bam # 入力: CSRT.bam; 出力: CSRT.bam.bai # 計算資源量指定を追加: -@ thread
インデックス作成済みBAMに対してはsamtools viewを利用して範囲データ操作が実行できる。
samtools view CSRT.bam chr:start-end # chr:start-end領域にあるアライメントを抽出 samtools view -L target.bed CSRT.bam # target.bedと重なる領域を抽出
samtools fixmate
mate座標やインサートサイズ情報を埋める。
samtools fixmate NSRT.bam out.bam # 入力: NSRT.bam; 出力: out.bam samtools fixmate -r NSRT.bam out.bam # secondary/unmapped readsを除去 # 計算資源量指定を追加: -@ thread
samtools merge
BAMファイルを連結する。
samtools merge out.bam in1.bam in2.bam ... # 計算資源量指定を追加: -@ thread
応用例
insert sizeの一覧取得
samtools view -f 66 $IN | cut -f9 | tr -d '-'
insert sizeによるフィルタリング(例: 150bp未満を除外)
samtools view -h $IN | awk -F'\t' ' /^@/ !/^@/ {if($9 >= 150 || $9 <= -150) print}'
ENCODE3プロジェクトにおける使用例を一部改変したものを下に示す。
# 変数定義 INF=$1 ID=$(basename $INF | sed 's/\.[^.][^.]*$//') TMPF1=${ID}.1.bam TMPF2=${ID}.2.bam TMPF3=${ID}.3.bam OUTF=${ID}_FILT.bam # --- JARPATH=~/.conda/envs/aln/share/picard-2.27.4-0/picard.jar CMD="java -jar $JARPATH MarkDuplicates" # 除去: unmapped, mate unmapped, not primary alignment, reads failing platform # 除去: low MAPQ reads # キープ: properly paired reads samtools view -F 1804 -f 2 -q 30 -u $INF | # --- この範囲の処理の意義は不明瞭 ------------------------ # 除去: orphan reads (pair was removed), # read pairs mapping to different chromosomes samtools sort -n - | samtools fixmate -r - $TMPF1 samtools view -F 1804 -f 2 -u $TMPF1 | # --------------------------------------------------------- samtools sort - > $TMPF2 # 検出: duplicates $CMD \ INPUT=$TMPF2 \ OUTPUT=$TMPF3 \ METRICS_FILE=${ID}_dupl \ VALIDATION_STRINGENCY=LENIENT \ ASSUME_SORTED=true \ REMOVE_DUPLICATES=false # 除去: duplicates samtools view -F 1804 -f 2 -hb $TMPF3 > $OUTF rm $TMPF1 $TMPF2 $TMPF3
不明点
- samtools sortでCSRTしたらファイルサイズが小さくなった?