CpG - это обозначение для двух нуклеотидов, цитозина и гуанина, следующих друг за другом в цепи ДНК в направлении 5' -> 3'. Буква p между C и G обозначает остаток фосфорной кислоты в фосфодиэфирной связи и позволяет не путать эту структуру с комплементарной CG-парой.
CpG могут образовывать островки в ядерном геноме млекопитающих: это регионы длиной не менее 200 п.о., в которых значение отношения наблюдаемого количества CpG-пар к параметру ([количество C] + [количество G])/[длина последовательности] более 0.6, а GC-состав превышает 50% [1]. Такие островки часто ассоциированы с промоторами, а их последовательности у человека и у мыши очень схожи, что подчёркивает их функциональную значимость [2].
Метилирование ДНК - один из главнейших эпигенетических факторов, влияющих на активность генов. Этот процесс катализируется ДНК-метилтрансферазами (DNMT), использующими S-аденозил-L-метионин как донора метильной группы. В результате работы фермента цитозин модифицируется в 5-метилцитозин (см. рис. 1). У млекопитающих существуют метилтрансферазы, отвечающие как за метилирование C во второй цепи ДНК в случае, если CpG в другой уже метилирован (DNMT1), так и de novo метилтрансферазы (DNMT3a, DNMT3b) [3].
Сигналом для метилирования является последовательность CpG-островка. Фермент взаимодействует с нуклеосомой, чем открывает ДНК для взаимодействия. Признано, например, что в процессе метилирования de novo комплекс из нескольких метилаз (DNMT3A-DNMT3L) взаимодействует с одним из хвостов гистона в нуклеосоме, в результате чего специфичная таргетная CpG-богатая последовательность оказывается открытой для фермента [4].
Показано, что в геноме млекопитающих CpG-островки богато метилированы: для разных аллелей гена Dnmt1 мыши дикого типа показано метилирование 62,2% цитозинов в эмбриональных стволовых клетках и 66% в клетках печени [5]. Из этого, мне кажется, можно сделать вывод о достаточно высокой силе сигнала CpG для ДНК-метилтрансфераз.
Источники:1) Gardiner-Garden M., Frommer M. CpG islands in vertebrate genomes. Journal of Molecular Biology 196 (2), 261–282 (1987);
2) Illingworth R.S., Gruenewald-Schneider U., Webb S., Kerr A.R., James K.D., Turner D.J., Smith C., Harrison D.J., Andrews R., Bird A.P. Orphan CpG islands identify numerous conserved promoters in the mammalian genome. PLoS Genet 23, 6(9) (2010);
3) Moore, L. D., Le, T. & Fan, G. DNA Methylation and Its Basic Function. Neuropsychopharmacol 38, 23–38 (2013);
4) Yang, W., Zhuang, J., Li, C. & Cheng, G.-J. Unveiling the methyl transfer mechanisms in the epigenetic machinery DNMT3A-3 L: A comprehensive study integrating assembly dynamics with catalytic reactions. Computational and Structural Biotechnology Journal 21, 2086–2099 (2023);
5) Jang, H., Shin, W., Lee, J. & Do, J. CpG and Non-CpG Methylation in Epigenetic Gene Regulation and Brain Function. Genes 8, 148 (2017).
Это млекопитающие отряда грызунов (Rodentia) по-английски называется Upper Galilee mountains blind mole rat (буквально: слепыш гор Верхней Галилеи). Оно встречается в горных местностях Северного Израиля и Ливана. В систематике рода Nannospalax существуют противоречия: cм., например, статью А. А. Плетенева (Плетенев А.А., Механизмы хромосомной эволюции слепышей комплекса Nannospalax ehrenbergi: итоги исследований и перспективы // Бюл. МОИП. Отд. биол. 2016. Т. 121. Вып. 4. С. 11-21). Однако это не помешает нам называть его просто и красиво: галилейский слепыш.
Ядерный геном этого зверька выложен на платформе Ensembl. Оттуда я скачал gtf-файл с аннотацией собранных контигов. Опираясь на него, я выбрал 36 белок-кодирующих генов, для которых извлёк из базы данных последовательности Козак: позиции с -3 по +4 относительно 5'-конца старт-кодона (7 нуклеотидов). Это я сделал, последовательно набирая в поисковой строке адрес:
https://rest.ensembl.org/sequence/id/[ID гена в Ensemble]?content-type=text;expand_5prime=3
В результате я составил FASTA-файл с коротенькими сиквенсами. Это материал обучения.
Также с помощью Python я сгенерировал 36 случайных 7-нуклеотидных последовательностей, в которых на позициях 4-6 стоят нуклеотиды ATG. Этот набор будет отрицательным контролем.
Сгенерироавл я его вот так (Python3):
from random import choice
def dna(length):
DNA=""
for count in range(length):
DNA+=choice("CGTA")
return DNA
with open('rand.fa', 'w') as out:
for _ in range(37):
out.write(f'>{_ + 1}' + '\n')
out.write(dna(3) + "ATG" + choice("CGTA") + '\n')
Потом из статьи я собрал реальные последовательностей Козак из 36 белок-кодирующих генов Danio rerio. Вот FASTA-файл с ними. Это будет материал тестирования.
По материалу обучения в Bio Python построена позиционно-весовая матрица (PWM) со значением 0,5 для псевдосчётов. Посчитаны также нуклеотидные содержания по позициям:
input_fasta = 'try.fa'
pseudocounts = 0.5
from Bio.Seq import Seq
from Bio import motifs
fasta = open(input_fasta).readlines()
seq_ls = []
for line in fasta:
if line[0] != '>':
seq_ls.append(Seq(line[:-1]))
print(seq_ls)
m = motifs.create(seq_ls)
print('Nucleotide counts:')
print(m.counts)
print('PWM:')
print(m.counts.normalize(pseudocounts=pseudocounts))
Результат:
Nucleotide counts:
0 1 2 3 4 5 6
A: 15.00 8.00 5.00 36.00 0.00 0.00 4.00
C: 3.00 16.00 24.00 0.00 0.00 0.00 6.00
G: 15.00 9.00 7.00 0.00 0.00 36.00 19.00
T: 3.00 3.00 0.00 0.00 36.00 0.00 7.00
PWM:
0 1 2 3 4 5 6
A: 0.41 0.22 0.14 0.96 0.01 0.01 0.12
C: 0.09 0.43 0.64 0.01 0.01 0.01 0.17
G: 0.41 0.25 0.20 0.01 0.01 0.96 0.51
T: 0.09 0.09 0.01 0.01 0.96 0.01 0.20
Также построены диаграммы распределений весов последовательностей во всех трёх файлах:
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
pwm = pd.DataFrame(pwm)
def calc_weights(fasta_readlines, matrix):
w_list = []
seq_ls = []
for line in fasta_readlines:
if line[0] != '>':
seq_ls.append(line[:-1])
for seq in seq_ls:
w = 0
for i in range(len(seq)):
w += matrix.at[i,seq[i]]
w_list.append(w)
return w_list
with open('neg.fa', 'r') as negative:
negative = negative.readlines()
print('Weights for negative control:')
neg_list = calc_weights(negative, pwm)
print(neg_list)
with open('try.fa', 'r') as trying:
trying = trying.readlines()
print('... testing dataset:')
try_list = calc_weights(trying, pwm)
print(try_list)
with open('kozak.fa', 'r') as learn:
learn = learn.readlines()
print('... learning dataset:')
learn_list = calc_weights(learn, pwm)
print(learn_list)
top = int(max(max(learn_list),
max(try_list),
max(neg_list)))
bottom = int(min(min(learn_list),
min(try_list),
min(neg_list)))
bin_list = list(np.arange(bottom - 1, top + 1, 0.5))
plt.hist(learn_list, bin_list,
histtype="step",
edgecolor="#BF9315C0",
linewidth=2)
plt.hist(try_list, bin_list,
histtype="step",
edgecolor="#7B018CC0",
linewidth=2)
plt.hist(neg_list, bin_list,
histtype="step",
edgecolor="#0F8C69C0",
linewidth=2)
plt.grid(which="major", axis="y", color="grey", alpha=0.3)
plt.title("Гистограмма весов")
plt.xlabel("Вес последовательности")
plt.ylabel("Число последовательностей")
plt.legend(['Обучение',
'Материал\nтестирования',
'Отрицательный\nконтроль'
], loc='center left', bbox_to_anchor=(1, 0.5))
plt.savefig("hist.png", bbox_inches="tight")
Результат:
На основании диаграммы был выбран порог веса последовательности: 3,5 - 4. Именно в таком диапазоне располагается вес большинства сиквенсов из отрицательного контроля. По результатам работы можно составить следующую таблицу:
Материал обучения | Материал тестирования | Негативный контроль | |
---|---|---|---|
Есть сигнал | 24 | 36 | 10 |
Нет сигнала | 12 | 0 | 26 |
LOGO последовательности Козак вместе со старт-кодоном галилейского слепыша было сгенерировано на сервере Web LOGO 3:
Итак, с помощью PWM были обнаружены реально существующие сигналы последовательности Козак. С поправкой на результаты тестирования негативного контроля можно утверждать об успешно проведённом поиске. Обучение на геноме галилейского слепыша позволило успешно находить последовательности Козак у данио. Вероятно, эта последовательность достаточно консервативна среди позвоночных.