X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2FJPredClient.java;h=c463c5173a67cbbca66d757e5ff8fa312dc2dbe4;hb=06fef82a8d6fcdcfadc58d747f9f774297cd639d;hp=7c2675d2f9ced7b757bc214ab6c822df578c8dd3;hpb=1e31232ca2c48ae852b506fc637a2610c99b4c22;p=jalview.git diff --git a/src/jalview/io/JPredClient.java b/src/jalview/io/JPredClient.java index 7c2675d..c463c51 100755 --- a/src/jalview/io/JPredClient.java +++ b/src/jalview/io/JPredClient.java @@ -11,108 +11,107 @@ import java.awt.*; import jalview.analysis.AlignSeq; import ext.vamsas.*; + public class JPredClient { - - JInternalFrame outputFrame = new JInternalFrame(); - CutAndPasteTransfer output = new CutAndPasteTransfer(false); int jobsRunning = 0; ext.vamsas.JpredSoapBindingStub server; + WebserviceInfo wsInfo; - public JPredClient(SequenceI seq) + public JPredClient(SequenceI[] msf) { - output.formatForOutput(); - outputFrame.setContentPane(output); + 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"); - output.setText("Job details for prediction on sequence :\nName : " - + seq.getName() + "\nSequence : " + seq.getSequence() + "\n"); - Desktop.addInternalFrame(outputFrame, - "JNet secondary structure prediction job", 800, - 300); JPredWSServiceLocator loc = new JPredWSServiceLocator(); // Default try { this.server = (JpredSoapBindingStub) loc.getjpred(); // JBPNote will be set from properties } catch (Exception ex) { - output.setText("Serious! JPred Service location failed\nfor URL :" + wsInfo.setProgressText("Serious! JPred Service location failed\nfor URL :" +loc.getjpredAddress()+"\n"+ex.getMessage()); } - JPredThread jthread = new JPredThread(seq); + JPredThread jthread = new JPredThread(msf); jthread.start(); - ImageTwirler thread = new ImageTwirler(); - thread.start(); } - class ImageTwirler - extends Thread + public JPredClient(SequenceI seq) { - 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); - } - } + 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\"."); - public void run() - { - while (jobsRunning > 0) - { - try - { - Thread.sleep(100); - imageIndex++; - imageIndex %= 9; - outputFrame.setFrameIcon(imageIcon[imageIndex]); - outputFrame.setTitle("JNet Secondary Structure Prediction : " + - jobsRunning + " jobs running."); - } - catch (Exception ex) - {} + 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.Secstructpred result; + 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 = output.getText(); + 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)) + while (!jobComplete && (allowedServerExceptions > 0)) { try { - result = server.getpredict(jobId); + result = server.getresult(jobId); - if (result.getOutput().indexOf("Job") != 0) + if( result.isRunning() ) + wsInfo.setStatus(WebserviceInfo.STATE_RUNNING); + else if( result.isQueued() ) + wsInfo.setStatus(WebserviceInfo.STATE_QUEUING); + + if (result.isFinished()) { parseResult(); jobComplete = true; @@ -120,26 +119,36 @@ public class JPredClient } else { - output.setText(OutputHeader + "\n" + result.getOutput()); + wsInfo.setProgressText(OutputHeader + "\n" + result.getStatus()); + if (! (result.isJobFailed() || result.isServerError())) + { + Thread.sleep(5000); + // System.out.println("I'm alive "+seqid+" "+jobid); + } } - Thread.sleep(5000); - // System.out.println("I'm alive "+seqid+" "+jobid); - } catch (Exception ex) { allowedServerExceptions--; - String msg = output.getText(); - output.setText(msg + "\nJPredWS Server exception!\n" + ex.getMessage()); + 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 { - jobId = server.predict(sequence); + if (msa!=null) { + jobId = server.predictOnMsa(msa); + } else { + jobId = server.predict(sequence); + } System.out.println(jobId); } catch (Exception e) @@ -150,23 +159,81 @@ public class JPredClient } } + 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() { - output.setText(OutputHeader + result.getOutput()); + // 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"); - JPredFile prediction=new JPredFile(result.getOutput(), "Paste"); + jalview.io.JPredFile prediction = new jalview.io.JPredFile(result.getPredfile(), "Paste"); SequenceI[] preds = prediction.getSeqsAsArray(); - Alignment al = new Alignment(preds); + 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.QuerySeqPosition; + } AlignmentAnnotation annot; Annotation [] annotations = null; int i = 0; - // Rename the query sequence + 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")) + if(id.startsWith("LUPAS") || id.startsWith("JNET") || id.startsWith("JPRED")) { annotations = new Annotation[al.getWidth()]; @@ -174,83 +241,58 @@ public class JPredClient || id.equals("JNETPSSM") || id.equals("JNETFREQ") || id.equals("JNETHMM") - || id.equals("JNETALIGN")) + || id.equals("JNETALIGN") + || id.equals("JPRED")) { - for (int j = 0; j < al.getWidth(); j++) - annotations[j] = new Annotation("", "", preds[i].getCharAt(j), 0); + 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 < al.getWidth(); j++) + for (int j = 0; j < width; j++) { float value = Float.parseFloat(preds[i].getCharAt(j)+""); - annotations[j] = new Annotation(preds[i].getCharAt(j)+"", "",preds[i].getCharAt(j),value); + annotations[gapmap[j]] = new Annotation(preds[i].getCharAt(j)+"", "",preds[i].getCharAt(j),value); } } else { - for (int j = 0; j < al.getWidth(); j++) - annotations[j] = new Annotation(preds[i].getCharAt(j)+"", "", ' ', 0); + 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(), - "Jpred Output", + "JNet Output", annotations,0f,10f,1); else annot = new AlignmentAnnotation(preds[i].getName(), - "Jpred Output", + "JNet Output", annotations); al.addAnnotation(annot); - al.deleteSequence(preds[i]); + if (noMsa) + al.deleteSequence(preds[i]); } i++; } Hashtable scores = prediction.Scores; + /* addFloatAnnotations(al, gapmap, (Vector)scores.get("JNETPROPH"), + "JnetpropH", "Jnet Helix Propensity", 0f,1f,1); - Vector values = (Vector)scores.get("JNETPROPH"); - annotations = new Annotation[al.getWidth()]; - for (int j = 0; j < al.getWidth(); j++) - { - float value = Float.parseFloat(values.get(j).toString()); - annotations[j] = new Annotation("", value+"",' ',value); - } - annot = new AlignmentAnnotation("Jnetproph", "Jpred Output", annotations, 0f,1f,1); - al.addAnnotation(annot); - - values = (Vector)scores.get("JNETPROPB"); - annotations = new Annotation[al.getWidth()]; - for (int j = 0; j < al.getWidth(); j++) - { - float value = Float.parseFloat(values.get(j).toString()); - annotations[j] = new Annotation("", value+"",' ',value); - } - annot = new AlignmentAnnotation("JnetpropB", "Jpred Output", annotations, 0f,1f,1); - al.addAnnotation(annot); - - values = (Vector)scores.get("JNETPROPC"); - annotations = new Annotation[al.getWidth()]; - for (int j = 0; j < al.getWidth(); j++) - { - float value = Float.parseFloat(values.get(j).toString()); - annotations[j] = new Annotation("", value+"",' ',value); - } - annot = new AlignmentAnnotation("JnetpropC", "Jpred Output", annotations, 0f,1f,1); - al.addAnnotation(annot); - - + 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); - /* JBPNote - need to set correct style of display for the secstrpred alignment object. - af.clustalColour.setSelected(true); - af.clustalColour_actionPerformed(null); - */ Desktop.addInternalFrame(af, "JNet Prediction for sequence ", - 700, 500); + AlignFrame.NEW_WINDOW_WIDTH, AlignFrame.NEW_WINDOW_HEIGHT); }catch(Exception ex){ex.printStackTrace();} }