package fr.unistra.pelican.algorithms.io;
import fr.unistra.pelican.*;
import fr.unistra.pelican.algorithms.visualisation.Viewer2D;
import java.util.ArrayList;
import java.util.List;
import ncsa.hdf.hdf5lib.exceptions.HDF5Exception;
import ncsa.hdf.object.*; // the common object package
import ncsa.hdf.object.h5.*; // the HDF5 implementation
/**
* Loads HDF5 images. Inspired from the ImageJ plug-in from LMB group in
* Freiburg
*
* @author Lefevre
*/
public class HdfImageLoad extends Algorithm {
/**
* Input parameter
*/
public String filename;
/**
* The image index to load within the input file
*/
public int index = 0;
/**
* Output parameter
*/
public Image output;
private static int xDim = 1;
private static int yDim = 1;
private static int zDim = 1;
private static int tDim = 1;
private static int bDim = 1;
/**
* Constructor
*
*/
public HdfImageLoad() {
super.inputs = "filename";
super.options = "index";
super.outputs = "output";
}
/**
* Loads HDF5 images.
*
* @param filename
* Filename of the HDF5 image.
* @return The HDF image.
*/
public static Image exec(String filename) {
return (Image) new HdfImageLoad().process(filename);
}
public static Image exec(String filename, int index) {
return (Image) new HdfImageLoad().process(filename, index);
}
public void launch() {
// Ouverture du fichier
H5File inFile = null;
inFile = new H5File(filename, H5File.READ);
try {
inFile.open();
} catch (Exception e1) {
e1.printStackTrace();
}
// Affichage des métadonnées
Group rootNode = (Group) ((javax.swing.tree.DefaultMutableTreeNode) inFile
.getRootNode()).getUserObject();
List<Dataset> varList = getDataSetList(rootNode,
new ArrayList<Dataset>());
for (int i = 0; i < varList.size(); ++i) {
Dataset var = varList.get(i);
int rank = var.getRank();
String title = rank + "D: " + var.getFullName() + " "
+ var.getDatatype().getDatatypeDescription() + "( ";
long[] extent = var.getDims();
for (int d = 0; d < rank; ++d) {
if (d != 0)
title += "x";
title += extent[d];
}
title += ")";
System.out.println(title);
}
// Lecture des paramètres pour le chargement
Dataset var = varList.get(index);
int rank = var.getRank();
Datatype datatype = var.getDatatype();
long[] extent = var.getDims();
System.out.println("Reading Variable: " + var.getName());
System.out.println(" Rank = " + rank + ", Data-type = "
+ datatype.getDatatypeDescription());
System.out.println(" Data-type class = "
+ datatype.getDatatypeClass() + ", Data-type size = "
+ datatype.getDatatypeSize());
System.out.print(" Extent in px (level,row,col):");
for (int d = 0; d < rank; ++d)
System.out.print(" " + extent[d]);
System.out.println("");
long[] selected = var.getSelectedDims();
for (int k = 0; k < selected.length; k++)
selected[k] = extent[k];
// Initialisation des dimensions
if (extent.length >= 3) {
xDim = (int) extent[2];
yDim = (int) extent[1];
zDim = (int) extent[0];
}
if (extent.length == 4) {
bDim = (int) extent[3];
}
// Construction de l'image
Object dataObject = null;
try {
dataObject = var.read();
} catch (Exception e) {
e.printStackTrace();
}
// System.out.println(dataObject);
if (dataObject instanceof byte[]) {
output = new ByteImage(xDim, yDim, zDim, tDim, bDim);
byte[] data = (byte[]) dataObject;
int k = 0;
for (int t = 0; t < tDim; t++)
for (int z = 0; z < zDim; z++)
for (int y = 0; y < yDim; y++)
for (int x = 0; x < xDim; x++)
for (int b = 0; b < bDim; b++)
output.setPixelXYZTBByte(x, y, z, t, b,
(int) data[k++]);
}
else if (dataObject instanceof int[]) {
output = new IntegerImage(xDim, yDim, zDim, tDim, bDim);
int[] data = (int[]) dataObject;
int k = 0;
for (int t = 0; t < tDim; t++)
for (int z = 0; z < zDim; z++)
for (int y = 0; y < yDim; y++)
for (int x = 0; x < xDim; x++)
for (int b = 0; b < bDim; b++)
output.setPixelXYZTBInt(x, y, z, t, b,
(int) data[k++]);
}
else if (dataObject instanceof short[]) {
output = new IntegerImage(xDim, yDim, zDim, tDim, bDim);
short[] data = (short[]) dataObject;
int k = 0;
for (int t = 0; t < tDim; t++)
for (int z = 0; z < zDim; z++)
for (int y = 0; y < yDim; y++)
for (int x = 0; x < xDim; x++)
for (int b = 0; b < bDim; b++)
output.setPixelXYZTBInt(x, y, z, t, b,
(int) data[k++]);
}
else if (dataObject instanceof double[]) {
output = new DoubleImage(xDim, yDim, zDim, tDim, bDim);
double[] data = (double[]) dataObject;
int k = 0;
for (int t = 0; t < tDim; t++)
for (int z = 0; z < zDim; z++)
for (int y = 0; y < yDim; y++)
for (int x = 0; x < xDim; x++)
for (int b = 0; b < bDim; b++)
output.setPixelXYZTBDouble(x, y, z, t, b,
(double) data[k++]);
}
else if (dataObject instanceof float[]) {
output = new DoubleImage(xDim, yDim, zDim, tDim, bDim);
float[] data = (float[]) dataObject;
int k = 0;
for (int t = 0; t < tDim; t++)
for (int z = 0; z < zDim; z++)
for (int y = 0; y < yDim; y++)
for (int x = 0; x < xDim; x++)
for (int b = 0; b < bDim; b++)
output.setPixelXYZTBDouble(x, y, z, t, b,
(double) data[k++]);
}
else {
System.err.print("datatype not yet supported for :"+dataObject+" (");
if (dataObject.getClass().isArray())
System.err.print(dataObject.getClass().getComponentType());
else System.err.print(dataObject.getClass());
System.err.println(")");
}
// Mise en couleur si nécessaire
if (bDim == 3)
output.setColor(true);
// Fermeture du fichier
try {
inFile.close();
} catch (HDF5Exception e) {
e.printStackTrace();
}
}
private static List<Dataset> getDataSetList(Group g, List<Dataset> datasets) {
if (g == null)
return datasets;
List members = g.getMemberList();
int n = members.size();
HObject obj = null;
for (int i = 0; i < n; i++) {
obj = (HObject) members.get(i);
if (obj instanceof Dataset) {
((Dataset) obj).init();
datasets.add((Dataset) obj);
System.out.println(obj.getFullName());
} else if (obj instanceof Group) {
datasets = (getDataSetList((Group) obj, datasets));
}
}
return datasets;
}
public static void main(String args[]) throws Exception {
String filename = "/home/miv/lefevre/freiburg/PIN1_K_RAM2.h5";
if (args.length != 0)
filename = args[0];
for (int i = 0; i < 4; i++)
Viewer2D.exec(HdfImageLoad.exec(filename, i));
}
}