📄 showpair.c
字号:
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <math.h>#include "clustalw.h" static void make_p_ptrs(sint *tptr, sint *pl, sint naseq, sint l);static void make_n_ptrs(sint *tptr, sint *pl, sint naseq, sint len);static void put_frag(sint fs, sint v1, sint v2, sint flen);static sint frag_rel_pos(sint a1, sint b1, sint a2, sint b2);static void des_quick_sort(sint *array1, sint *array2, sint array_size);static void pair_align(sint seq_no, sint l1, sint l2);/** Prototypes*//** Global variables*/extern sint *seqlen_array;extern char **seq_array;extern sint dna_ktup, dna_window, dna_wind_gap, dna_signif; /* params for DNA */extern sint prot_ktup,prot_window,prot_wind_gap,prot_signif; /* params for prots */extern sint nseqs;extern Boolean dnaflag;extern double **tmat;extern sint max_aa;extern sint max_aln_length;static sint next;static sint curr_frag,maxsf,vatend;static sint **accum;static sint *diag_index;static char *slopes;sint ktup,window,wind_gap,signif; /* Pairwise aln. params */sint *displ;sint *zza, *zzb, *zzc, *zzd;extern Boolean percent;static void make_p_ptrs(sint *tptr,sint *pl,sint naseq,sint l){ static sint a[10]; sint i,j,limit,code,flag; char residue; for (i=1;i<=ktup;i++) a[i] = (sint) pow((double)(max_aa+1),(double)(i-1)); limit = (sint) pow((double)(max_aa+1),(double)ktup); for(i=1;i<=limit;++i) pl[i]=0; for(i=1;i<=l;++i) tptr[i]=0; for(i=1;i<=(l-ktup+1);++i) { code=0; flag=FALSE; for(j=1;j<=ktup;++j) { residue = seq_array[naseq][i+j-1]; if((residue<0) || (residue > max_aa)){ flag=TRUE; break; } code += ((residue) * a[j]); } if(flag) continue; ++code; if(pl[code]!=0) tptr[i]=pl[code]; pl[code]=i; }}static void make_n_ptrs(sint *tptr,sint *pl,sint naseq,sint len){ static sint pot[]={ 0, 1, 4, 16, 64, 256, 1024, 4096 }; sint i,j,limit,code,flag; char residue; limit = (sint) pow((double)4,(double)ktup); for(i=1;i<=limit;++i) pl[i]=0; for(i=1;i<=len;++i) tptr[i]=0; for(i=1;i<=len-ktup+1;++i) { code=0; flag=FALSE; for(j=1;j<=ktup;++j) { residue = seq_array[naseq][i+j-1]; if((residue<0) || (residue>4)){ flag=TRUE; break; } code += ((residue) * pot[j]); /* DES */ } if(flag) continue; ++code; if(pl[code]!=0) tptr[i]=pl[code]; pl[code]=i; }}static void put_frag(sint fs,sint v1,sint v2,sint flen){ sint end; accum[0][curr_frag]=fs; accum[1][curr_frag]=v1; accum[2][curr_frag]=v2; accum[3][curr_frag]=flen; if(!maxsf) { maxsf=1; accum[4][curr_frag]=0; return; } if(fs >= accum[0][maxsf]) { accum[4][curr_frag]=maxsf; maxsf=curr_frag; return; } else { next=maxsf; while(TRUE) { end=next; next=accum[4][next]; if(fs>=accum[0][next]) break; } accum[4][curr_frag]=next; accum[4][end]=curr_frag; }}static sint frag_rel_pos(sint a1,sint b1,sint a2,sint b2){ sint ret; ret=FALSE; if(a1-b1==a2-b2) { if(a2<a1) ret=TRUE; } else { if(a2+ktup-1<a1 && b2+ktup-1<b1) ret=TRUE; } return ret;}static void des_quick_sort(sint *array1, sint *array2, sint array_size)/* *//* Quicksort routine, adapted from chapter 4, page 115 of software tools *//* by Kernighan and Plauger, (1986) *//* Sort the elements of array1 and sort the *//* elements of array2 accordingly *//* */{ sint temp1, temp2; sint p, pivlin; sint i, j; sint lst[50], ust[50]; /* the maximum no. of elements must be*/ /* < log(base2) of 50 */ lst[1] = 1; ust[1] = array_size-1; p = 1; while(p > 0) { if(lst[p] >= ust[p]) p--; else { i = lst[p] - 1; j = ust[p]; pivlin = array1[j]; while(i < j) { for(i=i+1; array1[i] < pivlin; i++) ; for(j=j-1; j > i; j--) if(array1[j] <= pivlin) break; if(i < j) { temp1 = array1[i]; array1[i] = array1[j]; array1[j] = temp1; temp2 = array2[i]; array2[i] = array2[j]; array2[j] = temp2; } } j = ust[p]; temp1 = array1[i]; array1[i] = array1[j]; array1[j] = temp1; temp2 = array2[i]; array2[i] = array2[j]; array2[j] = temp2; if(i-lst[p] < ust[p] - i) { lst[p+1] = lst[p]; ust[p+1] = i - 1; lst[p] = i + 1; } else { lst[p+1] = i + 1; ust[p+1] = ust[p]; ust[p] = i - 1; } p = p + 1; } } return;}static void pair_align(sint seq_no,sint l1,sint l2){ sint pot[8],i,j,l,m,flag,limit,pos,tl1,vn1,vn2,flen,osptr,fs; sint tv1,tv2,encrypt,subt1,subt2,rmndr; char residue; if(dnaflag) { for(i=1;i<=ktup;++i) pot[i] = (sint) pow((double)4,(double)(i-1)); limit = (sint) pow((double)4,(double)ktup); } else { for (i=1;i<=ktup;i++) pot[i] = (sint) pow((double)(max_aa+1),(double)(i-1)); limit = (sint) pow((double)(max_aa+1),(double)ktup); } tl1 = (l1+l2)-1; for(i=1;i<=tl1;++i) { slopes[i]=displ[i]=0; diag_index[i] = i; } /* increment diagonal score for each k_tuple match */ for(i=1;i<=limit;++i) { vn1=zzc[i]; while(TRUE) { if(!vn1) break; vn2=zzd[i]; while(vn2 != 0) { osptr=vn1-vn2+l2; ++displ[osptr]; vn2=zzb[vn2]; } vn1=zza[vn1]; } }/* choose the top SIGNIF diagonals */ des_quick_sort(displ, diag_index, tl1); j = tl1 - signif + 1; if(j < 1) j = 1; /* flag all diagonals within WINDOW of a top diagonal */ for(i=tl1; i>=j; i--) if(displ[i] > 0) { pos = diag_index[i]; l = (1 >pos-window) ? 1 : pos-window; m = (tl1<pos+window) ? tl1 : pos+window; for(; l <= m; l++) slopes[l] = 1; } for(i=1; i<=tl1; i++) displ[i] = 0; curr_frag=maxsf=0; for(i=1;i<=(l1-ktup+1);++i) { encrypt=flag=0; for(j=1;j<=ktup;++j) { residue = seq_array[seq_no][i+j-1]; if((residue<0) || (residue>max_aa)) { flag=TRUE; break; } encrypt += ((residue)*pot[j]); } if(flag) continue; ++encrypt; vn2=zzd[encrypt]; flag=FALSE; while(TRUE) { if(!vn2) { flag=TRUE; break; } osptr=i-vn2+l2; if(slopes[osptr]!=1) { vn2=zzb[vn2]; continue; } flen=0; fs=ktup; next=maxsf; /* * A-loop */ while(TRUE) { if(!next) { ++curr_frag; if(curr_frag>=2*max_aln_length) { info("(Partial alignment)"); vatend=1; return; } displ[osptr]=curr_frag; put_frag(fs,i,vn2,flen); } else { tv1=accum[1][next]; tv2=accum[2][next]; if(frag_rel_pos(i,vn2,tv1,tv2)) { if(i-vn2==accum[1][next]-accum[2][next]) { if(i>accum[1][next]+(ktup-1)) fs=accum[0][next]+ktup; else { rmndr=i-accum[1][next]; fs=accum[0][next]+rmndr; } flen=next; next=0; continue; } else { if(displ[osptr]==0) subt1=ktup; else { if(i>accum[1][displ[osptr]]+(ktup-1)) subt1=accum[0][displ[osptr]]+ktup; else { rmndr=i-accum[1][displ[osptr]]; subt1=accum[0][displ[osptr]]+rmndr; } } subt2=accum[0][next]-wind_gap+ktup; if(subt2>subt1) { flen=next; fs=subt2; } else { flen=displ[osptr]; fs=subt1; } next=0; continue; } } else { next=accum[4][next]; continue; } } break; } /* * End of Aloop */ vn2=zzb[vn2]; } } vatend=0;} void show_pair(sint istart, sint iend, sint jstart, sint jend){ sint i,j,dsr; double calc_score; accum = (sint **)ckalloc( 5*sizeof (sint *) ); for (i=0;i<5;i++) accum[i] = (sint *) ckalloc((2*max_aln_length+1) * sizeof (sint) ); displ = (sint *) ckalloc( (2*max_aln_length +1) * sizeof (sint) ); slopes = (char *)ckalloc( (2*max_aln_length +1) * sizeof (char)); diag_index = (sint *) ckalloc( (2*max_aln_length +1) * sizeof (sint) ); zza = (sint *)ckalloc( (max_aln_length+1) * sizeof (sint) ); zzb = (sint *)ckalloc( (max_aln_length+1) * sizeof (sint) ); zzc = (sint *)ckalloc( (max_aln_length+1) * sizeof (sint) ); zzd = (sint *)ckalloc( (max_aln_length+1) * sizeof (sint) ); if(dnaflag) { ktup = dna_ktup; window = dna_window; signif = dna_signif; wind_gap = dna_wind_gap; } else { ktup = prot_ktup; window = prot_window; signif = prot_signif; wind_gap = prot_wind_gap; } fprintf(stdout,"\n\n"); for(i=istart+1;i<=iend;++i) { if(dnaflag) make_n_ptrs(zza,zzc,i,seqlen_array[i]); else make_p_ptrs(zza,zzc,i,seqlen_array[i]); for(j=jstart+2;j<=jend;++j) { if(dnaflag) make_n_ptrs(zzb,zzd,j,seqlen_array[j]); else make_p_ptrs(zzb,zzd,j,seqlen_array[j]); pair_align(i,seqlen_array[i],seqlen_array[j]); if(!maxsf) calc_score=0.0; else { calc_score=(double)accum[0][maxsf]; if(percent) { dsr=(seqlen_array[i]<seqlen_array[j]) ? seqlen_array[i] : seqlen_array[j]; calc_score = (calc_score/(double)dsr) * 100.0; } }/* tmat[i][j]=calc_score; tmat[j][i]=calc_score;*/ tmat[i][j] = (100.0 - calc_score)/100.0; tmat[j][i] = (100.0 - calc_score)/100.0; if(calc_score>0.1) info("Sequences (%d:%d) Aligned. Score: %lg", (pint)i,(pint)j,calc_score); else info("Sequences (%d:%d) Not Aligned", (pint)i,(pint)j); } } for (i=0;i<5;i++) accum[i]=ckfree((void *)accum[i]); accum=ckfree((void *)accum); displ=ckfree((void *)displ); slopes=ckfree((void *)slopes); diag_index=ckfree((void *)diag_index); zza=ckfree((void *)zza); zzb=ckfree((void *)zzb); zzc=ckfree((void *)zzc); zzd=ckfree((void *)zzd);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -