X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fanalysis%2FAlignSeq.java;h=60ad85c7a30678cb1e9faa98edadf007d5df0660;hb=6f4eaccaaabb743c27589d4107439caeb490ac3e;hp=47c17a3382118cad8115e918ff87fa8a72891e07;hpb=588042b69abf8e60bcc950b24c283933c7dd422f;p=jalview.git diff --git a/src/jalview/analysis/AlignSeq.java b/src/jalview/analysis/AlignSeq.java index 47c17a3..60ad85c 100755 --- a/src/jalview/analysis/AlignSeq.java +++ b/src/jalview/analysis/AlignSeq.java @@ -20,23 +20,28 @@ package jalview.analysis; import jalview.datamodel.SequenceI; -import jalview.io.*; - import jalview.schemes.*; import jalview.util.*; import java.awt.*; -import java.io.*; - import java.util.*; -public class AlignSeq { +/** + * + * + * @author $author$ + * @version $Revision$ + */ +public class AlignSeq +{ + /** DOCUMENT ME!! */ public static java.util.Hashtable dnaHash = new java.util.Hashtable(); - static { + static + { dnaHash.put("C", new Integer(0)); dnaHash.put("T", new Integer(1)); dnaHash.put("A", new Integer(2)); @@ -45,7 +50,8 @@ public class AlignSeq { } static String[] dna = { "C", "T", "A", "G", "-" }; - static String[] pep = { + static String[] pep = + { "A", "R", "N", "D", "C", "Q", "E", "G", "H", "I", "L", "K", "M", "F", "P", "S", "T", "W", "Y", "V", "B", "Z", "X", "-" }; @@ -65,11 +71,21 @@ public class AlignSeq { int[] aseq2; String astr1 = ""; String astr2 = ""; + + /** DOCUMENT ME!! */ public int seq1start; + + /** DOCUMENT ME!! */ public int seq1end; + + /** DOCUMENT ME!! */ public int seq2start; + + /** DOCUMENT ME!! */ public int seq2end; int count; + + /** DOCUMENT ME!! */ public int maxscore; float pid; int prev = 0; @@ -82,84 +98,171 @@ public class AlignSeq { String type; Runtime rt; - public AlignSeq() { - } - public AlignSeq(SequenceI s1, SequenceI s2, String type) { + /** + * Creates a new AlignSeq object. + * + * @param s1 DOCUMENT ME! + * @param s2 DOCUMENT ME! + * @param type DOCUMENT ME! + */ + public AlignSeq(SequenceI s1, SequenceI s2, String type) + { rt = Runtime.getRuntime(); SeqInit(s1, s2, type); } - public int getMaxScore() { + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public int getMaxScore() + { return maxscore; } - public int getSeq2Start() { + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public int getSeq2Start() + { return seq2start; } - public int getSeq2End() { + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public int getSeq2End() + { return seq2end; } - public int getSeq1Start() { + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public int getSeq1Start() + { return seq1start; } - public int getSeq1End() { + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public int getSeq1End() + { return seq1end; } - public String getOutput() { + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public String getOutput() + { return output; } - public String getAStr1() { + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public String getAStr1() + { return astr1; } - public String getAStr2() { + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public String getAStr2() + { return astr2; } - public int[] getASeq1() { + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public int[] getASeq1() + { return aseq1; } - public int[] getASeq2() { + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public int[] getASeq2() + { return aseq2; } - public SequenceI getS1() { + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public SequenceI getS1() + { return s1; } - public SequenceI getS2() { + /** + * DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public SequenceI getS2() + { return s2; } - public void SeqInit(SequenceI s1, SequenceI s2, String type) { - s1str = extractGaps(".", s1.getSequence()); - s2str = extractGaps(".", s2.getSequence()); - s1str = extractGaps("-", s1str); - s2str = extractGaps("-", s2str); - s1str = extractGaps(" ", s1str); - s2str = extractGaps(" ", s2str); + /** + * DOCUMENT ME! + * + * @param s1 DOCUMENT ME! + * @param s2 DOCUMENT ME! + * @param type DOCUMENT ME! + */ + public void SeqInit(SequenceI s1, SequenceI s2, String type) + { + s1str = extractGaps(jalview.util.Comparison.GapChars, s1.getSequence()); + s2str = extractGaps(jalview.util.Comparison.GapChars, s2.getSequence()); this.s1 = s1; this.s2 = s2; this.type = type; - if (type.equals("pep")) { + if (type.equals("pep")) + { lookup = ResidueProperties.getBLOSUM62(); intToStr = pep; defInt = 23; - } else if (type.equals("dna")) { + } + else if (type.equals("dna")) + { lookup = ResidueProperties.getDNA(); intToStr = dna; defInt = 4; - } else { + } + else + { output = output + ("Wrong type = dna or pep only"); System.exit(0); } @@ -205,20 +308,28 @@ public class AlignSeq { //System.out.println("Time take to traceback alignment = " + (tend-tstart) + " ms"); } - public void traceAlignment() { + /** + * DOCUMENT ME! + */ + public void traceAlignment() + { // Find the maximum score along the rhs or bottom row int max = -9999; - for (int i = 0; i < seq1.length; i++) { - if (score[i][seq2.length - 1] > max) { + for (int i = 0; i < seq1.length; i++) + { + if (score[i][seq2.length - 1] > max) + { max = score[i][seq2.length - 1]; maxi = i; maxj = seq2.length - 1; } } - for (int j = 0; j < seq2.length; j++) { - if (score[seq1.length - 1][j] > max) { + for (int j = 0; j < seq2.length; j++) + { + if (score[seq1.length - 1][j] > max) + { max = score[seq1.length - 1][j]; maxi = seq1.length - 1; maxj = j; @@ -239,27 +350,35 @@ public class AlignSeq { count = (seq1.length + seq2.length) - 1; - while ((i > 0) && (j > 0)) { - if ((aseq1[count] != defInt) && (i >= 0)) { + while ((i > 0) && (j > 0)) + { + if ((aseq1[count] != defInt) && (i >= 0)) + { aseq1[count] = seq1[i]; astr1 = intToStr[seq1[i]] + astr1; } - if ((aseq2[count] != defInt) && (j > 0)) { + if ((aseq2[count] != defInt) && (j > 0)) + { aseq2[count] = seq2[j]; astr2 = intToStr[seq2[j]] + astr2; } trace = findTrace(i, j); - if (trace == 0) { + if (trace == 0) + { i--; j--; - } else if (trace == 1) { + } + else if (trace == 1) + { j--; aseq1[count] = defInt; astr1 = "-" + astr1.substring(1); - } else if (trace == -1) { + } + else if (trace == -1) + { i--; aseq2[count] = defInt; astr2 = "-" + astr2.substring(1); @@ -271,22 +390,29 @@ public class AlignSeq { seq1start = i + 1; seq2start = j + 1; - if (aseq1[count] != defInt) { + if (aseq1[count] != defInt) + { aseq1[count] = seq1[i]; astr1 = intToStr[seq1[i]] + astr1; } - if (aseq2[count] != defInt) { + if (aseq2[count] != defInt) + { aseq2[count] = seq2[j]; astr2 = intToStr[seq2[j]] + astr2; } } - public void printAlignment() { + /** + * DOCUMENT ME! + */ + public void printAlignment() + { // Find the biggest id length for formatting purposes int maxid = s1.getName().length(); - if (s2.getName().length() > maxid) { + if (s2.getName().length() > maxid) + { maxid = s2.getName().length(); } @@ -294,8 +420,6 @@ public class AlignSeq { int nochunks = ((aseq1.length - count) / len) + 1; pid = 0; - int overlap = 0; - output = output + ("Score = " + score[maxi][maxj] + "\n"); output = output + ("Length of alignment = " + (aseq1.length - count) + "\n"); @@ -310,13 +434,16 @@ public class AlignSeq { (" : " + seq2start + " - " + seq2end + " (Sequence length = " + s2str.length() + ")\n\n"); - for (int j = 0; j < nochunks; j++) { + for (int j = 0; j < nochunks; j++) + { // Print the first aligned sequence output = output + (new Format("%" + (maxid) + "s").form(s1.getName()) + " "); - for (int i = 0; i < len; i++) { - if ((count + i + (j * len)) < aseq1.length) { + for (int i = 0; i < len; i++) + { + if ((count + i + (j * len)) < aseq1.length) + { output = output + (new Format("%s").form(intToStr[aseq1[count + i + (j * len)]])); @@ -328,22 +455,32 @@ public class AlignSeq { (new Format("%" + (maxid) + "s").form(" ") + " "); // Print out the matching chars - for (int i = 0; i < len; i++) { - if ((count + i + (j * len)) < aseq1.length) { + for (int i = 0; i < len; i++) + { + if ((count + i + (j * len)) < aseq1.length) + { if (intToStr[aseq1[count + i + (j * len)]].equals( intToStr[aseq2[count + i + (j * len)]]) && - !intToStr[aseq1[count + i + (j * len)]].equals("-")) { + !intToStr[aseq1[count + i + (j * len)]].equals("-")) + { pid++; output = output + ("|"); - } else if (type.equals("pep")) { + } + else if (type.equals("pep")) + { if (ResidueProperties.getPAM250( intToStr[aseq1[count + i + (j * len)]], - intToStr[aseq2[count + i + (j * len)]]) > 0) { + intToStr[aseq2[count + i + (j * len)]]) > 0) + { output = output + ("."); - } else { + } + else + { output = output + (" "); } - } else { + } + else + { output = output + (" "); } } @@ -354,8 +491,10 @@ public class AlignSeq { output = output + (new Format("%" + (maxid) + "s").form(s2.getName()) + " "); - for (int i = 0; i < len; i++) { - if ((count + i + (j * len)) < aseq1.length) { + for (int i = 0; i < len; i++) + { + if ((count + i + (j * len)) < aseq1.length) + { output = output + (new Format("%s").form(intToStr[aseq2[count + i + (j * len)]])); @@ -369,24 +508,35 @@ public class AlignSeq { output = output + (new Format("Percentage ID = %2.2f\n\n").form(pid)); } - public void printScoreMatrix(int[][] mat) { + /** + * DOCUMENT ME! + * + * @param mat DOCUMENT ME! + */ + public void printScoreMatrix(int[][] mat) + { int n = seq1.length; int m = seq2.length; - for (int i = 0; i < n; i++) { + for (int i = 0; i < n; i++) + { // Print the top sequence - if (i == 0) { + if (i == 0) + { Format.print(System.out, "%8s", s2str.substring(0, 1)); - for (int jj = 1; jj < m; jj++) { + for (int jj = 1; jj < m; jj++) + { Format.print(System.out, "%5s", s2str.substring(jj, jj + 1)); } System.out.println(); } - for (int j = 0; j < m; j++) { - if (j == 0) { + for (int j = 0; j < m; j++) + { + if (j == 0) + { Format.print(System.out, "%3s", s1str.substring(i, i + 1)); } @@ -397,25 +547,42 @@ public class AlignSeq { } } - public int findTrace(int i, int j) { + /** + * DOCUMENT ME! + * + * @param i DOCUMENT ME! + * @param j DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public int findTrace(int i, int j) + { int t = 0; int max = score[i - 1][j - 1] + (lookup[seq1[i]][seq2[j]] * 10); - if (F[i][j] > max) { + if (F[i][j] > max) + { max = F[i][j]; t = -1; - } else if (F[i][j] == max) { - if (prev == -1) { + } + else if (F[i][j] == max) + { + if (prev == -1) + { max = F[i][j]; t = -1; } } - if (E[i][j] >= max) { + if (E[i][j] >= max) + { max = E[i][j]; t = 1; - } else if (E[i][j] == max) { - if (prev == 1) { + } + else if (E[i][j] == max) + { + if (prev == 1) + { max = E[i][j]; t = 1; } @@ -426,7 +593,11 @@ public class AlignSeq { return t; } - public void calcScoreMatrix() { + /** + * DOCUMENT ME! + */ + public void calcScoreMatrix() + { int n = seq1.length; int m = seq2.length; @@ -436,7 +607,8 @@ public class AlignSeq { F[0][0] = 0; // Calculate the top row first - for (int j = 1; j < m; j++) { + for (int j = 1; j < m; j++) + { // What should these values be? 0 maybe E[0][j] = max(score[0][j - 1] - gapOpen, E[0][j - 1] - gapExtend); F[0][j] = -gapExtend; @@ -448,7 +620,8 @@ public class AlignSeq { } // Now do the left hand column - for (int i = 1; i < n; i++) { + for (int i = 1; i < n; i++) + { E[i][0] = -gapOpen; F[i][0] = max(score[i - 1][0] - gapOpen, F[i - 1][0] - gapExtend); @@ -457,8 +630,10 @@ public class AlignSeq { } // Now do all the other rows - for (int i = 1; i < n; i++) { - for (int j = 1; j < m; j++) { + for (int i = 1; i < n; i++) + { + for (int j = 1; j < m; j++) + { E[i][j] = max(score[i][j - 1] - gapOpen, E[i][j - 1] - gapExtend); F[i][j] = max(score[i - 1][j] - gapOpen, F[i - 1][j] - @@ -471,72 +646,115 @@ public class AlignSeq { } } - public static String extractChars(String chars, String seq) { - String out = seq; - for (int i = 0; i < chars.length(); i++) { - String gap = chars.substring(i, i + 1); - out = extractGaps(gap, out); - } - - return out; - } - public static String extractGaps(String gapChar, String seq) { + /** + * DOCUMENT ME! + * + * @param gapChar DOCUMENT ME! + * @param seq DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public static String extractGaps(String gapChar, String seq) + { StringTokenizer str = new StringTokenizer(seq, gapChar); String newString = ""; - while (str.hasMoreTokens()) { + while (str.hasMoreTokens()) + { newString = newString + str.nextToken(); } return newString; } - public int max(int i1, int i2, int i3) { + /** + * DOCUMENT ME! + * + * @param i1 DOCUMENT ME! + * @param i2 DOCUMENT ME! + * @param i3 DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public int max(int i1, int i2, int i3) + { int max = i1; - if (i2 > i1) { + if (i2 > i1) + { max = i2; } - if (i3 > max) { + if (i3 > max) + { max = i3; } return max; } - public int max(int i1, int i2) { + /** + * DOCUMENT ME! + * + * @param i1 DOCUMENT ME! + * @param i2 DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public int max(int i1, int i2) + { int max = i1; - if (i2 > i1) { + if (i2 > i1) + { max = i2; } return max; } - public int[] stringToInt(String s, String type) { + /** + * DOCUMENT ME! + * + * @param s DOCUMENT ME! + * @param type DOCUMENT ME! + * + * @return DOCUMENT ME! + */ + public int[] stringToInt(String s, String type) + { int[] seq1 = new int[s.length()]; - for (int i = 0; i < s.length(); i++) { + for (int i = 0; i < s.length(); i++) + { String ss = s.substring(i, i + 1).toUpperCase(); - try { - if (type.equals("pep")) { + try + { + if (type.equals("pep")) + { seq1[i] = ((Integer) ResidueProperties.aaHash.get(ss)).intValue(); - } else if (type.equals("dna")) { + } + else if (type.equals("dna")) + { seq1[i] = ((Integer) dnaHash.get(ss)).intValue(); } - if (seq1[i] > 23) { + if (seq1[i] > 23) + { seq1[i] = 23; } - } catch (Exception e) { - if (type.equals("dna")) { + } + catch (Exception e) + { + if (type.equals("dna")) + { seq1[i] = 4; - } else { + } + else + { seq1[i] = 23; } } @@ -545,18 +763,32 @@ public class AlignSeq { return seq1; } + /** + * DOCUMENT ME! + * + * @param g DOCUMENT ME! + * @param mat DOCUMENT ME! + * @param n DOCUMENT ME! + * @param m DOCUMENT ME! + * @param psize DOCUMENT ME! + */ public static void displayMatrix(Graphics g, int[][] mat, int n, int m, - int psize) { + int psize) + { int max = -1000; int min = 1000; - for (int i = 0; i < n; i++) { - for (int j = 0; j < m; j++) { - if (mat[i][j] >= max) { + for (int i = 0; i < n; i++) + { + for (int j = 0; j < m; j++) + { + if (mat[i][j] >= max) + { max = mat[i][j]; } - if (mat[i][j] <= min) { + if (mat[i][j] <= min) + { min = mat[i][j]; } } @@ -564,8 +796,10 @@ public class AlignSeq { System.out.println(max + " " + min); - for (int i = 0; i < n; i++) { - for (int j = 0; j < m; j++) { + for (int i = 0; i < n; i++) + { + for (int j = 0; j < m; j++) + { int x = psize * i; int y = psize * j;