package org.seqcode.viz.metaprofile;
import java.awt.*;
import org.seqcode.viz.paintable.*;
/**
* ProfileLinePaintable
* @author tdanford
* Date: Aug 12, 2008
*/
public class ProfileLinePaintable extends AbstractPaintable{
private PaintableScale scale;
private BinningParameters params;
private Profile profile;
private Color col=Color.blue;
private boolean quantized=false;
private double[] quanta;
public ProfileLinePaintable(PaintableScale sc, Profile p) {
scale = sc;
profile = p;
params = profile.getBinningParameters();
}
public Profile getProfile() { return profile; }
public void setColor(Color c){col=c;}
public void setQuanta(double [] q){
if(q!=null){
quantized=true;
quanta=q;
}
}
public void paintItem(Graphics g, int x1, int y1, int x2, int y2) {
int w = x2-x1, h = y2-y1;
Graphics2D g2 = (Graphics2D)g;
int binPix = w / (params.getNumBins());
for(int i = 0; i < params.getNumBins(); i++) {
int x = x1 + i*binPix;
double value = profile.value(i);
double yf;
if(quantized){
yf=0;
for(int a=0; a<quanta.length; a++)
if(value>quanta[a])
yf=(double)a/((double)quanta.length-1);
}else{
yf = scale.fractionalOffset(value);
}
if(yf>0){
Color c = calcFracColor(col, yf);
g2.setColor(c);
g2.fillRect(x, y1, binPix, h);
}
}
}
private Color calcFracColor(Color col, double v){
Color c;
Color maxColor = col;
Color minColor = Color.white;
double sVal = v>1 ? 1 : (v<0 ? 0 : v);
int red = (int)(maxColor.getRed() * sVal + minColor.getRed() * (1 - sVal));
int green = (int)(maxColor.getGreen() * sVal + minColor.getGreen() * (1 - sVal));
int blue = (int)(maxColor.getBlue() *sVal + minColor.getBlue() * (1 - sVal));
c = new Color(red, green, blue, col.getAlpha());
return(c);
}
}