Python перевод ДНК - PullRequest
       86

Python перевод ДНК

0 голосов
/ 02 мая 2020

Я должен создать свою собственную биографию python по существу. То, что может читать ДНК, транскрибировать и переводить. Я дошел до того, что он может делать все это, но я не могу понять, как заставить программу распознавать кодоны в наборах из 3, следующих за «atg», пока он не достигнет стоп-кодона. Прямо сейчас он просто находит стартовый кодон, а затем ближайший стоп-кодон, не считая 3. Может ли кто-нибудь помочь мне понять это? Извините, если это не имеет смысла

#locate start codons
startcodon=0
n=0
while(n < 1):
    startcodon=dataset.find("atg", startcodon, len(dataset)-startcodon)
    #locate stop codons
    taacodon=dataset.find("taa", startcodon+3, len(dataset)-startcodon)
    tagcodon=dataset.find("tag", startcodon+3, len(dataset)-startcodon)
    tgacodon=dataset.find("tga", startcodon+3, len(dataset)-startcodon)
    if(taacodon<tagcodon):
        if(taacodon<tgacodon):
            stopcodon=taacodon
            #print("taacodon", startcodon)
        else:
            stopcodon=tgacodon
            #print("tGacodon", startcodon)

    elif(tgacodon>tagcodon):
        stopcodon=tagcodon
        #print("taGcodon", startcodon)
    else:
        stopcodon=tgacodon
        #print("tGacodon", startcodon)
    #to add sequences to an array
    codon.append(dataset[startcodon:stopcodon+3])
    if(startcodon > len(dataset) or startcodon < 0):
        n = 2;
    startcodon=stopcodon

#reverse the string and swap the letters
n=0;
while(n < len(codon)):
        rcodon.append (codon[n][len(codon[n])::-1])
        #replace a with u
        rcodon[n] = re.sub('a', "u", rcodon[n])
        #replace t with a
        rcodon[n] = re.sub('t', "a", rcodon[n])
        #replace c with x
        rcodon[n] = re.sub('c', "x", rcodon[n])
        #replace g with c
        rcodon[n] = re.sub('g', "c", rcodon[n])
        #replace x with g
        rcodon[n] = re.sub('x', "g", rcodon[n])
        print("DNA sequence: ", codon[n] ,'\n', "RNA sequence:", rcodon[n])
        n=n+1
answer = 0
print("Total Sequences:  ", len(codon)-3)
while (int(answer) >=0):
        #str = "Please enter an integer from 0 to " + str(len(dataset)) + " or -1 to quit: "
        answer = int(input("Please enter a sequence you would like to see or -1 to quit:  "))
        if(int(answer) >= 0):
                print("DNA sequence: ", codon[int(answer)] ,'\n', "RNA sequence:", rcodon[int(answer)])
        dna = codon[int(answer)]
        #dna codon table
        protein = {"ttt" : "Phe-", "ctt" : "Leu-", "att" : "Ile-", "gtt" : "Val-",
           "ttc" : "Phe-", "ctc" : "Leu-", "atc" : "Ile-", "gtc" : "Val-",
           "tta" : "Leu-", "cta" : "Leu-", "ata" : "Ile-", "gta" : "Val-",
           "ttg" : "Leu-", "ctg" : "Leu-", "atg" : "Met-", "gtg" : "Val-",
           "tct" : "Ser-", "cct" : "Pro-", "act" : "Thr-", "gct" : "Ala-",
           "tcc" : "Ser-", "ccc" : "Pro-", "acc" : "Thr-", "gcc" : "Ala-",
           "tca" : "Ser-", "cca" : "Pro-", "aca" : "Thr-", "gca" : "Ala-",
           "tcg" : "Ser-", "ccg" : "Pro-", "acg" : "Thr-", "gcg" : "Ala-",
           "tat" : "Tyr-", "cat" : "His-", "aat" : "Asn-", "gat" : "Asp-",
           "tac" : "Tyr-", "cac" : "His-", "aac" : "Asn-", "gac" : "Asp-",
           "taa" : "STOP", "caa" : "Gin-", "aaa" : "Lys-", "gaa" : "Glu-",
           "tag" : "STOP", "cag" : "Gin-", "aag" : "Lys-", "gag" : "Glu-",
           "tgt" : "Cys-", "cgt" : "Arg-", "agt" : "Ser-", "ggt" : "Gly-",
           "tgc" : "Cys-", "cgc" : "Arg-", "agc" : "Ser-", "ggc" : "Gly-",
           "tga" : "STOP", "cga" : "Arg-", "aga" : "Arg-", "gga" : "Gly-",
           "tgg" : "Trp-", "cgg" : "Arg-", "agg" : "Arg-", "ggg" : "Gly-"  
           }
        protein_sequence = ""

        # Generate protein sequence
        for i in range(0, len(dna)-(3+len(dna)%3), 3):
                protein_sequence += protein[dna[i:i+3]]

        # Print the protein sequence
        print ("Protein Sequence: ", protein_sequence)

Последовательность ДНК, которую я использовал, начинается с "ggtcagaaaaagccctctccatgtctactcacgatacatccctgaaaaccactgaggaagtggcttttcagatcatcttgctttgccagtttggggtggtgtttttgtgtgtgtgttgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgtgttgtg заранее спасибо за любой совет

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

Если вы хотите найти счетчик стоп-кодонов на 3 после стартового кодона, вы можете разделить строку ДНК после стартового кодона и выяснить, есть ли стоп-кодон в списке кодонов.

sequence =  "ggtcagaaaaagccctctccatgtctactcacgatacatccctgaaaaccactgaggaagtggcttttcagatcatcttgctttgccagtttggggttgggacttttgccaatgtatttc"
startcodon = 0
length = len(sequence)
startcodon = sequence.find("atg", startcodon)
# list comprehension. could get codon_list in a for cycle
codon_list = [sequence[i:i+3] for i in range(startcodon+3, length-3, 3)]

# use list.index() to find out whether there is a stop codon in the codon_list
# list.index() would throw error if value is not in the list
try:
    taacodon = startcodon + 3 * codon_list.index('taa')
    print('taa codon is at {}'.format(taacodon))
except:
    print('taa codon is not in the list')

Я думаю, что расщепление последовательности ДНК более эффективно, чем использование str.find, так как вам нужно найти счетчик стоп-кодонов по 3 , если вы используете str.find, вам нужно будет определить, найден ли стоп-кодон находится на расстоянии 3.


Редактировать : В настоящее время я не знаю, будет ли создание нового списка строк стоить дороже, чем поиск в исходной строке.

0 голосов
/ 02 мая 2020

Сейчас он просто находит стартовый кодон, а затем ближайший стоп-кодон, не считая на 3.

Если вы хотите найти подстроку, выровненную по указанному c кадру (ie индекс делится на 3), вы можете сначала разбить строку на равные куски, а затем искать в результирующем списке соответствующий кусок.

Например,

dataset_codons = [dataset[i:i+3] for i in range(0, len(dataset), 3)]
# ggtcagaaaaagccctctcca becomes [ggt cag aaa aag ccc tct cca]

try:
    startcodon = dataset_codons.index('atg', startcodon, len(dataset_codons) - startcodon)
except ValueError:
    break # no more start codons found

(обратите внимание, что startcodon будет тогда индексом совпадения фрагмента atg, что в точности равно 1/3 соответствующего индекса строки)

Edit: если стоп-кодон должен находиться только в том же кадре, что и его стартовый кодон, но стартовый кодон может быть где угодно, становится немного сложнее. В этом случае вы можете просто продолжать поиск стоп-кодонов, пока не найдете тот, чей индекс хороший:

def find_codon(codon, string, start):
    i = start + 3
    while i < len(string):
        i = string.find(codon, i) # find the next substring
        if (i - start) % 3 == 0:  # check that it's a multiple of 3 after start
            return i
    return None



startcodon=dataset.find("atg", startcodon)
#locate stop codons
taacodon=find_codon("taa", dataset, startcodon)
tagcodon=find_codon("tag", dataset, startcodon)
tgacodon=find_codon("tga", dataset, startcodon)

stopcodon = min(taacodon, tagcodon, tgacodon)

Кстати, я не уверен, что правильно понимаю назначение параметра len(dataset)-startcodon , Третий аргумент str.find() указывает end диапазона поиска внутри строки, что означает, что при увеличении startcodon поиск будет прерван за фактическим концом набора данных.

...