1 package jalview.ws2.actions.secstructpred;
3 import java.io.IOException;
4 import java.util.ArrayList;
8 import jalview.analysis.AlignmentAnnotationUtils;
9 import jalview.analysis.SeqsetUtils;
10 import jalview.analysis.SeqsetUtils.SequenceInfo;
11 import jalview.api.AlignViewportI;
12 import jalview.bin.Console;
13 import jalview.datamodel.Alignment;
14 import jalview.datamodel.AlignmentAnnotation;
15 import jalview.datamodel.AlignmentI;
16 import jalview.datamodel.AlignmentView;
17 import jalview.datamodel.HiddenColumns;
18 import jalview.datamodel.SeqCigar;
19 import jalview.datamodel.SequenceI;
20 import jalview.io.AlignFile;
21 import jalview.io.JPredFile;
22 import jalview.io.JnetAnnotationMaker;
23 import jalview.ws.params.ArgumentI;
24 import jalview.ws2.actions.BaseJob;
25 import jalview.ws2.actions.BaseTask;
26 import jalview.ws2.actions.ServiceInputInvalidException;
27 import jalview.ws2.api.Credentials;
28 import jalview.ws2.api.JobStatus;
29 import jalview.ws2.client.api.SecStructPredWebServiceClientI;
31 public class SecStructPredMsaTask
32 extends BaseTask<SecStructPredMsaTask.SecStructPredJob, AlignmentI>
34 private final SecStructPredWebServiceClientI client;
36 private final AlignmentView alignmentView;
38 private final AlignmentI currentView;
40 private final char gapChar;
42 SecStructPredMsaTask(SecStructPredWebServiceClientI client,
43 List<ArgumentI> args, Credentials credentials,
44 AlignViewportI viewport)
46 super(client, args, credentials);
48 this.alignmentView = viewport.getAlignmentView(true);
49 this.currentView = viewport.getAlignment();
50 this.gapChar = viewport.getGapCharacter();
54 protected List<SecStructPredJob> prepareJobs()
55 throws ServiceInputInvalidException
57 SeqCigar[] msf = alignmentView.getSequences();
58 SequenceI referenceSeq = msf[0].getSeq('-');
59 int[] delMap = alignmentView
60 .getVisibleContigMapFor(referenceSeq.gapMap());
62 // TODO: assume MSA for now
63 SequenceI[] sequences = new SequenceI[msf.length];
64 for (int i = 0; i < msf.length; i++)
65 sequences[i] = msf[i].getSeq('-');
66 var sequenceInfo = SeqsetUtils.uniquify(sequences, true);
67 referenceSeq.setSequence(alignmentView.getASequenceString('-', 0));
68 for (int i = 0; i < sequences.length; i++)
69 sequences[i].setSequence(alignmentView.getASequenceString('-', i));
70 var sequencesList = filterEmptySequences(sequences);
71 var job = new SecStructPredJob(sequencesList, referenceSeq, delMap,
73 job.setStatus(JobStatus.READY);
77 private static List<SequenceI> filterEmptySequences(SequenceI[] seqs)
79 var filtered = new ArrayList<SequenceI>();
81 if (seq.getEnd() - seq.getStart() > 0)
87 protected AlignmentI collectResult(List<SecStructPredJob> jobs)
90 var job = jobs.get(0); // There shouldn't be more than one job
91 var status = job.getStatus();
93 String.format("sec str pred job \"%s\" finished with status %s",
94 job.getServerJob().getJobId(), status));
95 if (status != JobStatus.COMPLETED)
97 JPredFile predictionFile = client.getPredictionFile(job.getServerJob());
98 AlignFile alignmentFile = client.getAlignmentFile(job.getServerJob());
100 Object[] alnAndHiddenCols = alignmentView
101 .getAlignmentAndHiddenColumns(gapChar);
102 Alignment aln = new Alignment((SequenceI[]) alnAndHiddenCols[0]);
103 aln.setDataset(currentView.getDataset());
104 aln.setHiddenColumns((HiddenColumns) alnAndHiddenCols[1]);
107 JnetAnnotationMaker.add_annotation(predictionFile, aln, 0, false,
109 } catch (Exception e)
111 throw new IOException(e);
114 for (AlignmentAnnotation alnAnnot : aln.getAlignmentAnnotation())
116 if (alnAnnot.sequenceRef != null)
118 AlignmentAnnotationUtils.replaceAnnotationOnAlignmentWith(alnAnnot,
119 alnAnnot.label, getClass().getSimpleName());
122 aln.setSeqrep(aln.getSequenceAt(0));
126 public static class SecStructPredJob extends BaseJob
128 private final int[] delMap;
130 private final SequenceI refSeq;
132 final Map<String, SequenceInfo> seqNames;
134 SecStructPredJob(List<SequenceI> sequences, SequenceI refSeq,
135 int[] delMap, Map<String, SequenceInfo> seqNames)
138 this.refSeq = refSeq;
139 this.delMap = delMap;
140 this.seqNames = seqNames;
144 public boolean isInputValid()
149 public int[] getDelMap()