/*
* Copyright (c) 2014, 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 org.eclipse.dawnsci.analysis.dataset.slicer;
import java.util.Arrays;
import org.apache.commons.lang.ArrayUtils;
import org.eclipse.january.dataset.Slice;
import org.eclipse.january.dataset.SliceND;
public class SliceInformation {
private SliceND currentSlice;
private int number;
private SliceND output;
private SliceND sampling;
private int[] dataDimensions;
private int totalSlices;
/**
* Object to store the information about where a slice is from in a lazy dataset
*
* @param current - slice describing where this data comes from in the original dataset
* @param output - slice describing where this data goes in the output dataset
* @param sampling - slice describing how original data is subsampled for iteration
* @param dataDimensions - dimensions which correspond to the data (as apposed to the stack or scan)
* @param total - total number of slices that can be taken
* @param number - which number this slice corresponds to
*/
public SliceInformation(SliceND current, SliceND output, SliceND sampling, int[] dataDimensions, int total, int number) {
this.currentSlice = current;
this.number = number;
this.output = output;
this.dataDimensions = dataDimensions;
this.totalSlices = total;
this.sampling = sampling;
}
public Slice[] getSliceFromInput() {
return currentSlice.convertToSlice();
}
public Slice[] getSliceInOutput() {
return output.convertToSlice();
}
public int getSliceNumber() {
return number;
}
public int[] getSubSampledShape() {
return sampling.getShape();
}
public Slice[] getSubSampling() {
return sampling.convertToSlice();
}
@Override
public SliceInformation clone() {
return new SliceInformation(currentSlice.clone(), output.clone(), sampling.clone(),
dataDimensions.clone(), totalSlices, number);
}
public int getTotalSlices() {
return totalSlices;
}
public int[] getDataDimensions() {
return dataDimensions;
}
public boolean isDataDimension(int dim) {
return ArrayUtils.contains(dataDimensions, dim);
}
public void reducedDimensionToSingular(int dim) {
Slice[] cs = output.convertToSlice();
int[] sss = sampling.getShape();
Slice[] ss = sampling.convertToSlice();
sss[dim] = 1;
cs[dim].setStart(0);
cs[dim].setStop(1);
cs[dim].setStep(1);
ss[dim].setStart(0);
ss[dim].setStop(1);
ss[dim].setStep(1);
output = new SliceND(sss, cs);
sampling = new SliceND(sss,ss);
}
public void reducedDimension(int dim, int size, int current) {
Slice[] cs = output.convertToSlice();
int[] sss = sampling.getShape();
Slice[] ss = sampling.convertToSlice();
sss[dim] = size;
cs[dim].setStart(current);
cs[dim].setStop(current+1);
cs[dim].setStep(1);
ss[dim].setStart(0);
ss[dim].setStop(size);
ss[dim].setStep(1);
output = new SliceND(sss, cs);
sampling = new SliceND(sss,ss);
}
public SliceND getInputSliceWithoutDataDimensions() {
return removeDimensionsFromInputSlice(dataDimensions);
}
public SliceND removeDimensionsFromInputSlice(int[] dims) {
int newRank = currentSlice.getShape().length-dims.length;
Slice[] oSlice = currentSlice.convertToSlice();
int[] oShape = sampling.getShape().clone();
Slice[] newSlice = new Slice[newRank];
int[] newShape = new int[newRank];
int index = 0;
for (int i = 0; i < oSlice.length; i++) {
if (!ArrayUtils.contains(dims, i)) {
newSlice[i] = oSlice[index];
newShape[i] = oShape[index++];
}
}
return new SliceND(newShape, newSlice);
}
public int calculateFastestDimension() {
int[] dd = dataDimensions.clone();
Arrays.sort(dd);
int[] shape = getSubSampledShape();
for (int i = shape.length-1; i > -1; i--) {
int key = Arrays.binarySearch(dd, i);
if (key < 0) return i;
}
return -1;
}
}