Python 对齐匹配序列

Python 对齐匹配序列,python,bioinformatics,Python,Bioinformatics,我试图根据前5个字符和后5个字符对齐匹配序列。例如: AAATGCEGAIRPVOGJKKK KKKTGKAFKEJWKLJFFFF FFFKEJFWKFJWEKFJIGK 将对齐并连接以创建: AAATGCEGAIRPVOGJKKKTGKAFKEJWKLJFFFFKEJFWKFJWEKFJIGK 请注意,映射区域不应重复。实际上,我有3条以上的线,它们没有排序,因此我尝试创建一个循环,将所有线对齐在一起。我不确定最好的方法 我想你可以通过制作前缀词典来解决这个问题。一旦你有了它,从一个任

我试图根据前5个字符和后5个字符对齐匹配序列。例如:

AAATGCEGAIRPVOGJKKK
KKKTGKAFKEJWKLJFFFF
FFFKEJFWKFJWEKFJIGK
将对齐并连接以创建:

AAATGCEGAIRPVOGJKKKTGKAFKEJWKLJFFFFKEJFWKFJWEKFJIGK 

请注意,映射区域不应重复。实际上,我有3条以上的线,它们没有排序,因此我尝试创建一个循环,将所有线对齐在一起。我不确定最好的方法

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

下面是一些代码:

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'
注:

  • 此代码适用于明确的循环序列,如果存在不明确的匹配项(例如,
    “…ABC”
    ,后面可能跟有
    “ABC…”
    “BC…”
    ),则可能无法按需工作。目前,它总是选择最长的重叠
  • 如果链结束时没有循环,则代码会引发异常,但如果存在不包含起始元素的短循环(例如
    [“a…B”,“B…C”,“C…B”]
    ),则代码可能会永远运行
  • 该算法不能保证所有的输入序列都包含在输出中。它只是找到一个循环并停止
  • 不会修剪第一个值和最后一个值的匹配部分。如果您不想这样做,我建议将返回值的最后一个后缀切掉:
    return”“。join(chain)[:-length]

  • 我想你可以通过编一本前缀词典来解决这个问题。一旦你有了它,从一个任意的序列开始,找到它的后缀在前缀列表中。然后转到具有该前缀的序列,构建链

    下面是一些代码:

    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'
    
    注:

  • 此代码适用于明确的循环序列,如果存在不明确的匹配项(例如,
    “…ABC”
    ,后面可能跟有
    “ABC…”
    “BC…”
    ),则可能无法按需工作。目前,它总是选择最长的重叠
  • 如果链结束时没有循环,则代码会引发异常,但如果存在不包含起始元素的短循环(例如
    [“a…B”,“B…C”,“C…B”]
    ),则代码可能会永远运行
  • 该算法不能保证所有的输入序列都包含在输出中。它只是找到一个循环并停止
  • 不会修剪第一个值和最后一个值的匹配部分。如果您不想这样做,我建议将返回值的最后一个后缀切掉:
    return”“。join(chain)[:-length]

  • 你总是从第一行开始吗?如果没有,您如何选择从哪个序列开始?如果有多个匹配的可能性,该怎么办?如果没有呢?还有,你怎么处理那些不匹配的序列呢。或者,如果你有一个序列与其他10个序列相匹配呢?有什么方法可以确定你的序列偏好吗?我认为如果你使用暴力的话,
    re
    就太过分了。使用
    startswith
    endswith
    字符串方法会更有效。您总是从第一行开始吗?如果没有,您如何选择从哪个序列开始?如果有多个匹配的可能性,该怎么办?如果没有呢?还有,你怎么处理那些不匹配的序列呢。或者,如果你有一个序列与其他10个序列相匹配呢?有什么方法可以确定你的序列偏好吗?我认为如果你使用暴力的话,
    re
    就太过分了。使用
    startswith
    endswith
    字符串方法会更有效。