timings and memory usage for reading in a file
[jalview.git] / src / jalview / io / AppletFormatAdapter.java
index 9da144a..d9b0b55 100755 (executable)
  */
 package jalview.io;
 
+import java.io.File;
+
 import jalview.datamodel.*;
 
 /**
- * DOCUMENT ME!
+ * A low level class for alignment and feature IO
+ * with alignment formatting methods used by both applet 
+ * and application for generating flat alignment files.
+ * It also holds the lists of magic format names
+ * that the applet and application will allow the user to read or write files with.
  *
  * @author $author$
  * @version $Revision$
  */
 public class AppletFormatAdapter
 {
-  /** DOCUMENT ME!! */
+  /** 
+   * List of valid format strings used in the isValidFormat method 
+   */
   public static final String[] READABLE_FORMATS = new String[]
       {
       "BLC", "CLUSTAL", "FASTA", "MSF", "PileUp", "PIR", "PFAM", "STH", "PDB", "JnetFile"
   };
-
+  /**
+   * List of valid format strings for use by callers of the formatSequences method
+   */
   public static final String[] WRITEABLE_FORMATS = new String[]
       {
-      "BLC", "CLUSTAL", "FASTA", "MSF", "PileUp", "PIR", "PFAM" //, "AMSA"
+      "BLC", "CLUSTAL", "FASTA", "MSF", "PileUp", "PIR", "PFAM" , "AMSA"
   };
+  /**
+   * List of extensions corresponding to file format types 
+   * in WRITABLE_FNAMES that are writable by the
+   * application.
+   */
+  public static final String[] WRITABLE_EXTENSIONS = new String[]
+        { "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc","amsa","jar" };
+  /**
+   * List of writable formats by the application. Order must
+   * correspond with the WRITABLE_EXTENSIONS list of formats.
+   */
+  public static final String[] WRITABLE_FNAMES = new String[]
+        { "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "AMSA", "Jalview" };
 
+  /**
+   * List of readable format file extensions by application in order
+   * corresponding to READABLE_FNAMES 
+   */
+  public static final String[] READABLE_EXTENSIONS =         new String[]
+        {
+        "fa, fasta, fastq", "aln", "pfam", "msf", "pir", "blc",
+        "amsa","jar"
+    };
+  /**
+   * List of readable formats by application in order
+   * corresponding to READABLE_EXTENSIONS
+   */
+  public static final String[] READABLE_FNAMES =         new String[]
+        {
+        "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "AMSA","Jalview"
+    };
+        
   public static String INVALID_CHARACTERS = "Contains invalid characters";
   // TODO: make these messages dynamic
   public static String SUPPORTED_FORMATS = "Formats currently supported are\n" +
-      "Fasta, MSF, Clustal, BLC, PIR, MSP, and PFAM";
-
+    prettyPrint(READABLE_FORMATS);
+  /**
+   * 
+   * @param els
+   * @return grammatically correct(ish) list consisting of els elements.
+   */
+  public static String prettyPrint(String[] els) {
+    StringBuffer list = new StringBuffer();
+    for (int i=0,iSize=els.length-1; i<iSize;i++)
+    {
+      list.append(els[i]);
+      list.append(",");
+    }
+    list.append(" and "+els[els.length-1]+".");
+    return list.toString();
+  }
   public static String FILE = "File";
   public static String URL = "URL";
   public static String PASTE = "Paste";
@@ -51,7 +106,11 @@ public class AppletFormatAdapter
 
   AlignFile afile = null;
   String inFile;
-
+  /**
+   * check that this format is valid for reading
+   * @param format a format string to be compared with READABLE_FORMATS
+   * @return true if format is readable
+   */
   public static final boolean isValidFormat(String format)
   {
     boolean valid = false;
@@ -172,9 +231,9 @@ public class AppletFormatAdapter
   /**
    * Construct an output class for an alignment in a particular filetype
    *
-   * @param format DOCUMENT ME!
-   * @param seqs DOCUMENT ME!
-   * @param jvsuffix passed to AlnFile class
+   * @param format string name of alignment format 
+   * @param alignment the alignment to be written out
+   * @param jvsuffix passed to AlnFile class controls whether /START-END is added to sequence names
    *
    * @return alignment flat file contents
    */
@@ -218,9 +277,11 @@ public class AppletFormatAdapter
       {
         afile = new StockholmFile();
       }
-      else if (format.equals("AMSA"))
+      else if (format.equalsIgnoreCase("AMSA"))
       {
         afile = new AMSAFile(alignment);
+      } else {
+        throw new Exception("Implementation error: Unknown file format string");
       }
 
       afile.addJVSuffix(jvsuffix);
@@ -238,4 +299,36 @@ public class AppletFormatAdapter
 
     return null;
   }
+  public static void main(String[] args)
+  {
+    int i=0;
+    while (i<args.length)
+    {
+      File f = new File(args[i]);
+      if (f.exists())
+      {
+        try {
+          AppletFormatAdapter afa = new AppletFormatAdapter();
+          Runtime r = Runtime.getRuntime();
+          System.gc();
+          long memf = -r.totalMemory()+r.freeMemory();
+          long t1 = -System.currentTimeMillis();
+          Alignment al = afa.readFile(args[i], FILE, new IdentifyFile().Identify(args[i], FILE));
+          t1 +=System.currentTimeMillis();
+          System.gc();
+          memf += r.totalMemory()-r.freeMemory();
+          System.out.println("Read took "+(t1/1000.0)+" seconds.");
+          System.out.println("Difference between free memory now and before is "+(memf/(1024.0*1024.0)*1.0)+" MB");
+          
+        } catch (Exception e)
+        {
+          System.err.println("Exception when dealing with "+i+"'th argument: "+args[i]+"\n"+e);
+        }
+      } else {
+          System.err.println("Ignoring argument '"+args[i]+"' ("+i+"'th)- not a readable file.");
+      }
+      i++;
+    }
+    
+  }
 }