package org.knime.knip.io.nodes.imgreader2.readfromdialog; import java.io.File; import java.net.URI; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.function.Function; import java.util.stream.IntStream; import java.util.stream.Stream; import org.knime.core.data.DataRow; import org.knime.core.data.RowKey; import org.knime.core.node.ExecutionContext; import org.knime.core.util.Pair; import org.knime.core.util.pathresolve.ResolverUtil; import org.knime.knip.base.exceptions.KNIPException; import org.knime.knip.base.node.nodesettings.SettingsModelSubsetSelection2; import org.knime.knip.io.nodes.imgreader2.AbstractReadImgFunction; import net.imglib2.img.Img; import net.imglib2.img.ImgFactory; import net.imglib2.type.NativeType; import net.imglib2.type.numeric.RealType; /** * {@link Function} to read an {@link Img}, OME-XML Metadata or both from a file * path. * * @author <a href="mailto:danielseebacher@t-online.de">Daniel Seebacher, * University of Konstanz.</a> * */ class ReadImg2Function<T extends RealType<T> & NativeType<T>> extends AbstractReadImgFunction<T, URI> { public ReadImg2Function(ExecutionContext exec, int numberOfFiles, SettingsModelSubsetSelection2 sel, boolean readImage, boolean readMetadata, boolean readAllMetaData, boolean checkFileFormat, boolean completePathRowKey, boolean isGroupFiles, int seriesSelectionFrom, int seriesSelectionTo, ImgFactory<T> imgFactory, final String pixelType) { super(exec, numberOfFiles, sel, readImage, readMetadata, readAllMetaData, checkFileFormat, completePathRowKey, isGroupFiles, seriesSelectionFrom, seriesSelectionTo, imgFactory, pixelType); } @Override public Stream<Pair<DataRow, Optional<Throwable>>> apply(final URI t) { List<Pair<DataRow, Optional<Throwable>>> results = new ArrayList<>(); try { final File localFile = ResolverUtil.resolveURItoLocalOrTempFile(t); final String localPath = localFile.getAbsolutePath(); final String rowKey = (m_completePathRowKey) ? localPath : localPath.substring(localPath.lastIndexOf(File.separatorChar) + 1); if (!localFile.exists()) { results.add(createResultFromException(localPath, rowKey, new KNIPException("Image " + rowKey + " doesn't exist!"))); m_exec.setProgress(Double.valueOf(m_currentFile.incrementAndGet()) / m_numberOfFiles); return results.stream(); } int numSeries = m_imgSource.getSeriesCount(localPath); // get start and end of the series int seriesStart = m_selectedSeriesFrom == -1 ? 0 : m_selectedSeriesFrom; int seriesEnd = m_selectedSeriesTo == -1 ? numSeries : Math.min(m_selectedSeriesTo + 1, numSeries); // load image and metadata for each series index IntStream.range(seriesStart, seriesEnd).forEachOrdered(currentSeries -> { final RowKey rk = currentSeries > 0 ? new RowKey(rowKey + "_" + currentSeries) : new RowKey(rowKey); results.add(readImageAndMetadata(localPath, rk, currentSeries)); }); m_exec.setProgress(Double.valueOf(m_currentFile.incrementAndGet()) / m_numberOfFiles); return results.stream(); } catch (final Exception exc) { m_exec.setProgress(Double.valueOf(m_currentFile.incrementAndGet()) / m_numberOfFiles); return Arrays.asList(createResultFromException(t.toString(), t.toString(), exc)).stream(); } } }