/* This a mix of tree functions and data-structures from * Bob Edgar's Muscle (version 3.7) ported to pure C. * * Used files: phy.cpp, tree.h, phytofile.cpp and phyfromclust.cpp * * Muscle's code is public domain and so is this code here. * From http://www.drive5.com/muscle/license.htm: * """ * MUSCLE is public domain software * * The MUSCLE software, including object and source code and * documentation, is hereby donated to the public domain. * * Disclaimer of warranty * THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, * EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * """ * */ /* * RCS $Id: muscle_tree.h 230 2011-04-09 15:37:50Z andreas $ */ #ifndef CLUSTALO_MUSCLE_CLUSTALO_TREE_H #define CLUSTALO_MUSCLE_CLUSTALO_TREE_H #include #include "util.h" #ifndef uint /* limit use of uint (see coding_style_guideline.txt) */ typedef unsigned int uint; #endif static const uint NULL_NEIGHBOR = UINT_MAX; /** * @brief guide-tree structure * * @note We kept the original variable names here, to make it easy to * search through Muscle's source code. * From phy.cpp: * Node has 0 to 3 neighbors: * 0 neighbors: singleton root * 1 neighbor: leaf, neighbor is parent * 2 neigbors: non-singleton root * 3 neighbors: internal node (other than root) * * Minimal rooted tree is single node. * Minimal unrooted tree is single edge. * Leaf node always has nulls in neighbors 2 and 3, neighbor 1 is parent. * When tree is rooted, neighbor 1=parent, 2=left, 3=right. * */ typedef struct { uint m_uNodeCount;/**< number of nodes */ uint m_uCacheCount;/**< reserved memory */ uint *m_uNeighbor1;/**< parent node */ uint *m_uNeighbor2;/**< left node */ uint *m_uNeighbor3;/**< right node */ /* do we have edge lengths info stored (m_dEdgeLength[123]) */ bool *m_bHasEdgeLength1; bool *m_bHasEdgeLength2; bool *m_bHasEdgeLength3; double *m_dEdgeLength1; double *m_dEdgeLength2; double *m_dEdgeLength3; #if USE_HEIGHT /* unused in our version of the code. we might need it at some * stage so keep it in here, but disable via USE_HEIGHT throughout * the code */ double *m_dHeight; bool *m_bHasHeight; #endif /** * leaf labels. * index range: 0 -- (m_uNodeCount+1)/2 */ char **m_ptrName; /** * node id. * index range: 0 -- m_uNodeCount */ uint *m_Ids; bool m_bRooted; /**< tree is rooted */ uint m_uRootNodeIndex; } tree_t; extern void MuscleTreeCreate(tree_t *tree, uint uLeafCount, uint uRoot, const uint *Left, const uint *Right, const float *LeftLength, const float* RightLength, const uint *LeafIds, char **LeafNames); extern void MuscleTreeToFile(FILE *fp, tree_t *tree); extern int MuscleTreeFromFile(tree_t *tree, char *ftree); extern void FreeMuscleTree(tree_t *tree); extern void LogTree(tree_t *tree, FILE *fp); extern bool IsRooted(tree_t *tree); extern uint GetNodeCount(tree_t *tree); extern uint GetLeafCount(tree_t *tree); extern uint FirstDepthFirstNode(tree_t *tree); extern uint NextDepthFirstNode(uint nodeindex, tree_t *tree); extern bool IsLeaf(uint nodeindex, tree_t *tree); extern void SetLeafId(tree_t *tree, uint uNodeIndex, uint uId); extern uint GetLeafId(uint nodeindex, tree_t *tree); extern char * GetLeafName(unsigned uNodeIndex, tree_t *tree); extern uint GetLeft(uint nodeindex, tree_t *tree); extern uint GetRight(uint nodeindex, tree_t *tree); extern uint GetRootNodeIndex(tree_t *tree); extern bool IsRoot(uint uNodeIndex, tree_t *tree); extern uint GetParent(unsigned uNodeIndex, tree_t *tree); extern double GetEdgeLength(uint uNodeIndex1, uint uNodeIndex2, tree_t *tree); extern uint LeafIndexToNodeIndex(uint uLeafIndex, tree_t *prTree); extern void AppendTree(tree_t *prDstTree, uint uDstTreeNodeIndex, tree_t *prSrcTree); extern void TreeValidate(tree_t *tree); #endif