📄 xscore.c
字号:
void set_score_user_dnamatrix(ButtoN but){ if(get_user_matrixname(score_dnamtrxname,score_dnamatrix,score_dna_xref,3,&score_dnamatnum,scorednamattext)) { calc_colscores(residue_exceptions,TRUE); SetValue(score_dnamatrix_list,score_dnamatnum); }} void set_score_dnamatrix(GrouP g){ int tmp; tmp = GetValue(g); if(tmp>0 && tmp<3) { score_dnamatnum=tmp; } else { if (score_dnamtrxname[0]=='\0') { get_user_matrixname(score_dnamtrxname,score_dnamatrix,score_dna_xref,3,&score_dnamatnum,scorednamattext); } else score_dnamatnum=3; } calc_colscores(residue_exceptions,TRUE); SetValue(score_dnamatrix_list,score_dnamatnum);} void set_segment_user_dnamatrix(ButtoN but){ if(get_user_matrixname(segment_dnamtrxname,segment_dnamatrix,segment_dna_xref,3,&segment_dnamatnum,segmentdnamattext)) calc_seg_exceptions(); if(segment_exceptions) show_segment_exceptions(); SetValue(seg_dnamatrix_list,segment_dnamatnum);}void set_segment_dnamatrix(GrouP g){ int tmp; tmp = GetValue(g); if(tmp>0 && tmp<3) { segment_dnamatnum=tmp; } else { if (segment_dnamtrxname[0]=='\0') { get_user_matrixname(segment_dnamtrxname,segment_dnamatrix,segment_dna_xref,3,&segment_dnamatnum,segmentdnamattext); } else segment_dnamatnum=3; } calc_seg_exceptions(); if(segment_exceptions) show_segment_exceptions(); SetValue(seg_dnamatrix_list,segment_dnamatnum);}static void calc_colscores(Boolean update_seqs,Boolean update_scores){ panel_data data; if(aln_mode==MULTIPLEM) { GetPanelExtra(seq_panel.seqs,&data); make_colscores(data); SetPanelExtra(seq_panel.seqs,&data); if(update_seqs) draw_seqs(seq_panel.seqs); if(update_scores) draw_colscores(seq_panel.seqs); } else { GetPanelExtra(prf_panel[0].seqs,&data); make_colscores(data); SetPanelExtra(prf_panel[0].seqs,&data); if(update_seqs) draw_seqs(prf_panel[0].seqs); if(update_scores) draw_colscores(prf_panel[0].seqs); GetPanelExtra(prf_panel[1].seqs,&data); make_colscores(data); SetPanelExtra(prf_panel[1].seqs,&data); if(update_seqs) draw_seqs(prf_panel[1].seqs); if(update_scores) draw_colscores(prf_panel[1].seqs); }} void calc_seg_exceptions(void){ if(aln_mode==MULTIPLEM) { calc_panel_segment_exceptions(seq_panel.seqs); } else { calc_panel_segment_exceptions(prf_panel[0].seqs); calc_panel_segment_exceptions(prf_panel[1].seqs); }}void show_segment_exceptions(void){ if(aln_mode==MULTIPLEM) { draw_seqs(seq_panel.seqs); } else { draw_seqs(prf_panel[0].seqs); draw_seqs(prf_panel[1].seqs); }}static void remove_short_segments(PaneL p){ int i,j,k,start; panel_data data; GetPanelExtra(p,&data); if(data.nseqs<=0) return;/* Reset all the exceptions - a value of 1 indicates an exception thatwill be displayed. A value of -1 is used to remember exceptions thatare temporarily hidden in the display */ for(i=0;i<data.nseqs;i++) for(j=0;j<data.ncols;j++) if(data.segment_exception[i][j] == -1) data.segment_exception[i][j] = 1; for(i=0;i<data.nseqs;i++) { start = -1; for(j=0;j<=data.ncols;j++) { if(start == -1) { if(data.segment_exception[i][j]==1) start=j; } else { if(j==data.ncols || data.segment_exception[i][j]==0) { if(j-start<length_cutoff) for(k=start;k<j;k++) data.segment_exception[i][k] = -1; start = -1; } } } } SetPanelExtra(p,&data);}static void calc_weights(PaneL p){ int i,j; int status; sint *weight; float dscore; FILE *tree; panel_data data;#ifdef UNIX char tree_name[FILENAMELEN]=".score.ph";#else char tree_name[FILENAMELEN]="tmp.ph";#endif GetPanelExtra(p,&data); if(data.nseqs<=0) return;/* if sequence weights have been calculated before - don't botherdoing it again (it takes too long). data.seqweight is set to NULL when new sequences are loaded. */ if(data.seqweight!=NULL) return; WatchCursor(); info("Calculating sequence weights...");/* count pairwise percent identities to make a phylogenetic tree */ if(data.nseqs>=2) { for (i=1;i<=data.nseqs;i++) { for (j=i+1;j<=data.nseqs;j++) { dscore = countid(i+data.firstseq,j+data.firstseq); tmat[i][j] = (100.0 - dscore)/100.0; tmat[j][i] = tmat[i][j]; } } if((tree = open_explicit_file(tree_name))==NULL) return; guide_tree(tree,data.firstseq+1,data.nseqs); status = read_tree(tree_name, data.firstseq, data.firstseq+data.nseqs); if (status == 0) return; } weight = (sint *) ckalloc( (data.firstseq+data.nseqs+1) * sizeof(sint) );/* get the sequence weights */ calc_seq_weights(data.firstseq, data.firstseq+data.nseqs,weight); if(data.seqweight==NULL) data.seqweight=(sint *)ckalloc((data.nseqs+1) * sizeof(sint)); for(i=data.firstseq;i<data.firstseq+data.nseqs;i++) data.seqweight[i-data.firstseq]=weight[i];/* clear the memory for the phylogenetic tree */ if (data.nseqs >= 2) { clear_tree(NULL); remove(tree_name); } ckfree(weight); SetPanelExtra(p,&data); info("Done."); ArrowCursor();}static void calc_panel_segment_exceptions(PaneL p){ int i,j; float sum,prev_sum; float gscale; sint **profile; sint *weight,sweight; sint *gaps; sint maxres; int max=0,offset; short *mat_xref, *matptr; sint matrix[NUMRES][NUMRES]; float *fsum; float *bsum; float *pscore; panel_data data; /* First, calculate sequence weights which will be used to build theprofile */ calc_weights(p); GetPanelExtra(p,&data); if(data.nseqs<=0) return; WatchCursor(); info("Calculating profile scores..."); for(i=0;i<data.nseqs;i++) for(j=0;j<data.ncols;j++) data.segment_exception[i][j]=0;/* get the comparison matrix for building the profile */ if(dnaflag) { if (segment_dnamatnum==1) { matptr = swgapdnamt; mat_xref = def_dna_xref; } else if (segment_dnamatnum==2) { matptr = clustalvdnamt; mat_xref = def_dna_xref; } else { matptr = segment_dnamatrix; mat_xref = segment_dna_xref; }/* get a positive matrix - then adjust it according to scale */ maxres = get_matrix(matptr, mat_xref, matrix, FALSE, 100);/* find the maximum value */ for(i=0;i<=max_aa;i++) for(j=0;j<=max_aa;j++) if(matrix[i][j]>max) max=matrix[i][j];/* subtract max*scale/2 from each matrix value */ offset=(float)(max*segment_dnascale)/20.0; for(i=0;i<=max_aa;i++) for(j=0;j<=max_aa;j++) matrix[i][j]-=offset; } else { if (segment_matnum==1) { matptr = gon80mt; mat_xref = def_aa_xref; } else if (segment_matnum==2) { matptr = gon120mt; mat_xref = def_aa_xref; } else if (segment_matnum==3) { matptr = gon250mt; mat_xref = def_aa_xref; } else if (segment_matnum==4) { matptr = gon350mt; mat_xref = def_aa_xref; } else { matptr = segment_matrix; mat_xref = segment_aa_xref; }/* get a negative matrix */ maxres = get_matrix(matptr, mat_xref, matrix, TRUE, 100); } profile = (sint **) ckalloc( (data.ncols+2) * sizeof (sint *) ); for(i=0; i<data.ncols+1; i++) profile[i] = (sint *) ckalloc( (LENCOL+2) * sizeof(sint) );/* calculate the profile */ gaps = (sint *) ckalloc( (data.ncols+1) * sizeof (sint) ); for (j=1; j<=data.ncols; j++) { gaps[j-1] = 0; for(i=data.firstseq+1;i<data.firstseq+data.nseqs;i++) if (j<seqlen_array[i]) if ((seq_array[i][j] < 0) || (seq_array[i][j] > max_aa)) gaps[j-1]++; } weight = (sint *) ckalloc( (data.firstseq+data.nseqs+1) * sizeof(sint) ); for(i=data.firstseq;i<data.firstseq+data.nseqs;i++) weight[i]=data.seqweight[i-data.firstseq]; build_profile(data.ncols,data.firstseq,data.firstseq+data.nseqs,matrix,weight,profile); sweight=0; for(i=data.firstseq;i<data.firstseq+data.nseqs;i++) sweight+=weight[i];/*Now, use the profile scores to mark segments of each sequence which scorebadly. */ fsum = (float *) ckalloc( (data.ncols+2) * sizeof (float) ); bsum = (float *) ckalloc( (data.ncols+2) * sizeof (float) ); pscore = (float *) ckalloc( (data.ncols+2) * sizeof (float) ); for(i=data.firstseq+1;i<data.firstseq+data.nseqs+1;i++) {/* In a forward phase, sum the profile scores. Mark negative sums as exceptions.If the sum is positive, then it gets reset to 0. */ sum=0.0; for(j=1;j<=seqlen_array[i];j++) { gscale = (float)(data.nseqs-gaps[j-1]) / (float)data.nseqs; if(seq_array[i][j]<0 || seq_array[i][j]>=max_aa) { pscore[j-1]=0.0; sum=0.0; } else pscore[j-1]=(profile[j][seq_array[i][j]]- weight[i-1]*matrix[seq_array[i][j]][seq_array[i][j]])*gscale/sweight; sum+=pscore[j-1]; if(sum>0.0) sum=0.0; fsum[j-1]=sum; }/* trim off any positive scoring residues from the end of the segments */ prev_sum=0; for(j=seqlen_array[i]-1;j>=0;j--) { if(prev_sum>=0.0 && fsum[j]<0.0 && pscore[j]>=0.0) fsum[j]=0.0; prev_sum=fsum[j]; }/* Now, in a backward phase, do the same summing process. */ sum=0.0; for(j=seqlen_array[i];j>=1;j--) { if(seq_array[i][j]<0 || seq_array[i][j]>=max_aa) sum=0; else sum+=pscore[j-1]; if(sum>0.0) sum=0.0; bsum[j-1]=sum; }/* trim off any positive scoring residues from the start of the segments */ prev_sum=0; for(j=0;j<seqlen_array[i];j++) { if(prev_sum>=0.0 && bsum[j]<0.0 && pscore[j]>=0.0) bsum[j]=0.0; prev_sum=bsum[j]; }/*Mark residues as exceptions if they score negative in the forward AND backward directions. */ for(j=1;j<=seqlen_array[i];j++) if(fsum[j-1]<0.0 && bsum[j-1]<0.0) if(seq_array[i][j]>=0 && seq_array[i][j]<max_aa) data.segment_exception[i-data.firstseq-1][j-1]=-1;/*if(i==5) {fprintf(stderr,"%4d ",j);fprintf(stderr,"\n");for(j=0;j<seqlen_array[i];j++)fprintf(stderr,"%4d ",(int)fsum[j]);fprintf(stderr,"\n");}*/ } for(i=0; i<data.ncols+1; i++) ckfree(profile[i]); ckfree(profile); ckfree(weight); ckfree(gaps); ckfree(pscore); ckfree(fsum); ckfree(bsum); SetPanelExtra(p,&data);/* Finally, apply the length cutoff to the segments - removing segments shorterthan the cutoff */ remove_short_segments(p); info("Done."); ArrowCursor();}void set_segment_dnascale(BaR bar, GraphiC p, Nlm_Int2 newval, Nlm_Int2 oldval){ char str[FILENAMELEN]; panel_data data; segment_dnascale = newval+1; calc_seg_exceptions(); if(segment_exceptions) show_segment_exceptions(); sprintf(str,"DNA Marking Scale: %2d",segment_dnascale); SetTitle(segmentdnascaletext,str);} static void build_profile(int prf_length,int first_seq,int last_seq,sint matrix[NUMRES][NUMRES],sint *weight,sint **profile){ sint **weighting, d, i, res; sint r, pos; int f; weighting = (sint **) ckalloc( (NUMRES+2) * sizeof (sint *) ); for (i=0;i<NUMRES+2;i++) weighting[i] = (sint *) ckalloc( (prf_length+2) * sizeof (sint) ); for (r=0; r<prf_length; r++) { for (d=0; d<=max_aa; d++) { weighting[d][r] = 0; for (i=first_seq; i<last_seq; i++) if (r+1<seqlen_array[i+1]) if (d == seq_array[i+1][r+1]) weighting[d][r] += weight[i]; } weighting[gap_pos1][r] = 0; for (i=first_seq; i<last_seq; i++) if (r+1<seqlen_array[i+1]) if (gap_pos1 == seq_array[i+1][r+1]) weighting[gap_pos1][r] += weight[i]; weighting[gap_pos2][r] = 0; for (i=first_seq; i<last_seq; i++) if (r+1<seqlen_array[i+1]) if (gap_pos2 == seq_array[i+1][r+1]) weighting[gap_pos2][r] += weight[i]; } for (pos=0; pos< prf_length; pos++) { for (res=0; res<=max_aa; res++) { f = 0; for (d=0; d<=max_aa; d++) f += (weighting[d][pos] * matrix[d][res]); f += (weighting[gap_pos1][pos] * matrix[gap_pos1][res]); f += (weighting[gap_pos2][pos] * matrix[gap_pos2][res]); profile[pos+1][res] = f; } f = 0; for (d=0; d<=max_aa; d++) f += (weighting[d][pos] * matrix[d][gap_pos1]); f += (weighting[gap_pos1][pos] * matrix[gap_pos1][gap_pos1]); f += (weighting[gap_pos2][pos] * matrix[gap_pos2][gap_pos1]); profile[pos+1][gap_pos1] = f; f = 0; for (d=0; d<=max_aa; d++) f += (weighting[d][pos] * matrix[d][gap_pos2]); f += (weighting[gap_pos1][pos] * matrix[gap_pos1][gap_pos2]); f += (weighting[gap_pos2][pos] * matrix[gap_pos2][gap_pos2]); profile[pos+1][gap_pos2] = f; } for (i=0;i<=max_aa;i++) weighting[i]=ckfree((void *)weighting[i]); weighting=ckfree((void *)weighting);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -