after merge
[jalview.git] / src / jalview / io / WSWUBlastClient.java
index c221d07..0906d12 100755 (executable)
@@ -29,7 +29,9 @@ import java.util.*;
 import javax.swing.*;\r
 \r
 import javax.xml.namespace.QName;\r
+import jalview.analysis.AlignSeq;\r
 \r
+import uk.ac.ebi.www.*;\r
 \r
 /**\r
  * DOCUMENT ME!\r
@@ -39,38 +41,39 @@ import javax.xml.namespace.QName;
  */\r
 public class WSWUBlastClient\r
 {\r
+    AlignmentPanel ap;\r
+    AlignmentI al;\r
     CutAndPasteTransfer output = new CutAndPasteTransfer();\r
     int jobsRunning = 0;\r
 \r
+    Vector suggestedIds = new Vector();\r
     /**\r
      * Creates a new WSWUBlastClient object.\r
      *\r
      * @param al DOCUMENT ME!\r
      * @param ids DOCUMENT ME!\r
      */\r
-    public WSWUBlastClient(AlignmentI al, ArrayList ids)\r
+    public WSWUBlastClient(AlignmentPanel ap, AlignmentI al, ArrayList ids)\r
     {\r
+        this.ap = ap;\r
+        this.al = al;\r
         output.setText(\r
-            "To display sequence features an exact Uniprot id with 100% sequence identity match must be entered." +\r
-            "\nIn order to display these features, try changing the names of your sequences to the ids suggested below.");\r
+            "To display sequence features an exact Uniprot id with 100% sequence identity match must be entered."\r
+            +"\nIn order to display these features, try changing the names of your sequences to the ids suggested below."\r
+            +"\n\nRunning WSWUBlast at EBI."\r
+            +"\nPlease quote Pillai S., Silventoinen V., Kallio K., Senger M., Sobhany S., Tate J., Velankar S., Golovin A., Henrick K., Rice P., Stoehr P., Lopez R."\r
+            +"\nSOAP-based services provided by the European Bioinformatics Institute."\r
+            +"\nNucleic Acids Res. 33(1):W25-W28 (2005));");\r
+\r
         Desktop.addInternalFrame(output,\r
             "BLASTing for unidentified sequences ", 800, 300);\r
 \r
         for (int i = 0; i < ids.size(); i++)\r
         {\r
-            SequenceI sequence = al.findName(ids.get(i).toString());\r
-            StringBuffer nonGapped = new StringBuffer();\r
-\r
-            for (int n = 0; n < sequence.getSequence().length(); n++)\r
-            {\r
-                if (!jalview.util.Comparison.isGap(sequence.getCharAt(n)))\r
-                {\r
-                    nonGapped.append(sequence.getCharAt(n));\r
-                }\r
-            }\r
+            Sequence sequence = (Sequence)ids.get(i);\r
+            System.out.println(sequence.getName());\r
 \r
-            BlastThread thread = new BlastThread(ids.get(i).toString(),\r
-                    nonGapped.toString());\r
+            BlastThread thread = new BlastThread(sequence);\r
             thread.start();\r
             jobsRunning++;\r
         }\r
@@ -79,50 +82,100 @@ public class WSWUBlastClient
         thread.start();\r
     }\r
 \r
+\r
     /**\r
      * DOCUMENT ME!\r
      *\r
      * @param id1 DOCUMENT ME!\r
      * @param res DOCUMENT ME!\r
      */\r
-    void parseResult(String id1, String res)\r
+    void parseResult(Sequence seq, String res)\r
     {\r
         StringTokenizer st = new StringTokenizer(res, "\n");\r
         String data;\r
         String id2;\r
         int maxFound = 90;\r
-        StringBuffer buffer = new StringBuffer("\n\n" + id1 + " :");\r
+        StringBuffer buffer = new StringBuffer("\n\n" + seq.getName() + " :");\r
 \r
         while (st.hasMoreTokens())\r
         {\r
             data = st.nextToken();\r
 \r
-            if (data.indexOf("database=\"uniprot\" id=") > -1)\r
+            if (data.indexOf(">UNIPROT") > -1)\r
             {\r
-                int index = data.indexOf("database=\"uniprot\" id=") + 23;\r
-                id2 = data.substring(index, data.indexOf("\"", index));\r
+                int index = data.indexOf(">UNIPROT") + 9;\r
+                id2 = data.substring(index, data.indexOf(" ", index));\r
 \r
-                while (data.indexOf("</alignment>") == -1)\r
+                boolean identitiesFound = false;\r
+                while (!identitiesFound)\r
                 {\r
                     data = st.nextToken();\r
 \r
-                    if (data.indexOf("<identity>") > -1)\r
+                    if (data.indexOf("Identities") > -1)\r
                     {\r
-                        int value = Integer.parseInt(data.substring(data.indexOf(\r
-                                        "<identity>") + 10,\r
-                                    data.indexOf("</identity>")));\r
+                       identitiesFound = true;\r
+\r
+                       int value = Integer.parseInt(data.substring(data.indexOf(\r
+                           "(") + 1,\r
+                                                                   data.indexOf("%")));\r
 \r
                         if (value >= maxFound)\r
                         {\r
                             maxFound = value;\r
                             buffer.append(" " + id2 + " " + value + "%; ");\r
+                            suggestedIds.addElement( new Object[]{seq, id2});\r
                         }\r
                     }\r
                 }\r
             }\r
         }\r
 \r
-        output.setText(output.getText() + buffer.toString());\r
+        output.appendText(buffer.toString());\r
+    }\r
+\r
+    void updateIds()\r
+    {\r
+        // This must be outside the run() body as java 1.5\r
+     // will not return any value from the OptionPane to the expired thread.\r
+      int reply = JOptionPane.showConfirmDialog(\r
+          Desktop.desktop, "Automatically update suggested ids?",\r
+          "Auto replace sequence ids", JOptionPane.YES_NO_OPTION);\r
+\r
+      if (reply == JOptionPane.YES_OPTION)\r
+      {\r
+        Enumeration keys = suggestedIds.elements();\r
+        while(keys.hasMoreElements())\r
+        {\r
+          Object [] object = (Object[])keys.nextElement();\r
+\r
+          Sequence oldseq = (Sequence)object[0];\r
+\r
+          oldseq.setName( object[1].toString() );\r
+\r
+          // Oldseq is actually in the dataset, we must find the\r
+          // Visible seq and change its name also.\r
+          for (int i = 0; i < al.getHeight(); i++)\r
+          {\r
+            if (al.getSequenceAt(i).getDatasetSequence() == oldseq)\r
+            {\r
+              al.getSequenceAt(i).setName(oldseq.getName());\r
+              break;\r
+            }\r
+          }\r
+\r
+          Vector entries = oldseq.getDBRef();\r
+          if (entries != null)\r
+          {\r
+            DBRefEntry entry = (DBRefEntry) entries.elementAt(0);\r
+            oldseq.addDBRef(new jalview.datamodel.\r
+                                                 DBRefEntry("UNIPROT",\r
+                "0",\r
+                entry.getAccessionId()));\r
+          }\r
+        }\r
+      }\r
+      ap.repaint();\r
+\r
     }\r
 \r
     class ImageTwirler extends Thread\r
@@ -163,20 +216,24 @@ public class WSWUBlastClient
                 {\r
                 }\r
             }\r
+\r
+            if (jobsRunning == 0)\r
+            {\r
+              updateIds();\r
+            }\r
         }\r
     }\r
 \r
     class BlastThread extends Thread\r
     {\r
-        String sequence;\r
-        String seqid;\r
+        Sequence sequence;\r
         String jobid;\r
         boolean jobComplete = false;\r
 \r
-        BlastThread(String id, String sequence)\r
+        BlastThread(Sequence sequence)\r
         {\r
-            this.sequence = sequence;\r
-            seqid = id;\r
+          System.out.println("blasting for: "+sequence.getName());\r
+          this.sequence = sequence;\r
         }\r
 \r
         public void run()\r
@@ -187,27 +244,23 @@ public class WSWUBlastClient
             {\r
                 try\r
                 {\r
-                    Call call = (Call) new Service().createCall();\r
-                    call.setTargetEndpointAddress(new java.net.URL(\r
-                            "http://www.ebi.ac.uk/cgi-bin/webservices/WSWUBlast"));\r
-                    call.setOperationName(new QName("WSWUBlast", "polljob"));\r
-\r
-                    String result = (String) call.invoke(new Object[]\r
-                            {\r
-                                jobid, "xml"\r
-                            });\r
-\r
-                    if ((result.indexOf("JOB PENDING") == -1) &&\r
-                            (result.indexOf("JOB RUNNING") == -1))\r
-                    {\r
-                        parseResult(seqid, result);\r
-                        jobComplete = true;\r
-                        jobsRunning--;\r
-                    }\r
-\r
-                    Thread.sleep(5000);\r
-\r
-                    // System.out.println("WSWuBlastClient: I'm alive "+seqid+" "+jobid); // log.debug\r
+                  WSWUBlastService service =  new WSWUBlastServiceLocator();\r
+                  WSWUBlast wublast = service.getWSWUBlast();\r
+                  WSFile[] results = wublast.getResults(jobid);\r
+\r
+                  if(results!=null)\r
+                  {\r
+                      String result = new String(wublast.poll(jobid, "tooloutput"));\r
+                      parseResult(sequence, result);\r
+                      jobComplete = true;\r
+                      jobsRunning--;\r
+                  }\r
+                  else\r
+                  {\r
+                    Thread.sleep(10000);\r
+                    System.out.println("WSWuBlastClient: I'm alive " +\r
+                                       sequence.getName() + " " + jobid); // log.debug\r
+                  }\r
                 }\r
                 catch (Exception ex)\r
                 {\r
@@ -217,38 +270,36 @@ public class WSWUBlastClient
 \r
         void StartJob()\r
         {\r
-            HashMap params = new HashMap();\r
-            params.put("database", "uniprot");\r
-            params.put("sensitivity", "low");\r
-            params.put("sort", "totalscore");\r
-            params.put("matrix", "pam10");\r
-            params.put("program", "blastp");\r
-            params.put("alignments", "5");\r
-            params.put("outformat", "xml");\r
-            params.put("searchtype", "1");\r
-\r
-            byte[] seqbytes = sequence.getBytes();\r
+          InputParams params = new InputParams();\r
+\r
+          params.setProgram("blastp");\r
+          params.setDatabase("uniprot");\r
+          params.setMatrix("pam10");\r
+\r
+          params.setNumal(5);\r
+          params.setSensitivity("low");\r
+          params.setSort("totalscore");\r
+          params.setOutformat("txt");\r
+          params.setAsync(true);\r
 \r
             try\r
             {\r
-                Call call = (Call) new Service().createCall();\r
-                call.setTargetEndpointAddress(new java.net.URL(\r
-                        "http://www.ebi.ac.uk/cgi-bin/webservices/WSWUBlast"));\r
-                call.setOperationName(new QName("WSWUBlast", "doWUBlast"));\r
-\r
-                String result = (String) call.invoke(new Object[]\r
-                        {\r
-                            params, seqbytes\r
-                        });\r
-                jobid = result;\r
-                System.out.println(\r
-                    "http://www.ebi.ac.uk/cgi-bin/webservices/WSWUBlast JobId '" +\r
-                    jobid + "'");\r
+              Data inputs[] = new Data[1];\r
+              Data input= new Data();\r
+              input.setType("sequence");\r
+              input.setContent(AlignSeq.extractGaps("-. ",sequence.getSequence()));\r
+              inputs[0]=input;\r
+\r
+              WSWUBlastService service = new WSWUBlastServiceLocator();\r
+              WSWUBlast wublast = service.getWSWUBlast();\r
+              jobid = wublast.runWUBlast(params, inputs);\r
             }\r
             catch (Exception exp)\r
             {\r
-                System.err.println("WSWUBlastClient error:\n" + exp.toString());\r
-                exp.printStackTrace();\r
+              jobComplete = true;\r
+              jobsRunning--;\r
+              System.err.println("WSWUBlastClient error:\n" + exp.toString());\r
+              exp.printStackTrace();\r
             }\r
         }\r
     }\r