Index: trunk/ippToPsps/src/ippToPspsBatchDetection.c
===================================================================
--- trunk/ippToPsps/src/ippToPspsBatchDetection.c	(revision 27759)
+++ trunk/ippToPsps/src/ippToPspsBatchDetection.c	(revision 27760)
@@ -14,8 +14,8 @@
 
 // Gets flux from magnitude
-static __inline float ippToPsps_getFlux(const float zeroPoint, const float exposureTime, const float magnitude) {
+static __inline bool ippToPsps_getFlux(const float zeroPoint, const float exposureTime, const float magnitude, float* flux) {
 
     // use uncalibrated instrumental flux
-    float flux = powf(10.0, -0.4*magnitude) / exposureTime;
+    *flux = powf(10.0, -0.4*magnitude) / exposureTime;
 
     // use calibrated flux in Janskys, where 3631 Jy is the zero point flux for the filter: constant over all filters because we're using AB magnitudes
@@ -23,5 +23,5 @@
 
     //    printf("mag=%f\texpTime=%f\tzeroPoint=%f\tflux=%f\n", magnitude, exposureTime, zeroPoint, flux);
-    return isnormal(flux) ? flux : -999.0;
+    return (isnormal(*flux) && *flux > 0.0) ? true : false;
 }
 
@@ -151,8 +151,9 @@
     short nOta = 0;
     long i;
-    bool duplicate;
+    bool isDuplicate;
     uint32_t numOfDuplicates;
+    uint32_t numInvalidFlux;
     long numDetectionsOut;
-    long duplicateList[MAXDETECT];
+    long removeList[MAXDETECT];
     long thisObjId;
 
@@ -252,5 +253,8 @@
             // both DVO detections and smf detections should increment. however, there may be gaps in smf and 'invalid' rows in dvo
             numOfDuplicates = 0;
+            numInvalidFlux = 0;
             for (long s = 0; s<nDet; s++) {
+
+                isDuplicate = false;
 
                 // count jumps in smf file
@@ -266,11 +270,10 @@
 
                     // TODO HACK duplicates bug - don't include any duplicates
-                    duplicate = false;
                     thisObjId = dvoDetections[d].ave.extID;
                     for (i=0; i<totalDetections; i++) {
                         if (thisObjId == objID[i]) {
-                            duplicate = true;
-                            duplicateList[numOfDuplicates] = s+1;
+                            removeList[numOfDuplicates+numInvalidFlux] = s+1;
                             numOfDuplicates++;
+                            isDuplicate=true;
                             break;
                         }
@@ -283,7 +286,12 @@
                     imageID[s] = pspsImageId;
                     obsTimes[s] = obsTime;
-                    instFlux[s] = ippToPsps_getFlux(zeroPoint, exposureTime, instMag[s]);
-                    instFluxErr[s] = ippToPsps_getFlux(zeroPoint, exposureTime, instMagErr[s]);
-                    peakFlux[s] = ippToPsps_getFlux(zeroPoint, exposureTime, peakMag[s]);
+                    ippToPsps_getFlux(zeroPoint, exposureTime, instMagErr[s], &instFluxErr[s]);
+                    ippToPsps_getFlux(zeroPoint, exposureTime, peakMag[s], &peakFlux[s]);
+
+                    // check for invalid flux values (if not already labelled as a duplicate)
+                    if (!ippToPsps_getFlux(zeroPoint, exposureTime, instMag[s], &instFlux[s]) && !isDuplicate) {
+                        removeList[numOfDuplicates+numInvalidFlux] = s+1;
+                        numInvalidFlux++;
+                    } 
 
                     // store max/min objID
@@ -304,5 +312,5 @@
 
             // write number of rows (detections) to ImageMeta
-            numDetectionsOut = totalDetections - numOfDuplicates;
+            numDetectionsOut = totalDetections - numOfDuplicates - numInvalidFlux;
             fits_write_col(this->fitsOut, TLONG, 10, 1, 1, 1, &numDetectionsOut, &status);
 
@@ -321,5 +329,5 @@
             fits_write_col(this->fitsOut, TFLOAT, DETECTION_PEAKADU, 1, 1, nDet, peakFlux, &status);
             fits_write_col(this->fitsOut, TSTRING, DETECTION_ASSOCDATE, 1, 1, nDet, assocDate, &status); 
-            if (numOfDuplicates) fits_delete_rowlist(this->fitsOut, duplicateList, numOfDuplicates, &status);
+            if (numOfDuplicates||numInvalidFlux) fits_delete_rowlist(this->fitsOut, removeList, numOfDuplicates+numInvalidFlux, &status);
 
             // skinny object
@@ -327,5 +335,5 @@
             fits_write_col(this->fitsOut, TLONGLONG, SKINNYOBJECT_OBJID, 1, 1, nDet, objID, &status);
             fits_write_col(this->fitsOut, TLONGLONG, SKINNYOBJECT_IPPOBJID, 1, 1, nDet, ippObjID, &status);
-            if (numOfDuplicates) fits_delete_rowlist(this->fitsOut, duplicateList, numOfDuplicates, &status);
+            if (numOfDuplicates||numInvalidFlux) fits_delete_rowlist(this->fitsOut, removeList, numOfDuplicates+numInvalidFlux, &status);
 
             // object calibration color
@@ -334,11 +342,11 @@
             fits_write_col(this->fitsOut, TLONGLONG, OBJECTCALCOLOR_IPPOBJID, 1, 1, nDet, ippObjID, &status);
             fits_write_col(this->fitsOut, TBYTE, OBJECTCALCOLOR_FILTERID, 1, 1, nDet, filterIDs, &status);
-            if (numOfDuplicates) fits_delete_rowlist(this->fitsOut, duplicateList, numOfDuplicates, &status);
+            if (numOfDuplicates||numInvalidFlux) fits_delete_rowlist(this->fitsOut, removeList, numOfDuplicates+numInvalidFlux, &status);
 
             psLogMsg("ippToPsps", PS_LOG_INFO,
-                    " ___________________________________________________________________\n"
-                    "| Extension | Rows in | Rows out | Missing from DVO | Duplicate IDs |\n"
-                    "|  %s |  %5ld  |   %5ld  |      %5d       |    %5d      |\n",
-                    extensionName, nDet, numDetectionsOut, unmatched, numOfDuplicates);
+                    "+-----------+---------+----------+------------------+---------------+--------------+\n"
+                    "| Extension | Rows in | Rows out | Missing from DVO | Duplicate IDs | Invalid Flux |\n"
+                    "|  %s |  %5ld  |   %5ld  |      %5d       |    %5d      |    %5d     |\n",
+                    extensionName, nDet, numDetectionsOut, unmatched, numOfDuplicates, numInvalidFlux);
 
             if (dvoDetections!= NULL) dvoFree(dvoDetections);
