From d300c87891d25a5542f47e1bc3cbb9a0b547bb24 Mon Sep 17 00:00:00 2001 From: James Procter Date: Wed, 22 Feb 2023 12:38:00 +0000 Subject: [PATCH] JAL-3858 JAL-2381 allow different linear shading schemes for selected/non-selected regions of contact matrix heat map --- .../renderer/AnnotationRendererFactory.java | 10 ++- src/jalview/renderer/ContactMapRenderer.java | 89 +++++++++++++++++--- 2 files changed, 85 insertions(+), 14 deletions(-) diff --git a/src/jalview/renderer/AnnotationRendererFactory.java b/src/jalview/renderer/AnnotationRendererFactory.java index 92ea677..db2eb7a 100644 --- a/src/jalview/renderer/AnnotationRendererFactory.java +++ b/src/jalview/renderer/AnnotationRendererFactory.java @@ -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; } diff --git a/src/jalview/renderer/ContactMapRenderer.java b/src/jalview/renderer/ContactMapRenderer.java index ca7b0c8..0a2278b 100644 --- a/src/jalview/renderer/ContactMapRenderer.java +++ b/src/jalview/renderer/ContactMapRenderer.java @@ -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); } } -- 1.7.10.2