//
// EosSwath.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.util.*;
import visad.data.hdfeos.hdfeosc.HdfeosLib;

public class EosSwath extends EosStruct
{
  int swath_id;
  int sd_id;
  private String swath_name;

  GeoMapSet  G_Set;
  DimensionSet  D_Set;
  VariableSet  DV_Set;
  VariableSet  GV_Set;
     ShapeSet  DV_shapeSet;
     ShapeSet  GV_shapeSet;

  EosSwath ( int file_id, int sd_id, String name )
           throws HdfeosException
  {
     super();
     swath_name = name;
     this.sd_id = sd_id;
     swath_id = HdfeosLib.SWattach( file_id, name );
     struct_id = swath_id;

     if ( swath_id < 0 )
     {
        throw new HdfeosException(" EosSwath cannot attach to swath: "+name );
     }

/**- make GeoMapSet:  - - - - - - - - - - - - - - - - -*/

     int[] stringSize = new int[1];
     stringSize[0] = 0;

     int n_maps = HdfeosLib.SWnentries( swath_id, HdfeosLib.G_MAPS, stringSize );

     if ( n_maps > 0 )
     {
        int[] offset = new int[ n_maps ];
        int[] increment = new int[ n_maps ];
        String[] map_list = {"empty"};

        n_maps = HdfeosLib.SWinqmaps( swath_id, stringSize[0], map_list, offset, increment  );

        G_Set = new GeoMapSet();

        StringTokenizer mapElements = new StringTokenizer( map_list[0], ",", false );

        int cnt = 0;

        while ( mapElements.hasMoreElements() )
        {
           String map = (String) mapElements.nextElement();

           StringTokenizer dims = new StringTokenizer( map, "/", false );

           String[] S_array = new String[2];

           int cnt2 = 0;
           while ( dims.hasMoreElements() )
           {
              S_array[cnt2] = (String) dims.nextElement();
              cnt2++;
           }
           String toDim = S_array[1];
           String fromDim = S_array[0];
           int off = offset[cnt];
           int inc = increment[cnt];

           GeoMap obj = new GeoMap( toDim, fromDim, off, inc );
           G_Set.add( obj );
        }
     }
     else
     {
        G_Set = new GeoMapSet();
     }

/**-  Done, now make DimensionSet:  - - - - - - - - - - -  -*/

      int n_dims = HdfeosLib.SWnentries( swath_id, HdfeosLib.N_DIMS, stringSize );

      if ( n_dims <= 0 )
      {
        throw new HdfeosException("no dimension defined");
      }


      DimensionSet D_Set = new DimensionSet();

      String[] dimensionList = {"empty"};
      int[] lengths = new int[ n_dims ];

      n_dims = HdfeosLib.SWinqdims( swath_id, stringSize[0], dimensionList, lengths );

      if ( n_dims <= 0 )
      {
        throw new HdfeosException("no dimension defined");
      }

      StringTokenizer listElements =
              new StringTokenizer( dimensionList[0], ",", false );

      int cnt = 0;

      while ( listElements.hasMoreElements() )
      {
        name = (String) listElements.nextElement();
        int len = lengths[cnt];
        GeoMap g_map = G_Set.getGeoMap( name );
        NamedDimension obj = new NamedDimension( swath_id, name, len, g_map );

        D_Set.add( obj );
        cnt++;
      }

      this.D_Set = D_Set;


/**-  Done, now make VariableSets:  - - - - - - - - -*/

       int n_flds = HdfeosLib.SWnentries( swath_id, HdfeosLib.D_FIELDS, stringSize );

       if ( n_flds <= 0 )
       {
          throw new HdfeosException(" no Data Fields from SWnentries ");
       }

       String[] D_List = {"empty"};

         int[] dumA = new int[ n_flds ];
         int[] dumB = new int[ n_flds ];

       n_flds = HdfeosLib.SWinqdatafields( swath_id, stringSize[0], D_List, dumA, dumB);

       if ( n_flds < 0 )
       {
          throw new HdfeosException("no data fields in swath # "+swath_id);
       }

       this.makeVariables( D_List[0], D_TYPE );

       n_flds = HdfeosLib.SWnentries( swath_id, HdfeosLib.G_FIELDS, stringSize );

       String[] G_List = {"empty"};

         int[] dumC = new int[ n_flds ];
         int[] dumD = new int[ n_flds ];


       n_flds = HdfeosLib.SWinqgeofields( swath_id, stringSize[0], G_List, dumC, dumD );

       this.makeVariables( G_List[0], G_TYPE );


/**-  Done, now make ShapeSets for both data and geo fields: - - - - - - - - - */

      DV_shapeSet = new ShapeSet( DV_Set );

      GV_shapeSet = new ShapeSet( GV_Set );


 } /**-  end EosSwath constuctor  - - - - - - - - - - - - -*/

  public int getStructId() {
     return swath_id;
  }

  public ShapeSet getDV_shapeSet() {
    return DV_shapeSet;
  }

  public ShapeSet getGV_shapeSet() {
    return GV_shapeSet;
  }

  private void makeVariables( String fieldList, String f_type )
               throws HdfeosException
  {
    int[] rank = new int[ 1 ];
    int[] type = new int[ 1 ];
    int[] lengths = new int[ 10 ];

    NamedDimension n_dim;
    Calibration calibration;
    int cnt;
    int stat;
    boolean noAttr;
    boolean noAttrValue;

    StringTokenizer listElements = new StringTokenizer( fieldList, ",", false );

    VariableSet varSet = new VariableSet();

    String[] constantNames = CalibrationDefault.getNames();
    double[][] constants = new double[ constantNames.length ][];

    while ( listElements.hasMoreElements() )
    {
      noAttr = false;
      noAttrValue = false;
      String field = (String)listElements.nextElement();

      for ( int ii = 0; ii < constants.length; ii++ )
      {
         cnt = HdfeosLib.SDattrinfo( sd_id, field, constantNames[ii] );
         if ( cnt < 0 ) {
           noAttr = true;
           break;
         }
         else {
           constants[ii] = new double[ cnt ];
         }
      }
      if ( noAttr )
      {
        calibration = null;
      }
      else
      {
        for ( int ii = 0; ii < constants.length; ii++ )
        {
          stat = HdfeosLib.GetNumericAttr( sd_id, field, constantNames[ii], constants[ii] );
          if ( stat < 0 ) {
             noAttrValue = true;
             break;
          }
        }
        if ( noAttrValue ) {
          calibration = null;
        }
        else {
          calibration = new CalibrationDefault( constants );
        }
      }

      String[] dim_list = {"empty"};

      stat = HdfeosLib.SWfieldinfo( swath_id, field, dim_list, rank, lengths, type );

      StringTokenizer dimListElements = new StringTokenizer( dim_list[0], ",", false );

      Vector dims = new Vector();
      DimensionSet newSet = new DimensionSet();

      cnt = 0;
      while ( dimListElements.hasMoreElements() )
      {
        String dimName = (String) dimListElements.nextElement();
        n_dim = D_Set.getByName( dimName );

         if ( n_dim.isUnlimited() )  {
           n_dim.setLength( lengths[ cnt ] );
         }

         newSet.add( n_dim );
         cnt++;
      }
      newSet.setToFinished();

      Variable obj = new Variable(  field, newSet, rank[0], type[0], calibration );
      varSet.add( obj );

   }

   varSet.setToFinished();


   if ( f_type.equals( G_TYPE ))
   {
     GV_Set = varSet;
   }
   else
   {
     DV_Set = varSet;
   }
 }
}

 

Ads help maintain this website.