better vamsas tree io (for when there are no nodemappings)
[jalview.git] / src / jalview / io / JPredFile.java
index cadf153..dabd47a 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
-\r
-/**\r
- * PredFile.java\r
- * JalviewX / Vamsas Project\r
- * JPred.seq.concise reader\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 JPredFile extends AlignFile\r
-{\r
-    Vector ids;\r
-    Vector conf;\r
-    Hashtable Scores; // Hash of names and score vectors\r
-    Hashtable Symscores; // indexes of symbol annotation properties in sequenceI vector\r
-    private int QuerySeqPosition;\r
-\r
-    /**\r
-     * Creates a new JPredFile object.\r
-     *\r
-     * @param inStr DOCUMENT ME!\r
-     */\r
-    public JPredFile(String inStr)\r
-    {\r
-        super(inStr);\r
-    }\r
-\r
-    /**\r
-     * Creates a new JPredFile object.\r
-     *\r
-     * @param inFile DOCUMENT ME!\r
-     * @param type DOCUMENT ME!\r
-     *\r
-     * @throws IOException DOCUMENT ME!\r
-     */\r
-    public JPredFile(String inFile, String type) throws IOException\r
-    {\r
-        super(inFile, type);\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @param QuerySeqPosition DOCUMENT ME!\r
-     */\r
-    public void setQuerySeqPosition(int QuerySeqPosition)\r
-    {\r
-        this.QuerySeqPosition = QuerySeqPosition;\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @return DOCUMENT ME!\r
-     */\r
-    public int getQuerySeqPosition()\r
-    {\r
-        return QuerySeqPosition;\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @return DOCUMENT ME!\r
-     */\r
-    public Hashtable getScores()\r
-    {\r
-        return Scores;\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @return DOCUMENT ME!\r
-     */\r
-    public Hashtable getSymscores()\r
-    {\r
-        return Symscores;\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     */\r
-    public void initData()\r
-    {\r
-        super.initData();\r
-        Scores = new Hashtable();\r
-        ids = null;\r
-        conf = null;\r
-    }\r
-\r
-    /**\r
- * parse a JPred concise file into a sequence-alignment like object.\r
- */\r
-    public void parse() throws IOException\r
-    {\r
-        // JBPNote log.System.out.println("all read in ");\r
-        String line;\r
-        QuerySeqPosition = -1;\r
-        noSeqs = 0;\r
-\r
-        Vector seq_entries = new Vector();\r
-        Vector ids = new Vector();\r
-        Hashtable Symscores = new Hashtable();\r
-\r
-        while ((line = nextLine()) != null)\r
-        {\r
-            // Concise format allows no comments or non comma-formatted data\r
-            StringTokenizer str = new StringTokenizer(line, ":");\r
-            String id = "";\r
-\r
-            if (!str.hasMoreTokens())\r
-            {\r
-                continue;\r
-            }\r
-\r
-            id = str.nextToken();\r
-\r
-            String seqsym = str.nextToken();\r
-            StringTokenizer symbols = new StringTokenizer(seqsym, ",");\r
-\r
-            // decide if we have more than just alphanumeric symbols\r
-            int numSymbols = symbols.countTokens();\r
-\r
-            if (numSymbols == 0)\r
-            {\r
-                continue;\r
-            }\r
-\r
-            if (seqsym.length() != (2 * numSymbols))\r
-            {\r
-                // Set of scalars for some property\r
-                if (Scores.containsKey(id))\r
-                {\r
-                    int i = 1;\r
-\r
-                    while (Scores.containsKey(id + "_" + i))\r
-                    {\r
-                        i++;\r
-                    }\r
-\r
-                    id = id + "_" + i;\r
-                }\r
-\r
-                Vector scores = new Vector();\r
-\r
-                // Typecheck from first entry\r
-                int i = 0;\r
-                String ascore = "dead";\r
-\r
-                try\r
-                {\r
-                    // store elements as floats...\r
-                    while (symbols.hasMoreTokens())\r
-                    {\r
-                        ascore = symbols.nextToken();\r
-\r
-                        Float score = new Float(ascore);\r
-                        scores.addElement((Object) score);\r
-                    }\r
-\r
-                    Scores.put(id, scores);\r
-                }\r
-                catch (Exception e)\r
-                {\r
-                    // or just keep them as strings\r
-                    i = scores.size();\r
-\r
-                    for (int j = 0; j < i; j++)\r
-                    {\r
-                        scores.set(j,\r
-                            (Object) ((Float) scores.get(j)).toString());\r
-                    }\r
-\r
-                    scores.addElement((Object) ascore);\r
-\r
-                    while (symbols.hasMoreTokens())\r
-                    {\r
-                        ascore = symbols.nextToken();\r
-                        scores.addElement((Object) ascore);\r
-                    }\r
-\r
-                    Scores.put(id, scores);\r
-                }\r
-            }\r
-            else if (id.equals("jnetconf"))\r
-            {\r
-                // log.debug System.out.println("here");\r
-                id = "Prediction Confidence";\r
-                this.conf = new Vector(numSymbols);\r
-\r
-                for (int i = 0; i < numSymbols; i++)\r
-                {\r
-                    conf.set(i, (Object) symbols.nextToken());\r
-                }\r
-            }\r
-            else\r
-            {\r
-                // Sequence or a prediction string (rendered as sequence)\r
-                StringBuffer newseq = new StringBuffer();\r
-\r
-                for (int i = 0; i < numSymbols; i++)\r
-                {\r
-                    newseq.append(symbols.nextToken());\r
-                }\r
-\r
-                if (id.indexOf(";") > -1)\r
-                {\r
-                    seq_entries.addElement(newseq);\r
-\r
-                    int i = 1;\r
-                    String name = id.substring(id.indexOf(";") + 1);\r
-\r
-                    while (ids.lastIndexOf(name) > -1)\r
-                    {\r
-                        name = id.substring(id.indexOf(";") + 1) + "_" + ++i;\r
-                    }\r
-\r
-                    ids.addElement(name);\r
-\r
-                    noSeqs++;\r
-                }\r
-                else\r
-                {\r
-                    if (id.equals("JNETPRED"))\r
-                    {\r
-                        id = "Predicted Secondary Structure";\r
-                    }\r
-\r
-                    seq_entries.addElement(newseq.toString());\r
-                    ids.addElement(id);\r
-                    Symscores.put((Object) id,\r
-                        (Object) new Integer(ids.size() - 1));\r
-                }\r
-            }\r
-        }\r
-\r
-        if (noSeqs < 1)\r
-        {\r
-            throw new IOException(\r
-                "JpredFile Parser: No sequence in the prediction!");\r
-        }\r
-\r
-        maxLength = seq_entries.elementAt(0).toString().length();\r
-\r
-        for (int i = 0; i < ids.size(); i++)\r
-        {\r
-            // Add all sequence like objects\r
-            Sequence newSeq = new Sequence(ids.elementAt(i).toString(),\r
-                    seq_entries.elementAt(i).toString(), 1,\r
-                    seq_entries.elementAt(i).toString().length());\r
-\r
-            if (!Symscores.containsKey(ids.elementAt(i)) &&\r
-                    !isValidProteinSequence(newSeq.getSequence()))\r
-            {\r
-                throw new IOException(\r
-                    "JPredConcise: Not a valid protein sequence - (" +\r
-                    ids.elementAt(i).toString() + ")");\r
-            }\r
-\r
-            if (maxLength != seq_entries.elementAt(i).toString().length())\r
-            {\r
-                throw new IOException("JPredConcise: Entry (" +\r
-                    ids.elementAt(i).toString() +\r
-                    ") has an unexpected number of columns");\r
-            }\r
-\r
-            if (newSeq.getName().startsWith("QUERY") &&\r
-                    (QuerySeqPosition == -1))\r
-            {\r
-                QuerySeqPosition = seqs.size();\r
-            }\r
-\r
-            seqs.addElement(newSeq);\r
-        }\r
-    }\r
-\r
-    /**\r
- * print\r
- *\r
- * @return String\r
-   */\r
-    public String print()\r
-    {\r
-        return "Not Supported";\r
-    }\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @param args DOCUMENT ME!\r
-     */\r
-    public static void main(String[] args)\r
-    {\r
-        try\r
-        {\r
-            JPredFile blc = new JPredFile(args[0], "File");\r
-\r
-            for (int i = 0; i < blc.seqs.size(); i++)\r
-            {\r
-                System.out.println(((Sequence) blc.seqs.elementAt(i)).getName() +\r
-                    "\n" + ((Sequence) blc.seqs.elementAt(i)).getSequence() +\r
-                    "\n");\r
-            }\r
-        }\r
-        catch (java.io.IOException e)\r
-        {\r
-            System.err.println("Exception " + e);\r
-            e.printStackTrace();\r
-        }\r
-    }\r
-}\r
-\r
-\r
-/*\r
- StringBuffer out = new StringBuffer();\r
-\r
- out.append("START PRED\n");\r
- for (int i = 0; i < s[0].sequence.length(); i++)\r
- {\r
-  out.append(s[0].sequence.substring(i, i + 1) + " ");\r
-  out.append(s[1].sequence.substring(i, i + 1) + " ");\r
-  out.append(s[1].score[0].elementAt(i) + " ");\r
-  out.append(s[1].score[1].elementAt(i) + " ");\r
-  out.append(s[1].score[2].elementAt(i) + " ");\r
-  out.append(s[1].score[3].elementAt(i) + " ");\r
-\r
-  out.append("\n");\r
- }\r
- out.append("END PRED\n");\r
- return out.toString();\r
- }\r
-\r
-    public static void main(String[] args)\r
- {\r
-  try\r
-  {\r
-    BLCFile blc = new BLCFile(args[0], "File");\r
-    DrawableSequence[] s = new DrawableSequence[blc.seqs.size()];\r
-    for (int i = 0; i < blc.seqs.size(); i++)\r
-    {\r
-      s[i] = new DrawableSequence( (Sequence) blc.seqs.elementAt(i));\r
-    }\r
-    String out = BLCFile.print(s);\r
-\r
-    AlignFrame af = new AlignFrame(null, s);\r
-    af.resize(700, 500);\r
-    af.show();\r
-    System.out.println(out);\r
-  }\r
-  catch (java.io.IOException e)\r
-  {\r
-    System.out.println("Exception " + e);\r
-  }\r
- }\r
-\r
- }\r
- */\r
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer
+ * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ *
+ * This program 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 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+/**
+ * PredFile.java
+ * JalviewX / Vamsas Project
+ * JPred.seq.concise reader
+ */
+package jalview.io;
+
+import java.io.*;
+import java.util.*;
+
+import jalview.datamodel.*;
+
+/**
+ * DOCUMENT ME!
+ *
+ * @author $author$
+ * @version $Revision$
+ */
+public class JPredFile
+    extends AlignFile
+{
+  Vector ids;
+  Vector conf;
+  Hashtable Scores; // Hash of names and score vectors
+  Hashtable Symscores; // indexes of symbol annotation properties in sequenceI vector
+  private int QuerySeqPosition;
+
+  /**
+   * Creates a new JPredFile object.
+   *
+   * @param inFile DOCUMENT ME!
+   * @param type DOCUMENT ME!
+   *
+   * @throws IOException DOCUMENT ME!
+   */
+  public JPredFile(String inFile, String type)
+      throws IOException
+  {
+    super(inFile, type);
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param QuerySeqPosition DOCUMENT ME!
+   */
+  public void setQuerySeqPosition(int QuerySeqPosition)
+  {
+    this.QuerySeqPosition = QuerySeqPosition;
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public int getQuerySeqPosition()
+  {
+    return QuerySeqPosition;
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public Hashtable getScores()
+  {
+    return Scores;
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public Hashtable getSymscores()
+  {
+    return Symscores;
+  }
+
+  /**
+   * DOCUMENT ME!
+   */
+  public void initData()
+  {
+    super.initData();
+    Scores = new Hashtable();
+    ids = null;
+    conf = null;
+  }
+
+  /**
+   * parse a JPred concise file into a sequence-alignment like object.
+   */
+  public void parse()
+      throws IOException
+  {
+    // JBPNote log.System.out.println("all read in ");
+    String line;
+    QuerySeqPosition = -1;
+    noSeqs = 0;
+
+    Vector seq_entries = new Vector();
+    Vector ids = new Vector();
+    Hashtable Symscores = new Hashtable();
+
+    while ( (line = nextLine()) != null)
+    {
+      // Concise format allows no comments or non comma-formatted data
+      StringTokenizer str = new StringTokenizer(line, ":");
+      String id = "";
+
+      if (!str.hasMoreTokens())
+      {
+        continue;
+      }
+
+      id = str.nextToken();
+
+      String seqsym = str.nextToken();
+      StringTokenizer symbols = new StringTokenizer(seqsym, ",");
+
+      // decide if we have more than just alphanumeric symbols
+      int numSymbols = symbols.countTokens();
+
+      if (numSymbols == 0)
+      {
+        continue;
+      }
+
+      if (seqsym.length() != (2 * numSymbols))
+      {
+        // Set of scalars for some property
+        if (Scores.containsKey(id))
+        {
+          int i = 1;
+
+          while (Scores.containsKey(id + "_" + i))
+          {
+            i++;
+          }
+
+          id = id + "_" + i;
+        }
+
+        Vector scores = new Vector();
+
+        // Typecheck from first entry
+        int i = 0;
+        String ascore = "dead";
+
+        try
+        {
+          // store elements as floats...
+          while (symbols.hasMoreTokens())
+          {
+            ascore = symbols.nextToken();
+
+            Float score = new Float(ascore);
+            scores.addElement( (Object) score);
+          }
+
+          Scores.put(id, scores);
+        }
+        catch (Exception e)
+        {
+          // or just keep them as strings
+          i = scores.size();
+
+          for (int j = 0; j < i; j++)
+          {
+            scores.setElementAt(
+                (Object) ( (Float) scores.elementAt(j)).toString(), j);
+          }
+
+          scores.addElement( (Object) ascore);
+
+          while (symbols.hasMoreTokens())
+          {
+            ascore = symbols.nextToken();
+            scores.addElement( (Object) ascore);
+          }
+
+          Scores.put(id, scores);
+        }
+      }
+      else if (id.equals("jnetconf"))
+      {
+        // log.debug System.out.println("here");
+        id = "Prediction Confidence";
+        this.conf = new Vector(numSymbols);
+
+        for (int i = 0; i < numSymbols; i++)
+        {
+          conf.setElementAt(symbols.nextToken(), i);
+        }
+      }
+      else
+      {
+        // Sequence or a prediction string (rendered as sequence)
+        StringBuffer newseq = new StringBuffer();
+
+        for (int i = 0; i < numSymbols; i++)
+        {
+          newseq.append(symbols.nextToken());
+        }
+
+        if (id.indexOf(";") > -1)
+        {
+          seq_entries.addElement(newseq);
+
+          int i = 1;
+          String name = id.substring(id.indexOf(";") + 1);
+
+          while (ids.lastIndexOf(name) > -1)
+          {
+            name = id.substring(id.indexOf(";") + 1) + "_" + ++i;
+          }
+
+          if (QuerySeqPosition==-1)
+            QuerySeqPosition = ids.size();
+          ids.addElement(name);
+          noSeqs++;
+        }
+        else
+        {
+          if (id.equals("JNETPRED"))
+          {
+            id = "Predicted Secondary Structure";
+          }
+
+          seq_entries.addElement(newseq.toString());
+          ids.addElement(id);
+          Symscores.put( (Object) id,
+                        (Object)new Integer(ids.size() - 1));
+        }
+      }
+    }
+    /* leave it to the parser user to actually check this.
+             if (noSeqs < 1)
+             {
+        throw new IOException(
+            "JpredFile Parser: No sequence in the prediction!");
+             }*/
+
+    maxLength = seq_entries.elementAt(0).toString().length();
+
+    for (int i = 0; i < ids.size(); i++)
+    {
+      // Add all sequence like objects
+      Sequence newSeq = new Sequence(ids.elementAt(i).toString(),
+                                     seq_entries.elementAt(i).toString(), 1,
+                                     seq_entries.elementAt(i).toString().length());
+
+      if (maxLength != seq_entries.elementAt(i).toString().length())
+      {
+        throw new IOException("JPredConcise: Entry (" +
+                              ids.elementAt(i).toString() +
+                              ") has an unexpected number of columns");
+      }
+
+      if ((newSeq.getName().startsWith("QUERY") || newSeq.getName().startsWith("align;"))&&
+          (QuerySeqPosition == -1))
+      {
+        QuerySeqPosition = seqs.size();
+      }
+
+      seqs.addElement(newSeq);
+    }
+  }
+
+  /**
+   * print
+   *
+   * @return String
+   */
+  public String print()
+  {
+    return "Not Supported";
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param args DOCUMENT ME!
+   */
+  public static void main(String[] args)
+  {
+    try
+    {
+      JPredFile blc = new JPredFile(args[0], "File");
+
+      for (int i = 0; i < blc.seqs.size(); i++)
+      {
+        System.out.println( ( (Sequence) blc.seqs.elementAt(i)).getName() +
+                           "\n" +
+                           ( (Sequence) blc.seqs.elementAt(i)).getSequenceAsString() +
+                           "\n");
+      }
+    }
+    catch (java.io.IOException e)
+    {
+      System.err.println("Exception " + e);
+      e.printStackTrace();
+    }
+  }
+
+  Vector annotSeqs = null;
+  /**
+   * removeNonSequences
+   */
+  public void removeNonSequences()
+  {
+    if (annotSeqs != null)
+    {
+      return;
+    }
+    annotSeqs = new Vector();
+    Vector newseqs = new Vector();
+    int i = 0;
+    int j = seqs.size();
+    for (; i < QuerySeqPosition; i++)
+    {
+      annotSeqs.addElement(seqs.elementAt(i));
+    }
+    // check that no stray annotations have been added at the end.
+    {
+      SequenceI sq = (SequenceI) seqs.elementAt(j - 1);
+      if (sq.getName().toUpperCase().startsWith("JPRED"))
+      {
+        annotSeqs.addElement(sq);
+        seqs.removeElementAt(--j);
+      }
+    }
+    for (; i < j; i++)
+    {
+      newseqs.addElement(seqs.elementAt(i));
+    }
+
+    seqs.removeAllElements();
+    seqs = newseqs;
+  }
+}
+
+/*
+ StringBuffer out = new StringBuffer();
+
+ out.append("START PRED\n");
+ for (int i = 0; i < s[0].sequence.length(); i++)
+ {
+  out.append(s[0].sequence.substring(i, i + 1) + " ");
+  out.append(s[1].sequence.substring(i, i + 1) + " ");
+  out.append(s[1].score[0].elementAt(i) + " ");
+  out.append(s[1].score[1].elementAt(i) + " ");
+  out.append(s[1].score[2].elementAt(i) + " ");
+  out.append(s[1].score[3].elementAt(i) + " ");
+
+  out.append("\n");
+ }
+ out.append("END PRED\n");
+ return out.toString();
+ }
+
+    public static void main(String[] args)
+ {
+  try
+  {
+    BLCFile blc = new BLCFile(args[0], "File");
+    DrawableSequence[] s = new DrawableSequence[blc.seqs.size()];
+    for (int i = 0; i < blc.seqs.size(); i++)
+    {
+      s[i] = new DrawableSequence( (Sequence) blc.seqs.elementAt(i));
+    }
+    String out = BLCFile.print(s);
+
+    AlignFrame af = new AlignFrame(null, s);
+    af.resize(700, 500);
+    af.show();
+    System.out.println(out);
+  }
+  catch (java.io.IOException e)
+  {
+    System.out.println("Exception " + e);
+  }
+ }
+
+ }
+ */