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

📄 xdisplay.c

📁 经典生物信息学多序列比对工具clustalw
💻 C
📖 第 1 页 / 共 4 页
字号:
#include <stdio.h>#include <stdarg.h>#include <string.h>#include <vibrant.h>#include <document.h>#include "clustalw.h"#include "xmenu.h"static void VscrollMulti(BaR bar, GraphiC p, Nlm_Int2 newval, Nlm_Int2 oldval);static void HscrollMultiN(BaR bar, GraphiC p, Nlm_Int2 newval, Nlm_Int2 oldval);static void HscrollMultiS(BaR bar, GraphiC p, Nlm_Int2 newval, Nlm_Int2 oldval);static void VscrollPrf1(BaR bar, GraphiC p, Nlm_Int2 newval, Nlm_Int2 oldval);static void HscrollPrf1N(BaR bar, GraphiC p, Nlm_Int2 newval, Nlm_Int2 oldval);static void HscrollPrf1S(BaR bar, GraphiC p, Nlm_Int2 newval, Nlm_Int2 oldval);static void VscrollPrf2(BaR bar, GraphiC p, Nlm_Int2 newval, Nlm_Int2 oldval);static void HscrollPrf2N(BaR bar, GraphiC p, Nlm_Int2 newval, Nlm_Int2 oldval);static void HscrollPrf2S(BaR bar, GraphiC p, Nlm_Int2 newval, Nlm_Int2 oldval);static void NameClick(PaneL panel, PoinT pt);static void NameDrag(PaneL panel, PoinT pt);static void NameRelease(PaneL panel, PoinT pt);static void SeqClick(PaneL panel, PoinT pt);static void SeqDrag(PaneL panel, PoinT pt);static void SeqRelease(PaneL panel, PoinT pt);static void fit_seq_display(RecT wr,Boolean mv_message);static void fit_prf_displays(RecT wr,int numseqs1,int numseqs2,Boolean mv_message);static void vscrollnames(BaR bar, int newval, int oldval);static void hscrollnames(BaR bar, int newval, int oldval);static void vscrollseqs(BaR bar, int newval, int oldval);static void hscrollseqs(BaR bar, int newval, int oldval);static void correct_scrollbar(BaR b,int visible,int total,int value,Boolean reset);static PaneL make_panel(int type,GrouP g,int width,int height,int firstline,int tlines);static panel_data free_panel_data(panel_data data);static panel_data alloc_name_data(panel_data data);static panel_data alloc_seq_data(panel_data data);extern sint max_names;extern int    mheader; /* maximum header lines */extern int    mfooter; /* maximum footer lines */extern int max_plines;     /*   profile align display length */extern int min_plines1;     /*   profile align display length */extern int min_plines2;     /*   profile align display length */extern int loffset,boffset,toffset;extern int roffset;extern int poffset;extern Boolean aln_mode;extern Boolean fixed_prf_scroll;extern Boolean window_displayed;extern PrompT   message;           /* used in temporary message window */extern spanel  seq_panel;        /* data for multiple alignment area */extern spanel  prf_panel[];       /* data for profile alignment areas */extern spanel  active_panel;       /* 'in-use' panel -scrolling,clicking etc. */extern FonT datafont;extern WindoW mainw;extern GrouP  seq_display,prf1_display,prf2_display;extern int ncolors;extern int    inverted;extern Boolean  dnaflag;extern sint     nseqs;extern sint    profile1_nseqs;extern sint     output_order;extern sint     *output_index;extern sint     *seqlen_array;extern char     **seq_array;extern char     **names, **titles;extern char     *amino_acid_codes;extern sint     gap_pos1, gap_pos2;extern char *gap_penalty_mask1,*gap_penalty_mask2;extern char *sec_struct_mask1,*sec_struct_mask2;extern sint struct_penalties1,struct_penalties2;extern sint output_struct_penalties;extern Boolean use_ss1, use_ss2;extern char *explicit_par_file;extern char *par_file;extern char def_protpar_file[];extern char def_dnapar_file[];extern sint     ncutseqs;extern Boolean residue_exceptions;extern Boolean segment_exceptions;extern color color_lut[];extern char *res_cat1[];extern char *res_cat2[];static range selected_seqs;           /* sequences selected by clicking on names */static range selected_res;           /* residues selected by clicking on seqs */ static int fromvscroll,fromhscroll; /* set by scrolling functions,                            used by DrawPanel, draw_names, draw_seqs */void resize_multi_window(void){	RecT r;	ObjectRect(mainw,&r);	fit_seq_display(r,FALSE);}void resize_prf_window(int numseqs1,int numseqs2){	RecT r;	SelectFont(datafont);	stdCharWidth=CharWidth('A');        stdLineHeight=LineHeight();	if(numseqs1>max_plines)		numseqs1=max_plines;	else if(numseqs1<min_plines1)		numseqs1=min_plines1;	if(numseqs2>max_plines)		numseqs2=max_plines;	else if(numseqs2<min_plines2)		numseqs2=min_plines2;	ObjectRect(mainw,&r);	fit_prf_displays(r,numseqs1,numseqs2,FALSE);}static void fit_seq_display(RecT wr,Boolean mv_message){	int width,height,moffset;	RecT nr,sr,mr;	panel_data data;	ObjectRect(seq_panel.names,&nr);	ObjectRect(message,&mr);	moffset=mr.top-nr.bottom;	width=nr.right-nr.left;	height=wr.bottom-wr.top-boffset-toffset;	nr.top=toffset;	nr.left=loffset;	nr.bottom=nr.top+height;	nr.right=nr.left+width;	SetPosition(seq_panel.names,&nr);	GetPanelExtra(seq_panel.names,&data);	data.vlines=(height-SCOREHEIGHT)/data.lineheight - MARGIN;	data.vseqs=data.vlines-data.nhead-data.nfoot;	SetPanelExtra(seq_panel.names,&data);	sr.top=nr.top;	sr.left=nr.right;	sr.bottom=sr.top+height;	sr.right=wr.right-wr.left-roffset;	width=sr.right-sr.left;	SetPosition(seq_panel.seqs,&sr);	GetPanelExtra(seq_panel.seqs,&data);	data.vcols=width/data.charwidth - MARGIN*2;	data.vlines=(height-SCOREHEIGHT)/data.lineheight - MARGIN;	data.vseqs=data.vlines-data.nhead-data.nfoot;	SetPanelExtra(seq_panel.seqs,&data);	if(mv_message) {		height=mr.bottom-mr.top;		mr.top=nr.bottom+moffset;		mr.bottom=mr.top+height;		SetPosition(message,&mr);	}	position_scrollbars(seq_panel);	correct_name_bars(TRUE);	correct_seq_bars(TRUE);}static void fit_prf_displays(RecT wr,int numseqs1,int numseqs2,Boolean mv_message){	int width,height,moffset;	RecT mr,nr,sr;	panel_data data;	ObjectRect(prf_panel[1].names,&nr);	ObjectRect(message,&mr);	moffset=mr.top-nr.bottom;	ObjectRect(prf_panel[0].names,&nr);	width=nr.right-nr.left;	nr.top=toffset;	nr.left=loffset;	height=(wr.bottom-wr.top-boffset-toffset-poffset)*numseqs1/(numseqs1+numseqs2);	nr.bottom=nr.top+height;	nr.right=nr.left+width;	SetPosition(prf_panel[0].names,&nr);	GetPanelExtra(prf_panel[0].names,&data);	data.vlines=(height-SCOREHEIGHT)/data.lineheight - MARGIN;	data.vseqs=data.vlines-data.nhead-data.nfoot;	SetPanelExtra(prf_panel[0].names,&data);	sr.top=nr.top;	sr.left=nr.right;	sr.bottom=sr.top+height;	sr.right=wr.right-wr.left-roffset;	width=sr.right-sr.left;	SetPosition(prf_panel[0].seqs,&sr);	GetPanelExtra(prf_panel[0].seqs,&data);	data.vcols=width/data.charwidth - MARGIN*2;	data.vlines=(height-SCOREHEIGHT)/data.lineheight - MARGIN;	data.vseqs=data.vlines-data.nhead-data.nfoot;	SetPanelExtra(prf_panel[0].seqs,&data);	position_scrollbars(prf_panel[0]);	nr.top=nr.bottom+poffset;	height=(wr.bottom-wr.top-boffset-toffset-poffset)*numseqs2/(numseqs1+numseqs2);	nr.bottom=nr.top+height;	SetPosition(prf_panel[1].names,&nr);	GetPanelExtra(prf_panel[1].names,&data);	data.vlines=(height-SCOREHEIGHT)/data.lineheight - MARGIN;	data.vseqs=data.vlines-data.nhead-data.nfoot;	SetPanelExtra(prf_panel[1].names,&data);	sr.top=nr.top;	sr.bottom=sr.top+height;	SetPosition(prf_panel[1].seqs,&sr);	GetPanelExtra(prf_panel[1].seqs,&data);	data.vcols=width/data.charwidth - MARGIN*2;	data.vlines=(height-SCOREHEIGHT)/data.lineheight - MARGIN;	data.vseqs=data.vlines-data.nhead-data.nfoot;	SetPanelExtra(prf_panel[1].seqs,&data);	position_scrollbars(prf_panel[1]);	if(mv_message) {		height=mr.bottom-mr.top;		mr.top=nr.bottom+moffset;		mr.bottom=mr.top+height;		SetPosition(message,&mr);	}	correct_name_bars(TRUE);	correct_seq_bars(TRUE);}void ResizeWindowProc(WindoW w){	int numseqs1,numseqs2;	RecT wr;	panel_data data;	if(window_displayed==FALSE) return;	ObjectRect(w,&wr);	if (aln_mode==MULTIPLEM)	{/* if the window is too small, hide everything */		if(wr.bottom-wr.top < toffset+boffset)		{			Hide(seq_display);			Hide(message);			return;		}		fit_seq_display(wr,TRUE);		Show(seq_display);		Show(message);	}	else	{/* if the window is too small, hide everything */		if(wr.bottom-wr.top < toffset+boffset+2*poffset)		{			Hide(prf1_display);			Hide(prf2_display);			Hide(message);			return;		}		GetPanelExtra(prf_panel[0].names,&data);		numseqs1=data.nseqs;		if(numseqs1<min_plines1)numseqs1=min_plines1;		else if(numseqs1>max_plines)numseqs1=max_plines;		GetPanelExtra(prf_panel[1].names,&data);		numseqs2=data.nseqs;		if(numseqs2<min_plines2)numseqs2=min_plines2;		else if(numseqs2>max_plines)numseqs2=max_plines;		fit_prf_displays(wr,numseqs1,numseqs2,TRUE);		Show(prf1_display);		Show(prf2_display);		Show(message);	}}void position_scrollbars(spanel p){	int height;	RecT hr,vr,nr,sr;	panel_data data;	ObjectRect(p.names,&nr);	GetPanelExtra(p.names,&data);	ObjectRect(data.hscrollbar,&hr);	height=hr.bottom-hr.top;	LoadRect(&hr,nr.left,nr.bottom,nr.right,nr.bottom+height);	SetPosition(data.hscrollbar,&hr);#ifdef WIN_MAC	AdjustPrnt(data.hscrollbar,&hr,FALSE);#endif	ObjectRect(p.seqs,&sr);	GetPanelExtra(p.seqs,&data);	ObjectRect(data.hscrollbar,&hr);	height=hr.bottom-hr.top;	LoadRect(&hr,sr.left,sr.bottom,sr.right,sr.bottom+height);	SetPosition(data.hscrollbar,&hr);#ifdef WIN_MAC	AdjustPrnt(data.hscrollbar,&hr,FALSE);#endif	ObjectRect(data.vscrollbar,&vr);	LoadRect(&vr,vr.left,sr.top,vr.right,sr.bottom);	SetPosition(data.vscrollbar,&vr);#ifdef WIN_MAC	AdjustPrnt(data.vscrollbar,&vr,FALSE);#endif}void load_aln_data(spanel p,int fs,int ls,Boolean reset){	int i,j,slength=0;	int nhead;	sint val;	panel_data name_data,seq_data;	WatchCursor();	GetPanelExtra(p.names,&name_data);	GetPanelExtra(p.seqs,&seq_data);	name_data=free_panel_data(name_data);	seq_data=free_panel_data(seq_data);	SetPanelExtra(p.names,&name_data);	SetPanelExtra(p.seqs,&seq_data);	name_data.nseqs=ls-fs+1;	seq_data.nseqs=name_data.nseqs;	name_data.firstseq=fs;	seq_data.firstseq=fs;/* find the maximum length of sequence */	for(i=fs;i<=ls;i++)           	if (slength < seqlen_array[i+1]) slength = seqlen_array[i+1];	name_data.ncols=max_names;	seq_data.ncols=slength;	if (name_data.nseqs>0)	{		name_data=alloc_name_data(name_data);		seq_data=alloc_seq_data(seq_data);			for(i=fs;i<=ls;i++)        	{                	strncpy(name_data.lines[i-fs],names[i+1],MAXNAMES);                	name_data.lines[i-fs][MAXNAMES]='\0';                	for(j=0;j<seqlen_array[i+1];j++)                	{                        	val = seq_array[i+1][j+1];                        	if((val == -3) || (val == 253))                                	break;                        	else if((val == gap_pos1) || (val == gap_pos2))                                	seq_data.lines[i-fs][j] = '-';                        	else {                                	seq_data.lines[i-fs][j] = amino_acid_codes[val];                        	}                	}                	for(j=seqlen_array[i+1];j<slength;j++)                        	seq_data.lines[i-fs][j] = ' ';			seq_data.lines[i-fs][j]='\0';			name_data.selected[i-fs]=FALSE;        	}		make_consensus(seq_data,name_data.header[0],seq_data.header[0]);		nhead=make_struct_data(seq_data.prf_no,slength,name_data.header[1],seq_data.header[1]);		if (nhead==0)			nhead=make_gp_data(seq_data.prf_no,slength,name_data.header[1],seq_data.header[1]);		seq_data.nhead=name_data.nhead=nhead+1;		seq_data.nfoot=name_data.nfoot=1;		seq_data.consensus=NULL;		make_ruler(slength,name_data.footer[0],seq_data.footer[0]);		make_colscores(seq_data);	}	else	{		seq_data.ncols=name_data.ncols=0;	}	if(reset==TRUE)	{		name_data.firstvline=0;		name_data.firstvcol=0;		seq_data.firstvline=0;		seq_data.firstvcol=0;	}        name_data.vseqs=name_data.vlines-name_data.nhead-name_data.nfoot;        seq_data.vseqs=seq_data.vlines-seq_data.nhead-seq_data.nfoot;	if(seq_data.nseqs>0)	{/* try to find the user's color parameter file */		if (explicit_par_file == NULL)		{			if (par_file != NULL)				ckfree(par_file);			if(dnaflag)				par_file=find_file(def_dnapar_file);			else				par_file=find_file(def_protpar_file);		}        	init_color_parameters(par_file);        	make_colormask(seq_data);	}	SetPanelExtra(p.names,&name_data);	SetPanelExtra(p.seqs,&seq_data);	ArrowCursor();}void load_aln(spanel p,int fs,int ls,Boolean reset){	load_aln_data(p,fs,ls,reset);	DrawPanel(p.names);	DrawPanel(p.seqs);	correct_name_bars(reset);	correct_seq_bars(reset);}static panel_data alloc_name_data(panel_data data){	int i;	data.lines=(char **)ckalloc((data.nseqs+1)*sizeof(char *));	data.colormask=NULL;	data.selected=(int *)ckalloc((data.nseqs+1)*sizeof(int));	for(i=0;i<data.nseqs;i++)        {		data.lines[i]=(char *)ckalloc((MAXNAMES+1)*sizeof(char));		strncpy(data.lines[i],names[i+1],MAXNAMES);		data.lines[i][MAXNAMES]='\0';	}	data.header=(char **)ckalloc((mheader+1)*sizeof(char *));	for(i=0;i<mheader;i++)		data.header[i]=(char *)ckalloc((MAXNAMES+1)*sizeof(char));	data.footer=(char **)ckalloc((mfooter+1)*sizeof(char *));	for(i=0;i<mfooter;i++)		data.footer[i]=(char *)ckalloc((MAXNAMES+1)*sizeof(char));	return(data);}static panel_data alloc_seq_data(panel_data data){	int i;	data.lines=(char **)ckalloc((data.nseqs+1)*sizeof(char *));	data.colormask=(char **)ckalloc((data.nseqs+1)*sizeof(char *));	data.firstsel=data.lastsel=-1;	for(i=0;i<data.nseqs;i++)        {		data.lines[i]=(char *)ckalloc((data.ncols+1)*sizeof(char));		data.colormask[i]=(char *)ckalloc((data.ncols+1)*sizeof(char));	}	data.selected=(int *)ckalloc((data.ncols+1)*sizeof(int));	for(i=0;i<data.ncols;i++)		data.selected[i]=FALSE;	data.header=(char **)ckalloc((mheader+1)*sizeof(char *));	for(i=0;i<mheader;i++)		data.header[i]=(char *)ckalloc((data.ncols+1)*sizeof(char));	data.colscore=(sint *)ckalloc((data.ncols+1)*sizeof(sint));	data.residue_exception=(Boolean **)ckalloc((data.nseqs+1)*sizeof(Boolean *));	for(i=0;i<data.nseqs;i++)		data.residue_exception[i]=(Boolean *)ckalloc((data.ncols+1)*sizeof(Boolean));	data.segment_exception=(short **)ckalloc((data.nseqs+1)*sizeof(short *));	for(i=0;i<data.nseqs;i++)		data.segment_exception[i]=(short *)ckalloc((data.ncols+1)*sizeof(short));	data.footer=(char **)ckalloc((mfooter+1)*sizeof(char *));	for(i=0;i<mfooter;i++)		data.footer[i]=(char *)ckalloc((data.ncols+1)*sizeof(char));	return(data);}void correct_name_bars(Boolean reset){	panel_data data,data1;	if(aln_mode==PROFILEM)	{		GetPanelExtra(prf_panel[0].names,&data);		GetPanelExtra(prf_panel[1].names,&data1);		if(reset==TRUE)		{			data.firstvcol=0;			data1.firstvcol=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,data1.firstvline,reset);		SetPanelExtra(prf_panel[0].names,&data);		SetPanelExtra(prf_panel[1].names,&data1);	}	else	{		GetPanelExtra(seq_panel.names,&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);

⌨️ 快捷键说明

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