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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: dlg_blastpoll.cpp,v $
  4.  * PRODUCTION Revision 1000.6  2004/06/01 20:54:21  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: dlg_blastpoll.cpp,v 1000.6 2004/06/01 20:54:21 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. * Author:  Cliff Clausen, Michael DiCuccio
  35. *
  36. * File Description:
  37. *   !!! PUT YOUR DESCRIPTION HERE !!!
  38. *
  39. * ===========================================================================
  40. */
  41. #include <ncbi_pch.hpp>
  42. #include "dlg_blastpoll.hpp"
  43. #include "blast_poll_table.hpp"
  44. #include <gui/core/plugin_utils.hpp>
  45. #include <gui/utils/fltk_utils.hpp>
  46. #include <algo/blast/api/remote_blast.hpp>
  47. #include <objects/seq/Seq_annot.hpp>
  48. #include <objects/seqalign/Seq_align_set.hpp>
  49. #include <objects/seqalign/Seq_align.hpp>
  50. #include <objects/seqalign/Dense_seg.hpp>
  51. #include "blast_rid_cache.hpp"
  52. BEGIN_NCBI_SCOPE
  53. USING_SCOPE(objects);
  54. #include "dlg_blastpoll_.cpp"
  55. CBlastPollDlg::CBlastPollDlg()
  56. {
  57.     m_Window.reset(x_CreateWindow());
  58.     m_PollPending = false;
  59.     m_RidCache.Reset(new CBlastRidCache());
  60. }
  61. void CBlastPollDlg::x_OnPollNow()
  62. {
  63.     // Loop through poll list
  64.     for (size_t i = 0;  i < m_Table->GetRows();  ++i) {
  65.         CBlastPollItem& item = *m_Table->SetData(i);
  66.         if ( !item.m_Active ) {
  67.             continue;
  68.         }
  69.         CTime now(CTime::eCurrent);
  70.         // Get blast results for this rid, if ready
  71.         string msg;
  72.         item.m_Errors = !x_Poll(item);
  73.         item.m_LastPollTime = now;
  74.         m_Table->UpdateItem(i, item);
  75.     }
  76. }
  77. void CBlastPollDlg::x_OnActiveToggle()
  78. {
  79.     for (size_t i = 0;  i < m_Table->GetRows();  ++i) {
  80.         if ( !m_Table->IsRowSelected(i) ) {
  81.             continue;
  82.         }
  83.         if (m_Table->GetData(i)->m_Active) {
  84.             m_Table->DeactivateItem(i);
  85.         } else {
  86.             m_Table->ActivateItem(i);
  87.         }
  88.     }
  89. }
  90. void CBlastPollDlg::x_OnRemove()
  91. {
  92.     m_Table->RemoveSelected();
  93. }
  94. void CBlastPollDlg::x_OnUp()
  95. {
  96.     for (size_t i = 0;  i < m_Table->GetRows();  ++i) {
  97.         if ( !m_Table->IsRowSelected(i) ) {
  98.             continue;
  99.         }
  100.         m_Table->MoveUp(i);
  101.     }
  102. }
  103. void CBlastPollDlg::x_OnDown()
  104. {
  105.     for (size_t i = 0;  i < m_Table->GetRows();  ++i) {
  106.         if ( !m_Table->IsRowSelected(i) ) {
  107.             continue;
  108.         }
  109.         m_Table->MoveDown(i);
  110.         // we need to increment as the next item is the one we just moved.
  111.         ++i;
  112.     }
  113. }
  114. static void s_pollTimeout(void *data)
  115. {
  116.     CBlastPollDlg *dlg = static_cast<CBlastPollDlg*>(data);
  117.     if (dlg) {
  118.         dlg->Poll();
  119.         Fl::repeat_timeout(1.0f, s_pollTimeout, data);
  120.     }
  121. }
  122. void CBlastPollDlg::StartPoll()
  123. {
  124.     if (!m_PollPending) {
  125.         Fl::add_timeout(1.0f, s_pollTimeout, this);
  126.         m_PollPending = true;
  127.     }
  128. }
  129. void CBlastPollDlg::StopPoll()
  130. {
  131.     Fl::remove_timeout(s_pollTimeout);
  132.     m_PollPending = false;
  133. }
  134. void CBlastPollDlg::Poll()
  135. {
  136.     // Loop through poll list
  137.     for (size_t i = 0;  i < m_Table->GetRows();  ++i) {
  138.         CBlastPollItem& item = *m_Table->SetData(i);
  139.         if ( !item.m_Active ) {
  140.             continue;
  141.         }
  142.         CTime now(CTime::eCurrent);
  143.         size_t secs = now.DiffSecond(item.m_LastPollTime);
  144.         if (secs < 30) {
  145.             continue;
  146.         }
  147.         // Get blast results for this rid, if ready
  148.         string msg;
  149.         item.m_Errors = !x_Poll(item);
  150.         item.m_LastPollTime = now;
  151.         m_Table->UpdateItem(i, item);
  152.     }
  153.     CTime now(CTime::eCurrent);
  154.     m_CurrTimeStr = now.AsString("h:m:s");
  155.     m_CurrTime->label(m_CurrTimeStr.c_str());
  156. }
  157. bool CBlastPollDlg::x_Poll(CBlastPollItem& item)
  158. {
  159.     CFltkCursorGuard WAIT;
  160.     string rid = item.m_Rid;
  161.     CRef<CSeq_annot> annot;
  162.     // check our cache first
  163.     annot = m_RidCache->GetRID(rid);
  164.     if ( !annot ) {
  165.         blast::CRemoteBlast rb(rid);
  166.         if (rb.CheckDone()) {
  167.             // Get the alignment, remap, and wrap it in a CSeq_annot
  168.             CRef<CSeq_align_set> results(rb.GetAlignments());
  169.             // Remap the alignments
  170.             if ( item.m_QueryLoc ) {
  171.                 CTypeIterator<CDense_seg> ds_iter(*results);
  172.                 for ( ;  ds_iter;  ++ds_iter) {
  173.                     ds_iter->RemapToLoc(0, *item.m_QueryLoc);
  174.                 }
  175.             }
  176.             annot.Reset(new CSeq_annot);
  177.             annot->SetData().SetAlign() = results->Set();
  178.     
  179.             // name defines how the object manager sees this annotation
  180.             annot->AddName("NetBLAST Results");
  181.             // 'title' defines how the user sees this
  182.             annot->AddTitle("NetBLAST Results, RID: " + rid);
  183.             // set our creation date
  184.             annot->SetCreateDate(CTime(CTime::eCurrent));
  185.             // save our results in the cache
  186.             m_RidCache->AddRID(rid, *annot);
  187.         }
  188.     }
  189.     if (annot) {
  190.         //
  191.         // got results
  192.         //
  193.         item.m_Active = false;
  194.         item.m_Status = "Retrieved";
  195.         // save the annot
  196.         item.m_Results = annot;
  197.         // Attach seq_annot to document
  198.         if ( item.m_Document ) {
  199.             const IDocument &cdoc = 
  200.                 dynamic_cast<const IDocument&>(*item.m_Document);
  201.             const_cast<IDocument&>(cdoc).AttachAnnot(*annot);
  202.             const_cast<IDocument&>(cdoc).UpdateAllViews();
  203.         } else {
  204.             CRef<CScope> scope(new CScope(CDocManager::GetObjectManager()));
  205.             scope->AddDefaults();
  206.             item.m_Document = CDocManager::CreateDocument(*scope, *annot);
  207.             CDocManager::UpdateAllViews();
  208.         }
  209.     }
  210.     
  211.     return true;
  212. }    
  213. void CBlastPollDlg::Add(const CPluginCommand& args)
  214. {
  215.     string rid;
  216.     if (!args.HasArgument("RID")) {
  217.         return;
  218.     }
  219.     rid = args["RID"].AsString();
  220.     if ( !rid.empty()  &&  !m_Table->HasRid(rid)) {
  221.         CRef<CBlastPollItem> item(new CBlastPollItem());
  222.         if ( !args.HasArgument("query_loc")  ||
  223.              !CPluginUtils::IsValid(args["query_loc"])) {
  224.             item->m_Document.Reset();
  225.             item->m_Descr = rid;
  226.         } else {
  227.             item->m_Document = args["query_loc"].GetDocument();
  228.             item->m_QueryLoc = dynamic_cast<const CSeq_loc*>
  229.                 (args["query_loc"].GetObject());
  230.             if (!item->m_Document.IsNull()) {
  231.                 item->m_Descr = item->m_Document->GetShortTitle();
  232.             } else {
  233.                 item->m_Descr = rid;
  234.             }
  235.         }
  236.         if ( args.HasArgument("prog") ) {
  237.             item->m_Descr += " - " + args["prog"].AsString();
  238.         }
  239.         item->m_Rid = rid;
  240.         item->m_Active = true;
  241.         item->m_Errors = false;
  242.         item->m_Status = "Polling";
  243.         item->m_Errors = !x_Poll(*item);
  244.         item->m_SubmitTime   = CTime(CTime::eCurrent);
  245.         item->m_LastPollTime = item->m_SubmitTime;
  246.         // Add rid to poll list
  247.         m_Table->AddItem(*item);
  248.         m_InputRid->value("");
  249.     }
  250. }
  251. void CBlastPollDlg::x_OnAdd()
  252. {
  253.     const char *rid = m_InputRid->value();
  254.     CRef<CBlastPollItem> item(new CBlastPollItem());
  255.     item->m_Document = NULL;
  256.     item->m_Descr = rid;
  257.     item->m_Rid = rid;
  258.     item->m_Active = true;
  259.     item->m_Errors = false;
  260.     item->m_Status = "Polling";
  261.     m_Table->AddItem(*item);
  262. }
  263. END_NCBI_SCOPE
  264. /*
  265. * ===========================================================================
  266. *
  267. * $Log: dlg_blastpoll.cpp,v $
  268. * Revision 1000.6  2004/06/01 20:54:21  gouriano
  269. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  270. *
  271. * Revision 1.13  2004/05/21 22:27:46  gorelenk
  272. * Added PCH ncbi_pch.hpp
  273. *
  274. * Revision 1.12  2004/04/22 12:22:08  dicuccio
  275. * Added BLAST RID caching.  Added better formatting for BLAST results
  276. *
  277. * Revision 1.11  2004/04/16 14:41:55  dicuccio
  278. * Use CRemoteBlast to poll for results
  279. *
  280. * Revision 1.10  2004/04/07 12:53:11  dicuccio
  281. * m_document -> m_Document.  Store CSeq_align_set in results
  282. *
  283. * Revision 1.9  2004/03/05 17:32:14  dicuccio
  284. * Large-scale clean-up to blast code.  Reorganized blast polling dialog to be
  285. * multi-column; standardized options for BLAST network submissions; changed
  286. * plugin to accept multiple locations for submission and create a submission for
  287. * each
  288. *
  289. * Revision 1.8  2004/02/18 19:02:36  jcherry
  290. * Query is now a Seq-loc, to which alignments get remapped
  291. *
  292. * Revision 1.7  2003/11/18 13:20:11  clausen
  293. * Fixes to remove g++ warnings
  294. *
  295. * Revision 1.6  2003/11/17 16:24:19  clausen
  296. * Added m_Descr
  297. *
  298. * Revision 1.5  2003/11/04 17:49:22  dicuccio
  299. * Changed calling parameters for plugins - pass CPluginMessage instead of paired
  300. * CPluginCommand/CPluginReply
  301. *
  302. * Revision 1.4  2003/10/31 22:56:36  ucko
  303. * Move include of idocument.hpp to header to precede use in CConstRef<>
  304. *
  305. * Revision 1.3  2003/10/31 17:32:08  clausen
  306. * Switched from passing scope to passing document
  307. *
  308. * Revision 1.2  2003/10/27 17:47:04  dicuccio
  309. * Removed dead #includes
  310. *
  311. * Revision 1.1  2003/10/24 12:49:21  dicuccio
  312. * Moved files from algo/net_blast
  313. *
  314. * Revision 1.12  2003/10/24 12:23:41  clausen
  315. * Fixed fltk blocking
  316. *
  317. * Revision 1.11  2003/10/17 16:35:40  dicuccio
  318. * Better handling of optional scope parameter
  319. *
  320. * Revision 1.10  2003/10/07 13:47:04  dicuccio
  321. * Renamed CPluginURL* to CPluginValue*
  322. *
  323. * Revision 1.9  2003/09/04 14:05:25  dicuccio
  324. * Use IDocument instead of IDocument
  325. *
  326. * Revision 1.8  2003/07/23 19:14:09  dicuccio
  327. * Moved logic for validating plugin arguments into CPluginUtils.
  328. *
  329. * Revision 1.7  2003/07/14 11:14:11  shomrat
  330. * Plugin messageing system related changes
  331. *
  332. * Revision 1.6  2003/07/10 13:06:20  dicuccio
  333. * Fixed compilation issues for gcc-3.3: restructured callback mechanism, replaced
  334. * multiple parallel arrays with an array of classes.
  335. *
  336. * Revision 1.5  2003/06/25 17:02:57  dicuccio
  337. * Split CPluginHandle into a handle (pointer-to-implementation) and
  338. * implementation file.  Lots of #include file clean-ups.
  339. *
  340. * Revision 1.4  2003/06/20 19:45:19  dicuccio
  341. * Fixed bizarre compile error related to namespaces on MSVC
  342. *
  343. * Revision 1.3  2003/06/13 12:07:41  clausen
  344. * GUI changes
  345. *
  346. * Revision 1.2  2003/06/04 19:39:56  ucko
  347. * Use new paths to OM headers (the forwarding headers break on WorkShop);
  348. * add missing public domain notice and CVS log.
  349. *
  350. *
  351. * ===========================================================================
  352. */