b0a924c2988b77786373da7f1cfe20a00ff45fe1
[jalview.git] / src / jalview / ws2 / actions / secstructpred / SecStructPredTask.java
1 package jalview.ws2.actions.secstructpred;
2
3 import java.io.IOException;
4 import java.util.ArrayList;
5 import java.util.List;
6
7 import jalview.analysis.AlignmentAnnotationUtils;
8 import jalview.analysis.SeqsetUtils;
9 import jalview.api.AlignViewportI;
10 import jalview.bin.Console;
11 import jalview.datamodel.Alignment;
12 import jalview.datamodel.AlignmentAnnotation;
13 import jalview.datamodel.AlignmentI;
14 import jalview.datamodel.AlignmentView;
15 import jalview.datamodel.HiddenColumns;
16 import jalview.datamodel.SeqCigar;
17 import jalview.datamodel.SequenceI;
18 import jalview.io.AlignFile;
19 import jalview.io.JPredFile;
20 import jalview.io.JnetAnnotationMaker;
21 import jalview.util.Comparison;
22 import jalview.ws.params.ArgumentI;
23 import jalview.ws2.actions.BaseJob;
24 import jalview.ws2.actions.BaseTask;
25 import jalview.ws2.actions.ServiceInputInvalidException;
26 import jalview.ws2.api.Credentials;
27 import jalview.ws2.api.JobStatus;
28 import jalview.ws2.client.api.SecStructPredWebServiceClientI;
29
30 public class SecStructPredTask extends BaseTask<SecStructPredJob, AlignmentI>
31 {
32   private final SecStructPredWebServiceClientI client;
33
34   private final AlignmentView alignmentView;
35
36   private final AlignmentI currentView;
37
38   private final char gapChar;
39
40   SecStructPredTask(SecStructPredWebServiceClientI client, List<ArgumentI> args,
41       Credentials credentials, AlignViewportI viewport)
42   {
43     super(client, args, credentials);
44     this.client = client;
45     this.alignmentView = viewport.getAlignmentView(true);
46     this.currentView = viewport.getAlignment();
47     this.gapChar = viewport.getGapCharacter();
48   }
49
50   @Override
51   protected List<SecStructPredJob> prepareJobs()
52       throws ServiceInputInvalidException
53   {
54     SeqCigar[] msf = alignmentView.getSequences();
55     SequenceI referenceSeq = msf[0].getSeq('-');
56     int[] delMap = alignmentView.getVisibleContigMapFor(referenceSeq.gapMap());
57
58     // TODO: assume MSA for now
59     SequenceI[] sequences = new SequenceI[msf.length];
60     for (int i = 0; i < msf.length; i++)
61       sequences[i] = msf[i].getSeq('-');
62     var sequenceInfo = SeqsetUtils.uniquify(sequences, true);
63     referenceSeq.setSequence(alignmentView.getASequenceString('-', 0));
64     for (int i = 0; i < sequences.length; i++)
65       sequences[i].setSequence(alignmentView.getASequenceString('-', i));
66     var sequencesList = filterEmptySequences(sequences);
67     var job = new SecStructPredJob(sequencesList, referenceSeq, delMap,
68         sequenceInfo);
69     job.setStatus(JobStatus.READY);
70     return List.of(job);
71   }
72
73   private static List<SequenceI> filterEmptySequences(SequenceI[] seqs)
74   {
75     var filtered = new ArrayList<SequenceI>();
76     for (var seq : seqs)
77       if (seq.getEnd() - seq.getStart() > 0)
78         filtered.add(seq);
79     return filtered;
80   }
81
82   @Override
83   protected AlignmentI collectResult(List<SecStructPredJob> jobs)
84       throws IOException
85   {
86     var job = jobs.get(0); // There shouldn't be more than one job
87     var status = job.getStatus();
88     Console
89         .info(String
90             .format("sec str pred job \"%s\" finished with status %s",
91                 job.getServerJob().getJobId(), status));
92     if (status != JobStatus.COMPLETED)
93       return null;
94     JPredFile predictionFile = client.getPredictionFile(job.getServerJob());
95     AlignFile alignmentFile = client.getAlignmentFile(job.getServerJob());
96
97     Object[] alnAndHiddenCols = alignmentView
98         .getAlignmentAndHiddenColumns(gapChar);
99     Alignment aln = new Alignment((SequenceI[]) alnAndHiddenCols[0]);
100     aln.setDataset(currentView.getDataset());
101     aln.setHiddenColumns((HiddenColumns) alnAndHiddenCols[1]);
102     try
103     {
104       JnetAnnotationMaker
105           .add_annotation(predictionFile, aln, 0, false, job.getDelMap());
106     } catch (Exception e)
107     {
108       throw new IOException(e);
109     }
110
111     for (AlignmentAnnotation alnAnnot : aln.getAlignmentAnnotation())
112     {
113       if (alnAnnot.sequenceRef != null)
114       {
115         AlignmentAnnotationUtils
116             .replaceAnnotationOnAlignmentWith(alnAnnot, alnAnnot.label,
117                 getClass().getSimpleName());
118       }
119     }
120     aln.setSeqrep(aln.getSequenceAt(0));
121     return aln;
122   }
123
124 }