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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: hit_matrix_ds.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 21:10:54  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: hit_matrix_ds.cpp,v 1000.3 2004/06/01 21:10:54 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.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <gui/widgets/hit_matrix/hit_matrix_ds.hpp>
  41. #include <objects/seqalign/Seq_align.hpp>
  42. #include <objects/seqalign/Seq_align_set.hpp>
  43. #include <objects/seqalign/Dense_seg.hpp>
  44. #include <algorithm>
  45. BEGIN_NCBI_SCOPE
  46. USING_SCOPE(ncbi::objects);
  47. struct FEqualSeqId
  48. {
  49.     FEqualSeqId(const CSeq_id& id)  : m_Id(id)  {}
  50.     FEqualSeqId(const CRef<CSeq_id>& id)  : m_Id(*id)  {}
  51.     bool    operator()(CConstRef<CSeq_id> id)   {   return id->Equals(m_Id); }
  52.     bool    operator()(CRef<CSeq_id> id)   {   return id->Equals(m_Id); }
  53. protected:
  54.     const CSeq_id&  m_Id;
  55. };
  56. CHitMatrixDataSource::CHitMatrixDataSource(const CSeq_annot& annot, CScope& scope)
  57. {
  58.     m_Annot = &annot;
  59.     m_Scope = &scope;
  60.     CTypeConstIterator<CSeq_align> it(ConstBegin(*m_Annot));
  61.     x_Init(it);
  62. }
  63. CHitMatrixDataSource::CHitMatrixDataSource(const CSeq_align_set& aset,
  64.                      CScope& scope)
  65. {
  66.     m_Set = &aset;
  67.     m_Scope = &scope;
  68.     CTypeConstIterator<CSeq_align> it(ConstBegin(*m_Set));
  69.     x_Init(it);
  70. }
  71. CHitMatrixDataSource::~CHitMatrixDataSource()
  72. {
  73. }
  74. void  CHitMatrixDataSource::x_Init(CTypeConstIterator<CSeq_align>& it)
  75. {
  76.     m_QueryHitsRange.Set(0, 0);
  77.     m_SubjectHitsRange.Set(0, 0);
  78.     
  79.     // iterate through all terminal seq-aligns and build list of seq_ids
  80.     for( ; it; ++it) {
  81.         const CSeq_align& align = *it;
  82.         // terminal CSeq_align        
  83.         if(align.CanGetSegs()  &&  align.GetSegs().IsDenseg())  {
  84.             const CDense_seg& denseg = align.GetSegs().GetDenseg();
  85.      
  86.             if(m_SeqIds.size() == 0) { // first seq-align - fill m_ScoreIds
  87.                 const CSeq_align::TScore& scores = align.GetScore();              
  88.                 ITERATE(CSeq_align::TScore , itSc, scores)  {
  89.                     if((*itSc)->CanGetId())    {
  90.                         const CObject_id&   id = (*itSc)->GetId();
  91.                         m_ScoreIds.push_back(&id);
  92.                     }
  93.                 } 
  94.             }
  95.             _ASSERT(denseg.CanGetIds());
  96.             const CDense_seg::TIds& v_ids = denseg.GetIds();
  97.         
  98.             // iterate by IDs in denseg
  99.             ITERATE(CDense_seg::TIds, itID, v_ids)  {           
  100.                 FEqualSeqId     EqualID(*itID);
  101.                 TIdRefCont::const_iterator itS = 
  102.                         find_if(m_SeqIds.begin(), m_SeqIds.end(), EqualID); 
  103.                 if(itS == m_SeqIds.end())   { // not found - this is a new one
  104.                     m_SeqIds.push_back(TIdRef(*itID));
  105.                 }
  106.             }
  107.         }
  108.     } //for
  109. }
  110. const CHitMatrixDataSource::TIdRefCont&     CHitMatrixDataSource::GetSeqIDs()
  111. {
  112.     return m_SeqIds;
  113. }
  114. /// selects query and subject from the set of available sequences
  115. bool    CHitMatrixDataSource::SelectIds(const TIdRef& q_id, const TIdRef& s_id)
  116. {
  117.     cout << "nCHitMatrixDataSource::SelectIds";
  118.     bool b_first = true;
  119.     m_QueryHitsRange.Set(0, 0);
  120.     m_SubjectHitsRange.Set(0, 0);
  121.     
  122.     // check that both ids exist in data
  123.     FEqualSeqId     FindQ(q_id.GetObject());
  124.     FEqualSeqId     FindS(s_id.GetObject());
  125.              
  126.     TIdRefCont::const_iterator itQuery = 
  127.                         find_if(m_SeqIds.begin(), m_SeqIds.end(), FindQ);
  128.     TIdRefCont::const_iterator itSubject = 
  129.                         find_if(m_SeqIds.begin(), m_SeqIds.end(), FindS);
  130.             
  131.     bool b_ok = itQuery != m_SeqIds.end()  
  132.                 &&  itSubject != m_SeqIds.end();
  133.     if(b_ok)    { // iterate though seq_aligns and create Hit Adapters
  134.         m_QueryID = q_id;
  135.         m_SubjectID = s_id;
  136.         m_HitAdapters.clear();
  137.         CTypeConstIterator<CSeq_align> it = m_Annot.NotEmpty() ? ConstBegin(*m_Annot) : ConstBegin(*m_Set);
  138.         // iterate by all seq_aligns
  139.         for( ; it; ++it) {
  140.             const CSeq_align& align = *it;
  141.             if(align.GetType() == CSeq_align_Base::eType_partial)   { 
  142.          
  143.             _ASSERT(align.CanGetSegs());
  144.             const CDense_seg& denseg = align.GetSegs().GetDenseg();
  145.             
  146.             // find S and Q Ids in denseseg
  147.             const CDense_seg::TIds& v_ids = denseg.GetIds();
  148.             
  149.             // looking for query Id
  150.             CDense_seg::TIds::const_iterator itQ = find_if(v_ids.begin(), v_ids.end(), FindQ);
  151.             if(itQ != v_ids.end())  { // found Query
  152.                 CDense_seg::TIds::const_iterator itS = 
  153.                         find_if(v_ids.begin(), v_ids.end(), FindS);
  154.                 if(itS != v_ids.end())  {
  155.                     int q_index = itQ - v_ids.begin();
  156.                     int s_index = itS - v_ids.begin();
  157.                     
  158.                     TSeqRange q_r = denseg.GetSeqRange(q_index);
  159.                     if(q_r.GetFrom() > q_r.GetTo()) {
  160.                         q_r.Set(q_r.GetTo(), q_r.GetFrom());
  161.                     }
  162.                     TSeqRange s_r = denseg.GetSeqRange(s_index);
  163.                     if(s_r.GetFrom() > s_r.GetTo()) {
  164.                         s_r.Set(s_r.GetTo(), s_r.GetFrom());
  165.                     }
  166.                     if(b_first) {
  167.                         m_QueryHitsRange = q_r;
  168.                         m_SubjectHitsRange = s_r;                        
  169.                         b_first = false;
  170.                     } else {
  171.                         m_QueryHitsRange += q_r;
  172.                         m_SubjectHitsRange += s_r;                        
  173.                     }
  174.                     
  175.                     m_HitAdapters.push_back( CHitDataAdapter(align, denseg,  q_index, s_index) );
  176.                 }
  177.             }
  178.             }
  179.         }
  180.     }    
  181.     return b_ok;    
  182. }
  183. CScope&     CHitMatrixDataSource::GetScope()
  184. {
  185.     return m_Scope.GetObject();
  186. }
  187. CHitMatrixDataSource::TIdRef  CHitMatrixDataSource::GetQueryId() const
  188. {
  189.     return m_QueryID;
  190. }
  191. CHitMatrixDataSource::TIdRef  CHitMatrixDataSource::GetSubjectId() const
  192. {
  193.     return m_SubjectID;
  194. }
  195. CBioseq_Handle      CHitMatrixDataSource::GetQueryHandle()
  196. {
  197.     return m_Scope->GetBioseqHandle(m_QueryID.GetObject());
  198. }
  199. CBioseq_Handle      CHitMatrixDataSource::GetSubjectHandle()
  200. {
  201.     return m_Scope->GetBioseqHandle(m_SubjectID.GetObject());
  202. }
  203. const CHitMatrixDataSource::THitAdapterCont&  CHitMatrixDataSource::GetHits()   const
  204. {
  205.     return m_HitAdapters;
  206. }                      
  207. int     CHitMatrixDataSource::GetScoresCount()    const
  208. {
  209.     return m_ScoreIds.size();
  210. }
  211. const CObject_id&  CHitMatrixDataSource::GetScoreId(size_t index)    const
  212. {
  213.     return *m_ScoreIds[index];
  214. }
  215. TSeqRange   CHitMatrixDataSource::GetQueryHitsRange()
  216. {
  217.     return m_QueryHitsRange;
  218. }
  219. TSeqRange   CHitMatrixDataSource::GetSubjectHitsRange()
  220. {
  221.     return m_SubjectHitsRange;
  222. }
  223. END_NCBI_SCOPE
  224. /*
  225.  * ===========================================================================
  226.  * $Log: hit_matrix_ds.cpp,v $
  227.  * Revision 1000.3  2004/06/01 21:10:54  gouriano
  228.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  229.  *
  230.  * Revision 1.6  2004/05/21 22:27:54  gorelenk
  231.  * Added PCH ncbi_pch.hpp
  232.  *
  233.  * Revision 1.5  2004/02/12 21:03:28  yazhuk
  234.  * Extended x_Init() to support wider variety of alignments; implemented calculation
  235.  * of hit ranges
  236.  *
  237.  * Revision 1.4  2004/01/20 18:22:10  dicuccio
  238.  * Don't assume that the partial flag is required for proper alignment rendering
  239.  *
  240.  * Revision 1.3  2003/12/05 17:39:49  yazhuk
  241.  * Added construction from CSeq_Annot, changed API to use const refs instead of CRefs
  242.  *
  243.  * Revision 1.2  2003/12/01 17:02:04  yazhuk
  244.  * Seriously redesigned  CHitMatrixDataSource
  245.  *
  246.  * Revision 1.1  2003/11/17 20:41:19  yazhuk
  247.  * Initial revision
  248.  *
  249.  * ===========================================================================
  250.  */