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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: object_splitinfo.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:25:04  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: object_splitinfo.cpp,v 1000.2 2004/06/01 19:25:04 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/object_splitinfo.hpp>
  43. #include <serial/serial.hpp>
  44. #include <objects/seq/Seq_annot.hpp>
  45. #include <objects/seq/Annotdesc.hpp>
  46. #include <objects/seq/Annot_descr.hpp>
  47. #include <objects/seq/Bioseq.hpp>
  48. #include <objects/seqset/Bioseq_set.hpp>
  49. #include <objects/seqalign/Seq_align.hpp>
  50. #include <objects/seqfeat/Seq_feat.hpp>
  51. #include <objects/seqres/Seq_graph.hpp>
  52. #include <objmgr/split/asn_sizer.hpp>
  53. BEGIN_NCBI_SCOPE
  54. BEGIN_SCOPE(objects)
  55. /////////////////////////////////////////////////////////////////////////////
  56. // CSeq_annot_SplitInfo
  57. /////////////////////////////////////////////////////////////////////////////
  58. static CAsnSizer s_Sizer;
  59. void CLocObjects_SplitInfo::Add(const CAnnotObject_SplitInfo& obj)
  60. {
  61.     m_Objects.push_back(obj);
  62.     m_Location.Add(obj.m_Location);
  63.     m_Size += obj.m_Size;
  64. }
  65. CNcbiOstream& CLocObjects_SplitInfo::Print(CNcbiOstream& out) const
  66. {
  67.     return out << m_Size;
  68. }
  69. CSeq_annot_SplitInfo::CSeq_annot_SplitInfo(void)
  70.     : m_Id(0)
  71. {
  72. }
  73. CSeq_annot_SplitInfo::CSeq_annot_SplitInfo(const CSeq_annot_SplitInfo& base,
  74.                                            const CLocObjects_SplitInfo& objs)
  75.     : m_Id(base.m_Id),
  76.       m_Src_annot(base.m_Src_annot),
  77.       m_Name(base.m_Name),
  78.       m_LandmarkObjects(objs),
  79.       m_Size(objs.m_Size),
  80.       m_Location(objs.m_Location)
  81. {
  82. }
  83. CAnnotName CSeq_annot_SplitInfo::GetName(const CSeq_annot& annot)
  84. {
  85.     CAnnotName ret;
  86.     if ( annot.IsSetDesc() ) {
  87.         string name;
  88.         ITERATE ( CSeq_annot::TDesc::Tdata, it, annot.GetDesc().Get() ) {
  89.             const CAnnotdesc& desc = **it;
  90.             if ( desc.Which() == CAnnotdesc::e_Name ) {
  91.                 name = desc.GetName();
  92.                 break;
  93.             }
  94.         }
  95.         ret.SetNamed(name);
  96.     }
  97.     return ret;
  98. }
  99. size_t CSeq_annot_SplitInfo::CountAnnotObjects(const CSeq_annot& annot)
  100. {
  101.     switch ( annot.GetData().Which() ) {
  102.     case CSeq_annot::C_Data::e_Ftable:
  103.         return annot.GetData().GetFtable().size();
  104.     case CSeq_annot::C_Data::e_Align:
  105.         return annot.GetData().GetAlign().size();
  106.     case CSeq_annot::C_Data::e_Graph:
  107.         return annot.GetData().GetGraph().size();
  108.     }
  109.     return 0;
  110. }
  111. void CSeq_annot_SplitInfo::SetSeq_annot(int id,
  112.                                         const CSeq_annot& annot,
  113.                                         const SSplitterParams& params)
  114. {
  115.     m_Id = id;
  116.     s_Sizer.Set(annot, params);
  117.     m_Size = CSize(s_Sizer);
  118.     double ratio = m_Size.GetRatio();
  119.     _ASSERT(!m_Src_annot);
  120.     m_Src_annot.Reset(&annot);
  121.     _ASSERT(!m_Name.IsNamed());
  122.     m_Name = GetName(annot);
  123.     switch ( annot.GetData().Which() ) {
  124.     case CSeq_annot::TData::e_Ftable:
  125.         ITERATE(CSeq_annot::C_Data::TFtable, it, annot.GetData().GetFtable()) {
  126.             Add(CAnnotObject_SplitInfo(**it, ratio));
  127.         }
  128.         break;
  129.     case CSeq_annot::TData::e_Align:
  130.         ITERATE(CSeq_annot::C_Data::TAlign, it, annot.GetData().GetAlign()) {
  131.             Add(CAnnotObject_SplitInfo(**it, ratio));
  132.         }
  133.         break;
  134.     case CSeq_annot::TData::e_Graph:
  135.         ITERATE(CSeq_annot::C_Data::TGraph, it, annot.GetData().GetGraph()) {
  136.             Add(CAnnotObject_SplitInfo(**it, ratio));
  137.         }
  138.         break;
  139.     }
  140. }
  141. bool CSeq_annot_SplitInfo::IsLandmark(const CAnnotObject_SplitInfo& obj) const
  142. {
  143.     if ( obj.m_ObjectType != CSeq_annot::C_Data::e_Ftable ) {
  144.         return false;
  145.     }
  146.     const CObject& annot = *obj.m_Object;
  147.     const CSeq_feat& feat = dynamic_cast<const CSeq_feat&>(annot);
  148.     switch ( feat.GetData().GetSubtype() ) {
  149.     case CSeqFeatData::eSubtype_gene:
  150.         return true;
  151.     default:
  152.         return false;
  153.     }
  154. }
  155. void CSeq_annot_SplitInfo::Add(const CAnnotObject_SplitInfo& obj)
  156. {
  157.     if ( IsLandmark(obj) ) {
  158.         m_LandmarkObjects.Add(obj);
  159.     }
  160.     else {
  161.         CSeq_id_Handle idh = obj.m_Location.GetSingleId();
  162.         if ( idh ) {
  163.             m_SimpleLocObjects[idh].Add(obj);
  164.         }
  165.         else {
  166.             m_ComplexLocObjects.Add(obj);
  167.         }
  168.     }
  169.     m_Location.Add(obj.m_Location);
  170. }
  171. CNcbiOstream& CSeq_annot_SplitInfo::Print(CNcbiOstream& out) const
  172. {
  173.     string name;
  174.     if ( m_Name.IsNamed() ) {
  175.         name = " "" + m_Name.GetName() + """;
  176.     }
  177.     out << "Seq-annot" << name << ":";
  178.     size_t lines = 0;
  179.     if ( m_LandmarkObjects.size() ) {
  180.         out << "nLandmark: " << m_LandmarkObjects;
  181.         ++lines;
  182.     }
  183.     if ( m_ComplexLocObjects.size() ) {
  184.         out << "n Complex: " << m_ComplexLocObjects;
  185.         ++lines;
  186.     }
  187.     ITERATE ( TSimpleLocObjects, it, m_SimpleLocObjects ) {
  188.         out << "n  Simple: " << it->second;
  189.         ++lines;
  190.     }
  191.     if ( lines > 1 ) {
  192.         out << "n   Total: " << m_Size;
  193.     }
  194.     return out << NcbiEndl;
  195. }
  196. CAnnotObject_SplitInfo::CAnnotObject_SplitInfo(const CSeq_feat& obj,
  197.                                                double ratio)
  198.     : m_ObjectType(CSeq_annot::C_Data::e_Ftable),
  199.       m_Object(&obj),
  200.       m_Size(s_Sizer.GetAsnSize(obj), ratio)
  201. {
  202.     m_Location.Add(obj);
  203. }
  204. CAnnotObject_SplitInfo::CAnnotObject_SplitInfo(const CSeq_graph& obj,
  205.                                                double ratio)
  206.     : m_ObjectType(CSeq_annot::C_Data::e_Graph),
  207.       m_Object(&obj),
  208.       m_Size(s_Sizer.GetAsnSize(obj), ratio)
  209. {
  210.     m_Location.Add(obj);
  211. }
  212. CAnnotObject_SplitInfo::CAnnotObject_SplitInfo(const CSeq_align& obj,
  213.                                                double ratio)
  214.     : m_ObjectType(CSeq_annot::C_Data::e_Align),
  215.       m_Object(&obj),
  216.       m_Size(s_Sizer.GetAsnSize(obj), ratio)
  217. {
  218.     m_Location.Add(obj);
  219. }
  220. CBioseq_SplitInfo::CBioseq_SplitInfo(void)
  221.     : m_Id(0)
  222. {
  223. }
  224. CBioseq_SplitInfo::~CBioseq_SplitInfo(void)
  225. {
  226. }
  227. END_SCOPE(objects)
  228. END_NCBI_SCOPE
  229. /*
  230. * ---------------------------------------------------------------------------
  231. * $Log: object_splitinfo.cpp,v $
  232. * Revision 1000.2  2004/06/01 19:25:04  gouriano
  233. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  234. *
  235. * Revision 1.5  2004/05/21 21:42:14  gorelenk
  236. * Added PCH ncbi_pch.hpp
  237. *
  238. * Revision 1.4  2004/01/07 17:36:27  vasilche
  239. * Moved id2_split headers to include/objmgr/split.
  240. * Fixed include path to genbank.
  241. *
  242. * Revision 1.3  2003/12/01 18:37:10  vasilche
  243. * Separate different annotation types in split info to reduce memory usage.
  244. *
  245. * Revision 1.2  2003/11/26 23:04:59  vasilche
  246. * Removed extra semicolons after BEGIN_SCOPE and END_SCOPE.
  247. *
  248. * Revision 1.1  2003/11/12 16:18:31  vasilche
  249. * First implementation of ID2 blob splitter withing cache.
  250. *
  251. * ===========================================================================
  252. */