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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: cdd_search.cpp,v $
  4.  * PRODUCTION Revision 1000.6  2004/06/01 20:54:50  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: cdd_search.cpp,v 1000.6 2004/06/01 20:54:50 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.  *    CAlgoPlugin_CDDSearch - load sequence information from a file.
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "cdd_search.hpp"
  41. #include <connect/ncbi_conn_stream.hpp>
  42. #include <gui/core/doc_manager.hpp>
  43. #include <gui/core/idocument.hpp>
  44. #include <gui/core/version.hpp>
  45. #include <gui/plugin/PluginCommandSet.hpp>
  46. #include <gui/plugin/PluginInfo.hpp>
  47. #include <gui/plugin/PluginRequest.hpp>
  48. #include <gui/plugin/PluginValueConstraint.hpp>
  49. #include <gui/utils/message_box.hpp>
  50. #include <objects/seqalign/Dense_seg.hpp>
  51. #include <objects/seqalign/Std_seg.hpp>
  52. #include <objects/seqalign/Seq_align.hpp>
  53. #include <objmgr/bioseq_handle.hpp>
  54. #include <objmgr/object_manager.hpp>
  55. #include <objmgr/seq_vector.hpp>
  56. #include <objmgr/util/sequence.hpp>
  57. #include <objtools/data_loaders/cdd/cdd.hpp>
  58. BEGIN_NCBI_SCOPE
  59. USING_SCOPE(objects);
  60. CCddDataLoader* CAlgoPlugin_CDDSearch::sm_Loader = NULL;
  61. CAlgoPlugin_CDDSearch::~CAlgoPlugin_CDDSearch()
  62. {
  63. }
  64. void CAlgoPlugin_CDDSearch::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.                  "CAlgoPlugin_CDDSearch",
  71.                  "Search/Conserved Domains",
  72.                  "Search for conserved domains in this protein",
  73.                  "");
  74.     // command info
  75.     CPluginCommandSet& cmds     = info.SetCommands();
  76.     CPluginCommand& args   = cmds.AddAlgoCommand(eAlgoCommand_run);
  77.     args.AddArgument("id", "Sequence to search",
  78.                      CSeq_id::GetTypeInfo());
  79.     args.SetConstraint("id",
  80.                        (*CPluginValueConstraint::CreateSeqMol(),
  81.                         CSeq_inst::eMol_aa));
  82.     args.AddDefaultArgument("expect", "Expect value",
  83.                             CPluginArg::eDouble, "0.01");
  84.     args.AddArgument("filter", "Filter results",
  85.                      CPluginArg::eBoolean);
  86.     args.AddDefaultArgument("type", "Type to retrieve",
  87.                             CPluginArg::eString,
  88.                             "Alignment");
  89.     args.SetConstraint("type",
  90.                        (*CPluginValueConstraint::CreateSet(),
  91.                         "Alignment", "Feature table"));
  92. }
  93. //
  94. // Save()
  95. // Save the information in a given document into a file
  96. //
  97. void CAlgoPlugin_CDDSearch::RunCommand(CPluginMessage& msg)
  98. {
  99.     const CPluginCommand& args = msg.GetRequest().GetCommand();
  100.     CPluginReply& reply = msg.SetReply();
  101.     reply.SetStatus(eMessageStatus_failed);
  102.     const CSeq_id&   id  = dynamic_cast<const CSeq_id&>(args["id"].AsObject());
  103.     const IDocument* doc = args["id"].GetDocument();
  104.     if ( !doc ) {
  105.         NcbiMessageBox("No valid sequence found.");
  106.         return;
  107.     }
  108.     bool   filter = args["filter"].AsBoolean();
  109.     string type   = args["type"  ].AsString();
  110.     double expect = args["expect"].AsDouble();
  111.     string filter_str("T");
  112.     if ( !filter ) {
  113.         filter_str = "F";
  114.     }
  115.     if (type == "Alignment") {
  116.         type = "LONLY";
  117.     } else if (type == "Feature table") {
  118.         type = "AONLY";
  119.     }
  120.     CScope& scope = doc->GetScope();
  121.     //
  122.     // retrieve our protein sequence
  123.     // we must pass the sequence in IUPACaa format
  124.     //
  125.     CBioseq_Handle handle = scope.GetBioseqHandle(id);
  126.     CSeqVector vec        = handle.GetSeqVector();
  127.     vec.SetCoding(CSeq_data::e_Iupacaa);
  128.     string data;
  129.     vec.GetSeqData(0, vec.size(), data);
  130.     //
  131.     // compose our parameters
  132.     //
  133.     string params("SEQUENCE=");
  134.     params += data + "&";
  135.     params += "NOHTML&";
  136.     params += "DATALIB=cdd&";
  137.     params += "EXPECT=" + NStr::DoubleToString(expect) + "&";
  138.     params += "GRAPH=1&";
  139.     params += "FILTER=" + filter_str + "&";
  140.     params += type;
  141.     //
  142.     // CConn_ServiceStream i/o
  143.     //
  144.     CConn_ServiceStream cdd_str("CddSearch");
  145.     cdd_str << params;
  146.     CRef<CSeq_annot> annot(new CSeq_annot());
  147.     try {
  148.         auto_ptr<CObjectIStream> is
  149.             (CObjectIStream::Open(eSerial_AsnText, cdd_str));
  150.         *is >> *annot;
  151.     }
  152.     catch (...) {
  153.         // our read failed - it is likely that our output was not ASN.1
  154.         string msg("No conserved domains were found for sequencen");
  155.         msg += sequence::GetTitle(handle);
  156.         NcbiMessageBox(msg);
  157.         return;
  158.     }
  159.     //
  160.     // fix our IDs
  161.     //
  162.     if (annot->GetData().IsFtable()) {
  163.         if (annot->GetData().GetFtable().size() == 0) {
  164.             annot.Reset();
  165.         } else {
  166.             NON_CONST_ITERATE (CSeq_annot::TData::TFtable, iter,
  167.                                annot->SetData().SetFtable()) {
  168.                 CSeq_feat* feat = *iter;
  169.                 const CSeq_id& this_id = sequence::GetId(feat->SetLocation());
  170.                 if (this_id.IsLocal()) {
  171.                     feat->SetLocation().SetId(id);
  172.                 }
  173.             }
  174.         }
  175.     } else if (annot->GetData().IsAlign()) {
  176.         if (annot->GetData().GetAlign().size() == 0) {
  177.             annot.Reset();
  178.         } else {
  179.             NON_CONST_ITERATE (CSeq_annot::TData::TAlign, iter,
  180.                                annot->SetData().SetAlign()) {
  181.                 CSeq_align& align = **iter;
  182.                 switch (align.GetSegs().Which()) {
  183.                 case CSeq_align::TSegs::e_Denseg:
  184.                     {{
  185.                         CDense_seg& seg = align.SetSegs().SetDenseg();
  186.                         NON_CONST_ITERATE(CDense_seg::TIds, id_iter, seg.SetIds()) {
  187.                             CSeq_id& this_id = **id_iter;
  188.                             if (this_id.IsLocal()) {
  189.                                 this_id.Assign(id);
  190.                             }
  191.                         }
  192.                     }}
  193.                     break;
  194.                 case CSeq_align::TSegs::e_Std:
  195.                     NON_CONST_ITERATE (CSeq_align::TSegs::TStd, iter,
  196.                                        align.SetSegs().SetStd()) {
  197.                         CStd_seg& seg = **iter;
  198.                         NON_CONST_ITERATE(CStd_seg::TIds, id_iter, seg.SetIds()) {
  199.                             CSeq_id& this_id = **id_iter;
  200.                             if (this_id.IsLocal()) {
  201.                                 this_id.Assign(id);
  202.                             }
  203.                         }
  204.                     }
  205.                     break;
  206.                 default:
  207.                     LOG_POST(Error << "unhandled seq-align type in CDDSearch");
  208.                     break;
  209.                 }
  210.             }
  211.         }
  212.     }
  213.     if ( !annot ) {
  214.         string msg("No conserved domains were found for sequencen");
  215.         msg += sequence::GetTitle(handle);
  216.         NcbiMessageBox(msg);
  217.         reply.SetStatus(eMessageStatus_failed);
  218.         return;
  219.     }
  220.     //
  221.     // return our object to the framework
  222.     //
  223.     reply.AddObject(*doc, *annot);
  224.     reply.AddAction(CPluginReplyAction::e_Add_to_document);
  225.     //
  226.     // take care of our data loader
  227.     if ( !sm_Loader ) {
  228.         DEFINE_STATIC_FAST_MUTEX(s_Mutex);
  229.         CFastMutexGuard LOCK(s_Mutex);
  230.         if ( !sm_Loader ) {
  231.             sm_Loader = new CCddDataLoader();
  232.             CDocManager::GetObjectManager().RegisterDataLoader(*sm_Loader);
  233.         }
  234.     }
  235.     scope.AddDataLoader("CDD_DataLoader");
  236.     reply.SetStatus(eMessageStatus_success);
  237. }
  238. END_NCBI_SCOPE
  239. /*
  240.  * ===========================================================================
  241.  * $Log: cdd_search.cpp,v $
  242.  * Revision 1000.6  2004/06/01 20:54:50  gouriano
  243.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  244.  *
  245.  * Revision 1.13  2004/05/21 22:27:46  gorelenk
  246.  * Added PCH ncbi_pch.hpp
  247.  *
  248.  * Revision 1.12  2004/04/16 14:43:15  dicuccio
  249.  * Deleted dead code
  250.  *
  251.  * Revision 1.11  2004/03/24 13:57:19  friedman
  252.  * Fixed mutex comment
  253.  *
  254.  * Revision 1.10  2004/03/23 19:55:18  friedman
  255.  * Replaced 'static CFastMutex' with DEFINE_STATIC_FAST_MUTEX
  256.  *
  257.  * Revision 1.9  2004/03/16 15:37:22  vasilche
  258.  * Added required include
  259.  *
  260.  * Revision 1.8  2004/01/27 18:37:32  dicuccio
  261.  * Code clean-up.  Use standard names for plugins.  Removed unnecessary #includes
  262.  *
  263.  * Revision 1.7  2003/11/24 15:45:25  dicuccio
  264.  * Renamed CVersion to CPluginVersion
  265.  *
  266.  * Revision 1.6  2003/11/18 17:47:57  dicuccio
  267.  * Made data loader static and thread-safe.  Added standard processing for return values
  268.  *
  269.  * Revision 1.5  2003/11/06 20:12:12  dicuccio
  270.  * Cleaned up handling of USING_SCOPE - removed from all headers
  271.  *
  272.  * Revision 1.4  2003/11/04 17:49:22  dicuccio
  273.  * Changed calling parameters for plugins - pass CPluginMessage instead of paired
  274.  * CPluginCommand/CPluginReply
  275.  *
  276.  * Revision 1.3  2003/10/20 18:30:56  dicuccio
  277.  * Added CDD data laoder for retrieval of CDD alignment sequences.  Cleaned up
  278.  * handling of imput streams
  279.  *
  280.  * Revision 1.2  2003/10/16 19:38:43  dicuccio
  281.  * Removed old debugging code
  282.  *
  283.  * Revision 1.1  2003/10/16 12:56:35  dicuccio
  284.  * Added CDD Search facility.  Cleaned up dll_register.cpp
  285.  *
  286.  * Revision 1.2  2003/10/07 13:47:05  dicuccio
  287.  * Renamed CPluginURL* to CPluginValue*
  288.  *
  289.  * Revision 1.1  2003/09/16 14:06:48  dicuccio
  290.  * Initial revision - split from CFileLoader
  291.  *
  292.  * ===========================================================================
  293.  */