/* * Jalview - A Sequence Alignment Editor and Viewer * Copyright (C) 2005 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.awt.*; import java.util.*; import javax.swing.*; import javax.xml.namespace.QName; public class WSWUBlastClient { CutAndPasteTransfer output = new CutAndPasteTransfer(); int jobsRunning = 0; public WSWUBlastClient(AlignmentI al, ArrayList ids) { 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(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 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()); thread.start(); jobsRunning++; } ImageTwirler thread = new ImageTwirler(); thread.start(); } 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()); } 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) { } } } } class BlastThread extends Thread { String sequence; String seqid; String jobid; boolean jobComplete = false; BlastThread(String id, String sequence) { this.sequence = sequence; seqid = id; } 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) { } } } 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(); } } } }