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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: splign_util.cpp,v $
  4.  * PRODUCTION Revision 1000.0  2004/06/01 18:13:08  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.8
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: splign_util.cpp,v 1000.0 2004/06/01 18:13:08 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:  Yuri Kapustin
  35. *
  36. * File Description:  Helper functions
  37. *                   
  38. * ===========================================================================
  39. */
  40. #include <ncbi_pch.hpp>
  41. #include "splign_util.hpp"
  42. #include "splign_hitparser.hpp"
  43. #include <algo/align/align_exception.hpp>
  44. #include <algorithm>
  45. #include <math.h>
  46. BEGIN_NCBI_SCOPE
  47. #ifdef GENOME_PIPELINE
  48. CInfTable::CInfTable(size_t cols): m_cols(cols)
  49. {
  50.   m_data.resize(m_cols, 0);
  51. }
  52. size_t CInfTable::Load(const string& filename)
  53. {
  54.   ifstream ifs (filename.c_str());
  55.   size_t read = 0;
  56.   char line [1024];
  57.   while(ifs) {
  58.     line[0] = 0;
  59.     ifs.getline(line, sizeof line, 'n');
  60.     if(line[0]) {
  61.       if(line[0] != '#') {
  62. if(!x_ReadColumns(line)) {
  63.   return 0;
  64. }
  65. string accession;
  66. SInfo info;
  67. bool parsed = x_ParseLine(line, accession, info);
  68. if(!parsed) {
  69.   return 0;
  70. }
  71. m_map[accession] = info;
  72. ++read;
  73.       }
  74.     }
  75.   }
  76.   return read;
  77. }
  78. bool CInfTable::x_ReadColumns(char* line)
  79. {
  80.   char* p0 = line;
  81.   char* pe = p0 + strlen(line);
  82.   char* p = p0;
  83.   for(size_t i = 0; i < m_cols; ++i) {
  84.     p = find(p0, pe, 't');
  85.     if(i+1 < m_cols && p == pe) {
  86.       return false;
  87.     }
  88.     m_data[i] = p0;
  89.     *p = 0;
  90.     p0 = p + 1;
  91.   }
  92.   return true;
  93. }
  94. bool CInfTable::GetInfo(const string& id, SInfo& info) {
  95.   map<string, SInfo>::const_iterator ii = m_map.find(id);
  96.   if(ii != m_map.end()) {
  97.     info = ii->second;
  98.     return true;
  99.   }
  100.   return false;
  101. }
  102. bool CInf_mRna::x_ParseLine (const char* line,
  103.      string& accession, SInfo& info)
  104. {
  105.   if(!line || !*line) {
  106.     return false;
  107.   }
  108.   accession = x_GetCol(0);
  109.   const char* buf_size = x_GetCol(2);
  110.   sscanf(buf_size, "%d", &info.m_size);
  111.   const char* buf = x_GetCol(3);
  112.   SInfo::EStrand strand = SInfo::ePlus;
  113.   if(buf[0]=='m') {
  114.     strand = SInfo::eMinus;
  115.   }
  116.   buf = x_GetCol(4);
  117.   if(buf[0] != '-') {
  118.     char c;
  119.     sscanf(buf, "%d,%d%c",
  120.    &info.m_polya_start,
  121.    &info.m_polya_end,
  122.    &c);
  123.     if(c == 'm') {
  124.       strand = SInfo::eMinus;
  125.     }
  126.   }
  127.   buf = x_GetCol(9);
  128.   if(strcmp(buf, "wrong_strand") == 0) {
  129.     strand = SInfo::eUnknown;
  130.   }
  131.   info.m_strand = strand;
  132.   return true;
  133. }
  134. bool CInf_EST::x_ParseLine (const char* line, string& accession, SInfo& info)
  135. {
  136.   if(!line || !*line) {
  137.     return false;
  138.   }
  139.   accession = x_GetCol(0);
  140.   const char* buf = x_GetCol(3);
  141.   switch(buf[0]) {
  142.       case '5': info.m_strand = SInfo::ePlus;    break;
  143.       case '3': info.m_strand = SInfo::eMinus;   break;
  144.       default:  info.m_strand = SInfo::eUnknown; break;
  145.   }
  146.   buf = x_GetCol(6);
  147.   if(buf[0] != '-') {
  148.     char c;
  149.     sscanf(buf, "%d,%d%c",
  150.    &info.m_polya_start,
  151.    &info.m_polya_end,
  152.    &c);
  153.     if(c == 'm' && info.m_strand == SInfo::ePlus ||
  154.        c == 'p' && info.m_strand == SInfo::eMinus) {
  155.       info.m_strand = SInfo::eUnknown;
  156.     }
  157.   }
  158.   return true;
  159. }
  160. #endif // GENOME_PIPELINE
  161. bool IsConsensus(const char* donor, const char* acceptor)
  162. {
  163.   return donor && acceptor &&
  164.     (donor[0] == 'G' && (donor[1] == 'C' || donor[1] == 'T'))
  165.     &&
  166.     (acceptor[0] == 'A' && acceptor[1] == 'G');
  167. }
  168. void CleaveOffByTail(vector<CHit>* hits, size_t polya_start)
  169. {
  170.   const size_t hit_dim = hits->size();
  171.   vector<size_t> vdel;
  172.   for(size_t i = 0; i < hit_dim; ++i) {
  173.     CHit& hit = (*hits)[i];
  174.     if(size_t(hit.m_ai[0]) >= polya_start) {
  175.       vdel.push_back(i);
  176.     }
  177.     else if(size_t(hit.m_ai[1]) >= polya_start) {
  178.       hit.Move(1, polya_start-1, false);
  179.       if(hit.IsConsistent() == false) {
  180. vdel.push_back(i);
  181.       }
  182.     }
  183.   }
  184.   const size_t del_dim = vdel.size();
  185.   if(del_dim > 0) {
  186.     for( size_t i = 0, j = 0, k = 0; j < hit_dim; ) {
  187.       if(k < del_dim && j == vdel[k]) {
  188. ++k;
  189. ++j;
  190.       }
  191.       else if(i < j) {
  192. (*hits)[i++] = (*hits)[j++];
  193.       }
  194.       else { // i == j
  195. ++i; ++j;
  196.       }
  197.     }
  198.     hits->resize(hit_dim - del_dim);
  199.   }
  200. }
  201. void XFilter(vector<CHit>* hits) 
  202. {
  203.   if(hits->size() == 0) return;
  204.   int group_id = 0;
  205.   CHitParser hp (*hits, group_id);
  206.   hp.m_Strand = CHitParser::eStrand_Both;
  207.   hp.m_SameOrder = false;
  208.   hp.m_Method = CHitParser::eMethod_MaxScore;
  209.   hp.m_CombinationProximity_pre  = -1;
  210.   hp.m_CombinationProximity_post = -1;
  211.   hp.m_MinQueryCoverage = 0;
  212.   hp.m_MinSubjCoverage = 0;
  213.   hp.m_MaxHitDistQ = kMax_Int;
  214.   hp.m_MaxHitDistS = kMax_Int;
  215.   hp.m_Prot2Nucl = false;
  216.   hp.m_SplitQuery = CHitParser::eSplitMode_Clear;
  217.   hp.m_SplitSubject = CHitParser::eSplitMode_Clear;
  218.   hp.m_group_identification_method = CHitParser::eNone;
  219.   hp.m_Query = (*hits)[0].m_Query;
  220.   hp.m_Subj =  (*hits)[0].m_Subj;
  221.   
  222.   hp.Run( CHitParser::eMode_Normal );
  223.   *hits = hp.m_Out;
  224. }
  225. void GetHitsMinMax(const vector<CHit>& vh,
  226.    size_t* qmin, size_t* qmax,
  227.    size_t* smin, size_t* smax)
  228. {
  229.   const size_t hit_dim = vh.size();
  230.   
  231.   *qmin = kMax_UInt, *qmax = 0;
  232.   *smin = *qmin, *smax = *qmax;
  233.   
  234.   for(size_t i = 0; i < hit_dim; ++i) {
  235.     if(size_t(vh[i].m_ai[0]) < *qmin)
  236.       *qmin = vh[i].m_ai[0];
  237.     if(size_t(vh[i].m_ai[1]) > *qmax)
  238.       *qmax = vh[i].m_ai[1];
  239.     if(size_t(vh[i].m_ai[2]) < *smin)
  240.       *smin = vh[i].m_ai[2];
  241.     if(size_t(vh[i].m_ai[3]) > *smax)
  242.       *smax = vh[i].m_ai[3];
  243.   }
  244. }
  245. // apply run-length encoding
  246. string RLE(const string& in)
  247. {
  248.   string out;
  249.   const size_t dim = in.size();
  250.   if(dim == 0) {
  251.     return kEmptyStr;
  252.   }
  253.   const char* p = in.c_str();
  254.   char c0 = p[0];
  255.   out.append(1, c0);
  256.   size_t count = 1;
  257.   for(size_t k = 1; k < dim; ++k) {
  258.     char c = p[k];
  259.     if(c != c0) {
  260.       c0 = c;
  261.       if(count > 1) {
  262.         out += NStr::IntToString(count);
  263.       }
  264.       count = 1;
  265.       out.append(1, c0);
  266.     }
  267.     else {
  268.       ++count;
  269.     }
  270.   }
  271.   if(count > 1) {
  272.     out += NStr::IntToString(count);
  273.   }
  274.   return out;
  275. }
  276. CNWAligner::TScore ScoreByTranscript(const CNWAligner& aligner,
  277.      const char* transcript)
  278. {
  279.   static const string kBadSymMsg = "Unknown symbol in transcript: ";
  280.   const int Wg  = aligner.GetWg();
  281.   const int Ws  = aligner.GetWs();
  282.   const int Wm  = aligner.GetWm();
  283.   const int Wms = aligner.GetWms();
  284.   const size_t dim = strlen(transcript);
  285.   if(dim == 0) return 0;
  286.   CNWAligner::TScore score = 0;
  287.   char state1, state2;
  288.   switch(transcript[0]) {
  289.     case 'M':
  290.     case 'R':  state1 = state2 = 0;
  291.     break;
  292.     case 'I':  state1 = 1; state2 = 0; score += Wg;
  293.     break;
  294.     case 'D':  state1 = 0; state2 = 1; score += Wg;
  295.     break;
  296.     default:
  297.       NCBI_THROW(CAlgoAlignException, eInternal, kBadSymMsg + transcript[0]);
  298.   }
  299.   for(size_t i = 0; i < dim; ++i) {
  300.     switch(transcript[i]) {
  301.       case 'M': {
  302.         state1 = state2 = 0;
  303.         score += Wm;
  304.       }
  305.       break;
  306.       case 'R': {
  307.         state1 = state2 = 0;
  308.         score += Wms;
  309.       }
  310.       break;
  311.       case 'I': {
  312.         if(state1 != 1) score += Wg;
  313.         state1 = 1; state2 = 0;
  314.         score += Ws;
  315.       }
  316.       break;
  317.       case 'D': {
  318.         if(state2 != 1) score += Wg;
  319.         state1 = 0; state2 = 1;
  320.         score += Ws;
  321.       }
  322.       break;
  323.       default:
  324.         NCBI_THROW(CAlgoAlignException, eInternal, kBadSymMsg + transcript[i]);
  325.     }
  326.   }
  327.   return score;
  328. }
  329. END_NCBI_SCOPE
  330. /*
  331.  * ===========================================================================
  332.  *
  333.  * $Log: splign_util.cpp,v $
  334.  * Revision 1000.0  2004/06/01 18:13:08  gouriano
  335.  * PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.8
  336.  *
  337.  * Revision 1.8  2004/05/24 16:13:57  gorelenk
  338.  * Added PCH ncbi_pch.hpp
  339.  *
  340.  * Revision 1.7  2004/05/17 14:50:57  kapustin
  341.  * Add/remove/rearrange some includes and object declarations
  342.  *
  343.  * Revision 1.6  2004/04/23 20:33:32  ucko
  344.  * Fix remaining use of sprintf.
  345.  *
  346.  * Revision 1.5  2004/04/23 18:43:58  ucko
  347.  * <cmath> -> <math.h>, since some older compilers (MIPSpro) lack the wrappers.
  348.  *
  349.  * Revision 1.4  2004/04/23 16:50:48  kapustin
  350.  * sprintf->CNcbiOstrstream
  351.  *
  352.  * Revision 1.3  2004/04/23 14:37:44  kapustin
  353.  * *** empty log message ***
  354.  *
  355.  *
  356.  * ===========================================================================
  357.  */