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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: aln_multi_cgi.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 21:07:35  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: aln_multi_cgi.cpp,v 1000.1 2004/06/01 21:07:35 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:  Andrey Yazhuk
  35.  *
  36.  * File Description:
  37.  */
  38. #include <ncbi_pch.hpp>
  39. #include <corelib/ncbistl.hpp>
  40. #include <cgi/cgictx.hpp>
  41. #include <gui/opengl/mesa/glcgi_image.hpp>
  42. #include <gui/opengl/mesa/gloscontext.hpp>
  43. #include <gui/opengl/glutils.hpp>
  44. #include <gui/opengl/glpane.hpp>
  45. #include <objmgr/object_manager.hpp>
  46. #include <objtools/data_loaders/genbank/gbloader.hpp>
  47. #include <gui/widgets/aln_multiple/align_row.hpp>
  48. #include <gui/widgets/aln_multiple/alnvec_multi_ds.hpp>
  49. #include <gui/widgets/aln_multiple/alnvec_multi_model.hpp>
  50. #include <gui/widgets/aln_multiple/alnmulti_renderer.hpp>
  51. #include <gui/widgets/aln_multiple/aln_scoring.hpp>
  52. USING_SCOPE(ncbi);   //using namespace ncbi;
  53. USING_SCOPE(objects);
  54. static const int kColorGradNumber = 32; /// number of gradient colors in alignment
  55. class CAlnMultiCGIException : public CException
  56. {
  57. public:
  58. enum EErrCode {
  59. eInvalidAccession,
  60. eCannotLoadBioseq,
  61. eInvalidVisibleRange,
  62. eInvalidAnchor
  63. };
  64. virtual const char* GetErrCodeString(void) const
  65. {
  66. switch(GetErrCode()) {
  67. case eInvalidAccession: return "eInvalidException";
  68. case eCannotLoadBioseq: return "eCannotLoadBioseq";
  69. case eInvalidVisibleRange: return "eInvalidVisibleRange";
  70. case eInvalidAnchor: return "eInvalidAnchor";
  71. default: return CException::GetErrCodeString();
  72. };
  73. }
  74. NCBI_EXCEPTION_DEFAULT(CAlnMultiCGIException, CException);
  75. };
  76. /////////////////////////////////////////////////////////////////////////////
  77. //  CAlnMultiCGIApplication::
  78. //
  79. class CAlnMultiCGIApplication : public CGlCgiImageApplication
  80. {
  81. public:
  82.     CAlnMultiCGIApplication();
  83.     virtual void Render(CCgiContext& ctx);
  84. protected:
  85. virtual void x_PreProcess(CCgiContext& ctx);
  86. private:
  87. CRef<CObjectManager>  m_ObjMgr;
  88.    CRef<CScope>  m_Scope;
  89. CBioseq_Handle   m_Handle;
  90. // Renderer setup
  91.     CRowStyleCatalog    m_StyleCatalog;
  92.     CAlnVecMultiDataSource m_DataSource;
  93.     CAlnVecMultiModel   m_Model;
  94.     CAlnMultiRenderer   m_Renderer;
  95. //parameter 
  96. int m_Start, m_Stop;
  97. };
  98. CAlnMultiCGIApplication::CAlnMultiCGIApplication()
  99. : m_Renderer(TVPRect(0, 0, m_Width, m_Height))
  100. {
  101.     //setup ?
  102. }
  103. //extracting arguments, verifying and loading data
  104. void CAlnMultiCGIApplication::x_PreProcess(CCgiContext& ctx)
  105. {
  106. SetEnvironment("NCBI_SERVICE_NAME_ID1",  "ID1LXA");
  107. // retrieve our CGI rendering params
  108.     const CCgiRequest& request  = ctx.GetRequest();
  109.     const TCgiEntries& entries = request.GetEntries();
  110. m_Start = m_Stop = -1;
  111. TCgiEntries::const_iterator it_acc = entries.find("acc");
  112. TCgiEntries::const_iterator it_start = entries.find("start");
  113. TCgiEntries::const_iterator it_stop = entries.find("stop");
  114. TCgiEntries::const_iterator it_anchor = entries.find("anchor");
  115. if(it_acc == entries.end()) {
  116. NCBI_THROW(CAlnMultiCGIException, eInvalidAccession, "Accession is not specified.");
  117. } else {
  118. string s = "Accession: " + it_acc->second;
  119. LOG_POST(s);
  120. //extract other parameters
  121. if(it_start != entries.end()  &&  it_start->second.size()) {
  122. m_Start = NStr::StringToInt(it_start->second);
  123. }
  124. if(it_stop != entries.end()  &&  it_stop->second.size()) {
  125. m_Stop = NStr::StringToInt(it_stop->second);
  126. }
  127.      m_ObjMgr.Reset(new CObjectManager());
  128.      m_ObjMgr->RegisterDataLoader(*new CGBDataLoader(), 
  129.                                      CObjectManager::eDefault);
  130.      m_Scope.Reset(new CScope(*m_ObjMgr));
  131.      m_Scope->AddDefaults();
  132. CSeq_id id(it_acc->second);
  133.      m_Handle = m_Scope->GetBioseqHandle(id);
  134. if(m_Handle) { // setup data source and visible range
  135. m_DataSource.Init(m_Handle, m_Scope.GetObject());    
  136. // attempt to set anchor
  137. if(it_anchor != entries.end()  &&  it_anchor->second.size()) { 
  138. CSeq_id anchor_id(it_anchor->second);
  139. bool b_set = false;
  140. CAlnVec::TNumrow n_rows = m_DataSource.GetNumRows();
  141. for( CAlnVec::TNumrow row = 0;  row < n_rows  &&  ! b_set;  row++ ) {
  142. const CBioseq_Handle& row_handle = m_DataSource.GetBioseqHandle(row);
  143. if(row_handle.GetSeqId()->Match(anchor_id)) {
  144. m_DataSource.SetAnchor(row);
  145. b_set = true;
  146. }
  147. }
  148. if(! b_set) {
  149. NCBI_THROW(CAlnMultiCGIException, eInvalidAnchor,
  150. "Anchor accession is invalid."); 
  151. }
  152. }
  153. //calculate visible range
  154. int aln_start = m_DataSource.GetAlnStart();
  155. int aln_stop = m_DataSource.GetAlnStop();
  156. if(m_Start > -1) {
  157. if(m_Start < 0  ||  m_Start > aln_stop) {
  158. NCBI_THROW(CAlnMultiCGIException, eInvalidVisibleRange, 
  159.    "Visible start out of range.");
  160. }
  161. } else m_Start = aln_start;
  162. if(m_Stop > -1) {
  163. if(m_Stop < 0  ||  m_Stop > aln_stop) {
  164. NCBI_THROW(CAlnMultiCGIException, eInvalidVisibleRange,
  165. "Visible end out of range.");
  166. }
  167. } else m_Stop = aln_stop;
  168. //setup model
  169.          m_StyleCatalog.SetDefaultStyle(new CAlnVecRowDisplayStyle());
  170.      m_StyleCatalog.SetWidgetStyle(m_Model.GetDisplayStyle());
  171. m_Model.EnableScoring(false);
  172.      m_Model.SetStyleCatalog(&m_StyleCatalog);
  173.          m_Model.SetDataSource(&m_DataSource);
  174. m_Renderer.SetContext(&m_Model);
  175. TModelRect rc_vis = m_Model.GetAlignPort().GetModelLimitsRect();
  176. size_t h = (size_t) -rc_vis.Height();
  177. m_Height = min(m_Height, h);
  178. }
  179.      else {
  180.    string msg = "Cannot load Bioseq for accession "";
  181.    msg += it_acc->second;
  182.    msg += """;
  183.    NCBI_THROW(CAlnMultiCGIException, eCannotLoadBioseq, msg.c_str());
  184.    }
  185. }
  186. }
  187. void CAlnMultiCGIApplication::Render(CCgiContext& ctx)
  188. {
  189.     if(m_Handle)  {
  190. m_Renderer.Resize(TVPRect(0, 0, m_Width, m_Height));
  191. //adjus visible space
  192. CGlPane& port = m_Model.GetAlignPort();
  193.         port.SetViewport(TVPRect(0, 0, m_Width, m_Height)); ///### this have to be eliminated
  194.         port.ZoomAll();
  195. // adjust visible range
  196. TModelRect rc_vis = port.GetVisibleRect();
  197. rc_vis.SetHorz(m_Start, m_Stop + 1);
  198. port.SetVisibleRect(rc_vis);
  199.         m_Renderer.Render();
  200.     }
  201. //debugging trick
  202.     //CImageIO::WriteImage(m_Context->GetBuffer(), "test.png", m_Format);
  203. }
  204. /////////////////////////////////////////////////////////////////////////////
  205. //  MAIN
  206. //
  207. int main(int argc, const char* argv[])
  208. {
  209.     int result = CAlnMultiCGIApplication().AppMain(argc, argv, 0, eDS_Default, 0);
  210.     _TRACE("back to normal diags");
  211.     return result;
  212. }
  213. /*
  214.  * ===========================================================================
  215.  * $Log: aln_multi_cgi.cpp,v $
  216.  * Revision 1000.1  2004/06/01 21:07:35  gouriano
  217.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  218.  *
  219.  * Revision 1.4  2004/05/21 22:27:52  gorelenk
  220.  * Added PCH ncbi_pch.hpp
  221.  *
  222.  * Revision 1.3  2004/03/26 16:51:09  yazhuk
  223.  * Disabled scoring
  224.  *
  225.  * Revision 1.2  2004/03/22 19:23:44  yazhuk
  226.  * Implemented argumnent handling; error handling; image size adjustment
  227.  *
  228.  * ===========================================================================
  229.  */