Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
}