/* $Id$
 *
 * Christian Iseli, LICR ITO, Christian.Iseli@licr.org
 *
 * Copyright (c) 2001-2006 Swiss Institute of Bioinformatics.
 * Copyright (C) 1998-2001  Liliana Florea.
 */

#ifndef SIM4_H
#define SIM4_H

#define DIST_CUTOFF     3
#define DEFAULT_GAPPCT  10
#define MIN_INTRON      30
#define MAX_GRINIT      500
#define MATCH_CUTOFF    50
#define DEFAULT_FILTER  75
#define DEFAULT_W       12
#define DEFAULT_X       12    
#define DEFAULT_K       15
#define DEFAULT_C       15
#define P               (.2)
#define MATCH           1
#define MISMATCH        (-5)
#define DELETE          1
#define INSERT          2
#define SUBSTITUTE      3
#define BUF_SIZE        4096
#define NACHARS         128
#define HASH_SIZE       (1 << 19)
#define HASH_MASK       (HASH_SIZE - 1)

#define min(x, y)       ((x > y) ? (y) : (x))
#define max(x, y)       ((x < y) ? (y) : (x))


/* data structures */

typedef unsigned char uchar;

typedef struct _hash_node_t {
  unsigned int ecode;        /* integer encoding of the word */
  int pos;                   /* positions where word hits query sequence */
} hash_node_t, *hash_node_p_t;

typedef struct _hash_env_t {
  void **hashtab;
  uchar *seq;
  unsigned int len;
  int *next_pos;
  unsigned int mask;
  unsigned int W;
} hash_env_t, *hash_env_p_t;

typedef struct _read_buf_t {
  char *line;
  unsigned int lmax;
  unsigned int lc;
  unsigned int ic;
  char in[BUF_SIZE];
} read_buf_t, *read_buf_p_t;

typedef struct _seq_t {
  const char *fName;
  char *header;
  unsigned char *seq;
  read_buf_t rb;
  int fd;
  unsigned int len;
  unsigned int maxHead;
  unsigned int max;
} seq_t, *seq_p_t;

typedef struct _exon_t {
  unsigned int from1, from2, to1, to2;
  unsigned int score;
  unsigned int Score;
  unsigned int top : 1;
  unsigned int bot : 1;
  int prev : 30;
  int direction : 2;
  unsigned int splScore : 22;
  int type : 8;
} exon_t, *exon_p_t;

typedef struct _sim4_stats {
  unsigned int nmatches;
  int polyA_cut;
  int polyT_cut;
} sim4_stats_t, *sim4_stats_p_t;

/* used only in the alignment stage */
typedef struct _edit_script {
  struct _edit_script *next;
  int num;        /* Number of operations */
  char op_type;   /* SUB, INS, or DEL */
} edit_script_t, *edit_script_p_t;

typedef struct _edit_script_list {
  struct _edit_script_list *next_script;
  edit_script_p_t script;
  unsigned int offset1, offset2;
  unsigned int len1, len2; 
  int score;
} edit_script_list_t, *edit_script_list_p_t;

typedef union _collec_elt_t {
  void **elt;
  exon_p_t *exon;
  struct _result_t **result;
} collec_elt_t;

typedef struct _collec_t {
  collec_elt_t e;
  unsigned int nb;
  unsigned int size;
} collec_t, *collec_p_t;

typedef struct _result_t {
  edit_script_list_p_t sList;
  collec_t eCol;
  unsigned int dStart;
  unsigned int dLen;
  int direction;
  sim4_stats_t st;
} result_t, *result_p_t;

typedef struct _junction_t {
  uchar fwd[4];
  uchar rev[4];
} junction_t, *junction_p_t;

typedef struct _splice_score_t {
  unsigned int to1;
  unsigned int to2;
  unsigned int nFrom1;
  unsigned int type;
  unsigned int score;
  unsigned int splScore;
  int direction;
} splice_score_t, *splice_score_p_t;

typedef struct _options_t {
  char *splice_type_list;
  junction_p_t splice;
  unsigned int nbSplice;
  int ali_flag;
  unsigned int C;
  int cutoff;
  unsigned int gapPct;
  unsigned int intron_window;
  unsigned int K;
  unsigned int scoreSplice_window;
  int mismatchScore;
  int reverse;
  int matchScore;
  int W;
  int X;
  unsigned int dnaOffset;
  unsigned int filterPct;
  unsigned int minScore_cutoff;
} options_t;
extern options_t options;
extern char *argv0;

#endif
