Index: trunk/ppTranslate/src/ppMopsMerge.c
===================================================================
--- trunk/ppTranslate/src/ppMopsMerge.c	(revision 28218)
+++ trunk/ppTranslate/src/ppMopsMerge.c	(revision 28220)
@@ -9,5 +9,5 @@
 #include "ppMops.h"
 
-#define LEAF_SIZE 4                     // Size of leaf
+#define LEAF_SIZE 2                     // Size of leaf
 #define MATCH_RADIUS SEC_TO_RAD(1.0)    // Matching radius
 #define MJD_TOL 1.0/3600.0/24.0         // Tolerance for MJD matching
@@ -16,4 +16,12 @@
 #define POSANGLE_TOL SEC_TO_RAD(1.0)    // Tolerance for position angle matching
 #define AIRMASS_TOL 1.0e-3              // Tolerance for airmass matching
+
+#if 0
+#undef psTrace
+#define psTrace(facil, level, ...)              \
+    if (level <= 5) {                           \
+        fprintf(stderr, __VA_ARGS__);           \
+    }
+#endif
 
 // Get distance from detection to centre of image
@@ -171,4 +179,10 @@
             psAssert(indices->n > 0, "Expect at least one match for source %d in input %d", j, i);
 
+            if (indices->n == 1 && sourceMerged->data.U16[indices->data.S64[0]] == i) {
+                // It's myself
+                psFree(indices);
+                continue;
+            }
+
             // Which one do we keep?
             float bestDistance = INFINITY; // Best distance to centre
@@ -193,24 +207,26 @@
             }
 
-            float distance = mergeDistance(det, j); // Distance to centre of image
-            if (!isfinite(bestDistance) || distance < bestDistance) {
-                psTrace("ppMops.merge", 6, "New source clobbers old sources\n");
-                for (int k = 0; k < indices->n; k++) {
-                    long mergeIndex = indices->data.S64[k]; // Index of point
-                    int source = sourceMerged->data.U16[mergeIndex]; // Source image
-                    if (source == i) {
-                        continue;
+            if (bestIndex >= 0) {
+                float distance = mergeDistance(det, j); // Distance to centre of image
+                if (bestIndex >= 0 && distance < bestDistance) {
+                    psTrace("ppMops.merge", 6, "New source clobbers old sources\n");
+                    for (int k = 0; k < indices->n; k++) {
+                        long mergeIndex = indices->data.S64[k]; // Index of point
+                        int source = sourceMerged->data.U16[mergeIndex]; // Source image
+                        if (source == i) {
+                            continue;
+                        }
+                        long index = indexMerged->data.U32[mergeIndex];  // Index in source
+                        psVector *dupes = duplicates->data[source];      // Duplicates list
+                        if (!dupes->data.U8[index]) {
+                            dupes->data.U8[index] = 0xFF;
+                            dupNum->data.U32[source]++;
+                        }
                     }
-                    long index = indexMerged->data.U32[mergeIndex];  // Index in source
-                    psVector *dupes = duplicates->data[source];      // Duplicates list
-                    if (!dupes->data.U8[index]) {
-                        dupes->data.U8[index] = 0xFF;
-                        dupNum->data.U32[source]++;
-                    }
-                }
-            } else {
-                psTrace("ppMops.merge", 6, "Old sources clobber new source\n");
-                dupes->data.U8[j] = 0xFF;
-                dupNum->data.U32[i]++;
+                } else {
+                    psTrace("ppMops.merge", 6, "Old sources clobber new source\n");
+                    dupes->data.U8[j] = 0xFF;
+                    dupNum->data.U32[i]++;
+                }
             }
             psFree(indices);
