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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: find_pattern.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 18:10:31  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: find_pattern.cpp,v 1000.1 2004/06/01 18:10:31 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:  Josh Cherry
  35.  *
  36.  * File Description:  Find occurrences of a regular expression in a sequence
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <algo/sequence/find_pattern.hpp>
  41. #include <util/regexp.hpp>
  42. BEGIN_NCBI_SCOPE
  43. // Find all occurrences of a pattern (regular expression) in a sequence.
  44. void CFindPattern::Find(const string& seq, const string& pattern,
  45.                        vector<TSeqPos>& starts, vector<TSeqPos>& ends) {
  46.     // do a case-insensitive r.e. search for "all" (non-overlapping) occurrences
  47.     // note that it's somewhat ambiguous what this means
  48.     // want to ignore case, and to allow white space (and comments) in pattern
  49.     CRegexp re(pattern, PCRE_CASELESS | PCRE_EXTENDED);
  50.     starts.clear();
  51.     ends.clear();
  52.     unsigned int offset = 0;
  53.     while (!re.GetMatch(seq, offset).empty()) {  
  54.         // (empty string means no match)
  55.         const int *res = re.GetResults(0);
  56.         starts.push_back(res[0]);
  57.         ends.push_back(res[1] - 1);
  58.         offset = res[1];
  59.     }
  60. }
  61. /// Find cases of at least min_repeats consecutive occurrences of any
  62. /// *particular* match to pattern.
  63. /// N.B.: pattern = "[ag]c" and min_repeats = 2 will match
  64. /// "acac" and "gcgc" but NOT "acgc" or "gcac".
  65. void CFindPattern::FindRepeatsOf(const string& seq, const string& pattern,
  66.                                  int min_repeats,
  67.                                  vector<TSeqPos>& starts,
  68.                                  vector<TSeqPos>& ends)
  69. {
  70.     string total_pattern;
  71.     total_pattern = "(" + pattern + ")\1{"
  72.         + NStr::IntToString(min_repeats - 1) + ",}";
  73.     Find(seq, total_pattern, starts, ends);
  74. }
  75. /// Find all cases of at least min_repeats consecutive occurrences
  76. /// of any n-mer consisting of unambiguous nucleotides ({a, g, c, t}).
  77. /// Note that, e.g., dinucelotide repeats can also qualify as
  78. /// tetranucleotide repeats.
  79. void CFindPattern::FindNucNmerRepeats(const string& seq,
  80.                                       int n, int min_repeats,
  81.                                       vector<TSeqPos>& starts,
  82.                                       vector<TSeqPos>& ends)
  83. {
  84.     string pattern;
  85.     for (int i = 0;  i < n;  ++i) {
  86.         pattern += "[agct]";
  87.     }
  88.     FindRepeatsOf(seq, pattern, min_repeats, starts, ends);
  89. }
  90. END_NCBI_SCOPE
  91. /*
  92.  * ===========================================================================
  93.  * $Log: find_pattern.cpp,v $
  94.  * Revision 1000.1  2004/06/01 18:10:31  gouriano
  95.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  96.  *
  97.  * Revision 1.10  2004/05/21 21:41:04  gorelenk
  98.  * Added PCH ncbi_pch.hpp
  99.  *
  100.  * Revision 1.9  2004/04/01 14:14:02  lavr
  101.  * Spell "occurred", "occurrence", and "occurring"
  102.  *
  103.  * Revision 1.8  2003/12/16 18:02:22  jcherry
  104.  * Moved find_pattern to algo/sequence
  105.  *
  106.  * Revision 1.7  2003/12/15 21:20:02  jcherry
  107.  * Added simple repeat searches
  108.  *
  109.  * Revision 1.6  2003/12/15 20:16:09  jcherry
  110.  * Changed CFindPattern::Find to take a string rather than a CSeqVector
  111.  *
  112.  * Revision 1.5  2003/12/15 19:51:07  jcherry
  113.  * CRegexp::GetMatch now takes a string&, not a char*
  114.  *
  115.  * Revision 1.4  2003/07/08 22:08:00  jcherry
  116.  * Clear 'starts' and 'ends' before using them!
  117.  *
  118.  * Revision 1.3  2003/07/03 19:14:12  jcherry
  119.  * Initial version
  120.  *
  121.  * ===========================================================================
  122.  */