pysamでSAM/BAMファイルを読み込む・解説

目次

1. pysamとSAMファイルの概要
1.1 pysamとは
1.2 SAM/BAMファイル
1.3 ヘッダー
1.4 アライメント
2. pysamの実験
2.1 環境構築
2.2 データロード
2.3 データ表示

 

1. pysamとは

1.1 Pysam

Pysam は、htslib C-API の軽量ならラッパーです。BAM/SAMファイルなどのDNAの塩基配列の読み取り、操作、および書き込みPython モジュールができます。対応ファイルはSAM/BAM/VCF/BCF/BED/GFF/GTF/FASTA/FASTQです。SamtoolsとBcftoolsの関数を利用できます。

 

Github: https://github.com/pysam-developers/pysam

資料:https://pysam.readthedocs.io/en/latest/

 

1.2 SAM/BAMファイル

SAMはSequence Alignment Mapの略称で、アライメントしたリードの情報を格納するテキスト形式です。

オプションのヘッダー セクションとアライメントセクションで構成されるタブ区切りのテキスト形式です。

BAMはバイナリ形式のSAMファイルです。

CRAMはSAM/BAM高圧縮アライメントファイルです。

ファイル拡張子: .sam、.bam、.cram (.gz、.bgz、.bz2、.xz)

SAM ファイルの説明資料:https://samtools.github.io/hts-specs/SAMv1.pdf

ヘッダーとアライメントの例

1.3 ヘッダー

各ヘッダー行は@から始まる二文字のコードが記載されています。タグのコードは下記になります。

@HD  ファイルヘッダー

VN  SAMフォーマットのバージョン

SO アライメントのソート情報。「unknown」、「unsorted」、「queryname」または「coordinate」のいずれか記載される

GO アライメントのグループ

SS アラインメントのサブソート順

@SQ  リファレンス配列の情報

SN  リファレンス配列の名前

LN  リファレンス配列の長さ

AH  配列が代替遺伝子座であること

AN 代替リファレンス配列名

AS  ゲノムアセンブリーID

DS  説明

M5  MD5 checksum

SP  生物種

TP  種族

UR  配列のURI

@RG  リードのグループ

ID  リードのグループのID

BC  バーコード

CN  リードを生成するシーケンシング センターの名前

DS  説明

DT  実行の日付

FO  フロー順序

KS  ヌクレオチド塩基の配列

LB  ライブラリ

PG  プログラム

PI  予測されるインサート サイズの中央値

PL  プラットホーム

PM  プラットフォーム モデル

PU  プラットフォームユニット

SM  サンプル

@PG  プログラム

ID  マッピングを行ったプログラム

PN  プログラム名

CL  マッピングを行うときに実際に入力したコマンドが記載される

PP  前の @PG-ID

DS  説明

VN  プログラムのバージョン

 

1.4 アライメント

各アライメント行11列からなるタブ区切りのフィールドであらわされます。

 

  1. QNAME リードの名前。情報がない場合、’*’となります。

 

  1. FLAG 下記のマッピングの状態を示すビット値です。

・ 0 フォワード ストランドにマッピングされます

・ 1 0x1 ペアリードがある

・ 2 0x2 両方マップされている

・ 4 0x4 read1 はマップされていない

・ 8 0x8 read2(相方) はマップされていない

・ 16 0x10 read1 は逆相補鎖にマップされている

・ 32 0x20 read2(相方) は逆相補鎖にマップされてる

・ 64 0x40 テンプレートの最初のセグメント(read1)

・ 128 0x80 テンプレートの最後のセグメント(read2)

・ 256 0x100 複数個所にマップされている

・ 512 0x200 プラットフォーム/ベンダーの品質管理などのフィルターを通過しない

・ 1024 0x400 PCR または光学的複製

・ 2048 0x800 補足アライメント

  1. RNAME リファレンス配列の名前。マッピングされなかったリードは * となります。
  2. POS(POSition)マッピングされたポジション。1始まり。マッピングされなかったリードは0となります。

POSの例:

 

  1. MAPQ(MAPping Quality)マッピングポジションが誤っている確率の常用対数に-10を掛けた値です。255はマッピングクオリティが得られなかったことを示す。

 

  1. CIGAR (Compact Idiosyncratic Gapped Alignment Report)リファレンスに対し、どのようにアライメントされたかを示します。

M 参照配列に張り付いたリード。ただし、個々の塩基が参照配列と同じかどうかは感知しない。

I 挿入

D 欠失

N 間が飛んでいる。mRNAではイントロンがメイン

S ソフトクリップ。張り付いていない端っこのリード。何が張り付いていないのかは明記されている。

H ハードクリップ。張り付いていない端っこのリード。何が張り付いていないのかは不明。

P padding。張り付いたリードの側で何かの欠失が起こっている。de novoがメインしているか。

= 参照配列に張り付いたリードのうち、参照配列と同じ塩基。

X 参照配列に張り付いたリードのうち、参照配列とは違う塩基。

CIGARの例:

  1. MNAME paired-endの場合、もう一方のリードの名前を示す。”=”の場合、もう一方のリードも同じ名前であることを示します。

 

  1. MPOS 最もよくマッピングされたポジションを示します。

 

  1. TLEN 全てのセグメントが同一のリファレンス配列にマッピングされた場合、最も左側にマップされた塩基から最も右側にマップされた塩基までの長さが計算される (end − start + 1)。マップされたか否かはCIGARフォーマットから判別される(したがってsoft-clipped部分は含まれない)。最も左のセグメントは正の符号が、最も右のセグメントは負の符号がつく。この列は、対応するリードがどこにアラインされているかを把握するために存在する。コンセンサスの取れた定義は存在せず、ファイルの出力に使用したツールなどに依存しています。

 

  1. SEQ リファレンスとして使用されるリード中の配列。”*” でない場合、CIGAR列のM/I/S/=/Xを足したものになります。

 

  1. QUAL リードのクオリティー。fasta/q format中のものと同じ(Phredクオリティスコア + 33 をASCIIコードにエンコードした値)

2. pysamの実験

Google Colabの環境で実験します。

データセット:人の24この染色体のBAMファイル

詳細:http://hgdownload.cse.ucsc.edu/goldenPath/hg19/encodeDCC/wgEncodeUwRepliSeq/

 

2.1 環境構築

ライブラリのインストール

!pip install -q pysam

 

ライブラリのインポート

import pysam

pysam.__version__

0.19.1

 

2.2 データロード

UcscからBG02ES.bamのファイルをダウンロードします。

BG02ESはヒト胚性幹細胞のデータです。

import urllib

from urllib import request

 

src_file = “http://hgdownload.cse.ucsc.edu/goldenPath/hg19/encodeDCC/wgEncodeUwRepliSeq/wgEncodeUwRepliSeqBg02esG1bAlnRep1.bam”

dest_file = ‘BG02ES.bam’

 

urllib.request.urlretrieve(src_file, dest_file)

 

ファイルの読み込み

file_path = “/content/BG02ES.bam”

samfile = pysam.AlignmentFile(file_path, “rb”)

 

2.3 データ表示

ヘッダーを表示します。下記のようなデータを表示します。

SQ リファレンス配列辞書

SN リファレンス配列名 24この染色体

LN リファレンス配列の長さ

print(samfile.header)

@SQ   SN:chr1     LN:249250621

@SQ   SN:chr2     LN:243199373

@SQ   SN:chr3     LN:198022430

@SQ   SN:chr4     LN:191154276

@SQ   SN:chr5     LN:180915260

@SQ   SN:chr6     LN:171115067

@SQ   SN:chr7     LN:159138663

@SQ   SN:chr8     LN:146364022

@SQ   SN:chr9     LN:141213431

@SQ   SN:chr10    LN:135534747

@SQ   SN:chr11    LN:135006516

@SQ   SN:chr12    LN:133851895

@SQ   SN:chr13    LN:115169878

@SQ   SN:chr14    LN:107349540

@SQ   SN:chr15    LN:102531392

@SQ   SN:chr16    LN:90354753

@SQ   SN:chr17    LN:81195210

@SQ   SN:chr18    LN:78077248

@SQ   SN:chr19    LN:59128983

@SQ   SN:chr20    LN:63025520

@SQ   SN:chr21    LN:48129895

@SQ   SN:chr22    LN:51304566

@SQ   SN:chrM     LN:16571

@SQ   SN:chrX     LN:155270560

 

リファレンス配列名を表示します。

print(samfile.references)

print(samfile.nreferences)

(‘chr1’, ‘chr2’, ‘chr3’, ‘chr4’, ‘chr5’, ‘chr6’, ‘chr7’, ‘chr8’, ‘chr9’, ‘chr10’, ‘chr11’, ‘chr12’, ‘chr13’, ‘chr14’, ‘chr15’, ‘chr16’, ‘chr17’, ‘chr18’, ‘chr19’, ‘chr20’, ‘chr21’, ‘chr22’, ‘chrM’, ‘chrX’)

24

 

リファレンス配列の長さを表示します。

print(samfile.lengths)

(249250621, 243199373, 198022430, 191154276, 180915260, 171115067, 159138663, 146364022, 141213431, 135534747, 135006516, 133851895, 115169878, 107349540, 102531392, 90354753, 81195210, 78077248, 59128983, 63025520, 48129895, 51304566, 16571, 155270560)

 

インデックスを作成します。

# idex作成

file_path = “/content/BG02ES.bam”

pysam.index(file_path)

samfile = pysam.AlignmentFile(file_path, “rb”)

 

特定のリファレンス配列の長さを表示します。

samfile.count(“chr1”)

179687

アライメントを表示します。

samfile = pysam.AlignmentFile(file_path, “rb”)

for idx, read in enumerate(samfile.fetch(reference=’chr1′)):

if idx = 1:

print(read)

samfile.close()

SOLEXA-1GA-2_2_FC20EMB:5:251:979:328    0     #0    10145 25    36M   *     0     0      AACCCCTAACCCTAACCCTAACCCTAACCCTAAACT    array(‘B’, [71, 71, 71, 71, 39, 66, 54, 71, 71, 39, 51, 70, 71, 66, 42, 32, 62, 46, 45, 71, 32, 32, 36, 36, 33, 57, 36, 30, 39, 30, 34, 33, 34, 30, 35, 32])    [(‘NM’, 1), (‘X1’, 1), (‘MD’, ’33A2′)]

 

担当者:KW
バンコクのタイ出身 データサイエンティスト
製造、マーケティング、財務、AI研究などの様々な業界にPSI生産管理、在庫予測・最適化分析、顧客ロイヤルティ分析、センチメント分析、SaaS、PaaS、IaaS、AI at the Edge の環境構築などのスペシャリスト