Index: trunk/ppImage/src/ppImageParseCamera.c
===================================================================
--- trunk/ppImage/src/ppImageParseCamera.c	(revision 10969)
+++ trunk/ppImage/src/ppImageParseCamera.c	(revision 11095)
@@ -16,4 +16,7 @@
         return NULL;
     }
+
+    // determine filter from the concepts
+    char *filter = psMetadataLookupStr (&status, input->fpa->concepts, "FPA.FILTER");
 
 #if 0
@@ -82,23 +85,85 @@
         }
     }
+
     if (options->doFlat) {
-        bool status = false;
-        pmFPAfileDefineFromArgs  (&status, config, "PPIMAGE.FLAT", "FLAT");
-        pmFPAfileDefineFromConf  (&status, config, "PPIMAGE.FLAT");
-        pmFPAfileDefineFromDetDB (&status, config, "PPIMAGE.FLAT", input->fpa, PM_DETREND_TYPE_FLAT);
-        if (!status) {
-            psError (PS_ERR_IO, false, "can't find a flat image source");
-            return NULL;
-        }
-    }
+	// select FLAT.FILTERS from the recipe and test if the filter matches
+	// is the mdi saved with psList or string?
+	psMetadataItem *mdi = psMetadataLookup (recipe, "FLAT.FILTERS");
+	if (mdi == NULL) {
+	    // no valid filters for flat data for this camera
+	    options->doFlat = false;
+	    goto skip_flat;
+	}
+	// place entry on a list regardless of type
+	psList *filters = NULL;
+	if (mdi->type == PS_DATA_STRING) {
+	    filters = psListAlloc(NULL);
+	    psListAdd (filters, PS_LIST_HEAD, mdi);
+	} else {
+	    if (mdi->type != PS_DATA_METADATA_MULTI) psAbort ("ppImage", "invalid type for FLAT.FILTERS");
+	    filter = psMemIncrRefCounter(mdi->data.list);
+	}
+
+	// search through list to find the current filter
+	psListIterator *iter = psListIteratorAlloc (filters, PS_LIST_HEAD, FALSE);
+	options->doFlat = false;
+	for (int i = 0; !options->doFlat && (i < filters->n); i++) {
+	    psMetadataItem *item = psListGetAndIncrement (iter);
+	    char *validFilter = item->data.V;
+	    if (strcmp (validFilter, filter)) continue;
+	    options->doFlat = true;
+	}
+    }
+skip_flat:
+    if (options->doFlat) {
+	bool status = false;
+	pmFPAfileDefineFromArgs  (&status, config, "PPIMAGE.FLAT", "FLAT");
+	pmFPAfileDefineFromConf  (&status, config, "PPIMAGE.FLAT");
+	pmFPAfileDefineFromDetDB (&status, config, "PPIMAGE.FLAT", input->fpa, PM_DETREND_TYPE_FLAT);
+	if (!status) {
+	    psError (PS_ERR_IO, false, "can't find a flat image source");
+	    return NULL;
+	}
+    }
+
     if (options->doFringe) {
-        bool status = false;
-        pmFPAfileDefineFromArgs  (&status, config, "PPIMAGE.FRINGE", "FRINGE");
-        pmFPAfileDefineFromConf  (&status, config, "PPIMAGE.FRINGE");
-        pmFPAfileDefineFromDetDB (&status, config, "PPIMAGE.FRINGE", input->fpa, PM_DETREND_TYPE_FRINGE_IMAGE);
-        if (!status) {
-            psError (PS_ERR_IO, false, "can't find a fringe image source");
-            return NULL;
-        }
+	// select FRINGE.FILTERS from the recipe and test if the filter matches
+	// is the mdi saved with psList or string?
+	psMetadataItem *mdi = psMetadataLookup (recipe, "FRINGE.FILTERS");
+	if (mdi == NULL) {
+	    // no valid filters for fringe data for this camera
+	    options->doFringe = false;
+	    goto skip_fringe;
+	}
+	// place entry on a list regardless of type
+	psList *filters = NULL;
+	if (mdi->type == PS_DATA_STRING) {
+	    filters = psListAlloc(NULL);
+	    psListAdd (filters, PS_LIST_HEAD, mdi);
+	} else {
+	    if (mdi->type != PS_DATA_METADATA_MULTI) psAbort ("ppImage", "invalid type for FRINGE.FILTERS");
+	    filter = psMemIncrRefCounter(mdi->data.list);
+	}
+
+	// search through list to find the current filter
+	psListIterator *iter = psListIteratorAlloc (filters, PS_LIST_HEAD, FALSE);
+	options->doFringe = false;
+	for (int i = 0; !options->doFringe && (i < filters->n); i++) {
+	    psMetadataItem *item = psListGetAndIncrement (iter);
+	    char *validFilter = item->data.V;
+	    if (strcmp (validFilter, filter)) continue;
+	    options->doFringe = true;
+	}
+    }
+skip_fringe:
+    if (options->doFringe) {
+	bool status = false;
+	pmFPAfileDefineFromArgs  (&status, config, "PPIMAGE.FRINGE", "FRINGE");
+	pmFPAfileDefineFromConf  (&status, config, "PPIMAGE.FRINGE");
+	pmFPAfileDefineFromDetDB (&status, config, "PPIMAGE.FRINGE", input->fpa, PM_DETREND_TYPE_FRINGE_IMAGE);
+	if (!status) {
+	    psError (PS_ERR_IO, false, "can't find a fringe image source");
+	    return NULL;
+	}
     }
 
