/*-
* 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.reflectivityandsxrd;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;
import org.eclipse.dawnsci.analysis.api.processing.OperationException;
import org.eclipse.january.IMonitor;
import org.eclipse.january.dataset.Dataset;
import org.eclipse.january.dataset.DatasetFactory;
import org.eclipse.january.dataset.DatasetUtils;
import org.eclipse.january.dataset.DoubleDataset;
import org.eclipse.january.dataset.IDataset;
import org.eclipse.january.dataset.SliceND;
import uk.ac.diamond.scisoft.analysis.processing.operations.roiprofile.BoxIntegration.Direction;
public class BoxSlicerRodScanUtils {
/*
* Slices n dices an image as required to produce background data.
*
*/
public static Dataset rOIBox(IDataset input , IMonitor monitor, int[] len, int[] pt) throws OperationException{
//// This creates in1, which is the ROI of interest
SliceND slice1 = new SliceND(input.getShape());
slice1.setSlice(1, pt[0], pt[0] + len[0], 1);
slice1.setSlice(0, pt[1], pt[1] + len[1], 1);
IDataset small1 = input.getSlice(slice1);
Dataset in1 = DatasetUtils.convertToDataset(small1);
return in1;
}
public static IDataset iAboveOrLeftBox (IDataset input , IMonitor monitor,
int[] len, int[] pt, int boundaryBox, Direction direction) throws OperationException{
switch (direction){
case Y:
SliceND slice2 = new SliceND(input.getShape());
slice2.setSlice(1, pt[0], pt[0] + len[0], 1);
slice2.setSlice(0, pt[1] + len[1], pt[1] + len[1] + boundaryBox, 1);
IDataset small2 = input.getSlice(slice2);
return small2;
case X:
SliceND slice4 = new SliceND(input.getShape());
slice4.setSlice(1, pt[0] + len[0], pt[0]+ len[0] + boundaryBox, 1);
slice4.setSlice(0, pt[1], pt[1] + len[1], 1);
IDataset small4 = input.getSlice(slice4);
return small4;
}
return null;
}
public static IDataset iBelowOrRightBox (IDataset input , IMonitor monitor,
int[] len, int[] pt, int boundaryBox, Direction direction) throws OperationException{
switch (direction){
case Y:
SliceND slice0 = new SliceND(input.getShape());
slice0.setSlice(1, pt[0], pt[0] + len[0], 1);
slice0.setSlice(0, pt[1] - boundaryBox, pt[1], 1);
IDataset small0 = input.getSlice(slice0);
return small0;
case X:
SliceND slice3 = new SliceND(input.getShape());
slice3.setSlice(1, pt[0] - boundaryBox, pt[0], 1);
slice3.setSlice(0, pt[1], pt[1] +len[1], 1);
IDataset small3 = input.getSlice(slice3);
return small3;
}
return null;
}
public static Dataset regionOfRegard (IDataset input , IMonitor monitor,
int[] len, int[] pt, int boundaryBox) throws OperationException{
SliceND slice0 = new SliceND(input.getShape());
slice0.setSlice(1, pt[0]-boundaryBox, pt[0]+len[0]+boundaryBox, 1);
slice0.setSlice(0, pt[1]-boundaryBox, pt[1] + len[1] + boundaryBox, 1);
IDataset small0 = input.getSlice(slice0);
Dataset small0d = DatasetUtils.cast(small0, Dataset.FLOAT64);
return small0d;
}
public static List<Dataset> coordMesh(IDataset input , IMonitor monitor,
int[] len, int[] pt, int boundaryBox) throws OperationException{
Dataset regionOfRegard = regionOfRegard(input, monitor, len, pt, boundaryBox);
Dataset x = DatasetFactory.createRange(regionOfRegard.getShape()[0], Dataset.FLOAT64);
Dataset y = DatasetFactory.createRange(regionOfRegard.getShape()[1], Dataset.FLOAT64);;
List<Dataset> meshGrid = DatasetUtils.meshGrid(x,y);
return meshGrid;
}
public static Dataset[] LeftRightTopBottomBoxes (IDataset input , IMonitor monitor,
int[] len, int[] pt, int boundaryBox) throws OperationException{
Dataset regionOfRegard = regionOfRegard(input, monitor, len, pt, boundaryBox);
int noOfPoints = (len[1] + 2*boundaryBox)*(len[0] +2*boundaryBox) - len[1]*len[0];
DoubleDataset xset = DatasetFactory.zeros(noOfPoints);
DoubleDataset yset = DatasetFactory.zeros(noOfPoints);
DoubleDataset zset = DatasetFactory.zeros(noOfPoints);
int l =0;
for (int i =0; i<(len[1]+2*boundaryBox); i++){
for (int j = 0; j<(len[0] + 2*boundaryBox);j++){
if ((j<boundaryBox || j>=(boundaryBox+len[0]))||(i<boundaryBox || i>=(boundaryBox+len[1]))){
xset.set(i, l);
yset.set(j, l);
zset.set(regionOfRegard.getDouble(i, j), l);
l++;
}
else{
}
}
}
Dataset[] output = new Dataset[3];
output[0] = xset;
output[1] = yset;
output[2] = zset;
return output;
}
public static Dataset[] subRange (IDataset input , IMonitor monitor,
int[] len, int[] pt, int boundaryBox) throws OperationException{
Dataset[] ranges = LeftRightTopBottomBoxes(input, monitor, len, pt, boundaryBox);
int subRangeNo = (int) 0.01*ranges[0].getShape()[0];
if (subRangeNo<100){
subRangeNo = 100;
}
DoubleDataset xSub = DatasetFactory.zeros(subRangeNo);
DoubleDataset ySub = DatasetFactory.zeros(subRangeNo);
DoubleDataset zSub = DatasetFactory.zeros(subRangeNo);
Random rng = new Random();
Set<Integer> subSet = new HashSet<Integer>();
while (subSet.size() < subRangeNo){
Integer next = rng.nextInt(subRangeNo) + 1;
subSet.add(next);
}
java.util.Iterator<Integer> itr = subSet.iterator();
while(itr.hasNext()){
int p = itr.next();
xSub.set(ranges[0].getObject(itr.next()),p);
ySub.set(ranges[1].getObject(itr.next()),p);
zSub.set(ranges[2].getObject(itr.next()),p);
}
Dataset[] output = new Dataset[3];
output[0] = xSub;
output[1] = ySub;
output[2] = zSub;
return output;
}
public static Dataset[] subRange (IDataset input , IMonitor monitor,
int[] len, int[] pt, int boundaryBox, int size) throws OperationException{
Dataset[] ranges = LeftRightTopBottomBoxes(input, monitor, len, pt, boundaryBox);
int subRangeNo = (int) ((int) size*0.01*ranges[0].getShape()[0]);
if (subRangeNo<(size*100)){
subRangeNo = size*100;
}
DoubleDataset xSub = DatasetFactory.zeros(subRangeNo);
DoubleDataset ySub = DatasetFactory.zeros(subRangeNo);
DoubleDataset zSub = DatasetFactory.zeros(subRangeNo);
Random rng = new Random();
Set<Integer> subSet = new HashSet<Integer>();
while (subSet.size() < subRangeNo){
Integer next = rng.nextInt(subRangeNo) + 1;
subSet.add(next);
}
java.util.Iterator<Integer> itr = subSet.iterator();
while(itr.hasNext()){
int p = itr.next();
xSub.set(ranges[0].getObject(itr.next()),p);
ySub.set(ranges[1].getObject(itr.next()),p);
zSub.set(ranges[2].getObject(itr.next()),p);
}
Dataset[] output = new Dataset[3];
output[0] = xSub;
output[1] = ySub;
output[2] = zSub;
return output;
}
public static Dataset[] subRangeDownSample (IDataset input , IMonitor monitor,
int[] len, int[] pt, int boundaryBox, int size, String enc) throws OperationException{
Dataset[] ranges = LeftRightTopBottomBoxes(input, monitor, len, pt, boundaryBox);
int subRangeNo = (int) ((int) size*0.01*ranges[0].getShape()[0]);
if (subRangeNo<(size*100)){
subRangeNo = size*100;
}
DoubleDataset xSub = DatasetFactory.zeros(subRangeNo);
DoubleDataset ySub = DatasetFactory.zeros(subRangeNo);
DoubleDataset zSub = DatasetFactory.zeros(subRangeNo);
Random rng = new Random();
Set<Integer> subSet = new HashSet<Integer>();
while (subSet.size() < subRangeNo){
Integer next = rng.nextInt(subRangeNo) + 1;
subSet.add(next);
}
java.util.Iterator<Integer> itr = subSet.iterator();
while(itr.hasNext()){
int p = itr.next();
xSub.set(ranges[0].getObject(itr.next()),p);
ySub.set(ranges[1].getObject(itr.next()),p);
zSub.set(ranges[2].getObject(itr.next()),p);
}
Dataset[] output = new Dataset[3];
output[0] = xSub;
output[1] = ySub;
output[2] = zSub;
return output;
}
public static DoubleDataset weightingMask (IDataset input , IMonitor monitor,
int[] len, int[] pt, int boundaryBox) throws OperationException{
Dataset regionOfRegard = regionOfRegard(input, monitor, len, pt, boundaryBox);
DoubleDataset mask = DatasetFactory.zeros(new int[] {regionOfRegard.getShape()[0], regionOfRegard.getShape()[1]});
for (int i =0; i<len[1]+2*boundaryBox; i++){
for (int j = 0; j<len[0] + 2*boundaryBox;j++){
if ((i<boundaryBox || i>=boundaryBox+len[1]) || (j<boundaryBox || j>=boundaryBox+len[0])){
mask.set(i,j, 1);
}
}
}
return mask;
}
}
//TEST