X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fanalysis%2FAlignmentUtils.java;h=6ab49b27575086a59ec507741236224830cdadcc;hb=a7169b1c72607f3c9357195b4999869650a2a891;hp=fdc74e2fed6f1f8cf4ba65a040c99374255163c0;hpb=57738a1f3c19b1c3a00bd3ac5108f8cd0af32f99;p=jalview.git diff --git a/src/jalview/analysis/AlignmentUtils.java b/src/jalview/analysis/AlignmentUtils.java index fdc74e2..6ab49b2 100644 --- a/src/jalview/analysis/AlignmentUtils.java +++ b/src/jalview/analysis/AlignmentUtils.java @@ -20,8 +20,6 @@ */ package jalview.analysis; -import java.util.Locale; - import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -31,6 +29,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Map.Entry; import java.util.NoSuchElementException; @@ -46,6 +45,7 @@ import jalview.datamodel.AlignedCodonFrame.SequenceToSequenceMapping; import jalview.datamodel.Alignment; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; +import jalview.datamodel.ContactMatrixI; import jalview.datamodel.DBRefEntry; import jalview.datamodel.GeneLociI; import jalview.datamodel.IncompleteCodonException; @@ -1471,7 +1471,19 @@ public class AlignmentUtils */ final Iterable matchedAlignmentAnnotations = al .findAnnotations(seq, dsann.getCalcId(), dsann.label); - if (!matchedAlignmentAnnotations.iterator().hasNext()) + boolean found = false; + if (matchedAlignmentAnnotations != null) + { + for (AlignmentAnnotation matched : matchedAlignmentAnnotations) + { + if (dsann.description.equals(matched.description)) + { + found = true; + break; + } + } + } + if (!found) { result.add(dsann); if (labelForCalcId != null) @@ -1492,14 +1504,15 @@ public class AlignmentUtils /** * Adds annotations to the top of the alignment annotations, in the same order - * as their related sequences. + * as their related sequences. If you already have an annotation and want to + * add it to a sequence in an alignment use {@code addReferenceAnnotationTo} * * @param annotations * the annotations to add * @param alignment * the alignment to add them to * @param selectionGroup - * current selection group (or null if none) + * current selection group - may be null, if provided then any added annotation will be trimmed to just those columns in the selection group */ public static void addReferenceAnnotations( Map> annotations, @@ -1509,31 +1522,60 @@ public class AlignmentUtils { for (AlignmentAnnotation ann : annotations.get(seq)) { - AlignmentAnnotation copyAnn = new AlignmentAnnotation(ann); - int startRes = 0; - int endRes = ann.annotations.length; - if (selectionGroup != null) - { - startRes = selectionGroup.getStartRes(); - endRes = selectionGroup.getEndRes(); - } - copyAnn.restrict(startRes, endRes); + addReferenceAnnotationTo(alignment, seq, ann, selectionGroup); + } + } + } - /* - * Add to the sequence (sets copyAnn.datasetSequence), unless the - * original annotation is already on the sequence. - */ - if (!seq.hasAnnotation(ann)) - { - seq.addAlignmentAnnotation(copyAnn); - } - // adjust for gaps - copyAnn.adjustForAlignment(); - // add to the alignment and set visible - alignment.addAnnotation(copyAnn); - copyAnn.visible = true; + /** + * Make a copy of a reference annotation {@code ann} and add it to an + * alignment sequence {@code seq} in {@code alignment}, optionally limited to + * the extent of {@code selectionGroup} + * + * @param alignment + * @param seq + * @param ann + * @param selectionGroup + * current selection group - may be null, if provided then any added annotation will be trimmed to just those columns in the selection group + * @return annotation added to {@code seq and {@code alignment} + */ + public static AlignmentAnnotation addReferenceAnnotationTo( + final AlignmentI alignment, final SequenceI seq, + final AlignmentAnnotation ann, final SequenceGroup selectionGroup) + { + AlignmentAnnotation copyAnn = new AlignmentAnnotation(ann); + int startRes = 0; + int endRes = ann.annotations.length; + if (selectionGroup != null) + { + startRes = -1 + Math.min(seq.getEnd(), Math.max(seq.getStart(), + seq.findPosition(selectionGroup.getStartRes()))); + endRes = -1 + Math.min(seq.getEnd(), + seq.findPosition(selectionGroup.getEndRes())); + + } + copyAnn.restrict(startRes, endRes + 0); + + /* + * Add to the sequence (sets copyAnn.datasetSequence), unless the + * original annotation is already on the sequence. + */ + if (!seq.hasAnnotation(ann)) + { + ContactMatrixI cm = seq.getDatasetSequence().getContactMatrixFor(ann); + if (cm != null) + { + seq.addContactListFor(copyAnn, cm); } + seq.addAlignmentAnnotation(copyAnn); } + // adjust for gaps + copyAnn.adjustForAlignment(); + // add to the alignment and set visible + alignment.addAnnotation(copyAnn); + copyAnn.visible = true; + + return copyAnn; } /** @@ -1573,6 +1615,21 @@ public class AlignmentUtils } } + public static AlignmentAnnotation getFirstSequenceAnnotationOfType( + AlignmentI al, int graphType) + { + AlignmentAnnotation[] anns = al.getAlignmentAnnotation(); + if (anns != null) + { + for (AlignmentAnnotation aa : anns) + { + if (aa.sequenceRef != null && aa.graph == graphType) + return aa; + } + } + return null; + } + /** * Returns true if either sequence has a cross-reference to the other *