⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xdisplay.c

📁 是有关基因比对的经典算法的实现。这对于初学计算生物学的人是非常重要的算法。
💻 C
📖 第 1 页 / 共 4 页
字号:
		SetPanelExtra(seq_panel.names,&data);
	}
	
}

void correct_seq_bars(Boolean reset)
{
	int maxcols,m1,m2;
	panel_data data,data1;

	if(aln_mode==PROFILEM)
	{
		GetPanelExtra(prf_panel[0].seqs,&data);
		GetPanelExtra(prf_panel[1].seqs,&data1);
		if(fixed_prf_scroll==TRUE)
		{
			Hide(data.hscrollbar);
			m1=MAX(data.firstvcol,data1.firstvcol);
			m2=MAX(data.ncols-data.firstvcol,data1.ncols-data1.firstvcol);
			maxcols=m1+m2;
			if(reset==TRUE)
			{
				data.firstvcol=0;
				data1.firstvcol=0;
			}
			data.lockoffset= -MAX(data1.firstvcol-data.firstvcol,0);
			data1.lockoffset= -MAX(data.firstvcol-data1.firstvcol,0);
			correct_scrollbar(data1.hscrollbar,data1.vcols,maxcols,m1,TRUE);
		}
		else
		{
			Show(data.hscrollbar);
			if(reset==TRUE)
			{
				data.firstvcol=0;
				data1.firstvcol=0;
			}
			data.lockoffset=0;
			data1.lockoffset=0;
			correct_scrollbar(data.hscrollbar,data.vcols,data.ncols,data.firstvcol,reset);
			correct_scrollbar(data1.hscrollbar,data1.vcols,data1.ncols,data.firstvcol,reset);
		}
		if(reset==TRUE)
		{
			data.firstvline=0;
			data1.firstvline=0;
		}
		correct_scrollbar(data.vscrollbar,data.vseqs,data.nseqs,data.firstvline,reset);
		correct_scrollbar(data1.vscrollbar,data1.vseqs,data1.nseqs,data.firstvline,reset);
		SetPanelExtra(prf_panel[0].seqs,&data);
		SetPanelExtra(prf_panel[1].seqs,&data1);
	}
	else
	{
		GetPanelExtra(seq_panel.seqs,&data);
		if(reset==TRUE)
		{
			data.firstvcol=0;
			data.firstvline=0;
		}
		correct_scrollbar(data.vscrollbar,data.vseqs,data.nseqs,data.firstvline,reset);
		correct_scrollbar(data.hscrollbar,data.vcols,data.ncols,data.firstvcol,reset);

		SetPanelExtra(seq_panel.seqs,&data);
	}
	
}

static void correct_scrollbar(BaR b,int visible,int total,int value,Boolean reset)
{
	int max;

	if (b!=NULL)
	{
		if (visible > 0 && total > visible)
			max=total-visible;
		else
			max=0;
       		if(reset==TRUE) CorrectBarValue(b,0);
       		CorrectBarPage(b,visible,visible);
       		CorrectBarValue(b,value);
       		CorrectBarMax(b,max);
	}
}


void color_seqs(void)
{
	panel_data data;

	GetPanelExtra(seq_panel.seqs,&data);
	if (data.nseqs == 0) return;

	info("Coloring sequences...");
	make_colormask(data);
	DrawPanel(seq_panel.seqs);
	info("Done.");
}

void color_prf1(void)
{
	panel_data data;

	GetPanelExtra(prf_panel[0].seqs,&data);
	if (data.nseqs == 0) return;

	make_colormask(data);
	info("Coloring profile 1...");
	DrawPanel(prf_panel[0].seqs);
	info("Done.");
}

void color_prf2(void)
{
	panel_data data;

	GetPanelExtra(prf_panel[1].seqs,&data);
	if (data.nseqs == 0) return;

	make_colormask(data);
	info("Coloring profile 2...");
	DrawPanel(prf_panel[1].seqs);
	info("Done.");
}

void remove_gap_pos(int fseq, int lseq,int prf_no)
{
	int i,j,k,ngaps;


	if (fseq>=lseq) return;

	for (i=1;i<=seqlen_array[fseq];)
	{
		ngaps=0;
		for (j=fseq;j<=lseq;j++)
			if(seq_array[j][i]==gap_pos1 || seq_array[j][i]==gap_pos2) ngaps++;
		if (ngaps==lseq-fseq+1)
		{
			for (j=fseq;j<=lseq;j++)
			{
				for(k=i+1;k<=seqlen_array[j]+1;k++)
					seq_array[j][k-1]=seq_array[j][k];
				seqlen_array[j]--;
			}
			if(prf_no==1 && sec_struct_mask1 != NULL)
				for(k=i;k<=seqlen_array[fseq];k++)
					sec_struct_mask1[k-1]=sec_struct_mask1[k];
			if(prf_no==1 && gap_penalty_mask1 != NULL)
				for(k=i;k<=seqlen_array[fseq];k++)
					gap_penalty_mask1[k-1]=gap_penalty_mask1[k];
			if(prf_no==2 && sec_struct_mask2 != NULL)
				for(k=i;k<=seqlen_array[fseq];k++)
					sec_struct_mask2[k-1]=sec_struct_mask2[k];
			if(prf_no==2 && gap_penalty_mask2 != NULL)
				for(k=i;k<=seqlen_array[fseq];k++)
					gap_penalty_mask2[k-1]=gap_penalty_mask2[k];
			if(seqlen_array[fseq]<=0) break;
		}
		else i++;
	}
}

/* width and height passed here are in pixels */

static PaneL make_panel(int type,GrouP g,int width,int height,int firstseq,int nseqs)
{
	int i,l,length=0;
	PaneL p;
	panel_data data;

	data.type=type;
	SelectFont(datafont);
	data.lineheight=LineHeight();
	data.charwidth=CharWidth('A');
	if(type==NAMES)
	{
/* find the maximum length of sequence name */
        	for (i=firstseq;i<=firstseq+nseqs-1;i++)
		{
           		l = strlen(names[i]);
           		if (length < l) length = l;
		}
		data.vcols=width/data.charwidth - MARGIN*2 - DNUMBER;
	}
	else
	{
        	for (i=firstseq;i<=firstseq+nseqs-1;i++)
           		if (length < seqlen_array[i]) length = seqlen_array[i];
		data.vcols=width/data.charwidth - MARGIN*2;
	}
 
	data.lines=NULL;
	data.nhead=0;
	data.nfoot=0;
	data.header=NULL;
	data.footer=NULL;
	data.consensus=NULL;
	data.colormask=NULL;
	data.vlines=(height-SCOREHEIGHT)/data.lineheight - MARGIN;
	data.vseqs=data.vlines-data.nhead-data.nfoot;
	data.nseqs=nseqs;
	data.ncols=length;
	data.firstseq=firstseq-1;
	data.firstvline=0;
	data.firstvcol=0;
	data.lockoffset=0;
	data.ascent=Ascent();
	data.descent=Descent();
	data.selected=NULL;
	data.firstsel=-1;
	data.lastsel=-1;
	data.colscore=NULL;
	data.seqweight=NULL;
	data.subgroup=NULL;
	data.residue_exception=NULL;
	data.segment_exception=NULL;
	data.vscrollbar=NULL;
	data.hscrollbar=NULL;

	p=AutonomousPanel(g, width, height, DrawPanel, NULL,NULL,sizeof(panel_data), NULL, NULL);

	SetPanelExtra(p, &data);
	return p;

}
 
void DrawPanel(PaneL p)
{
	RecT r;
        panel_data data;
	int pixelwidth,pixelheight;

	UseWindow(mainw);
	Select(p);

	if (fromvscroll==0 && fromhscroll==0)
	{
		ObjectRect(p,&r);
        	pixelwidth=r.right-r.left;
        	pixelheight=r.bottom-r.top;

		SelectFont(datafont);
		GetPanelExtra(p, &data);
		data.lineheight=LineHeight();
		data.charwidth=CharWidth('A');
		if (data.type==NAMES)
			data.vcols=pixelwidth/data.charwidth-MARGIN*2-DNUMBER;
		else
			data.vcols=pixelwidth/data.charwidth-MARGIN*2;
		data.vlines=(pixelheight-SCOREHEIGHT)/data.lineheight - MARGIN;
		data.vseqs=data.vlines-data.nhead-data.nfoot;
		if(data.vseqs<0)data.vseqs=0;
		if(data.vcols<0)data.vcols=0;
		SetPanelExtra(p, &data);
/* draw the outside frame */
		ObjectRect (p, &r);
		Black();
		FrameRect(&r);
		InsetRect(&r,1,1);
		black_on_white();
		EraseRect(&r);
		if(data.nseqs == 0) return;
	}

/* draw the structure and gap penalty data */
/* draw the footer */
	if (fromvscroll==0)
	{
		draw_header(p);
		draw_footer(p);
		draw_colscores(p);
	}

/* draw the data lines */
	if (data.type==NAMES)
		draw_names(p);
	else
		draw_seqs(p);


}

void hscrollnames(BaR bar, int newval, int oldval)
{
	PaneL		p;
        panel_data        data;
 
	p = active_panel.names;
        GetPanelExtra(p, &data);
        data.firstvcol = newval;
        SetPanelExtra(p, &data);
        Select(p);
 
	if (data.vseqs<=0) return;
	draw_names(p);
}

void vscrollnames(BaR bar, int newval, int oldval)
{
	PaneL		p;
        panel_data        data;
 
	p = active_panel.names;
        GetPanelExtra(p, &data);
        data.firstvline = newval;
        SetPanelExtra(p, &data);
        Select(p);
 
	if (data.vseqs<=0) return;
	draw_names(p);
}

void vscrollseqs(BaR bar, int newval, int oldval)
{
	PaneL		p;
        panel_data        data;
        RecT            block,rect;
	int 		l;
 
	p = active_panel.seqs;
        GetPanelExtra(p, &data);
	l=data.firstvline;
        data.firstvline = newval;
        SetPanelExtra(p, &data);
        Select(p);
 
	if (data.vseqs<=0) return;

	if (data.vseqs<3 || data.nseqs-l < data.vseqs)
	{
		fromvscroll=0;
		draw_seqs(p);
		return;
	}

        if (newval == oldval + 1) {
		fromvscroll=1;
                ObjectRect(p, &rect);
		InsetRect(&rect,1,1);
                block.top = rect.top+(data.nhead)*data.lineheight+data.descent+1;
                block.bottom = block.top+(data.vseqs)*data.lineheight;
		block.left=rect.left;
		block.right=rect.right;
                ScrollRect(&block, 0, -data.lineheight);
        } else if (newval == oldval - 1) {
		fromvscroll=-1;
                ObjectRect(p, &rect);
		InsetRect(&rect,1,1);
                block.top = rect.top+(data.nhead)*data.lineheight+data.descent+1;
                block.bottom = block.top+(data.vseqs)*data.lineheight;
		block.left=rect.left;
		block.right=rect.right;
                ScrollRect(&block, 0, data.lineheight);
        } else {
		fromvscroll=0;
        }
	draw_seqs(p);
}

void hscrollseqs(BaR bar, int newval, int oldval)
{
	PaneL p;
        panel_data        data;
        RecT            rect;
 
 
	p = active_panel.seqs;
        GetPanelExtra(p, &data);
        data.firstvcol = newval+data.lockoffset;
        SetPanelExtra(p, &data);
        Select(p);
 
	if (data.vcols<=0) return;

	if (data.vcols<3)
	{
		fromhscroll=0;
		draw_header(p);
		draw_seqs(p);
		draw_footer(p);
		draw_colscores(p);
		return;
	}
        if (newval == oldval + 1) {
		fromhscroll=1;
                ObjectRect(p, &rect);
                InsetRect(&rect,1,1);
                rect.left+=data.charwidth;
                ScrollRect(&rect, -data.charwidth, 0);
        } else if (newval == oldval - 1) {
		fromhscroll=-1;
                ObjectRect(p, &rect);
                InsetRect(&rect,1,1);
                rect.right=rect.left+(data.vcols+1)*data.charwidth;
                ScrollRect(&rect, data.charwidth, 0);
        } else {
		fromhscroll=0;
        }
	draw_header(p);
	draw_seqs(p);
	draw_footer(p);
	draw_colscores(p);
}

void draw_names(PaneL p)
{
	int i,f,l;
	panel_data data;

	UseWindow(mainw);
	Select(p);
	GetPanelExtra(p,&data);
	if(data.lines==NULL) return;
	SelectFont(datafont);
	
	if (fromvscroll==0)
	{
		f=data.firstvline;
		l=data.firstvline+data.vseqs-1;
	}
	else if (fromvscroll==-1)
		f=l=data.firstvline;
	else
		f=l=data.firstvline+data.vseqs-1;
	
	if(l>=data.nseqs) l=data.nseqs-1;
	for(i=f;i<=l;i++)
		if (data.selected[i]==TRUE)
			draw_nameline(p,i,i,HIGHLIGHT);
		else
			draw_nameline(p,i,i,NORMAL);
}

void draw_seqs(PaneL p)
{
	int i,f,l,s,x,y,format;
	int fs,ls;
	panel_data data;
	PoinT pt;
	RecT r,block;

	UseWindow(mainw);
	Select(p);
	GetPanelExtra(p,&data);
	if(data.lines==NULL) return;
	SelectFont(datafont);
	black_on_white();
	if (fromhscroll==-1)
	{
		f=data.firstvcol;
		if ((f>=data.firstsel) && (f<=data.lastsel))
			format=HIGHLIGHT;
		else format=NORMAL; 
		draw_seqcol(p,f,format);
	}
	else if (fromhscroll==1)
	{
		f=data.firstvcol+data.vcols-1;
		if ((f>=data.firstsel) && (f<=data.lastsel))
			format=HIGHLIGHT;
		else format=NORMAL; 
		draw_seqcol(p,f,format);
	}
	else
	{
 		if (fromvscroll==-1)
		{
			f=l=data.firstvline;
		}
		else if (fromvscroll==1)
		{
			f=l=data.firstvline+data.vseqs-1;
		}
		else
		{
			f=data.firstvline;
			l=data.firstvline+data.vseqs-1;
		}
	
		if(l>=data.nseqs) l=data.nseqs-1;
        	s=f-data.firstvline;
        	ObjectRect (p, &r);
        	InsetRect(&r,1,1);
		data_colors();
        	block.top=r.top+((s+data.nhead)*data.lineheight)+data.descent+1;
        	block.bottom=block.top+(l-f+1)*data.lineheight;
        	block.left=r.left;
        	block.right=r.right;
        	EraseRect(&block);
        	if(data.nseqs == 0) return;

		if(data.firstsel != -1)
		{
			if ((data.firstsel>=data.firstvcol && data.firstsel<data.firstvcol+data.vcols)||
	   		(data.lastsel>=data.firstvcol && data.lastsel<data.firstvcol+data.vcols))
			{
				fs=data.firstsel-data.firstvcol;
				if (fs<0) fs=0;
				if (fs>=data.vcols) fs=data.vcols-1;
				ls=data.lastsel-data.firstvcol;
				if (ls<0) ls=0;
				if (ls>=data.vcols) ls=data.vcols-1;
        			block.left=r.left+(fs+1)*data.charwidth;
        			block.right=r.left+(ls+2)*data.charwidth;
				text_colors();
        			EraseRect(&block);
			}
		}
        	x=r.left+data.charwidth;
	 
        	for(i=f;i<=l;i++)
        	{
               		y=block.top+(i-f+1)*data.lineheight-data.descent-1;
			LoadPt(&pt,x,y);
               		draw_seqline(data,i,pt,data.firstvcol,data.firstvcol+data.vcols-1,NORMAL);
        	}
	}

	black_on_white();
	fromvscroll=fromhscroll=0;
}

static void NameClick(PaneL panel, PoinT pt)
{
	int i;
	panel_data data;
	RecT r;

	GetPanelExtra(panel,&data);
	if(data.prf_no==1)
	{
/* revert selected area in profile 2 to normal */
		GetPanelExtra(prf_panel[1].names,&data);
		if(data.nseqs==0)
			draw_seq_pointer(prf_panel[1].names,0,NORMAL);
		for(i=0;i<data.nseqs;i++)
			if (data.selected[i]==TRUE)
				draw_nameline(prf_panel[1].names,i,i,NORMAL);
		SetPanelExtra(prf_panel[1].names,&data);
	}
	else if(data.prf_no==2)
	{
/* revert selected area in profile 1 to normal */
		GetPanelExtra(prf_panel[0].names,&data);
		if(data.nseqs==0)
			draw_seq_pointer(prf_panel[0].names,0,NORMAL);
		for(i=0;i<data.nseqs;i++)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -