X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Frenderer%2FContactMapRenderer.java;h=04711458332fe89efcb67693caa501975f56af66;hb=eeed36339774143e579a97cdd8ba0763b020f3fd;hp=0a2278bdb70e22e3b68becd446a4fc64ee3940ce;hpb=d300c87891d25a5542f47e1bc3cbb9a0b547bb24;p=jalview.git diff --git a/src/jalview/renderer/ContactMapRenderer.java b/src/jalview/renderer/ContactMapRenderer.java index 0a2278b..0471145 100644 --- a/src/jalview/renderer/ContactMapRenderer.java +++ b/src/jalview/renderer/ContactMapRenderer.java @@ -12,6 +12,7 @@ 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; @@ -24,6 +25,7 @@ public abstract class ContactMapRenderer implements AnnotationRowRendererI { /** * bean holding colours for shading + * * @author jprocter * */ @@ -65,6 +67,7 @@ public abstract class ContactMapRenderer implements AnnotationRowRendererI /** * build an EBI-AlphaFold style renderer of PAE matrices + * * @return */ public static ContactMapRenderer newPAERenderer() @@ -99,21 +102,23 @@ public abstract class ContactMapRenderer implements AnnotationRowRendererI HiddenColumns hiddenColumns, ColumnSelection columnSelection, AlignmentAnnotation _aa, Annotation[] aa_annotations, int sRes, int eRes, float min, float max, int y) - { + { if (sRes > aa_annotations.length) { return; } eRes = Math.min(eRes, aa_annotations.length); - int x = 0, y2 = y; - - g.setColor(shade.no_data); - - g.drawLine(x, y2, (eRes - sRes) * charWidth, y2); + int x = 0, topY = y; + // uncomment below to render whole area of matrix as pink + // g.setColor(shade.no_data); + // g.fillRect(x, topY-_aa.height, (eRes - sRes) * charWidth, _aa.graphHeight); + + boolean showGroups = _aa.isShowGroupsForContactMatrix(); int column; int aaMax = aa_annotations.length - 1; + ContactMatrixI cm = viewport.getContactMatrix(_aa); while (x < eRes - sRes) { column = sRes + x; @@ -144,20 +149,28 @@ public abstract class ContactMapRenderer implements AnnotationRowRendererI x++; continue; } + // ContactListI from viewport can map column -> group + Color gpcol = (cm == null) ? Color.white + : contacts.getColourForGroup(); // 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 + // TODO: optionally pass visible column mask to the ContactGeometry object + // so it maps // only visible contacts to geometry // Bean holding mapping from contact list to pixels + // TODO: allow bracketing/limiting of range on contacts to render (like + // visible column mask but more flexible?) + + // COntactListI provides mapping for column -> cm-groupmapping final ContactGeometry cgeom = new ContactGeometry(contacts, _aa.graphHeight); - for (int ht = y2, eht = y2 - - _aa.graphHeight; ht >= eht; ht -= cgeom.pixels_step) + for (int ht = 0, botY = topY + - _aa.height; ht < _aa.graphHeight; ht += cgeom.pixels_step) { - ContactGeometry.contactInterval ci = cgeom.mapFor(y2 - ht, - y2 - ht + cgeom.pixels_step); + ContactGeometry.contactInterval ci = cgeom.mapFor(ht, + 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)); @@ -166,29 +179,8 @@ public abstract class ContactMapRenderer implements AnnotationRowRendererI boolean rowsel = false, containsHidden = false; if (columnSelection != null) { - 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); - } - - } + rowsel = cgeom.intersects(ci, columnSelection, hiddenColumns, + maskHiddenCols); } // TODO: show selected region if (colsel || rowsel) @@ -213,14 +205,23 @@ public abstract class ContactMapRenderer implements AnnotationRowRendererI { col = shade.hidden; } + if (showGroups && 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); + g.fillRect(x * charWidth, botY+ht, charWidth, 1 + cgeom.pixels_step); } else { - g.drawLine(x * charWidth, ht, (x + 1) * charWidth, ht); + g.drawLine(x * charWidth, botY+ht, (x + 1) * charWidth, botY+ht); } } x++; @@ -230,8 +231,8 @@ public abstract class ContactMapRenderer implements AnnotationRowRendererI Color shadeFor(float min, float max, float value) { - return jalview.util.ColorUtils.getGraduatedColour(value, 0, shade.minColor, - max, shade.maxColor); + return jalview.util.ColorUtils.getGraduatedColour(value, 0, + shade.minColor, max, shade.maxColor); } public Color getColorForRange(float min, float max, ContactListI cl,