[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