From 61b0b38d322aef9105cc564d3f5340fd529039ba Mon Sep 17 00:00:00 2001 From: jprocter Date: Thu, 5 May 2005 13:16:39 +0000 Subject: [PATCH] Added cancel interface for JPred Client and fixed some messages. --- src/jalview/ws/JPredClient.java | 304 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 304 insertions(+) create mode 100755 src/jalview/ws/JPredClient.java diff --git a/src/jalview/ws/JPredClient.java b/src/jalview/ws/JPredClient.java new file mode 100755 index 0000000..2eecf46 --- /dev/null +++ b/src/jalview/ws/JPredClient.java @@ -0,0 +1,304 @@ +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 +{ + int jobsRunning = 0; + ext.vamsas.JpredSoapBindingStub server; + WebserviceInfo wsInfo; + + public JPredClient(SequenceI[] msf) + { + wsInfo = new WebserviceInfo("JNet secondary structure prediction job", + "\"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\"."); + + SequenceI seq = msf[0]; + wsInfo.setProgressText("Job details for MSA based prediction on sequence :\nName : " + + seq.getName() + "\nSequence : " + + AlignSeq.extractGaps("-. ",seq.getSequence()) + "\n"); + + + JPredWSServiceLocator loc = new JPredWSServiceLocator(); // Default + try { + this.server = (JpredSoapBindingStub) loc.getjpred(); // JBPNote will be set from properties + } + catch (Exception ex) { + wsInfo.setProgressText("Serious! JPred Service location failed\nfor URL :" + +loc.getjpredAddress()+"\n"+ex.getMessage()); + } + + JPredThread jthread = new JPredThread(msf); + jthread.start(); + } + + public JPredClient(SequenceI seq) + { + wsInfo = new WebserviceInfo("JNet secondary structure prediction job", + "\"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\"."); + + + wsInfo.setProgressText("Job details for prediction on sequence :\nName : " + + seq.getName() + "\nSequence : " + AlignSeq.extractGaps("-. ",seq.getSequence()) + "\n"); + + JPredWSServiceLocator loc = new JPredWSServiceLocator(); // Default + try { + this.server = (JpredSoapBindingStub) loc.getjpred(); // JBPNote will be set from properties + } + catch (Exception ex) { + wsInfo.setProgressText("Serious! JPred Service location failed\nfor URL :" + +loc.getjpredAddress()+"\n"+ex.getMessage()); + } + + 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.MSFfile mwrite = new jalview.io.MSFfile(); + this.msa = new ext.vamsas.Msfalignment(); + msa.setMsf(mwrite.print(msf)); + } + + + public void run() + { + + StartJob(); + + while (!jobComplete && (allowedServerExceptions > 0)) + { + try + { + result = server.getresult(jobId); + + 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())) + { + Thread.sleep(5000); + // 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()); + } + } + + 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); + } + System.out.println(jobId); + } + catch (Exception e) + { + System.out.println("JPredWS Client: Failed to submit the prediction\n" + + e.toString() + "\n"); + e.printStackTrace(); + } + } + + 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(); + } + + 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("Jpred 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, + "JNet Prediction for sequence ", + AlignFrame.NEW_WINDOW_WIDTH, AlignFrame.NEW_WINDOW_HEIGHT); + }catch(Exception ex){ex.printStackTrace();} + + } + + } +} + -- 1.7.10.2