int traceWM(int i, int j) { int done; int h1, h; int eWM = 0; done = 0; h1 = 0; if (i >= j) return 0; else { for (h = i; h < j && !done; h++) { int aa = WM(i,h) + WM(h + 1,j); if (aa == WM(i,j)) { done = 1; h1 = h; break; } } if (h1 != 0) { eWM += traceWM(i, h); eWM += traceWM(h + 1, j); } else { if (WM(i,j) == V(i,j) + auPenalty(i, j) + Eb) { done = 1; structure[i] = j; structure[j] = i; eWM += traceV(i, j); } else if (WM(i,j) == V(i+1, j) + Ed3(j,i + 1,i) + auPenalty(i+1, j) + Eb + Ec && check_base(i)) { done = 1; eWM += traceV(i + 1, j); structure[i + 1] = j; structure[j] = i + 1; } else if (WM(i,j) == V(i,j-1) + Ed5(j-1,i,j) + auPenalty(i,j-1) + Eb + Ec && check_base(j) ) { done = 1; eWM += traceV(i, j - 1); structure[i] = j - 1; structure[j - 1] = i; } else if (WM(i,j) == V(i+1,j-1) + Ed3(j-1,i+1,i) + Ed5(j-1,i+1,j) + auPenalty(i+1, j-1) + Eb + 2*Ec && check_base(i) && check_base(j)) { done = 1; eWM += traceV(i + 1, j - 1); structure[i + 1] = j - 1; structure[j - 1] = i + 1; } else if (WM(i,j) == WM(i + 1,j) + Ec && check_base(i)) { done = 1; eWM += traceWM(i + 1, j); } else if (WM(i,j) == WM(i,j - 1) + Ec && check_base(j)) { done = 1; eWM += traceWM(i, j - 1); } } } return eWM; }
int traceWMPrime(int i, int j) { int done=0, h, energy=0; for (h = i; h < j && !done; h++) { if (WM(i,h) + WM(h + 1,j) == WMPrime(i,j)) { energy += traceWM(i, h); energy += traceWM(h + 1, j); done = 1; break; } } return energy; }
int traceVM(int i, int j) { int done; int h; int A_temp; int eVM = 0; done = 0; int VMij = VM(i,j); for (h = i + 2; h <= j - 1 && !done; h++) { A_temp = WM(i+1,h-1) + WM(h,j - 1) + Ea + Eb + auPenalty(i, j); if (A_temp == VMij) { done = 1; eVM += traceWM(i + 1, h - 1); eVM += traceWM(h, j - 1); break; } } if (check_base(i+1)) { for (h = i + 3; h <= j - 1 && !done; h++) { A_temp = WM(i + 2,h - 1) + WM(h,j - 1) + Ea + Eb + auPenalty(i,j) + Ed5(i,j,i + 1); if (A_temp == VMij) { done = 1; eVM += traceWM(i + 2, h - 1); eVM += traceWM(h, j - 1); break; } } } if (check_base(j-1)) { for (h = i + 2; h <= j - 2 && !done; h++) { A_temp = WM(i + 1,h - 1) + WM(h,j - 2) + Ea + Eb + auPenalty(i, j) + Ed3(i,j,j - 1); if (A_temp == VMij) { done = 1; eVM += traceWM(i + 1, h - 1); eVM += traceWM(h, j - 2); break; } } } if (check_base(i+1)&&check_base(j-1)) { for (h = i + 3; h <= j - 2 && !done; h++) { A_temp = WM(i + 2,h - 1) + WM(h,j - 2) + Ea + Eb + auPenalty(i,j) + Ed5(i,j,i + 1) + Ed3(i,j,j - 1); if (A_temp == VMij) { done = 1; eVM += traceWM(i + 2, h - 1); eVM += traceWM(h, j - 2); break; } } } return eVM; }
int traceWM(int i, int j) { assert(i < j); int done=0, eWM=0; if (!done && WM(i,j) == WMPrime[i][j]) { eWM += traceWMPrime(i,j); done = 1; } if (!done){ if (g_unamode||g_mismatch) { if (WM(i,j) == V(i,j) + auPenalty(i, j) + Eb && canStack(i,j)) { eWM += traceV(i, j); done = 1; } else if (WM(i,j) == V(i+1, j) + Ed3(j,i + 1,i) + auPenalty(i+1, j) + Eb + Ec && canSS(i) && canStack(i+1,j)) { eWM += traceV(i + 1, j); done = 1; } else if (WM(i,j) == V(i,j-1) + Ed5(j-1,i,j) + auPenalty(i,j-1) + Eb + Ec && canSS(j) && canStack(i,j-1)) { done = 1; eWM += traceV(i, j - 1); } else if (WM(i,j) == V(i+1,j-1) + Estackm(j-1,i+1) + auPenalty(i+1, j-1) + Eb + 2*Ec && canSS(i) && canSS(j) && canStack(i+1,j-1)) { done = 1; eWM += traceV(i + 1, j - 1); } } else if (g_dangles == 2) { int energy = V(i,j) + auPenalty(i, j) + Eb; energy += (i==1)?Ed3(j,i,length):Ed3(j,i,i-1); /*if (j<len)*/ energy += Ed5(j,i,j+1); if (WM(i,j) == energy && canSS(i) && canSS(j) && canStack(i+1,j-1)) { eWM += traceV(i, j); done = 1; } } else if (g_dangles == 0) { if (WM(i,j) == V(i,j) + auPenalty(i, j) + Eb && canStack(i,j)) { eWM += traceV(i, j); done = 1; } } else { if (WM(i,j) == V(i,j) + auPenalty(i, j) + Eb && canStack(i,j)) { eWM += traceV(i, j); done = 1; } else if (WM(i,j) == V(i+1, j) + Ed3(j,i + 1,i) + auPenalty(i+1, j) + Eb + Ec && canSS(i) && canStack(i+1,j)) { eWM += traceV(i + 1, j); done = 1; } else if (WM(i,j) == V(i,j-1) + Ed5(j-1,i,j) + auPenalty(i,j-1) + Eb + Ec && canSS(j) && canStack(i,j-1)) { eWM += traceV(i, j - 1); done = 1; } else if (WM(i,j) == V(i+1,j-1) + Ed3(j-1,i+1,i) + Ed5(j-1,i+1,j) + auPenalty(i+1, j-1) + Eb + 2*Ec && canSS(i) && canSS(j) && canStack(i+1,j-1)) { eWM += traceV(i + 1, j - 1); done = 1; } } } if (!done){ if (WM(i,j) == WM(i + 1,j) + Ec && canSS(i)) { done = 1; eWM += traceWM(i + 1, j); } else if (WM(i,j) == WM(i,j - 1) + Ec && canSS(j)) { done = 1; eWM += traceWM(i, j - 1); } } if(!done) { fprintf(stderr, "ERROR: WM(%d,%d) could not be traced\n", i,j); } return eWM; }