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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: snp_annot_info.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:24:32  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: snp_annot_info.cpp,v 1000.3 2004/06/01 19:24:32 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: SNP Seq-annot info
  36.  *
  37.  */
  38. #include <ncbi_pch.hpp>
  39. #include <corelib/ncbiobj.hpp>
  40. #include <objmgr/impl/snp_annot_info.hpp>
  41. #include <objmgr/impl/seq_annot_info.hpp>
  42. #include <objmgr/impl/tse_info.hpp>
  43. #include <objects/general/Object_id.hpp>
  44. #include <objects/general/User_object.hpp>
  45. #include <objects/general/User_field.hpp>
  46. #include <objects/general/Dbtag.hpp>
  47. #include <objects/seqloc/Na_strand.hpp>
  48. #include <objects/seqloc/Seq_id.hpp>
  49. #include <objects/seqloc/Seq_point.hpp>
  50. #include <objects/seqloc/Seq_interval.hpp>
  51. #include <objects/seqloc/Seq_loc.hpp>
  52. #include <objects/seqfeat/Seq_feat.hpp>
  53. #include <objects/seqfeat/SeqFeatData.hpp>
  54. #include <objects/seqfeat/Imp_feat.hpp>
  55. #include <objects/seqfeat/Gb_qual.hpp>
  56. #include <objects/seqset/Seq_entry.hpp>
  57. #include <objects/seqset/Bioseq_set.hpp>
  58. #include <objects/seq/Seq_annot.hpp>
  59. #include <serial/objectinfo.hpp>
  60. #include <serial/objectiter.hpp>
  61. #include <serial/objectio.hpp>
  62. #include <serial/serial.hpp>
  63. #include <serial/pack_string.hpp>
  64. #include <algorithm>
  65. #include <numeric>
  66. // for debugging
  67. #include <serial/objostrasn.hpp>
  68. BEGIN_NCBI_SCOPE
  69. BEGIN_SCOPE(objects)
  70. #undef EXACT_ALLELE_COUNT
  71. /////////////////////////////////////////////////////////////////////////////
  72. // SSNP_Info
  73. /////////////////////////////////////////////////////////////////////////////
  74. const char* const SSNP_Info::s_SNP_Type_Label[eSNP_Type_last] = {
  75.     "simple",
  76.     "bad - wrong member set",
  77.     "bad - wrong text id",
  78.     "complex - has comment",
  79.     "complex - location is not point",
  80.     "complex - location is not gi",
  81.     "complex - location gi is bad",
  82.     "complex - location strand is bad",
  83.     "complex - id count is too large",
  84.     "complex - id count is not one",
  85.     "complex - allele length is bad",
  86.     "complex - allele count is too large",
  87.     "complex - allele count is non standard",
  88.     "complex - weight has bad value",
  89.     "complex - weight count is not one"
  90. };
  91. static const string kId_variation        ("variation");
  92. static const string kId_allele           ("allele");
  93. static const string kId_replace          ("replace");
  94. static const string kId_dbSnpSynonymyData("dbSnpSynonymyData");
  95. static const string kId_weight           ("weight");
  96. static const string kId_dbSNP            ("dbSNP");
  97. SSNP_Info::ESNP_Type SSNP_Info::ParseSeq_feat(const CSeq_feat& feat,
  98.                                               CSeq_annot_SNP_Info& annot_info)
  99. {
  100.     m_Flags = 0;
  101.     const CSeq_loc& loc = feat.GetLocation();
  102.     const CSeqFeatData& data = feat.GetData();
  103.     if ( data.Which() != CSeqFeatData::e_Imp ||
  104.          !feat.IsSetQual() || !feat.IsSetExt() || !feat.IsSetDbxref() ) {
  105.         return eSNP_Bad_WrongMemberSet;
  106.     }
  107.     
  108.     const CImp_feat& imp_feat = data.GetImp();
  109.     const CSeq_feat::TQual& qual = feat.GetQual();
  110.     const CUser_object& ext = feat.GetExt();
  111.     const CSeq_feat::TDbxref& dbxref = feat.GetDbxref();
  112.     size_t alleles_count = 0;
  113.     bool qual_allele = false;
  114.     bool qual_replace = false;
  115.     ITERATE ( CSeq_feat::TQual, it, qual ) {
  116.         if ( alleles_count >= kMax_AllelesCount ) {
  117.             return eSNP_Complex_AlleleCountTooLarge;
  118.         }
  119.         const CGb_qual& gb_qual = **it;
  120.         const string& qual_str = gb_qual.GetQual();
  121.         if ( qual_str == kId_allele ) {
  122.             qual_allele = true;
  123.         }
  124.         else if ( qual_str == kId_replace ) {
  125.             qual_replace = true;
  126.         }
  127.         else {
  128.             return eSNP_Bad_WrongTextId;
  129.         }
  130.         TAlleleIndex allele_index =
  131.             annot_info.x_GetAlleleIndex(gb_qual.GetVal());
  132.         if ( allele_index == kNo_AlleleIndex ) {
  133.             //NcbiCout << "Bad allele: "" << gb_qual.GetVal() << ""n";
  134.             return eSNP_Complex_AlleleLengthBad;
  135.         }
  136.         m_AllelesIndices[alleles_count++] = allele_index;
  137.     }
  138.     if ( qual_replace && qual_allele ) {
  139.         return eSNP_Bad_WrongTextId;
  140.     }
  141.     if ( qual_replace ) {
  142.         m_Flags |= fQualReplace;
  143.     }
  144. #ifdef EXACT_ALLELE_COUNT
  145.     if ( alleles_count != kMax_AllelesCount ) {
  146.         return eSNP_Complex_AlleleCountIsNonStandard;
  147.     }
  148. #else
  149.     while ( alleles_count < kMax_AllelesCount ) {
  150.         m_AllelesIndices[alleles_count++] = kNo_AlleleIndex;
  151.     }
  152. #endif
  153.     bool have_snp_id = false;
  154.     ITERATE ( CSeq_feat::TDbxref, it, dbxref ) {
  155.         if ( have_snp_id ) {
  156.             return eSNP_Complex_IdCountTooLarge;
  157.         }
  158.         const CDbtag& dbtag = **it;
  159.         if ( dbtag.GetDb() != kId_dbSNP ) {
  160.             return eSNP_Bad_WrongTextId;
  161.         }
  162.         const CObject_id& tag = dbtag.GetTag();
  163.         if ( tag.Which() != CObject_id::e_Id ) {
  164.             return eSNP_Bad_WrongMemberSet;
  165.         }
  166.         m_SNP_Id = tag.GetId();
  167.         have_snp_id = true;
  168.     }
  169.     if ( !have_snp_id ) {
  170.         return eSNP_Complex_IdCountIsNotOne;
  171.     }
  172.     
  173.     if ( feat.IsSetId() || feat.IsSetPartial() || feat.IsSetExcept() ||
  174.          feat.IsSetProduct() || feat.IsSetTitle() ||
  175.          feat.IsSetCit() || feat.IsSetExp_ev() || feat.IsSetXref() ||
  176.          feat.IsSetPseudo() || feat.IsSetExcept_text() ||
  177.          imp_feat.IsSetLoc() || imp_feat.IsSetDescr() ) {
  178.         return eSNP_Bad_WrongMemberSet;
  179.     }
  180.     if ( imp_feat.GetKey() != kId_variation ) {
  181.         return eSNP_Bad_WrongTextId;
  182.     }
  183.     {{
  184.         const CObject_id& id = ext.GetType();
  185.         if ( id.Which() != CObject_id::e_Str ||
  186.              id.GetStr() != kId_dbSnpSynonymyData ) {
  187.             return eSNP_Bad_WrongTextId;
  188.         }
  189.     }}
  190.     bool have_weight = false;
  191.     ITERATE ( CUser_object::TData, it, ext.GetData() ) {
  192.         const CUser_field& field = **it;
  193.         const CUser_field::TData& user_data = field.GetData();
  194.         {{
  195.             const CObject_id& id = field.GetLabel();
  196.             if ( id.Which() != CObject_id::e_Str ||
  197.                  id.GetStr() != kId_weight ) {
  198.                 return eSNP_Bad_WrongTextId;
  199.             }
  200.         }}
  201.         if ( have_weight ) {
  202.             return eSNP_Complex_WeightCountIsNotOne;
  203.         }
  204.         if ( field.IsSetNum() ||
  205.              user_data.Which() != CUser_field::TData::e_Int ) {
  206.             return eSNP_Complex_WeightBadValue;
  207.         }
  208.         int value = user_data.GetInt();
  209.         if ( value < 0 || value > kMax_Weight ) {
  210.             return eSNP_Complex_WeightBadValue;
  211.         }
  212.         m_Weight = TWeight(value);
  213.         have_weight = true;
  214.     }
  215.     if ( !have_weight ) {
  216.         return eSNP_Complex_WeightCountIsNotOne;
  217.     }
  218.     const CSeq_id* id;
  219.     ENa_strand strand;
  220.     switch ( loc.Which() ) {
  221.     case CSeq_loc::e_Pnt:
  222.     {
  223.         const CSeq_point& point = loc.GetPnt();
  224.         if ( point.IsSetFuzz() || !point.IsSetStrand() ) {
  225.             return eSNP_Bad_WrongMemberSet;
  226.         }
  227.         id = &point.GetId();
  228.         strand = point.GetStrand();
  229.         m_ToPosition = point.GetPoint();
  230.         m_PositionDelta = 0;
  231.         break;
  232.     }
  233.     case CSeq_loc::e_Int:
  234.     {
  235.         const CSeq_interval& interval = loc.GetInt();
  236.         if ( interval.IsSetFuzz_from() || interval.IsSetFuzz_to() ||
  237.              !interval.IsSetStrand() ) {
  238.             return eSNP_Bad_WrongMemberSet;
  239.         }
  240.         id = &interval.GetId();
  241.         strand = interval.GetStrand();
  242.         m_ToPosition = interval.GetTo();
  243.         int delta = m_ToPosition - interval.GetFrom();
  244.         if ( delta <= 0 || delta > kMax_PositionDelta ) {
  245.             return eSNP_Complex_LocationIsNotPoint;
  246.         }
  247.         m_PositionDelta = TPositionDelta(delta);
  248.         break;
  249.     }
  250.     default:
  251.         return eSNP_Complex_LocationIsNotPoint;
  252.     }
  253.     switch ( strand ) {
  254.     case eNa_strand_plus:
  255.         break;
  256.     case eNa_strand_minus:
  257.         m_Flags |= fMinusStrand;
  258.         break;
  259.     default:
  260.         return eSNP_Complex_LocationStrandIsBad;
  261.     }
  262.     if ( feat.IsSetComment() ) {
  263.         m_CommentIndex = annot_info.x_GetCommentIndex(feat.GetComment());
  264.         if ( m_CommentIndex == kNo_CommentIndex ) {
  265.             return eSNP_Complex_HasComment;
  266.         }
  267.     }
  268.     else {
  269.         m_CommentIndex = kNo_CommentIndex;
  270.     }
  271.     if ( !id->IsGi() ) {
  272.         return eSNP_Complex_LocationIsNotGi;
  273.     }
  274.     if ( !annot_info.x_CheckGi(id->GetGi()) ) {
  275.         return eSNP_Complex_LocationGiIsBad;
  276.     }
  277.     return eSNP_Simple;
  278. }
  279. CRef<CSeq_feat> SSNP_Info::x_CreateSeq_feat(void) const
  280. {
  281.     CRef<CSeq_feat> feat_ref(new CSeq_feat);
  282.     {
  283.         CSeq_feat& feat = *feat_ref;
  284.         { // data
  285.             CPackString::Assign(feat.SetData().SetImp().SetKey(),
  286.                                 kId_variation);
  287.         }
  288.         { // weight
  289.             CSeq_feat::TExt& ext = feat.SetExt();
  290.             CPackString::Assign(ext.SetType().SetStr(),
  291.                                 kId_dbSnpSynonymyData);
  292.             CSeq_feat::TExt::TData& data = ext.SetData();
  293.             data.resize(1);
  294.             data[0].Reset(new CUser_field);
  295.             CUser_field& user_field = *data[0];
  296.             CPackString::Assign(user_field.SetLabel().SetStr(),
  297.                                 kId_weight);
  298.         }
  299.         { // snpid
  300.             CSeq_feat::TDbxref& dbxref = feat.SetDbxref();
  301.             dbxref.resize(1);
  302.             dbxref[0].Reset(new CDbtag);
  303.             CDbtag& dbtag = *dbxref[0];
  304.             CPackString::Assign(dbtag.SetDb(),
  305.                                 kId_dbSNP);
  306.         }
  307.     }
  308.     return feat_ref;
  309. }
  310. void SSNP_Info::x_UpdateSeq_featData(CSeq_feat& feat,
  311.                                      const CSeq_annot_SNP_Info& annot_info) const
  312. {
  313.     { // comment
  314.         if ( m_CommentIndex == kNo_CommentIndex ) {
  315.             feat.ResetComment();
  316.         }
  317.         else {
  318.             CPackString::Assign(feat.SetComment(),
  319.                                 annot_info.x_GetComment(m_CommentIndex));
  320.         }
  321.     }
  322.     { // allele
  323.         CSeq_feat::TQual& qual = feat.SetQual();
  324.         size_t i;
  325.         const string& qual_str =
  326.             m_Flags & fQualReplace? kId_replace: kId_allele;
  327.         for ( i = 0; i < kMax_AllelesCount; ++i ) {
  328.             TAlleleIndex allele_index = m_AllelesIndices[i];
  329.             if ( allele_index == kNo_AlleleIndex ) {
  330.                 break;
  331.             }
  332.             CGb_qual* gb_qual;
  333.             if ( i < qual.size() ) {
  334.                 gb_qual = qual[i].GetPointer();
  335.             }
  336.             else {
  337.                 qual.push_back(CRef<CGb_qual>(gb_qual = new CGb_qual));
  338.                 CPackString::Assign(gb_qual->SetQual(), qual_str);
  339.             }
  340.             CPackString::Assign(gb_qual->SetVal(),
  341.                                 annot_info.x_GetAllele(allele_index));
  342.         }
  343.         qual.resize(i);
  344.     }
  345.     { // weight
  346.         CSeq_feat::TExt::TData& data = feat.SetExt().SetData();
  347.         _ASSERT(data.size() == 1);
  348.         CUser_field& user_field = *data[0];
  349.         user_field.SetData().SetInt(m_Weight);
  350.     }
  351.     { // snpid
  352.         CSeq_feat::TDbxref& dbxref = feat.SetDbxref();
  353.         _ASSERT(dbxref.size() == 1);
  354.         CDbtag& dbtag = *dbxref[0];
  355.         dbtag.SetTag().SetId(m_SNP_Id);
  356.     }
  357. }
  358. void SSNP_Info::x_UpdateSeq_feat(CSeq_feat& feat,
  359.                                  CRef<CSeq_point>& seq_point,
  360.                                  CRef<CSeq_interval>& seq_interval,
  361.                                  const CSeq_annot_SNP_Info& annot_info) const
  362. {
  363.     x_UpdateSeq_featData(feat, annot_info);
  364.     { // location
  365.         TSeqPos to_position = m_ToPosition;
  366.         TPositionDelta position_delta = m_PositionDelta;
  367.         int gi = annot_info.GetGi();
  368.         ENa_strand strand = MinusStrand()? eNa_strand_minus: eNa_strand_plus;
  369.         if ( position_delta == 0 ) {
  370.             // point
  371.             feat.SetLocation().Reset();
  372.             if ( !seq_point || !seq_point->ReferencedOnlyOnce() ) {
  373.                 seq_point.Reset(new CSeq_point);
  374.             }
  375.             CSeq_point& point = *seq_point;
  376.             feat.SetLocation().SetPnt(point);
  377.             point.SetPoint(to_position);
  378.             point.SetStrand(strand);
  379.             point.SetId().SetGi(gi);
  380.         }
  381.         else {
  382.             // interval
  383.             feat.SetLocation().Reset();
  384.             if ( !seq_interval || !seq_interval->ReferencedOnlyOnce() ) {
  385.                 seq_interval.Reset(new CSeq_interval);
  386.             }
  387.             CSeq_interval& interval = *seq_interval;
  388.             feat.SetLocation().SetInt(interval);
  389.             interval.SetFrom(to_position-position_delta);
  390.             interval.SetTo(to_position);
  391.             interval.SetStrand(strand);
  392.             interval.SetId().SetGi(gi);
  393.         }
  394.     }
  395. }
  396. void SSNP_Info::x_UpdateSeq_feat(CSeq_feat& feat,
  397.                                  const CSeq_annot_SNP_Info& annot_info) const
  398. {
  399.     x_UpdateSeq_featData(feat, annot_info);
  400.     { // location
  401.         TSeqPos to_position = m_ToPosition;
  402.         TPositionDelta position_delta = m_PositionDelta;
  403.         int gi = annot_info.GetGi();
  404.         ENa_strand strand = MinusStrand()? eNa_strand_minus: eNa_strand_plus;
  405.         if ( position_delta == 0 ) {
  406.             // point
  407.             CSeq_point& point = feat.SetLocation().SetPnt();
  408.             point.SetPoint(to_position);
  409.             point.SetStrand(strand);
  410.             point.SetId().SetGi(gi);
  411.         }
  412.         else {
  413.             // interval
  414.             CSeq_interval& interval = feat.SetLocation().SetInt();
  415.             interval.SetFrom(to_position-position_delta);
  416.             interval.SetTo(to_position);
  417.             interval.SetStrand(strand);
  418.             interval.SetId().SetGi(gi);
  419.         }
  420.     }
  421. }
  422. CRef<CSeq_feat>
  423. SSNP_Info::CreateSeq_feat(const CSeq_annot_SNP_Info& annot_info) const
  424. {
  425.     CRef<CSeq_feat> feat_ref = x_CreateSeq_feat();
  426.     x_UpdateSeq_feat(*feat_ref, annot_info);
  427.     return feat_ref;
  428. }
  429. void SSNP_Info::UpdateSeq_feat(CRef<CSeq_feat>& feat_ref,
  430.                                const CSeq_annot_SNP_Info& annot_info) const
  431. {
  432.     if ( !feat_ref || !feat_ref->ReferencedOnlyOnce() ) {
  433.         feat_ref = x_CreateSeq_feat();
  434.     }
  435.     x_UpdateSeq_feat(*feat_ref, annot_info);
  436. }
  437. void SSNP_Info::UpdateSeq_feat(CRef<CSeq_feat>& feat_ref,
  438.                                CRef<CSeq_point>& seq_point,
  439.                                CRef<CSeq_interval>& seq_interval,
  440.                                const CSeq_annot_SNP_Info& annot_info) const
  441. {
  442.     if ( !feat_ref || !feat_ref->ReferencedOnlyOnce() ) {
  443.         feat_ref = x_CreateSeq_feat();
  444.     }
  445.     x_UpdateSeq_feat(*feat_ref, seq_point, seq_interval, annot_info);
  446. }
  447. /////////////////////////////////////////////////////////////////////////////
  448. // CSeq_annot_SNP_Info
  449. /////////////////////////////////////////////////////////////////////////////
  450. CSeq_annot_SNP_Info::CSeq_annot_SNP_Info(void)
  451.     : m_Gi(-1)
  452. {
  453. }
  454. CSeq_annot_SNP_Info::CSeq_annot_SNP_Info(const CSeq_annot_SNP_Info& info)
  455.     : m_Gi(info.m_Gi),
  456.       m_SNP_Set(info.m_SNP_Set),
  457.       m_Comments(info.m_Comments),
  458.       m_Alleles(info.m_Alleles),
  459.       m_Seq_annot(info.m_Seq_annot)
  460. {
  461. }
  462. CSeq_annot_SNP_Info::~CSeq_annot_SNP_Info(void)
  463. {
  464. }
  465. const CSeq_annot_Info& CSeq_annot_SNP_Info::GetParentSeq_annot_Info(void) const
  466. {
  467.     return static_cast<const CSeq_annot_Info&>(GetBaseParent_Info());
  468. }
  469. CSeq_annot_Info& CSeq_annot_SNP_Info::GetParentSeq_annot_Info(void)
  470. {
  471.     return static_cast<CSeq_annot_Info&>(GetBaseParent_Info());
  472. }
  473. const CSeq_entry_Info& CSeq_annot_SNP_Info::GetParentSeq_entry_Info(void) const
  474. {
  475.     return GetParentSeq_annot_Info().GetParentSeq_entry_Info();
  476. }
  477. CSeq_entry_Info& CSeq_annot_SNP_Info::GetParentSeq_entry_Info(void)
  478. {
  479.     return GetParentSeq_annot_Info().GetParentSeq_entry_Info();
  480. }
  481. void CSeq_annot_SNP_Info::x_ParentAttach(CSeq_annot_Info& parent)
  482. {
  483.     x_BaseParentAttach(parent);
  484. }
  485. void CSeq_annot_SNP_Info::x_ParentDetach(CSeq_annot_Info& parent)
  486. {
  487.     x_BaseParentDetach(parent);
  488. }
  489. void CSeq_annot_SNP_Info::x_UpdateAnnotIndexContents(CTSE_Info& tse)
  490. {
  491.     CSeq_id_Handle idh = CSeq_id_Handle::GetGiHandle(GetGi());
  492.     tse.x_MapSNP_Table(GetParentSeq_annot_Info().GetName(), idh, *this);
  493.     TParent::x_UpdateAnnotIndexContents(tse);
  494. }
  495. void CSeq_annot_SNP_Info::x_UnmapAnnotObjects(CTSE_Info& tse)
  496. {
  497.     CSeq_id_Handle idh = CSeq_id_Handle::GetGiHandle(GetGi());
  498.     tse.x_UnmapSNP_Table(GetParentSeq_annot_Info().GetName(), idh, *this);
  499. }
  500. void CSeq_annot_SNP_Info::x_DropAnnotObjects(CTSE_Info& /*tse*/)
  501. {
  502. }
  503. void CSeq_annot_SNP_Info::x_DoUpdateObject(void)
  504. {
  505. }
  506. size_t CIndexedStrings::GetIndex(const string& s, size_t max_index)
  507. {
  508.     TIndices::iterator it = m_Indices.lower_bound(s);
  509.     if ( it != m_Indices.end() && it->first == s ) {
  510.         return it->second;
  511.     }
  512.     size_t index = m_Strings.size();
  513.     if ( index <= max_index ) {
  514.         //NcbiCout << "string["<<index<<"] = "" << s << ""n";
  515.         m_Strings.push_back(s);
  516.         m_Indices.insert(it, TIndices::value_type(s, index));
  517.     }
  518.     else {
  519.         _ASSERT(index == max_index + 1);
  520.     }
  521.     return index;
  522. }
  523. SSNP_Info::TAlleleIndex
  524. CSeq_annot_SNP_Info::x_GetAlleleIndex(const string& allele)
  525. {
  526.     if ( allele.size() > SSNP_Info::kMax_AlleleLength )
  527.         return SSNP_Info::kNo_AlleleIndex;
  528.     if ( m_Alleles.IsEmpty() ) {
  529.         // prefill by small alleles
  530.         for ( const char* c = "-NACGT"; *c; ++c ) {
  531.             m_Alleles.GetIndex(string(1, *c), SSNP_Info::kMax_AlleleIndex);
  532.         }
  533.         for ( const char* c1 = "ACGT"; *c1; ++c1 ) {
  534.             string s(1, *c1);
  535.             for ( const char* c2 = "ACGT"; *c2; ++c2 ) {
  536.                 m_Alleles.GetIndex(s+*c2, SSNP_Info::kMax_AlleleIndex);
  537.             }
  538.         }
  539.     }
  540.     return m_Alleles.GetIndex(allele, SSNP_Info::kMax_AlleleIndex);
  541. }
  542. void CSeq_annot_SNP_Info::x_SetGi(int gi)
  543. {
  544.     _ASSERT(m_Gi == -1);
  545.     m_Gi = gi;
  546.     _ASSERT(!m_Seq_id);
  547.     m_Seq_id.Reset(new CSeq_id);
  548.     m_Seq_id->SetGi(gi);
  549. }
  550. void CSeq_annot_SNP_Info::Reset(void)
  551. {
  552.     m_Gi = -1;
  553.     m_Seq_id.Reset();
  554.     m_Comments.Clear();
  555.     m_Alleles.Clear();
  556.     m_SNP_Set.clear();
  557.     m_Seq_annot.Reset();
  558. }
  559. END_SCOPE(objects)
  560. END_NCBI_SCOPE
  561. /*
  562.  * $Log: snp_annot_info.cpp,v $
  563.  * Revision 1000.3  2004/06/01 19:24:32  gouriano
  564.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  565.  *
  566.  * Revision 1.13  2004/05/21 21:42:13  gorelenk
  567.  * Added PCH ncbi_pch.hpp
  568.  *
  569.  * Revision 1.12  2004/03/24 18:30:30  vasilche
  570.  * Fixed edit API.
  571.  * Every *_Info object has its own shallow copy of original object.
  572.  *
  573.  * Revision 1.11  2004/03/16 15:47:28  vasilche
  574.  * Added CBioseq_set_Handle and set of EditHandles
  575.  *
  576.  * Revision 1.10  2004/02/06 16:13:20  vasilche
  577.  * Added parsing "replace" as a synonym of "allele" in SNP qualifiers.
  578.  * More compact format of SNP table in cache. SNP table version increased.
  579.  * Fixed null pointer exception when SNP features are loaded from cache.
  580.  *
  581.  * Revision 1.9  2004/01/28 20:54:36  vasilche
  582.  * Fixed mapping of annotations.
  583.  *
  584.  * Revision 1.8  2004/01/13 16:55:34  vasilche
  585.  * CReader, CSeqref and some more classes moved from xobjmgr to separate lib.
  586.  * Headers moved from include/objmgr to include/objtools/data_loaders/genbank.
  587.  *
  588.  * Revision 1.7  2003/11/26 17:56:00  vasilche
  589.  * Implemented ID2 split in ID1 cache.
  590.  * Fixed loading of splitted annotations.
  591.  *
  592.  * Revision 1.6  2003/10/21 14:27:35  vasilche
  593.  * Added caching of gi -> sat,satkey,version resolution.
  594.  * SNP blobs are stored in cache in preprocessed format (platform dependent).
  595.  * Limit number of connections to GenBank servers.
  596.  * Added collection of ID1 loader statistics.
  597.  *
  598.  * Revision 1.5  2003/09/30 16:22:04  vasilche
  599.  * Updated internal object manager classes to be able to load ID2 data.
  600.  * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  601.  * Scope caches results of requests for data to data loaders.
  602.  * Optimized CSeq_id_Handle for gis.
  603.  * Optimized bioseq lookup in scope.
  604.  * Reduced object allocations in annotation iterators.
  605.  * CScope is allowed to be destroyed before other objects using this scope are
  606.  * deleted (feature iterators, bioseq handles etc).
  607.  * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  608.  * Added 'adaptive' option to objmgr_demo application.
  609.  *
  610.  * Revision 1.4  2003/08/27 14:29:53  vasilche
  611.  * Reduce object allocations in feature iterator.
  612.  *
  613.  * Revision 1.3  2003/08/19 18:35:21  vasilche
  614.  * CPackString classes were moved to SERIAL library.
  615.  *
  616.  * Revision 1.2  2003/08/15 19:19:16  vasilche
  617.  * Fixed memory leak in string packing hooks.
  618.  * Fixed processing of 'partial' flag of features.
  619.  * Allow table packing of non-point SNP.
  620.  * Allow table packing of SNP with long alleles.
  621.  *
  622.  * Revision 1.1  2003/08/14 20:05:19  vasilche
  623.  * Simple SNP features are stored as table internally.
  624.  * They are recreated when needed using CFeat_CI.
  625.  *
  626.  */