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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: aln_scoring.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 21:07:04  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.11
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: aln_scoring.cpp,v 1000.3 2004/06/01 21:07:04 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:  Andrey Yazhuk
  35.  */
  36. #include <ncbi_pch.hpp>
  37. #include <gui/widgets/aln_multiple/alnmulti_settings.hpp>
  38. #include <gui/widgets/aln_multiple/aln_scoring.hpp>
  39. #include <math.h>
  40. #include <stdio.h>
  41. BEGIN_NCBI_SCOPE
  42. USING_SCOPE(objects);
  43. CSimpleScoringMethod::CSimpleScoringMethod()
  44. : m_Space(0), m_Gap(0)
  45. {
  46.     m_vCharCounts.resize(256);
  47.     SetOptions(fIgnoreEmptySpace /*| fIgnoreGaps*/);
  48. }
  49. CSimpleScoringMethod::~CSimpleScoringMethod()
  50. {
  51. }
  52. void    CSimpleScoringMethod::SetOptions(int options)
  53. {
  54.     m_Options = options;
  55.     m_Space = (m_Options & fIgnoreEmptySpace) ? ' ' : 0;
  56.     m_Gap = (m_Options & fIgnoreGaps) ? '-' : 0;
  57. }
  58. void    CSimpleScoringMethod::CreateColorTable(int size)
  59. {
  60.     m_vColors.resize(size);
  61.     float K = 1.0f / (size - 1);
  62.     // unperfect agreement - gradient red
  63.     for( int i = 0;  i < size - 1;  i++ ) {
  64.         float score = i * K;
  65.         float gray = score * 0.8f;
  66.         m_vColors[i] =  CGlColor(1.0f, gray, gray);        
  67.     }
  68.     m_vColors[size - 1] = CGlColor(0.9f, 0.9f, 0.9f); // perefect agreement - light gray       
  69. }
  70. string  CSimpleScoringMethod::GetName()
  71. {
  72.     return "Strict column agreement";
  73. }
  74. void    CSimpleScoringMethod::CalculateScores(char cons, const string& column,
  75.                                      TScore& col_score, TScoreVector& scores)
  76. {
  77.     _ASSERT(scores.size() == column.size()  &&  m_vCharCounts.size()  == 256);
  78.     
  79.     // reset histogram
  80.     size_t space_n = 0;   
  81.     fill(m_vCharCounts.begin(), m_vCharCounts.end(), 0);
  82.     
  83.     // calculate histogram
  84.     ITERATE(string, it, column) {
  85.         char c = *it;
  86.         if(c != m_Space  &&  c != m_Gap)  {
  87.             ++m_vCharCounts[(size_t) c];    
  88.         } else {
  89.             space_n++;
  90.         }
  91.     }    
  92.     
  93.     // calculate column score 
  94.     /*int max_count = 0, sum = 0;
  95.     for( int i = 0; i < 256; i++ )  { // ### performance
  96.         int n = m_vCharCounts[i];
  97.         if(n) {
  98.             sum += n * n;
  99.             max_count = max(n, max_count);
  100.         }
  101.     } */  
  102.     size_t total = column.size() - space_n;
  103.     //col_score = sqrt((TScore)sum) / total;
  104.     col_score = 0.0; //###
  105.     
  106.     // calculate individual scores    
  107.     for( size_t i = 0; i < column.size(); i++  )  {
  108.         char c = column[i];
  109.         if(c != m_Space  &&  c != m_Gap)  {
  110.             scores[i] = ((TScore) m_vCharCounts[(size_t) c]) / total;
  111.         } else  {
  112.             scores[i] = 1.0;            
  113.         }
  114.     }    
  115. }
  116. string  CSNPScoringMethod::GetName()
  117. {
  118.     return "SNP Highlighting";
  119. }
  120. void    CSNPScoringMethod::CalculateScores(char cons, const string& column,
  121.                                      TScore& col_score, TScoreVector& scores)
  122. {
  123.     _ASSERT(scores.size() == column.size());
  124.     
  125.     for( size_t i = 0; i < column.size(); i++  )  {
  126.         char c = column[i];
  127.         if(c != m_Space  &&  c != m_Gap)  {
  128.             scores[i] = (c == cons) ? 1.0 : 0.0;
  129.         } else {
  130.             scores[i] = 1.0;            
  131.         }
  132.     }    
  133. }
  134. const CGlColor& CSimpleScoringMethod::GetColorForScore(TScore score) const
  135. {
  136.     _ASSERT(m_vColors.size());
  137.     size_t ind = (size_t) floor(score * m_vColors.size());
  138.     if(ind == m_vColors.size())
  139.         --ind;
  140.     return m_vColors[ind];
  141. }
  142. CScoreCache::CScoreCache()
  143. : m_pAlnVec(NULL),
  144.   m_pMethod(NULL),
  145.   m_GradNumber(16)
  146. {    
  147. }
  148.     
  149. void    CScoreCache::SetGradNumber(int grad_n)
  150. {
  151.     _ASSERT(grad_n > 1  && grad_n <= 0xFFFF); 
  152.     m_GradNumber = grad_n;
  153. }
  154. void    CScoreCache::SetScoringMethod(IScoringMethod *method)
  155. {
  156.     m_pMethod = method;
  157. }
  158. IScoringMethod*    CScoreCache::GetScoringMethod()
  159. {
  160.     return m_pMethod;
  161. }
  162. const IScoringMethod*    CScoreCache::GetScoringMethod() const
  163. {
  164.     return m_pMethod;
  165. }
  166. void CScoreCache::SetAlnVec(const CAlnVec* aln_vec)
  167. {
  168.     m_pAlnVec = aln_vec;
  169. }
  170. /// Calculates scores for the given CAlnVec object and saves results in form of
  171. /// TScoreColl objects.
  172. void CScoreCache::CalculateScores()
  173. {
  174.     _ASSERT(m_pAlnVec);
  175.     _ASSERT(m_pMethod);
  176.     CStopWatch sw;
  177.     sw.Start();
  178.     TSeqPos start = m_pAlnVec->GetAlnStart();
  179.     TSeqPos stop = m_pAlnVec->GetAlnStop();
  180.     TNumrow row_n = m_pAlnVec->GetNumRows();
  181.     // preparing score collections
  182.     m_vScoreColls.resize(row_n);
  183.     NON_CONST_ITERATE(TScoreCollVector, itC, m_vScoreColls)  {
  184.         itC->SetFrom(start); // clear and initialize
  185.     }        
  186.     string column(row_n, '');
  187.     TScore col_score = 0;
  188.     TScoreVector v_col_scores(row_n, 0.0f);
  189.     const TSeqPos kPageSize = 256;
  190.     x_AllocBuffer(kPageSize);
  191.     
  192.     TScore grad_n = m_GradNumber;
  193.     TNumrow cons_row = m_pAlnVec->GetAnchor();
  194.     // iterate from "start" to "stop" using "sliding buffer"
  195.     for( TSeqPos pos = start;  pos < stop; )    {    
  196.         
  197.         TSeqPos pos_stop = min(pos + kPageSize -1, stop);
  198.         x_UpdateBuffer(pos, pos_stop); // fetch next page in Seq Buffer
  199.         for( TSeqPos p = pos;  p <= pos_stop ;  p++ )    { // for each column
  200.             x_BufferGetColumn(p, column);
  201.             char cons = (cons_row > -1) ? column[cons_row] : 0;
  202.             m_pMethod->CalculateScores(cons, column, col_score, v_col_scores);
  203.             
  204.             // append scores to collections
  205.             for(TNumrow r = 0;  r < row_n;  r++ )  {
  206.                 TScore sc = v_col_scores[r];
  207.                 sc = ((int) (sc * grad_n)) / grad_n;
  208.                 m_vScoreColls[r].push_back(sc);
  209.             }
  210.         }
  211.         pos = pos_stop + 1;
  212.     }
  213.     int total_int = 0;
  214.     NON_CONST_ITERATE(TScoreCollVector, itC, m_vScoreColls)  {
  215.         total_int += itC->size();
  216.     }        
  217.     char s[128];
  218.     sprintf(s, "CScoreCache::CalculateScores() - total rows - %d intervals %d", row_n, total_int);
  219.     LOG_POST(s);
  220.     
  221.     CAlnMultiUtils::ReportElapced("CScoreCache::CalculateScores()", sw);
  222. }
  223. const CScoreCache::TScoreColl&   CScoreCache::GetScores(TNumrow row) const
  224. {
  225.     _ASSERT(row >= 0  && row < (TNumrow) m_vScoreColls.size());
  226.     return m_vScoreColls[row];
  227. }
  228. ///////////////////////////////////////////////////////////////////////////////
  229. /// Sequence buffer management routins
  230. inline char CScoreCache::x_BufferGetSeq(TSeqPos pos, TNumrow row) const
  231. {
  232.     _ASSERT(pos >= m_BufferStart  &&  pos < m_BufferStart + m_RowLength);
  233.     _ASSERT(row >= 0  &&  row < (TNumrow) m_vRows.size());
  234.     return m_vRows[row][pos - m_BufferStart];
  235. }
  236. void CScoreCache::x_AllocBuffer(TSeqPos row_len)
  237. {
  238.     _ASSERT(m_pAlnVec);
  239.     int rows_n = m_pAlnVec->GetNumRows();
  240.     if(rows_n != (TNumrow) m_vRows.size()  ||  m_RowLength != row_len)    {
  241.         m_RowLength = row_len;
  242.     
  243.         m_vRows.resize(rows_n);
  244.         NON_CONST_ITERATE(vector<string>, itR, m_vRows)   {
  245.             itR->resize(m_RowLength);
  246.         }    
  247.     }
  248. }
  249. void CScoreCache::x_FreeBuffer()
  250. {
  251.     m_vRows.clear();
  252. }
  253. void CScoreCache::x_UpdateBuffer(TSeqPos start, TSeqPos stop)
  254. {
  255.     _ASSERT(m_pAlnVec);
  256.     _ASSERT( (stop - start + 1) <= m_RowLength);
  257.     
  258.     m_BufferStart = start;
  259.     CAlnVec::TSignedRange   range(start, stop);
  260.     TNumrow row_n = (TNumrow) m_vRows.size();
  261.     for( TNumrow r = 0;  r < row_n; r++ )  {
  262.         m_pAlnVec->GetAlnSeqString(m_vRows[r], r, range);      
  263.     }
  264. }
  265. void CScoreCache::x_BufferGetColumn(TSeqPos pos, string& column) const
  266. {
  267.     _ASSERT(pos >= m_BufferStart  && pos < m_BufferStart + m_RowLength);
  268.     
  269.     size_t col = pos - m_BufferStart;
  270.     for(size_t row = 0; row < m_vRows.size(); row++ )   {
  271.        column[row] = m_vRows[row][col]; 
  272.     }
  273. }
  274. END_NCBI_SCOPE
  275. /*
  276.  * ===========================================================================
  277.  * $Log: aln_scoring.cpp,v $
  278.  * Revision 1000.3  2004/06/01 21:07:04  gouriano
  279.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.11
  280.  *
  281.  * Revision 1.11  2004/05/21 22:27:52  gorelenk
  282.  * Added PCH ncbi_pch.hpp
  283.  *
  284.  * Revision 1.10  2004/04/02 16:38:11  yazhuk
  285.  * Added to CSimpleScoringMethod options for ignoring empty space and gaps;
  286.  * Added CSNPScoringMethod .
  287.  *
  288.  * Revision 1.9  2004/03/18 17:09:03  yazhuk
  289.  * Added GetScoringMethod()
  290.  *
  291.  * Revision 1.8  2004/02/18 02:16:21  ucko
  292.  * Tweak to avoid trying to invoke sqrt on an int.
  293.  *
  294.  * Revision 1.7  2004/02/17 15:20:51  yazhuk
  295.  * Optimized scores calculation
  296.  *
  297.  * Revision 1.6  2004/02/11 17:43:09  yazhuk
  298.  * Implemented GetName(); added comments
  299.  *
  300.  * Revision 1.5  2004/02/11 15:27:42  yazhuk
  301.  * Changed color table generation
  302.  *
  303.  * Revision 1.4  2003/11/14 15:45:48  ucko
  304.  * Likewise fix initialization of v_col_scores in
  305.  * CScoreCache::CalculateScores for Compaq's compiler.
  306.  * Qualify method names in previous log messages.
  307.  *
  308.  * Revision 1.3  2003/11/14 13:10:14  ucko
  309.  * Tweak constructor of vCounts in CSimpleScoringMethod::CalculateScores
  310.  * for Compaq's compiler.
  311.  *
  312.  * Revision 1.2  2003/10/11 18:20:34  ucko
  313.  * Fixes for GCC 2.95: #include <stdio.h> for sprintf(); tweak constr. of
  314.  * column in CScoreCache::CalculateScores to avoid triggering an inappropriate
  315.  * template.
  316.  *
  317.  * Revision 1.1  2003/10/10 19:06:25  yazhuk
  318.  * Initial revision
  319.  *
  320.  * ===========================================================================
  321.  */