Index: /branches/pap_mops/ppMops/src/ppMops.c
===================================================================
--- /branches/pap_mops/ppMops/src/ppMops.c	(revision 25187)
+++ /branches/pap_mops/ppMops/src/ppMops.c	(revision 25188)
@@ -6,4 +6,6 @@
 int main(int argc, char *argv[])
 {
+    psLibInit(NULL);
+
     ppMopsArguments *args = ppMopsArgumentsParse(argc, argv); // Parsed arguments
     if (!args) {
@@ -32,4 +34,6 @@
     psFree(merged);
     psFree(args);
+
+    psLibFinalize();
 
     return PS_EXIT_SUCCESS;
Index: /branches/pap_mops/ppMops/src/ppMopsArguments.c
===================================================================
--- /branches/pap_mops/ppMops/src/ppMopsArguments.c	(revision 25187)
+++ /branches/pap_mops/ppMops/src/ppMopsArguments.c	(revision 25188)
@@ -57,4 +57,8 @@
     assert(argv);
 
+    psTrace("ppMops.args", 1, "Parsing command-line arguments\n");
+
+    psArgumentVerbosity(&argc, argv);
+
     psMetadata *arguments = psMetadataAlloc(); // Command-line arguments
     psMetadataAddStr(arguments, PS_LIST_TAIL, "-exp_name", 0, "Exposure name", NULL);
@@ -98,5 +102,5 @@
     args->rmsAstrom = psMetadataLookupF32(NULL, arguments, "-astrom_rms");
 
-    psTrace("ppMops", 1, "Done reading command-line arguments\n");
+    psTrace("ppMops.args", 1, "Done parsing command-line arguments\n");
 
     return args;
Index: /branches/pap_mops/ppMops/src/ppMopsDetections.c
===================================================================
--- /branches/pap_mops/ppMops/src/ppMopsDetections.c	(revision 25187)
+++ /branches/pap_mops/ppMops/src/ppMopsDetections.c	(revision 25188)
@@ -145,4 +145,5 @@
     psVectorAppend(target->naxis2, source->naxis2->data.S32[index]);
     psVectorAppend(target->mask, 0);
+    target->num++;
     return true;
 }
Index: /branches/pap_mops/ppMops/src/ppMopsMerge.c
===================================================================
--- /branches/pap_mops/ppMops/src/ppMopsMerge.c	(revision 25187)
+++ /branches/pap_mops/ppMops/src/ppMopsMerge.c	(revision 25188)
@@ -27,12 +27,17 @@
     PS_ASSERT_ARRAY_NON_NULL(detections, NULL);
 
+    psTrace("ppMops.merge", 1, "Merging detections from %ld inputs\n", detections->n);
+
     ppMopsDetections *merged = psMemIncrRefCounter(detections->data[0]); // Merged list
+    psTrace("ppMops.merge", 3, "Automatically merging %ld detections from input 0\n", merged->num);
     int num = 1;                                                         // Number of merged files
     for (int i = 1; i < detections->n; i++) {
         ppMopsDetections *det = detections->data[i]; // Detections of interest
         if (!det) {
+            psTrace("ppMops.merge", 3, "Ignoring NULL input %d\n", i);
             continue;
         }
         num++;
+        psTrace("ppMops.merge", 3, "Merging %ld detections from input %d\n", det->num, i);
 
         // XXX compare exposure properties
@@ -106,7 +111,10 @@
             }
             if (indices->n == 0) {
+                psTrace("ppMops.merge", 9, "No matches for source %d in input %d\n", j, i);
                 psFree(indices);
+                ppMopsDetectionsCopySingle(merged, det, j);
                 continue;
             }
+            psTrace("ppMops.merge", 5, "%ld matches for source %d from input %d\n", indices->n, j, i);
 
             // Which one do we keep?
@@ -124,4 +132,5 @@
             float distance = mergeDistance(det, j); // Distance to centre of image
             if (distance < bestDistance) {
+                psTrace("ppMops.merge", 6, "New source clobbers old sources\n");
                 // Blow away existing sources
                 for (int k = 0; k < indices->n; k++) {
@@ -129,13 +138,18 @@
                     merged->mask->data.U8[index] = 0xFF;
                 }
-
                 ppMopsDetectionsCopySingle(merged, det, j);
+            } else {
+                psTrace("ppMops.merge", 6, "Old sources clobber new source\n");
             }
             psFree(indices);
         }
 
+        psTrace("ppMops.merge", 3, "Done merging input %d, %ld merged sources\n", i, merged->num);
+
         psFree(tree);
         ppMopsDetectionsPurge(merged);
     }
+
+    psTrace("ppMops.merge", 2, "%ld sources in merged detections list\n", merged->num);
 
     merged->seeing /= num;
Index: /branches/pap_mops/ppMops/src/ppMopsRead.c
===================================================================
--- /branches/pap_mops/ppMops/src/ppMopsRead.c	(revision 25187)
+++ /branches/pap_mops/ppMops/src/ppMopsRead.c	(revision 25188)
@@ -10,4 +10,6 @@
 psArray *ppMopsRead(const ppMopsArguments *args)
 {
+    psTrace("ppMops.read", 1, "Reading input detections\n");
+
     psArray *inNames = args->input;          // Input names
     long num = inNames->n;                   // Number of inputs
@@ -46,4 +48,6 @@
         }
         ppMopsDetections *det = ppMopsDetectionsAlloc(size);
+
+        psTrace("ppMops.read", 3, "Reading %ld rows from %s\n", size, (const char*)inNames->data[i]);
 
         det->raBoresight = psMemIncrRefCounter(psMetadataLookupStr(NULL, header, "FPA.RA"));
@@ -151,8 +155,11 @@
         }
 
+        psTrace("ppMops.read", 2, "Read %ld good rows from %s\n", numGood, (const char*)inNames->data[i]);
+
         psFree(table);
         detections->data[i] = det;
     }
 
+    psTrace("ppMops.read", 1, "Done reading input detections\n");
 
     return detections;
Index: /branches/pap_mops/ppMops/src/ppMopsWrite.c
===================================================================
--- /branches/pap_mops/ppMops/src/ppMopsWrite.c	(revision 25187)
+++ /branches/pap_mops/ppMops/src/ppMopsWrite.c	(revision 25188)
@@ -10,4 +10,6 @@
 bool ppMopsWrite(const ppMopsDetections *det, const ppMopsArguments *args)
 {
+    psTrace("ppMops.write", 1, "Writing %ld rows to %s", det->num, args->output);
+
     psFits *fits = psFitsOpen(args->output, "w"); // FITS file
     if (!fits) {
@@ -15,4 +17,5 @@
         return false;
     }
+
 
     psMetadata *header = psMetadataAlloc(); // Header to write
@@ -110,4 +113,7 @@
     psFree(header);
     psFitsClose(fits);
+
+    psTrace("ppMops.write", 1, "Done writing %ld rows to %s", det->num, args->output);
+
     return true;
 }
