Python: печатайте молекулярную массу для однозначных последовательностей ДНК, пропуская неоднозначные последовательности.

Мне нужно написать функцию, которая принимает имя файла (файл fasta) в качестве аргумента, считывает последовательности и для каждой однозначной последовательности печатает идентификатор последовательности и ее молекулярный вес. Файлы fasta содержат как неоднозначные, так и однозначные последовательности.

Пока у меня есть эти два фрагмента кода, которые работают по отдельности. Я не знаю, как пропустить неоднозначные последовательности в файле fasta и вычислить молекулярную массу только для однозначных последовательностей. Очевидно, если я попробую, это приведет к ошибке, потому что я ввел только значения ACGT, а не двусмысленные. Может ли кто-нибудь помочь мне понять, как пропустить эти последовательности? Спасибо!

Кроме того, я не понимаю, как объединить их в одну функцию, я пробовал сделать 2 цикла for для одной функции, но это всегда дает ошибки. Я думаю, мне придется изменить аргумент функции calc_mol_weight, чтобы он соответствовал указанным выше seq_records, но я не понимаю, как именно сделать их совместимыми.

seq_records = SeqIO.parse('short.fasta', 'fasta', alphabet=generic_dna)
seq_record_list = list(seq_records)
for seq_rec in seq_record_list:
    print(f'{seq_rec.id}')

def calc_mol_weight(sequence):   
    mol_weight = 0.0
    nucleotide_weights = {'A':331.2218, 'T':322.2085, 'C':307.1971, 'G':347.2212}
    for nucl in sequence:
        mol_weight += nucleotide_weights[nucl]
    return mol_weight

Для справки - short.fasta:

>seq_7009 random sequence
DGRGGGWAVCVAACGTTGAT
>seq_418 random sequence
GAGCTGVTATST
>seq_9143_unamb random sequence
ACCGTTAAGCCTTAG
>seq_2888 random sequence
RVCCWDGARATAGBCGC
>seq_1101 random sequence
CSAATGYGATNBTA
>seq_107 random sequence
WGDGHGCDCTYANGTTWCA
>seq_6946 random sequence
TCVMBRAGRSGTCCAWA
>seq_6162 random sequence
YWBGCKTGCCAAGCGCDG
>seq_504 random sequence
ADDTAACCCTCTTKA
>seq_3535 random sequence
KKGTACACCAG
>seq_4077 random sequence
SRWSCRTTRVAGDCC
> seq_1626_unamb random sequence
GGATATTACCTA

person TKayla    schedule 22.12.2017    source источник
comment
Не понимаю, как рассчитать вес неоднозначного. Если мы не знаем вес K, то как мы должны рассчитать вес?   -  person Willem Van Onsem    schedule 22.12.2017
comment
@WillemVanOnsem Вы этого не сделаете, поскольку он сказал: ›Может ли кто-нибудь помочь мне понять, как пропустить эти последовательности?   -  person IMCoins    schedule 22.12.2017


Ответы (2)


Мне на ум приходят два решения, чтобы пропустить неоднозначные последовательности.

Вы можете использовать if nucl in nucleotide_weigths. Он проверит, существует ли символ в словаре. Если это так, он вернет True, и вы можете оценить этот элемент nucl, и он вернет False, если символ не найден. Затем вы могли бы сделать:

if nucl not in nucleotide_weigths:
    break

Так что он нарушает реальную последовательность, если она неоднозначна.

Другой вариант - выполнить блок try / except.

В основном это работает так:

try:
    mol_weight += nucleotide_weights[nucl]
except:
    break

Вы можете указать ошибку после ключевого слова, за исключением того, что это не останавливает появление каких-либо ошибок (вы этого не хотите), но вам нужно знать следующее: если возникает исключение (например: ValueError, IndexError, KeyError, TypeError, ...), код в except block будет работать. Таким образом, оператор break выведет вас из цикла, и эта неоднозначная последовательность ускользнет. :)


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

person IMCoins    schedule 22.12.2017

Надеюсь, это поможет: @tfabiant, чтобы запустить этот код, введите в терминале: python script.py fastafile. Fasta

def unambiguous(sequences):
    nucleotide_weights = {'A':331.2218, 'T':322.2085, 'C':307.1971, 'G':347.2212}
    for seq in sequences:
        seqname =  seq
        sequence = sequences[seq]
        weight = 0
        for nucleotide in sequence:
            if nucleotide not in nucleotide_weights:
                weight = "AMBIGUOUS"
                break
            else:
                weight+=nucleotide_weights[nucleotide]
        if weight != "AMBIGUOUS":
            print "%s\t\tWEIGHT %s"%(seqname, weight)
def readfasta():
    ##########I. Load Fasta File
    file = open(sys.argv[1])
    rfile = file.readline()
    seqs = {}
    ##########II. To Make fasta dictionary with the sequences
    tnv = ""#temporal name value
    while rfile != "":
        if ">" in rfile:
            tnv = string.strip(rfile)
            seqs[tnv] = ""
        else:
            seqs[tnv] += (string.strip(rfile)).upper()
        rfile = file.readline()
    return(seqs)

#To run this code, in the terminal: python readDNA.py fastafile.fasta
# OR insert this function in your code
import string, sys
sequences = readfasta()
unambiguous(sequences)
person Fabian Tobar-Tosse    schedule 22.02.2018