(C++) GetRootBranches
February 24, 2017 · View on GitHub
(C++) GetRootBranches
GetRootBranches is a Newick code snippet to obtain the Newick's two root branches: from the Newick '(X,Y)' (where both X and Y might be complex), it returns 'X' and 'Y'.
///GetRootBranches obtains the two root branches from a binary Newick. ///Examples: /// (1,2) -> {1 , 2} /// (1,(2,3)) -> {1 , (2,3)} ///((1,2),(3,4)) -> {(1,2) , (3,4)} ///From http://www.richelbilderbeek.nl/CppGetRootBranches.htm const std::pair<std::vector<int>,std::vector<int> > GetRootBranches(const std::vector<int>& n) { assert(IsNewick(n)); assert(IsBinaryNewick(n)); assert(n.size() > 3 && "A Newick must have at least two values"); assert(n[0] == BinaryNewickVector::bracket_open); assert(n[n.size()-1] == BinaryNewickVector::bracket_close); const int sz = boost::numeric_cast<int>(n.size()); //Return the answer directly is Newick consists //out of two values only if (sz==4) { assert(n[1] > 0); assert(n[2] > 0); return std::make_pair( CreateVector( static_cast<int>(BinaryNewickVector::bracket_open), n[1], static_cast<int>(BinaryNewickVector::bracket_close)), CreateVector( static_cast<int>(BinaryNewickVector::bracket_open), n[2], static_cast<int>(BinaryNewickVector::bracket_close))); } //Check the kind of Newick //1) (x(yz)) return { x,(yz) } //2) ((xy)z) return { (xy), (z) } //3) ((ab)(cd)) return { (ab),(cd) } if (n[1]>0) { //1) (x(yz)) return { x,(yz) } return std::make_pair( CreateVector( static_cast<int>(BinaryNewickVector::bracket_open) ,n[1], static_cast<int>(BinaryNewickVector::bracket_close)), std::vector<int>(n.begin()+2,n.end()-1)); } else if (n[n.size()-2]>0) { //2) ((xy)z) return { (xy), (z) } return std::make_pair( std::vector<int>(n.begin()+1,n.end()-2), CreateVector( static_cast<int>(BinaryNewickVector::bracket_open), n[sz-2], static_cast<int>(BinaryNewickVector::bracket_close))); } else { //3) ((ab)(cd)) return { (ab),(cd) } //Find ')(' int i = 0; for (; i!=sz-1; ++i) { if ( n[i ]==BinaryNewickVector::bracket_close && n[i+1]==BinaryNewickVector::bracket_open) break; } assert(i!=sz-1 && "Sequence )( must be found"); return std::make_pair( std::vector<int>(n.begin()+1,n.begin()+i+1), std::vector<int>(n.begin()+i+1,n.end()-1)); } }