k-mer カウントして、配列も出力するツール jellyfish、BFCounter (original) (raw)

2017.11追記

2018.03 -sフラグ修正

2019 5/14 リンク追加

2019 9/9 BFcounterインストール追記

2019 12/19 condaインストール追記、BFCounterインストール追記

k-merカウントを行うjellyfishと、k-merの全配列を書き出すBFCounterを紹介する。

Jellyfish

公式サイト

JELLYFISH - Fast, Parallel k-mer Counting for DNA

マニュアルPDF

http://www.cbcb.umd.edu/software/jellyfish/jellyfish-manual-1.1.pdf

Github

git clone https://github.com/gmarcais/Jellyfish.git
cd Jellyfish/
autoreconf -i
 ./configure --prefix=$HOME
make -j 8
sudo make install

#bioconda(link)
#version1系
conda install -c bioconda -y kmer-jellyfish==1.1.12-0

#version2 latest
conda install -c bioconda -y kmer-jellyfish

またはbrewでも導入できる。

ラン

k-merカウントする。

jellyfish count -m 31 -s 10000000 -t 20 input.fasta/fastq -o mer_counts.jf

インプットファイルはfasta ,fastqとも対応している。

mer_counts.jfができる。中身はbinaryである。このファイルを以後の解析に使う。

簡単なstatistics

jellyfish stats mer_counts.jf

user$ jellyfish stats mer_counts.jf

Unique: 2413100

Distinct: 10097611

Total: 69409538

Max_count: 388

DIstinct k-merはたとえ複数回出現しても1回しか数えられないk-merで、Unique k-merは1回しか出現しないk-mer。Canonicalかどうかでカウント値は影響を受ける。

k-merの配列を全て出力する。

jellyfish dump mer_counts.jf > k31.fasta

中身を見てみる。

user-no-MacBook-Pro: user$ less -S k33.fa

>1

CCCAGGGTCTGGAACTATCGCCGGTGGAAAATATCGAAACGGAAGCGGGGCAAGGGGTTCAGGGTTGGTACCAAGGC

>15

AATGCCCTGGGGAGTAACTGAAAGGAAACGAAAAAATAATCTTCTTCCTATTCTATTCCTTCTGATTGAGTAACCAG

>1

CCTTGTTTGACAGTGCAGTCCGGGTTCCTAAAAGGTTGCAAGGGGATTTATTCATTCGCAGTACCCAAACGGACACC

>1

GGTGGAATAAATACCTGTGGTGAAGGTATTAACGCCAAAATATTGCACTGTGCCAAAATCGTTCAGAGTCCCCATCA

>1

AGAACGTCGTGGACGGCGTCCCCGTCGTGAGGGAACGGTGGAGGTCAAAGGGCGATCGGGAAGGGCGGCGGAACTAT

>16

TGGTGGACGGAAATCTTAAACATTGCCTAGAGAAAAGTTGGGAATTGACGGTGGTGGGGGCAGGGCAAGGAGTGGAA

>15

GGTTTCCTGGGCAAACTCGATGGAACCTGGACAATCGAGGAAATTTAAGCGCAAATTTTCATAATCAATCCCTGCCA

指定のk-merサイズの全塩基配列が出力されている。数値は登場回数である。重複させながら元の配列を分解しているので、元のfastqよりサイズははるかに大きくなる。

ヒストグラムデータを出力。

jellyfish histo mer_counts.jf > histogram.txt

出力の中身を見てみる。

user-no-MacBook-Pro: user$ less -S histogram.txt

1 3101726

2 8283

3 5424

4 12735

5 29386

6 61451

7 103516

8 164603

9 230629

10 291824

11 347466

Rに読み込んでグラフ化する。

純化されたバクテリアのシーケンスデータを分析する。

R #Rに入る
input <- read.table("histogram.txt") #読み込み
plot(input[2:100,],type="l") #2列目が頻度情報。

f:id:kazumaxneo:20171120142312j:plain

2つ目の山がゲノムのシングルコピーの領域に由来する33merのピークと思われる。ピーク座標を調べる。

input[0:20,]

13がピークと思われる(赤色)。

> input[0:20,]

V1 V2

1 1 136238639

2 2 3362948

3 3 446016

4 4 142167

5 5 122950

6 6 159056

7 7 216472

8 8 287219

9 9 362505

10 10 430060

11 11 487906

12 12 520707

13 13 531598

14 14 531210

15 15 504837

16 16 472747

17 17 435696

18 18 390053

19 19 342325

20 20 298075

もっとちゃんと調べる。

k15

f:id:kazumaxneo:20171120154345j:plain

k35

f:id:kazumaxneo:20171120154503j:plain

k55

f:id:kazumaxneo:20171120154620j:plain

k65

f:id:kazumaxneo:20171120154637j:plain

k77

f:id:kazumaxneo:20171120154650j:plain

k99

f:id:kazumaxneo:20171120155119j:plain

k127

f:id:kazumaxneo:20171120155356j:plain

kmergenuineでもbestなk-merを探す(参考にしたページ)。(kmergenuineはbrewで導入できる。)

kmergenie input.fq

fitting model to histograms to estimate best k

table of predicted num. of genomic k-mers: histograms.dat

recommended coverage cut-off for best k: 2

best k: 65

kmergenuineでは65-merがベストと判定された。

65-merの入力テーブルを使い、ゲノムサイズを推定する。

sum(as.numeric(input[12:1130,1]*input[12:1130,2]))/65

リピートがあると、その分だけ少ない値が出るはずである。

k-mer coverageの貧弱なものを除きたいならkhmerを使う。khmerはk-merグラフの分布から低頻度k-mer配列を除去したり様々な機能をもつde novo assemblyをアシストするツールである。(pipでインストール可能

load-into-counting.py -T 20 -k 20 -x 3e6 output1 input.fastq

filter-abund.py -C 2 -T 20 output1 input.fastq

注 khmrは別途記事にします。

BFCounter

BFCounterは k-merを数えて、全部の配列を出力するツール。

Github

https://github.com/pmelsted/BFCounter

ソースコードをダウンロードしてmakeする。

git clone https://github.com/pmelsted/BFCounter.git
cd BFCounter/

#ここではlarge k-merを扱えるようにしておく
make MAX_KMER_SIZE=300

パスを通しておく。

# ./BFCounter

Error: too few arguments

BFCounter BFCounter 1.0

A memory efficient k-mer counting program.

Usage: BFCounter [options] ...

Where can be one of:

count Counts the occurrences of k-mers in sequence files

dump Writes occurrences of k-mers into a tab-separated text file

cite Prints information for citing the paper

version Displays version number

ラン

BFCounter count -n 1000 -k 127 -o single_out -t 12 input.fq

出力はbinaryファイルである。ここからk-mer長の配列を抽出する。

BFCounter dump -i single_out -k 127 -o k-127_output

出力の中身を見てみる。

f:id:kazumaxneo:20170627225750j:plain

このように全k-mer配列が出力されている。あとはスクリプトを使い自由にいじることができる。

このツールの機能はこれだけであるが、シンプルでなため使いやすい。

追記

1、シロイヌナズナゲノム (k-mer size 28)

$ jellyfish stats mer_counts.jf

Unique: 109610472

Distinct: 112718914

Total: 119479935

Max_count: 4778

28merという大きなサイズでゲノムのk-merを調べると、偶然2回以上出現する配列は限りなくゼロになる。そのため、ユニークなk-merの出現頻度は大半が1になり(下の図)、頻度1のユニークなk-merの数とゲノムのサイズはほぼ等しくなる。しかしリピートがあるゲノム(28merで調べているなら28以上完全に同一の配列がある)ならば、同じ28-merの配列が複数回出現するため、出現頻度1のユニークなk-merの合計と、全k-merのトータル(重複があるかどうかを問わず)に大きな差が生じる。リピート領域が多ければ、ヒストグラムの裾野の分布(肩)が右向きに広く(コピー数が多い)、高く(コピーの割合が多い)なる。

f:id:kazumaxneo:20180412152648j:plain

2、シーケンスデータのk-mer分布。

シロイヌナズナのillumina rawシーケンスデータ (k-mer size 28)

$ jellyfish stats mer_counts.jf

Unique: 241278948

Distinct: 475904703

Total: 3772597024

Max_count: 843576

シーケンスデータのk-merカウントを行うと、高いカバレッジでシーケンスしているため、ゲノムがリピートを持つかどうかに関わらず、ユニークなk-merはほぼゼロという結果が得られる(下の図)。それにもかかわらずユニークなk-merの数が非常に多いのは、シーケンスエラーが発生しているためである。平均クオリティQ30の100bpリードは、平均して10リードに1つしかシーケンスエラーを含まないが、それでも1つのシーケンスエラーが発生すると、28merでカウントしているなら28のユニークk-merが出現する(変化して他に配列と合致する可能性がゼロとして)。リアルデータだと、シーケンスエラーの発生はそこまで単純ではないため、おそらくはユニークk-mer数はもっと多くなる。参考リンク

f:id:kazumaxneo:20180412154040j:plain

図、左端はシーケンスエラー由来のピークで、ゲノムアセンブリに必要な真の情報は頻度5-15付近のピーク部分。リピートが多いゲノムのシーケンスデータでは、右に大きな第二ピークができる。

引用

Guillaume Marcais and Carl Kingsford, A fast, lock-free approach for efficient parallel counting of occurrences of k-mers.

Bioinformatics (2011) 27(6): 764-770 (first published online January 7, 2011) doi:10.1093/bioinformatics/btr011)

Efficient counting of k-mers in DNA sequences using a bloom filter.

BMC Bioinformatics. 2011 Aug 10;12:333. doi: 10.1186/1471-2105-12-333.

Melsted P1, Pritchard JK.

K-mer analysis and genome size estimate

関連