X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2FAlignmentAnnotation.java;h=4ebb27f5ee914cbc5e1d2928fb88707bbc0ae96e;hb=747167089ecf8d6afc70d417f5a20352e029bd95;hp=c46b2d4faba902ffad9de91332155ed35cc03ae3;hpb=1b0f0d6c0a343e67453ed4f7e1ca3f9c2a7a6ff2;p=jalview.git diff --git a/src/jalview/datamodel/AlignmentAnnotation.java b/src/jalview/datamodel/AlignmentAnnotation.java index c46b2d4..4ebb27f 100755 --- a/src/jalview/datamodel/AlignmentAnnotation.java +++ b/src/jalview/datamodel/AlignmentAnnotation.java @@ -20,19 +20,21 @@ */ 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; + /** * DOCUMENT ME! * @@ -93,6 +95,10 @@ public class AlignmentAnnotation */ private long invalidrnastruc = -2; + private double bitScore; + + private double eValue; + /** * Updates the _rnasecstr field Determines the positions that base pair and * the positions of helices based on secondary structure from a Stockholm file @@ -164,6 +170,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; @@ -294,6 +366,7 @@ public class AlignmentAnnotation char firstChar = 0; for (int i = 0; i < annotations.length; i++) { + // DEBUG System.out.println(i + ": " + annotations[i]); if (annotations[i] == null) { continue; @@ -301,27 +374,35 @@ public class AlignmentAnnotation if (annotations[i].secondaryStructure == 'H' || annotations[i].secondaryStructure == 'E') { + // DEBUG System.out.println( "/H|E/ '" + + // annotations[i].secondaryStructure + "'"); hasIcons |= true; } else // Check for RNA secondary structure { - // System.out.println(annotations[i].secondaryStructure); + // DEBUG System.out.println( "/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 +412,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') { @@ -367,7 +448,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' @@ -472,12 +553,12 @@ public class AlignmentAnnotation : annotations[index + offset].displayCharacter == null || annotations[index + offset].displayCharacter - .length() == 0 - ? annotations[index - + offset].secondaryStructure - : annotations[index - + offset].displayCharacter - .charAt(0)); + .length() == 0 + ? annotations[index + + offset].secondaryStructure + : annotations[index + + offset].displayCharacter + .charAt(0)); } @Override @@ -519,7 +600,7 @@ public class AlignmentAnnotation } return null; } - + /** * Creates a new AlignmentAnnotation object. * @@ -631,7 +712,7 @@ public class AlignmentAnnotation } } } - + /** * Copy constructor creates a new independent annotation row with the same * associated sequenceRef @@ -641,6 +722,17 @@ public class AlignmentAnnotation public AlignmentAnnotation(AlignmentAnnotation annotation) { setAnnotationId(); + updateAlignmentAnnotationFrom(annotation); + } + + /** + * copy attributes and annotation from an existing annotation (used by copy + * constructor). This method does not update the unique annotationId + * + * @param annotation + */ + public void updateAlignmentAnnotationFrom(AlignmentAnnotation annotation) + { this.label = new String(annotation.label); if (annotation.description != null) { @@ -664,6 +756,9 @@ public class AlignmentAnnotation this.scaleColLabel = annotation.scaleColLabel; this.showAllColLabels = annotation.showAllColLabels; this.calcId = annotation.calcId; + this.bitScore = annotation.bitScore; + this.eValue = annotation.eValue; + if (annotation.properties != null) { properties = new HashMap<>(); @@ -927,7 +1022,7 @@ public class AlignmentAnnotation seqPos = i + startRes; } - sequenceMapping.put(new Integer(seqPos), annotations[i]); + sequenceMapping.put(Integer.valueOf(seqPos), annotations[i]); } } @@ -966,7 +1061,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) { @@ -1097,7 +1192,7 @@ public class AlignmentAnnotation { return hasScore || !Double.isNaN(score); } - + /** * Score only annotation * @@ -1128,6 +1223,7 @@ public class AlignmentAnnotation makeVisibleAnnotation(hidden); } + public void setPadGaps(boolean padgaps, char gapchar) { this.padGaps = padgaps; @@ -1161,7 +1257,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. @@ -1587,7 +1683,6 @@ public class AlignmentAnnotation Iterable list, SequenceI seq, String calcId, String label) { - ArrayList aa = new ArrayList<>(); for (AlignmentAnnotation ann : list) { @@ -1632,7 +1727,6 @@ public class AlignmentAnnotation public static Iterable findAnnotation( List list, String calcId) { - List aa = new ArrayList<>(); if (calcId == null) { @@ -1649,4 +1743,43 @@ public class AlignmentAnnotation } return aa; } + + public double getBitScore() + { + return bitScore; + } + + public void setBitScore(double bitScore) + { + this.bitScore = bitScore; + } + + public double getEValue() + { + return eValue; + } + + public void setEValue(double eValue) + { + this.eValue = eValue; + } + + public static AlignmentAnnotation findFirstAnnotation( + Iterable alignmentAnnotation, String name, + String calcId, boolean autoCalc, SequenceI seqRef, + SequenceGroup groupRef) + { + + for (AlignmentAnnotation annot : alignmentAnnotation) + { + if (annot.autoCalculated == autoCalc && (name.equals(annot.label)) + && (calcId == null || annot.getCalcId().equals(calcId)) + && annot.sequenceRef == seqRef && annot.groupRef == groupRef) + { + return annot; + } + } + return null; + } + }