1 package jalview.ws2.actions.secstructpred;
3 import java.io.IOException;
4 import java.util.ArrayList;
5 import java.util.Arrays;
9 import jalview.analysis.AlignmentAnnotationUtils;
10 import jalview.analysis.SeqsetUtils;
11 import jalview.analysis.SeqsetUtils.SequenceInfo;
12 import jalview.api.AlignViewportI;
13 import jalview.bin.Console;
14 import jalview.datamodel.Alignment;
15 import jalview.datamodel.AlignmentAnnotation;
16 import jalview.datamodel.AlignmentI;
17 import jalview.datamodel.AlignmentView;
18 import jalview.datamodel.HiddenColumns;
19 import jalview.datamodel.SeqCigar;
20 import jalview.datamodel.SequenceI;
21 import jalview.io.AlignFile;
22 import jalview.io.JPredFile;
23 import jalview.io.JnetAnnotationMaker;
24 import jalview.ws.params.ArgumentI;
25 import jalview.ws2.actions.BaseJob;
26 import jalview.ws2.actions.BaseTask;
27 import jalview.ws2.actions.ServiceInputInvalidException;
28 import jalview.ws2.api.Credentials;
29 import jalview.ws2.api.JobStatus;
30 import jalview.ws2.client.api.SecStructPredWebServiceClientI;
32 public class SecStructPredMsaTask
33 extends BaseTask<SecStructPredMsaTask.SecStructPredJob, AlignmentI>
35 private final SecStructPredWebServiceClientI client;
37 private final AlignmentView alignmentView;
39 private final AlignmentI currentView;
41 private final char gapChar;
43 SecStructPredMsaTask(SecStructPredWebServiceClientI client,
44 List<ArgumentI> args, Credentials credentials,
45 AlignViewportI viewport)
47 super(client, args, credentials);
49 this.alignmentView = viewport.getAlignmentView(true);
50 this.currentView = viewport.getAlignment();
51 this.gapChar = viewport.getGapCharacter();
55 protected List<SecStructPredJob> prepareJobs()
56 throws ServiceInputInvalidException
58 SeqCigar[] msf = alignmentView.getSequences();
59 SequenceI referenceSeq = msf[0].getSeq('-');
60 int[] delMap = alignmentView
61 .getVisibleContigMapFor(referenceSeq.gapMap());
63 // TODO: assume MSA for now
64 SequenceI[] sequences = new SequenceI[msf.length];
65 for (int i = 0; i < msf.length; i++)
66 sequences[i] = msf[i].getSeq('-');
67 var sequenceInfo = SeqsetUtils.uniquify(sequences, true);
68 referenceSeq.setSequence(alignmentView.getASequenceString('-', 0));
69 for (int i = 0; i < sequences.length; i++)
70 sequences[i].setSequence(alignmentView.getASequenceString('-', i));
71 var nonEmptySeqs = SeqsetUtils.getNonEmptySequenceSet(sequences);
72 var job = new SecStructPredJob(Arrays.asList(nonEmptySeqs),
73 referenceSeq, delMap, sequenceInfo);
74 job.setStatus(JobStatus.READY);
79 protected AlignmentI collectResult(List<SecStructPredJob> jobs)
82 var job = jobs.get(0); // There shouldn't be more than one job
83 var status = job.getStatus();
85 String.format("sec str pred job \"%s\" finished with status %s",
86 job.getServerJob().getJobId(), status));
87 if (status != JobStatus.COMPLETED)
89 JPredFile predictionFile = client.getPredictionFile(job.getServerJob());
90 AlignFile alignmentFile = client.getAlignmentFile(job.getServerJob());
92 Object[] alnAndHiddenCols = alignmentView
93 .getAlignmentAndHiddenColumns(gapChar);
94 Alignment aln = new Alignment((SequenceI[]) alnAndHiddenCols[0]);
95 aln.setDataset(currentView.getDataset());
96 aln.setHiddenColumns((HiddenColumns) alnAndHiddenCols[1]);
99 JnetAnnotationMaker.add_annotation(predictionFile, aln, 0, false,
101 } catch (Exception e)
103 throw new IOException(e);
106 for (AlignmentAnnotation alnAnnot : aln.getAlignmentAnnotation())
108 if (alnAnnot.sequenceRef != null)
110 AlignmentAnnotationUtils.replaceAnnotationOnAlignmentWith(alnAnnot,
111 alnAnnot.label, getClass().getSimpleName());
114 aln.setSeqrep(aln.getSequenceAt(0));
118 public static class SecStructPredJob extends BaseJob
120 private final int[] delMap;
122 private final SequenceI refSeq;
124 final Map<String, SequenceInfo> seqNames;
126 SecStructPredJob(List<SequenceI> sequences, SequenceI refSeq,
127 int[] delMap, Map<String, SequenceInfo> seqNames)
130 this.refSeq = refSeq;
131 this.delMap = delMap;
132 this.seqNames = seqNames;
136 public boolean isInputValid()
141 public int[] getDelMap()