X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2FWSWUBlastClient.java;h=1d4262009629639c12b8b08a27996f925e16a01e;hb=452ccbd713789eaa4ce2b74cfebbfd45f49aebb4;hp=1622187996bc132e5d64a1c55e03f27930fa7c88;hpb=5f1b13704251c9f3119351c972bd7b74a4064e9c;p=jalview.git diff --git a/src/jalview/io/WSWUBlastClient.java b/src/jalview/io/WSWUBlastClient.java index 1622187..1d42620 100755 --- a/src/jalview/io/WSWUBlastClient.java +++ b/src/jalview/io/WSWUBlastClient.java @@ -1,93 +1,235 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer + * Copyright (C) 2007 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 org.apache.axis.client.*; -import javax.xml.namespace.QName; import java.util.*; + +import javax.swing.*; + +import jalview.analysis.*; import jalview.datamodel.*; import jalview.gui.*; -import javax.swing.*; -import java.util.*; -import java.awt.*; +import uk.ac.ebi.www.*; +/** + * DOCUMENT ME! + * + * @author $author$ + * @version $Revision$ + */ public class WSWUBlastClient { - JInternalFrame outputFrame = new JInternalFrame(); - CutAndPasteTransfer output = new CutAndPasteTransfer(false); + AlignmentPanel ap; + AlignmentI al; + CutAndPasteTransfer output = new CutAndPasteTransfer(); int jobsRunning = 0; - public WSWUBlastClient(AlignmentI al, ArrayList ids) + 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(); + } - output.formatForOutput(); - outputFrame.setContentPane(output); - 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."); - Desktop.addInternalFrame(outputFrame, "BLASTing for unidentified sequences ", 800,300); + /** + * 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() + " :"); - for(int i=0; iUNIPROT") > -1) { - if (!jalview.util.Comparison.isGap(sequence.getCharAt(n))) - nonGapped.append(sequence.getCharAt(n)); + 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); - BlastThread thread = new BlastThread(ids.get(i).toString(), nonGapped.toString()); - thread.start(); - jobsRunning ++; - } - ImageTwirler thread = new ImageTwirler(); - thread.start(); } - class ImageTwirler extends Thread + class ImageTwirler + extends Thread { - ImageIcon [] imageIcon; + ImageIcon[] imageIcon; int imageIndex = 0; + public ImageTwirler() { imageIcon = new ImageIcon[9]; - for(int i=0; i<9; i++) + + for (int i = 0; i < 9; i++) { - java.net.URL url = getClass().getResource("/images/dna" + (i+1) + ".gif"); + 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) + while (jobsRunning > 0) { - try{ + try + { Thread.sleep(100); imageIndex++; - imageIndex %=9; - outputFrame.setFrameIcon( imageIcon[imageIndex]); - outputFrame.setTitle("BLASTing for unidentified sequences - "+jobsRunning+" jobs running."); - - }catch(Exception ex){} + 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 + class BlastThread + extends Thread { - String sequence; - String seqid; + Sequence sequence; String jobid; boolean jobComplete = false; - BlastThread(String id, String sequence) + BlastThread(Sequence sequence) { + System.out.println("blasting for: " + sequence.getName()); this.sequence = sequence; - seqid = id; } public void run() @@ -98,95 +240,64 @@ public class WSWUBlastClient { try { - Call call = (Call)new Service().createCall(); - call.setTargetEndpointAddress(new java.net.URL( - "http://www.ebi.ac.uk/cgi-bin/webservices/WSWUBlast")); - call.setOperationName(new QName("WSWUBlast", "polljob")); - String result = (String) call.invoke(new Object[] - {jobid, "xml"}); - if(result.indexOf("JOB PENDING")==-1 && result.indexOf("JOB RUNNING")==-1) + WSWUBlastService service = new WSWUBlastServiceLocator(); + WSWUBlast wublast = service.getWSWUBlast(); + WSFile[] results = wublast.getResults(jobid); + + if (results != null) { - parseResult(seqid, result); - jobComplete = true; - jobsRunning --; + 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 } - Thread.sleep(5000); - System.out.println("I'm alive "+seqid+" "+jobid); } catch (Exception ex) - {} + { + } } } void StartJob() { - HashMap params = new HashMap(); - params.put("database", "uniprot"); - params.put("sensitivity", "low"); - params.put("sort", "totalscore"); - params.put("matrix", "pam10"); - params.put("program", "blastp"); - params.put("alignments", "5"); - params.put("outformat", "xml"); - params.put("searchtype", "1"); - byte[] seqbytes = sequence.getBytes(); + 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 { - Call call = (Call)new Service().createCall(); - call.setTargetEndpointAddress(new java.net.URL( - "http://www.ebi.ac.uk/cgi-bin/webservices/WSWUBlast")); - call.setOperationName(new QName("WSWUBlast", "doWUBlast")); - String result = (String) call.invoke(new Object[] - {params, seqbytes}); - jobid = result; - System.out.println(jobid); + 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) { - System.err.println("ERROR:\n" + exp.toString()); + jobComplete = true; + jobsRunning--; + System.err.println("WSWUBlastClient error:\n" + exp.toString()); exp.printStackTrace(); } } } - - void parseResult(String id1, String res) - { - StringTokenizer st = new StringTokenizer(res, "\n"); - String data; - String id2; - int maxFound = 90; - StringBuffer buffer = new StringBuffer("\n\n"+id1+" :"); - - while( st.hasMoreTokens() ) - { - data = st.nextToken(); - - if(data.indexOf("database=\"uniprot\" id=")>-1) - { - int index = data.indexOf("database=\"uniprot\" id=")+ 23; - id2 = data.substring( index, data.indexOf("\"", index) ); - while( data.indexOf("")==-1) - { - data = st.nextToken(); - if(data.indexOf("")>-1) - { - int value = Integer.parseInt( data.substring(data.indexOf("")+10, data.indexOf(""))); - if(value>=maxFound) - { - maxFound = value; - buffer.append(" "+ id2 + " " + value+"%; "); - } - } - } - - } - - - } - - output.setText(output.getText()+buffer.toString()); - } - }