X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2FAlignmentAnnotation.java;h=7e6b904e28f75530d00d6fd6fd6bf6c5869aac1b;hb=refs%2Fheads%2Fspike%2FJAL-4047%2FJAL-4048_columns_in_sequenceID;hp=6c33c1b866861f0c8b4fe82c59e4894e442b8cfc;hpb=62086b8b7a0b9436c445a94bfab5eff253adb6d5;p=jalview.git diff --git a/src/jalview/datamodel/AlignmentAnnotation.java b/src/jalview/datamodel/AlignmentAnnotation.java index 6c33c1b..7e6b904 100755 --- a/src/jalview/datamodel/AlignmentAnnotation.java +++ b/src/jalview/datamodel/AlignmentAnnotation.java @@ -20,19 +20,22 @@ */ package jalview.datamodel; -import jalview.analysis.Rna; -import jalview.analysis.SecStrConsensus.SimpleBP; -import jalview.analysis.WUSSParseException; - import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Map.Entry; +import jalview.analysis.Rna; +import jalview.analysis.SecStrConsensus.SimpleBP; +import jalview.analysis.WUSSParseException; +import jalview.structure.StructureImportSettings; + /** * DOCUMENT ME! * @@ -41,6 +44,7 @@ import java.util.Map.Entry; */ public class AlignmentAnnotation { + private static final String ANNOTATION_ID_PREFIX = "ann"; /* @@ -94,6 +98,21 @@ public class AlignmentAnnotation private long invalidrnastruc = -2; /** + * the type of temperature factor plot (if it is one) + */ + private StructureImportSettings.TFType tfType = StructureImportSettings.TFType.DEFAULT; + + public void setTFType(StructureImportSettings.TFType t) + { + tfType = t; + } + + public StructureImportSettings.TFType getTFType() + { + return tfType; + } + + /** * Updates the _rnasecstr field Determines the positions that base pair and * the positions of helices based on secondary structure from a Stockholm file * @@ -107,7 +126,7 @@ public class AlignmentAnnotation invalidrnastruc = -1; } catch (WUSSParseException px) { - // DEBUG System.out.println(px); + // DEBUG jalview.bin.Console.outPrintln(px); invalidrnastruc = px.getProblemPos(); } if (invalidrnastruc > -1) @@ -123,7 +142,7 @@ public class AlignmentAnnotation scaleColLabel = true; _markRnaHelices(); } - // System.out.println("featuregroup " + _rnasecstr[0].getFeatureGroup()); + // jalview.bin.Console.outPrintln("featuregroup " + _rnasecstr[0].getFeatureGroup()); } @@ -137,10 +156,10 @@ public class AlignmentAnnotation { /* - * System.out.println(this.annotation._rnasecstr[x] + " Begin" + + * jalview.bin.Console.outPrintln(this.annotation._rnasecstr[x] + " Begin" + * this.annotation._rnasecstr[x].getBegin()); */ - // System.out.println(this.annotation._rnasecstr[x].getFeatureGroup()); + // jalview.bin.Console.outPrintln(this.annotation._rnasecstr[x].getFeatureGroup()); int val = 0; try { @@ -164,6 +183,72 @@ public class AlignmentAnnotation } /** + * Get the RNA Secondary Structure SequenceFeature Array if present + */ + public SequenceFeature[] getRnaSecondaryStructure() + { + return this._rnasecstr; + } + + /** + * Check the RNA Secondary Structure is equivalent to one in given + * AlignmentAnnotation param + */ + public boolean rnaSecondaryStructureEquivalent(AlignmentAnnotation that) + { + return rnaSecondaryStructureEquivalent(that, true); + } + + public boolean rnaSecondaryStructureEquivalent(AlignmentAnnotation that, + boolean compareType) + { + SequenceFeature[] thisSfArray = this.getRnaSecondaryStructure(); + SequenceFeature[] thatSfArray = that.getRnaSecondaryStructure(); + if (thisSfArray == null || thatSfArray == null) + { + return thisSfArray == null && thatSfArray == null; + } + if (thisSfArray.length != thatSfArray.length) + { + return false; + } + Arrays.sort(thisSfArray, new SFSortByEnd()); // probably already sorted + // like this + Arrays.sort(thatSfArray, new SFSortByEnd()); // probably already sorted + // like this + for (int i = 0; i < thisSfArray.length; i++) + { + SequenceFeature thisSf = thisSfArray[i]; + SequenceFeature thatSf = thatSfArray[i]; + if (compareType) + { + if (thisSf.getType() == null || thatSf.getType() == null) + { + if (thisSf.getType() == null && thatSf.getType() == null) + { + continue; + } + else + { + return false; + } + } + if (!thisSf.getType().equals(thatSf.getType())) + { + return false; + } + } + if (!(thisSf.getBegin() == thatSf.getBegin() + && thisSf.getEnd() == thatSf.getEnd())) + { + return false; + } + } + return true; + + } + + /** * map of positions in the associated annotation */ private Map sequenceMapping; @@ -221,6 +306,13 @@ public class AlignmentAnnotation public static final int LINE_GRAPH = 2; + public static final int CONTACT_MAP = 4; + + /** + * property that when set to non-empty string disables display of column groups defined on the contact matrix + */ + public static final String CONTACT_MAP_NOGROUPS = "CMNOGRPS"; + public boolean belowAlignment = true; public SequenceGroup groupRef = null; @@ -294,6 +386,7 @@ public class AlignmentAnnotation char firstChar = 0; for (int i = 0; i < annotations.length; i++) { + // DEBUG jalview.bin.Console.outPrintln(i + ": " + annotations[i]); if (annotations[i] == null) { continue; @@ -301,27 +394,35 @@ public class AlignmentAnnotation if (annotations[i].secondaryStructure == 'H' || annotations[i].secondaryStructure == 'E') { + // DEBUG jalview.bin.Console.outPrintln( "/H|E/ '" + + // annotations[i].secondaryStructure + "'"); hasIcons |= true; } else // Check for RNA secondary structure { - // System.out.println(annotations[i].secondaryStructure); + // DEBUG jalview.bin.Console.outPrintln( "/else/ '" + + // annotations[i].secondaryStructure + "'"); // TODO: 2.8.2 should this ss symbol validation check be a function in // RNA/ResidueProperties ? + // allow for DSSP extended code: + // https://www.wikidoc.org/index.php/Secondary_structure#The_DSSP_code + // GHITEBS as well as C and X (for missing?) if (annotations[i].secondaryStructure == '(' || annotations[i].secondaryStructure == '[' || annotations[i].secondaryStructure == '<' || annotations[i].secondaryStructure == '{' || annotations[i].secondaryStructure == 'A' - || annotations[i].secondaryStructure == 'B' - || annotations[i].secondaryStructure == 'C' + // || annotations[i].secondaryStructure == 'B' + // || annotations[i].secondaryStructure == 'C' || annotations[i].secondaryStructure == 'D' - || annotations[i].secondaryStructure == 'E' + // || annotations[i].secondaryStructure == 'E' // ambiguous on + // its own -- already checked above || annotations[i].secondaryStructure == 'F' - || annotations[i].secondaryStructure == 'G' - || annotations[i].secondaryStructure == 'H' - || annotations[i].secondaryStructure == 'I' + // || annotations[i].secondaryStructure == 'G' + // || annotations[i].secondaryStructure == 'H' // ambiguous on + // its own -- already checked above + // || annotations[i].secondaryStructure == 'I' || annotations[i].secondaryStructure == 'J' || annotations[i].secondaryStructure == 'K' || annotations[i].secondaryStructure == 'L' @@ -331,12 +432,12 @@ public class AlignmentAnnotation || annotations[i].secondaryStructure == 'P' || annotations[i].secondaryStructure == 'Q' || annotations[i].secondaryStructure == 'R' - || annotations[i].secondaryStructure == 'S' - || annotations[i].secondaryStructure == 'T' + // || annotations[i].secondaryStructure == 'S' + // || annotations[i].secondaryStructure == 'T' || annotations[i].secondaryStructure == 'U' || annotations[i].secondaryStructure == 'V' || annotations[i].secondaryStructure == 'W' - || annotations[i].secondaryStructure == 'X' + // || annotations[i].secondaryStructure == 'X' || annotations[i].secondaryStructure == 'Y' || annotations[i].secondaryStructure == 'Z') { @@ -345,7 +446,7 @@ public class AlignmentAnnotation } } - // System.out.println("displaychar " + annotations[i].displayCharacter); + // jalview.bin.Console.outPrintln("displaychar " + annotations[i].displayCharacter); if (annotations[i].displayCharacter == null || annotations[i].displayCharacter.length() == 0) @@ -367,7 +468,7 @@ public class AlignmentAnnotation // && // annotations[i].displayCharacter.charAt(0)==annotations[i].secondaryStructure firstChar != ' ' && firstChar != '$' && firstChar != 0xCE - && firstChar != '(' && firstChar != '[' && firstChar != '>' + && firstChar != '(' && firstChar != '[' && firstChar != '<' && firstChar != '{' && firstChar != 'A' && firstChar != 'B' && firstChar != 'C' && firstChar != 'D' && firstChar != 'E' && firstChar != 'F' && firstChar != 'G' && firstChar != 'H' @@ -730,6 +831,7 @@ public class AlignmentAnnotation { this.sequenceMapping = null; } + } // TODO: check if we need to do this: JAL-952 // if (this.isrna=annotation.isrna) @@ -926,7 +1028,7 @@ public class AlignmentAnnotation seqPos = i + startRes; } - sequenceMapping.put(new Integer(seqPos), annotations[i]); + sequenceMapping.put(Integer.valueOf(seqPos), annotations[i]); } } @@ -965,7 +1067,7 @@ public class AlignmentAnnotation { for (a = sequenceRef.getStart(); a <= sequenceRef.getEnd(); a++) { - index = new Integer(a); + index = Integer.valueOf(a); Annotation annot = sequenceMapping.get(index); if (annot != null) { @@ -1160,7 +1262,7 @@ public class AlignmentAnnotation { if (seqname && this.sequenceRef != null) { - int i = description.toLowerCase().indexOf(""); + int i = description.toLowerCase(Locale.ROOT).indexOf(""); if (i > -1) { // move the html tag to before the sequence reference. @@ -1582,4 +1684,89 @@ public class AlignmentAnnotation } } + public static Iterable findAnnotations( + Iterable list, SequenceI seq, String calcId, + String label) + { + + ArrayList aa = new ArrayList<>(); + for (AlignmentAnnotation ann : list) + { + if ((calcId == null || (ann.getCalcId() != null + && ann.getCalcId().equals(calcId))) + && (seq == null || (ann.sequenceRef != null + && ann.sequenceRef == seq)) + && (label == null + || (ann.label != null && ann.label.equals(label)))) + { + aa.add(ann); + } + } + return aa; + } + + /** + * Answer true if any annotation matches the calcId passed in (if not null). + * + * @param list + * annotation to search + * @param calcId + * @return + */ + public static boolean hasAnnotation(List list, + String calcId) + { + + if (calcId != null && !"".equals(calcId)) + { + for (AlignmentAnnotation a : list) + { + if (a.getCalcId() == calcId) + { + return true; + } + } + } + return false; + } + + public static Iterable findAnnotation( + List list, String calcId) + { + + List aa = new ArrayList<>(); + if (calcId == null) + { + return aa; + } + for (AlignmentAnnotation a : list) + { + + if (a.getCalcId() == calcId || (a.getCalcId() != null + && calcId != null && a.getCalcId().equals(calcId))) + { + aa.add(a); + } + } + return aa; + } + + /** + * convenience method to check for the 'CONTACT_MAP_NOGROUPS' property for this alignment annotation row + * @return true if no CONTACT_MAP_NOGROUPS property is found, or it is set to "" + */ + public boolean isShowGroupsForContactMatrix() + { + return getProperty(AlignmentAnnotation.CONTACT_MAP_NOGROUPS)==null || "".equals(getProperty(AlignmentAnnotation.CONTACT_MAP_NOGROUPS)); + } + /** + * set the 'CONTACT_MAP_NOGROUPS' property for this alignment annotation row + * @see isShowGroupsForContactMatrix + */ + public void setShowGroupsForContactMatrix(boolean showGroups) + { + setProperty(AlignmentAnnotation.CONTACT_MAP_NOGROUPS, showGroups ? "" : "nogroups"); + } + + }