// ================================================================
// John Kerl
// kerl.john.r@gmail.com
// 2005-05-02
// ================================================================

import java.util.*;

public class PData
{
	public  double []   xdata; 
	public  double [][] ydata; 
	private int         num_series;
	private int         num_points;

	private static final String delimiter = "\t";

	// ----------------------------------------------------------------
	public PData(
		int arg_num_series,
		int arg_num_points)
	{
		this.num_series = arg_num_series;
		this.num_points = arg_num_points;

		this.xdata = new double[this.num_points];
		this.ydata = new double[this.num_series][this.num_points];
	}

	// ----------------------------------------------------------------
	public PData(Vector stringList)
	{
		String s;

		if (stringList.size() == 0) {
			System.out.println("PData:  Zero-length input detected.\n");
			System.exit(1);
		}
		this.num_points = stringList.size();

		s = stringList.elementAt(0).toString();

		StringTokenizer st0 = new StringTokenizer(s, this.delimiter);
		this.num_series = st0.countTokens() - 1;

		if (this.num_series < 1) {
			System.out.println(
				"PData:  Need at least two tab-delimited numbers per line.\n");
			System.exit(1);
		}

		System.out.print("Parsing input data ... ");
		this.xdata = new double[this.num_points];
		this.ydata = new double[this.num_series][this.num_points];

		for (int i = 0; i < this.num_points; i++) {
			s = stringList.elementAt(i).toString();
			StringTokenizer st = new StringTokenizer(s, this.delimiter);
			if ((st.countTokens() - 1) < this.num_series) {
				System.out.println("Too few data points at line "
					+ (i+1) + ".");
				System.exit(1);
			}

			this.xdata[i] = Double.valueOf(st.nextToken()).doubleValue();
			for (int j = 0; j < this.num_series; j++) {
				this.ydata[j][i] = Double.valueOf(st.nextToken()).doubleValue();
			}
		}
		System.out.println("done.");
	}

	// ----------------------------------------------------------------
	public int get_num_series() {
		return this.num_series;
	}

	// ----------------------------------------------------------------
	public int get_num_points() {
		return this.num_points;
	}

	// ----------------------------------------------------------------
	public void dump() {
		int i, j;

		for (i = 0; i < this.num_points; i++) {
			System.out.print(this.xdata[i]);
			for (j = 0; j < this.num_series; j++) {
				System.out.print("\t" + this.ydata[j][i]);
			}
			System.out.println();
		}
	}

	// ----------------------------------------------------------------
	public Bounds get_bounds() {
		int i, j;
		Bounds bounds = new Bounds();

		bounds.minx = this.xdata[0];
		bounds.maxx = this.xdata[0];

		bounds.miny = this.ydata[0][0];
		bounds.maxy = this.ydata[0][0];

		for (i = 0; i < this.num_points; i++) {
			if (this.xdata[i] < bounds.minx)
				bounds.minx  = this.xdata[i];
			if (this.xdata[i] > bounds.maxx)
				bounds.maxx  = this.xdata[i];

			for (j = 0; j < this.num_series; j++) {
				if (this.ydata[j][i] < bounds.miny)
					bounds.miny  = this.ydata[j][i];
				if (this.ydata[j][i] > bounds.maxy)
					bounds.maxy  = this.ydata[j][i];
			}
		}

		return bounds;
	}

	// ================================================================
	public class Bounds {
		public double minx;
		public double miny;
		public double maxx;
		public double maxy;

		public Bounds() {
			minx = 0.0;
			miny = 0.0;
			maxx = 0.0;
			maxy = 0.0;
		}
	}
}
