44
Page 1 Dimension Scales Dimension Scales in in HDF-EOS2 & HDF-EOS5 HDF-EOS2 & HDF-EOS5 Abe Taaheri, Raytheon IIS HDF & HDF-EOS Workshop XIV Champaign, IL Sep. 29, 2010

Dimension Scales in HDF-EOS2 and HDF-EOS5

Embed Size (px)

DESCRIPTION

Dimension Scales for HDF-EOS2 and HDF-EOS5 field dimensions were added to the new release of HDF-EOS. The new APIs will be presented and sample outputs will be shown. Need for development of new APIs for handling Dimension Scales will be discussed.

Citation preview

Page 1: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 1

Dimension Scales Dimension Scales in in

HDF-EOS2 & HDF-EOS5HDF-EOS2 & HDF-EOS5

Abe Taaheri, Raytheon IISHDF & HDF-EOS Workshop XIV

Champaign, ILSep. 29, 2010

Page 2: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 2

• What is a Dimension Scale ?

• Dimension Scales & Metadata

• Dimension Scales APIs– he2

– he5

• Code example – Writing (he2, he5)

– Reading (he2, he5)

• Sample he2 and he5 files with Dimension Scales

Page 3: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 3

It is a sequence of numbers placed along a dimension to demarcate intervals along it

What is a Dimension Scale?What is a Dimension Scale?

• HDF4HDF4- It is an array with size and name similar to

its assigned dimension

- Stored using a structure similar to the SDS array

- One scale is assigned per dimension

Page 4: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 4

* What is a Dimension Scale?

• HDF5HDF5

– A HDF5 dataset.

– With additional metadata that identifies the dataset as a Dimension Scale

– Typically Dimension Scales are logically associated with the dimensions of HDF5 Datasets

– The meaning of the association is left to applications.

* Pedro Vicente talk, HDF/ HDF-EOS Workshop IX* Pedro Vicente talk, HDF/ HDF-EOS Workshop IX

Page 5: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 5

Example: 3D dataset

Dataset: 3D Array with 5 x 7 x 10

dimensions

3 Dimension Scales Datasets

5

7

10

Page 6: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 6

• A dimension scale is not required to be a 1-D array, or to have a specific datatype

• A dataset dimension can have more than 1 associated dimension scale

• A Dimension Scale can be shared by two or more Dataset dimensions

More on Dimension Scale in HDF5

Page 7: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 7

Example: 3D dataset in HDF5

Dataset: 3D Array with 5 x 7 x 10

dimensions

Several Dimension Scales Datasets

Page 8: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 8

HDF5 Dimension Scale Metadata

• When the Dimension Scale is associated with a dimension of a Dataset, the association is represented by attributes of the two datasets.

• The following dataset attributes are used to describe dimension scale datasets:

– Attribute named “CLASS” with the value “DIMENSION_SCALE”

– Optional attribute named “NAME”

– Attribute references to any associated Dataset

Page 9: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 9

• HDF4

– Since Version 4.0 ?

– SDsetdimscale()

– SDgetdimscale()

– SDsetdimstrs(): label, unit, format

– SDgetdimstrs()

• HDF5

– Since Version 1.8

– H5DSset_scale()

– H5DSattach_scale(), H5DSdetach_scale()

– H5DSset_label(), H5DSget_label()

– A few more APIs

Page 10: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 10

HDF Augmentation ToolHDF Augmentation Tool

Augmentation Tool adds HDF5 Dimension Scales inside the file so that netCDF-4 APIs can access the data

Page 11: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 11

• HDF-EOS

– Added a few routines to HDF-EOS2 to create dimension scales like HDF4

Version 2.17

– Added a few routines to HDF-EOS5 to create dimension scales like those added by the HDF Augmentation Tool

Version 1.13

Page 12: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 12

HDF-EOS2 APIsHDF-EOS2 APIs

Page 13: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 13

• Name: SWsetdimscale

• Signature:

– intn SWsetdimscale( int32 swathID,

char *fieldname, char *dimname, int32 dimsize,

int32 numbertype, VOIDP data)

• Purpose:

– Sets dimension scale for a given dimension

Page 14: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 14

• Name: SWgetdimscale

• Signature:

– intn SWgetdimscale( int32 swathID,

char *fieldname, char *dimname,

int32 *dimsize, int32 *numbertype,

VOIDP data)

• Purpose:

– Gets dimension scale for a given dimension

Page 15: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 15

• Name: SWsetdimstrs

• Signature:

– intn SWsetdimstrs( int32 swathID,

char *fieldname, char *dimname, char *label,

char *unit, char *format)

• Purpose:

– Sets the label, unit, and format strings for a given dimension

Page 16: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 16

• Name: SWgetdimstrs

• Signature:

– intn SWgetdimstrs( int32 swathID, char *fieldname, char *dimname, char *label,

char *unit, char *format, intn len)

• Purpose:

– Gets the label, unit, and format strings for a given dimension

Page 17: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 17

• Similar APIs for Dimension Scales in

– Grid Fields

Page 18: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 18

HDF-EOS5 APIsHDF-EOS5 APIs

Page 19: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 19

• Name: HE5_SWsetdimscale

• Signature:

– herr_t HE5_SWsetdimscale( hid_t swathID, char *fieldname, char *dimname,

const hsize_t dimsize, hid_t numbertype,

void * data)

• Purpose:

– Sets dimension scale for a field dimension within the swath

Page 20: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 20

• Name: HE5_SWgetdimscale

• Signature: – long HE5_SWgetdimscale( hid_t swathID,

char *fieldname, char *dimname, hsize_t *dimsize, hid_t *numbertype, void * data)

• Purpose: – Gets dimension scale for a field dimension

within the swath

Page 21: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 21

• Name: HE5_SWwritedscaleattr

• Signature:

– herr_t HE5_SWwritedscaleattr( hid_t swathID, const char *dimname, const char *attrname, hid_t ntype, hsize_t count[], void *datbuf)

• Purpose:

– Writes/Updates a dimension scale attribute in a specific swath

Page 22: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 22

• Name: HE5_SWreaddscaleattr

• Signature:

– herr_t HE5_SWreaddscaleattr( hid_t swathID, const char *dimname, const char *attrname,

void *datbuf)

• Purpose:

– Reads a dimension scale attribute from a specific dimension

Page 23: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 23

• Name: HE5_SWinqdscaleattrs

• Signature:

– Long HE5_SWinqdscaleattrs( hid_t swathID, const char *dimname, char *attrnames,

long *strbufsize)

• Purpose:

– Retrieve information about the attributes defined

Page 24: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 24

• Name: HE5_SWdscaleattrinfo

• Signature:

– herr_t HE5_SWdscaleattrinfo( hid_t swathID, const char *dimname, const char *attrname,

hid_t *ntype, hsize_t *count)

count : Number of attribute elements

• Purpose:

– Returns information about attribute(s) in a specific dimension scale

Page 25: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 25

• Similar APIs for Dimension Scales in

– Grid

– Zonal Average

Page 26: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 26

Code ExamplesCode Examples

Page 27: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 27

Writing Code Example (HDF-EOS2)

#include "hdf.h"

#include "HdfEosDef.h"

int main()

{

intn status, i;

int32 swfid, SWid;

int32 nbands, nGeoTrack;

int32 bands[15]={3,6,9,12,15,18,23,26,29,32,33,34,36,37,39};

char label[16];

char unit[16];

char format[16];

float dataGeoTrack[20];

swfid = SWopen ( "SwathFile.hdf", DFACC_RDWR );

SWid = SWattach ( swfid, "Swath1“ );

Page 28: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 28

nGeoTrack = 20;for (i=0; i<20; i++) { dataGeoTrack[i] = (float) I; }status = SWsetdimscale ( SWid, "Temperature", "GeoTrack",

nGeoTrack, DFNT_FLOAT32, dataGeoTrack );

nbands = 15;status = SWsetdimscale ( SWid, "Spectra", "Bands",

nbands, DFNT_INT32, bands );

strcpy (label, "Bands");strcpy (unit, "none");strcpy (format, "I2");status = SWsetdimstrs ( SWid, "Spectra", "Bands", label, unit, format );

SWdetach ( SWid );SWclose ( swfid );return 0;

}

Page 29: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 29

Writing Code Example (HDF-EOS5)

#include <HE5_HdfEosDef.h>

int main()

{

herr_t status = FAIL;

hid_t swfid = FAIL;

hid_t SWid1 = FAIL;

int data[15]={1,2,3,6,9,12,15,18,23,26,29,32, 33,34,35};

char label[16], unit[16], format[16];

int nbands;

hsize_t count[3];

swfid = HE5_SWopen ( "Swath.h5", H5F_ACC_RDWR );

SWid1 = HE5_SWattach ( swfid, "Swath1“ );

Page 30: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 30

nbands = 15;

status = HE5_SWsetdimscale ( SWid1, "Spectra", "Bands", nbands, H5T_NATIVE_INT, (void *)data );

strcpy(label, "Bands Dim");

strcpy(unit, "None");

strcpy(format, "I2");

count[0]= 12;

status = HE5_SWwritedscaleattr ( SWid1, "Bands", "label", H5T_NATIVE_CHAR, count, label );

count[0]= 6;

status = HE5_SWwritedscaleattr ( SWid1, "Bands", "unit", H5T_NATIVE_CHAR, count, unit );

count[0]= 4;

status = HE5_SWwritedscaleattr ( SWid1, "Bands", "format", H5T_NATIVE_CHAR, count, format );

Page 31: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 31

int datbuf_i1[1] = {-999};

count[0]= 1;

status = HE5_SWwritedscaleattr ( SWid1, "Bands", "MissingValue", H5T_NATIVE_INT, count, datbuf_i1 );

int datbuf_i2[3] = {-999, 0, 999};

count[0]= 3;

status = HE5_SWwritedscaleattr(SWid1, "Bands", "IntValues", H5T_NATIVE_INT, count, datbuf_i2 );

HE5_SWdetach ( SWid1 );

HE5_SWclose ( swfid );

return 0;

}

Page 32: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 32

Reading Code Example (HDF-EOS2)

#include "hdf.h"#include "HdfEosDef.h"Int main(){ intn status, i; int32 swfid, SWid; int32 *datbuf_int32; int32 nbands, data_type, dimsize, dimsize1; intn len, buffsize; char label[16], unit[16], format[16];

swfid = SWopen ( "SwathFile.hdf", DFACC_RDWR ); SWid = SWattach ( swfid, "Swath1“ );

/* get Bands */dimsize = SWdiminfo ( SWid, "Bands“ );buffsize = SWgetdimscale ( SWid, "Spectra", "Bands", &dimsize1,

&data_type, NULL );

Page 33: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 33

datbuf_int32 = (int32 *) malloc(buffsize);buffsize = SWgetdimscale ( SWid, "Spectra", "Bands", &dimsize1,

&data_type, (void *)datbuf_int32 );for (i=0; i<dimsize; i++) { printf("i = %d datbuf_int32 = %d\n", i, datbuf_int32[i]); }

/* get str attributes of Bands*/len = 15;status = SWgetdimstrs ( SWid, "Spectra", "Bands",

label, unit, format, len );printf(" \t\tlabel = %s unit = %s format = %s \n\n", label, unit, format);

free(datbuf_int32);datbuf_int32 = NULL;

SWdetach ( SWid ); SWclose ( swfid ); return 0;}

Page 34: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 34

Reading Code Example (HDF-EOS5)#include <HE5_HdfEosDef.h>int main(){ herr_t status = FAIL; hid_t swfid = FAIL, SWid = FAIL, numtype; int i,j, bufsize; int *databuff; long nattr, strbufsize; char *attrlist, *attrname = (char *)NULL; size_t fldnmlen[HE5_HDFE_NAMBUFSIZE]; char *fldnm[HE5_HDFE_NAMBUFSIZE]; hid_t *ntype; hsize_t count = 0; void *attr; int *attr_int; float *attr_flt; char *attr_char; hsize_t dimsize; swfid = HE5_SWopen ( "Swath.h5", H5F_ACC_RDWR ); SWid = HE5_SWattach ( swfid, "Swath1“ );

Page 35: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 35

bufsize = HE5_SWgetdimscale ( SWid, "Spectra", "Bands", &dimsize, &numtype, NULL );

databuff = (int *) malloc(bufsize );bufsize = HE5_SWgetdimscale ( SWid, "Spectra", "Bands", &dimsize,

&numtype, (void *)databuff );

for( i = 0; i < dimsize; i++){ printf ("DscaleVal[%d] = %d\n",i,databuff[i] ); }

nattr = HE5_SWinqdscaleattrs ( SWid, "Bands", NULL, &strbufsize );attrlist = (char *) calloc(strbufsize + 1, sizeof(char));

nattr = HE5_SWinqdscaleattrs ( SWid, "Bands", attrlist, &strbufsize );nattr = HE5_EHparsestr(attrlist, ',', fldnm, fldnmlen);

Page 36: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 36

for( i = 0; i < nattr; i++) { attrname = (char *) calloc(fldnmlen[i] + 1, sizeof(char) ); memmove ( attrname,fldnm[i],fldnmlen[i] ); ntype = (hid_t *) calloc(1, sizeof(hid_t)); if ( strcmp ( attrname, "REFERENCE_LIST") == 0 ) continue; status = HE5_SWdscaleattrinfo ( SWid,"Bands", attrname,

ntype, &count ); if( (int)*ntype == 0) {

attr_int = (int *) malloc(count*sizeof(int));attr = (void *) attr_int; }

if( (int)*ntype == 10) {attr_flt = (float *) malloc(count*sizeof(float));attr = (void *) attr_flt; }

if( (int)*ntype == 57) {attr_char = (char *) malloc((count+1)*sizeof(char));attr = (void *) attr_char; }

status = HE5_SWreaddscaleattr ( SWid,"Bands", attrname, attr ); printf("\tAttribute Name: %s \n",attrname); printf("\tNumber of attr elem: %lu \n", (unsigned long)count); printf("\tData type of attribute: %d \n", (int)*ntype);

Page 37: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 37

if( (int)*ntype == 0) {attr_int = (int *) attr;for (j = 0; j < count; j++) { printf("\tAttrvalue[%d]: %d \n", j,attr_int[j]); }}

if( (int)*ntype == 10) {attr_flt = (float *) attr;for (j = 0; j < count; j++) { printf("\tAttrvalue[%d]: %f \n", j,attr_flt[j]); } }

if( (int)*ntype == 57) {attr_char = (char *) attr;attr_char[count]='\0';printf("\tAttrvalue: %s \n", attr_char);free ( attr_char );}

}

HE5_SWdetach ( SWid ); HE5_SWclose ( swfid ); return 0;}

Page 38: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 38

HDFView 2.4:

uses plug-in with hdf-eos5-1.11, Hdfeos2.15, HDF4.2r3, HDF5-1.6.7

Test File content (Test File content (he2he2))

Page 39: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 39

HDFView 2.4: uses plug-in with

hdf-eos5-1.11, Hdfeos2.15, HDF4.2r3, HDF5-1.6.7

Test File content (Test File content (he5he5))

Page 40: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 40

HDFView 2.6: Without plug-in

HDF4.2r4, HDF5-1.8.3

Test File content (Test File content (he5he5))

Page 41: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 41

Test File content (Test File content (he5he5))HDFView 2.6: uses plug-in with

hdf-eos5-1.12, Hdfeos2.16, HDF4.2r4, HDF5-1.8.3

Page 42: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 42

File content (File content (HIRDLS he5HIRDLS he5))

HIRDLS he5 Modified with

HDF Augmentation

Tool

Page 43: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 43

Suggestions?

– Do we need new APIs ?Do we need new APIs ?

– Improvements for existing APIs ?Improvements for existing APIs ?

– What else? What else?

Page 44: Dimension Scales in HDF-EOS2 and HDF-EOS5

Page 44

Thank You!