+ private boolean nucleotide = true;
+
+ public boolean hasRNAStructure = false;
+
+ public AlignmentAnnotation[] annotations;
+
+ HiddenSequences hiddenSequences;
+
+ HiddenColumns hiddenCols;
+
+ public Hashtable alignmentProperties;
+
+ private List<AlignedCodonFrame> codonFrameList;
+
+ private void initAlignment(SequenceI[] seqs)
+ {
+ groups = Collections.synchronizedList(new ArrayList<SequenceGroup>());
+ hiddenSequences = new HiddenSequences(this);
+ hiddenCols = new HiddenColumns();
+ codonFrameList = new ArrayList<>();
+
+ nucleotide = Comparison.isNucleotide(seqs);
+
+ sequences = Collections.synchronizedList(new ArrayList<SequenceI>());
+
+ for (int i = 0; i < seqs.length; i++)
+ {
+ sequences.add(seqs[i]);
+ }
+
+ }
+
+ /**
+ * Make a 'copy' alignment - sequences have new copies of features and
+ * annotations, but share the original dataset sequences.
+ */
+ public Alignment(AlignmentI al)
+ {
+ SequenceI[] seqs = al.getSequencesArray();
+ for (int i = 0; i < seqs.length; i++)
+ {
+ seqs[i] = new Sequence(seqs[i]);
+ }
+
+ initAlignment(seqs);
+
+ /*
+ * Share the same dataset sequence mappings (if any).
+ */
+ if (dataset == null && al.getDataset() == null)
+ {
+ this.setCodonFrames(al.getCodonFrames());
+ }
+ }
+
+ /**
+ * Make an alignment from an array of Sequences.
+ *
+ * @param sequences
+ */
+ public Alignment(SequenceI[] seqs)
+ {
+ initAlignment(seqs);
+ }
+
+ /**
+ * Make a new alignment from an array of SeqCigars
+ *
+ * @param alseqs
+ */
+ public Alignment(SeqCigar[] alseqs)
+ {
+ SequenceI[] seqs = SeqCigar.createAlignmentSequences(alseqs,
+ gapCharacter, new HiddenColumns(), null);
+ initAlignment(seqs);
+ }
+
+ /**
+ * Make a new alignment from an CigarArray JBPNote - can only do this when
+ * compactAlignment does not contain hidden regions. JBPNote - must also check
+ * that compactAlignment resolves to a set of SeqCigars - or construct them
+ * appropriately.
+ *
+ * @param compactAlignment
+ * CigarArray
+ */
+ public static AlignmentI createAlignment(CigarArray compactAlignment)
+ {
+ throw new Error(MessageManager
+ .getString("error.alignment_cigararray_not_implemented"));
+ // this(compactAlignment.refCigars);
+ }
+
+ @Override
+ public List<SequenceI> getSequences()
+ {
+ return sequences;
+ }
+
+ @Override
+ public List<SequenceI> getSequences(
+ Map<SequenceI, SequenceCollectionI> hiddenReps)
+ {
+ // TODO: in jalview 2.8 we don't do anything with hiddenreps - fix design to
+ // work on this.
+ return sequences;
+ }
+
+ @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;
+ }