Index: trunk/psphot/src/psphot.h
===================================================================
--- trunk/psphot/src/psphot.h	(revision 34265)
+++ trunk/psphot/src/psphot.h	(revision 34266)
@@ -436,4 +436,6 @@
 bool psphotCopySources (pmConfig *config, const pmFPAview *view, const char *ruleOut, const char *ruleSrc);
 bool psphotCopySourcesReadout (pmConfig *config, const pmFPAview *view, const char *ruleOut, const char *ruleSrc, int index);
+bool psphotCopyEfficiency (pmConfig *config, const pmFPAview *view, const char *ruleOut, const char *ruleSrc);
+bool psphotCopyEfficiencyReadout (pmConfig *config, const pmFPAview *view, const char *ruleOut, const char *ruleSrc, int index);
 
 bool psphotRadialApertures (pmConfig *config, const pmFPAview *view, const char *filerule, int entry);
Index: trunk/psphot/src/psphotMergeSources.c
===================================================================
--- trunk/psphot/src/psphotMergeSources.c	(revision 34265)
+++ trunk/psphot/src/psphotMergeSources.c	(revision 34266)
@@ -939,2 +939,56 @@
 }
 
+bool psphotCopyEfficiency (pmConfig *config, const pmFPAview *view, const char *ruleOut, const char *ruleSrc)
+{
+    bool status = true;
+
+    int num = psphotFileruleCount(config, ruleSrc);
+
+    // skip the chisq image because it is a duplicate of the detection version
+    int chisqNum = psMetadataLookupS32 (&status, config->arguments, "PSPHOT.CHISQ.NUM");
+    if (!status) chisqNum = -1;
+
+    // loop over the available readouts
+    for (int i = 0; i < num; i++) {
+	if (i == chisqNum) continue; // skip chisq image
+        if (!psphotCopyEfficiencyReadout (config, view, ruleOut, ruleSrc, i)) {
+            psError (PSPHOT_ERR_CONFIG, false, "failed to copy detection efficiency from %s to %s entry %d", ruleSrc, ruleOut, i);
+            return false;
+        }
+    }
+    return true;
+}
+
+// add newly selected sources to the existing list of sources
+bool psphotCopyEfficiencyReadout (pmConfig *config, const pmFPAview *view, const char *ruleOut, const char *ruleSrc, int index) {
+
+    bool status;
+
+    // find the currently selected readout
+    pmFPAfile *fileSrc = pmFPAfileSelectSingle(config->files, ruleSrc, index); // File of interest
+    psAssert (fileSrc, "missing file?");
+
+    pmReadout *readoutSrc = pmFPAviewThisReadout(view, fileSrc->fpa);
+    psAssert (readoutSrc, "missing readout?");
+
+    // find the currently selected readout
+    pmFPAfile *fileOut = pmFPAfileSelectSingle(config->files, ruleOut, index); // File of interest
+    psAssert (fileOut, "missing file?");
+
+    pmReadout *readoutOut = pmFPAviewThisReadout(view, fileOut->fpa);
+    psAssert (readoutOut, "missing readout?");
+
+    pmDetEff *de = psMetadataLookupPtr(&status, readoutSrc->analysis, PM_DETEFF_ANALYSIS); // Detection efficiency
+    if (!status || !de) {
+        // nothing there
+        return true;
+    }
+
+    // save DetEff on the readoutOut->analysis
+    if (!psMetadataAddPtr (readoutOut->analysis, PS_LIST_TAIL, PM_DETEFF_ANALYSIS, PS_META_REPLACE | PS_DATA_UNKNOWN, "Detection efficiency", de)) {
+	psError (PSPHOT_ERR_CONFIG, false, "problem saving Detection efficiency on readout");
+	return false;
+    }
+
+    return true;
+}
Index: trunk/psphot/src/psphotStackReadout.c
===================================================================
--- trunk/psphot/src/psphotStackReadout.c	(revision 34265)
+++ trunk/psphot/src/psphotStackReadout.c	(revision 34266)
@@ -416,10 +416,17 @@
     psphotMagnitudes(config, view, STACK_SRC);
 
-    // XXX NOTE: this function wants to have the PSF of the image, but we (so far) only measure the 
-    // PSF of the SRC image.  can we fake it by generating the PSF for DET as well (up above)? 
-    if (false && !psphotEfficiency(config, view, STACK_DET)) {
+    if (!useRaw) {
+        // psphotEfficiency wants to have the PSF of the image, but since we are measuring on
+        // the convolved images we need to generate PSFs for the DET images
+        if (!psphotChoosePSF (config, view, STACK_DET, false)) { // pass 1
+            psLogMsg ("psphot", 3, "failure to construct a psf model for raw input");
+            return psphotReadoutCleanup (config, view, STACK_DET);
+        }
+    }
+    if (!psphotEfficiency(config, view, STACK_DET)) {
         psErrorStackPrint(stderr, "Unable to determine detection efficiencies from fake sources");
         psErrorClear();
     }
+    psphotCopyEfficiency (config, view, STACK_OUT, STACK_DET);
 
     // replace failed sources?
