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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: pattern.cpp,v $
  4.  * PRODUCTION Revision 1000.6  2004/06/01 20:55:24  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.33
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: pattern.cpp,v 1000.6 2004/06/01 20:55:24 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 finding regular expressions in sequences
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "pattern.hpp"
  41. #include <algo/sequence/find_pattern.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_Pattern::~CAlgoPlugin_Pattern()
  55. {
  56. }
  57. // standard plugin announce bopilerplate
  58. void CAlgoPlugin_Pattern::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_Pattern",
  66.                  "Search/Regular Expression Sequence Search",
  67.                  "Find all non-overlapping occurrences of a pattern",
  68.                  "");
  69.     // command info
  70.     CPluginCommandSet& cmds = info.SetCommands();
  71.     CPluginCommand&    args = cmds.AddAlgoCommand(eAlgoCommand_run);
  72.     args.AddArgument("locs", "Locations to evaluate",
  73.                      CSeq_loc::GetTypeInfo(),
  74.                      CPluginArg::TData::e_Array);
  75.     args.AddArgument("pattern", "Pattern to find",
  76.                      CPluginArg::eString);
  77.     args.AddArgument("label", "Label for matches",
  78.                      CPluginArg::eString);
  79. }
  80. void CAlgoPlugin_Pattern::RunCommand(CPluginMessage& msg)
  81. {
  82.     const CPluginCommand& args = msg.GetRequest().GetCommand();
  83.     CPluginReply& reply = msg.SetReply();
  84.     _TRACE("CAlgoPlugin_Pattern::Run()");
  85.     // pattern (r.e.) to find
  86.     string pattern(args["pattern"].AsString());
  87.     // label to appear in feature table
  88.     string label(args["label"].AsString());
  89.     if ( !m_Dialog.get() ) {
  90.         m_Dialog.reset(new CMultiColDlg());
  91.         m_Dialog->SetWindowSize(600, 350);
  92.         m_Dialog->SetTitle("Pattern Search Results");
  93.         m_Dialog->SetColumn(0, "Sequence");
  94.         m_Dialog->SetColumn(1, "Location");
  95.         m_Dialog->SetColumn(2, "Position", FL_ALIGN_CENTER);
  96.         m_Dialog->SetColumn(3, "Matched Sequence", FL_ALIGN_LEFT, 2.0f);
  97.     }
  98.     m_Dialog->SetLabel(string("A search for the patternn") + pattern +
  99.                        string("nproduced:"));
  100.     // clear any previous contents
  101.     m_Dialog->SetRows(0);
  102.     vector<TSeqPos> starts;
  103.     vector<TSeqPos> ends;
  104.     //
  105.     // first, evaluate whole sequences
  106.     //
  107.     int row = 0;
  108.     plugin_args::TLocList locs;
  109.     GetArgValue(args["locs"], locs);
  110.     ITERATE (plugin_args::TLocList, iter, locs) {
  111.         const CSeq_loc&  loc = *iter->second;
  112.         const IDocument& doc = *iter->first;
  113.         // find the best ID for this bioseq
  114.         try {
  115.             CBioseq_Handle handle = doc.GetScope().GetBioseqHandle(loc);
  116.             CSeqVector vec =
  117.                 handle.GetSequenceView(loc,
  118.                                        CBioseq_Handle::eViewConstructed,
  119.                                        CBioseq_Handle::eCoding_Iupac);
  120.             string seq;
  121.             vec.GetSeqData( (TSeqPos) 0, vec.size(), seq );
  122.             CFindPattern::Find(seq, pattern, starts, ends);
  123.             string& id_str  = m_Dialog->SetCell(row, 0);
  124.             string& loc_str = m_Dialog->SetCell(row, 1);
  125.             const CSeq_id& best_id =
  126.                 sequence::GetId(handle, sequence::eGetId_Best);
  127.             id_str.erase();
  128.             best_id.GetLabel(&id_str);
  129.             loc_str = CPluginUtils::GetLabel(loc, &doc.GetScope());
  130.             // preallocate rows in dialog for speed
  131.             m_Dialog->SetRows(row + starts.size());
  132.             for( unsigned int k = 0;  k < starts.size();  k++) {
  133.                 string& pos_str = m_Dialog->SetCell(row, 2);
  134.                 // 1-based indexing for dialog
  135.                 pos_str = NStr::IntToString(starts[k] + 1) + " - "
  136.                     + NStr::IntToString(ends[k] + 1);
  137.                 m_Dialog->SetCell(row, 3) =
  138.                     seq.substr(starts[k], ends[k] - starts[k] + 1);
  139.                 ++row;
  140.             }
  141.             //
  142.             // add a feature table to doc
  143.             //
  144.             CRef<CSeq_annot> annot(new CSeq_annot());
  145.             for( unsigned int k = 0;  k < starts.size();  k++) {
  146.                 // create feature
  147.                 CRef<CSeq_feat> feat(new CSeq_feat());
  148.                 // set correct location
  149.                 {{
  150.                      CSeq_loc& floc = feat->SetLocation();
  151.                      floc.SetInt().SetId().Assign(sequence::GetId(loc));
  152.                      floc.SetInt().SetFrom(starts[k]);
  153.                      floc.SetInt().SetTo(ends[k]);
  154.                      // assume plus strand for now
  155.                      floc.SetInt().SetStrand(eNa_strand_plus);
  156.                      CRef<CSeq_loc> new_loc =
  157.                          CSeqUtils::RemapChildToParent(loc, floc);
  158.                      feat->SetLocation(*new_loc);
  159.                  }}
  160.                 // set feature data
  161.                 feat->SetData().SetRegion() = label;
  162.     
  163.                 // save in annot
  164.                 annot->SetData().SetFtable().push_back(feat);
  165.             }
  166.             
  167.             // add description to annot
  168.             annot->AddName("Pattern Matches");
  169.             string comment("Matches to pattern '");
  170.             comment += pattern + "'";
  171.             annot->AddComment(comment);
  172.             reply.AddObject(doc, *annot);
  173.             // attach annot to doc
  174.             //const_cast<IDocument&>(doc).AttachAnnot(*annot);
  175.         }
  176.         catch (CException& e) {
  177.             string str = CPluginUtils::GetLabel(loc, &doc.GetScope());
  178.             LOG_POST(Error << "Error processing location " << str
  179.                      << ": " << e.what());
  180.         }
  181. #ifndef _DEBUG
  182.         catch (...) {
  183.             string str = CPluginUtils::GetLabel(loc, &doc.GetScope());
  184.             LOG_POST(Error << "Error processing location " << str);
  185.         }
  186. #endif
  187.     }
  188.     // update all views
  189.     //CDocManager::UpdateAllViews();
  190.     //
  191.     // prepare our dialog box
  192.     //
  193.     m_Dialog->Show();
  194.     reply.AddAction(CPluginReplyAction::e_Add_to_document);
  195.     reply.SetStatus(eMessageStatus_success);
  196. }
  197. END_NCBI_SCOPE
  198. /*
  199.  * ===========================================================================
  200.  * $Log: pattern.cpp,v $
  201.  * Revision 1000.6  2004/06/01 20:55:24  gouriano
  202.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.33
  203.  *
  204.  * Revision 1.33  2004/05/21 22:27:47  gorelenk
  205.  * Added PCH ncbi_pch.hpp
  206.  *
  207.  * Revision 1.32  2004/05/03 13:05:42  dicuccio
  208.  * gui/utils --> gui/objutils where needed
  209.  *
  210.  * Revision 1.31  2004/04/01 14:14:02  lavr
  211.  * Spell "occurred", "occurrence", and "occurring"
  212.  *
  213.  * Revision 1.30  2004/03/05 17:35:37  dicuccio
  214.  * Use sequence::GetId() instead of CSeq_id::GetStringDescr()
  215.  *
  216.  * Revision 1.29  2004/02/13 15:08:50  mjohnson
  217.  * Removed local URL for plugin help.
  218.  *
  219.  * Revision 1.28  2004/01/27 18:37:53  dicuccio
  220.  * Code clean-up.  Use standard names for plugins.  Removed unnecessary #includes
  221.  *
  222.  * Revision 1.27  2004/01/07 15:50:37  dicuccio
  223.  * Adjusted for API change in CPluginUtils::GetLabel().  Standardized exception
  224.  * reporting in algorithms.
  225.  *
  226.  * Revision 1.26  2003/12/17 17:58:50  jcherry
  227.  * Set dialog label every time
  228.  *
  229.  * Revision 1.25  2003/12/16 22:25:09  jcherry
  230.  * Added plugin for searching against patterns loaded from file
  231.  *
  232.  * Revision 1.24  2003/12/15 20:16:08  jcherry
  233.  * Changed CFindPattern::Find to take a string rather than a CSeqVector
  234.  *
  235.  * Revision 1.23  2003/12/15 19:53:05  jcherry
  236.  * Preallocate rows in dialog for speed
  237.  *
  238.  * Revision 1.22  2003/11/24 15:45:26  dicuccio
  239.  * Renamed CVersion to CPluginVersion
  240.  *
  241.  * Revision 1.21  2003/11/18 17:48:37  dicuccio
  242.  * Added standard processing of return values
  243.  *
  244.  * Revision 1.20  2003/11/14 00:20:29  jcherry
  245.  * Added url for help
  246.  *
  247.  * Revision 1.19  2003/11/06 20:12:12  dicuccio
  248.  * Cleaned up handling of USING_SCOPE - removed from all headers
  249.  *
  250.  * Revision 1.18  2003/11/04 17:49:23  dicuccio
  251.  * Changed calling parameters for plugins - pass CPluginMessage instead of paired
  252.  * CPluginCommand/CPluginReply
  253.  *
  254.  * Revision 1.17  2003/10/27 17:46:48  dicuccio
  255.  * Removed dead #includes
  256.  *
  257.  * Revision 1.16  2003/10/14 16:24:37  dicuccio
  258.  * Correctly remap new feature locations through the parent location to the master
  259.  * sequence
  260.  *
  261.  * Revision 1.15  2003/10/07 13:47:00  dicuccio
  262.  * Renamed CPluginURL* to CPluginValue*
  263.  *
  264.  * Revision 1.14  2003/09/25 17:21:35  jcherry
  265.  * Added name to annot
  266.  *
  267.  * Revision 1.13  2003/09/04 14:05:24  dicuccio
  268.  * Use IDocument instead of CDocument
  269.  *
  270.  * Revision 1.12  2003/09/03 14:46:53  rsmith
  271.  * change namespace name from args to plugin_args to avoid clashes with variable names.
  272.  *
  273.  * Revision 1.11  2003/08/21 12:03:07  dicuccio
  274.  * Make use of new typedef in plugin_utils.hpp for argument values.
  275.  *
  276.  * Revision 1.10  2003/08/11 18:03:53  jcherry
  277.  * Fixed to use 0-based indexing for feature table (but retain
  278.  * 1-based indexing for dialog box)
  279.  *
  280.  * Revision 1.9  2003/08/05 17:03:55  dicuccio
  281.  * Made multi-column output dialog a member variable - allows non-modal operation
  282.  *
  283.  * Revision 1.8  2003/07/28 11:51:48  dicuccio
  284.  * Rewrote CTablePanel<> to be more flexible and better contained.  Added standard
  285.  * multicolumn list dialog.  Deprecated use of COutputm_Dialog->
  286.  *
  287.  * Revision 1.7  2003/07/22 15:32:16  dicuccio
  288.  * Changed to make use of new API in plugin_utils.hpp - GetArgValue()
  289.  *
  290.  * Revision 1.6  2003/07/14 11:13:05  shomrat
  291.  * Plugin messageing system related changes
  292.  *
  293.  * Revision 1.5  2003/07/09 17:20:07  jcherry
  294.  * Added code to add comment to annotation.
  295.  * Removed some gratuitous code.
  296.  *
  297.  * Revision 1.4  2003/07/08 22:09:00  jcherry
  298.  * Added code to attach results as feature table to document handed
  299.  *
  300.  * Revision 1.3  2003/07/03 19:14:12  jcherry
  301.  * Initial version
  302.  *
  303.  * Revision 1.1  2003/07/03 19:06:39  jcherry
  304.  * Initial version
  305.  *
  306.  * ===========================================================================
  307.  */