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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: prosite_search.cpp,v $
  4.  * PRODUCTION Revision 1000.6  2004/06/01 20:55:39  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.23
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: prosite_search.cpp,v 1000.6 2004/06/01 20:55:39 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 searching against prosite patterns
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "prosite_search.hpp"
  41. #include "prosite.hpp"
  42. #include <algo/sequence/find_pattern.hpp>
  43. #include <corelib/ncbiapp.hpp>
  44. #include <corelib/ncbireg.hpp>
  45. #include <gui/core/plugin_utils.hpp>
  46. #include <gui/utils/system_path.hpp>
  47. #include <gui/core/version.hpp>
  48. #include <gui/dialogs/col/multi_col_dlg.hpp>
  49. #include <gui/plugin/PluginCommandSet.hpp>
  50. #include <gui/plugin/PluginInfo.hpp>
  51. #include <gui/plugin/PluginRequest.hpp>
  52. #include <gui/plugin/PluginValueConstraint.hpp>
  53. #include <gui/utils/message_box.hpp>
  54. #include <gui/objutils/utils.hpp>
  55. #include <objects/seqloc/Seq_interval.hpp>
  56. #include <objmgr/seq_vector.hpp>
  57. #include <objmgr/util/sequence.hpp>
  58. BEGIN_NCBI_SCOPE
  59. USING_SCOPE(objects);
  60. CAlgoPlugin_PrositeSearch::~CAlgoPlugin_PrositeSearch()
  61. {
  62. }
  63. // standard plugin announce bopilerplate
  64. void CAlgoPlugin_PrositeSearch::GetInfo(CPluginInfo& info)
  65. {
  66.     info.Reset();
  67.     
  68.     // version info macro
  69.     info.SetInfo(CPluginVersion::eMajor, CPluginVersion::eMinor, 0,
  70.                  string(__DATE__) + " " + string(__TIME__),
  71.                  "CAlgoPlugin_PrositeSearch", "Search/Search against prosite",
  72.                  "Search a protein sequence against prosite patterns",
  73.                  "");
  74.     // command info
  75.     CPluginCommandSet& cmds = info.SetCommands();
  76.     CPluginCommand&    args = cmds.AddAlgoCommand(eAlgoCommand_run);
  77.     args.AddArgument("locs", "Locations to evaluate",
  78.                      CSeq_loc::GetTypeInfo(),
  79.                      CPluginArg::TData::e_Array);
  80.     args.SetConstraint("locs",
  81.                        (*CPluginValueConstraint::CreateSeqMol(),
  82.                         CSeq_inst::eMol_aa));
  83.     args.AddDefaultArgument("skip",
  84.                             "Skip patterns with SKIP_FLAG set",
  85.                             CPluginArg::eBoolean, "true");
  86. }
  87. void CAlgoPlugin_PrositeSearch::RunCommand(CPluginMessage& msg)
  88. {
  89.     const CPluginCommand& args = msg.GetRequest().GetCommand();
  90.     CPluginReply& reply = msg.SetReply();
  91.     _TRACE("CAlgoPlugin_PrositeSearch::RunCommand()");
  92.     bool skip = args["skip"].AsBoolean();
  93.     
  94.     // load patterns from file
  95.     vector<CPrositeEntry> entries;
  96.     try {
  97.         x_LoadPrositeData(entries);
  98.     }
  99.     catch (const exception& e) {
  100.         NcbiMessageBox(e.what());
  101.         reply.SetStatus(eMessageStatus_failed);
  102.         return;
  103.     }
  104.     if ( !m_Dialog.get() ) {
  105.         m_Dialog.reset(new CMultiColDlg());
  106.         m_Dialog->SetWindowSize(1000, 350);
  107.         m_Dialog->SetTitle("Pattern Search Results");
  108.         m_Dialog->SetColumn(0, "Sequence", FL_ALIGN_LEFT, 1.0f);
  109.         m_Dialog->SetColumn(1, "Location", FL_ALIGN_LEFT, 1.0f);
  110.         m_Dialog->SetColumn(2, "Position", FL_ALIGN_CENTER, 1.0f);
  111.         m_Dialog->SetColumn(3, "Pattern ID", FL_ALIGN_LEFT, 3.0f);
  112.         m_Dialog->SetColumn(4, "Pattern Description", FL_ALIGN_LEFT, 4.0f);
  113.         m_Dialog->SetColumn(5, "Pattern", FL_ALIGN_LEFT, 3.0f);
  114.         m_Dialog->SetColumn(6, "Matched Sequence", FL_ALIGN_LEFT, 2.0f);
  115.     }
  116.     m_Dialog->SetRows(0);  // to clear any previous contents
  117.  
  118.     vector<TSeqPos> starts;
  119.     vector<TSeqPos> ends;
  120.     //
  121.     // first, evaluate whole sequences
  122.     //
  123.     int row = 0;
  124.     plugin_args::TLocList locs;
  125.     GetArgValue(args["locs"], locs);
  126.     unsigned int patterns_searched;
  127.     ITERATE (plugin_args::TLocList, iter, locs) {
  128.         const CSeq_loc&  loc = *iter->second;
  129.         const IDocument& doc = *iter->first;
  130.         // find the best ID for this bioseq
  131.         try {
  132.             CBioseq_Handle handle = doc.GetScope().GetBioseqHandle(loc);
  133.             CSeqVector vec =
  134.                 handle.GetSequenceView(loc,
  135.                                        CBioseq_Handle::eViewConstructed,
  136.                                        CBioseq_Handle::eCoding_Iupac);
  137.             
  138.             string seq;
  139.             vec.GetSeqData( (TSeqPos) 0, vec.size(), seq );
  140.             string& id_str  = m_Dialog->SetCell(row, 0);
  141.             string& loc_str = m_Dialog->SetCell(row, 1);
  142.             const CSeq_id& best_id =
  143.                 sequence::GetId(handle, sequence::eGetId_Best);
  144.             id_str.erase();
  145.             best_id.GetLabel(&id_str);
  146.             loc_str = CPluginUtils::GetLabel(loc, &doc.GetScope());
  147.             // a new feature table
  148.             CRef<CSeq_annot> annot(new CSeq_annot());
  149.             patterns_searched = 0;
  150.             // iterate over patterns
  151.             ITERATE (vector<CPrositeEntry>, entry, entries) {
  152.                 if (entry->GetSkipFlag() && skip) {
  153.                     continue;  // skip this pattern entry
  154.                 }
  155.                 string pcre = CProsite::PSPatternToPCRE(entry->GetPattern());
  156.                 CFindPattern::Find(seq, pcre, starts, ends);
  157.                 patterns_searched++;
  158.                 for( unsigned int k = 0;  k < starts.size();  k++) {
  159.                     string& pos_str = m_Dialog->SetCell(row, 2);
  160.                     // 1-based indexing for dialog
  161.                     pos_str = NStr::IntToString(starts[k] + 1) + " - "
  162.                         + NStr::IntToString(ends[k] + 1);
  163.                     m_Dialog->SetCell(row, 3) = entry->GetId();
  164.                     m_Dialog->SetCell(row, 4) = entry->GetDesc();
  165.                     m_Dialog->SetCell(row, 5) = entry->GetPattern();
  166.                     m_Dialog->SetCell(row, 6) =
  167.                         seq.substr(starts[k], ends[k] - starts[k] + 1);
  168.                     ++row;
  169.                 }
  170.                 //
  171.                 // add features to annot
  172.                 //
  173.                 for( unsigned int k = 0;  k < starts.size();  k++) {
  174.                     // create feature
  175.                     CRef<CSeq_feat> feat(new CSeq_feat());
  176.                     // set correct location
  177.                     CSeq_loc& floc = feat->SetLocation();
  178.                     floc.SetInt().SetId().Assign(sequence::GetId(loc));
  179.                     floc.SetInt().SetFrom(starts[k]);
  180.                     floc.SetInt().SetTo  (ends[k]);
  181.                     feat->SetLocation
  182.                         (*CSeqUtils::RemapChildToParent(loc, floc));
  183.                     // set feature data
  184.                     feat->SetData().SetRegion() = "Prosite match: "
  185.                         + entry->GetDesc() + "; "
  186.                         + entry->GetId();
  187.     
  188.                     // save in annot
  189.                     annot->SetData().SetFtable().push_back(feat);
  190.                 }
  191.             }
  192.             // add description to annot
  193.             annot->SetName("Prosite matches");
  194.             // attach annot to doc
  195.             //const_cast<IDocument&>(doc).AttachAnnot(*annot);
  196.             reply.AddObject(doc, *annot);
  197.         }
  198.         catch (exception& e) {
  199.             LOG_POST(Error << e.what());
  200.             string str = CPluginUtils::GetLabel(loc, &doc.GetScope());
  201.             LOG_POST(Error << "Error processing location " << str);
  202.         }
  203. #ifndef _DEBUG
  204.         catch (...) {
  205.             string str = CPluginUtils::GetLabel(loc, &doc.GetScope());
  206.             LOG_POST(Error << "Error processing location " << str);
  207.         }
  208. #endif
  209.     }
  210.     // update all views
  211.     //CDocManager::UpdateAllViews();
  212.     //
  213.     // prepare our dialog box
  214.     //
  215.     m_Dialog->SetLabel(string("A search against ")
  216.                  + NStr::IntToString(patterns_searched)
  217.                  + " patterns produced:");
  218.     m_Dialog->Show();
  219.     reply.SetStatus(eMessageStatus_success);
  220.     reply.AddAction(CPluginReplyAction::e_Add_to_document);
  221. }
  222. void CAlgoPlugin_PrositeSearch::x_LoadPrositeData(vector<CPrositeEntry>& entries)
  223. {
  224.     CNcbiApplication* app = CNcbiApplication::Instance();
  225.     _ASSERT(app);
  226.     CNcbiRegistry& registry = app->GetConfig();
  227.     string fname;
  228.     // By default the rebase "NAR format" file 
  229.     // is assumed to be <std>/etc/rebase.nar.
  230.     // This can be overridden in gbench.ini, via the application registry
  231.     // variable [PROSITE_SEARCH] PrositeData.
  232.     fname = registry.GetString("PROSITE_SEARCH", "PrositeData", "");
  233.     if ( !fname.empty() ) {
  234.         fname += ", ";
  235.     }
  236.     fname += "<home>/etc/prosite.dat, <std>/etc/prosite.dat";
  237.     fname = CSystemPath::ResolvePathExisting(fname);
  238.     if ( fname.empty() ) {
  239.         throw runtime_error("Couldn't open PROSITE file");
  240.     }
  241.     
  242.     ifstream psfile(fname.c_str());
  243.     CProsite::ReadEntries(psfile, entries);
  244. }
  245. END_NCBI_SCOPE
  246. /*
  247.  * ===========================================================================
  248.  * $Log: prosite_search.cpp,v $
  249.  * Revision 1000.6  2004/06/01 20:55:39  gouriano
  250.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.23
  251.  *
  252.  * Revision 1.23  2004/05/21 22:27:47  gorelenk
  253.  * Added PCH ncbi_pch.hpp
  254.  *
  255.  * Revision 1.22  2004/05/03 13:05:42  dicuccio
  256.  * gui/utils --> gui/objutils where needed
  257.  *
  258.  * Revision 1.21  2004/03/05 17:35:37  dicuccio
  259.  * Use sequence::GetId() instead of CSeq_id::GetStringDescr()
  260.  *
  261.  * Revision 1.20  2004/02/17 20:35:25  rsmith
  262.  * moved core/settings.[ch]pp and core/system_path.[ch]pp to config and utils, respectively.
  263.  *
  264.  * Revision 1.19  2004/02/13 15:08:50  mjohnson
  265.  * Removed local URL for plugin help.
  266.  *
  267.  * Revision 1.18  2004/01/27 18:38:08  dicuccio
  268.  * Code clean-up.  Use standard names for plugins.  Removed unnecessary #includes
  269.  *
  270.  * Revision 1.17  2004/01/07 15:50:38  dicuccio
  271.  * Adjusted for API change in CPluginUtils::GetLabel().  Standardized exception
  272.  * reporting in algorithms.
  273.  *
  274.  * Revision 1.16  2003/12/15 20:16:08  jcherry
  275.  * Changed CFindPattern::Find to take a string rather than a CSeqVector
  276.  *
  277.  * Revision 1.15  2003/11/24 15:45:28  dicuccio
  278.  * Renamed CVersion to CPluginVersion
  279.  *
  280.  * Revision 1.14  2003/11/18 17:48:38  dicuccio
  281.  * Added standard processing of return values
  282.  *
  283.  * Revision 1.13  2003/11/14 00:20:29  jcherry
  284.  * Added url for help
  285.  *
  286.  * Revision 1.12  2003/11/06 20:12:12  dicuccio
  287.  * Cleaned up handling of USING_SCOPE - removed from all headers
  288.  *
  289.  * Revision 1.11  2003/11/04 17:49:23  dicuccio
  290.  * Changed calling parameters for plugins - pass CPluginMessage instead of paired
  291.  * CPluginCommand/CPluginReply
  292.  *
  293.  * Revision 1.10  2003/10/27 17:46:49  dicuccio
  294.  * Removed dead #includes
  295.  *
  296.  * Revision 1.9  2003/10/14 16:24:02  dicuccio
  297.  * Added correct remapping of scanned locations to the parent location.  Cleaned
  298.  * up code to look for data file - added hierarchichal search through path in INI,
  299.  * user's home directory, and finally system installed path.
  300.  *
  301.  * Revision 1.8  2003/10/07 13:47:00  dicuccio
  302.  * Renamed CPluginURL* to CPluginValue*
  303.  *
  304.  * Revision 1.7  2003/09/25 17:21:35  jcherry
  305.  * Added name to annot
  306.  *
  307.  * Revision 1.6  2003/09/04 14:05:24  dicuccio
  308.  * Use IDocument instead of CDocument
  309.  *
  310.  * Revision 1.5  2003/09/03 14:46:53  rsmith
  311.  * change namespace name from args to plugin_args to avoid clashes with variable names.
  312.  *
  313.  * Revision 1.4  2003/08/21 12:03:07  dicuccio
  314.  * Make use of new typedef in plugin_utils.hpp for argument values.
  315.  *
  316.  * Revision 1.3  2003/08/15 18:48:06  jcherry
  317.  * Brought dialog handling up to date.
  318.  *
  319.  * Revision 1.2  2003/08/11 18:03:25  jcherry
  320.  * Fixed to use 0-based indexing for feature table (but retain
  321.  * 1-based indexing for dialog box)
  322.  *
  323.  * Revision 1.1  2003/08/04 20:05:45  jcherry
  324.  * Initial version
  325.  *
  326.  * ===========================================================================
  327.  */