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

📄 xcolor.c

📁 经典生物信息学多序列比对工具clustalw
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>#include <stdarg.h>#include <string.h>#include <time.h>#include <ctype.h>#include <vibrant.h>#include "clustalw.h"#include "xmenu.h"#define SIMPLE 1#define COMPOUND 2#define LEFTMARGIN 20#define SEPARATION 2#define CHARHEIGHT 10#define CHARWIDTH 6#define A4X 564#define A4Y 800#define A3X 832#define A3Y 1159#define USLETTERX 564#define USLETTERY 750#define SCOREY 3#define HEADER 7#define NOHEADER 0#define MAXRESNO 6#define MAXPARLEN 10#define MAXPAR 100 static void print_ps_info(FILE *fd,int pagesize);static void print_page_header(FILE *fd,int ps_rotation,int maxx,int maxy,int page,int numpages,Boolean header,char *str_time,char *ps_file,int ps_xtrans,int ps_ytrans,float ps_scale);static void print_header_line(FILE *fd,panel_data name_data, panel_data seq_data,int ix,int fr,int lr);static void print_footer_line(FILE *fd,panel_data name_data, panel_data seq_data,int ix,int fr,int lr);static void print_quality_curve(FILE *fd,panel_data seq_data,int fr,int lr,int score_height);static void print_seq_line(FILE *fd,panel_data name_data, panel_data seq_data,int row,int seq,int fr,int lr,int res_number);typedef struct consensus_parameters{char consensus;int cutoff;int length;char cutoff_list[20];} consensus_para; typedef struct color_parameters{int type;char residue;int color;int length;char cons_list[20];} color_para;static void init_color_lut(FILE *fd);static int init_printer_lut(char *filename);static char *init_consensus(panel_data data);static int SaveColPara(char word[MAXPAR][MAXPARLEN],int num_words,int count);static int SaveConPara(char word[MAXPAR][MAXPARLEN],int num_words,int count);static int get_line(char *sinline,char word[MAXPAR][MAXPARLEN]);static int residue_color(char res,char consensus);static Boolean commentline(char *line);#define DEF_NCOLORS 4#define MAX_NCOLORS 8#define DEFAULT_COLOR 0typedef struct rgb_color {	char name[20];	float r,g,b;} rgb_color;rgb_color def_color_lut[MAX_NCOLORS]={	"RED"          ,0.9, 0.1, 0.1,	"BLUE"         ,0.1, 0.1, 0.7,	"GREEN"        ,0.1, 0.9, 0.1,	"ORANGE"       ,0.9, 0.6, 0.3,	"CYAN"         ,0.1, 0.9, 0.9,	"PINK"         ,0.9, 0.5, 0.5,	"MAGENTA"      ,0.9, 0.1, 0.9,	"YELLOW"       ,0.9, 0.9, 0.0,};char def_aacolor[MAX_NCOLORS][26]={"krh",				"fwy",				"ilmv",				"gpst"};char def_dnacolor[MAX_NCOLORS][26]={"a",				"c",				"tu",				"g"};extern char revision_level[];extern int max_names; extern int ncolors;extern int ncolor_pars;extern color color_lut[];extern int inverted;extern Boolean residue_exceptions;extern Boolean segment_exceptions;extern Boolean dnaflag;int NumColParas;int NumConParas;color_para Col_Par[100];consensus_para Con_Par[100];void make_colormask(panel_data data){	int i,j;	for(i=0;i<data.nseqs;i++)		for(j=0;j<data.ncols;j++)			data.colormask[i][j] = DEFAULT_COLOR;	if (ncolors > 1)	{        	data.consensus=init_consensus(data);		for(i=0;i<data.nseqs;i++)			for(j=0;j<data.ncols;j++)				data.colormask[i][j] = residue_color(data.lines[i][j],data.consensus[j]);	}}static void init_color_lut(FILE *fd){ 	char sinline[1025];	char *args[10];	int i,numargs;	Boolean found=FALSE;	if (inverted==FALSE)	{        	strcpy(color_lut[0].name,"BLACK");		color_lut[0].r=0.4;		color_lut[0].g=0.4;		color_lut[0].b=0.4;		SelectColor(color_lut[0].r*255, color_lut[0].g*255, color_lut[0].b*255);		color_lut[0].val=GetColor();	}	else	{        	strcpy(color_lut[0].name,"WHITE");		color_lut[0].r=1.0;		color_lut[0].g=1.0;		color_lut[0].b=1.0;		SelectColor(color_lut[0].r*255, color_lut[0].g*255, color_lut[0].b*255);		color_lut[0].val=GetColor();	}	ncolors=1;	if (fd != NULL)	{		for (;fgets(sinline,1024,fd)!=NULL;)		{			sinline[strlen(sinline)-1] = '\0';			if (strcmp(sinline,"@rgbindex")==0) 			{				found = TRUE;				break;			}		}	}	if (found == TRUE)	{		for (;fgets(sinline,1024,fd)!=NULL;)		{			if (commentline(sinline)) continue;			if (sinline[0]=='@') break;			numargs = getargs(sinline, args, 4);			if (numargs != 4)			{				error("Problem in color rgb index - line %d\n",ncolors+1);				break;			}			else			{				strcpy(color_lut[ncolors].name, args[0]);				color_lut[ncolors].r=atof(args[1]);				color_lut[ncolors].g=atof(args[2]);				color_lut[ncolors].b=atof(args[3]);				SelectColor(color_lut[ncolors].r*255, color_lut[ncolors].g*255, color_lut[ncolors].b*255);				color_lut[ncolors].val=GetColor();				ncolors++;				if (ncolors>=MAXCOLORS) 				{					warning("Only using first %d colors in rgb index.",MAXCOLORS);					break;				}			}		}	}/* if we can't find a table, use the hard-coded colors */        if (ncolors==1)        {		ncolors=MAX_NCOLORS+1;		for(i=1;i<ncolors;i++)		{			strcpy(color_lut[i].name,def_color_lut[i-1].name);			color_lut[i].r=def_color_lut[i-1].r;			color_lut[i].g=def_color_lut[i-1].g;			color_lut[i].b=def_color_lut[i-1].b;			SelectColor(color_lut[i].r*255, color_lut[i].g*255, color_lut[i].b*255);			color_lut[i].val=GetColor();		}	}}void init_color_parameters(char *par_file){	int i,j,err;	char sinline[1025];	int maxparas = 50;	char inword[MAXPAR][MAXPARLEN];	int num_words;	int in_consensus=FALSE,in_color=FALSE;	int consensus_found=FALSE,color_found=FALSE;	FILE *par_fd=NULL;	if(par_file!=NULL)		par_fd=fopen(par_file,"r");	if(par_fd==NULL)	{                info("No color file found - using defaults");		ncolor_pars=0;	}	init_color_lut(par_fd);	if (par_fd != NULL) rewind(par_fd);	if (ncolors==0) return;	NumColParas=0;	NumConParas=0;	if (par_fd != NULL)	{		for(;fgets(sinline,1024,par_fd) != NULL;)		{			sinline[strlen(sinline)-1] = '\0';			if (commentline(sinline)) continue;			switch(sinline[0])			{					case '\0':					break;				case '@':					if (strcmp((char*)(sinline+1),"consensus")==0) 					{						in_consensus = TRUE;						in_color = FALSE;						consensus_found = TRUE;					}					else if (strcmp((char*)(sinline+1),"color")==0)					{						in_consensus = FALSE;						in_color = TRUE;						color_found = TRUE;					}					break;				default:					num_words = get_line(sinline,inword);					if (in_consensus == TRUE) 					{						err = SaveConPara(inword,num_words,NumConParas);						if (err == 0) NumConParas++;					}					else if (in_color == TRUE)					{						err = SaveColPara(inword,num_words,NumColParas);						if (err == 0) NumColParas++;					}						if((NumColParas>maxparas) || (NumConParas>maxparas))				     	error("Too many parameters in color file");				}		}		if (color_found == FALSE)		{			error("@color not found in parameter file - using defaults\n");			ncolor_pars=0;		}		fclose(par_fd);	}	ncolor_pars=NumColParas;/* if no color parameters found, use the default aa groupings */	if(ncolor_pars==0)	{		if (dnaflag)		{			for(i=0;i<DEF_NCOLORS;i++)			{				for(j=0;j<strlen(def_dnacolor[i]);j++)				{					Col_Par[ncolor_pars].type=SIMPLE;					Col_Par[ncolor_pars].residue=def_dnacolor[i][j];					Col_Par[ncolor_pars].color=i+1;					ncolor_pars++;				}			}		}		else		{			for(i=0;i<DEF_NCOLORS;i++)			{				for(j=0;j<strlen(def_aacolor[i]);j++)				{					Col_Par[ncolor_pars].type=SIMPLE;					Col_Par[ncolor_pars].residue=def_aacolor[i][j];					Col_Par[ncolor_pars].color=i+1;					ncolor_pars++;				}			}		}	}	NumColParas=ncolor_pars;}char *find_file(char *def_file){	char filename[FILENAMELEN];	char *retname;	FILE *fd;	Boolean found=FALSE;#ifdef UNIX        char *path, *path1, *deb, *fin;        sint lf, ltot;        char *home;#endif        strcpy(filename,def_file);        fd = fopen(filename,"r");	if (fd != NULL)		found=TRUE;#ifdef UNIX        if (found == FALSE)        {                home = getenv("HOME");		if (home != NULL)		{                	sprintf(filename,"%s/%s",home,def_file);                	fd = fopen(filename,"r");			if (fd != NULL)				found=TRUE;		}                if (found == FALSE)                {			path=getenv("PATH");/* get the list of path directories,                        			separated by : */			/* added for File System Standards  - Francois */			path1=(char *)ckalloc((strlen(path)+64)*sizeof(char));			strcpy(path1,path);			strcat(path1,"/usr/share/clustalx:/usr/local/share/clustalx");         		lf=(sint)strlen(def_file);        		deb=path1;        		do                	{                		fin=strchr(deb,':');                		if(fin!=NULL)                        	{					strncpy(filename,deb,fin-deb);					ltot=fin-deb;				}                		else                        	{					strcpy(filename,deb);					ltot=(sint)strlen(filename);				}                		/* now one directory is in filename */                		if( ltot + lf + 1 <= FILENAMELEN)                        	{                        		filename[ltot]='/';                        		strcpy(filename+ltot+1,def_file); /* now dir is appended with filename */                        		if( (fd = fopen(filename,"r") ) != NULL)					{						found=TRUE;						break;                        		}                        	}                		else found = FALSE;                		deb=fin+1;                	}        		while (fin != NULL);                }        }#endif	if (found == TRUE)	{		fclose(fd);		retname=(char *)ckalloc((strlen(filename)+1)*sizeof(char));		strcpy(retname,filename);	}	else		retname=NULL;	return(retname);} static char *init_consensus(panel_data data){	char *cons_data;        int num_res,seq,res,par,cons_total,i;        char residue; 	cons_data=(char *)ckalloc((data.ncols+1)*sizeof(char));        for (res=0;res<data.ncols;res++)        {                cons_data[res] = '.';                for (par=0;par<NumConParas;par++)                {                        cons_total = num_res = 0;                        for (seq=0;seq<data.nseqs;seq++)                        {				residue=tolower(data.lines[seq][res]);				if (isalpha(residue))					num_res++;                                for (i=0;i<Con_Par[par].length;i++)                                        if (residue==tolower(Con_Par[par].cutoff_list[i]))                                                cons_total++;                        }                        if (num_res != 0)                                if (((cons_total*100)/num_res) >= Con_Par[par].cutoff)                                        cons_data[res] = Con_Par[par].consensus;                }        }	return(cons_data);}static int SaveColPara(char word[MAXPAR][MAXPARLEN],int num_words,int count){	int i;	if (num_words < 3)	{		error("Wrong format in color list");		return(1);	}	if (word[1][0] != '=')	{		error("Wrong format in color list");		return(2);	}	if (num_words == 3)	{		Col_Par[count].type = SIMPLE;		Col_Par[count].residue = word[0][0];		Col_Par[count].color = -1;		for (i=0;i<ncolors;i++)			if (strcmp(word[2],color_lut[i].name)==0) Col_Par[count].color = i;		if (Col_Par[count].color == -1)		{			error("%s not found in rgb index - using %s",word[2],color_lut[0].name);			Col_Par[count].color = 0;		}	}	else	{		if (strcmp(word[3],"if")==0)		{			Col_Par[count].type = COMPOUND;			Col_Par[count].residue = word[0][0];			Col_Par[count].color = -1;			for (i=0;i<ncolors;i++)				if (strcmp(word[2],color_lut[i].name)==0) Col_Par[count].color = i;			if (Col_Par[count].color == -1)			{				error("%s not found in rgb index - using %s",word[2],color_lut[0].name);				Col_Par[count].color = 0;			}			Col_Par[count].length = num_words - 4;			for (i=4;i<num_words;i++)				Col_Par[count].cons_list[i-4] = word[i][0];		}		else		{			error("Wrong format in color list");			return(3);		}	}	return(0);		}static int SaveConPara(char word[MAXPAR][MAXPARLEN],int num_words,int count){	int i;	if (num_words < 3)	{		error("Wrong format in consensus list");		return(1);	}	if (word[1][0] != '=')	{		error("Wrong format in consensus list");		return(2);	}	Con_Par[count].consensus = word[0][0];	for (i=0;i<MAXPARLEN-1;i++)	{		if(word[2][i]=='%') word[2][i] = '\0';	}	Con_Par[count].cutoff = atoi(word[2]);	Con_Par[count].length = num_words - 3;	for (i=3;i<num_words;i++)	{		Con_Par[count].cutoff_list[i-3] = word[i][0];	}	return(0);		}static int get_line(char *sinline,char word[MAXPAR][MAXPARLEN]){	int i=0, j, word_count=0, char_count=0;	int in_word=FALSE;	for(i=0;i<MAXPAR-1;i++)		for(j=0;j<MAXPARLEN-1;j++)			word[i][j]='\0';	for (i=0;i<=strlen(sinline);i++)	{		switch (sinline[i])		{			case ' ':			case '\t':			case '\0':			case ':':				if (in_word)				{					word[word_count][char_count] = '\0';					word_count++;					char_count = 0;					in_word = FALSE;				}				break;			default:				in_word = TRUE;				word[word_count][char_count] = sinline[i];				char_count++;				break;		}			}	return(word_count);}static int residue_color(char res,char consensus){	int i,j;        for (i=0;i<NumColParas;i++)        {                if (tolower(res) == tolower(Col_Par[i].residue))                {                        switch (Col_Par[i].type)                        {                        case SIMPLE:                                return(Col_Par[i].color);                        case COMPOUND:                                for (j=0;j<Col_Par[i].length;j++)                                {                                        if (consensus == Col_Par[i].cons_list[j])

⌨️ 快捷键说明

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