+ @Override
+ public SequenceI[] getSequencesArray()
+ {
+ if (sequences == null)
+ {
+ return null;
+ }
+ synchronized (sequences)
+ {
+ return sequences.toArray(new SequenceI[sequences.size()]);
+ }
+ }
+
+ /**
+ * Returns a map of lists of sequences keyed by sequence name.
+ *
+ * @return
+ */
+ @Override
+ public Map<String, List<SequenceI>> getSequencesByName()
+ {
+ return AlignmentUtils.getSequencesByName(this);
+ }
+
+ @Override
+ public SequenceI getSequenceAt(int i)
+ {
+ synchronized (sequences)
+ {
+ if (i > -1 && i < sequences.size())
+ {
+ return sequences.get(i);
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public SequenceI getSequenceAtAbsoluteIndex(int i)
+ {
+ SequenceI seq = null;
+ if (getHiddenSequences().getSize() > 0)
+ {
+ seq = getHiddenSequences().getHiddenSequence(i);
+ if (seq == null)
+ {
+ // didn't find the sequence in the hidden sequences, get it from the
+ // alignment
+ int index = getHiddenSequences().findIndexWithoutHiddenSeqs(i);
+ seq = getSequenceAt(index);
+ }
+ }
+ else
+ {
+ seq = getSequenceAt(i);
+ }
+ return seq;
+ }
+
+ /**
+ * Adds a sequence to the alignment. Recalculates maxLength and size. Note
+ * this currently does not recalculate whether or not the alignment is
+ * nucleotide, so mixed alignments may have undefined behaviour.
+ *
+ * @param snew
+ */
+ @Override
+ public void addSequence(SequenceI snew)
+ {
+ if (dataset != null)
+ {
+
+ // maintain dataset integrity
+ SequenceI dsseq = snew.getDatasetSequence();
+ if (dsseq == null)
+ {
+ // derive new sequence
+ SequenceI adding = snew.deriveSequence();
+ snew = adding;
+ dsseq = snew.getDatasetSequence();
+ }
+ if (getDataset().findIndex(dsseq) == -1)
+ {
+ getDataset().addSequence(dsseq);
+ }
+
+ }
+ if (sequences == null)
+ {
+ initAlignment(new SequenceI[] { snew });
+ }
+ else
+ {
+ synchronized (sequences)
+ {
+ sequences.add(snew);
+ }
+ }
+ if (hiddenSequences != null)
+ {
+ hiddenSequences.adjustHeightSequenceAdded();
+ }
+ }
+
+ @Override
+ public SequenceI replaceSequenceAt(int i, SequenceI snew)
+ {
+ synchronized (sequences)
+ {
+ if (sequences.size() > i)
+ {
+ return sequences.set(i, snew);
+
+ }