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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ftable_formatter.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:44:26  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: ftable_formatter.cpp,v 1000.1 2004/06/01 19:44:26 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:  Aaron Ucko, NCBI
  35. *          Mati Shomrat
  36. *
  37. * File Description:
  38. *           
  39. *
  40. */
  41. #include <ncbi_pch.hpp>
  42. #include <corelib/ncbistd.hpp>
  43. #include <objects/seqloc/Seq_loc.hpp>
  44. #include <objects/seqloc/Seq_point.hpp>
  45. #include <objects/general/Int_fuzz.hpp>
  46. #include <objtools/format/ftable_formatter.hpp>
  47. #include <objmgr/util/sequence.hpp>
  48. BEGIN_NCBI_SCOPE
  49. BEGIN_SCOPE(objects)
  50. CFtableFormatter::CFtableFormatter(void) 
  51. {
  52. }
  53. ///////////////////////////////////////////////////////////////////////////
  54. //
  55. // REFERENCE
  56. void CFtableFormatter::FormatReference
  57. (const CReferenceItem& ref,
  58.  IFlatTextOStream& text_os)
  59. {
  60. }
  61. ///////////////////////////////////////////////////////////////////////////
  62. //
  63. // FEATURES
  64. // Fetures Header
  65. void CFtableFormatter::FormatFeatHeader
  66. (const CFeatHeaderItem& fh,
  67.  IFlatTextOStream& text_os)
  68. {
  69.     const CSeq_id* id = &fh.GetId();
  70.     if ( id->IsGi() ) {
  71.         // !!! Get id for GI (need support from objmgr)
  72.     }
  73.     if ( id != 0 ) {
  74.         list<string> l;
  75.         l.push_back(">Feature " + id->AsFastaString());
  76.         text_os.AddParagraph(l);
  77.     }
  78. }
  79. // Source and "regular" features
  80. void CFtableFormatter::FormatFeature
  81. (const CFeatureItemBase& f,
  82.  IFlatTextOStream& text_os)
  83. {
  84.     list<string> l;
  85.     const CFlatFeature& feat = *f.Format();
  86.     CBioseqContext& bctx = *f.GetContext();
  87.     x_FormatLocation(f.GetLoc(), feat.GetKey(), bctx, l);
  88.     x_FormatQuals(feat.GetQuals(), bctx, l);
  89.     text_os.AddParagraph(l);
  90. }
  91. bool s_IsBetween(const CSeq_loc& loc)
  92. {
  93.     return loc.IsPnt()  &&
  94.            loc.GetPnt().IsSetFuzz()  &&
  95.            loc.GetPnt().GetFuzz().IsLim()  &&
  96.            loc.GetPnt().GetFuzz().GetLim() == CInt_fuzz::eLim_tr;
  97. }
  98. void CFtableFormatter::x_FormatLocation
  99. (const CSeq_loc& loc,
  100.  const string& key,
  101.  CBioseqContext& ctx,
  102.  list<string>& l)
  103. {
  104.     bool need_key = true;
  105.     for (CSeq_loc_CI it(loc); it; ++it) {
  106.         const CSeq_loc& curr = it.GetSeq_loc();
  107.         bool is_between = s_IsBetween(curr);
  108.       
  109.         CSeq_loc_CI::TRange range = it.GetRange();
  110.         TSeqPos start, stop;
  111.         if ( range.IsWhole() ) {
  112.             start = 1;
  113.             stop  = sequence::GetLength(it.GetSeq_loc(), &ctx.GetScope()) + 1;
  114.         } else {
  115.             start = range.GetFrom() + 1;
  116.             stop  = range.GetTo() + 1;
  117.         }
  118.         if ( is_between ) {
  119.             ++stop;
  120.         }
  121.         string left, right;
  122.        
  123.         if ( curr.IsPartialLeft() ) {
  124.             left = '<';
  125.         }
  126.         left += NStr::IntToString(start);
  127.         if ( is_between ) {
  128.             left += '^';
  129.         }
  130.         if ( curr.IsPartialRight() ) {
  131.             right = '>';
  132.         }
  133.         right += NStr::IntToString(stop);
  134.         string line;
  135.         if ( it.GetStrand() == eNa_strand_minus ) {
  136.             line = right + 't' + left;
  137.         } else {
  138.             line = left + 't' + right;
  139.         }
  140.         if ( need_key ) {
  141.             line += 't' + key;
  142.             need_key = false;
  143.         }
  144.         l.push_back(line);
  145.     }
  146. }
  147. void CFtableFormatter::x_FormatQuals
  148. (const CFlatFeature::TQuals& quals,
  149.  CBioseqContext& ctx,
  150.  list<string>& l)
  151. {
  152.     string line;
  153.     ITERATE (CFlatFeature::TQuals, it, quals) {
  154.         line = "ttt" + (*it)->GetName();
  155.         if ((*it)->GetStyle() != CFormatQual::eEmpty) {
  156.             string value;
  157.             NStr::Replace((*it)->GetValue(), " b", kEmptyStr, value);
  158.             line += 't' + value;
  159.         }
  160.         l.push_back(line);
  161.     }
  162. }
  163. END_SCOPE(objects)
  164. END_NCBI_SCOPE