X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Frenderer%2FContactMapRenderer.java;h=cbc4af93dd25768be4bf548dcfd27da445411b43;hb=4b7d3640209c4434d569c746672cf9eed4250ace;hp=58e6ab15002d8bce407c61a9677e4304b2f1d2d0;hpb=c6b983048da1ba01c4edf75349de2d410b45356d;p=jalview.git diff --git a/src/jalview/renderer/ContactMapRenderer.java b/src/jalview/renderer/ContactMapRenderer.java index 58e6ab1..cbc4af9 100644 --- a/src/jalview/renderer/ContactMapRenderer.java +++ b/src/jalview/renderer/ContactMapRenderer.java @@ -5,12 +5,14 @@ package jalview.renderer; import java.awt.Color; import java.awt.Graphics; +import java.util.Iterator; import jalview.api.AlignViewportI; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.Annotation; import jalview.datamodel.ColumnSelection; import jalview.datamodel.ContactListI; +import jalview.datamodel.ContactMatrixI; import jalview.datamodel.ContactRange; import jalview.datamodel.HiddenColumns; import jalview.renderer.api.AnnotationRowRendererI; @@ -19,8 +21,82 @@ 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, @@ -37,12 +113,13 @@ 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); int column; int aaMax = aa_annotations.length - 1; + ContactMatrixI cm = viewport.getContactMatrix(_aa); while (x < eRes - sRes) { column = sRes + x; @@ -73,6 +150,13 @@ public class ContactMapRenderer implements AnnotationRowRendererI x++; continue; } + Color gpcol = (cm == null) ? Color.white + : cm.getColourForGroup(cm.getGroupsFor(column)); + // feature still in development - highlight or omit regions hidden in + // the alignment - currently marks them as red rows + boolean maskHiddenCols = false; + // TODO: pass visible column mask to the ContactGeometry object so it maps + // only visible contacts to geometry // Bean holding mapping from contact list to pixels final ContactGeometry cgeom = new ContactGeometry(contacts, _aa.graphHeight); @@ -86,10 +170,8 @@ public class ContactMapRenderer implements AnnotationRowRendererI // cend = (int) Math.min(contact_height, // Math.ceil(cstart + contacts_per_pixel * pixels_step)); - // TODO show maximum colour for range - sort of done - // also need a 'getMaxPosForRange(start,end)' to accurately render Color col; - boolean rowsel = false; + boolean rowsel = false, containsHidden = false; if (columnSelection != null) { if (_aa.sequenceRef == null) @@ -102,10 +184,18 @@ public class ContactMapRenderer implements AnnotationRowRendererI // numbering int s = _aa.sequenceRef.findIndex(ci.cStart); int e = _aa.sequenceRef.findIndex(ci.cEnd); + if (maskHiddenCols && hasHiddenColumns) + { + // TODO: turn into function and create test !! + Iterator viscont = hiddenColumns + .getVisContigsIterator(s, e, false); + containsHidden = !viscont.hasNext(); + } if (s > 0 && s < _aa.sequenceRef.getLength()) { rowsel = columnSelection.intersects(s, e); } + } } // TODO: show selected region @@ -122,13 +212,26 @@ public class ContactMapRenderer implements AnnotationRowRendererI { col = new Color(col.getBlue(), col.getBlue(), col.getBlue()); } - g.setColor(col); } else { col = getColorForRange(min, max, contacts, ci.cStart, ci.cEnd); - g.setColor(col); } + if (containsHidden) + { + col = shade.hidden; + } + if (gpcol != null && gpcol != Color.white) + { + // todo - could overlay group as a transparent rectangle ? + col = new Color( + (int) (((float) (col.getRed() + gpcol.getRed())) / 2f), + (int) (((float) (col.getGreen() + gpcol.getGreen())) + / 2f), + (int) (((float) (col.getBlue() + gpcol.getBlue())) / 2f)); + } + g.setColor(col); + if (cgeom.pixels_step > 1) { g.fillRect(x * charWidth, ht, charWidth, 1 + cgeom.pixels_step); @@ -143,17 +246,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, @@ -170,7 +266,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); } }