4 package jalview.renderer;
7 import java.awt.Graphics;
9 import jalview.api.AlignViewportI;
10 import jalview.datamodel.AlignmentAnnotation;
11 import jalview.datamodel.Annotation;
12 import jalview.datamodel.ColumnSelection;
13 import jalview.datamodel.ContactListI;
14 import jalview.datamodel.ContactRange;
15 import jalview.datamodel.HiddenColumns;
16 import jalview.renderer.api.AnnotationRowRendererI;
22 public class ContactMapRenderer implements AnnotationRowRendererI
26 public void renderRow(Graphics g, int charWidth, int charHeight,
27 boolean hasHiddenColumns, AlignViewportI viewport,
28 HiddenColumns hiddenColumns, ColumnSelection columnSelection,
29 AlignmentAnnotation _aa, Annotation[] aa_annotations, int sRes,
30 int eRes, float min, float max, int y)
32 if (sRes > aa_annotations.length)
36 eRes = Math.min(eRes, aa_annotations.length);
40 g.setColor(Color.pink);
42 g.drawLine(x, y2, (eRes - sRes) * charWidth, y2);
45 int aaMax = aa_annotations.length - 1;
46 while (x < eRes - sRes)
51 column = hiddenColumns.visibleToAbsoluteColumn(column);
53 // // TODO: highlight columns selected
54 // boolean colsel = false;
55 // if (columnSelection != null)
57 // colsel = columnSelection.contains(column);
65 if (aa_annotations[column] == null)
70 if (_aa.sequenceRef != null)
72 // get the sequence position for the column
73 column = _aa.sequenceRef.findPosition(column) - 1;
75 ContactListI contacts = viewport.getContactList(_aa, column);
80 int contact_height = contacts.getContactHeight();
81 // fractional number of contacts covering each pixel
82 double contacts_per_pixel = ((double) contact_height)
83 / ((double) _aa.graphHeight);
87 if (contacts_per_pixel >= 1)
89 // many contacts rendered per pixel
94 // pixel height for each contact
95 pixels_step = (int) Math
96 .ceil(((double) _aa.graphHeight) / (double) contact_height);
102 eht = y2 - _aa.graphHeight; ht >= eht; ht -= pixels_step)
104 cstart = (int) Math.floor(((double) y2 - ht) * contacts_per_pixel);
105 cend = (int) Math.min(contact_height,
106 Math.ceil(cstart + contacts_per_pixel * pixels_step));
108 // TODO show maximum colour for range - sort of done
109 // also need a 'getMaxPosForRange(start,end)' to accurately render
110 Color col = getColorForRange(min, max, contacts, cstart, cend);
112 // TODO: show selected region
113 // if (colsel || columnSelection!=null &&
114 // columnSelection.intersects(cstart,cend))
116 // g.setColor(col.brighter());
124 g.fillRect(x * charWidth, ht, charWidth, 1 + pixels_step);
128 g.drawLine(x * charWidth, ht, (x + 1) * charWidth, ht);
136 Color minColor = Color.white, maxColor = Color.magenta;
138 Color shadeFor(float min, float max, float value)
140 return jalview.util.ColorUtils.getGraduatedColour(value, 0, minColor,
144 public Color getColorForRange(float min, float max, ContactListI cl,
147 ContactRange cr = cl.getRangeFor(i, j);
148 // average for moment - probably more interested in maxIntProj though
149 return shadeFor(min, max, (float) cr.getMean());