phylo_tree_reader.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:5k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: phylo_tree_reader.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 21:11:46  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: phylo_tree_reader.cpp,v 1000.1 2004/06/01 21:11:46 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors:  Vladimir Tereshkov
  35.  *
  36.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <gui/widgets/phylo_tree/phylo_tree_reader.hpp>
  41. BEGIN_NCBI_SCOPE
  42. CPhyloPhylipReader::CPhyloPhylipReader()
  43. {
  44.     m_Phylip = "";
  45. }
  46.  
  47. CPhyloPhylipReader::CPhyloPhylipReader(string str)
  48. {
  49.     m_Phylip = str;
  50. }
  51. CPhyloPhylipReader::~CPhyloPhylipReader()
  52. {
  53. }
  54. void CPhyloPhylipReader::x_Tokenize(const string& str,  vector<string>& tokens, const string& delimiters)
  55. {
  56.     string::size_type lastPos = str.find_first_not_of(delimiters, 0);
  57.     string::size_type pos     = str.find_first_of(delimiters, lastPos);
  58.     while (string::npos != pos || string::npos != lastPos) {        
  59.         tokens.push_back(str.substr(lastPos, pos - lastPos));        
  60.         lastPos = str.find_first_not_of(delimiters, pos);        
  61.         pos = str.find_first_of(delimiters, lastPos);
  62.     }
  63. }
  64. CPhyloTreeNode * CPhyloPhylipReader::x_Parse(CPhyloTreeNode * par, string str)
  65. {    
  66.     str = str.substr(1, str.length()-2);  
  67.     
  68.     // no nested nodes found
  69.     if (str.find_first_of("(")==string::npos){    
  70.         // retrieving nodes
  71.         vector <string> vectNodes; x_Tokenize(str, vectNodes, ",");
  72.         
  73.         for (vector<string>::iterator it=vectNodes.begin(); it!=vectNodes.end(); it++){
  74.             CPhyloTreeNode  * childNode = new CPhyloTreeNode;           
  75.             
  76.             // retrieving name/value pair for each node
  77.             vector <string> vectValue; x_Tokenize(*it, vectValue, ":");
  78.             
  79.             // initializing child node
  80.             if (vectValue.size()>0){
  81.                 childNode->GetValue()->SetLabel(vectValue[0]);
  82.                 if (vectValue.size()>1){
  83.                     childNode->GetValue()->SetDistance(NStr::StringToDouble(vectValue[1]));
  84.                 }                
  85.             }
  86.             par->InsertNode(par->SubNodeBegin(), childNode);
  87.         }
  88.     }  
  89.     return par;   
  90. }
  91.     
  92. CPhyloTreeNode * CPhyloPhylipReader::GetTree(void)
  93. {
  94.     CPhyloTreeNode *node1 = new CPhyloTreeNode;
  95.     CPhyloTreeNode *node2 = new CPhyloTreeNode;
  96.     CPhyloTreeNode *node3 = new CPhyloTreeNode;
  97.     CPhyloTreeNode *node4 = new CPhyloTreeNode;
  98.     CPhyloTreeNode *node5 = new CPhyloTreeNode;
  99.     CPhyloTreeNode *node6 = new CPhyloTreeNode;
  100.     CPhyloTreeNode *node7 = new CPhyloTreeNode;
  101.     
  102.     x_Parse(node1, m_Phylip);
  103.     x_Parse(node2, m_Phylip);
  104.     x_Parse(node3, m_Phylip);
  105.     x_Parse(node4, m_Phylip);
  106.     x_Parse(node5, m_Phylip);
  107.     x_Parse(node6, m_Phylip);
  108.     x_Parse(node7, m_Phylip);
  109.     node3->InsertNode(node3->SubNodeBegin(), node5);       
  110.     node2->InsertNode(node2->SubNodeBegin(), node3);       
  111.     node2->InsertNode(node2->SubNodeBegin(), node4);       
  112.     node1->InsertNode(node1->SubNodeBegin(), node2);       
  113.     node1->InsertNode(node1->SubNodeBegin(), node6);       
  114.     node1->InsertNode(node1->SubNodeBegin(), node7);       
  115.     for (int i=0; i<5; i++){
  116.         CPhyloTreeNode *n = new CPhyloTreeNode;
  117.         x_Parse(n, m_Phylip);
  118.         node7->InsertNode(node7->SubNodeBegin(), n);           
  119.     }
  120.     return node1;
  121. }
  122. END_NCBI_SCOPE
  123. /*
  124.  * ===========================================================================
  125.  * $Log: phylo_tree_reader.cpp,v $
  126.  * Revision 1000.1  2004/06/01 21:11:46  gouriano
  127.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  128.  *
  129.  * Revision 1.2  2004/05/21 22:27:54  gorelenk
  130.  * Added PCH ncbi_pch.hpp
  131.  *
  132.  * Revision 1.1  2004/02/13 17:05:07  tereshko
  133.  * Phylogenetic Tree Widget initial revision
  134.  *
  135.  * ===========================================================================
  136.  */