/* hgMaf.h - Stuff to load up mafs from the browser database.
 *           Also, items for maf track display */

/* Copyright (C) 2012 The Regents of the University of California 
 * See kent/LICENSE or http://genome.ucsc.edu/license/ for licensing information. */
#ifndef HGMAF_H
#define HGMAF_H


#include "trackDb.h"
#include "cart.h"
#include "bbiFile.h"

/* Track settings and variables */
#define SPECIES_TREE_VAR        "speciesTree"
#define SPECIES_ORDER_VAR       "speciesOrder"
#define SPECIES_GROUP_VAR       "speciesGroups"
#define SPECIES_TARGET_VAR      "speciesTarget"
#define SPECIES_DEFAULT_OFF_VAR "speciesDefaultOff"
#define SPECIES_GROUP_PREFIX    "sGroup_"
#define SPECIES_HTML_TARGET	"sT"
#define SPECIES_CODON_DEFAULT	"speciesCodonDefault"
#define SPECIES_USE_FILE        "speciesUseFile"
#define SPECIES_LABELS          "speciesLabels"
#define PAIRWISE_VAR            "pairwise"
#define PAIRWISE_HEIGHT         "pairwiseHeight"
#define SUMMARY_VAR             "summary"
#define BASE_COLORS_VAR         "baseColors"
#define BASE_COLORS_OFFSET_VAR  "baseColorsOffset"
#define CONS_WIGGLE             "wiggle"
#define ITEM_FIRST_CHAR_CASE	"itemFirstCharCase"
#define DEFAULT_CONS_LABEL      "Conservation"

#define gsidSubjList "gsidTable.gsidSubjList"
#define gsidSeqList "gsidTable.gsidSeqList"

#define gisaidSubjList "gisaidTable.gisaidSubjList"
#define gisaidSeqList "gisaidTable.gisaidSeqList"

struct mafAli *mafLoadInRegion2(struct sqlConnection *conn,
        struct sqlConnection *conn2, char *table, char *chrom,
        int start, int end, char *file);
/* Return list of alignments in region. */

struct mafAli *mafLoadInRegion(struct sqlConnection *conn, char *table,
	char *chrom, int start, int end);
/* Return list of alignments in region. */

struct mafAli *axtLoadAsMafInRegion(struct sqlConnection *conn, char *table,
	char *chrom, int start, int end,
	char *tPrefix, char *qPrefix, int tSize,  struct hash *qSizeHash);
/* Return list of alignments in region from axt external file as a maf. */

struct mafBaseProbs 
// the probability of each nucleotide being in a certain colum
    {
    double aProb, cProb, gProb, tProb;
    };

struct mafBaseProbs *hgBigMafProbs(
	char *database,     /* Database, must already have hSetDb to this */
        struct bbiFile *bbi,
	char *chrom, 	    /* Chromosome (in database genome) */
	int start, int end, /* start/end in chromosome */
	char strand 	    /* Chromosome strand. */
        );
/* calculate the probability of each nucleotide in each column of a bigMaf. */

struct mafBaseProbs *hgMafProbs(
	char *database,     /* Database, must already have hSetDb to this */
	char *track, 	    /* Name of MAF track */
	char *chrom, 	    /* Chromosome (in database genome) */
	int start, int end, /* start/end in chromosome */
	char strand 	    /* Chromosome strand. */
        );
/* calculate the probability of each nucleotide in each column of a maf. */

struct mafAli *hgBigMafFrag(
	char *database,     /* Database, must already have hSetDb to this */
        struct bbiFile *bbi,
	char *chrom, 	    /* Chromosome (in database genome) */
	int start, int end, /* start/end in chromosome */
	char strand, 	    /* Chromosome strand. */
	char *outName, 	    /* Optional name to use in first component */
	struct slName *orderList /* Optional order of organisms. */
	);
/* hgBigMafFrag - Extract maf sequences for a region from a bigMaf and call hgMafFragHelper. */

struct mafAli *hgMafFrag(
	char *database,     /* Database, must already have hSetDb to this */
	char *track, 	    /* Name of MAF track */
	char *chrom, 	    /* Chromosome (in database genome) */
	int start, int end, /* start/end in chromosome */
	char strand, 	    /* Chromosome strand. */
	char *outName, 	    /* Optional name to use in first component */
	struct slName *orderList /* Optional order of organisms. */
	);
/* mafFrag- Extract maf sequences for a region from database.
 * This creates a somewhat unusual MAF that extends from start
 * to end whether or not there are actually alignments.  Where
 * there are no alignments (or alignments missing a species)
 * a . character fills in.   The score is always zero, and
 * the sources just indicate the species.  You can mafFree this
 * as normal. */

int mafCmp(const void *va, const void *vb);
/* Compare to sort based on start of first component. */

struct consWiggle {
    struct consWiggle *next;    /* Next in list */
    char *table;                /* phastCons table */
    char *leftLabel;            /* Left label for hgTracks */
    char *uiLabel;              /* Label to print on trackUi */
};

struct consWiggle *wigMafWiggles(char *db, struct trackDb *tdb);
/* get conservation wiggle table names and labels from trackDb setting,
   ignoring those where table doesn't exist */

char *wigMafWiggleVar(char *prefix, struct consWiggle *wig,char **suffix);
// Return name of cart variable (and optionally the suffix) for this cons wiggle

struct wigMafSpecies
    {
    struct wigMafSpecies *next;
    char *name;
    int group;
    boolean on;
    };

struct wigMafSpecies * wigMafSpeciesTable(struct cart *cart,
    struct trackDb *tdb, char *name, char *db) ;
char **wigMafGetSpecies(struct cart *cart, struct trackDb *tdb, char *prefix, char *db, 
                        struct wigMafSpecies **list, int *groupCt);

struct consWiggle *consWiggleFind(char *db,struct trackDb *parent,char *table);
/* Return conservation wig if it is found in the parent. */

struct mafAli *bigMafLoadInRegion( struct bbiFile *bbi, char *chrom, int start, int end);
/* Read in MAF blocks from bigBed. */

struct hash *mafGetLabelHash(struct trackDb *tdb);
/* Get mapping of sequence name to label. */

#endif//ndef HGMAF_H
