Задание 1
Escherichia coli str. K-12 substr. MG1655
ATG - 3890
GTG - 338
TTG - 80
ATT - 4
CTG - 2
TTC - 1
Candidatus Gracilibacteria bacterium 28_42_T64
ATG - 1129
GTG - 41
TTG - 23
ACA - 1
TCA - 1
TCT - 1
Mycoplasma pneumoniae M29
ATG - 627
GTG - 60
TTG - 49
ATT - 7
CTC - 3
ATA - 3
CTG - 2
TCC - 2
TTA - 1
ATC - 1
CAC - 1
TCT - 1
GAA - 1
AAA - 1
TTC - 1
CAA - 1
TGA - 1
ACT - 1
ACA - 1
CTA - 1
GTT - 1
Чаще всего встречается старт-кодон ATG, второй по частоте - GTG, третий - TTG, остальные встречаются довольно редко. GTG часто является старт-кодоном у прокариот. Причина, по который в качестве старт-кодона может использоваться не только ATG, может заключаться, например в случайных точечных мутациях (GTG и TTG отличаются от ATG всего одним первым нуклеотидом). При этом у прокариот они могут распознаваться белками, регулирующими транскрипцию. Кодоны, значительно отличающиеся от ATG являются старт-кодонами в основном в псевдогенах, которые не экспрессируются.
Результаты получены с помощью следующего кода:
dt = dict() f = input() line = '' start = '' with open (f, mode='r') as a: for l in a: if l[0] != '>': l = l.strip() line = line + l start = line[0:3] else: if start in dt: dt[start]+=1 elif start not in dt and start != '': dt[start] = 1 line = '' start = line[0:3] if start in dt: dt[start]+=1 else: dt[start] = 1 st = '' sortdt = dict(sorted(dt.items())) for i in sortdt: st = st + str(i) + '\t' + str(sortdt[i]) + '\n' output = open('out.txt', 'w') output.write(st) output.close() with open ('out.txt', mode = 'r') as out: for line in out: print(line)
Задание 2
lcl|U00096.3_cds_b4587_250 [gene=insN] [locus_tag=b4587] [db_xref=ASAP:ABE-0285253,ECOCYC:G6130] [protein=IS911A regulator fragment] [pseudo=true] [location=join(270278..270540,271764..272190)] [gbkey=CDS]
lcl|U00096.3_cds_AAD13438.1_1459 [gene=fdnG] [locus_tag=b1474] [db_xref=UniProtKB/Swiss-Prot:P24183] [protein=formate dehydrogenase N subunit alpha] [transl_except=(pos:586..588,aa:Sec)] [protein_id=AAD13438.1] [location=1547401..1550448] [gbkey=CDS]
lcl|U00096.3_cds_AAD13456.1_3824 [gene=fdoG] [locus_tag=b3894] [db_xref=UniProtKB/Swiss-Prot:P32176] [protein=formate dehydrogenase O subunit alpha] [transl_except=(pos:586..588,aa:Sec)] [protein_id=AAD13456.1] [location=complement(4082772..4085822)] [gbkey=CDS]
lcl|U00096.3_cds_AAD13462.1_3997 [gene=fdhF] [locus_tag=b4079] [db_xref=UniProtKB/Swiss-Prot:P07658] [protein=formate dehydrogenase H] [transl_except=(pos:418..420,aa:Sec)] [protein_id=AAD13462.1] [location=complement(4297219..4299366)] [gbkey=CDS]
Из описания первого гена видно, что это псевдоген, он не экспрессируется, а значит, не имеет значения, где и сколько раз в нём встречаются стоп-кодоны. Остальные гены кодируют формиатдегидрогеназы. В них после кодона TGA, обычно воспринимающегося как стоп-кодон, идёт особая последовательность, позволяющая считывать кодон TGA как кодирующий аминокислоту селеноцистеин
Результаты получены с помощью следующего кода:
f = input() line = '' seq = [] st = '' with open (f, mode='r') as a: for l in a: if l[0] != '>': l = l.strip() line = line + l else: if line != '': seq.append(line) if seq != []: b = seq[1][0:-3] for i in range(0, len(b)-2, 3): stop1 = b.find('TAA',i,i+3) stop2 = b.find('TAG',i,i+3) stop3 = b.find('TGA',i,i+3) if stop1 != -1 or stop2 != -1 or stop3 != -1: st = st + seq[0][1::] + '\n' break seq = [] line = '' seq.append(l) seq.append(line) b = seq[1][0:-3] for i in range(0, len(b)-2, 3): stop1 = b.find('TAA',i,i+3) stop2 = b.find('TAG',i,i+3) stop3 = b.find('TGA',i,i+3) if stop1 != -1 or stop2 != -1 or stop3 != -1: st = st + seq[0][1::] + '\n' break output = open('out.txt', 'w') output.write(st) output.close() with open ('out.txt', mode = 'r') as out: for line in out: print(line)
Задание 3
Escherichia coli str. K-12 substr. MG1655
TGA - 1246
TAA - 2761
TAG - 306
Candidatus Gracilibacteria bacterium 28_42_T64
TGA - 1
TAA - 1000
TAG - 188
Mycoplasma pneumoniae M29
TGA - 0
TAA - 526
TAG - 220
У второй и третьей бактерии пропавшим стоп-кодоном является TGA. Однако в кодирующих последовательностях он встречается гораздо чаще. Это может говорить о том, что у этих бактерий он кодирует какую-то аминокислоту.
В научной литературе есть подтверждение тому, что у Candidatus Gracilibacteria bacterium TGA кодирует аминокислоту лейцин: "Both in silico analysis and proteomics showed very strong evidence for the use of an alternate genetic code by this bacterial division. As was previously described for the related division SR1 and Gracilibacteria, the opal stop codon, UGA, was found to be translated as glycine (Campbell et al., 2013; Rinke et al., 2013)." (https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4032931/)
А у Mycoplasma pneumoniae TGA кодирует аминокислоту триптофан (https://pubmed.ncbi.nlm.nih.gov/2104612/)
Результаты были получены с помощью следующего кода:
dt = {'TGA': 0, 'TAA': 0, 'TAG': 0} f = input() line = '' stop = '' with open (f, mode='r') as a: for l in a: if l[0] != '>': l = l.strip() line = line + l else: stop = line[-3::] if stop in dt: dt[stop]+=1 line = '' stop = line[-3::] if stop in dt: dt[stop]+=1 st = '' sortdt = dict(sorted(dt.items())) for i in sortdt: st = st + str(i) + '\t' + str(sortdt[i]) + '\n' output = open('out.txt', 'w') output.write(st) output.close() with open ('out.txt', mode = 'r') as out: for line in out: print(line)
Задание 4
Escherichia coli str. K-12 substr. MG1655
CTT - 14728
CTC - 14952
CTA - 5203
CTG - 71305
TTA - 18505
TTG - 18301
Candidatus Gracilibacteria bacterium 28_42_T64
CTT - 9333
CTC - 3968
CTA - 3357
CTG - 1714
TTA - 14767
TTG - 3237
Mycoplasma pneumoniae M29
CTT - 2782
CTC - 3158
CTA - 2826
CTG - 2470
TTA - 10295
TTG - 5571
У одной и той же бактерии значительно различаются частоты синонимичных кодонов, так же как и частоты одних и тех же кодонов у разных бактерий. Одно из возможных объяснений этого явления заключается в том, что наиболее часто встречающиеся кодоны узнаются наиболее часто встречаемыми тРНК. Также наиболее часто встречающиеся кодоны могут реже подвергаться мутациям. Это может зависеть от GC-состава. Например, можно заметить, что у второй и третьей бактерии чаще встречается кодон TTA, который не содержит нуклеотидов G и С.
Результаты были получены с помощью следующего кода:
f = input() line = '' tta = 0 ttg = 0 ctt = 0 ctc = 0 cta = 0 ctg = 0 with open (f, mode='r') as a: for l in a: if l[0] != '>': l = l.strip() line = line + l else: for i in range(0, len(line)-2, 3): leu1 = line.find('CTT',i,i+3) if leu1 != -1: ctt+=1 leu2 = line.find('CTC',i,i+3) if leu2 != -1: ctc+=1 leu3 = line.find('CTA',i,i+3) if leu3 != -1: cta+=1 leu4 = line.find('CTG',i,i+3) if leu4 != -1: ctg +=1 leu5 = line.find('TTA',i,i+3) if leu5 != -1: tta +=1 leu6 = line.find('TTG',i,i+3) if leu6 != -1: ttg+=1 line = '' for i in range(0, len(line)-2, 3): leu1 = line.find('CTT',i,i+3) if leu1 != -1: ctt+=1 leu2 = line.find('CTC',i,i+3) if leu2!= -1: ctc +=1 leu3 = line.find('CTA',i,i+3) if leu3 != -1: cta+=1 leu4 = line.find('CTG',i,i+3) if leu4 != -1: ctg +=1 leu5 = line.find('TTA',i,i+3) if leu5 != -1: tta +=1 leu6 = line.find('TTG',i,i+3) if leu6 != -1: ttg+=1 print('CTT', '\t', ctt, '\n' 'CTC', '\t', ctc, '\n' 'CTA', '\t', cta, '\n' 'CTG', '\t', ctg, '\n' 'TTA', '\t', tta, '\n' 'TTG', '\t', ttg)
Задание 5
Ссылка на график: https://drive.google.com/file/d/1U6eUKMnRO3lUGtobEl7Gx9j8DMf67ooT/view?usp=sharing
Минимальное значение: -28,328 на позиции 3870000
Максимальное значение: 47,733 на позиции 1513000
Позиция с минимальным cumulative GC-skew соответствует месту начала репликации (oriC), а с максимальным - месту окончания репликации (ter)
oriC расположен на позиции 3925744..3925975, что примерно соответствует расчёту
Результаты получены с помощью следующего кода:
f = input() window = int(input()) step = int(input()) cumulative = 0 st = '' g = 0 c = 0 line = '' with open (f, mode='r') as a: for l in a: if l[0] != '>': l = l.strip() line = line + l for i in range (0, len(line)-max(step, window)+1, step): g = 0 c = 0 for s in range (i, i+window): if line[s] == 'C': c+=1 if line[s] == 'G': g+=1 if (g + c) != 0: gcskew = (g - c)/(g + c) else: gcskew = 0 cumulative += gcskew st = st + str(i) + '\t' + f'{gcskew:.03f}' + '\t' + f'{cumulative:.03f}' + '\n' output = open('out.txt', 'w') output.write(st) output.close() with open ('out.txt', mode = 'r') as out: for line in out: print(line)
Задание 6
Наиболее часто встречающиеся 6-меры для E.coli:
AAGGAG |
269 |
|
TAAGGA |
232 |
|
AGGAGA |
175 |
|
CAGGAG |
129 |
|
AAAGGA |
214 |
|
AAGGAA |
211 |
Скорее всего, данные 6-меры соответствуют последовательности Шайна-Дальгарно. Это сайт связывания рибосом на молекуле мРНК прокариот, и обычно эта последовательность находится на расстоянии примерно 10 нуклеотидов до старт кодона. Для E.coli стандартной последовательностью Шайна-Дальгарно является AGGAGGТ, что похоже на полученные 6-меры.
def inverse_compl(seq): ans = '' compl = {'a': 't', 't': 'a', 'g': 'c', 'c': 'g'} for k in seq: ans+=compl[k] return ans[::-1] name = 'data.txt' genes = open(name, 'r').readlines() start = 0 for i in range(len(genes)): if 'ORIGIN' in genes[i]: start = i break seq = '' for i in range(start+1, len(genes)-1): for s in genes[i]: if s in ['a', 't', 'g', 'c']: seq+=s numbers = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'] indexes, reverse = [], [] for i in range(len(genes)): if ' CDS ' in genes[i]: if 'complement' in genes[i]: if 'join' not in genes[i]: index = int(genes[i][genes[i].find('..')+2:genes[i].find(')')]) indexes.append(index) reverse.append(True) else: if 'join' not in genes[i]: index = int(genes[i][21:genes[i].find('.')]) indexes.append(index) reverse.append(False) twenty_list = [] for i in range(0, len(indexes)): if reverse[i]: twenty_nucleotides = inverse_compl(seq[indexes[i]+1:indexes[i]+21][::-1]) twenty_list.append(twenty_nucleotides) else: twenty_nucleotides = seq[indexes[i]-21:indexes[i]-1] twenty_list.append(twenty_nucleotides) kmers = set() for twenty in twenty_list: for i in range(0, 15): kmers.add(twenty[i:i+6]) kmers = sorted(list(kmers)) kmers_count = [0 for i in range(len(kmers))] for i in range(len(kmers)): for twenty in twenty_list: kmers_count[i] += twenty.count(kmers[i]) result = open("6mers.txt", "w") for i in range(len(kmers)): result.write(kmers[i] + "\t" + kmers_count[i].str() + "\n") result.close()