JAL-3858 JAL-2381 allow different linear shading schemes for selected/non-selected...
authorJames Procter <j.procter@dundee.ac.uk>
Wed, 22 Feb 2023 12:38:00 +0000 (12:38 +0000)
committerJames Procter <j.procter@dundee.ac.uk>
Wed, 22 Feb 2023 12:38:00 +0000 (12:38 +0000)
src/jalview/renderer/AnnotationRendererFactory.java
src/jalview/renderer/ContactMapRenderer.java

index 92ea677..db2eb7a 100644 (file)
@@ -3,6 +3,7 @@ package jalview.renderer;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.renderer.api.AnnotationRendererFactoryI;
 import jalview.renderer.api.AnnotationRowRendererI;
+import jalview.ws.datamodel.alphafold.PAEContactMatrix;
 
 import java.util.IdentityHashMap;
 
@@ -33,7 +34,14 @@ public class AnnotationRendererFactory implements
   {
     if (row.graph == AlignmentAnnotation.CONTACT_MAP)
     {
-      return new ContactMapRenderer();
+      // TODO consider configuring renderer/etc according to the type of matrix
+      // bound to the annotation row - needs to be looked up in that case
+      if (PAEContactMatrix.PAEMATRIX.equals(row.getCalcId()))
+      {
+        return ContactMapRenderer.newPAERenderer();
+      }
+      // TODO add potential for configuring renderer directly from the annotation row and/or viewmodel
+      
     }
     return null;
   }
index ca7b0c8..0a2278b 100644 (file)
@@ -20,8 +20,78 @@ import jalview.renderer.api.AnnotationRowRendererI;
  * @author jprocter
  *
  */
-public class ContactMapRenderer implements AnnotationRowRendererI
+public abstract class ContactMapRenderer implements AnnotationRowRendererI
 {
+  /**
+   * bean holding colours for shading
+   * @author jprocter
+   *
+   */
+  public class Shading
+  {
+    /**
+     * shown when no data available from map
+     */
+    Color no_data;
+    /**
+     * shown for region not currently visible - should normally not see this
+     */
+    Color hidden;
+    /**
+     * linear shading scheme min/max
+     */
+    Color maxColor, minColor;
+
+    /**
+     * linear shading scheme min/max for selected region
+     */
+    Color selMinColor, selMaxColor;
+
+    public Shading(Color no_data, Color hidden, Color maxColor,
+            Color minColor, Color selMinColor, Color selMaxColor)
+    {
+      super();
+      this.no_data = no_data;
+      this.hidden = hidden;
+      this.maxColor = maxColor;
+      this.minColor = minColor;
+      this.selMinColor = selMinColor;
+      this.selMaxColor = selMaxColor;
+    }
+
+  }
+
+  final Shading shade;
+
+  /**
+   * build an EBI-AlphaFold style renderer of PAE matrices
+   * @return
+   */
+  public static ContactMapRenderer newPAERenderer()
+  {
+    return new ContactMapRenderer()
+    {
+      @Override
+      public Shading getShade()
+      {
+        return new Shading(Color.pink, Color.red,
+
+                new Color(246, 252, 243), new Color(0, 60, 26),
+                new Color(26, 0, 60), new Color(243, 246, 252));
+      }
+    };
+  }
+
+  /**
+   * 
+   * @return instance of Shading used to initialise the renderer
+   */
+  public abstract Shading getShade();
+
+  public ContactMapRenderer()
+  {
+    this.shade = getShade();
+  }
 
   @Override
   public void renderRow(Graphics g, int charWidth, int charHeight,
@@ -38,7 +108,7 @@ public class ContactMapRenderer implements AnnotationRowRendererI
 
     int x = 0, y2 = y;
 
-    g.setColor(Color.pink);
+    g.setColor(shade.no_data);
 
     g.drawLine(x, y2, (eRes - sRes) * charWidth, y2);
 
@@ -141,7 +211,7 @@ public class ContactMapRenderer implements AnnotationRowRendererI
         }
         if (containsHidden)
         {
-          col = Color.red;
+          col = shade.hidden;
         }
         g.setColor(col);
         if (cgeom.pixels_step > 1)
@@ -158,17 +228,10 @@ public class ContactMapRenderer implements AnnotationRowRendererI
 
   }
 
-  // Shading parameters
-  // currently hardwired for alphafold
-  Color maxColor = new Color(246, 252, 243),
-          minColor = new Color(0, 60, 26),
-          selMinColor = new Color(26, 0, 60),
-          selMaxColor = new Color(243, 246, 252);
-
   Color shadeFor(float min, float max, float value)
   {
-    return jalview.util.ColorUtils.getGraduatedColour(value, 0, minColor,
-            max, maxColor);
+    return jalview.util.ColorUtils.getGraduatedColour(value, 0, shade.minColor,
+            max, shade.maxColor);
   }
 
   public Color getColorForRange(float min, float max, ContactListI cl,
@@ -185,7 +248,7 @@ public class ContactMapRenderer implements AnnotationRowRendererI
     ContactRange cr = cl.getRangeFor(i, j);
     // average for moment - probably more interested in maxIntProj though
     return jalview.util.ColorUtils.getGraduatedColour((float) cr.getMean(),
-            0, selMinColor, max, selMaxColor);
+            0, shade.selMinColor, max, shade.selMaxColor);
   }
 
 }