我想修改 FASTA 文件的序列。我的 FASTA 包含人类基因组(每个染色体的序列),其 id 为>1
、、>2
... >22
、>X
、和。>Y
>MT
>GL000207.1
我想在每个染色体序列中引入的修改(突变)位于 CSV 文件中。此处显示了一个示例:
chrom;position;ref;var;Gene;VAR
1;21424;C;T;WASH7P;snp.LOH
1;33252099;CACATGCATGACTATTCCTAGCC;-;YARS;indel_somatic
5;107061668;-;GT;EFNA5(dist=55072),FBXL17(dist=133066);indel_somatic
22;22677038;G;C;BMS1P20;snp_somatic
MT;16093;T;C;NONE(dist=NONE),NONE(dist=NONE);snp.LOH
X;22012649;-;T;SMS;indel_somatic
其中每一行描述了染色体编号,即在染色体上找到 snp/indel 的位置。接下来的两列表示参考核苷酸和必须插入到 FASTA 文件中的突变。这种修饰可以是取代、缺失(多于一个核苷酸)或插入(多于一个核苷酸)。最后两列并不重要。输出应该是带有突变的新 FASTA。
我创建了以下脚本。我知道我离我想做的还很远......我会努力改进,但与此同时,如果有人可以提供一些建议,那将非常受欢迎。
from bisect import bisect_right
from collections import defaultdict
from Bio import SeqIO
from Bio.Seq import MutableSeq
from Bio.Alphabet import IUPAC
import csv
def line_to_snp(line):
row = line.split(";")
return row[0], int(row[1]), row[2], row[3], row[4], row[5]
with open('Modified_build.fasta', 'w') as f1:
reference = SeqIO.read("human_g1k_v37.fasta", "fasta")
datafile = open('snp_all.csv', 'r')
snp = line_to_snp(line)
for seq_record in SeqIO.parse(reference):
mutable_seq = MutableSeq (reference, IUPACUnambigousDNA())
if snp[0] == seq_record.id:
mutable_seq[snp[1]] = snp[3]
f1.write(seq_id)
f1.write(seq_record)