Merge branch 'bug/JAL-1443_loading-empty-file' into develop
authortcofoegbu <tcnofoegbu@dundee.ac.uk>
Thu, 2 Jul 2015 15:38:40 +0000 (16:38 +0100)
committertcofoegbu <tcnofoegbu@dundee.ac.uk>
Thu, 2 Jul 2015 15:38:40 +0000 (16:38 +0100)
src/ext/edu/ucsf/rbvi/strucviz2/ChimeraManager.java
src/jalview/analysis/AAFrequency.java

index b66778c..7cc72cf 100644 (file)
@@ -1,5 +1,7 @@
 package ext.edu.ucsf.rbvi.strucviz2;
 
+import jalview.ws.HttpClientUtils;
+
 import java.awt.Color;
 import java.io.BufferedReader;
 import java.io.File;
@@ -20,8 +22,6 @@ import org.slf4j.LoggerFactory;
 import ext.edu.ucsf.rbvi.strucviz2.StructureManager.ModelType;
 import ext.edu.ucsf.rbvi.strucviz2.port.ListenerThreads;
 
-import jalview.ws.HttpClientUtils;
-
 /**
  * This object maintains the Chimera communication information.
  */
@@ -554,8 +554,8 @@ public class ChimeraManager
     for (String chimeraPath : chimeraPaths)
     {
       File path = new File(chimeraPath);
-      // enable the next line to simulate Chimera not installed
-      // File path = new File(chimeraPath + "x");
+      // uncomment the next line to simulate Chimera not installed
+      // path = new File(chimeraPath + "x");
       if (!path.canExecute())
       {
         error += "File '" + path + "' does not exist.\n";
@@ -565,6 +565,8 @@ public class ChimeraManager
       {
         List<String> args = new ArrayList<String>();
         args.add(chimeraPath);
+        // shows Chimera output window but suppresses REST responses:
+        // args.add("--debug");
         args.add("--start");
         args.add("RESTServer");
         ProcessBuilder pb = new ProcessBuilder(args);
@@ -589,7 +591,7 @@ public class ChimeraManager
       // TODO: [Optional] Check Chimera version and show a warning if below 1.8
       // Ask Chimera to give us updates
       // startListening(); // later - see ChimeraListener
-      return true;
+      return (chimeraRestPort > 0);
     }
 
     // Tell the user that Chimera could not be started because of an error
@@ -606,20 +608,29 @@ public class ChimeraManager
     InputStream readChan = chimera.getInputStream();
     BufferedReader lineReader = new BufferedReader(new InputStreamReader(
             readChan));
-    String response = null;
+    StringBuilder responses = new StringBuilder();
     try
     {
-      // expect: REST server on host 127.0.0.1 port port_number
-      response = lineReader.readLine();
-      String [] tokens = response.split(" ");
-      if (tokens.length == 7 && "port".equals(tokens[5])) {
-        port = Integer.parseInt(tokens[6]);
-        logger.info("Chimera REST service listening on port "
-                + chimeraRestPort);
+      String response = lineReader.readLine();
+      while (response != null)
+      {
+        responses.append("\n" + response);
+        // expect: REST server on host 127.0.0.1 port port_number
+        if (response.startsWith("REST server"))
+        {
+          String[] tokens = response.split(" ");
+          if (tokens.length == 7 && "port".equals(tokens[5]))
+          {
+            port = Integer.parseInt(tokens[6]);
+            break;
+          }
+        }
+        response = lineReader.readLine();
       }
     } catch (Exception e)
     {
-      logger.error("Failed to get REST port number from " + response + ": "
+      logger.error("Failed to get REST port number from " + responses
+              + ": "
               + e.getMessage());
     } finally
     {
@@ -630,6 +641,13 @@ public class ChimeraManager
       {
       }
     }
+    if (port == 0)
+    {
+      System.err
+              .println("Failed to start Chimera with REST service, response was: "
+                      + responses);
+    }
+    logger.info("Chimera REST service listening on port " + chimeraRestPort);
     return port;
   }
 
index 69c39df..50045dc 100755 (executable)
@@ -596,7 +596,6 @@ public class AAFrequency
       // array holds #seqs, #ungapped, then codon counts indexed by codon
       final int[] codonCounts = (int[]) hci.get(PROFILE);
       int totalCount = 0;
-      StringBuilder mouseOver = new StringBuilder(32);
 
       /*
        * First pass - get total count and find the highest
@@ -636,26 +635,56 @@ public class AAFrequency
        */
 
       /*
-       * Scan sorted array backwards for most frequent values first.
+       * Scan sorted array backwards for most frequent values first. Show
+       * repeated values compactly.
        */
+      StringBuilder mouseOver = new StringBuilder(32);
+      StringBuilder samePercent = new StringBuilder();
+      String percent = null;
+      String lastPercent = null;
+      Format fmt = getPercentageFormat(nseqs);
+
       for (int j = codons.length - 1; j >= 0; j--)
       {
         int codonCount = sortedCodonCounts[j];
         if (codonCount == 0)
         {
+          /*
+           * remaining codons are 0% - ignore, but finish off the last one if
+           * necessary
+           */
+          if (samePercent.length() > 0)
+          {
+            mouseOver.append(samePercent).append(": ").append(percent)
+                    .append("% ");
+          }
           break;
         }
         int codonEncoded = codons[j];
         final int pct = codonCount * 100 / totalCount;
         String codon = String
                 .valueOf(CodingUtils.decodeCodon(codonEncoded));
-        Format fmt = getPercentageFormat(nseqs);
-        String formatted = fmt == null ? Integer.toString(pct) : fmt
+        percent = fmt == null ? Integer.toString(pct) : fmt
                 .form(pct);
         if (showProfileLogo || codonCount == modalCodonCount)
         {
-          mouseOver.append(codon).append(": ").append(formatted)
-                  .append("% ");
+          if (percent.equals(lastPercent) && j > 0)
+          {
+            samePercent.append(samePercent.length() == 0 ? "" : ", ");
+            samePercent.append(codon);
+          }
+          else
+          {
+            if (samePercent.length() > 0)
+            {
+              mouseOver.append(samePercent).append(": ")
+                      .append(lastPercent)
+                      .append("% ");
+            }
+            samePercent.setLength(0);
+            samePercent.append(codon);
+          }
+          lastPercent = percent;
         }
       }