/*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6)
- * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
+ * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle
*
* This file is part of Jalview.
*
*/
package jalview.datamodel;
+import jalview.analysis.Rna;
+import jalview.analysis.WUSSParseException;
+
import java.util.Enumeration;
import java.util.Hashtable;
public boolean autoCalculated = false;
public String annotationId;
-
+
public SequenceI sequenceRef;
/** DOCUMENT ME!! */
/** DOCUMENT ME!! */
public Annotation[] annotations;
+ /**
+ * RNA secondary structure contact positions
+ */
+ public SequenceFeature[] _rnasecstr = null;
+ /**
+ * position of annotation resulting in invalid WUSS parsing or -1
+ */
+ private long invalidrnastruc=-1;
+ /**
+ * Updates the _rnasecstr field Determines the positions that base pair and
+ * the positions of helices based on secondary structure from a Stockholm file
+ *
+ * @param RNAannot
+ */
+ private void _updateRnaSecStr(CharSequence RNAannot)
+ {
+ try {
+ _rnasecstr = Rna.GetBasePairs(RNAannot);
+ invalidrnastruc=-1;
+ }
+ catch (WUSSParseException px)
+ {
+ invalidrnastruc=px.getProblemPos();
+ }
+ if (invalidrnastruc>-1)
+ {
+ return;
+ }
+ Rna.HelixMap(_rnasecstr);
+ // setRNAStruc(RNAannot);
+
+ if (_rnasecstr != null && _rnasecstr.length > 0)
+ {
+ // show all the RNA secondary structure annotation symbols.
+ isrna=true;
+ showAllColLabels = true;
+ scaleColLabel = true;
+ }
+ // System.out.println("featuregroup " + _rnasecstr[0].getFeatureGroup());
+ }
public java.util.Hashtable sequenceMapping;
/** DOCUMENT ME!! */
*/
public boolean centreColLabels = false;
+ private boolean isrna;
+
/*
* (non-Javadoc)
*
validateRangeAndDisplay();
}
+ /**
+ * Checks if annotation labels represent secondary structures
+ *
+ */
void areLabelsSecondaryStructure()
{
boolean nonSSLabel = false;
+ isrna = false;
+ StringBuffer rnastring = new StringBuffer();
+
char firstChar = 0;
for (int i = 0; i < annotations.length; i++)
{
{
hasIcons |= true;
}
+ else
+ // Check for RNA secondary structure
+ {
+ if (annotations[i].secondaryStructure == 'S')
+ {
+ hasIcons |= true;
+ isrna |= true;
+ }
+ }
+
+ // System.out.println("displaychar " + annotations[i].displayCharacter);
- if (annotations[i].displayCharacter == null)
+ if (annotations[i].displayCharacter == null
+ || annotations[i].displayCharacter.length() == 0)
{
+ rnastring.append('.');
continue;
}
if (annotations[i].displayCharacter.length() == 1)
firstChar != ' '
&& firstChar != 'H'
&& firstChar != 'E'
+ && firstChar != 'S'
&& firstChar != '-'
&& firstChar < jalview.schemes.ResidueProperties.aaIndex.length)
{
}
}
}
+ else
+ {
+ rnastring.append(annotations[i].displayCharacter.charAt(1));
+ }
if (annotations[i].displayCharacter.length() > 0)
{
}
}
+ else
+ {
+ if (isrna)
+ {
+ _updateRnaSecStr(new AnnotCharSequence());
+ }
+ }
annotationId = this.hashCode() + "";
}
-
/**
+ * flyweight access to positions in the alignment annotation row for RNA processing
+ * @author jimp
+ *
+ */
+ private class AnnotCharSequence implements CharSequence
+ {
+ int offset=0;
+ int max=0;
+
+ public AnnotCharSequence() {
+ this(0,annotations.length);
+ }
+ public AnnotCharSequence(int start, int end) {
+ offset=start;
+ max=end;
+ }
+ @Override
+ public CharSequence subSequence(int start, int end)
+ {
+ return new AnnotCharSequence(offset+start, offset+end);
+ }
+
+ @Override
+ public int length()
+ {
+ return max-offset;
+ }
+
+ @Override
+ public char charAt(int index)
+ {
+ String dc;
+ return ((index+offset<0) || (index+offset)>=max || annotations[index+offset]==null || (dc=annotations[index+offset].displayCharacter.trim()).length()<1)
+ ? '.' : dc.charAt(0);
+ }
+ public String toString()
+ {
+ char[] string=new char[max-offset];
+ int mx=annotations.length;
+
+ for (int i=offset;i<mx;i++)
+ {
+ String dc;
+ string[i]=(annotations[i]==null || (dc=annotations[i].displayCharacter.trim()).length()<1 )? '.' : dc.charAt(0);
+ }
+ return new String(string);
+ }
+ };
+
+ private long _lastrnaannot=-1;
+ public String getRNAStruc(){
+ if (isrna)
+ {
+ String rnastruc = new AnnotCharSequence().toString();
+ if (_lastrnaannot!=rnastruc.hashCode())
+ {
+ // ensure rna structure contacts are up to date
+ _lastrnaannot=rnastruc.hashCode();
+ _updateRnaSecStr(rnastruc);
+ }
+ return rnastruc;
+ }
+ return null;
+ }
+
+/**
* Creates a new AlignmentAnnotation object.
*
* @param label
* checks graphMin and graphMax, secondary structure symbols, sets graphType
* appropriately, sets null labels to the empty string if appropriate.
*/
- private void validateRangeAndDisplay()
+ public void validateRangeAndDisplay()
{
if (annotations == null)
{
if (seqname && this.sequenceRef != null)
{
+ int i=description.toLowerCase().indexOf("<html>");
+ if (i>-1)
+ {
+ // move the html tag to before the sequence reference.
+ return "<html>"+sequenceRef.getName()+" : "+description.substring(i+6);
+ }
return sequenceRef.getName() + " : " + description;
}
return description;
}
+
+ public boolean isValidStruc()
+ {
+ return invalidrnastruc==-1;
+ }
+ public long getInvalidStrucPos()
+ {
+ return invalidrnastruc;
+ }
+
}