/* * 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.ws; import org.apache.axis.client.*; import javax.xml.namespace.QName; import java.util.*; import jalview.datamodel.*; import jalview.gui.*; import javax.swing.*; import java.util.*; import java.awt.*; import jalview.analysis.AlignSeq; import ext.vamsas.*; public class JPredClient extends WSClient { ext.vamsas.JPredWS server; String altitle = ""; java.util.Hashtable SequenceInfo = null; private WebserviceInfo setWebService() { WebServiceName = "JNetWS"; WebServiceJobTitle = "JNet secondary structure prediction"; WebServiceReference = "\"Cuff J. A and Barton G.J (1999) Application of enhanced " + "multiple sequence alignment profiles to improve protein secondary structure prediction, " + "Proteins 40:502-511\"."; WsURL = "http://www.compbio.dundee.ac.uk/JalviewWS/services/jpred"; WebserviceInfo wsInfo = new WebserviceInfo(WebServiceJobTitle, WebServiceReference); return wsInfo; } private boolean locateWebService() { JPredWSServiceLocator loc = new JPredWSServiceLocator(); // Default try { this.server = loc.getjpred(new java.net.URL(WsURL)); // JBPNote will be set from properties ( (JpredSoapBindingStub)this.server).setTimeout(60000); // one minute stub } catch (Exception ex) { JOptionPane.showMessageDialog(Desktop.desktop, "The Secondary Structure Prediction Service named " + WebServiceName + " at " + WsURL + " couldn't be located.", "Internal Jalview Error", JOptionPane.WARNING_MESSAGE); wsInfo.setProgressText("Serious! " + WebServiceName + " Service location failed\nfor URL :" + WsURL + "\n" + ex.getMessage()); wsInfo.setStatus(wsInfo.STATE_STOPPED_SERVERERROR); return false; } return true; } public JPredClient(String title, SequenceI[] msf) { wsInfo = setWebService(); SequenceI seq = msf[0]; altitle = "JNet prediction on " + seq.getName() + " using alignment from " + title; wsInfo.setProgressText("Job details for MSA based prediction (" + title + ") on sequence :\n>" + seq.getName() + "\n" + AlignSeq.extractGaps("-. ", seq.getSequence()) + "\n"); SequenceInfo = jalview.analysis.SeqsetUtils.SeqCharacterHash(seq); if (!locateWebService()) return; JPredThread jthread = new JPredThread(msf); jthread.start(); } public JPredClient(String title, SequenceI seq) { wsInfo = setWebService(); wsInfo.setProgressText("Job details for prediction on sequence :\n>" + seq.getName() + "\n" + AlignSeq.extractGaps("-. ", seq.getSequence()) + "\n"); altitle = "JNet prediction for sequence " + seq.getName() + " from " + title; SequenceInfo = jalview.analysis.SeqsetUtils.SeqCharacterHash(seq); if (!locateWebService()) return; JPredThread jthread = new JPredThread(seq); jthread.start(); } class JPredThread extends Thread { String OutputHeader; ext.vamsas.JpredResult result; ext.vamsas.Sequence sequence; ext.vamsas.Msfalignment msa; String jobId; boolean jobComplete = false; int allowedServerExceptions = 3; // thread dies if too many exceptions. JPredThread(SequenceI seq) { OutputHeader = wsInfo.getProgressText(); this.sequence = new ext.vamsas.Sequence(); this.sequence.setId(seq.getName()); this.sequence.setSeq(AlignSeq.extractGaps("-. ", seq.getSequence())); } JPredThread(SequenceI[] msf) { OutputHeader = wsInfo.getProgressText(); this.sequence = new ext.vamsas.Sequence(); this.sequence.setId(msf[0].getName()); this.sequence.setSeq(AlignSeq.extractGaps("-. ", msf[0].getSequence())); jalview.io.PileUpfile mwrite = new jalview.io.PileUpfile(); this.msa = new ext.vamsas.Msfalignment(); msa.setMsf(mwrite.print(msf)); } public void run() { StartJob(); while (!jobComplete && (allowedServerExceptions > 0)) { try { if ( (result = server.getresult(jobId)) == null) { throw (new Exception( "Timed out when communicating with server\nTry again later.\n")); } if (result.isRunning()) { wsInfo.setStatus(WebserviceInfo.STATE_RUNNING); } else if (result.isQueued()) { wsInfo.setStatus(WebserviceInfo.STATE_QUEUING); } if (result.isFinished()) { parseResult(); jobComplete = true; jobsRunning--; } else { wsInfo.setProgressText(OutputHeader + "\n" + result.getStatus()); if (! (result.isJobFailed() || result.isServerError())) { try { Thread.sleep(5000); } catch (InterruptedException ex1) { } // System.out.println("I'm alive "+seqid+" "+jobid); } else { wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_ERROR); } } } catch (Exception ex) { allowedServerExceptions--; wsInfo.appendProgressText("\nJPredWS Server exception!\n" + ex.getMessage()); try { if (allowedServerExceptions > 0) { Thread.sleep(5000); } } catch (InterruptedException ex1) { } } } if (! (result.isJobFailed() || result.isServerError())) { wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_OK); } else { wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_ERROR); } } void StartJob() { try { if (msa != null) { jobId = server.predictOnMsa(msa); } else { jobId = server.predict(sequence); } if (jobId != null) { if (jobId.startsWith("Broken")) { throw new Exception("Submission " + jobId); } else { System.out.println(WsURL + " Job Id '" + jobId + "'"); } } else { throw new Exception("Server timed out - try again later\n"); } } catch (Exception e) { wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_SERVERERROR); allowedServerExceptions = 0; jobComplete = false; wsInfo.appendProgressText("Failed to submit the prediction: " + e.toString() + "\nJust close the window\n"); System.err.println( "JPredWS Client: Failed to submit the prediction\n" + e.toString() + "\n"); // e.printStackTrace(); TODO: JBPNote DEBUG } } private void addFloatAnnotations(Alignment al, int[] gapmap, Vector values, String Symname, String Visname, float min, float max, int winLength) { Annotation[] annotations = new Annotation[al.getWidth()]; for (int j = 0; j < values.size(); j++) { float value = Float.parseFloat(values.get(j).toString()); annotations[gapmap[j]] = new Annotation("", value + "", ' ', value); } al.addAnnotation(new AlignmentAnnotation(Symname, Visname, annotations, min, max, winLength)); } void parseResult() { // OutputHeader = output.getText(); if (result.isFailed()) { OutputHeader += "Job failed.\n"; } if (result.getStatus() != null) { OutputHeader += "\n" + result.getStatus(); } if (result.getPredfile() != null) { OutputHeader += "\n" + result.getPredfile(); // JBPNote The returned files from a webservice could be hidden behind icons in the monitor window that, when clicked, pop up their corresponding data } if (result.getAligfile() != null) { OutputHeader += "\n" + result.getAligfile(); } wsInfo.setProgressText(OutputHeader); try { // JPredFile prediction = new JPredFile("C:/JalviewX/files/jpred.txt", "File"); jalview.io.JPredFile prediction = new jalview.io.JPredFile(result. getPredfile(), "Paste"); SequenceI[] preds = prediction.getSeqsAsArray(); Alignment al; int FirstSeq; // the position of the query sequence in Alignment al boolean noMsa = true; // set if no MSA has been returned by JPred if (this.msa != null && result.getAligfile() != null) { // we ignore the returned alignment if we only predicted on a single sequence String format = jalview.io.IdentifyFile.Identify(result.getAligfile(), "Paste"); if (jalview.io.FormatAdapter.formats.contains(format)) { al = new Alignment(jalview.io.FormatAdapter.readFile(result. getAligfile(), "Paste", format)); noMsa = false; FirstSeq = 0; } else { throw (new Exception("Unknown format 'format' for file : \n" + result.getAligfile())); } } else { al = new Alignment(preds); FirstSeq = prediction.getQuerySeqPosition(); } if (!jalview.analysis.SeqsetUtils.SeqCharacterUnhash(al.getSequenceAt( FirstSeq), SequenceInfo)) { throw (new Exception( "Couldn't recover sequence properties for JNet Query sequence!")); } AlignmentAnnotation annot; Annotation[] annotations = null; int i = 0; int width = preds[0].getSequence().length(); int[] gapmap = al.getSequenceAt(FirstSeq).gapMap(); if (gapmap.length != width) { throw (new Exception( "Jnet Client Error\nNumber of residues in supposed query sequence :\n" + al.getSequenceAt(FirstSeq).getName() + "\n" + al.getSequenceAt(FirstSeq).getSequence() + "\nDiffer from number of prediction sites in \n" + result.getPredfile() + "\n")); } // JBPNote Should also rename the query sequence sometime... i = 0; while (i < preds.length) { String id = preds[i].getName().toUpperCase(); if (id.startsWith("LUPAS") || id.startsWith("JNET") || id.startsWith("JPRED")) { annotations = new Annotation[al.getWidth()]; if (id.equals("JNETPRED") || id.equals("JNETPSSM") || id.equals("JNETFREQ") || id.equals("JNETHMM") || id.equals("JNETALIGN") || id.equals("JPRED")) { for (int j = 0; j < width; j++) { annotations[gapmap[j]] = new Annotation("", "", preds[i].getCharAt(j), 0); } } else if (id.equals("JNETCONF")) { for (int j = 0; j < width; j++) { float value = Float.parseFloat(preds[i].getCharAt(j) + ""); annotations[gapmap[j]] = new Annotation(preds[i].getCharAt(j) + "", "", preds[i].getCharAt(j), value); } } else { for (int j = 0; j < width; j++) { annotations[gapmap[j]] = new Annotation(preds[i].getCharAt(j) + "", "", ' ', 0); } } if (id.equals("JNETCONF")) { annot = new AlignmentAnnotation(preds[i].getName(), "JNet Output", annotations, 0f, 10f, 1); } else { annot = new AlignmentAnnotation(preds[i].getName(), "JNet Output", annotations); } al.addAnnotation(annot); if (noMsa) { al.deleteSequence(preds[i]); } } i++; } Hashtable scores = prediction.getScores(); /* addFloatAnnotations(al, gapmap, (Vector)scores.get("JNETPROPH"), "JnetpropH", "Jnet Helix Propensity", 0f,1f,1); addFloatAnnotations(al, gapmap, (Vector)scores.get("JNETPROPB"), "JnetpropB", "Jnet Beta Sheet Propensity", 0f,1f,1); addFloatAnnotations(al, gapmap, (Vector)scores.get("JNETPROPC"), "JnetpropC", "Jnet Coil Propensity", 0f,1f,1); */ AlignFrame af = new AlignFrame(al); Desktop.addInternalFrame(af, altitle, AlignFrame.NEW_WINDOW_WIDTH, AlignFrame.NEW_WINDOW_HEIGHT); } catch (Exception ex) { ex.printStackTrace(); } } } }