use of uk.ac.sussex.gdsc.smlm.function.PoissonLikelihoodWrapper in project GDSC-SMLM by aherbert.
the class MaximumLikelihoodFitter method createLikelihoodWrapper.
private LikelihoodWrapper createLikelihoodWrapper(NonLinearFunction function, int n, double[] y, double[] a) {
LikelihoodWrapper maximumLikelihoodFunction = null;
final double myAlpha = (this.alpha > 0) ? this.alpha : 1;
// We can use different likelihood wrapper functions:
switch(likelihoodFunction) {
case POISSON_GAMMA_GAUSSIAN:
// Poisson-Gamma-Gaussian - EM-CCD data
maximumLikelihoodFunction = new PoissonGammaGaussianLikelihoodWrapper(function, a, y, n, myAlpha, sigma);
break;
case POISSON_GAUSSIAN:
// Sigma must be positive, otherwise fall back to a Poisson likelihood function
if (sigma > 0) {
maximumLikelihoodFunction = new PoissonGaussianLikelihoodWrapper(function, a, y, n, myAlpha, sigma);
}
break;
default:
// Poisson - most counting data
break;
}
// Check if the method requires the gradient but it cannot be computed
if (maximumLikelihoodFunction == null || (searchMethod.usesGradient && !maximumLikelihoodFunction.canComputeGradient())) {
// Ensure no negative data for the Poisson likelihood method.
// Just truncate the counts for now. These are from noise in the count estimates that we do
// not model.
final double[] y2 = new double[n];
for (int i = 0; i < n; i++) {
if (y[i] < 0) {
y2[i] = 0;
} else {
y2[i] = y[i];
}
}
final PoissonLikelihoodWrapper mlFunction = new PoissonLikelihoodWrapper(function, a, y2, n, myAlpha);
// so leave alone.
if (!searchMethod.usesGradient) {
mlFunction.setAllowNegativeExpectedValues(true);
}
maximumLikelihoodFunction = mlFunction;
}
return maximumLikelihoodFunction;
}
Aggregations