[Yt-svn] yt-commit r427 - trunk/yt/lagos
mturk at wrangler.dreamhost.com
mturk at wrangler.dreamhost.com
Fri May 2 09:50:46 PDT 2008
Author: mturk
Date: Fri May 2 09:50:46 2008
New Revision: 427
URL: http://yt.spacepope.org/changeset/427
Log:
Closes #85. Now HDF5 set information can come from the light reader. There
may be some bugs in it, but those will be revealed during testing on real-life
datasets. (None show up in the unit tests.)
Modified:
trunk/yt/lagos/DataReadingFuncs.py
trunk/yt/lagos/HDF5LightReader.c
Modified: trunk/yt/lagos/DataReadingFuncs.py
==============================================================================
--- trunk/yt/lagos/DataReadingFuncs.py (original)
+++ trunk/yt/lagos/DataReadingFuncs.py Fri May 2 09:50:46 2008
@@ -37,12 +37,7 @@
Returns a list of fields associated with the filename
Should *only* be called as EnzoGridInstance.getFields, never as getFields(object)
"""
- fls = []
- file = tables.openFile(self.filename)
- for fl in file.listNodes("/"):
- fls.append(fl.name)
- file.close()
- return fls
+ return HDF5LightReader.ReadListOfDatasets(self.filename, "/")
def readDataHDF4(self, field):
"""
@@ -64,29 +59,8 @@
for set in sets:
self[set] = self.readDataFast(set)
-import gc
def readDataHDF5(self, field):
- t = HDF5LightReader.ReadData(self.filename, "/%s" % field).swapaxes(0,2)
- return t
-
-def tables_readDataHDF5(self, field):
- """
- Reads a field from an HDF5 file. Should only be called as
- EnzoGridInstance.readData()
-
- @param field: field to read
- @type field: string
- """
- f = tables.openFile(self.filename)#, nodeCacheSize=1)
- n = f.getNode("/", field)
- t = n.read().astype("float64")
- try:
- t = t.swapaxes(0,2)
- except:
- pass
- n.close()
- f.close()
- return t
+ return HDF5LightReader.ReadData(self.filename, "/%s" % field).swapaxes(0,2)
def readAllDataHDF5(self):
"""
@@ -135,13 +109,7 @@
return t
def readDataPacked(self, field):
- f = tables.openFile(self.filename,
- rootUEP="/Grid%08i" % (self.id),
- mode='r', nodeCacheSize=1)
- t = f.getNode("/", field).read().astype('float64')
- t = t.swapaxes(0,2)
- f.close()
- return t
+ return HDF5LightReader.ReadData(self.filename, "/Grid%08i/%s" % (self.id, field)).swapaxes(0,2)
def readDataSlicePacked(self, grid, field, sl):
"""
@@ -164,18 +132,10 @@
Returns a list of fields associated with the filename
Should *only* be called as EnzoGridInstance.getFields, never as getFields(object)
"""
- fls = []
- f = tables.openFile(self.filename,
- rootUEP="/Grid%08i" % (self.id),
- mode='r')
- for fl in f.listNodes("/"):
- fls.append(fl.name)
- f.close()
- del f
- return fls
+ return HDF5LightReader.ReadListOfDatasets(self.filename, "/Grid%08i" % self.id)
def getExceptionHDF4():
return SD.HDF4Error
def getExceptionHDF5():
- return exceptions.KeyError
+ return (exceptions.KeyError, HDF5LightReader.ReadingError)
Modified: trunk/yt/lagos/HDF5LightReader.c
==============================================================================
--- trunk/yt/lagos/HDF5LightReader.c (original)
+++ trunk/yt/lagos/HDF5LightReader.c Fri May 2 09:50:46 2008
@@ -37,6 +37,7 @@
static PyObject *_hdf5ReadError;
+herr_t iterate_dataset(hid_t loc_id, const char *name, void *nodelist);
static PyObject *
Py_ReadHDF5DataSet(PyObject *obj, PyObject *args)
@@ -200,8 +201,82 @@
return NULL;
}
+static PyObject *
+Py_ReadListOfDatasets(PyObject *obj, PyObject *args)
+{
+ char *filename, *nodename;
+
+ hid_t file_id;
+ herr_t my_error;
+ htri_t file_exists;
+ H5T_class_t class_id;
+ H5E_auto_t err_func;
+ file_id = 0;
+
+ if (!PyArg_ParseTuple(args, "ss",
+ &filename, &nodename))
+ return PyErr_Format(_hdf5ReadError,
+ "ReadListOfDatasets: Invalid parameters.");
+
+ /* How portable is this? */
+ if (access(filename, R_OK) < 0) {
+ PyErr_Format(_hdf5ReadError,
+ "ReadListOfDatasets: %s does not exist, or no read permissions\n",
+ filename);
+ goto _fail;
+ }
+
+ file_exists = H5Fis_hdf5(filename);
+ if (file_exists == 0) {
+ PyErr_Format(_hdf5ReadError,
+ "ReadListOfDatasets: %s is not an HDF5 file", filename);
+ goto _fail;
+ }
+
+ file_id = H5Fopen (filename, H5F_ACC_RDONLY, H5P_DEFAULT);
+ PyObject *nodelist = PyList_New(0);
+ if (nodelist == NULL) {
+ PyErr_Format(_hdf5ReadError,
+ "ReadListOfDatasets: List couldn't be made!");
+ goto _fail;
+ }
+
+ my_error = H5Giterate(file_id, nodename, NULL, iterate_dataset, (void *) nodelist);
+ H5Fclose(file_id);
+ if (my_error) {
+ PyErr_Format(_hdf5ReadError,
+ "ReadListOfDatasets: Problem iterating over HDF5 set.");
+ goto _fail;
+ }
+
+ PyObject *return_value = Py_BuildValue("N", nodelist);
+ return return_value;
+
+ _fail:
+ Py_XDECREF(nodelist);
+ if(!(file_id <= 0)&&(H5Iget_ref(file_id))) H5Fclose(file_id);
+ return NULL;
+
+}
+
+herr_t iterate_dataset(hid_t loc_id, const char *name, void *nodelist)
+{
+ H5G_stat_t statbuf;
+ PyObject* node_name, node_list;
+
+ H5Gget_objinfo(loc_id, name, 0, &statbuf);
+ if (statbuf.type == H5G_DATASET) {
+ node_name = PyString_FromString(name);
+ if (node_name == NULL) {return -1;}
+ if (PyList_Append((PyObject *)nodelist, node_name)) {return -1;}
+ }
+ return 0;
+};
+
+
static PyMethodDef _hdf5LightReaderMethods[] = {
{"ReadData", Py_ReadHDF5DataSet, METH_VARARGS},
+ {"ReadListOfDatasets", Py_ReadListOfDatasets, METH_VARARGS},
{NULL, NULL}
};
More information about the yt-svn
mailing list