我需要帮助完成这个生物信息学计划

时间:2017-04-15 11:52:46

标签: python bioinformatics fasta blast

我需要创建一个程序,它可以获取一些名为fasta文件的文本文件并将其转换为sequence_name,Domain_names,Domain of Domain,End Of Domain。

因此,fasta文件只是一个看起来像这样的文本文件

>MICE_8
ATTCGATCGATCGATTTCGATCGATCGATCGATCGGGATCGATCGATCGATCGATC
>MICE_59 
ATTTTTCGGCATCGATAGCTAGCTAGCTAG

我的程序需要一个命令参数,这是一个fasta的文件名,并给出一个这样的输出:

MICE_8 gnl|CDD|256537 819 923 gnl|CDD|260076 111 189 gnl|CDD|260056 4 93                                          
MICE_59

这里是输出的描述以获取更多信息:

  • MICE_8是fasta文件中第一个序列的名称
  • gnl | CDD | 256537是第一个蛋白质结构域的名称
  • 819这是域名统计
  • 923这就是它结束的地方
  • gnl | CDD | 260076是第一个序列的第二个蛋白质结构域的名称,依此类推,从111开始,到第189位结束。

此外,由于最后一个序列没有得到命中,程序仍然需要显示序列的名称。

好的,所以这是我到目前为止的代码以及到目前为止输出的内容

import sys
import os

fastaname = sys.argv[1]
rpsblastname = "rpsblast.out"

cmd = "rpsblast+ -db /home/bryan/data/cdd/cdd -query %s -outfmt 6 -evalue 0.05 > %s" % (fastaname,rpsblastname)
os.system(cmd)

handle = open(rpsblastname, "r")
seqname = ""
for line in handle:
    linearr = line.split()
    # seqname = linearr [0]
    domain = linearr[1]
    start = linearr[6]
    end = linearr[7]
    # If sequence name is the same as last time, don't print it
    if seqname == linearr[0]:
        sys.stdout.write("%s %s %s" % (domain, start, end))
    # Otherwise do print the sequence name, and update seqname
    else:
        seqname = linearr[0]
        print
        sys.stdout.write("%s %s %s %s" % (seqname,domain,start,end))

这是我的输出到目前为止的样子:

mel@roswald:~$ ./Domainfinder.py bioinformation.fasta 

MICE_8 gnl|CDD|256537 819 923gnl|CDD|260076 111 189gnl|CDD|260056 4 93                                                                                                         

我创建的程序几乎达到了要求的规格。 *只有3个需要解决的问题:

  1. 我运行程序和结果之间有一个额外的空间
  2. 我的程序没有写出命中零的序列的名称
  3. 我的程序没有用空格分隔域名。
  4. 正确的输出应该如下所示

    mel@roswald:~$ ./Domainfinder.py bioinformation.fasta                                        
    MICE_8 gnl|CDD|256537 819 923 gnl|CDD|260076 111 189 gnl|CDD|260056 4 93                                          
    MICE_59
    

1 个答案:

答案 0 :(得分:0)

解决了这个问题。主要需要做的是使用字典将序列名称保存为键而不是使用列表。由于字典是随机的,我们需要能够从字典中创建一个列表,以便在读取时对序列名称进行排序。我们还从rpsblast中提取序列名称。如果有人有任何问题请随时下午。