对齐匹配序列

时间:2013-09-09 00:07:00

标签: python bioinformatics

我正在尝试根据前5个和后5个字符对齐匹配序列。所以,例如:

AAATGCEGAIRPVOGJKKK
KKKTGKAFKEJWKLJFFFF
FFFKEJFWKFJWEKFJIGK

将对齐并连接以创建:

AAATGCEGAIRPVOGJKKKTGKAFKEJWKLJFFFFKEJFWKFJWEKFJIGK 

请注意,映射区域不应该重复。我实际上有超过3行,并且它们没有排序,因此我尝试创建一个循环以将它们对齐在一起。我不确定解决这个问题的最佳方法。

1 个答案:

答案 0 :(得分:1)

我认为你可以通过制作前缀字典来解决这个问题。一旦你拥有它,从任意序列开始,并找到它的后缀在前缀列表中。然后转到具有该前缀的序列,构建一个链。

以下是一些代码:

def make_circular_overlapping_sequence(sequences, min_overlap=1, max_overlap=5):
    # start by mapping prefixes to full sequences
    prefixes = {}
    for seq in sequences:
        for length in range(min_overlap, max_overlap+1):
            prefixes[seq[:length]] = seq

    # pick arbitrary a start sequence
    start = current = sequences[0]

    # build a chain of sequences with overlapping suffixes and prefixes
    chain = [start]
    while True:
        # try longest suffixes first
        for length in range(max_overlap, min_overlap-1, -1):
            suffix = current[-1-length:]
            if suffix in prefixes:
                current = prefixes[suffix]
                if current == start: # looped around, so we're done
                    return "".join(chain)
                chain.append(current[length+1:]) # don't duplicate the prefix
                break
        else: # for loop ended without breaking
            raise ValueError("No match found for sequence {!r}"
                             .format(current))

测试输出:

>>> sequences = '''AAATGCEGAIRPVOGJKKK
KKKTGKAFKEJWKLJFFFF
FFFKEJFWKFJWEKFJIGK
GKXYZ1234AAAT'''.split()
>>> make_circular_overlapping_sequence(sequences)
'AAATGCEGAIRPVOGJKKKTGKAFKEJWKLJFFFFKEJFWKFJWEKFJIGKXYZ1234AAAT'

注意:

  1. 此代码适用于明确的循环序列,如果存在不明确的匹配(例如"...ABC"可能后跟"ABC...""BC..."),则可能无法正常工作。目前它总是选择最长的重叠。
  2. 如果链没有循环结束,代码会引发异常,但如果有一个不包含start元素的短循环(例如["A...B", "B..C", "C..B"]),它可能会永远运行。
  3. 算法不保证所有输入序列都包含在输出中。它只是找到一个循环并停止。
  4. 不会删除第一个和最后一个值的匹配部分。如果您不想这样,我建议将最终后缀切换为返回值:return "".join(chain)[:-length]