update author list in license for (JAL-826)
[jalview.git] / src / jalview / io / JPredFile.java
index 6dcbccd..396847d 100755 (executable)
@@ -1,22 +1,20 @@
 /*
- * 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
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
+ * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle
+ * 
+ * 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/>.
  */
-
 /**
  * PredFile.java
  * JalviewX / Vamsas Project
@@ -30,44 +28,60 @@ import java.util.*;
 import jalview.datamodel.*;
 
 /**
- * Parser for the JPred/JNet concise format. This is a series of CSV lines,
- * each line is either a sequence (QUERY), a sequence profile (align;), or
- * jnet prediction annotation (anything else). 
- * Automagic translation happens for annotation called 'JNETPRED' (translated to Secondary Structure Prediction), or 'JNETCONF' (translates to 'Prediction Confidence').
- * Numeric scores are differentiated from symbolic by being parseable into a float vector. They are put in Scores.
- * Symscores gets the others.
- * JNetAnnotationMaker translates the data parsed by this object into annotation on an alignment. It is automatically called
- * but can be used to transfer the annotation onto a sequence in another alignment (and insert gaps where necessary)
+ * Parser for the JPred/JNet concise format. This is a series of CSV lines, each
+ * line is either a sequence (QUERY), a sequence profile (align;), or jnet
+ * prediction annotation (anything else). Automagic translation happens for
+ * annotation called 'JNETPRED' (translated to Secondary Structure Prediction),
+ * or 'JNETCONF' (translates to 'Prediction Confidence'). Numeric scores are
+ * differentiated from symbolic by being parseable into a float vector. They are
+ * put in Scores. Symscores gets the others. JNetAnnotationMaker translates the
+ * data parsed by this object into annotation on an alignment. It is
+ * automatically called but can be used to transfer the annotation onto a
+ * sequence in another alignment (and insert gaps where necessary)
+ * 
  * @author jprocter
  * @version $Revision$
  */
-public class JPredFile
-    extends AlignFile
+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
+
+  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!
+   * 
+   * @param inFile
+   *          DOCUMENT ME!
+   * @param type
+   *          DOCUMENT ME!
+   * 
+   * @throws IOException
+   *           DOCUMENT ME!
    */
-  public JPredFile(String inFile, String type)
-      throws IOException
+  public JPredFile(String inFile, String type) throws IOException
   {
     super(inFile, type);
   }
 
+  public JPredFile(FileParse source) throws IOException
+  {
+    super(source);
+  }
+
   /**
    * DOCUMENT ME!
-   *
-   * @param QuerySeqPosition DOCUMENT ME!
+   * 
+   * @param QuerySeqPosition
+   *          DOCUMENT ME!
    */
   public void setQuerySeqPosition(int QuerySeqPosition)
   {
@@ -76,7 +90,7 @@ public class JPredFile
 
   /**
    * DOCUMENT ME!
-   *
+   * 
    * @return DOCUMENT ME!
    */
   public int getQuerySeqPosition()
@@ -86,7 +100,7 @@ public class JPredFile
 
   /**
    * DOCUMENT ME!
-   *
+   * 
    * @return DOCUMENT ME!
    */
   public Hashtable getScores()
@@ -96,7 +110,7 @@ public class JPredFile
 
   /**
    * DOCUMENT ME!
-   *
+   * 
    * @return DOCUMENT ME!
    */
   public Hashtable getSymscores()
@@ -118,8 +132,7 @@ public class JPredFile
   /**
    * parse a JPred concise file into a sequence-alignment like object.
    */
-  public void parse()
-      throws IOException
+  public void parse() throws IOException
   {
     // JBPNote log.System.out.println("all read in ");
     String line;
@@ -130,7 +143,7 @@ public class JPredFile
     Vector ids = new Vector();
     Hashtable Symscores = new Hashtable();
 
-    while ( (line = nextLine()) != null)
+    while ((line = nextLine()) != null)
     {
       // Concise format allows no comments or non comma-formatted data
       StringTokenizer str = new StringTokenizer(line, ":");
@@ -183,12 +196,11 @@ public class JPredFile
             ascore = symbols.nextToken();
 
             Float score = new Float(ascore);
-            scores.addElement( (Object) score);
+            scores.addElement((Object) score);
           }
 
           Scores.put(id, scores);
-        }
-        catch (Exception e)
+        } catch (Exception e)
         {
           // or just keep them as strings
           i = scores.size();
@@ -196,15 +208,15 @@ public class JPredFile
           for (int j = 0; j < i; j++)
           {
             scores.setElementAt(
-                (Object) ( (Float) scores.elementAt(j)).toString(), j);
+                    (Object) ((Float) scores.elementAt(j)).toString(), j);
           }
 
-          scores.addElement( (Object) ascore);
+          scores.addElement((Object) ascore);
 
           while (symbols.hasMoreTokens())
           {
             ascore = symbols.nextToken();
-            scores.addElement( (Object) ascore);
+            scores.addElement((Object) ascore);
           }
 
           Scores.put(id, scores);
@@ -243,7 +255,7 @@ public class JPredFile
             name = id.substring(id.indexOf(";") + 1) + "_" + ++i;
           }
 
-          if (QuerySeqPosition==-1)
+          if (QuerySeqPosition == -1)
             QuerySeqPosition = ids.size();
           ids.addElement(name);
           noSeqs++;
@@ -257,17 +269,15 @@ public class JPredFile
 
           seq_entries.addElement(newseq.toString());
           ids.addElement(id);
-          Symscores.put( (Object) id,
-                        (Object)new Integer(ids.size() - 1));
+          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!");
-             }*/
+    /*
+     * 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();
 
@@ -275,49 +285,56 @@ public class JPredFile
     {
       // 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());
+              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");
+        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))
+      if ((newSeq.getName().startsWith("QUERY") || newSeq.getName()
+              .startsWith("align;")) && (QuerySeqPosition == -1))
       {
         QuerySeqPosition = seqs.size();
       }
 
       seqs.addElement(newSeq);
     }
-    if (seqs.size()>0)
+    if (seqs.size() > 0 && QuerySeqPosition > -1)
     {
-      // try to make annotation for a prediction only input (default if no alignment is given)
+      // try to make annotation for a prediction only input (default if no
+      // alignment is given and prediction contains a QUERY or align;sequence_id
+      // line)
       Alignment tal = new Alignment(this.getSeqsAsArray());
-      try {
-        JnetAnnotationMaker.add_annotation(this, tal, QuerySeqPosition, true);
+      try
+      {
+        JnetAnnotationMaker.add_annotation(this, tal, QuerySeqPosition,
+                true);
       } catch (Exception e)
       {
         tal = null;
-        IOException ex = new IOException("Couldn't parse concise annotation for prediction profile. ("+e.getMessage()+")");
-        ex.setStackTrace(e.getStackTrace());
+        IOException ex = new IOException(
+                "Couldn't parse concise annotation for prediction profile.\n"
+                        + e);
+        e.printStackTrace(); // java 1.1 does not have :
+                             // ex.setStackTrace(e.getStackTrace());
         throw ex;
       }
       this.annotations = new Vector();
       AlignmentAnnotation[] aan = tal.getAlignmentAnnotation();
-      for (int aai = 0; aan!=null && aai<aan.length; aai++)
+      for (int aai = 0; aan != null && aai < aan.length; aai++)
       {
         annotations.addElement(aan[aai]);
       }
-    } 
+    }
   }
 
   /**
    * print
-   *
+   * 
    * @return String
    */
   public String print()
@@ -327,8 +344,9 @@ public class JPredFile
 
   /**
    * DOCUMENT ME!
-   *
-   * @param args DOCUMENT ME!
+   * 
+   * @param args
+   *          DOCUMENT ME!
    */
   public static void main(String[] args)
   {
@@ -338,13 +356,12 @@ public class JPredFile
 
       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");
+        System.out.println(((Sequence) blc.seqs.elementAt(i)).getName()
+                + "\n"
+                + ((Sequence) blc.seqs.elementAt(i)).getSequenceAsString()
+                + "\n");
       }
-    }
-    catch (java.io.IOException e)
+    } catch (java.io.IOException e)
     {
       System.err.println("Exception " + e);
       // e.printStackTrace(); not java 1.1 compatible!
@@ -352,6 +369,7 @@ public class JPredFile
   }
 
   Vector annotSeqs = null;
+
   /**
    * removeNonSequences
    */
@@ -389,46 +407,25 @@ public class JPredFile
 }
 
 /*
- 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);
-  }
- }
-
- }
+ * 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); } } }
  */