Практикум 7. Сигналы и мотивы - 2¶

b.1) Нахождение последовательности Shine-Dalgarno в геноме бактерии.¶

Код для выполнения этого задания я взял у своего однокурсника, Дмитрия Звездина. Ссылка на код. Авторские комментарии к коду сохранены.¶

Поиск выполнялся в геноме бактерии Streptococcus pyogenes, штамм NGAS322.

In [3]:
from Bio import SeqIO
import pandas as pd
import numpy as np
from IPython.display import Image
In [4]:
with open("sequence.gb", "r") as file:
    table = SeqIO.read(file, "gb")
coordinates = []
with open("coordinates.tsv", "w") as file_write:
    for feature in table.features[1:]:
        start, end, strand = int(feature.location.start), int(feature.location.end), feature.location.strand
        try:
            locus_tag = feature.qualifiers["locus_tag"][0]
        except KeyError:
            locus_tag = f"unknown_locus_tag_{start}_{end}"
        if (feature.type == "CDS") and ("pseudo" not in feature.qualifiers.keys()) and (end - start > 300) and (feature.qualifiers["product"][0] != "hypothetical protein"):
            coordinates.append("\t".join([str(start), str(end), str(strand), locus_tag]))
    print(*coordinates, sep="\n", file=file_write)

C помощью кода выше из файла в формате genbank были отобраны CDS, длиной более 300 нуклеотидов, продуктами которых, не являются гипотетические белки, их координаты были сохранены в файл.

In [5]:
coordinates_table = pd.read_csv("coordinates.tsv", sep="\t", names=["start", "end", "strand", "name"])
with open("Streptococcus_pyogenes.fasta", "r") as fasta_file:
    fasta = SeqIO.read(fasta_file, "fasta")
clear_sequences = []
with open("clear_sequences.fasta", "w") as file_write:
    for i in range(301):
        name = coordinates_table.loc[i, "name"]
        if str(coordinates_table.loc[i, "strand"]) == "1":
            start = int(coordinates_table.loc[i, "start"])
            sequence = str(fasta.seq[start - 20: start])
        else:
            start = int(coordinates_table.loc[i, "end"])
            sequence = str(fasta.seq[start: start + 20].reverse_complement())
        clear_sequences.append(f">{name}")
        clear_sequences.append(sequence)
    print(*clear_sequences, sep="\n", file=file_write)

Далее по этим координатам были выбраны 300 последовательностей (301, одна пустая) длиной 20 нуклеотидов в upstream этих генов, они были сохранены в файл и разбиты на 2 набора: 100 последовательностей для MEME и 200 для FIMO.

In [6]:
for feature in table.features[1:]:
    try:
        if ("RNA" in feature.type) and ("16S" in feature.qualifiers["product"][0]):
            print(feature.location)
    except KeyError:
        pass
[17070:18619](+)
[23070:24619](+)
[79686:81235](+)
[270036:271585](+)
[520636:522185](+)
[1688889:1690438](-)
In [7]:
print(str(fasta.seq[18599:18619].complement()))
CGCCGACCTAGTGGAGGAAA

Далее был взят участок в 20 нуклеотидов 3' конца 16 рРНК и добавлен в файл для построения PWM.

b.2) Построение и проверка PWM¶

Построение PWM¶

Для построения PWM я воспользовался программой MEME: meme meme_input.fasta -dna -minw 5 -maxw 8 -nmotifs 1

Выдача в формате HTML. Был найден мотив длиной в 8 нуклеотидов - AAAGGAGR, похожий на консенсус последовательности Шайна-Дальгарно: AGGAGG. Этот мотив был найден в 65 из 101 последовательности. Ниже на рисунке представлен LOGO этого мотива.

In [8]:
Image("logo1.png")
Out[8]:

Проверка PWM¶

Для проверки я воспользовался программой fimo: fimo ./meme_out/meme.txt fimo_input.fasta

Выдача в формате tsv. Было найдено 30 последовательностей из 200 с искомым мотивом (p-value < 0.0001). Возможно, следует построить более точную PWM.