JAL-1551 formatting
[jalview.git] / src / jalview / datamodel / AlignmentAnnotation.java
index f84b18d..d85c3d8 100755 (executable)
  */
 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,8 @@ public class AlignmentAnnotation
       scaleColLabel = true;
       _markRnaHelices();
     }
-    // System.out.println("featuregroup " + _rnasecstr[0].getFeatureGroup());
+    // jalview.bin.Console.outPrintln("featuregroup " +
+    // _rnasecstr[0].getFeatureGroup());
 
   }
 
@@ -137,10 +157,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 +184,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<Integer, Annotation> sequenceMapping;
@@ -221,6 +307,14 @@ 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,7 +388,7 @@ public class AlignmentAnnotation
     char firstChar = 0;
     for (int i = 0; i < annotations.length; i++)
     {
-      // DEBUG System.out.println(i + ": " + annotations[i]);
+      // DEBUG jalview.bin.Console.outPrintln(i + ": " + annotations[i]);
       if (annotations[i] == null)
       {
         continue;
@@ -302,30 +396,35 @@ public class AlignmentAnnotation
       if (annotations[i].secondaryStructure == 'H'
               || annotations[i].secondaryStructure == 'E')
       {
-        // DEBUG System.out.println( "/H|E/ '" +
+        // DEBUG jalview.bin.Console.outPrintln( "/H|E/ '" +
         // annotations[i].secondaryStructure + "'");
         hasIcons |= true;
       }
       else
       // Check for RNA secondary structure
       {
-        // DEBUG System.out.println( "/else/ '" +
+        // 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'
@@ -335,12 +434,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')
         {
@@ -349,7 +448,8 @@ 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)
@@ -734,6 +834,7 @@ public class AlignmentAnnotation
       {
         this.sequenceMapping = null;
       }
+
     }
     // TODO: check if we need to do this: JAL-952
     // if (this.isrna=annotation.isrna)
@@ -930,7 +1031,7 @@ public class AlignmentAnnotation
           seqPos = i + startRes;
         }
 
-        sequenceMapping.put(new Integer(seqPos), annotations[i]);
+        sequenceMapping.put(Integer.valueOf(seqPos), annotations[i]);
       }
     }
 
@@ -969,7 +1070,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)
         {
@@ -1164,7 +1265,7 @@ public class AlignmentAnnotation
   {
     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.
@@ -1652,4 +1753,30 @@ public class AlignmentAnnotation
     }
     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");
+  }
+
 }