import java.util.Arrays;
import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Map;
/**
* A helper class to sort all annotations associated with an alignment in
}
}
+ // the alignment with respect to which annotations are sorted
private final AlignmentI alignment;
+ // user preference for placement of non-sequence annotations
private boolean showAutocalcAbove;
+ // working map of sequence index in alignment
+ private final Map<SequenceI, Integer> sequenceIndices = new HashMap<SequenceI, Integer>();
+
/**
* Constructor given an alignment and the location (top or bottom) of
* Consensus and similar.
public void sort(AlignmentAnnotation[] alignmentAnnotations,
SequenceAnnotationOrder order)
{
+ // cache 'alignment sequence position' for the annotations
+ saveSequenceIndices(alignmentAnnotations);
+
Comparator<? super AlignmentAnnotation> comparator = getComparator(order);
if (alignmentAnnotations != null)
}
/**
+ * Calculate and save in a temporary map the position of each annotation's
+ * sequence (if it has one) in the alignment. Faster to do this once than for
+ * every annotation comparison.
+ *
+ * @param alignmentAnnotations
+ */
+ private void saveSequenceIndices(
+ AlignmentAnnotation[] alignmentAnnotations)
+ {
+ sequenceIndices.clear();
+ for (AlignmentAnnotation ann : alignmentAnnotations) {
+ SequenceI seq = ann.sequenceRef;
+ if (seq != null) {
+ int index = AlignmentUtils.getSequenceIndex(alignment, seq);
+ sequenceIndices.put(seq, index);
+ }
+ }
+ }
+
+ /**
* Get the comparator for the specified sort order.
*
* @param order
return showAutocalcAbove ? 1 : -1;
}
// get sequence index - but note -1 means 'at end' so needs special handling
- int index1 = AlignmentUtils.getSequenceIndex(alignment, seq1);
- int index2 = AlignmentUtils.getSequenceIndex(alignment, seq2);
+ int index1 = sequenceIndices.get(seq1);
+ int index2 = sequenceIndices.get(seq2);
if (index1 == index2)
{
return 0;