X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Frenderer%2FContactMapRenderer.java;h=7a052da6e6d6e0d07d98de38e15d2905e3280277;hb=b4940c3adf6345861921c7abdf948e0a0c9beb61;hp=c0339cca7592f40b77a85fd22b041119ea5d7323;hpb=ccf89f08f1a38a60c87be23267e27ae07bb85d13;p=jalview.git diff --git a/src/jalview/renderer/ContactMapRenderer.java b/src/jalview/renderer/ContactMapRenderer.java index c0339cc..7a052da 100644 --- a/src/jalview/renderer/ContactMapRenderer.java +++ b/src/jalview/renderer/ContactMapRenderer.java @@ -8,6 +8,8 @@ import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.Annotation; import jalview.datamodel.ColumnSelection; import jalview.datamodel.ContactListI; +import jalview.datamodel.ContactRange; +import jalview.datamodel.HiddenColumns; import jalview.renderer.api.AnnotationRowRendererI; import java.awt.Color; @@ -22,7 +24,7 @@ public class ContactMapRenderer implements AnnotationRowRendererI @Override public void renderRow(Graphics g, int charWidth, int charHeight, - boolean hasHiddenColumns, AlignViewportI viewport, + boolean hasHiddenColumns, AlignViewportI viewport, HiddenColumns hiddenColumns, ColumnSelection columnSelection, AlignmentAnnotation _aa, Annotation[] aa_annotations, int sRes, int eRes, float min, float max, int y) @@ -46,8 +48,14 @@ public class ContactMapRenderer implements AnnotationRowRendererI column = sRes + x; if (hasHiddenColumns) { - column = columnSelection.adjustForHiddenColumns(column); + column = hiddenColumns.visibleToAbsoluteColumn(column); } + // // TODO: highlight columns selected + // boolean colsel = false; + // if (columnSelection != null) + // { + // colsel = columnSelection.contains(column); + // } if (column > aaMax) { @@ -59,33 +67,61 @@ public class ContactMapRenderer implements AnnotationRowRendererI x++; continue; } - /* - * {profile type, #values, total count, char1, pct1, char2, pct2...} - */ + if (_aa.sequenceRef != null) + { + // get the sequence position for the column + column = _aa.sequenceRef.findPosition(column) - 1; + } ContactListI contacts = viewport.getContactList(_aa, column); - if (contacts == null) { return; } + int contact_height = contacts.getContactHeight(); + // fractional number of contacts covering each pixel + double contacts_per_pixel = ((double) contact_height) + / ((double) _aa.graphHeight); + + int pixels_step; + + if (contacts_per_pixel >= 1) + { + // many contacts rendered per pixel + pixels_step = 1; + } + else + { + // pixel height for each contact + pixels_step = (int) Math + .ceil(((double) _aa.graphHeight) / (double) contact_height); + } - // cell height to render - double scale = (_aa.graphHeight < contacts.getContactHeight()) ? 1 - : (((double) _aa.graphHeight) / (double) contacts - .getContactHeight()); - // distance between contact map per cell - int step = (int) ((contacts.getContactHeight()) * scale / _aa.graphHeight); + int cstart = 0, cend; - // profl[1] is the number of values in the profile - for (int stp = 0, ht = y2, eht = y2 - _aa.graphHeight; ht > eht; ht -= scale, stp++) + for (int ht = y2, + eht = y2 - _aa.graphHeight; ht >= eht; ht -= pixels_step) { - g.setColor(contacts - .getColorForScore((int) (stp * step * ((double) _aa.graphHeight / (double) contacts - .getContactHeight())))); + cstart = (int) Math.floor(((double) y2 - ht) * contacts_per_pixel); + 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 = getColorForRange(min, max, contacts, cstart, cend); - if (scale > 1) + // TODO: show selected region + // if (colsel || columnSelection!=null && + // columnSelection.intersects(cstart,cend)) + // { + // g.setColor(col.brighter()); + // } + // else { - g.fillRect(x * charWidth, ht, charWidth, 1 + (int) scale); + g.setColor(col); + } + if (pixels_step > 1) + { + g.fillRect(x * charWidth, ht, charWidth, 1 + pixels_step); } else { @@ -96,4 +132,21 @@ public class ContactMapRenderer implements AnnotationRowRendererI } } + + Color minColor = Color.white, maxColor = Color.magenta; + + Color shadeFor(float min, float max, float value) + { + return jalview.util.ColorUtils.getGraduatedColour(value, 0, minColor, + max, maxColor); + } + + 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()); + } + }