Index: /trunk/psModules/src/camera/Makefile.am
===================================================================
--- /trunk/psModules/src/camera/Makefile.am	(revision 15361)
+++ /trunk/psModules/src/camera/Makefile.am	(revision 15362)
@@ -27,5 +27,6 @@
 	pmFPAExtent.c \
 	pmCellSquish.c \
-	pmReadoutStack.c
+	pmReadoutStack.c \
+	pmReadoutFake.c
 
 pkginclude_HEADERS = \
@@ -53,5 +54,6 @@
 	pmFPAExtent.h \
 	pmCellSquish.h \
-	pmReadoutStack.h
+	pmReadoutStack.h \
+	pmReadoutFake.h
 
 CLEANFILES = *~
Index: /trunk/psModules/src/camera/pmReadoutFake.c
===================================================================
--- /trunk/psModules/src/camera/pmReadoutFake.c	(revision 15362)
+++ /trunk/psModules/src/camera/pmReadoutFake.c	(revision 15362)
@@ -0,0 +1,111 @@
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <math.h>
+#include <pslib.h>
+
+#include "pmHDU.h"
+#include "pmFPA.h"
+
+#include "pmMoments.h"
+#include "pmResiduals.h"
+#include "pmGrowthCurve.h"
+#include "pmTrend2D.h"
+#include "pmPSF.h"
+#include "pmModel.h"
+#include "pmModelClass.h"
+#include "pmPeaks.h"
+#include "pmSource.h"
+#include "pmSourceUtils.h"
+
+#define MODEL_TYPE "PS_MODEL_RGAUSS"     // Type of model to use
+
+
+pmReadout *pmReadoutFakeFromSources(int numCols, int numRows, const psArray *sources,
+                                    float fwhm, float minFlux)
+{
+    PS_ASSERT_INT_LARGER_THAN(numCols, 0, NULL);
+    PS_ASSERT_INT_LARGER_THAN(numRows, 0, NULL);
+    PS_ASSERT_ARRAY_NON_NULL(sources, NULL);
+    PS_ASSERT_FLOAT_LARGER_THAN(fwhm, 0.0, NULL);
+    PS_ASSERT_FLOAT_LARGER_THAN(minFlux, 0.0, NULL);
+
+    pmReadout *readout = pmReadoutAlloc(NULL); // Output readout
+    readout->image = psImageAlloc(numCols, numRows, PS_TYPE_F32);
+
+    int numSources = sources->n;          // Number of stars
+
+    pmModelType modelType = pmModelClassGetType(MODEL_TYPE); // Type of PSF model
+    assert(modelType >= 0);
+    pmModel *fakeModel = pmModelAlloc(modelType);
+
+    float sigma = fwhm / (2.0 * sqrtf(2.0 * log(2.0))); // Gaussian sigma
+
+    fakeModel->params->data.F32[PM_PAR_SKY] = 0.0;
+    fakeModel->params->data.F32[PM_PAR_I0] = 1.0;
+    fakeModel->params->data.F32[PM_PAR_XPOS] = NAN;
+    fakeModel->params->data.F32[PM_PAR_YPOS] = NAN;
+    fakeModel->params->data.F32[PM_PAR_SXX] = sigma * M_SQRT2;
+    fakeModel->params->data.F32[PM_PAR_SYY] = sigma * M_SQRT2;
+    fakeModel->params->data.F32[PM_PAR_SXY] = 0.0;
+    switch (modelType) {
+      case 0:                           // GAUSS
+      case 1:                           // PGAUSS
+        break;
+      case 2:                           // QGAUSS
+        fakeModel->params->data.F32[PM_PAR_7] = 1.0;
+        break;
+      case 3:                           // RGAUSS
+        fakeModel->params->data.F32[PM_PAR_7] = 2.0;
+        break;
+      default:
+        psAbort("Unsupported model type: %d", modelType);
+    }
+
+    float flux0 = fakeModel->modelFlux(fakeModel->params); // Flux for central intensity of 1.0
+
+
+    for (int i = 0; i < numSources; i++) {
+        pmSource *source = sources->data[i]; // Source of interest
+        if (!isfinite(source->psfMag)) {
+            continue;
+        }
+        float x, y;                     // Coordinates of source
+        if (source->modelPSF) {
+            x = source->modelPSF->params->data.F32[PM_PAR_XPOS];
+            y = source->modelPSF->params->data.F32[PM_PAR_YPOS];
+        } else {
+            x = source->peak->xf;
+            y = source->peak->yf;
+        }
+
+        fakeModel->params->data.F32[PM_PAR_XPOS] = x;
+        fakeModel->params->data.F32[PM_PAR_YPOS] = y;
+        fakeModel->params->data.F32[PM_PAR_I0] = powf(10.0, -0.4 * source->psfMag) / flux0;
+
+        pmSource *fakeSource = pmSourceAlloc(); // Fake source to generate
+        fakeSource->peak = pmPeakAlloc(x, y, fakeModel->params->data.F32[PM_PAR_I0], PM_PEAK_LONE);
+        float radius = fakeModel->modelRadius(fakeModel->params, minFlux); // Radius of interest for source
+
+        if (!pmSourceDefinePixels(fakeSource, readout, x, y, radius)) {
+            psError(PS_ERR_UNKNOWN, false, "Unable to define pixels for source.");
+            psFree(readout);
+            psFree(fakeModel);
+            return NULL;
+        }
+
+        if (!pmModelAdd(fakeSource->pixels, NULL, fakeModel, PM_MODEL_OP_FULL, 0)) {
+            psError(PS_ERR_UNKNOWN, false, "Unable to add model of source to image.");
+            psFree(readout);
+            psFree(fakeModel);
+            return NULL;
+        }
+        psFree(fakeSource);
+    }
+
+    psFree(fakeModel);
+
+    return readout;
+}
Index: /trunk/psModules/src/camera/pmReadoutFake.h
===================================================================
--- /trunk/psModules/src/camera/pmReadoutFake.h	(revision 15362)
+++ /trunk/psModules/src/camera/pmReadoutFake.h	(revision 15362)
@@ -0,0 +1,18 @@
+#ifndef PM_READOUT_FAKE_H
+#define PM_READOUT_FAKE_H
+
+#include <pslib.h>
+#include <pmHDU.h>
+#include <pmFPA.h>
+
+// Generate a fake readout from an array of sources
+pmReadout *pmReadoutFakeFromSources(int numCols, int numRows, ///< Dimension of image
+                                    const psArray *sources, ///< Array of pmSource
+                                    float fwhm, ///< FWHM for sources
+                                    float minFlux ///< Minimum flux to bother about; for setting object size
+    );
+
+
+
+
+#endif
Index: /trunk/psModules/src/psmodules.h
===================================================================
--- /trunk/psModules/src/psmodules.h	(revision 15361)
+++ /trunk/psModules/src/psmodules.h	(revision 15362)
@@ -106,3 +106,6 @@
 #include <pmSourcePhotometry.h>
 
+// The following headers are from random locations, here because they cross bounds
+#include <pmReadoutFake.h>
+
 #endif
