簡單雙序列比對實現


Reference URL
https://biopython.org/DIST/docs/api/Bio.pairwise2-module.html (Bio官方文檔)
https://www.biostars.org/p/307285/ (論壇關於Bio中Align部分的問題)
http://www.ryxxff.com/91470.html (Biopython序列比對簡要概括)
https://www.jianshu.com/p/f9179c517d4e(山東大學生物信息學教程)

序列對比過程中的罰分規則

兩種基本罰分手段

選擇的序列

名稱

選擇的序列是冠狀病毒envelop的gene序列

  • NC_045512.2:26245-26472 Severe acute respiratory syndrome coronavirus 2 isolate Wuhan-Hu-1, envelop genome
  • NC_002645.1:24750-24983 Human coronavirus 229E, envelop genome

具體的序列info

>NC_002645.1:24750-24983 Human coronavirus 229E, envelop genome
ATGTTCCTTAAGCTAGTGGATGATCATGCTTTGGTTGTTAATGTACTACTCTGGTGTGTGGTGCTTATAG
TGATACTACTAGTGTGTATTACAATAATTAAACTAATTAAGCTTTGTTTCACTTGCCATATGTTTTGTAA
TAGAACAGTTTATGGCCCCATTAAAAATGTGTACCACATTTACCAATCATATATGCACATAGACCCTTTC
CCTAAACGAGTTATTGATTTCTAA
>NC_045512.2:26245-26472 Severe acute respiratory syndrome coronavirus 2 isolate Wuhan-Hu-1, envelop genome
ATGTACTCATTCGTTTCGGAAGAGACAGGTACGTTAATAGTTAATAGCGTACTTCTTTTTCTTGCTTTCG
TGGTATTCTTGCTAGTTACACTAGCCATCCTTACTGCGCTTCGATTGTGTGCGTACTGCTGCAATATTGT
TAACGTGAGTCTTGTAAAACCTTCTTTTTACGTTTACTCTCGTGTTAAAAATCTGAATTCTTCTAGAGTT
CCTGATCTTCTGGTCTAA

DNA的dotplot實現

  1. 在線的server端實現
  2. 本地化(未完成)

URL:http://www.bioinformatics.nl/emboss-explorer/
網站概覽:概覽

設定“word size = 2”,得到的結果如下,並不能觀察到直觀的關系。
size值為2的結果
設定“word size = 3”,得到的結果如下,仍然不能觀察到直觀的關系。但是已經比之前要稀疏很多了。
在這里插入圖片描述
小結:實際上如果只用gene序列的話,可能出現太寬泛的問題,因為很多的蛋白都有不止一個codon,所以我們進一步采用對蛋白質進行探究。

采用蛋白質進行dotplot

使用Biopython庫對原序列進行翻譯,得到結果,重新進行dotplot。閾值設定為2。
蛋白質對比結果

使用矩陣進行打分(積分+罰分)

BLOSUM62的規則

BLOSUM62矩陣圖
兩條序列通過BLOSUM的打分政策,通過積分和罰分的方式,最終得到兩條序列的最終打分,中間的打分過程則需要用到最優化(optimal processing)。

空位罰分

由於不可能所有的匹配都是按順序的,所以中間需要適時進行空位罰分,從而進行一些Global內部的Local化。以下是兩種罰分的方式。
兩種罰分的e.g.

最優化(optimization)

使用needle軟件進行在線global對比。

參考https://www.cnblogs.com/zhengjm/p/12602522.html
在這里插入圖片描述

本地實現打分運算

以上的結果都是基於在線端實現的,下面我們使用了本地化的Bio庫進行了運算,可以彌補批量運算的缺陷。但是經過實地測試,如果出現長序列的pairwise運算,對內存的壓力依舊很大。
我們一開始使用了兩端全序列進行運算,而不是選擇中間的一部分Gene進行運算,內存消耗到一定的量之后程序中斷,遞出報錯。
示意圖

調用BIO庫進行本地運算

經過查詢我們發現對於比對,已經有很多人提供了大量的庫可以使用,這里我們選擇了使用范圍較廣的biopython庫。
biopython中提供了大量的矩陣和選項供使用。相關的代碼請見附錄。
各種矩陣的示意
相關的簡要使用說明

"""
The names of the alignment functions in this module follow the
convention
<alignment type>XX
where <alignment type> is either "global" or "local" and XX is a 2
character code indicating the parameters it takes.  The first
character indicates the parameters for matches (and mismatches), and
the second indicates the parameters for gap penalties.

The match parameters are::

    CODE  DESCRIPTION
    x     No parameters. Identical characters have score of 1, otherwise 0.
    m     A match score is the score of identical chars, otherwise mismatch
          score.
    d     A dictionary returns the score of any pair of characters.
    c     A callback function returns scores.

The gap penalty parameters are::

    CODE  DESCRIPTION
    x     No gap penalties.
    s     Same open and extend gap penalties for both sequences.
    d     The sequences have different open and extend gap penalties.
    c     A callback function returns the gap penalties.
"""

這里我們選擇globaldd方法:

# arguments: seq1, seq2, matrix, gap_penalty_of_seq1, extendpenalty_of_seq1, gap_penalty_of_seq2, extendpenalty_of_seq2 
pairwise2.align.globaldd(str(seq1).strip("*"), str(seq2).strip("*"), matrix, -10, -.5, -10, -.5)

所得結果和線上接近(可能是因為刪除終止符號的原因?),如下所示:

MFLKLVDDHA-LVVNVLLWCVVLIVILLVCITIIKLIKLCFTCHMFCNRTVYGPIKNVYHIYQSYMHIDPFPKRVIDF--
|......... |.||..|......|.|||...|.....||..|   ||.......|.....|.......  ..||.|.  
MYSFVSEETGTLIVNSVLLFLAFVVFLLVTLAILTALRLCAYC---CNIVNVSLVKPSFYVYSRVKNLN--SSRVPDLLV
  Score=61

手動計算

方式

  1. 擴列
  2. 帶有方向性的順序計算
  3. 回溯計算(traceback)

一些局限性

查詢字典的過程中需要三個步驟:

  1. 得到需求(查詢矩陣)
  2. 翻閱字典(BLOSUM62)
  3. 得到結果(填充矩陣)

平均三個過程至少需要2s,一共耗時6s。假設我們的有m×n大小的對比矩陣,如果m和n的大小差距不大,則假定中間值為x
查詢BLOSUM62的過程中,需要的耗時約為6*x(s)。蛋白質最少需要大約20個左右的殘基才能組成一個具有生物功能的3D結構,如果我們忽略初始的行列,最少的矩陣大小為20×20 ,那么至少需要 400×6 = 2400(s) = 40(min)才能完成矩陣的運算。
以上的步驟只是包含了查詢的過程,實際的計分過程中還涉及到一些邏輯運算(簡單的比大小工作)。所以需要消耗的時間可能遠超過1個小時。
公式
但是手動的計算能夠加深對整體公式的了解,所以我把原來的序列截斷一部分,僅僅留下其中匹配較好的一部分加以計算和最優化。

手動計算過程

以下過程是通過全局比對的方式進行,但是回溯的路徑上符合兩個條件:

  1. 沒有負值
  2. 最后的值:17是所有值中的最大值

所以可以認為此結果也是局部比對(Waterman&Smith Algorithm)的結果。
簡單手繪

局部的序列的次優比對

局部序列的最優比對原理
原理

局部次優比對的運算結果

計算過程仿照之前,但是由於我們的提取序列和之前的序列不太合適,如果直接盲目采用Local運算,並且取次優結果的話,得到的結果會非常不可靠(匹配度非常理想的兩條序列往往不能采取次優運算)。

附錄

# !/usr/bin/env/python3
# -*- coding:UTF-8 -*-
"""
# Time:2020年3月31日11:01:16
# Author:zhengjm
"""

import os
import Bio
import Bio.SeqIO
import Bio.Align
from Bio import pairwise2
from Bio.pairwise2 import format_alignment
from Bio.SubsMat import MatrixInfo as matlist


matrix = matlist.blosum62
path = os.getcwd()

file = path + '/compare.fasta'
compare = Bio.SeqIO.parse(file, format='fasta')
seq_list = []
for i in compare:
    seq_list.append(i.seq)
    # print(i.seq)

seq1 = seq_list[0]
seq2 = seq_list[1]


# caution: end sign (e.g."*" ) should not appear in seq.
# penalty should be negative
# arguments(seq1, seq2, matrix, gap_penalty_of_seq1, extendpenalty_of_seq1, gap_penalty_of_seq2, extendpenalty_of_seq2 )
test_new = pairwise2.align.globaldd(str(seq1).strip("*"), str(seq2).strip("*"), matrix, -10, -.5, -10, -.5)
for test in test_new:
    print(format_alignment(*test))



相關引用

[1]佚名. Different alignment results between Emboss Needle and Biopython pairwise2EB/OL[2020–04–02]. https://www.biostars.org/p/307285/.
[2]陳銘. 生物信息學第二版陳銘.pdf[M]. .


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM