Index: branches/pap/ippToPsps/src/ippToPspsBatchDetection.c
===================================================================
--- branches/pap/ippToPsps/src/ippToPspsBatchDetection.c	(revision 28179)
+++ branches/pap/ippToPsps/src/ippToPspsBatchDetection.c	(revision 28484)
@@ -13,14 +13,8 @@
 #include "fitsio.h"
 
-// Gets flux from magnitude
+// Gets uncalibrated instrumental flux from magnitude
 static __inline bool ippToPsps_getFlux(const float zeroPoint, const float exposureTime, const float magnitude, float* flux) {
 
-    // use uncalibrated instrumental flux
     *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
-    //float flux = 3631 * powf(10.0, -0.4*(magnitude + zeroPoint)) / exposureTime;
-
-    //    printf("mag=%f\texpTime=%f\tzeroPoint=%f\tflux=%f\n", magnitude, exposureTime, zeroPoint, flux);
     return (!isfinite(*flux) || *flux < 0.000001) ? false : true;
 }
@@ -54,19 +48,27 @@
     float zptObs, zeroPoint, exposureTime;
     char filterType[20];
+    double obsTime;
+    double expStart;
+    double expTime;
     status=0; fits_read_key(fitsIn, TFLOAT, "ZPT_OBS", &zptObs, NULL, &status);
     status=0; fits_read_key(fitsIn, TFLOAT, "ZPT_REF", &zeroPoint, NULL, &status);
     status=0; fits_read_key(fitsIn, TFLOAT, "EXPREQ", &exposureTime, NULL, &status);
     status=0; fits_read_key(fitsIn, TSTRING, "FILTERID", filterType, NULL, &status);
-    
+    status=0; fits_read_key(fitsIn, TDOUBLE, "MJD-OBS", &expStart, NULL, &status);
+    status=0; fits_read_key(fitsIn, TDOUBLE, "EXPTIME", &expTime, NULL, &status);
+    obsTime = expStart + (expTime/172800); // exp start plus half exp time (converted from secs to days)
+   
     ippToPspsConfig_writeTable(this->config, fitsIn, this->fitsOut, 1, "FrameMeta", true);
 
     // FrameMeta values
     fits_write_col(this->fitsOut, TLONG, FRAMEMETA_FRAMEID, 1, 1, 1, &this->expId, &status);
-
-    int8_t surveyID = 0; // TODO
+    fits_write_col(this->fitsOut, TSTRING, FRAMEMETA_FRAMENAME, 1, 1, 1, &this->expName, &status);
+
+    int8_t surveyID = -1;
+    if (!ippToPspsConfig_getSurveyId(this->config, this->surveyType, &surveyID)) {return PS_EXIT_DATA_ERROR;}
     fits_write_col(this->fitsOut, TBYTE, FRAMEMETA_SURVEYID, 1, 1, 1, &surveyID, &status);
 
     int8_t filterID = -1;
-    ippToPspsConfig_getFilterId(this->config, filterType, &filterID);
+    if (!ippToPspsConfig_getFilterId(this->config, filterType, &filterID)) {return PS_EXIT_DATA_ERROR;}
     fits_write_col(this->fitsOut, TBYTE, FRAMEMETA_FILTERID, 1, 1, 1, &filterID, &status);
 
@@ -81,5 +83,4 @@
 
     // stuff to keep from psf.hdr header
-    double obsTime = 0.0;
     int sourceId = -1;
     int imageId = -1;
@@ -97,5 +98,5 @@
     int maxDvoDetId = -1;
     int numDvoDetections = -1;
-    Image *pImage = NULL;
+    Image *image = NULL;
 
     // stuff for detections table
@@ -130,5 +131,5 @@
     long ippDetectID[MAXDETECT];
     long imageID[MAXDETECT];
-    float obsTimes[MAXDETECT];
+    double obsTimes[MAXDETECT];
     float instFlux[MAXDETECT];
     float instFluxErr[MAXDETECT];
@@ -150,4 +151,5 @@
     long maxObjID = LONG_MIN; 
     long minObjID = LONG_MAX;
+    uint64_t imageFlags;
     short nOta = 0;
     long i;
@@ -156,4 +158,5 @@
     uint32_t numInvalidFlux;
     long numDetectionsOut;
+    long totalDetectionsOut = 0;
     long removeList[MAXDETECT];
     long thisObjId;
@@ -193,20 +196,21 @@
             status=0; fits_read_key(fitsIn, TFLOAT, "IQ_FW2", &momentMin, NULL, &status);
             status=0; fits_read_key(fitsIn, TLONG, "IMAGEID", &imageId, NULL, &status);
-            status=0; fits_read_key(fitsIn, TDOUBLE, "MJD-OBS", &obsTime, NULL, &status);
             status=0; fits_read_key(fitsIn, TLONG, "SOURCEID", &sourceId, NULL, &status);
 
             // access DVO database
-            skylist = dvoSkyListByExternID(this->dvoConfig, sourceId, imageId, &pImage);
+            skylist = dvoSkyListByExternID(this->dvoConfig, sourceId, imageId, &image);
             if (skylist == NULL) {
-                psError(PS_ERR_IO, false, "DVO: can't find SkyList for sourceId='%d' imageId='%d' (CCD = XY%s): skipping\n", sourceId, imageId, ccdNumber);
+                psError(PS_ERR_IO, false, 
+                        "DVO: can't find SkyList for sourceId='%d' imageId='%d' (CCD = XY%s): skipping\n", 
+                        sourceId, imageId, ccdNumber);
                 continue;
             }
 
             // create unique int from 'frameID' (aka exposure ID) and ccd number
-            pspsImageId = (this->expId*100) + pImage->ccdnum;
+            pspsImageId = (this->expId*100) + image->ccdnum;
 
             // now get DVO detections
             dvoDetections = NULL;
-            numDvoDetections = dvoGetDetections(skylist, pImage->imageID, &dvoDetections, &maxDvoDetId);
+            numDvoDetections = dvoGetDetections(skylist, image->imageID, &dvoDetections, &maxDvoDetId);
 
             // TODO check nDet < MAXDETECT
@@ -216,8 +220,9 @@
             psfFwhm = (fwhmMaj+fwhmMin)/2;
             momentFwhm = (momentMaj+momentMin)/2;
+            imageFlags = (uint64_t)image->flags;
             fits_write_col(this->fitsOut, TLONGLONG, IMAGEMETA_IMAGEID, 1, 1, 1, &pspsImageId, &status);
             fits_write_col(this->fitsOut, TLONG, IMAGEMETA_FRAMEID, 1, 1, 1, &this->expId, &status);
-            fits_write_col(this->fitsOut, TSHORT, IMAGEMETA_CCDID, 1, 1, 1, &pImage->ccdnum, &status);
-            fits_write_col(this->fitsOut, TLONG, IMAGEMETA_PHOTOCALID, 1, 1, 1, &pImage->photcode, &status);
+            fits_write_col(this->fitsOut, TSHORT, IMAGEMETA_CCDID, 1, 1, 1, &image->ccdnum, &status);
+            fits_write_col(this->fitsOut, TLONG, IMAGEMETA_PHOTOCALID, 1, 1, 1, &image->photcode, &status);
             fits_write_col(this->fitsOut, TBYTE, IMAGEMETA_FILTERID, 1, 1, 1, &filterID, &status);
             fits_write_col(this->fitsOut, TFLOAT, IMAGEMETA_PHOTOSCAT, 1, 1, 1, &zptObs, &status);
@@ -225,4 +230,5 @@
             fits_write_col(this->fitsOut, TFLOAT, IMAGEMETA_MOMENTFWHM, 1, 1, 1, &momentFwhm, &status);
             fits_write_col(this->fitsOut, TFLOAT, IMAGEMETA_PHOTOZERO, 1, 1, 1, &zptObs, &status);
+            fits_write_col(this->fitsOut, TLONGLONG, IMAGEMETA_QAFLAGS, 1, 1, 1, &imageFlags, &status);
 
             // now move BACK to detections table in smf
@@ -329,5 +335,5 @@
             fits_write_col(this->fitsOut, TBYTE, DETECTION_SURVEYID, 1, 1, nDet, surveyIDs, &status);
             fits_write_col(this->fitsOut, TLONGLONG, DETECTION_IMAGEID, 1, 1, nDet, imageID, &status);
-            fits_write_col(this->fitsOut, TFLOAT, DETECTION_OBSTIME, 1, 1, nDet, obsTimes, &status);
+            fits_write_col(this->fitsOut, TDOUBLE, DETECTION_OBSTIME, 1, 1, nDet, obsTimes, &status);
             fits_write_col(this->fitsOut, TFLOAT, DETECTION_INSTFLUX, 1, 1, nDet, instFlux, &status);
             fits_write_col(this->fitsOut, TFLOAT, DETECTION_INSTFLUXERR, 1, 1, nDet, instFluxErr, &status);
@@ -357,8 +363,12 @@
                     extensionName, nDet, numDetectionsOut, unmatched, numOfDuplicates, numInvalidFlux);
 
+            totalDetectionsOut += numDetectionsOut;
+
             if (dvoDetections!= NULL) dvoFree(dvoDetections);
             SkyListFree(skylist);
         }
     }
+
+    psLogMsg("ippToPsps", PS_LOG_INFO, "Total detections for this exposure = %ld\n", totalDetectionsOut);
 
     for (uint32_t i=0; i<MAXDETECT;i++) free(assocDate[i]);
@@ -382,4 +392,6 @@
         if (fprintf(this->resultsFile, "%ld\n", maxObjID) < 1 ) 
             psError(PS_ERR_IO, false, "Unable to write max Object ID to'%s'\n", this->resultsPath);
+        if (fprintf(this->resultsFile, "%ld\n", totalDetectionsOut) < 1 ) 
+            psError(PS_ERR_IO, false, "Unable to write totalDetectionsOut to'%s'\n", this->resultsPath);
     }
 
