/*#include "/us1/user/julie/dmalloc/malloc.h"*/
/*********************CLUSTALW.H*********************************************/
/****************************************************************************/

   /*
   Main header file for PSMA.  Uncomment ONE of the following 4 lines
   depending on which compiler you wish to use.
   */

/*#define VMS 1                 VAX or ALPHA VMS */

/*#define MAC 1                 Think_C for Macintosh */

/*#define MSDOS 1               Turbo C for PC's */

#define UNIX 1                /*Ultrix/Decstation, Gnu C for 
                                Sun, IRIX/SGI, OSF1/ALPHA */

/***************************************************************************/
/***************************************************************************/


#include "general.h"

#define MAXNAMES		30	/* Max chars read for seq. names */
#define MAXTITLES		60      /* Title length */
#define FILENAMELEN 	256             /* Max. file name length */
	
#define UNKNOWN   0
#define EMBLSWISS 1
#define PIR 	  2
#define PEARSON   3
#define GDE    	  4
#define CLUSTAL   5	/* DES */
#define MSF       6 /* DES */
#define RSF       7	/* JULIE */
#define USER      8	/* DES */
#define PHYLIP    9	/* DES */
#define NEXUS    10/* DES */
#define CLUSTALIST 11 /* JP */

#define NONE      0
#define SECST     1
#define GMASK     2

#define PROFILE 0
#define SEQUENCE 1

#define BS_NODE_LABELS 2
#define BS_BRANCH_LABELS 1

#define PAGE_LEN       22   /* Number of lines of help sent to screen */

#define PAGEWIDTH	80  /* maximum characters on output file page */
#define LINELENGTH     	60  /* Output file line length */
#define GCG_LINELENGTH 	50

#ifdef VMS						/* Defaults for VAX VMS */
#define COMMANDSEP '/'
#define DIRDELIM ']'		/* Last character before file name in full file 
							   specs */
#define INT_SCALE_FACTOR 1000 /* Scaling factor to convert float to integer for profile scores */

#elif MAC
#define COMMANDSEP '/'
#define DIRDELIM ':'
#define INT_SCALE_FACTOR 100  /* Scaling factor to convert float to integer for profile scores */

#elif MSDOS
#define COMMANDSEP '/'
#define DIRDELIM '\\'
#define INT_SCALE_FACTOR 100  /* Scaling factor to convert float to integer for profile scores */

#elif UNIX
#define COMMANDSEP '-'
#define DIRDELIM '/'
#define INT_SCALE_FACTOR 1000 /* Scaling factor to convert float to integer for profile scores */
#endif

#define NUMRES 32		/* max size of comparison matrix */

#define INPUT 0
#define ALIGNED 1

#define LEFT 1
#define RIGHT 2

#define NODE 0
#define LEAF 1

#define GAPCOL 32		/* position of gap open penalty in profile */
#define LENCOL 33		/* position of gap extension penalty in profile */

typedef struct node {		/* phylogenetic tree structure */
        struct node *left;
        struct node *right;
        struct node *parent;
        float dist;
        sint  leaf;
        int order;
        char name[64];
} stree, *treeptr;

typedef struct {
	char title[30];
	char string[30];
} MatMenuEntry;

typedef struct {
	int noptions;
	MatMenuEntry opt[10];
} MatMenu;

#define MAXMAT 10

typedef struct {
	int llimit;	
	int ulimit;
	short *matptr;
	short *aa_xref;
} SeriesMat;

typedef struct {
	int nmat;
	SeriesMat mat[MAXMAT];
} UserMatSeries;
	

/*
   Prototypes
*/

/* alnscore.c */
void aln_score(void);
/* interface.c */
void parse_params(Boolean);
void init_amenu(void);
void init_interface(void);
void 	main_menu(void);
FILE 	*open_output_file(char *, char *, char *, char *);
FILE    *open_explicit_file(char *);
sint seq_input(Boolean);
Boolean open_alignment_output(char *);
void create_alignment_output(sint fseq,sint lseq);
void align(char *phylip_name);
void profile_align(char *p1_tree_name,char *p2_tree_name);/* Align 2 alignments */
void make_tree(char *phylip_name);
void get_tree(char *phylip_name);
sint profile_input(void);                        /* read a profile */
void new_sequence_align(char *phylip_name);
Boolean user_mat(char *, short *, short *);
Boolean user_mat_series(char *, short *, short *);
void get_help(char);
void clustal_out(FILE *, sint, sint, sint, sint);
void nbrf_out(FILE *, sint, sint, sint, sint);
void gcg_out(FILE *, sint, sint, sint, sint);
void phylip_out(FILE *, sint, sint, sint, sint);
void gde_out(FILE *, sint, sint, sint, sint);
void nexus_out(FILE *, sint, sint, sint, sint);
void print_sec_struct_mask(int prf_length,char *mask,char *struct_mask);
void fix_gaps(void);

/*JP*/
void print_help();


/* calcgapcoeff.c */
void calc_gap_coeff(char **alignment, sint *gaps, sint **profile, Boolean struct_penalties,
                   char *gap_penalty_mask, sint first_seq, sint last_seq,
                   sint prf_length, sint gapcoef, sint lencoef);
/* calcprf1.c */
void calc_prf1(sint **profile, char **alignment, sint *gaps, sint matrix[NUMRES ][NUMRES ], 
               sint *seq_weight, sint prf_length, sint first_seq, sint last_seq);
/* calcprf2.c */
void calc_prf2(sint **profile, char **alignment, sint *seq_weight, sint prf_length,
               sint first_seq, sint last_seq);
/* calctree.c */
void calc_seq_weights(sint first_seq, sint last_seq,sint *seq_weight);
void create_sets(sint first_seq, sint last_seq);
sint read_tree(char *treefile, sint first_seq, sint last_seq);
void clear_tree(treeptr p);
sint calc_similarities(sint nseqs);
/* clustalw.c */
int main(int argc, char **argv);
/* gcgcheck.c */
int SeqGCGCheckSum(char *seq, sint len);
/* malign.c */
sint malign(sint istart,char *phylip_name);
sint seqalign(sint istart,char *phylip_name);
sint palign1(void);
float countid(sint s1, sint s2);
sint palign2(char *p1_tree_name,char *p2_tree_name);
/* pairalign.c */
sint pairalign(sint istart, sint iend, sint jstart, sint jend);
/* prfalign.c */
lint prfalign(sint *group, sint *aligned);
/* random.c */
unsigned long linrand(unsigned long r);
unsigned long addrand(unsigned long r);
void addrandinit(unsigned long s);
/* readmat.c */
void init_matrix(void);
sint get_matrix(short *matptr, short *xref, sint matrix[NUMRES ][NUMRES ], Boolean neg_flag,
                sint scale);
sint read_user_matrix(char *filename, short *usermat, short *xref);
sint read_matrix_series(char *filename, short *usermat, short *xref);
int getargs(char *inline1, char *args[], int max);
/* sequence.c */
void fill_chartab(void);
sint readseqs(sint first_seq);
/* showpair.c */
void show_pair(sint istart, sint iend, sint jstart, sint jend);
/* trees.c */
void phylogenetic_tree(char *phylip_name,char *clustal_name,char *dist_name, char *nexus_name);
void bootstrap_tree(char *phylip_name,char *clustal_name, char *nexus_name);
sint dna_distance_matrix(FILE *tree);
sint prot_distance_matrix(FILE *tree);
void guide_tree(FILE *tree,int first_seq,sint nseqs);

/* util.c */

void alloc_aln(sint nseqs);
void realloc_aln(sint first_seq,sint nseqs);
void free_aln(sint nseqs);
void alloc_seq(sint seq_no,sint length);
void realloc_seq(sint seq_no,sint length);
void free_seq(sint seq_no);

void *ckalloc(size_t bytes);
void *ckrealloc(void *ptr, size_t bytes);
void *ckfree(void *ptr);
char prompt_for_yes_no(char *title,char *prompt);
void fatal(char *msg, ...);
void error(char *msg, ...);
void warning(char *msg, ...);
void info(char *msg, ...);
char *rtrim(char *str);
char *blank_to_(char *str);
char *upstr(char *str);
char *lowstr(char *str);
void getstr(char *instr, char *outstr);
double getreal(char *instr, double minx, double maxx, double def);
int getint(char *instr, int minx, int maxx, int def);
void do_system(void);
Boolean linetype(char *line, char *code);
Boolean keyword(char *line, char *code);
Boolean blankline(char *line);
void get_path(char *str, char *path);


/*********************************************************/
/* new structures and functions introduced by  Jimin Pei */
/*********************************************************/

/* node for a tree containing the sequences */
typedef struct snode {
 	struct snode *left;
	struct snode *right;
	struct snode *parent;
	float dist;
	sint leaf;
	int order;
	char **name;
	int **seq;
	int seqnum;
	int seqlength;
	int **abstractseq;
	short abseqnum;
	int abseqlength;
} sstree, *streeptr;

/* node for a linked list of scores */
typedef struct scorenode {
	struct scorenode *next;
	short sbe; /* score before extension */
	short ind; /* index of the second sequence */
	int  sae; /* score after extension */
} SN;


/* structure of element of an alignment */
/*typedef struct AlignmentElement {
	int gid;
	int pid;
} AE;
*/

/* function prototypes */
/* lib_generation.c */
SN * SNavail();
void lib_generation();
void AddSbe(SN *node, int indi, int s);
void printLib(int gi, int gj);


/* calctree.c */
void assign_node(streeptr p, sint *aligned);
double average_group_identity(sint *group);

/* al2comp2.c */
void prfprfmatrix(int indi1, int indi2, int alnlength1, int alnlength2, int nali1, int nali2, double **prfprfmat);

/*lsim1.c */
void SIM(int M,int N,int K,int **V,int Q,int R,int nseq,int gi, int gj);

/*lib_extension.c */
void lib_extension();

/*prfalign1.c */
lint prfalign1(sint *group, sint gi, sint gj);
