Time Series Display (was Re: beginner's questions)

Hi Xinman,

Following Bill's suggestions, and using the notation conventions I suggested
in a recent email, I had a go at the Time Series Display question you
raised earlier (17 Nov).

The code is attached as TimeSeries.txt

To try it out:
* copy it to your visad\examples directory
* rename it TimeSeries.java
* compile (eg javac *.java)
* run (java TimeSeries)

I've deliberately used a 2D display rather than a 3D display,
as we are doing some tests on IBM AIX workstations which
don't have Java 3D :-(
( for those interested the IBM beta release of Java 2 for AIX 4.3.3
  looks ok so far: only 1 problem we have noticed relating to loading
  resources)

Hope this helps,

James

"From: Bill Hibbard " wrote:

> Hi Xinman,
>
> I'm in the UK and can only answer briefly.  Study these
> Sections of the VisAD Developers Guide:
>
>   3.1.14 Application Example: Synthesizing MathTypes
>   3.2.14 Application Example: Synthesizing Fields
>
> and also visad/examples/Test03.java.
>
> You need to Construct a FunctionType:
>
>   (RealType.Time -> temperature)
>
> and use DateTime to help construct a Linear1DSet for your
> dates/times (which appear to be evenly spaced - if they
> weren't you'd construct a Gridded1DDoubleSet instead of
> the Linear1DSet).
>
> Then construct a FlatField from these, and call setSamples()
> to put your temperature values in it.
>
> Then construct a DisplayImplJ3D (or DisplayImplJ2D), link
> it to your FlatField (as in Test03.java or any other
> example), and construct ScalarMaps:
>
>   ScalarMap(RealType.Time, Display.XAxis)
>   ScalarMap(temperature, Display.YAxis)
>
> and addMap() these to the DisplayImplJ*D.  Study the guide
> and the examples, and hopefully it will become clear.
>
> Cheers,
> Bill
> ----------------------------------------------------------
> Bill Hibbard, SSEC, 1225 W. Dayton St., Madison, WI  53706
> hibbard@xxxxxxxxxxxxxxxxx  608-263-4427  fax: 608-263-6738
> http://www.ssec.wisc.edu/~billh/vis.html

--
James Kelly
Supervisor of Regional Development            Bureau of Meteorology
PO Box 1289K                                  Melbourne 3001, Australia
Phone: 61-3-9669-4724 Fax: 61-3-9669-4128     Email: J.Kelly@xxxxxxxxxx

/*
VisAD system for interactive analysis and visualization of numerical
data.  Copyright (C) 1996 - 1999 Bill Hibbard, Curtis Rueden, Tom
Rink, Dave Glowacki, Steve Emmerson, Tom Whittaker, Don Murray, and
Tommy Jasmin.

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Library General Public License for more details.

You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA
*/

//
// Time Series, based on Test03
// by James Kelly Dec 1999
//
import java.awt.Component;

import java.rmi.RemoteException;

import visad.*;

import visad.java2d.DisplayRendererJ2D;
import visad.java2d.DisplayImplJ2D;
import visad.util.AnimationWidget;

public class TimeSeries
  extends UISkeleton
{
  public TimeSeries() { }

  public TimeSeries(String[] args)
    throws RemoteException, VisADException
  {
    super(args);
  }

  DisplayImpl[] setupServerDisplays()
    throws RemoteException, VisADException
  {
    DisplayImpl[] diDisplay = new DisplayImpl[1];
    diDisplay[0] = new DisplayImplJ2D("display");
    return diDisplay;
  }

  void setupServerData(LocalDisplay[] diDisplay)
    throws RemoteException, VisADException
  {
                //
                // PART 1 : define the meta data (math types)
                //
                // define all RealTypes (rt) and RealType Arrays (rta)
    RealType rtTemperature = new RealType("rtTemperature", null, null);
    RealType[] rtaTemperature = {rtTemperature};

    RealType[] rtaTime = {RealType.Time};

                // define all RealTypeTypes (rtt) from RealType Arrays (rta)
    RealTupleType rttTemperature = new RealTupleType(rtaTemperature);
    RealTupleType rttTime = new RealTupleType(rtaTime);

                // define all FunctionTypes (ft) which are mappings from one 
rtt to another rtt
    FunctionType ftTime2Temperature = new FunctionType(rttTime, rttTemperature);

                //
                // PART 2 : create the actual data, based on the meta data 
(math types)
                //
                // now create some data which samples the above functions
                // This data is known as a Field, and in this case a FlatField
                //

    int iNtimes1 = 4;

    // time series test
    // 2 May 99, 15:51:00
    double dStart = new DateTime(1999, 122, 57060).getValue();
    Set sl1dsTime =                  // 4 times: t+0,+1000,+2000,+3000
      new Linear1DSet(rttTime, dStart, dStart + 3000.0, iNtimes1);  

                // now define a dataset which varies with time (with null data 
values)
                // which has 4 time steps
    FlatField ffTime2Temperature = new FlatField(ftTime2Temperature, sl1dsTime);

                double dMinTemp = 10.0;
                double[][] daaTemperature = {{dMinTemp, dMinTemp + 5.0, 
dMinTemp + 10.0,
                                                                                
                                                        dMinTemp + 15.0}};
                //
                // set data values for datasets (FlatFields)
                //
    ffTime2Temperature.setSamples(daaTemperature);

    diDisplay[0].addMap(new ScalarMap(rtTemperature, Display.YAxis));
    diDisplay[0].addMap(new ScalarMap(RealType.Time, Display.XAxis));
    diDisplay[0].addMap(new ConstantMap(0.1, Display.Green));
    diDisplay[0].addMap(new ConstantMap(0.5, Display.Blue));
    // diDisplay[0].addMap(new ConstantMap(0.5, Display.Red));
    diDisplay[0].addMap(new ScalarMap(rtTemperature, Display.Red));

    DataReferenceImpl driTemperatures
      new DataReferenceImpl("driTemperatures");
    driTemperatures.setData(ffTime2Temperature);
    diDisplay[0].addReference(driTemperatures, null);
  }

        // String getFrameTitle() { return "VisAD Time Series Display"; }

  public String toString()
  {
    return ": Time Series Display of Temperature";
  }

  public static void main(String[] args)
    throws RemoteException, VisADException
  {
    new TimeSeries(args);
  }
}