📄 rnaforestsz.cpp
字号:
/*
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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -