Python: множественные консенсусные последовательности

Начиная со списка последовательностей днк, я должен иметь взамен все возможные согласованные (результирующие последовательности с самой высокой частотой нуклеотидов в каждой позиции) последовательностей. Если в некоторых положениях нуклеотиды имеют одинаковую наивысшую частоту, я должен получить все возможные комбинации с наивысшей частотой. Я также должен иметь в ответ матрицу профиля (матрицу с частотами каждого нуклеотида для каждой последовательности).

Пока это мой код (но он возвращает только одну согласованную последовательность):

seqList = ['TTCAAGCT','TGGCAACT','TTGGATCT','TAGCAACC','TTGGAACT','ATGCCATT','ATGGCACT']
n = len(seqList[0])
profile = { 'T':[0]*n,'G':[0]*n ,'C':[0]*n,'A':[0]*n }

for seq in seqList:

    for i, char in enumerate(seq):
        profile[char][i] += 1



consensus = ""
for i in range(n):
    max_count = 0
    max_nt = 'x'
    for nt in "ACGT":
        if profile[nt][i] > max_count:
            max_count = profile[nt][i]
            max_nt = nt
    consensus += max_nt
print(consensus)
for key, value in profile.items():
     print(key,':', " ".join([str(x) for x in value] ))

TTGCAACT
C : 0 0 1 3 2 0 6 1
A : 2 1 0 1 5 5 0 0
G : 0 1 6 3 0 1 0 0
T : 5 5 0 0 0 1 1 6

(Как видите, в четвертой позиции C и G имеют одинаковый наивысший балл, это означает, что я должен получить две согласованные последовательности)

Можно ли изменить этот код, чтобы получить все возможные последовательности, или не могли бы вы объяснить мне логику (псевдокод), как получить правильный результат?

Заранее большое спасибо!

1 ответ

Решение

Я уверен, что есть лучшие способы, но это простой:

bestseqs = [[]]
for i in range(n):
    d = {N:profile[N][i] for N in ['T','G','C','A']}
    m = max(d.values())
    l = [N for N in ['T','G','C','A'] if d[N] == m]
    bestseqs = [ s+[N] for N in l for s in bestseqs ]

for s in bestseqs:
    print(''.join(s))

# output:
ATGGAACT
ATGCAACT
Другие вопросы по тегам