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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: annot_piece.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:24:40  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: annot_piece.cpp,v 1000.2 2004/06/01 19:24:40 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:  Eugene Vasilchenko
  35. *
  36. * File Description:
  37. *   Application for splitting blobs withing ID1 cache
  38. *
  39. * ===========================================================================
  40. */
  41. #include <ncbi_pch.hpp>
  42. #include <objmgr/split/annot_piece.hpp>
  43. #include <objmgr/split/object_splitinfo.hpp>
  44. #include <objmgr/split/chunk_info.hpp>
  45. BEGIN_NCBI_SCOPE
  46. BEGIN_SCOPE(objects)
  47. SAnnotPiece::SAnnotPiece(void)
  48.     : m_Object(0),
  49.       m_Seq_annot(0)
  50. {
  51. }
  52. SAnnotPiece::SAnnotPiece(const SAnnotPiece& piece,
  53.                          const COneSeqRange& range)
  54.     : m_Size(piece.m_Size),
  55.       m_Location(piece.m_Location),
  56.       m_IdRange(range.GetTotalRange()),
  57.       m_Object(piece.m_Object),
  58.       m_Seq_annot(piece.m_Seq_annot)
  59. {
  60. }
  61. SAnnotPiece::SAnnotPiece(const CAnnotObject_SplitInfo& obj,
  62.                          const CSeq_annot_SplitInfo& annot)
  63.     : m_Size(obj.m_Size),
  64.       m_Location(obj.m_Location),
  65.       m_IdRange(TRange::GetEmpty()),
  66.       m_Object(&obj),
  67.       m_Seq_annot(&annot)
  68. {
  69. }
  70. SAnnotPiece::SAnnotPiece(const CSeq_annot_SplitInfo& annot)
  71.     : m_Size(annot.m_ComplexLocObjects.m_Size),
  72.       m_Location(annot.m_ComplexLocObjects.m_Location),
  73.       m_IdRange(TRange::GetEmpty()),
  74.       m_Object(0),
  75.       m_Seq_annot(&annot)
  76. {
  77.     ITERATE ( TSimpleLocObjects, it, annot.m_SimpleLocObjects ) {
  78.         m_Size += it->second.m_Size;
  79.         m_Location.Add(it->second.m_Location);
  80.     }
  81. }
  82. void SIdAnnotPieces::Add(const SAnnotPiece& piece)
  83. {
  84.     m_Pieces.insert(piece);
  85.     m_Size += piece.m_Size;
  86.     m_IdRange += piece.m_IdRange;
  87. }
  88. void SIdAnnotPieces::Remove(const SAnnotPiece& piece)
  89. {
  90.     m_Size -= piece.m_Size;
  91.     _VERIFY(m_Pieces.erase(piece) == 1);
  92. }
  93. SIdAnnotPieces::TPieces::iterator SIdAnnotPieces::Erase(TPieces::iterator it)
  94. {
  95.     m_Size -= it->m_Size;
  96.     TPieces::iterator erase = it++;
  97.     m_Pieces.erase(erase);
  98.     return it;
  99. }
  100. /////////////////////////////////////////////////////////////////////////////
  101. // CAnnotPieces
  102. /////////////////////////////////////////////////////////////////////////////
  103. CAnnotPieces::CAnnotPieces(void)
  104. {
  105. }
  106. CAnnotPieces::~CAnnotPieces(void)
  107. {
  108. }
  109. void CAnnotPieces::Add(const CBioseq_SplitInfo& bioseq_info,
  110.                        SChunkInfo& main_chunk)
  111. {
  112.     ITERATE ( CBioseq_SplitInfo::TSeq_annots, it, bioseq_info.m_Seq_annots ) {
  113.         Add(it->second, main_chunk);
  114.     }
  115. }
  116. void CAnnotPieces::Add(const CSeq_annot_SplitInfo& info,
  117.                        SChunkInfo& main_chunk)
  118. {
  119.     size_t max_size = info.m_Name.IsNamed()? 100: 10;
  120.     size_t size = info.m_ComplexLocObjects.size();
  121.     ITERATE ( TSimpleLocObjects, idit, info.m_SimpleLocObjects ) {
  122.         size += idit->second.size();
  123.     }
  124.     if ( size <= max_size ) {
  125.         if ( !info.m_LandmarkObjects.empty() ) {
  126.             main_chunk.Add(info);
  127.         }
  128.         else {
  129.             Add(SAnnotPiece(info));
  130.         }
  131.     }
  132.     else {
  133.         if ( !info.m_LandmarkObjects.empty() ) {
  134.             main_chunk.Add(CSeq_annot_SplitInfo(info, info.m_LandmarkObjects));
  135.         }
  136.         Add(info.m_ComplexLocObjects, info);
  137.         ITERATE ( TSimpleLocObjects, idit, info.m_SimpleLocObjects ) {
  138.             Add(idit->second, info);
  139.         }
  140.     }
  141. }
  142. void CAnnotPieces::Add(const CLocObjects_SplitInfo& objs,
  143.                        const CSeq_annot_SplitInfo& annot)
  144. {
  145.     ITERATE ( CLocObjects_SplitInfo, it, objs ) {
  146.         Add(SAnnotPiece(*it, annot));
  147.     }
  148. }
  149. void CAnnotPieces::Add(const SAnnotPiece& piece)
  150. {
  151.     ITERATE ( CSeqsRange, it, piece.m_Location ) {
  152.         SIdAnnotPieces& info = m_PiecesById[it->first];
  153.         info.Add(SAnnotPiece(piece, it->second));
  154.     }
  155. }
  156. void CAnnotPieces::Remove(const SAnnotPiece& piece)
  157. {
  158.     ITERATE ( CSeqsRange, it, piece.m_Location ) {
  159.         SIdAnnotPieces& info = m_PiecesById[it->first];
  160.         info.Remove(SAnnotPiece(piece, it->second));
  161.     }
  162. }
  163. size_t CAnnotPieces::CountAnnotObjects(void) const
  164. {
  165.     double ref_count = 0;
  166.     ITERATE ( TPiecesById, i, m_PiecesById ) {
  167.         const SIdAnnotPieces& pp = i->second;
  168.         ITERATE ( SIdAnnotPieces, j, pp ) {
  169.             const SAnnotPiece& p = *j;
  170.             size_t cnt;
  171.             if ( p.m_Object ) {
  172.                 cnt = 1;
  173.             }
  174.             else {
  175.                 cnt = CSeq_annot_SplitInfo::
  176.                     CountAnnotObjects(*p.m_Seq_annot->m_Src_annot);
  177.             }
  178.             size_t id_refs = p.m_Location.size();
  179.             ref_count += double(cnt) / id_refs;
  180.         }
  181.     }
  182.     return size_t(ref_count + .5);
  183. }
  184. END_SCOPE(objects)
  185. END_NCBI_SCOPE
  186. /*
  187. * ---------------------------------------------------------------------------
  188. * $Log: annot_piece.cpp,v $
  189. * Revision 1000.2  2004/06/01 19:24:40  gouriano
  190. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  191. *
  192. * Revision 1.4  2004/05/21 21:42:13  gorelenk
  193. * Added PCH ncbi_pch.hpp
  194. *
  195. * Revision 1.3  2004/01/07 17:36:21  vasilche
  196. * Moved id2_split headers to include/objmgr/split.
  197. * Fixed include path to genbank.
  198. *
  199. * Revision 1.2  2003/11/26 23:04:56  vasilche
  200. * Removed extra semicolons after BEGIN_SCOPE and END_SCOPE.
  201. *
  202. * Revision 1.1  2003/11/12 16:18:23  vasilche
  203. * First implementation of ID2 blob splitter withing cache.
  204. *
  205. * ===========================================================================
  206. */