package org.seqcode.projects.seqview.paintable;
import java.awt.*;
import java.util.*;
import org.seqcode.genome.location.Region;
import org.seqcode.gseutils.*;
import org.seqcode.projects.seqview.model.RegionMapperModel;
public class CpGPainter extends RegionPaintable {
private RegionMapperModel<String> model;
private CpGProperties props;
public CpGPainter(RegionMapperModel<String> model) {
super();
this.model = model;
props = new CpGProperties();
model.addEventListener(this);
}
public void cleanup() {
super.cleanup();
model.removeEventListener(this);
}
public CpGProperties 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 int getMaxVertSpace() {
return 40;
}
public int getMinVertSpace() {
return 40;
}
public void paintItem(Graphics2D g,
int x1, int y1,
int x2, int y2) {
if (!canPaint()) {
return;
}
int w = x2 - x1;
double h = y2 - y1;
Region region = getRegion();
int regionstart = region.getStart(), regionend = region.getEnd();
int regionwidth = regionend - regionstart;
int pixwidth = props.PixWidth;
if (pixwidth < 1) {
pixwidth = 1;
}
String wholestring = model.getResults();
if (wholestring == null) {
return;
}
char[] chars = wholestring.toUpperCase().toCharArray();
g.setColor(Color.BLUE);
int pixHeights[] = new int[w / pixwidth];
double f = ((double)w ) / ((double)(regionwidth*pixwidth));
for (int i = 0; i < chars.length - 1; i++) {
int pix = (int)(i * f);
if (pix >= 0 && pix < pixHeights.length && chars[i] == 'C' && chars[i+1] == 'G') {
pixHeights[pix]++;
}
}
for (int i = 0; i < pixHeights.length; i++) {
double frac = ((double)pixHeights[i]) * f;
if (frac > 1) {
frac = 1;
}
int fill = (int) (h * frac);
g.fillRect(i*pixwidth,y1,pixwidth,fill);
}
if (props.DrawTrackLabel) {
g.setColor(Color.BLACK);
g.drawString(getLabel(),x1,y2);
}
}
}