applied LGPLv3 and source code formatting.
[vamsas.git] / src / uk / ac / vamsas / objects / utils / SeqAln.java
index e9f49bd..92e8068 100644 (file)
-/*
- * Created on 17-May-2005
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Style - Code Templates
- */
-package uk.ac.vamsas.objects.utils;
-
-import java.io.BufferedOutputStream;
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.Hashtable;
-import java.util.StringTokenizer;
-import java.util.Vector;
-import java.util.regex.Pattern;
-
-import uk.ac.vamsas.objects.core.*;
-
-/**
- * @author jimp
- * 
- * TODO To change the template for this generated type comment go to Window -
- * Preferences - Java - Code Style - Code Templates
- */
-public class SeqAln extends uk.ac.vamsas.objects.core.Alignment {
-
-  public static Sequence[] ReadClustalFile(InputStream os) throws Exception {
-    System.err.println("NOT FULLY IMPLEMENTED!"); // TODO: Finish adapting this method
-    Pattern nonGap = Pattern.compile("[A-Z*0-9]", Pattern.CASE_INSENSITIVE);
-    String gapchars = "";
-    char gapchar = '-';
-
-    int i = 0;
-    boolean flag = false;
-
-    Vector headers = new Vector();
-    Hashtable seqhash = new Hashtable();
-    Sequence[] seqs = null;
-    int noSeqs = 0;
-    String line;
-
-    try {
-      BufferedReader ins = new BufferedReader(new InputStreamReader(os));
-      while ((line = ins.readLine()) != null) {
-        if (line.indexOf(" ") != 0) {
-          java.util.StringTokenizer str = new StringTokenizer(line, " ");
-          String id = "";
-
-          if (str.hasMoreTokens()) {
-            id = str.nextToken();
-            if (id.equals("CLUSTAL")) {
-              flag = true;
-            } else {
-              if (flag) {
-                StringBuffer tempseq;
-                if (seqhash.containsKey(id)) {
-                  tempseq = (StringBuffer) seqhash.get(id);
-                } else {
-                  tempseq = new StringBuffer();
-                  seqhash.put(id, tempseq);
-                }
-
-                if (!(headers.contains(id))) {
-                  headers.addElement(id);
-                }
-
-                tempseq.append(str.nextToken());
-              }
-            }
-          }
-        }
-      }
-
-    } catch (IOException e) {
-      throw (new Exception("Exception parsing clustal file ", e));
-    }
-
-    if (flag) {
-      noSeqs = headers.size();
-
-      // Add sequences to the hash
-      seqs = new Sequence[headers.size()];
-      for (i = 0; i < headers.size(); i++) {
-        if (seqhash.get(headers.elementAt(i)) != null) {
-          // TODO: develop automatic dictionary typing for sequences
-          Sequence newSeq = Seq.newSequence(headers.elementAt(i).toString(),
-              seqhash.get(headers.elementAt(i).toString()).toString(),
-              SymbolDictionary.STANDARD_AA,0,0);
-
-          seqs[i] = newSeq;
-
-        } else {
-          throw (new Exception("Bizarreness! Can't find sequence for "
-              + headers.elementAt(i)));
-        }
-      }
-    }
-    return seqs;
-  }
-
-  public static void WriteClustalWAlignment(java.io.OutputStream os,
-      Alignment seqAl) throws IOException {
-    System.err.println("NOT FULLY IMPLEMENTED!"); // TODO: Finish adapting this method
-    AlignmentSequence[] s = seqAl.getAlignmentSequence();
-
-    java.io.BufferedWriter out = new BufferedWriter(
-        new java.io.OutputStreamWriter(os));
-
-    out.write("CLUSTAL\n\n");
-
-    int max = 0;
-    int maxid = 0;
-
-    int i = 0;
-
-    while (i < s.length && s[i] != null) {
-      String tmp = s[i].getId();
-
-      if (s[i].getSequence().length() > max) {
-        max = s[i].getSequence().length();
-      }
-      if (tmp.length() > maxid) {
-        maxid = tmp.length();
-      }
-      i++;
-    }
-
-    if (maxid < 15) {
-      maxid = 15;
-    }
-    maxid++;
-    int len = 60;
-    int nochunks = max / len + 1;
-
-    for (i = 0; i < nochunks; i++) {
-      int j = 0;
-      while (j < s.length && s[j] != null) {
-        out.write(new Format("%-" + maxid + "s").form(s[j].getId() + " "));
-        int start = i * len;
-        int end = start + len;
-
-        if (end < s[j].getSequence().length() && start < s[j].getSequence().length()) {
-          out.write(s[j].getSequence().substring(start, end) + "\n");
-        } else {
-          if (start < s[j].getSequence().length()) {
-            out.write(s[j].getSequence().substring(start) + "\n");
-          }
-        }
-        j++;
-      }
-      out.write("\n");
-
-    }
-  }
-  /**
-   * manufacture an alignment/dataset from an array of sequences
-   * @param origin
-   * @param seqs
-   * @return
-   * @throws Exception
-   */
-  public static Alignment make_Alignment(Entry origin,
-      Sequence[] seqs) throws Exception {
-    System.err.println("NOT FULLY IMPLEMENTED!"); // TODO: Finish adapting this method
-    Alignment al = new Alignment();
-    al.setProvenance(ProvenanceStuff.newProvenance(origin));
-    
-    Pattern nonGap = Pattern.compile("[A-Z*0-9]", Pattern.CASE_INSENSITIVE);
-    boolean gapsset = false;
-    char gapchar = '-';
-    int seqLength = 0;
-
-    for (int i = 0, nseq = seqs.length; i < nseq; i++) {
-      String seq = seqs[i].getSequence();
-      String gaps = nonGap.matcher(seq).replaceAll("");
-      if (seqLength == 0) {
-        seqLength = seq.length();
-      } else if (seqLength != seq.length())
-        throw (new Exception(i + "th Sequence (>" + seqs[i].getId()
-            + ") is not aligned.\n"));// TODO: move this to assertions part of
-                                      // Alignment
-
-      // common check for any sequence...
-      if (gaps != null && gaps.length() > 0) {
-        if (!gapsset)
-          gapchar = gaps.charAt(0);
-        for (int c = 0, gc = gaps.length(); c < gc; c++) {
-          if (gapchar != gaps.charAt(c)) {
-            throw (new IOException("Inconsistent gap characters in sequence "
-                + i + ": '" + seq + "'"));
-          }
-        }
-      }
-      AlignmentSequence sq = new AlignmentSequence();
-      // TODO: use as basis of default AlignSequence(Sequence) constructor.
-      sq.setSequence(seq);
-      sq.setName(seqs[i].getId());
-      sq.setRefid(seqs[i].getVorbaId());
-      sq.setStart(seqs[i].getStart());
-      sq.setEnd(seqs[i].getEnd());
-      al.addAlignmentSequence(sq);
-    }
-    al.setGapChar(String.valueOf(gapchar));
-    return al;
-  }
-
-  public static Alignment read_FastaAlignment(InputStream os, Entry entry)
-      throws Exception {
-    Sequence[] seqs;
-    System.err.println("NOT FULLY IMPLEMENTED!"); // TODO: Finish adapting this method
-    try {
-      seqs = SeqSet.read_SeqFasta(os);
-      if (seqs == null)
-        throw (new Exception("Empty alignment stream!\n"));
-    } catch (Exception e) {
-      throw new Exception("Invalid fasta alignment\n", e);
-    }
-    
-    return make_Alignment(entry, seqs);
-  }
-
-  public static Alignment read_ClustalAlignment(InputStream os, Entry entry)
-      throws Exception {
-    Sequence[] seqs;
-    try {
-      seqs = SeqAln.ReadClustalFile(os);
-      if (seqs == null)
-        throw (new Exception("Empty alignment stream!\n"));
-    } catch (Exception e) {
-      throw new Exception("Invalid fasta alignment\n", e);
-    }
-    System.err.println("NOT FULLY IMPLEMENTED!"); // TODO: Finish adapting this method
-    return make_Alignment(entry, seqs);
-  }
-}
+/*\r
+ * This file is part of the Vamsas Client version 0.1. \r
+ * Copyright 2009 by Jim Procter, Iain Milne, Pierre Marguerite, \r
+ *  Andrew Waterhouse and Dominik Lindner.\r
+ * \r
+ * Earlier versions have also been incorporated into Jalview version 2.4 \r
+ * since 2008, and TOPALi version 2 since 2007.\r
+ * \r
+ * The Vamsas Client is free software: you can redistribute it and/or modify\r
+ * it under the terms of the GNU Lesser General Public License as published by\r
+ * the Free Software Foundation, either version 3 of the License, or\r
+ * (at your option) any later version.\r
+ *  \r
+ * The Vamsas Client is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU Lesser General Public License for more details.\r
+ * \r
+ * You should have received a copy of the GNU Lesser General Public License\r
+ * along with the Vamsas Client.  If not, see <http://www.gnu.org/licenses/>.\r
+ */\r
+package uk.ac.vamsas.objects.utils;\r
+\r
+import java.io.BufferedOutputStream;\r
+import java.io.BufferedReader;\r
+import java.io.BufferedWriter;\r
+import java.io.IOException;\r
+import java.io.InputStream;\r
+import java.io.InputStreamReader;\r
+import java.util.Hashtable;\r
+import java.util.StringTokenizer;\r
+import java.util.Vector;\r
+import java.util.regex.Pattern;\r
+\r
+import uk.ac.vamsas.objects.core.*;\r
+\r
+/**\r
+ * @author jimp\r
+ * \r
+ *         TODO To change the template for this generated type comment go to\r
+ *         Window - Preferences - Java - Code Style - Code Templates\r
+ */\r
+public class SeqAln extends uk.ac.vamsas.objects.core.Alignment {\r
+\r
+  public static Sequence[] ReadClustalFile(InputStream os) throws Exception {\r
+    System.err.println("NOT FULLY IMPLEMENTED!"); // TODO: Finish adapting this\r
+                                                  // method\r
+    Pattern nonGap = Pattern.compile("[A-Z*0-9]", Pattern.CASE_INSENSITIVE);\r
+    String gapchars = "";\r
+    char gapchar = '-';\r
+\r
+    int i = 0;\r
+    boolean flag = false;\r
+\r
+    Vector headers = new Vector();\r
+    Hashtable seqhash = new Hashtable();\r
+    Sequence[] seqs = null;\r
+    int noSeqs = 0;\r
+    String line;\r
+\r
+    try {\r
+      BufferedReader ins = new BufferedReader(new InputStreamReader(os));\r
+      while ((line = ins.readLine()) != null) {\r
+        if (line.indexOf(" ") != 0) {\r
+          java.util.StringTokenizer str = new StringTokenizer(line, " ");\r
+          String id = "";\r
+\r
+          if (str.hasMoreTokens()) {\r
+            id = str.nextToken();\r
+            if (id.equals("CLUSTAL")) {\r
+              flag = true;\r
+            } else {\r
+              if (flag) {\r
+                StringBuffer tempseq;\r
+                if (seqhash.containsKey(id)) {\r
+                  tempseq = (StringBuffer) seqhash.get(id);\r
+                } else {\r
+                  tempseq = new StringBuffer();\r
+                  seqhash.put(id, tempseq);\r
+                }\r
+\r
+                if (!(headers.contains(id))) {\r
+                  headers.addElement(id);\r
+                }\r
+\r
+                tempseq.append(str.nextToken());\r
+              }\r
+            }\r
+          }\r
+        }\r
+      }\r
+\r
+    } catch (IOException e) {\r
+      throw (new Exception("Exception parsing clustal file ", e));\r
+    }\r
+\r
+    if (flag) {\r
+      noSeqs = headers.size();\r
+\r
+      // Add sequences to the hash\r
+      seqs = new Sequence[headers.size()];\r
+      for (i = 0; i < headers.size(); i++) {\r
+        if (seqhash.get(headers.elementAt(i)) != null) {\r
+          // TODO: develop automatic dictionary typing for sequences\r
+          Sequence newSeq = Seq.newSequence(headers.elementAt(i).toString(),\r
+              seqhash.get(headers.elementAt(i).toString()).toString(),\r
+              SymbolDictionary.STANDARD_AA, 0, 0);\r
+\r
+          seqs[i] = newSeq;\r
+\r
+        } else {\r
+          throw (new Exception("Bizarreness! Can't find sequence for "\r
+              + headers.elementAt(i)));\r
+        }\r
+      }\r
+    }\r
+    return seqs;\r
+  }\r
+\r
+  public static void WriteClustalWAlignment(java.io.OutputStream os,\r
+      Alignment seqAl) throws IOException {\r
+    System.err.println("NOT FULLY IMPLEMENTED!"); // TODO: Finish adapting this\r
+                                                  // method\r
+    AlignmentSequence[] s = seqAl.getAlignmentSequence();\r
+\r
+    java.io.BufferedWriter out = new BufferedWriter(\r
+        new java.io.OutputStreamWriter(os));\r
+\r
+    out.write("CLUSTAL\n\n");\r
+\r
+    int max = 0;\r
+    int maxid = 0;\r
+\r
+    int i = 0;\r
+\r
+    while (i < s.length && s[i] != null) {\r
+      String tmp = s[i].getId();\r
+\r
+      if (s[i].getSequence().length() > max) {\r
+        max = s[i].getSequence().length();\r
+      }\r
+      if (tmp.length() > maxid) {\r
+        maxid = tmp.length();\r
+      }\r
+      i++;\r
+    }\r
+\r
+    if (maxid < 15) {\r
+      maxid = 15;\r
+    }\r
+    maxid++;\r
+    int len = 60;\r
+    int nochunks = max / len + 1;\r
+\r
+    for (i = 0; i < nochunks; i++) {\r
+      int j = 0;\r
+      while (j < s.length && s[j] != null) {\r
+        out.write(new Format("%-" + maxid + "s").form(s[j].getId() + " "));\r
+        int start = i * len;\r
+        int end = start + len;\r
+\r
+        if (end < s[j].getSequence().length()\r
+            && start < s[j].getSequence().length()) {\r
+          out.write(s[j].getSequence().substring(start, end) + "\n");\r
+        } else {\r
+          if (start < s[j].getSequence().length()) {\r
+            out.write(s[j].getSequence().substring(start) + "\n");\r
+          }\r
+        }\r
+        j++;\r
+      }\r
+      out.write("\n");\r
+\r
+    }\r
+  }\r
+\r
+  /**\r
+   * manufacture an alignment/dataset from an array of sequences\r
+   * \r
+   * @param origin\r
+   * @param seqs\r
+   * @return\r
+   * @throws Exception\r
+   */\r
+  public static Alignment make_Alignment(Entry origin, Sequence[] seqs)\r
+      throws Exception {\r
+    System.err.println("NOT FULLY IMPLEMENTED!"); // TODO: Finish adapting this\r
+                                                  // method\r
+    Alignment al = new Alignment();\r
+    al.setProvenance(ProvenanceStuff.newProvenance(origin));\r
+\r
+    Pattern nonGap = Pattern.compile("[A-Z*0-9]", Pattern.CASE_INSENSITIVE);\r
+    boolean gapsset = false;\r
+    char gapchar = '-';\r
+    int seqLength = 0;\r
+\r
+    for (int i = 0, nseq = seqs.length; i < nseq; i++) {\r
+      String seq = seqs[i].getSequence();\r
+      String gaps = nonGap.matcher(seq).replaceAll("");\r
+      if (seqLength == 0) {\r
+        seqLength = seq.length();\r
+      } else if (seqLength != seq.length())\r
+        throw (new Exception(i + "th Sequence (>" + seqs[i].getId()\r
+            + ") is not aligned.\n"));// TODO: move this to assertions part of\r
+      // Alignment\r
+\r
+      // common check for any sequence...\r
+      if (gaps != null && gaps.length() > 0) {\r
+        if (!gapsset)\r
+          gapchar = gaps.charAt(0);\r
+        for (int c = 0, gc = gaps.length(); c < gc; c++) {\r
+          if (gapchar != gaps.charAt(c)) {\r
+            throw (new IOException("Inconsistent gap characters in sequence "\r
+                + i + ": '" + seq + "'"));\r
+          }\r
+        }\r
+      }\r
+      AlignmentSequence sq = new AlignmentSequence();\r
+      // TODO: use as basis of default AlignSequence(Sequence) constructor.\r
+      sq.setSequence(seq);\r
+      sq.setName(seqs[i].getId());\r
+      sq.setRefid(seqs[i].getVorbaId());\r
+      sq.setStart(seqs[i].getStart());\r
+      sq.setEnd(seqs[i].getEnd());\r
+      al.addAlignmentSequence(sq);\r
+    }\r
+    al.setGapChar(String.valueOf(gapchar));\r
+    return al;\r
+  }\r
+\r
+  public static Alignment read_FastaAlignment(InputStream os, Entry entry)\r
+      throws Exception {\r
+    Sequence[] seqs;\r
+    System.err.println("NOT FULLY IMPLEMENTED!"); // TODO: Finish adapting this\r
+                                                  // method\r
+    try {\r
+      seqs = SeqSet.read_SeqFasta(os);\r
+      if (seqs == null)\r
+        throw (new Exception("Empty alignment stream!\n"));\r
+    } catch (Exception e) {\r
+      throw new Exception("Invalid fasta alignment\n", e);\r
+    }\r
+\r
+    return make_Alignment(entry, seqs);\r
+  }\r
+\r
+  public static Alignment read_ClustalAlignment(InputStream os, Entry entry)\r
+      throws Exception {\r
+    Sequence[] seqs;\r
+    try {\r
+      seqs = SeqAln.ReadClustalFile(os);\r
+      if (seqs == null)\r
+        throw (new Exception("Empty alignment stream!\n"));\r
+    } catch (Exception e) {\r
+      throw new Exception("Invalid fasta alignment\n", e);\r
+    }\r
+    System.err.println("NOT FULLY IMPLEMENTED!"); // TODO: Finish adapting this\r
+                                                  // method\r
+    return make_Alignment(entry, seqs);\r
+  }\r
+}\r