В данном практикуме с помощью программы Ugene анализируются прямое и обратное прочтение некоторой последовательности с целью получить контиг.
import numpy as np
import matplotlib.pyplot as plt
from Bio import SeqIO
Исходные файлы: прямой рид, обратный рид
Контиг: консенсусная последовательность в fasta-формате
Выравнивания: неотредактированных ридов с контигом, отредактированных ридов с референсом
В качестве референсной была взята последовательность Macoma balthica voucher 07PROBE-05510 cytochrome oxidase subunit 1 (COI) gene (GeneBank: KF643760.1) полученная с помощью blastn и консенсусной последовательности.
Ниже приведен график, изображающий уровень Phred для каждого нуклеотида для прямого и обратного прочтений, по которому можно видеть, что наибольший уровень качества сигнала достигается в середине хроматограммы, а в её начале и конце качество падает.
Среднее качество сигнала для прямого прочтения - 21.9, а для обратного - 25.6.
fwd = SeqIO.read("./17_F.ab1","abi")
rvs = SeqIO.read("./17_R.ab1","abi")
plt.rcParams["figure.figsize"]=(20,5)
plt.plot(fwd.letter_annotations["phred_quality"], label="Forward read")
fwd_mean = np.mean(fwd.letter_annotations["phred_quality"])
plt.plot([0,len(fwd.letter_annotations["phred_quality"])],[fwd_mean,fwd_mean],color="red", linestyle="--", linewidth=1, label="Forward mean")
plt.plot(rvs.letter_annotations["phred_quality"], label="Reverse read")
rvs_mean = np.mean(rvs.letter_annotations["phred_quality"])
plt.plot([0,len(rvs.letter_annotations["phred_quality"])],[rvs_mean,rvs_mean],color="green", linestyle="--", linewidth=1, label="Reverse mean")
plt.xlabel('Nucleotide number')
plt.ylabel('Phred quality')
plt.legend()
<matplotlib.legend.Legend at 0x2591974e5e0>
Высоты пиков в серединной области прямого прочтения примерно одинаковы, в то время как в обратном прочтении пики гуанина значительно превышают высоту остальных пиков.
В начале и конце каждого из прочтений находятся беспорядочные области, встречаются очень высокие и широкие пики, которые, возможно, отражают пятна красителей, однако в серединной области все пики выравниваются по высоте и нахоятся на одинаковом расстоянии друг от друга, при этом уровень шума (других сигналов) в большинстве случаев не привышает половины высоты пика. Иногда встречаются слившиеся друг с дргом пики, но это не затрудняет прочтение хроматограммы.
plt.plot(fwd.annotations["abif_raw"]["DATA9"], alpha=0.7, label="G")
plt.plot(fwd.annotations["abif_raw"]["DATA10"], alpha=0.7, label="A")
plt.plot(fwd.annotations["abif_raw"]["DATA11"], alpha=0.7, label="T")
plt.plot(fwd.annotations["abif_raw"]["DATA12"], alpha=0.7, label="C")
plt.title("Forward read")
plt.legend()
<matplotlib.legend.Legend at 0x259133c1910>
plt.plot(rvs.annotations["abif_raw"]["DATA9"],alpha=0.7, label="G")
plt.plot(rvs.annotations["abif_raw"]["DATA10"],alpha=0.7, label="A")
plt.plot(rvs.annotations["abif_raw"]["DATA11"],alpha=0.7, label="T")
plt.plot(rvs.annotations["abif_raw"]["DATA12"],alpha=0.7, label="C")
plt.title("Reverse read")
plt.legend()
<matplotlib.legend.Legend at 0x25913332700>
В качестве нечитаемого был взят фрагмент 1-98 из хроматограммы L49_COI_R_F06_WSBS-Seq-07-10-16. В данном фрагменте все пики сигнала беспорядочно перекрываются и сливаются между собой, из-за чего представляется невозможным определить, от какого нуклеотида исходит сигнал, что, вероятно, является результатом отжига праймеров на короткие неспецифичные участки. Также в данном фрагменте присутсвует участок с очень высокими и широкими пиками, котрые могли появиться в результате загрязнения пятнами красителя.
bad = SeqIO.read("./L49_COI_R_F06_WSBS-Seq-07-10-16.ab1","abi")
plt.plot(bad.annotations["abif_raw"]["DATA9"][:1200], label="G")
plt.plot(bad.annotations["abif_raw"]["DATA10"][:1200], label="A")
plt.plot(bad.annotations["abif_raw"]["DATA11"][:1200], label="T")
plt.plot(bad.annotations["abif_raw"]["DATA12"][:1200], label="C")
plt.title("Bad read")
plt.legend()
<matplotlib.legend.Legend at 0x2591b3d4790>