next version of Jpred functionality using new client code.
authorjprocter <Jim Procter>
Wed, 6 Apr 2005 16:20:55 +0000 (16:20 +0000)
committerjprocter <Jim Procter>
Wed, 6 Apr 2005 16:20:55 +0000 (16:20 +0000)
src/jalview/gui/AlignFrame.java
src/jalview/gui/AnnotationPanel.java
src/jalview/io/JPredClient.java
src/jalview/io/JPredFile.java

index 8c7c9be..5ee6c62 100755 (executable)
@@ -1131,11 +1131,51 @@ if ( viewport.getConservationSelected() )
   protected void jpred_actionPerformed(ActionEvent e)\r
 {\r
 \r
+    JInternalFrame frame = new JInternalFrame();\r
+    if (viewport.getSelectionGroup() != null && viewport.getSelectionGroup().getSize()>0)\r
+    {\r
+      // JBPNote UGLY! To prettify, make SequenceGroup and Alignment conform to some common interface!\r
+      SequenceGroup seqs = viewport.getSelectionGroup();\r
+      if (seqs.getSize() == 1 || !viewport.alignment.isAligned())\r
+      {\r
+        JPredClient ct = new JPredClient( (SequenceI)\r
+                                         seqs.getSequenceAt(0));\r
+      }\r
+      else\r
+      {\r
+        int sz;\r
+        SequenceI[] msa = new SequenceI[sz=seqs.getSize()];\r
+        for (int i = 0; i < sz; i++)\r
+        {\r
+          msa[i] = (SequenceI) seqs.getSequenceAt(i);\r
+        }\r
+\r
+        JPredClient ct = new JPredClient(msa);\r
+      }\r
 \r
-      JInternalFrame frame = new JInternalFrame();\r
-      JPredClient ct = new JPredClient((SequenceI)\r
-                                       viewport.getAlignment().getSequences().elementAt(0));\r
     }\r
+    else\r
+    {\r
+      Vector seqs = viewport.getAlignment().getSequences();\r
+\r
+      if (seqs.size() == 1 || !viewport.alignment.isAligned())\r
+      {\r
+        JPredClient ct = new JPredClient( (SequenceI)\r
+                                         seqs.elementAt(0));\r
+      }\r
+      else\r
+      {\r
+        SequenceI[] msa = new SequenceI[seqs.size()];\r
+        for (int i = 0; i < seqs.size(); i++)\r
+        {\r
+          msa[i] = (SequenceI) seqs.elementAt(i);\r
+        }\r
+\r
+        JPredClient ct = new JPredClient(msa);\r
+      }\r
+\r
+    }\r
+  }\r
 \r
     protected void LoadtreeMenuItem_actionPerformed(ActionEvent e) {\r
     // Pick the tree file\r
index c94a5a8..5c6bcf4 100755 (executable)
@@ -308,7 +308,7 @@ public class AnnotationPanel extends JPanel implements MouseListener, MouseMotio
     }\r
 \r
     int res = evt.getX() / av.getCharWidth() + av.getStartRes();\r
-    if(row>-1 && aa[row].annotations[res]!=null)\r
+    if(row>-1 && res<aa[row].annotations.length && aa[row].annotations[res]!=null)\r
       this.setToolTipText(aa[row].annotations[res].description);\r
 \r
   }\r
index 7c2675d..00ff545 100755 (executable)
@@ -11,6 +11,7 @@ import java.awt.*;
 import jalview.analysis.AlignSeq;\r
 import ext.vamsas.*;\r
 \r
+\r
 public class JPredClient\r
 {\r
 \r
@@ -19,13 +20,41 @@ public class JPredClient
   int jobsRunning = 0;\r
   ext.vamsas.JpredSoapBindingStub server;\r
 \r
+  public JPredClient(SequenceI[] msf)\r
+  {\r
+    SequenceI seq = msf[0];\r
+    output.formatForOutput();\r
+    outputFrame.setContentPane(output);\r
+\r
+    output.setText("Job details for MSA based prediction on sequence :\nName : "\r
+                   + seq.getName() + "\nSequence : "\r
+                   + AlignSeq.extractGaps("-. ",seq.getSequence()) + "\n");\r
+    Desktop.addInternalFrame(outputFrame,\r
+                             "JNet secondary structure prediction job", 800,\r
+                             300);\r
+\r
+    JPredWSServiceLocator loc = new JPredWSServiceLocator(); // Default\r
+    try {\r
+      this.server = (JpredSoapBindingStub) loc.getjpred(); // JBPNote will be set from properties\r
+    }\r
+    catch (Exception ex) {\r
+      output.setText("Serious! JPred Service location failed\nfor URL :"\r
+                     +loc.getjpredAddress()+"\n"+ex.getMessage());\r
+    }\r
+\r
+    JPredThread jthread = new JPredThread(msf);\r
+    jthread.start();\r
+    ImageTwirler thread = new ImageTwirler();\r
+    thread.start();\r
+  }\r
+\r
   public JPredClient(SequenceI seq)\r
   {\r
     output.formatForOutput();\r
     outputFrame.setContentPane(output);\r
 \r
     output.setText("Job details for prediction on sequence :\nName : "\r
-                   + seq.getName() + "\nSequence : " + seq.getSequence() + "\n");\r
+                   + seq.getName() + "\nSequence : " + AlignSeq.extractGaps("-. ",seq.getSequence()) + "\n");\r
     Desktop.addInternalFrame(outputFrame,\r
                              "JNet secondary structure prediction job", 800,\r
                              300);\r
@@ -87,8 +116,9 @@ public class JPredClient
       extends Thread\r
   {\r
     String OutputHeader;\r
-    ext.vamsas.Secstructpred result;\r
+    ext.vamsas.JpredResult result;\r
     ext.vamsas.Sequence sequence;\r
+    ext.vamsas.Msfalignment msa;\r
     String jobId;\r
     boolean jobComplete = false;\r
     int allowedServerExceptions = 3; // thread dies if too many exceptions.\r
@@ -100,6 +130,18 @@ public class JPredClient
       this.sequence.setSeq(AlignSeq.extractGaps("-. ",seq.getSequence()));\r
     }\r
 \r
+    JPredThread(SequenceI[] msf)\r
+    {\r
+      OutputHeader = output.getText();\r
+      this.sequence = new ext.vamsas.Sequence();\r
+      this.sequence.setId(msf[0].getName());\r
+      this.sequence.setSeq(AlignSeq.extractGaps("-. ",msf[0].getSequence()));\r
+      jalview.io.MSFfile mwrite = new jalview.io.MSFfile();\r
+      this.msa = new ext.vamsas.Msfalignment();\r
+      msa.setMsf(mwrite.print(msf));\r
+    }\r
+\r
+\r
     public void run()\r
     {\r
 \r
@@ -110,9 +152,9 @@ public class JPredClient
       {\r
         try\r
         {\r
-          result = server.getpredict(jobId);\r
+          result = server.getresult(jobId);\r
 \r
-          if (result.getOutput().indexOf("Job") != 0)\r
+          if (result.isFinished())\r
           {\r
             parseResult();\r
             jobComplete = true;\r
@@ -120,11 +162,13 @@ public class JPredClient
           }\r
           else\r
           {\r
-            output.setText(OutputHeader + "\n" + result.getOutput());\r
+            output.setText(OutputHeader + "\n" + result.getStatus());\r
+            if (! (result.isJobFailed() || result.isServerError()))\r
+            {\r
+              Thread.sleep(5000);\r
+              //      System.out.println("I'm alive "+seqid+" "+jobid);\r
+            }\r
           }\r
-          Thread.sleep(5000);\r
-          //      System.out.println("I'm alive "+seqid+" "+jobid);\r
-\r
         }\r
         catch (Exception ex)\r
         {\r
@@ -139,7 +183,11 @@ public class JPredClient
     {\r
       try\r
       {\r
-        jobId = server.predict(sequence);\r
+        if (msa!=null)  {\r
+          jobId = server.predictOnMsa(msa);\r
+        } else {\r
+          jobId = server.predict(sequence);\r
+        }\r
         System.out.println(jobId);\r
       }\r
       catch (Exception e)\r
@@ -150,23 +198,78 @@ public class JPredClient
       }\r
     }\r
 \r
+    private void addFloatAnnotations(Alignment al, int[] gapmap, Vector values, String Symname, String Visname, float min, float max, int winLength) {\r
+\r
+      Annotation[] annotations = new Annotation[al.getWidth()];\r
+      for (int j = 0; j < values.size(); j++)\r
+      {\r
+        float value = Float.parseFloat(values.get(j).toString());\r
+        annotations[gapmap[j]] = new Annotation("", value+"",' ',value);\r
+      }\r
+      al.addAnnotation(new AlignmentAnnotation(Symname, Visname, annotations, min, max, winLength));\r
+    }\r
+\r
     void parseResult()\r
     {\r
-      output.setText(OutputHeader + result.getOutput());\r
+      // OutputHeader = output.getText();\r
+      if (result.getStatus()!=null) {\r
+        OutputHeader += "\n"+result.getStatus();\r
+      }\r
+      if (result.getPredfile()!=null) {\r
+        OutputHeader += "\n"+result.getPredfile();\r
+      // JBPNote The returned files from a webservice could be hidden behind icons in the monitor window that, when clicked, pop up their corresponding data\r
+      }\r
+      if (result.getAligfile()!=null) {\r
+        OutputHeader += "\n"+result.getAligfile();\r
+      }\r
+      output.setText(OutputHeader);\r
       try {\r
         // JPredFile prediction = new JPredFile("C:/JalviewX/files/jpred.txt", "File");\r
-        JPredFile prediction=new JPredFile(result.getOutput(), "Paste");\r
+        jalview.io.JPredFile prediction = new jalview.io.JPredFile(result.getPredfile(), "Paste");\r
         SequenceI[] preds = prediction.getSeqsAsArray();\r
-        Alignment al = new Alignment(preds);\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
+          // we ignore the returned alignment if we only predicted on a single sequence\r
+          String format = jalview.io.IdentifyFile.Identify(result.getAligfile(), "Paste");\r
+          if (jalview.io.FormatProperties.contains(format))\r
+          {\r
+            al = new Alignment(jalview.io.FormatAdapter.read(result.getAligfile(),"Paste",format));\r
+            noMsa = false;\r
+            FirstSeq = 0;\r
+          }\r
+          else\r
+          {\r
+            throw (new Exception("Unknown format 'format' for file : \n" +\r
+                             result.getAligfile()));\r
+          }\r
+\r
+        } else {\r
+          al = new Alignment(preds);\r
+          FirstSeq = prediction.QuerySeqPosition;\r
+        }\r
 \r
         AlignmentAnnotation annot;\r
         Annotation [] annotations = null;\r
         int i = 0;\r
-        // Rename the query sequence\r
+        int width = preds[0].getSequence().length();\r
+\r
+\r
+        int[] gapmap = al.getSequenceAt(FirstSeq).gapMap();\r
+        if (gapmap.length!=width) {\r
+          throw (new Exception("Jpred Client Error\nNumber of residues in supposed query sequence :\n"\r
+                               +al.getSequenceAt(FirstSeq).getName()+"\n"\r
+                               +al.getSequenceAt(FirstSeq).getSequence()\r
+                               +"\nDiffer from number of prediction sites in \n"+result.getPredfile()+"\n"));\r
+        }\r
+        // JBPNote Should also rename the query sequence sometime...\r
+        i=0;\r
         while (i < preds.length)\r
         {\r
           String id = preds[i].getName().toUpperCase();\r
-          if(id.startsWith("LUPAS") || id.startsWith("JNET"))\r
+          if(id.startsWith("LUPAS") || id.startsWith("JNET") || id.startsWith("JPRED"))\r
           {\r
             annotations = new Annotation[al.getWidth()];\r
 \r
@@ -174,80 +277,55 @@ public class JPredClient
                || id.equals("JNETPSSM")\r
                || id.equals("JNETFREQ")\r
                || id.equals("JNETHMM")\r
-               || id.equals("JNETALIGN"))\r
+               || id.equals("JNETALIGN")\r
+               || id.equals("JPRED"))\r
             {\r
-              for (int j = 0; j < al.getWidth(); j++)\r
-                annotations[j] = new Annotation("", "", preds[i].getCharAt(j), 0);\r
+              for (int j = 0; j < width; j++)\r
+                annotations[gapmap[j]] = new Annotation("", "", preds[i].getCharAt(j), 0);\r
             }\r
             else if(id.equals("JNETCONF"))\r
             {\r
-              for (int j = 0; j < al.getWidth(); j++)\r
+              for (int j = 0; j < width; j++)\r
               {\r
                 float value = Float.parseFloat(preds[i].getCharAt(j)+"");\r
-                annotations[j] = new Annotation(preds[i].getCharAt(j)+"", "",preds[i].getCharAt(j),value);\r
+                annotations[gapmap[j]] = new Annotation(preds[i].getCharAt(j)+"", "",preds[i].getCharAt(j),value);\r
               }\r
             }\r
             else\r
             {\r
-              for (int j = 0; j < al.getWidth(); j++)\r
-                annotations[j] = new Annotation(preds[i].getCharAt(j)+"", "", ' ', 0);\r
+              for (int j = 0; j < width; j++) {\r
+                annotations[gapmap[j]] = new Annotation(preds[i].getCharAt(j)+"", "", ' ', 0);\r
+              }\r
             }\r
 \r
             if(id.equals("JNETCONF"))\r
               annot = new AlignmentAnnotation(preds[i].getName(),\r
-                                           "Jpred Output",\r
+                                           "JNet Output",\r
                                            annotations,0f,10f,1);\r
 \r
             else   annot = new AlignmentAnnotation(preds[i].getName(),\r
-                                            "Jpred Output",\r
+                                            "JNet Output",\r
                                             annotations);\r
             al.addAnnotation(annot);\r
-            al.deleteSequence(preds[i]);\r
+            if (noMsa)\r
+              al.deleteSequence(preds[i]);\r
           }\r
           i++;\r
         }\r
 \r
         Hashtable scores = prediction.Scores;\r
+        addFloatAnnotations(al, gapmap,  (Vector)scores.get("JNETPROPH"),\r
+                            "JnetpropH", "Jnet Helix Propensity", 0f,1f,1);\r
 \r
-        Vector values = (Vector)scores.get("JNETPROPH");\r
-        annotations = new Annotation[al.getWidth()];\r
-        for (int j = 0; j < al.getWidth(); j++)\r
-        {\r
-          float value = Float.parseFloat(values.get(j).toString());\r
-          annotations[j] = new Annotation("", value+"",' ',value);\r
-        }\r
-        annot = new AlignmentAnnotation("Jnetproph", "Jpred Output", annotations, 0f,1f,1);\r
-        al.addAnnotation(annot);\r
-\r
-        values = (Vector)scores.get("JNETPROPB");\r
-             annotations = new Annotation[al.getWidth()];\r
-             for (int j = 0; j < al.getWidth(); j++)\r
-             {\r
-               float value = Float.parseFloat(values.get(j).toString());\r
-               annotations[j] = new Annotation("", value+"",' ',value);\r
-             }\r
-             annot = new AlignmentAnnotation("JnetpropB", "Jpred Output", annotations, 0f,1f,1);\r
-             al.addAnnotation(annot);\r
-\r
-             values = (Vector)scores.get("JNETPROPC");\r
-                  annotations = new Annotation[al.getWidth()];\r
-                  for (int j = 0; j < al.getWidth(); j++)\r
-                  {\r
-                    float value = Float.parseFloat(values.get(j).toString());\r
-                    annotations[j] = new Annotation("", value+"",' ',value);\r
-                  }\r
-                  annot = new AlignmentAnnotation("JnetpropC", "Jpred Output", annotations, 0f,1f,1);\r
-                  al.addAnnotation(annot);\r
-\r
+        addFloatAnnotations(al, gapmap,  (Vector)scores.get("JNETPROPB"),\r
+                            "JnetpropB", "Jnet Beta Sheed Propensity", 0f,1f,1);\r
 \r
+        addFloatAnnotations(al, gapmap,  (Vector)scores.get("JNETPROPC"),\r
+                            "JnetpropC", "Jnet Coil Propensity", 0f,1f,1);\r
 \r
         AlignFrame af = new AlignFrame(al);\r
 \r
 \r
-        /*  JBPNote - need to set correct style of display for the secstrpred alignment object.\r
-            af.clustalColour.setSelected(true);\r
-            af.clustalColour_actionPerformed(null);\r
-         */\r
         Desktop.addInternalFrame(af,\r
                                  "JNet Prediction for sequence ",\r
                                  700, 500);\r
index 92d9819..636a8d6 100755 (executable)
@@ -28,6 +28,9 @@ public class JPredFile
 
     super.initData();
     Scores = new Hashtable();
+    ids = null;
+    conf = null;
+    QuerySeqPosition = -1;
   }
 
   public JPredFile(String inFile, String type)
@@ -40,13 +43,13 @@ public class JPredFile
   /**
    * parse a JPred concise file into a sequence-alignment like object.
    */
-
+  int QuerySeqPosition;
   public void parse()
       throws IOException
   {
 System.out.println("all read in ");
     String line;
-
+    QuerySeqPosition = -1;
     noSeqs = 0;
     Vector seq_entries = new Vector();
     Vector ids = new Vector();
@@ -144,6 +147,7 @@ System.out.println("all read in ");
               name = id.substring(id.indexOf(";")+1)+"_"+1;
             }
             ids.addElement(name);
+
             noSeqs++;
           }
           else
@@ -187,6 +191,10 @@ System.out.println("all read in ");
                               ids.elementAt(i).toString()
                               + ") has an unexpected number of columns");
       }
+      if (newSeq.getName().startsWith("QUERY") && QuerySeqPosition==-1) {
+        QuerySeqPosition = seqs.size();
+      }
+
       seqs.addElement(newSeq);
 
     }