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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: flat_file_generator.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:44:16  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: flat_file_generator.cpp,v 1000.1 2004/06/01 19:44:16 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:  Mati Shomrat
  35. *
  36. * File Description:
  37. *   User interface for generating flat file reports from ASN.1
  38. *   
  39. */
  40. #include <ncbi_pch.hpp>
  41. #include <corelib/ncbistd.hpp>
  42. #include <corelib/ncbiobj.hpp>
  43. #include <objects/seqset/Seq_entry.hpp>
  44. #include <objects/submit/Seq_submit.hpp>
  45. #include <objects/seqloc/Seq_loc.hpp>
  46. #include <objects/seqloc/Seq_id.hpp>
  47. #include <objmgr/scope.hpp>
  48. #include <objmgr/bioseq_handle.hpp>
  49. #include <objmgr/seq_entry_handle.hpp>
  50. #include <objtools/format/flat_file_generator.hpp>
  51. #include <objtools/format/text_ostream.hpp>
  52. #include <objtools/format/item_formatter.hpp>
  53. #include <objtools/format/ostream_text_ostream.hpp>
  54. #include <objtools/format/format_item_ostream.hpp>
  55. #include <objtools/format/gather_items.hpp>
  56. #include <objtools/format/context.hpp>
  57. #include <objtools/format/flat_expt.hpp>
  58. BEGIN_NCBI_SCOPE
  59. BEGIN_SCOPE(objects)
  60. //////////////////////////////////////////////////////////////////////////////
  61. //
  62. // PUBLIC
  63. // constructor
  64. CFlatFileGenerator::CFlatFileGenerator(const CFlatFileConfig& cfg) :
  65.     m_Ctx(new CFlatFileContext(cfg))
  66. {
  67.      if ( !m_Ctx ) {
  68.          NCBI_THROW(CFlatException, eInternal, "Unable to initialize context");
  69.      }
  70. }
  71. CFlatFileGenerator::CFlatFileGenerator
  72. (CFlatFileConfig::TFormat format,
  73.  CFlatFileConfig::TMode   mode,
  74.  CFlatFileConfig::TStyle  style,
  75.  CFlatFileConfig::TFlags  flags,
  76.  CFlatFileConfig::TView   view) :
  77.     m_Ctx(new CFlatFileContext(CFlatFileConfig(format, mode, style, flags, view)))
  78. {
  79.     if ( !m_Ctx ) {
  80.        NCBI_THROW(CFlatException, eInternal, "Unable to initialize context");
  81.     }
  82. }
  83. // destructor
  84. CFlatFileGenerator::~CFlatFileGenerator(void)
  85. {
  86. }
  87. // Set annotation selector for feature gathering
  88. SAnnotSelector& CFlatFileGenerator::SetAnnotSelector(void)
  89. {
  90.     return m_Ctx->SetAnnotSelector();
  91. }
  92. // Generate a flat-file report for a Seq-entry
  93. void CFlatFileGenerator::Generate
  94. (const CSeq_entry_Handle& entry,
  95.  CFlatItemOStream& item_os)
  96. {
  97.     _ASSERT(entry  &&  entry.Which() != CSeq_entry::e_not_set);
  98.     m_Ctx->SetEntry(entry);
  99.     CFlatFileConfig::TFormat format = m_Ctx->GetConfig().GetFormat();
  100.     CRef<CFlatItemFormatter> formatter(CFlatItemFormatter::New(format));
  101.     if ( !formatter ) {
  102.         NCBI_THROW(CFlatException, eInternal, "Unable to initialize formatter");
  103.     }
  104.     formatter->SetContext(*m_Ctx);
  105.     item_os.SetFormatter(formatter);
  106.     CRef<CFlatGatherer> gatherer(CFlatGatherer::New(format));
  107.     if ( !gatherer ) {
  108.         NCBI_THROW(CFlatException, eInternal, "Unable to initialize gatherer");
  109.     }
  110.     gatherer->Gather(*m_Ctx, item_os);
  111. }
  112. void CFlatFileGenerator::Generate
  113. (const CSeq_submit& submit,
  114.  CScope& scope,
  115.  CFlatItemOStream& item_os)
  116. {
  117.     _ASSERT(submit.CanGetData());
  118.     _ASSERT(submit.CanGetSub());
  119.     _ASSERT(submit.GetData().IsEntrys());
  120.     _ASSERT(!submit.GetData().GetEntrys().empty());
  121.     // NB: though the spec specifies a submission may contain multiple entries
  122.     // this is not the case. A submission should only have a single Top-level
  123.     // Seq-entry
  124.     CConstRef<CSeq_entry> e(submit.GetData().GetEntrys().front());
  125.     if ( e ) {
  126.         CSeq_entry_Handle entry = scope.GetSeq_entryHandle(*e);
  127.         m_Ctx->SetSubmit(submit.GetSub());
  128.         Generate(entry, item_os);
  129.     }
  130. }
  131. void CFlatFileGenerator::Generate
  132. (const CSeq_loc& loc,
  133.  CScope& scope,
  134.  CFlatItemOStream& item_os)
  135. {
  136.     if ( !loc.IsWhole()  &&  !loc.IsInt() ) {
  137.         NCBI_THROW(CFlatException, eInvalidParam, 
  138.             "locations must be an interval on a bioseq (or whole)");
  139.     }
  140.     CBioseq_Handle bsh = scope.GetBioseqHandle(loc);
  141.     if ( !bsh ) {
  142.         NCBI_THROW(CFlatException, eInvalidParam, "location not in scope");
  143.     }
  144.     CSeq_entry_Handle entry = bsh.GetParentEntry();
  145.     if ( !entry ) {
  146.         NCBI_THROW(CFlatException, eInvalidParam, "Id not in scope");
  147.     }
  148.     CRef<CSeq_loc> location(new CSeq_loc);
  149.     location->Assign(loc);
  150.     m_Ctx->SetLocation(location);
  151.     Generate(entry, item_os);
  152. }
  153. void CFlatFileGenerator::Generate
  154. (const CSeq_id& id,
  155.  const TRange& range,
  156.  ENa_strand strand,
  157.  CScope& scope,
  158.  CFlatItemOStream& item_os)
  159. {
  160.     CRef<CSeq_id> id2(new CSeq_id);
  161.     id2->Assign(id);
  162.     CRef<CSeq_loc> loc;
  163.     if ( range.IsWhole() ) {
  164.         loc.Reset(new CSeq_loc);
  165.         loc->SetWhole(*id2);
  166.     } else {
  167.         loc.Reset(new CSeq_loc(*id2, range.GetFrom(), range.GetTo(), strand));
  168.     }
  169.     if ( loc ) {
  170.         Generate(*loc, scope, item_os);
  171.     }
  172. }
  173. void CFlatFileGenerator::Generate
  174. (const CSeq_submit& submit,
  175.  CScope& scope,
  176.  CNcbiOstream& os)
  177. {
  178.     CRef<CFlatItemOStream> 
  179.         item_os(new CFormatItemOStream(new COStreamTextOStream(os)));
  180.     Generate(submit, scope, *item_os);
  181. }
  182. void CFlatFileGenerator::Generate
  183. (const CSeq_entry_Handle& entry,
  184.  CNcbiOstream& os)
  185. {
  186.     CRef<CFlatItemOStream> 
  187.         item_os(new CFormatItemOStream(new COStreamTextOStream(os)));
  188.     Generate(entry, *item_os);
  189. }
  190. void CFlatFileGenerator::Generate
  191. (const CSeq_loc& loc,
  192.  CScope& scope,
  193.  CNcbiOstream& os)
  194. {
  195.     CRef<CFlatItemOStream> 
  196.         item_os(new CFormatItemOStream(new COStreamTextOStream(os)));
  197.     Generate(loc, scope, *item_os);
  198. }
  199. void CFlatFileGenerator::Generate
  200. (const CSeq_id& id,
  201.  const TRange& range, 
  202.  ENa_strand strand,
  203.  CScope& scope,
  204.  CNcbiOstream& os)
  205. {
  206.     CRef<CFlatItemOStream> 
  207.         item_os(new CFormatItemOStream(new COStreamTextOStream(os)));
  208.     Generate(id, range, strand, scope, *item_os);
  209. }
  210. void CFlatFileGenerator::Reset(void)
  211. {
  212.     m_Ctx->Reset();
  213. }
  214. END_SCOPE(objects)
  215. END_NCBI_SCOPE
  216. /*
  217. * ===========================================================================
  218. *
  219. * $Log: flat_file_generator.cpp,v $
  220. * Revision 1000.1  2004/06/01 19:44:16  gouriano
  221. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  222. *
  223. * Revision 1.10  2004/05/21 21:42:54  gorelenk
  224. * Added PCH ncbi_pch.hpp
  225. *
  226. * Revision 1.9  2004/05/19 14:47:56  shomrat
  227. * + Reset()
  228. *
  229. * Revision 1.8  2004/04/22 16:02:53  shomrat
  230. * Changed in API
  231. *
  232. * Revision 1.7  2004/03/31 17:18:24  shomrat
  233. * name changes
  234. *
  235. * Revision 1.6  2004/03/25 20:38:17  shomrat
  236. * Use handles
  237. *
  238. * Revision 1.5  2004/02/11 22:52:06  shomrat
  239. * allow user to specify selector for feature gathering
  240. *
  241. * Revision 1.4  2004/02/11 16:58:28  shomrat
  242. * bug fix
  243. *
  244. * Revision 1.3  2004/01/14 16:13:11  shomrat
  245. * Added GFF foramt; changed internal representation
  246. *
  247. * Revision 1.2  2003/12/18 17:43:33  shomrat
  248. * context.hpp moved
  249. *
  250. * Revision 1.1  2003/12/17 20:21:05  shomrat
  251. * Initial Revision (adapted from flat lib)
  252. *
  253. *
  254. * ===========================================================================
  255. */