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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: rebase.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 20:55:41  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: rebase.cpp,v 1000.1 2004/06/01 20:55:41 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:  Code to deal with REBASE restriction enzyme database
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <corelib/ncbistd.hpp>
  41. #include <algo/sequence/restriction.hpp>
  42. #include "rebase.hpp"
  43. BEGIN_NCBI_SCOPE
  44. CRSpec CRebase::MakeRSpec(const string& site)
  45. {
  46.     // site contains a string such as
  47.     // GACGTC, GACGT^C, GCAGC(8/12), or (8/13)GAGNNNNNCTC(13/8)
  48.     
  49.     CRSpec spec;
  50.     int plus_cut, minus_cut;
  51.     string s = site;
  52.     if (s[0] == '(') {
  53.         string::size_type idx = s.find_first_of(")");
  54.         if (idx == std::string::npos) {
  55.             throw runtime_error(string("Error parsing site ")
  56.                                 + site);
  57.         }
  58.         x_ParseCutPair(s.substr(0, idx + 1), plus_cut, minus_cut);
  59.         s.erase(0, idx + 1);
  60.         spec.SetPlusCuts().push_back(-plus_cut);
  61.         spec.SetMinusCuts().push_back(-minus_cut);
  62.     }
  63.     if (s[s.length() - 1] == ')') {
  64.         string::size_type idx = s.find_last_of("(");
  65.         if (idx == std::string::npos) {
  66.             throw runtime_error(string("Error parsing site ")
  67.                                 + site);
  68.         }
  69.         x_ParseCutPair(s.substr(idx), plus_cut, minus_cut);
  70.         s.erase(idx);
  71.         spec.SetPlusCuts().push_back(plus_cut + s.length());
  72.         spec.SetMinusCuts().push_back(minus_cut + s.length());
  73.     }
  74.     for (unsigned int i = 0;  i < s.length();  i++) {
  75.         if (s[i] == '^') {
  76.             // This should be simple.  If we have
  77.             // G^GATCC, the cut on the plus strand is
  78.             // at 1, and on the minus it's at the
  79.             // symmetric position, 5.
  80.             // The complication is that TspRI
  81.             // is given as CASTGNN^, not NNCASTGNN^.
  82.             // Someone someday might write NNCASTGNN^,
  83.             // and something like ^NNGATC might arise,
  84.             // so code defensively.
  85.             
  86.             s.erase(i, 1);
  87.             int plus_cut = i;
  88.             // this is the slightly complicated bit
  89.             // trim any leading and trailing N's;
  90.             // in case leading N's removed, adjust plus_cut accordingly
  91.             string::size_type idx = s.find_first_not_of("N");
  92.             if (idx == string::npos) {
  93.                 // bizarre situation; all N's (possibly empty)
  94.                 s.erase();
  95.                 plus_cut = 0;
  96.             } else {
  97.                 s.erase(0, idx);
  98.                 plus_cut -= idx;
  99.             }
  100.             idx = s.find_last_not_of("N");
  101.             s.erase(idx + 1);
  102.             // plus strand cut
  103.             spec.SetPlusCuts().push_back(plus_cut);
  104.             // symmetric cut on minus strand
  105.             spec.SetMinusCuts().push_back(s.length() - plus_cut);
  106.             break;  // there better be just one '^'
  107.         }
  108.     }
  109.     spec.SetSeq(s);
  110.     return spec;
  111. }
  112. CREnzyme CRebase::MakeREnzyme(const string& name, const string& sites)
  113. {
  114.     CREnzyme re;
  115.     re.SetName(name);
  116.     
  117.     vector<string> site_vec;
  118.     NStr::Tokenize(sites, ",", site_vec);
  119.     ITERATE (vector<string>, iter, site_vec) {
  120.         CRSpec spec = CRebase::MakeRSpec(*iter);
  121.         re.SetSpecs().push_back(spec);
  122.     }
  123.     
  124.     return re;
  125. }
  126. void CRebase::x_ParseCutPair(const string& s, int& plus_cut, int& minus_cut)
  127. {
  128.     // s should look like "(8/13)"; plus_cut gets set to 8 and minus_cut to 13
  129.     list<string> l;
  130.     NStr::Split(s.substr(1, s.length() - 2), "/", l);
  131.     if (l.size() != 2) {
  132.         throw runtime_error(string("Couldn't parse cut locations ")
  133.                             + s);
  134.     }
  135.     plus_cut = NStr::StringToInt(l.front());
  136.     minus_cut = NStr::StringToInt(l.back());
  137. }
  138. void CRebase::ReadNARFormat(istream& input,
  139.                             vector<CREnzyme>& enzymes,
  140.                             enum EEnzymesToLoad which)
  141. {
  142.     string line;
  143.     CREnzyme enzyme;
  144.     string name;
  145.     while (getline(input, line)) {
  146.         vector<string> fields;
  147.         NStr::Tokenize(line, "t", fields);
  148.         // the lines we're interested in have more than one field
  149.         if (fields.size() < 2) {
  150.             continue;
  151.         }
  152.         // name of enzyme is in field one or two (field zero is empty)
  153.         name = fields[1];
  154.         if (name == " ") {
  155.             if (which == ePrototype) {
  156.                 continue;  // skip this non-protype
  157.             }
  158.             name = fields[2];
  159.         }
  160.         if (which == eCommercial && fields[5].empty()) {
  161.             continue;  // skip this commercially unavailable enzyme
  162.         }
  163.         string sites = fields[3];  // this contains a comma-separted list of sites,
  164.                             // usually just one (but TaqII has two)
  165.         enzyme = MakeREnzyme(name, sites);
  166.         enzymes.push_back(enzyme);
  167.     }
  168. }
  169. END_NCBI_SCOPE
  170. /*
  171.  * ===========================================================================
  172.  * $Log: rebase.cpp,v $
  173.  * Revision 1000.1  2004/06/01 20:55:41  gouriano
  174.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  175.  *
  176.  * Revision 1.3  2004/05/21 22:27:47  gorelenk
  177.  * Added PCH ncbi_pch.hpp
  178.  *
  179.  * Revision 1.2  2003/08/21 19:24:16  jcherry
  180.  * Moved restriction site finding to algo/sequence
  181.  *
  182.  * Revision 1.1  2003/08/12 18:52:58  jcherry
  183.  * Initial version
  184.  *
  185.  * ===========================================================================
  186.  */