/* @include ajnexus ***********************************************************
**
** AJAX nexus file parsing functions
**
** @author Copyright (C) 2003 Peter Rice
** @version $Revision: 1.13 $
** @modified $Date: 2011/10/02 10:11:48 $ by $Author: mks $
** @@
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
** MA  02110-1301,  USA.
**
******************************************************************************/

#ifndef AJNEXUS_H
#define AJNEXUS_H

/* ========================================================================= */
/* ============================= include files ============================= */
/* ========================================================================= */

#include "ajdefine.h"
#include "ajfile.h"
#include "ajstr.h"

AJ_BEGIN_DECLS




/* ========================================================================= */
/* =============================== constants =============================== */
/* ========================================================================= */




/* ========================================================================= */
/* ============================== public data ============================== */
/* ========================================================================= */




/* @data AjPNexusTaxa *********************************************************
**
** Ajax nexus data taxa block object.
**
** @alias AjSNexusTaxa
** @alias AjONexusTaxa
**
** @new nexusTaxaNew Default constructor
**
** @delete nexusTaxaDel Default destructor
**
** @attr TaxLabels [AjPStr*] Taxon names
** @attr Ntax [ajuint] Number of taxons
** @attr Padding [char[4]] Padding to alignment boundary
** @@
******************************************************************************/

typedef struct AjSNexusTaxa
{
    AjPStr* TaxLabels;
    ajuint  Ntax;
    char    Padding[4];
} AjONexusTaxa;

#define AjPNexusTaxa AjONexusTaxa*




/* @data AjPNexusCharacters ***************************************************
**
** Ajax nexus data characters block object.
**
** @alias AjSNexusCharacters
** @alias AjONexusCharacters
**
** @new nexusCharactersNew Default constructor
**
** @delete nexusCharactersDel Default destructor
**
** @attr NewTaxa [AjBool] New taxa read from data block
** @attr Ntax [ajuint] Number of taxons
** @attr Nchar [ajuint] Number of characters
** @attr RespectCase [AjBool] Respect case if true
** @attr DataType [AjPStr] Data type
** @attr Symbols [AjPStr] Character symbols
** @attr Equate [AjPStr] Character equivalent names
** @attr Labels [AjBool] Labels if true
** @attr Transpose [AjBool] Transpose data if true
** @attr Interleave [AjBool] Interleaved input if true
** @attr Tokens [AjBool] If true, tokens set
** @attr Items [AjPStr] Character items
** @attr StatesFormat [AjPStr] States format string
** @attr Eliminate [AjPStr] Eliminate string
** @attr CharStateLabels [AjPStr*] Character and state labels
** @attr CharLabels [AjPStr*] Character labels
** @attr StateLabels [AjPStr*] State labels
** @attr Matrix [AjPStr*] Matrix data
** @attr Sequences [AjPStr*] Sequence data
** @attr Missing [char] Missing character in input data
** @attr Gap [char] Gap character in input data
** @attr MatchChar [char] Matching character in input
** @attr Padding [char[5]] Padding to alignment boundary
** @@
******************************************************************************/

typedef struct AjSNexusCharacters
{
    AjBool NewTaxa;
    ajuint Ntax;
    ajuint Nchar;
    AjBool RespectCase;
    AjPStr DataType;

    AjPStr Symbols;
    AjPStr Equate;
    AjBool Labels;
    AjBool Transpose;
    AjBool Interleave;
    AjBool Tokens;
    AjPStr Items;
    AjPStr StatesFormat;
    AjPStr Eliminate;
    AjPStr* CharStateLabels;
    AjPStr* CharLabels;
    AjPStr* StateLabels;
    AjPStr* Matrix;
    AjPStr* Sequences;
    char Missing;
    char Gap;
    char MatchChar;
    char Padding[5];
} AjONexusCharacters;

#define AjPNexusCharacters AjONexusCharacters*




/* @data AjPNexusUnaligned ****************************************************
**
** Ajax nexus data unaligned block object.
**
** Very similar to a character block and will be merged with AjPNexusCharacter
** in the near future
**
** @alias AjSNexusUnaligned
** @alias AjONexusUnaligned
**
** @new nexusUnalignedNew Default constructor
**
** @delete nexusUnalignedDel Default destructor
**
** @attr NewTaxa [AjBool] New taxa read from data block
** @attr Ntax [ajuint] Number of taxons
** @attr DataType [AjPStr] Data type
** @attr RespectCase [AjBool] Respect case if true
** @attr Labels [AjBool] Labels if true
** @attr Symbols [AjPStr] Character symbols
** @attr Equate [AjPStr] Character equivalent names
** @attr Matrix [AjPStr*] Matrix data
** @attr Missing [char] Missing character in input data
** @attr Padding [char[7]] Padding to alignment boundary
** @@
******************************************************************************/

typedef struct AjSNexusUnaligned
{
    AjBool NewTaxa;
    ajuint Ntax;
    AjPStr DataType;
    AjBool RespectCase;
    AjBool Labels;
    AjPStr Symbols;
    AjPStr Equate;
    AjPStr* Matrix;
    char Missing;
    char Padding[7];
} AjONexusUnaligned;

#define AjPNexusUnaligned AjONexusUnaligned*




/* @data AjPNexusDistances ****************************************************
**
** Ajax nexus data distances block object.
**
** @alias AjSNexusDistances
** @alias AjONexusDistances
**
** @new nexusDistancesNew Default constructor
**
** @delete nexusDistancesDel Default destructor
**
** @attr NewTaxa [AjBool] New taxa read from data block
** @attr Ntax [ajuint] Number of taxons
** @attr Nchar [ajuint] Number of characters
** @attr Diagonal [AjBool] If true, expect to read diagonal of matrix
** @attr Labels [AjBool] Labels if true
** @attr Interleave [AjBool] Interleaved input if true
** @attr Triangle [AjPStr] Triangular distances block type
** @attr Matrix [AjPStr*] Matrix data
** @attr Missing [char] Missing character in input data
** @attr Padding [char[7]] Padding to alignment boundary
** @@
******************************************************************************/

typedef struct AjSNexusDistances
{
    AjBool NewTaxa;
    ajuint Ntax;
    ajuint Nchar;
    AjBool Diagonal;
    AjBool Labels;
    AjBool Interleave;
    AjPStr Triangle;
    AjPStr* Matrix;
    char Missing;
    char Padding[7];
} AjONexusDistances;

#define AjPNexusDistances AjONexusDistances*




/* @data AjPNexusSets *********************************************************
**
** Ajax nexus data sets block object.
**
** The data is generally the NEXUS command strings as in the original file.
**
** @alias AjSNexusSets
** @alias AjONexusSets
**
** @new nexusSetsNew Default constructor
**
** @delete nexusSetsDel Default destructor
**
** @attr CharSet [AjPStr*] Character set commands
** @attr StateSet [AjPStr*] State set commands
** @attr ChangeSet [AjPStr*] Change set commands
** @attr TaxSet [AjPStr*] Taxon set commands
** @attr TreeSet [AjPStr*] Tree set commands
** @attr CharPartition [AjPStr*] Character partition statements
** @attr TaxPartition [AjPStr*] Taxa partition statements
** @attr TreePartition [AjPStr*] Tree partition statements
** @@
******************************************************************************/

typedef struct AjSNexusSets
{
    AjPStr* CharSet;
    AjPStr* StateSet;
    AjPStr* ChangeSet;
    AjPStr* TaxSet;
    AjPStr* TreeSet;
    AjPStr* CharPartition;
    AjPStr* TaxPartition;
    AjPStr* TreePartition;
} AjONexusSets;

#define AjPNexusSets AjONexusSets*




/* @data AjPNexusAssumptions **************************************************
**
** Ajax nexus data assumptions block object.
**
** @alias AjSNexusAssumptions
** @alias AjONexusAssumptions
**
** @new nexusAssumptionsNew Default constructor
**
** @delete nexusAssumptionsDel Default destructor
**
** @attr DefType [AjPStr] Options deftype subcommand
** @attr PolyTCount [AjPStr] Options polytcount subcommand
** @attr GapMode [AjPStr] Options gapmode subcommand
** @attr UserType [AjPStr*] Usertype commands
** @attr TypeSet [AjPStr*] Typeset commands
** @attr WtSet [AjPStr*] Wtset commands
** @attr ExSet [AjPStr*] Exset commands
** @attr AncStates [AjPStr*] Ancstates commands
** @@
******************************************************************************/

typedef struct AjSNexusAssumptions
{
    AjPStr DefType;
    AjPStr PolyTCount;
    AjPStr GapMode;
    AjPStr* UserType;
    AjPStr* TypeSet;
    AjPStr* WtSet;
    AjPStr* ExSet;
    AjPStr* AncStates;
} AjONexusAssumptions;

#define AjPNexusAssumptions AjONexusAssumptions*




/* @data AjPNexusCodons *******************************************************
**
** Ajax nexus data codons block object.
**
** @alias AjSNexusCodons
** @alias AjONexusCodons
**
** @new nexusCodonsNew Default constructor
**
** @delete nexusCodonsDel Default destructor
**
** @attr CodonPosSet [AjPStr*] CodonPosSetcommands
** @attr GeneticCode [AjPStr*] GeneticCodecommands
** @attr CodeSet [AjPStr*] CodeSetcommands
** @@
******************************************************************************/

typedef struct AjSNexusCodons
{
    AjPStr* CodonPosSet;
    AjPStr* GeneticCode;
    AjPStr* CodeSet;
} AjONexusCodons;

#define AjPNexusCodons AjONexusCodons*




/* @data AjPNexusTrees ********************************************************
**
** Ajax nexus data trees block object.
**
** @alias AjSNexusTrees
** @alias AjONexusTrees
**
** @new nexusTreesNew Default constructor
**
** @delete nexusTreesDel Default destructor
**
** @attr Translate [AjPStr*] Translate commands
** @attr Tree [AjPStr*] Tree commands
** @@
******************************************************************************/

typedef struct AjSNexusTrees
{
    AjPStr* Translate;
    AjPStr* Tree;
} AjONexusTrees;

#define AjPNexusTrees AjONexusTrees*




/* @data AjPNexusNotes ********************************************************
**
** Ajax nexus data notes block object.
**
** @alias AjSNexusNotes
** @alias AjONexusNotes
**
** @new nexusNotesNew Default constructor
**
** @delete nexusNotesDel Default destructor
**
** @attr Text [AjPStr*] Text commands
** @attr Picture [AjPStr*] Picture commands
** @@
******************************************************************************/

typedef struct AjSNexusNotes
{
    AjPStr* Text;
    AjPStr* Picture;
} AjONexusNotes;

#define AjPNexusNotes AjONexusNotes*




/* @data AjPNexus *************************************************************
**
** Ajax nexus data object.
**
** @alias AjSNexus
** @alias AjONexus
**
** @new ajNexusNew Default constructor
**
** @delete ajNexusDel Default destructor
**
** @attr Taxa [AjPNexusTaxa] Taxa
** @attr Characters [AjPNexusCharacters] Characters (or data)
** @attr Unaligned [AjPNexusUnaligned] Unaligned
** @attr Distances [AjPNexusDistances] Distances
** @attr Sets [AjPNexusSets] Sets
** @attr Assumptions [AjPNexusAssumptions] Assumptions
** @attr Codons [AjPNexusCodons] Codons
** @attr Trees [AjPNexusTrees] Trees
** @attr Notes [AjPNexusNotes] Notes
** @attr Ntax [ajuint] Number of taxa (wherever they were defined)
** @attr Padding [char[4]] Padding to alignment boundary
** @@
******************************************************************************/

typedef struct AjSNexus
{
    AjPNexusTaxa Taxa;
    AjPNexusCharacters Characters;
    AjPNexusUnaligned Unaligned;
    AjPNexusDistances Distances;
    AjPNexusSets Sets;
    AjPNexusAssumptions Assumptions;
    AjPNexusCodons Codons;
    AjPNexusTrees Trees;
    AjPNexusNotes Notes;
    ajuint Ntax;
    char Padding[4];
} AjONexus;

#define AjPNexus AjONexus*




/* ========================================================================= */
/* =========================== public functions ============================ */
/* ========================================================================= */




/*
** Prototype definitions
*/

void     ajNexusDel(AjPNexus* pthys);
ajuint   ajNexusGetNtaxa(const AjPNexus thys);
AjPStr*  ajNexusGetTaxa(const AjPNexus thys);
AjPStr*  ajNexusGetSequences(AjPNexus thys);
AjPNexus ajNexusNew(void);
AjPNexus ajNexusParse(AjPFilebuff buff);
void     ajNexusTrace(const AjPNexus thys);
void     ajNexusExit(void);

/*
** End of prototype definitions
*/




AJ_END_DECLS

#endif /* !AJNEXUS_H */
