1 package jalview.ws.jws2;
3 import jalview.analysis.AlignSeq;
4 import jalview.analysis.SeqsetUtils;
5 import jalview.api.AlignViewportI;
6 import jalview.api.AlignmentViewPanel;
7 import jalview.datamodel.AlignmentAnnotation;
8 import jalview.datamodel.AlignmentI;
9 import jalview.datamodel.SequenceI;
10 import jalview.gui.AlignFrame;
11 import jalview.gui.IProgressIndicator;
12 import jalview.workers.AlignCalcWorker;
13 import jalview.ws.jws2.dm.JabaWsParamSet;
14 import jalview.ws.jws2.jabaws2.Jws2Instance;
15 import jalview.ws.params.WsParamSetI;
17 import java.util.ArrayList;
18 import java.util.HashMap;
19 import java.util.List;
22 import compbio.data.msa.SequenceAnnotation;
23 import compbio.data.sequence.FastaSequence;
24 import compbio.data.sequence.ScoreManager;
25 import compbio.metadata.Argument;
26 import compbio.metadata.ChunkHolder;
27 import compbio.metadata.JobStatus;
28 import compbio.metadata.JobSubmissionException;
29 import compbio.metadata.Option;
30 import compbio.metadata.ResultNotAvailableException;
31 import compbio.metadata.WrongParameterException;
33 public abstract class JabawsAlignCalcWorker extends AlignCalcWorker
36 @SuppressWarnings("unchecked")
37 protected SequenceAnnotation aaservice;
39 protected ScoreManager scoremanager;
41 protected WsParamSetI preset;
43 protected List<Argument> arguments;
45 public JabawsAlignCalcWorker(AlignViewportI alignViewport,
46 AlignmentViewPanel alignPanel)
48 super(alignViewport, alignPanel);
51 IProgressIndicator guiProgress;
53 public JabawsAlignCalcWorker(Jws2Instance service, AlignFrame alignFrame,
54 WsParamSetI preset, List<Argument> paramset)
56 this(alignFrame.getCurrentView(), alignFrame.alignPanel);
57 this.guiProgress = alignFrame;
59 this.arguments = paramset;
60 this.service = service;
61 aaservice = (SequenceAnnotation) service.service;
65 public WsParamSetI getPreset()
70 public List<Argument> getArguments()
76 * reconfigure and restart the AAConsClient. This method will spawn a new
77 * thread that will wait until any current jobs are finished, modify the
78 * parameters and restart the conservation calculation with the new values.
83 public void updateParameters(final WsParamSetI newpreset,
84 final List<Argument> newarguments)
87 arguments = newarguments;
88 calcMan.startWorker(this);
91 public List<Option> getJabaArguments()
93 List<Option> newargs = new ArrayList<Option>();
94 if (preset != null && preset instanceof JabaWsParamSet)
96 newargs.addAll(((JabaWsParamSet) preset).getjabaArguments());
98 if (arguments != null && arguments.size() > 0)
100 for (Argument rg : arguments)
102 if (Option.class.isAssignableFrom(rg.getClass()))
104 newargs.add((Option) rg);
114 if (aaservice == null)
118 long progressId = -1;
120 String rslt = "JOB NOT DEFINED";
121 StringBuffer msg=new StringBuffer();
128 List<compbio.data.sequence.FastaSequence> seqs = getInputSequences(alignViewport
133 calcMan.workerComplete(this);
137 AlignmentAnnotation[] aa = alignViewport.getAlignment()
138 .getAlignmentAnnotation();
139 if (guiProgress != null)
141 guiProgress.setProgressBar("JABA " + getServiceActionText(),
142 progressId = System.currentTimeMillis());
144 if (preset == null && arguments==null)
146 rslt = aaservice.analize(seqs);
152 rslt = aaservice.customAnalize(seqs, getJabaArguments());
153 } catch (WrongParameterException x)
155 throw new JobSubmissionException(
156 "Invalid paremeter set. Check Jalview implementation.", x);
160 boolean finished = false;
164 JobStatus status = aaservice.getJobStatus(rslt);
165 if (status.equals(JobStatus.FINISHED))
169 if (calcMan.isPending(this) && this instanceof AAConsClient)
172 // cancel this job and yield to the new job
175 if (aaservice.cancelJob(rslt))
177 System.err.println("Cancelled AACon job: " + rslt);
181 System.err.println("FAILED TO CANCELL AACon job: " + rslt);
184 } catch (Exception x)
198 stats = aaservice.pullExecStatistics(rslt, rpos);
199 } catch (Exception x)
202 if (x.getMessage().contains(
203 "Position in a file could not be negative!"))
205 // squash index out of bounds exception- seems to happen for
206 // disorder predictors which don't (apparently) produce any
207 // progress information and JABA server throws an exception
208 // because progress length is -1.
218 System.out.print(stats.getChunk());
220 rpos = stats.getNextPosition();
222 } while (stats != null && rpos > cpos);
224 if (!finished && status.equals(JobStatus.FAILED))
229 } catch (InterruptedException x)
238 } catch (InterruptedException x)
242 scoremanager = aaservice.getAnnotation(rslt);
243 if (scoremanager != null)
245 jalview.bin.Cache.log.debug("Updating result annotation from Job "+rslt+" at "+service.getUri());
246 updateResultAnnotation(true);
248 } catch (JobSubmissionException x)
251 System.err.println("submission error with "+getServiceActionText()+" :");
253 calcMan.workerCannotRun(this);
254 } catch (ResultNotAvailableException x)
256 System.err.println("collection error:\nJob ID: " + rslt);
258 calcMan.workerCannotRun(this);
260 } catch (OutOfMemoryError error)
262 calcMan.workerCannotRun(this);
265 // hconsensus = null;
266 ap.raiseOOMWarning(getServiceActionText(), error);
267 } catch (Exception x)
269 calcMan.workerCannotRun(this);
272 // hconsensus = null;
274 .println("Blacklisting worker due to unexpected exception:");
279 calcMan.workerComplete(this);
282 calcMan.workerComplete(this);
283 if (guiProgress != null && progressId!=-1)
285 guiProgress.setProgressBar("", progressId);
287 ap.paintAlignment(true);
291 // TODO: stash message somewhere in annotation or alignment view.
292 // code below shows result in a text box popup
293 /* jalview.gui.CutAndPasteTransfer cap = new jalview.gui.CutAndPasteTransfer();
294 cap.setText(msg.toString());
295 jalview.gui.Desktop.addInternalFrame(cap, "Job Status for "+getServiceActionText(), 600, 400); */
302 public void updateAnnotation()
304 updateResultAnnotation(false);
307 public abstract void updateResultAnnotation(boolean immediate);
309 public abstract String getServiceActionText();
311 boolean submitGaps = true;
313 boolean alignedSeqs = true;
315 boolean nucleotidesAllowed = false;
317 boolean proteinAllowed = false;
320 * record sequences for mapping result back to afterwards
322 protected boolean bySequence = false;
324 Map<String, SequenceI> seqNames;
327 public List<FastaSequence> getInputSequences(AlignmentI alignment)
329 if (alignment == null || alignment.getWidth() <= 0
330 || alignment.getSequences() == null
331 // || (alignedSeqs && !alignment.isAligned() && !submitGaps)
332 || alignment.isNucleotide() ? !nucleotidesAllowed
337 List<compbio.data.sequence.FastaSequence> seqs = new ArrayList<compbio.data.sequence.FastaSequence>();
343 seqNames = new HashMap<String, SequenceI>();
345 gapMap=new boolean[0];
346 for (SequenceI sq : ((List<SequenceI>) alignment.getSequences()))
348 if (sq.getEnd() - sq.getStart() > minlen - 1)
350 String newname = SeqsetUtils.unique_name(seqs.size() + 1);
351 // make new input sequence with or without gaps
352 if (seqNames != null)
354 seqNames.put(newname, sq);
359 seqs.add(seq = new compbio.data.sequence.FastaSequence(newname,sq.getSequenceAsString()));
360 if (gapMap==null || gapMap.length<seq.getSequence().length())
363 gapMap=new boolean[seq.getLength()];
364 System.arraycopy(tg, 0, gapMap, 0, tg.length);
365 for (int p=tg.length;p<gapMap.length;p++)
367 gapMap[p]=false; // init as a gap
370 for (int apos:sq.gapMap()) {
371 gapMap[apos]=true; // aligned.
374 seqs.add(seq = new compbio.data.sequence.FastaSequence(newname,
376 .extractGaps(jalview.util.Comparison.GapChars,
377 sq.getSequenceAsString())));
379 if (seq.getSequence().length() > ln)
381 ln = seq.getSequence().length();
385 if (alignedSeqs && submitGaps)
388 for (int i=0;i<gapMap.length;i++)
395 // try real hard to return something submittable
396 // TODO: some of AAcons measures need a minimum of two or three amino
397 // acids at each position, and aacons doesn't gracefully degrade.
398 for (int p = 0; p < seqs.size(); p++)
400 FastaSequence sq = seqs.get(p);
401 int l = sq.getSequence().length();
402 // strip gapped columns
403 char[] padded = new char[realw],orig=sq.getSequence().toCharArray();
404 for (int i=0,pp=0;i<realw; pp++)
410 padded[i++]=orig[pp];
416 seqs.set(p, new compbio.data.sequence.FastaSequence(sq.getId(),
417 new String(padded)));
424 * notify manager that we have started, and wait for a free calculation slot
426 * @return true if slot is obtained and work still valid, false if another
427 * thread has done our work for us.
431 calcMan.notifyStart(this);
432 ap.paintAlignment(false);
433 while (!calcMan.notifyWorking(this))
435 if (calcMan.isWorking(this))
443 ap.paintAlignment(false);
447 } catch (Exception ex)
449 ex.printStackTrace();
452 if (alignViewport.isClosed())