package org.dawnsci.surfacescatter; import org.eclipse.january.dataset.Dataset; import org.eclipse.january.dataset.DatasetFactory; import org.eclipse.january.dataset.Maths; import uk.ac.diamond.scisoft.analysis.fitting.Fitter; import uk.ac.diamond.scisoft.analysis.fitting.functions.Polynomial; public class PolynomialOverlapSXRD { public static double correctionRatio(Dataset[] xLowerDataset, Dataset yLowerDataset, Dataset[] xHigherDataset, Dataset yHigherDataset, double attenuationFactor, int power) { Polynomial polyFitLower = Fitter.polyFit(xLowerDataset, yLowerDataset, 1e-5,power); Polynomial polyFitHigher = Fitter.polyFit(xHigherDataset, yHigherDataset, 1e-5,power); Dataset calculatedValuesHigher = polyFitHigher.calculateValues(xHigherDataset); Dataset calculatedValuesLower = polyFitLower.calculateValues(xLowerDataset); Dataset calculatedValuesHigherAv = Maths.divide(calculatedValuesHigher.sum(), calculatedValuesHigher.getShape()[0]); Dataset calculatedValuesLowerAv = Maths.divide(calculatedValuesLower.sum(), calculatedValuesLower.getShape()[0]); Dataset correctionsRatioDataset = Maths.divide(calculatedValuesLowerAv, calculatedValuesHigherAv); double correction = ((double) correctionsRatioDataset.sum())*attenuationFactor; return correction; } public static double correctionRatio1(Dataset[] xLowerDataset, Dataset yLowerDataset, Dataset[] xHigherDataset, Dataset yHigherDataset, double attenuationFactor, int power) { Polynomial polyFitLower = Fitter.polyFit(xLowerDataset, yLowerDataset, 1e-5,power); Polynomial polyFitHigher = Fitter.polyFit(xHigherDataset, yHigherDataset, 1e-5,power); double minXLower = minValue(xLowerDataset); double maxXLower = maxValue(xLowerDataset); double minXHigher = minValue(xHigherDataset); double maxXHigher = maxValue(xHigherDataset); int numberOfTestPoints = 100; Dataset xLowerTestArray= DatasetFactory.zeros(new int[] {numberOfTestPoints}, Dataset.ARRAYFLOAT64); Dataset xHigherTestArray = DatasetFactory.zeros(new int[] {numberOfTestPoints}, Dataset.ARRAYFLOAT64); for(int i =0 ; i <numberOfTestPoints ; i++){ double p = minXLower + (i+1)*((maxXLower - minXLower)/numberOfTestPoints); xLowerTestArray.set(p, i); double q = minXHigher+ (i+1)*((maxXHigher- minXHigher)/numberOfTestPoints); xHigherTestArray.set(q, i); } Dataset calculatedValuesHigher = polyFitHigher.calculateValues(xHigherTestArray); Dataset calculatedValuesLower = polyFitLower.calculateValues(xLowerTestArray); // System.out.println( "calculatedValuesLower.shape: " + calculatedValuesLower.getShape()); double runningSum = 0; for(int j = 0; j <numberOfTestPoints ; j++){ double r = (calculatedValuesLower.getDouble(j) / calculatedValuesHigher.getDouble(j)); runningSum += r; } double correction = runningSum/numberOfTestPoints; return correction; } public static double[][] correctionRatio2(Dataset[] xLowerDataset, Dataset yLowerDataset, Dataset[] xHigherDataset, Dataset yHigherDataset, double attenuationFactor, int power) { Polynomial polyFitLower = Fitter.polyFit(xLowerDataset, yLowerDataset, 1e-5,power); Polynomial polyFitHigher = Fitter.polyFit(xHigherDataset, yHigherDataset, 1e-5,power); double[] lowerParams = polyFitLower.getParameterValues(); double[] higherParams = polyFitLower.getParameterValues(); double minXLower = minValue(xLowerDataset); double maxXLower = maxValue(xLowerDataset); double minXHigher = minValue(xHigherDataset); double maxXHigher = maxValue(xHigherDataset); int numberOfTestPoints = 100; Dataset xLowerTestArray= DatasetFactory.zeros(new int[] {numberOfTestPoints}, Dataset.ARRAYFLOAT64); Dataset xHigherTestArray = DatasetFactory.zeros(new int[] {numberOfTestPoints}, Dataset.ARRAYFLOAT64); for(int i =0 ; i <numberOfTestPoints ; i++){ double p = minXLower + (i+1)*((maxXLower - minXLower)/numberOfTestPoints); xLowerTestArray.set(p, i); double q = minXHigher+ (i+1)*((maxXHigher- minXHigher)/numberOfTestPoints); xHigherTestArray.set(q, i); } Dataset calculatedValuesHigher = polyFitHigher.calculateValues(xHigherTestArray); Dataset calculatedValuesLower = polyFitLower.calculateValues(xLowerTestArray); // System.out.println( "calculatedValuesLower.shape: " + calculatedValuesLower.getShape()); double runningSum = 0; for(int j = 0; j <numberOfTestPoints ; j++){ double r = (calculatedValuesLower.getDouble(j) / calculatedValuesHigher.getDouble(j)); runningSum += r; } double[] correction = new double[] {(runningSum/numberOfTestPoints)}; return new double[][] {lowerParams, higherParams, correction}; } public static double maxValue(Dataset[] input){ double maxValue = input[0].getDouble(0); for (int i = 1; i < input.length; i++) { if (input[i].getDouble(0) > maxValue) { maxValue = input[i].getDouble(0); } } return maxValue; } public static double minValue(Dataset[] input){ double minValue = input[0].getDouble(0); for (int i = 1; i < input.length; i++) { if (input[i].getDouble(0) < minValue) { minValue = input[i].getDouble(0); } } return minValue; } }