X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2FWSWUBlastClient.java;h=391c9a8d67c22020ebaa7dc2c3fad00c25d53253;hb=91416b3038a6f3fc655791512770da07cb6cb251;hp=29a0900aa4ed54d1b0d1590a0c668326a3cc1211;hpb=588042b69abf8e60bcc950b24c283933c7dd422f;p=jalview.git diff --git a/src/jalview/io/WSWUBlastClient.java b/src/jalview/io/WSWUBlastClient.java index 29a0900..391c9a8 100755 --- a/src/jalview/io/WSWUBlastClient.java +++ b/src/jalview/io/WSWUBlastClient.java @@ -24,38 +24,56 @@ import jalview.gui.*; import org.apache.axis.client.*; -import java.awt.*; - import java.util.*; import javax.swing.*; import javax.xml.namespace.QName; - - -public class WSWUBlastClient { +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; - 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."); + "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++) { - SequenceI sequence = al.findName(ids.get(i).toString()); - StringBuffer nonGapped = new StringBuffer(); + for (int i = 0; i < ids.size(); i++) + { + Sequence sequence = (Sequence)ids.get(i); + System.out.println(sequence.getName()); - for (int n = 0; n < sequence.getSequence().length(); n++) { - if (!jalview.util.Comparison.isGap(sequence.getCharAt(n))) { - nonGapped.append(sequence.getCharAt(n)); - } - } - - BlastThread thread = new BlastThread(ids.get(i).toString(), - nonGapped.toString()); + BlastThread thread = new BlastThread(sequence); thread.start(); jobsRunning++; } @@ -64,141 +82,224 @@ public class WSWUBlastClient { thread.start(); } - void parseResult(String id1, String res) { + + /** + * 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" + id1 + " :"); + StringBuffer buffer = new StringBuffer("\n\n" + seq.getName() + " :"); - while (st.hasMoreTokens()) { + 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)); + if (data.indexOf(">UNIPROT") > -1) + { + int index = data.indexOf(">UNIPROT") + 9; + id2 = data.substring(index, data.indexOf(" ", index)); - while (data.indexOf("") == -1) { + boolean identitiesFound = false; + while (!identitiesFound) + { data = st.nextToken(); - if (data.indexOf("") > -1) { - int value = Integer.parseInt(data.substring(data.indexOf( - "") + 10, - data.indexOf(""))); + if (data.indexOf("Identities") > -1) + { + identitiesFound = true; + + int value = Integer.parseInt(data.substring(data.indexOf( + "(") + 1, + data.indexOf("%"))); - if (value >= maxFound) { + if (value >= maxFound) + { maxFound = value; buffer.append(" " + id2 + " " + value + "%; "); + suggestedIds.addElement( new Object[]{seq, id2}); } } } } } - output.setText(output.getText() + buffer.toString()); + 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; + } + } + + Vector entries = oldseq.getDBRef(); + if (entries != null) + { + DBRefEntry entry = (DBRefEntry) entries.elementAt(0); + oldseq.addDBRef(new jalview.datamodel. + DBRefEntry(jalview.datamodel.DBRefSource.UNIPROT, + "0", + entry.getAccessionId())); + } + } + } + ap.repaint(); + } - class ImageTwirler extends Thread { + class ImageTwirler extends Thread + { ImageIcon[] imageIcon; int imageIndex = 0; - public ImageTwirler() { + 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"); - if (url != null) { + if (url != null) + { imageIcon[i] = new ImageIcon(url); } } } - public void run() { - while (jobsRunning > 0) { - try { + 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) { } + catch (Exception ex) + { + } + } + + if (jobsRunning == 0) + { + updateIds(); } } } - class BlastThread extends Thread { - String sequence; - String seqid; + class BlastThread extends Thread + { + Sequence sequence; String jobid; boolean jobComplete = false; - BlastThread(String id, String sequence) { - this.sequence = sequence; - seqid = id; + BlastThread(Sequence sequence) + { + System.out.println("blasting for: "+sequence.getName()); + this.sequence = sequence; } - public void run() { + public void run() + { StartJob(); - while (!jobComplete) { - 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)) { - parseResult(seqid, result); - jobComplete = true; - jobsRunning--; - } - - Thread.sleep(5000); - - // System.out.println("WSWuBlastClient: I'm alive "+seqid+" "+jobid); // log.debug - } catch (Exception ex) { + 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() { - 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(); - - 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( - "http://www.ebi.ac.uk/cgi-bin/webservices/WSWUBlast JobId '" + - jobid + "'"); - } catch (Exception exp) { - System.err.println("WSWUBlastClient error:\n" + exp.toString()); - exp.printStackTrace(); + 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(); } } }