00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <cassert>
00025 #include <Sequence/Comparisons.hpp>
00026 #include <Sequence/RedundancyCom95.hpp>
00027 #include <Sequence/SingleSub.hpp>
00028
00029 namespace Sequence
00030 {
00031
00032 void SingleSub::operator() (const RedundancyCom95 * sitesObj,
00033 const std::string & cod1,
00034 const std::string & cod2)
00041 {
00042 assert(cod1.length() == 3 && cod2.length() == 3);
00043 q0i = q2Si = q2Vi = q4i = q0j = q2Sj = q2Vj = q4j = p0i = p2Si =
00044 p2Vi = p4i = p0j = p2Sj = p2Vj = p4j = 0.0;
00045 Calculate (sitesObj, cod1, cod2);
00046 }
00047
00048 double SingleSub::P0(void) const
00052 {
00053 return (p0i+p0j)/2.0;
00054 }
00055
00056
00057 double SingleSub::P2S(void) const
00061 {
00062 return (p2Si+p2Sj)/2.0;
00063 }
00064
00065
00066 double SingleSub::P2V(void) const
00070 {
00071 return (p2Vi+p2Vj)/2.0;
00072 }
00073
00074
00075 double SingleSub::P4(void) const
00079 {
00080 return (p4i+p4j)/2.0;
00081 }
00082
00083 double SingleSub::Q0(void) const
00087 {
00088 return (q0i+q0j)/2.0;
00089 }
00090
00091
00092 double SingleSub::Q2S(void) const
00096 {
00097 return (q2Si+q2Sj)/2.0;
00098 }
00099
00100
00101 double SingleSub::Q2V(void) const
00105 {
00106 return (q2Vi+q2Vj)/2.0;
00107 }
00108
00109
00110 double SingleSub::Q4(void) const
00114 {
00115 return (q4i+q4j)/2.0;
00116 }
00117
00118 void
00119 SingleSub::Calculate (const RedundancyCom95 * sitesObj, const std::string & codon1,
00120 const std::string & codon2)
00124 {
00125 int pos = 0, k = 0, type = 0;
00126 double a, b, c, d;
00127 for (k = 0; k <= 2; ++k)
00128 if (codon1[k] != codon2[k])
00129 pos = k;
00130
00131
00132 type = TsTv (codon1[pos], codon2[pos]);
00133 if (pos == 0 && type == 1)
00134 {
00135 a = sitesObj->FirstNon (codon1);
00136 b = sitesObj->First2S (codon1);
00137 c = sitesObj->First2V (codon1);
00138 p0i += (a > b && a > c) ? 1.0 : 0.0;
00139 p2Si += (b >= a && b >= c) ? 1.0 : 0.0;
00140 p2Vi += (c >= a && c > b) ? 1.0 : 0.0;
00141
00142 a = sitesObj->FirstNon (codon2);
00143 b = sitesObj->First2S (codon2);
00144 c = sitesObj->First2V (codon2);
00145
00146 p0j += (a > b && a > c) ? 1.0 : 0.0;
00147 p2Sj += (b >= a && b >= c) ? 1.0 : 0.0;
00148 p2Vj += (c >= a && c > b) ? 1.0 : 0.0;
00149 }
00150 else if (pos == 0 && type == 2)
00151 {
00152 a = sitesObj->FirstNon (codon1);
00153 b = sitesObj->First2S (codon1);
00154 c = sitesObj->First2V (codon1);
00155
00156 q0i += (a > b && a > c) ? 1.0 : 0.0;
00157 q2Si += (b >= a && b > c) ? 1.0 : 0.0;
00158 q2Vi += (c >= a && c >= b) ? 1.0 : 0.0;
00159
00160 a = sitesObj->FirstNon (codon2);
00161 b = sitesObj->First2S (codon2);
00162 c = sitesObj->First2V (codon2);
00163
00164 q0j += (a > b && a > c) ? 1.0 : 0.0;
00165 q2Sj += (b >= a && b > c) ? 1.0 : 0.0;
00166 q2Vj += (c >= a && c >= b) ? 1.0 : 0.0;
00167
00168 }
00169 else if (pos == 1 && type == 1)
00170 {
00171 p0i += 1.0;
00172 p0j += 1.0;
00173 }
00174 else if (pos == 1 && type == 2)
00175 {
00176 q0i += 1.0;
00177 q0j += 1.0;
00178 }
00179 else if (pos == 2 && type == 1)
00180 {
00181 a = sitesObj->ThirdNon (codon1);
00182 b = sitesObj->Third2S (codon1);
00183 c = sitesObj->Third2V (codon1);
00184 d = sitesObj->ThirdFour (codon1);
00185
00186 p0i += (a > b && a > c && a > d) ? 1.0 : 0.0;
00187 p2Si += (b >= a && b >= c && b > d) ? 1.0 : 0.0;
00188 p2Vi += (c >= a && c > b && c > d) ? 1.0 : 0.0;
00189 p4i += (d >= a && d >= b && d >= c) ? 1.0 : 0.0;
00190
00191
00192 a = sitesObj->ThirdNon (codon2);
00193 b = sitesObj->Third2S (codon2);
00194 c = sitesObj->Third2V (codon2);
00195 d = sitesObj->ThirdFour (codon2);
00196
00197 p0j += (a > b && a > c && a > d) ? 1.0 : 0.0;
00198 p2Sj += (b >= a && b >= c && b > d) ? 1.0 : 0.0;
00199 p2Vj += (c >= a && c > b && c > d) ? 1.0 : 0.0;
00200 p4j += (d >= a && d >= b && d >= c) ? 1.0 : 0.0;
00201
00202 }
00203 else if (pos == 2 && type == 2)
00204 {
00205 a = sitesObj->ThirdNon (codon1);
00206 b = sitesObj->Third2S (codon1);
00207 c = sitesObj->Third2V (codon1);
00208 d = sitesObj->ThirdFour (codon1);
00209
00210 q0i += (a > b && a > c && a > d) ? 1.0 : 0.0;
00211 q2Si += (b >= a && b > c && b > d) ? 1.0 : 0.0;
00212 q2Vi += (c >= a && c >= b && c > d) ? 1.0 : 0.0;
00213 q4i += (d >= a && d >= b && d >= c) ? 1.0 : 0.0;
00214
00215 a = sitesObj->ThirdNon (codon2);
00216 b = sitesObj->Third2S (codon2);
00217 c = sitesObj->Third2V (codon2);
00218 d = sitesObj->ThirdFour (codon2);
00219
00220 q0j += (a > b && a > c && a > d) ? 1.0 : 0.0;
00221 q2Sj += (b >= a && b > c && b > d) ? 1.0 : 0.0;
00222 q2Vj += (c >= a && c >= b && c > d) ? 1.0 : 0.0;
00223 q4j += (d >= a && d >= b && d >= c) ? 1.0 : 0.0;
00224 }
00225 }
00226 }