[Seqinr-commits] r2060 - pkg/src

noreply at r-forge.r-project.org noreply at r-forge.r-project.org
Sun Jul 16 17:38:37 CEST 2017


Author: jeanlobry
Date: 2017-07-16 17:38:36 +0200 (Sun, 16 Jul 2017)
New Revision: 2060

Modified:
   pkg/src/kaks.c
Log:
fixing accurary bug repported by SCH

Modified: pkg/src/kaks.c
===================================================================
--- pkg/src/kaks.c	2017-07-04 16:37:40 UTC (rev 2059)
+++ pkg/src/kaks.c	2017-07-16 15:38:36 UTC (rev 2060)
@@ -392,29 +392,25 @@
 
 int num(char *cod)
 {
-	int             n1, n2, n3;
+  int  n1, n2, n3;
+//MG
+	static const char bases[] = "ACGT";
+	if(strchr(bases, cod[0]) == NULL ||
+	   strchr(bases, cod[1]) == NULL ||
+	   strchr(bases, cod[2]) == NULL) return 64;
+//MG
+  n1 = n2 = n3 = 0;
+  if (cod[0] == 'C') n1 = 1;
+  if (cod[1] == 'C') n2 = 1;
+  if (cod[2] == 'C') n3 = 1;
+  if (cod[0] == 'G') n1 = 2;
+  if (cod[1] == 'G') n2 = 2;
+  if (cod[2] == 'G') n3 = 2;
+  if (cod[0] == 'T') n1 = 3;
+  if (cod[1] == 'T') n2 = 3;
+  if (cod[2] == 'T') n3 = 3;
 
-	n1 = n2 = n3 = 0;
-	if (cod[0] == 'C')
-		n1 = 1;
-	if (cod[1] == 'C')
-		n2 = 1;
-	if (cod[2] == 'C')
-		n3 = 1;
-	if (cod[0] == 'G')
-		n1 = 2;
-	if (cod[1] == 'G')
-		n2 = 2;
-	if (cod[2] == 'G')
-		n3 = 2;
-	if (cod[0] == 'T')
-		n1 = 3;
-	if (cod[1] == 'T')
-		n2 = 3;
-	if (cod[2] == 'T')
-		n3 = 3;
-
-	return 16 * n1 + 4 * n2 + n3;
+  return 16 * n1 + 4 * n2 + n3;
 }
 
 
@@ -451,6 +447,7 @@
 	cod2[2] = *(seq[j] + 3 * ii + 2);
 	num1 = num(cod1);
 	num2 = num(cod2);
+	if(num1 == 64 || num2 == 64) continue;//MG ignore - or N-containing codons
 	l[0] += *(tl0[num1] + num2);
 	l[1] += *(tl1[num1] + num2);
 	l[2] += *(tl2[num1] + num2);
@@ -767,44 +764,48 @@
 void titv2(char *cod1, char *cod2, double *ti, double *tv, double* l, int *aa, double **rl, int* pos)
 {
 
-	char            codint1[3], codint2[3];
-	int             i, j, n = 0;
-	double           l1, l2, p1, p2;
+	char            codint1[4], codint2[4];
+	int             i, j, n, aa1, aa2, aaint1, aaint2;
+	double          l1, l2, p1, p2;
 	void            titv1(char *, char *, double, double *, double *,double*);
 
 
-	memcpy(codint1, cod1, 3);
-	memcpy(codint2, cod1, 3);
+        memcpy(codint1, cod1, 3);
+        memcpy(codint2, cod1, 3); /* codint_2_ <-- cod_1_ : no problem */
 	for (i = 0; i < 2; i++) {
-		if (cod1[i] != cod2[i])
+		if (cod1[i] != cod2[i]){
 			codint1[i] = cod2[i];
-		if (cod1[i] != cod2[i])
 			break;
+		}
 	}
 	for (j = i + 1; j <= 2; j++) {
-		if (cod1[j] != cod2[j])
+		if (cod1[j] != cod2[j]){
 			codint2[j] = cod2[j];
-		if (cod1[j] != cod2[j])
 			break;
+		}
 	}
 
+
+	aa1=aa[num(cod1)]; aa2=aa[num(cod2)];
+	aaint1=aa[num(codint1)]; aaint2=aa[num(codint2)];
 	
-	l1 = *(rl[aa[num(cod1)]] + aa[num(codint1)]) * *(rl[aa[num(codint1)]] + aa[num(cod2)]);
-	l2 = *(rl[aa[num(cod1)]] + aa[num(codint2)]) * *(rl[aa[num(codint2)]] + aa[num(cod2)]);
-
-	p1 = l1 / (l1 + l2);
-	p2 = 1 - p1;
+	l1 = *(rl[aa1] + aaint1) * *(rl[aaint1] + aa2);
+	l2 = *(rl[aa1] + aaint2) * *(rl[aaint2] + aa2);
+	p1 = (l1+l2)? l1 / (l1 + l2) : 0.;
+	p2 = (l1+l2)? 1.-p1 : 0.;
 	for (i=0;i<3;i++) if (pos[i]==0) n=i+1;
 	l[catsite(cod1[0], cod1[1] ,cod1[2], n)]+=0.333333;
 	l[catsite(cod2[0], cod2[1] ,cod2[2], n)]+=0.333333;
 	l[catsite(codint1[0], codint1[1] ,codint1[2], n)]+=0.333333*p1;
 	l[catsite(codint2[0], codint2[1] ,codint2[2], n)]+=0.333333*p2;
+
+
+
 	titv1(cod1, codint1, p1, ti, tv,l);
 	titv1(cod2, codint1, p1, ti, tv,l);
 	titv1(cod1, codint2, p2, ti, tv,l);
 	titv1(cod2, codint2, p2, ti, tv,l);
 
-
 }
 
 void titv3(char *cod1, char *cod2, double *ti, double *tv, double* l, int *aa, double **rl)



More information about the Seqinr-commits mailing list