WSTester updated to work plus hopefully all the other changes that need to go into...
[jabaws.git] / binaries / src / ViennaRNA / RNAforester / src / rnaforestsz.cpp
diff --git a/binaries/src/ViennaRNA/RNAforester/src/rnaforestsz.cpp b/binaries/src/ViennaRNA/RNAforester/src/rnaforestsz.cpp
new file mode 100644 (file)
index 0000000..d83a124
--- /dev/null
@@ -0,0 +1,114 @@
+/*
+  Copyright by Matthias Hoechsmann (C) 2002
+  =====================================                                   
+  You may use, copy and distribute this file freely as long as you
+  - do not change the file,
+  - leave this copyright notice in the file,
+  - do not make any profit with the distribution of this file
+  - give credit where credit is due
+  You are not allowed to copy or distribute this file otherwise
+  The commercial usage and distribution of this file is prohibited
+  Please report bugs and suggestions to <mhoechsm@TechFak.Uni-Bielefeld.DE>
+*/
+
+#include "rnaforestsz.h"
+#include "rnafuncs.h"
+
+#include "ppforestsz.t.cpp"
+
+RNAForestSZ::RNAForestSZ(const string &baseStr, const string &viennaStr, const string &name)
+ : PPForestSZ<RNA_Alphabet>(RNAFuncs::treeSize(viennaStr)),
+   m_baseStr(baseStr), m_viennaStr(viennaStr)
+{      
+  Uint pos,node;
+  Ulong basePairCount,maxDepth;        
+
+  assert(RNAFuncs::isRNAString(baseStr));
+  RNAFuncs::isViennaString(viennaStr,basePairCount,maxDepth);
+
+  // check if base string and vienna string have the same length
+//  if(baseStr.length() > 0)
+//    if(baseStr.length() != m_viennaStr.length())
+//      throw RNAForestExceptionInput(RNAForestExceptionInput::Error_BaseStringAndViennaStringIncompatible);
+
+  if(name.empty())
+    m_name="unknown";
+  else
+    m_name=name;
+
+  pos=0;
+  node=0;
+  buildForest(pos,node);
+  calcKeyroots();
+
+  // debug 
+  /*
+  int i;
+  cout << "m_lb:" << endl;
+  for(i=0;i<m_size;i++)
+         cout << i << ": " << RNA_Alpha2alpha(m_lb[i]) << endl;
+
+  cout << "m_lml:" << endl;
+  for(i=0;i<m_size;i++)
+         cout << i << ": " << m_lml[i] << endl; */
+}
+
+void RNAForestSZ::buildForest(Uint &pos, Uint &node)
+{                              
+  Uint node2;  
+
+  switch(m_viennaStr[pos])
+  {
+  case '.':
+         // set label 
+         if(m_baseStr.length())
+               m_lb[node]=alpha2RNA_Alpha(m_baseStr[pos]);
+         else
+           m_lb[node]=ALPHA_BASE;
+
+         m_lml[node]=node;
+
+         break;
+  case '(':   
+         // left paring base
+         if(m_baseStr.length())
+               m_lb[node]=alpha2RNA_Alpha(m_baseStr[pos]);
+         else
+           m_lb[node]=ALPHA_BASE;
+
+         m_lml[node]=node;
+         
+         // build subforest right to (
+         node2=node;
+         node++;
+         pos++;
+         buildForest(pos,node);
+         
+
+         // right bracket
+         assert(m_viennaStr[pos]==')');
+
+         // right pairing base
+         if(m_baseStr.length())
+               m_lb[node]=alpha2RNA_Alpha(m_baseStr[pos]);
+         else
+           m_lb[node]=ALPHA_BASE;
+
+         m_lml[node]=node;
+               
+
+         node++;
+         m_lb[node]=ALPHA_BASEPAIR;
+         m_lml[node]=node2;
+         break;                
+  
+  case ')':
+         return;
+         break;
+  }
+
+  pos++;
+  node++;      
+  if(pos<m_viennaStr.length())
+       buildForest(pos,node);                    
+}