package org.dawnsci.surfacescatter.test; import static org.junit.Assert.assertTrue; import org.dawnsci.surfacescatter.AnalaysisMethodologies.FitPower; import org.dawnsci.surfacescatter.BoxSlicerRodScanUtilsForDialog; import org.dawnsci.surfacescatter.ExampleModel; import org.dawnsci.surfacescatter.SuperModel; import org.dawnsci.surfacescatter.TwoDFitting; import org.eclipse.dawnsci.analysis.dataset.roi.RectangularROI; import org.eclipse.january.dataset.Dataset; import org.eclipse.january.dataset.DatasetFactory; import org.eclipse.january.dataset.ILazyDataset; import org.eclipse.january.dataset.Maths; import org.junit.Test; public class TwoDFittingTest { public Dataset generateGaussian2DImage(Dataset input, double a, double x0, double y0, double sigmaX, double sigmaY, double offsetX, double offsetY){ Dataset output = DatasetFactory.ones(input); ///running over x direction: for (int x =0; x< input.getShape()[0]; x++){ ///running over y direction: for (int y =0; y< input.getShape()[0]; y++){ double xTerm = ((x + offsetX - x0)*(x + offsetX - x0))/(2*sigmaX*sigmaX); double yTerm = ((y + offsetY - y0)*(y + offsetY - y0))/(2*sigmaY*sigmaY); double z = a*Math.exp(-(xTerm + yTerm)); output.set(z, x, y); } } return output; } public Dataset generateSimplePolynomialBackground(Dataset input, int fitPower, double offset){ Dataset output = DatasetFactory.ones(input); ///running over x direction: for (int x =0; x< input.getShape()[0]; x++){ ///running over y direction: for (int y =0; y< input.getShape()[0]; y++){ ///running over fitpower direction: double result = offset; if (fitPower !=0){ for(int n = 0; n<=fitPower;n++){ double p = Math.pow(x, n)*Math.pow(y, fitPower-n); result +=p; } } else{ } output.set(result, y, x); } } return output; } @Test public void testTwoDFitting1() throws Exception { ExampleModel model = new ExampleModel(); SuperModel sm = new SuperModel(); RectangularROI box= new RectangularROI(); box.setLengths(10, 10); box.setPoint(40, 40); int[][] lenPt = new int[2][]; lenPt[0] = new int[] {10,10}; lenPt[1] = new int[] {45,45}; model.setBox(box); model.setBoundaryBox(40); model.setFitPower(FitPower.TWO); model.setLenPt(lenPt); Dataset input1 = DatasetFactory.ones(new int [] {100,100}); double a = 100; double x0 = 50; double y0 = 50; double sigmaX = 2; double sigmaY = 2; Dataset mainSignal = generateGaussian2DImage(input1, a, x0, y0, sigmaX, sigmaY, 0, 0); ILazyDataset ild = mainSignal; ILazyDataset[] images = new ILazyDataset[1]; images[0] = ild; sm.setImages(images);; Dataset polynomialBackground = generateSimplePolynomialBackground(input1,1,0); Dataset testGeneratedImage = Maths.add(mainSignal, polynomialBackground); // // for(int p=0;p<testGeneratedImage.getShape()[0];p++){ // for(int q=0;q<testGeneratedImage.getShape()[1];q++){ // double noisy = 0; // if(Math.random()>0.5){ // double r = Math.random()*Math.sqrt(testGeneratedImage.getDouble(p, q)); // noisy = testGeneratedImage.getDouble(p, q)+ r; // testGeneratedImage.set(noisy, p,q); // mainSignal.set(mainSignal.getDouble(p, q) +r ,p,q); // } // else{ // double r = Math.random()*Math.sqrt(testGeneratedImage.getDouble(p, q)); // noisy = testGeneratedImage.getDouble(p, q)- r; // testGeneratedImage.set(noisy, p,q); // mainSignal.set(mainSignal.getDouble(p, q) -r ,p,q); // } // // } // } Dataset benchmarkGeneratedImage = BoxSlicerRodScanUtilsForDialog.rOIBox(mainSignal,lenPt[0], lenPt[1]); double signalSum = (double) benchmarkGeneratedImage.sum(); Dataset output = TwoDFitting.TwoDFitting1(testGeneratedImage, model, sm, 0); Dataset outputCheck = Maths.subtract(benchmarkGeneratedImage, output); double oc = ((double) outputCheck.sum()); double check = oc/signalSum; System.out.println("check: " + check); System.out.println("signalSum: " + signalSum); System.out.println("outputCheck sum: " + oc); System.out.println("output sum: " + output.sum()); assertTrue("check value exceds 0.5 resiual after 2D polynomial background subtraction" , Math.abs(check)<0.01); } }