package org.dawnsci.surfacescatter;
import java.util.ArrayList;
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 PolynomialOverlap {
public static double correctionRatio(Dataset[] xLowerDataset, Dataset yLowerDataset,
Dataset[] xHigherDataset, Dataset yHigherDataset, double attenuationFactor) {
Polynomial polyFitLower = Fitter.polyFit(xLowerDataset, yLowerDataset, 1e-5,4);
Polynomial polyFitHigher = Fitter.polyFit(xHigherDataset, yHigherDataset, 1e-5,4);
Dataset calculatedValuesHigher = polyFitHigher.calculateValues(xLowerDataset);
Dataset calculatedValuesLower = polyFitLower.calculateValues(xLowerDataset);
Dataset correctionsRatioDataset = Maths.divide(calculatedValuesLower.sum(),
calculatedValuesHigher.sum());
double correction = ((double) correctionsRatioDataset.sum())/((double) correctionsRatioDataset.getSize())*attenuationFactor;
return correction;
}
public static double[] extrapolatedLocation(double desiredl,
Dataset lValues,
Dataset xValues,
Dataset yValues,
int[] len,
int fitPower){
Dataset[] lValuesHolder = new Dataset[1];
Dataset lValuesNullHolder = DatasetFactory.zeros(lValues, Dataset.ARRAYFLOAT64);
Dataset[] lValuesHolder2 = new Dataset[1];
Dataset lValuesNullHolder2 = DatasetFactory.zeros(lValues, Dataset.ARRAYFLOAT64);
for(int t = 0; t<lValues.getSize(); t++){
lValuesNullHolder.set(lValues.getDouble(t), lValues.getSize()-1-t);
}
lValuesHolder[0] = lValuesNullHolder;
lValuesHolder2[0] = lValues;
Polynomial polyFitYValues = Fitter.polyFit(lValuesHolder2, yValues, 1e-30,fitPower);
Polynomial polyFitXValues = Fitter.polyFit(lValuesHolder2, xValues, 1e-30,fitPower);
Dataset desiredlDat = DatasetFactory.zeros(1);
desiredlDat.set(desiredl, 0);
Dataset yValueDat = polyFitYValues.calculateValues(desiredlDat);
Dataset xValueDat = polyFitXValues.calculateValues(desiredlDat);
double yValue = yValueDat.getDouble(0);
double xValue = xValueDat.getDouble(0);
double[] output = new double[] {yValue, xValue,
yValue, (xValue + len[1]),
(yValue +len[0]), xValue,
(yValue +len[0]), (xValue + len[1])};
return output;
}
}