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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_helper.cpp,v $
  4.  * PRODUCTION Revision 1000.4  2004/06/01 19:25:11  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.58
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_helper.cpp,v 1000.4 2004/06/01 19:25:11 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. * Authors:  Eugene Vasilchenko, Aleksey Grichenko, Denis Vakatov
  35. *
  36. * File Description:
  37. *   Bio sequence data generator to test Object Manager
  38. */
  39. #include <ncbi_pch.hpp>
  40. #include "test_helper.hpp"
  41. #include <corelib/ncbithr.hpp>
  42. #include <objects/seqloc/Seq_point.hpp>
  43. #include <serial/object.hpp>
  44. #include <serial/objistr.hpp>
  45. #include <serial/objostr.hpp>
  46. #include <serial/objcopy.hpp>
  47. #include <serial/objectinfo.hpp>
  48. #include <serial/iterator.hpp>
  49. #include <serial/objectiter.hpp>
  50. #include <serial/serial.hpp>
  51. #include <objects/seq/Bioseq.hpp>
  52. #include <objects/seq/Seq_descr.hpp>
  53. #include <objects/seq/Seqdesc.hpp>
  54. #include <objects/seq/Seq_annot.hpp>
  55. #include <objects/seq/IUPACna.hpp>
  56. #include <objects/seq/NCBIeaa.hpp>
  57. #include <objects/seq/NCBI2na.hpp>
  58. #include <objects/seq/Seq_ext.hpp>
  59. #include <objects/seq/Seg_ext.hpp>
  60. #include <objects/seqset/Bioseq_set.hpp>
  61. #include <objects/seqloc/Seq_loc.hpp>
  62. #include <objects/seqloc/Seq_interval.hpp>
  63. #include <objects/seqfeat/Seq_feat.hpp>
  64. #include <objects/seqfeat/SeqFeatData.hpp>
  65. #include <objects/seqfeat/Feat_id.hpp>
  66. #include <objects/seqfeat/Cdregion.hpp>
  67. #include <objects/seqfeat/Genetic_code.hpp>
  68. #include <objects/seqalign/Dense_diag.hpp>
  69. #include <objects/seq/Seq_inst.hpp>
  70. #include <objects/seqalign/Seq_align.hpp>
  71. #include <objmgr/bioseq_handle.hpp>
  72. #include <objmgr/seq_vector.hpp>
  73. #include <objmgr/seq_vector_ci.hpp>
  74. #include <objmgr/seq_descr_ci.hpp>
  75. #include <objmgr/feat_ci.hpp>
  76. #include <objmgr/align_ci.hpp>
  77. #include <objects/seq/seqport_util.hpp>
  78. #include <objects/general/Date.hpp>
  79. // #include <objects/util/sequence.hpp>
  80. #include <test/test_assert.h>  /* This header must go last */
  81. BEGIN_NCBI_SCOPE
  82. BEGIN_SCOPE(objects)
  83. bool CDataGenerator::sm_DumpEntries = false;
  84. /************************************************************************
  85.     1.2.1.1. Bio sequences for testing
  86.     Test entry = 1 top-level entry + 2 sub-entries (continuous sequence)
  87.     TSE contains 1 description
  88.     each sub-entry has
  89.         two Seq_ids: local and GI, (local ids = 11+1000i, 12+1000i)
  90.         one description,
  91.         two annotations (Seq_feat)
  92.             first - for an interval, local Seq_id:
  93.                 "plus" strand for one sub-entry,
  94.                 "minus" strand for another one
  95.             second - for the whole seq, GI Seq_id
  96.     one sub-entry has also an alignment annotation
  97. ************************************************************************/
  98. CSeq_entry& CDataGenerator::CreateTestEntry1(int index)
  99. {
  100.     // create top level seq entry
  101.     CRef<CSeq_entry> entry(new CSeq_entry);
  102.     CBioseq_set& set = entry->SetSet();
  103.     // class = nucleic acid and coded proteins
  104.     set.SetClass(CBioseq_set::eClass_nuc_prot);
  105.     // add description (name)
  106.     list< CRef<CSeqdesc> >& descr = set.SetDescr().Set();
  107.     CRef<CSeqdesc> desc(new CSeqdesc);
  108.     desc->SetName("D1 from TSE1-"+NStr::IntToString(index));
  109.     descr.push_back(desc);
  110.     // list of sub-entries
  111.     list< CRef<CSeq_entry> >& seq_set = set.SetSeq_set();
  112.     // Sub-entry Seq 11
  113.     {{
  114.         CRef<CSeq_entry> sub_entry(new CSeq_entry);
  115.         CBioseq& seq = sub_entry->SetSeq();
  116.         CBioseq::TId& id_list = seq.SetId();
  117.         // list of Ids (local + gi)
  118.         CRef<CSeq_id> id(new CSeq_id);
  119.         id->SetLocal().SetStr("seq"+NStr::IntToString(11+index*1000));
  120.         id_list.push_back(id);
  121.         id.Reset(new CSeq_id);
  122.         id->SetGi(11+index*1000);
  123.         id_list.push_back(id);
  124.         // Description (name)
  125.         list< CRef<CSeqdesc> >& descr1 = seq.SetDescr().Set();
  126.         CRef<CSeqdesc> desc1(new CSeqdesc);
  127.         desc1->SetName("D1 from BS11-"+NStr::IntToString(index));
  128.         descr1.push_back(desc1);
  129.         // Instance (sequence data)
  130.         CSeq_inst& inst = seq.SetInst();
  131.         // representation class = continuous sequence
  132.         inst.SetRepr(CSeq_inst::eRepr_raw);
  133.         // molecule class in living organism = dna
  134.         inst.SetMol(CSeq_inst::eMol_dna);
  135.         // length of sequence in residues
  136.         inst.SetLength(40);
  137.         // seq data in Iupacna
  138.         inst.SetSeq_data().SetIupacna().Set(
  139.             "CAGCAGCGGTACAGGAGGGTGAGACATCCCAGAGCGGTGC");
  140.         // strandedness in living organism = double strand
  141.         inst.SetStrand(CSeq_inst::eStrand_ds);
  142.         // Annotations
  143.         list< CRef<CSeq_annot> >& annot_list = seq.SetAnnot();
  144.         CRef<CSeq_annot> annot(new CSeq_annot);
  145.         // list of features
  146.         list< CRef<CSeq_feat> >& ftable = annot->SetData().SetFtable();
  147.         {{
  148.             CRef<CSeq_feat> feat(new CSeq_feat);
  149.             // feature Id
  150.             feat->SetId().SetLocal().SetStr("F1: lcl|11");
  151.             // the specific data
  152.             CSeqFeatData& fdata = feat->SetData();
  153.             CCdregion& cdreg = fdata.SetCdregion();
  154.             cdreg.SetFrame(CCdregion::eFrame_one);
  155.             // genetic code used
  156.             list< CRef< CGenetic_code::C_E > >& gcode = cdreg.SetCode().Set();
  157.             CRef< CGenetic_code::C_E > ce(new CGenetic_code::C_E);
  158.             ce->SetId(111); // TSE=1; seq=1; feat=1
  159.             gcode.push_back(ce);
  160.             // feature location on the sequence: Seq_interval (local seq_Id)
  161.             CSeq_interval& floc = feat->SetLocation().SetInt();
  162.             floc.SetId().SetLocal().SetStr
  163.                 ("seq"+NStr::IntToString(11+index*1000));
  164.             floc.SetFrom(20);
  165.             floc.SetTo(30);
  166.             ftable.push_back(feat);
  167.         }}
  168.         {{
  169.             CRef<CSeq_feat> feat(new CSeq_feat);
  170.             // feature Id
  171.             feat->SetId().SetLocal().SetStr("F2: gi|11");
  172.             // the specific data
  173.             CSeqFeatData& fdata = feat->SetData();
  174.             CCdregion& cdreg = fdata.SetCdregion();
  175.             cdreg.SetFrame(CCdregion::eFrame_one);
  176.             // genetic code used
  177.             list< CRef< CGenetic_code::C_E > >& gcode = cdreg.SetCode().Set();
  178.             CRef< CGenetic_code::C_E > ce(new CGenetic_code::C_E);
  179.             ce->SetId(112); // TSE=1; seq=1; feat=2
  180.             gcode.push_back(ce);
  181.             // feature location on the sequence (seq_Id + "whole" sequence)
  182.             feat->SetLocation().SetWhole().SetGi(11+index*1000);
  183.             ftable.push_back(feat);
  184.         }}
  185.         annot_list.push_back(annot);
  186.         // Add sub-entry
  187.         seq_set.push_back(sub_entry);
  188.     }}
  189.     // Sub-entry Seq 12
  190.     {{
  191.         CRef<CSeq_entry> sub_entry(new CSeq_entry);
  192.         CBioseq& seq = sub_entry->SetSeq();
  193.         CBioseq::TId& id_list = seq.SetId();
  194.         // list of Ids (local + gi)
  195.         CRef<CSeq_id> id(new CSeq_id);
  196.         id->SetLocal().SetStr("seq"+NStr::IntToString(12+index*1000));
  197.         id_list.push_back(id);
  198.         id.Reset(new CSeq_id);
  199.         id->SetGi(12+index*1000);
  200.         id_list.push_back(id);
  201.         // Instance (sequence data)
  202.         CSeq_inst& inst = seq.SetInst();
  203.         // representation class = continuous sequence
  204.         inst.SetRepr(CSeq_inst::eRepr_raw);
  205.         // molecule class in living organism = dna
  206.         inst.SetMol(CSeq_inst::eMol_dna);
  207.         // length of sequence in residues
  208.         inst.SetLength(40);
  209.         // seq data in Iupacna
  210.         inst.SetSeq_data().SetIupacna().Set(
  211.             "CAATAACCTCAGCAGCAACAAGTGGCTTCCAGCGCCCTCC");
  212.         // strandedness in living organism = double strand
  213.         inst.SetStrand(CSeq_inst::eStrand_ds);
  214.         // Annotations
  215.         list< CRef<CSeq_annot> >& annot_list = seq.SetAnnot();
  216.         {{
  217.             CRef<CSeq_annot> annot(new CSeq_annot);
  218.             // list of features
  219.             list< CRef<CSeq_feat> >& ftable = annot->SetData().SetFtable();
  220.             {{
  221.                 CRef<CSeq_feat> feat(new CSeq_feat);
  222.                 // feature Id
  223.                 feat->SetId().SetLocal().SetStr("F3: gi|12");
  224.                 // the specific data
  225.                 CSeqFeatData& fdata = feat->SetData();
  226.                 CCdregion& cdreg = fdata.SetCdregion();
  227.                 cdreg.SetFrame(CCdregion::eFrame_one);
  228.                 // genetic code used
  229.                 list< CRef< CGenetic_code::C_E > >& gcode =
  230.                     cdreg.SetCode().Set();
  231.                 CRef< CGenetic_code::C_E > ce(new CGenetic_code::C_E);
  232.                 ce->SetId(123); // TSE=1; seq=2; feat=3
  233.                 gcode.push_back(ce);
  234.                 // feature location on the sequence: Seq_interval (gi seq_Id)
  235.                 CSeq_interval& floc = feat->SetLocation().SetInt();
  236.                 floc.SetId().SetGi(12+index*1000);
  237.                 floc.SetFrom(20);
  238.                 floc.SetTo(30);
  239.                 // minus strand
  240.                 floc.SetStrand(eNa_strand_minus);
  241.                 ftable.push_back(feat);
  242.             }}
  243.             {{
  244.                 CRef<CSeq_feat> feat(new CSeq_feat);
  245.                 // feature Id
  246.                 feat->SetId().SetLocal().SetStr("F4: lcl|12");
  247.                 // the specific data
  248.                 CSeqFeatData& fdata = feat->SetData();
  249.                 CCdregion& cdreg = fdata.SetCdregion();
  250.                 cdreg.SetFrame(CCdregion::eFrame_one);
  251.                 // genetic code used
  252.                 list< CRef< CGenetic_code::C_E > >& gcode =
  253.                     cdreg.SetCode().Set();
  254.                 CRef< CGenetic_code::C_E > ce(new CGenetic_code::C_E);
  255.                 ce->SetId(124); // TSE=1; seq=2; feat=4
  256.                 gcode.push_back(ce);
  257.                 // feature location on the sequence (seq_Id + "whole" sequence)
  258.                 feat->SetLocation().SetWhole().SetLocal().SetStr
  259.                     ("seq"+NStr::IntToString(12+index*1000));
  260.                 ftable.push_back(feat);
  261.             }}
  262.             annot_list.push_back(annot);
  263.         }}
  264.         {{
  265.             CRef<CSeq_annot> annot(new CSeq_annot);
  266.             // list of seq alignments
  267.             list< CRef<CSeq_align> >& atable = annot->SetData().SetAlign();
  268.             {{
  269.                 // CAGCAGC:
  270.                 // 11[0], 12[9]
  271.                 CRef<CSeq_align> align(new CSeq_align);
  272.                 align->SetType(CSeq_align::eType_not_set);
  273.                 // alignment data
  274.                 CSeq_align::C_Segs& segs = align->SetSegs();
  275.                 // for (multiway) diagonals
  276.                 CSeq_align::C_Segs::TDendiag& diag_list = segs.SetDendiag();
  277.                 CRef<CDense_diag> diag(new CDense_diag);
  278.                 // dimensionality = 2
  279.                 diag->SetDim(2);
  280.                 // list of Seq_ids (gi) (sequences in order)
  281.                 CDense_diag::TIds& id_list = diag->SetIds();
  282.                 CRef<CSeq_id> id(new CSeq_id);
  283.                 id->SetGi(11+index*1000);
  284.                 id_list.push_back(id);
  285.                 id.Reset(new CSeq_id);
  286.                 id->SetGi(12+index*1000);
  287.                 id_list.push_back(id);
  288.                 // start OFFSETS in ids order
  289.                 CDense_diag::TStarts& start_list = diag->SetStarts();
  290.                 start_list.push_back(0);
  291.                 start_list.push_back(9);
  292.                 diag->SetLen(7);
  293.                 diag_list.push_back(diag);
  294.                 atable.push_back(align);
  295.             }}
  296.             annot_list.push_back(annot);
  297.         }}
  298.         // Add sub-entry
  299.         seq_set.push_back(sub_entry);
  300.     }}
  301.     if ( sm_DumpEntries ) {
  302.         NcbiCout << "-------------------- "
  303.             "TestEntry1 --------------------" << NcbiEndl;
  304.         auto_ptr<CObjectOStream>
  305.             out(CObjectOStream::Open(eSerial_AsnText, NcbiCout));
  306.         *out << *entry;
  307.     }
  308.     return *entry.Release();
  309. }
  310. /************************************************************************
  311.     1.2.1.2. Bio sequences for testing
  312.     Test entry = 1 top-level entry + 2 sub-entries (continuous sequence)
  313.     each sub-entry has
  314.         two Seq_ids: local and GI, (local ids = 11+1000i, 12+1000i)
  315.     No descriptions, No annotations
  316. ************************************************************************/
  317. CSeq_entry& CDataGenerator::CreateTestEntry1a(int index)
  318. {
  319.     // create top level seq entry
  320.     CRef<CSeq_entry> entry(new CSeq_entry);
  321.     CBioseq_set& set = entry->SetSet();
  322.     // class = nucleic acid and coded proteins
  323.     set.SetClass(CBioseq_set::eClass_nuc_prot);
  324.     list< CRef<CSeq_entry> >& seq_set = set.SetSeq_set();
  325.     // Sub-entry Seq 11
  326.     {{
  327.         CRef<CSeq_entry> sub_entry(new CSeq_entry);
  328.         CBioseq& seq = sub_entry->SetSeq();
  329.         CBioseq::TId& id_list = seq.SetId();
  330.         // list of Ids (local + gi)
  331.         CRef<CSeq_id> id(new CSeq_id);
  332.         id->SetLocal().SetStr("seq"+NStr::IntToString(11+index*1000));
  333.         id_list.push_back(id);
  334.         id.Reset(new CSeq_id);
  335.         id->SetGi(11+index*1000);
  336.         id_list.push_back(id);
  337.         // Instance (sequence data)
  338.         CSeq_inst& inst = seq.SetInst();
  339.         // representation class = continuous sequence
  340.         inst.SetRepr(CSeq_inst::eRepr_raw);
  341.         // molecule class in living organism = dna
  342.         inst.SetMol(CSeq_inst::eMol_dna);
  343.         // length of sequence in residues
  344.         inst.SetLength(40);
  345.         // seq data in Iupacna
  346.         inst.SetSeq_data().SetIupacna().Set(
  347.             "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
  348.         // strandedness in living organism = double strand
  349.         inst.SetStrand(CSeq_inst::eStrand_ds);
  350.         // Add sub-entry
  351.         seq_set.push_back(sub_entry);
  352.     }}
  353.     // Sub-entry Seq 12
  354.     {{
  355.         CRef<CSeq_entry> sub_entry(new CSeq_entry);
  356.         CBioseq& seq = sub_entry->SetSeq();
  357.         CBioseq::TId& id_list = seq.SetId();
  358.         // list of Ids (local + gi)
  359.         CRef<CSeq_id> id(new CSeq_id);
  360.         id->SetLocal().SetStr("seq"+NStr::IntToString(12+index*1000));
  361.         id_list.push_back(id);
  362.         id.Reset(new CSeq_id);
  363.         id->SetGi(12+index*1000);
  364.         id_list.push_back(id);
  365.         // Instance (sequence data)
  366.         CSeq_inst& inst = seq.SetInst();
  367.         inst.SetRepr(CSeq_inst::eRepr_raw);
  368.         inst.SetMol(CSeq_inst::eMol_dna);
  369.         // length of sequence in residues
  370.         inst.SetLength(40);
  371.         // seq data in Iupacna
  372.         inst.SetSeq_data().SetIupacna().Set(
  373.             "TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT");
  374.         inst.SetStrand(CSeq_inst::eStrand_ds);
  375.         // Add sub-entry
  376.         seq_set.push_back(sub_entry);
  377.     }}
  378.     if ( sm_DumpEntries ) {
  379.         NcbiCout << "-------------------- "
  380.             "TestEntry1a --------------------" << NcbiEndl;
  381.         auto_ptr<CObjectOStream>
  382.             out(CObjectOStream::Open(eSerial_AsnText, NcbiCout));
  383.         *out << *entry;
  384.     }
  385.     return *entry.Release();
  386. }
  387. /************************************************************************
  388.     1.2.1.3. Bio sequences for testing
  389.     Test entry = 1 top-level entry + 3 sub-entries
  390.     TSE
  391.         one annotation (Seq_feat), which refers to ids 12+1000i and 21+1000i
  392.     1 sub-entry
  393.         two Seq_ids: local and GI, (local id = 21+1000i)
  394.         one description
  395.         segmented sequence: references to
  396.             an interval, ( id= 11+1000i)
  397.             whole seq,   ( id= 12+1000i)
  398.             self         ( id= 21+1000i)
  399.         two annotations (Seq_feat)
  400.             both - for an interval,  local Seq_id = 11+1000i
  401.     2 sub-entry
  402.         two Seq_ids: local and GI, (local id = 22+1000i)
  403.         continuous sequence
  404.     3 sub-entry
  405.         two Seq_ids: local and GI, (local id = 23+1000i)
  406.         continuous sequence
  407.         conversion from one seq.data format to another
  408. ************************************************************************/
  409. CSeq_entry& CDataGenerator::CreateTestEntry2(int index)
  410. {
  411.     // create top level seq entry
  412.     CRef<CSeq_entry> entry(new CSeq_entry);
  413.     CBioseq_set& set = entry->SetSet();
  414.     // class = nucleic acid and coded proteins
  415.     set.SetClass(CBioseq_set::eClass_nuc_prot);
  416.     list< CRef<CSeq_entry> >& seq_set = set.SetSeq_set();
  417.     // Sub-entry Seq 21
  418.     {{
  419.         CRef<CSeq_entry> sub_entry(new CSeq_entry);
  420.         CBioseq& seq = sub_entry->SetSeq();
  421.         CBioseq::TId& id_list = seq.SetId();
  422.         // list of Ids (local + gi)
  423.         CRef<CSeq_id> id(new CSeq_id);
  424.         id->SetLocal().SetStr("seq"+NStr::IntToString(21+index*1000));
  425.         id_list.push_back(id);
  426.         id.Reset(new CSeq_id);
  427.         id->SetGi(21+index*1000);
  428.         id_list.push_back(id);
  429.         // Description (name)
  430.         list< CRef<CSeqdesc> >& descr1 = seq.SetDescr().Set();
  431.         CRef<CSeqdesc> desc1(new CSeqdesc);
  432.         desc1->SetName("D3 from bioseq 21-"+NStr::IntToString(index));
  433.         descr1.push_back(desc1);
  434.         // Instance (sequence data)
  435.         CSeq_inst& inst = seq.SetInst();
  436.         // representation class = segmented sequence
  437.         inst.SetRepr(CSeq_inst::eRepr_seg);
  438.         // molecule class in living organism = dna
  439.         inst.SetMol(CSeq_inst::eMol_dna);
  440.         // segments = list of Seq_locs
  441.         CSeg_ext::Tdata& seg_list = inst.SetExt().SetSeg();
  442.         // Seq_interval (gi)
  443.         CRef<CSeq_loc> loc(new CSeq_loc);
  444.         CSeq_interval& ref_loc = loc->SetInt();
  445.         ref_loc.SetId().SetGi(11+index*1000);
  446.         ref_loc.SetFrom(0);
  447.         ref_loc.SetTo(4);
  448.         seg_list.push_back(loc);
  449.         // whole sequence (gi)
  450.         loc = new CSeq_loc;
  451.         loc->SetWhole().SetGi(12+index*1000);
  452.         seg_list.push_back(loc);
  453.         // Seq_interval (gi)
  454.         loc = new CSeq_loc;
  455.         CSeq_interval& ref_loc2 = loc->SetInt();
  456.         // "simple" self-reference
  457.         ref_loc2.SetId().SetGi(21+index*1000);
  458.         ref_loc2.SetFrom(0);
  459.         ref_loc2.SetTo(9);
  460.         seg_list.push_back(loc);
  461.         // More complicated self-reference
  462.         loc = new CSeq_loc;
  463.         CSeq_interval& ref_loc3 = loc->SetInt();
  464.         ref_loc3.SetId().SetGi(21+index*1000);
  465.         ref_loc3.SetFrom(54);
  466.         ref_loc3.SetTo(60);
  467.         seg_list.push_back(loc);
  468.         inst.SetStrand(CSeq_inst::eStrand_ds);
  469.         // Annotations
  470.         list< CRef<CSeq_annot> >& annot_list = seq.SetAnnot();
  471.         CRef<CSeq_annot> annot(new CSeq_annot);
  472.         // list of features
  473.         list< CRef<CSeq_feat> >& ftable = annot->SetData().SetFtable();
  474.         {{
  475.             CRef<CSeq_feat> feat(new CSeq_feat);
  476.             // feature Id
  477.             feat->SetId().SetLocal().SetStr("F5: lcl|11");
  478.             // the specific data
  479.             CSeqFeatData& fdata = feat->SetData();
  480.             CCdregion& cdreg = fdata.SetCdregion();
  481.             cdreg.SetFrame(CCdregion::eFrame_one);
  482.             // genetic code used
  483.             list< CRef< CGenetic_code::C_E > >& gcode = cdreg.SetCode().Set();
  484.             CRef< CGenetic_code::C_E > ce(new CGenetic_code::C_E);
  485.             ce->SetId(215); // TSE=2; seq=1; feat=5
  486.             gcode.push_back(ce);
  487.             // feature location on the sequence: Seq_interval (local seq_Id)
  488.             CSeq_interval& floc = feat->SetLocation().SetInt();
  489.             floc.SetId().SetLocal().SetStr
  490.                 ("seq"+NStr::IntToString(11+index*1000));
  491.             floc.SetFrom(20);
  492.             floc.SetTo(30);
  493.             // plus strand
  494.             floc.SetStrand(eNa_strand_plus);
  495.             ftable.push_back(feat);
  496.         }}
  497.         {{
  498.             CRef<CSeq_feat> feat(new CSeq_feat);
  499.             // feature Id
  500.             feat->SetId().SetLocal().SetStr("F6: gi|11");
  501.             // the specific data
  502.             CSeqFeatData& fdata = feat->SetData();
  503.             CCdregion& cdreg = fdata.SetCdregion();
  504.             cdreg.SetFrame(CCdregion::eFrame_one);
  505.             // genetic code used
  506.             list< CRef< CGenetic_code::C_E > >& gcode = cdreg.SetCode().Set();
  507.             CRef< CGenetic_code::C_E > ce(new CGenetic_code::C_E);
  508.             ce->SetId(216); // TSE=2; seq=1; feat=6
  509.             gcode.push_back(ce);
  510.             // feature location on the sequence: Seq_interval (gi seq_Id)
  511.             CSeq_interval& floc = feat->SetLocation().SetInt();
  512.             floc.SetId().SetGi(11+index*1000);
  513.             floc.SetFrom(5);
  514.             floc.SetTo(15);
  515.             ftable.push_back(feat);
  516.         }}
  517.         annot_list.push_back(annot);
  518.         // Add sub-entry
  519.         seq_set.push_back(sub_entry);
  520.     }}
  521.     // Sub-entry Seq 22
  522.     {{
  523.         CRef<CSeq_entry> sub_entry(new CSeq_entry);
  524.         CBioseq& seq = sub_entry->SetSeq();
  525.         CBioseq::TId& id_list = seq.SetId();
  526.         // list of Ids (local + gi)
  527.         CRef<CSeq_id> id(new CSeq_id);
  528.         id->SetLocal().SetStr
  529.             ("seq"+NStr::IntToString(22+index*1000));
  530.         id_list.push_back(id);
  531.         id.Reset(new CSeq_id);
  532.         id->SetGi(22+index*1000);
  533.         id_list.push_back(id);
  534.         // Instance (sequence data)
  535.         CSeq_inst& inst = seq.SetInst();
  536.         // representation class = continuous sequence
  537.         inst.SetRepr(CSeq_inst::eRepr_raw);
  538.         // molecule class in living organism = aa (amino acid)
  539.         inst.SetMol(CSeq_inst::eMol_aa);
  540.         // length of sequence in residues
  541.         inst.SetLength(20);
  542.         // seq data in Ncbieaa
  543.         inst.SetSeq_data().SetNcbieaa().Set("QGCGEQTMTLLAPTLAASRY");
  544.         // single strand
  545.         inst.SetStrand(CSeq_inst::eStrand_ss);
  546.         // Add sub-entry
  547.         seq_set.push_back(sub_entry);
  548.     }}
  549.     // Sub-entry Seq 23
  550.     {{
  551.         CRef<CSeq_entry> sub_entry(new CSeq_entry);
  552.         CBioseq& seq = sub_entry->SetSeq();
  553.         CBioseq::TId& id_list = seq.SetId();
  554.         // list of Ids (local + gi)
  555.         CRef<CSeq_id> id(new CSeq_id);
  556.         id->SetLocal().SetStr
  557.             ("seq"+NStr::IntToString(23+index*1000));
  558.         id_list.push_back(id);
  559.         id.Reset(new CSeq_id);
  560.         id->SetGi(23+index*1000);
  561.         id_list.push_back(id);
  562.         // Instance (sequence data)
  563.         CSeq_inst& inst = seq.SetInst();
  564.         // representation class = continuous sequence
  565.         inst.SetRepr(CSeq_inst::eRepr_raw);
  566.         // molecule class in living organism = dna
  567.         inst.SetMol(CSeq_inst::eMol_dna);
  568.         // length of sequence in residues
  569.         inst.SetLength(13);
  570.         // seq data in Iupacna
  571.         inst.SetSeq_data().SetIupacna().Set("ATGCAGCTGTACG");
  572.         // double strand
  573.         inst.SetStrand(CSeq_inst::eStrand_ds);
  574.         CRef<CSeq_data> packed_data(new CSeq_data);
  575.         // convert seq data to another format
  576.         // (NCBI2na = 2 bit nucleic acid code)
  577.         CSeqportUtil::Convert(inst.GetSeq_data(),
  578.                               packed_data,
  579.                               CSeq_data::e_Ncbi2na);
  580.         inst.SetSeq_data(*packed_data);
  581.         // Add sub-entry
  582.         seq_set.push_back(sub_entry);
  583.     }}
  584.     // Annotations
  585.     list< CRef<CSeq_annot> >& set_annot_list = set.SetAnnot();
  586.     CRef<CSeq_annot> annot(new CSeq_annot);
  587.     // list of features
  588.     list< CRef<CSeq_feat> >& ftable = annot->SetData().SetFtable();
  589.     {{
  590.         CRef<CSeq_feat> feat(new CSeq_feat);
  591.         // feature Id
  592.         feat->SetId().SetLocal().SetStr("F7: lcl|21 + gi|12");
  593.         // the specific data
  594.         CSeqFeatData& fdata = feat->SetData();
  595.         CCdregion& cdreg = fdata.SetCdregion();
  596.         cdreg.SetFrame(CCdregion::eFrame_one);
  597.         // genetic code used
  598.         list< CRef< CGenetic_code::C_E > >& gcode = cdreg.SetCode().Set();
  599.         CRef< CGenetic_code::C_E > ce(new CGenetic_code::C_E);
  600.         ce->SetId(207); // TSE=2; no seq; feat=7
  601.         gcode.push_back(ce);
  602.         // feature location on the sequence: Seq_interval (local seq_Id)
  603.         CSeq_interval& floc = feat->SetLocation().SetInt();
  604.         floc.SetId().SetLocal().SetStr
  605.             ("seq"+NStr::IntToString(21+index*1000));
  606.         floc.SetFrom(1);
  607.         floc.SetTo(20);
  608.         // product of process (seq_loc = whole, gi)
  609.         feat->SetProduct().SetWhole().SetGi(12+index*1000);
  610.         ftable.push_back(feat);
  611.     }}
  612.     set_annot_list.push_back(annot);
  613.     if ( sm_DumpEntries ) {
  614.         NcbiCout << "-------------------- "
  615.             "TestEntry2 --------------------" << NcbiEndl;
  616.         auto_ptr<CObjectOStream>
  617.             out(CObjectOStream::Open(eSerial_AsnText, NcbiCout));
  618.         *out << *entry;
  619.     }
  620.     return *entry.Release();
  621. }
  622. /************************************************************************
  623.     1.2.1.4. Bio sequences for testing
  624.     Test entry = 1 top-level entry
  625.     TSE
  626.         only contains references to other sequences
  627. ************************************************************************/
  628. CSeq_entry& CDataGenerator::CreateConstructedEntry(int idx, int index)
  629. {
  630.     CSeq_loc constr_loc;
  631.     list< CRef<CSeq_interval> >& int_list = constr_loc.SetPacked_int();
  632.     CRef<CSeq_interval> int_ref(new CSeq_interval);
  633.     int_ref->SetId().SetGi(11+idx*1000);
  634.     int_ref->SetFrom(5);
  635.     int_ref->SetTo(10);
  636.     if (index == 2) {
  637.         int_ref->SetStrand(eNa_strand_minus);
  638.     }
  639.     int_list.push_back(int_ref);
  640.     int_ref.Reset(new CSeq_interval);
  641.     int_ref->SetId().SetGi(12+idx*1000);
  642.     int_ref->SetFrom(0);
  643.     int_ref->SetTo(20);
  644.     int_list.push_back(int_ref);
  645.     CRef<CBioseq> constr_seq(new CBioseq(constr_loc,
  646.         "constructed"+NStr::IntToString(index)));
  647.     CRef<CSeq_entry> constr_entry(new CSeq_entry);
  648.     constr_entry->SetSeq(*constr_seq);
  649.     if ( sm_DumpEntries ) {
  650.         NcbiCout << "-------------------- "
  651.             "ConstructedEntry --------------------" << NcbiEndl;
  652.         auto_ptr<CObjectOStream>
  653.             out(CObjectOStream::Open(eSerial_AsnText, NcbiCout));
  654.         *out << *constr_entry;
  655.     }
  656.     return *constr_entry.Release();
  657. }
  658. /************************************************************************
  659.     1.2.1.4. Bio sequences for testing
  660.     Test entry = 1 top-level entry
  661.     TSE
  662.         Construct bioseq by excluding the seq-loc
  663. ************************************************************************/
  664. /*
  665. CSeq_entry& CDataGenerator::CreateConstructedExclusionEntry(int idx, int index)
  666. {
  667.     CSeq_loc loc;
  668.     CSeq_loc_mix::Tdata& mix = loc.SetMix().Set();
  669.     CRef<CSeq_loc> sl;
  670.     sl.Reset(new CSeq_loc);
  671.     sl->SetPnt().SetId().SetGi(11+idx*1000);
  672.     sl->SetPnt().SetPoint(0);
  673.     mix.push_back(sl);
  674.     sl.Reset(new CSeq_loc);
  675.     sl->SetInt().SetId().SetGi(11+idx*1000);
  676.     sl->SetInt().SetFrom(0);
  677.     sl->SetInt().SetTo(4);
  678.     mix.push_back(sl);
  679.     sl.Reset(new CSeq_loc);
  680.     sl->SetInt().SetId().SetGi(11+idx*1000);
  681.     sl->SetInt().SetFrom(10);
  682.     sl->SetInt().SetTo(15);
  683.     mix.push_back(sl);
  684.     sl.Reset(new CSeq_loc);
  685.     sl->SetInt().SetId().SetGi(11+idx*1000);
  686.     sl->SetInt().SetFrom(10);
  687.     sl->SetInt().SetTo(12);
  688.     mix.push_back(sl);
  689.     sl.Reset(new CSeq_loc);
  690.     sl->SetInt().SetId().SetGi(11+idx*1000);
  691.     sl->SetInt().SetFrom(13);
  692.     sl->SetInt().SetTo(15);
  693.     mix.push_back(sl);
  694.     sl.Reset(new CSeq_loc);
  695.     sl->SetInt().SetId().SetGi(11+idx*1000);
  696.     sl->SetInt().SetFrom(8);
  697.     sl->SetInt().SetTo(18);
  698.     mix.push_back(sl);
  699.     sl.Reset(new CSeq_loc);
  700.     sl->SetPnt().SetId().SetGi(11+idx*1000);
  701.     sl->SetPnt().SetPoint(20);
  702.     mix.push_back(sl);
  703.     sl.Reset(new CSeq_loc);
  704.     sl->SetPnt().SetId().SetGi(11+idx*1000);
  705.     sl->SetPnt().SetPoint(39);
  706.     mix.push_back(sl);
  707.     CRef<CBioseq> constr_ex_seq(&CBioseq::ConstructExcludedSequence(loc, 40,
  708.         "construct_exclusion"+NStr::IntToString(index)));
  709.     CRef<CSeq_entry> constr_ex_entry(new CSeq_entry);
  710.     constr_ex_entry->SetSeq(*constr_ex_seq);
  711.     return *constr_ex_entry.Release();
  712. }
  713. */
  714. CSeq_annot& CDataGenerator::CreateAnnotation1(int index)
  715. {
  716.     CRef<CSeq_annot> annot(new CSeq_annot);
  717.     list< CRef<CSeq_feat> >& ftable = annot->SetData().SetFtable();
  718.     {{
  719.         CRef<CSeq_feat> feat(new CSeq_feat);
  720.         feat->SetId().SetLocal().SetStr("attached feature");
  721.         CSeqFeatData& fdata = feat->SetData();
  722.         CCdregion& cdreg = fdata.SetCdregion();
  723.         cdreg.SetFrame(CCdregion::eFrame_one);
  724.         list< CRef< CGenetic_code::C_E > >& gcode = cdreg.SetCode().Set();
  725.         CRef< CGenetic_code::C_E > ce(new CGenetic_code::C_E);
  726.         ce->SetId(999);
  727.         gcode.push_back(ce);
  728.         feat->SetComment() = "Feature attached after indexing the entry";
  729.         //feat->SetLocation().SetWhole().SetGi(11+index*1000);
  730.         CSeq_interval& interval = feat->SetLocation().SetInt();
  731.         interval.SetId().SetGi(11+index*1000);
  732.         interval.SetFrom(1);
  733.         interval.SetTo(9);
  734.         interval.SetStrand(eNa_strand_unknown);
  735.         ftable.push_back(feat);
  736.     }}
  737.     if ( sm_DumpEntries ) {
  738.         NcbiCout << "-------------------- "
  739.             "Annotation1 --------------------" << NcbiEndl;
  740.         auto_ptr<CObjectOStream>
  741.             out(CObjectOStream::Open(eSerial_AsnText, NcbiCout));
  742.         *out << *annot;
  743.     }
  744.     return *annot.Release();
  745. }
  746. /////////////////////////////////////////////////////////////////////////////
  747. /************************************************************************
  748.     1.2.2. Test function
  749.     Input: scope + seq_id
  750.         other parameters - only to verify results.
  751.     Operations:
  752.         investigate SeqMap, verify lengths
  753.         investigate SeqVector, verify seq.data (as strings)
  754.         investigate SeqMap again - some references may be resolved now
  755.         enumerate descriptions
  756.         enumerate features for the whole sequence
  757.         enumerate features for an interval
  758.         enumerate alignments for the whole sequence
  759.         enumerate alignments for an interval
  760. ************************************************************************/
  761. #define CHECK_WRAP() 
  762.     {{ 
  763.         bool got_exception = false; 
  764.         try {
  765. #define CHECK_END2(MSG, have_errors) 
  766.         } catch (exception) { 
  767.             got_exception = true; 
  768.             if ( !have_errors ) { 
  769.                 LOG_POST("Can not " MSG); throw; 
  770.             } 
  771.         } 
  772.         if ( have_errors && !got_exception ) { 
  773.             THROW1_TRACE(runtime_error, 
  774.                          "Managed to " MSG " of erroneous sequence"); 
  775.         } 
  776.     }}
  777. #define CHECK_END(MSG)         CHECK_END2(MSG, have_errors)
  778. #define CHECK_END_ALWAYS(MSG)  CHECK_END2(MSG, false)
  779. bool CTestHelper::sm_DumpFeatures = false;
  780. #if defined _MT
  781. bool CTestHelper::sm_TestRemoveEntry = false;
  782. #else 
  783. bool CTestHelper::sm_TestRemoveEntry = true;
  784. #endif
  785. void CTestHelper::ProcessBioseq(CScope& scope, CSeq_id& id,
  786.                                 TSeqPos seq_len,
  787.                                 string seq_str, string seq_str_compl,
  788.                                 int seq_desc_cnt,
  789.                                 int seq_feat_ra_cnt, // resolve-all method
  790.                                 int seq_feat_cnt, int seq_featrg_cnt,
  791.                                 int seq_align_cnt, int seq_alignrg_cnt,
  792.                                 size_t feat_annots_cnt,
  793.                                 size_t featrg_annots_cnt,
  794.                                 size_t align_annots_cnt,
  795.                                 size_t alignrg_annots_cnt,
  796.                                 bool tse_feat_test,
  797.                                 bool have_errors)
  798. {
  799.     CBioseq_Handle handle = scope.GetBioseqHandle(id);
  800.     if ( !handle ) {
  801.         LOG_POST("No seq-id found");
  802.         return;
  803.     }
  804.     handle.GetTopLevelSeqEntry();
  805. #if 0 // build order issues
  806.     CHECK_WRAP();
  807.     sequence::GetTitle(handle);
  808.     CHECK_END("get sequence title");
  809. #endif
  810.     CBioseq_Handle::TBioseqCore seq_core = handle.GetBioseqCore();
  811.     CHECK_WRAP();
  812.     CConstRef<CSeqMap> seq_map(&handle.GetSeqMap());
  813.     TSeqPos len = 0;
  814.     _TRACE("ProcessBioseq("<<id.AsFastaString()<<") seq_len="<<seq_len<<"):");
  815.     // Iterate seq-map except the last element
  816.     len = 0;
  817.     CSeqMap::const_iterator seg = seq_map->begin(&scope);
  818.     vector<CSeqMap::const_iterator> itrs;
  819.     for ( ; seg != seq_map->end(&scope); ++seg ) {
  820.         _ASSERT(seg);
  821.         itrs.push_back(seg);
  822.         switch (seg.GetType()) {
  823.         case CSeqMap::eSeqData:
  824.             _TRACE('@'<<len<<": seqData("<<seg.GetLength()<<")");
  825.             len += seg.GetLength();
  826.             break;
  827.         case CSeqMap::eSeqRef:
  828.             _TRACE('@'<<len<<": seqRef("<<seg.GetLength()<<
  829.                    ", id="<<seg.GetRefSeqid().AsString()<<
  830.                    ", pos="<<seg.GetRefPosition()<<
  831.                    ", minus="<<seg.GetRefMinusStrand()<<")");
  832.             len += seg.GetLength();
  833.             break;
  834.         case CSeqMap::eSeqGap:
  835.             _TRACE('@'<<len<<": seqGap("<<seg.GetLength()<<")");
  836.             len += seg.GetLength();
  837.             break;
  838.         case CSeqMap::eSeqEnd:
  839.             _ASSERT("Unexpected END segment" && 0);
  840.             break;
  841.         default:
  842.             _ASSERT("Unexpected segment type" && 0);
  843.             break;
  844.         }
  845.     }
  846.     _ASSERT(!seg);
  847.     for ( int i = itrs.size()-1; i >= 0; --i ) {
  848.         --seg;
  849.         _ASSERT(seg);
  850.         _ASSERT(seg == itrs[i]);
  851.     }
  852.     --seg;
  853.     _ASSERT(!seg);
  854.     _TRACE("ProcessBioseq("<<id.AsFastaString()<<") len="<<len<<")");
  855.     _ASSERT(len == seq_len);
  856.     CHECK_END("get sequence map");
  857.     CHECK_WRAP();
  858.     CConstRef<CSeqMap> seq_map(&handle.GetSeqMap());
  859.     TSeqPos len = 0;
  860.     _TRACE("ProcessBioseq("<<id.AsFastaString()<<") - depth-restricted");
  861.     // Iterate seq-map except the last element
  862.     len = 0;
  863.     CSeqMap::const_iterator seg(seq_map, &scope, SSeqMapSelector()
  864.                                 .SetResolveCount(2));
  865.     vector<CSeqMap::const_iterator> itrs;
  866.     for ( ; seg != seq_map->end(&scope); ++seg ) {
  867.         _ASSERT(seg);
  868.         itrs.push_back(seg);
  869.         switch (seg.GetType()) {
  870.         case CSeqMap::eSeqData:
  871.             _TRACE('@'<<len<<": seqData("<<seg.GetLength()<<")");
  872.             len += seg.GetLength();
  873.             break;
  874.         case CSeqMap::eSeqRef:
  875.             _TRACE('@'<<len<<": seqRef("<<seg.GetLength()<<
  876.                    ", id="<<seg.GetRefSeqid().AsString()<<
  877.                    ", pos="<<seg.GetRefPosition()<<
  878.                    ", minus="<<seg.GetRefMinusStrand()<<")");
  879.             len += seg.GetLength();
  880.             break;
  881.         case CSeqMap::eSeqGap:
  882.             _TRACE('@'<<len<<": seqGap("<<seg.GetLength()<<")");
  883.             len += seg.GetLength();
  884.             break;
  885.         case CSeqMap::eSeqEnd:
  886.             _ASSERT("Unexpected END segment" && 0);
  887.             break;
  888.         default:
  889.             _ASSERT("Unexpected segment type" && 0);
  890.             break;
  891.         }
  892.     }
  893.     _ASSERT(!seg);
  894.     for ( int i = itrs.size()-1; i >= 0; --i ) {
  895.         --seg;
  896.         _ASSERT(seg);
  897.         _ASSERT(seg == itrs[i]);
  898.     }
  899.     --seg;
  900.     _ASSERT(!seg);
  901.     CHECK_END("get restricted sequence map");
  902.     CHECK_WRAP();
  903.     CConstRef<CSeqMap> seq_map(&handle.GetSeqMap());
  904.     TSeqPos len = 0;
  905.     _TRACE("ProcessBioseq("<<id.AsFastaString()<<") - TSE-restricted");
  906.     // Iterate seq-map except the last element
  907.     len = 0;
  908.     CSeqMap::const_iterator seg(seq_map, &scope, SSeqMapSelector()
  909.                                 .SetLimitTSE(&handle.GetTopLevelSeqEntry())
  910.                                 .SetResolveCount(kInvalidSeqPos)
  911.                                 .SetFlags(CSeqMap::fFindAny));
  912.     vector<CSeqMap::const_iterator> itrs;
  913.     for ( ; seg != seq_map->end(&scope); ++seg ) {
  914.         _ASSERT(seg);
  915.         itrs.push_back(seg);
  916.         switch (seg.GetType()) {
  917.         case CSeqMap::eSeqData:
  918.             _TRACE('@'<<len<<": seqData("<<seg.GetLength()<<")");
  919.             len += seg.GetLength();
  920.             break;
  921.         case CSeqMap::eSeqRef:
  922.             _TRACE('@'<<len<<": seqRef("<<seg.GetLength()<<
  923.                    ", id="<<seg.GetRefSeqid().AsString()<<
  924.                    ", pos="<<seg.GetRefPosition()<<
  925.                    ", minus="<<seg.GetRefMinusStrand()<<")");
  926.             len += seg.GetLength();
  927.             break;
  928.         case CSeqMap::eSeqGap:
  929.             _TRACE('@'<<len<<": seqGap("<<seg.GetLength()<<")");
  930.             len += seg.GetLength();
  931.             break;
  932.         case CSeqMap::eSeqEnd:
  933.             _ASSERT("Unexpected END segment" && 0);
  934.             break;
  935.         default:
  936.             _ASSERT("Unexpected segment type" && 0);
  937.             break;
  938.         }
  939.     }
  940.     _ASSERT(!seg);
  941.     for ( int i = itrs.size()-1; i >= 0; --i ) {
  942.         --seg;
  943.         _ASSERT(seg);
  944.         _ASSERT(seg == itrs[i]);
  945.     }
  946.     --seg;
  947.     _ASSERT(!seg);
  948.     CHECK_END("get restricted sequence map");
  949.     CHECK_WRAP();
  950.     CConstRef<CSeqMap> seq_map(&handle.GetSeqMap());
  951.     TSeqPos len = 0;
  952.     _TRACE("ProcessBioseq("<<id.AsFastaString()<<
  953.            ") seq_len="<<seq_len<<") resolved:");
  954.     // Iterate seq-map except the last element
  955.     len = 0;
  956.     CSeqMap::const_iterator seg = seq_map->begin_resolved(&scope);
  957.     vector<CSeqMap::const_iterator> itrs;
  958.     for ( ; seg != seq_map->end_resolved(&scope); ++seg ) {
  959.         _ASSERT(seg);
  960.         itrs.push_back(seg);
  961.         switch (seg.GetType()) {
  962.         case CSeqMap::eSeqData:
  963.             _TRACE('@'<<len<<": seqData("<<seg.GetLength()<<")");
  964.             len += seg.GetLength();
  965.             break;
  966.         case CSeqMap::eSeqRef:
  967.             _TRACE('@'<<len<<": seqRef("<<seg.GetLength()<<
  968.                    ", id="<<seg.GetRefSeqid().AsString()<<
  969.                    ", pos="<<seg.GetRefPosition()<<
  970.                    ", minus="<<seg.GetRefMinusStrand()<<")");
  971.             _ASSERT("Unexpected REF segment" && 0);
  972.             //len += seg.GetLength();
  973.             break;
  974.         case CSeqMap::eSeqGap:
  975.             _TRACE('@'<<len<<": seqGap("<<seg.GetLength()<<")");
  976.             len += seg.GetLength();
  977.             break;
  978.         case CSeqMap::eSeqEnd:
  979.             _ASSERT("Unexpected END segment" && 0);
  980.             break;
  981.         default:
  982.             _ASSERT("Unexpected segment type" && 0);
  983.             break;
  984.         }
  985.     }
  986.     _ASSERT(!seg);
  987.     for ( int i = itrs.size()-1; i >= 0; --i ) {
  988.         --seg;
  989.         _ASSERT(seg);
  990.         _ASSERT(seg == itrs[i]);
  991.     }
  992.     --seg;
  993.     _ASSERT(!seg);
  994.     _TRACE("ProcessBioseq("<<id.AsFastaString()<<") len="<<len<<")");
  995.     _ASSERT(len == seq_len);
  996.     CHECK_END("get resolved sequence map");
  997.     CSeqVector seq_vect;
  998.     CHECK_WRAP();
  999.     seq_vect = handle.GetSeqVector(CBioseq_Handle::eCoding_NotSet);
  1000.     string sout = "";
  1001.     {{
  1002.         CSeqVector_CI vit(seq_vect, 0);
  1003.         for ( ; vit.GetPos() < seq_vect.size(); ++vit) {
  1004.             sout += *vit;
  1005.         }
  1006.         _ASSERT(NStr::PrintableString(sout) == seq_str);
  1007.         seq_vect.SetCoding(CBioseq_Handle::eCoding_Ncbi);
  1008.         int pos = seq_vect.size() - 1;
  1009.         vit.SetPos(pos);
  1010.         for ( ; pos > 0; --vit, --pos) {
  1011.             _ASSERT(sout[vit.GetPos()] == *vit);
  1012.         }
  1013.         _ASSERT(sout[vit.GetPos()] == *vit);
  1014.         vit.GetSeqData(0, seq_vect.size(), sout);
  1015.         _ASSERT(NStr::PrintableString(sout) == seq_str);
  1016.         sout = "";
  1017.         seq_vect.SetCoding(CBioseq_Handle::eCoding_NotSet);
  1018.     }}
  1019.     for (TSeqPos i = 0; i < seq_vect.size(); i++) {
  1020.         sout += seq_vect[i];
  1021.     }
  1022.     _ASSERT(NStr::PrintableString(sout) == seq_str);
  1023.     CHECK_END("get seq vector");
  1024.     CHECK_WRAP();
  1025.     CSeq_interval interval;
  1026.     interval.SetId(id);
  1027.     interval.SetFrom(seq_str.size());
  1028.     interval.SetTo(seq_str.size()-1);
  1029.     CSeq_loc loc;
  1030.     loc.SetInt(interval);
  1031.     seq_vect = handle.GetSequenceView(loc, CBioseq_Handle::eViewConstructed);
  1032.     string sout = "";
  1033.     for (TSeqPos i = 0; i < seq_vect.size(); i++) {
  1034.         sout += seq_vect[i];
  1035.     }
  1036.     _ASSERT(sout.empty());
  1037.     CHECK_END_ALWAYS("get seq view");
  1038.     if (seq_core->GetInst().IsSetStrand() &&
  1039.         seq_core->GetInst().GetStrand() == CSeq_inst::eStrand_ds) {
  1040.         CHECK_WRAP();
  1041.         seq_vect = handle.GetSeqVector(CBioseq_Handle::eCoding_NotSet,
  1042.                                        eNa_strand_minus);
  1043.         string sout_rev = "";
  1044.         for (TSeqPos i = seq_vect.size(); i> 0; i--) {
  1045.             sout_rev += seq_vect[i-1];
  1046.         }
  1047.         _ASSERT(NStr::PrintableString(sout_rev) == seq_str_compl);
  1048.         CHECK_END("get reverse seq vector");
  1049.     }
  1050.     else {
  1051.         _ASSERT(seq_str_compl.empty());
  1052.     }
  1053.     CConstRef<CBioseq> bioseq(&(handle.GetBioseq()));
  1054.     int count = 0;
  1055.     CHECK_WRAP();
  1056.     // Test CSeq_descr iterator
  1057.     for (CSeq_descr_CI desc_it(handle); desc_it;  ++desc_it) {
  1058.         count++;
  1059.         //### _ASSERT(desc_it->
  1060.     }
  1061.     _ASSERT(count == seq_desc_cnt);
  1062.     CHECK_END_ALWAYS("count CSeq_descr");
  1063.     CHECK_WRAP();
  1064.     // Test CSeq_feat iterator, resolve-all method
  1065.     CSeq_loc loc;
  1066.     loc.SetWhole(id);
  1067.     count = 0;
  1068.     if ( !tse_feat_test ) {
  1069.         if ( sm_DumpFeatures ) {
  1070.             NcbiCout << "-------------------- CFeat_CI resolve-all over "<<
  1071.                 id.AsFastaString()<<" --------------------" << NcbiEndl;
  1072.         }
  1073.         for ( CFeat_CI feat_it(scope, loc, SAnnotSelector().SetResolveAll());
  1074.               feat_it;  ++feat_it) {
  1075.             count++;
  1076.             if ( sm_DumpFeatures ) {
  1077.                 auto_ptr<CObjectOStream>
  1078.                     out(CObjectOStream::Open(eSerial_AsnText, NcbiCout));
  1079.                 *out << feat_it->GetMappedFeature();
  1080.             }
  1081.             //### _ASSERT(feat_it->
  1082.         }
  1083.         _ASSERT(count == seq_feat_ra_cnt);
  1084.     }
  1085.     CHECK_END("get annot set");
  1086.     CHECK_WRAP();
  1087.     // Test CSeq_feat iterator
  1088.     CSeq_loc loc;
  1089.     loc.SetWhole(id);
  1090.     count = 0;
  1091.     set<const CSeq_annot*> annot_set;
  1092.     if ( sm_DumpFeatures ) {
  1093.         NcbiCout << "-------------------- CFeat_CI over "<<
  1094.             id.AsFastaString()<<" --------------------" << NcbiEndl;
  1095.     }
  1096.     if ( !tse_feat_test ) {
  1097.         for ( CFeat_CI feat_it(scope, loc); feat_it;  ++feat_it) {
  1098.             count++;
  1099.             annot_set.insert(&feat_it.GetSeq_annot());
  1100.             if ( sm_DumpFeatures ) {
  1101.                 auto_ptr<CObjectOStream>
  1102.                     out(CObjectOStream::Open(eSerial_AsnText, NcbiCout));
  1103.                 *out << feat_it->GetMappedFeature();
  1104.             }
  1105.             //### _ASSERT(feat_it->
  1106.         }
  1107.         if ( sm_DumpFeatures ) {
  1108.             NcbiCout << "-------------------- "
  1109.                 "product CFeat_CI --------------------" << NcbiEndl;
  1110.         }
  1111.         // Get products
  1112.         for ( CFeat_CI feat_it(scope, loc, SAnnotSelector().SetByProduct());
  1113.               feat_it;  ++feat_it) {
  1114.             count++;
  1115.             annot_set.insert(&feat_it.GetSeq_annot());
  1116.             if ( sm_DumpFeatures ) {
  1117.                 auto_ptr<CObjectOStream>
  1118.                     out(CObjectOStream::Open(eSerial_AsnText, NcbiCout));
  1119.                 *out << feat_it->GetMappedFeature();
  1120.             }
  1121.             //### _ASSERT(feat_it->
  1122.         }
  1123.     }
  1124.     else {
  1125.         if ( sm_DumpFeatures ) {
  1126.             NcbiCout << "-------------------- "
  1127.                 "LimitTSE --------------------" << NcbiEndl;
  1128.         }
  1129.         for ( CFeat_CI feat_it(handle, 0, 0,
  1130.                                SAnnotSelector()
  1131.                                .SetLimitTSE(&handle.GetTopLevelSeqEntry()));
  1132.               feat_it;  ++feat_it) {
  1133.             count++;
  1134.             annot_set.insert(&feat_it.GetSeq_annot());
  1135.             if ( sm_DumpFeatures ) {
  1136.                 auto_ptr<CObjectOStream>
  1137.                     out(CObjectOStream::Open(eSerial_AsnText, NcbiCout));
  1138.                 *out << feat_it->GetMappedFeature();
  1139.             }
  1140.             //### _ASSERT(feat_it->
  1141.         }
  1142.         if ( sm_DumpFeatures ) {
  1143.             NcbiCout << "-------------------- "
  1144.                 "product CFeat_CI --------------------" << NcbiEndl;
  1145.         }
  1146.         // Get products
  1147.         for ( CFeat_CI feat_it(handle, 0, 0,
  1148.                                SAnnotSelector()
  1149.                                .SetLimitTSE(&handle.GetTopLevelSeqEntry())
  1150.                                .SetByProduct());
  1151.               feat_it;  ++feat_it) {
  1152.             count++;
  1153.             annot_set.insert(&feat_it.GetSeq_annot());
  1154.             if ( sm_DumpFeatures ) {
  1155.                 auto_ptr<CObjectOStream>
  1156.                     out(CObjectOStream::Open(eSerial_AsnText, NcbiCout));
  1157.                 *out << feat_it->GetMappedFeature();
  1158.             }
  1159.             //### _ASSERT(feat_it->
  1160.         }
  1161.     }
  1162.     if ( sm_DumpFeatures ) {
  1163.         NcbiCout << "-------------------- "
  1164.             "end CFeat_CI --------------------" << NcbiEndl;
  1165.     }
  1166.     _ASSERT(count == seq_feat_cnt);
  1167.     _ASSERT(annot_set.size() == feat_annots_cnt);
  1168.     CHECK_END("get annot set");
  1169.     CHECK_WRAP();
  1170.     // Test CSeq_feat iterator for the specified range
  1171.     // Copy location seq-id
  1172.     count = 0;
  1173.     set<const CSeq_annot*> annot_set;
  1174.     CSeq_loc loc;
  1175.     loc.SetInt().SetId().Assign(id);
  1176.     loc.SetInt().SetFrom(0);
  1177.     loc.SetInt().SetTo(10);
  1178.     if ( !tse_feat_test ) {
  1179.         for ( CFeat_CI feat_it(scope, loc);
  1180.               feat_it;  ++feat_it) {
  1181.             count++;
  1182.             annot_set.insert(&feat_it.GetSeq_annot());
  1183.             //### _ASSERT(feat_it->
  1184.         }
  1185.     }
  1186.     else {
  1187.         for ( CFeat_CI feat_it(handle, 0, 10,
  1188.                                SAnnotSelector()
  1189.                                .SetLimitTSE(&handle.GetTopLevelSeqEntry()));
  1190.               feat_it;  ++feat_it) {
  1191.             count++;
  1192.             annot_set.insert(&feat_it.GetSeq_annot());
  1193.             //### _ASSERT(feat_it->
  1194.         }
  1195.     }
  1196.     _ASSERT(count == seq_featrg_cnt);
  1197.     _ASSERT(annot_set.size() == featrg_annots_cnt);
  1198.     CHECK_END("get annot set");
  1199.     CHECK_WRAP();
  1200.     // Test CSeq_align iterator
  1201.     count = 0;
  1202.     set<const CSeq_annot*> annot_set;
  1203.     CSeq_loc loc;
  1204.     loc.SetWhole(id);
  1205.     if ( !tse_feat_test ) {
  1206.         for (CAlign_CI align_it(scope, loc);
  1207.              align_it;  ++align_it) {
  1208.             count++;
  1209.             annot_set.insert(&align_it.GetSeq_annot());
  1210.             //### _ASSERT(align_it->
  1211.         }
  1212.     }
  1213.     else {
  1214.         for (CAlign_CI align_it(handle, 0, 0,
  1215.                                 SAnnotSelector()
  1216.                                 .SetLimitTSE(&handle.GetTopLevelSeqEntry()));
  1217.              align_it;  ++align_it) {
  1218.             count++;
  1219.             annot_set.insert(&align_it.GetSeq_annot());
  1220.             //### _ASSERT(align_it->
  1221.         }
  1222.     }
  1223.     _ASSERT(count == seq_align_cnt);
  1224.     _ASSERT(annot_set.size() == align_annots_cnt);
  1225.     CHECK_END("get align set");
  1226.     CHECK_WRAP();
  1227.     // Test CSeq_align iterator for the specified range
  1228.     // Copy location seq-id
  1229.     count = 0;
  1230.     set<const CSeq_annot*> annot_set;
  1231.     CSeq_loc loc;
  1232.     loc.SetInt().SetId().Assign(id);
  1233.     loc.SetInt().SetFrom(10);
  1234.     loc.SetInt().SetTo(20);
  1235.     if ( !tse_feat_test ) {
  1236.         for (CAlign_CI align_it(scope, loc);
  1237.              align_it;  ++align_it) {
  1238.             count++;
  1239.             annot_set.insert(&align_it.GetSeq_annot());
  1240.             //### _ASSERT(align_it->
  1241.         }
  1242.     }
  1243.     else {
  1244.         for (CAlign_CI align_it(handle, 10, 20,
  1245.                                 SAnnotSelector()
  1246.                                 .SetLimitTSE(&handle.GetTopLevelSeqEntry()));
  1247.              align_it;  ++align_it) {
  1248.             count++;
  1249.             annot_set.insert(&align_it.GetSeq_annot());
  1250.             //### _ASSERT(align_it->
  1251.         }
  1252.     }
  1253.     _ASSERT(count == seq_alignrg_cnt);
  1254.     _ASSERT(annot_set.size() == alignrg_annots_cnt);
  1255.     CHECK_END("get align set");
  1256.     if ( sm_TestRemoveEntry ) {
  1257.         CHECK_WRAP();
  1258.         CRef<CSeq_entry> tse
  1259.             (const_cast<CSeq_entry*>(&handle.GetTopLevelSeqEntry()));
  1260.         
  1261.         CRef<CSeq_entry> entry(const_cast<CSeq_entry*>(
  1262.                                    handle.GetBioseq().GetParentEntry()));
  1263.         CSeq_entry* parent = entry->GetParentEntry();
  1264.         scope.RemoveEntry(*entry);
  1265.         handle = scope.GetBioseqHandle(id);
  1266.         _ASSERT(!handle  ||  handle.GetBioseq().GetParentEntry() != entry);
  1267.         if ( parent ) {
  1268.             // Non-TSE
  1269.             scope.AttachEntry(*parent, *entry);
  1270.         }
  1271.         else {
  1272.             // TSE
  1273.             scope.AddTopLevelSeqEntry(*entry);
  1274.         }
  1275.         handle = scope.GetBioseqHandle(id);
  1276.         _ASSERT(handle);
  1277.         CHECK_END_ALWAYS("remove/attach seq-entry");
  1278.     }
  1279. }
  1280. void CTestHelper::TestDataRetrieval(CScope& scope, int idx,
  1281.                                     int delta)
  1282. {
  1283.     CSeq_id id;
  1284.     // find seq. by local id
  1285.     id.SetLocal().SetStr("seq" + NStr::IntToString(11+idx*1000));
  1286.     // iterate through the whole Scope
  1287.     ProcessBioseq(scope, id, 40,
  1288.         "CAGCAGCGGTACAGGAGGGTGAGACATCCCAGAGCGGTGC",
  1289.         "GTCGTCGCCATGTCCTCCCACTCTGTAGGGTCTCGCCACG",
  1290.         2, 4+delta, 4+delta, 2+delta, 1, 0, 2+delta, 2+delta, 1, 0);
  1291.     // iterate through the specific sequence only
  1292.     ProcessBioseq(scope, id, 40,
  1293.         "CAGCAGCGGTACAGGAGGGTGAGACATCCCAGAGCGGTGC",
  1294.         "GTCGTCGCCATGTCCTCCCACTCTGTAGGGTCTCGCCACG",
  1295.         2, -1, 2+delta, 1+delta, 1, 0, 1+delta, 1+delta, 1, 0, true);
  1296.     // find seq. by GI
  1297.     id.SetGi(12+idx*1000);
  1298.     ProcessBioseq(scope, id, 40,
  1299.         "CAATAACCTCAGCAGCAACAAGTGGCTTCCAGCGCCCTCC",
  1300.         "GTTATTGGAGTCGTCGTTGTTCACCGAAGGTCGCGGGAGG",
  1301.         1, 2, 3, 1, 1, 1, 2, 1, 1, 1); //1, 3, 2, 1, 1, 2, 2, 1, 1);
  1302.     // segmented sequence
  1303.     id.SetGi(21+idx*1000);
  1304.     ProcessBioseq(scope, id, 62,
  1305.         "CAGCACAATAACCTCAGCAGCAACAAGTGGCTTCCAGCGCCCTCCCAGCACAATAAAAAAAA",
  1306.         "GTCGTGTTATTGGAGTCGTCGTTGTTCACCGAAGGTCGCGGGAGGGTCGTGTTATTTTTTTT",
  1307.         1, 6+delta, 2, 1, 0, 0, 1, 1, 0, 0);
  1308.     id.SetGi(22+idx*1000);
  1309.     ProcessBioseq(scope, id, 20, "QGCGEQTMTLLAPTLAASRY", "",
  1310.         0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
  1311.     // another seq.data format
  1312.     id.SetGi(23+idx*1000);
  1313.     ProcessBioseq(scope, id, 13,
  1314.         "\x00\x03\x02\x01\x00\x02\x01\x03\x02\x03\x00\x01\x02",
  1315.         "\x03\x00\x01\x02\x03\x01\x02\x00\x01\x00\x03\x02\x01",
  1316.         0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
  1317. }
  1318. END_SCOPE(objects)
  1319. END_NCBI_SCOPE
  1320. /*
  1321. * ===========================================================================
  1322. *
  1323. * $Log: test_helper.cpp,v $
  1324. * Revision 1000.4  2004/06/01 19:25:11  gouriano
  1325. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.58
  1326. *
  1327. * Revision 1.58  2004/05/21 21:42:14  gorelenk
  1328. * Added PCH ncbi_pch.hpp
  1329. *
  1330. * Revision 1.57  2004/04/01 20:18:12  grichenk
  1331. * Added initialization of m_MultiId member.
  1332. *
  1333. * Revision 1.56  2004/03/31 22:35:17  grichenk
  1334. * Fixed number of features found
  1335. *
  1336. * Revision 1.55  2004/03/24 18:30:30  vasilche
  1337. * Fixed edit API.
  1338. * Every *_Info object has its own shallow copy of original object.
  1339. *
  1340. * Revision 1.54  2004/03/23 15:14:01  vasilche
  1341. * Restored automatic call to Parentize() for Seq-entries in object manager.
  1342. *
  1343. * Revision 1.53  2004/03/18 16:30:24  grichenk
  1344. * Changed type of seq-align containers from list to vector.
  1345. *
  1346. * Revision 1.52  2004/03/16 15:47:28  vasilche
  1347. * Added CBioseq_set_Handle and set of EditHandles
  1348. *
  1349. * Revision 1.51  2004/02/09 19:18:55  grichenk
  1350. * Renamed CDesc_CI to CSeq_descr_CI. Redesigned CSeq_descr_CI
  1351. * and CSeqdesc_CI to avoid using data directly.
  1352. *
  1353. * Revision 1.50  2004/02/03 17:58:50  vasilche
  1354. * Always test CScope::RemoveEntry() in single thread.
  1355. *
  1356. * Revision 1.49  2003/12/22 22:32:10  grichenk
  1357. * Enabled RemoveEntry/AttachEntry test in non-MT builds.
  1358. *
  1359. * Revision 1.48  2003/12/18 18:14:47  grichenk
  1360. * Removed test for CScope::RemoveEntry() since it breaks MT test.
  1361. *
  1362. * Revision 1.47  2003/12/18 16:38:07  grichenk
  1363. * Added CScope::RemoveEntry()
  1364. *
  1365. * Revision 1.46  2003/11/10 18:12:09  grichenk
  1366. * Removed extra EFlags declaration from seq_map_ci.hpp
  1367. *
  1368. * Revision 1.45  2003/11/04 16:21:37  grichenk
  1369. * Updated CAnnotTypes_CI to map whole features instead of splitting
  1370. * them by sequence segments.
  1371. *
  1372. * Revision 1.44  2003/09/30 16:22:05  vasilche
  1373. * Updated internal object manager classes to be able to load ID2 data.
  1374. * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  1375. * Scope caches results of requests for data to data loaders.
  1376. * Optimized CSeq_id_Handle for gis.
  1377. * Optimized bioseq lookup in scope.
  1378. * Reduced object allocations in annotation iterators.
  1379. * CScope is allowed to be destroyed before other objects using this scope are
  1380. * deleted (feature iterators, bioseq handles etc).
  1381. * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  1382. * Added 'adaptive' option to objmgr_demo application.
  1383. *
  1384. * Revision 1.43  2003/09/05 18:45:10  grichenk
  1385. * Fixed exceptions
  1386. *
  1387. * Revision 1.42  2003/07/14 21:13:27  grichenk
  1388. * Added possibility to resolve seq-map iterator withing a single TSE
  1389. * and to skip intermediate references during this resolving.
  1390. *
  1391. * Revision 1.41  2003/06/12 18:39:46  vasilche
  1392. * Chech CSeqVector assignment.
  1393. *
  1394. * Revision 1.40  2003/06/02 21:04:25  vasilche
  1395. * Fixed CSeqVector_CI test to not to go beyond begin().
  1396. *
  1397. * Revision 1.39  2003/06/02 16:06:39  dicuccio
  1398. * Rearranged src/objects/ subtree.  This includes the following shifts:
  1399. *     - src/objects/asn2asn --> arc/app/asn2asn
  1400. *     - src/objects/testmedline --> src/objects/ncbimime/test
  1401. *     - src/objects/objmgr --> src/objmgr
  1402. *     - src/objects/util --> src/objmgr/util
  1403. *     - src/objects/alnmgr --> src/objtools/alnmgr
  1404. *     - src/objects/flat --> src/objtools/flat
  1405. *     - src/objects/validator --> src/objtools/validator
  1406. *     - src/objects/cddalignview --> src/objtools/cddalignview
  1407. * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  1408. * replaces the three libmmdb? libs.
  1409. *
  1410. * Revision 1.37  2003/05/28 16:20:16  vasilche
  1411. * Added check for REF segments.
  1412. *
  1413. * Revision 1.36  2003/05/27 19:44:07  grichenk
  1414. * Added CSeqVector_CI class
  1415. *
  1416. * Revision 1.35  2003/05/23 16:32:54  vasilche
  1417. * Added tests for backward traversal of CSeqMap_CI.
  1418. *
  1419. * Revision 1.34  2003/05/12 19:17:42  vasilche
  1420. * Added initialization of mandatory field.
  1421. *
  1422. * Revision 1.33  2003/05/09 20:34:23  grichenk
  1423. * Reverted to 1.31
  1424. *
  1425. * Revision 1.32  2003/05/09 20:28:03  grichenk
  1426. * Changed warnings to info
  1427. *
  1428. * Revision 1.31  2003/04/24 16:12:39  vasilche
  1429. * Object manager internal structures are splitted more straightforward.
  1430. * Removed excessive header dependencies.
  1431. *
  1432. * Revision 1.30  2003/03/26 14:30:23  lavr
  1433. * Conform to modified representation of NUL char in NStr::PrintableString()
  1434. *
  1435. * Revision 1.29  2003/03/21 14:52:28  vasilche
  1436. * Modified testobjmgr1 to reflect changes in CFeat_CI and CAlign_CI
  1437. * constructors' behaviour.
  1438. *
  1439. * Revision 1.28  2003/03/05 20:56:44  vasilche
  1440. * SAnnotSelector now holds all parameters of annotation iterators.
  1441. *
  1442. * Revision 1.27  2003/03/04 16:43:53  grichenk
  1443. * +Test CFeat_CI with eResolve_All flag
  1444. *
  1445. * Revision 1.26  2003/02/28 16:37:47  vasilche
  1446. * Fixed expected feature count.
  1447. * Added optional flags to testobjmgr to dump generated data and found features.
  1448. *
  1449. * Revision 1.25  2003/01/24 20:13:38  vasilche
  1450. * Added check for empty CSeqVector from CBioseq_Handle::GetSequenceView().
  1451. *
  1452. * Revision 1.24  2003/01/22 20:11:55  vasilche
  1453. * Merged functionality of CSeqMapResolved_CI to CSeqMap_CI.
  1454. * CSeqMap_CI now supports resolution and iteration over sequence range.
  1455. * Added several caches to CScope.
  1456. * Optimized CSeqVector().
  1457. * Added serveral variants of CBioseqHandle::GetSeqVector().
  1458. * Tried to optimize annotations iterator (not much success).
  1459. * Rewritten CHandleRange and CHandleRangeMap classes to avoid sorting of list.
  1460. *
  1461. * Revision 1.23  2003/01/22 19:25:11  ucko
  1462. * Avoid use of xobjutil.
  1463. *
  1464. * Revision 1.22  2002/12/26 20:34:53  ucko
  1465. * Drop unused header <sstream>, which older compilers (such as GCC 2.9x) lack;
  1466. * move CVS log to end.
  1467. *
  1468. * Revision 1.21  2002/12/26 16:39:24  vasilche
  1469. * Object manager class CSeqMap rewritten.
  1470. *
  1471. * Revision 1.20  2002/12/20 20:54:25  grichenk
  1472. * Added optional location/product switch to CFeat_CI
  1473. *
  1474. * Revision 1.19  2002/12/19 20:18:57  grichenk
  1475. * Fixed test case for minus strand location
  1476. *
  1477. * Revision 1.18  2002/11/08 19:43:37  grichenk
  1478. * CConstRef<> constructor made explicit
  1479. *
  1480. * Revision 1.17  2002/09/10 19:55:54  grichenk
  1481. * Catch exceptions when resolving seq-maps; new arguments for GetSeqVector()
  1482. *
  1483. * Revision 1.16  2002/07/25 15:01:53  grichenk
  1484. * Replaced non-const GetXXX() with SetXXX()
  1485. *
  1486. * Revision 1.15  2002/07/03 14:40:46  ucko
  1487. * Use typedef rather than hard-coded type for Dense_diag.ids.
  1488. *
  1489. * Revision 1.14  2002/06/07 16:13:24  ucko
  1490. * GetTitle() is now in sequence::.
  1491. *
  1492. * Revision 1.13  2002/06/06 19:49:54  clausen
  1493. * Changed CBioseq_Handle::GetTitle() call to GetTitle()
  1494. *
  1495. * Revision 1.12  2002/05/24 14:57:14  grichenk
  1496. * SerialAssign<>() -> CSerialObject::Assign()
  1497. *
  1498. * Revision 1.11  2002/05/21 18:39:31  grichenk
  1499. * CBioseq_Handle::GetResolvedSeqMap() -> CreateResolvedSeqMap()
  1500. *
  1501. * Revision 1.10  2002/05/09 14:21:50  grichenk
  1502. * Turned GetTitle() test on, removed unresolved seq-map test
  1503. *
  1504. * Revision 1.9  2002/05/06 03:28:53  vakatov
  1505. * OM/OM1 renaming
  1506. *
  1507. * Revision 1.8  2002/05/03 21:28:12  ucko
  1508. * Introduce T(Signed)SeqPos.
  1509. *
  1510. * Revision 1.7  2002/04/25 18:15:25  grichenk
  1511. * Adjusted tests to work with the updated CSeqVector
  1512. *
  1513. * Revision 1.6  2002/04/23 15:26:07  gouriano
  1514. * added test_assert.h
  1515. *
  1516. * Revision 1.5  2002/04/22 20:07:45  grichenk
  1517. * Commented calls to CBioseq::ConstructExcludedSequence()
  1518. *
  1519. * Revision 1.4  2002/04/22 18:33:48  gouriano
  1520. * corrected feature counts
  1521. *
  1522. * Revision 1.3  2002/03/28 21:22:38  grichenk
  1523. * More tests for location-exclusive bioseq
  1524. *
  1525. * Revision 1.2  2002/03/18 21:47:15  grichenk
  1526. * Moved most includes to test_helper.cpp
  1527. * Added test for CBioseq::ConstructExcludedSequence()
  1528. *
  1529. * Revision 1.1  2002/03/13 18:06:31  gouriano
  1530. * restructured MT test. Put common functions into a separate file
  1531. *
  1532. * ===========================================================================
  1533. */