Needleman-wunsch algorithm is a sequence alignment algorithm based on dynamic programming algorithm.
Sheng Xin class to learn the algorithm, the class is free to work, with Python implementation.
defintroduce ():Print("*********************************************") Print("Welcome to use short sequence alignment tool!") Print("Author:chaz") Print("input1:long Sequence!!!!!") Print("input2:short Sequence!!!!!") Print("*********************************************")defMatrix (seq1, SEQ2): Input_1=[] input_2= [] forIinchRange (len (seq1)): Input_1.append (i*-4) forIinchRange (len (SEQ2)): Input_2.append (i*-4) returninput_1, Input_2defmatchbase (Base1, base2):ifBase1 = =Base2:return "Match" Else: return "mismatch"defGetscore (i, J, Result_match): Num_s1="("+ STR (j-1) +","+str (i-1) +")"Num_si="("+ STR (j-1) +","+ STR (i) +")"NUM_SJ="("+ STR (j) +","+ STR (i-1) +")" ifResult_match = ="Match": Score1= Score[num_s1] + 4Else: Score1= Score[num_s1]-3score_i= Score[num_si]-4Score_j= SCORE[NUM_SJ]-4Score_max=Max (Score1, Score_i, Score_j) a="("+ STR (j) +","+str (i) +")" ifScore_max = =Score1:con[a]=Score_maxelifScore_max = =Score_i:a_i[a]=Score_maxElse: B_j[a]=Score_max Score[a]=Score_maxdefGetPath (J, I,seq1, Seq2,flag): a="("+ STR (j) +","+ STR (i) +")"score_res1=Con.get (a) Score_res2=A_i.get (a) Score_res3=B_j.get (a)ifScore_res1! =None:res1.append (Seq1[i]) res2.append (Seq2[j])ifj = =0:returnRes2 Res_j= GetPath (J-1, i-1, seq1, Seq2,flag)elifScore_res2:res1.append ("-") Res2.append (Seq2[j])ifj = =0:returnRes2 Res_j= GetPath (j-1, I, seq1, Seq2,flag)Else: ifScore_res3! =None:res2.append ("-") Res1.append (Seq1[i]) flag=FalseElse: Res2.append (Seq2[j]) res1.append (Seq1[i]) flag=Trueifj = =0:returnRes2 Res_j= GetPath (j,i-1, seq1, Seq2,flag)returnRes_jdefRun (seq1, SEQ2): input_1, Input_2=Matrix (seq1, SEQ2) forIinchRange (len (input_1)): s="(0,"+ STR (i) +")"Score[s]=Input_1[i] forIinchRange (len (input_2)): s="("+ STR (i) +", 0)"Score[s]=Input_2[i] forJinchRange (len (SEQ2)-1): J+ = 1 forIinchRange (len (seq1)-1): I+ = 1Result_match=matchbase (Seq1[i],seq2[j]) Getscore (i, J, Result_match) flag=True Res_j= GetPath (len (SEQ2)-1, Len (seq1)-1, seq1, Seq2,flag)returnRes_jif __name__=="__main__": Flag=True while(flag): Introduce () seq1= Input ("Please input long sequence:") SEQ2= Input ("Please input short sequence:") #seq1 = "ATTC" #seq2 = "TT" #seq1 = "AAATTTCC" #seq2 = "TTT"res1=[] Res2=[] Con={} a_i={} B_j={} score={} seq1="0"+seq1.upper () seq2="0"+seq2.upper () Res_j=Run (seq1, SEQ2) res_j.reverse () Res1.reverse ()Print(" ". Join (RES1))Print(" ". Join (Res_j)) TMP= Input ("whether to continue to judge: [y/n]") ifTmp.strip () = ="N": Flag=FalseElse: Flag= True
Needleman-wunsch Algorithm Python code implementation