DNA序列局部比对(Smith–Waterman algorithm)

生物信息原理作业第三弹:DNA序列局部比对,利用Smith–Waterman算法,python3.6代码实现。

实例以及原理均来自https://en.wikipedia.org/wiki/Smith%E2%80%93Waterman_algorithm

 1 import numpy as np
 2 import pandas as pd
 3 sequence1 = ‘TGTTACGG‘
 4 sequence2 = ‘GGTTGACTA‘
 5 s1 = ‘‘
 6 s2 = ‘‘
 7 gap = -2
 8 score_matrix = pd.read_excel(‘score.xlsx‘)      #匹配得分
 9 print(score_matrix)
10 best_matrix = np.empty(shape= (len(sequence2)+1,len(sequence1)+1),dtype = int)
11 def get_match_score(s1,s2):
12     score = score_matrix[s1][s2]
13     return score
14
15 def get_matrix_max(matrix):                    #得到最大分数下标
16     Max = matrix.max()
17     for i in range(len(sequence2)+1):
18         for j in range(len(sequence1)+1):
19             if matrix[i][j] == Max:
20                 return (i,j)
21
22 for i in range(len(sequence2)+1):
23     for j in range(len(sequence1)+1):
24         if i == 0 or j == 0:
25             best_matrix[i][j] = 0
26         else:
27             match = get_match_score(sequence2[i-1],sequence1[j-1])
28             gap1_score = best_matrix[i-1][j] + gap
29             gap2_score = best_matrix[i][j-1] + gap
30             match_score = best_matrix[i-1][j-1]+match
31             score = max(gap1_score,gap2_score,match_score)
32             if score>0:
33                 best_matrix[i][j] = score
34             else:
35                 best_matrix[i][j] = 0
36 print(best_matrix)
37
38 #traceback
39 i,j = get_matrix_max(best_matrix)
40 while(best_matrix[i][j]!= 0):
41     match = get_match_score(sequence2[i-1],sequence1[j-1])
42     if i>0 and j>0 and best_matrix[i][j] == best_matrix[i-1][j-1]+match:
43         s1 += sequence1[j-1]
44         s2 += sequence2[i-1]
45         i-=1;j-=1
46     elif i>0 and best_matrix[i,j] == best_matrix[i-1,j]+gap:
47         s1+=‘-‘
48         s2+=sequence2[i-1]
49         i-=1
50     else:
51         s1+=sequence1[j-1]
52         s2+=‘-‘
53         j-=1
54 print(s1[::-1]+‘\n‘+s2[::-1])

感觉我的得分矩阵写成Excel不必要,等我熟悉一下Numpy和Python命令行之后会修改的。

时间: 2024-10-27 06:52:54

DNA序列局部比对(Smith–Waterman algorithm)的相关文章

[Sequence Alignment Methods] Smith–Waterman algorithm

Smith–Waterman algorithm 首先需要澄清一个事实,Smith–Waterman algorithm是求两个序列的最佳subsequence匹配,与之对应的算法但是求两个序列整体匹配的算法是Needleman-Wusch algorithm,即 Smith–Waterman algorithm:Local Needleman-Wusch algorithm: Global Needleman-Wusch algorithm与longest common subsequence

HDU 1560 DNA sequence(DNA序列)

p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-size: 10.5000pt } h1 { margin-top: 5.0000pt; margin-bottom: 5.0000pt; text-align: center; font-family: 宋体; color: rgb(26,92,200); font-weight: bold; fo

[SCU 4501] DNA序列 (状压DP)

SCU - 4501 给定若干个DNA序列,求最短包含所有序列的长度 包含不一定是连续包含,可以不是子串 状压DP 依次构造每一位 把每个字符串走到的位置标记一下,压成6进制数 然后每个状态拓展一个字符串 然后同时拓展其他所有下一位与其相同的串 然后把状态丢到队列里转移,当每个串都走到结尾时输出答案 可以保证答案最多不超过40 时间复杂度 O(ans?lenN) #pragma comment(linker, "/STACK:102400000,102400000") #include

环状DNA序列

大意: 一个DNA序列是环状的,这意味着有N个碱基的序列有N种表示方法(假设无重复).而这N个序列有一种最小的表示,这个最小表示的意思是这个序列的字典序最小(字典序的意思是在字典中的大小 比如ABC<ACB,B<BCD,EF<G) 方法:在一个序列中从任意两个位置开始,产生的序列的大小是可以比较的.然后利用这种比较方法找出最小值 #include <iostream> using namespace std; #define MAX 105 int lessthan(char

2015年“深圳杯”数学建模夏令营 B题:DNA序列的k-mer index问题

这个问题来自 DNA序列的k-mer index问题. 给定一个DNA序列,这个系列只含有4个字母ATCG,如 S ="CTGTACTGTAT".给定一个整数值k,从S的第一个位置开始,取一连续k个字母的短串,称之为k-mer(如k= 5,则此短串为CTGTA), 然后从S的第二个位置, 取另一k-mer(如k= 5,则此短串为TGTAC),这样直至S的末端,就得一个集合,包含全部k-mer . 如对序列S来说,所有5-mer为 {CTGTA,TGTAC,GTACT,TACTG,ACT

利用Python【Orange】结合DNA序列进行人种预测

http://blog.csdn.net/jj12345jj198999/article/details/8951120 coursera上 web intelligence and big data 终于布置了HW7,这一次的要求是对一系列DNA序列进行预测,具体说明如下: Data Analytics Assignment (for HW7) Predict the Ethnicity of Individuals from their Genes =====================

华为OJ平台——DNA序列

题目描述: 一个DNA序列由A/C/G/T四个字母的排列组合组成.G和C的比例(定义为GC-Ratio)是序列中G和C两个字母的总的出现次数除以总的字母数目(也就是序列长度).在基因工程中,这个比例非常重要.因为高的GC-Ratio可能是基因的起始点. 给定一个很长的DNA序列,以及要求的最小子序列长度,研究人员经常会需要在其中找出GC-Ratio最高的子序列. 输入 输入一个string型基因序列,和int型子串的长度 输出 找出GC比例最高的字串 样例输入 AACTGTGCACGACCTGA

华为OJ:DNA序列

初始化两个数组,一个序列数值数组K[N],一个序列和数组SUM[N],先遍历一边序列,为C或者G则K[i]为1,否则则置为0,然后计算连续M个K[I]之和存入SUM就行. import java.util.Scanner; public class DNAsquence { public static void main(String args[]){ Scanner input=new Scanner(System.in); String s=input.next(); int n=input

2015年“深圳杯”数学建模夏令营-B题:DNA序列的k-mer index 问题

这是一个山科大的同学给我的一个问题,向我询问一下思路,对于数学建模,我没太多的了解,所以只能用计算机程序的方法来解答. 这是具体的问题: 这个问题来自 DNA序列的k-mer index问题. 给定一个DNA序列,这个系列只含有4个字母ATCG,如 S ="CTGTACTGTAT".给定一个整数值k,从S的第一个位置开始,取一连续k个字母的短串,称之为k-mer(如k= 5,则此短串为CTGTA), 然后从S的第二个位置, 取另一k-mer(如k= 5,则此短串为TGTAC),这样直至