Index: /trunk/magic/censorObjects/src/censor.c
===================================================================
--- /trunk/magic/censorObjects/src/censor.c	(revision 33625)
+++ /trunk/magic/censorObjects/src/censor.c	(revision 33626)
@@ -46,13 +46,26 @@
     }
 
-    // load the raw detection data (using PSPHOT.SOURCES filerule)
-    // select subset of stars for astrometry
-    if (!censorLoop (config)) {
-        psErrorStackPrint(stderr, "error loading input data\n");
-        psFree(config);
-        exit(PS_EXIT_DATA_ERROR);
+    bool status;
+    bool checkInputOnly = psMetadataLookupBool(&status, config->arguments, 
+        "CHECK.INPUT.ONLY");
+
+    if (!checkInputOnly) {
+        // load the raw detection data (using PSPHOT.SOURCES filerule)
+        // select subset of stars for astrometry
+        if (!censorLoop (config)) {
+            psErrorStackPrint(stderr, "error loading input data\n");
+            psFree(config);
+            exit(PS_EXIT_DATA_ERROR);
+        }
+
+        psLogMsg("censor", 3, "complete censor run: %f sec\n", psTimerMark ("complete"));
+    } else {
+        if (!checkInputLoop (config)) {
+            psErrorStackPrint(stderr, "error loading input data\n");
+            psFree(config);
+            exit(PS_EXIT_DATA_ERROR);
+        }
+        psLogMsg("censor", 3, "complete check input run: %f sec\n", psTimerMark ("complete"));
     }
-
-    psLogMsg("censor", 3, "complete censor run: %f sec\n", psTimerMark ("complete"));
 
     censorCleanup(config);
Index: /trunk/magic/censorObjects/src/censor.h
===================================================================
--- /trunk/magic/censorObjects/src/censor.h	(revision 33625)
+++ /trunk/magic/censorObjects/src/censor.h	(revision 33626)
@@ -31,4 +31,5 @@
 bool censorParseCamera (pmConfig *config);
 bool censorLoop (pmConfig *config);
+bool checkInputLoop (pmConfig *config);
 bool censorReadout (pmReadout *readout, pmConfig *config, const pmFPAview *view, bool badMaskFile);
 void censorCleanup (pmConfig *config);
Index: /trunk/magic/censorObjects/src/censorArguments.c
===================================================================
--- /trunk/magic/censorObjects/src/censorArguments.c	(revision 33625)
+++ /trunk/magic/censorObjects/src/censorArguments.c	(revision 33626)
@@ -32,4 +32,17 @@
     }
 
+    status = pmConfigFileSetsMD (config->arguments, &argc, argv, "INPUT", "-file", "-list");
+    if (!status) {
+        psError(CENSOR_ERR_ARGUMENTS, true, "Missing -file (input) or -list (input)");
+        psErrorStackPrint(stderr, "exit");
+        return NULL;
+    }
+
+    if ((N = psArgumentGet (argc, argv, "-checkinputonly"))) {
+        psArgumentRemove (N, &argc, argv);
+        psMetadataAddBool(config->arguments, PS_LIST_TAIL, "CHECK.INPUT.ONLY", PS_META_REPLACE, "do not censor just check input sources", true);
+        return config;
+    }
+        
     // define the input mask
     status = pmConfigFileSetsMD (config->arguments, &argc, argv, "INPUT.MASK", "-mask", "-masklist");
@@ -42,10 +55,4 @@
     }
 
-    status = pmConfigFileSetsMD (config->arguments, &argc, argv, "INPUT", "-file", "-list");
-    if (!status) {
-        psError(CENSOR_ERR_ARGUMENTS, true, "Missing -file (input) or -list (input)");
-        psErrorStackPrint(stderr, "exit");
-        return NULL;
-    }
 
     if (argc != 2) {
Index: /trunk/magic/censorObjects/src/censorLoop.c
===================================================================
--- /trunk/magic/censorObjects/src/censorLoop.c	(revision 33625)
+++ /trunk/magic/censorObjects/src/censorLoop.c	(revision 33626)
@@ -155,2 +155,95 @@
     return true;
 }
+
+/**
+ * \brief this loop loads the data from the input smf file(s) and mask(s).  call censorReadout
+ * to perform the actual rejection.
+ */
+bool checkInputLoop (pmConfig *config) {
+    pmChip *chip;
+    pmCell *cell;
+    pmReadout *readout;
+
+    psTimerStart ("checksources");
+
+    // select the input data sources
+    pmFPAfile *input = psMetadataLookupPtr (NULL, config->files, "CENSOR.INPUT");
+    if (!input) {
+	psError(CENSOR_ERR_CONFIG, true, "Can't find input data!\n");
+	return false;
+    }
+
+    pmFPAview *view = pmFPAviewAlloc (0);
+
+    // files associated with the science image
+    if (!pmFPAfileIOChecks (config, view, PM_FPA_BEFORE)) ESCAPE;
+
+    // check PHU header to see if we are using mosaic-level or per-chip astrometry
+    bool bilevelAstrometry = false;
+    pmHDU *phu = pmFPAviewThisPHU (view, input->fpa);
+    if (phu) {
+      char *ctype = psMetadataLookupStr (NULL, phu->header, "CTYPE1");
+      if (ctype) bilevelAstrometry = !strcmp (&ctype[4], "-DIS");
+    }
+    if (bilevelAstrometry) {
+      pmAstromReadBilevelMosaic (input->fpa, phu->header);
+    } 
+
+    while ((chip = pmFPAviewNextChip (view, input->fpa, 1)) != NULL) {
+	psTrace ("checksources", 4, "Chip %d: %x %x\n", view->chip, chip->file_exists, chip->process);
+	if (!chip->process || !chip->file_exists) { continue; }
+	
+	if (!pmFPAfileIOChecks (config, view, PM_FPA_BEFORE)) ESCAPE;
+
+	// read WCS data from the corresponding header
+
+	pmHDU *hdu = pmFPAviewThisHDU (view, input->fpa);
+	
+	if (bilevelAstrometry) {
+	  if (!pmAstromReadBilevelChip (chip, hdu->header)) {
+	    psWarning("Could not get WCS information from header for chip %d, skipping", view->chip); 
+	    continue;
+	  }
+	} else {
+	  if (!pmAstromReadWCS(input->fpa, chip, hdu->header, 1.0)) {
+	    psWarning( "Unable to read WCS astrometry from chip %d, skipping", view->chip);
+	    continue;
+	  }
+	}
+
+	while ((cell = pmFPAviewNextCell (view, input->fpa, 1)) != NULL) {
+	    psTrace ("checksources", 4, "Cell %d: %x %x\n", view->cell, cell->file_exists, cell->process);
+	    if (!cell->process || !cell->file_exists) { continue; }
+
+	    if (!pmFPAfileIOChecks (config, view, PM_FPA_BEFORE)) ESCAPE;
+
+	    // process each of the readouts
+	    while ((readout = pmFPAviewNextReadout (view, input->fpa, 1)) != NULL) {
+
+		if (!pmFPAfileIOChecks (config, view, PM_FPA_BEFORE)) ESCAPE;
+		if (!readout->data_exists) { continue; }
+                
+                // select the raw objects for this readout, flag is they fall in a mask
+                pmDetections *detections = psMetadataLookupPtr (NULL, readout->analysis, "PSPHOT.DETECTIONS");
+                if (detections == NULL) {
+                    psError(CENSOR_ERR_CONFIG, true, "Can't find detections for this readout");
+                    return false;
+                }
+                if (!detections->allSources) {
+                    psError(CENSOR_ERR_CONFIG, true, "Can't find sources for this readout");
+                    return false;
+                }
+
+		if (!pmFPAfileIOChecks (config, view, PM_FPA_AFTER)) ESCAPE;
+	    }
+	    if (!pmFPAfileIOChecks (config, view, PM_FPA_AFTER)) ESCAPE;
+	}
+	if (!pmFPAfileIOChecks (config, view, PM_FPA_AFTER)) ESCAPE;
+    }
+    if (!pmFPAfileIOChecks (config, view, PM_FPA_AFTER)) ESCAPE;
+
+    psLogMsg ("checksources", 3, "checkInputLoop done : %f sec\n", psTimerMark ("checksources"));
+
+    psFree (view);
+    return true;
+}
Index: /trunk/magic/censorObjects/src/censorParseCamera.c
===================================================================
--- /trunk/magic/censorObjects/src/censorParseCamera.c	(revision 33625)
+++ /trunk/magic/censorObjects/src/censorParseCamera.c	(revision 33626)
@@ -23,4 +23,11 @@
 	return false;
     }
+
+    bool checkInputOnly = psMetadataLookupBool(&status, config->arguments, "CHECK.INPUT.ONLY");
+    if (checkInputOnly) {
+        // nothing else to do
+        return true;
+    }
+
 
     pmFPAfile *output = pmFPAfileDefineOutput (config, input->fpa, "CENSOR.OUTPUT");
