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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: hit_data_adapter.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/12 18:16:40  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.3
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GUI_WIDGETS_HIT_MATRIX___HIT_DATA_ADAPTER__HPP
  10. #define GUI_WIDGETS_HIT_MATRIX___HIT_DATA_ADAPTER__HPP
  11. /*  $Id: hit_data_adapter.hpp,v 1000.1 2004/04/12 18:16:40 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.  * Authors:  Andrey Yazhuk
  37.  *
  38.  * File Description:
  39.  *
  40.  */
  41. #include <corelib/ncbistd.hpp>
  42. #include <objects/seq/Seq_annot.hpp>
  43. #include <objmgr/scope.hpp>
  44. #include <objects/seqloc/Seq_id.hpp>
  45. #include <objmgr/bioseq_handle.hpp>
  46. #include <objects/seqalign/Seq_align_set.hpp>
  47. #include <objects/seqalign/Seq_align.hpp>
  48. #include <objects/seqalign/Dense_seg.hpp>
  49. #include <objects/seqloc/Seq_id.hpp>
  50. #include <objects/seqalign/Score.hpp>
  51. #include <objects/general/Object_id.hpp>
  52. #include <serial/iterator.hpp>
  53. BEGIN_NCBI_SCOPE
  54. USING_SCOPE(objects);
  55. class CHitElemDataAdapter;
  56. /// Wraps a CSeq_align containing CDense_seg and provides a simple API for 
  57. /// interpreting it as a pairwaise alignment of two sequences.
  58. ///
  59.     
  60. class CHitDataAdapter
  61. {
  62. public:
  63.     typedef CDense_seg::TDim     TDim;
  64.     typedef list< CRef< CScore > >  TScore; 
  65.     CHitDataAdapter(const CSeq_align& align, const CDense_seg& denseg, 
  66.                             int q_index, int s_index)
  67.     :   m_pSeqAlign(&align),
  68.         m_pDenseSeg(&denseg),
  69.         m_QueryIndex(q_index),
  70.         m_SubjectIndex(s_index)
  71.     {
  72.     }
  73.     
  74.     CHitDataAdapter&    operator=(const CHitDataAdapter& hit)
  75.     {
  76.         m_pSeqAlign = hit.m_pSeqAlign;
  77.         m_pDenseSeg = hit.m_pDenseSeg;
  78.         m_QueryIndex = hit.m_QueryIndex;
  79.         m_SubjectIndex = hit.m_SubjectIndex;
  80.         return *this;
  81.     }
  82.     inline  TDim   GetElemsCount() const
  83.     {
  84.         return m_pDenseSeg->GetNumseg();
  85.     }
  86.     
  87.     inline CHitElemDataAdapter GetElem(TDim elem_index);
  88.     
  89.     inline const CHitElemDataAdapter GetElem(TDim elem_index)   const;
  90.     
  91.     inline TSignedSeqPos  GetQueryStart(TDim elem_index) const
  92.     {
  93.         TDim index = m_QueryIndex + elem_index * m_pDenseSeg->GetDim();
  94.         return m_pDenseSeg->GetStarts()[index];
  95.     }
  96.     inline TSignedSeqPos  GetSubjectStart(TDim elem_index) const
  97.     {
  98.         TDim index = m_SubjectIndex + elem_index * m_pDenseSeg->GetDim();
  99.         return m_pDenseSeg->GetStarts()[index];
  100.     }
  101.     inline TSeqPos      GetLength(TDim elem_index) const
  102.     {
  103.         return m_pDenseSeg->GetLens()[elem_index];
  104.     }
  105.     inline ENa_strand  GetQueryStrand(TDim elem_index) const
  106.     {
  107.         TDim index = m_QueryIndex + elem_index * m_pDenseSeg->GetDim();
  108.         return m_pDenseSeg->GetStrands()[index];
  109.     }
  110.     inline ENa_strand  GetSubjectStrand(TDim elem_index) const
  111.     {
  112.         TDim index = m_SubjectIndex + elem_index * m_pDenseSeg->GetDim();
  113.         return m_pDenseSeg->GetStrands()[index];
  114.     }    
  115.     inline double   GetScoreValue(const CObject_id& id) const
  116.     {
  117.         const CSeq_align::TScore&   scores = m_pSeqAlign->GetScore();
  118.         ITERATE(CSeq_align::TScore, itS, scores)   {
  119.             const CScore&   score = **itS;
  120.             _ASSERT(score.CanGetId());
  121.             if(score.GetId().Compare(id) == 0)  { // Match
  122.                 const CScore::C_Value& val = score.GetValue();
  123.                 switch(val.Which()) {
  124.                 case CScore::C_Value::e_Real: return val.GetReal();
  125.                 case CScore::C_Value::e_Int: return val.GetInt();
  126.                 default:    _ASSERT(false);
  127.                 }    
  128.             }
  129.         }
  130.         _ASSERT(false);
  131.         return -1;
  132.     }
  133. protected:
  134.     const CSeq_align*   m_pSeqAlign;
  135.     const CDense_seg*   m_pDenseSeg;
  136.     TDim    m_QueryIndex;
  137.     TDim    m_SubjectIndex;
  138.     
  139. };
  140. /// CHitElemDataAdapter represents a single element of a Hit.
  141. ///
  142. class CHitElemDataAdapter
  143. {
  144. public:
  145.     typedef CDense_seg::TDim     TDim;
  146.     CHitElemDataAdapter()
  147.     :   m_pHit(NULL),
  148.         m_ElemIndex(-1)    
  149.     {
  150.     }
  151.     CHitElemDataAdapter(const CHitDataAdapter& hit, TDim elem_index)
  152.     :   m_pHit(&hit),
  153.         m_ElemIndex(elem_index)
  154.     {
  155.     }
  156.     inline const CHitDataAdapter&  GetHit()    const
  157.     {
  158.         return *m_pHit;
  159.     }
  160.     inline TSignedSeqPos  GetQueryStart() const
  161.     {
  162.         return m_pHit->GetQueryStart(m_ElemIndex);
  163.     }
  164.     inline TSignedSeqPos  GetSubjectStart() const
  165.     {
  166.         return m_pHit->GetSubjectStart(m_ElemIndex);
  167.     }
  168.     inline TSeqPos        GetLength() const
  169.     {
  170.         return m_pHit->GetLength(m_ElemIndex);
  171.     }
  172.     inline  ENa_strand     GetQueryStrand() const
  173.     {
  174.         return m_pHit->GetQueryStrand(m_ElemIndex);
  175.     }
  176.     inline  ENa_strand     GetSubjectStrand() const
  177.     {
  178.         return m_pHit->GetSubjectStrand(m_ElemIndex);
  179.     }
  180. protected:
  181.     const CHitDataAdapter*    m_pHit; /// 
  182.     TDim     m_ElemIndex; /// index of a segment in dense-seg
  183. };
  184. CHitElemDataAdapter  CHitDataAdapter::GetElem(TDim elem_index)
  185. {
  186.     return CHitElemDataAdapter(*this, elem_index);
  187. }
  188. const CHitElemDataAdapter  CHitDataAdapter::GetElem(TDim elem_index) const
  189. {
  190.     return CHitElemDataAdapter(*this, elem_index);
  191. }
  192. END_NCBI_SCOPE
  193. /*
  194.  * ===========================================================================
  195.  * $Log: hit_data_adapter.hpp,v $
  196.  * Revision 1000.1  2004/04/12 18:16:40  gouriano
  197.  * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.3
  198.  *
  199.  * Revision 1.3  2004/02/04 20:04:45  yazhuk
  200.  * Clean-up
  201.  *
  202.  * Revision 1.2  2003/12/05 17:52:56  yazhuk
  203.  * Added functions for retrieving strand information
  204.  *
  205.  * Revision 1.1  2003/12/01 17:01:13  yazhuk
  206.  * Initial revision
  207.  *
  208.  * ===========================================================================
  209.  */
  210. #endif  // GUI_WIDGETS_HIT_MATRIX___HIT_DATA_ADAPTER__HPP