Warn if out of memory
[jalview.git] / src / jalview / ws / JPredClient.java
index c7508df..80a66c3 100755 (executable)
@@ -30,7 +30,7 @@ import jalview.gui.*;
 public class JPredClient\r
     extends WSClient\r
 {\r
-  ext.vamsas.JPredWS server;\r
+  ext.vamsas.Jpred server;\r
   String altitle = "";\r
   java.util.Hashtable SequenceInfo = null;\r
   public JPredClient(ext.vamsas.ServiceHandle sh, String title, SequenceI seq) {\r
@@ -63,15 +63,17 @@ public class JPredClient
                            title + ") on sequence :\n>" + seq.getName() + "\n" +\r
                            AlignSeq.extractGaps("-. ", seq.getSequence()) +\r
                            "\n");\r
-\r
-    SequenceInfo = jalview.analysis.SeqsetUtils.SeqCharacterHash(seq);\r
+    SequenceI aln[] = new SequenceI[msf.length];\r
+    for (int i=0,j=msf.length; i<j;i++)\r
+      aln[i] = new jalview.datamodel.Sequence(msf[i]);\r
+    SequenceInfo = jalview.analysis.SeqsetUtils.uniquify(aln, true);\r
 \r
     if (!locateWebService())\r
     {\r
       return;\r
     }\r
 \r
-    JPredThread jthread = new JPredThread(msf);\r
+    JPredThread jthread = new JPredThread(aln);\r
     jthread.start();\r
   }\r
 \r
@@ -115,7 +117,7 @@ public class JPredClient
 \r
   private boolean locateWebService()\r
   {\r
-    JPredWSServiceLocator loc = new JPredWSServiceLocator(); // Default\r
+    ext.vamsas.JpredServiceLocator loc = new JpredServiceLocator(); // Default\r
 \r
     try\r
     {\r
@@ -146,9 +148,9 @@ public class JPredClient
       extends Thread\r
   {\r
     String OutputHeader;\r
-    ext.vamsas.JpredResult result;\r
-    ext.vamsas.Sequence sequence;\r
-    ext.vamsas.Msfalignment msa;\r
+    vamsas.objects.simple.JpredResult result;\r
+    vamsas.objects.simple.Sequence sequence;\r
+    vamsas.objects.simple.Msfalignment msa;\r
     String jobId;\r
     boolean jobComplete = false;\r
     int allowedServerExceptions = 3; // thread dies if too many exceptions.\r
@@ -156,7 +158,7 @@ public class JPredClient
     JPredThread(SequenceI seq)\r
     {\r
       OutputHeader = wsInfo.getProgressText();\r
-      this.sequence = new ext.vamsas.Sequence();\r
+      this.sequence = new vamsas.objects.simple.Sequence();\r
       this.sequence.setId(seq.getName());\r
       this.sequence.setSeq(AlignSeq.extractGaps("-. ", seq.getSequence()));\r
     }\r
@@ -164,13 +166,13 @@ public class JPredClient
     JPredThread(SequenceI[] msf)\r
     {\r
       OutputHeader = wsInfo.getProgressText();\r
-      this.sequence = new ext.vamsas.Sequence();\r
+      this.sequence = new vamsas.objects.simple.Sequence();\r
       this.sequence.setId(msf[0].getName());\r
       this.sequence.setSeq(AlignSeq.extractGaps("-. ",\r
                                                 msf[0].getSequence()));\r
 \r
       jalview.io.PileUpfile mwrite = new jalview.io.PileUpfile();\r
-      this.msa = new ext.vamsas.Msfalignment();\r
+      this.msa = new vamsas.objects.simple.Msfalignment();\r
       msa.setMsf(mwrite.print(msf));\r
     }\r
 \r
@@ -187,27 +189,28 @@ public class JPredClient
             throw (new Exception(\r
                 "Timed out when communicating with server\nTry again later.\n"));\r
           }\r
-\r
+          if (result.getState()==0)\r
+            jalview.bin.Jalview.log.debug("Finished "+jobId);\r
           if (result.isRunning())\r
           {\r
             wsInfo.setStatus(WebserviceInfo.STATE_RUNNING);\r
           }\r
-          else if (result.isQueued())\r
+          if (result.isQueued())\r
           {\r
             wsInfo.setStatus(WebserviceInfo.STATE_QUEUING);\r
           }\r
 \r
+          wsInfo.setProgressText(OutputHeader + "\n" +\r
+                                 result.getStatus());\r
+\r
           if (result.isFinished())\r
           {\r
+\r
             parseResult();\r
             jobComplete = true;\r
             jobsRunning--;\r
-          }\r
-          else\r
-          {\r
-            wsInfo.setProgressText(OutputHeader + "\n" +\r
-                                   result.getStatus());\r
-\r
+          } else {\r
+            // catch exceptions\r
             if (! (result.isJobFailed() || result.isServerError()))\r
             {\r
               try\r
@@ -223,6 +226,8 @@ public class JPredClient
             else\r
             {\r
               wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_ERROR);\r
+              jobsRunning--;\r
+              jobComplete = true;\r
             }\r
           }\r
         }\r
@@ -243,16 +248,28 @@ public class JPredClient
           {\r
           }\r
         }\r
+        catch (OutOfMemoryError er)\r
+        {\r
+          jobComplete = true;\r
+          wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_ERROR);\r
+          JOptionPane.showInternalMessageDialog(Desktop.desktop,\r
+                                                "Out of memory handling result!!"\r
+                                                +\r
+              "\nSee help files for increasing Java Virtual Machine memory."\r
+                                                , "Out of memory",\r
+                                                JOptionPane.WARNING_MESSAGE);\r
+          System.out.println("JPredClient: "+er);\r
+        }\r
       }\r
-\r
-      if (! (result.isJobFailed() || result.isServerError()))\r
-      {\r
-        wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_OK);\r
-      }\r
-      else\r
-      {\r
-        wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_ERROR);\r
-      }\r
+      if (result!=null)\r
+        if (! (result.isJobFailed() || result.isServerError()))\r
+        {\r
+          wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_OK);\r
+        }\r
+        else\r
+        {\r
+          wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_ERROR);\r
+        }\r
     }\r
 \r
     void StartJob()\r
@@ -287,18 +304,19 @@ public class JPredClient
       catch (Exception e)\r
       {\r
         wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_SERVERERROR);\r
-        allowedServerExceptions = 0;\r
-        jobComplete = false;\r
-\r
-        wsInfo.appendProgressText("Failed to submit the prediction.\n"\r
-                                  +\r
-                                  "It is most likely that there is a problem with the server.\n"\r
-                                  + "Just close the window\n");\r
+        allowedServerExceptions = -1;\r
+        jobComplete = true;\r
+\r
+        wsInfo.setProgressText("Failed to submit the prediction. (Just close the window)\n"\r
+                                  + ((e.getMessage().indexOf("Exception")>-1) ? (\r
+                                  "It is most likely that there is a problem with the server.\n")\r
+                              : e.getMessage())\r
+                                  +wsInfo.getProgressText());\r
         System.err.println(\r
-            "JPredWS Client: Failed to submit the prediction (Probably a server error - see below)\n" +\r
-            e.toString() + "\n");\r
+            "JPredWS Client: Failed to submit the prediction (Possibly a server error - see below)\n" +\r
+            e.getMessage() + "\n");\r
 \r
-        // e.printStackTrace(); TODO: JBPNote DEBUG\r
+        jalview.bin.Jalview.log.debug("Failed Submission",e);\r
       }\r
     }\r
 \r
@@ -347,21 +365,24 @@ public class JPredClient
         OutputHeader += ("\n" + result.getAligfile());\r
       }\r
 \r
-      wsInfo.setProgressText(OutputHeader);\r
+      wsInfo.setProgressText(OutputHeader+"Parsing...");\r
 \r
       try\r
       {\r
+        jalview.bin.Jalview.log.debug("Parsing output from JNet job.");\r
         // JPredFile prediction = new JPredFile("C:/JalviewX/files/jpred.txt", "File");\r
         jalview.io.JPredFile prediction = new jalview.io.JPredFile(result.\r
             getPredfile(),\r
             "Paste");\r
         SequenceI[] preds = prediction.getSeqsAsArray();\r
+        jalview.bin.Jalview.log.debug("Got prediction profile.");\r
         Alignment al;\r
         int FirstSeq; // the position of the query sequence in Alignment al\r
         boolean noMsa = true; // set if no MSA has been returned by JPred\r
 \r
         if ( (this.msa != null) && (result.getAligfile() != null))\r
         {\r
+          jalview.bin.Jalview.log.debug("Getting associated alignment.");\r
           // we ignore the returned alignment if we only predicted on a single sequence\r
           String format = jalview.io.IdentifyFile.Identify(result.getAligfile(),\r
               "Paste");\r
@@ -370,6 +391,16 @@ public class JPredClient
           {\r
             al = new Alignment(jalview.io.FormatAdapter.readFile(\r
                 result.getAligfile(), "Paste", format));\r
+            for (int i=0, j=al.getHeight(); i<j; i++) {\r
+              SequenceI sq = al.getSequenceAt(i);\r
+              if (!jalview.analysis.SeqsetUtils.SeqCharacterUnhash(\r
+                  sq, (Hashtable) SequenceInfo.get(sq.getName())))\r
+              {\r
+                throw (new Exception(\r
+                    "Couldn't recover sequence properties for JNet "\r
+                    +((i==0) ? "Query sequence" : "alignment sequence ("+i+")")));\r
+              }\r
+            }\r
             noMsa = false;\r
             FirstSeq = 0;\r
           }\r
@@ -384,14 +415,14 @@ public class JPredClient
         {\r
           al = new Alignment(preds);\r
           FirstSeq = prediction.getQuerySeqPosition();\r
+          if (!jalview.analysis.SeqsetUtils.SeqCharacterUnhash(\r
+              al.getSequenceAt(FirstSeq), SequenceInfo))\r
+          {\r
+            throw (new Exception(\r
+                "Couldn't recover sequence properties for JNet Query sequence!"));\r
+          }\r
         }\r
 \r
-        if (!jalview.analysis.SeqsetUtils.SeqCharacterUnhash(\r
-            al.getSequenceAt(FirstSeq), SequenceInfo))\r
-        {\r
-          throw (new Exception(\r
-              "Couldn't recover sequence properties for JNet Query sequence!"));\r
-        }\r
 \r
         AlignmentAnnotation annot;\r
         Annotation[] annotations = null;\r
@@ -486,6 +517,9 @@ public class JPredClient
           addFloatAnnotations(al, gapmap,  (Vector)scores.get("JNETPROPC"),\r
                               "JnetpropC", "Jnet Coil Propensity", 0f,1f,1);\r
          */\r
+\r
+        wsInfo.setProgressText(OutputHeader);\r
+        jalview.bin.Jalview.log.debug("Finished parsing output.");\r
         AlignFrame af = new AlignFrame(al);\r
 \r
         Desktop.addInternalFrame(af, altitle,\r
@@ -494,7 +528,8 @@ public class JPredClient
       }\r
       catch (Exception ex)\r
       {\r
-        ex.printStackTrace();\r
+        jalview.bin.Jalview.log.warn("Exception whilst parsing JNet style secondary structure prediction.");\r
+        jalview.bin.Jalview.log.debug("Exception: ",ex);\r
       }\r
     }\r
   }\r