diff --git a/src/ImageJ/Demo_Pixel_Replication.class b/src/ImageJ/Demo_Pixel_Replication.class
index b93e6f65527073fe6c482c886466be859450ebeb..abfd6f25b4ce98887396f6b55dc3cf91c4faff58 100644
Binary files a/src/ImageJ/Demo_Pixel_Replication.class and b/src/ImageJ/Demo_Pixel_Replication.class differ
diff --git a/src/ImageJ/Demo_Pixel_Replication.java b/src/ImageJ/Demo_Pixel_Replication.java
index 36c8ffb9fe5cb014a1f90dcdec73cb6a23508a76..3073d3ffc38677fb0145da596ca5a0db7f225d0d 100755
--- a/src/ImageJ/Demo_Pixel_Replication.java
+++ b/src/ImageJ/Demo_Pixel_Replication.java
@@ -4,8 +4,6 @@ import ij.process.*;
 import ij.gui.*;
 import java.awt.*;
 import java.awt.image.*;
-import java.nio.ByteBuffer;
-import java.nio.FloatBuffer;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.Random;
@@ -15,16 +13,8 @@ import java.util.List;
 import org.opencv.core.Core;
 import org.opencv.core.Mat;
 import org.opencv.core.CvType;
-import org.opencv.core.Scalar;
-import org.opencv.core.MatOfPoint2f;
-import org.opencv.core.Size;
-import org.opencv.ml.*;
+import org.opencv.ml.EM;
 import org.opencv.imgproc.Imgproc;
-import org.opencv.utils.Converters;
-
-// import org.bytedeco.javacpp.indexer.*;
-// import org.bytedeco.javacpp.indexer.DoubleIndexer;
-// import org.bytedeco.javacpp.opencv_ml.*;
 
 public class Demo_Pixel_Replication implements PlugInFilter {
 
@@ -44,7 +34,7 @@ public class Demo_Pixel_Replication implements PlugInFilter {
         UniqPts = new ArrayList<>();
         PrPts = new ArrayList<>();
         rnd = new Random();
-        // Core.setRNGSeed(rnd.nextInt());
+        Core.setRNGSeed(rnd.nextInt());
     }
 
     public int setup(String arg, ImagePlus imp) {
@@ -82,8 +72,6 @@ public class Demo_Pixel_Replication implements PlugInFilter {
 
         // use distance transform to populate UniqPts and PrPts
         Mat distMat = DistTransform(ipMat);
-        // byte buff[] = new byte[distMat.total() * distMat.channels()];
-        // distMat.get(0, 0, buff);
 
         for (int y=r.y; y<(r.y+r.height); y++) {
             for (int x=r.x; x<(r.x+r.width); x++) {
@@ -92,9 +80,7 @@ public class Demo_Pixel_Replication implements PlugInFilter {
                 if (n > 0) {
                     Point p = new Point(x, y);
                     UniqPts.add(p);
-                    long rep = Math.round((double)n/1.0);
-                    // long rep = 1;
-                    if (rep == 0) rep = 1;
+                    long rep = Math.round((double)n);
                     for (int i = 0; i < rep; i++) {
                         PrPts.add(p);
                     }
@@ -102,7 +88,7 @@ public class Demo_Pixel_Replication implements PlugInFilter {
             }
         }
 
-        IJ.log(String.format("%d unique points, %d pixel rep points", UniqPts.size(), PrPts.size()));
+        // IJ.log(String.format("%d unique points, %d pixel rep points", UniqPts.size(), PrPts.size()));
 
         // compute the gmm
         EM em = computeGMM(k);
@@ -134,8 +120,6 @@ public class Demo_Pixel_Replication implements PlugInFilter {
             Core.eigen(covs.get(i), true, eigVal, eigVec);
             double[] valIdx = new double[2];
             eigVal.get(0, 0, valIdx);
-            // DoubleIndexer valIdx = eigVal.createIndexer();
-            // if (valIdx.get(0,0) > valIdx.get(1,0)) {
             if (valIdx[0] > valIdx[1]) {
                 hi = 0;
                 lo = 1;
@@ -146,16 +130,8 @@ public class Demo_Pixel_Replication implements PlugInFilter {
 
             double A = Math.sqrt(valIdx[hi] * 20 / 3);
             double B = Math.sqrt(valIdx[lo] * 20 / 3);
-            // double aspectRatio = B / A;
 
             EllipseRoi elRoi = makeEllipseRoi(means.row(i), eigVec.row(hi), A, B);
-            // Mat end1 = new Mat();
-            // Mat end2 = new Mat();
-            // scaleAdd(eigVec.row(hi), A, means.row(i), end1);
-            // scaleAdd(eigVec.row(hi), -A, means.row(i), end2);
-            // DoubleIndexer end1Idx = end1.createIndexer();
-            // DoubleIndexer end2Idx = end2.createIndexer();
-            // EllipseRoi elRoi = new EllipseRoi(end1Idx.get(0,0), end1Idx.get(0,1), end2Idx.get(0,0), end2Idx.get(0,1), aspectRatio);
             elRoi.setStrokeWidth(2);
             elRoi.setStrokeColor(Color.red);
             ellipses.add(elRoi);
@@ -184,19 +160,15 @@ public class Demo_Pixel_Replication implements PlugInFilter {
     private Mat PrPts2Mat(ArrayList<Point> PrPts, double pct) {
         ArrayList<Point> ShufPts = new ArrayList<Point>(PrPts);
         Collections.shuffle(ShufPts);
-        // ArrayList<MatOfPoint2f> SampPts = new ArrayList<MatOfPoint2f>(ShufPts.subList(0, (int) (ShufPts.size() * pct)));
-        // return PrPts2Mat(SampPts);
         return PrPts2Mat(new ArrayList<Point>(ShufPts.subList(0, (int) (ShufPts.size() * pct))));
     }
 
     private Mat PrPts2Mat(ArrayList<Point> PrPts) {
         Mat emMat = new Mat(PrPts.size(), 2, CvType.CV_32FC1);
-        // FloatIndexer emMatIndexer = emMat.createIndexer();
         for (int i = 0; i < PrPts.size(); i++) {
             Point p = PrPts.get(i);
             float[] vals = { p.x, p.y };
             emMat.put(i, 0, vals);
-            // emMatIndexer.put(i, 1, p.y());
         }
 
         return emMat;
@@ -206,7 +178,6 @@ public class Demo_Pixel_Replication implements PlugInFilter {
         EM bestEm = new EM();
         double bestScore = -1e300;
         int bestI = 0;
-        // Mat initMeans = randomInitMeans(k);
 
         for (int i = 1; i <= Replicates; i++) {
             IJ.log(String.format("replicate %d", i));
@@ -214,7 +185,6 @@ public class Demo_Pixel_Replication implements PlugInFilter {
             Mat logLikelihoods = new Mat(PrPts.size(), 1, CvType.CV_64FC1);
             Mat labels = new Mat(PrPts.size(), 1, CvType.CV_32FC1);
             Mat covs0 = makeInitCovs(k);
-            // ArrayList<Mat> covs0 = makeInitCovs(k);
             Mat weights0 = makeInitWeights(k);
             em.setInt("nclusters", k);
             em.setInt("covMatType", EM.COV_MAT_GENERIC);
@@ -224,16 +194,8 @@ public class Demo_Pixel_Replication implements PlugInFilter {
             // Mat emMat = PrPts2Mat(PrPts, 0.10);
             Mat emMat = PrPts2Mat(PrPts);
             Mat initMeans = randomInitMeans(k);
-            // em.trainE(emMat, initMeans, noArray());
-            // if (!em.trainE(emMat, initMeans, new Mat(), new Mat(), logLikelihoods, labels, new Mat()))
-            // try {
-                IJ.log("calling trainE");
-                if (!em.trainE(emMat, initMeans, covs0, weights0, logLikelihoods, labels, new Mat()))
-                // if (!em.train(emMat, logLikelihoods, new Mat(), new Mat()))
-                    IJ.log("trainE() returned false!");
-            // } catch (Exception e) {
-            //     IJ.log(String.format("exception calling trainE: %s", e.getMessage()));
-            // }
+            if (!em.trainE(emMat, initMeans, covs0, weights0, logLikelihoods, labels, new Mat()))
+                IJ.log("trainE() returned false!");
             double score = addUp(logLikelihoods.col(0));
             IJ.log(String.format("score = %f", score));
             if (score > bestScore) {
@@ -243,73 +205,27 @@ public class Demo_Pixel_Replication implements PlugInFilter {
             }
         }
 
-        IJ.log(String.format("best replicate was %d", bestI));
+        // IJ.log(String.format("best replicate was %d", bestI));
         return bestEm;
     }
 
     private double addUp(Mat m) {
-        // DoubleIndexer idx = m.createIndexer();
         double total = 0;
         double[] data = new double[(int) m.total()];
         m.get(0, 0, data);
 
-        for (int i = 0; i < m.total(); i++)
-            total += data[i];
-
-        // for (int r = 0; r < m.rows(); r++) {
-        //     double[] idx = m.get(r, 0);
-        //     // total += idx.get(r, 0);
-        //     total += idx[0];
-        // }
+        for (double val : data)
+            total += val;
 
         return total;
     }
 
     private Mat makeInitCovs(int k) {
-    // private ArrayList<Mat> makeInitCovs(int k) {
-        // Mat covs0 = new Mat(1, 4*k, CV_64FC1); 
-        // DoubleIndexer idx = covs0.createIndexer();
-        // for (int i = 0; i < 4*k; i += 4) {
-        //     idx.put(0, i,   1);
-        //     idx.put(0, i+1, 0);
-        //     idx.put(0, i+2, 0);
-        //     idx.put(0, i+3, 1);
-        // }
-
-        // return covs0;
-        // return new Mat();
-        // return Mat.eye(new Size(2,2), CvType.CV_64F);
-
-        IJ.log("eye = " + Mat.eye(new Size(2,2), CvType.CV_64F).dump());
-        IJ.log("eye channels = " + Mat.eye(new Size(2,2), CvType.CV_64F).channels());
-        IJ.log("eye size = " + Mat.eye(new Size(2,2), CvType.CV_64F).size());
-
-        ArrayList<Mat> mats = new ArrayList<Mat>();
-        for (int i = 0; i < k; i++) 
-            mats.add(Mat.eye(new Size(2,2), CvType.CV_64F));
-        // return mats;
-
-        Mat res = Converters.vector_Mat_to_Mat(mats);
-        // res = res.reshape(2, 2);
-        Size size = res.size();
-        IJ.log(String.format("mats.size() = %d, res.size() = %f x %f", mats.size(), size.height, size.width));
-        IJ.log("covs = " + res.dump());
-        IJ.log("res.channels = " + res.channels());
-        IJ.log("res.size = " + res.size());
-        return res;
+        return new Mat();
     }
 
     private Mat makeInitWeights(int k) {
-        // Mat weights0 = new Mat(k, 1, CV_64FC1);
-        // DoubleIndexer idx = weights0.createIndexer();
-        // double weight = 1/k;
-
-        // for (int r = 0; r < k; r++)
-        //     idx.put(r, 0, weight);
-
-        // return weights0;
-        // return new Mat();
-        return new Mat(k, 1, CvType.CV_64F, new Scalar(1/k));
+        return new Mat();
     }
 
     private EllipseRoi makeEllipseRoi(Mat center, Mat unitVec, double A, double B) {
@@ -326,7 +242,6 @@ public class Demo_Pixel_Replication implements PlugInFilter {
         end1.get(0, 0, data1);
         end2.get(0, 0, data2);
 
-        // return new EllipseRoi(end1Idx.get(0,0), end1Idx.get(0,1), end2Idx.get(0,0), end2Idx.get(0,1), aspectRatio);
         return new EllipseRoi(data1[0], data1[1], data2[0], data2[1], aspectRatio);
     }
 
@@ -343,25 +258,16 @@ public class Demo_Pixel_Replication implements PlugInFilter {
             int j = rnd.nextInt(UniqPts.size());
             if (!used.contains(j)) {
                 Point p = UniqPts.get(j);
-                // meansIdx.put(i, 0, p.x());
-                // meansIdx.put(i, 1, p.y());
                 meansData[n++] = p.x;
                 meansData[n++] = p.y;
                 used.add(j);
-                IJ.log(String.format("random pt %d: (%d,%d)", i, p.x, p.y));
+                // IJ.log(String.format("random pt %d: (%d,%d)", i, p.x, p.y));
                 i++;
             }
         }
 
         means.put(0, 0, meansData);
 
-        for (int r = 0; r < means.rows(); r++) {
-            for (int c = 0; c < means.cols(); c++) {
-                double[] val = means.get(r, c);
-                IJ.log(String.format("means(%d,%d) = %f", r, c, val[0]));
-            }
-        }
-
         return means;
     }
 }