mirror of
https://github.com/paulscherrerinstitute/ch.psi.imagej.hdf5.git
synced 2025-06-24 18:51:08 +02:00
Compare commits
6 Commits
Author | SHA1 | Date | |
---|---|---|---|
e9d73ffde8 | |||
c276603087 | |||
2250170f04 | |||
966884310b | |||
8cbdbd5041 | |||
d9c2860759 |
@ -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.
|
||||||
|
|
||||||
|
2
pom.xml
2
pom.xml
@ -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>
|
||||||
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
26
src/main/java/ch/psi/imagej/hdf5/SelectedDatasets.java
Normal file
26
src/main/java/ch/psi/imagej/hdf5/SelectedDatasets.java
Normal 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Reference in New Issue
Block a user