Index: trunk/ippToPsps/jython/detectionbatch.py
===================================================================
--- trunk/ippToPsps/jython/detectionbatch.py	(revision 31848)
+++ trunk/ippToPsps/jython/detectionbatch.py	(revision 31932)
@@ -80,5 +80,13 @@
        #self.endY = 8
 
-       self.obsTime = float(self.header['MJD-OBS']) + (float(self.header['EXPTIME']) / 172800.0)
+       if self.safeDictionaryAccess(self.header, 'MJD-OBS') == "NULL" or self.safeDictionaryAccess(self.header, 'EXPTIME') == "NULL":
+           self.obsTime = 1.0
+           self.logger.errorPair("Fields missing from rimary header", "MJD-OBS or EXPTIME (or both)")
+           if not self.testMode: 
+               self.everythingOK = False
+               return
+           self.logger.infoPair("Hardcoding obs time to", "%f" % self.obsTime)
+       else:
+           self.obsTime = float(self.header['MJD-OBS']) + (float(self.header['EXPTIME']) / 172800.0)
       
        # set up some defauts
@@ -88,5 +96,13 @@
 
        # get filterID using init table
-       self.filter = self.header['FILTERID'][0:1]
+       if self.safeDictionaryAccess(self.header, 'FILTERID') == "NULL":
+          self.filter = 'g'
+          self.logger.errorPair("Field missing from rimary header", "FILTERID")
+          if not self.testMode: 
+              self.everythingOK = False
+              return
+          self.logger.infoPair("Hardcoding filter to", "%s" % self.filter)
+       else:
+          self.filter = self.header['FILTERID'][0:1]
 
        # insert what we know about this stack batch into the stack table
@@ -164,37 +180,37 @@
         ,' ' \
         ,' ' \
-        ," + self.header['ZPT_ERR'] + " \
-        ," + self.header['MJD-OBS'] + " \
-        ," + self.header['EXPREQ'] + " \
-        ," + self.header['AIRMASS'] + " \
-        ," + self.header['RA'] + " \
-        ," + self.header['DEC'] + " \
-        ,'" + self.header['CTYPE1'] + "' \
-        ,'" + self.header['CTYPE2'] + "' \
-        ," + self.header['CRVAL1'] + " \
-        ," + self.header['CRVAL2'] + " \
-        ," + self.header['CRPIX1'] + " \
-        ," + self.header['CRPIX2'] + " \
-        ," + self.header['CDELT1'] + " \
-        ," + self.header['CDELT2'] + " \
-        ," + self.header['PC001001'] + " \
-        ," + self.header['PC001002'] + " \
-        ," + self.header['PC002001'] + " \
-        ," + self.header['PC002002'] + " \
-        ," + self.header['NPLYTERM'] + " \
-        ," + self.header['PCA1X3Y0'] + " \
-        ," + self.header['PCA1X2Y1'] + " \
-        ," + self.header['PCA1X1Y2'] + " \
-        ," + self.header['PCA1X0Y3'] + " \
-        ," + self.header['PCA1X2Y0'] + " \
-        ," + self.header['PCA1X1Y1'] + " \
-        ," + self.header['PCA1X0Y2'] + " \
-        ," + self.header['PCA2X3Y0'] + " \
-        ," + self.header['PCA2X2Y1'] + " \
-        ," + self.header['PCA2X1Y2'] + " \
-        ," + self.header['PCA2X0Y3'] + " \
-        ," + self.header['PCA2X2Y0'] + " \
-        ," + self.header['PCA2X1Y1'] + " \
-        ," + self.header['PCA2X0Y2'] + " \
+        ," + self.safeDictionaryAccess(self.header, 'ZPT_ERR') + " \
+        ," + self.safeDictionaryAccess(self.header, 'MJD-OBS') + " \
+        ," + self.safeDictionaryAccess(self.header, 'EXPREQ') + " \
+        ," + self.safeDictionaryAccess(self.header, 'AIRMASS') + " \
+        ," + self.safeDictionaryAccess(self.header, 'RA') + " \
+        ," + self.safeDictionaryAccess(self.header, 'DEC') + " \
+        ,'" + self.safeDictionaryAccess(self.header, 'CTYPE1') + "' \
+        ,'" + self.safeDictionaryAccess(self.header, 'CTYPE2') + "' \
+        ," + self.safeDictionaryAccess(self.header, 'CRVAL1') + " \
+        ," + self.safeDictionaryAccess(self.header, 'CRVAL2') + " \
+        ," + self.safeDictionaryAccess(self.header, 'CRPIX1') + " \
+        ," + self.safeDictionaryAccess(self.header, 'CRPIX2') + " \
+        ," + self.safeDictionaryAccess(self.header, 'CDELT1') + " \
+        ," + self.safeDictionaryAccess(self.header, 'CDELT2') + " \
+        ," + self.safeDictionaryAccess(self.header, 'PC001001') + " \
+        ," + self.safeDictionaryAccess(self.header, 'PC001002') + " \
+        ," + self.safeDictionaryAccess(self.header, 'PC002001') + " \
+        ," + self.safeDictionaryAccess(self.header, 'PC002002') + " \
+        ," + self.safeDictionaryAccess(self.header, 'NPLYTERM') + " \
+        ," + self.safeDictionaryAccess(self.header, 'PCA1X3Y0') + " \
+        ," + self.safeDictionaryAccess(self.header, 'PCA1X2Y1') + " \
+        ," + self.safeDictionaryAccess(self.header, 'PCA1X1Y2') + " \
+        ," + self.safeDictionaryAccess(self.header, 'PCA1X0Y3') + " \
+        ," + self.safeDictionaryAccess(self.header, 'PCA1X2Y0') + " \
+        ," + self.safeDictionaryAccess(self.header, 'PCA1X1Y1') + " \
+        ," + self.safeDictionaryAccess(self.header, 'PCA1X0Y2') + " \
+        ," + self.safeDictionaryAccess(self.header, 'PCA2X3Y0') + " \
+        ," + self.safeDictionaryAccess(self.header, 'PCA2X2Y1') + " \
+        ," + self.safeDictionaryAccess(self.header, 'PCA2X1Y2') + " \
+        ," + self.safeDictionaryAccess(self.header, 'PCA2X0Y3') + " \
+        ," + self.safeDictionaryAccess(self.header, 'PCA2X2Y0') + " \
+        ," + self.safeDictionaryAccess(self.header, 'PCA2X1Y1') + " \
+        ," + self.safeDictionaryAccess(self.header, 'PCA2X0Y2') + " \
         )"
         self.scratchDb.execute(sql)
@@ -595,5 +611,10 @@
                 header = self.fits.findAndReadHeader(ota + ".hdr")
                 if not header:
-                    self.logger.error("No header found for OTA " + ota)
+                    self.logger.errorPair("No header found for OTA", ota)
+                    continue
+
+                # check we have valid sourceID/imageID pair from the header
+                if 'SOURCEID' not in header or 'IMAGEID' not in header: 
+                    self.logger.errorPair("Can't read SOURCEID/IMAGEID pair for", ota)
                     continue
 
@@ -601,9 +622,4 @@
                 if not self.useFullTables:
                     self.scratchDb.insertNewDvoImage(header['SOURCEID'], header['IMAGEID'])
-
-                # check we have valid sourceID/imageID pair from the header
-                if 'SOURCEID' not in header or 'IMAGEID' not in header: 
-                    self.logger.error("Can't read SOURCEID/IMAGEID pair from " + ota + " header")
-                    continue
 
                 # store these for later
