【问题标题】:Looking for the shared motif between several sequences寻找几个序列之间的共享主题
【发布时间】:2017-02-28 03:19:51
【问题描述】:

我需要编写一个脚本,该脚本将遍历序列列表,找到它们之间的共享主题(不同的主题可能存在多个解决方案)并打印所有序列之间共享的这个主题。

在下面的例子中

chains = ['GATTACA', 'TAGACCA', 'ATACA']

AT 是共享主题之一。我将感谢此类任务的任何解决方案,包括使用 BioPython 函数。

最近我制作了一个脚本,它为较短的序列设置了相同的循环集,将其设置为参考,然后尝试在其他链的每个位置找到这个参考序列。但是我真的不知道如何在不定义参考的情况下找到共享主题

# reference
xz=" ".join(chains)
ref= min(xz.split(), key=len)


# LOOKING FOR THE MOTIFS
for chain in chains:
    for i in range(len(chain)):
        if chain==ref:
            pass
        elif ref not in chain:
            print "%s has not been found in the  %s"%(ref, chain)
            break
        elif chain[i:].startswith(ref):
            print "%s has been detected in %s in the %d position" %(ref, chain, i+1)

【问题讨论】:

标签: python sequence bioinformatics


【解决方案1】:

这只是一个快速的想法。你必须改进它,因为它几乎搜索所有空间。我希望它会有所帮助。

def cut_into_parts(chain, n):
    return [chain[x:x+n] for x in range(0, len(chain)-n)]

def cut_chains(chains, n):
    rlist = []
    for k,v in enumerate(chains):
        rlist.extend(cut_into_parts(chains, n))
    return rlist

def is_str_common(str, chains):
    for k,v in enumerate(chains):
        if !chains[k].contains(str):
            return false
    return true

def find_best_common(chains):
    clist = []
    for i in inverse(range(0, len(chains)))://inverse - I dont remmeber exactly the name of func
        clist.extend(cut_chains(chains, i))
    for k, v in enumerate(clist):
        return is_str_common(clist[k], chains)

【讨论】:

    【解决方案2】:

    最简单的方法是从最长公共子串不能长于我们正在查看的最短串的认识开始。还应该很明显,如果我们从可能的最长候选者开始,并且在消除较长的候选者之后只检查较短的候选者,那么我们可以在找到公共子串时立即停止。

    因此,我们首先按长度对 DNA 字符串进行排序。我们将最短的长度称为l。然后程序是测试它的子串,从长度为l的单个子串开始,然后是长度为l-1的两个子串,以此类推,直到找到匹配并返回。

    from Bio import SeqIO
    
    def get_all_substrings(iterable):
        s = tuple(iterable)
        seen = set()
        for size in range(len(s)+1, 1, -1):
            for index in range(len(s)+1-size):
                substring = iterable[index:index+size]
                if substring not in seen:
                    seen.add(substring)
                    yield substring
    
    def main(input_file, return_all=False):
        substrings = []
        records = list(SeqIO.parse(open(input_file),'fasta'))
        records = sorted(records, key=lambda record: len(str(record.seq)))
        first, rest = records[0], records[1:]
        rest_sequences = [str(record.seq) for record in rest]
        for substring in get_all_substrings(str(first.seq)):
            if all(substring in seq for seq in rest_sequences):
                if return_all:
                    substrings.append(substring)
                else:
                    return substring
        return substrings
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-08
      • 2016-12-09
      • 2018-07-19
      • 2016-11-12
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多