package org.dawnsci.surfacescatter;
import org.eclipse.dawnsci.analysis.api.roi.IROI;
import org.eclipse.dawnsci.analysis.api.roi.IRectangularROI;
import org.eclipse.dawnsci.plotting.api.IPlottingSystem;
import org.eclipse.dawnsci.plotting.api.trace.ILineTrace;
import org.eclipse.january.dataset.Dataset;
import org.eclipse.january.dataset.DatasetFactory;
import org.eclipse.january.dataset.IDataset;
import org.eclipse.swt.widgets.Composite;
public class VerticalHorizontalSlices {
public static ILineTrace horizontalslice(IRectangularROI horizontalSliceBounds,
IPlottingSystem<Composite> pS, IDataset ii, IROI green){
int[] lenh =horizontalSliceBounds.getIntLengths();
lenh[0]= green.getBounds().getIntLengths()[0];
if (green.getBounds().getIntLengths()[1] < lenh[1]){
lenh[1] = green.getBounds().getIntLengths()[1];
}
int[] pth = horizontalSliceBounds.getIntPoint();
int[][] lenpth = new int[][] {lenh,pth};
IDataset iih = ImageSlicerUtils.ImageSliceUpdate(ii, lenpth);
IDataset iihdata = DatasetFactory.zeros(lenh[0]);
int a =lenh[1];
if(lenh[1]>iih.getShape()[0]){
a = iih.getShape()[0];
}
for(int iy = 0;iy<lenh[0];iy++){
double ixsum = 0;
for(int ix = 0; ix<a;ix++){
ixsum += iih.getDouble(ix, iy);
// System.out.println("ix : " +ix);
}
iihdata.set(ixsum, iy);
}
IDataset xhrange = DatasetFactory.createRange(pth[0], pth[0]+lenh[0], 1, Dataset.FLOAT64);
ILineTrace lt1 = pS.createLineTrace("horizontal slice");
lt1.setData(xhrange, iihdata);
return lt1;
}
public static ILineTrace verticalslice(IRectangularROI verticalSliceBounds,
IDataset ii, IPlottingSystem<Composite> pS, IROI green){
int[] lenv =verticalSliceBounds.getIntLengths();
lenv[1]= green.getBounds().getIntLengths()[1];
if (green.getBounds().getIntLengths()[0] < lenv[0]){
lenv[0] = green.getBounds().getIntLengths()[0];
}
int[] ptv = verticalSliceBounds.getIntPoint();
int[][] lenptv = new int[][] {lenv,ptv};
IDataset iiv= ImageSlicerUtils.ImageSliceUpdate(ii, lenptv);
IDataset iivdata = DatasetFactory.zeros(lenv[1]);
int a =lenv[0];
if(lenv[0]>iiv.getShape()[1]){
a = iiv.getShape()[1];
}
for(int iy = 0;iy<lenv[1];iy++){
double ixsum = 0;
for(int ix = 0; ix<a;ix++){
ixsum += iiv.getDouble(iy, ix);
}
iivdata.set(ixsum, iy);
}
IDataset xvrange = null;
try{
xvrange = DatasetFactory.createRange(ptv[1]+lenv[1], ptv[1], -1, Dataset.FLOAT64);
}
catch(Exception n){
xvrange = DatasetFactory.createRange(ptv[1]+lenv[1], ptv[1], 1, Dataset.FLOAT64);
}
ILineTrace lt3 = pS.createLineTrace("vertical slice");
lt3.setData(iivdata, xvrange);
return lt3;
}
public static ILineTrace horizontalsliceBackgroundSubtracted(IRectangularROI horizontalSliceBounds,
IPlottingSystem<Composite> pS,
IDataset background,
IROI green){
int[] lenh =horizontalSliceBounds.getIntLengths();
lenh[0]= green.getBounds().getIntLengths()[0];
if (green.getBounds().getIntLengths()[1] < lenh[1]){
lenh[1] = green.getBounds().getIntLengths()[1];
}
int[] pth = horizontalSliceBounds.getIntPoint();
int[][] lenpth = new int[][] {lenh,pth};
IDataset iih = ImageSlicerUtils.ImageSliceUpdate(background, lenpth);
IDataset iihdata = DatasetFactory.zeros(lenh[0]);
int a =lenh[1];
if(lenh[1]>iih.getShape()[0]){
a = iih.getShape()[0];
}
for(int iy = 0;iy<lenh[0];iy++){
double ixsum = 0;
for(int ix = 0; ix<a;ix++){
ixsum += iih.getDouble(ix, iy);
// System.out.println("ix : " +ix);
}
iihdata.set(ixsum, iy);
}
IDataset xhrange = DatasetFactory.createRange(pth[0], pth[0]+lenh[0], 1, Dataset.FLOAT64);
ILineTrace lt1 = pS.createLineTrace("background sub slice");
lt1.setData(xhrange, iihdata);
return lt1;
}
public static ILineTrace verticalsliceBackgroundSubtracted(IRectangularROI verticalSliceBounds,
IPlottingSystem<Composite> pS,
IDataset background,
IROI green){
int[] lenv =verticalSliceBounds.getIntLengths();
lenv[1]= green.getBounds().getIntLengths()[1];
if (green.getBounds().getIntLengths()[0] < lenv[0]){
lenv[0] = green.getBounds().getIntLengths()[0];
}
int[] ptv = verticalSliceBounds.getIntPoint();
int[][] lenptv = new int[][] {lenv,ptv};
IDataset iiv = ImageSlicerUtils.ImageSliceUpdate(background, lenptv);
IDataset iivdata = DatasetFactory.zeros(lenv[1]);
int a =lenv[0];
if(lenv[0]>iiv.getShape()[1]){
a = iiv.getShape()[1];
}
for(int iy = 0;iy<lenv[1];iy++){
double ixsum = 0;
for(int ix = 0; ix<a;ix++){
ixsum += iiv.getDouble(iy, ix);
}
iivdata.set(ixsum, iy);
}
IDataset xvrange = null;
try{
xvrange = DatasetFactory.createRange(ptv[1]+lenv[1], ptv[1], -1, Dataset.FLOAT64);
}
catch(IllegalArgumentException r){
r.printStackTrace();
xvrange = DatasetFactory.createRange(ptv[1], ptv[1]+lenv[1], 1, Dataset.FLOAT64);
}
ILineTrace lt3 = pS.createLineTrace("background sub slice");
lt3.setData(iivdata, xvrange);
return lt3;
}
}