-package jalview.io;\r
-\r
-import org.apache.axis.client.*;\r
-import javax.xml.namespace.QName;\r
-import java.util.*;\r
-import jalview.datamodel.*;\r
-import jalview.gui.*;\r
-import javax.swing.*;\r
-import java.util.*;\r
-import java.awt.*;\r
-\r
-public class WSWUBlastClient\r
-{\r
- JInternalFrame outputFrame = new JInternalFrame();\r
- CutAndPasteTransfer output = new CutAndPasteTransfer(false);\r
- int jobsRunning = 0;\r
-\r
- public WSWUBlastClient(AlignmentI al, ArrayList ids)\r
- {\r
-\r
- output.formatForOutput();\r
- outputFrame.setContentPane(output);\r
- output.setText("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
- Desktop.addInternalFrame(outputFrame, "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
- for (int n = 0; n < sequence.getSequence().length(); n++)\r
- {\r
- if (!jalview.util.Comparison.isGap(sequence.getCharAt(n)))\r
- nonGapped.append(sequence.getCharAt(n));\r
- }\r
-\r
- BlastThread thread = new BlastThread(ids.get(i).toString(), nonGapped.toString());\r
- // thread.start();\r
- jobsRunning ++;\r
- }\r
- ImageTwirler thread = new ImageTwirler();\r
- thread.start();\r
- }\r
-\r
- class ImageTwirler extends Thread\r
- {\r
- ImageIcon [] imageIcon;\r
- int imageIndex = 0;\r
- public ImageTwirler()\r
- {\r
- imageIcon = new ImageIcon[9];\r
- for(int i=0; i<9; i++)\r
- {\r
- java.net.URL url = getClass().getResource("/dna" + (i+1) + ".gif");\r
- if (url != null)\r
- imageIcon[i] = new ImageIcon(url);\r
- }\r
- }\r
-\r
- public void run()\r
- {\r
- while(jobsRunning>0)\r
- {\r
- try{\r
- Thread.sleep(100);\r
- imageIndex++;\r
- imageIndex %=9;\r
- outputFrame.setFrameIcon( imageIcon[imageIndex]);\r
- outputFrame.setTitle("BLASTing for unidentified sequences - "+jobsRunning+" jobs running.");\r
-\r
- }catch(Exception ex){}\r
-\r
- }\r
- }\r
- }\r
-\r
-\r
-\r
-\r
- class BlastThread extends Thread\r
- {\r
- String sequence;\r
- String seqid;\r
- String jobid;\r
- boolean jobComplete = false;\r
-\r
- BlastThread(String id, String sequence)\r
- {\r
- this.sequence = sequence;\r
- seqid = id;\r
- }\r
-\r
- public void run()\r
- {\r
- StartJob();\r
-\r
- while (!jobComplete)\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", "polljob"));\r
- String result = (String) call.invoke(new Object[]\r
- {jobid, "xml"});\r
- if(result.indexOf("JOB PENDING")==-1 && result.indexOf("JOB RUNNING")==-1)\r
- {\r
- parseResult(seqid, result);\r
- jobComplete = true;\r
- jobsRunning --;\r
- }\r
- Thread.sleep(5000);\r
- System.out.println("I'm alive "+seqid+" "+jobid);\r
- }\r
- catch (Exception ex)\r
- {}\r
- }\r
- }\r
-\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
- byte[] seqbytes = sequence.getBytes();\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
- String result = (String) call.invoke(new Object[]\r
- {params, seqbytes});\r
- jobid = result;\r
- System.out.println(jobid);\r
-\r
- }\r
- catch (Exception exp)\r
- {\r
- System.err.println("ERROR:\n" + exp.toString());\r
- exp.printStackTrace();\r
- }\r
- }\r
- }\r
-\r
- void parseResult(String id1, 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
-\r
- while( st.hasMoreTokens() )\r
- {\r
- data = st.nextToken();\r
-\r
- if(data.indexOf("database=\"uniprot\" id=")>-1)\r
- {\r
- int index = data.indexOf("database=\"uniprot\" id=")+ 23;\r
- id2 = data.substring( index, data.indexOf("\"", index) );\r
- while( data.indexOf("</alignment>")==-1)\r
- {\r
- data = st.nextToken();\r
- if(data.indexOf("<identity>")>-1)\r
- {\r
- int value = Integer.parseInt( data.substring(data.indexOf("<identity>")+10, data.indexOf("</identity>")));\r
- if(value>=maxFound)\r
- {\r
- maxFound = value;\r
- buffer.append(" "+ id2 + " " + value+"%; ");\r
- }\r
- }\r
- }\r
-\r
- }\r
-\r
-\r
- }\r
-\r
- output.setText(output.getText()+buffer.toString());\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();
+ }
+ }
+ }
+}