X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2FMsaWSThread.java;h=090af4ee0ecc1d3701616c23112c2f8df978f070;hb=37a5dfc3c72a42689e90ad8a0e118e8855d9868b;hp=d51bc7640b1e48be0796ff2a3e8b13236382ffc3;hpb=c431a65bbe794a0dd27f3f806d3c5cf37c53279c;p=jalview.git diff --git a/src/jalview/ws/MsaWSThread.java b/src/jalview/ws/MsaWSThread.java index d51bc76..090af4e 100644 --- a/src/jalview/ws/MsaWSThread.java +++ b/src/jalview/ws/MsaWSThread.java @@ -74,7 +74,14 @@ class MsaWSThread extends Thread implements WSClientI { */ public MsaWSJob(int jobNum, SequenceI[] inSeqs) { this.jobnum = jobNum; - prepareInput(inSeqs); + if (!prepareInput(inSeqs,2)) { + submitted=true; + subjobComplete=true; + result = new MsaResult(); + result.setFinished(true); + result.setStatus("Job never ran - input returned to user."); + } + } int allowedServerExceptions = 3; // thread dies if too many @@ -85,15 +92,24 @@ class MsaWSThread extends Thread implements WSClientI { Hashtable SeqNames = new Hashtable(); Vector emptySeqs = new Vector(); - private void prepareInput(SequenceI[] seqs) { + /** + * prepare input sequences for MsaWS service + * @param seqs jalview sequences to be prepared + * @param minlen minimum number of residues required for this MsaWS service + * @return true if seqs contains sequences to be submitted to service. + */ + private boolean prepareInput(SequenceI[] seqs, int minlen) { int nseqs = 0; + if (minlen<0) + throw new Error("Implementation error: minlen must be zero or more."); for (int i = 0; i < seqs.length; i++) { - if (seqs[i].getStart() < seqs[i].getEnd()) { + if (seqs[i].getEnd()-seqs[i].getStart()>minlen-1) { nseqs++; } } + boolean valid=nseqs>1; // need at least two seqs vamsas.objects.simple.Sequence[] seqarray = - (nseqs>0) + (valid) ? new vamsas.objects.simple.Sequence[nseqs] :null; for (int i = 0, n = 0; i < seqs.length; i++) { @@ -104,7 +120,7 @@ class MsaWSThread extends Thread implements WSClientI { // subjob SeqNames.put(newname, jalview.analysis.SeqsetUtils .SeqCharacterHash(seqs[i])); - if (seqs[i].getStart() < seqs[i].getEnd()) { + if (valid && seqs[i].getEnd()-seqs[i].getStart()>minlen-1) { seqarray[n] = new vamsas.objects.simple.Sequence(); seqarray[n].setId(newname); seqarray[n++].setSeq((submitGaps) ? seqs[i].getSequence() @@ -112,11 +128,19 @@ class MsaWSThread extends Thread implements WSClientI { jalview.util.Comparison.GapChars, seqs[i] .getSequence())); } else { - emptySeqs.add(newname); + String empty=null; + if (seqs[i].getEnd()>=seqs[i].getStart()) { + empty = (submitGaps) ? seqs[i].getSequence() + : AlignSeq.extractGaps( + jalview.util.Comparison.GapChars, seqs[i] + .getSequence()); + } + emptySeqs.add(new String[] { newname, empty}); } } this.seqs = new vamsas.objects.simple.SequenceSet(); this.seqs.setSeqs(seqarray); + return valid; } /** * @@ -150,12 +174,40 @@ class MsaWSThread extends Thread implements WSClientI { alseqs[i] = null; } } + // check that aligned width is at least as wide as emptySeqs width. + int ow=w,nw=w; + for (i=0, w=emptySeqs.size(); isw) { + // pad at end + alseqs[i].setSequence(t_alseqs[i].getSequence()+insbuff.substring(0,sw-nw)); + } + } + } for (i=0, w=emptySeqs.size(); i=hseq.getStart()) + alignment[s].setEnd(hseq.getEnd()); } } // mark hidden segment as hidden in the new alignment @@ -632,7 +685,7 @@ class MsaWSThread extends Thread implements WSClientI { cshift+=contigs[contig+2]; } // Do final job - if it exists - if (j=mseq[s].getStart()) + alignment[s].setEnd(mseq[s].getEnd()); ((AlignmentOrder) subalg[1]).updateSequence(mseq[s], alignment[s]); } }