Nanopore 16S測序數據分析流程之blast/last

最近有朋友和我交流納米孔16S測序數據的分析,發現真的沒有從頭完成過一次這方面的數據分析,然後發現這方面的資料也比較少,於是學習一下,和大家分享。坦白說,牛津納米孔測序技術在16S多樣性研究方面還是有些不足的,只能說勉強夠用,主要應用場景是在一些現場快速檢測方面,主要是病原菌這種。但是,相信隨着測序準確度的提高和分析軟件的改進,相信它的應用會越來越多。感謝互聯網的便利和分享精神,今天的我們可以方便地獲得測序的原始數據,並可以自由進行分析。

1.軟件和數據準備

處理牛津納米孔的測序數據,首先當然要安裝相關的專用軟件了,基本上原廠出的,原廠品質,放心!還有就是minimap2和yacrd,用於去嵌合。數據來自一篇文章,文件不大,直接下載或者ascp下載均可。

#這個流程可參考https://github.com/tetedange13/stage_M2BI_scripts
#軟件準備
#首先是NanoPlot,用於檢測測序質量,直接pip安裝了,加速的話可使用清華源
pip install NanoPlot 
#去接頭的Porechop
git clone https://github.com/rrwick/Porechop.git
cd Porechop
python3 setup.py install
porechop -h 
#質控的NanoFilt,pip或bioconda安裝
pip install nanofilt
#minimap2,編譯或者下載預編譯的二進制文件均可,這裏編譯
git clone https://github.com/lh3/minimap2
cd minimap2 && make
#yacrd,conda安裝
conda install yacrd
#獲取數據,我是ascp下載
/Volumes/10.11/Users/zd200572/Applications/Aspera\ Connect.app/Contents/Resources/ascp -i ~/asperaweb_id_dsa.openssh -Tr -Q -l 100M -P33001 -L- [email protected]:vol1/fastq/ERR277/007/ERR2778177/ERR2778177.fastq.gz .
#比對工具last,一款來自日本的比對軟件,需要編譯
wget http://last.cbrc.jp/last-1060.zip
unzip last-1060.zip
cd last-1060
make
#blast diamond seqkit
conda install -c bioconda diamond blast seqkit
#如果wget或者瀏覽器下載地址是wget http://ftp.ebi.ac.uk/vol1/fastq/ERR277/007/ERR2778177/ERR2778177.fastq.gz
#ncbi的16S數據庫,由於出國網絡差,下了好久,一定要確保數據下載完整,注意下載時勾選gi號,以備後面有用
#https://www.ncbi.nlm.nih.gov/nuccore?term=33175%5BBioProject%5D
#這裏我把這個文件存在了網盤,公衆號內回覆“16S”即可獲得下載地址

2.數據預處理

基本上是質控的過程,先看下測序質量,當然納米孔的質量還是有點低的,特別是手上下載的數據是低版本的測序芯處R9.4,未來的R10可以通過兩個納米孔串聯提高到95%。接着就是去除測序的接頭,獲得真正的測序序列,是不是引物也應該切除?但是估計數據庫裏的序列也應該不包含引物,所以估計引物影響不大。然後,進行過濾,除去明顯不符合要求的序列。

#查看質量,fastq最常用,這裏用官方的試試
NanoPlot -t 4 --fastq ERR2778177.fastq.gz --plots hex dot

結果依然是類似於fastq質控報告的一個函數,不過統計指標少了幾個,有兩個把reads長度和質量分佈放在一起的圖不錯。

img

#去接頭,4線程,這一步耗時以小時計,對於我的五年前的雙核心四線程筆記本 
porechop -t 4 -i input.fastq -o trimmed.fastq
# 質控,質量值爲9,長度200過濾,雖然有點低,這有兩個重定向
NanoFilt -q 9 -l 200 < trimmed.fastq > cleaned.fastq
#去嵌合,先minimap2自全局比對,發現嵌合,然後yacrd去除
minimap2/minimap2 -x ava-ont -g 500 cleaned.fastq cleaned.fastq > overlap.paf
yacrd -i overlap.paf -o report.yacrd -c 4 -n 0.4 scrubb -i cleaned.fastq  -o reads.scrubb.fq
#卡在這時間最長,主要幾個文件要準備,需要整理的已經放在文件夾,其餘的可以ncbi下載,較大,沒放,或者直接用我建好的。
#看下文件的保留情況,大概去除了一半以上的數據
tree -h | grep q
├── [237M]  ERR2778177.fastq.gz
├── [224M]  cleaned.fastq
├── [200M]  reads.scrubb.fq
└── [476M]  trimmed.fastq

3. last比對

關於納米孔16S的數據分析,之前翻譯的那篇綜述總結了大概有兩種,一種是和之前的16S數據分析一樣聚類ASV/OTU,但是由於90%左右的準確度,看有用85%的準確度聚類的。。。另一種就是,不聚類,直接進行比對,也就是我們這次學習的blast等比對工具的方法,根據綜述作者的觀點,這幾種工具由於不是專門爲納米孔測序數據設計,不能比較好的完成物種註釋的任務(不夠準確),作者推薦的是minimap2和centrifuge這兩個軟件。但是,有很大一部分文章是以這幾個工具進行數據分析的,我們也做一下,最後進行一個比較吧!

# 構建參考數據庫
last-1060/src/lastdb -uYASS -R01 microbialdb ncbi-16S.fasta
# 比對https://gigascience.biomedcentral.com/articles/10.1186/s13742-016-0111-z#Sec12
last-1060/src/lastal -P 4 -q 1 -b 1 -Q 0 -a 1 -e 45 microbialdb cleaned.fastq > aligned.maf
# 轉換成BLAST格式
last-1060/scripts/maf-convert blasttab aligned.maf > aligned.txt


### 4.結果處理,獲得物種丰度表

由於自己水平還不夠寫腳本從比對結果中獲得物種註釋,腳本基本上來自臺灣的那個同仁的。確切的說應該還是對比對結果的數據結構不夠熟悉,爭取後面多熟悉些。爲了實現使用他的腳本,對數據庫的信息進行了一些小的提取操作,用我暫時用得比較順手的python完成的。我已經把處理好的數據上傳了百度雲,直接使用的話可以略過。

--------------我是分界線的開始-----------

`cat ncbi-16S.fasta | grep ">" > conv.txt #先獲得序列名信息備用`

```python
dic_fa = {}
i = 0
with open('conv.txt') as f:
	for line in f:
		i += 1
		if line.strip() != '':
			ac_n = line.strip().split('|')[3]
			gi_n = line.strip().split('|')[1]
			dic_fa[ac_n] = ''
			dic_fa[ac_n] = [gi_n, line.strip()]
print(i)

j = 0
fout = open('info.txt', 'w')
with open('sequence.gb') as f1:
	for line in f1:
		if line[:7] == "VERSION":
			seq_name = line.strip().split('     ')[1].split('  ')[0]
		if '/db_xref="taxon:' in line:
			tax_id = line.strip().split('/db_xref="taxon:')[1].split('"')[0]
			if seq_name in dic_fa.keys():
				fout.write(dic_fa[seq_name][1] + '\t' + tax_id + '\n') #+ seq_name + '\n')
			seq_name = ''
			tax_id = ''
			j += 1
print(j)

fout.close()

--------------我是分界線的結束-----------

# 加載包,第一次看到這樣的方式
suppressMessages(library(data.table))
suppressMessages(library(tidyverse))
# 設置文件位置
id_mapping_file <- "/Volumes/Data/Biodata/Nanopore-16S/info.txt"
blastOutputs <- "/Volumes/Data/Biodata/Nanopore-16S/aligned.txt"
#導入輸入文件
id_mapping <- fread(id_mapping_file, header = FALSE, sep = "\t", stringsAsFactors = FALSE)
setkey(id_mapping, V1)

blastoutput <- fread(blastOutputs, header = FALSE, sep = "\t", stringsAsFactors = FALSE)
blastoutput_filtered <- blastoutput %>% 
  dplyr::filter(V3>=90 & V4>=700) %>% 
  group_by(V1) %>% 
  dplyr::filter(V3 == max(V3)) %>% 
  dplyr::filter(V12 == max(V12))
allreadsnum <- length(unique(blastoutput$V1))
readStats <- table(blastoutput_filtered$V2)
refseqIds <- names(readStats)
df <- data.frame(RefseqID = refseqIds, 
                 Lineage = NA, 
                 ReadsNum = NA, 
                 OrgName = NA, 
                 ReadsPerc = NA)
#循環獲得信息
for (i in 1:length(refseqIds)) {
  refseqid <- refseqIds[i]
  tmp <- id_mapping[.(refseqid)]
  lineage <- tmp$V3
  orgname <- tmp$V4
  readnum <- readStats[refseqid]
  perc <- readnum*100/allreadsnum
  df$Lineage[i] <- lineage
  df$ReadsNum[i] <- readnum
  df$ReadsPerc[i] <- perc
  df$OrgName[i] <- orgname
}

taxonomy <- paste(df$Lineage, df$OrgName, sep="; ")
output_df <- data.frame(Taxonomy = taxonomy, ReadsNumber = df$ReadsNum)
output_df <- aggregate(output_df$ReadsNumber, 
                       by = list(Taxonomy=output_df$Taxonomy), 
                       FUN = sum)
colnames(output_df)[2] <- "ReadsNumber"
ReadPercentage <- output_df$ReadsNumber*100/allreadsnum
output_df <- cbind(output_df, ReadPercentage)
output_df <- output_df[order(output_df$ReadPercentage, decreasing = TRUE),]
#output <- paste0("tax_", sub("\\.\\/Alignment\\/", "", file))
write.table(output_df, 'out.txt', sep = "\t", row.names = FALSE, quote = FALSE)

最後,如果順利,就是結果了:

Taxonomy ReadsNumber ReadPercentage
266 Trichocoleus desertorum strain ATA4-8-CV2 1046 41.85674270
159 Neosynechococcus sphagnicola strain sy1 248 9.92396959
267 Tychonema bourrellyi strain CCAP 1459/11B 110 4.40176070
111 Kastovskya adunca strain ATA6-11-RM4 104 4.16166467
168 Okeania plumata strain FK12-27 74 2.96118447
120 Loriellopsis cavernicola strain LF-B5 53 2.12084834
40 Cephalothrix komarekiana CCIBt 3277 42 1.68067227
33 Caedimonas varicaedens strain 221 41 1.64065626
12 Aliterella antarctica strain CENA408 33 1.32052821
118 Limnoraphis robusta strain CCALA 966 31 1.24049620
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章