JAL-1645 Version-Rel Version 2.9 Year-Rel 2015 Licensing glob
[jalview.git] / src / jalview / io / FastaFile.java
index d5a6a66..2801ac4 100755 (executable)
-/*\r
-* Jalview - A Sequence Alignment Editor and Viewer\r
-* Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
-*\r
-* This program is free software; you can redistribute it and/or\r
-* modify it under the terms of the GNU General Public License\r
-* as published by the Free Software Foundation; either version 2\r
-* of the License, or (at your option) any later version.\r
-*\r
-* This program 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 General Public License for more details.\r
-*\r
-* You should have received a copy of the GNU General Public License\r
-* along with this program; if not, write to the Free Software\r
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
-*/\r
-package jalview.io;\r
-\r
-import jalview.datamodel.*;\r
-\r
-import java.io.*;\r
-\r
-import java.util.*;\r
-\r
-\r
-/**\r
- * DOCUMENT ME!\r
- *\r
- * @author $author$\r
- * @version $Revision$\r
- */\r
-public class FastaFile extends AlignFile\r
-{\r
-    /**\r
-     * Creates a new FastaFile object.\r
-     */\r
-    public FastaFile()\r
-    {\r
-    }\r
-\r
-    /**\r
-     * Creates a new FastaFile object.\r
-     *\r
-     * @param inFile DOCUMENT ME!\r
-     * @param type DOCUMENT ME!\r
-     *\r
-     * @throws IOException DOCUMENT ME!\r
-     */\r
-    public FastaFile(String inFile, String type) throws IOException\r
-    {\r
-        super(inFile, type);\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @throws IOException DOCUMENT ME!\r
-     */\r
-    public void parse() throws IOException\r
-    {\r
-        StringBuffer sb = new StringBuffer();\r
-        boolean firstLine = true;\r
-\r
-        String line;\r
-        Sequence seq = null;\r
-\r
-        boolean annotation = false;\r
-\r
-        while ((line = nextLine()) != null)\r
-        {\r
-            line = line.trim();\r
-            if (line.length() > 0)\r
-            {\r
-              if (line.charAt(0)=='>')\r
-                {\r
-                  if (line.startsWith(">#_"))\r
-                  {\r
-                    if (annotation)\r
-                    {\r
-                      Annotation[] anots = new Annotation[sb.length()];\r
-                      String anotString = sb.toString();\r
-                      for (int i = 0; i < sb.length(); i++)\r
-                      {\r
-                        anots[i] = new Annotation(anotString.substring(i, i+1),\r
-                                                  null,\r
-                                                  ' ', 0);\r
-                      }\r
-                      AlignmentAnnotation aa = new AlignmentAnnotation(\r
-                          seq.getName().substring(2), seq.getDescription(),\r
-                          anots);\r
-\r
-                      annotations.addElement(aa);\r
-                    }\r
-                    annotation = true;\r
-                  }\r
-                  else\r
-                    annotation = false;\r
-\r
-                    if (!firstLine)\r
-                    {\r
-                      if (!annotation && !isValidProteinSequence(sb.toString().toCharArray()))\r
-                      {\r
-                        throw new IOException(AppletFormatAdapter.INVALID_CHARACTERS\r
-                                              +" : "+seq.getName()\r
-                                              +" : "+invalidCharacter);\r
-                      }\r
-\r
-                       seq.setSequence(sb.toString());\r
-\r
-                       if (!annotation)\r
-                         seqs.addElement(seq);\r
-                    }\r
-\r
-                    seq = parseId(line.substring(1));\r
-                    firstLine = false;\r
-\r
-                    sb = new StringBuffer();\r
-                }\r
-                else\r
-                {\r
-                    sb.append(line);\r
-                }\r
-            }\r
-        }\r
-\r
-        if (annotation)\r
-        {\r
-          Annotation[] anots = new Annotation[sb.length()];\r
-          String anotString = sb.toString();\r
-          for (int i = 0; i < sb.length(); i++)\r
-          {\r
-            anots[i] = new Annotation(anotString.substring(i, i + 1),\r
-                                      null,\r
-                                      ' ', 0);\r
-          }\r
-          AlignmentAnnotation aa = new AlignmentAnnotation(\r
-              seq.getName().substring(2), seq.getDescription(),\r
-              anots);\r
-\r
-          annotations.addElement(aa);\r
-        }\r
-\r
-        else if (!firstLine)\r
-        {\r
-\r
-            if (!isValidProteinSequence(sb.toString().toCharArray()))\r
-            {\r
-                throw new IOException(AppletFormatAdapter.INVALID_CHARACTERS\r
-                                      +" : "+seq.getName()\r
-                                      +" : "+invalidCharacter);\r
-            }\r
-\r
-            seq.setSequence(sb.toString());\r
-            seqs.addElement(seq);\r
-        }\r
-    }\r
-\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @param s DOCUMENT ME!\r
-     * @param len DOCUMENT ME!\r
-     * @param gaps DOCUMENT ME!\r
-     * @param displayId DOCUMENT ME!\r
-     *\r
-     * @return DOCUMENT ME!\r
-     */\r
-    public String print(SequenceI[] s)\r
-    {\r
-        int len = 72;\r
-        StringBuffer out = new StringBuffer();\r
-        int i = 0;\r
-\r
-        while ((i < s.length) && (s[i] != null))\r
-        {\r
-            out.append(">" + printId(s[i]));\r
-            if(s[i].getDescription()!=null)\r
-              out.append(" "+s[i].getDescription());\r
-\r
-            out.append("\n");\r
-\r
-            int nochunks = (s[i].getLength() / len) + 1;\r
-\r
-            for (int j = 0; j < nochunks; j++)\r
-            {\r
-                int start = j * len;\r
-                int end = start + len;\r
-\r
-                if (end < s[i].getLength())\r
-                {\r
-                    out.append(s[i].getSequenceAsString(start, end) + "\n");\r
-                }\r
-                else if (start < s[i].getLength())\r
-                {\r
-                    out.append(s[i].getSequenceAsString(start, s[i].getLength()) + "\n");\r
-                }\r
-            }\r
-\r
-            i++;\r
-        }\r
-\r
-        return out.toString();\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @return DOCUMENT ME!\r
-     */\r
-    public String print()\r
-    {\r
-        return print(getSeqsAsArray());\r
-    }\r
-}\r
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9)
+ * Copyright (C) 2015 The Jalview Authors
+ * 
+ * This file is part of Jalview.
+ * 
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License 
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *  
+ * Jalview is distributed in the hope that it will be useful, but 
+ * WITHOUT ANY WARRANTY; without even the implied warranty 
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+ * PURPOSE.  See the GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+package jalview.io;
+
+import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.Annotation;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceI;
+
+import java.io.IOException;
+
+/**
+ * DOCUMENT ME!
+ * 
+ * @author $author$
+ * @version $Revision$
+ */
+public class FastaFile extends AlignFile
+{
+  /**
+   * Length of a sequence line
+   */
+  int len = 72;
+
+  StringBuffer out;
+
+  /**
+   * Creates a new FastaFile object.
+   */
+  public FastaFile()
+  {
+  }
+
+  /**
+   * Creates a new FastaFile object.
+   * 
+   * @param inFile
+   *          DOCUMENT ME!
+   * @param type
+   *          DOCUMENT ME!
+   * 
+   * @throws IOException
+   *           DOCUMENT ME!
+   */
+  public FastaFile(String inFile, String type) throws IOException
+  {
+    super(inFile, type);
+  }
+
+  public FastaFile(FileParse source) throws IOException
+  {
+    super(source);
+  }
+
+  /**
+   * DOCUMENT ME!
+   * 
+   * @throws IOException
+   *           DOCUMENT ME!
+   */
+  public void parse() throws IOException
+  {
+    StringBuffer sb = new StringBuffer();
+    boolean firstLine = true;
+
+    String line, uline;
+    Sequence seq = null;
+
+    boolean annotation = false;
+
+    while ((uline = nextLine()) != null)
+    {
+      line = uline.trim();
+      if (line.length() > 0)
+      {
+        if (line.charAt(0) == '>')
+        {
+          if (line.startsWith(">#_"))
+          {
+            if (annotation)
+            {
+              annotations.addElement(makeAnnotation(seq, sb));
+            }
+          }
+          else
+          {
+            annotation = false;
+          }
+
+          if (!firstLine)
+          {
+            seq.setSequence(sb.toString());
+
+            if (!annotation)
+            {
+              seqs.addElement(seq);
+            }
+          }
+
+          seq = parseId(line.substring(1));
+          firstLine = false;
+
+          sb = new StringBuffer();
+
+          if (line.startsWith(">#_"))
+          {
+            annotation = true;
+          }
+        }
+        else
+        {
+          sb.append(annotation ? uline : line);
+        }
+      }
+    }
+
+    if (annotation)
+    {
+      annotations.addElement(makeAnnotation(seq, sb));
+    }
+
+    else if (!firstLine)
+    {
+      seq.setSequence(sb.toString());
+      seqs.addElement(seq);
+    }
+  }
+
+  private AlignmentAnnotation makeAnnotation(SequenceI seq, StringBuffer sb)
+  {
+    Annotation[] anots = new Annotation[sb.length()];
+    char cb;
+    for (int i = 0; i < anots.length; i++)
+    {
+      char cn = sb.charAt(i);
+      if (cn != ' ')
+      {
+        anots[i] = new Annotation("" + cn, null, ' ', Float.NaN);
+      }
+    }
+    AlignmentAnnotation aa = new AlignmentAnnotation(seq.getName()
+            .substring(2), seq.getDescription(), anots);
+    return aa;
+  }
+
+  /**
+   * called by AppletFormatAdapter to generate an annotated alignment, rather
+   * than bare sequences.
+   * 
+   * @param al
+   */
+  public void addAnnotations(Alignment al)
+  {
+    addProperties(al);
+    for (int i = 0; i < annotations.size(); i++)
+    {
+      AlignmentAnnotation aa = (AlignmentAnnotation) annotations
+              .elementAt(i);
+      aa.setPadGaps(true, al.getGapCharacter());
+      al.addAnnotation(aa);
+    }
+  }
+
+  /**
+   * DOCUMENT ME!
+   * 
+   * @param s
+   *          DOCUMENT ME!
+   * @param len
+   *          DOCUMENT ME!
+   * @param gaps
+   *          DOCUMENT ME!
+   * @param displayId
+   *          DOCUMENT ME!
+   * 
+   * @return DOCUMENT ME!
+   */
+  public String print(SequenceI[] s)
+  {
+    out = new StringBuffer();
+    int i = 0;
+
+    while ((i < s.length) && (s[i] != null))
+    {
+      out.append(">" + printId(s[i]));
+      if (s[i].getDescription() != null)
+      {
+        out.append(" " + s[i].getDescription());
+      }
+
+      out.append(newline);
+
+      int nochunks = (s[i].getLength() / len) + 1;
+
+      for (int j = 0; j < nochunks; j++)
+      {
+        int start = j * len;
+        int end = start + len;
+
+        if (end < s[i].getLength())
+        {
+          out.append(s[i].getSequenceAsString(start, end) + newline);
+        }
+        else if (start < s[i].getLength())
+        {
+          out.append(s[i].getSequenceAsString(start, s[i].getLength())
+                  + newline);
+        }
+      }
+
+      i++;
+    }
+
+    return out.toString();
+  }
+
+  /**
+   * DOCUMENT ME!
+   * 
+   * @return DOCUMENT ME!
+   */
+  public String print()
+  {
+    return print(getSeqsAsArray());
+  }
+}