Index: branches/pap_mops/ppMops/src/ppMopsRead.c
===================================================================
--- branches/pap_mops/ppMops/src/ppMopsRead.c	(revision 25186)
+++ branches/pap_mops/ppMops/src/ppMopsRead.c	(revision 25187)
@@ -73,22 +73,28 @@
 
         double plateScale = 0.0;        // Plate scale
+        long numGood = 0;               // Number of good rows
         for (long j = 0; j < size; j++) {
             psMetadata *row = table->data[j]; // Row of interest
-            det->x->data.F32[j] = psMetadataLookupF32(NULL, row, "X_PSF");
-            det->y->data.F32[j] = psMetadataLookupF32(NULL, row, "Y_PSF");
-            det->ra->data.F64[j] = DEG_TO_RAD(psMetadataLookupF64(NULL, row, "RA_PSF"));
-            det->dec->data.F64[j] = DEG_TO_RAD(psMetadataLookupF64(NULL, row, "DEC_PSF"));
-            det->mag->data.F32[j] = psMetadataLookupF32(NULL, row, "PSF_INST_MAG");
-            det->magErr->data.F32[j] = psMetadataLookupF32(NULL, row, "PSF_INST_MAG_SIG");
-            det->extended->data.F32[j] = psMetadataLookupF32(NULL, row, "EXT_NSIGMA");
-            det->angle->data.F32[j] = 0.0;
-            det->angleErr->data.F32[j] = 0.0;
-            det->length->data.F32[j] = 0.0;
-            det->lengthErr->data.F32[j] = 0.0;
-            det->flags->data.U32[j] = psMetadataLookupU32(NULL, row, "FLAGS");
-            det->diffSkyfileId->data.F32[j] = diffSkyfileId;
-            det->naxis1->data.S32[j] = naxis1;
-            det->naxis2->data.S32[j] = naxis2;
-            det->mask->data.U8[j] = 0;
+
+            psU32 flags = psMetadataLookupU32(NULL, row, "FLAGS");
+            if (flags & SOURCE_MASK) {
+                continue;
+            }
+
+            det->x->data.F32[numGood] = psMetadataLookupF32(NULL, row, "X_PSF");
+            det->y->data.F32[numGood] = psMetadataLookupF32(NULL, row, "Y_PSF");
+            det->ra->data.F64[numGood] = DEG_TO_RAD(psMetadataLookupF64(NULL, row, "RA_PSF"));
+            det->dec->data.F64[numGood] = DEG_TO_RAD(psMetadataLookupF64(NULL, row, "DEC_PSF"));
+            det->mag->data.F32[numGood] = psMetadataLookupF32(NULL, row, "PSF_INST_MAG");
+            det->magErr->data.F32[numGood] = psMetadataLookupF32(NULL, row, "PSF_INST_MAG_SIG");
+            det->extended->data.F32[numGood] = psMetadataLookupF32(NULL, row, "EXT_NSIGMA");
+            det->angle->data.F32[numGood] = 0.0;
+            det->angleErr->data.F32[numGood] = 0.0;
+            det->length->data.F32[numGood] = 0.0;
+            det->lengthErr->data.F32[numGood] = 0.0;
+            det->flags->data.U32[numGood] = psMetadataLookupU32(NULL, row, "FLAGS");
+            det->diffSkyfileId->data.F32[numGood] = diffSkyfileId;
+            det->naxis1->data.S32[numGood] = naxis1;
+            det->naxis2->data.S32[numGood] = naxis2;
 
             // Calculate error in RA, Dec
@@ -98,4 +104,12 @@
             double angle = psMetadataLookupF64(NULL, row, "POSANGLE");
 
+            if (!isfinite(det->x->data.F32[numGood]) || !isfinite(det->y->data.F32[numGood]) ||
+                !isfinite(det->ra->data.F64[numGood]) || !isfinite(det->dec->data.F64[numGood]) ||
+                !isfinite(det->mag->data.F32[numGood]) || !isfinite(det->magErr->data.F32[numGood]) ||
+                !isfinite(xErr) || !isfinite(yErr) || !isfinite(scale) || !isfinite(angle) ||
+                (det->flags->data.U32[numGood] & SOURCE_MASK)) {
+                continue;
+            }
+
             // XXX Not at all sure I've got the angles around the right way here...
             double cosAngle = cos(angle), sinAngle = sin(angle);
@@ -103,10 +117,33 @@
             double xErr2 = PS_SQR(xErr), yErr2 = PS_SQR(yErr);
             double errScale = scale / 3600.0;
-            det->raErr->data.F64[j] = errScale * sqrt(cosAngle2 * xErr2 + sinAngle2 * yErr2);
-            det->decErr->data.F64[j] = errScale * sqrt(sinAngle2 * xErr2 + cosAngle2 * yErr2);
+            det->raErr->data.F64[numGood] = errScale * sqrt(cosAngle2 * xErr2 + sinAngle2 * yErr2);
+            det->decErr->data.F64[numGood] = errScale * sqrt(sinAngle2 * xErr2 + cosAngle2 * yErr2);
 
+            det->mask->data.U8[numGood] = 0;
             plateScale += scale;
+            numGood++;
         }
-        det->seeing *= plateScale / size;
+        det->seeing *= plateScale / numGood;
+
+        det->x->n = numGood;
+        det->y->n = numGood;
+        det->ra->n = numGood;
+        det->dec->n = numGood;
+        det->raErr->n = numGood;
+        det->decErr->n = numGood;
+        det->mag->n = numGood;
+        det->magErr->n = numGood;
+        det->extended->n = numGood;
+        det->angle->n = numGood;
+        det->angleErr->n = numGood;
+        det->length->n = numGood;
+        det->lengthErr->n = numGood;
+        det->flags->n = numGood;
+        det->diffSkyfileId->n = numGood;
+        det->naxis1->n = numGood;
+        det->naxis2->n = numGood;
+        det->mask->n = numGood;
+
+        det->num = numGood;
 
         if (isfinite(args->zp)) {
