import java.util.Hashtable;
import java.util.List;
+import jalview.analysis.SeqsetUtils;
import jalview.bin.Cache;
import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentAnnotation;
import jalview.datamodel.AlignmentI;
import jalview.datamodel.AlignmentView;
import jalview.datamodel.HiddenColumns;
import jalview.gui.AlignFrame;
import jalview.gui.Desktop;
import jalview.gui.WebserviceInfo;
+import jalview.io.JPredFile;
+import jalview.io.JnetAnnotationMaker;
import jalview.util.MessageManager;
import jalview.ws.api.CancellableI;
import jalview.ws.api.JPredMutlipleAlignmentServiceI;
Hashtable<?, ?> sequenceInfo;
List<SequenceI> msf;
int[] delMap;
- public AlignmentI alignment;
-
+ AlignmentI alignment = null;
+ HiddenColumns hiddenCols = null;
+
public JPredJob(Hashtable<?, ?> sequenceInfo, SequenceI[] msf, int[] delMap)
{
this.sequenceInfo = sequenceInfo;
this.msf = List.of(msf);
this.delMap = delMap;
}
-
+
@Override
public boolean hasValidInput()
{
return true;
}
+
+ @Override
+ public boolean hasResults()
+ {
+ return (isSubjobComplete() && alignment != null);
+ }
}
public class JPredThread extends AWSThread implements WSClientI
{
-
+
private JPredMutlipleAlignmentServiceI server;
private String title;
private Hashtable<?, ?> sequenceInfo;
private SequenceI[] msf;
- private int[] delMap;
-
+ private int[] delMap;
+
public JPredThread(WebserviceInfo wsInfo, String title,
JPredMutlipleAlignmentServiceI server, Hashtable<?, ?> sequenceInfo,
SequenceI[] msf, int[] delMap, AlignmentView view, AlignFrame frame,
public void cancelJob()
{
// TODO Auto-generated method stub
-
+
}
@Override
var jobHandle = server.align(job.msf);
if (jobHandle != null)
job.setJobHandle(jobHandle);
- }
+ }
catch (Throwable th) {
if (!server.handleSubmitError(th, job, wsInfo)) {
throw th;
wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_SERVERERROR);
wsInfo.setStatus(job.getJobnum(),
WebserviceInfo.STATE_STOPPED_SERVERERROR);
-
+
}
finally
{
Cache.log.debug(format("Job Execution file for job: %s " +
"on server %s%n%s", job.getJobId(), WsUrl, job.getStatus()));
try {
- job.alignment = server.getResult(job.getJobHandle());
+ prepareJobResult(job);
}
catch (Exception e) {
if (!server.handleCollectionException(e, job, wsInfo)) {
wsInfo.setResultsReady();
}
else {
+ wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_ERROR);
+ wsInfo.appendInfoText("No jobs ran.");
wsInfo.setFinishedNoResults();
}
updateGlobalStatus(finalState);
wsInfo.removeProgressBar(progbar);
}
-
+ private void prepareJobResult(JPredJob job) throws Exception
+ {
+ HiddenColumns hiddenCols = null;
+ int firstSeq = -1;
+ AlignmentI alignment;
+ var prediction = server.getPrediction(job.getJobHandle());
+ var preds = prediction.getSeqsAsArray();
+
+ if (job.delMap != null)
+ {
+ Object[] alandcolsel = input
+ .getAlignmentAndHiddenColumns(getGapChar());
+ alignment = new Alignment((SequenceI[]) alandcolsel[0]);
+ hiddenCols = (HiddenColumns) alandcolsel[1];
+ }
+ else
+ {
+ alignment = server.getAlignment(job.getJobHandle());
+ var seqs = new SequenceI[alignment.getHeight()];
+ for (int i = 0; i < alignment.getHeight(); i++)
+ {
+ seqs[i] = alignment.getSequenceAt(i);
+ }
+ if (!SeqsetUtils.deuniquify(sequenceInfo, seqs))
+ {
+ throw (new Exception(MessageManager.getString(
+ "exception.couldnt_recover_sequence_properties_for_alignment")));
+ }
+ }
+ firstSeq = 0;
+ if (currentView.getDataset() != null)
+ {
+ alignment.setDataset(currentView.getDataset());
+ }
+ else
+ {
+ alignment.setDataset(null);
+ }
+ JnetAnnotationMaker.add_annotation(prediction, alignment, firstSeq, false,
+ job.delMap);
+
+ for (var annot : alignment.getAlignmentAnnotation())
+ {
+ if (annot.sequenceRef != null)
+ {
+ replaceAnnotationOnAlignmentWith(annot, annot.label,
+ "jalview.ws.JPred", annot.sequenceRef);
+ }
+ }
+ job.alignment = alignment;
+ job.hiddenCols = hiddenCols;
+ }
+
+ private static void replaceAnnotationOnAlignmentWith(
+ AlignmentAnnotation newAnnot, String typeName, String calcId,
+ SequenceI aSeq)
+ {
+ SequenceI dsseq = aSeq.getDatasetSequence();
+ while (dsseq.getDatasetSequence() != null)
+ {
+ dsseq = dsseq.getDatasetSequence();
+ }
+ // look for same annotation on dataset and lift this one over
+ List<AlignmentAnnotation> dsan = dsseq.getAlignmentAnnotations(calcId,
+ typeName);
+ if (dsan != null && dsan.size() > 0)
+ {
+ for (AlignmentAnnotation dssan : dsan)
+ {
+ dsseq.removeAlignmentAnnotation(dssan);
+ }
+ }
+ AlignmentAnnotation dssan = new AlignmentAnnotation(newAnnot);
+ dsseq.addAlignmentAnnotation(dssan);
+ dssan.adjustForAlignment();
+ }
private void displayResults(boolean newWindow)
{
- System.out.println("DISPLAYING THE RESULT");
+ if (jobs == null || jobs.length == 0)
+ {
+ return;
+ }
+ var job = (JPredJob) jobs[0];
+ if (job.hasResults() && newWindow)
+ {
+ AlignFrame frame;
+ job.alignment.setSeqrep(job.alignment.getSequenceAt(0));
+ frame = new AlignFrame(job.alignment, job.hiddenCols,
+ AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);
+ Desktop.addInternalFrame(frame, title, AlignFrame.DEFAULT_WIDTH,
+ AlignFrame.DEFAULT_HEIGHT);
+ }
}
-
+
}