use of org.janelia.saalfeldlab.n5.metadata.N5CosemMetadata in project bigwarp by saalfeldlab.
the class ApplyBigwarpPlugin method runN5Export.
public static <S, T extends NativeType<T> & NumericType<T>> void runN5Export(final BigWarpData<S> data, final List<SourceAndConverter<S>> sources, final String fieldOfViewOption, final Interval outputInterval, final Interpolation interp, final double[] offset, final double[] resolution, final String unit, final ProgressWriter progressWriter, final WriteDestinationOptions writeOpts, final ExecutorService exec) {
final int nd = BigWarp.detectNumDims(data.sources);
// setup n5 parameters
final String dataset = writeOpts.n5Dataset;
final int[] blockSize = writeOpts.blockSize;
final Compression compression = writeOpts.compression;
if (dataset == null || dataset.isEmpty()) {
return;
}
N5Writer n5;
try {
n5 = new N5Factory().openWriter(writeOpts.pathOrN5Root);
} catch (IOException e1) {
e1.printStackTrace();
return;
}
// build metadata
final String[] axes = nd == 2 ? new String[] { "y", "x" } : new String[] { "z", "y", "x" };
final String[] units = nd == 2 ? new String[] { unit, unit } : new String[] { unit, unit, unit };
final N5CosemMetadata metadata = new N5CosemMetadata("", new N5CosemMetadata.CosemTransform(axes, resolution, offset, units), null);
N5CosemMetadataParser parser = new N5CosemMetadataParser();
// setup physical to pixel transform
final AffineTransform3D resolutionTransform = new AffineTransform3D();
resolutionTransform.set(resolution[0], 0, 0);
resolutionTransform.set(resolution[1], 1, 1);
if (resolution.length > 2)
resolutionTransform.set(resolution[2], 2, 2);
final AffineTransform3D offsetTransform = new AffineTransform3D();
offsetTransform.set(offset[0], 0, 3);
offsetTransform.set(offset[1], 1, 3);
if (resolution.length > 2)
offsetTransform.set(offset[2], 2, 3);
final AffineTransform3D pixelRenderToPhysical = new AffineTransform3D();
pixelRenderToPhysical.concatenate(resolutionTransform);
pixelRenderToPhysical.concatenate(offsetTransform);
// render and write
final int N = data.movingSourceIndices.length;
for (int i = 0; i < N; i++) {
final int movingSourceIndex = data.movingSourceIndices[i];
@SuppressWarnings("unchecked") final RealRandomAccessible<T> raiRaw = (RealRandomAccessible<T>) sources.get(movingSourceIndex).getSpimSource().getInterpolatedSource(0, 0, interp);
// to pixel space
final AffineRandomAccessible<T, AffineGet> rai = RealViews.affine(raiRaw, pixelRenderToPhysical.inverse());
final IntervalView<T> img = Views.interval(Views.raster(rai), Intervals.zeroMin(outputInterval));
final String srcName = data.sources.get(data.movingSourceIndices[i]).getSpimSource().getName();
String destDataset = dataset;
if (N > 1)
destDataset = dataset + String.format("/%s", srcName.replace(" ", "_"));
RandomAccessibleInterval<T> imgToWrite;
if (nd == 2)
imgToWrite = Views.hyperSlice(img, 2, 0);
else
imgToWrite = img;
try {
N5Utils.save(imgToWrite, n5, destDataset, blockSize, compression, exec);
if (parser != null && metadata != null)
parser.writeMetadata(metadata, n5, destDataset);
} catch (Exception e) {
e.printStackTrace();
}
progressWriter.setProgress((i + 1) / ((double) N));
}
progressWriter.setProgress(1.0);
}
Aggregations