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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: seqport_util.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2003/11/21 18:20:24  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [ORIGINAL] Dev-tree R1.10
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJECTS_SEQ___SEQPORT_UTIL__HPP
  10. #define OBJECTS_SEQ___SEQPORT_UTIL__HPP
  11. /*  $Id: seqport_util.hpp,v 1000.2 2003/11/21 18:20:24 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Author:  Clifford Clausen
  37.  *          (also reviewed/fixed/groomed by Denis Vakatov and Aaron Ucko)
  38.  *
  39.  * File Description:
  40.  */   
  41. #include <corelib/ncbi_limits.hpp>
  42. #include <objects/seq/Seq_data.hpp>
  43. #include <objects/seqcode/Seq_code_type.hpp>
  44. #include <util/random_gen.hpp>
  45. #include <memory>
  46. #include <vector>
  47. BEGIN_NCBI_SCOPE
  48. BEGIN_objects_SCOPE
  49. // CSeqportUtil is a wrapper for a hidden object of class
  50. // CSeqportUtil_implementation.
  51. class CSeqportUtil_implementation;
  52. class NCBI_SEQ_EXPORT CSeqportUtil
  53. {
  54. public:
  55.     // TypeDefs
  56.     typedef unsigned int TIndex;
  57.     typedef pair<TIndex, TIndex> TPair;
  58.     // Classes thrown as errors
  59.     struct NCBI_SEQ_EXPORT CBadIndex : public runtime_error
  60.     {
  61.         CBadIndex(TIndex idx, string method)
  62.             : runtime_error("CSeqportUtil::" + method +
  63.             " -- bad index specified: " + NStr::UIntToString(idx)) {}
  64.     };
  65.     struct NCBI_SEQ_EXPORT CBadSymbol : public runtime_error 
  66.     {
  67.         CBadSymbol(string code, string method)
  68.             : runtime_error("CSeqportUtil::" + method +
  69.             " -- bad symbol specified: " + code) {}
  70.     };
  71.     struct NCBI_SEQ_EXPORT CBadType : public runtime_error 
  72.     {
  73.         CBadType(string method)
  74.             : runtime_error("CSeqportUtil::" + method +
  75.             " -- specified code or code combination not supported") {}
  76.     };
  77.     
  78.     // Alphabet conversion function. Function returns the
  79.     // number of converted codes.
  80.     static TSeqPos Convert(const CSeq_data&       in_seq,
  81.                            CSeq_data*             out_seq,
  82.                            CSeq_data::E_Choice    to_code,
  83.                            TSeqPos                uBeginIdx = 0,
  84.                            TSeqPos                uLength   = 0,
  85.                            bool                   bAmbig    = false,
  86.                            CRandom::TValue        seed      = 17734276);
  87.     // Function to provide maximum in-place packing of na
  88.     // sequences without loss of information. Iupacna
  89.     // can always be packed to ncbi4na without loss. Iupacna
  90.     // can sometimes be packed to ncbi2na. Ncbi4na can
  91.     // sometimes be packed to ncbi2na. Returns number of
  92.     // residues packed. If in_seq cannot be packed, the
  93.     // original in_seq is returned unchanged and the return value
  94.     // from Pack is 0
  95.     static TSeqPos Pack(CSeq_data*   in_seq,                        
  96.         TSeqPos uLength = ncbi::numeric_limits<TSeqPos>::max());
  97.     // Performs fast validation of CSeq_data. If all data in the
  98.     // sequence represent valid elements of a biological sequence, then
  99.     // FastValidate returns true. Otherwise it returns false
  100.     static bool FastValidate(const CSeq_data&   in_seq,
  101.                              TSeqPos            uBeginIdx = 0,
  102.                              TSeqPos            uLength   = 0);
  103.     // Performs validation of CSeq_data. Returns a list of indices
  104.     // corresponding to data that does not represent a valid element
  105.     // of a biological sequence.
  106.     static void Validate(const CSeq_data&   in_seq,
  107.                          vector<TSeqPos>*   badIdx,
  108.                          TSeqPos            uBeginIdx = 0,
  109.                          TSeqPos            uLength   = 0);
  110.     // Get ambiguous bases. out_indices returns
  111.     // the indices relative to in_seq of ambiguous bases.
  112.     // out_seq returns the ambiguous bases. Note, there are
  113.     // only ambiguous bases for iupacna->ncib2na and
  114.     // ncib4na->ncbi2na coversions.
  115.     static TSeqPos GetAmbigs(const CSeq_data&    in_seq,
  116.                              CSeq_data*          out_seq,
  117.                              vector<TSeqPos>*    out_indices,
  118.                              CSeq_data::E_Choice to_code = CSeq_data::e_Ncbi2na,
  119.                              TSeqPos             uBeginIdx = 0,
  120.                              TSeqPos             uLength   = 0);
  121.     // Get a copy of CSeq_data. No conversion is done. uBeginIdx of the
  122.     // biological sequence in in_seq will be in position
  123.     // 0 of out_seq. Usually, uLength bases will be copied
  124.     // from in_seq to out_seq. If uLength goes beyond the end of
  125.     // in_seq, it will be shortened to go to the end of in_seq.
  126.     // For packed sequence formats (ncbi2na and ncbi4na),
  127.     // only uLength bases are valid copies. For example,
  128.     // in an ncbi4na encoded sequence, if uLength is odd, the last
  129.     // sequence returned will be uLength+1 because 2 bases are encoded
  130.     // per byte in ncbi4na. However, in this case, uLength will be returned
  131.     // unchanged (it will remain odd unless it goes beyond the end
  132.     // of in_seq). If uLength=0, then a copy from uBeginIdx to the end
  133.     // of in_seq is returned.
  134.     static TSeqPos GetCopy(const CSeq_data&   in_seq,
  135.                            CSeq_data*         out_seq,
  136.                            TSeqPos            uBeginIdx = 0,
  137.                            TSeqPos            uLength   = 0);
  138.     // Method to keep only a contiguous piece of a sequence beginning
  139.     // at uBeginIdx and uLength residues long. Does bit shifting as
  140.     // needed to put uBeginIdx of original sequence at position zero on output.
  141.     // Similar to GetCopy(), but done in place.  Returns length of
  142.     // kept sequence.
  143.     static TSeqPos Keep(CSeq_data*   in_seq,
  144.                         TSeqPos      uBeginIdx = 0,
  145.                         TSeqPos      uLength   = 0);
  146.     // Append in_seq2 to to end of in_seq1. Both in seqs must be
  147.     // in the same alphabet or this method will throw a runtime_error.
  148.     // The result of the append will be put into out_seq.
  149.     // For packed sequences ncbi2na and ncbi4na, Append will shift and
  150.     // append so as to remove any jaggedness at the append point.
  151.     static TSeqPos Append(CSeq_data*         out_seq,
  152.                           const CSeq_data&   in_seq1,
  153.                           TSeqPos            uBeginIdx1,
  154.                           TSeqPos            uLength1,
  155.                           const CSeq_data&   in_seq2,
  156.                           TSeqPos            uBeginIdx2,
  157.                           TSeqPos            uLength2);
  158.     // Create a biological complement of an na sequence.
  159.     // Attempts to complement an aa sequence will throw
  160.     // a runtime_error. Returns length of complemented sequence.
  161.     // Complement the input sequence in place
  162.     static TSeqPos Complement(CSeq_data*   in_seq,
  163.                               TSeqPos      uBeginIdx = 0,
  164.                               TSeqPos      uLength   = 0);
  165.     // Complement the input sequence and put the result in
  166.     // the output sequence
  167.     static TSeqPos Complement(const CSeq_data&   in_seq,
  168.                               CSeq_data*         out_seq,
  169.                               TSeqPos            uBeginIdx = 0,
  170.                               TSeqPos            uLength   = 0);
  171.     // Create a biological sequence that is the reversse
  172.     // of an input sequence. Attempts to reverse an aa
  173.     // sequence will throw a runtime_error. Returns length of
  174.     // reversed sequence.
  175.     // Reverse a sequence in place
  176.     static TSeqPos Reverse(CSeq_data*   in_seq,
  177.                            TSeqPos      uBeginIdx = 0,
  178.                            TSeqPos      uLength   = 0);
  179.     // Reverse an input sequence and put result in output sequence.
  180.     // Reverses packed bytes as necessary.
  181.     static TSeqPos Reverse(const CSeq_data&   in_seq,
  182.                            CSeq_data*         out_seq,
  183.                            TSeqPos            uBeginIdx = 0,
  184.                            TSeqPos            uLength   = 0);
  185.     // Create the reverse complement of an input sequence. Attempts
  186.     // to reverse-complement an aa sequence will throw a
  187.     // runtime_error.
  188.     // Reverse complement a sequence in place
  189.     static TSeqPos ReverseComplement(CSeq_data*   in_seq,
  190.                                      TSeqPos      uBeginIdx = 0,
  191.                                      TSeqPos      uLength   = 0);
  192.     // Reverse complmenet a sequence and put result in output sequence
  193.     static TSeqPos ReverseComplement(const CSeq_data&   in_seq,
  194.                                      CSeq_data*         out_seq,
  195.                                      TSeqPos            uBeginIdx = 0,
  196.                                      TSeqPos            uLength   = 0);
  197.                                           
  198.     // Given an Ncbistdaa input code index, returns the 3 letter Iupacaa3 code
  199.     // Implementation is efficient
  200.     static const string& GetIupacaa3(TIndex ncbistdaa);
  201.     
  202.     // Given a code type expressible as enum CSeq_data::E_Choice, returns
  203.     // true if the code type is available. See Seq_data_.hpp for definition 
  204.     // of enum CSeq_data::E_Choice.
  205.     static bool IsCodeAvailable(CSeq_data::E_Choice code_type);
  206.     
  207.     // Same as above, but for code types expressible as enum ESeq_code_type.
  208.     // See Seq_code_type_.hpp for definition of enum ESeq_code_type.
  209.     static bool IsCodeAvailable(ESeq_code_type code_type);
  210.     
  211.     // Gets the first and last indices of a code type (e.g., for iupacna,
  212.     // the first index is 65 and the last index is 89). Throws CBadType
  213.     // if code_type is not available
  214.     static TPair GetCodeIndexFromTo(CSeq_data::E_Choice code_type);
  215.     
  216.     // Same as above but takes code type expressed as an ESeq_code_type
  217.     static TPair GetCodeIndexFromTo(ESeq_code_type code_type);
  218.         
  219.     // Given an index for any code type expressible as a
  220.     // CSeq_data::E_Choice, returns the corresponding symbol (code)
  221.     // (e.g., for iupacna, idx 65 causes "A" to be returned)
  222.     // if the code type is available (e.g., ncbi8aa is not currently
  223.     // available). Use IsCodeAvailable() to find out which code types
  224.     // are available. Throws CBadType if code_type not available. Throws
  225.     // CBadIndex if idx out of range for code_type.                    
  226.     static const string& GetCode(CSeq_data::E_Choice code_type, 
  227.                                  TIndex              idx); 
  228.     // Similar to above, but works for all code types expressible as
  229.     // a ESeq_code_type (i.e., iupacaa3 is expressible as an
  230.     // ESeq_code_type but not as a CSeq_data::E_Choice)
  231.     static const string& GetCode(ESeq_code_type code_type, 
  232.                                  TIndex         idx); 
  233.                         
  234.     // Given an index for any code type expressible as a
  235.     // CSeq_data::E_Choice, returns the corresponding name
  236.     // (e.g., for iupacna, idx 65 causes "Adenine" to be returned)
  237.     // if the code type is available (e.g., ncbi8aa is not currently
  238.     // available). Use IsCodeAvailable() to find out which code types
  239.     // are available. Throws CBadType if code_type not available. Throws
  240.     // CBadIndex if idx out of range for code_type.                  
  241.     static const string& GetName(CSeq_data::E_Choice code_type, 
  242.                                  TIndex              idx); 
  243.     // Similar to above, but works for all code types expressible as
  244.     // a ESeq_code_type (i.e., iupacaa3 is expressible as an
  245.     // ESeq_code_type but not as a CSeq_data::E_Choice)
  246.     static const string& GetName(ESeq_code_type code_type, 
  247.                                  TIndex         idx); 
  248.     // Given a code (symbol) for any code type expressible as a
  249.     // CSeq_data::E_Choice, returns the corresponding index
  250.     // (e.g., for iupacna, symbol "A" causes 65 to be returned)
  251.     // if the code type is available (e.g., ncbi8aa is not currently
  252.     // available). Use IsCodeAvailable() to find out which code types
  253.     // are available.Throws CBadType if code_type not available. Throws
  254.     // CBadSymbol if code is not a valid symbol for code_type.                     
  255.     static TIndex GetIndex(CSeq_data::E_Choice code_type, const string& code);
  256.     
  257.     // Similar to above, but works for all code types expressible as
  258.     // a ESeq_code_type (i.e., iupacaa3 is expressible as an
  259.     // ESeq_code_type but not as a CSeq_data::E_Choice)
  260.     static TIndex GetIndex(ESeq_code_type code_type, const string& code);
  261.     
  262.     // Get the index that is the complement of the index for the
  263.     // input CSeq_data::E_Choice code type (e.g., for iupacna, the
  264.     // complement of index 66 is 86). Throws CBadType if complements for 
  265.     // code_type not available. Throws CBadIndex if idx out of range for 
  266.     // code_type    
  267.     static TIndex GetIndexComplement(CSeq_data::E_Choice code_type,
  268.                                      TIndex              idx);
  269.     // Same as above, but for code type expressible as ESeq_code_type.                                  
  270.     static TIndex GetIndexComplement(ESeq_code_type code_type,
  271.                                      TIndex         idx);
  272.     
  273.     // Takes an index for a from_type code and returns the index for to_type
  274.     // (e.g., GetMapToIndex(CSeq_data::e_Iupacna, CSeq_data::e_Ncbi2na,
  275.     // 68) returns 2). Returns 255 if no map value exists for a legal
  276.     // index (e.g., GetMapToIndex(CSeq_data::e_Iupacna, CSeq_data::e_Ncbi2na,
  277.     // 69) returns 255). Throws CBadType if map for from_type to to_type not
  278.     // available. Throws CBadIndex if from_idx out of range for from_type.
  279.     static TIndex GetMapToIndex(CSeq_data::E_Choice from_type,
  280.                              CSeq_data::E_Choice    to_type,
  281.                              TIndex                 from_idx);
  282.     
  283.     // Same as above, but uses ESeq_code_type.                        
  284.     static TIndex GetMapToIndex(ESeq_code_type from_type,
  285.                                 ESeq_code_type to_type,
  286.                                 TIndex         from_idx);
  287. private:
  288.     
  289.     // we maintain a singleton internally
  290.     // these variables and functions control access to the singleton
  291.     static auto_ptr<CSeqportUtil_implementation> sm_Implementation;
  292.     static void                         x_InitImplementation(void);
  293.     static CSeqportUtil_implementation& x_GetImplementation (void);
  294. };
  295. inline
  296. CSeqportUtil_implementation& CSeqportUtil::x_GetImplementation(void)
  297. {
  298.     if ( !sm_Implementation.get() ) {
  299.         x_InitImplementation();
  300.     }
  301.     return *sm_Implementation;
  302. }
  303. END_objects_SCOPE
  304. END_NCBI_SCOPE
  305. #endif  /* OBJECTS_SEQ___SEQPORT_UTIL__HPP */
  306.  /*
  307.  * ---------------------------------------------------------------------------
  308.  * $Log: seqport_util.hpp,v $
  309.  * Revision 1000.2  2003/11/21 18:20:24  gouriano
  310.  * PRODUCTION: UPGRADED [ORIGINAL] Dev-tree R1.10
  311.  *
  312.  * Revision 1.10  2003/11/21 14:44:59  grichenk
  313.  * Replaced runtime_error with CException
  314.  *
  315.  * Revision 1.9  2003/11/06 16:10:56  shomrat
  316.  * changed signature of Pack method
  317.  *
  318.  * Revision 1.8  2002/12/26 12:42:59  dicuccio
  319.  * Added Win32 export specifiers
  320.  *
  321.  * Revision 1.7  2002/09/13 20:43:01  ucko
  322.  * +#include <memory> (for auto_ptr<>)
  323.  *
  324.  * Revision 1.6  2002/09/13 18:35:33  dicuccio
  325.  * Fixed problem with static object initialization and type information.
  326.  * First pass at reformatting code.
  327.  *
  328.  * Revision 1.5  2002/05/14 15:12:06  clausen
  329.  * Added IsCodeAvailable, GetCodeIndexFromTo, GetName, GetIndexComplement, GetMapToIndex
  330.  *
  331.  * Revision 1.4  2002/05/03 21:28:03  ucko
  332.  * Introduce T(Signed)SeqPos.
  333.  *
  334.  * Revision 1.3  2002/01/10 19:20:45  clausen
  335.  * Added GetIupacaa3, GetCode, and GetIndex
  336.  *
  337.  * Revision 1.2  2001/09/07 14:16:49  ucko
  338.  * Cleaned up external interface.
  339.  *
  340.  * Revision 1.1  2001/08/24 00:34:22  vakatov
  341.  * Initial revision
  342.  *
  343.  * ===========================================================================
  344.  */