6 Commits
0.6.0 ... 0.8.0

4 changed files with 96 additions and 126 deletions

View File

@ -21,7 +21,7 @@ File > SaveAs > HDF5
# Installation # Installation
To be able to install this plugin ImageJ need to be run with a Java 7 or greater JVM. To be able to install this plugin ImageJ need to be run with a Java 7 or greater JVM.
* Download latest HDF5 ImageJ plugin from [here](http://slsyoke4.psi.ch:8081/artifactory/releases/HDF5_Viewer-0.6.0.zip). * Download latest HDF5 ImageJ plugin from [releases](https://github.com/paulscherrerinstitute/ch.psi.imagej.hdf5/releases).
* Go into the ImageJ installation folder and extract the downloaded zip. * Go into the ImageJ installation folder and extract the downloaded zip.

View File

@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>ch.psi</groupId> <groupId>ch.psi</groupId>
<artifactId>imagej.hdf5</artifactId> <artifactId>imagej.hdf5</artifactId>
<version>0.6.0</version> <version>0.8.0</version>
<dependencies> <dependencies>
<dependency> <dependency>

View File

@ -16,6 +16,15 @@ import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.awt.*; import java.awt.*;
import javax.swing.BoxLayout;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import ncsa.hdf.object.*; import ncsa.hdf.object.*;
import ncsa.hdf.object.h5.*; import ncsa.hdf.object.h5.*;
import ncsa.hdf.hdf5lib.exceptions.HDF5Exception; import ncsa.hdf.hdf5lib.exceptions.HDF5Exception;
@ -55,12 +64,36 @@ public class HDF5Reader implements PlugIn {
H5File file = null; H5File file = null;
try { try {
file = new H5File(filename, H5File.READ); file = new H5File(filename, H5File.READ);
file.setMaxMembers(Integer.MAX_VALUE);
file.open(); file.open();
List<Dataset> datasets = HDF5Utilities.getDatasets(file); List<Dataset> datasets = HDF5Utilities.getDatasets(file);
List<Dataset> selectedDatasets = selectDatasets(datasets); SelectedDatasets selectedDatasets = selectDatasets(datasets);
for (Dataset var : selectedDatasets) {
// TODO Remove
// Hack as a proof of principle
if(selectedDatasets.isGroup()){
ImageStack stack = null;
for (Dataset var : selectedDatasets.getDatasets()) {
if(stack == null){
long[] dimensions= var.getDims();
stack = new ImageStack((int) dimensions[1], (int) dimensions[0]);
}
Object wholeDataset = var.read();
addSlice(stack, wholeDataset);
}
ImagePlus imp = new ImagePlus(filename, stack);
imp.resetDisplayRange();
imp.show();
return;
}
for (Dataset var : selectedDatasets.getDatasets()) {
// Read dataset attributes and properties // Read dataset attributes and properties
String datasetName = var.getName(); String datasetName = var.getName();
@ -246,70 +279,51 @@ public class HDF5Reader implements PlugIn {
* @return List of datasets to visualize. If nothing selected the list will be empty * @return List of datasets to visualize. If nothing selected the list will be empty
* @throws HDF5Exception * @throws HDF5Exception
*/ */
private List<Dataset> selectDatasets(List<Dataset> datasets) throws HDF5Exception { private SelectedDatasets selectDatasets(List<Dataset> datasets) throws HDF5Exception {
List<Dataset> selectedDatasets = new ArrayList<>();
GenericDialog gd = new GenericDialog("Variable Name Selection"); GenericDialog gd = new GenericDialog("Variable Name Selection");
gd.addMessage("Please select variables to be loaded.\n"); gd.addMessage("Please select variables to be loaded.\n");
if (datasets.size() < 1) { // Filter datasets that are not potential images / that cannot be displayed
IJ.error("The file does not contain datasets"); List<Dataset> fdatasets = new ArrayList<Dataset>();
} else if (datasets.size() > 1000) {
logger.info("#######");
for(Dataset d: datasets){ for(Dataset d: datasets){
logger.info(d.getFullName()); if(d.getRank()>=2 && d.getRank()<=5){
fdatasets.add(d);
}
} }
logger.info("#######");
JList<Dataset> list = new JList<>(fdatasets.toArray(new Dataset[fdatasets.size()]));
list.setCellRenderer(new DefaultListCellRenderer() {
private static final long serialVersionUID = 1L;
public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
final Dataset d = ((Dataset) value);
label.setText(d.getFullName()+" ("+d.getRank()+"D)");
return label;
}
});
JScrollPane scroll = new JScrollPane(list);
scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel,BoxLayout.Y_AXIS));
panel.add(scroll);
JCheckBox checkbox = new JCheckBox("Group Datasets (2D datasets only)");
panel.add(checkbox);
gd = new GenericDialog("Variable Name Selection"); gd = new GenericDialog("Variable Name Selection");
gd.addMessage("There are lots of datasets in your file (check the log output which datasets are available)! Please enter the full path of the dataset to be displayed"); gd.add(panel);
gd.addStringField("Dataset", ""); gd.addMessage("");
gd.pack();
gd.showDialog(); gd.showDialog();
SelectedDatasets selectedDatasets = new SelectedDatasets();
if (!gd.wasCanceled()) { if (!gd.wasCanceled()) {
String dsName = gd.getNextString(); selectedDatasets.setDatasets(list.getSelectedValuesList());
for(Dataset d: datasets){ selectedDatasets.setGroup(checkbox.isSelected());
if(d.getFullName().equals(dsName)){
selectedDatasets.add(d);
}
}
if(selectedDatasets.isEmpty()){
IJ.error("The file does not contain a variable with name " + "`" + dsName + "`!");
}
} }
} else {
String[] varSelections = new String[datasets.size()];
boolean[] defaultValues = new boolean[datasets.size()];
for (int i = 0; i < datasets.size(); i++) {
Dataset var = datasets.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 += ")";
varSelections[i] = title;
defaultValues[i] = false;
}
logger.info("Add checkbox group with " + datasets.size() + " rows");
gd.addCheckboxGroup(datasets.size(), 1, varSelections, defaultValues);
addScrollBars(gd);
gd.showDialog();
if (!gd.wasCanceled()) {
// Get selected datasets
for (int i = 0; i < datasets.size(); ++i) {
if (gd.getNextBoolean()) {
selectedDatasets.add(datasets.get(i));
}
}
}
}
return selectedDatasets; return selectedDatasets;
} }
@ -394,74 +408,4 @@ public class HDF5Reader implements PlugIn {
stack.addSlice(null, g); stack.addSlice(null, g);
stack.addSlice(null, b); stack.addSlice(null, b);
} }
/**
* Add AWT scroll bars to the given container
* @param pane Pane to add scrollbar to
*/
public static void addScrollBars(Container pane) {
GridBagLayout layout = (GridBagLayout) pane.getLayout();
// extract components
int count = pane.getComponentCount();
Component[] c = new Component[count];
GridBagConstraints[] gbc = new GridBagConstraints[count];
for (int i = 0; i < count; i++) {
c[i] = pane.getComponent(i);
gbc[i] = layout.getConstraints(c[i]);
}
// clear components
pane.removeAll();
layout.invalidateLayout(pane);
// create new container panel
Panel newPane = new Panel();
GridBagLayout newLayout = new GridBagLayout();
newPane.setLayout(newLayout);
for (int i = 0; i < count; i++) {
newLayout.setConstraints(c[i], gbc[i]);
newPane.add(c[i]);
}
Frame f = new Frame();
f.setLayout(new BorderLayout());
f.add(newPane, BorderLayout.WEST);
f.pack();
final Dimension size = newPane.getSize();
f.remove(newPane);
f.dispose();
// compute best size for scrollable viewport
size.width += 15;
size.height += 15;
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
int maxWidth = 3 * screen.width / 4;
int maxHeight = 3 * screen.height / 4;
if (size.width > maxWidth){
size.width = maxWidth;
}
if (size.height > maxHeight){
size.height = maxHeight;
}
// create scroll pane
ScrollPane scroll = new ScrollPane() {
private static final long serialVersionUID = 1L;
public Dimension getPreferredSize() {
return size;
}
};
scroll.add(newPane);
// add scroll pane to original container
GridBagConstraints constraints = new GridBagConstraints();
constraints.anchor = GridBagConstraints.WEST;
constraints.fill = GridBagConstraints.BOTH;
constraints.weightx = 1.0;
constraints.weighty = 1.0;
layout.setConstraints(scroll, constraints);
pane.add(scroll);
}
} }

View File

@ -0,0 +1,26 @@
package ch.psi.imagej.hdf5;
import java.util.ArrayList;
import java.util.List;
import ncsa.hdf.object.Dataset;
public class SelectedDatasets {
private List<Dataset> datasets = new ArrayList<Dataset>();
private boolean group = false;
public List<Dataset> getDatasets() {
return datasets;
}
public void setDatasets(List<Dataset> datasets) {
this.datasets = datasets;
}
public boolean isGroup() {
return group;
}
public void setGroup(boolean group) {
this.group = group;
}
}