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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: lds_loader.cpp,v $
  4.  * PRODUCTION Revision 1000.5  2004/06/01 20:58:08  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.31
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: lds_loader.cpp,v 1000.5 2004/06/01 20:58:08 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:  Anatoliy Kuznetsov
  35.  *
  36.  * File Description:
  37.  *    CDataPlugin_LDSLoader - load sequence information from the local data storage(LDS).
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <corelib/ncbiapp.hpp>
  41. #include <corelib/ncbireg.hpp>
  42. #include <corelib/ncbitime.hpp>
  43. #include <gui/plugin/PluginInfo.hpp>
  44. #include <gui/core/version.hpp>
  45. #include <gui/core/doc_exception.hpp>
  46. #include <gui/core/doc_manager.hpp>
  47. #include <gui/core/idocument.hpp>
  48. #include <gui/core/plugin_utils.hpp>
  49. #include <gui/core/data_store.hpp>
  50. #include <gui/objutils/utils.hpp>
  51. #include <gui/plugin/PluginValue.hpp>
  52. #include <gui/plugin/PluginCommandSet.hpp>
  53. #include <gui/utils/message_box.hpp>
  54. #include <objmgr/scope.hpp>
  55. #include "lds_loader.hpp"
  56. #include "loader_utils.hpp"
  57. #include <objtools/lds/lds.hpp>
  58. #include <objtools/lds/lds_util.hpp>
  59. #include <objtools/lds/lds_reader.hpp>
  60. #include <objtools/lds/admin/lds_admin.hpp>
  61. #include "lds_search_dlg.hpp"
  62. BEGIN_NCBI_SCOPE
  63. USING_SCOPE(objects);
  64. //////////////////////////////////////////////////////////////////
  65. //
  66. // class CDataPlugin_LDSLoaderException defines some internal exception types used in
  67. // processing files.
  68. //
  69. // This class is used internally to avoid an ad-hoc exception mechanism;
  70. //
  71. class CDataPlugin_LDSLoaderException : EXCEPTION_VIRTUAL_BASE public CException
  72. {
  73. public:
  74.     // Enumerated list of exception types
  75.     enum EErrCode {
  76.         eInvalidId
  77.     };
  78.     // Convert an enumerated exception to a human-readable string representation
  79.     // of this exception.
  80.     virtual const char* GetErrCodeString(void) const
  81.     {
  82.         switch (GetErrCode()) {
  83.         case eInvalidId:        return "eInvalidId";
  84.         default:                return CException::GetErrCodeString();
  85.         }
  86.     }
  87.     // constructor boilerplate
  88.     NCBI_EXCEPTION_DEFAULT(CDataPlugin_LDSLoaderException, CException);
  89. };
  90. //////////////////////////////////////////////////////////////////
  91. void CDataPlugin_LDSLoader::GetInfo(CPluginInfo& info)
  92. {
  93.     info.Reset();
  94.     // version info macro
  95.     info.SetInfo(CPluginVersion::eMajor, CPluginVersion::eMinor, 0,
  96.                  string(__DATE__) + " " + string(__TIME__),
  97.                  "CDataPlugin_LDSLoader", "Local sequence",
  98.                  "Open a molecule by sequence Id", "");
  99.     // command info
  100.     CPluginCommandSet& cmds    = info.SetCommands();
  101.     
  102.     CPluginCommand& load_args  = cmds.AddDataCommand(eDataCommand_load);
  103.     load_args.AddArgument("acc", "Local sequence to load",
  104.                           CPluginArg::eString,
  105.                           CPluginArg::TData::e_Array);
  106.     load_args.AddArgument("search_all", "Search all references",
  107.                           CPluginArg::eBoolean,
  108.                           CPluginArg::TData::e_Single);
  109.     CPluginCommand& search_args = cmds.AddDataCommand(eDataCommand_search);
  110.     {{
  111.         CPluginArg& arg = 
  112.             search_args.AddArgument("query", "Search string",
  113.                                     CPluginArg::eString);
  114.         arg.SetHidden(true);
  115.     }}
  116. }
  117. CDataPlugin_LDSLoader::CDataPlugin_LDSLoader()
  118.  : m_DbHolder(0)
  119. {
  120.     if (CDataStore::HasObject("LDS_Database")) {
  121.         CObject& obj = CDataStore::GetObject("LDS_Database");
  122.         m_DbHolder = dynamic_cast<CLDS_DatabaseHolder*>(&obj);
  123. //        if (dbh)
  124. //            m_db = dbh->GetDefaultDatabase();
  125.     }
  126. }
  127. CDataPlugin_LDSLoader::~CDataPlugin_LDSLoader()
  128. {
  129. }
  130. //
  131. // load a record from Genbank into a fully-prepared document
  132. //
  133. void CDataPlugin_LDSLoader::Load(CPluginMessage& msg)
  134. {
  135.     const CPluginCommand& args = msg.GetRequest().GetCommand();
  136.     CPluginReply& reply = msg.SetReply();
  137.     reply.SetStatus(eMessageStatus_failed);
  138.     bool request_success = false;
  139.     if (!m_DbHolder) {
  140.         reply.SetStatus(eMessageStatus_ignored);
  141.         LOG_POST(Error << "Local data storage is not open.");
  142.         return;
  143.     }
  144.     vector<string> str_vec = CPluginUtils::ArgToStringVec(args["acc"]);
  145.     CLoaderStrFormatter::PrepareSearchVector(str_vec);
  146.     if (str_vec.empty()) {
  147.         reply.SetStatus(eMessageStatus_ignored);
  148.         return;
  149.     }
  150.     bool search_all = args["search_all"].AsBoolean();
  151.     string alias    = args["alias"].AsString();
  152.     LOG_POST(Info << "loading from " << alias);
  153.     string lds_alias = args["alias"].AsString();
  154.     CLDS_Database* db = m_DbHolder->GetDatabase(lds_alias);
  155.     if (!db) {
  156.         reply.SetStatus(eMessageStatus_ignored);
  157.         LOG_POST(Error << "LDS alias " << lds_alias << " not found.");
  158.         return;
  159.     }
  160.     CStopWatch stw;
  161.     stw.Start();
  162.     SLDS_TablesCollection& tables = db->GetTables();
  163.     CLDS_Set obj_search_results;
  164.     CLDS_Query query(tables);
  165.     query.FindSequences(str_vec, &obj_search_results);
  166.     double elapsed = stw.Elapsed();
  167.     LOG_POST(Info << "LDS sequence search time = " << elapsed);
  168.     unsigned int obj_found = 0; // Number of objects found
  169.     CLDS_Set obj_read; // list of objects already loaded
  170.     obj_found += obj_search_results.size();
  171.     if (obj_search_results.size() == 0) {
  172.         LOG_POST(Info
  173.                  << "Failed to find local sequence(s).");
  174.     }
  175.     else {
  176.         ITERATE (CLDS_Set, rsit, obj_search_results) {
  177.             try {
  178.                 int object_id = *rsit;
  179.                 if (!x_LoadLDS_BioTSE(object_id, db, &obj_read, reply)) {
  180.                     continue;
  181.                 }
  182.                 request_success = true;
  183.             } 
  184.             catch (CLDS_Exception& _DEBUG_ARG(ex))
  185.             {
  186.                 _TRACE("failed to read LDS file: " << ex.what());            
  187.             }
  188.         } // ITERATE
  189.     }
  190.     if (search_all) {
  191.         CLDS_Set slist_search_results;
  192.         query.FindSeqIdList(str_vec, &slist_search_results);
  193.         obj_found += slist_search_results.size();
  194.         ITERATE (CLDS_Set, it, slist_search_results) {
  195.             try {
  196.                 int id = *it;
  197.                 CLDS_Query::SObjectDescr descr = 
  198.                   query.GetObjectDescr(db->GetObjTypeMap(), id, true);
  199.                 if (LDS_SetTest(obj_read, descr.id)) {
  200.                     continue;
  201.                 }
  202.                 if (x_Load(descr, db, &obj_read, reply)) {
  203.                     request_success = true;                    
  204.                 }
  205.             
  206.             }
  207.             catch (CLDS_Exception& _DEBUG_ARG(ex))
  208.             {
  209.                 _TRACE("failed to read object: " << ex.what());            
  210.             }
  211.         } // ITERATE
  212.     }
  213.     if (obj_found == 0) {
  214.         NcbiMessageBox("Failed to find local sequence(s).",  
  215.                        eDialog_Ok,
  216.                        eIcon_Stop,
  217.                        "Error");
  218.     }
  219.     // set our status code
  220.     // we don't set a default action - the documents are merely posted for
  221.     // notification in case a user has called this plugin and expects
  222.     // to receive the results in a return value
  223.     if (request_success) {
  224.         reply.SetStatus(eMessageStatus_success);
  225.     }
  226. }
  227. void CDataPlugin_LDSLoader::Search(CPluginMessage& msg)
  228. {
  229.     const CPluginCommand& args = msg.GetRequest().GetCommand();
  230.     CPluginReply& reply = msg.SetReply();
  231.     if (!m_DbHolder) {
  232.         NcbiMessageBox("Local data storage is not configured.",  
  233.                        eDialog_Ok,
  234.                        eIcon_Stop,
  235.                        "Error");
  236.         reply.SetStatus(eMessageStatus_ignored);
  237.         return;
  238.     }
  239.     CLDS_Database* db = m_DbHolder->GetDefaultDatabase();
  240.     if (!db) {
  241.         NcbiMessageBox("Local data storage is not configured.",  
  242.                        eDialog_Ok,
  243.                        eIcon_Stop,
  244.                        "Error");
  245.         reply.SetStatus(eMessageStatus_ignored);
  246.         return;
  247.     }
  248.         
  249.     CLdsSearchDlg dlg(m_DbHolder);
  250.     if (dlg.Show() == eOK) {
  251.         Fl_Browser* lst = dlg.m_List;
  252.         SLDS_TablesCollection& tables = db->GetTables();
  253.         CLDS_Query query(tables);
  254.         CLDS_Set obj_read; // list of objects already loaded
  255.         for (int i = 1;  i <= lst->size();  ++i) {
  256.             int selected = lst->selected(i);
  257.             if (selected) {
  258.                 void* data = lst->data(i);
  259.                 int id;
  260.                 ::memcpy(&id, &data, sizeof(id));
  261.                 if (!id) {
  262.                     continue;
  263.                 }
  264.                 
  265.                 CLDS_Query::SObjectDescr descr = 
  266.                   query.GetObjectDescr(db->GetObjTypeMap(), id, true);
  267.                 // check if object is already loaded
  268.                 if (LDS_SetTest(obj_read, descr.id)) {
  269.                     continue;
  270.                 }
  271.                 x_Load(descr, db, &obj_read, reply);
  272.             }
  273.         } // for
  274.         if (obj_read.size() == 0) {
  275.             NcbiMessageBox("Failed to find local sequence(s).",  
  276.                            eDialog_Ok,
  277.                            eIcon_Stop,
  278.                            "Error");
  279.         }
  280.     }
  281.     reply.SetStatus(eMessageStatus_success);
  282. }
  283. bool CDataPlugin_LDSLoader::x_Load(const CLDS_Query::SObjectDescr& obj_descr,
  284.                          CLDS_Database* db,
  285.                          CLDS_Set* obj_read,
  286.                          CPluginReply& reply)
  287. {
  288.     try {
  289.         if (obj_descr.type_str == "Seq-entry" ||
  290.             obj_descr.type_str == "Bioseq" ||
  291.             obj_descr.format == CFormatGuess::eFasta) {
  292.             return x_LoadLDS_BioTSE(obj_descr.id, db, obj_read, reply);
  293.         } 
  294.         else {
  295.             if (obj_descr.type_str == "Seq-annot" ||
  296.                 obj_descr.type_str == "Seq-align") {
  297.                 return x_LoadLDS_Annot(obj_descr, db, obj_read, reply);
  298.             }
  299.         }
  300.     
  301.     }
  302.     catch (CLDS_Exception& ex)
  303.     {
  304.         ERR_POST("failed to read object: " << ex.what());            
  305.     }
  306.     return false;
  307. }
  308. bool CDataPlugin_LDSLoader::x_LoadLDS_BioTSE(int object_id, 
  309.                                    CLDS_Database* db,
  310.                                    CLDS_Set* obj_read,
  311.                                    CPluginReply& reply)
  312. {
  313.     SLDS_TablesCollection& tables = db->GetTables();
  314.     CRef<CSeq_entry> entry = 
  315.         LDS_LoadTSE(tables, db->GetObjTypeMap(), object_id);
  316.     if (!entry) {
  317.         _TRACE("failed to read LDS object id=" << object_id);
  318.         return false;
  319.     }
  320.     obj_read->insert(object_id);
  321.     string dl_name = "LDS_dataloader_";
  322.     dl_name.append(db->GetAlias());
  323.     CRef<CScope> scope(new CScope(CDocManager::GetObjectManager()));
  324.     scope->AddDataLoader(dl_name);
  325.     scope->AddTopLevelSeqEntry(*entry);
  326.     scope->AddDefaults();
  327.     IDocument* doc =
  328.         CDocManager::CreateDocument(*scope, *entry);
  329.     reply.AddObject(*doc);
  330.     CDocManager::UpdateAllViews();
  331.     /**
  332.     CBioseq_Handle handle =
  333.         CSeqUtils::CreateBioseqHandle(*scope, *entry);
  334.     if (handle) {
  335.         scope->AddDefaults();
  336.         IDocument* doc =
  337.             CDocManager::CreateDocument(*scope,
  338.                                         *CSeqUtils::GetBestId(*entry));
  339.         reply.AddObject(*doc);
  340.         CDocManager::UpdateAllViews();
  341.     }
  342.     **/
  343.     return true;
  344. }
  345. bool CDataPlugin_LDSLoader::x_LoadLDS_Annot(const CLDS_Query::SObjectDescr& obj_descr, 
  346.                                   CLDS_Database* db,
  347.                                   CLDS_Set* obj_read,
  348.                                   CPluginReply& reply)
  349. {
  350.     SLDS_TablesCollection& tables = db->GetTables();
  351.     CRef<CSeq_annot> annot = LDS_LoadAnnot(tables, obj_descr);
  352.     if (!annot) {
  353.         _TRACE("failed to read LDS annotation id=" << obj_descr.id);
  354.         return false;
  355.     }
  356.     obj_read->insert(obj_descr.id);
  357.     string dl_name = "LDS_dataloader_";
  358.     dl_name.append(db->GetAlias());
  359.     CRef<CScope> scope(new CScope(CDocManager::GetObjectManager()));
  360.     scope->AddDataLoader(dl_name);
  361.     scope->AddDefaults();
  362.     IDocument* doc = CDocManager::CreateDocument(*scope, *annot);
  363.     reply.AddObject(*doc);
  364.     CDocManager::UpdateAllViews();
  365.     return true;
  366. }
  367. END_NCBI_SCOPE
  368. /*
  369.  * ===========================================================================
  370.  * $Log: lds_loader.cpp,v $
  371.  * Revision 1000.5  2004/06/01 20:58:08  gouriano
  372.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.31
  373.  *
  374.  * Revision 1.31  2004/05/25 17:21:59  dicuccio
  375.  * Modified class names.  Fonts to 12 point
  376.  *
  377.  * Revision 1.30  2004/05/21 22:27:48  gorelenk
  378.  * Added PCH ncbi_pch.hpp
  379.  *
  380.  * Revision 1.29  2004/05/03 13:05:43  dicuccio
  381.  * gui/utils --> gui/objutils where needed
  382.  *
  383.  * Revision 1.28  2004/03/23 13:39:07  dicuccio
  384.  * Load objects as seq-entry, not seq-id
  385.  *
  386.  * Revision 1.27  2004/03/16 15:59:50  vasilche
  387.  * Removed warning about unused exception variable
  388.  *
  389.  * Revision 1.26  2003/11/24 15:45:38  dicuccio
  390.  * Renamed CVersion to CPluginVersion
  391.  *
  392.  * Revision 1.25  2003/11/18 17:49:02  dicuccio
  393.  * Added standard processing of return values
  394.  *
  395.  * Revision 1.24  2003/11/06 20:12:15  dicuccio
  396.  * Cleaned up handling of USING_SCOPE - removed from all headers
  397.  *
  398.  * Revision 1.23  2003/11/05 13:30:45  kuznets
  399.  * Fixed application crash when there is no LDS instances configured in the
  400.  * system. (Search command). Put a warning pop up dialog.
  401.  *
  402.  * Revision 1.22  2003/11/04 17:49:25  dicuccio
  403.  * Changed calling parameters for plugins - pass CPluginMessage instead of paired
  404.  * CPluginCommand/CPluginReply
  405.  *
  406.  * Revision 1.21  2003/10/29 16:25:07  kuznets
  407.  * Added support for LDS aliases.
  408.  *
  409.  * Revision 1.20  2003/10/28 14:21:01  kuznets
  410.  * Chages to lds loader to support multiple LDS databases
  411.  *
  412.  * Revision 1.19  2003/10/09 19:20:53  kuznets
  413.  * Added message box if Load or Search fails to find anything
  414.  *
  415.  * Revision 1.18  2003/10/08 18:20:42  kuznets
  416.  * Reflecting changes in LDS library
  417.  *
  418.  * Revision 1.17  2003/10/07 13:47:05  dicuccio
  419.  * Renamed CPluginURL* to CPluginValue*
  420.  *
  421.  * Revision 1.16  2003/10/03 18:55:52  kuznets
  422.  * Added search time logging for CDataPlugin_LDSLoader::Load command
  423.  *
  424.  * Revision 1.15  2003/09/04 14:51:43  dicuccio
  425.  * Use IDocument instead of CDocument
  426.  *
  427.  * Revision 1.14  2003/08/19 14:38:01  kuznets
  428.  * Added non default LDS dataloader to all created scopes.
  429.  *
  430.  * Revision 1.13  2003/08/08 15:28:53  kuznets
  431.  * Corrected documents list update when we open new views.
  432.  *
  433.  * Revision 1.12  2003/08/07 20:31:35  kuznets
  434.  * Implemented document opening based on lds_search_dlg selection
  435.  *
  436.  * Revision 1.11  2003/08/05 17:16:25  kuznets
  437.  * Changes to improve code reuse between loaders + CLDS_Database passed as the
  438.  * construction parameter to the lds search dialog
  439.  *
  440.  * Revision 1.10  2003/07/31 20:44:32  kuznets
  441.  * LDS Plugin uses CDataStore to get the LDS database object.
  442.  *
  443.  * Revision 1.9  2003/07/30 14:04:58  kuznets
  444.  * Improved "gi|" search similar to genbank loader plugin
  445.  *
  446.  * Revision 1.8  2003/07/29 20:06:07  kuznets
  447.  * "Search All" option added to Load command
  448.  *
  449.  * Revision 1.7  2003/07/15 17:57:08  kuznets
  450.  * Added annotaion/alignment search capabilities
  451.  *
  452.  * Revision 1.6  2003/07/14 11:17:03  shomrat
  453.  * Plugin messageing system related changes
  454.  *
  455.  * Revision 1.5  2003/07/09 20:59:12  kuznets
  456.  * Added new lds plugin argument "search_all". Works as a boolean flag
  457.  * indicating that search should include both seaquences and annotations.
  458.  *
  459.  * Revision 1.4  2003/07/01 19:29:14  kuznets
  460.  * Open command implementation
  461.  *
  462.  * Revision 1.3  2003/06/25 17:02:58  dicuccio
  463.  * Split CPluginHandle into a handle (pointer-to-implementation) and
  464.  * implementation file.  Lots of #include file clean-ups.
  465.  *
  466.  * Revision 1.2  2003/06/20 14:52:57  dicuccio
  467.  * Revised plugin registration - moved GetInfo() into the plugin handler
  468.  *
  469.  * Revision 1.1  2003/06/17 20:16:09  kuznets
  470.  * Initial revision.
  471.  *
  472.  *
  473.  * ===========================================================================
  474.  */