Example #1
0
static void show (const HDF5::Object& obj, int indentLevel = 0) {
  if (obj.getType () == H5I_DATASET) {
    indent (indentLevel);
    Core::OStream::getStdout () << "DATASET" << std::endl;
    HDF5::DataSet ds = (HDF5::DataSet) obj;
    HDF5::DataSetCreatePropList cp = ds.createPropList ();
    HDF5::DataSetAccessPropList ap = ds.accessPropList ();
    int nfilter = HDF5::Exception::check ("H5Pget_nfilters", H5Pget_nfilters (cp.handle ()));
    indent (indentLevel);
    Core::OStream::getStdout ().fprintf ("filters: %s\n", nfilter);
    for (int j = 0; j < nfilter; j++) {
      unsigned int flags;
      unsigned int filter_config;
      size_t cd_nelemts = 0;
      char name[1024];
      H5Z_filter_t filter = HDF5::Exception::check ("H5Pget_filter2", H5Pget_filter2 (cp.handle (), j, &flags, &cd_nelemts, NULL, sizeof (name) / sizeof (*name), name, &filter_config));
      std::vector<unsigned int> cd_values (cd_nelemts);
      filter = HDF5::Exception::check ("H5Pget_filter2", H5Pget_filter2 (cp.handle (), j, &flags, &cd_nelemts, cd_values.data (), sizeof (name) / sizeof (*name), name, &filter_config));
      indent (indentLevel + 1);
      Core::OStream::getStdout ().fprintf ("filter '%s' filter=%s flags=%s config=%s\n", name, filter, flags, filter_config);
      BOOST_FOREACH (unsigned int value, cd_values) {
        indent (indentLevel + 2);
        Core::OStream::getStdout ().fprintf ("parameter %s\n", value);
      }
    }
Example #2
0
//--------------------------------------------------------------------------
// Function:	DSetCreatPropList::getFilter
///\brief	Returns information about a filter in a pipeline
///\param	filter_number  - IN: Filter to get, range [0..N-1], where
///				     N is returned by H5Pget_nfilters()
///\param	flags         - OUT: General properties of the filter
///\param	cd_nelmts  - IN/OUT: Number of elements in \a cd_values /Number
///				     of values defined by the filter
///\param	cd_values     - OUT: Array to hold the data; allocated by the user
///\param	namelen       - OUT: Length of \a name
///\param	name          - OUT: Name of the filter
///\param	filter_config - OUT: Flags indicating whether filter can encode/decode
///\return	Filter id
///\exception	H5::PropListIException
///\par Description
///		Failure occurs when \a filter_number is out of range.
//--------------------------------------------------------------------------
H5Z_filter_t DSetCreatPropList::getFilter(int filter_number,
	unsigned int &flags, size_t &cd_nelmts, unsigned int* cd_values,
	size_t namelen, char name[], unsigned int& filter_config) const
{
   H5Z_filter_t filter_id;
   filter_id = H5Pget_filter2(id, filter_number, &flags, &cd_nelmts,
				cd_values, namelen, name, &filter_config);
   if( filter_id == H5Z_FILTER_ERROR )
      throw PropListIException("DSetCreatPropList::getFilter",
                "H5Pget_filter2 returned H5Z_FILTER_ERROR");
   else
      return(filter_id);
}
static
int verify_filters(hid_t pid, hid_t tid, int nfilters, filter_info_t *filter)
{
    int           nfilters_dcpl;  /* number of filters in DCPL*/
    unsigned      filt_flags;     /* filter flags */
    H5Z_filter_t  filtn;          /* filter identification number */
    unsigned      cd_values[20];  /* filter client data values */
    size_t        cd_nelmts;      /* filter client number of values */
    char          f_name[256];    /* filter name */
    size_t        size;           /* type size */
    int           i;              /* index */
    unsigned      j;              /* index */

    /* get information about filters */
    if((nfilters_dcpl = H5Pget_nfilters(pid)) < 0)
        return -1;

    /* if we do not have filters and the requested filter is NONE, return 1 */
    if(!nfilters_dcpl &&
        nfilters == 1 &&
        filter[0].filtn == H5Z_FILTER_NONE )
        return 1;

    /* else the numbers of filters must match */
    if (nfilters_dcpl != nfilters )
        return 0;

    /*-------------------------------------------------------------------------
     * build a list with DCPL filters
     *-------------------------------------------------------------------------
     */

    for( i = 0; i < nfilters_dcpl; i++)
    {
        cd_nelmts = NELMTS(cd_values);
        filtn = H5Pget_filter2(pid, (unsigned)i, &filt_flags, &cd_nelmts,
            cd_values, sizeof(f_name), f_name, NULL);

        /* filter ID */
        if (filtn != filter[i].filtn)
            return 0;

        /* compare client data values. some filters do return local values */
        switch (filtn)
        {

            case H5Z_FILTER_NONE:
            break;

            case H5Z_FILTER_SHUFFLE:
                /* 1 private client value is returned by DCPL */
                if ( cd_nelmts != H5Z_SHUFFLE_TOTAL_NPARMS && filter[i].cd_nelmts != H5Z_SHUFFLE_USER_NPARMS )
                    return 0;

                /* get dataset's type size */
                if((size = H5Tget_size(tid)) <= 0)
                    return -1;

                /* the private client value holds the dataset's type size */
                if ( size != cd_values[0] )
                    return 0;

                break;

            case H5Z_FILTER_SZIP:
                /* 4 private client values are returned by DCPL */
                if ( cd_nelmts != H5Z_SZIP_TOTAL_NPARMS && filter[i].cd_nelmts != H5Z_SZIP_USER_NPARMS )
                    return 0;

                /* "User" parameter for pixels-per-block (index 1) */
                if ( cd_values[H5Z_SZIP_PARM_PPB] != filter[i].cd_values[H5Z_SZIP_PARM_PPB] )
                    return 0;

                break;

            case H5Z_FILTER_NBIT:
                /* only client data values number of values checked */
                if ( H5Z_NBIT_USER_NPARMS != filter[i].cd_nelmts)
                    return 0;
                break;

            case H5Z_FILTER_SCALEOFFSET:
                /* only client data values checked */
                for( j = 0; j < H5Z_SCALEOFFSET_USER_NPARMS; j++)
                    if (cd_values[j] != filter[i].cd_values[j])
                        return 0;
                break;

            /* for these filters values must match, no local values set in DCPL */
            case H5Z_FILTER_FLETCHER32:
            case H5Z_FILTER_DEFLATE:

                if ( cd_nelmts != filter[i].cd_nelmts)
                    return 0;

                for( j = 0; j < cd_nelmts; j++)
                    if (cd_values[j] != filter[i].cd_values[j])
                        return 0;

                break;

            default:
                if ( cd_nelmts != filter[i].cd_nelmts)
                    return 0;

                for( j = 0; j < cd_nelmts; j++)
                    if (cd_values[j] != filter[i].cd_values[j])
                        return 0;
                break;

        } /* switch */
    }

    return 1;
}
Example #4
0
/*-------------------------------------------------------------------------
 * Function: dataset_stats
 *
 * Purpose: Gather statistics about the dataset
 *
 * Return:  Success: 0
 *
 *          Failure: -1
 *
 * Programmer:    Quincey Koziol
 *                Tuesday, August 16, 2005
 *
 *-------------------------------------------------------------------------
 */
static herr_t
dataset_stats(iter_t *iter, const char *name, const H5O_info_t *oi)
{
    unsigned     bin;               /* "bin" the number of objects falls in */
    hid_t     did;               /* Dataset ID */
    hid_t     sid;               /* Dataspace ID */
    hid_t     tid;               /* Datatype ID */
    hid_t     dcpl;              /* Dataset creation property list ID */
    hsize_t     dims[H5S_MAX_RANK];/* Dimensions of dataset */
    H5D_layout_t   lout;              /* Layout of dataset */
    unsigned     type_found;        /* Whether the dataset's datatype was */
                                         /* already found */
    int     ndims;             /* Number of dimensions of dataset */
    hsize_t     storage;           /* Size of dataset storage */
    unsigned     u;                 /* Local index variable */
    int     num_ext;           /* Number of external files for a dataset */
    int     nfltr;             /* Number of filters for a dataset */
    H5Z_filter_t  fltr;              /* Filter identifier */
    herr_t     ret;

    /* Gather statistics about this type of object */
    iter->uniq_dsets++;

    /* Get object header information */
    iter->dset_ohdr_info.total_size += oi->hdr.space.total;
    iter->dset_ohdr_info.free_size += oi->hdr.space.free;

    did = H5Dopen2(iter->fid, name, H5P_DEFAULT);
    HDassert(did > 0);

    /* Update dataset metadata info */
    iter->datasets_index_storage_size += oi->meta_size.obj.index_size;
    iter->datasets_heap_storage_size += oi->meta_size.obj.heap_size;

    /* Update attribute metadata info */
    ret = attribute_stats(iter, oi);
    HDassert(ret >= 0);

    /* Get storage info */
    storage = H5Dget_storage_size(did);

    /* Gather layout statistics */
    dcpl = H5Dget_create_plist(did);
    HDassert(dcpl > 0);

    lout = H5Pget_layout(dcpl);
    HDassert(lout >= 0);

    /* Object header's total size for H5D_COMPACT layout includes raw data size */
    /* "storage" also includes H5D_COMPACT raw data size */
    if(lout == H5D_COMPACT)
        iter->dset_ohdr_info.total_size -= storage;

    /* Track the layout type for dataset */
    (iter->dset_layouts[lout])++;

    /* Get the number of external files for the dataset */
    num_ext = H5Pget_external_count(dcpl);
    assert (num_ext >= 0);

    /* Accumulate raw data size accordingly */
    if(num_ext) {
        iter->nexternal += (unsigned long)num_ext;
        iter->dset_external_storage_size += (unsigned long)storage;
    } else
        iter->dset_storage_size += storage;

    /* Gather dataspace statistics */
    sid = H5Dget_space(did);
    HDassert(sid > 0);

    ndims = H5Sget_simple_extent_dims(sid, dims, NULL);
    HDassert(ndims >= 0);

    /* Check for larger rank of dataset */
    if((unsigned)ndims > iter->max_dset_rank)
        iter->max_dset_rank = (unsigned)ndims;

    /* Track the number of datasets with each rank */
    (iter->dset_rank_count[ndims])++;

    /* Only gather dim size statistics on 1-D datasets */
    if(ndims == 1) {
       iter->max_dset_dims = dims[0];
       if(dims[0] < SIZE_SMALL_DSETS)
           (iter->small_dset_dims[(size_t)dims[0]])++;

       /* Add dim count to proper bin */
       bin = ceil_log10((unsigned long)dims[0]);
       if((bin + 1) > iter->dset_dim_nbins) {
          /* Allocate more storage for info about dataset's datatype */
          iter->dset_dim_bins = (unsigned long *)HDrealloc(iter->dset_dim_bins, (bin + 1) * sizeof(unsigned long));
          HDassert(iter->dset_dim_bins);

          /* Initialize counts for intermediate bins */
          while(iter->dset_dim_nbins < bin)
              iter->dset_dim_bins[iter->dset_dim_nbins++] = 0;
          iter->dset_dim_nbins++;

          /* Initialize count for this bin */
          iter->dset_dim_bins[bin] = 1;
        } /* end if */
        else
            (iter->dset_dim_bins[bin])++;
    } /* end if */

    ret = H5Sclose(sid);
    HDassert(ret >= 0);

    /* Gather datatype statistics */
    tid = H5Dget_type(did);
    HDassert(tid > 0);

    type_found = FALSE;
    for(u = 0; u < iter->dset_ntypes; u++)
        if(H5Tequal(iter->dset_type_info[u].tid, tid) > 0) {
            type_found = TRUE;
            break;
        } /* end for */
    if(type_found)
         (iter->dset_type_info[u].count)++;
    else {
        unsigned curr_ntype = iter->dset_ntypes;

        /* Increment # of datatypes seen for datasets */
        iter->dset_ntypes++;

        /* Allocate more storage for info about dataset's datatype */
        iter->dset_type_info = (dtype_info_t *)HDrealloc(iter->dset_type_info, iter->dset_ntypes * sizeof(dtype_info_t));
        HDassert(iter->dset_type_info);

        /* Initialize information about datatype */
        iter->dset_type_info[curr_ntype].tid = H5Tcopy(tid);
        HDassert(iter->dset_type_info[curr_ntype].tid > 0);
        iter->dset_type_info[curr_ntype].count = 1;
        iter->dset_type_info[curr_ntype].named = 0;

        /* Set index for later */
        u = curr_ntype;
    } /* end else */

    /* Check if the datatype is a named datatype */
    if(H5Tcommitted(tid) > 0)
        (iter->dset_type_info[u].named)++;

    ret = H5Tclose(tid);
    HDassert(ret >= 0);

    /* Track different filters */
    if((nfltr = H5Pget_nfilters(dcpl)) >= 0) {
       if(nfltr == 0)
           iter->dset_comptype[0]++;
        for(u = 0; u < (unsigned)nfltr; u++) {
            fltr = H5Pget_filter2(dcpl, u, 0, 0, 0, 0, 0, NULL);
            if(fltr >= 0) {
                if(fltr < (H5_NFILTERS_IMPL - 1))
                    iter->dset_comptype[fltr]++;
                else
                    iter->dset_comptype[H5_NFILTERS_IMPL - 1]++; /*other filters*/
            } /* end if */
        } /* end for */
    } /* endif nfltr */

     ret = H5Pclose(dcpl);
     HDassert(ret >= 0);

     ret = H5Dclose(did);
     HDassert(ret >= 0);

     return 0;
}  /* end dataset_stats() */
/*-------------------------------------------------------------------------
 * Function: h5tools_canreadf
 *
 * Purpose: check if the dataset creation property list has filters that
 * are not registered in the current configuration
 * 1) the external filters GZIP and SZIP might not be available
 * 2) the internal filters might be turned off
 *
 * Return: 1, can read, 0, cannot, -1 error
 *
 * Programmer: Pedro Vicente, [email protected]
 *
 * Date: March 1, 2004
 *
 *-------------------------------------------------------------------------
 */
int h5tools_canreadf(const char* name, /* object name, serves also as boolean print */
                     hid_t dcpl_id)    /* dataset creation property list */
{

    int          nfilters;       /* number of filters */
    H5Z_filter_t filtn;          /* filter identification number */
    int          i;              /* index */


    /* get information about filters */
    if ((nfilters = H5Pget_nfilters(dcpl_id))<0)
        return -1;

    /* if we do not have filters, we can read the dataset safely */
    if (!nfilters)
        return 1;

    /* check availability of filters */
    for(i = 0; i < nfilters; i++)
    {
        if((filtn = H5Pget_filter2(dcpl_id, (unsigned)i, 0, 0, 0, 0, 0, NULL)) < 0)
            return -1;

        switch(filtn)
        {
        /*-------------------------------------------------------------------------
         * user defined filter
         *-------------------------------------------------------------------------
         */
        default:
            if(name)
                print_warning(name, "user defined");
            return 0;

        /*-------------------------------------------------------------------------
         * H5Z_FILTER_DEFLATE      1 , deflation like gzip
         *-------------------------------------------------------------------------
         */
        case H5Z_FILTER_DEFLATE:
#ifndef H5_HAVE_FILTER_DEFLATE
            if (name)
                print_warning(name,"deflate");
            return 0;
#endif
            break;
        /*-------------------------------------------------------------------------
         * H5Z_FILTER_SZIP       4 , szip compression
         *-------------------------------------------------------------------------
         */
        case H5Z_FILTER_SZIP:
#ifndef H5_HAVE_FILTER_SZIP
            if (name)
                print_warning(name,"SZIP");
            return 0;
#endif
            break;
        /*-------------------------------------------------------------------------
         * H5Z_FILTER_SHUFFLE    2 , shuffle the data
         *-------------------------------------------------------------------------
         */
        case H5Z_FILTER_SHUFFLE:
#ifndef H5_HAVE_FILTER_SHUFFLE
            if (name)
                print_warning(name,"shuffle");
            return 0;
#endif
            break;
        /*-------------------------------------------------------------------------
         * H5Z_FILTER_FLETCHER32 3 , fletcher32 checksum of EDC
         *-------------------------------------------------------------------------
         */
        case H5Z_FILTER_FLETCHER32:
#ifndef H5_HAVE_FILTER_FLETCHER32
            if (name)
                print_warning(name,"fletcher32");
            return 0;
#endif
            break;
        /*-------------------------------------------------------------------------
         * H5Z_FILTER_NBIT
         *-------------------------------------------------------------------------
         */
        case H5Z_FILTER_NBIT:
#ifndef H5_HAVE_FILTER_NBIT
            if (name)
                print_warning(name,"nbit");
            return 0;
#endif
            break;
        /*-------------------------------------------------------------------------
         * H5Z_FILTER_SCALEOFFSET
         *-------------------------------------------------------------------------
         */
        case H5Z_FILTER_SCALEOFFSET:
#ifndef H5_HAVE_FILTER_SCALEOFFSET
            if (name)
                print_warning(name,"scaleoffset");
            return 0;
#endif
            break;
        }/*switch*/
    }/*for*/

    return 1;
}