JAL-1432 updated copyright notices
[jalview.git] / src / jalview / io / FastaFile.java
index 7e7e06b..9cc3b55 100755 (executable)
-/*\r
-* Jalview - A Sequence Alignment Editor and Viewer\r
-* Copyright (C) 2005 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.analysis.*;\r
-\r
-import jalview.datamodel.*;\r
-\r
-import java.io.*;\r
-\r
-import java.util.*;\r
-\r
-\r
-public class FastaFile extends AlignFile {\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
-        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
-            if (line.length() > 0) {\r
-                // Do we have an id line?\r
-                if (line.substring(0, 1).equals(">")) {\r
-                    if (count != 0) {\r
-                        if (sstart != 0) {\r
-                            seqs.addElement(new Sequence(id,\r
-                                    seq.toString().toUpperCase(), sstart, send));\r
-                        } else {\r
-                            seqs.addElement(new Sequence(id,\r
-                                    seq.toString().toUpperCase(), 1,\r
-                                    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
-                    com.stevesoft.pat.Regex dbId = new com.stevesoft.pat.Regex(\r
-                            "[A-Za-z-]+/[A-Za-z-]+\\|(\\w+)\\|(.+)");\r
-\r
-                    if (dbId.search(id)) {\r
-                        String dbid = dbId.stringMatched(1);\r
-                        String idname = dbId.stringMatched(2);\r
-\r
-                        if ((idname.length() > 0) &&\r
-                                (idname.indexOf("_") > -1)) {\r
-                            id = idname; // just use friendly name // JBPNote: we may lose uniprot standardised ID here.\r
-                        } else {\r
-                            id = dbid; // use dbid to ensure sensible queries\r
-                        }\r
-                    }\r
-\r
-                    if (id.indexOf("/") > 0) {\r
-                        StringTokenizer st = new StringTokenizer(id, "/");\r
-\r
-                        if (st.countTokens() == 2) {\r
-                            id = st.nextToken();\r
-\r
-                            String tmp = st.nextToken();\r
-\r
-                            st = new StringTokenizer(tmp, "-");\r
-\r
-                            if (st.countTokens() == 2) {\r
-                                sstart = Integer.valueOf(st.nextToken())\r
-                                                .intValue();\r
-                                send = Integer.valueOf(st.nextToken()).intValue();\r
-                            }\r
-                        }\r
-                    }\r
-\r
-                    seq = new StringBuffer();\r
-                } else {\r
-                    seq = seq.append(line);\r
-                }\r
-            }\r
-        }\r
-\r
-        if (count > 0) {\r
-            if (!isValidProteinSequence(seq.toString().toUpperCase())) {\r
-                throw new IOException("Invalid protein sequence");\r
-            }\r
-\r
-            if (sstart != 0) {\r
-                seqs.addElement(new Sequence(id, seq.toString().toUpperCase(),\r
-                        sstart, send));\r
-            } else {\r
-                seqs.addElement(new Sequence(id, seq.toString().toUpperCase(),\r
-                        1, seq.length()));\r
-            }\r
-        }\r
-    }\r
-\r
-    public static String print(SequenceI[] s) {\r
-        return print(s, 72);\r
-    }\r
-\r
-    public static String print(SequenceI[] s, int len) {\r
-        return print(s, len, true);\r
-    }\r
-\r
-    public static String print(SequenceI[] s, int len, boolean gaps) {\r
-        return print(s, len, gaps, true);\r
-    }\r
-\r
-    public static String print(SequenceI[] s, int len, boolean gaps,\r
-        boolean displayId) {\r
-        StringBuffer out = new StringBuffer();\r
-        int i = 0;\r
-\r
-        while ((i < s.length) && (s[i] != null)) {\r
-            String seq = "";\r
-\r
-            if (gaps) {\r
-                seq = s[i].getSequence();\r
-            } else {\r
-                seq = AlignSeq.extractGaps("-. ", s[i].getSequence());\r
-            }\r
-\r
-            // used to always put this here: + "/" + s[i].getStart() + "-" + s[i].getEnd() +\r
-            out.append(">" +\r
-                ((displayId) ? s[i].getDisplayId() : s[i].getName()) + "\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
-\r
-            i++;\r
-        }\r
-\r
-        return out.toString();\r
-    }\r
-\r
-    public String print() {\r
-        return print(getSeqsAsArray());\r
-    }\r
-}\r
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1)
+ * Copyright (C) 2014 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 java.io.*;
+
+import jalview.datamodel.*;
+
+/**
+ * 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;
+    Sequence seq = null;
+
+    boolean annotation = false;
+
+    while ((line = nextLine()) != null)
+    {
+      line = line.trim();
+      if (line.length() > 0)
+      {
+        if (line.charAt(0) == '>')
+        {
+          if (line.startsWith(">#_"))
+          {
+            if (annotation)
+            {
+              Annotation[] anots = new Annotation[sb.length()];
+              String anotString = sb.toString();
+              for (int i = 0; i < sb.length(); i++)
+              {
+                anots[i] = new Annotation(anotString.substring(i, i + 1),
+                        null, ' ', 0);
+              }
+              AlignmentAnnotation aa = new AlignmentAnnotation(seq
+                      .getName().substring(2), seq.getDescription(), anots);
+
+              annotations.addElement(aa);
+            }
+          }
+          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(line);
+        }
+      }
+    }
+
+    if (annotation)
+    {
+      Annotation[] anots = new Annotation[sb.length()];
+      String anotString = sb.toString();
+      for (int i = 0; i < sb.length(); i++)
+      {
+        anots[i] = new Annotation(anotString.substring(i, i + 1), null,
+                ' ', 0);
+      }
+      AlignmentAnnotation aa = new AlignmentAnnotation(seq.getName()
+              .substring(2), seq.getDescription(), anots);
+
+      annotations.addElement(aa);
+    }
+
+    else if (!firstLine)
+    {
+      seq.setSequence(sb.toString());
+      seqs.addElement(seq);
+    }
+  }
+
+  /**
+   * 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());
+  }
+}