package jalview.io; 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 { JInternalFrame outputFrame = new JInternalFrame(); CutAndPasteTransfer output = new CutAndPasteTransfer(false); int jobsRunning = 0; ext.vamsas.JpredSoapBindingStub server; public JPredClient(SequenceI[] msf) { SequenceI seq = msf[0]; output.formatForOutput(); outputFrame.setContentPane(output); output.setText("Job details for MSA based prediction on sequence :\nName : " + seq.getName() + "\nSequence : " + AlignSeq.extractGaps("-. ",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 :" +loc.getjpredAddress()+"\n"+ex.getMessage()); } JPredThread jthread = new JPredThread(msf); jthread.start(); ImageTwirler thread = new ImageTwirler(); thread.start(); } public JPredClient(SequenceI seq) { output.formatForOutput(); outputFrame.setContentPane(output); output.setText("Job details for prediction on sequence :\nName : " + seq.getName() + "\nSequence : " + AlignSeq.extractGaps("-. ",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 :" +loc.getjpredAddress()+"\n"+ex.getMessage()); } JPredThread jthread = new JPredThread(seq); jthread.start(); ImageTwirler thread = new ImageTwirler(); thread.start(); } 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; outputFrame.setFrameIcon(imageIcon[imageIndex]); outputFrame.setTitle("JNet Secondary Structure Prediction : " + jobsRunning + " jobs running."); } catch (Exception ex) {} } } } 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 = output.getText(); this.sequence = new ext.vamsas.Sequence(); this.sequence.setId(seq.getName()); this.sequence.setSeq(AlignSeq.extractGaps("-. ",seq.getSequence())); } JPredThread(SequenceI[] msf) { OutputHeader = output.getText(); 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.isFinished()) { parseResult(); jobComplete = true; jobsRunning--; } else { output.setText(OutputHeader + "\n" + result.getStatus()); if (! (result.isJobFailed() || result.isServerError())) { 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()); } } } 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.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(); } output.setText(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.FormatProperties.contains(format)) { al = new Alignment(jalview.io.FormatAdapter.read(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; 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.Scores; addFloatAnnotations(al, gapmap, (Vector)scores.get("JNETPROPH"), "JnetpropH", "Jnet Helix Propensity", 0f,1f,1); addFloatAnnotations(al, gapmap, (Vector)scores.get("JNETPROPB"), "JnetpropB", "Jnet Beta Sheed 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 ", 700, 500); }catch(Exception ex){ex.printStackTrace();} } } }