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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: pattern2.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 20:55:26  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: pattern2.cpp,v 1000.1 2004/06/01 20:55:26 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 patterns from file
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "pattern2.hpp"
  41. #include <algo/sequence/find_pattern.hpp>
  42. #include <corelib/ncbiapp.hpp>
  43. #include <corelib/ncbireg.hpp>
  44. #include <gui/core/plugin_utils.hpp>
  45. #include <gui/utils/system_path.hpp>
  46. #include <gui/core/version.hpp>
  47. #include <gui/dialogs/col/multi_col_dlg.hpp>
  48. #include <gui/plugin/PluginCommandSet.hpp>
  49. #include <gui/plugin/PluginInfo.hpp>
  50. #include <gui/plugin/PluginRequest.hpp>
  51. #include <gui/plugin/PluginValueConstraint.hpp>
  52. #include <gui/objutils/utils.hpp>
  53. #include <objects/seqloc/Seq_interval.hpp>
  54. #include <objmgr/seq_vector.hpp>
  55. #include <objmgr/util/sequence.hpp>
  56. BEGIN_NCBI_SCOPE
  57. USING_SCOPE(objects);
  58. CAlgoPlugin_NamedPatterns::~CAlgoPlugin_NamedPatterns()
  59. {
  60. }
  61. // standard plugin announce bopilerplate
  62. void CAlgoPlugin_NamedPatterns::GetInfo(CPluginInfo& info)
  63. {
  64.     info.Reset();
  65.     
  66.     // version info macro
  67.     info.SetInfo(CPluginVersion::eMajor, CPluginVersion::eMinor, 0,
  68.                  string(__DATE__) + " " + string(__TIME__),
  69.                  "CAlgoPlugin_NamedPatterns",
  70.                  "Search/Named Pattern Sets",
  71.                  "Search a sequence against patterns from a file", "");
  72.     // command info
  73.     CPluginCommandSet& cmds = info.SetCommands();
  74.     CPluginCommand&    args = cmds.AddAlgoCommand(eAlgoCommand_run);
  75.     args.AddArgument("locs", "Locations to evaluate",
  76.                      CSeq_loc::GetTypeInfo(),
  77.                      CPluginArg::TData::e_Array);
  78.     args.AddDefaultArgument("patterns", "Pattern set", CPluginArg::eString,
  79.                             "Load from file specified below");
  80.     args.AddOptionalArgument("fname", "File containing patterns",
  81.                               CPluginArg::eFile);
  82. }
  83. void CAlgoPlugin_NamedPatterns::FinalizeArgs(CPluginMessage& msg)
  84. {
  85.     CPluginCommand& args = msg.SetRequest().SetCommand();
  86.     x_UpdateFileList();
  87.     CPluginValueConstraint *constraint = CPluginValueConstraint::CreateSet();
  88.     constraint->SetSet().push_back("Load from file specified below");
  89.     typedef map<string, string> TMss;
  90.     ITERATE (TMss, it, m_FileList) {
  91.         constraint->SetSet().push_back(it->first);
  92.     }
  93.     args.SetConstraint("patterns", *constraint);
  94. }
  95. void CAlgoPlugin_NamedPatterns::RunCommand(CPluginMessage& msg)
  96. {
  97.     const CPluginCommand& args = msg.GetRequest().GetCommand();
  98.     CPluginReply& reply = msg.SetReply();
  99.     _TRACE("CAlgoPlugin_NamedPatterns::RunCommand()");
  100.     
  101.     if ( !m_Dialog.get() ) {
  102.         m_Dialog.reset(new CMultiColDlg());
  103.         m_Dialog->SetWindowSize(1000, 350);
  104.         m_Dialog->SetTitle("Pattern Search Results");
  105.         m_Dialog->SetColumn(0, "Sequence", FL_ALIGN_LEFT, 1.0f);
  106.         m_Dialog->SetColumn(1, "Location", FL_ALIGN_LEFT, 1.0f);
  107.         m_Dialog->SetColumn(2, "Position", FL_ALIGN_CENTER, 1.0f);
  108.         m_Dialog->SetColumn(3, "Pattern ID", FL_ALIGN_LEFT, 3.0f);
  109.         m_Dialog->SetColumn(4, "Pattern Description", FL_ALIGN_LEFT, 4.0f);
  110.         m_Dialog->SetColumn(5, "Pattern", FL_ALIGN_LEFT, 3.0f);
  111.         m_Dialog->SetColumn(6, "Matched Sequence", FL_ALIGN_LEFT, 2.0f);
  112.     }
  113.     m_Dialog->SetRows(0);  // to clear any previous contents
  114.  
  115.     vector<TSeqPos> starts;
  116.     vector<TSeqPos> ends;
  117.     string fname;
  118.     // determine which file to load
  119.     if (args["patterns"].AsString() == "Load from file specified below") {
  120.         fname = args["fname"].AsFile();
  121.     } else {
  122.         fname = m_FileList[args["patterns"].AsString()];
  123.     }
  124.     CNcbiRegistry patterns;
  125.     try {
  126.         CNcbiIfstream is(fname.c_str());
  127.         patterns.Read(is);
  128.     }
  129.     catch (exception& e) {
  130.         LOG_POST(Error << "Couldn't load registry from file " <<
  131.                  fname << ": " << e.what());
  132.         reply.SetStatus(eMessageStatus_failed);
  133.         return;
  134.     }
  135.     catch (...) {
  136.         LOG_POST(Error << "Couldn't load registry from file " <<
  137.                  fname);
  138.         reply.SetStatus(eMessageStatus_failed);
  139.         return;
  140.     }
  141.     //
  142.     // first, evaluate whole sequences
  143.     //
  144.     int row = 0;
  145.     plugin_args::TLocList locs;
  146.     GetArgValue(args["locs"], locs);
  147.     unsigned int patterns_searched;
  148.     ITERATE (plugin_args::TLocList, iter, locs) {
  149.         const CSeq_loc&  loc = *iter->second;
  150.         const IDocument& doc = *iter->first;
  151.         // find the best ID for this bioseq
  152.         try {
  153.             CBioseq_Handle handle = doc.GetScope().GetBioseqHandle(loc);
  154.             CSeqVector vec =
  155.                 handle.GetSequenceView(loc,
  156.                                        CBioseq_Handle::eViewConstructed,
  157.                                        CBioseq_Handle::eCoding_Iupac);
  158.             
  159.             string seq;
  160.             vec.GetSeqData( (TSeqPos) 0, vec.size(), seq );
  161.             string& id_str  = m_Dialog->SetCell(row, 0);
  162.             string& loc_str = m_Dialog->SetCell(row, 1);
  163.             const CSeq_id& best_id =
  164.                 sequence::GetId(handle, sequence::eGetId_Best);
  165.             id_str.erase();
  166.             best_id.GetLabel(&id_str);
  167.             loc_str = CPluginUtils::GetLabel(loc, &doc.GetScope());
  168.             // a new feature table
  169.             CRef<CSeq_annot> annot(new CSeq_annot());
  170.             // iterate over patterns
  171.             list<string> pat_ids;
  172.             patterns.EnumerateSections(&pat_ids);
  173.             patterns_searched = 0;
  174.             ITERATE (list<string>, pat_id, pat_ids) {
  175.                 if (*pat_id == "-") {
  176.                     continue;
  177.                 }
  178.                 patterns_searched++;
  179.                 string pattern = patterns.Get(*pat_id, "pattern");
  180.                 string desc = patterns.Get(*pat_id, "description");
  181.                 CFindPattern::Find(seq, pattern, starts, ends);
  182.                 for(unsigned int k = 0;  k < starts.size();  k++) {
  183.                     string& pos_str = m_Dialog->SetCell(row, 2);
  184.                     // 1-based indexing for dialog
  185.                     pos_str = NStr::IntToString(starts[k] + 1) + " - "
  186.                         + NStr::IntToString(ends[k] + 1);
  187.                     m_Dialog->SetCell(row, 3) = *pat_id;
  188.                     m_Dialog->SetCell(row, 4) = desc;
  189.                     m_Dialog->SetCell(row, 5) = pattern;
  190.                     m_Dialog->SetCell(row, 6) =
  191.                         seq.substr(starts[k], ends[k] - starts[k] + 1);
  192.                     ++row;
  193.                 }
  194.                 //
  195.                 // add features to annot
  196.                 //
  197.                 for( unsigned int k = 0;  k < starts.size();  k++) {
  198.                     // create feature
  199.                     CRef<CSeq_feat> feat(new CSeq_feat());
  200.                     // set correct location
  201.                     CSeq_loc& floc = feat->SetLocation();
  202.                     floc.SetInt().SetId().Assign(sequence::GetId(loc));
  203.                     floc.SetInt().SetFrom(starts[k]);
  204.                     floc.SetInt().SetTo  (ends[k]);
  205.                     feat->SetLocation
  206.                         (*CSeqUtils::RemapChildToParent(loc, floc));
  207.                     // set feature data
  208.                     feat->SetData().SetRegion() = "Pattern match:: "
  209.                         + desc + "; " + *pat_id;
  210.     
  211.                     // save in annot
  212.                     annot->SetData().SetFtable().push_back(feat);
  213.                 }
  214.             }
  215.             // add description to annot
  216.             annot->SetName("Pattern matches");
  217.             reply.AddObject(doc, *annot);
  218.         }
  219.         catch (CException& e) {
  220.             string str = CPluginUtils::GetLabel(loc, &doc.GetScope());
  221.             LOG_POST(Error << "Error processing location " << str
  222.                      << ": " << e.what());
  223.         }
  224. #ifndef _DEBUG
  225.         catch (...) {
  226.             string str = CPluginUtils::GetLabel(loc, &doc.GetScope());
  227.             LOG_POST(Error << "Error processing location " << str);
  228.         }
  229. #endif
  230.     }
  231.     //
  232.     // prepare our dialog box
  233.     //
  234.     m_Dialog->SetLabel(string("A search against ")
  235.                  + NStr::IntToString(patterns_searched)
  236.                  + " patterns produced:");
  237.     m_Dialog->Show();
  238.     reply.SetStatus(eMessageStatus_success);
  239.     reply.AddAction(CPluginReplyAction::e_Add_to_document);
  240. }
  241. void CAlgoPlugin_NamedPatterns::x_UpdateFileList(void)
  242. {
  243.     string dir;
  244.     m_FileList.clear();
  245.     CNcbiApplication* app = CNcbiApplication::Instance();
  246.     _ASSERT(app);
  247.     CNcbiRegistry& registry = app->GetConfig();
  248.     
  249.     if ( (dir = registry.Get("Patterns", "PatternPath")).empty() ) {
  250.         registry.Set("Patterns", "PatternPath", "<std>, <home>",
  251.                      CNcbiRegistry::ePersistent, " default external_path");
  252.     }
  253.     dir = registry.Get("Patterns", "PatternPath");
  254.     
  255.     list<string> paths;
  256.     NStr::Split(dir, ", tnr", paths);
  257.     ITERATE (list<string>, iter, paths) {
  258.         string dir_name;
  259.         if (*iter == "<std>"  ||  *iter == "<home>") {
  260.             dir_name = CSystemPath::ResolvePath(*iter, "etc/patterns");
  261.         } else {
  262.             dir_name = CSystemPath::ResolvePath(*iter, "");
  263.         }
  264.         if ( dir_name.empty() ) {
  265.             continue;
  266.         }
  267.         
  268.         CDir dir(dir_name);
  269.         if ( !dir.Exists() ) {
  270.             continue;
  271.         }
  272.         CDir::TEntries entries = dir.GetEntries("*.ini");
  273.         ITERATE (CDir::TEntries, entry_iter, entries) {
  274.             if ( !(*entry_iter)->IsFile() ) {
  275.                 continue;
  276.             }
  277.             
  278.             string full_path = (*entry_iter)->GetPath();
  279.             CNcbiIfstream reg_stream(full_path.c_str());
  280.             CNcbiRegistry my_reg(reg_stream);
  281.             list<string> sections;
  282.             string name = my_reg.Get("-", "name");
  283.             if (!name.empty()) {
  284.                 m_FileList[name] = full_path;
  285.             }
  286.         }
  287.     }
  288. }
  289. END_NCBI_SCOPE
  290. /*
  291.  * ===========================================================================
  292.  * $Log: pattern2.cpp,v $
  293.  * Revision 1000.1  2004/06/01 20:55:26  gouriano
  294.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  295.  *
  296.  * Revision 1.9  2004/05/21 22:27:47  gorelenk
  297.  * Added PCH ncbi_pch.hpp
  298.  *
  299.  * Revision 1.8  2004/05/03 13:05:42  dicuccio
  300.  * gui/utils --> gui/objutils where needed
  301.  *
  302.  * Revision 1.7  2004/03/05 17:35:37  dicuccio
  303.  * Use sequence::GetId() instead of CSeq_id::GetStringDescr()
  304.  *
  305.  * Revision 1.6  2004/02/17 20:35:25  rsmith
  306.  * moved core/settings.[ch]pp and core/system_path.[ch]pp to config and utils, respectively.
  307.  *
  308.  * Revision 1.5  2004/02/04 15:27:48  jcherry
  309.  * patterns->etc/patterns
  310.  *
  311.  * Revision 1.4  2004/01/27 18:37:56  dicuccio
  312.  * Code clean-up.  Use standard names for plugins.  Removed unnecessary #includes
  313.  *
  314.  * Revision 1.3  2004/01/21 23:44:45  jcherry
  315.  * Present a menu that includes sets of patterns from all *.ini files
  316.  * in certain directories (uses new FinalizeArgs() API)
  317.  *
  318.  * Revision 1.2  2004/01/07 15:50:37  dicuccio
  319.  * Adjusted for API change in CPluginUtils::GetLabel().  Standardized exception
  320.  * reporting in algorithms.
  321.  *
  322.  * Revision 1.1  2003/12/16 22:22:16  jcherry
  323.  * Initial version
  324.  *
  325.  * ===========================================================================
  326.  */