X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2FWSWUBlastClient.java;h=e2910eef143f1a819c52cdffb4caaa3b2696c375;hb=6af1258218f8fdbb2d9d6794e72db4c41ec8bf48;hp=ed29f89cb2404aaa98d04ebf037ab7060b4f67c8;hpb=42f46263655185b0a436356c37295ec82d091dce;p=jalview.git diff --git a/src/jalview/io/WSWUBlastClient.java b/src/jalview/io/WSWUBlastClient.java index ed29f89..e2910ee 100755 --- a/src/jalview/io/WSWUBlastClient.java +++ b/src/jalview/io/WSWUBlastClient.java @@ -1,119 +1,305 @@ +/* +* 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 org.apache.axis.client.*; -import javax.xml.namespace.QName; -import java.util.*; 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 { - CutAndPasteTransfer cap = new CutAndPasteTransfer(false); - - public WSWUBlastClient(AlignmentI al, ArrayList ids) - { - JInternalFrame frame = new JInternalFrame(); - cap.formatForOutput(); - frame.setContentPane(cap); - cap.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(frame, "BLASTing for unidentified sequences ", 800,300); - - for(int i=0; iUNIPROT") > -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}); + } + } + } } - catch (Exception exp) { - System.err.println ("ERROR:\n" + exp.toString()); - exp.printStackTrace(); } + + output.appendText(buffer.toString()); } - void parseResult(String id1, String res) + void updateIds() { - StringTokenizer st = new StringTokenizer(res, "\n"); - String data; - String id2; - int maxFound = 90; - StringBuffer buffer = new StringBuffer("\n\n"+id1+" :"); + // 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); - while( st.hasMoreTokens() ) + if (reply == JOptionPane.YES_OPTION) { - data = st.nextToken(); - - if(data.indexOf("database=\"uniprot\" id=")>-1) + Enumeration keys = suggestedIds.elements(); + while(keys.hasMoreElements()) { - int index = data.indexOf("database=\"uniprot\" id=")+ 23; - id2 = data.substring( index, data.indexOf("\"", index) ); - while( data.indexOf("")==-1) + 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++) { - data = st.nextToken(); - if(data.indexOf("")>-1) + if (al.getSequenceAt(i).getDatasetSequence() == oldseq) { - int value = Integer.parseInt( data.substring(data.indexOf("")+10, data.indexOf(""))); - if(value>=maxFound) - { - maxFound = value; - buffer.append(" "+ id2 + " " + value+"%; "); - } + 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) + { + } + } - cap.setText(cap.getText()+buffer.toString()); + 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(); + } + } + } }