From 46727a87a533682d1f17201871f2455702f0ae72 Mon Sep 17 00:00:00 2001 From: Jim Schaff Date: Wed, 24 Apr 2024 12:53:00 -0400 Subject: [PATCH] combine Hdf5Reader into ChomboFileReader --- .../org/vcell/vis/io/ChomboFileReader.java | 244 +++++++++++++++--- .../java/org/vcell/vis/io/Hdf5Reader.java | 195 -------------- 2 files changed, 213 insertions(+), 226 deletions(-) delete mode 100644 vcell-core/src/main/java/org/vcell/vis/io/Hdf5Reader.java diff --git a/vcell-core/src/main/java/org/vcell/vis/io/ChomboFileReader.java b/vcell-core/src/main/java/org/vcell/vis/io/ChomboFileReader.java index 2034ae1d62..4627e0053b 100644 --- a/vcell-core/src/main/java/org/vcell/vis/io/ChomboFileReader.java +++ b/vcell-core/src/main/java/org/vcell/vis/io/ChomboFileReader.java @@ -1,10 +1,15 @@ package org.vcell.vis.io; import java.io.File; +import java.util.ArrayList; import java.util.List; +import java.util.StringTokenizer; +import java.util.Vector; import javax.swing.tree.DefaultMutableTreeNode; +import ncsa.hdf.object.h5.H5CompoundDS; +import ncsa.hdf.object.h5.H5ScalarDS; import org.vcell.vis.chombo.ChomboBoundaries; import org.vcell.vis.chombo.ChomboBoundaries.BorderCellInfo; import org.vcell.vis.chombo.ChomboBoundaries.MeshMetrics; @@ -34,7 +39,78 @@ public class ChomboFileReader { private static final String MESH_ATTR_DIMENSION = "dimension"; private static final String MESH_ATTR_ORIGIN = "origin"; private static final String MESH_ATTR_EXTENT = "extent"; - + + + /** + * Z = boolean + [B = byte + [S = short + [I = int + [J = long + [F = float + [D = double + [C = char + [L = any non-primitives(Object) + * @author schaff + * + */ + static abstract class DataColumn { + private String colName; + public DataColumn(String name){ + this.colName = name; + } + public abstract int getNumRows(); + public abstract double getValue(int index); + } + + static class IntColumn extends DataColumn { + int[] data; + public IntColumn(String name, int[] data){ + super(name); + this.data = data; + } + @Override + public int getNumRows(){ + return data.length; + } + @Override + public double getValue(int index){ + return data[index]; + } + } + + static class LongColumn extends DataColumn { + long[] data; + public LongColumn(String name, long[] data){ + super(name); + this.data = data; + } + @Override + public int getNumRows(){ + return data.length; + } + @Override + public double getValue(int index){ + return data[index]; + } + } + + static class DoubleColumn extends DataColumn { + double[] data; + public DoubleColumn(String name, double[] data){ + super(name); + this.data = data; + } + @Override + public int getNumRows(){ + return data.length; + } + @Override + public double getValue(int index){ + return data[index]; + } + } + private static ChomboMeshData readMesh(String meshFileName, String vol0FileName) throws Exception{ ChomboMesh chomboMesh = new ChomboMesh(); @@ -52,11 +128,11 @@ private static ChomboMeshData readMesh(String meshFileName, String vol0FileName) DefaultMutableTreeNode meshRootNode = (DefaultMutableTreeNode)meshFile.getRootNode(); Group meshRootGroup = (Group)meshRootNode.getUserObject(); - Group meshGroup = Hdf5Reader.getChildGroup(meshRootGroup,"mesh"); + Group meshGroup = getChildGroup(meshRootGroup,"mesh"); - chomboMesh.setDimension(Hdf5Reader.getIntAttribute(meshGroup,MESH_ATTR_DIMENSION)); - chomboMesh.setExtent(Hdf5Reader.getVect3DAttribute(meshGroup,MESH_ATTR_EXTENT,1.0)); - chomboMesh.setOrigin(Hdf5Reader.getVect3DAttribute(meshGroup,MESH_ATTR_ORIGIN,0.0)); + chomboMesh.setDimension(getIntAttribute(meshGroup,MESH_ATTR_DIMENSION)); + chomboMesh.setExtent(getVect3DAttribute(meshGroup,MESH_ATTR_EXTENT,1.0)); + chomboMesh.setOrigin(getVect3DAttribute(meshGroup,MESH_ATTR_ORIGIN,0.0)); // it's very wasteful here, but what can I do? CartesianMeshChombo cartesianMeshChombo = CartesianMeshChombo.readMeshFile(new File(meshFileName)); @@ -65,10 +141,10 @@ private static ChomboMeshData readMesh(String meshFileName, String vol0FileName) chomboMesh.addFeaturePhase(fpv.feature, fpv.iphase); } - //Hdf5Reader.DataColumn[] metricsColumns = Hdf5Reader.getDataTable(meshGroup,METRICS_DATASET); + //DataColumn[] metricsColumns = getDataTable(meshGroup,METRICS_DATASET); if (chomboMesh.getDimension()==2){ - Hdf5Reader.DataColumn[] segmentColumns = Hdf5Reader.getDataTable(meshGroup,"segments"); - Hdf5Reader.DataColumn[] verticesColumns = Hdf5Reader.getDataTable(meshGroup,"vertices"); + DataColumn[] segmentColumns = getDataTable(meshGroup,"segments"); + DataColumn[] verticesColumns = getDataTable(meshGroup,"vertices"); ChomboBoundaries boundaries = chomboMesh.getBoundaries(); int numVertices = verticesColumns[0].getNumRows(); int numSegments = segmentColumns[0].getNumRows(); @@ -85,7 +161,7 @@ private static ChomboMeshData readMesh(String meshFileName, String vol0FileName) boundaries.addSegment(new ChomboBoundaries.Segment(chomboIndex, v1, v2)); } }else if (chomboMesh.getDimension()==3){ - Hdf5Reader.DataColumn[] surfaceTriangleColumns = Hdf5Reader.getDataTable(meshGroup,"surface triangles"); + DataColumn[] surfaceTriangleColumns = getDataTable(meshGroup,"surface triangles"); ChomboBoundaries boundaries = chomboMesh.getBoundaries(); int numTriangles = surfaceTriangleColumns[0].getNumRows(); for (int row=0;row children = vcellGroup.getMemberList(); @@ -267,4 +343,110 @@ private static void readMembraneVarData(ChomboMeshData chomboMeshData, Group roo } } } + + private static Attribute getAttribute(Group group, String name) throws Exception{ + List attributes = group.getMetadata(); + for (Attribute attr : attributes){ + if (attr.getName().equals(name)){ + return attr; + } + } + throw new RuntimeException("failed to find attribute "+name); + } + + private static double getDoubleAttribute(Group group, String name) throws Exception{ + Attribute attr = getAttribute(group,name); + return ((double[])attr.getValue())[0]; + } + + private static float getFloatAttribute(Group group, String name) throws Exception{ + Attribute attr = getAttribute(group,name); + return ((float[])attr.getValue())[0]; + } + + private static int getIntAttribute(Group group, String name) throws Exception{ + Attribute attr = getAttribute(group,name); + return ((int[])attr.getValue())[0]; + } + + private static String getStringAttribute(Group group, String name) throws Exception{ + Attribute attr = getAttribute(group,name); + return ((String[])attr.getValue())[0]; + } + + private static Vect3D getVect3DAttribute(Group group, String name, double defaultZ) throws Exception{ + String str = getStringAttribute(group, name); + return parseAttrString(str,defaultZ); + } + + private static Group getChildGroup(Group group, String name){ + List memberList = group.getMemberList(); + for (HObject member : memberList) { + if (member.getName().equals(name)){ + if (member instanceof Group) { + return (Group)member; + }else{ + throw new RuntimeException("expecting type Group for group member '"+name+"'"); + } + } + } + throw new RuntimeException("child group '"+name+"' not found"); + } + + private static DataColumn[] getDataTable(Group group, String name) throws Exception{ + List memberList = group.getMemberList(); + for (HObject member : memberList) { + if (member.getName().equals(name)){ + if (member instanceof H5CompoundDS) { + H5CompoundDS compoundDataSet = (H5CompoundDS) member; + Vector columnValueArrays = (Vector)compoundDataSet.read(); + String[] columnNames = compoundDataSet.getMemberNames(); + ArrayList dataColumns = new ArrayList(); + for (int c=0;c valueList = new ArrayList(); + while (st.hasMoreTokens()) + { + String token = st.nextToken(); + valueList.add(Double.parseDouble(token)); + } + if (valueList.size()==2){ + return new Vect3D(valueList.get(0),valueList.get(1),defaultZ); + }else if (valueList.size()==3){ + return new Vect3D(valueList.get(0),valueList.get(1),valueList.get(2)); + }else{ + throw new RuntimeException("cannot parse, unexpected array size "+valueList.size()); + } + } } diff --git a/vcell-core/src/main/java/org/vcell/vis/io/Hdf5Reader.java b/vcell-core/src/main/java/org/vcell/vis/io/Hdf5Reader.java deleted file mode 100644 index 619ccc4061..0000000000 --- a/vcell-core/src/main/java/org/vcell/vis/io/Hdf5Reader.java +++ /dev/null @@ -1,195 +0,0 @@ -package org.vcell.vis.io; - -import java.util.ArrayList; -import java.util.List; -import java.util.StringTokenizer; -import java.util.Vector; - -import org.vcell.vis.core.Vect3D; - -import ncsa.hdf.object.Attribute; -import ncsa.hdf.object.Group; -import ncsa.hdf.object.HObject; -import ncsa.hdf.object.h5.H5CompoundDS; -import ncsa.hdf.object.h5.H5ScalarDS; - -public class Hdf5Reader { - - /** - * Z = boolean - [B = byte - [S = short - [I = int - [J = long - [F = float - [D = double - [C = char - [L = any non-primitives(Object) - * @author schaff - * - */ - public static abstract class DataColumn { - private String colName; - public DataColumn(String name){ - this.colName = name; - } - public abstract int getNumRows(); - public abstract double getValue(int index); - } - - public static class IntColumn extends DataColumn { - int[] data; - public IntColumn(String name, int[] data){ - super(name); - this.data = data; - } - @Override - public int getNumRows(){ - return data.length; - } - @Override - public double getValue(int index){ - return data[index]; - } - } - - public static class LongColumn extends DataColumn { - long[] data; - public LongColumn(String name, long[] data){ - super(name); - this.data = data; - } - @Override - public int getNumRows(){ - return data.length; - } - @Override - public double getValue(int index){ - return data[index]; - } - } - - public static class DoubleColumn extends DataColumn { - double[] data; - public DoubleColumn(String name, double[] data){ - super(name); - this.data = data; - } - @Override - public int getNumRows(){ - return data.length; - } - @Override - public double getValue(int index){ - return data[index]; - } - } - - public static Attribute getAttribute(Group group, String name) throws Exception{ - List attributes = group.getMetadata(); - for (Attribute attr : attributes){ - if (attr.getName().equals(name)){ - return attr; - } - } - throw new RuntimeException("failed to find attribute "+name); - } - - public static double getDoubleAttribute(Group group, String name) throws Exception{ - Attribute attr = getAttribute(group,name); - return ((double[])attr.getValue())[0]; - } - - public static float getFloatAttribute(Group group, String name) throws Exception{ - Attribute attr = getAttribute(group,name); - return ((float[])attr.getValue())[0]; - } - - public static int getIntAttribute(Group group, String name) throws Exception{ - Attribute attr = getAttribute(group,name); - return ((int[])attr.getValue())[0]; - } - - public static String getStringAttribute(Group group, String name) throws Exception{ - Attribute attr = getAttribute(group,name); - return ((String[])attr.getValue())[0]; - } - - public static Vect3D getVect3DAttribute(Group group, String name, double defaultZ) throws Exception{ - String str = getStringAttribute(group, name); - return parseAttrString(str,defaultZ); - } - - public static Group getChildGroup(Group group, String name){ - List memberList = group.getMemberList(); - for (HObject member : memberList) { - if (member.getName().equals(name)){ - if (member instanceof Group) { - return (Group)member; - }else{ - throw new RuntimeException("expecting type Group for group member '"+name+"'"); - } - } - } - throw new RuntimeException("child group '"+name+"' not found"); - } - - public static Hdf5Reader.DataColumn[] getDataTable(Group group, String name) throws Exception{ - List memberList = group.getMemberList(); - for (HObject member : memberList) { - if (member.getName().equals(name)){ - if (member instanceof H5CompoundDS) { - H5CompoundDS compoundDataSet = (H5CompoundDS) member; - Vector columnValueArrays = (Vector)compoundDataSet.read(); - String[] columnNames = compoundDataSet.getMemberNames(); - ArrayList dataColumns = new ArrayList(); - for (int c=0;c valueList = new ArrayList(); - while (st.hasMoreTokens()) - { - String token = st.nextToken(); - valueList.add(Double.parseDouble(token)); - } - if (valueList.size()==2){ - return new Vect3D(valueList.get(0),valueList.get(1),defaultZ); - }else if (valueList.size()==3){ - return new Vect3D(valueList.get(0),valueList.get(1),valueList.get(2)); - }else{ - throw new RuntimeException("cannot parse, unexpected array size "+valueList.size()); - } - } - - -}