gde_linux/HGL_SRC/MakeCons.c

179 lines
3.9 KiB
C
Raw Normal View History

2022-03-08 04:43:05 +08:00
#include <stdio.h>
#include <malloc.h>
#include "global_defs.h"
main(ac,av)
int ac;
char *av[];
{
Sequence cons; /* master alignment */
Sequence *master; /* Current Walking sets to add */
int cursize, maxsize = 10, ii;
char str[2], cons_type;
FILE *file, *consout_fp, *maskout_fp;
int conserved_color, variable_color, partial_color, major_perc;
if(ac == 1)
{
fprintf(stderr, "Usage:\n");
fprintf(stderr,
"%s %s\n\t%s\n\t%s\n\t%s\n\t%s\n\t%s\n\t%s\n\t%s\n",
av[0],
"sequence-file",
"[-iupac] IUPAC consensus. Default",
"[-majority percent] Majority consensus (default percent: 75)",
"[-maskv colorv] Variable position color",
"[-maskc colorc] Conserved position color",
"[-maskp colorp] Partially conserved color",
"[-consout output-consensus] Default: stdout",
"[-maskout output-mask]");
exit (0);
}
InitRecord(&cons);
if((file = fopen(av[1],"r")) == NULL)
{
fprintf(stderr, "Can't open sequence-file %s.\n", av[1]);
exit(1);
}
master = (Sequence*)Calloc(maxsize,sizeof(Sequence));
cursize = 0;
while(ReadRecord(file,&(master[cursize])) != -1)
{
SeqNormal(&master[cursize]);
if(++cursize == maxsize)
{
maxsize *= 2;
master = (Sequence*)
Realloc(master, maxsize*sizeof(Sequence));
}
master[cursize].group_number = 99999;
}
fclose(file);
cons_type = ' '; /* 'i':IUPAC, 'm':majority, 'k':mask */
consout_fp = stdout;
maskout_fp = NULL;
conserved_color = 8; /* black */
variable_color = 3; /* red */
ii = 2;
while(ii < ac)
{
if(strcmp(av[ii], "-iupac") == 0)
{
cons_type = 'i';
}
else if(strcmp(av[ii], "-majority") == 0)
{
cons_type = 'm';
ii++;
major_perc = atoi(av[ii]);
}
else if(strcmp(av[ii], "-maskv") == 0)
{
variable_color = atoi(av[++ii]);
if(cons_type == ' ')
cons_type = 'k';
}
else if(strcmp(av[ii], "-maskc") == 0)
{
conserved_color = atoi(av[++ii]);
if(cons_type == ' ')
cons_type = 'k';
}
else if(strcmp(av[ii], "-maskp") == 0)
{
partial_color = atoi(av[++ii]);
if(cons_type == ' ')
cons_type = 'k';
}
else if(strcmp(av[ii], "-consout") == 0)
{
if((consout_fp = fopen(av[++ii], "w")) == NULL)
{
fprintf(stderr, "Can't open output file %s.\n",av[ii]);
consout_fp = stdout;
}
}
else if(strcmp(av[ii], "-maskout") == 0)
{
if((maskout_fp = fopen(av[++ii], "w")) == NULL)
{
fprintf(stderr, "Can't open output file %s.\n",av[ii]);
}
}
else
{
fprintf(stderr, "Invalid flag %s\n", av[ii]);
}
ii++;
}
if(cons_type == ' ')
cons_type = 'i';
if(cons_type != 'k')
{
if(maskout_fp != NULL)
{
/* Useful only when output to GDE. */
fprintf(maskout_fp, "length:%d\n", cons.seqlen);
fprintf(maskout_fp, "start:\n");
}
if((cons_type == 'i' &&
MakeConsensus(master,cursize,&cons,0,cons_type)==FALSE) ||
(cons_type == 'm' &&
MajorityCons(master,cursize,&cons,0, major_perc) == FALSE))
{
fprintf(stderr, "Failed to make consensus.\n");
exit(1);
}
WriteRecord(consout_fp, &cons, NULL, 0);
}
else
{
if(MakeScore(master,cursize,&cons,0) == FALSE)
{
fprintf(stderr, "Failed to make consensus.\n");
exit(1);
}
/*WriteRecord(stdout, &cons, NULL, 0);
printf("\n\n");*/
if(maskout_fp == NULL)
{
maskout_fp = stdout;
}
fprintf(maskout_fp, "length:%d\n", cons.seqlen);
fprintf(maskout_fp, "start:\n");
for(ii = 0; ii < cons.seqlen; ii++)
{
switch(cons.c_elem[ii])
{
case 'F':
fprintf(maskout_fp, "%d\n", partial_color);
break;
case 'E':
fprintf(maskout_fp, "%d\n", conserved_color);
break;
default:
fprintf(maskout_fp, "%d\n", variable_color);
break;
}
}
}
fclose(consout_fp);
fclose(maskout_fp);
}