*/
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!
*
*/
public class AlignmentAnnotation
{
+
private static final String ANNOTATION_ID_PREFIX = "ann";
/*
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
*
}
/**
+ * 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<Integer, Annotation> sequenceMapping;
public static final int LINE_GRAPH = 2;
+ public static final int CONTACT_MAP = 4;
+
public boolean belowAlignment = true;
public SequenceGroup groupRef = null;
// 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'
|| 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')
{
{
this.sequenceMapping = null;
}
+
}
// TODO: check if we need to do this: JAL-952
// if (this.isrna=annotation.isrna)
seqPos = i + startRes;
}
- sequenceMapping.put(new Integer(seqPos), annotations[i]);
+ sequenceMapping.put(Integer.valueOf(seqPos), annotations[i]);
}
}
{
for (a = sequenceRef.getStart(); a <= sequenceRef.getEnd(); a++)
{
- index = new Integer(a);
+ index = Integer.valueOf(a);
Annotation annot = sequenceMapping.get(index);
if (annot != null)
{
{
if (seqname && this.sequenceRef != null)
{
- int i = description.toLowerCase().indexOf("<html>");
+ int i = description.toLowerCase(Locale.ROOT).indexOf("<html>");
if (i > -1)
{
// move the html tag to before the sequence reference.
}
return aa;
}
+
}