JAL-1807
[jalview.git] / src / jalview / schemes / AnnotationColourGradient.java
index 1a4d7d7..e65d5f5 100755 (executable)
@@ -1,6 +1,6 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
- * Copyright (C) 2014 The Jalview Authors
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
  * 
  * This file is part of Jalview.
  * 
@@ -27,6 +27,8 @@ import jalview.datamodel.Annotation;
 import jalview.datamodel.GraphLine;
 import jalview.datamodel.SequenceCollectionI;
 import jalview.datamodel.SequenceI;
+import jalview.renderer.AnnotationRenderer;
+import jalview.util.Comparison;
 
 import java.awt.Color;
 import java.util.IdentityHashMap;
@@ -53,7 +55,6 @@ public class AnnotationColourGradient extends FollowerColourScheme
   private boolean predefinedColours = false;
 
   private boolean seqAssociated = false;
-
   /**
    * false if the scheme was constructed without a minColour and maxColour used
    * to decide if existing colours should be taken from annotation elements when
@@ -141,6 +142,12 @@ public class AnnotationColourGradient extends FollowerColourScheme
     bb = maxColour.getBlue() - b1;
 
     noGradient = false;
+    aamax = annotation.graphMax;
+    aamin = annotation.graphMin;
+    if (annotation.isRNA())
+    {
+      ColourSchemeProperty.initRnaHelicesShading(1 + (int) aamax);
+    }
   }
 
   @Override
@@ -162,6 +169,7 @@ public class AnnotationColourGradient extends FollowerColourScheme
       // resolve the context containing all the annotation for the sequence
       AnnotatedCollectionI alcontext = alignment instanceof AlignmentI ? alignment
               : alignment.getContext();
+      boolean f = true,rna=false;
       for (AlignmentAnnotation alan : alcontext.findAnnotation(annotation
               .getCalcId()))
       {
@@ -169,12 +177,30 @@ public class AnnotationColourGradient extends FollowerColourScheme
                 && (alan.label != null && annotation != null && alan.label
                         .equals(annotation.label)))
         {
+          if (!rna && alan.isRNA())
+          {
+            rna = true;
+          }
           seqannot.put(alan.sequenceRef, alan);
+          if (f || alan.graphMax > aamax)
+          {
+            aamax = alan.graphMax;
+          }
+          if (f || alan.graphMin < aamin)
+          {
+            aamin = alan.graphMin;
+          }
+          f = false;
         }
       }
+      if (rna)
+      {
+        ColourSchemeProperty.initRnaHelicesShading(1 + (int) aamax);
+      }
     }
   }
 
+  float aamin = 0f, aamax = 0f;
   public String getAnnotation()
   {
     return annotation.label;
@@ -220,131 +246,122 @@ public class AnnotationColourGradient extends FollowerColourScheme
     return Color.red;
   }
 
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param n
-   *          DOCUMENT ME!
-   * @param j
-   *          DOCUMENT ME!
-   * 
-   * @return DOCUMENT ME!
-   */
-  @Override
-  public Color findColour(char c, int j, SequenceI seq)
+       /**
+        * DOCUMENT ME!
+        * 
+        * @param n
+        *          DOCUMENT ME!
+        * @param j
+        *          DOCUMENT ME!
+        * 
+        * @return DOCUMENT ME!
+        */
+       @Override
+       public Color findColour(char c, int j, SequenceI seq) {
+               Color currentColour = Color.white;
+               AlignmentAnnotation annotation = (seqAssociated && seqannot != null ? seqannot
+                               .get(seq) : this.annotation);
+               if (annotation == null) {
+                       return currentColour;
+               }
+               if ((threshold == 0) || aboveThreshold(c, j)) {
+                       if (annotation.annotations != null && j < annotation.annotations.length
+                                       && annotation.annotations[j] != null && !Comparison.isGap(c)) {
+                               Annotation aj = annotation.annotations[j];
+                               // 'use original colours' => colourScheme != null
+                               // -> look up colour to be used
+                               // predefined colours => preconfigured shading
+                               // -> only use original colours reference if thresholding enabled &
+                               // minmax exists
+                               // annotation.hasIcons => null or black colours replaced with glyph
+                               // colours
+                               // -> reuse original colours if present
+                               // -> if thresholding enabled then return colour on non-whitespace glyph
+
+                               if (aboveAnnotationThreshold == NO_THRESHOLD
+                                               || (annotationThreshold != null && (aboveAnnotationThreshold == ABOVE_THRESHOLD ? aj.value >= annotationThreshold.value
+                                                               : aj.value <= annotationThreshold.value))) {
+                                       if (predefinedColours && aj.colour != null
+                                                       && !aj.colour.equals(Color.black)) {
+                                               currentColour = aj.colour;
+                                       } else if (annotation.hasIcons
+                                                       && annotation.graph == AlignmentAnnotation.NO_GRAPH) {
+                                               if (aj.secondaryStructure > ' ' && aj.secondaryStructure != '.'
+                                                               && aj.secondaryStructure != '-') {
+                                                       if (colourScheme != null) {
+                                                               currentColour = colourScheme.findColour(c, j, seq);
+                                                       } else {
+                                                               if (annotation.isRNA()) {
+                                                                       currentColour = ColourSchemeProperty.rnaHelices[(int) aj.value];
+                                                               } else {
+                                                                       currentColour = annotation.annotations[j].secondaryStructure == 'H' ? AnnotationRenderer.HELIX_COLOUR
+                                                                                       : annotation.annotations[j].secondaryStructure == 'E' ? AnnotationRenderer.SHEET_COLOUR
+                                                                                                       : AnnotationRenderer.STEM_COLOUR;
+                                                               }
+                                                       }
+                                               } else {
+                                                       //
+                                                       return Color.white;
+                                               }
+                                       } else if (noGradient) {
+                                               if (colourScheme != null) {
+                                                       currentColour = colourScheme.findColour(c, j, seq);
+                                               } else {
+                                                       if (aj.colour != null) {
+                                                               currentColour = aj.colour;
+                                                       }
+                                               }
+                                       } else {
+                                               currentColour = shadeCalculation(annotation, j);
+                                       }
+                               }
+                               if (conservationColouring) {
+                                       currentColour = applyConservation(currentColour, j);
+                               }
+                       }
+               }
+               return currentColour;
+       }
+
+  private Color shadeCalculation(AlignmentAnnotation annotation, int j)
   {
-    Color currentColour = Color.white;
-    AlignmentAnnotation annotation = (seqAssociated && seqannot!=null ? seqannot.get(seq)
-            : this.annotation);
-    if (annotation == null)
+
+    // calculate a shade
+    float range = 1f;
+    if (thresholdIsMinMax
+            && annotation.threshold != null
+            && aboveAnnotationThreshold == ABOVE_THRESHOLD
+            && annotation.annotations[j].value >= annotation.threshold.value)
     {
-      return currentColour;
+      range = (annotation.annotations[j].value - annotation.threshold.value)
+              / (annotation.graphMax - annotation.threshold.value);
     }
-    if ((threshold == 0) || aboveThreshold(c, j))
+    else if (thresholdIsMinMax && annotation.threshold != null
+            && aboveAnnotationThreshold == BELOW_THRESHOLD
+            && annotation.annotations[j].value >= annotation.graphMin)
     {
-      if (annotation.annotations != null
-              && j < annotation.annotations.length
-              && annotation.annotations[j] != null
-              && !jalview.util.Comparison.isGap(c))
+      range = (annotation.annotations[j].value - annotation.graphMin)
+              / (annotation.threshold.value - annotation.graphMin);
+    }
+    else
+    {
+      if (annotation.graphMax != annotation.graphMin)
       {
-        Annotation aj = annotation.annotations[j];
-        // 'use original colours' => colourScheme != null
-        // -> look up colour to be used
-        // predefined colours => preconfigured shading
-        // -> only use original colours reference if thresholding enabled &
-        // minmax exists
-        // annotation.hasIcons => null or black colours replaced with glyph
-        // colours
-        // -> reuse original colours if present
-        // -> if thresholding enabled then return colour on non-whitespace glyph
-
-        if (aboveAnnotationThreshold == NO_THRESHOLD
-                || (annotationThreshold != null && (aboveAnnotationThreshold == ABOVE_THRESHOLD ? aj.value >= annotationThreshold.value
-                        : aj.value <= annotationThreshold.value)))
-        {
-          if (predefinedColours && aj.colour != null)
-          {
-            currentColour = aj.colour;
-          }
-          else if (annotation.hasIcons
-                  && annotation.graph == AlignmentAnnotation.NO_GRAPH)
-          {
-            if (aj.secondaryStructure > ' ' && aj.secondaryStructure != '.'
-                    && aj.secondaryStructure != '-')
-            {
-              if (colourScheme != null)
-              {
-                currentColour = colourScheme.findColour(c, j, seq);
-              }
-              else
-              {
-              currentColour = annotation.annotations[j].secondaryStructure == 'H' ? jalview.renderer.AnnotationRenderer.HELIX_COLOUR
-                      : annotation.annotations[j].secondaryStructure == 'E' ? jalview.renderer.AnnotationRenderer.SHEET_COLOUR
-                              : jalview.renderer.AnnotationRenderer.STEM_COLOUR;
-              }
-            }
-            else
-            {
-              //
-              return Color.white;
-            }
-          }
-          else if (noGradient)
-          {
-            if (colourScheme != null)
-            {
-              currentColour = colourScheme.findColour(c, j, seq);
-            }
-            else
-            {
-              if (aj.colour != null)
-              {
-                currentColour = aj.colour;
-              }
-            }
-          }
-          else
-          {
-            // calculate a shade
-            float range = 1f;
-            if (thresholdIsMinMax
-                    && annotation.threshold != null
-                    && aboveAnnotationThreshold == ABOVE_THRESHOLD
-                    && annotation.annotations[j].value >= annotation.threshold.value)
-            {
-              range = (annotation.annotations[j].value - annotation.threshold.value)
-                      / (annotation.graphMax - annotation.threshold.value);
-            }
-            else if (thresholdIsMinMax
-                    && annotation.threshold != null
-                    && aboveAnnotationThreshold == BELOW_THRESHOLD
-                    && annotation.annotations[j].value >= annotation.graphMin)
-            {
-              range = (annotation.annotations[j].value - annotation.graphMin)
-                      / (annotation.threshold.value - annotation.graphMin);
-            }
-            else
-            {
-              range = (annotation.annotations[j].value - annotation.graphMin)
-                      / (annotation.graphMax - annotation.graphMin);
-            }
-
-            int dr = (int) (rr * range + r1), dg = (int) (gg * range + g1), db = (int) (bb
-                    * range + b1);
-
-            currentColour = new Color(dr, dg, db);
-
-          }
-        }
-        if (conservationColouring)
-        {
-          currentColour = applyConservation(currentColour, j);
-        }
+        range = (annotation.annotations[j].value - annotation.graphMin)
+                / (annotation.graphMax - annotation.graphMin);
+      }
+      else
+      {
+        range = 0f;
       }
     }
-    return currentColour;
-  }
 
+    int dr = (int) (rr * range + r1), dg = (int) (gg * range + g1), db = (int) (bb
+            * range + b1);
+
+    return new Color(dr, dg, db);
+
+  }
   public boolean isPredefinedColours()
   {
     return predefinedColours;