📄 xscore.c
字号:
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <vibrant.h>
#include <document.h>
#include "clustalw.h"
#include "xmenu.h"
static void build_profile(int prf_length,int first_seq,int last_seq,sint matrix[NUMRES][NUMRES],
sint *weight,sint **profile);
static void calc_colscores(Boolean update_seqs,Boolean update_scores);
static void calc_panel_segment_exceptions(PaneL p);
static void calc_weights(PaneL p);
static void remove_short_segments(PaneL p);
extern Boolean aln_mode;
extern Boolean profile1_empty,profile2_empty;
extern int score_cutoff; /* cutoff for residue exceptions */
extern int score_hwin; /* half window for summing alignment column scores */
extern int score_scale;
extern int segment_dnascale;
extern int length_cutoff; /* cutoffs for segment exceptions */
extern Boolean residue_exceptions;
extern Boolean segment_exceptions;
extern int score_matnum;
extern char score_mtrxname[];
extern int segment_matnum;
extern char segment_mtrxname[];
extern int score_dnamatnum;
extern char score_dnamtrxname[];
extern int segment_dnamatnum;
extern char segment_dnamtrxname[];
extern IteM segment_item;
extern double **tmat;
extern short score_matrix[];
extern short score_aa_xref[];
extern short segment_matrix[];
extern short segment_aa_xref[];
extern short score_dnamatrix[];
extern short score_dna_xref[];
extern short segment_dnamatrix[];
extern short segment_dna_xref[];
extern WindoW mainw;
extern FonT datafont;
extern short idmat[];
extern short def_dna_xref[],def_aa_xref[];
extern short swgapdnamt[],clustalvdnamt[]; /* used for alignment scores */
extern short gon80mt[],gon120mt[],gon250mt[],gon350mt[];
extern Boolean dnaflag;
extern sint max_aa;
extern sint *seqlen_array;
extern char **seq_array;
extern sint gap_pos1, gap_pos2;
extern sint *output_index;
extern spanel seq_panel; /* data for multiple alignment area */
extern spanel prf_panel[]; /* data for profile alignment areas */
extern PrompT residue_cutofftext;
extern PrompT length_cutofftext;
extern PrompT scorescaletext;
extern PrompT segmentdnascaletext;
extern PrompT scoremattext;
extern PrompT segmentmattext;
extern PrompT scorednamattext;
extern PrompT segmentdnamattext;
extern PopuP show_seg_toggle;
extern GrouP score_matrix_list,seg_matrix_list;
extern GrouP score_dnamatrix_list,seg_dnamatrix_list;
static Char filename[FILENAMELEN]; /* used in temporary file selection window */
void draw_colscores(PaneL p)
{
RecT block,r;
int i, b, x, y;
panel_data data;
UseWindow(mainw);
Select(p);
SelectFont(datafont);
GetPanelExtra(p, &data);
if(data.nseqs == 0) return;
if(data.colscore == NULL) return;
if(data.vcols<=0) return;
ObjectRect (p, &r);
InsetRect(&r,1,1);
block.bottom=r.bottom;
block.top=block.bottom-SCOREHEIGHT-1;
block.left=r.left;
block.right=r.right;
data_colors();
EraseRect(&block);
Gray();
r.left=block.left+data.charwidth;
r.bottom=b=block.bottom;
for(i=data.firstvcol;i<data.firstvcol+data.vcols && i<data.ncols;i++)
{
x=r.left;
MoveTo(x,b);
r.right=r.left+data.charwidth;
r.top=block.bottom-SCOREHEIGHT*(float)data.colscore[i]/100.0;
PaintRect(&r);
r.left+=data.charwidth;
}
black_on_white();
}
void make_colscores(panel_data data)
{
/* FILE *fd;*/
int n,i,s,p,r,r1;
short *mat_xref, *matptr;
float median,mean;
float t,q1,q3,ul;
float *seqdist,*sorteddist,diff;
sint maxres;
sint *seqvector;
sint *freq,**profile;
sint matrix[NUMRES][NUMRES];
Boolean include_gaps=FALSE;
panel_data data1;
if(dnaflag)
{
if (score_dnamatnum==1)
{
matptr = swgapdnamt;
mat_xref = def_dna_xref;
}
else if (score_dnamatnum==2)
{
matptr = clustalvdnamt;
mat_xref = def_dna_xref;
}
else
{
matptr = score_dnamatrix;
mat_xref = score_dna_xref;
}
}
else if (score_matnum==1)
{
matptr = idmat;
mat_xref = def_aa_xref;
}
else if (score_matnum==2)
{
matptr = gon80mt;
mat_xref = def_aa_xref;
}
else if (score_matnum==3)
{
matptr = gon120mt;
mat_xref = def_aa_xref;
}
else if (score_matnum==4)
{
matptr = gon250mt;
mat_xref = def_aa_xref;
}
else if (score_matnum==5)
{
matptr = gon350mt;
mat_xref = def_aa_xref;
}
else
{
matptr = score_matrix;
mat_xref = score_aa_xref;
}
maxres = get_matrix(matptr, mat_xref, matrix, FALSE, 100);
if (maxres == 0)
{
error("matrix not found for aln score");
return;
}
profile = (sint **) ckalloc( (data.ncols+2) * sizeof (sint *) );
for(p=0; p<data.ncols; p++)
profile[p] = (sint *) ckalloc( (max_aa+2) * sizeof(sint) );
freq = (sint *) ckalloc( (max_aa+2) * sizeof (sint) );
for(p=0;p<data.ncols;p++)
{
for(r=0;r<max_aa;r++)
freq[r]=0;
for(s=data.firstseq;s<data.firstseq+data.nseqs;s++)
if(p<seqlen_array[s+1] && seq_array[s+1][p+1]>=0 && seq_array[s+1][p+1]<max_aa)
{
freq[seq_array[s+1][p+1]]++;
}
for(r=0;r<max_aa;r++)
{
profile[p][r]=0;
for(r1=0;r1<max_aa;r1++)
profile[p][r]+=freq[r1]*matrix[r1][r];
profile[p][r]/=(float)data.nseqs;
}
}
/*
fprintf(fd,"Profile...\n");
for(r=0;r<max_aa;r++)
{
for(p=0;p<data.ncols;p++)
fprintf(fd,"%d\t",profile[p][r]);
fprintf(fd,"\n");
}
*/
seqvector = (sint *) ckalloc( (max_aa+2) * sizeof(sint) );
seqdist=(float *)ckalloc((data.nseqs+1)*sizeof(float));
sorteddist=(float *)ckalloc((data.nseqs+1)*sizeof(float));
for(p=0; p<data.ncols; p++)
{
for(s=data.firstseq; s<data.firstseq+data.nseqs; s++)
{
if (p<seqlen_array[s+1])
for (r=0;r<max_aa; r++)
seqvector[r]=matrix[r][(int)seq_array[s+1][p+1]];
else
for (r=0;r<max_aa; r++)
seqvector[r]=matrix[r][gap_pos1];
seqdist[s-data.firstseq]=0.0;
for(r=0;r<max_aa;r++)
{
diff=profile[p][r]-seqvector[r];
diff/=1000.0;
seqdist[s-data.firstseq]+=diff*diff;
}
seqdist[s-data.firstseq]=sqrt((double)seqdist[s-data.firstseq]);
}
/*
fprintf(fd,"\n\nPosition %d:\n",p+1);
fprintf(fd,"Sequence Distances...\n");
for(s=0;s<data.nseqs;s++)
fprintf(fd,"%.1f\t",seqdist[s]);
*/
/* calculate mean,median and rms of seq distances */
mean=median=0.0;
if(include_gaps)
{
for(s=0; s<data.nseqs; s++)
mean+=seqdist[s];
mean/=data.nseqs;
n=data.nseqs;
for(s=0; s<data.nseqs; s++)
sorteddist[s]=seqdist[s];
}
else
{
n=0;
for(s=data.firstseq; s<data.firstseq+data.nseqs; s++)
if(p<seqlen_array[s+1] && seq_array[s+1][p+1]>=0 && seq_array[s+1][p+1]<max_aa)
{
mean+=seqdist[s-data.firstseq];
n++;
}
if(n>0) mean/=n;
for(s=data.firstseq,i=0; s<data.firstseq+data.nseqs; s++)
if(p<seqlen_array[s+1] && seq_array[s+1][p+1]>=0 && seq_array[s+1][p+1]<max_aa)
sorteddist[i++]=seqdist[s-data.firstseq];
}
sort_scores(sorteddist,0,n-1);
/*
fprintf(fd,"\nSorted:\n");
for(s=0;s<n;s++)
fprintf(fd,"%.1f ",sorteddist[s]);
*/
if(n == 0)
median = 0;
else if(n % 2 == 0)
median=(sorteddist[n/2-1]+sorteddist[n/2])/2.0;
else
median=sorteddist[n/2];
if(score_scale<=5)
data.colscore[p]=exp((double)(-mean*(6-score_scale)/4.0))*100.0*n/data.nseqs;
else
data.colscore[p]=exp((double)(-mean/(4.0*(score_scale-4))))*100.0*n/data.nseqs;
/*
fprintf(fd,"\nMean %.1f Median %.1f Score %.1f\n",mean,median,data.colscore[p]);
*/
if(n==0)
{
ul=0;
}
else
{
t = n/4.0 + 0.5;
if(t - (int)t == 0.5)
{
q3=(sorteddist[(int)t]+sorteddist[(int)t+1])/2.0;
q1=(sorteddist[n-(int)t]+sorteddist[n-(int)t-1])/2.0;
}
else if(t - (int)t > 0.5)
{
q3=sorteddist[(int)t+1];
q1=sorteddist[n-(int)t-1];
}
else
{
q3=sorteddist[(int)t];
q1=sorteddist[n-(int)t];
}
if (n<4)ul=sorteddist[0];
else ul=q3+(q3-q1)*((float)score_cutoff/2.0);
}
/*
fprintf(fd,"\nMedian %.1f Q1 %.1f Q3 %.1f UL %.1f\n",median,q1,q3,ul);
fprintf(fd,"\nExceptions: ");
for(s=0;s<data.nseqs;s++)
if(seqdist[s]>ul) fprintf(fd,"%d ",s+1);
*/
for(s=data.firstseq;s<data.firstseq+data.nseqs;s++)
if(seqdist[s-data.firstseq]>ul && p<seqlen_array[s+1] && seq_array[s+1][p+1]>=0 && seq_array[s+1][p+1]<max_aa)
data.residue_exception[s-data.firstseq][p]=TRUE;
else
data.residue_exception[s-data.firstseq][p]=FALSE;
}
/*
fclose(fd);
*/
for(p=0;p<data.ncols;p++)
ckfree(profile[p]);
ckfree(profile);
ckfree(freq);
ckfree(seqvector);
ckfree(seqdist);
ckfree(sorteddist);
}
void sort_scores(float *scores,int f,int l)
{
int i,last;
if(f>=l) return;
swap(scores,f,(f+l)/2);
last=f;
for(i=f+1;i<=l;i++)
{
if(scores[i]>scores[f])
swap(scores,++last,i);
}
swap(scores,f,last);
sort_scores(scores,f,last-1);
sort_scores(scores,last+1,l);
}
void swap(float *scores,int s1, int s2)
{
float temp;
temp=scores[s1];
scores[s1]=scores[s2];
scores[s2]=temp;
}
void set_scorescale(BaR bar, GraphiC p, Nlm_Int2 newval, Nlm_Int2 oldval)
{
char str[FILENAMELEN];
panel_data data;
score_scale = newval+1;
calc_colscores(FALSE,TRUE);
sprintf(str,"Score Plot Scale: %2d",score_scale);
SetTitle(scorescaletext,str);
}
void set_scorecutoff(BaR bar, GraphiC p, Nlm_Int2 newval, Nlm_Int2 oldval)
{
char str[FILENAMELEN];
int temp;
panel_data data;
temp=newval+1;
score_cutoff = temp;
calc_colscores(residue_exceptions,FALSE);
sprintf(str,"Residue Exception Cutoff: %2d",score_cutoff);
SetTitle(residue_cutofftext,str);
}
void calc_segment_exceptions(IteM i)
{
WatchCursor();
segment_exceptions=TRUE;
calc_seg_exceptions();
show_segment_exceptions();
SetValue(show_seg_toggle,1);
SetStatus(segment_item,segment_exceptions);
ArrowCursor();
}
void set_lengthcutoff(BaR bar, GraphiC p, Nlm_Int2 newval, Nlm_Int2 oldval)
{
char str[100];
int temp;
temp=newval+1;
length_cutoff = temp;
sprintf(str,"Minimum Length of Segments: %2d",length_cutoff);
if(aln_mode==MULTIPLEM)
{
remove_short_segments(seq_panel.seqs);
}
else
{
remove_short_segments(prf_panel[0].seqs);
remove_short_segments(prf_panel[1].seqs);
}
if(segment_exceptions) show_segment_exceptions();
SetTitle(length_cutofftext,str);
}
void set_score_user_matrix(ButtoN but)
{
if(get_user_matrixname(score_mtrxname,score_matrix,score_aa_xref,6,&score_matnum,scoremattext))
{
calc_colscores(residue_exceptions,TRUE);
SetValue(score_matrix_list,score_matnum);
}
}
void set_score_matrix(GrouP g)
{
int tmp;
tmp = GetValue(g);
if(tmp>0 && tmp<6)
{
score_matnum=tmp;
}
else
{
if (score_mtrxname[0]=='\0')
{
get_user_matrixname(score_mtrxname,score_matrix,score_aa_xref,6,&score_matnum,scoremattext);
}
else score_matnum=6;
}
calc_colscores(residue_exceptions,TRUE);
SetValue(score_matrix_list,score_matnum);
}
void set_segment_user_matrix(ButtoN but)
{
if(get_user_matrixname(segment_mtrxname,segment_matrix,segment_aa_xref,5,&segment_matnum,segmentmattext))
{
calc_seg_exceptions();
if(segment_exceptions) show_segment_exceptions();
SetValue(seg_matrix_list,segment_matnum);
}
}
void set_segment_matrix(GrouP g)
{
int tmp;
tmp = GetValue(g);
if(tmp>0 && tmp<5)
{
segment_matnum=tmp;
}
else
{
if (segment_mtrxname[0]=='\0')
{
get_user_matrixname(segment_mtrxname,segment_matrix,segment_aa_xref,5,&segment_matnum,segmentmattext);
}
else segment_matnum=5;
}
calc_seg_exceptions();
if(segment_exceptions) show_segment_exceptions();
SetValue(seg_matrix_list,segment_matnum);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -