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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: predict_signal_seq.cpp,v $
  4.  * PRODUCTION Revision 1000.5  2004/06/01 20:55:33  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.14
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: predict_signal_seq.cpp,v 1000.5 2004/06/01 20:55:33 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:  gbench plugin for predicting protein signal sequences
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "predict_signal_seq.hpp"
  41. #include <algo/sequence/signal_seq.hpp>
  42. #include <gui/core/plugin_utils.hpp>
  43. #include <gui/core/version.hpp>
  44. #include <gui/dialogs/col/multi_col_dlg.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/objutils/utils.hpp>
  50. #include <objmgr/seq_vector.hpp>
  51. #include <objmgr/util/sequence.hpp>
  52. BEGIN_NCBI_SCOPE
  53. USING_SCOPE(objects);
  54. CAlgoPlugin_PredictSignalSeq::~CAlgoPlugin_PredictSignalSeq()
  55. {
  56. }
  57. // standard plugin announce bopilerplate
  58. void CAlgoPlugin_PredictSignalSeq::GetInfo(CPluginInfo& info)
  59. {
  60.     info.Reset();
  61.     
  62.     // version info macro
  63.     info.SetInfo(CPluginVersion::eMajor, CPluginVersion::eMinor, 0,
  64.                  string(__DATE__) + " " + string(__TIME__),
  65.                  "CAlgoPlugin_PredictSignalSeq",
  66.                  "Protein analysis/Predict secretory signal sequence",
  67.                  "Predict N-terminal export signal sequence "
  68.                  "from a protein sequence",
  69.                  "");
  70.     // command info
  71.     CPluginCommandSet& cmds = info.SetCommands();
  72.     CPluginCommand&    args = cmds.AddAlgoCommand(eAlgoCommand_run);
  73.     args.AddArgument("locs", "Locations to evaluate",
  74.                      CSeq_loc::GetTypeInfo(),
  75.                      CPluginArg::TData::e_Array);
  76.     args.SetConstraint("locs",
  77.                        (*CPluginValueConstraint::CreateSeqMol(),
  78.                         CSeq_inst::eMol_aa));
  79.     args.AddDefaultArgument("max_pos", "Maximum position of cleavage site",
  80.                             CPluginArg::eInteger, "40");
  81.     args.AddDefaultArgument("domain", "Phylogenetic domain",
  82.                             CPluginArg::eString, "Eukaryotic");
  83.     args.SetConstraint("domain", (*CPluginValueConstraint::CreateSet(),
  84.                                 "Eukaryotic",
  85.                                   "Bacterial"));
  86. }
  87. void CAlgoPlugin_PredictSignalSeq::RunCommand(CPluginMessage& msg)
  88. {
  89.     const CPluginCommand& args = msg.GetRequest().GetCommand();
  90.     CPluginReply& reply = msg.SetReply();
  91.     _TRACE("CAlgoPlugin_PredictSignalSeq::RunCommand()");
  92.     
  93.     if ( !m_Dialog.get() ) {
  94.         m_Dialog.reset(new CMultiColDlg());
  95.         m_Dialog->SetWindowSize(800, 450);
  96.         m_Dialog->SetTitle("Signal Sequence Prediction");
  97.         
  98.         m_Dialog->SetColumn(0, "Sequence", FL_ALIGN_LEFT, 0.5f);
  99.         m_Dialog->SetColumn(1, "Location", FL_ALIGN_LEFT, 0.5f);
  100.         m_Dialog->SetColumn(2, "Sig. Seq. Predicted?",
  101.                             FL_ALIGN_CENTER, 0.4f);
  102.         m_Dialog->SetColumn(3, "Max. Score", FL_ALIGN_CENTER, 0.5f);
  103.         m_Dialog->SetColumn(4, "Cut After", FL_ALIGN_CENTER, 0.5f);
  104.     }
  105.     // clear any previous contents
  106.     m_Dialog->SetRows(0);
  107.     int row = 0;
  108.     plugin_args::TLocList locs;
  109.     GetArgValue(args["locs"], locs);
  110.     int max_pos = args["max_pos"].AsInteger() - 1; // convert to 0-based
  111.     // figure out the domain requested
  112.     CSignalSeq::EDomain domain;
  113.     if (args["domain"].AsString() == "Bacterial") {
  114.         domain = CSignalSeq::eBacterial;
  115.     } else {
  116.         domain = CSignalSeq::eEukaryotic;
  117.     }
  118.     ITERATE (plugin_args::TLocList, iter, locs) {
  119.         const CSeq_loc&  loc = *iter->second;
  120.         const IDocument& doc = *iter->first;
  121.         // find the best ID for this bioseq
  122.         try {
  123.             CBioseq_Handle handle = doc.GetScope().GetBioseqHandle(loc);
  124.             // get sequence vector
  125.             CSeqVector vec =
  126.                 handle.GetSequenceView(loc,
  127.                                        CBioseq_Handle::eViewConstructed,
  128.                                        CBioseq_Handle::eCoding_Ncbi);
  129.             string& id_str  = m_Dialog->SetCell(row, 0);
  130.             string& loc_str = m_Dialog->SetCell(row, 1);
  131.             const CSeq_id& best_id =
  132.                 sequence::GetId(handle, sequence::eGetId_Best);
  133.             id_str.erase();
  134.             best_id.GetLabel(&id_str);
  135.             loc_str = CPluginUtils::GetLabel(loc, &doc.GetScope());
  136.             // places to store results
  137.             double score;
  138.             TSeqPos pos;
  139.             // do the prediction
  140.             CSignalSeq::Predict(vec, domain, max_pos, pos, score);
  141.             // report results in the dialog
  142.             m_Dialog->SetCell(row, 2) = score >= 3.5 ?
  143.                 "yes" : "no";
  144.             m_Dialog->SetCell(row, 3) = NStr::DoubleToString(score);
  145.             m_Dialog->SetCell(row, 4) = NStr::IntToString(pos + 1);
  146.             if (score >= 3.5) {  // if a sig. seq. is predicted
  147.                 // a new feature table
  148.                 CRef<CSeq_annot> annot(new CSeq_annot());
  149.                 // add description to annot
  150.                 annot->AddName("Predicted signal sequence");
  151.                 string comment = string("Predicted signal sequence using ")
  152.                     + args["domain"].AsString() +" weights";
  153.                 annot->AddComment(comment);
  154.                 //
  155.                 // add feature to annot
  156.                 //
  157.                 // create feature
  158.                 CRef<CSeq_feat> feat(new CSeq_feat());
  159.                 feat->SetExp_ev(CSeq_feat::eExp_ev_not_experimental);
  160.                 // set up the location
  161.                 feat->SetLocation().SetInt().SetFrom(0);
  162.                 feat->SetLocation().SetInt().SetTo(pos);
  163.                 feat->SetLocation().SetInt().SetStrand(sequence::GetStrand(loc));
  164.                 feat->SetLocation().SetId(sequence::GetId(loc));
  165.                 feat->SetLocation
  166.                     (*CSeqUtils::RemapChildToParent(loc, feat->GetLocation()));
  167.                 feat->SetData().SetSite(CSeqFeatData::eSite_signal_peptide);
  168.                 
  169.                 // save in annot
  170.                 annot->SetData().SetFtable().push_back(feat);
  171.                 // attach annot to doc
  172.                 reply.AddObject(doc, *annot);
  173.             }
  174.         }
  175.         catch (exception& e) {
  176.             LOG_POST(Error << e.what());
  177.             string str = CPluginUtils::GetLabel(loc, &doc.GetScope());
  178.             LOG_POST(Error << "Error processing location " << str);
  179.         }
  180. #ifndef _DEBUG
  181.         catch (...) {
  182.             string str = CPluginUtils::GetLabel(loc, &doc.GetScope());
  183.             LOG_POST(Error << "Error processing location " << str);
  184.         }
  185. #endif
  186.     }
  187.     // update all views
  188.     //CDocManager::UpdateAllViews();
  189.     //
  190.     // prepare our dialog box
  191.     //
  192.     m_Dialog->SetLabel(string("Signal Sequence Prediction"
  193.                               " Using ") 
  194.                        + args["domain"].AsString() + " Weights");
  195.     m_Dialog->Show();
  196.     reply.SetStatus(eMessageStatus_success);
  197.     reply.AddAction(CPluginReplyAction::e_Add_to_document);
  198. }
  199. END_NCBI_SCOPE
  200. /*
  201.  * ===========================================================================
  202.  * $Log: predict_signal_seq.cpp,v $
  203.  * Revision 1000.5  2004/06/01 20:55:33  gouriano
  204.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.14
  205.  *
  206.  * Revision 1.14  2004/05/21 22:27:47  gorelenk
  207.  * Added PCH ncbi_pch.hpp
  208.  *
  209.  * Revision 1.13  2004/05/03 13:05:42  dicuccio
  210.  * gui/utils --> gui/objutils where needed
  211.  *
  212.  * Revision 1.12  2004/03/05 17:35:37  dicuccio
  213.  * Use sequence::GetId() instead of CSeq_id::GetStringDescr()
  214.  *
  215.  * Revision 1.11  2004/01/27 18:38:04  dicuccio
  216.  * Code clean-up.  Use standard names for plugins.  Removed unnecessary #includes
  217.  *
  218.  * Revision 1.10  2004/01/07 15:50:38  dicuccio
  219.  * Adjusted for API change in CPluginUtils::GetLabel().  Standardized exception
  220.  * reporting in algorithms.
  221.  *
  222.  * Revision 1.9  2003/11/24 15:45:27  dicuccio
  223.  * Renamed CVersion to CPluginVersion
  224.  *
  225.  * Revision 1.8  2003/11/18 17:48:37  dicuccio
  226.  * Added standard processing of return values
  227.  *
  228.  * Revision 1.7  2003/11/06 20:12:12  dicuccio
  229.  * Cleaned up handling of USING_SCOPE - removed from all headers
  230.  *
  231.  * Revision 1.6  2003/11/04 17:49:23  dicuccio
  232.  * Changed calling parameters for plugins - pass CPluginMessage instead of paired
  233.  * CPluginCommand/CPluginReply
  234.  *
  235.  * Revision 1.5  2003/10/27 17:46:49  dicuccio
  236.  * Removed dead #includes
  237.  *
  238.  * Revision 1.4  2003/10/14 16:24:37  dicuccio
  239.  * Correctly remap new feature locations through the parent location to the master
  240.  * sequence
  241.  *
  242.  * Revision 1.3  2003/10/07 13:47:00  dicuccio
  243.  * Renamed CPluginURL* to CPluginValue*
  244.  *
  245.  * Revision 1.2  2003/09/25 17:21:35  jcherry
  246.  * Added name to annot
  247.  *
  248.  * Revision 1.1  2003/09/10 15:31:34  jcherry
  249.  * Initial version
  250.  *
  251.  * ===========================================================================
  252.  */