X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws2%2Factions%2Falignment%2FAlignmentJob.java;fp=src%2Fjalview%2Fws2%2Factions%2Falignment%2FAlignmentJob.java;h=5ddb64af0c6a1ce260245f817e94e00a2bcc50b7;hb=bea1d9b563d2fea018de3dbde9112dd59149126e;hp=0000000000000000000000000000000000000000;hpb=49ab19e8189569edf0bc1f4ba8dac14e67f4ca36;p=jalview.git diff --git a/src/jalview/ws2/actions/alignment/AlignmentJob.java b/src/jalview/ws2/actions/alignment/AlignmentJob.java new file mode 100644 index 0000000..5ddb64a --- /dev/null +++ b/src/jalview/ws2/actions/alignment/AlignmentJob.java @@ -0,0 +1,114 @@ +package jalview.ws2.actions.alignment; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import jalview.analysis.AlignSeq; +import jalview.analysis.SeqsetUtils; +import jalview.analysis.SeqsetUtils.SequenceInfo; +import jalview.datamodel.AlignmentI; +import jalview.datamodel.Sequence; +import jalview.datamodel.SequenceI; +import jalview.util.Comparison; +import jalview.ws2.actions.BaseJob; +import jalview.ws2.api.WebServiceJobHandle; + +/** + * A wrapper class that extends basic job container with data specific to + * alignment services. It stores input and empty sequences (with uniquified + * names) along the original sequence information. {@link AlignmentJob} objects + * are created by {@link AlignmentTask} during a preparation stage. + * + * @author mmwarowny + * + */ +class AlignmentJob extends BaseJob +{ + private final List emptySeqs; + + private final Map names; + + private AlignmentI alignmentResult; + + AlignmentJob(List inputSeqs, List emptySeqs, + Map names) + { + super(Collections.unmodifiableList(inputSeqs)); + this.emptySeqs = Collections.unmodifiableList(emptySeqs); + this.names = Collections.unmodifiableMap(names); + } + + public static AlignmentJob create(SequenceI[] seqs, int minlen, boolean keepGaps) + { + int nseqs = 0; + for (int i = 0; i < seqs.length; i++) + { + if (seqs[i].getEnd() - seqs[i].getStart() >= minlen) + nseqs++; + } + boolean valid = nseqs > 1; // need at least two sequences + Map names = new LinkedHashMap<>(); + List inputSeqs = new ArrayList<>(); + List emptySeqs = new ArrayList<>(); + for (int i = 0; i < seqs.length; i++) + { + SequenceI seq = seqs[i]; + String newName = SeqsetUtils.unique_name(i); + names.put(newName, SeqsetUtils.SeqCharacterHash(seq)); + if (valid && seq.getEnd() - seq.getStart() >= minlen) + { + // make new input sequence + String seqString = seq.getSequenceAsString(); + if (!keepGaps) + seqString = AlignSeq.extractGaps(Comparison.GapChars, seqString); + inputSeqs.add(new Sequence(newName, seqString)); + } + else + { + String seqString = ""; + if (seq.getEnd() >= seq.getStart()) // true if gaps only + { + seqString = seq.getSequenceAsString(); + if (!keepGaps) + seqString = AlignSeq.extractGaps(Comparison.GapChars, seqString); + } + emptySeqs.add(new Sequence(newName, seqString)); + } + } + return new AlignmentJob(inputSeqs, emptySeqs, names); + } + + @Override + public boolean isInputValid() + { + return inputSeqs.size() >= 2; + } + + List getEmptySequences() + { + return emptySeqs; + } + + Map getNames() + { + return names; + } + + boolean hasResult() + { + return alignmentResult != null; + } + + AlignmentI getAlignmentResult() + { + return alignmentResult; + } + + void setAlignmentResult(AlignmentI alignment) + { + this.alignmentResult = alignment; + } +}