package cz.cuni.lf1.lge.ThunderSTORM.estimators; import cz.cuni.lf1.lge.ThunderSTORM.estimators.PSF.MoleculeDescriptor; import cz.cuni.lf1.lge.ThunderSTORM.estimators.PSF.PSFModel; import org.apache.commons.math3.analysis.MultivariateFunction; import org.apache.commons.math3.analysis.MultivariateMatrixFunction; import org.apache.commons.math3.analysis.MultivariateVectorFunction; import java.util.Arrays; public class LsqMleSinglePlaneFunctions implements ILsqFunctions, IMleFunctions { PSFModel psfModel; SubImage subimage; public LsqMleSinglePlaneFunctions(PSFModel psfModel, SubImage subimage) { assert (psfModel != null); assert (subimage != null); this.psfModel = psfModel; this.subimage = subimage; } @Override public double[] getInitialParams() { return psfModel.getInitialParams(subimage); } @Override public MultivariateVectorFunction getValueFunction() { return psfModel.getValueFunction(subimage.xgrid, subimage.ygrid); } @Override public MultivariateFunction getLikelihoodFunction() { return psfModel.getLikelihoodFunction(subimage.xgrid, subimage.ygrid, subimage.values); } @Override public MultivariateMatrixFunction getJacobianFunction() { return psfModel.getJacobianFunction(subimage.xgrid, subimage.ygrid); } @Override public double[] calcWeights(boolean useWeighting) { double[] weights = new double[subimage.values.length]; if(!useWeighting){ Arrays.fill(weights, 1); } else { double minWeight = 1.0 / subimage.getMax(); double maxWeight = 1000 * minWeight; for (int i = 0; i < subimage.values.length; i++) { double weight = 1 / subimage.values[i]; if (Double.isInfinite(weight) || Double.isNaN(weight) || weight > maxWeight) { weight = maxWeight; } weights[i] = weight; } } return weights; } @Override public double[] getObservations() { return subimage.values; } @Override public MoleculeDescriptor.Units getImageUnits() { return subimage.units; } }