SILVA、GREENGENES、RDP三大數據庫的序列探索統計
- 2020 年 3 月 3 日
- 筆記
最近對16s的三大數據庫的序列的具體序列情況挺好奇的,決定統計一下各個序列的長度分佈情況,以及這些序列具體分佈在哪幾個V區,有助於我解決後面16So數據的問題。還是用上我三腳貓的功夫,開始今天 的探索,沒有人探索的事情,還是挺開心的。
1.統計序列長度分佈情況
01 #獲得長度列表文件 02 length_list = [] 03 with open('current_Bacteria_unaligned.fa') as f: 04 flag = 0 05 length = 0 06 for line in f: 07 if line.startswith('>'): 08 flag = 1 09 if length != 0: 10 #print(length) 11 length_list.append(length) 12 #break 13 length = 0 14 else: 15 length = 0 16 elif flag == 1: 17 length +=len(line) 18 19 fout = open('length_table.txt', 'w') 20 for a in length_list: 21 fout.write(str(a) + 'n') 22 fout.close() 01 #統計長度區間分佈 02 length_150 = 0 03 length_300 = 0 04 length_600 = 0 05 length_1300 = 0 06 length_1300_ = 0 07 with open('length_table.txt') as f: 08 for line in f: 09 if 0 < int(line.strip()) <= 150: 10 length_150 += 1 11 elif 150 < int(line.strip()) <= 300: 12 length_300 += 1 13 elif 300 < int(line.strip()) <= 600: 14 length_600 += 1 15 elif 600 < int(line.strip()) <= 1300: 16 length_1300 += 1 17 elif int(line.strip()) > 1300: 18 length_1300_ += 1 19 print('150以內:', length_150,'n', 20 '150-300:', length_300, 'n', 21 '300-600:', length_600, 'n', 22 '600-1300:', length_1300,'n', 23 '1300-:', length_1300_) 1 #最後結果 2 150以內: 0 3 150-300: 0 4 300-600: 617,554 5 600-1300: 1,063,377 6 1300-: 1,515,109
我也可視化一下:
更正一下,這裡用的是RDP數據庫,之前由於Silva數據庫用的是不兼容的14級分類系統而沒採用。

從圖中可以看出,大部分序列還是集中在600以上。
接着是greengenes數據庫,這個數據庫雖然序列較少,但是長度大部分集中在1300+,質量較高,就是好久沒更新過了。 150以內: 0 150-300: 0 300-600: 0 600-1300: 895 1300-: 1262090


2.統計V區分佈情況
從一個公眾號得到的一張分佈圖是這樣的,




我想確定的是序列都包含在哪個或者哪兩個區。花了好大有力氣,才把代碼理好,效率應該還是比較低的,但是,對於我來說
001 import re 002 003 dic ={} 004 v1f = re.compile('GGATCCAGACTTTGATYMTGGCTCAG', re.I) 005 v3f = re.compile('CCTA[CT]GGG[AG][GTC]GCA[CG]CAG', re.I) 006 v4f = re.compile('GTG[CT]CAGC[AC]GCCGCGGTAA', re.I) 007 v4r = re.compile('ATTAGA[AT]ACCC[CTG][ATGC]GTAGTCC', re.I) 008 v6f = re.compile('AACGCGAAGAACCTTAC', re.I) 009 v8f = re.compile('CGTCATCC[AC]CACCTTCCTC', re.I) 010 vr = re.compile('AAGTCGTAACAAGGTA[AG]CCGTA', re.I) 011 #v4r = re.compile('GGACTAC[ATGC][ACG]GGGT[AT]TCTAAT', re.I) 012 vf = re.compile('AG[AG]GTT[CT]GAT[CT][AC]TGGCTCAG', re.I) 013 #vr = re.compile('GACGGGCGGTG[AT]GT[AG]CA', re.I) 014 #seq_list = [] 015 016 017 def decide_which_zone(f1, f3, f4, f4r, f6, f8, f, fr): 018 type = [f1, f3, f4, f4r, f6, f8, f, fr] 019 type_str = ['f1', 'f3', 'f4', 'f4r', 'f6', 'f8', 'f', 'fr'] 020 type_name = [] 021 for i in range(len(type)): 022 #print(type[i]) 023 if type[i] != None : 024 type_name.append(type_str[i]) 025 else: 026 continue 027 if i + 1 < len(type): 028 if type[i + 1] != None and type_str[i + 1] not in type_str: 029 type_name.append(type_str[i + 1]) 030 else: 031 continue 032 if i + 2 < len(type): 033 if type[i + 2] != None and type_str[i + 2] not in type_str: 034 type_name.append(type_str[i + 2]) 035 else: 036 continue 037 if i + 3 < len(type): 038 if type[i + 3] != None and type_str[i + 3] not in type_str: 039 type_name.append(type_str[i + 3]) 040 else: 041 continue 042 if i + 4 < len(type): 043 if type[i + 4] != None and type_str[i + 4] not in type_str: 044 type_name.append(type_str[i + 4]) 045 else: 046 continue 047 if i + 5 < len(type): 048 if type[i + 5] != None and type_str[i +5 ] not in type_str: 049 type_name.append(type_str[i + 5]) 050 else: 051 continue 052 if i + 6 < len(type): 053 if type[i + 6] != None and type_str[i + 6] not in type_str: 054 type_name.append(type_str[i + 6]) 055 else: 056 continue 057 if i + 7 < len(type): 058 if type[i + 7] != None and type_str[i + 7] not in type_str: 059 type_name.append(type_str[i + 7]) 060 else: 061 continue 062 return type_name 063 064 with open('current_Bacteria_unaligned.fa') as f: 065 li = ['f1', 'f3', 'f4', 'f4r', 'f6', 'f8', 'f', 'fr'] 066 for i in range(len(li)): 067 for j in range(len(li)): 068 if i <= j: 069 dic[li[i] + li[j]] = 0 070 071 072 #print(dic) 073 flag = 0 074 seq = '' 075 #i = 0 076 for line in f: 077 if line.startswith('>'):# and i <=2: 078 flag = 1 079 if seq != '': 080 #print(seq) 081 f1 = v1f.search(seq) 082 f4r = v4r.search(seq) 083 f3 = v3f.search(seq) 084 f4 = v4f.search(seq) 085 f6 = v6f.search(seq) 086 f8 = v8f.search(seq) 087 f = vf.search(seq) 088 fr = vr.search(seq) 089 #seq_list.append(length) 090 type_name = [] 091 type_name = decide_which_zone(f1, f3, f4, f4r, f6, f8, f, fr) 092 print(type_name) 093 if type_name != []: 094 type_key = type_name[0] + type_name[-1] 095 dic[type_key] += 1 096 #i += 1 097 #break 098 seq = '' 099 flag = 0 100 else: 101 seq = '' 102 elif flag == 1: 103 seq += line.strip() 104 print(dic) 105 #運行結果 106 {'f1f1': 0, 'f1f3': 0, 'f1f4': 1, 'f1f4r': 0, 'f1f6': 0, 'f1f8': 0, 'f1f': 0, 'f1fr': 0, 'f3f3': 120867, 'f3f4': 143686, 'f3f4r': 356027, 'f3f6': 400108, 'f3f8': 4, 'f3f': 171637, 'f3fr': 53716, 'f4f4': 17211, 'f4f4r': 71719, 'f4f6': 40223, 'f4f8': 4, 'f4f': 13185, 'f4fr': 3646, 'f4rf4r': 39537, 'f4rf6': 45160, 'f4rf8': 0, 'f4rf': 977, 'f4rfr': 4263, 'f6f6': 43983, 'f6f8': 0, 'f6f': 64, 'f6fr': 2300, 'f8f8': 0, 'f8f': 0, 'f8fr': 0, 'ff': 1670, 'ffr': 26, 'frfr': 3678}

上圖依然是RDP數據庫,前面標錯了。應該是某個地方出了問題,序列不全,少了估計有一半。不過趨勢還是比較明顯的,V3-V4是最多的,這也是前些年主流的研究的測序方式。

