diff --git a/Readme.md b/Readme.md index 6f94b3b..fdbddaa 100644 --- a/Readme.md +++ b/Readme.md @@ -1,3 +1,16 @@ +# Usage + +To open a HDF5 file use: + +``` +File > Import > HDF5... +``` + +To save to an HDF5 file use: +``` +File > SaveAs > HDF5 +``` + # Installation * Download latest HDF5 ImageJ plugin from [here](http://slsyoke4.psi.ch:8081/artifactory/releases/HDF5_Viewer-0.2.0.zip). diff --git a/pom.xml b/pom.xml index 3868b14..250dcb2 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 ch.psi imagej.hdf5 - 0.3.0 + 0.5.0 diff --git a/src/main/java/ch/psi/imagej/hdf5/HDF5Config.java b/src/main/java/ch/psi/imagej/hdf5/HDF5Config.java deleted file mode 100644 index 73702f8..0000000 --- a/src/main/java/ch/psi/imagej/hdf5/HDF5Config.java +++ /dev/null @@ -1,87 +0,0 @@ -package ch.psi.imagej.hdf5; - -import ij.Prefs; -import ij.gui.GenericDialog; -import ij.plugin.PlugIn; - -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.regex.*; -import java.lang.String; - -public class HDF5Config implements PlugIn { - - private static final Logger logger = Logger.getLogger(HDF5Config.class.getName()); - - private static final String GROUP_VARS_BY_NAME = "HDF5.groupVarsByName"; - private static final String SHOW_UNMATCHED_DATASET_NAMES = "HDF5.showUnmatchedDataSetNames"; - private static final String GROUP_VARS_BY_NAME_FORMAT_GROUP = "HDF5.groupVarsByNameFormatGroup"; - private static final String GROUP_VARS_BY_NAME_FORMAT = "HDF5.groupVarsByNameFormat"; - private static final String DOLLAR_REGEXP_FOR_GROUPING = "HDF5.dollarRegexpForGrouping"; - - // Getting preference or default values - private boolean groupVarsByName = Prefs.get(GROUP_VARS_BY_NAME, true); - private boolean showUnmatchedDataSetNames = Prefs.get(SHOW_UNMATCHED_DATASET_NAMES, true); - private String groupVarsByNameFormatGroup = Prefs.get(GROUP_VARS_BY_NAME_FORMAT_GROUP, "/hints"); - private String groupVarsByNameFormat = Prefs.get(GROUP_VARS_BY_NAME_FORMAT, "/t$T/channel$C"); - private String dollarRegexpForGrouping = Prefs.get(DOLLAR_REGEXP_FOR_GROUPING, "[0-9]+"); - - - public void run(String arg) { - - GenericDialog configDiag = new GenericDialog("HDF5 Preferences"); - configDiag.addMessage("Reader:"); - configDiag.addCheckbox("Group data set names instead of showing a list " + "of data set names.", groupVarsByName); - configDiag.addCheckbox("Show unmatched data set names in a separate list", showUnmatchedDataSetNames); - configDiag.addStringField("HDF5 group containing pattern " + "for data set grouping: ", groupVarsByNameFormatGroup, 15); - configDiag.addStringField("Pattern for grouping (if no attributes" + " are found): ", groupVarsByNameFormat, 15); - - configDiag.showDialog(); - - if (configDiag.wasCanceled()) { - return; - } - - // Get parameters check if they are correct - groupVarsByName = configDiag.getNextBoolean(); - showUnmatchedDataSetNames = configDiag.getNextBoolean(); - groupVarsByNameFormatGroup = configDiag.getNextString(); - groupVarsByNameFormat = configDiag.getNextString(); - - - try { - HDF5GroupedVarnames.parseFormatString(groupVarsByNameFormat, dollarRegexpForGrouping); - } catch (PatternSyntaxException e) { - logger.log(Level.WARNING, "", e); - this.run(arg); - return; - } - - logger.info("Saving configuration ..."); - - // All OK and "Save" was pressed, so save it... - Prefs.set(GROUP_VARS_BY_NAME, groupVarsByName); - Prefs.set(SHOW_UNMATCHED_DATASET_NAMES, showUnmatchedDataSetNames); - Prefs.set(GROUP_VARS_BY_NAME_FORMAT_GROUP, groupVarsByNameFormatGroup); - Prefs.set(GROUP_VARS_BY_NAME_FORMAT, groupVarsByNameFormat); - Prefs.set(DOLLAR_REGEXP_FOR_GROUPING, dollarRegexpForGrouping); - - } - - - public boolean isGroupVarsByName() { - return groupVarsByName; - } - public boolean isShowUnmatchedDataSetNames() { - return showUnmatchedDataSetNames; - } - public String getGroupVarsByNameFormatGroup() { - return groupVarsByNameFormatGroup; - } - public String getGroupVarsByNameFormat() { - return groupVarsByNameFormat; - } - public String getDollarRegexpForGrouping() { - return dollarRegexpForGrouping; - } -} diff --git a/src/main/java/ch/psi/imagej/hdf5/HDF5Reader.java b/src/main/java/ch/psi/imagej/hdf5/HDF5Reader.java index 4b07412..2b38d8a 100644 --- a/src/main/java/ch/psi/imagej/hdf5/HDF5Reader.java +++ b/src/main/java/ch/psi/imagej/hdf5/HDF5Reader.java @@ -86,95 +86,13 @@ public class HDF5Reader implements PlugIn { IJ.showStatus("Loading HDF5 File: " + directory + name); + + // Read HDF5 file H5File inFile = null; - - // define grouping class - HDF5GroupedVarnames groupedVarnames = new HDF5GroupedVarnames(); - boolean loadGroupedVarNames = true; - try { inFile = new H5File(directory + name, H5File.READ); inFile.open(); - /*------------------------------------------------------------------- - * read HDF5_Config prefs - *-------------------------------------------------------------------*/ - HDF5Config config = new HDF5Config(); - boolean groupVarsByName = config.isGroupVarsByName(); - boolean showUnmatchedDataSetNames = config.isShowUnmatchedDataSetNames(); - String groupVarsByNameFormatGroup = config.getGroupVarsByNameFormatGroup(); - String dollarRegexpForGrouping = config.getDollarRegexpForGrouping(); - - - // TODO: try to read attribute containing format String - String groupVarsByNameFormat = null; - try { - HObject gr = inFile.get(groupVarsByNameFormatGroup); - String attrName = ""; // this will throw an error - - if (gr != null) { - // get the attr list and make a selection dialog if - // necessary - List hintsAttrList = getAttrList(gr); - if (hintsAttrList.size() == 1) - attrName = hintsAttrList.get(0).getName(); - else if (hintsAttrList.size() > 1) { - String[] hintsAttrNames = new String[hintsAttrList.size()]; - for (int a = 0; a < hintsAttrList.size(); a++) - hintsAttrNames[a] = hintsAttrList.get(a).getName(); - GenericDialog attrSelecD = new GenericDialog("Format string selector"); - attrSelecD.addChoice("Select format string", hintsAttrNames, hintsAttrNames[0]); - attrSelecD.showDialog(); - if (attrSelecD.wasCanceled()) - return; - else - attrName = attrSelecD.getNextChoice(); - } - - logger.info("Reading attribute"); - Attribute attr = getAttribute(gr, attrName); - logger.info("Reading attribute is ok"); - if (attr != null) - logger.info("attr is not null"); - logger.info("attr.getName(): " + attr.getName()); - Datatype dType = attr.getType(); - logger.info(dType.getDatatypeDescription()); - - Object tmp = attr.getValue(); - if (tmp != null) - logger.info("get value is ok"); - if (tmp instanceof String) { - // we have a string - groupVarsByNameFormat = (String) tmp; - } else if (tmp instanceof String[]) { - // we have a cstring - String[] sTmp = (String[]) tmp; - groupVarsByNameFormat = ""; - for (int i = 0; i < sTmp.length; i++) - groupVarsByNameFormat = groupVarsByNameFormat + sTmp[i]; - } - logger.info("File has format string for grouping: " + groupVarsByNameFormat); - } else { - logger.info("File has no format string for grouping" + ", using default"); - groupVarsByNameFormat = config.getGroupVarsByNameFormat(); - } - } catch (Exception e) { - logger.info("Error occured read format string " + "for grouping, using default"); - groupVarsByNameFormat = config.getGroupVarsByNameFormat(); - } - - - - /*------------------------------------------------------------------- - * init the frame and channel ranges - *-------------------------------------------------------------------*/ - int minFrameIndex = -1; - int maxFrameIndex = -1; - int skipFrameIndex = 1; - - int minChannelIndex = -1; - int maxChannelIndex = -1; - int skipChannelIndex = 1; /*------------------------------------------------------------------- * parse the file @@ -190,203 +108,6 @@ public class HDF5Reader implements PlugIn { IJ.error("The file did not contain variables. (broken?)"); inFile.close(); return; - } - // else if (varList.size() < 2) - // { - // gd.addCheckbox("single variable", true); - // } - else if (groupVarsByName) { - // parse file structure - String[] varNames = new String[varList.size()]; - for (int i = 0; i < varList.size(); i++) { - varNames[i] = varList.get(i).getFullName(); - } - groupedVarnames.parseVarNames(varNames, groupVarsByNameFormat, dollarRegexpForGrouping); - logger.info(groupedVarnames.toString()); - - // make the data set selection dialog - minFrameIndex = groupedVarnames.getMinFrameIndex(); - maxFrameIndex = groupedVarnames.getMaxFrameIndex(); - minChannelIndex = groupedVarnames.getMinChannelIndex(); - maxChannelIndex = groupedVarnames.getMaxChannelIndex(); - - gd = new GenericDialog("Variable Name Selection"); - // check if we have matched var names - if (groupedVarnames.getNFrames() > 0) { - gd.addCheckbox("Load grouped data sets", loadGroupedVarNames); - - gd.addMessage("Select frames and channels you want to read"); - gd.addMessage("Frame selection (start/step/end): "); - - gd.addStringField("Frame selection (start:[step:]end): ", Integer.toString(minFrameIndex) + ":" + Integer.toString(skipFrameIndex) + ":" + Integer.toString(maxFrameIndex)); - - gd.addStringField("Channel selection (start:[step:]end): ", Integer.toString(minChannelIndex) + ":" + Integer.toString(skipChannelIndex) + ":" + Integer.toString(maxChannelIndex)); - } - - // get unmatched names - List unmatchedVarNames = groupedVarnames.getUnmatchedVarNames(); - if (showUnmatchedDataSetNames) { - // add all unmatched data set names to the dialog - String[] varSelections = new String[unmatchedVarNames.size()]; - boolean[] defaultValues = new boolean[unmatchedVarNames.size()]; - for (int i = 0; i < unmatchedVarNames.size(); i++) { - Dataset var = (Dataset) inFile.get(unmatchedVarNames.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("addcheckboxgroup with " + unmatchedVarNames.size() + " rows"); - gd.addCheckboxGroup(unmatchedVarNames.size(), 1, varSelections, defaultValues); - addScrollBars(gd); - } - gd.showDialog(); - if (gd.wasCanceled()) { - return; - } - - // load grouped var names ? - if (groupedVarnames.getNFrames() > 0) - loadGroupedVarNames = gd.getNextBoolean(); - - // read range selections if we have matched varnames - String frameRange = null; - String channelRange = null; - if (groupedVarnames.getNFrames() > 0) { - frameRange = gd.getNextString(); - channelRange = gd.getNextString(); - } - // parse the range selection - String[] frameRangeToks = null; - String[] channelRangeToks = null; - boolean wrongFrameRange = true; - boolean wrongChannelRange = true; - // check if the parsed values are in range - if (groupedVarnames.getNFrames() > 0 && loadGroupedVarNames) - while (wrongFrameRange || wrongChannelRange) { - // check frame range - frameRangeToks = frameRange.split(":"); - if (frameRangeToks.length == 1) { - // single frame - try { - logger.info("single frame"); - minFrameIndex = Integer.parseInt(frameRangeToks[0]); - maxFrameIndex = minFrameIndex; - wrongFrameRange = false; - } catch (Exception e) { - wrongFrameRange = true; - } - } else if (frameRangeToks.length == 2) { - // frame range with skipFrameIndex=1 - try { - logger.info("frame range with skipFrameIndex=1"); - minFrameIndex = Integer.parseInt(frameRangeToks[0]); - maxFrameIndex = Integer.parseInt(frameRangeToks[1]); - wrongFrameRange = false; - } catch (Exception e) { - wrongFrameRange = true; - } - } else if (frameRangeToks.length == 3) { - // frame range with skipFrameIndex - try { - logger.info("frame range with skipFrameIndex"); - minFrameIndex = Integer.parseInt(frameRangeToks[0]); - skipFrameIndex = Integer.parseInt(frameRangeToks[1]); - maxFrameIndex = Integer.parseInt(frameRangeToks[2]); - wrongFrameRange = false; - } catch (Exception e) { - wrongFrameRange = true; - } - } else { - // wrong format - logger.info("wrong format"); - wrongFrameRange = true; - } - - // check channel range - channelRangeToks = channelRange.split(":"); - if (channelRangeToks.length == 1) { - // single channel - try { - minChannelIndex = Integer.parseInt(channelRangeToks[0]); - maxChannelIndex = minChannelIndex; - wrongChannelRange = false; - } catch (Exception e) { - wrongChannelRange = true; - } - } else if (channelRangeToks.length == 2) { - // channel range with skipChannelIndex=1 - try { - minChannelIndex = Integer.parseInt(channelRangeToks[0]); - maxChannelIndex = Integer.parseInt(channelRangeToks[1]); - wrongChannelRange = false; - } catch (Exception e) { - wrongChannelRange = true; - } - } else if (channelRangeToks.length == 3) { - // channel range with skipChannelIndex - try { - minChannelIndex = Integer.parseInt(channelRangeToks[0]); - skipChannelIndex = Integer.parseInt(channelRangeToks[1]); - maxChannelIndex = Integer.parseInt(channelRangeToks[2]); - wrongChannelRange = false; - } catch (Exception e) { - wrongChannelRange = true; - } - } else { - // wrong format - wrongChannelRange = true; - } - if (wrongFrameRange || wrongChannelRange) { - // show dialog again - logger.info("show dialog again"); - // TODO reset dialog when possible - gd = new GenericDialog("Range Selection"); - gd.addMessage("Select frames and channels you want to read"); - gd.addMessage("Frame selection (start/step/end): "); - - gd.addStringField("Frame selection (start:[step:]end): ", Integer.toString(minFrameIndex) + ":" + Integer.toString(skipFrameIndex) + ":" + Integer.toString(maxFrameIndex)); - - gd.addStringField("Channel selection (start:[step:]end): ", - Integer.toString(minChannelIndex) + ":" + Integer.toString(skipChannelIndex) + ":" + Integer.toString(maxChannelIndex)); - gd.showDialog(); - logger.info("read ranges again"); - frameRange = gd.getNextString(); - channelRange = gd.getNextString(); - - } - if (gd.wasCanceled()) { - return; - } - // the parameters for the range have correct format - } - - if (showUnmatchedDataSetNames) { - varList = new ArrayList(); - // fill varList with unmatched var names - for (int i = 0; i < unmatchedVarNames.size(); i++) { - String dsName = unmatchedVarNames.get(i); - try { - HObject ds = inFile.get(dsName); - if (ds != null && ds instanceof Dataset) { - varList.add((Dataset) ds); - } - } catch (Exception e) { - logger.info("The file does not contain a variable " + "with name " + "`" + dsName + "`!"); - } - } - } else { - // set varList=empty if we dont want unmatched var names - varList = new ArrayList(); - } - } else if (varList.size() > 1000) { logger.info("#######"); @@ -451,302 +172,7 @@ public class HDF5Reader implements PlugIn { return; } } - /*------------------------------------------------------------------- - * now reading data sets - *-------------------------------------------------------------------*/ - if (groupVarsByName && groupedVarnames.getNFrames() > 0 && loadGroupedVarNames) { - groupedVarnames.setFrameAndChannelRange(minFrameIndex, skipFrameIndex, maxFrameIndex, minChannelIndex, skipChannelIndex, maxChannelIndex); - // TODO implement hyperstack reading - int nFrames = groupedVarnames.getNFrames(); - int nChannels = groupedVarnames.getNChannels(); - - // get extents of first data set - long[] extent = null; - int rank = -1; - double[] elem_sizes = new double[3]; - String dsName = ""; - String[] formatTokens = groupedVarnames.getFormatTokens(); - Dataset var = null; - boolean isSigned16Bit = false; - int unsignedConvSelec = 0; // cut off values - try { - TimeFrame f = groupedVarnames.getFrame(0); - if (f == null) - logger.info("frame is null"); - if (formatTokens.length == 2) - dsName = formatTokens[0] + Integer.toString(f.getFrameIndex()) + formatTokens[1] + Integer.toString(f.getChannelIndices()[0]); - else if (formatTokens.length == 3) - dsName = formatTokens[0] + Integer.toString(f.getFrameIndex()) + formatTokens[1] + Integer.toString(f.getChannelIndices()[0]) + formatTokens[2]; - logger.info("VarName: " + dsName); - HObject ds = inFile.get(dsName); - if (ds != null && ds instanceof Dataset) { - var = (Dataset) ds; - Datatype dType = var.getDatatype(); - isSigned16Bit = !dType.isUnsigned() && (dType.getDatatypeClass() == Datatype.CLASS_INTEGER) && (dType.getDatatypeSize() == 2); - if (isSigned16Bit) { - GenericDialog convDiag = new GenericDialog("Unsigned to signed conversion"); - convDiag.addMessage("Detected unsigned datatype, which " + "is not supported."); - String[] convOptions = new String[2]; - convOptions[0] = "cut off values"; - convOptions[1] = "convert to float"; - convDiag.addChoice("Please select an conversion option:", convOptions, convOptions[0]); - convDiag.showDialog(); - if (convDiag.wasCanceled()) - return; - unsignedConvSelec = convDiag.getNextChoiceIndex(); - } - // TODO check for unsupported datatypes int,long - rank = var.getRank(); - extent = var.getDims(); - Attribute elemsize_att = getAttribute(var, "element_size_um"); - - if (elemsize_att == null) { - elem_sizes[0] = 1.0; - elem_sizes[1] = 1.0; - elem_sizes[2] = 1.0; - } else { - logger.info("Reading element_size_um"); - float[] tmp = null; - try { - tmp = ((float[]) elemsize_att.getValue()); - elem_sizes[0] = tmp[0]; - elem_sizes[1] = tmp[1]; - elem_sizes[2] = tmp[2]; - } catch (java.lang.ClassCastException e) { - String title = "Error Reading Element Size"; - String msg = "The element_size_um attribute " + "has wrong format!\n"; - msg += "Setting to default size of (1,1,1)..."; - new ij.gui.MessageDialog(null, title, msg); - elem_sizes[0] = 1; - elem_sizes[1] = 1; - elem_sizes[2] = 1; - } - } - } else { - IJ.error("The file does not contain a variable with name " + "`" + dsName + "`!"); - inFile.close(); - return; - } - } catch (Exception e) { - IJ.error("The file does not contain a variable with name " + "`" + dsName + "`!"); - inFile.close(); - return; - } - // String title = rank + "D: " + var.getFullName() + - // " " - // + var.getDatatype().getDatatypeDescription() + "( "; - - // read 3D or 2D dataset - if (rank == 3 || rank == 2) { - int nRows = -1; // height - int nCols = -1; // width - int nSlices = 1; // if rank == 2 - if (rank == 3) { - nSlices = (int) extent[0]; - nRows = (int) extent[1]; - nCols = (int) extent[2]; - } else { - nRows = (int) extent[0]; - nCols = (int) extent[1]; - } - - // create a new image stack and fill in the data - ImageStack stack = new ImageStack(nCols, nRows, nFrames * nSlices * nChannels); - logger.info("stackSize: " + Integer.toString(stack.getSize())); - - ImagePlus imp = new ImagePlus(); - // to get getFrameIndex() working - imp.setDimensions(nChannels, nSlices, nFrames); - - long stackSize = nCols * nRows; - // global min max values of all data sets - double[] minValChannel = new double[nChannels]; - double[] maxValChannel = new double[nChannels]; - - // TODO implement frame and channel ranges - // now read frame by frame - for (int fIdx = 0; fIdx < nFrames; fIdx++) { - // get current frame - TimeFrame f = groupedVarnames.getFrame(fIdx); - if (f == null) - logger.info("frame is null"); - // get channel indices - - // TODO: check if frame has same parameters as first, - // skip otherwise - - // now read channel by channel of frame - for (int cIdx = 0; cIdx < nChannels; cIdx++) { - if (formatTokens.length == 2) - dsName = formatTokens[0] + Integer.toString(f.getFrameIndex()) + formatTokens[1] + Integer.toString(f.getChannelIndices()[cIdx]); - else if (formatTokens.length == 3) - dsName = formatTokens[0] + Integer.toString(f.getFrameIndex()) + formatTokens[1] + Integer.toString(f.getChannelIndices()[cIdx]) + formatTokens[2]; - - logger.info("VarName: " + dsName); - - HObject ds = inFile.get(dsName); - if (ds != null && ds instanceof Dataset) { - var = (Dataset) ds; - rank = var.getRank(); - extent = var.getDims(); - } - - // TODO: check if dataset has same parameters as - // first, - // skip otherwise - - long[] selected = var.getSelectedDims(); // the - // selected - // size of - // the - // dataet - selected[0] = extent[0]; - selected[1] = extent[1]; - if (selected.length > 2) - selected[2] = extent[2]; - - Object wholeDataset = var.read(); - if (isSigned16Bit) - wholeDataset = convertToUnsigned(wholeDataset, unsignedConvSelec); - - long wholeDatasetSize = 1; - for (int d = 0; d < extent.length; d++) - wholeDatasetSize *= extent[d]; - - if (fIdx == 0) { - // init min/max - double[] minMaxVal = getMinMax(wholeDataset, wholeDatasetSize); - minValChannel[cIdx] = minMaxVal[0]; - maxValChannel[cIdx] = minMaxVal[1]; - } else { - // update minMaxVal - double[] minMaxVal = getMinMax(wholeDataset, wholeDatasetSize); - minValChannel[cIdx] = Math.min(minMaxVal[0], minValChannel[cIdx]); - maxValChannel[cIdx] = Math.max(minMaxVal[1], maxValChannel[cIdx]); - } - - for (int lev = 0; lev < nSlices; ++lev) { - // if ((lev % progressDivisor) == 0) - // IJ.showProgress((float) lev / (float) - // extent[0]); - // select hyperslab for lev - // start[0] = lev; - // Object slice = var.read(); - - long startIdx = lev * stackSize; - long numElements = stackSize; - if (wholeDataset instanceof byte[]) { - byte[] tmp = (byte[]) extractSubarray(wholeDataset, startIdx, numElements); - stack.setPixels(tmp, imp.getStackIndex(cIdx + 1, lev + 1, fIdx + 1)); - } else if (wholeDataset instanceof short[]) { - short[] tmp = (short[]) extractSubarray(wholeDataset, startIdx, numElements); - stack.setPixels(tmp, imp.getStackIndex(cIdx + 1, lev + 1, fIdx + 1)); - } else if (wholeDataset instanceof int[]) { - logger.info("Datatype `int` is not supported. " + "Skipping whole frame!"); - // int[] tmp = (int[]) - // extractSubarray(wholeDataset, - // startIdx, - // numElements); - // if(datatypeIfUnsupported.getDatatypeClass() - // == Datatype.CLASS_FLOAT) - // { - // stack.setPixels(convertInt32ToFloat(tmp), - // imp.getStackIndex(cIdx+1,lev+1,fIdx+1)); - // } - // if(datatypeIfUnsupported.getDatatypeClass() - // == Datatype.CLASS_INTEGER) - // { - // stack.setPixels(convertInt32ToShort(tmp), - // imp.getStackIndex(cIdx+1,lev+1,fIdx+1)); - // } - } else if (wholeDataset instanceof long[]) { - logger.info("Datatype `long` is not supported. " + "Skipping whole frame!"); - // long[] tmp = (long[]) - // extractSubarray(wholeDataset, - // startIdx, - // numElements); - // if(datatypeIfUnsupported.getDatatypeClass() - // == Datatype.CLASS_FLOAT) - // { - // stack.setPixels(convertInt64ToFloat(tmp), - // imp.getStackIndex(cIdx+1,lev+1,fIdx+1)); - // } - // if(datatypeIfUnsupported.getDatatypeClass() - // == Datatype.CLASS_INTEGER) - // { - // stack.setPixels(convertInt64ToShort(tmp), - // imp.getStackIndex(cIdx+1,lev+1,fIdx+1)); - // } - } else if (wholeDataset instanceof float[]) { - float[] tmp = (float[]) extractSubarray(wholeDataset, startIdx, numElements); - stack.setPixels(tmp, imp.getStackIndex(cIdx + 1, lev + 1, fIdx + 1)); - } else if (wholeDataset instanceof double[]) { - logger.info("Datatype `double` is not supported. " + "Converting whole frame to `float`!"); - float[] tmp = convertDoubleToFloat((double[]) extractSubarray(wholeDataset, startIdx, numElements)); - stack.setPixels(tmp, imp.getStackIndex(cIdx + 1, lev + 1, fIdx + 1)); - } else { - // try to put pixels on stack - stack.setPixels(extractSubarray(wholeDataset, startIdx, numElements), imp.getStackIndex(cIdx + 1, lev + 1, fIdx + 1)); - } - } - } - } - IJ.showProgress(1.f); - - logger.info("Creating image plus"); - // stack.trim(); - imp = new ImagePlus(directory + name + ": " + groupedVarnames.getFormatString(), stack); - - imp.setDimensions(nChannels, nSlices, nFrames); - - if (nChannels > 1) { - logger.info("Creating composite hyperstack with " + Integer.toString(nChannels) + " channels."); - imp = new CompositeImage(imp, CompositeImage.COMPOSITE); - } else { - logger.info("Creating grayscale hyperstack."); - // imp = new CompositeImage(imp, - // CompositeImage.GRAYSCALE); - } - - logger.info("nFrames: " + Integer.toString(nFrames)); - logger.info("nSlices: " + Integer.toString(nSlices)); - - logger.info("stackSize: " + Integer.toString(stack.getSize())); - - // set element_size_um - imp.getCalibration().pixelDepth = elem_sizes[0]; - imp.getCalibration().pixelHeight = elem_sizes[1]; - imp.getCalibration().pixelWidth = elem_sizes[2]; - - // logger.info(" Min = " + minMaxVal[0] + - // ", Max = " + minMaxVal[1]); - // imp.setDisplayRange(1.5*minMaxVal[0], 0.5*minMaxVal[1]); - // imp.resetDisplayRange(); - int[] channelsIJ = { 4, 2, 1 }; - for (int c = 0; c < nChannels; c++) { - // imp.setDisplayRange(minValChannel[c], - // maxValChannel[c], - // channelsIJ[c]); - // imp.setSlice(c+1); - imp.setPosition(c + 1, 1, 1); - logger.info("Current channel: " + Integer.toString(imp.getChannel() - 1)); - - imp.setDisplayRange(minValChannel[c], maxValChannel[c]); - // , - // channelsIJ[c]); - logger.info("Setting display range for channel " + Integer.toString(c) + " (ij idx: " + Integer.toString(channelsIJ[c]) + "): \n\t" + Double.toString(minValChannel[c]) - + "/" + Double.toString(maxValChannel[c])); - } - - imp.show(); - imp.updateStatusbarValue(); - imp.setOpenAsHyperStack(true); - } else { - // not supported format - IJ.error("The file does not contain a supported data set structure!" + "\nChannels have to be 2D or 3D scalar data sets!"); - } - } - + // varList should have size=0 if only grouping is wanted // use old style for (int i = 0; i < varList.size(); ++i) { @@ -1766,102 +1192,7 @@ public class HDF5Reader implements PlugIn { return null; } - - private static Attribute getAttribute(HObject ds, String attrName) throws Exception { - for(Attribute a: getAttrList(ds)){ - if (a.getName().equals(attrName)) { - return a; - } - } - return null; - } - - /** - * Find min and maximum of array - * @param data - * @param stackSize - * @return - */ - private double[] getMinMax(Object data, long stackSize) { - double[] minmax = new double[2]; - - if (data instanceof byte[]) { - byte[] tmp = (byte[]) data; - minmax[0] = tmp[0]; - minmax[1] = tmp[0]; - for (int i = 1; i < stackSize; i++) { - double val = (double) tmp[i]; - // we only support unsigned - if (tmp[i] < 0) - val = (float) Byte.MAX_VALUE - (float) Byte.MIN_VALUE + (float) tmp[i] + 1; - - if (val < minmax[0]) - minmax[0] = val; - if (val > minmax[1]) - minmax[1] = val; - } - } else if (data instanceof short[]) { - short[] tmp = (short[]) data; - minmax[0] = tmp[0]; - minmax[1] = tmp[0]; - for (int i = 1; i < stackSize; i++) { - double val = (double) tmp[i]; - // we only support unsigned - if (tmp[i] < 0) - val = (float) Short.MAX_VALUE - (float) Short.MIN_VALUE + (float) tmp[i] + 1; - - if (val < minmax[0]) - minmax[0] = val; - if (val > minmax[1]) - minmax[1] = val; - } - } else if (data instanceof int[]) { - int[] tmp = (int[]) data; - minmax[0] = tmp[0]; - minmax[1] = tmp[0]; - for (int i = 1; i < stackSize; i++) { - if (tmp[i] < minmax[0]) - minmax[0] = tmp[i]; - if (tmp[i] > minmax[1]) - minmax[1] = tmp[i]; - } - } else if (data instanceof long[]) { - long[] tmp = (long[]) data; - minmax[0] = tmp[0]; - minmax[1] = tmp[0]; - for (int i = 1; i < stackSize; i++) { - if (tmp[i] < minmax[0]) - minmax[0] = tmp[i]; - if (tmp[i] > minmax[1]) - minmax[1] = tmp[i]; - } - } else if (data instanceof float[]) { - float[] tmp = (float[]) data; - minmax[0] = tmp[0]; - minmax[1] = tmp[0]; - for (int i = 1; i < stackSize; i++) { - if (tmp[i] < minmax[0]) - minmax[0] = tmp[i]; - if (tmp[i] > minmax[1]) - minmax[1] = tmp[i]; - } - } else if (data instanceof double[]) { - double[] tmp = (double[]) data; - minmax[0] = tmp[0]; - minmax[1] = tmp[0]; - for (int i = 1; i < stackSize; i++) { - if (tmp[i] < minmax[0]) - minmax[0] = tmp[i]; - if (tmp[i] > minmax[1]) - minmax[1] = tmp[i]; - } - } - logger.info("min: " + minmax[0] + ", max: " + minmax[1]); - return minmax; - } - - private float[] convertDoubleToFloat(double[] dataIn) { float[] dataOut = new float[dataIn.length]; for (int index = 0; index < dataIn.length; index++) { @@ -1869,7 +1200,6 @@ public class HDF5Reader implements PlugIn { } return dataOut; } - private float[] convertInt32ToFloat(int[] dataIn) { float[] dataOut = new float[dataIn.length]; @@ -1878,7 +1208,6 @@ public class HDF5Reader implements PlugIn { } return dataOut; } - private short[] convertInt32ToShort(int[] dataIn) { short[] dataOut = new short[dataIn.length]; @@ -1887,7 +1216,6 @@ public class HDF5Reader implements PlugIn { } return dataOut; } - private float[] convertInt64ToFloat(long[] dataIn) { float[] dataOut = new float[dataIn.length]; @@ -1897,7 +1225,6 @@ public class HDF5Reader implements PlugIn { return dataOut; } - private short[] convertInt64ToShort(long[] dataIn) { short[] dataOut = new short[dataIn.length]; for (int index = 0; index < dataIn.length; index++) { @@ -1906,7 +1233,6 @@ public class HDF5Reader implements PlugIn { return dataOut; } - private Object convertToUnsigned(Object dataIn, int unsignedConvSelec) { Object dataOut = null; if (unsignedConvSelec == 0) { @@ -1932,7 +1258,6 @@ public class HDF5Reader implements PlugIn { return dataOut; } - private Object extractSubarray(Object data, long startIdx, long numElements) { Object subarray = null; diff --git a/src/main/resources/plugins.config b/src/main/resources/plugins.config index 2ea34aa..05fbdc6 100644 --- a/src/main/resources/plugins.config +++ b/src/main/resources/plugins.config @@ -1,5 +1,2 @@ File>Import, "HDF5...", ch.psi.imagej.hdf5.HDF5Reader -File>Save As, "HDF5", ch.psi.imagej.hdf5.HDF5Writer -Plugins>HDF5, "Load HDF5 File", ch.psi.imagej.hdf5.HDF5Reader -Plugins>HDF5, "Save HDF5 File", ch.psi.imagej.hdf5.HDF5Writer -Plugins>HDF5, "HDF5 Preferences", ch.psi.imagej.hdf5.HDF5Config \ No newline at end of file +File>Save As, "HDF5", ch.psi.imagej.hdf5.HDF5Writer \ No newline at end of file diff --git a/src/test/java/ch/psi/imagej/hdf5/HDF5ConfigTest.java b/src/test/java/ch/psi/imagej/hdf5/HDF5ConfigTest.java deleted file mode 100644 index 9b07f5a..0000000 --- a/src/test/java/ch/psi/imagej/hdf5/HDF5ConfigTest.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * - * Copyright 2014 Paul Scherrer Institute. All rights reserved. - * - * This code is free software: you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) any - * later version. - * - * This code is distributed in the hope that it will be useful, but without any - * warranty; without even the implied warranty of merchantability or fitness for - * a particular purpose. See the GNU Lesser General Public License for more - * details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - * - */ -package ch.psi.imagej.hdf5; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -/** - * - */ -public class HDF5ConfigTest { - - /** - * @throws java.lang.Exception - */ - @Before - public void setUp() throws Exception { - } - - /** - * @throws java.lang.Exception - */ - @After - public void tearDown() throws Exception { - } - - @Test - public void test() { - HDF5Config config = new HDF5Config(); - config.run(""); - } - -}