如何使用Python根据BED文件格式更改坐标格式?

时间:2015-07-06 06:13:00

标签: python bioinformatics fasta

我有两个fasta文件,我希望将FileB.fasta中的较短序列与FileA.fasta中的原始序列进行匹配,以获取其坐标或位置。但我的输出格式不正确。谁能帮我?

FileA.fasta

>chr1:2000-2019
ACGTCGATCGGTCGACGTGC

FileB.fasta

>chr1:2000-2019
GATCGG

FileC.bed

chr1:2000-2019 6 11

代码

from Bio import SeqIO
output_file = open('fileC.bed','w')
for long_sequence_record in SeqIO.parse(open('fileA.fasta'), 'fasta'):
    long_sequence = str(long_sequence_record.seq)
    for short_sequence_record in SeqIO.parse(open('fileB.fasta'), 'fasta'):
        short_sequence = str(short_sequence_record.seq)
        if short_sequence in long_sequence:
            start = long_sequence.index(short_sequence) + 1
            stop = start + len(short_sequence) - 1
           # print short_sequence_record.id, start, stop
            output_line ='%s\t%i\t%i\n' % \
            (short_sequence_record.id,start,stop)
            output_file.write(output_line )
output_file.close()

FileC.bed的理想输出

chr1 2005 2011

2 个答案:

答案 0 :(得分:2)

嗯,你正在为索引添加1,找到更短的序列 -

start = long_sequence.index(short_sequence) + 1 <--- notice the +1
不要这样做,应该没问题。另请注意,-1变量不要stop

您应该从id中添加起始序列号。

示例 -

start = long_sequence.index(short_sequence) + int((short_sequence_record.id.split(':')[1].split('-')[0]))
stop = start + len(short_sequence)

对于记录的id,如果您在:之前不需要任何内容​​,那么您应该将ID分割为:并取左侧部分(分割后为0索引字符串) )。

示例 -

output_line ='%s\t%i\t%i\n' % \
        ((short_sequence_record.id.split(':')[0]),start,stop)
        output_file.write(output_line )

答案 1 :(得分:1)

更通用的解决方案:

  1. 获取您的参考序列数据,并使用relevant UCSC Kent Tools使其准备好BLAT。
  2. 执行BLAT search以将短查询字符串与参考数据对齐并获取PSL文件。
  3. Convert the PSL output到BED。