Index: trunk/psModules/src/camera/pmFPAFlags.c
===================================================================
--- trunk/psModules/src/camera/pmFPAFlags.c	(revision 12696)
+++ trunk/psModules/src/camera/pmFPAFlags.c	(revision 13190)
@@ -8,4 +8,6 @@
 #include "pmHDU.h"
 #include "pmFPA.h"
+#include "pmFPALevel.h"
+#include "pmFPAview.h"
 #include "pmFPAFlags.h"
 
@@ -128,4 +130,79 @@
 }
 
+// pmFPA does not have its own data_exists flag; check its children
+bool pmFPACheckDataStatus (const pmFPA *fpa) {
+
+    PS_ASSERT_PTR_NON_NULL(fpa, false);
+
+    for (int i = 0; i < fpa->chips->n; i++) {
+	pmChip *chip = fpa->chips->data[i];
+	if (chip == NULL) continue;
+	if (chip->data_exists) return true;
+    }
+    return false;
+}
+
+bool pmChipCheckDataStatus (const pmChip *chip) {
+
+    PS_ASSERT_PTR_NON_NULL(chip, false);
+
+    return (chip->data_exists);
+}
+
+bool pmCellCheckDataStatus (const pmCell *cell) {
+
+    PS_ASSERT_PTR_NON_NULL(cell, false);
+
+    return (cell->data_exists);
+}
+
+bool pmReadoutCheckDataStatus (const pmReadout *readout) {
+
+    PS_ASSERT_PTR_NON_NULL(readout, false);
+
+    return (readout->data_exists);
+}
+
+bool pmFPAviewCheckDataStatus (const pmFPA *fpa, const pmFPAview *view) {
+
+    PS_ASSERT_PTR_NON_NULL(fpa, false);
+    PS_ASSERT_PTR_NON_NULL(view, false);
+
+    if (view->chip == -1) {
+	bool exists = pmFPACheckDataStatus (fpa);
+	return exists;
+    }
+
+    if (view->chip >= fpa->chips->n) {
+	psError(PS_ERR_IO, true, "Requested chip == %d >= fpa->chips->n == %ld", view->chip, fpa->chips->n);
+	return false;
+    }
+    pmChip *chip = fpa->chips->data[view->chip];
+
+    if (view->cell == -1) {
+	bool exists = pmChipCheckDataStatus (chip);
+	return exists;
+    }
+
+    if (view->cell >= chip->cells->n) {
+	psError(PS_ERR_IO, true, "Requested cell == %d >= chip->cells->n == %ld", view->cell, chip->cells->n);
+	return false;
+    }
+    pmCell *cell = chip->cells->data[view->cell];
+
+    if (view->readout == -1) {
+	bool exists = pmCellCheckDataStatus (cell);
+	return exists;
+    }
+
+    if (view->readout >= cell->readouts->n) {
+	psError(PS_ERR_IO, true, "Requested readout == %d >= cell->readouds->n == %ld", view->readout, cell->readouts->n);
+	return false;
+    }
+    pmReadout *readout = cell->readouts->data[view->readout];
+
+    bool exists = pmReadoutCheckDataStatus (readout);
+    return exists;
+}
 
 // Set cells within a chip to be processed or not
