最近接手了宏基因項目,會在之后接著發一系列的宏基因組入門教程,學習資料大概來自國外的教程。
感謝Harriet Alexander, Phil Brooks, C. Titus Brown提供的學習資料和數據(2017-cicese-metagenomics.readthedocs.io/en/latest/)
數據下載及核查:
#開個多線程,幾個可以一起下
wget -c -nd -r -np -k -L -p -nd https://s3-us-west-1.amazonaws.com/dib-training.ucdavis.edu/metagenomics-scripps-2016-10-12/SRR1976948_1.fastq.gz
wget -c -nd -r -np -k -L -p -nd https://s3-us-west-1.amazonaws.com/dib-training.ucdavis.edu/metagenomics-scripps-2016-10-12/SRR1976948_2.fastq.gz
wget -c -nd -r -np -k -L -p -nd https://s3-us-west-1.amazonaws.com/dib-training.ucdavis.edu/metagenomics-scripps-2016-10-12/SRR1977249_1.fastq.gz
wget -c -nd -r -np -k -L -p -nd https://s3-us-west-1.amazonaws.com/dib-training.ucdavis.edu/metagenomics-scripps-2016-10-12/SRR1977249_2.fastq.gz
# md5 check一下
$md5sum SRR1976948_1.fastq.gz SRR1976948_2.fastq.gz SRR1977249_1.fastq.gz SRR1977249_2.fastq.gz
#結果應該是這樣的
37bc70919a21fccb134ff2fefcda03ce SRR1976948_1.fastq.gz
29919864e4650e633cc409688b9748e2 SRR1976948_2.fastq.gz
ee25ae14f84308f972cebd42e55502dd SRR1977249_1.fastq.gz
84b15b4f5975cd7941e211336ff27993 SRR1977249_2.fastq.gz
# 看看每個文件的具體情況
file format type num_seqs sum_len min_len avg_len max_len
SRR1976948_1.fastq.gz FASTQ DNA 1,000,000 251,000,000 251 251 251
SRR1976948_2.fastq.gz FASTQ DNA 1,000,000 251,000,000 251 251 251
SRR1977249_1.fastq.gz FASTQ DNA 1,000,000 251,000,000 251 251 251
SRR1977249_2.fastq.gz FASTQ DNA 1,000,000 251,000,000 251 251 251
質控
#fastqc 太簡單 略
#可以試試multiqc,一次把fastqc的結果文件做整合
# 下載接頭文件
$curl -O -L http://dib-training.ucdavis.edu.s3.amazonaws.com/mRNAseq-semi-2015-03-04/TruSeq2-PE.fa
#Trimmomatic
$for f in *gz
do
base=$(basename $f _1.fastq.gz);echo $base;java -jar /data/apps/trimmomatic/Trimmomatic-0.36/trimmomatic-0.36.jar PE ${base}_1.fastq.gz \
${base}_2.fastq.gz \
${base}_1.PE.gz ${base}_1.SE.gz \
${base}_2.PE.gz ${base}_2.SE.gz \
ILLUMINACLIP:TruSeq2-PE.fa:2:40:15 \
LEADING:2 TRAILING:2 \
SLIDINGWINDOW:4:2 \
MINLEN:25
done
#再次fastqc 看上一步質控的結果
MEGAHIT /metaspades組裝
# megahit軟件安裝 有編譯好了的版本
#https://github.com/voutcn/megahit/releases/download/v1.1.4/megahit_v1.1.4_LINUX_CPUONLY_x86_64-bin.tar.gz
#下數據
$curl -O https://s3-us-west-1.amazonaws.com/dib-training.ucdavis.edu/metagenomics-scripps-2016-10-12/SRR1976948.abundtrim.subset.pe.fq.gz
$curl -O https://s3-us-west-1.amazonaws.com/dib-training.ucdavis.edu/metagenomics-scripps-2016-10-12/SRR1977249.abundtrim.subset.pe.fq.gz
#看看數據量
file format type num_seqs sum_len min_len avg_len max_len
SRR1976948.abundtrim.subset.pe.fq.gz FASTQ DNA 2,926,154 680,423,034 32 232.5 251
SRR1977249.abundtrim.subset.pe.fq.gz FASTQ DNA 3,340,976 768,640,987 32 230.1 251
#組裝,他們的代碼
megahit --12 SRR1976948.abundtrim.subset.pe.fq.gz,SRR1977249.abundtrim.subset.pe.fq.gz -o combined
#我的代碼
megahit --12 SRR1976948.abundtrim.subset.pe.fq.gz SRR1977249.abundtrim.subset.pe.fq.gz --k-min 23 --k-max 141 --k-step 10 --no-mercy --use-gpu -t 10 1>megahit.log 2>megahit.err &
#文檔里說組裝15分鐘,我花了5分鐘
#文檔里的組裝結果和我的組裝結果
7713 contigs, total 13168567 bp, min 200 bp, max 54372 bp, avg 1707 bp, N50 4305 bp
6043 contigs, total 10908730 bp, min 200 bp, max 100560 bp, avg 1805 bp, N50 4024 bp
## metaspades組裝
#花費19分鐘
metaspades.py -o metaspades --12 SRR1976948.abundtrim.subset.pe.fq.gz --12 SRR1977249.abundtrim.subset.pe.fq.gz --only-assembler -t 10 1>spade.log 2>spade.err &
#組裝結果 contig
assembly:contigs.fasta
number of contigs/scaffolds:4959
assembly size:12259965
largest contig/scaffold:252026
N50:7937
N90:1533
#其他組裝軟件 Soapdenovo2 IDBA-UD等
總的來說,spades的組裝結果是最理想的,但是spades在糾錯那步又慢又耗內存,我的機器內存要跑超,所有先用了其他基于kmer的軟件糾錯,而不是讓spades糾錯,糾錯后組裝時選擇--only-assembler,效率也可以保證
教程中提到一個問題 Illumina HiSeq, Illumina MiSeq, and PacBio技術在組裝上有什么需要權衡注意的呢?
這篇文章給了一些結論“Accurate, multi-kb reads resolve complex populations and detect rare microorganisms”
這篇文章干了這么幾件事:
a. 測試了用Moleculo 的reads進行組裝,改善組裝的contig
b. 評估短reads組裝的準確性
c. 查看組裝結果中低豐度的生物
d. 評估了序列變異和基因組含量水平,這些是短reads測序沒辦法解釋的
結果作者干成了這些事:
a. 長reads揭示了很多許多非常豐富的生物,這些生物在短reads組裝中完全弄丟的(missed ....)
b. 使用新的共線性方法重建了基因組結構和代謝潛力
c. 低豐度的“long tail”(暫時還不理解)屬于高豐度生物代表的們
d. 關系密切的菌株和稀有生物的多樣性占去了群體多樣性的絕大部分
MEGAHIT 和其他幾個軟件使用時間和內存的比較:
評估宏基因組組裝結果
#quast軟件安裝
$quast.py ../combined/final.contigs.fa -o megahit-report
# 下載metaspades組裝的結果
$ curl -LO https://osf.io/h29jk/download
$mv download metaspades.contigs.fa.gz
$gunzip metaspades.contigs.fa.gz
$quast.py metaspades.contigs.fa -o metaspades-report
#比較一下megahit和metaspades的組裝結果
$paste */report.txt | cut -f1-2, 4
基因組注釋
#prokka安裝
#注釋,沒啥好說的,prokka真的超級好用
prokka subset_assembly.fa --outdir prokka_annotation --prefix metagG --metagenome --kingdom Bacteria
# prokka可以看已經安裝能哪些注釋數據庫
prokka --listdb
# 然后根據自己情況可自己生成數據庫,流程是下載需要的蛋白質數據、cd-hit去冗余、makeblast建庫、放到prokka db里面去,注釋的時候選擇特定的數據庫就可以了
使用sourmash比較數據集
教程里面使用的是他們自己開發的sourmash軟件(https://sourmash.readthedocs.io/en/latest/),他們對它的描述是快速進行核酸水平搜索和比較的工具。
原理是這樣的:Kmer越長(大于31或更長),這種kmer更傾向于是物種特異性的,屬水平一般kmer=40就可以鑒定物種特異性的kmer,如果想到species水平,Kmer就該是50左右吧。
所以用kmer可以比較基因組和基因組,一個reads數據集和另一個reads數據集:相似或相同的基因組,reads數據集之間都會有很多相同點
only k-mers in both samples
----------------------------
all k-mers in either or both samples
Jaccard距離1表示樣本中相同,Jaccard距離0表示樣本間完全不相同。
這樣可以用來搜索數據庫和數據集中未知的基因組和其他東西,不過基因組有太多的kmer這才是個問題,比如一個5M的大腸桿菌就有5m 的kmer(5 mil?)
##參考安裝 sourmash
sudo apt-get -y update && \
sudo apt-get install -y python3.5-dev python3.5-venv make \
libc6-dev g++ zlib1g-dev
python3.5 -m venv ~/py3
. ~/py3/bin/activate
pip install -U pip
pip install -U Cython
pip install -U jupyter jupyter_client ipython pandas matplotlib scipy scikit-learn khmer
pip install -U https://github.com/dib-lab/sourmash/archive/master.zip
#我沒有sudo,3.5以前已經裝了,pip安裝的時候自己加了--user
## 下載其他組裝數據
$curl -L -o SRR1976948.abundtrim.subset.pe.fq.gz https://osf.io/k3sq7/download
$curl -L -o SRR1976948.megahit.abundtrim.subset.pe.assembly.fa https://osf.io/dxme4/download
$curl -L -o SRR1976948.spades.abundtrim.subset.pe.assembly.fa https://osf.io/zmekx/download
##運行sourmash
#教程中提到,首先計算一下reads,這些reads是需要前期過濾、kmer修正的
sourmash compute -k51 --scaled 10000 SRR1976948.abundtrim.subset.pe.fq.gz -o SRR1976948.reads.scaled10k.k51.sig
#比較組裝結果 為宏基因組構建“signature”
sourmash compute -k51 --scaled 10000 SRR1976948.spades.abundtrim.subset.pe.assembly.fa -o SRR1976948.spades.scaled10k.k51.sig
sourmash compute -k51 --scaled 10000 SRR1976948.megahit.abundtrim.subset.pe.assembly.fa -o SRR1976948.megahit.scaled10k.k51.sig
#評估有多少reads包含進入了各個組裝版本中
sourmash search SRR1976948.reads.scaled10k.k51.sig SRR1976948.megahit.scaled10k.k51.sig --containment
sourmash search SRR1976948.reads.scaled10k.k51.sig SRR1976948.spades.scaled10k.k51.sig --containment
會看到這樣的結果:
loaded query: SRR1976948.abundtrim.subset.pe... (k=51, DNA)
loaded 1 signatures and 0 databases total.
1 matches:
similarity match
---------- -----
48.7% SRR1976948.megahit.abundtrim.subset.pe.assembly.fa
loaded query: SRR1976948.abundtrim.subset.pe... (k=51, DNA)
loaded 1 signatures and 0 databases total.
1 matches:
similarity match
---------- -----
47.5% SRR1976948.spades.abundtrim.subset.pe.assembly.fa
注意看:SRR1976948.reads.scaled10k.k51.sig來源于reads,而SRR1976948.megahit.scaled10k.k51.sig/SRR1976948.spades.scaled10k.k51.sig來源于組裝版本,也就是說只有大約47-48%的reads在組裝版本的中。
反過來計算呢,可是這些在基因組中99.x%的kmer在reads中,就是組裝版本的kmer幾乎完全來自reads。
這說明了測序錯誤的問題,Illumina 測序的測序錯誤造成了大量的低頻Kmer。
$sourmash search SRR1976948.megahit.scaled10k.k51.sig SRR1976948.reads.scaled10k.k51.sig --containment
$sourmash search SRR1976948.spades.scaled10k.k51.sig SRR1976948.reads.scaled10k.k51.sig --containment
loaded query: SRR1976948.megahit.abundtrim.s... (k=51, DNA)
loaded 1 signatures and 0 databases total.
1 matches:
similarity match
---------- -----
99.8% SRR1976948.abundtrim.subset.pe.fq.gz
loaded query: SRR1976948.spades.abundtrim.su... (k=51, DNA)
loaded 1 signatures and 0 databases total.
1 matches:
similarity match
---------- -----
99.9% SRR1976948.abundtrim.subset.pe.fq.gz
接下來比較一下signatures
首先安裝osfclient 然后用osfclient下載一批數據
pip install osfclient
osf -p ay94c fetch osfstorage/signatures/SRR1977249.megahit.scaled10k.k51.sig SRR1977249.megahit.scaled10k.k51.sig
osf -p ay94c fetch osfstorage/signatures/SRR1977249.reads.scaled10k.k51.sig SRR1977249.reads.scaled10k.k51.sig
osf -p ay94c fetch osfstorage/signatures/SRR1977249.spades.scaled10k.k51.sig SRR1977249.spades.scaled10k.k51.sig
osf -p ay94c fetch osfstorage/signatures/SRR1977296.megahit.scaled10k.k51.sig SRR1977296.megahit.scaled10k.k51.sig
osf -p ay94c fetch osfstorage/signatures/SRR1977296.reads.scaled10k.k51.sig SRR1977296.reads.scaled10k.k51.sig
osf -p ay94c fetch osfstorage/signatures/SRR1977296.spades.scaled10k.k51.sig SRR1977296.spades.scaled10k.k51.sig
osf -p ay94c fetch osfstorage/signatures/subset_assembly.megahit.scaled10k.k51.sig subset_assembly.megahit.scaled10k.k51.sig
接下來對這些“signatures”進行比較
#比較及畫圖
$sourmash compare *sig -o Hu_metagenomes
#生成png圖片
$sourmash plot --labels Hu_metagenomes
#jupyter 可視話
from IPython.display import Image
Image("Hu_metagenomes.matrix.png")
宏基因組分箱(bining)
宏基因組組裝之后的一種常見方法是binning,就是將組裝好的contig分配到組或“容器/箱子(bins)”中的過程,這些組或“容器/箱子”隨后可能被分配到一些分類從屬關系。
在這里將使用MaxBin和MetaBAT。為了使用這些軟件,首先需要使用bwa將數據比對到宏基因上,然后通過contig估計相對豐度。然后,使用VizBin檢查MaxBin和MetaBAT生成的組/容器/箱子。
軟件下載及安裝:
#MaxBin 最新版2.2.5
#下載地址 https://sourceforge.net/projects/maxbin/
#需要依賴軟件FragGeneScan idba bowtie2 hmmer
#MetaBAT 新版2.12.1
#下載地址https://bitbucket.org/berkeleylab/metabat/downloads/
#安裝 看README.txt 略
運行分箱:
MaxBin時間花費更多,因此,在下面分析中,采取犧牲質量來換取速度:
- 這個項目的6個數據集只分析兩個,大多數分箱軟件依靠多個樣本分析以提高分箱的準確性,下面操作只抽取兩個數據。
- 限制MaxBin的最大化算法迭代次數(本次只迭代5次而不是50次),不過會對分箱質量造成一定影響,然而自己在具體實際做數據分析的時候不可以隨便這么做。
MaxBin:
MaxBin會考慮每個contig的read覆蓋度和四核苷酸頻率,以記錄每個bin的標志基因數量
$ls ~/mapping/*coverage.tab > abundance.list
$run_MaxBin.pl -contig ~/mapping/subset_assembly.fa -abund_list abundance.list -max_iteration 5 -out mbin
# coverage.tab文件,這個我在后面的分析中會提到。。
結果會得到一系列*.fasta按數字排列的文件,這就是預測的基因組bins
接著將所有bin文件鏈接起來,將文件名作為序列名
for file in mbin.*.fasta
do
num=${file//[!0-9]/}
sed -e "/^>/ s/$/ ${num}/" mbin.$num.fasta >> maxbin_binned.concat.fasta
done
MetaBAT:
這個軟件分箱考慮三個點:測序reads的覆蓋度(read coverage)、覆蓋度差異(coverage variance ),以及四堿基頻率
#統計congtig覆蓋度
ln -fs ~/mapping/*abundtrim*sorted.bam .
#運行
jgi_summarize_bam_contig_depths --outputDepth depth_var.txt *bam
metabat -i subset_assembly.fa -a depth_var.txt --verysensitive -o metabat -v > log.txt
#合并所有bin的結果
for file in metabat.*.fa
do
num=${file//[!0-9]/}
sed -e "/^>/ s/$/ ${num}/" metabat.$num.fa >> metabat_binned.concat.fasta
done
#生成bin編號注釋文件
echo label > metabat_annotation.list
grep ">" metabat_binned.concat.fasta |cut -f2 -d ' '>> metabat_annotation.list
可視化結果:
有了MaxBin, MetaBin 的結果,需要做質量評估,一般用CheckM,還可以用VizBin。
VizBin有 OSX, Linux, Windows 多個版本的,可自行選擇,要求java (>7.0)
用Salmon評估基因豐度
salmon是一款快速轉錄組計數軟件,與Kallisto、Sailfish類似,可以不用通過mapping獲得基因的counts值。Salmon的結果可由edgeR/DESeq2等進行counts值的下游分析。
下面用它來計算預測蛋白質區的相對豐度分布。
軟件安裝與使用:
#最新版 0.12.0 下載地址
https://github.com/COMBINE-lab/salmon/releases/download/v0.12.0/salmon-0.12.0_linux_x86_64.tar.gz
準備文件:需要prokka注釋的結果文件“.ffn”,“.gff”,“.tsv”,以及過濾后的雙端reads文件。ffn文件即cds序列文件。Salmon需要雙端文件在兩個文件里面,也就是 pe1,pe2是當個文件,如果在一個文件里面,可以自己寫腳本拆分,或者用推薦的khmer 中的split-paired-reads.py 處理,可用pip安裝
Salmon建索引:
salmon index -t metagG.ffn -i transcript_index --type quasi -k 31
基于參考序列對reads進行定量:
for file in *.pe.1.fq
do
tail1=.abundtrim.subset.pe.1.fq
tail2=.abundtrim.subset.pe.2.fq
BASE=${file/$tail1/}
salmon quant -i transcript_index --libType IU \
-1 $BASE$tail1 -2 $BASE$tail2 -o $BASE.quant;
done
注意:–libType 參數需要在兩個reads文件之前
結果會生成一批以樣本名為開頭的目錄和文件,查看一下文件
find . SRR1976948.quant -type f
每個目錄下的quant.sf 文件就是相對表達信息,文件第一列為轉錄本名稱,第4列為標準化的相對表達值TPM。
下載腳本合并:
curl -L -O https://raw.githubusercontent.com/ngs-docs/2016-metagenomics-sio/master/gather-counts.py
python2 ./gather-counts.py
會生成一系列 .counts 的文件,我只測試了一個樣品:
transcript count
OGOKDOAG_00001 8.924135
OGOKDOAG_00002 16.883935
OGOKDOAG_00003 4.567547
OGOKDOAG_00004 6.574553
OGOKDOAG_00005 14.630552
OGOKDOAG_00006 2.207686
OGOKDOAG_00007 15.959923
合并所有的counts文件為豐度矩陣 :
for file in *counts
do
name=${file%%.*}
sed -e "s/count/$name/g" $file > tmp
mv tmp $file
done
paste *counts |cut -f 1,2,4 > Combined-counts.tab
結果就得到基因豐度矩陣了
可視化
等待更新.....