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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: genbank_loader.cpp,v $
  4.  * PRODUCTION Revision 1000.5  2004/06/01 20:57:58  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.38
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: genbank_loader.cpp,v 1000.5 2004/06/01 20:57:58 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:  Mike DiCuccio
  35.  *
  36.  * File Description:
  37.  *    CDataPlugin_GenbankLoader - load sequence information form Genbank.
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "genbank_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/version.hpp>
  45. #include <gui/core/plugin_utils.hpp>
  46. #include <gui/plugin/PluginCommandSet.hpp>
  47. #include <gui/plugin/PluginInfo.hpp>
  48. #include <gui/plugin/PluginValue.hpp>
  49. #include <gui/utils/message_box.hpp>
  50. #include <gui/objutils/label.hpp>
  51. #include <objmgr/scope.hpp>
  52. #include <objmgr/util/sequence.hpp>
  53. #include "loader_utils.hpp"
  54. #include "gb_manage_dlg.hpp"
  55. BEGIN_NCBI_SCOPE
  56. USING_SCOPE(objects);
  57. //
  58. // class CDataPlugin_GenbankLoaderException defines some internal exception types used in
  59. // processing files.
  60. //
  61. // This class is used internally to avoid an ad-hoc exception mechanism;
  62. // currently, it reports only errors concerning invalid format types.
  63. //
  64. class CDataPlugin_GenbankLoaderException : EXCEPTION_VIRTUAL_BASE public CException
  65. {
  66. public:
  67.     // Enumerated list of exception types
  68.     enum EErrCode {
  69.         eInvalidId
  70.     };
  71.     // Convert an enuerated exception to a human-readable string representation
  72.     // of this exception.
  73.     virtual const char* GetErrCodeString(void) const
  74.     {
  75.         switch (GetErrCode()) {
  76.         case eInvalidId:        return "eInvalidId";
  77.         default:                    return CException::GetErrCodeString();
  78.         }
  79.     }
  80.     // constructor boilerplate
  81.     NCBI_EXCEPTION_DEFAULT(CDataPlugin_GenbankLoaderException, CException);
  82. };
  83. void CDataPlugin_GenbankLoader::GetInfo(CPluginInfo& info)
  84. {
  85.     info.Reset();
  86.     // version info macro
  87.     info.SetInfo(CPluginVersion::eMajor, CPluginVersion::eMinor, 0,
  88.                  string(__DATE__) + " " + string(__TIME__),
  89.                  "CDataPlugin_GenbankLoader", "Genbank Accession",
  90.                  "Open a Genbank accession",
  91.                  "");
  92.     // command info
  93.     CPluginCommandSet& cmds    = info.SetCommands();
  94.     CPluginCommand& load_args  = cmds.AddDataCommand(eDataCommand_load);
  95.     load_args.AddArgument("acc", "Accessions to load",
  96.                           CPluginArg::eString,
  97.                           CPluginArg::TData::e_Array);
  98. }
  99. CDataPlugin_GenbankLoader::CDataPlugin_GenbankLoader()
  100. {
  101. }
  102. CDataPlugin_GenbankLoader::~CDataPlugin_GenbankLoader()
  103. {
  104. }
  105. //
  106. // load a record from Genbank into a fully-prepared document
  107. //
  108. void CDataPlugin_GenbankLoader::Load(CPluginMessage& msg)
  109. {
  110.     const CPluginCommand& args = msg.GetRequest().GetCommand();
  111.     CPluginReply& reply = msg.SetReply();
  112.     vector<string> str_vec = CPluginUtils::ArgToStringVec(args["acc"]);
  113.     reply.SetStatus(eMessageStatus_failed);
  114.     size_t load_success = 0;
  115.     ITERATE (vector<string>, iter, str_vec) {
  116.         //
  117.         // now, go about loading our entry, if we can
  118.         // check to make sure the Accession is (moderately) valid
  119.         // if the user puts in just a number, assume its a gi
  120.         //
  121.         string acc = NStr::TruncateSpaces(*iter);
  122.         if (acc.empty()) {
  123.             continue;
  124.         }
  125.         CLoaderStrFormatter::AddGIPrefix(&acc);
  126.         try {
  127.             CConstRef<CSeq_id> id(new CSeq_id(acc));
  128.             if (id->Which() == CSeq_id::e_not_set) {
  129.                 NCBI_THROW(CDataPlugin_GenbankLoaderException, eInvalidId,
  130.                            "Accession " + acc + " is not valid");
  131.             }
  132.             CRef<CScope> scope(new CScope(CDocManager::GetObjectManager()));
  133.             scope->AddDefaults();
  134.             CBioseq_Handle handle = scope->GetBioseqHandle(*id);
  135.             if ( !handle ) {
  136.                 LOG_POST(Error
  137.                          << "failed to load sequence for accession " << acc);
  138.                 continue;
  139.             }
  140.             // marshal our document with this scope
  141.             IDocument* doc = CDocManager::CreateDocument(*scope, *id);
  142.             reply.AddObject(*doc);
  143.             ++load_success;
  144.             LOG_POST(Info <<
  145.                      "CDataPlugin_GenbankLoader: loaded accession " << acc);
  146.             // Needs to be added to MRU list
  147.             // Get label for the MRU list
  148.             string label("GenBank: ");
  149.             CLabel::GetLabel(*handle.GetSeqId(), &label,
  150.                              CLabel::eDefault, &handle.GetScope());
  151.             // Create a new Plugin Message containing only this entry
  152.             //  for the MRU list
  153.             CRef<CPluginMessage> new_msg(new CPluginMessage());
  154.             new_msg->Assign(msg);
  155.             CPluginCommand& new_args = new_msg->SetRequest().SetCommand();
  156.             CPluginArg& acc_arg = new_args["acc"];
  157.             acc_arg.SetString(acc);
  158.             acc_arg.SetList();
  159.             // add to MRU list
  160.             CDocManager::AddMRUEntry(*new_msg, label);
  161.         }
  162.         catch (CException& e) {
  163.             string msg("Failed to load accession '");
  164.             msg += acc;
  165.             msg += "':n";
  166.             msg += e.GetMsg();
  167.             NcbiMessageBox(msg);
  168.         }
  169.         catch (std::exception& e) {
  170.             string msg("Failed to load accession '");
  171.             msg += acc;
  172.             msg += "':n";
  173.             msg += e.what();
  174.             NcbiMessageBox(msg);
  175.         }
  176. #ifndef _DEBUG
  177.         catch (...) {
  178.             string msg("Failed to load accession '");
  179.             msg += acc;
  180.             msg += "':nUnknown error";
  181.             NcbiMessageBox(msg);
  182.         }
  183. #endif
  184.     }
  185.     if (str_vec.size() != load_success) {
  186.         reply.SetStatus(eMessageStatus_failed);
  187.         if (load_success) {
  188.             NcbiMessageBox("Failed to load some accessions.");
  189.         } else {
  190.             NcbiMessageBox("Failed to load any accessions.");
  191.         }
  192.         return;
  193.     }
  194.     if (load_success != 0) {
  195.         LOG_POST(Info << "CDataPlugin_GenbankLoader: all accessions loaded successfully");
  196.     }
  197.     reply.SetStatus(eMessageStatus_success);
  198. }
  199. END_NCBI_SCOPE
  200. /*
  201.  * ===========================================================================
  202.  * $Log: genbank_loader.cpp,v $
  203.  * Revision 1000.5  2004/06/01 20:57:58  gouriano
  204.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.38
  205.  *
  206.  * Revision 1.38  2004/05/25 17:21:59  dicuccio
  207.  * Modified class names.  Fonts to 12 point
  208.  *
  209.  * Revision 1.37  2004/05/21 22:27:48  gorelenk
  210.  * Added PCH ncbi_pch.hpp
  211.  *
  212.  * Revision 1.36  2004/05/18 11:22:34  friedman
  213.  * Add recently loaded documents to the MRU list.
  214.  *
  215.  * Revision 1.35  2004/01/06 20:48:17  dicuccio
  216.  * Moved CFltkCursorGuard into CPlugin::Execute() - broadly applied to all plugins
  217.  *
  218.  * Revision 1.34  2004/01/06 20:15:54  dicuccio
  219.  * Use CFltkCursorGuard on load / import / search
  220.  *
  221.  * Revision 1.33  2004/01/05 18:50:28  vasilche
  222.  * Fixed path to include files.
  223.  *
  224.  * Revision 1.32  2003/12/10 15:15:44  dicuccio
  225.  * Added message box to warn when accessions fail to load.
  226.  *
  227.  * Revision 1.31  2003/12/05 13:07:53  dicuccio
  228.  * Split management interface into a separate plugin.  Fixed linker error
  229.  * introduced with status bar
  230.  *
  231.  * Revision 1.30  2003/11/24 15:45:36  dicuccio
  232.  * Renamed CVersion to CPluginVersion
  233.  *
  234.  * Revision 1.29  2003/11/18 17:49:01  dicuccio
  235.  * Added standard processing of return values
  236.  *
  237.  * Revision 1.28  2003/11/06 20:12:15  dicuccio
  238.  * Cleaned up handling of USING_SCOPE - removed from all headers
  239.  *
  240.  * Revision 1.27  2003/11/04 17:49:24  dicuccio
  241.  * Changed calling parameters for plugins - pass CPluginMessage instead of paired
  242.  * CPluginCommand/CPluginReply
  243.  *
  244.  * Revision 1.26  2003/10/10 17:19:00  dicuccio
  245.  * Added Manage() interface.
  246.  *
  247.  * Revision 1.25  2003/10/07 13:47:05  dicuccio
  248.  * Renamed CPluginURL* to CPluginValue*
  249.  *
  250.  * Revision 1.24  2003/09/04 14:51:24  dicuccio
  251.  * Use IDocument instead of CDocument
  252.  *
  253.  * Revision 1.23  2003/08/05 17:16:25  kuznets
  254.  * Changes to improve code reuse between loaders + CLDS_Database passed as the
  255.  * construction parameter to the lds search dialog
  256.  *
  257.  * Revision 1.22  2003/07/14 11:16:52  shomrat
  258.  * Plugin messageing system related changes
  259.  *
  260.  * Revision 1.21  2003/06/25 17:02:58  dicuccio
  261.  * Split CPluginHandle into a handle (pointer-to-implementation) and
  262.  * implementation file.  Lots of #include file clean-ups.
  263.  *
  264.  * Revision 1.20  2003/06/20 14:52:57  dicuccio
  265.  * Revised plugin registration - moved GetInfo() into the plugin handler
  266.  *
  267.  * Revision 1.19  2003/06/02 16:06:22  dicuccio
  268.  * Rearranged src/objects/ subtree.  This includes the following shifts:
  269.  *     - src/objects/asn2asn --> arc/app/asn2asn
  270.  *     - src/objects/testmedline --> src/objects/ncbimime/test
  271.  *     - src/objects/objmgr --> src/objmgr
  272.  *     - src/objects/util --> src/objmgr/util
  273.  *     - src/objects/alnmgr --> src/objtools/alnmgr
  274.  *     - src/objects/flat --> src/objtools/flat
  275.  *     - src/objects/validator --> src/objtools/validator
  276.  *     - src/objects/cddalignview --> src/objtools/cddalignview
  277.  * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  278.  * replaces the three libmmdb? libs.
  279.  *
  280.  * Revision 1.18  2003/05/30 14:15:42  dicuccio
  281.  * Renamed MessageBox to NcbiMessageBox because brain-dead MSVC thinks this is
  282.  * ::MessageBox and rewrites the symbol as MessageBoxA, which results in an
  283.  * unresolved external and conflict with the Win32 API :(.
  284.  *
  285.  * Revision 1.17  2003/05/30 13:10:37  dicuccio
  286.  * Use MessageBox() instead of fl_alter()
  287.  *
  288.  * Revision 1.16  2003/05/19 13:40:44  dicuccio
  289.  * Moved gui/core/plugin/ -> gui/plugin/.  Merged core libraries into libgui_core.
  290.  * Removed old, unused dialog box.
  291.  *
  292.  * Revision 1.15  2003/05/01 12:54:34  dicuccio
  293.  * Changed a useful trace -> log post for failure to load accession
  294.  *
  295.  * Revision 1.14  2003/04/29 14:52:31  dicuccio
  296.  * Deprecated old accession entry dialog.  Added correct plugin argument to specify accession names
  297.  *
  298.  * Revision 1.13  2003/04/24 16:39:08  dicuccio
  299.  * Updated to reflect changes in plugin API.  Changed location of document
  300.  * marshal from framework to plugin
  301.  *
  302.  * Revision 1.12  2003/02/26 14:26:56  dicuccio
  303.  * Removed unnecessary _TRACE() statements
  304.  *
  305.  * Revision 1.11  2003/02/24 13:03:16  dicuccio
  306.  * Renamed classes in plugin spec:
  307.  *     CArgSeg --> CPluginArgSet
  308.  *     CArgument --> CPluginArg
  309.  *     CPluginArgs --> CPluginCommand
  310.  *     CPluginCommands --> CPluginCommandSet
  311.  *
  312.  * Revision 1.10  2003/02/20 19:49:56  dicuccio
  313.  * Created new plugin architecture, based on ASN.1 spec.  Moved GBENCH
  314.  * frameowrk over to use new plugin architecture.
  315.  *
  316.  * Revision 1.9  2003/02/06 18:48:36  dicuccio
  317.  * Made 'catch (...)' conditional for non-debug builds
  318.  *
  319.  * Revision 1.8  2003/01/15 21:08:34  dicuccio
  320.  * Removed dead _TRACE() statements
  321.  *
  322.  * Revision 1.7  2003/01/13 13:10:07  dicuccio
  323.  * Namespace clean-up.  Retired namespace gui -> converted all to namespace
  324.  * ncbi.  Moved all FLUID-generated code into namespace ncbi.
  325.  *
  326.  * Revision 1.6  2003/01/03 17:25:50  dicuccio
  327.  * Fixed (finally!) issues regarding input validation of seq-ids.
  328.  *
  329.  * Revision 1.5  2002/12/30 18:44:20  dicuccio
  330.  * Fixed a number of buglets in accession dialog and in handling of empty
  331.  * accessions.
  332.  *
  333.  * Revision 1.4  2002/12/30 17:48:28  dicuccio
  334.  * Added mechanism for data loader plugins to announce supported modes of
  335.  * operation (load, import, save currently)
  336.  *
  337.  * Revision 1.3  2002/12/20 19:17:58  dicuccio
  338.  * Added better handling of sueqnece ID errors (try not to segfault...)
  339.  *
  340.  * Revision 1.2  2002/12/12 15:22:38  dicuccio
  341.  * Minot tweak to avoid a compiler warning.
  342.  *
  343.  * Revision 1.1  2002/11/25 20:51:01  dicuccio
  344.  * Initial revision.
  345.  *
  346.  * ===========================================================================
  347.  */