X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2FJPredThread.java;h=0cac70911b5f2a038bcc7723b1eb8b8d27532d84;hb=7bc226b58110fa26d9dbd3f0c78095d06909ffc3;hp=b4833b1b973e874b24341a1baf363aaa64f97d70;hpb=dd74fc4938723fe5ec48d4e5fdcfbe58ac42a48d;p=jalview.git diff --git a/src/jalview/ws/JPredThread.java b/src/jalview/ws/JPredThread.java index b4833b1..0cac709 100644 --- a/src/jalview/ws/JPredThread.java +++ b/src/jalview/ws/JPredThread.java @@ -2,31 +2,28 @@ package jalview.ws; import java.util.*; -import javax.swing.*; - -import vamsas.objects.simple.JpredResult; - import jalview.analysis.*; import jalview.bin.*; import jalview.datamodel.*; +import jalview.datamodel.Alignment; import jalview.gui.*; import jalview.io.*; import jalview.util.*; +import vamsas.objects.simple.JpredResult; class JPredThread -extends WSThread -implements WSClientI + extends WSThread implements WSClientI { // TODO: put mapping between JPredJob input and input data here - JNetAnnotation adding is done after result parsing. class JPredJob - extends WSThread.WSJob + extends WSThread.WSJob { // TODO: make JPredJob deal only with what was sent to and received from a JNet service - int[] predMap=null; // mapping from sequence(i) to the original sequence(predMap[i]) being predicted on + int[] predMap = null; // mapping from sequence(i) to the original sequence(predMap[i]) being predicted on vamsas.objects.simple.Sequence sequence; vamsas.objects.simple.Msfalignment msa; java.util.Hashtable SequenceInfo = null; - int msaIndex=0; // the position of the original sequence in the array of Sequences in the input object that this job holds a prediction for + int msaIndex = 0; // the position of the original sequence in the array of Sequences in the input object that this job holds a prediction for /** * * @return true if getResultSet will return a valid alignment and prediction result. @@ -50,20 +47,21 @@ implements WSClientI } return false; } + /** * * @return null or Object[] { annotated alignment for this prediction, ColumnSelection for this prediction} or null if no results available. * @throws Exception */ public Object[] getResultSet() - throws Exception + throws Exception { if (result == null || !result.isFinished()) { return null; } Alignment al = null; - ColumnSelection alcsel=null; + ColumnSelection alcsel = null; int FirstSeq = -1; // the position of the query sequence in Alignment al JpredResult result = (JpredResult)this.result; @@ -72,7 +70,7 @@ implements WSClientI // JPredFile prediction = new JPredFile("C:/JalviewX/files/jpred.txt", "File"); jalview.io.JPredFile prediction = new jalview.io.JPredFile(result. getPredfile(), - "Paste"); + "Paste"); SequenceI[] preds = prediction.getSeqsAsArray(); jalview.bin.Cache.log.debug("Got prediction profile."); @@ -82,19 +80,23 @@ implements WSClientI // we ignore the returned alignment if we only predicted on a single sequence String format = new jalview.io.IdentifyFile().Identify(result. getAligfile(), - "Paste"); + "Paste"); if (jalview.io.FormatAdapter.isValidFormat(format)) { SequenceI sqs[]; - if (predMap!=null) { - Object[] alandcolsel = input.getAlignmentAndColumnSelection(alignFrame.getViewport().getGapCharacter()); + if (predMap != null) + { + Object[] alandcolsel = input.getAlignmentAndColumnSelection( + alignFrame.getViewport().getGapCharacter()); sqs = (SequenceI[]) alandcolsel[0]; al = new Alignment(sqs); - alcsel=(ColumnSelection) alandcolsel[1]; - } else { + alcsel = (ColumnSelection) alandcolsel[1]; + } + else + { al = new FormatAdapter().readFile(result.getAligfile(), - "Paste", format); + "Paste", format); sqs = new SequenceI[al.getHeight()]; for (int i = 0, j = al.getHeight(); i < j; i++) @@ -105,20 +107,21 @@ implements WSClientI SequenceInfo, sqs)) { throw (new Exception( - "Couldn't recover sequence properties for alignment.")); + "Couldn't recover sequence properties for alignment.")); } } FirstSeq = 0; al.setDataset(null); - jalview.io.JnetAnnotationMaker.add_annotation(prediction, al, FirstSeq, - false,predMap); + jalview.io.JnetAnnotationMaker.add_annotation(prediction, al, + FirstSeq, + false, predMap); } else { throw (new Exception( - "Unknown format "+format+" for file : \n" + + "Unknown format " + format + " for file : \n" + result.getAligfile())); } } @@ -126,20 +129,27 @@ implements WSClientI { al = new Alignment(preds); FirstSeq = prediction.getQuerySeqPosition(); - if (predMap!=null) { + if (predMap != null) + { char gc = alignFrame.getViewport().getGapCharacter(); - SequenceI[] sqs = (SequenceI[]) ((java.lang.Object[]) input.getAlignmentAndColumnSelection(gc))[0]; - if (this.msaIndex>=sqs.length) + SequenceI[] sqs = (SequenceI[]) ( (java.lang.Object[]) input. + getAlignmentAndColumnSelection(gc))[ + 0]; + if (this.msaIndex >= sqs.length) + { throw new Error("Implementation Error! Invalid msaIndex for JPredJob on parent MSA input object!"); + } ///// //Uses RemoveGapsCommand ///// new jalview.commands.RemoveGapsCommand("Remove Gaps", - new SequenceI[] {sqs[msaIndex]}, - alignFrame.getCurrentView().getAlignment()); + new SequenceI[] + {sqs[msaIndex]}, + alignFrame.getCurrentView(). + getAlignment()); - SequenceI profileseq=al.getSequenceAt(FirstSeq); + SequenceI profileseq = al.getSequenceAt(FirstSeq); profileseq.setSequence(sqs[msaIndex].getSequenceAsString()); } @@ -147,53 +157,73 @@ implements WSClientI al.getSequenceAt(FirstSeq), SequenceInfo)) { throw (new Exception( - "Couldn't recover sequence properties for JNet Query sequence!")); - } else { + "Couldn't recover sequence properties for JNet Query sequence!")); + } + else + { al.setDataset(null); - jalview.io.JnetAnnotationMaker.add_annotation(prediction, al, FirstSeq, + jalview.io.JnetAnnotationMaker.add_annotation(prediction, al, + FirstSeq, true, predMap); - SequenceI profileseq=al.getSequenceAt(0); // this includes any gaps. + SequenceI profileseq = al.getSequenceAt(0); // this includes any gaps. alignToProfileSeq(al, profileseq); - if (predMap!=null) { + if (predMap != null) + { // Adjust input view for gaps // propagate insertions into profile - alcsel=propagateInsertions(profileseq, al, input); + alcsel = propagateInsertions(profileseq, al, input); } } } - return new Object[] { al, alcsel}; // , FirstSeq, noMsa}; + return new Object[] + { + al, alcsel}; // , FirstSeq, noMsa}; } + /** * Given an alignment where all other sequences except profileseq are aligned to the ungapped profileseq, insert gaps in the other sequences to realign them with the residues in profileseq * @param al * @param profileseq */ - private void alignToProfileSeq(Alignment al, SequenceI profileseq) { + private void alignToProfileSeq(Alignment al, SequenceI profileseq) + { char gc = al.getGapCharacter(); int[] gapMap = profileseq.gapMap(); // insert gaps into profile - for (int lp=0,r=0; r1) { - StringBuffer sb=new StringBuffer(); - for (int s=0, ns=gapMap[r]-lp; s 1) + { + StringBuffer sb = new StringBuffer(); + for (int s = 0, ns = gapMap[r] - lp; s < ns; s++) + { sb.append(gc); } - for (int s=1,ns=al.getHeight(); s0) { + int diff = gapMap[r] - sq.length(); + if (diff > 0) + { // pad gaps - sq=sq+sb; - while ((diff=gapMap[r]-sq.length())>0) { - sq=sq+((diff>=sb.length()) ? sb.toString() : sb.substring(0, diff)); + sq = sq + sb; + while ( (diff = gapMap[r] - sq.length()) > 0) + { + sq = sq + + ( (diff >= sb.length()) ? sb.toString() : + sb.substring(0, diff)); } al.getSequenceAt(s).setSequence(sq); - } else { - al.getSequenceAt(s).setSequence(sq.substring(0,gapMap[r])+sb.toString()+sq.substring(gapMap[r])); + } + else + { + al.getSequenceAt(s).setSequence(sq.substring(0, gapMap[r]) + + sb.toString() + + sq.substring(gapMap[r])); } } } - lp=gapMap[r]; + lp = gapMap[r]; } } @@ -203,59 +233,82 @@ implements WSClientI * @param al * @param input */ - private ColumnSelection propagateInsertions(SequenceI profileseq, Alignment al, AlignmentView input) { + private ColumnSelection propagateInsertions(SequenceI profileseq, + Alignment al, + AlignmentView input) + { char gc = al.getGapCharacter(); Object[] alandcolsel = input.getAlignmentAndColumnSelection(gc); ColumnSelection nview = (ColumnSelection) alandcolsel[1]; SequenceI origseq; - nview.pruneDeletions(ShiftList.parseMap((origseq=((SequenceI[]) alandcolsel[0])[0]).gapMap())); // recover original prediction sequence's mapping to view. - int[] viscontigs=nview.getVisibleContigs(0, profileseq.getLength()); - int spos=0; - int offset=0; + nview.pruneDeletions(ShiftList.parseMap( (origseq = ( (SequenceI[]) + alandcolsel[0])[0]).gapMap())); // recover original prediction sequence's mapping to view. + int[] viscontigs = nview.getVisibleContigs(0, profileseq.getLength()); + int spos = 0; + int offset = 0; // input.pruneDeletions(ShiftList.parseMap(((SequenceI[]) alandcolsel[0])[0].gapMap())) // add profile to visible contigs - for (int v=0; vspos) { - StringBuffer sb=new StringBuffer(); - for (int s=0, ns=viscontigs[v]-spos; s spos) + { + StringBuffer sb = new StringBuffer(); + for (int s = 0, ns = viscontigs[v] - spos; s < ns; s++) + { sb.append(gc); } - for (int s=0,ns=al.getHeight(); s0) { + int diff = spos + offset - sq.length() - 1; + if (diff > 0) + { // pad gaps - sq=sq+sb; - while ((diff=spos+offset-sq.length()-1)>0) { - sq=sq+((diff>=sb.length()) ? sb.toString() : sb.substring(0, diff)); + sq = sq + sb; + while ( (diff = spos + offset - sq.length() - 1) > 0) + { + sq = sq + + ( (diff >= sb.length()) ? sb.toString() : + sb.substring(0, diff)); } } - sq+=sb.toString(); - } else { - al.getSequenceAt(s).setSequence(sq.substring(0,spos+offset)+sb.toString()+sq.substring(spos+offset)); + sq += sb.toString(); + } + else + { + al.getSequenceAt(s).setSequence(sq.substring(0, spos + offset) + + sb.toString() + + sq.substring(spos + offset)); } } } //offset+=sb.length(); } - spos = viscontigs[v+1]+1; + spos = viscontigs[v + 1] + 1; } - if ((offset+spos)0) { - sq=sq+((diff>=sb.length()) ? sb.toString() : sb.substring(0, diff)); - diff=origseq.getLength()-sq.length(); + int diff = origseq.getLength() - sq.length(); + while (diff > 0) + { + sq = sq + + ( (diff >= sb.length()) ? sb.toString() : sb.substring(0, diff)); + diff = origseq.getLength() - sq.length(); } } } @@ -291,9 +344,12 @@ implements WSClientI } } } + ext.vamsas.Jpred server; String altitle = ""; - JPredThread(WebserviceInfo wsinfo, String altitle, ext.vamsas.Jpred server, String wsurl, AlignmentView alview, AlignFrame alframe) { + JPredThread(WebserviceInfo wsinfo, String altitle, ext.vamsas.Jpred server, + String wsurl, AlignmentView alview, AlignFrame alframe) + { super(); this.altitle = altitle; this.server = server; @@ -303,40 +359,44 @@ implements WSClientI WsUrl = wsurl; } - - JPredThread(WebserviceInfo wsinfo, String altitle, ext.vamsas.Jpred server, String wsurl, Hashtable SequenceInfo,SequenceI seq, int[] delMap, AlignmentView alview, AlignFrame alframe) + JPredThread(WebserviceInfo wsinfo, String altitle, ext.vamsas.Jpred server, + String wsurl, Hashtable SequenceInfo, SequenceI seq, int[] delMap, + AlignmentView alview, AlignFrame alframe) { - this(wsinfo, altitle, server,wsurl, alview, alframe); + this(wsinfo, altitle, server, wsurl, alview, alframe); JPredJob job = new JPredJob(SequenceInfo, seq, delMap); if (job.hasValidInput()) { OutputHeader = wsInfo.getProgressText(); jobs = new WSJob[] - { + { job}; job.jobnum = 0; } } - JPredThread(WebserviceInfo wsinfo, String altitle, ext.vamsas.Jpred server, Hashtable SequenceInfo, SequenceI[] msf, int[] delMap, AlignmentView alview, AlignFrame alframe, String wsurl) + JPredThread(WebserviceInfo wsinfo, String altitle, ext.vamsas.Jpred server, + Hashtable SequenceInfo, SequenceI[] msf, int[] delMap, + AlignmentView alview, AlignFrame alframe, String wsurl) { - this(wsinfo, altitle, server,wsurl, alview, alframe); + this(wsinfo, altitle, server, wsurl, alview, alframe); JPredJob job = new JPredJob(SequenceInfo, msf, delMap); if (job.hasValidInput()) { jobs = new WSJob[] - { + { job}; OutputHeader = wsInfo.getProgressText(); job.jobnum = 0; } } + void StartJob(WSJob j) { if (! (j instanceof JPredJob)) { throw new Error("Implementation error - StartJob(JpredJob) called on " + - j.getClass()); + j.getClass()); } try { @@ -346,10 +406,10 @@ implements WSClientI job.jobId = server.predictOnMsa(job.msa); } else - if (job.sequence!=null) - { - job.jobId = server.predict(job.sequence); // debug like : job.jobId = "/jobs/www-jpred/jp_Yatat29";// - } + if (job.sequence != null) + { + job.jobId = server.predict(job.sequence); // debug like : job.jobId = "/jobs/www-jpred/jp_Yatat29";// + } if (job.jobId != null) { @@ -377,9 +437,9 @@ implements WSClientI { wsInfo.setStatus(j.jobnum, WebserviceInfo.STATE_STOPPED_SERVERERROR); wsInfo.setProgressText(j.jobnum, - "Failed to submit the prediction. (Just close the window)\n" - + - "It is most likely that there is a problem with the server.\n"); + "Failed to submit the prediction. (Just close the window)\n" + + + "It is most likely that there is a problem with the server.\n"); System.err.println( "JPredWS Client: Failed to submit the prediction. Quite possibly because of a server error - see below)\n" + e.getMessage() + "\n"); @@ -391,9 +451,9 @@ implements WSClientI wsInfo.setStatus(j.jobnum, WebserviceInfo.STATE_STOPPED_ERROR); // JBPNote - this could be a popup informing the user of the problem. wsInfo.appendProgressText(j.jobnum, - "Failed to submit the prediction:\n" - + e.getMessage() + - wsInfo.getProgressText()); + "Failed to submit the prediction:\n" + + e.getMessage() + + wsInfo.getProgressText()); jalview.bin.Cache.log.debug("Failed Submission of job " + j.jobnum, e); @@ -422,13 +482,13 @@ implements WSClientI { Cache.log.error("Unexpected exception when processing results for " + - altitle, ex); + altitle, ex); wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_ERROR); } if (results > 0) { wsInfo.showResultsNewFrame - .addActionListener(new java.awt.event.ActionListener() + .addActionListener(new java.awt.event.ActionListener() { public void actionPerformed( java.awt.event.ActionEvent evt) @@ -437,7 +497,7 @@ implements WSClientI } }); wsInfo.mergeResults - .addActionListener(new java.awt.event.ActionListener() + .addActionListener(new java.awt.event.ActionListener() { public void actionPerformed( java.awt.event.ActionEvent evt) @@ -459,7 +519,7 @@ implements WSClientI if (jobs != null) { Object[] res = null; - boolean msa=false; + boolean msa = false; for (int jn = 0; jn < jobs.length; jn++) { Object[] jobres = null; @@ -468,17 +528,21 @@ implements WSClientI if (j.hasResults()) { // hack - we only deal with all single seuqence predictions or all profile predictions - msa = (j.msa!=null) ? true : msa; + msa = (j.msa != null) ? true : msa; try { jalview.bin.Cache.log.debug("Parsing output of job " + jn); jobres = j.getResultSet(); jalview.bin.Cache.log.debug("Finished parsing output."); - if (jobs.length==1) + if (jobs.length == 1) + { res = jobres; - else { + } + else + { // do merge with other job results - throw new Error("Multiple JNet subjob merging not yet implemented."); + throw new Error( + "Multiple JNet subjob merging not yet implemented."); } } catch (Exception e) @@ -488,10 +552,10 @@ implements WSClientI e); wsInfo.setStatus(j.jobnum, WebserviceInfo.STATE_STOPPED_ERROR); wsInfo.appendProgressText(j.jobnum, - OutputHeader + "\n" + - j.result.getStatus() + - "\nInvalid JNet job result data!\n" + - e.getMessage()); + OutputHeader + "\n" + + j.result.getStatus() + + "\nInvalid JNet job result data!\n" + + e.getMessage()); j.result.setBroken(true); } } @@ -502,30 +566,41 @@ implements WSClientI if (newWindow) { AlignFrame af; - if (input==null) { - if (res[1]!=null) { - af = new AlignFrame((Alignment)res[0], (ColumnSelection) res[1], AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT); - } else { - af = new AlignFrame((Alignment)res[0], AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT); + if (input == null) + { + if (res[1] != null) + { + af = new AlignFrame( (Alignment) res[0], (ColumnSelection) res[1], + AlignFrame.DEFAULT_WIDTH, + AlignFrame.DEFAULT_HEIGHT); + } + else + { + af = new AlignFrame( (Alignment) res[0], AlignFrame.DEFAULT_WIDTH, + AlignFrame.DEFAULT_HEIGHT); } - } else { + } + else + { /*java.lang.Object[] alandcolsel = input.getAlignmentAndColumnSelection(alignFrame.getViewport().getGapCharacter()); - - if (((SequenceI[])alandcolsel[0])[0].getLength()!=res.getWidth()) { + if (((SequenceI[])alandcolsel[0])[0].getLength()!=res.getWidth()) { if (msa) { throw new Error("Implementation Error! ColumnSelection from input alignment will not map to result alignment!"); } - } - if (!msa) { + } + if (!msa) { // update hidden regions to account for loss of gaps in profile. - if any // gapMap returns insert list, interpreted as delete list by pruneDeletions //((ColumnSelection) alandcolsel[1]).pruneDeletions(ShiftList.parseMap(((SequenceI[]) alandcolsel[0])[0].gapMap())); - }*/ + }*/ - af = new AlignFrame((Alignment) res[0], (ColumnSelection) res[1],AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT); + af = new AlignFrame( (Alignment) res[0], (ColumnSelection) res[1], + AlignFrame.DEFAULT_WIDTH, + AlignFrame.DEFAULT_HEIGHT); } Desktop.addInternalFrame(af, altitle, - AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT); + AlignFrame.DEFAULT_WIDTH, + AlignFrame.DEFAULT_HEIGHT); } else { @@ -534,11 +609,13 @@ implements WSClientI } } } + void pollJob(WSJob job) - throws Exception + throws Exception { job.result = server.getresult(job.jobId); } + public boolean isCancellable() { return false; @@ -555,5 +632,3 @@ implements WSClientI } } - -