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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: Seq_align.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:33:39  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.16
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: Seq_align.cpp,v 1000.2 2004/06/01 19:33:39 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author:  .......
  35.  *
  36.  * File Description:
  37.  *   .......
  38.  *
  39.  * Remark:
  40.  *   This code was originally generated by application DATATOOL
  41.  *   using specifications from the data definition file
  42.  *   'seqalign.asn'.
  43.  */
  44. // standard includes
  45. #include <ncbi_pch.hpp>
  46. #include <objects/seqalign/seqalign_exception.hpp>
  47. #include <objects/seqalign/Dense_seg.hpp>
  48. #include <objects/seqalign/Dense_diag.hpp>
  49. #include <objects/seqalign/Std_seg.hpp>
  50. #include <objects/seqalign/Seq_align_set.hpp>
  51. #include <objects/seqalign/Score.hpp>
  52. #include <objects/general/Object_id.hpp>
  53. #include <objects/seqloc/Seq_loc.hpp>
  54. #include <objects/seqloc/Seq_interval.hpp>
  55. #include <serial/iterator.hpp>
  56. // generated includes
  57. #include <objects/seqalign/Seq_align.hpp>
  58. // generated classes
  59. BEGIN_NCBI_SCOPE
  60. BEGIN_objects_SCOPE // namespace ncbi::objects::
  61. // destructor
  62. CSeq_align::~CSeq_align(void)
  63. {
  64. }
  65. CSeq_align::TDim CSeq_align::CheckNumRows(void) const
  66. {
  67.     switch (GetSegs().Which()) {
  68.     case C_Segs::e_Denseg:
  69.         return GetSegs().GetDenseg().CheckNumRows();
  70.     case C_Segs::e_Std:
  71.         {
  72.             TDim numrows = 0;
  73.             ITERATE (C_Segs::TStd, std_i, GetSegs().GetStd()) {
  74.                 const TDim& seg_numrows = (*std_i)->CheckNumRows();
  75.                 if (numrows) {
  76.                     if (seg_numrows != numrows) {
  77.                         NCBI_THROW(CSeqalignException, eInvalidAlignment,
  78.                                    "CSeq_align::CheckNumRows(): Number of rows "
  79.                                    "is not the same for each std seg.");
  80.                     }
  81.                 } else {
  82.                     numrows = seg_numrows;
  83.                 }
  84.             }
  85.             return numrows;
  86.         }
  87.     default:
  88.         NCBI_THROW(CSeqalignException, eUnsupported,
  89.                    "CSeq_align::CheckNumRows() currently does not handle "
  90.                    "this type of alignment");
  91.     }
  92. }
  93. CRange<TSeqPos> CSeq_align::GetSeqRange(TDim row) const
  94. {
  95.     switch (GetSegs().Which()) {
  96.     case C_Segs::e_Denseg:
  97.         return GetSegs().GetDenseg().GetSeqRange(row);
  98.     case C_Segs::e_Std:
  99.         {
  100.             CRange<TSeqPos> rng;
  101.             CSeq_id seq_id;
  102.             size_t seg_i = 0;
  103.             ITERATE (C_Segs::TStd, std_i, GetSegs().GetStd()) {
  104.                 TDim row_i = 0;
  105.                 ITERATE (CStd_seg::TLoc, i, (*std_i)->GetLoc()) {
  106.                     const CSeq_loc& loc = **i;
  107.                     if (row_i++ == row) {
  108.                         if (loc.IsInt()) {
  109.                             if ( !seg_i ) {
  110.                                 seq_id.Assign(loc.GetInt().GetId());
  111.                             } else if (seq_id.Compare(loc.GetInt().GetId())
  112.                                        != CSeq_id::e_YES) {
  113.                                 NCBI_THROW(CSeqalignException,
  114.                                            eInvalidRowNumber,
  115.                                            "CSeq_align::GetSeqRange():"
  116.                                            " Row seqids not consistent."
  117.                                            " Cannot determine range.");
  118.                             }
  119.                             rng.CombineWith
  120.                                 (CRange<TSeqPos>
  121.                                  (loc.GetInt().GetFrom(),
  122.                                   loc.GetInt().GetTo()));
  123.                         }
  124.                     }
  125.                 }
  126.                 if (row < 0  ||  row >= row_i) {
  127.                     NCBI_THROW(CSeqalignException, eInvalidRowNumber,
  128.                                "CSeq_align::GetSeqRange():"
  129.                                " Invalid row number");
  130.                 }
  131.                 if (CanGetDim()  &&  row_i != GetDim()) {
  132.                     NCBI_THROW(CSeqalignException, eInvalidAlignment,
  133.                                "CSeq_align::GetSeqRange():"
  134.                                " loc.size is inconsistent with dim");
  135.                 }
  136.                 seg_i++;
  137.             }
  138.             if (rng.Empty()) {
  139.                 NCBI_THROW(CSeqalignException, eInvalidAlignment,
  140.                            "CSeq_align::GetSeqRange(): Row is empty");
  141.             }
  142.             return rng;
  143.         }
  144.     default:
  145.         NCBI_THROW(CSeqalignException, eUnsupported,
  146.                    "CSeq_align::GetSeqRange() currently does not handle "
  147.                    "this type of alignment.");
  148.     }
  149. }
  150. TSeqPos CSeq_align::GetSeqStart(TDim row) const
  151. {
  152.     switch (GetSegs().Which()) {
  153.     case C_Segs::e_Denseg:
  154.         return GetSegs().GetDenseg().GetSeqStart(row);
  155.     case C_Segs::e_Std:
  156.         return GetSeqRange(row).GetFrom();
  157.     default:
  158.         NCBI_THROW(CSeqalignException, eUnsupported,
  159.                    "CSeq_align::GetSeqStart() currently does not handle "
  160.                    "this type of alignment.");
  161.     }
  162. }
  163. TSeqPos CSeq_align::GetSeqStop (TDim row) const
  164. {
  165.     switch (GetSegs().Which()) {
  166.     case C_Segs::e_Denseg:
  167.         return GetSegs().GetDenseg().GetSeqStop(row);
  168.     case C_Segs::e_Std:
  169.         return GetSeqRange(row).GetTo();
  170.     default:
  171.         NCBI_THROW(CSeqalignException, eUnsupported,
  172.                    "CSeq_align::GetSeqStop() currently does not handle "
  173.                    "this type of alignment.");
  174.     }
  175. }
  176. const CSeq_id& CSeq_align::GetSeq_id(TDim row) const
  177. {
  178.     switch (GetSegs().Which()) {
  179.     case C_Segs::e_Denseg:
  180.         {
  181.             if ( GetSegs().GetDenseg().IsSetIds()  &&
  182.                 row < GetSegs().GetDenseg().GetIds().size()) {
  183.                 return *GetSegs().GetDenseg().GetIds()[row];
  184.             }
  185.             break;
  186.         }
  187.     case C_Segs::e_Dendiag:
  188.         {
  189.             // If segments have different number of rows, this will try
  190.             // to find the segment with enough rows to get the id.
  191.             ITERATE(CSeq_align::C_Segs::TDendiag, seg, GetSegs().GetDendiag()) {
  192.                 if( (*seg)->IsSetIds()  &&
  193.                     row < (*seg)->GetIds().size() ) {
  194.                     return *(*seg)->GetIds()[row];
  195.                 }
  196.             }
  197.             break;
  198.         }
  199.     case C_Segs::e_Std:
  200.         {
  201.             // If segments have different number of rows, this will try
  202.             // to find the segment with enough rows to get the id.
  203.             ITERATE(CSeq_align::C_Segs::TStd, seg, GetSegs().GetStd()) {
  204.                 if ( (*seg)->IsSetLoc()  &&
  205.                     row < (*seg)->GetLoc().size() ) {
  206.                     CSeq_loc_CI loc_iter(*(*seg)->GetLoc()[row]);
  207.                     return loc_iter.GetSeq_id();
  208.                 }
  209.             }
  210.             break;
  211.         }
  212.     default:
  213.         NCBI_THROW(CSeqalignException, eUnsupported,
  214.                    "CSeq_align::GetSeq_id() currently does not handle "
  215.                    "this type of alignment.");
  216.     }
  217.     NCBI_THROW(CSeqalignException, eInvalidRowNumber,
  218.                "CSeq_align::GetSeq_id(): "
  219.                "can not get seq-id for the row requested.");
  220.     // return CSeq_id();
  221. }
  222. ///---------------------------------------------------------------------------
  223. /// PRE : name of score to return
  224. /// POST: whether or not we found that score; score converted to int
  225. bool CSeq_align::GetNamedScore(const string &id, int &score) const
  226. {
  227.     if (IsSetScore()) {
  228.         const TScore &scores = GetScore();
  229.         ITERATE (TScore, scoreI, scores) {
  230.             if ((*scoreI)->IsSetId()  &&  (*scoreI)->GetId().IsStr()  &&
  231.                 (*scoreI)->GetId().GetStr() == id) {
  232.                 if ((*scoreI)->GetValue().IsInt()) {
  233.                     score = (*scoreI)->GetValue().GetInt();
  234.                 } else {
  235.                     score = (int) (*scoreI)->GetValue().GetReal();
  236.                 }
  237.                 return true;
  238.             }
  239.         }
  240.     }
  241.     return false;
  242. }
  243. ///---------------------------------------------------------------------------
  244. /// PRE : name of score to return
  245. /// POST: whether or not we found that score; score converted to double
  246. bool CSeq_align::GetNamedScore(const string &id, double &score) const
  247. {
  248.     if (IsSetScore()) {
  249.         const TScore &scores = GetScore();
  250.         ITERATE (TScore, scoreI, scores) {
  251.             if ((*scoreI)->IsSetId()  &&  (*scoreI)->GetId().IsStr()  &&
  252.                 (*scoreI)->GetId().GetStr() == id) {
  253.                 if ((*scoreI)->GetValue().IsInt()) {
  254.                     score = (double) (*scoreI)->GetValue().GetInt();
  255.                 } else {
  256.                     score = (*scoreI)->GetValue().GetReal();
  257.                 }
  258.                 return true;
  259.             }
  260.         }
  261.     }
  262.     return false;
  263. }
  264. void CSeq_align::Validate(bool full_test) const
  265. {
  266.     switch (GetSegs().Which()) {
  267.     case C_Segs::e_Denseg:
  268.         GetSegs().GetDenseg().Validate(full_test);
  269.         break;
  270.     case C_Segs::e_Std:
  271.         CheckNumRows();
  272.         break;
  273.     default:
  274.         NCBI_THROW(CSeqalignException, eUnsupported,
  275.                    "CSeq_align::Validate() currently does not handle "
  276.                    "this type of alignment");
  277.     }
  278. }
  279. ///---------------------------------------------------------------------------
  280. /// PRE : currently only implemented for dense-seg segments
  281. /// POST: same alignment, opposite orientation
  282. void CSeq_align::Reverse(void)
  283. {
  284.     switch (GetSegs().Which()) {
  285.     case C_Segs::e_Denseg:
  286.         SetSegs().SetDenseg().Reverse();
  287.         break;
  288.     default:
  289.         NCBI_THROW(CSeqalignException, eUnsupported,
  290.                    "CSeq_align::Reverse() currently only handles dense-seg "
  291.                    "alignments");
  292.     }
  293. }
  294. ///---------------------------------------------------------------------------
  295. /// PRE : currently only implemented for dense-seg segments; two row numbers
  296. /// POST: same alignment, position of the two rows has been swapped
  297. void CSeq_align::SwapRows(TDim row1, TDim row2)
  298. {
  299.     switch (GetSegs().Which()) {
  300.     case C_Segs::e_Denseg:
  301.         SetSegs().SetDenseg().SwapRows(row1, row2);
  302.         break;
  303.     case C_Segs::e_Disc:
  304.         SetSegs().SetDisc().SwapRows(row1, row2);
  305.         break;
  306.     default:
  307.         NCBI_THROW(CSeqalignException, eUnsupported,
  308.                    "CSeq_align::SwapRows currently only handles dense-seg "
  309.                    "alignments");
  310.     }
  311. }
  312. ///----------------------------------------------------------------------------
  313. /// PRE : the Seq-align has StdSeg segs
  314. /// POST: Seq_align of type Dense-seg is created with m_Widths if necessary
  315. CRef<CSeq_align> 
  316. CSeq_align::CreateDensegFromStdseg(SSeqIdChooser* SeqIdChooser) const
  317. {
  318.     if ( !GetSegs().IsStd() ) {
  319.         NCBI_THROW(CSeqalignException, eInvalidInputAlignment,
  320.                    "CSeq_align::CreateDensegFromStdseg(): "
  321.                    "Input Seq-align should have segs of type StdSeg!");
  322.     }
  323.     CRef<CSeq_align> sa(new CSeq_align);
  324.     sa->SetType(eType_not_set);
  325.     CDense_seg& ds = sa->SetSegs().SetDenseg();
  326.     typedef CDense_seg::TDim    TNumrow;
  327.     typedef CDense_seg::TNumseg TNumseg;
  328.     vector<TSeqPos>       row_lens;
  329.     CDense_seg::TLens&    seg_lens = ds.SetLens();
  330.     CDense_seg::TStarts&  starts   = ds.SetStarts();
  331.     CDense_seg::TStrands& strands  = ds.SetStrands();
  332.     CDense_seg::TWidths&  widths   = ds.SetWidths();
  333.     vector<bool>          widths_determined;
  334.     TSeqPos row_len;
  335.     TSeqPos from, to;
  336.     ENa_strand strand;
  337.     TNumseg seg = 0;
  338.     TNumrow dim = 0, row = 0;
  339.     ITERATE (C_Segs::TStd, std_i, GetSegs().GetStd()) {
  340.         const CStd_seg& ss = **std_i;
  341.         seg_lens.push_back(0);
  342.         TSeqPos& seg_len = seg_lens.back();
  343.         row_len = 0;
  344.         row_lens.clear();
  345.         widths_determined.push_back(false);
  346.         row = 0;
  347.         ITERATE (CStd_seg::TLoc, i, ss.GetLoc()) {
  348.             const CSeq_id* seq_id = 0;
  349.             // push back initialization values
  350.             if (seg == 0) {
  351.                 widths.push_back(0);
  352.                 strands.push_back(eNa_strand_unknown);
  353.             }
  354.             if ((*i)->IsInt()) {
  355.                 const CSeq_interval& interval = (*i)->GetInt();
  356.                 
  357.                 // determine start and len
  358.                 from = interval.GetFrom();
  359.                 to = interval.GetTo();
  360.                 starts.push_back(from);
  361.                 row_len = to - from + 1;
  362.                 row_lens.push_back(row_len);
  363.                 
  364.                 int width = 0;
  365.                 // try to determine/check the seg_len and width
  366.                 if (!seg_len) {
  367.                     width = 0;
  368.                     seg_len = row_len;
  369.                 } else {
  370.                     if (row_len * 3 == seg_len) {
  371.                         seg_len /= 3;
  372.                         width = 1;
  373.                     } else if (row_len / 3 == seg_len) {
  374.                         width = 3;
  375.                     } else if (row_len != seg_len) {
  376.                         NCBI_THROW(CSeqalignException, eInvalidInputAlignment,
  377.                                    "CreateDensegFromStdseg(): "
  378.                                    "Std-seg segment lengths not accurate!");
  379.                     }
  380.                 }
  381.                 if (width > 0) {
  382.                     widths_determined[seg] = true;
  383.                     if (widths[row] > 0  &&  widths[row] != width) {
  384.                         NCBI_THROW(CSeqalignException, eInvalidInputAlignment,
  385.                                    "CreateDensegFromStdseg(): "
  386.                                    "Std-seg segment lengths not accurate!");
  387.                     } else {
  388.                         widths[row] = width;
  389.                     }
  390.                 }
  391.                 // get the id
  392.                 seq_id = &(*i)->GetInt().GetId();
  393.                 // determine/check the strand
  394.                 if (interval.CanGetStrand()) {
  395.                     strand = interval.GetStrand();
  396.                     if (seg == 0  ||  strands[row] == eNa_strand_unknown) {
  397.                         strands[row] = strand;
  398.                     } else {
  399.                         if (strands[row] != strand) {
  400.                             NCBI_THROW(CSeqalignException,
  401.                                        eInvalidInputAlignment,
  402.                                        "CreateDensegFromStdseg(): "
  403.                                        "Inconsistent strands!");
  404.                         }
  405.                     }
  406.                 } else {
  407.                     strand = eNa_strand_unknown;
  408.                 }
  409.                     
  410.             } else if ((*i)->IsEmpty()) {
  411.                 starts.push_back(-1);
  412.                 if (seg == 0) {
  413.                     strands[row] = eNa_strand_unknown;
  414.                 }
  415.                 seq_id = &(*i)->GetEmpty();
  416.                 row_lens.push_back(0);
  417.             }
  418.             // determine/check the id
  419.             if (seg == 0) {
  420.                 CRef<CSeq_id> id(new CSeq_id);
  421.                 SerialAssign(*id, *seq_id);
  422.                 ds.SetIds().push_back(id);
  423.             } else {
  424.                 CSeq_id& id = *ds.SetIds()[row];
  425.                 if (!SerialEquals(id, *seq_id)) {
  426.                     if (SeqIdChooser) {
  427.                         SeqIdChooser->ChooseSeqId(id, *seq_id);
  428.                     } else {
  429.                         string errstr =
  430.                             string("CreateDensegFromStdseg(): Seq-ids: ") +
  431.                             id.AsFastaString() + " and " +
  432.                             seq_id->AsFastaString() + " are not identical!" +
  433.                             " Without the OM it cannot be determined if they belong to"
  434.                             " the same sequence."
  435.                             " Define and pass ChooseSeqId to resolve seq-ids.";
  436.                         NCBI_THROW(CSeqalignException, eInvalidInputAlignment, errstr);
  437.                     }
  438.                 }
  439.             }
  440.             // next row
  441.             row++;
  442.             if (seg == 0) {
  443.                 dim++;
  444.             }
  445.         }
  446.         if (dim != ss.GetDim()  ||  row != dim) {
  447.             NCBI_THROW(CSeqalignException, eInvalidInputAlignment,
  448.                        "CreateDensegFromStdseg(): "
  449.                        "Inconsistent dimentions!");
  450.         }
  451.         if (widths_determined[seg]) {
  452.             // go back and determine/check widths
  453.             for (row = 0; row < dim; row++) {
  454.                 if ((row_len = row_lens[row]) > 0) {
  455.                     int width = 0;
  456.                     if (row_len == seg_len * 3) {
  457.                         width = 3;
  458.                     } else if (row_len == seg_len) {
  459.                         width = 1;
  460.                     }
  461.                     if (widths[row] > 0  &&  widths[row] != width) {
  462.                         NCBI_THROW(CSeqalignException, eInvalidInputAlignment,
  463.                                    "CreateDensegFromStdseg(): "
  464.                                    "Std-seg segment lengths not accurate!");
  465.                     } else {
  466.                         widths[row] = width;
  467.                     }
  468.                 }
  469.             }
  470.         }
  471.         // next seg
  472.         seg++;
  473.     }
  474.     ds.SetDim(dim);
  475.     ds.SetNumseg(seg);
  476.     // go back and finish lens determination
  477.     bool widths_failure = false;
  478.     bool widths_success = false;
  479.     for (seg = 0; seg < ds.GetNumseg(); seg++) {
  480.         if (!widths_determined[seg]) {
  481.             for(row = 0; row < dim; row++) {
  482.                 if (starts[seg * dim + row] >= 0) {
  483.                     int width = widths[row];
  484.                     if (width == 3) {
  485.                         seg_lens[seg] /= 3;
  486.                     } else if (width == 0) {
  487.                         widths_failure = true;
  488.                     }
  489.                     break;
  490.                 }
  491.             }
  492.         } else {
  493.             widths_success = true;
  494.         }
  495.     }
  496.     if (widths_failure) {
  497.         if (widths_success) {
  498.             NCBI_THROW(CSeqalignException, eInvalidInputAlignment,
  499.                        "CreateDensegFromStdseg(): "
  500.                        "Some widths cannot be determined!");
  501.         } else {
  502.             ds.ResetWidths();
  503.         }
  504.     }
  505.     
  506.     // finish the strands
  507.     for (seg = 1; seg < ds.GetNumseg(); seg++) {
  508.         for (row = 0; row < dim; row++) {
  509.             strands.push_back(strands[row]);
  510.         }
  511.     }
  512.     return sa;
  513. }
  514. ///----------------------------------------------------------------------------
  515. /// PRE : the Seq-align is a Dense-seg of aligned nucleotide sequences
  516. /// POST: Seq_align of type Dense-seg is created with each of the m_Widths 
  517. ///       equal to 3 and m_Lengths devided by 3.
  518. CRef<CSeq_align> 
  519. CSeq_align::CreateTranslatedDensegFromNADenseg() const
  520. {
  521.     if ( !GetSegs().IsDenseg() ) {
  522.         NCBI_THROW(CSeqalignException, eInvalidInputAlignment,
  523.                    "CSeq_align::CreateTranslatedDensegFromNADenseg(): "
  524.                    "Input Seq-align should have segs of type Dense-seg!");
  525.     }
  526.     
  527.     CRef<CSeq_align> sa(new CSeq_align);
  528.     sa->SetType(eType_not_set);
  529.     if (GetSegs().GetDenseg().IsSetWidths()) {
  530.         NCBI_THROW(CSeqalignException, eInvalidInputAlignment,
  531.                    "CSeq_align::CreateTranslatedDensegFromNADenseg(): "
  532.                    "Widths already exist for the original alignment");
  533.     }
  534.     // copy from the original
  535.     sa->Assign(*this);
  536.     CDense_seg& ds = sa->SetSegs().SetDenseg();
  537.     // fix the lengths
  538.     const CDense_seg::TLens& orig_lens = GetSegs().GetDenseg().GetLens();
  539.     CDense_seg::TLens&       lens      = ds.SetLens();
  540.     for (CDense_seg::TNumseg numseg = 0; numseg < ds.GetNumseg(); numseg++) {
  541.         if (orig_lens[numseg] % 3) {
  542.             string errstr =
  543.                 string("CSeq_align::CreateTranslatedDensegFromNADenseg(): ") +
  544.                 "Length of segment " + NStr::IntToString(numseg) +
  545.                 " is not divisible by 3.";
  546.             NCBI_THROW(CSeqalignException, eInvalidInputAlignment, errstr);
  547.         } else {
  548.             lens[numseg] = orig_lens[numseg] / 3;
  549.         }
  550.     }
  551.     // add the widths
  552.     ds.SetWidths().resize(ds.GetDim(), 3);
  553. #if _DEBUG
  554.     ds.Validate(true);
  555. #endif
  556.     return sa;
  557. }
  558. END_objects_SCOPE // namespace ncbi::objects::
  559. END_NCBI_SCOPE
  560. /*
  561. * ===========================================================================
  562. *
  563. * $Log: Seq_align.cpp,v $
  564. * Revision 1000.2  2004/06/01 19:33:39  gouriano
  565. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.16
  566. *
  567. * Revision 1.16  2004/05/19 17:25:43  gorelenk
  568. * Added include of PCH - ncbi_pch.hpp
  569. *
  570. * Revision 1.15  2004/05/05 19:16:25  johnson
  571. * Added SwapRows method for 'disc' seq-align / seq-align-set
  572. *
  573. * Revision 1.14  2004/04/27 19:17:13  johnson
  574. * Added GetNamedScore helper function
  575. *
  576. * Revision 1.13  2004/04/19 17:27:22  grichenk
  577. * Added GetSeq_id(TDim row)
  578. *
  579. * Revision 1.12  2004/04/12 16:51:02  vasilche
  580. * Fixed uninitialized variables.
  581. *
  582. * Revision 1.11  2004/03/09 17:27:42  kuznets
  583. * Bug fix(compilation): CSeq_align::CreateDensegFromStdseg MSVC
  584. *
  585. * Revision 1.10  2004/03/09 17:14:33  todorov
  586. * changed the C-style callback to a functor
  587. *
  588. * Revision 1.9  2004/02/23 15:31:24  todorov
  589. * +TChooseSeqIdCallback to abstract resolving seq-ids in CreateDensegFromStdseg()
  590. *
  591. * Revision 1.8  2004/02/13 17:10:24  todorov
  592. * - inconsistent ids exception in CreateDensegFromStdseg
  593. *
  594. * Revision 1.7  2004/01/09 16:32:06  todorov
  595. * +SetType(eType_not_set)
  596. *
  597. * Revision 1.6  2003/12/16 22:54:31  todorov
  598. * +CreateTranslatedDensegFromNADenseg
  599. *
  600. * Revision 1.5  2003/12/11 22:34:05  todorov
  601. * Implementation of GetSeq{Start,Stop}
  602. *
  603. * Revision 1.4  2003/09/16 15:31:14  todorov
  604. * Added validation methods. Added seq range methods
  605. *
  606. * Revision 1.3  2003/08/26 20:28:38  johnson
  607. * added 'SwapRows' method
  608. *
  609. * Revision 1.2  2003/08/19 21:11:13  todorov
  610. * +CreateDensegFromStdseg
  611. *
  612. * Revision 1.1  2003/08/13 18:12:03  johnson
  613. * added 'Reverse' method
  614. *
  615. *
  616. * ===========================================================================
  617. */
  618. /* Original file checksum: lines: 64, chars: 1885, CRC32: 4e5d1825 */