updated to jalview 2.1 and begun ArchiveClient/VamsasClient/VamsasStore updates.
[jalview.git] / src / jalview / io / WSWUBlastClient.java
index 0906d12..d7cd478 100755 (executable)
-/*\r
-* Jalview - A Sequence Alignment Editor and Viewer\r
-* Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
-*\r
-* This program is free software; you can redistribute it and/or\r
-* modify it under the terms of the GNU General Public License\r
-* as published by the Free Software Foundation; either version 2\r
-* of the License, or (at your option) any later version.\r
-*\r
-* This program is distributed in the hope that it will be useful,\r
-* but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
-* GNU General Public License for more details.\r
-*\r
-* You should have received a copy of the GNU General Public License\r
-* along with this program; if not, write to the Free Software\r
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
-*/\r
-package jalview.io;\r
-\r
-import jalview.datamodel.*;\r
-\r
-import jalview.gui.*;\r
-\r
-import org.apache.axis.client.*;\r
-\r
-import java.util.*;\r
-\r
-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
- *\r
- * @author $author$\r
- * @version $Revision$\r
- */\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(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
-            +"\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
-            Sequence sequence = (Sequence)ids.get(i);\r
-            System.out.println(sequence.getName());\r
-\r
-            BlastThread thread = new BlastThread(sequence);\r
-            thread.start();\r
-            jobsRunning++;\r
-        }\r
-\r
-        ImageTwirler thread = new ImageTwirler();\r
-        thread.start();\r
-    }\r
-\r
-\r
-    /**\r
-     * DOCUMENT ME!\r
-     *\r
-     * @param id1 DOCUMENT ME!\r
-     * @param res DOCUMENT ME!\r
-     */\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" + seq.getName() + " :");\r
-\r
-        while (st.hasMoreTokens())\r
-        {\r
-            data = st.nextToken();\r
-\r
-            if (data.indexOf(">UNIPROT") > -1)\r
-            {\r
-                int index = data.indexOf(">UNIPROT") + 9;\r
-                id2 = data.substring(index, data.indexOf(" ", index));\r
-\r
-                boolean identitiesFound = false;\r
-                while (!identitiesFound)\r
-                {\r
-                    data = st.nextToken();\r
-\r
-                    if (data.indexOf("Identities") > -1)\r
-                    {\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.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
-    {\r
-        ImageIcon[] imageIcon;\r
-        int imageIndex = 0;\r
-\r
-        public ImageTwirler()\r
-        {\r
-            imageIcon = new ImageIcon[9];\r
-\r
-            for (int i = 0; i < 9; i++)\r
-            {\r
-                java.net.URL url = getClass().getResource("/images/dna" +\r
-                        (i + 1) + ".gif");\r
-\r
-                if (url != null)\r
-                {\r
-                    imageIcon[i] = new ImageIcon(url);\r
-                }\r
-            }\r
-        }\r
-\r
-        public void run()\r
-        {\r
-            while (jobsRunning > 0)\r
-            {\r
-                try\r
-                {\r
-                    Thread.sleep(100);\r
-                    imageIndex++;\r
-                    imageIndex %= 9;\r
-                    output.setFrameIcon(imageIcon[imageIndex]);\r
-                    output.setTitle("BLASTing for unidentified sequences - " +\r
-                        jobsRunning + " jobs running.");\r
-                }\r
-                catch (Exception ex)\r
-                {\r
-                }\r
-            }\r
-\r
-            if (jobsRunning == 0)\r
-            {\r
-              updateIds();\r
-            }\r
-        }\r
-    }\r
-\r
-    class BlastThread extends Thread\r
-    {\r
-        Sequence sequence;\r
-        String jobid;\r
-        boolean jobComplete = false;\r
-\r
-        BlastThread(Sequence sequence)\r
-        {\r
-          System.out.println("blasting for: "+sequence.getName());\r
-          this.sequence = sequence;\r
-        }\r
-\r
-        public void run()\r
-        {\r
-            StartJob();\r
-\r
-            while (!jobComplete)\r
-            {\r
-                try\r
-                {\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
-                }\r
-            }\r
-        }\r
-\r
-        void StartJob()\r
-        {\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
-              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
-              jobComplete = true;\r
-              jobsRunning--;\r
-              System.err.println("WSWUBlastClient error:\n" + exp.toString());\r
-              exp.printStackTrace();\r
-            }\r
-        }\r
-    }\r
-}\r
+/*
+* Jalview - A Sequence Alignment Editor and Viewer
+* Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+*/
+package jalview.io;
+
+import jalview.datamodel.*;
+
+import jalview.gui.*;
+
+import org.apache.axis.client.*;
+
+import java.util.*;
+
+import javax.swing.*;
+
+import javax.xml.namespace.QName;
+import jalview.analysis.AlignSeq;
+
+import uk.ac.ebi.www.*;
+
+/**
+ * DOCUMENT ME!
+ *
+ * @author $author$
+ * @version $Revision$
+ */
+public class WSWUBlastClient
+{
+    AlignmentPanel ap;
+    AlignmentI al;
+    CutAndPasteTransfer output = new CutAndPasteTransfer();
+    int jobsRunning = 0;
+
+    Vector suggestedIds = new Vector();
+    /**
+     * Creates a new WSWUBlastClient object.
+     *
+     * @param al DOCUMENT ME!
+     * @param ids DOCUMENT ME!
+     */
+    public WSWUBlastClient(AlignmentPanel ap, AlignmentI al, ArrayList ids)
+    {
+        this.ap = ap;
+        this.al = al;
+        output.setText(
+            "To display sequence features an exact Uniprot id with 100% sequence identity match must be entered."
+            +"\nIn order to display these features, try changing the names of your sequences to the ids suggested below."
+            +"\n\nRunning WSWUBlast at EBI."
+            +"\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."
+            +"\nSOAP-based services provided by the European Bioinformatics Institute."
+            +"\nNucleic Acids Res. 33(1):W25-W28 (2005));");
+
+        Desktop.addInternalFrame(output,
+            "BLASTing for unidentified sequences ", 800, 300);
+
+        for (int i = 0; i < ids.size(); i++)
+        {
+            Sequence sequence = (Sequence)ids.get(i);
+            System.out.println(sequence.getName());
+
+            BlastThread thread = new BlastThread(sequence);
+            thread.start();
+            jobsRunning++;
+        }
+
+        ImageTwirler thread = new ImageTwirler();
+        thread.start();
+    }
+
+
+    /**
+     * DOCUMENT ME!
+     *
+     * @param id1 DOCUMENT ME!
+     * @param res DOCUMENT ME!
+     */
+    void parseResult(Sequence seq, String res)
+    {
+        StringTokenizer st = new StringTokenizer(res, "\n");
+        String data;
+        String id2;
+        int maxFound = 90;
+        StringBuffer buffer = new StringBuffer("\n\n" + seq.getName() + " :");
+
+        while (st.hasMoreTokens())
+        {
+            data = st.nextToken();
+
+            if (data.indexOf(">UNIPROT") > -1)
+            {
+                int index = data.indexOf(">UNIPROT") + 9;
+                id2 = data.substring(index, data.indexOf(" ", index));
+
+                boolean identitiesFound = false;
+                while (!identitiesFound)
+                {
+                    data = st.nextToken();
+
+                    if (data.indexOf("Identities") > -1)
+                    {
+                       identitiesFound = true;
+
+                       int value = Integer.parseInt(data.substring(data.indexOf(
+                           "(") + 1,
+                                                                   data.indexOf("%")));
+
+                        if (value >= maxFound)
+                        {
+                            maxFound = value;
+                            buffer.append(" " + id2 + " " + value + "%; ");
+                            suggestedIds.addElement( new Object[]{seq, id2});
+                        }
+                    }
+                }
+            }
+        }
+
+        output.appendText(buffer.toString());
+    }
+
+    void updateIds()
+    {
+        // This must be outside the run() body as java 1.5
+     // will not return any value from the OptionPane to the expired thread.
+      int reply = JOptionPane.showConfirmDialog(
+          Desktop.desktop, "Automatically update suggested ids?",
+          "Auto replace sequence ids", JOptionPane.YES_NO_OPTION);
+
+      if (reply == JOptionPane.YES_OPTION)
+      {
+        Enumeration keys = suggestedIds.elements();
+        while(keys.hasMoreElements())
+        {
+          Object [] object = (Object[])keys.nextElement();
+
+          Sequence oldseq = (Sequence)object[0];
+
+          oldseq.setName( object[1].toString() );
+
+          // Oldseq is actually in the dataset, we must find the
+          // Visible seq and change its name also.
+          for (int i = 0; i < al.getHeight(); i++)
+          {
+            if (al.getSequenceAt(i).getDatasetSequence() == oldseq)
+            {
+              al.getSequenceAt(i).setName(oldseq.getName());
+              break;
+            }
+          }
+
+          DBRefEntry [] entries = oldseq.getDBRef();
+          if (entries != null)
+          {
+            oldseq.addDBRef(new jalview.datamodel.
+                                                 DBRefEntry(jalview.datamodel.DBRefSource.UNIPROT,
+                "0",
+                entries[0].getAccessionId()));
+          }
+        }
+      }
+      ap.repaint();
+
+    }
+
+    class ImageTwirler extends Thread
+    {
+        ImageIcon[] imageIcon;
+        int imageIndex = 0;
+
+        public ImageTwirler()
+        {
+            imageIcon = new ImageIcon[9];
+
+            for (int i = 0; i < 9; i++)
+            {
+                java.net.URL url = getClass().getResource("/images/dna" +
+                        (i + 1) + ".gif");
+
+                if (url != null)
+                {
+                    imageIcon[i] = new ImageIcon(url);
+                }
+            }
+        }
+
+        public void run()
+        {
+            while (jobsRunning > 0)
+            {
+                try
+                {
+                    Thread.sleep(100);
+                    imageIndex++;
+                    imageIndex %= 9;
+                    output.setFrameIcon(imageIcon[imageIndex]);
+                    output.setTitle("BLASTing for unidentified sequences - " +
+                        jobsRunning + " jobs running.");
+                }
+                catch (Exception ex)
+                {
+                }
+            }
+
+            if (jobsRunning == 0)
+            {
+              updateIds();
+            }
+        }
+    }
+
+    class BlastThread extends Thread
+    {
+        Sequence sequence;
+        String jobid;
+        boolean jobComplete = false;
+
+        BlastThread(Sequence sequence)
+        {
+          System.out.println("blasting for: "+sequence.getName());
+          this.sequence = sequence;
+        }
+
+        public void run()
+        {
+            StartJob();
+
+            while (!jobComplete)
+            {
+                try
+                {
+                  WSWUBlastService service =  new WSWUBlastServiceLocator();
+                  WSWUBlast wublast = service.getWSWUBlast();
+                  WSFile[] results = wublast.getResults(jobid);
+
+                  if(results!=null)
+                  {
+                      String result = new String(wublast.poll(jobid, "tooloutput"));
+                      parseResult(sequence, result);
+                      jobComplete = true;
+                      jobsRunning--;
+                  }
+                  else
+                  {
+                    Thread.sleep(10000);
+                    System.out.println("WSWuBlastClient: I'm alive " +
+                                       sequence.getName() + " " + jobid); // log.debug
+                  }
+                }
+                catch (Exception ex)
+                {
+                }
+            }
+        }
+
+        void StartJob()
+        {
+          InputParams params = new InputParams();
+
+          params.setProgram("blastp");
+          params.setDatabase("uniprot");
+          params.setMatrix("pam10");
+
+          params.setNumal(5);
+          params.setSensitivity("low");
+          params.setSort("totalscore");
+          params.setOutformat("txt");
+          params.setAsync(true);
+
+            try
+            {
+              Data inputs[] = new Data[1];
+              Data input= new Data();
+              input.setType("sequence");
+              input.setContent(AlignSeq.extractGaps("-. ",sequence.getSequence()));
+              inputs[0]=input;
+
+              WSWUBlastService service = new WSWUBlastServiceLocator();
+              WSWUBlast wublast = service.getWSWUBlast();
+              jobid = wublast.runWUBlast(params, inputs);
+            }
+            catch (Exception exp)
+            {
+              jobComplete = true;
+              jobsRunning--;
+              System.err.println("WSWUBlastClient error:\n" + exp.toString());
+              exp.printStackTrace();
+            }
+        }
+    }
+}