    001    /* ===========================================================
    002     * JFreeChart : a free chart library for the Java(tm) platform
    003     * ===========================================================
    004     *
    005     * (C) Copyright 2000-2007, 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-2007, 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    }