Поиск переменного аминокислотного мотива в наборе данных fasta - PullRequest
0 голосов
/ 30 апреля 2019

Мне нужно выяснить, в каких белках моего набора данных находится этот аминокислотный мотив: PoXGXXHyXHy.Я использую biopython и python 2.7, но я не совсем биоинформатик, и я застрял.Как мне сделать что-то вроде seq_record + 1 или что-то подобное?Я пытался использовать в диапазоне, но он не работал в SeqIO.parse.Ну, я сейчас в этом беспорядке, кто-нибудь может помочь, пожалуйста?Я был бы очень благодарен.

from Bio import SeqIO

print('enter the path to your fasta file: ' )
user_input = raw_input()

for seq_record in SeqIO.parse(user_input, "fasta"):

    aminoacids_count = len(seq_record)
    seq_record_trimmed = seq_record[aminoacids_count//2:aminoacids_count + 1]

    if 'R' or 'H' or 'K' or 'D' or 'E' or 'S' or 'T' or 'N' or 'Q' in seq_record_trimmed:
        if 'R' or 'H' or 'K' or 'D' or 'E' or 'S' or 'T' or 'N' or 'Q' or 'C' or 'U' or 'G' or 'P' or 'A' or 'V' or 'I' or 'L' or 'M' or 'F' or 'Y' or 'W' in seq_record_trimmed:
           if 'G' in seq_record_trimmed:
              if 'R' or 'H' or 'K' or 'D' or 'E' or 'S' or 'T' or 'N' or 'Q' or 'C' or 'U' or 'G' or 'P' or 'A' or 'V' or 'I' or 'L' or 'M' or 'F' or 'Y' or 'W' in seq_record_trimmed:
                if 'R' or 'H' or 'K' or 'D' or 'E' or 'S' or 'T' or 'N' or 'Q' or 'C' or 'U' or 'G' or 'P' or 'A' or 'V' or 'I' or 'L' or 'M' or 'F' or 'Y' or 'W' in seq_record_trimmed:
                    if 'A' or 'V' or 'I' or 'L' or 'M' or 'F' or 'W' or 'Y' in seq_record_trimmed:
                        if 'R' or 'H' or 'K' or 'D' or 'E' or 'S' or 'T' or 'N' or 'Q' or 'C' or 'U' or 'G' or 'P' or 'A' or 'V' or 'I' or 'L' or 'M' or 'F' or 'Y' or 'W' in seq_record_trimmed:
                            if 'A' or 'V' or 'I' or 'L' or 'M' or 'F' or 'W' or 'Y' in seq_record_trimmed:
                                print(seq_record.id)
                                continue
                            else:
                                break
                        else:
                            break
                    else:
                        break                                      
                else:
                    break                                  
            else:
                break                     
        else:
            break
    else:
        break
else:
    print(seq_record.id + 'No B_signal has been found')

1 Ответ

0 голосов
/ 09 мая 2019

Это не сработает. Вам лучше использовать некоторые регулярные выражения.

from Bio import SeqIO
import re

print('enter the path to your fasta file: ' )
user_input = raw_input()    

Po = '[RHKDESTNQ]'
Hy = '[AVILMFWY]'
X = '.'

motif_pattern = Po + X + 'G' + X + X + Hy + X + Hy
motif_regex = re.compile(motif_pattern)

for seq_record in SeqIO.parse(user_input, "fasta"):

    aminoacids_count = len(seq_record)
    seq_record_trimmed = seq_record[aminoacids_count//2:aminoacids_count + 1]
    seq_str = str(seq_record_trimmed.seq)

    if motif_regex.search(seq_str):
        print(seq_record_trimmed.id)

str(seq_record_trimmed.seq) преобразует последовательность в обычную строку. Раньше это был объект Seq с не всеми функциями для строки, например поиск по регулярному выражению.

regex - это совершенно новая тема, независимая от Python: ее можно найти в большинстве языков программирования. Вы можете найти объяснения для этого в Интернете. Вы можете поиграть с regex на regex101.com .

Далее: 'R' or 'H' in seq_record не будет работать должным образом. Он всегда будет возвращать True независимо от того, какой seq_record может быть. Вам нужно 'R' in seq_record or 'H' in seq_record, или, если вы не хотите повторять seq_record: any(p in seq_record for p in 'RH').

Последнее: вы управляете потоком (если / иначе / разбить / продолжить) выглядит ужасно и не делаете то, что вы намеревались с ним. Вы должны прочитать больше о том, как написать это правильно.

Удачи.

...