/*- * Copyright 2016 Diamond Light Source Ltd. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package uk.ac.diamond.scisoft.analysis.processing.operations.twod; import java.util.Arrays; import org.eclipse.dawnsci.analysis.api.downsample.DownsampleMode; import org.eclipse.dawnsci.analysis.api.processing.IExportOperation; import org.eclipse.dawnsci.analysis.api.processing.OperationData; import org.eclipse.dawnsci.analysis.api.processing.OperationException; import org.eclipse.dawnsci.analysis.api.processing.OperationRank; import org.eclipse.dawnsci.analysis.dataset.function.Downsample; import org.eclipse.dawnsci.analysis.dataset.operations.AbstractOperation; import org.eclipse.dawnsci.analysis.dataset.slicer.SliceFromSeriesMetadata; import org.eclipse.january.IMonitor; import org.eclipse.january.dataset.Dataset; import org.eclipse.january.dataset.DatasetFactory; import org.eclipse.january.dataset.IDataset; import org.eclipse.january.dataset.Slice; import org.eclipse.january.dataset.SliceND; public class StitchDownsampledGridOperation extends AbstractOperation<DownsampleGridModel, OperationData> implements IExportOperation { private Dataset full = null; int count = 0; @Override public String getId() { return "uk.ac.diamond.scisoft.analysis.processing.operations.twod.StitchDownsampledGridOperation"; } @Override public OperationRank getInputRank() { return OperationRank.TWO; } @Override public OperationRank getOutputRank() { return OperationRank.TWO; } @Override public void init() { full =null; count = 0; }; @Override protected OperationData process(IDataset input, IMonitor monitor) throws OperationException { int[] inShape = input.getShape(); SliceFromSeriesMetadata ssm = input.getFirstMetadata(SliceFromSeriesMetadata.class); int[] shape = ssm.getSubSampledShape(); int[] dims = getFastestNonSingluarNonDataDimension(ssm); //single image if (dims[0] == -1 && dims[1] == -1) return new OperationData(input); int xN = shape[dims[0]]; int yN = (dims[1] == -1 ? 1 : shape[dims[1]]); Slice[] slice = ssm.getSliceInOutput(); double newX = (xN*inShape[1])/(double)model.getImageSize(); double newY = (yN*inShape[0])/(double)model.getImageSize(); int downSampleSize = (int)Math.round(Math.max(newX,newY)); if (downSampleSize == 0) downSampleSize = 1; Downsample downsample = new Downsample(DownsampleMode.MEAN, downSampleSize,downSampleSize); Dataset ds = downsample.value(input).get(0); int x = ds.getShape()[1]* xN; int y = ds.getShape()[0]* yN; if (full == null) { full = DatasetFactory.zeros(new int[]{y, x}, ds.getDType()); } SliceND s = new SliceND(full.getShape()); s.setSlice(1, slice[dims[0]].getStart()*ds.getShape()[1], (slice[dims[0]].getStart()+1)*ds.getShape()[1], 1); if (dims[1] != -1) s.setSlice(0, slice[dims[1]].getStart()*ds.getShape()[0], (slice[dims[1]].getStart()+1)*ds.getShape()[0], 1); full.setSlice(ds, s); count++; if (ssm.getTotalSlices() != count) { return null; } SliceFromSeriesMetadata outsmm = ssm.clone(); for (int i = 0; i < ssm.getParent().getRank(); i++) { if (!outsmm.isDataDimension(i)) outsmm.reducedDimensionToSingular(i); } full.setMetadata(outsmm); Dataset f = full; full = null; return new OperationData(f); } private int[] getFastestNonSingluarNonDataDimension(SliceFromSeriesMetadata ssm) { int[] dims = new int[]{-1,-1}; int[] shape = ssm.getSubSampledShape(); int[] dataDims = ssm.getSliceInfo().getDataDimensions(); int[] dd = dataDims.clone(); Arrays.sort(dd); int count = 0; for (int i = shape.length-1; i > -1; i--) { if (shape[i] == 1) continue; int key = Arrays.binarySearch(dd, i); if (key < 0) dims[count++] = i; if (count > 1) break; } return dims; } }