/*

Copyright (C) 2003-2009 Kevin Thornton, krthornt[]@[]uci.edu

Remove the brackets to email me.

This file is part of libsequence.

libsequence is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

libsequence is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
long with libsequence.  If not, see <http://www.gnu.org/licenses/>.


Modified by Sarah Scharfenberg and Hajk-Georg Drost 2014 to work 
in orthologr without using external libraries from libsequence.

 All changes are also free under the terms of GNU General Public License
 version 2 of the License, or any later version.

*/

#include <Rcpp.h>
using namespace Rcpp;

class Grantham
{
  private:
      double D[60][60];
  public:
  Grantham (void)
  {
    D['T'-38]['M'-38]=81.03969279;
    D['T'-38]['N'-38]=64.77428784;
    D['T'-38]['P'-38]=37.56362476;
    D['T'-38]['Q'-38]=41.10476252;
    D['T'-38]['R'-38]=70.97102635;
    D['T'-38]['S'-38]=57.74902766;
    D['T'-38]['T'-38]=0.;
    D['T'-38]['V'-38]=69.49621703;
    D['T'-38]['W'-38]=150.752701;
    D['T'-38]['Y'-38]=92.24764162;
    D['E'-38]['*'-38]=999;
    D['E'-38]['A'-38]=106.7125514;
    D['E'-38]['C'-38]=169.4374593;
    D['E'-38]['D'-38]=44.60463645;
    D['E'-38]['E'-38]=0.;
    D['E'-38]['F'-38]=140.2120632;
    D['E'-38]['G'-38]=97.85190048;
    D['E'-38]['H'-38]=40.79415368;
    D['E'-38]['I'-38]=134.1621451;
    D['E'-38]['K'-38]=56.86795522;
    D['E'-38]['L'-38]=138.3430673;
    D['E'-38]['M'-38]=126.0849231;
    D['E'-38]['N'-38]=40.85895231;
    D['E'-38]['P'-38]=93.73085383;
    D['E'-38]['Q'-38]=29.27370624;
    D['E'-38]['R'-38]=54.01884479;
    D['E'-38]['S'-38]=79.78756921;
    D['E'-38]['T'-38]=65.50131254;
    D['E'-38]['V'-38]=121.3285063;
    D['E'-38]['W'-38]=160.4382217;
    D['E'-38]['Y'-38]=122.7768651;
    D['P'-38]['*'-38]=999;
    D['K'-38]['*'-38]=999;
    D['P'-38]['A'-38]=26.87433834;
    D['P'-38]['C'-38]=168.5906208;
    D['P'-38]['D'-38]=107.9096634;
    D['P'-38]['E'-38]=93.73085383;
    D['P'-38]['F'-38]=113.7271541;
    D['P'-38]['G'-38]=41.62910033;
    D['P'-38]['H'-38]=76.27712277;
    D['P'-38]['I'-38]=95.3760884;
    D['F'-38]['*'-38]=999;
    D['P'-38]['K'-38]=102.7139942;
    D['P'-38]['L'-38]=97.77619789;
    D['P'-38]['M'-38]=86.59479895;
    D['P'-38]['N'-38]=90.15739727;
    D['P'-38]['P'-38]=0.;
    D['K'-38]['A'-38]=105.5709011;
    D['P'-38]['Q'-38]=75.1358782;
    D['P'-38]['R'-38]=102.7148709;
    D['K'-38]['C'-38]=201.5793361;
    D['P'-38]['S'-38]=73.35256887;
    D['K'-38]['D'-38]=101.4568985;
    D['P'-38]['T'-38]=37.56362476;
    D['K'-38]['E'-38]=56.86795522;
    D['K'-38]['F'-38]=102.141346;
    D['P'-38]['V'-38]=67.78659846;
    D['K'-38]['G'-38]=126.4579761;
    D['P'-38]['W'-38]=182.7653305;
    D['K'-38]['H'-38]=32.40288701;
    D['K'-38]['I'-38]=101.6123327;
    D['P'-38]['Y'-38]=109.6155723;
    D['A'-38]['*'-38]=999;
    D['K'-38]['K'-38]=0.;
    D['K'-38]['L'-38]=106.3355126;
    D['K'-38]['M'-38]=94.4900972;
    D['K'-38]['N'-38]=93.88268262;
    D['K'-38]['P'-38]=102.7139942;
    D['K'-38]['Q'-38]=53.22834015;
    D['F'-38]['A'-38]=112.5814896;
    D['K'-38]['R'-38]=26.00394626;
    D['K'-38]['S'-38]=120.5325805;
    D['F'-38]['C'-38]=204.3884874;
    D['K'-38]['T'-38]=77.74105567;
    D['F'-38]['D'-38]=176.5261931;
    D['F'-38]['E'-38]=140.2120632;
    D['K'-38]['V'-38]=96.9973994;
    D['F'-38]['F'-38]=0.;
    D['K'-38]['W'-38]=157.923034;
    D['F'-38]['G'-38]=153.125519;
    D['F'-38]['H'-38]=99.99505513;
    D['K'-38]['Y'-38]=84.78644482;
    D['F'-38]['I'-38]=21.27701376;
    D['F'-38]['K'-38]=102.141346;
    D['F'-38]['L'-38]=21.82392074;
    D['F'-38]['M'-38]=28.52784356;
    D['F'-38]['N'-38]=158.1121886;
    D['F'-38]['P'-38]=113.7271541;
    D['A'-38]['A'-38]=0.;
    D['F'-38]['Q'-38]=115.5869365;
    D['F'-38]['R'-38]=97.03272116;
    D['A'-38]['C'-38]=195.0037439;
    D['F'-38]['S'-38]=154.8079023;
    D['A'-38]['D'-38]=125.7485902;
    D['F'-38]['T'-38]=102.8587191;
    D['A'-38]['E'-38]=106.7125514;
    D['A'-38]['F'-38]=112.5814896;
    D['F'-38]['V'-38]=49.93518986;
    D['A'-38]['G'-38]=59.99535652;
    D['F'-38]['W'-38]=142.6771181;
    D['A'-38]['H'-38]=85.49373612;
    D['A'-38]['I'-38]=93.66243338;
    D['V'-38]['*'-38]=999;
    D['F'-38]['Y'-38]=21.60966489;
    D['A'-38]['K'-38]=105.5709011;
    D['A'-38]['L'-38]=96.18707223;
    D['A'-38]['M'-38]=84.43958222;
    D['A'-38]['N'-38]=110.418026;
    D['A'-38]['P'-38]=26.87433834;
    D['A'-38]['Q'-38]=90.76116997;
    D['A'-38]['R'-38]=111.2645916;
    D['A'-38]['S'-38]=99.13249708;
    D['A'-38]['T'-38]=58.0233276;
    D['A'-38]['V'-38]=64.43025059;
    D['A'-38]['W'-38]=201.5127248;
    D['A'-38]['Y'-38]=111.5882137;
    D['Q'-38]['*'-38]=999;
    D['V'-38]['A'-38]=64.43025059;
    D['V'-38]['C'-38]=191.232501;
    D['V'-38]['D'-38]=152.013397;
    D['V'-38]['E'-38]=121.3285063;
    D['V'-38]['F'-38]=49.93518986;
    D['V'-38]['G'-38]=108.7873884;
    D['V'-38]['H'-38]=83.892947;
    D['V'-38]['I'-38]=29.60907063;
    D['L'-38]['*'-38]=999;
    D['V'-38]['K'-38]=96.9973994;
    D['V'-38]['L'-38]=31.78478998;
    D['V'-38]['M'-38]=21.52179938;
    D['V'-38]['N'-38]=132.8777227;
    D['V'-38]['P'-38]=67.78659846;
    D['V'-38]['Q'-38]=96.32571878;
    D['Q'-38]['A'-38]=90.76116997;
    D['V'-38]['R'-38]=95.79707649;
    D['V'-38]['S'-38]=123.0339581;
    D['Q'-38]['C'-38]=154.2308431;
    D['V'-38]['T'-38]=69.49621703;
    D['Q'-38]['D'-38]=61.28447445;
    D['Q'-38]['E'-38]=29.27370624;
    D['V'-38]['V'-38]=0.;
    D['V'-38]['W'-38]=162.8552264;
    D['Q'-38]['F'-38]=115.5869365;
    D['Q'-38]['G'-38]=87.1663871;
    D['V'-38]['Y'-38]=54.66278181;
    D['Q'-38]['H'-38]=24.08398867;
    D['Q'-38]['I'-38]=108.566243;
    D['G'-38]['*'-38]=999;
    D['Q'-38]['K'-38]=53.22834015;
    D['Q'-38]['L'-38]=112.4414772;
    D['Q'-38]['M'-38]=100.8991435;
    D['Q'-38]['N'-38]=45.75219661;
    D['Q'-38]['P'-38]=75.1358782;
    D['Q'-38]['Q'-38]=0.;
    D['L'-38]['A'-38]=96.18707223;
    D['Q'-38]['R'-38]=42.81393193;
    D['Q'-38]['S'-38]=68.19787424;
    D['L'-38]['C'-38]=197.4289714;
    D['Q'-38]['T'-38]=41.10476252;
    D['L'-38]['D'-38]=171.7572022;
    D['L'-38]['E'-38]=138.3430673;
    D['Q'-38]['V'-38]=96.32571878;
    D['L'-38]['F'-38]=21.82392074;
    D['Q'-38]['W'-38]=141.5619982;
    D['L'-38]['G'-38]=137.6916434;
    D['L'-38]['H'-38]=98.69301471;
    D['Q'-38]['Y'-38]=98.78325151;
    D['L'-38]['I'-38]=4.855121198;
    D['L'-38]['K'-38]=106.3355126;
    D['L'-38]['L'-38]=0.;
    D['L'-38]['M'-38]=14.30316651;
    D['L'-38]['N'-38]=152.3309797;
    D['L'-38]['P'-38]=97.77619789;
    D['G'-38]['A'-38]=59.99535652;
    D['L'-38]['Q'-38]=112.4414772;
    D['L'-38]['R'-38]=101.8802928;
    D['G'-38]['C'-38]=158.2317729;
    D['L'-38]['S'-38]=144.0792346;
    D['G'-38]['D'-38]=93.76755083;
    D['L'-38]['T'-38]=92.35427468;
    D['G'-38]['E'-38]=97.85190048;
    D['G'-38]['F'-38]=153.125519;
    D['L'-38]['V'-38]=31.78478998;
    D['G'-38]['G'-38]=0.;
    D['L'-38]['W'-38]=150.0095229;
    D['G'-38]['H'-38]=97.53340215;
    D['G'-38]['I'-38]=135.4188097;
    D['L'-38]['Y'-38]=35.6773121;
    D['G'-38]['K'-38]=126.4579761;
    D['G'-38]['L'-38]=137.6916434;
    D['G'-38]['M'-38]=126.9448727;
    D['G'-38]['N'-38]=79.34585612;
    D['G'-38]['P'-38]=41.62910033;
    D['G'-38]['Q'-38]=87.1663871;
    D['G'-38]['R'-38]=125.1291926;
    D['G'-38]['S'-38]=55.26736276;
    D['G'-38]['T'-38]=59.15645198;
    D['G'-38]['V'-38]=108.7873884;
    D['G'-38]['W'-38]=198.7740455;
    D['G'-38]['Y'-38]=146.9262927;
    D['W'-38]['*'-38]=999;
    D['R'-38]['*'-38]=999;
    D['W'-38]['A'-38]=201.5127248;
    D['W'-38]['C'-38]=127.4031665;
    D['W'-38]['D'-38]=175.3689846;
    D['W'-38]['E'-38]=160.4382217;
    D['W'-38]['F'-38]=142.6771181;
    D['W'-38]['G'-38]=198.7740455;
    D['W'-38]['H'-38]=147.2364297;
    D['W'-38]['I'-38]=149.826083;
    D['W'-38]['K'-38]=157.923034;
    D['M'-38]['*'-38]=999;
    D['W'-38]['L'-38]=150.0095229;
    D['W'-38]['M'-38]=152.3965508;
    D['W'-38]['N'-38]=159.7688325;
    D['W'-38]['P'-38]=182.7653305;
    D['W'-38]['Q'-38]=141.5619982;
    D['R'-38]['A'-38]=111.2645916;
    D['W'-38]['R'-38]=132.5874819;
    D['W'-38]['S'-38]=157.855071;
    D['R'-38]['C'-38]=179.5348377;
    D['W'-38]['T'-38]=150.752701;
    D['R'-38]['D'-38]=95.81352768;
    D['W'-38]['V'-38]=162.8552264;
    D['R'-38]['E'-38]=54.01884479;
    D['W'-38]['W'-38]=0.;
    D['R'-38]['F'-38]=97.03272116;
    D['R'-38]['G'-38]=125.1291926;
    D['W'-38]['Y'-38]=128.9732994;
    D['R'-38]['H'-38]=28.81922224;
    D['R'-38]['I'-38]=97.58656354;
    D['H'-38]['*'-38]=999;
    D['R'-38]['K'-38]=26.00394626;
    D['R'-38]['L'-38]=101.8802928;
    D['R'-38]['M'-38]=91.63827667;
    D['R'-38]['N'-38]=85.11393761;
    D['R'-38]['P'-38]=102.7148709;
    D['M'-38]['A'-38]=84.43958222;
    D['R'-38]['Q'-38]=42.81393193;
    D['R'-38]['R'-38]=0.;
    D['R'-38]['S'-38]=109.213153;
    D['M'-38]['C'-38]=195.5543318;
    D['M'-38]['D'-38]=160.0267338;
    D['R'-38]['T'-38]=70.97102635;
    D['M'-38]['E'-38]=126.0849231;
    D['R'-38]['V'-38]=95.79707649;
    D['M'-38]['F'-38]=28.52784356;
    D['M'-38]['G'-38]=126.9448727;
    D['R'-38]['W'-38]=132.5874819;
    D['M'-38]['H'-38]=86.34392904;
    D['M'-38]['I'-38]=10.12098632;
    D['R'-38]['Y'-38]=77.10764416;
    D['C'-38]['*'-38]=999;
    D['M'-38]['K'-38]=94.4900972;
    D['M'-38]['L'-38]=14.30316651;
    D['M'-38]['M'-38]=0.;
    D['M'-38]['N'-38]=141.1526466;
    D['M'-38]['P'-38]=86.59479895;
    D['M'-38]['Q'-38]=100.8991435;
    D['H'-38]['A'-38]=85.49373612;
    D['M'-38]['R'-38]=91.63827667;
    D['H'-38]['C'-38]=173.8426819;
    D['M'-38]['S'-38]=134.863884;
    D['M'-38]['T'-38]=81.03969279;
    D['H'-38]['D'-38]=81.2379796;
    D['H'-38]['E'-38]=40.79415368;
    D['M'-38]['V'-38]=21.52179938;
    D['H'-38]['F'-38]=99.99505513;
    D['H'-38]['G'-38]=97.53340215;
    D['M'-38]['W'-38]=152.3965508;
    D['H'-38]['H'-38]=0.;
    D['H'-38]['I'-38]=94.33752851;
    D['M'-38]['Y'-38]=35.22269546;
    D['H'-38]['K'-38]=32.40288701;
    D['H'-38]['L'-38]=98.69301471;
    D['H'-38]['M'-38]=86.34392904;
    D['H'-38]['N'-38]=68.35485568;
    D['H'-38]['P'-38]=76.27712277;
    D['C'-38]['A'-38]=195.0037439;
    D['H'-38]['Q'-38]=24.08398867;
    D['H'-38]['R'-38]=28.81922224;
    D['C'-38]['C'-38]=0.;
    D['H'-38]['S'-38]=88.93552755;
    D['C'-38]['D'-38]=153.5743572;
    D['H'-38]['T'-38]=46.75286971;
    D['C'-38]['E'-38]=169.4374593;
    D['C'-38]['F'-38]=204.3884874;
    D['H'-38]['V'-38]=83.892947;
    D['C'-38]['G'-38]=158.2317729;
    D['H'-38]['W'-38]=147.2364297;
    D['C'-38]['H'-38]=173.8426819;
    D['C'-38]['I'-38]=197.2497963;
    D['H'-38]['Y'-38]=83.32844466;
    D['C'-38]['K'-38]=201.5793361;
    D['C'-38]['L'-38]=197.4289714;
    D['C'-38]['M'-38]=195.5543318;
    D['C'-38]['N'-38]=138.7664683;
    D['C'-38]['P'-38]=168.5906208;
    D['C'-38]['Q'-38]=154.2308431;
    D['C'-38]['R'-38]=179.5348377;
    D['C'-38]['S'-38]=111.6724957;
    D['C'-38]['T'-38]=148.9294552;
    D['C'-38]['V'-38]=191.232501;
    D['C'-38]['W'-38]=127.4031665;
    D['S'-38]['*'-38]=999;
    D['C'-38]['Y'-38]=193.7247005;
    D['N'-38]['*'-38]=999;
    D['S'-38]['A'-38]=99.13249708;
    D['S'-38]['C'-38]=111.6724957;
    D['S'-38]['D'-38]=65.47081516;
    D['S'-38]['E'-38]=79.78756921;
    D['S'-38]['F'-38]=154.8079023;
    D['S'-38]['G'-38]=55.26736276;
    D['S'-38]['H'-38]=88.93552755;
    D['S'-38]['I'-38]=141.7979605;
    D['I'-38]['*'-38]=999;
    D['S'-38]['K'-38]=120.5325805;
    D['*'-38]['*'-38]=0.;
    D['S'-38]['L'-38]=144.0792346;
    D['S'-38]['M'-38]=134.863884;
    D['S'-38]['N'-38]=46.23977508;
    D['S'-38]['P'-38]=73.35256887;
    D['N'-38]['A'-38]=110.418026;
    D['S'-38]['Q'-38]=68.19787424;
    D['S'-38]['R'-38]=109.213153;
    D['N'-38]['C'-38]=138.7664683;
    D['S'-38]['S'-38]=0.;
    D['N'-38]['D'-38]=23.005355;
    D['S'-38]['T'-38]=57.74902766;
    D['N'-38]['E'-38]=40.85895231;
    D['N'-38]['F'-38]=158.1121886;
    D['S'-38]['V'-38]=123.0339581;
    D['N'-38]['G'-38]=79.34585612;
    D['S'-38]['W'-38]=157.855071;
    D['N'-38]['H'-38]=68.35485568;
    D['S'-38]['Y'-38]=143.1073844;
    D['N'-38]['I'-38]=148.9140957;
    D['D'-38]['*'-38]=999;
    D['N'-38]['K'-38]=93.88268262;
    D['N'-38]['L'-38]=152.3309797;
    D['N'-38]['M'-38]=141.1526466;
    D['N'-38]['N'-38]=0.;
    D['N'-38]['P'-38]=90.15739727;
    D['N'-38]['Q'-38]=45.75219661;
    D['I'-38]['A'-38]=93.66243338;
    D['N'-38]['R'-38]=85.11393761;
    D['N'-38]['S'-38]=46.23977508;
    D['*'-38]['A'-38]=999;
    D['I'-38]['C'-38]=197.2497963;
    D['N'-38]['T'-38]=64.77428784;
    D['I'-38]['D'-38]=168.0809621;
    D['*'-38]['C'-38]=999;
    D['I'-38]['E'-38]=134.1621451;
    D['N'-38]['V'-38]=132.8777227;
    D['*'-38]['D'-38]=999;
    D['I'-38]['F'-38]=21.27701376;
    D['N'-38]['W'-38]=159.7688325;
    D['*'-38]['E'-38]=999;
    D['I'-38]['G'-38]=135.4188097;
    D['*'-38]['F'-38]=999;
    D['I'-38]['H'-38]=94.33752851;
    D['N'-38]['Y'-38]=142.2293696;
    D['*'-38]['G'-38]=999;
    D['I'-38]['I'-38]=0.;
    D['*'-38]['H'-38]=999;
    D['*'-38]['I'-38]=999;
    D['I'-38]['K'-38]=101.6123327;
    D['I'-38]['L'-38]=4.855121198;
    D['*'-38]['K'-38]=999;
    D['I'-38]['M'-38]=10.12098632;
    D['*'-38]['L'-38]=999;
    D['I'-38]['N'-38]=148.9140957;
    D['*'-38]['M'-38]=999;
    D['*'-38]['N'-38]=999;
    D['I'-38]['P'-38]=95.3760884;
    D['D'-38]['A'-38]=125.7485902;
    D['I'-38]['Q'-38]=108.566243;
    D['*'-38]['P'-38]=999;
    D['I'-38]['R'-38]=97.58656354;
    D['D'-38]['C'-38]=153.5743572;
    D['*'-38]['Q'-38]=999;
    D['I'-38]['S'-38]=141.7979605;
    D['D'-38]['D'-38]=0.;
    D['*'-38]['R'-38]=999;
    D['I'-38]['T'-38]=89.2829021;
    D['D'-38]['E'-38]=44.60463645;
    D['*'-38]['S'-38]=999;
    D['D'-38]['F'-38]=176.5261931;
    D['*'-38]['T'-38]=999;
    D['I'-38]['V'-38]=29.60907063;
    D['D'-38]['G'-38]=93.76755083;
    D['I'-38]['W'-38]=149.826083;
    D['D'-38]['H'-38]=81.2379796;
    D['*'-38]['V'-38]=999;
    D['D'-38]['I'-38]=168.0809621;
    D['*'-38]['W'-38]=999;
    D['Y'-38]['*'-38]=999;
    D['I'-38]['Y'-38]=33.04769862;
    D['D'-38]['K'-38]=101.4568985;
    D['*'-38]['Y'-38]=999;
    D['D'-38]['L'-38]=171.7572022;
    D['D'-38]['M'-38]=160.0267338;
    D['D'-38]['N'-38]=23.005355;
    D['D'-38]['P'-38]=107.9096634;
    D['D'-38]['Q'-38]=61.28447445;
    D['D'-38]['R'-38]=95.81352768;
    D['D'-38]['S'-38]=65.47081516;
    D['D'-38]['T'-38]=85.07613668;
    D['D'-38]['V'-38]=152.013397;
    D['D'-38]['W'-38]=175.3689846;
    D['D'-38]['Y'-38]=159.9374066;
    D['T'-38]['*'-38]=999;
    D['Y'-38]['A'-38]=111.5882137;
    D['Y'-38]['C'-38]=193.7247005;
    D['Y'-38]['D'-38]=159.9374066;
    D['Y'-38]['E'-38]=122.7768651;
    D['Y'-38]['F'-38]=21.60966489;
    D['Y'-38]['G'-38]=146.9262927;
    D['Y'-38]['H'-38]=83.32844466;
    D['Y'-38]['I'-38]=33.04769862;
    D['Y'-38]['K'-38]=84.78644482;
    D['Y'-38]['L'-38]=35.6773121;
    D['Y'-38]['M'-38]=35.22269546;
    D['Y'-38]['N'-38]=142.2293696;
    D['Y'-38]['P'-38]=109.6155723;
    D['T'-38]['A'-38]=58.0233276;
    D['Y'-38]['Q'-38]=98.78325151;
    D['Y'-38]['R'-38]=77.10764416;
    D['Y'-38]['S'-38]=143.1073844;
    D['T'-38]['C'-38]=148.9294552;
    D['Y'-38]['T'-38]=92.24764162;
    D['T'-38]['D'-38]=85.07613668;
    D['T'-38]['E'-38]=65.50131254;
    D['Y'-38]['V'-38]=54.66278181;
    D['T'-38]['F'-38]=102.8587191;
    D['Y'-38]['W'-38]=128.9732994;
    D['T'-38]['G'-38]=59.15645198;
    D['T'-38]['H'-38]=46.75286971;
    D['Y'-38]['Y'-38]=0.;
    D['T'-38]['I'-38]=89.2829021;
    D['T'-38]['K'-38]=77.74105567;
    D['T'-38]['L'-38]=92.35427468;
  }
      
      
  double operator() (char aa1, char aa2) const
  /*
    Returns the distance between two amino acids.
    A distance of 999.0 is used if one of the amino
    acids is a stop (a '*' character).
  */
  {
    return D[std::toupper(aa1) - 38][std::toupper(aa2) - 38];
  }

};  
