source: trunk/yat/omic/Codon.cc @ 2470

Last change on this file since 2470 was 2470, checked in by Peter, 11 years ago

merge patch release 0.7.2 into trunk

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 3.9 KB
Line 
1// $Id: Codon.cc 2470 2011-04-12 03:21:45Z peter $
2
3/*
4  Copyright (C) 2010, 2011 Peter Johansson
5
6  This file is part of the yat library, http://dev.thep.lu.se/yat
7
8  The yat library is free software; you can redistribute it and/or
9  modify it under the terms of the GNU General Public License as
10  published by the Free Software Foundation; either version 3 of the
11  License, or (at your option) any later version.
12
13  The yat library is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  General Public License for more details.
17
18  You should have received a copy of the GNU General Public License
19  along with yat. If not, see <http://www.gnu.org/licenses/>.
20*/
21
22#include "Codon.h"
23
24#include "yat/utility/split.h"
25
26#include <cassert>
27#include <sstream>
28#include <stdexcept>
29
30namespace theplu {
31namespace yat {
32namespace omic {
33
34  Codon::Map_ Codon::map_;
35
36  Codon::Codon(void) 
37  {
38    create_map();
39    iter_ = map_.end();
40  }
41
42
43  Codon::Codon(const std::string& str)
44  {
45    assert(str.size()==3);
46    std::vector<DNA> vec;
47    vec.reserve(str.size());
48    try {
49      for (size_t i(0), size(str.size()); i<size; ++i)
50        vec.push_back(DNA(str[i]));
51      init(vec);
52    }
53    catch (std::invalid_argument& e) {
54      std::stringstream ss;
55      ss << e.what() << "\n"
56         << "Codon::Codon(1) invalid argument: " << str;
57      throw std::invalid_argument(ss.str());
58    }
59  }
60
61
62  Codon::Codon(const DNA& first, const DNA& second, const DNA& third)
63  {
64    std::vector<DNA> vec;
65    vec.reserve(3);
66    vec.push_back(first);
67    vec.push_back(second);
68    vec.push_back(third);
69    try {
70      init(vec);
71    }
72    catch (std::invalid_argument& e) {
73      std::stringstream ss;
74      ss << e.what() << "\n"
75         << "invalid argument Codon::Codon" 
76         << "(" << vec[0] << ", " << vec[1] << ", " << vec[2] << ")";
77      throw std::invalid_argument(ss.str());
78    }
79  }
80
81
82  void Codon::add_to_map(char aa, const std::string& codons) 
83  {
84    // FIXME: change this file to take one codon instead and remove
85    // the need for a split.
86    std::vector<std::string> vec;
87    utility::split(vec, codons, ',');
88    for (size_t i=0; i<vec.size(); ++i) {
89      assert(vec[i].size()==3);
90      std::vector<DNA> codon;
91      codon.reserve(3);
92      for (size_t j=0; j<3; ++j)
93        codon.push_back(DNA(vec[i][j]));
94      map_[codon] = aa;
95    }
96  }
97
98 
99  char Codon::amino_acid(void) const
100  {
101    assert(iter_!=map_.end());
102    return iter_->second;
103  }
104
105
106  void Codon::init(const std::vector<DNA>& vec)
107  {
108    assert(vec.size()==3);
109    create_map();
110    iter_ = map_.find(vec);
111    if (iter_==map_.end())
112      throw std::invalid_argument("Codon: invalid codon:");
113  }
114
115
116  void Codon::create_map(void)
117  {
118    if (!map_.empty())
119      return;
120    add_to_map('A', "GCT,GCC,GCA,GCG");
121    add_to_map('L', "TTA,TTG,CTT,CTC,CTA,CTG");
122    add_to_map('R', "CGT,CGC,CGA,CGG,AGA,AGG");
123    add_to_map('K', "AAA,AAG");
124    add_to_map('N', "AAT,AAC");
125    add_to_map('M', "ATG");
126    add_to_map('D', "GAT,GAC");   
127    add_to_map('F', "TTT,TTC");
128    add_to_map('C', "TGT,TGC");
129    add_to_map('P', "CCT,CCC,CCA,CCG");
130    add_to_map('Q', "CAA,CAG");
131    add_to_map('S', "TCT,TCC,TCA,TCG,AGT,AGC");
132    add_to_map('E', "GAA,GAG");
133    add_to_map('T', "ACT,ACC,ACA,ACG");
134    add_to_map('G', "GGT,GGC,GGA,GGG");
135    add_to_map('W', "TGG");
136    add_to_map('H', "CAT,CAC");
137    add_to_map('Y', "TAT,TAC");
138    add_to_map('I', "ATT,ATC,ATA");
139    add_to_map('V', "GTT,GTC,GTA,GTG");
140    add_to_map('*',"TAA,TGA,TAG"); //  stop
141  }
142
143
144  bool Codon::start(void) const
145  {
146    return iter_->second=='M';
147  }
148
149
150  bool Codon::stop(void) const
151  {
152    return iter_->second=='*';
153  }
154
155
156  const DNA& Codon::operator()(size_t i) const
157  {
158    assert(i < iter_->first.size());
159    return iter_->first[i];
160  }
161
162  bool Codon::Compare_::operator()(const std::vector<DNA>& lhs, 
163                                   const std::vector<DNA>& rhs) const
164  {
165    assert(lhs.size()==3);
166    assert(rhs.size()==3);
167    for (size_t i=0; i<3; ++i)
168      if (lhs[i].get()!=rhs[i].get())
169        return lhs[i].get() < rhs[i].get();
170    return false;
171  }
172
173}}}
174
Note: See TracBrowser for help on using the repository browser.