JAL-1894 update year/version in copyright
[jalview.git] / src / jalview / io / WSWUBlastClient.java
index e1798e3..d94d021 100755 (executable)
-/*\r
- * Jalview - A Sequence Alignment Editor and Viewer\r
- * Copyright (C) 2007 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 java.util.*;\r
-\r
-import javax.swing.*;\r
-\r
-import jalview.analysis.*;\r
-import jalview.datamodel.*;\r
-import jalview.gui.*;\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
-        +\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
-   * 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[]\r
-                                      {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
-        DBRefEntry[] entries = oldseq.getDBRef();\r
-        if (entries != null)\r
-        {\r
-          oldseq.addDBRef(new jalview.datamodel.\r
-                          DBRefEntry(jalview.datamodel.DBRefSource.UNIPROT,\r
-                                     "0",\r
-                                     entries[0].getAccessionId()));\r
-        }\r
-      }\r
-    }\r
-    ap.repaint();\r
-\r
-  }\r
-\r
-  class ImageTwirler\r
-      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\r
-      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("-. ",\r
-                                              sequence.getSequenceAsString()));\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 (Version 2.9.0b1)
+ * Copyright (C) 2015 The Jalview Authors
+ * 
+ * This file is part of Jalview.
+ * 
+ * Jalview 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 3
+ * of the License, or (at your option) any later version.
+ *  
+ * Jalview 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 Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+package jalview.io;
+
+import jalview.analysis.AlignSeq;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.DBRefEntry;
+import jalview.datamodel.Sequence;
+import jalview.gui.AlignmentPanel;
+import jalview.gui.CutAndPasteTransfer;
+import jalview.gui.Desktop;
+import jalview.util.MessageManager;
+
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.StringTokenizer;
+import java.util.Vector;
+
+import javax.swing.ImageIcon;
+import javax.swing.JOptionPane;
+
+import uk.ac.ebi.www.Data;
+import uk.ac.ebi.www.InputParams;
+import uk.ac.ebi.www.WSFile;
+import uk.ac.ebi.www.WSWUBlast;
+import uk.ac.ebi.www.WSWUBlastService;
+import uk.ac.ebi.www.WSWUBlastServiceLocator;
+
+/**
+ * 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(MessageManager
+            .getString("label.wswublast_client_credits"));
+
+    Desktop.addInternalFrame(output, MessageManager
+            .getString("label.blasting_for_unidentified_sequence"), 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.paintAlignment(true);
+
+  }
+
+  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(MessageManager.formatMessage(
+                  "label.blasting_for_unidentified_sequence_jobs_running",
+                  new String[] { Integer.valueOf(jobsRunning).toString() }));
+        } 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.getSequenceAsString()));
+        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();
+      }
+    }
+  }
+}