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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: split_parser.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:41:49  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: split_parser.cpp,v 1000.1 2004/06/01 19:41:49 gouriano Exp $
  10.  * ===========================================================================
  11.  *                            PUBLIC DOMAIN NOTICE
  12.  *               National Center for Biotechnology Information
  13.  *
  14.  *  This software/database is a "United States Government Work" under the
  15.  *  terms of the United States Copyright Act.  It was written as part of
  16.  *  the author's official duties as a United States Government employee and
  17.  *  thus cannot be copyrighted.  This software/database is freely available
  18.  *  to the public for use. The National Library of Medicine and the U.S.
  19.  *  Government have not placed any restriction on its use or reproduction.
  20.  *
  21.  *  Although all reasonable efforts have been taken to ensure the accuracy
  22.  *  and reliability of the software and data, the NLM and the U.S.
  23.  *  Government do not and cannot warrant the performance or results that
  24.  *  may be obtained by using this software or data. The NLM and the U.S.
  25.  *  Government disclaim all warranties, express or implied, including
  26.  *  warranties of performance, merchantability or fitness for any particular
  27.  *  purpose.
  28.  *
  29.  *  Please cite the author in any work or product based on this material.
  30.  *
  31.  * ===========================================================================
  32.  *
  33.  *  Author:  Eugene Vasilchenko
  34.  *
  35.  *  File Description: Methods to create object manager structures from ID2 spec
  36.  *
  37.  */
  38. #include <ncbi_pch.hpp>
  39. #include <objtools/data_loaders/genbank/split_parser.hpp>
  40. #include <objmgr/objmgr_exception.hpp>
  41. #include <objmgr/impl/tse_info.hpp>
  42. #include <objmgr/impl/tse_chunk_info.hpp>
  43. #include <objmgr/impl/seq_annot_info.hpp>
  44. #include <objects/seqsplit/seqsplit__.hpp>
  45. BEGIN_NCBI_SCOPE
  46. BEGIN_SCOPE(objects)
  47. void CSplitParser::Attach(CTSE_Info& tse, const CID2S_Split_Info& split)
  48. {
  49.     ITERATE ( CID2S_Split_Info::TChunks, it, split.GetChunks() ) {
  50.         CRef<CTSE_Chunk_Info> chunk = Parse(**it);
  51.         chunk->x_TSEAttach(tse);
  52.     }
  53. }
  54. CRef<CTSE_Chunk_Info> CSplitParser::Parse(const CID2S_Chunk_Info& info)
  55. {
  56.     CRef<CTSE_Chunk_Info> ret(new CTSE_Chunk_Info(info.GetId()));
  57.     ITERATE ( CID2S_Chunk_Info::TContent, it, info.GetContent() ) {
  58.         const CID2S_Chunk_Content& content = **it;
  59.         switch ( content.Which() ) {
  60.         case CID2S_Chunk_Content::e_Seq_annot:
  61.             x_Attach(*ret, content.GetSeq_annot());
  62.             break;
  63.         case CID2S_Chunk_Content::e_Seq_annot_place:
  64.             x_Attach(*ret, content.GetSeq_annot_place());
  65.             break;
  66.         default:
  67.             NCBI_THROW(CLoaderException, eOtherError,
  68.                        "Unexpected split data");
  69.         }
  70.     }
  71.     return ret;
  72. }
  73. void CSplitParser::x_Attach(CTSE_Chunk_Info& chunk,
  74.                           const CID2S_Seq_annot_place_Info& place)
  75. {
  76.     ITERATE ( CID2S_Seq_annot_place_Info::TBioseqs,
  77.               it, place.GetBioseqs() ) {
  78.         chunk.x_AddAnnotPlace(CTSE_Chunk_Info::eBioseq, *it);
  79.     }
  80.     ITERATE ( CID2S_Seq_annot_place_Info::TBioseq_sets,
  81.               it, place.GetBioseq_sets() ) {
  82.         chunk.x_AddAnnotPlace(CTSE_Chunk_Info::eBioseq_set, *it);
  83.     }
  84. }
  85. void CSplitParser::x_Attach(CTSE_Chunk_Info& chunk,
  86.                           const CID2S_Seq_annot_Info& annot)
  87. {
  88.     CAnnotName name;
  89.     if ( annot.IsSetName() ) {
  90.         name.SetNamed(annot.GetName());
  91.     }
  92.     
  93.     TLocationSet loc;
  94.     x_ParseLocation(loc, annot.GetSeq_loc());
  95.     if ( annot.IsSetAlign() ) {
  96.         SAnnotTypeSelector sel(CSeq_annot::TData::e_Align);
  97.         chunk.x_AddAnnotType(name, sel, loc);
  98.     }
  99.     if ( annot.IsSetGraph() ) {
  100.         SAnnotTypeSelector sel(CSeq_annot::TData::e_Graph);
  101.         chunk.x_AddAnnotType(name, sel, loc);
  102.     }
  103.         
  104.     ITERATE ( CID2S_Seq_annot_Info::TFeat, it, annot.GetFeat() ) {
  105.         const CID2S_Feat_type_Info& type = **it;
  106.         if ( type.IsSetSubtypes() ) {
  107.             ITERATE ( CID2S_Feat_type_Info::TSubtypes, sit,
  108.                       type.GetSubtypes() ) {
  109.                 SAnnotTypeSelector sel(CSeqFeatData::ESubtype(+*sit));
  110.                 chunk.x_AddAnnotType(name, sel, loc);
  111.             }
  112.         }
  113.         else {
  114.             SAnnotTypeSelector sel(CSeqFeatData::E_Choice(type.GetType()));
  115.             chunk.x_AddAnnotType(name, sel, loc);
  116.         }
  117.     }
  118. }
  119. inline
  120. void CSplitParser::x_AddWhole(TLocationSet& vec,
  121.                             const TLocationId& id)
  122. {
  123.     vec.push_back(TLocation(id, TLocationRange::GetWhole()));
  124. }
  125. inline
  126. void CSplitParser::x_AddInterval(TLocationSet& vec,
  127.                                const TLocationId& id,
  128.                                TSeqPos start, TSeqPos length)
  129. {
  130.     vec.push_back(TLocation(id, TLocationRange(start, start+length-1)));
  131. }
  132. void CSplitParser::x_ParseLocation(TLocationSet& vec,
  133.                                  const CID2_Seq_loc& loc)
  134. {
  135.     switch ( loc.Which() ) {
  136.     case CID2_Seq_loc::e_Gi_whole:
  137.     {
  138.         x_AddWhole(vec, loc.GetGi_whole());
  139.         break;
  140.     }
  141.     
  142.     case CID2_Seq_loc::e_Gi_whole_range:
  143.     {
  144.         const CID2_Id_Range& wr = loc.GetGi_whole_range();
  145.         for ( int gi = wr.GetStart(), end = gi+wr.GetCount(); gi < end; ++gi )
  146.             x_AddWhole(vec, gi);
  147.         break;
  148.     }
  149.     case CID2_Seq_loc::e_Interval:
  150.     {
  151.         const CID2_Interval& interval = loc.GetInterval();
  152.         x_AddInterval(vec,
  153.                       interval.GetGi(),
  154.                       interval.GetStart(),
  155.                       interval.GetLength());
  156.         break;
  157.     }
  158.     case CID2_Seq_loc::e_Packed_ints:
  159.     {
  160.         const CID2_Packed_Seq_ints& ints = loc.GetPacked_ints();
  161.         ITERATE ( CID2_Packed_Seq_ints::TIntervals, it, ints.GetIntervals() ) {
  162.             const CID2_Seq_range& interval = **it;
  163.             x_AddInterval(vec,
  164.                           ints.GetGi(),
  165.                           interval.GetStart(),
  166.                           interval.GetLength());
  167.         }
  168.         break;
  169.     }
  170.     case CID2_Seq_loc::e_Loc_set:
  171.     {
  172.         const CID2_Seq_loc::TLoc_set& loc_set = loc.GetLoc_set();
  173.         ITERATE ( CID2_Seq_loc::TLoc_set, it, loc_set ) {
  174.             x_ParseLocation(vec, **it);
  175.         }
  176.         break;
  177.     }
  178.     }
  179. }
  180. void CSplitParser::Load(CTSE_Chunk_Info& chunk,
  181.                       const CID2S_Chunk& id2_chunk)
  182. {
  183.     ITERATE ( CID2S_Chunk::TData, dit, id2_chunk.GetData() ) {
  184.         const CID2S_Chunk_Data& data = **dit;
  185.         CTSE_Chunk_Info::TPlace place;
  186.         if ( data.GetId().IsGi() ) {
  187.             place.first = CTSE_Chunk_Info::eBioseq;
  188.             place.second = data.GetId().GetGi();
  189.         }
  190.         else {
  191.             place.first = CTSE_Chunk_Info::eBioseq_set;
  192.             place.second = data.GetId().GetBioseq_set();
  193.         }
  194.         ITERATE ( CID2S_Chunk_Data::TDescrs, it, data.GetDescrs() ) {
  195.             NCBI_THROW(CLoaderException, eOtherError,
  196.                        "split descr is not supported");
  197.         }
  198.         ITERATE ( CID2S_Chunk_Data::TAnnots, it, data.GetAnnots() ) {
  199.             CSeq_annot& annot = const_cast<CSeq_annot&>(**it);
  200.             CRef<CSeq_annot_Info> annot_info(new CSeq_annot_Info(annot));
  201.             chunk.x_LoadAnnot(place, annot_info);
  202.         }
  203.         ITERATE ( CID2S_Chunk_Data::TAssembly, it, data.GetAssembly() ) {
  204.             NCBI_THROW(CLoaderException, eOtherError,
  205.                        "split assembly is not supported");
  206.         }
  207.         ITERATE ( CID2S_Chunk_Data::TSeq_map, it, data.GetSeq_map() ) {
  208.             NCBI_THROW(CLoaderException, eOtherError,
  209.                        "split seq-map is not supported");
  210.         }
  211.         ITERATE ( CID2S_Chunk_Data::TSeq_data, it, data.GetSeq_data() ) {
  212.             NCBI_THROW(CLoaderException, eOtherError,
  213.                        "split seq-data is not supported");
  214.         }
  215.     }
  216. }
  217. END_SCOPE(objects)
  218. END_NCBI_SCOPE
  219. /*
  220.  * $Log: split_parser.cpp,v $
  221.  * Revision 1000.1  2004/06/01 19:41:49  gouriano
  222.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  223.  *
  224.  * Revision 1.6  2004/05/21 21:42:52  gorelenk
  225.  * Added PCH ncbi_pch.hpp
  226.  *
  227.  * Revision 1.5  2004/03/16 15:47:29  vasilche
  228.  * Added CBioseq_set_Handle and set of EditHandles
  229.  *
  230.  * Revision 1.4  2004/02/17 21:19:35  vasilche
  231.  * Fixed 'non-const reference to temporary' warnings.
  232.  *
  233.  * Revision 1.3  2004/01/28 20:53:42  vasilche
  234.  * Added CSplitParser::Attach().
  235.  *
  236.  * Revision 1.2  2004/01/22 20:36:43  ucko
  237.  * Correct path to seqsplit__.hpp.
  238.  *
  239.  * Revision 1.1  2004/01/22 20:10:35  vasilche
  240.  * 1. Splitted ID2 specs to two parts.
  241.  * ID2 now specifies only protocol.
  242.  * Specification of ID2 split data is moved to seqsplit ASN module.
  243.  * For now they are still reside in one resulting library as before - libid2.
  244.  * As the result split specific headers are now in objects/seqsplit.
  245.  * 2. Moved ID2 and ID1 specific code out of object manager.
  246.  * Protocol is processed by corresponding readers.
  247.  * ID2 split parsing is processed by ncbi_xreader library - used by all readers.
  248.  * 3. Updated OBJMGR_LIBS correspondingly.
  249.  *
  250.  */