package uk.ac.diamond.scisoft.analysis.processing.operations.twod;
import java.util.List;
import org.eclipse.dawnsci.analysis.api.downsample.DownsampleMode;
import org.eclipse.dawnsci.analysis.api.processing.Atomic;
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.function.DownsampleDatatype;
import org.eclipse.dawnsci.analysis.dataset.operations.AbstractOperation;
import org.eclipse.january.DatasetException;
import org.eclipse.january.IMonitor;
import org.eclipse.january.MetadataException;
import org.eclipse.january.dataset.Comparisons;
import org.eclipse.january.dataset.Dataset;
import org.eclipse.january.dataset.DatasetUtils;
import org.eclipse.january.dataset.IDataset;
import org.eclipse.january.dataset.ILazyDataset;
import org.eclipse.january.metadata.AxesMetadata;
import org.eclipse.january.metadata.MetadataFactory;
@Atomic
public class DownsampleImageOperation extends AbstractOperation<DownsampleImageModel, OperationData> {
@Override
public String getId() {
return "uk.ac.diamond.scisoft.analysis.processing.operations.DownsampleImageOperation";
}
protected OperationData process(IDataset input, IMonitor monitor) throws OperationException {
ILazyDataset mask = getFirstMask(input);
if (mask != null && input instanceof Dataset) {
Dataset m;
try {
m = DatasetUtils.sliceAndConvertLazyDataset(mask);
} catch (DatasetException e) {
throw new OperationException(this, e);
}
((Dataset)input).setByBoolean(Double.NaN, Comparisons.logicalNot(m));
}
int x = model.getDownsampleSizeX();
int y = model.getDownsampleSizeY();
DownsampleDatatype outputDatatype = model.getDownSampleDatatype();
Downsample downsample = new Downsample(((DownsampleImageModel)model).getDownsampleMode(), y,x);
input = DatasetUtils.cast(input, outputDatatype.getDatatype());
List<Dataset> out = downsample.value(input);
IDataset dataset = out.get(0);
dataset.setName("downsampled");
List<AxesMetadata> ml = null;
try {
ml = input.getMetadata(AxesMetadata.class);
} catch (Exception e) {
e.printStackTrace();
}
if (ml != null && !ml.isEmpty() && ml.get(0).getAxes() != null) {
AxesMetadata axm;
try {
axm = MetadataFactory.createMetadata(AxesMetadata.class, 2);
} catch (MetadataException e1) {
throw new OperationException(this, e1);
}
AxesMetadata inm = ml.get(0);
int rank = inm.getAxes().length;
Downsample dsax = new Downsample(DownsampleMode.MEAN, y,x);
for (int i = 0; i<rank;i++) {
ILazyDataset[] axis = inm.getAxis(i);
if (axis == null) continue;
ILazyDataset[] o = new ILazyDataset[axis.length];
for (int j = 0; j < axis.length; j++) {
if (axis[j] != null) {
try {
o[j] = dsax.value(axis[j].getSlice()).get(0);
} catch (DatasetException e) {
throw new OperationException(this, e);
}
o[j].setName(axis[j].getName());
}
}
axm.setAxis(i, o);
}
dataset.setMetadata(axm);
}
return new OperationData(dataset);
}
@Override
public OperationRank getInputRank() {
return OperationRank.TWO;
}
@Override
public OperationRank getOutputRank() {
return OperationRank.TWO;
}
}