source: ether_statistics/service/implementation/gov/noaa/pmel/sgt/dm/SimpleTuple.java @ 569

Last change on this file since 569 was 569, checked in by vmipsl, 12 years ago

Nouveau projet

File size: 9.1 KB
Line 
1/*
2 * $Id: SimpleTuple.java,v 1.7 2003/08/22 23:02:38 dwd Exp $
3 *
4 * This software is provided by NOAA for full, free and open release.  It is
5 * understood by the recipient/user that NOAA assumes no liability for any
6 * errors contained in the code.  Although this software is released without
7 * conditions or restrictions in its use, it is expected that appropriate
8 * credit be given to its author and to the National Oceanic and Atmospheric
9 * Administration should the software be included by the recipient as an
10 * element in other product development.
11 */
12
13package gov.noaa.pmel.sgt.dm;
14
15import gov.noaa.pmel.sgt.SGLabel;
16import gov.noaa.pmel.util.GeoDate;
17import gov.noaa.pmel.util.GeoDateArray;
18import gov.noaa.pmel.util.SoTRange;
19import gov.noaa.pmel.util.Range2D;
20
21import java.beans.PropertyChangeListener;
22import java.beans.PropertyChangeSupport;
23import java.io.Serializable;
24/**
25 * <code>SimpleTuple</code> provides an implementation of the
26 * <code>SGTTuple</code> and <code>Cartesian</code> interfaces.
27 *
28 * @author Donald Denbo
29 * @version $Revision: 1.7 $, $Date: 2003/08/22 23:02:38 $
30 * @since 2.x
31 * @see SGTTuple
32 * @see Cartesian
33 */
34public class SimpleTuple implements Cloneable, SGTTuple, Cartesian, Serializable {
35  private boolean xTime_ = false;
36  private boolean yTime_ = false;
37  private String title_ = null;
38  private SGLabel keyTitle_ = null;
39  private String id_ = null;
40  private double[] xArray_ = null;
41  private double[] yArray_ = null;
42//  private GeoDate[] tArray_ = null;
43  private GeoDateArray tArray_ = null;
44  private double[] zArray_ = null;
45  private double[] assocArray_ = null;
46
47  /**
48   * @link aggregation
49   * @clientRole x
50   */
51  protected SGTMetaData xMetaData_ = null;
52
53  /**
54   * @link aggregation
55   * @clientRole y
56   */
57  protected SGTMetaData yMetaData_ = null;
58
59  /**
60   * @link aggregation
61   * @clientRole z*/
62  protected SGTMetaData zMetaData_ = null;
63  private SoTRange xRange_ = null;
64  private SoTRange yRange_ = null;
65  private Range2D zRange_ = null;
66
67  private PropertyChangeSupport changes_ = new PropertyChangeSupport(this);
68
69    public SimpleTuple(double[] xArray, double[] yArray, String title) {
70      xArray_ = xArray;
71      yArray_ = yArray;
72      xTime_ = false;
73      yTime_ = false;
74      title_ = title;
75      xRange_ = computeSoTRange(xArray);
76      yRange_ = computeSoTRange(yArray);
77    }
78
79    public SimpleTuple(GeoDate[] xArray, double[] yArray, String title) {
80      tArray_ = new GeoDateArray(xArray);
81      yArray_ = yArray;
82      xTime_ = true;
83      yTime_ = false;
84      title_ = title;
85      xRange_ = computeSoTRange(tArray_);
86      yRange_ = computeSoTRange(yArray);
87    }
88
89    public SimpleTuple(double[] xArray, GeoDate[] yArray, String title) {
90      xArray_ = xArray;
91      tArray_ = new GeoDateArray(yArray);
92      xTime_ = false;
93      yTime_ = true;
94      title_ = title;
95      xRange_ = computeSoTRange(xArray);
96      yRange_ = computeSoTRange(tArray_);
97    }
98
99    public SimpleTuple(double[] xArray, double[] yArray,
100                       double[] zArray, String title) {
101      xArray_ = xArray;
102      yArray_ = yArray;
103      zArray_ = zArray;
104      xTime_ = false;
105      yTime_ = false;
106      title_ = title;
107      xRange_ = computeSoTRange(xArray);
108      yRange_ = computeSoTRange(yArray);
109      zRange_ = computeRange2D(zArray);
110    }
111
112    public SimpleTuple(GeoDate[] xArray, double[] yArray,
113                       double[] zArray, String title) {
114      tArray_ = new GeoDateArray(xArray);
115      yArray_ = yArray;
116      zArray_ = zArray;
117      xTime_ = true;
118      yTime_ = false;
119      title_ = title;
120      xRange_ = computeSoTRange(tArray_);
121      yRange_ = computeSoTRange(yArray);
122      zRange_ = computeRange2D(zArray);
123    }
124
125    public SimpleTuple(double[] xArray, GeoDate[] yArray,
126                       double[] zArray, String title) {
127      xArray_ = xArray;
128      tArray_ = new GeoDateArray(yArray);
129      zArray_ = zArray;
130      xTime_ = false;
131      yTime_ = true;
132      title_ = title;
133      xRange_ = computeSoTRange(xArray);
134      yRange_ = computeSoTRange(tArray_);
135      zRange_ = computeRange2D(zArray);
136    }
137
138  public SimpleTuple() {
139    xTime_ = false;
140    yTime_ = false;
141  }
142
143  public double[] getXArray() {
144    return xArray_;
145  }
146
147  public void setXArray(double[] xArray) {
148    xArray_ = xArray;
149    xTime_ = false;
150    xRange_ = computeSoTRange(xArray);
151    changes_.firePropertyChange("dataModified",
152                                new Integer(0),
153                                new Integer(xArray.length));
154  }
155
156  public void setXArray(GeoDate[] tArray) {
157    setXArray(new GeoDateArray(tArray));
158  }
159  /**
160   * @since 3.0
161   */
162  public void setXArray(GeoDateArray tArray) {
163    tArray_ = tArray;
164    xTime_ = true;
165    xArray_ = null;
166    xRange_ = computeSoTRange(tArray);
167    changes_.firePropertyChange("dataModified",
168                                new Integer(0),
169                                new Integer(tArray.getLength()));
170  }
171
172  public double[] getYArray() {
173    return yArray_;
174  }
175
176  public void setYArray(double[] yArray) {
177    yArray_ = yArray;
178    yTime_ = false;
179    yRange_ = computeSoTRange(yArray);
180    changes_.firePropertyChange("dataModified",
181                                new Integer(0),
182                                new Integer(yArray.length));
183  }
184
185  public void setYArray(GeoDate[] tArray) {
186    setYArray(new GeoDateArray(tArray));
187  }
188  /**
189   * @since 3.0
190   */
191  public void setYArray(GeoDateArray tArray) {
192    tArray_ = tArray;
193    yTime_ = true;
194    yArray_ = null;
195    yRange_ = computeSoTRange(tArray);
196    changes_.firePropertyChange("dataModified",
197                                new Integer(0),
198                                new Integer(tArray.getLength()));
199  }
200  public double[] getZArray() {
201    return zArray_;
202  }
203
204  public void setZArray(double[] zArray) {
205    zArray_ = zArray;
206    zRange_ = computeRange2D(zArray);
207    changes_.firePropertyChange("dataModified",
208                                new Integer(0),
209                                new Integer(zArray.length));
210  }
211
212  public int getSize() {
213    if(xTime_) {
214      return tArray_.getLength();
215    } else {
216      return xArray_.length;
217    }
218  }
219
220  public GeoDate[] getTimeArray() {
221    return tArray_.getGeoDate();
222  }
223  /**
224   * @since 3.0
225   */
226  public GeoDateArray getGeoDateArray() {
227    return tArray_;
228  }
229
230  public double[] getAssociatedData() {
231    return assocArray_;
232  }
233
234  public void setAssociatedData(double[] assocArray) {
235    assocArray_ = assocArray;
236  }
237
238  public boolean hasAssociatedData() {
239    return (assocArray_ != null);
240  }
241
242  public SGTMetaData getZMetaData() {
243    return zMetaData_;
244  }
245
246  public void setZMetaData(SGTMetaData zMeta) {
247    zMetaData_ = zMeta;
248  }
249
250  public String getTitle() {
251    return title_;
252  }
253
254  public void setTitle(String title) {
255    title_ = title;
256  }
257
258  public SGLabel getKeyTitle() {
259    return keyTitle_;
260  }
261
262  public void setKeyTitle(SGLabel title) {
263    keyTitle_ = title;
264  }
265
266  public String getId() {
267    return id_;
268  }
269
270  public void setId(String id) {
271    id_ = id;
272  }
273
274  public SGTData copy() {
275    SGTTuple newTuple;
276    try {
277      newTuple = (SGTTuple)clone();
278    } catch (CloneNotSupportedException e) {
279      newTuple = new SimpleTuple();
280    }
281    return (SGTData)newTuple;
282  }
283
284  public boolean isXTime() {
285    return xTime_;
286  }
287
288  public boolean isYTime() {
289    return yTime_;
290  }
291
292  public SGTMetaData getXMetaData() {
293    return xMetaData_;
294  }
295
296  public void setXMetaData(SGTMetaData xMeta) {
297    xMetaData_ = xMeta;
298  }
299
300  public SGTMetaData getYMetaData() {
301    return yMetaData_;
302  }
303
304  public void setYMetaData(SGTMetaData yMeta) {
305    yMetaData_ = yMeta;
306  }
307
308  public SoTRange getXRange() {
309    return xRange_;
310  }
311
312  public SoTRange getYRange() {
313    return yRange_;
314  }
315
316  public Range2D getZRange() {
317    return zRange_;
318  }
319
320  public void addPropertyChangeListener(PropertyChangeListener l) {
321    changes_.addPropertyChangeListener(l);
322  }
323
324  public void removePropertyChangeListener(PropertyChangeListener l) {
325    changes_.removePropertyChangeListener(l);
326  }
327
328  private SoTRange computeSoTRange(double[] array) {
329    Range2D range = computeRange2D(array);
330    return new SoTRange.Double(range.start, range.end);
331  }
332
333  private SoTRange computeSoTRange(GeoDateArray tarray) {
334    long start = Long.MAX_VALUE;
335    long end = Long.MIN_VALUE;
336    long[] tar = tarray.getTime();
337    int count = 0;
338    for(int i=0; i < tar.length; i++) {
339      if(!(tar[i] == Long.MAX_VALUE)) {
340        start = Math.min(start, tar[i]);
341        end = Math.max(end, tar[i]);
342        count++;
343      }
344    }
345    if(count == 0) {
346      return new SoTRange.Time(Long.MAX_VALUE,
347                               Long.MAX_VALUE);
348    } else {
349      return new SoTRange.Time(start, end);
350    }
351  }
352
353  private Range2D computeRange2D(double[] array) {
354    double start = Double.POSITIVE_INFINITY;
355    double end = Double.NEGATIVE_INFINITY;
356    int count = 0;
357    for(int i=0; i < array.length; i++) {
358      if(!Double.isNaN(array[i])) {
359        start = Math.min(start, array[i]);
360        end = Math.max(end, array[i]);
361        count++;
362      }
363    }
364    if(count == 0) {
365      return new Range2D(Double.NaN, Double.NaN);
366    } else {
367      return new Range2D(start, end);
368    }
369  }
370}
Note: See TracBrowser for help on using the repository browser.