X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2FJPredThread.java;h=98c9506b7f9fbca668d20a3fb60fe1fd796da81c;hb=d423f22792e47dbc800ae220a58677f988971d06;hp=106bb530fea08188369dbd4fc898d2fe6ee60c1b;hpb=389a50f7b2f71096a98b54366683d520ecbf8193;p=jalview.git diff --git a/src/jalview/ws/JPredThread.java b/src/jalview/ws/JPredThread.java index 106bb53..98c9506 100644 --- a/src/jalview/ws/JPredThread.java +++ b/src/jalview/ws/JPredThread.java @@ -1,3 +1,20 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.5) + * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle + * + * This file is part of Jalview. + * + * Jalview 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 3 of the License, or (at your option) any later version. + * + * Jalview 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 Jalview. If not, see . + */ package jalview.ws; import java.util.*; @@ -11,28 +28,39 @@ import jalview.io.*; import jalview.util.*; import vamsas.objects.simple.JpredResult; -class JPredThread - extends WSThread implements WSClientI +class JPredThread 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 + // TODO: put mapping between JPredJob input and input data here - + // JNetAnnotation adding is done after result parsing. + class JPredJob 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 + // 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 + 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. + * + * @return true if getResultSet will return a valid alignment and prediction + * result. */ public boolean hasResults() { if (subjobComplete && result != null && result.isFinished() - && ( (JpredResult) result).getPredfile() != null && - ( (JpredResult) result).getAligfile() != null) + && ((JpredResult) result).getPredfile() != null + && ((JpredResult) result).getAligfile() != null) { return true; } @@ -49,12 +77,13 @@ class JPredThread } /** - * - * @return null or Object[] { annotated alignment for this prediction, ColumnSelection for this prediction} or null if no results available. + * + * @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 + public Object[] getResultSet() throws Exception { if (result == null || !result.isFinished()) { @@ -64,31 +93,31 @@ class JPredThread ColumnSelection alcsel = null; int FirstSeq = -1; // the position of the query sequence in Alignment al - JpredResult result = (JpredResult)this.result; + JpredResult result = (JpredResult) this.result; jalview.bin.Cache.log.debug("Parsing output from JNet job."); - // JPredFile prediction = new JPredFile("C:/JalviewX/files/jpred.txt", "File"); - jalview.io.JPredFile prediction = new jalview.io.JPredFile(result. - getPredfile(), - "Paste"); + // 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(); jalview.bin.Cache.log.debug("Got prediction profile."); - if ( (this.msa != null) && (result.getAligfile() != null)) + if ((this.msa != null) && (result.getAligfile() != null)) { jalview.bin.Cache.log.debug("Getting associated alignment."); - // we ignore the returned alignment if we only predicted on a single sequence - String format = new jalview.io.IdentifyFile().Identify(result. - getAligfile(), - "Paste"); + // we ignore the returned alignment if we only predicted on a single + // sequence + String format = new jalview.io.IdentifyFile().Identify(result + .getAligfile(), "Paste"); if (jalview.io.FormatAdapter.isValidFormat(format)) { SequenceI sqs[]; if (predMap != null) { - Object[] alandcolsel = input.getAlignmentAndColumnSelection( - getGapChar()); + Object[] alandcolsel = input + .getAlignmentAndColumnSelection(getGapChar()); sqs = (SequenceI[]) alandcolsel[0]; al = new Alignment(sqs); alcsel = (ColumnSelection) alandcolsel[1]; @@ -96,33 +125,31 @@ class JPredThread 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++) { sqs[i] = al.getSequenceAt(i); } - if (!jalview.analysis.SeqsetUtils.deuniquify( (Hashtable) - SequenceInfo, sqs)) + if (!jalview.analysis.SeqsetUtils.deuniquify( + (Hashtable) 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); + FirstSeq, false, predMap); } else { - throw (new Exception( - "Unknown format " + format + " for file : \n" + - result.getAligfile())); + throw (new Exception("Unknown format " + format + + " for file : \n" + result.getAligfile())); } } else @@ -132,38 +159,36 @@ class JPredThread if (predMap != null) { char gc = getGapChar(); - SequenceI[] sqs = (SequenceI[]) ( (java.lang.Object[]) input. - getAlignmentAndColumnSelection(gc))[ - 0]; + 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!"); + throw new Error( + "Implementation Error! Invalid msaIndex for JPredJob on parent MSA input object!"); } - ///// - //Uses RemoveGapsCommand - ///// + // /// + // Uses RemoveGapsCommand + // /// new jalview.commands.RemoveGapsCommand("Remove Gaps", - new SequenceI[] - {sqs[msaIndex]}, - currentView); + new SequenceI[] + { sqs[msaIndex] }, currentView); SequenceI profileseq = al.getSequenceAt(FirstSeq); profileseq.setSequence(sqs[msaIndex].getSequenceAsString()); } - if (!jalview.analysis.SeqsetUtils.SeqCharacterUnhash( - al.getSequenceAt(FirstSeq), SequenceInfo)) + if (!jalview.analysis.SeqsetUtils.SeqCharacterUnhash(al + .getSequenceAt(FirstSeq), SequenceInfo)) { throw (new Exception( - "Couldn't recover sequence properties for JNet Query sequence!")); + "Couldn't recover sequence properties for JNet Query sequence!")); } else { al.setDataset(null); jalview.io.JnetAnnotationMaker.add_annotation(prediction, al, - FirstSeq, - true, predMap); + FirstSeq, true, predMap); SequenceI profileseq = al.getSequenceAt(0); // this includes any gaps. alignToProfileSeq(al, profileseq); if (predMap != null) @@ -175,12 +200,14 @@ class JPredThread } } return new Object[] - { - al, alcsel}; // , FirstSeq, noMsa}; + { 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 + * 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 */ @@ -206,19 +233,19 @@ class JPredThread { // pad gaps sq = sq + sb; - while ( (diff = gapMap[r] - sq.length()) > 0) + while ((diff = gapMap[r] - sq.length()) > 0) { - sq = sq + - ( (diff >= sb.length()) ? sb.toString() : - sb.substring(0, diff)); + 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])); + al.getSequenceAt(s).setSequence( + sq.substring(0, gapMap[r]) + sb.toString() + + sq.substring(gapMap[r])); } } } @@ -227,25 +254,29 @@ class JPredThread } /** - * Add gaps into the sequences aligned to profileseq under the given AlignmentView + * Add gaps into the sequences aligned to profileseq under the given + * AlignmentView + * * @param profileseq * @param al * @param input */ private ColumnSelection propagateInsertions(SequenceI profileseq, - Alignment al, - AlignmentView input) + 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. + 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())) + // input.pruneDeletions(ShiftList.parseMap(((SequenceI[]) + // alandcolsel[0])[0].gapMap())) // add profile to visible contigs for (int v = 0; v < viscontigs.length; v += 2) { @@ -270,28 +301,28 @@ class JPredThread { // pad gaps sq = sq + sb; - while ( (diff = spos + offset - sq.length() - 1) > 0) + while ((diff = spos + offset - sq.length() - 1) > 0) { - sq = sq + - ( (diff >= sb.length()) ? sb.toString() : - sb.substring(0, diff)); + 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)); + al.getSequenceAt(s).setSequence( + sq.substring(0, spos + offset) + sb.toString() + + sq.substring(spos + offset)); } } } - //offset+=sb.length(); + // offset+=sb.length(); } spos = viscontigs[v + 1] + 1; } - if ( (offset + spos) < profileseq.getLength()) + if ((offset + spos) < profileseq.getLength()) { StringBuffer sb = new StringBuffer(); for (int s = 0, ns = profileseq.getLength() - spos - offset; s < ns; s++) @@ -305,8 +336,9 @@ class JPredThread int diff = origseq.getLength() - sq.length(); while (diff > 0) { - sq = sq + - ( (diff >= sb.length()) ? sb.toString() : sb.substring(0, diff)); + sq = sq + + ((diff >= sb.length()) ? sb.toString() : sb + .substring(0, diff)); diff = origseq.getLength() - sq.length(); } } @@ -318,8 +350,8 @@ class JPredThread { super(); this.predMap = delMap; - String sq = AlignSeq.extractGaps(Comparison.GapChars, - seq.getSequenceAsString()); + String sq = AlignSeq.extractGaps(Comparison.GapChars, seq + .getSequenceAsString()); if (sq.length() >= 20) { this.SequenceInfo = SequenceInfo; @@ -345,18 +377,22 @@ class JPredThread } 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(alframe, wsinfo, alview, wsurl); this.altitle = altitle; this.server = server; } - 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); JPredJob job = new JPredJob(SequenceInfo, seq, delMap); @@ -364,23 +400,22 @@ class JPredThread { OutputHeader = wsInfo.getProgressText(); jobs = new WSJob[] - { - job}; + { 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); JPredJob job = new JPredJob(SequenceInfo, msf, delMap); if (job.hasValidInput()) { jobs = new WSJob[] - { - job}; + { job }; OutputHeader = wsInfo.getProgressText(); job.jobnum = 0; } @@ -388,10 +423,11 @@ class JPredThread void StartJob(WSJob j) { - if (! (j instanceof JPredJob)) + if (!(j instanceof JPredJob)) { - throw new Error("Implementation error - StartJob(JpredJob) called on " + - j.getClass()); + throw new Error( + "Implementation error - StartJob(JpredJob) called on " + + j.getClass()); } try { @@ -400,20 +436,20 @@ class JPredThread { job.jobId = server.predictOnMsa(job.msa); } - else - if (job.sequence != null) + else if (job.sequence != null) { - job.jobId = server.predict(job.sequence); // debug like : job.jobId = "/jobs/www-jpred/jp_Yatat29";// + job.jobId = server.predict(job.sequence); // debug like : job.jobId = + // "/jobs/www-jpred/jp_Yatat29";// } if (job.jobId != null) { if (job.jobId.startsWith("Broken")) { - job.result = (vamsas.objects.simple.Result)new JpredResult(); + job.result = (vamsas.objects.simple.Result) new JpredResult(); job.result.setInvalid(true); job.result.setStatus("Submission " + job.jobId); - throw new Exception(job.jobId); + throw new Exception(job.jobId); } else { @@ -426,21 +462,23 @@ class JPredThread { throw new Exception("Server timed out - try again later\n"); } - } - catch (Exception e) + } catch (Exception e) { // kill the whole job. wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_SERVERERROR); if (e.getMessage().indexOf("Exception") > -1) { - 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"); - System.err.println( - "JPredWS Client: Failed to submit the prediction. Quite possibly because of a server error - see below)\n" + - e.getMessage() + "\n"); + 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"); + System.err + .println("JPredWS Client: Failed to submit the prediction. Quite possibly because of a server error - see below)\n" + + e.getMessage() + "\n"); jalview.bin.Cache.log.warn("Server Exception", e); } @@ -449,11 +487,11 @@ class JPredThread 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); + jalview.bin.Cache.log.debug("Failed Submission of job " + j.jobnum, + e); } j.allowedServerExceptions = -1; @@ -470,39 +508,37 @@ class JPredThread for (int j = 0; j < jobs.length; j++) { finalState.updateJobPanelState(wsInfo, OutputHeader, jobs[j]); - if (jobs[j].submitted && jobs[j].subjobComplete && jobs[j].hasResults()) + if (jobs[j].submitted && jobs[j].subjobComplete + && jobs[j].hasResults()) { results++; } } - } - catch (Exception ex) + } catch (Exception ex) { - Cache.log.error("Unexpected exception when processing results for " + - altitle, ex); + Cache.log.error("Unexpected exception when processing results for " + + altitle, ex); wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_ERROR); } if (results > 0) { wsInfo.showResultsNewFrame - .addActionListener(new java.awt.event.ActionListener() - { - public void actionPerformed( - java.awt.event.ActionEvent evt) - { - displayResults(true); - } - }); + .addActionListener(new java.awt.event.ActionListener() + { + public void actionPerformed(java.awt.event.ActionEvent evt) + { + displayResults(true); + } + }); wsInfo.mergeResults - .addActionListener(new java.awt.event.ActionListener() - { - public void actionPerformed( - java.awt.event.ActionEvent evt) - { - displayResults(false); - } - }); + .addActionListener(new java.awt.event.ActionListener() + { + public void actionPerformed(java.awt.event.ActionEvent evt) + { + displayResults(false); + } + }); wsInfo.setResultsReady(); } else @@ -525,7 +561,8 @@ class JPredThread if (j.hasResults()) { - // hack - we only deal with all single seuqence predictions or all profile predictions + // hack - we only deal with all single seuqence predictions or all + // profile predictions msa = (j.msa != null) ? true : msa; try { @@ -540,20 +577,16 @@ class JPredThread { // do merge with other job results throw new Error( - "Multiple JNet subjob merging not yet implemented."); + "Multiple JNet subjob merging not yet implemented."); } - } - catch (Exception e) + } catch (Exception e) { jalview.bin.Cache.log.error( - "JNet Client: JPred Annotation Parse Error", - e); + "JNet Client: JPred Annotation Parse Error", 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()); + wsInfo.appendProgressText(j.jobnum, OutputHeader + "\n" + + j.result.getStatus() + + "\nInvalid JNet job result data!\n" + e.getMessage()); j.result.setBroken(true); } } @@ -568,37 +601,38 @@ class JPredThread { if (res[1] != null) { - 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); } else { - af = new AlignFrame( (Alignment) res[0], AlignFrame.DEFAULT_WIDTH, - AlignFrame.DEFAULT_HEIGHT); + af = new AlignFrame((Alignment) res[0], + AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT); } } else { - /*java.lang.Object[] alandcolsel = input.getAlignmentAndColumnSelection(alignFrame.getViewport().getGapCharacter()); - 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) { - // 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); + /* + * java.lang.Object[] alandcolsel = + * input.getAlignmentAndColumnSelection + * (alignFrame.getViewport().getGapCharacter()); 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) { // 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); } - Desktop.addInternalFrame(af, altitle, - AlignFrame.DEFAULT_WIDTH, - AlignFrame.DEFAULT_HEIGHT); + Desktop.addInternalFrame(af, altitle, AlignFrame.DEFAULT_WIDTH, + AlignFrame.DEFAULT_HEIGHT); } else { @@ -608,8 +642,7 @@ class JPredThread } } - void pollJob(WSJob job) - throws Exception + void pollJob(WSJob job) throws Exception { job.result = server.getresult(job.jobId); }