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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: splign_hit.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2004/06/01 18:11:28  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef ALGO_ALIGN_SPLIGN_HIT__HPP
  10. #define ALGO_ALIGN_SPLIGN_HIT__HPP
  11. /* $Id: splign_hit.hpp,v 1000.0 2004/06/01 18:11:28 gouriano Exp $
  12. * ===========================================================================
  13. *
  14. *                            public DOMAIN NOTICE                          
  15. *               National Center for Biotechnology Information
  16. *                                                                          
  17. *  This software/database is a "United States Government Work" under the   
  18. *  terms of the United States Copyright Act.  It was written as part of    
  19. *  the author's official duties as a United States Government employee and 
  20. *  thus cannot be copyrighted.  This software/database is freely available 
  21. *  to the public for use. The National Library of Medicine and the U.S.    
  22. *  Government have not placed any restriction on its use or reproduction.  
  23. *                                                                          
  24. *  Although all reasonable efforts have been taken to ensure the accuracy  
  25. *  and reliability of the software and data, the NLM and the U.S.          
  26. *  Government do not and cannot warrant the performance or results that    
  27. *  may be obtained by using this software or data. The NLM and the U.S.    
  28. *  Government disclaim all warranties, express or implied, including       
  29. *  warranties of performance, merchantability or fitness for any particular
  30. *  purpose.                                                                
  31. *                                                                          
  32. *  Please cite the author in any work or product based on this material.   
  33. *
  34. * ===========================================================================
  35. *
  36. * Author:  Yuri Kapustin
  37. *
  38. * File Description:
  39. *   Temporary code - will be part of the hit filtering library
  40. *
  41. */
  42. #include <corelib/ncbistd.hpp>
  43. BEGIN_NCBI_SCOPE
  44. BEGIN_SCOPE(objects)
  45.     class CSeq_align;
  46. END_SCOPE(objects)
  47. // single hit representation
  48. class NCBI_XALGOALIGN_EXPORT CHit
  49. {
  50. public:
  51.     string m_Query, m_Subj;       // query and subject strings
  52.     double m_Idnty;               // percent of identity
  53.     int m_Length;           // length of alignment, as in source row
  54.     int m_anLength[2];            // real length of the hit at q and s parts
  55.     int m_MM;                   // the number of mistmatches
  56.     int m_Gaps;                   // the number of gap openings
  57.     int m_an [4];                 // q[uery]s[tart], qf[inish], s[ubj]s, sf
  58.     int m_ai [4];                 // query min, query max, subj min, subj max
  59.     double m_Value;               // e-Value
  60.     double m_Score;               // bit score
  61.     int m_GroupID;                // group id
  62.     int m_MaxDistClustID;         // clust group id
  63.     CHit();
  64.     CHit(const string&);
  65.     CHit(const objects::CSeq_align&);
  66.     CHit(const CHit&,const CHit&);
  67.     virtual ~CHit() {}
  68.     void Move(unsigned char corner, int new_pos, bool prot2nucl);
  69.     void UpdateAttributes();
  70.     bool Inside(const CHit&) const;
  71.     bool IsConsistent() const;
  72.     bool IsStraight() const {
  73.         return m_an[2] <= m_an[3];
  74.     }
  75.     bool operator < (const CHit& h) const {
  76.         return m_Score < h.m_Score;
  77.     }
  78.     bool operator > (const CHit& h) const {
  79.         return m_Score > h.m_Score;
  80.     }
  81.     
  82.     bool operator == (const CHit& h) const {
  83.         return m_Score == h.m_Score;
  84.     }
  85.     friend NCBI_XALGOALIGN_EXPORT
  86.     ostream& operator << (ostream&, const CHit&);
  87.     unsigned CalcSize() {
  88.         return sizeof(CHit) + m_Query.size() + m_Subj.size();
  89.     }
  90.     static bool PGreaterScore_ptr (const CHit* ph1, const CHit* ph2) {
  91.         if(!ph1) return ph2 == 0;
  92.         if(!ph2) return ph1 == 0;
  93.         return *ph1 > *ph2;
  94.     };
  95.     static bool PLessScore_ptr (const CHit* ph1, const CHit* ph2) {
  96.         if(!ph1) return ph2 == 0;
  97.         if(!ph2) return ph1 == 0;
  98.         return *ph1 < *ph2;
  99.     };
  100.     static bool PPrecedeStrand (const CHit& h1, const CHit& h2) {
  101.         return h1.IsStraight() < h2.IsStraight();
  102.     }
  103.     static bool PPrecedeStrand_ptr (const CHit* ph1, const CHit* ph2) {
  104.         if(!ph1) return ph2 == 0;
  105.         if(!ph2) return ph1 == 0;
  106.         return ph1->IsStraight() < ph2->IsStraight();
  107.     }
  108.     static bool PSubj_Score_ptr (const CHit* ph1, const CHit* ph2) {
  109.       if(ph1->m_ai[2] < ph2->m_ai[2]) {
  110.         return true;
  111.       }
  112.       else if (ph1->m_ai[2] > ph2->m_ai[2]) {
  113.         return false;
  114.       }
  115.       else {
  116.         return ph1->m_Score > ph2->m_Score;
  117.       }
  118.     }
  119.     static bool PSubjLow_QueryLow_ptr (const CHit* ph1, const CHit* ph2) {
  120.       if(ph1->m_ai[2] < ph2->m_ai[2]) {
  121.         return true;
  122.       }
  123.       else if (ph1->m_ai[2] > ph2->m_ai[2]) {
  124.         return false;
  125.       }
  126.       else {
  127.         return ph1->m_ai[0] < ph2->m_ai[0];
  128.       }
  129.     }
  130.     static bool PQuerySubjSubjCoord (const CHit& h1, const CHit& h2) {
  131.       int cmp = strcmp(h1.m_Query.c_str(), h2.m_Query.c_str());
  132.       if(cmp < 0) return true;
  133.       if(cmp > 0) return false;
  134.       cmp = strcmp(h1.m_Subj.c_str(), h2.m_Subj.c_str());
  135.       if(cmp < 0) return true;
  136.       if(cmp > 0) return false;
  137.       return h1.m_ai[2] < h2.m_ai[2];
  138.     }
  139.     static bool PPrecedeQ (const CHit& h1, const CHit& h2) {
  140.         return h1.m_ai[0] < h2.m_ai[0];
  141.     }
  142.     static bool PPrecedeS (const CHit& h1, const CHit& h2) {
  143.         return h1.m_ai[2] < h2.m_ai[2];
  144.     }
  145.     static bool PPrecedeQ_ptr (const CHit* ph1, const CHit* ph2) {
  146.         return ph1->m_ai[0] < ph2->m_ai[0];
  147.     }
  148.     static bool PPrecedeS_ptr (const CHit* ph1, const CHit* ph2) {
  149.         return ph1->m_ai[2] < ph2->m_ai[2];
  150.     }
  151.     static bool PPrecedeBySeqId (const CHit& h1, const CHit& h2) {
  152.         int nQ = strcmp(h1.m_Query.c_str(), h2.m_Query.c_str());
  153.         if(nQ < 0) return true;
  154.         if(nQ > 0) return false;
  155.         int nS = strcmp(h1.m_Subj.c_str(), h2.m_Subj.c_str());
  156.         if(nS < 0) return true;
  157.         if(nS > 0) return false;
  158.         return false;
  159.     }
  160.     static bool PPrecedeByGroupId (const CHit& h1, const CHit& h2) {
  161.         return h1.m_GroupID <= h2.m_GroupID;
  162.     }
  163.     static int GetHitDistance(const CHit& h1, const CHit& h2, int nWhere);
  164.     void SetEnvelop();
  165.     // function objects used by Max Dist SLC algorithm
  166.     friend class CMaxDistClustPred;
  167.     friend class CMaxDistClIdSet;
  168.     friend class CMaxDistClIdGet;
  169. private:
  170.     void x_InitDefaults();
  171. };
  172. class CHitGroup
  173. {
  174. public:
  175.     int m_nID;
  176.     vector<int>         m_vHits;                  // hit indices
  177.     double              m_dPriority;              // group priority
  178.     const vector<CHit>* m_pHits;                  // hit array pointer 
  179.     double              m_adMidPoint [2];         // group middle point, q & s
  180.     bool operator< (const CHitGroup& rhs) const {
  181.         return m_dPriority < rhs.m_dPriority;  }
  182.     bool CheckSameOrder();
  183.     CHitGroup(const vector<CHit>* ph):
  184.         m_nID(0), m_dPriority(0), m_pHits(ph) {}
  185.     // default constructor only supported for maps
  186.     CHitGroup():
  187.         m_nID(0), m_dPriority(0), m_pHits(0) {}
  188. };
  189. ////////////////////////////////////////////
  190. // auxiliary functional objects
  191. struct hit_groupid_less: public binary_function<CHit, CHit, bool>
  192. {
  193.     bool operator() (const CHit& h1, const CHit& h2) const {
  194.         return h1.m_GroupID < h2.m_GroupID;
  195.     }
  196. };
  197. struct hit_score_less: public binary_function<CHit,double,bool>
  198. {
  199.     bool operator()(const CHit& h, const double& d) const {
  200.         return h.m_Score < d ? true: false;
  201.     }
  202. };
  203. struct hit_greater: public binary_function<CHit,CHit,bool>
  204. {
  205.     bool operator()(const CHit& hm, const CHit& h0) const {
  206.         return hm > h0 ? true: false;
  207.     }
  208. };
  209. struct hit_strand_is: public binary_function<CHit,bool,bool>
  210. {
  211.     bool operator()(const CHit& hm, const bool& b) const {
  212.         return b == hm.IsStraight();
  213.     }
  214. };
  215. struct hit_ptr_strand_is: public binary_function<CHit*, bool, bool>
  216. {
  217.     bool operator()(const CHit* hit, bool strand_plus) const {
  218.         return strand_plus == hit->IsStraight();
  219.     }
  220. };
  221. struct hit_same_order: public binary_function<CHit,CHit,bool>
  222. {
  223.     bool operator()(const CHit& hm, const CHit& h0) const;
  224. };
  225. struct hit_not_same_order: public hit_same_order
  226. {
  227.     bool operator()(const CHit& hm, const CHit& h0) const;
  228. };
  229. struct hit_out_of_group: public binary_function<CHit,int,bool>
  230. {
  231.     bool operator()(const CHit& h, int n) const {
  232.         return h.m_MaxDistClustID != n;
  233.     }
  234. };
  235. class CMaxDistClustPred: public binary_function<CHit, CHit, bool>
  236. {
  237. public:
  238.     CMaxDistClustPred(int m1, int m2): m_MaxQ(m1), m_MaxS(m2) {}
  239.     result_type operator() (const first_argument_type& h1,
  240.     const second_argument_type& h2) const {
  241.         int nHitDistQ = CHit::GetHitDistance(h1, h2, 0);
  242.         int nHitDistS = CHit::GetHitDistance(h1, h2, 1);
  243.         bool b0 = ( 0 <= nHitDistQ && nHitDistQ <= m_MaxQ &&
  244.                     0 <= nHitDistS && nHitDistS <= m_MaxS );
  245.         return b0;
  246.     }
  247. private:
  248.     int m_MaxQ, m_MaxS;
  249. };
  250. class CMaxDistClIdSet: public binary_function<CHit, int, void>
  251. {
  252. public:
  253.     result_type operator() (first_argument_type& h,
  254.     const second_argument_type& i) const {
  255.         h.m_MaxDistClustID = i;
  256.     }
  257. };
  258. class CMaxDistClIdGet: public unary_function<CHit, int>
  259. {
  260. public:
  261.     result_type operator() (const argument_type& h) const {
  262.         return h.m_MaxDistClustID;
  263.     }
  264. };
  265. END_NCBI_SCOPE
  266. #endif