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    }