package cz.cuni.lf1.lge.ThunderSTORM.estimators; import static cz.cuni.lf1.lge.ThunderSTORM.estimators.PSF.PSFModel.Params.LABEL_INTENSITY; import static cz.cuni.lf1.lge.ThunderSTORM.estimators.PSF.PSFModel.Params.LABEL_SIGMA; import static cz.cuni.lf1.lge.ThunderSTORM.estimators.PSF.PSFModel.Params.LABEL_SIGMA1; import static cz.cuni.lf1.lge.ThunderSTORM.estimators.PSF.PSFModel.Params.LABEL_OFFSET; import cz.cuni.lf1.lge.ThunderSTORM.estimators.PSF.EllipticGaussianPSF; import cz.cuni.lf1.lge.ThunderSTORM.estimators.PSF.EllipticGaussianWAnglePSF; import cz.cuni.lf1.lge.ThunderSTORM.estimators.PSF.IntegratedSymmetricGaussianPSF; import cz.cuni.lf1.lge.ThunderSTORM.estimators.PSF.Molecule; import cz.cuni.lf1.lge.ThunderSTORM.estimators.PSF.PSFModel.Params; import cz.cuni.lf1.lge.ThunderSTORM.estimators.PSF.SymmetricGaussianPSF; import org.junit.Test; import static org.junit.Assert.*; public class OneLocationFittersTest { @Test public void testLSQSymmetric() { System.out.println("testLSQSymmetric"); testFitter(new LSQFitter(new SymmetricGaussianPSF(1.5), false, Params.BACKGROUND)); testFitter(new LSQFitter(new SymmetricGaussianPSF(1.5), true, Params.BACKGROUND)); } @Test public void testLSQIntSymmetric() { System.out.println("testLSQIntSymmetric"); testFitter(new LSQFitter(new IntegratedSymmetricGaussianPSF(1.2), false, Params.BACKGROUND)); testFitter(new LSQFitter(new IntegratedSymmetricGaussianPSF(1.2), true, Params.BACKGROUND)); } @Test public void testLSQEllipticWAngle() { System.out.println("testLSQEllipticWAngle"); testFitter(new LSQFitter(new EllipticGaussianWAnglePSF(1.2, 0), false, Params.BACKGROUND)); testFitter(new LSQFitter(new IntegratedSymmetricGaussianPSF(1.2), true, Params.BACKGROUND)); } @Test public void testLSQElliptic() { System.out.println("testLSQElliptic"); testFitter(new LSQFitter(new EllipticGaussianPSF(1.2, 0), false, Params.BACKGROUND)); testFitter(new LSQFitter(new EllipticGaussianPSF(1.2, 0), true, Params.BACKGROUND)); } @Test public void testMLESymmetric() { System.out.println("testMLESymmetric"); testFitter(new MLEFitter(new SymmetricGaussianPSF(1.2), Params.BACKGROUND)); } public void testMLEIntSymmetric() { System.out.println("testMLEIntSymmetric"); testFitter(new MLEFitter(new IntegratedSymmetricGaussianPSF(1.2), Params.BACKGROUND)); } @Test public void testMLEElliptic() { System.out.println("testMLEElliptic"); testFitter(new MLEFitter(new EllipticGaussianPSF(1.2, 0), Params.BACKGROUND)); } @Test public void testMLEEllipticWAngle() { System.out.println("testMLEEllipticWAngle"); testFitter(new MLEFitter(new EllipticGaussianWAnglePSF(1.2, 0), Params.BACKGROUND)); } @Test public void testRadialSymmetry() { System.out.println("testRadialSymmetry"); Molecule psf = fitTestData(new RadialSymmetryFitter()); System.out.println(psf.toString()); assertEquals(1, psf.getX(), 1e-3); assertEquals(0, psf.getY(), 1e-3); } public void testFitter(IOneLocationFitter fitter) { Molecule fit = fitTestData(fitter); System.out.println(fit.toString()); double[] groundTruth = {1, 0, 1, 1.5, 0}; assertEquals(groundTruth[0], fit.getX(), 10e-3); assertEquals(groundTruth[1], fit.getY(), 10e-3); assertEquals(groundTruth[2], fit.getParam(LABEL_INTENSITY), 10e-3); assertEquals(groundTruth[4], fit.getParam(LABEL_OFFSET), 10e-3); if(fit.hasParam(LABEL_SIGMA)) { assertEquals(groundTruth[3], fit.getParam(LABEL_SIGMA), 0.1); // symmetric PSF } else { assertEquals(groundTruth[3], fit.getParam(LABEL_SIGMA1), 0.1); // eliptic PSF } } private Molecule fitTestData(IOneLocationFitter fitter) { double[] values = { 1.4175035112951352E-7, 1.5056067251874795E-6, 1.0387350450247402E-5, 4.6596555689039867E-5, 1.3603475690306496E-4, 2.5864120226361595E-4, 3.203992064538993E-4, 2.5864120226361595E-4, 1.3603475690306496E-4, 4.6596555689039867E-5, 1.0387350450247402E-5, 9.779516450051282E-7, 1.0387350450247402E-5, 7.166350121265529E-5, 3.2147488824231735E-4, 9.385191163983373E-4, 0.0017843947983501222, 0.002210470228208766, 0.0017843947983501222, 9.385191163983373E-4, 3.2147488824231735E-4, 7.166350121265529E-5, 4.3869876640759965E-6, 4.6596555689039867E-5, 3.2147488824231735E-4, 0.00144210235366173, 0.004210097510616101, 0.008004606371066857, 0.00991593569322976, 0.008004606371066857, 0.004210097510616101, 0.00144210235366173, 3.2147488824231735E-4, 1.2807444490144886E-5, 1.3603475690306496E-4, 9.385191163983373E-4, 0.004210097510616101, 0.01229102844461037, 0.02336878049655781, 0.02894874699531102, 0.02336878049655781, 0.01229102844461037, 0.004210097510616101, 9.385191163983373E-4, 2.4350635942371895E-5, 2.5864120226361595E-4, 0.0017843947983501222, 0.008004606371066857, 0.02336878049655781, 0.04443077358068976, 0.05503989493087988, 0.04443077358068976, 0.02336878049655781, 0.008004606371066857, 0.0017843947983501222, 3.0165048585846606E-5, 3.203992064538993E-4, 0.002210470228208766, 0.00991593569322976, 0.02894874699531102, 0.05503989493087988, 0.06818224824514224, 0.05503989493087988, 0.02894874699531102, 0.00991593569322976, 0.002210470228208766, 2.4350635942371895E-5, 2.5864120226361595E-4, 0.0017843947983501222, 0.008004606371066857, 0.02336878049655781, 0.04443077358068976, 0.05503989493087988, 0.04443077358068976, 0.02336878049655781, 0.008004606371066857, 0.0017843947983501222, 1.2807444490144886E-5, 1.3603475690306496E-4, 9.385191163983373E-4, 0.004210097510616101, 0.01229102844461037, 0.02336878049655781, 0.02894874699531102, 0.02336878049655781, 0.01229102844461037, 0.004210097510616101, 9.385191163983373E-4, 4.3869876640759965E-6, 4.6596555689039867E-5, 3.2147488824231735E-4, 0.00144210235366173, 0.004210097510616101, 0.008004606371066857, 0.00991593569322976, 0.008004606371066857, 0.004210097510616101, 0.00144210235366173, 3.2147488824231735E-4, 9.779516450051282E-7, 1.0387350450247402E-5, 7.166350121265529E-5, 3.2147488824231735E-4, 9.385191163983373E-4, 0.0017843947983501222, 0.002210470228208766, 0.0017843947983501222, 9.385191163983373E-4, 3.2147488824231735E-4, 7.166350121265529E-5, 1.4175035112951352E-7, 1.5056067251874795E-6, 1.0387350450247402E-5, 4.6596555689039867E-5, 1.3603475690306496E-4, 2.5864120226361595E-4, 3.203992064538993E-4, 2.5864120226361595E-4, 1.3603475690306496E-4, 4.6596555689039867E-5, 1.0387350450247402E-5}; double[] xgrid = new double[values.length]; double[] ygrid = new double[values.length]; int idx = 0; for(int i = -5; i <= 5; i++) { for(int j = -5; j <= 5; j++) { xgrid[idx] = j; ygrid[idx] = i; idx++; } } Molecule fit = fitter.fit(new SubImage(11, 11, xgrid, ygrid, values, 0.5, 0.5)); return fit; } }