001 /* ===========================================================
002 * JFreeChart : a free chart library for the Java(tm) platform
003 * ===========================================================
004 *
005 * (C) Copyright 2000-2008, by Object Refinery Limited and Contributors.
006 *
007 * Project Info: http://www.jfree.org/jfreechart/index.html
008 *
009 * This library is free software; you can redistribute it and/or modify it
010 * under the terms of the GNU Lesser General Public License as published by
011 * the Free Software Foundation; either version 2.1 of the License, or
012 * (at your option) any later version.
013 *
014 * This library is distributed in the hope that it will be useful, but
015 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
016 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
017 * License for more details.
018 *
019 * You should have received a copy of the GNU Lesser General Public
020 * License along with this library; if not, write to the Free Software
021 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
022 * USA.
023 *
024 * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
025 * in the United States and other countries.]
026 *
027 * --------------------
028 * WaferMapDataset.java
029 * --------------------
030 * (C)opyright 2003-2008, by Robert Redburn and Contributors.
031 *
032 * Original Author: Robert Redburn;
033 * Contributor(s): David Gilbert (for Object Refinery Limited);
034 *
035 * Changes
036 * -------
037 * 25-Nov-2003 : Version 1 contributed by Robert Redburn (with some
038 * modifications to match style conventions) (DG);
039 * ------------- JFREECHART 1.0.x ---------------------------------------------
040 * 02-Feb-2007 : Removed author tags from all over JFreeChart sources (DG);
041 *
042 */
043
044 package org.jfree.data.general;
045
046 import java.util.Set;
047 import java.util.TreeSet;
048
049 import org.jfree.data.DefaultKeyedValues2D;
050
051 /**
052 * A dataset that can be used with the {@link org.jfree.chart.plot.WaferMapPlot}
053 * class.
054 */
055 public class WaferMapDataset extends AbstractDataset {
056
057 /**
058 * Storage structure for the data values (row key is chipx, column is
059 * chipy)
060 */
061 private DefaultKeyedValues2D data;
062
063 /** wafer x dimension */
064 private int maxChipX;
065
066 /** wafer y dimension */
067 private int maxChipY;
068
069 /** space to draw between chips */
070 private double chipSpace;
071
072 /** maximum value in this dataset */
073 private Double maxValue;
074
075 /** minimum value in this dataset */
076 private Double minValue;
077
078 /** default chip spacing */
079 private static final double DEFAULT_CHIP_SPACE = 1d;
080
081 /**
082 * Creates a new dataset using the default chipspace.
083 *
084 * @param maxChipX the wafer x-dimension.
085 * @param maxChipY the wafer y-dimension.
086 */
087 public WaferMapDataset(int maxChipX, int maxChipY) {
088 this(maxChipX, maxChipY, null);
089 }
090
091 /**
092 * Creates a new dataset.
093 *
094 * @param maxChipX the wafer x-dimension.
095 * @param maxChipY the wafer y-dimension.
096 * @param chipSpace the space between chips.
097 */
098 public WaferMapDataset(int maxChipX, int maxChipY, Number chipSpace) {
099
100 this.maxValue = new Double(Double.NEGATIVE_INFINITY);
101 this.minValue = new Double(Double.POSITIVE_INFINITY);
102 this.data = new DefaultKeyedValues2D();
103
104 this.maxChipX = maxChipX;
105 this.maxChipY = maxChipY;
106 if (chipSpace == null) {
107 this.chipSpace = DEFAULT_CHIP_SPACE;
108 }
109 else {
110 this.chipSpace = chipSpace.doubleValue();
111 }
112
113 }
114
115 /**
116 * Sets a value in the dataset.
117 *
118 * @param value the value.
119 * @param chipx the x-index for the chip.
120 * @param chipy the y-index for the chip.
121 */
122 public void addValue(Number value, Comparable chipx, Comparable chipy) {
123 setValue(value, chipx, chipy);
124 }
125
126 /**
127 * Adds a value to the dataset.
128 *
129 * @param v the value.
130 * @param x the x-index.
131 * @param y the y-index.
132 */
133 public void addValue(int v, int x, int y) {
134 setValue(new Double(v), new Integer(x), new Integer(y));
135 }
136
137 /**
138 * Sets a value in the dataset and updates min and max value entries.
139 *
140 * @param value the value.
141 * @param chipx the x-index.
142 * @param chipy the y-index.
143 */
144 public void setValue(Number value, Comparable chipx, Comparable chipy) {
145 this.data.setValue(value, chipx, chipy);
146 if (isMaxValue(value)) {
147 this.maxValue = (Double) value;
148 }
149 if (isMinValue(value)) {
150 this.minValue = (Double) value;
151 }
152 }
153
154 /**
155 * Returns the number of unique values.
156 *
157 * @return The number of unique values.
158 */
159 public int getUniqueValueCount() {
160 return getUniqueValues().size();
161 }
162
163 /**
164 * Returns the set of unique values.
165 *
166 * @return The set of unique values.
167 */
168 public Set getUniqueValues() {
169 Set unique = new TreeSet();
170 //step through all the values and add them to the hash
171 for (int r = 0; r < this.data.getRowCount(); r++) {
172 for (int c = 0; c < this.data.getColumnCount(); c++) {
173 Number value = this.data.getValue(r, c);
174 if (value != null) {
175 unique.add(value);
176 }
177 }
178 }
179 return unique;
180 }
181
182 /**
183 * Returns the data value for a chip.
184 *
185 * @param chipx the x-index.
186 * @param chipy the y-index.
187 *
188 * @return The data value.
189 */
190 public Number getChipValue(int chipx, int chipy) {
191 return getChipValue(new Integer(chipx), new Integer(chipy));
192 }
193
194 /**
195 * Returns the value for a given chip x and y or null.
196 *
197 * @param chipx the x-index.
198 * @param chipy the y-index.
199 *
200 * @return The data value.
201 */
202 public Number getChipValue(Comparable chipx, Comparable chipy) {
203 int rowIndex = this.data.getRowIndex(chipx);
204 if (rowIndex < 0) {
205 return null;
206 }
207 int colIndex = this.data.getColumnIndex(chipy);
208 if (colIndex < 0) {
209 return null;
210 }
211 return this.data.getValue(rowIndex, colIndex);
212 }
213
214 /**
215 * Tests to see if the passed value is larger than the stored maxvalue.
216 *
217 * @param check the number to check.
218 *
219 * @return A boolean.
220 */
221 public boolean isMaxValue(Number check) {
222 if (check.doubleValue() > this.maxValue.doubleValue()) {
223 return true;
224 }
225 return false;
226 }
227
228 /**
229 * Tests to see if the passed value is smaller than the stored minvalue.
230 *
231 * @param check the number to check.
232 *
233 * @return A boolean.
234 */
235 public boolean isMinValue(Number check) {
236 if (check.doubleValue() < this.minValue.doubleValue()) {
237 return true;
238 }
239 return false;
240 }
241
242 /**
243 * Returns the maximum value stored in the dataset.
244 *
245 * @return The maximum value.
246 */
247 public Number getMaxValue() {
248 return this.maxValue;
249 }
250
251 /**
252 * Returns the minimum value stored in the dataset.
253 *
254 * @return The minimum value.
255 */
256 public Number getMinValue() {
257 return this.minValue;
258 }
259
260 /**
261 * Returns the wafer x-dimension.
262 *
263 * @return The number of chips in the x-dimension.
264 */
265 public int getMaxChipX() {
266 return this.maxChipX;
267 }
268
269 /**
270 * Sets wafer x dimension.
271 *
272 * @param maxChipX the number of chips in the x-dimension.
273 */
274 public void setMaxChipX(int maxChipX) {
275 this.maxChipX = maxChipX;
276 }
277
278 /**
279 * Returns the number of chips in the y-dimension.
280 *
281 * @return The number of chips.
282 */
283 public int getMaxChipY() {
284 return this.maxChipY;
285 }
286
287 /**
288 * Sets the number of chips in the y-dimension.
289 *
290 * @param maxChipY the number of chips.
291 */
292 public void setMaxChipY(int maxChipY) {
293 this.maxChipY = maxChipY;
294 }
295
296 /**
297 * Returns the space to draw between chips.
298 *
299 * @return The space.
300 */
301 public double getChipSpace() {
302 return this.chipSpace;
303 }
304
305 /**
306 * Sets the space to draw between chips.
307 *
308 * @param space the space.
309 */
310 public void setChipSpace(double space) {
311 this.chipSpace = space;
312 }
313
314 }