//
// TextForm.java
//
/*
VisAD system for interactive analysis and visualization of numerical
data. Copyright (C) 1996 - 2017 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
*/
package visad.gifts;
import java.util.Vector;
import java.io.FileReader;
import java.io.LineNumberReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.StringTokenizer;
import visad.*;
import java.rmi.*;
public class TextForm
{
boolean eastLongitudePositive = true;
String longitudeName = null;
String latitudeName = null;
public TextForm()
{
this( true, "Longitude", "Latitude");
}
public TextForm(String lon_name, String lat_name)
{
this(true, lon_name, lat_name);
}
public TextForm(boolean elp, String lon_name, String lat_name)
{
eastLongitudePositive = elp;
longitudeName = lon_name;
latitudeName = lat_name;
}
public DataImpl open( String file_path )
throws VisADException, RemoteException
{
DataImpl data = null;
try
{
data = getFileData(file_path);
}
catch ( FileNotFoundException e1 )
{
System.out.println(e1.getMessage());
}
catch ( IOException e2 )
{
System.out.println(e2.getMessage());
}
if ( !eastLongitudePositive ) { //-- switch to eastLongitudePositive
return switchLongitudeSign(data);
}
else {
return data;
}
}
private DataImpl getFileData(String file_path)
throws VisADException, RemoteException,
FileNotFoundException, IOException
{
DataImpl data = null;
MathType type = null;
String line = null;
String token;
Vector lines = new Vector();
String header = null;
int n_lines = 0;
FileReader reader = new FileReader(file_path);
LineNumberReader line_reader = new LineNumberReader(reader);
header = line_reader.readLine();
lines.addElement(header);
String line_1 = line_reader.readLine();
lines.addElement(line_1);
int[][] indexes = new int[1][];
type = getFileType(header, line_1, indexes);
int tup_dim = ((RealTupleType)((FunctionType)type).getRange()).getDimension();
while ( (line = line_reader.readLine()) != null )
{
lines.addElement(line);
}
int n_samples = lines.size() - 1;
float[][] values = new float[tup_dim][n_samples];
for (int ii = 0; ii < n_samples; ii++)
{
StringTokenizer tokens = new StringTokenizer((String)lines.elementAt(ii+1));
int cnt = 0;
while ( tokens.hasMoreElements() )
{
token = tokens.nextToken();
for ( int jj = 0; jj < tup_dim; jj++ ) {
if ( cnt == indexes[0][jj] ) {
values[jj][ii] = (Float.valueOf(token)).floatValue();
}
}
cnt++;
}
}
Integer1DSet domainSet = new Integer1DSet(((FunctionType)type).getDomain(), n_samples);
FlatField f_field = new FlatField((FunctionType)type, domainSet);
f_field.setSamples(values);
return f_field;
}
private MathType getFileType(String header, String line_1, int[][] indexes)
throws VisADException, RemoteException
{
StringTokenizer tokens = new StringTokenizer(header);
StringTokenizer values = new StringTokenizer(line_1);
String token;
Vector names = new Vector();
Vector types = new Vector();
Vector comps = new Vector();
MathType type;
float value;
while ( tokens.hasMoreElements() )
{
token = tokens.nextToken();
names.addElement(token);
}
int tup_dim = names.size();
indexes[0] = new int[tup_dim];
int cnt_num = 0;
RealType r_type = null;
for ( int ii = 0; ii < tup_dim; ii++ ) {
try {
Float.valueOf((String)values.nextToken());
String name = (String)names.elementAt(ii);
if ( name.equals(longitudeName) ) {
r_type = RealType.Longitude;
}
else if ( name.equals(latitudeName) ) {
r_type = RealType.Latitude;
}
else {
r_type = RealType.getRealType(name);
}
types.addElement(r_type);
indexes[0][cnt_num++] = ii;
}
catch ( NumberFormatException e ) {
}
}
RealType[] r_types = new RealType[types.size()];
for ( int ii = 0; ii < r_types.length; ii++ ) {
r_types[ii] = (RealType) types.elementAt(ii);
}
RealTupleType range = new RealTupleType(r_types);
RealType domain = RealType.getRealType("index");
type = new FunctionType(domain, range);
return type;
}
private DataImpl switchLongitudeSign(DataImpl data)
throws VisADException, RemoteException
{
int idx = ((RealTupleType)((FunctionType)data.getType()).getRange()).getIndex("Longitude");
double[][] values = ((FlatField)data).getValues();
for ( int ii = 0; ii < values[idx].length; ii++ ) {
values[idx][ii] = -1d*values[idx][ii];
}
((FlatField)data).setSamples(values);
return data;
}
}