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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: tree_loader.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/02 20:24:21  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: tree_loader.cpp,v 1000.2 2004/06/02 20:24:21 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:  Josh Cherry
  35.  *
  36.  * File Description:
  37.  *    CDataPlugin_TreeLoader - load a phylogenetic tree from a file
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "tree_loader.hpp"
  41. #include <gui/core/doc_exception.hpp>
  42. #include <gui/core/doc_manager.hpp>
  43. #include <gui/core/idocument.hpp>
  44. #include <gui/core/plugin_utils.hpp>
  45. #include <gui/core/version.hpp>
  46. #include <gui/plugin/PluginCommandSet.hpp>
  47. #include <gui/plugin/PluginInfo.hpp>
  48. #include <gui/plugin/PluginValueConstraint.hpp>
  49. #include <gui/utils/message_box.hpp>
  50. #include <gui/objutils/utils.hpp>
  51. #include <algo/phy_tree/phy_tree_serial.hpp>
  52. #include <objects/biotree/BioTreeContainer.hpp>
  53. #include <objects/biotree/FeatureDescr.hpp>
  54. #include <objects/biotree/Node.hpp>
  55. #include <objects/biotree/NodeSet.hpp>
  56. #include <objects/biotree/NodeFeature.hpp>
  57. #include <objects/biotree/NodeFeatureSet.hpp>
  58. #include <objects/biotree/FeatureDictSet.hpp>
  59. BEGIN_NCBI_SCOPE
  60. USING_SCOPE(objects);
  61. //
  62. // factory implementations
  63. //
  64. void CDataPlugin_TreeLoader::GetInfo(CPluginInfo& info)
  65. {
  66.     info.Reset();
  67.     // version info macro
  68.     info.SetInfo(CPluginVersion::eMajor, CPluginVersion::eMinor, 0,
  69.                  string(__DATE__) + " " + string(__TIME__),
  70.                  "CDataPlugin_TreeLoader",
  71.                  "Phylogenetic Tree File (Newick)",
  72.                  "Read a phylogenetic tree in Newick format",
  73.                  "");
  74.     // command info
  75.     CPluginCommandSet& cmds     = info.SetCommands();
  76.     CPluginCommand& load_args   = cmds.AddDataCommand(eDataCommand_load);
  77.     load_args.AddArgument("file", "File name", CPluginArg::eFile);
  78.     load_args.AddArgument("make_btc",
  79.                           "Create BioTreeContainer object "
  80.                           "(experimental)",
  81.                           CPluginArg::eBoolean);
  82. }
  83. //
  84. // Default ctor
  85. //
  86. CDataPlugin_TreeLoader::CDataPlugin_TreeLoader()
  87. {
  88. }
  89. //
  90. // One and only dtor
  91. //
  92. CDataPlugin_TreeLoader::~CDataPlugin_TreeLoader()
  93. {
  94. }
  95. /// Recursive function for adding TPhyTreeNodes to BioTreeContainer
  96. static void s_AddNodeToBtc(CRef<CBioTreeContainer> btc, TPhyTreeNode* ptn,
  97.                            int parent_uid, int& next_uid)
  98. {
  99.     const int label_fid = 0;
  100.     const int dist_fid = 1;
  101.     CRef<CNode> node;
  102.     CRef<CNodeFeature> node_feature;
  103.     int my_uid = next_uid++;
  104.     // first do this node
  105.     node = new CNode;
  106.     node->SetId(my_uid);
  107.     node->SetParent(parent_uid);
  108.     if (ptn->GetValue().GetLabel() != "") {
  109.         node_feature = new CNodeFeature;
  110.         node_feature->SetFeatureid(label_fid);
  111.         node_feature->SetValue(ptn->GetValue().GetLabel());
  112.         node->SetFeatures().Set().push_back(node_feature);
  113.     }
  114.     if (ptn->GetValue().IsSetDist()) {
  115.         node_feature = new CNodeFeature;
  116.         node_feature->SetFeatureid(dist_fid);
  117.         node_feature->SetValue
  118.             (NStr::DoubleToString(ptn->GetValue().GetDist()));
  119.         node->SetFeatures().Set().push_back(node_feature);
  120.     }
  121.     btc->SetNodes().Set().push_back(node);
  122.     // now do its children
  123.     for (TPhyTreeNode::TNodeList_CI it = ptn->SubNodeBegin();
  124.          it != ptn->SubNodeEnd();  ++it) {
  125.         s_AddNodeToBtc(btc, *it, my_uid, next_uid);
  126.     }
  127. }
  128. /// Conversion from TPhyTreeNode to CBioTreeContainer
  129. static CRef<CBioTreeContainer> s_MakeBtc(TPhyTreeNode *tree)
  130. {
  131.     const int label_fid = 0;
  132.     const int dist_fid = 1;
  133.     CRef<CBioTreeContainer> btc(new CBioTreeContainer);
  134.     CRef<CFeatureDescr> fdescr;
  135.     fdescr = new CFeatureDescr();
  136.     fdescr->SetId(label_fid);
  137.     fdescr->SetName("label");
  138.     btc->SetFdict().Set().push_back(fdescr);
  139.     
  140.     fdescr = new CFeatureDescr();
  141.     fdescr->SetId(dist_fid);
  142.     fdescr->SetName("dist");
  143.     btc->SetFdict().Set().push_back(fdescr);
  144.     int next_uid = 0;
  145.     s_AddNodeToBtc(btc, tree, -1, next_uid);
  146.     // unset parent id of root node
  147.     btc->SetNodes().Set().front()->ResetParent();
  148.     return btc;
  149. }
  150. //
  151. // Load()
  152. // This is a pure virtual requirement and is the main plugin hook.
  153. //
  154. void CDataPlugin_TreeLoader::Load(CPluginMessage& msg)
  155. {
  156.     const CPluginCommand& args = msg.GetRequest().GetCommand();
  157.     CPluginReply& reply = msg.SetReply();
  158.     string fname = args["file"].AsString();
  159.     try {
  160.         // load the tree
  161.         CNcbiIfstream istr(fname.c_str());
  162.         TPhyTreeNode *tree = ReadNewickTree(istr);
  163.         // make a document containing this
  164.         CRef<CScope> scope(new CScope(CDocManager::GetObjectManager()));
  165.         scope->AddDefaults();
  166.         IDocument* new_doc;
  167.         if (args["make_btc"].AsBoolean()) {
  168.             CRef<CBioTreeContainer> btc = s_MakeBtc(tree);
  169.             new_doc = CDocManager::CreateDocument(*scope, *btc);
  170.         } else {
  171.             CRef<CPhyTreeSerial> stree(new CPhyTreeSerial(*tree));
  172.             new_doc = CDocManager::CreateDocument(*scope, *stree);
  173.         }
  174.         delete tree;
  175.         reply.AddObject(*new_doc);
  176.         reply.SetStatus(eMessageStatus_success);
  177.     }
  178.     catch (exception& e) {
  179.         _TRACE("failed to read tree file: " << e.what());
  180.     }
  181.     catch (...) {
  182.         _TRACE("failed to read tree file: unknown error");
  183.     }
  184. }
  185. END_NCBI_SCOPE
  186. /*
  187.  * ===========================================================================
  188.  * $Log: tree_loader.cpp,v $
  189.  * Revision 1000.2  2004/06/02 20:24:21  gouriano
  190.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  191.  *
  192.  * Revision 1.5  2004/06/02 19:47:04  jcherry
  193.  * Added option for creating CBioTreeContainer rather than
  194.  * CPhyTreeSerial
  195.  *
  196.  * Revision 1.4  2004/05/25 17:21:59  dicuccio
  197.  * Modified class names.  Fonts to 12 point
  198.  *
  199.  * Revision 1.3  2004/05/21 22:27:48  gorelenk
  200.  * Added PCH ncbi_pch.hpp
  201.  *
  202.  * Revision 1.2  2004/05/03 13:05:43  dicuccio
  203.  * gui/utils --> gui/objutils where needed
  204.  *
  205.  * Revision 1.1  2004/02/17 05:39:02  jcherry
  206.  * Initial version
  207.  *
  208.  * ===========================================================================
  209.  */