yat/omic/Codon.cc

Code
Comments
Other
Rev Date Author Line
2368 11 Dec 10 peter 1 // $Id$
2368 11 Dec 10 peter 2
2368 11 Dec 10 peter 3 /*
4089 07 Sep 21 peter 4   Copyright (C) 2010, 2011, 2012, 2014, 2016, 2021 Peter Johansson
2368 11 Dec 10 peter 5
2368 11 Dec 10 peter 6   This file is part of the yat library, http://dev.thep.lu.se/yat
2368 11 Dec 10 peter 7
2368 11 Dec 10 peter 8   The yat library is free software; you can redistribute it and/or
2368 11 Dec 10 peter 9   modify it under the terms of the GNU General Public License as
2368 11 Dec 10 peter 10   published by the Free Software Foundation; either version 3 of the
2368 11 Dec 10 peter 11   License, or (at your option) any later version.
2368 11 Dec 10 peter 12
2368 11 Dec 10 peter 13   The yat library is distributed in the hope that it will be useful,
2368 11 Dec 10 peter 14   but WITHOUT ANY WARRANTY; without even the implied warranty of
2368 11 Dec 10 peter 15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
2368 11 Dec 10 peter 16   General Public License for more details.
2368 11 Dec 10 peter 17
2368 11 Dec 10 peter 18   You should have received a copy of the GNU General Public License
2368 11 Dec 10 peter 19   along with yat. If not, see <http://www.gnu.org/licenses/>.
2368 11 Dec 10 peter 20 */
2368 11 Dec 10 peter 21
2881 18 Nov 12 peter 22 #include <config.h>
2881 18 Nov 12 peter 23
2368 11 Dec 10 peter 24 #include "Codon.h"
2368 11 Dec 10 peter 25
2368 11 Dec 10 peter 26 #include <cassert>
2369 11 Dec 10 peter 27 #include <sstream>
2368 11 Dec 10 peter 28 #include <stdexcept>
2368 11 Dec 10 peter 29
2368 11 Dec 10 peter 30 namespace theplu {
2368 11 Dec 10 peter 31 namespace yat {
2368 11 Dec 10 peter 32 namespace omic {
2368 11 Dec 10 peter 33
2368 11 Dec 10 peter 34   Codon::Map_ Codon::map_;
2368 11 Dec 10 peter 35
2900 13 Dec 12 peter 36   Codon::Codon(void)
2368 11 Dec 10 peter 37   {
2368 11 Dec 10 peter 38     create_map();
2369 11 Dec 10 peter 39     iter_ = map_.end();
2368 11 Dec 10 peter 40   }
2368 11 Dec 10 peter 41
2368 11 Dec 10 peter 42
2368 11 Dec 10 peter 43   Codon::Codon(const std::string& str)
2368 11 Dec 10 peter 44   {
2368 11 Dec 10 peter 45     assert(str.size()==3);
2368 11 Dec 10 peter 46     std::vector<DNA> vec;
2368 11 Dec 10 peter 47     vec.reserve(str.size());
2369 11 Dec 10 peter 48     try {
2369 11 Dec 10 peter 49       for (size_t i(0), size(str.size()); i<size; ++i)
2369 11 Dec 10 peter 50         vec.push_back(DNA(str[i]));
2369 11 Dec 10 peter 51       init(vec);
2369 11 Dec 10 peter 52     }
2369 11 Dec 10 peter 53     catch (std::invalid_argument& e) {
2369 11 Dec 10 peter 54       std::stringstream ss;
2369 11 Dec 10 peter 55       ss << e.what() << "\n"
2369 11 Dec 10 peter 56          << "Codon::Codon(1) invalid argument: " << str;
4060 10 May 21 peter 57       std::throw_with_nested(std::invalid_argument(ss.str()));
2369 11 Dec 10 peter 58     }
2368 11 Dec 10 peter 59   }
2368 11 Dec 10 peter 60
2368 11 Dec 10 peter 61
2368 11 Dec 10 peter 62   Codon::Codon(const DNA& first, const DNA& second, const DNA& third)
2368 11 Dec 10 peter 63   {
2368 11 Dec 10 peter 64     std::vector<DNA> vec;
2368 11 Dec 10 peter 65     vec.reserve(3);
2368 11 Dec 10 peter 66     vec.push_back(first);
2368 11 Dec 10 peter 67     vec.push_back(second);
2368 11 Dec 10 peter 68     vec.push_back(third);
2369 11 Dec 10 peter 69     try {
2369 11 Dec 10 peter 70       init(vec);
2369 11 Dec 10 peter 71     }
2369 11 Dec 10 peter 72     catch (std::invalid_argument& e) {
2369 11 Dec 10 peter 73       std::stringstream ss;
2369 11 Dec 10 peter 74       ss << e.what() << "\n"
2900 13 Dec 12 peter 75          << "invalid argument Codon::Codon"
2369 11 Dec 10 peter 76          << "(" << vec[0] << ", " << vec[1] << ", " << vec[2] << ")";
2369 11 Dec 10 peter 77       throw std::invalid_argument(ss.str());
2369 11 Dec 10 peter 78     }
2368 11 Dec 10 peter 79   }
2368 11 Dec 10 peter 80
2368 11 Dec 10 peter 81
3252 04 Jun 14 peter 82   void Codon::add_to_map(char aa, const std::string& codon)
2368 11 Dec 10 peter 83   {
3252 04 Jun 14 peter 84     assert(codon.size()==3);
3252 04 Jun 14 peter 85     std::pair<std::vector<DNA>, char> val;
3252 04 Jun 14 peter 86     val.second = aa;
3252 04 Jun 14 peter 87     val.first.reserve(3);
3252 04 Jun 14 peter 88     for (size_t i=0; i<3; ++i)
3252 04 Jun 14 peter 89       val.first.push_back(DNA(codon[i]));
3252 04 Jun 14 peter 90     map_.insert(map_.end(), val);
2368 11 Dec 10 peter 91   }
2368 11 Dec 10 peter 92
2900 13 Dec 12 peter 93
2369 11 Dec 10 peter 94   char Codon::amino_acid(void) const
2369 11 Dec 10 peter 95   {
2369 11 Dec 10 peter 96     assert(iter_!=map_.end());
2369 11 Dec 10 peter 97     return iter_->second;
2369 11 Dec 10 peter 98   }
2368 11 Dec 10 peter 99
2369 11 Dec 10 peter 100
3487 24 Mar 16 peter 101   std::string Codon::amino_acid_long(void) const
3487 24 Mar 16 peter 102   {
3487 24 Mar 16 peter 103     switch (iter_->second) {
3487 24 Mar 16 peter 104     case('A'): return "Ala";
3487 24 Mar 16 peter 105     case('L'): return "Leu";
3487 24 Mar 16 peter 106     case('R'): return "Arg";
3487 24 Mar 16 peter 107     case('K'): return "Lys";
3487 24 Mar 16 peter 108     case('N'): return "Asn";
3487 24 Mar 16 peter 109     case('M'): return "Met";
3516 26 Jul 16 peter 110     case('D'): return "Asp";
3487 24 Mar 16 peter 111     case('F'): return "Phe";
3487 24 Mar 16 peter 112     case('C'): return "Cys";
3487 24 Mar 16 peter 113     case('P'): return "Pro";
3487 24 Mar 16 peter 114     case('Q'): return "Gln";
3487 24 Mar 16 peter 115     case('S'): return "Ser";
3487 24 Mar 16 peter 116     case('E'): return "Glu";
3487 24 Mar 16 peter 117     case('T'): return "Thr";
3487 24 Mar 16 peter 118     case('G'): return "Gly";
3487 24 Mar 16 peter 119     case('W'): return "Trp";
3487 24 Mar 16 peter 120     case('H'): return "His";
3487 24 Mar 16 peter 121     case('Y'): return "Tyr";
3487 24 Mar 16 peter 122     case('I'): return "Ile";
3487 24 Mar 16 peter 123     case('V'): return "Val";
3487 24 Mar 16 peter 124     case('*'): return "Ter";
3487 24 Mar 16 peter 125     default:
3487 24 Mar 16 peter 126       assert(0);
3487 24 Mar 16 peter 127     }
3487 24 Mar 16 peter 128     return "";
3487 24 Mar 16 peter 129   }
3487 24 Mar 16 peter 130
3487 24 Mar 16 peter 131
2368 11 Dec 10 peter 132   void Codon::init(const std::vector<DNA>& vec)
2368 11 Dec 10 peter 133   {
2369 11 Dec 10 peter 134     assert(vec.size()==3);
2368 11 Dec 10 peter 135     create_map();
2369 11 Dec 10 peter 136     iter_ = map_.find(vec);
2368 11 Dec 10 peter 137     if (iter_==map_.end())
2369 11 Dec 10 peter 138       throw std::invalid_argument("Codon: invalid codon:");
2368 11 Dec 10 peter 139   }
2368 11 Dec 10 peter 140
2368 11 Dec 10 peter 141
2368 11 Dec 10 peter 142   void Codon::create_map(void)
2368 11 Dec 10 peter 143   {
2368 11 Dec 10 peter 144     if (!map_.empty())
2368 11 Dec 10 peter 145       return;
3252 04 Jun 14 peter 146     add_to_map('K', "AAA");
3252 04 Jun 14 peter 147     add_to_map('N', "AAC");
3252 04 Jun 14 peter 148     add_to_map('K', "AAG");
3252 04 Jun 14 peter 149     add_to_map('N', "AAT");
3252 04 Jun 14 peter 150     add_to_map('T', "ACA");
3252 04 Jun 14 peter 151     add_to_map('T', "ACC");
3252 04 Jun 14 peter 152     add_to_map('T', "ACG");
3252 04 Jun 14 peter 153     add_to_map('T', "ACT");
3252 04 Jun 14 peter 154     add_to_map('R', "AGA");
3252 04 Jun 14 peter 155     add_to_map('S', "AGC");
3252 04 Jun 14 peter 156     add_to_map('R', "AGG");
3252 04 Jun 14 peter 157     add_to_map('S', "AGT");
3252 04 Jun 14 peter 158     add_to_map('I', "ATA");
3252 04 Jun 14 peter 159     add_to_map('I', "ATC");
3252 04 Jun 14 peter 160     add_to_map('M', "ATG");
3252 04 Jun 14 peter 161     add_to_map('I', "ATT");
3252 04 Jun 14 peter 162     add_to_map('Q', "CAA");
3252 04 Jun 14 peter 163     add_to_map('H', "CAC");
3252 04 Jun 14 peter 164     add_to_map('Q', "CAG");
3252 04 Jun 14 peter 165     add_to_map('H', "CAT");
3252 04 Jun 14 peter 166     add_to_map('P', "CCA");
3252 04 Jun 14 peter 167     add_to_map('P', "CCC");
3252 04 Jun 14 peter 168     add_to_map('P', "CCG");
3252 04 Jun 14 peter 169     add_to_map('P', "CCT");
3252 04 Jun 14 peter 170     add_to_map('R', "CGA");
3252 04 Jun 14 peter 171     add_to_map('R', "CGC");
3252 04 Jun 14 peter 172     add_to_map('R', "CGG");
3252 04 Jun 14 peter 173     add_to_map('R', "CGT");
3252 04 Jun 14 peter 174     add_to_map('L', "CTA");
3252 04 Jun 14 peter 175     add_to_map('L', "CTC");
3252 04 Jun 14 peter 176     add_to_map('L', "CTG");
3252 04 Jun 14 peter 177     add_to_map('L', "CTT");
3252 04 Jun 14 peter 178     add_to_map('E', "GAA");
3252 04 Jun 14 peter 179     add_to_map('D', "GAC");
3252 04 Jun 14 peter 180     add_to_map('E', "GAG");
3252 04 Jun 14 peter 181     add_to_map('D', "GAT");
3252 04 Jun 14 peter 182     add_to_map('A', "GCA");
3252 04 Jun 14 peter 183     add_to_map('A', "GCC");
3252 04 Jun 14 peter 184     add_to_map('A', "GCG");
3252 04 Jun 14 peter 185     add_to_map('A', "GCT");
3252 04 Jun 14 peter 186     add_to_map('G', "GGA");
3252 04 Jun 14 peter 187     add_to_map('G', "GGC");
3252 04 Jun 14 peter 188     add_to_map('G', "GGG");
3252 04 Jun 14 peter 189     add_to_map('G', "GGT");
3252 04 Jun 14 peter 190     add_to_map('V', "GTA");
3252 04 Jun 14 peter 191     add_to_map('V', "GTC");
3252 04 Jun 14 peter 192     add_to_map('V', "GTG");
3252 04 Jun 14 peter 193     add_to_map('V', "GTT");
3252 04 Jun 14 peter 194     add_to_map('*', "TAA");
3252 04 Jun 14 peter 195     add_to_map('Y', "TAC");
3252 04 Jun 14 peter 196     add_to_map('*', "TAG");
3252 04 Jun 14 peter 197     add_to_map('Y', "TAT");
3252 04 Jun 14 peter 198     add_to_map('S', "TCA");
3252 04 Jun 14 peter 199     add_to_map('S', "TCC");
3252 04 Jun 14 peter 200     add_to_map('S', "TCG");
3252 04 Jun 14 peter 201     add_to_map('S', "TCT");
3252 04 Jun 14 peter 202     add_to_map('*', "TGA");
3252 04 Jun 14 peter 203     add_to_map('C', "TGC");
3252 04 Jun 14 peter 204     add_to_map('W', "TGG");
3252 04 Jun 14 peter 205     add_to_map('C', "TGT");
3252 04 Jun 14 peter 206     add_to_map('L', "TTA");
3252 04 Jun 14 peter 207     add_to_map('F', "TTC");
3252 04 Jun 14 peter 208     add_to_map('L', "TTG");
3252 04 Jun 14 peter 209     add_to_map('F', "TTT");
3252 04 Jun 14 peter 210     assert(map_.size()==64);
2368 11 Dec 10 peter 211   }
2368 11 Dec 10 peter 212
2368 11 Dec 10 peter 213
2368 11 Dec 10 peter 214   bool Codon::start(void) const
2368 11 Dec 10 peter 215   {
2470 12 Apr 11 peter 216     return iter_->second=='M';
2368 11 Dec 10 peter 217   }
2368 11 Dec 10 peter 218
2368 11 Dec 10 peter 219
2368 11 Dec 10 peter 220   bool Codon::stop(void) const
2368 11 Dec 10 peter 221   {
2368 11 Dec 10 peter 222     return iter_->second=='*';
2368 11 Dec 10 peter 223   }
2368 11 Dec 10 peter 224
2368 11 Dec 10 peter 225
2369 11 Dec 10 peter 226   const DNA& Codon::operator()(size_t i) const
2369 11 Dec 10 peter 227   {
2369 11 Dec 10 peter 228     assert(i < iter_->first.size());
2369 11 Dec 10 peter 229     return iter_->first[i];
2369 11 Dec 10 peter 230   }
2369 11 Dec 10 peter 231
3252 04 Jun 14 peter 232
2900 13 Dec 12 peter 233   bool Codon::Compare_::operator()(const std::vector<DNA>& lhs,
2368 11 Dec 10 peter 234                                    const std::vector<DNA>& rhs) const
2368 11 Dec 10 peter 235   {
2368 11 Dec 10 peter 236     assert(lhs.size()==3);
2368 11 Dec 10 peter 237     assert(rhs.size()==3);
2368 11 Dec 10 peter 238     for (size_t i=0; i<3; ++i)
2368 11 Dec 10 peter 239       if (lhs[i].get()!=rhs[i].get())
2368 11 Dec 10 peter 240         return lhs[i].get() < rhs[i].get();
2368 11 Dec 10 peter 241     return false;
2368 11 Dec 10 peter 242   }
2368 11 Dec 10 peter 243
2368 11 Dec 10 peter 244 }}}