]> git.donarmstrong.com Git - mothur.git/blobdiff - suffixnodes.cpp
Revert to previous commit
[mothur.git] / suffixnodes.cpp
diff --git a/suffixnodes.cpp b/suffixnodes.cpp
new file mode 100644 (file)
index 0000000..130b2be
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ *  SuffixNodes.cpp
+ *  
+ *
+ *  Created by Pat Schloss on 12/15/08.
+ *  Copyright 2008 Patrick D. Schloss. All rights reserved.
+ *
+ *     There are two types of nodes in a suffix tree as I have implemented it.  First, there are the internal nodes that
+ *     have children, these are the SuffixBranch objects.  There are also the terminal nodes, which are the suffixBranches.
+ *  I divided them into two groups to save on memory.  A SuffixTree object will be a vector of SuffixNodes; therefore,
+ *     the values of parentNode, children nodes, and suffix nodes are stored as ints that correspond to indices in the 
+ *     vector
+ *
+ */
+
+#include "suffixnodes.hpp"
+
+
+//********************************************************************************************************************
+
+inline char deCodeSequence(char code){
+       
+       if(code == '0')                 {       return 'a';     }       //      this method allows us to go from the int string to a char string;
+       else if(code == '1')    {       return 'c';     }       //      it's only really useful if we want to print out the tree
+       else if(code == '2')    {       return 'g';     }
+       else if(code == '3')    {       return 't';     }
+       else if(code == '4')    {       return 'n';     }
+       else                                    {       return '$';     }
+       
+}
+
+//********************************************************************************************************************
+
+SuffixNode::SuffixNode(int parent, int start, int end) : 
+               parentNode(parent),                     //      we store the parent node as an int
+               startCharPosition(start),       //      the suffix tree class will hold the sequence that the startCharPosition and 
+               endCharPosition(end)            //      endCharPosition indices correspond to
+               {       /*      do nothing      */              m = MothurOut::getInstance();   }
+
+
+void SuffixNode::setChildren(char, int)                        {       /*      do nothing      */                      }       //      there's no children in a leaf
+int SuffixNode::getNumChildren()                               {       return 0;                                       }       //      ditto
+void SuffixNode::eraseChild(char)                              {       /*      do nothing      */                      }       //      ditto
+int SuffixNode::getChild(char)                                 {       return -1;                                      }       //      ditto
+void SuffixNode::setSuffixNode(int)                            {       /*      do nothing      */                      }       //      there's no suffix node in a leaf
+int SuffixNode::getSuffixNode()                                        {       return -1;                                      }       //      ditto
+int SuffixNode::getParentNode()                                        {       return parentNode;                      }
+void SuffixNode::setParentNode(int number)             {       parentNode = number;            }
+int SuffixNode::getStartCharPos()                              {       return startCharPosition;       }
+void SuffixNode::setStartCharPos(int start)            {       startCharPosition = start;      }
+int SuffixNode::getEndCharPos()                                        {       return endCharPosition;         }       
+
+//********************************************************************************************************************
+
+SuffixLeaf::SuffixLeaf(int parent, int start, int end) : SuffixNode(parent, start, end) {      /*      do nothing      */      }
+
+
+void SuffixLeaf::print(string sequence, int nodeNumber){
+       
+       m->mothurOut(toString(this) + "\t" + toString(parentNode) + "\t" + toString(nodeNumber) + "\t" +
+       toString(-1) + "\t" + toString(startCharPosition) + "\t" + toString(endCharPosition) + "\t");
+       
+       m->mothurOut("/");
+       for(int i=startCharPosition;i<=endCharPosition;i++){
+               m->mothurOut(toString(deCodeSequence(sequence[i])));
+       }
+       m->mothurOut("/");  m->mothurOutEndLine();
+}
+
+//********************************************************************************************************************
+
+SuffixBranch::SuffixBranch(int parent, int start, int end) : SuffixNode(parent, start, end), suffixNode(-1){
+               childNodes.assign(6, -1);
+}
+       
+void SuffixBranch::print(string sequence, int nodeNumber){                                             //      this method is different that than
+       m->mothurOut(toString(this) + "\t" + toString(parentNode) + "\t" + toString(nodeNumber) + "\t" +                //      of a leaf because it prints out a
+       toString(suffixNode) + "\t" + toString(startCharPosition) + "\t" + toString(endCharPosition) + "\t");  //       value for the suffix node
+       
+       m->mothurOut("/");
+       for(int i=startCharPosition;i<=endCharPosition;i++){
+               m->mothurOut(toString(deCodeSequence(sequence[i])));
+       }
+       m->mothurOut("/");  m->mothurOutEndLine();
+}
+
+//     we can access the children by subtracting '0' from the the char value from the string, the difference is an int
+//     value and the index we need to access.
+void SuffixBranch::eraseChild(char base)       {       childNodes[base - '0'] = -1;    }       //to erase set the child index to -1
+void SuffixBranch::setChildren(char base, int nodeIndex){      childNodes[base - '0'] = nodeIndex;     }
+void SuffixBranch::setSuffixNode(int nodeIndex){       suffixNode = nodeIndex;         }
+int SuffixBranch::getSuffixNode()                      {       return suffixNode;                              }
+int SuffixBranch::getChild(char base)          {       return childNodes[base - '0'];  }
+       
+//********************************************************************************************************************