【发布时间】:2014-07-11 15:28:37
【问题描述】:
我正在尝试在我的 java 代码中实现 Smith-waterman。如果输入只是一个字符一个字符,我成功地实现了这一点。
这是我的代码
public class Smith {
char[] mSeqA;
char[] mSeqB;
int[][] mD;
int mScore;
String mAlignmentSeqA = "";
String mAlignmentSeqB = "";
void init(char[] seqA, char[] seqB) {
mSeqA = seqA;
mSeqB = seqB;
mD = new int[mSeqA.length + 1][mSeqB.length + 1];
for (int i = 0; i <= mSeqA.length; i++) {
mD[i][0] = 0;
}
for (int j = 0; j <= mSeqB.length; j++) {
mD[0][j] = 0;
}
}
void process() {
for (int i = 1; i <= mSeqA.length; i++) {
for (int j = 1; j <= mSeqB.length; j++) {
int scoreDiag = mD[i - 1][j - 1] + weight(i, j);
int scoreLeft = mD[i][j - 1] - 1;
int scoreUp = mD[i - 1][j] - 1;
mD[i][j] = Math.max(Math.max(Math.max(scoreDiag, scoreLeft), scoreUp), 0);
}
}
}
void backtrack() {
int i = 1;
int j = 1;
int max = mD[i][j];
for (int k = 1; k <= mSeqA.length; k++) {
for (int l = 1; l <= mSeqB.length; l++) {
if (mD[k][l] > max) {
i = k;
j = l;
max = mD[k][l];
}
}
}
mScore = mD[i][j];
int k = mSeqA.length;
int l = mSeqB.length;
while (k > i) {
mAlignmentSeqB += "-";
mAlignmentSeqA += mSeqA[k - 1];
k--;
}
while (l > j) {
mAlignmentSeqA += "-";
mAlignmentSeqB += mSeqB[l - 1];
l--;
}
while (mD[i][j] != 0) {
if (mD[i][j] == mD[i - 1][j - 1] + weight(i, j)) {
mAlignmentSeqA += mSeqA[i - 1];
mAlignmentSeqB += mSeqB[j - 1];
i--;
j--;
continue;
} else if (mD[i][j] == mD[i][j - 1] - 1) {
mAlignmentSeqA += "-";
mAlignmentSeqB += mSeqB[j - 1];
j--;
continue;
} else {
mAlignmentSeqA += mSeqA[i - 1];
mAlignmentSeqB += "-";
i--;
continue;
}
}
while (i > 0) {
mAlignmentSeqB += "-";
mAlignmentSeqA += mSeqA[i - 1];
i--;
}
while (j > 0) {
mAlignmentSeqA += "-";
mAlignmentSeqB += mSeqB[j - 1];
j--;
}
mAlignmentSeqA = new StringBuffer(mAlignmentSeqA).reverse().toString();
mAlignmentSeqB = new StringBuffer(mAlignmentSeqB).reverse().toString();
}
private int weight(int i, int j) {
if (mSeqA[i - 1] == mSeqB[j - 1]) {
return 2;
} else {
return -1;
}
}
void printMatrix() {
System.out.print("D = ");
for (int i = 0; i < mSeqB.length; i++) {
System.out.print(String.format("%4c ", mSeqB[i]));
}
System.out.println();
for (int i = 0; i < mSeqA.length + 1; i++) {
if (i > 0) {
System.out.print(String.format("%4c ", mSeqA[i - 1]));
} else {
System.out.print(" ");
}
for (int j = 0; j < mSeqB.length + 1; j++) {
System.out.print(String.format("%4d ", mD[i][j]));
}
System.out.println();
}
System.out.println();
}
void printScoreAndAlignments() {
System.out.println("Score: " + mScore);
System.out.println("Sequence A: " + mAlignmentSeqA);
System.out.println("Sequence B: " + mAlignmentSeqB);
System.out.println();
}
public static void main(String[] args) {
char[] seqB = {'A', 'C', 'G', 'A'};
char[] seqA = {'T', 'C', 'C', 'G'};
Smith sw = new Smith();
sw.init(seqA, seqB);
sw.process();
sw.backtrack();
sw.printMatrix();
sw.printScoreAndAlignments();
}
}
如果我有像字符串“164164617044”和“1461646144”这样的输入,我该如何处理 m 代码 求帮助,谢谢...
【问题讨论】:
-
看起来你没有对 args[] 输入做任何事情......无论如何,如果你要求将 String 转换为 char 数组,你必须在字符串上调用方法 toCharArray()对象:
-
你好丹尼尔。不知道你是怎么写出这么复杂的程序,甚至上传到code.google.com/p/himmele/source/browse/trunk/Bioinformatics/…,然后还要在Stackoverflow上问这么一个基本的问题……