package org.seqcode.projects.seqview.paintable; import java.awt.*; import java.util.*; import org.seqcode.genome.location.Region; import org.seqcode.genome.location.ScoredStrandedRegion; import org.seqcode.gsebricks.verbs.Expander; import org.seqcode.gseutils.*; import org.seqcode.projects.seqview.model.RegionExpanderModel; import org.seqcode.viz.DynamicAttribute; public class MotifScanPainter extends RegionPaintable { private RegionExpanderModel<ScoredStrandedRegion> model; private MotifScanProperties props; public MotifScanPainter (RegionExpanderModel<ScoredStrandedRegion> model) { super(); this.model = model; props = new MotifScanProperties(); model.addEventListener(this); } public MotifScanProperties getProperties() {return props;} public void removeEventListener(Listener<EventObject> l) { super.removeEventListener(l); if (!hasListeners()) { model.removeEventListener(this); } } public synchronized void eventRegistered(EventObject e) { if (e.getSource() == model && model.isReady()) { setCanPaint(true); setWantsPaint(true); notifyListeners(); } } public void cleanup() { super.cleanup(); model.removeEventListener(this); } public int getMaxVertSpace() {return 25;} public int getMinVertSpace() {return 25;} public void paintItem(Graphics2D g, int ulx, int uly, int lrx, int lry) { if (!canPaint()) { return; } int height = Math.abs(lry - uly); int half = height / 2; int center = uly + half; int minPixelWidth = props.MinPixelWidth; g.setColor(Color.BLACK); g.drawLine(ulx,center,lrx,center); g.setColor(new Color(107,66,38)); // brown. don't use red because that's not a match in the per-base scanner double heightmult = props.HeightMultiplier; Iterator<ScoredStrandedRegion> iter = model.getResults(); while (iter.hasNext()) { ScoredStrandedRegion r = iter.next(); int x1 = getXPos(r.getStart(), model.getRegion().getStart(), model.getRegion().getEnd(), ulx,lrx); int x2 = getXPos(r.getEnd(), model.getRegion().getStart(), model.getRegion().getEnd(), ulx,lrx); if (x2 - x1 < minPixelWidth) { int missing = minPixelWidth - (x2 - x1); int h = (missing +1) /2; x2 += h; x1 -= h; } int h = (int)(r.getScore() * heightmult); if (h > half) { h = half; } if (r.getStrand() == '+') { g.fillRect(x1,center-h,x2-x1,h); } else { g.fillRect(x1,center,x2-x1,h); } } if (props.DrawTrackLabel) { g.setColor(Color.BLACK); Font oldFont = g.getFont(); DynamicAttribute attrib = DynamicAttribute.getGlobalAttributes(); Font nf = attrib.getLargeLabelFont(lrx - ulx,lry - uly); g.setFont(nf); g.drawString(getLabel(),ulx,lry); g.setFont(oldFont); } } }