X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Frenderer%2FContactMapRenderer.java;h=ca7b0c8ebc1bbcc9fa7bff2206fb2691e44d786b;hb=refs%2Fheads%2Ffeatures%2Fr2_11_2_alphafold%2FJAL-2349_JAL-3855;hp=bd59315ecfea52b24fa436d365b8987f08439b18;hpb=09cce494f72431183bd3c37e77913170a08c3ac3;p=jalview.git diff --git a/src/jalview/renderer/ContactMapRenderer.java b/src/jalview/renderer/ContactMapRenderer.java index bd59315..ca7b0c8 100644 --- a/src/jalview/renderer/ContactMapRenderer.java +++ b/src/jalview/renderer/ContactMapRenderer.java @@ -3,6 +3,10 @@ */ 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; @@ -12,9 +16,6 @@ import jalview.datamodel.ContactRange; import jalview.datamodel.HiddenColumns; import jalview.renderer.api.AnnotationRowRendererI; -import java.awt.Color; -import java.awt.Graphics; - /** * @author jprocter * @@ -24,10 +25,10 @@ public class ContactMapRenderer implements AnnotationRowRendererI @Override public void renderRow(Graphics g, int charWidth, int charHeight, - boolean hasHiddenColumns, AlignViewportI viewport, HiddenColumns hiddenColumns, - ColumnSelection columnSelection, AlignmentAnnotation _aa, - Annotation[] aa_annotations, int sRes, int eRes, float min, - float max, int y) + boolean hasHiddenColumns, AlignViewportI viewport, + HiddenColumns hiddenColumns, ColumnSelection columnSelection, + AlignmentAnnotation _aa, Annotation[] aa_annotations, int sRes, + int eRes, float min, float max, int y) { if (sRes > aa_annotations.length) { @@ -48,7 +49,13 @@ public class ContactMapRenderer implements AnnotationRowRendererI column = sRes + x; if (hasHiddenColumns) { - column = hiddenColumns.adjustForHiddenColumns(column); + column = hiddenColumns.visibleToAbsoluteColumn(column); + } + // TODO: highlight columns selected + boolean colsel = false; + if (columnSelection != null) + { + colsel = columnSelection.contains(column); } if (column > aaMax) @@ -61,34 +68,85 @@ public class ContactMapRenderer implements AnnotationRowRendererI x++; continue; } - /* - * {profile type, #values, total count, char1, pct1, char2, pct2...} - */ ContactListI contacts = viewport.getContactList(_aa, column); - min = _aa.graphMin; - max = _aa.graphMax; if (contacts == null) { - return; + x++; + continue; } - - // cell height to render - double scale = (_aa.graphHeight < contacts.getContactHeight()) ? 1 - : (((double) _aa.graphHeight) / (double) contacts - .getContactHeight()); - int cstart, cend = -1; - for (int ht = y2, eht = y2 - _aa.graphHeight; ht >= eht; ht -= scale) + // 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); + + for (int ht = y2, eht = y2 + - _aa.graphHeight; ht >= eht; ht -= cgeom.pixels_step) { - cstart = cend + 1; - cend = -1 - + (contacts.getContactHeight() * (ht - eht) / _aa.graphHeight); - // TODO show maximum colour for range - sort of done - // also need a 'getMaxPosForRange(start,end)' - g.setColor(getColorForRange(contacts, cstart, cend)); - - if (scale > 1) + ContactGeometry.contactInterval ci = cgeom.mapFor(y2 - ht, + y2 - ht + cgeom.pixels_step); + // cstart = (int) Math.floor(((double) y2 - ht) * contacts_per_pixel); + // cend = (int) Math.min(contact_height, + // Math.ceil(cstart + contacts_per_pixel * pixels_step)); + + Color col; + boolean rowsel = false, containsHidden = false; + if (columnSelection != null) { - g.fillRect(x * charWidth, ht, charWidth, 1 + (int) scale); + if (_aa.sequenceRef == null) + { + rowsel = columnSelection.intersects(ci.cStart, ci.cEnd); + } + else + { + // TODO check we have correctly mapped cstart to local sequence + // 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 + if (colsel || rowsel) + { + + col = getSelectedColorForRange(min, max, contacts, ci.cStart, + ci.cEnd); + if (colsel && rowsel) + { + col = new Color(col.getBlue(), col.getGreen(), col.getRed()); + } + else + { + col = new Color(col.getBlue(), col.getBlue(), col.getBlue()); + } + } + else + { + col = getColorForRange(min, max, contacts, ci.cStart, ci.cEnd); + } + if (containsHidden) + { + col = Color.red; + } + g.setColor(col); + if (cgeom.pixels_step > 1) + { + g.fillRect(x * charWidth, ht, charWidth, 1 + cgeom.pixels_step); } else { @@ -100,21 +158,34 @@ public class ContactMapRenderer implements AnnotationRowRendererI } - Color minColor = Color.white, maxColor = Color.magenta; + // 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); - float min, max; - - Color shadeFor(float value) + Color shadeFor(float min, float max, float value) { return jalview.util.ColorUtils.getGraduatedColour(value, 0, minColor, max, maxColor); } - public Color getColorForRange(ContactListI cl, int i, int j) + public Color getColorForRange(float min, float max, ContactListI cl, + int i, int j) + { + ContactRange cr = cl.getRangeFor(i, j); + // average for moment - probably more interested in maxIntProj though + return shadeFor(min, max, (float) cr.getMean()); + } + + public Color getSelectedColorForRange(float min, float max, + ContactListI cl, int i, int j) { ContactRange cr = cl.getRangeFor(i, j); // average for moment - probably more interested in maxIntProj though - return shadeFor((float) cr.getMean()); + return jalview.util.ColorUtils.getGraduatedColour((float) cr.getMean(), + 0, selMinColor, max, selMaxColor); } }