/* * Created on Aug 16, 2007 * * TODO * * To change the template for this generated file go to * Window - Preferences - Java - Code Style - Code Templates */ package org.seqcode.viz.charting; import java.util.HashMap; import java.util.Map; import java.util.Vector; import java.util.logging.Level; import java.util.logging.Logger; import org.jfree.data.DomainOrder; import org.jfree.data.general.DatasetChangeListener; import org.jfree.data.general.DatasetGroup; import org.jfree.data.xy.IntervalXYDataset; public class HistogramDataset implements IntervalXYDataset { private static Logger logger = Logger.getLogger("org.seqcode.viz.charting.HistogramDataset"); private double min, max; private double binWidth; private int bins; private Vector<String> seriesNames; private double[] xstarts, xends; private Map<String,int[]> counts; private Map<String,Integer> seriesCounts; public HistogramDataset(double min, double max, int bins) { this.min = min; this.max = max; this.bins = bins; binWidth = (max-min)/(double)bins; seriesNames = new Vector<String>(); xstarts = new double[bins]; xends = new double[bins]; counts = new HashMap<String,int[]>(); seriesCounts = new HashMap<String,Integer>(); double bstart = min, bend = bstart + binWidth; for(int i = 0; i < bins; i++, bstart += binWidth, bend += binWidth) { xstarts[i] = bstart; xends[i] = bend; } } public int addSeries(String name) { if(seriesNames.contains(name)) { throw new IllegalArgumentException(name); } seriesNames.add(name); seriesCounts.put(name, 0); int[] array = new int[bins]; for(int i = 0; i < bins; i++) { array[i] = 0; } counts.put(name, array); return seriesNames.size()-1; } public void addValue(int series, double value) { int bin = findBin(value); String seriesName = seriesNames.get(series); counts.get(seriesName)[bin] += 1; seriesCounts.put(seriesName, seriesCounts.get(seriesName) + 1); } private int findBin(double val) { if(val < min || val > max) { return -1; } int bin = (int)Math.floor((val-min) / binWidth); return Math.min(bin, bins-1); } public Number getEndX(int s, int i) { return xends[i]; } public double getEndXValue(int s, int i) { return xends[i]; } public Number getEndY(int s, int i) { return counts.get(seriesNames.get(s))[i]; } public double getEndYValue(int s, int i) { return counts.get(seriesNames.get(s))[i]; } public Number getStartX(int s, int i) { return xstarts[i]; } public double getStartXValue(int s, int i) { return xstarts[i]; } public Number getStartY(int s, int i) { return 0.0; } public double getStartYValue(int arg0, int arg1) { return 0.0; } public DomainOrder getDomainOrder() { return DomainOrder.NONE; } public int getItemCount(int s) { return bins; } public Number getX(int s, int i) { return (xstarts[i] + xends[i])/2.0; } public double getXValue(int s, int i) { return (xstarts[i] + xends[i]) / 2.0; } public Number getY(int s, int i) { return getEndY(s, i); } public double getYValue(int s, int i) { return getEndYValue(s, i); } public int getSeriesCount() { return seriesNames.size(); } public Comparable getSeriesKey(int s) { return seriesNames.get(s); } public int indexOf(Comparable s) { return seriesNames.indexOf((String)s); } public void addChangeListener(DatasetChangeListener arg0) { logger.log(Level.FINEST, "addChangeListener called"); } public DatasetGroup getGroup() { return null; } public void removeChangeListener(DatasetChangeListener arg0) { logger.log(Level.FINEST, "removeChangeListener called"); } public void setGroup(DatasetGroup arg0) { } }