//
// HdfeosFlatField.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.data.hdfeos;
import java.rmi.*;
import visad.*;
import visad.data.FileFlatField;
public class HdfeosFlatField extends HdfeosData
{
HdfeosDomain domain;
Variable[] range_s;
int n_fields;
int r_rank;
int d_rank;
String[] name_s;
int num_type[];
Calibration[] cal;
FunctionType mathtype;
EosStruct struct;
boolean pointStruct = false;
int[] start = null;
int[] inv_start = null;
int[] stride = null;
int[] inv_stride = null;
int[] edge = null;
int[] inv_edge = null;
DimensionSet rangeDimSet = null;
DimensionSet domainDimSet = null;
FlatField data = null;
public HdfeosFlatField( HdfeosDomain domain, Variable[] range_s )
throws VisADException,
UnimplementedException,
HdfeosException
{
initialize( domain, range_s );
}
public HdfeosFlatField( HdfeosDomain domain, Variable range )
throws VisADException,
UnimplementedException,
HdfeosException
{
Variable[] range_s = { range };
initialize( domain, range_s );
}
public HdfeosFlatField( HdfeosDomain domain, VariableSet range_s )
throws VisADException,
UnimplementedException,
HdfeosException
{
initialize( domain, range_s.getElements() );
}
private void initialize( HdfeosDomain domain,
Variable[] range_s )
throws VisADException,
UnimplementedException,
HdfeosException
{
this.domain = domain;
this.struct = domain.getStruct();
this.n_fields = range_s.length;
this.name_s = new String[n_fields];
this.num_type = new int[n_fields];
this.cal = new Calibration[n_fields];
for ( int ii = 0; ii < n_fields; ii++ ) {
name_s[ii] = range_s[ii].getName();
num_type[ii] = range_s[ii].getNumberType();
cal[ii] = range_s[ii].getCalibration();
}
mathtype = makeType();
if ( (struct instanceof EosSwath) ||
(struct instanceof EosGrid) )
{
this.rangeDimSet = range_s[0].getDimSet();
r_rank = rangeDimSet.getSize();
domainDimSet = domain.getDimSet();
d_rank = domainDimSet.getSize();
if ( d_rank > r_rank )
{
throw new HdfeosException("d_rank > r_rank");
}
start = new int[r_rank];
inv_start = new int[r_rank];
edge = new int[r_rank];
inv_edge = new int[r_rank];
stride = new int[r_rank];
inv_stride = new int[r_rank];
for ( int ii = 0; ii < r_rank; ii++ ) {
NamedDimension n_dim = rangeDimSet.getElement(ii);
start[ii] = 0;
edge[ii] = n_dim.getLength();
stride[ii] = 1;
}
}
else
{
pointStruct = true;
throw new UnimplementedException("ECS structmetadata: POINT");
}
}
public MathType getType()
throws VisADException
{
return mathtype;
}
public DataImpl getData()
throws VisADException, RemoteException
{
return getData(null);
}
public DataImpl getAdaptedData()
throws VisADException, RemoteException
{
HdfeosAccessor accessor =
new HdfeosAccessor( this, null );
FileFlatField f_field = new FileFlatField( accessor, HdfeosForm.c_strategy );
return f_field;
}
public DataImpl getData( int[] indexes )
throws VisADException, RemoteException
{
Set set = null;
if ( ! pointStruct )
{
if ( indexes == null )
{
if ( data != null )
{
return data;
}
else
{
set = domain.getData();
}
}
else
{
if ( d_rank == r_rank ) {
set = domain.getData(indexes);
}
else if ( d_rank < r_rank ) {
set = domain.getData();
}
int cnt = 0;
for ( int ii = 0; ii < indexes.length; ii++ )
{
start[cnt] = indexes[ii];
edge[cnt] = 1;
cnt++;
}
}
if ( struct instanceof EosSwath ) {
/**- invert dimension order --*/
for ( int ii = 0; ii < r_rank; ii++ )
{
inv_start[ii] = start[(r_rank-1) - ii];
inv_edge[ii] = edge[(r_rank-1) - ii];
inv_stride[ii] = stride[(r_rank-1) - ii];
}
}
else {
for ( int ii = 0; ii < r_rank; ii++ )
{
inv_start[ii] = start[ii];
inv_edge[ii] = edge[ii];
inv_stride[ii] = stride[ii];
}
}
FlatField f_field = new FlatField( mathtype, set );
int n_samples = set.getLength();
float[][] f_array = new float[n_fields][n_samples];
/**- File I/O ---*/
for ( int kk = 0; kk < n_fields; kk++ )
{
struct.readData(name_s[kk], inv_start, inv_stride, inv_edge,
num_type[kk], cal[kk], f_array[kk] );
}
f_field.setSamples( f_array );
data = f_field;
return data;
}
return null;
}
public DataImpl getAdaptedData(int[] indexes)
throws VisADException
{
HdfeosAccessor accessor =
new HdfeosAccessor( this, indexes );
FileFlatField f_field = new FileFlatField( accessor, HdfeosForm.c_strategy );
return f_field;
}
private FunctionType makeType()
throws VisADException
{
MathType domain_type = this.domain.getType();
RealType r_type;
RealType[] r_types = new RealType[n_fields];
for ( int ii = 0; ii < n_fields; ii++ )
{
r_types[ii] = RealType.getRealType( name_s[ii], null, null );
}
MathType range_type;
if ( n_fields == 1 ) {
range_type = r_types[0];
}
else {
range_type = new RealTupleType(r_types);
}
FunctionType f_type = new FunctionType(domain_type, range_type);
return f_type;
}
}