package org.seqcode.projects.seqview.paintable;
import java.awt.*;
import java.util.*;
import org.seqcode.data.seqdata.*;
import org.seqcode.genome.location.Region;
import org.seqcode.gseutils.*;
import org.seqcode.projects.seqview.model.SeqAnalysisModel;
import org.seqcode.viz.DynamicAttribute;
import org.seqcode.viz.colors.ColorSet;
public class SeqAnalysisPainter extends RegionPaintable {
private SeqAnalysis analysis;
private SeqAnalysisModel model;
private SeqAnalysisProperties props;
private DynamicAttribute attrib;
private NonOverlappingLayout<SeqAnalysisResult> layout;
private ColorSet cs;
public SeqAnalysisPainter(SeqAnalysis a, SeqAnalysisModel m) {
super();
analysis = a;
model = m;
model.addEventListener(this);
props = new SeqAnalysisProperties();
attrib = DynamicAttribute.getGlobalAttributes();
layout = new NonOverlappingLayout<SeqAnalysisResult>();
cs = new ColorSet();
initLabels();
}
public SeqAnalysisProperties getProperties() {return props;}
public int getMaxVertSpace() {
int numTracks = layout.getNumTracks();
return Math.min(Math.max(40,numTracks * 12),120);
}
public int getMinVertSpace() {
int numTracks = layout.getNumTracks();
return Math.min(Math.max(40,numTracks * 12),120);
}
public boolean canPaint() {
return model.isReady();
}
public void cleanup() {
super.cleanup();
model.removeEventListener(this);
}
public synchronized void eventRegistered(EventObject e) {
if (e.getSource() == model && model.isReady()) {
setCanPaint(true);
setWantsPaint(true);
notifyListeners();
}
}
public void paintItem(Graphics2D g,
int ulx, int uly,
int lrx, int lry) {
if (!canPaint()) {
return;
}
Collection<SeqAnalysisResult> results = model.getResults();
layout.setRegions(results);
int numTracks = layout.getNumTracks();
int w = lrx - ulx, h = lry - uly;
int trackHeight = numTracks > 0 ? Math.max(1, h / numTracks) : 1;
int spacing = Math.max(2, trackHeight/10);
Region region = model.getRegion();
int start = region.getStart(), end = region.getEnd();
cs.reset();
clearLabels();
for (SeqAnalysisResult r : results) {
int x1 = getXPos(r.getStart(),
region.getStart(),
region.getEnd(),
ulx, lrx);
int x2 = getXPos(r.getEnd(),
region.getStart(),
region.getEnd(),
ulx, lrx);
if (x2 == x1) {
x2 = x1 + 1;
}
int track = layout.getTrack(r);
int y1 = uly + trackHeight * track;
g.setColor(cs.getColor());
g.fillRect(x1,y1,x2-x1,trackHeight-spacing);
addLabel(x1,y1,x2-x1,trackHeight-spacing, String.format("%.1f/%.1f p=%.2f",
r.foregroundReadCount,
r.backgroundReadCount,
r.pvalue));
}
if (getProperties().DrawTrackLabel) {
g.setFont(attrib.getLargeLabelFont(w,h));
g.setColor(Color.BLACK);
g.drawString(getLabel(),ulx + g.getFont().getSize()*2,uly + g.getFont().getSize());
}
}
}