JAL-1645 Version-Rel Version 2.9 Year-Rel 2015 Licensing glob
[jalview.git] / src / jalview / io / FastaFile.java
index 28109d5..2801ac4 100755 (executable)
-package jalview.io;\r
-\r
-import jalview.datamodel.*;\r
-import jalview.analysis.*;\r
-\r
-import java.io.*;\r
-import java.util.*;\r
-\r
-public class FastaFile extends AlignFile {\r
-\r
-  public FastaFile()\r
-  {}\r
-\r
-  public FastaFile(String inStr) {\r
-    super(inStr);\r
-  }\r
-\r
-  public FastaFile(String inFile, String type) throws IOException {\r
-    super(inFile,type);\r
-  }\r
-\r
-  public void parse() throws IOException\r
-  {\r
-\r
-    String       id    = "";\r
-    StringBuffer seq   = new StringBuffer();\r
-    int          count = 0;\r
-    boolean      flag  = false;\r
-\r
-    int          sstart = 0;\r
-    int          send   = 0;\r
-\r
-    String line;\r
-\r
-      while ((line = nextLine()) != null) {\r
-\r
-       if (line.length() > 0) {\r
-\r
-         // Do we have an id line?\r
-\r
-         if (line.substring(0,1).equals(">")) {\r
-\r
-           if (count != 0) {\r
-             if (sstart != 0) {\r
-               seqs.addElement(new Sequence(id,seq.toString().toUpperCase(),sstart,send));\r
-             } else {\r
-               seqs.addElement(new Sequence(id,seq.toString().toUpperCase(),1,seq.length()));\r
-             }\r
-           }\r
-\r
-           count++;\r
-\r
-           StringTokenizer str = new StringTokenizer(line," ");\r
-\r
-           id = str.nextToken();\r
-           id = id.substring(1);\r
-\r
-           if (id.indexOf("/") > 0 ) {\r
-\r
-             StringTokenizer st = new StringTokenizer(id,"/");\r
-             if (st.countTokens() == 2) {\r
-               id = st.nextToken();\r
-               String tmp = st.nextToken();\r
-\r
-               st = new StringTokenizer(tmp,"-");\r
-\r
-               if (st.countTokens() == 2) {\r
-                 sstart = Integer.valueOf(st.nextToken()).intValue();\r
-                 send   = Integer.valueOf(st.nextToken()).intValue();\r
-               }\r
-             }\r
-           }\r
-\r
-           seq = new StringBuffer();\r
-\r
-         } else {\r
-           seq = seq.append(line);\r
-         }\r
-       }\r
-      }\r
-      if (count > 0) {\r
-\r
-        if(!isValidProteinSequence(seq.toString().toUpperCase()))\r
-          throw new IOException("Invalid protein sequence");\r
-\r
-       if (sstart != 0) {\r
-         seqs.addElement(new Sequence(id,seq.toString().toUpperCase(),sstart,send));\r
-       } else {\r
-         seqs.addElement(new Sequence(id,seq.toString().toUpperCase(),1,seq.length()));\r
-       }\r
-      }\r
-\r
-  }\r
-\r
-  public static String print(SequenceI[] s) {\r
-    return print(s,72);\r
-  }\r
-  public static String print(SequenceI[] s, int len) {\r
-    return print(s,len,true);\r
-  }\r
-  public static String print(SequenceI[] s, int len,boolean gaps) {\r
-    StringBuffer out = new StringBuffer();\r
-    int i = 0;\r
-    while (i < s.length && s[i] != null) {\r
-      String seq = "";\r
-      if (gaps) {\r
-        seq = s[i].getSequence();\r
-      } else {\r
-        seq = AlignSeq.extractGaps(s[i].getSequence(),"-");\r
-        seq = AlignSeq.extractGaps(seq,".");\r
-        seq = AlignSeq.extractGaps(seq," ");\r
-      }\r
-\r
-      out.append(">" + s[i].getName() + "/" + s[i].getStart() + "-" + s[i].getEnd() + "\n");\r
-\r
-      int nochunks = seq.length() / len + 1;\r
-\r
-      for (int j = 0; j < nochunks; j++) {\r
-        int start = j*len;\r
-        int end = start + len;\r
-\r
-        if (end < seq.length()) {\r
-          out.append(seq.substring(start,end) + "\n");\r
-        } else if (start < seq.length()) {\r
-          out.append(seq.substring(start) + "\n");\r
-        }\r
-      }\r
-      i++;\r
-    }\r
-    return out.toString();\r
-  }\r
-\r
-  public String print() {\r
-    return print(getSeqsAsArray());\r
-  }\r
-}\r
-\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());
+  }
+}