Index: trunk/psModules/src/objects/pmSourceGroups.c
===================================================================
--- trunk/psModules/src/objects/pmSourceGroups.c	(revision 26172)
+++ trunk/psModules/src/objects/pmSourceGroups.c	(revision 26182)
@@ -56,5 +56,5 @@
 
 
-pmSourceGroups *pmSourceGroupsAlloc(const pmReadout *readout, const psArray *sources, int nThreads)
+pmSourceGroups *pmSourceGroupsAlloc(const pmReadout *readout, int nThreads)
 {
     pmSourceGroups *groups = psAlloc(sizeof(pmSourceGroups)); // Groups, to return
@@ -88,12 +88,79 @@
     groups->groups = psArrayAlloc(4);
 
-    long numSources = sources->n;       // Number of input sources
+    return groups;
+}
+
+
+
+pmSourceGroups *pmSourceGroupsFromSources(const pmReadout *readout, const psArray *sources, int nThreads)
+{
+    PM_ASSERT_READOUT_NON_NULL(readout, NULL);
+    PM_ASSERT_READOUT_IMAGE(readout, NULL);
+    PS_ASSERT_ARRAY_NON_NULL(sources, NULL);
+    PS_ASSERT_INT_NONNEGATIVE(nThreads, NULL);
+
+    pmSourceGroups *groups = pmSourceGroupsAlloc(readout, nThreads);
+
+    int numSources = sources->n;        // Number of sources
+    psVector *x = psVectorAlloc(numSources, PS_TYPE_F32), *y = psVectorAlloc(numSources, PS_TYPE_F32);
+    for (int i = 0; i < numSources; i++) {
+        pmSource *source = sources->data[i]; // Source of interest
+        x->data.F32[i] = source->peak->xf;
+        y->data.F32[i] = source->peak->yf;
+    }
+
+    if (!pmSourceGroupsPopulate(groups, x, y)) {
+        psError(PS_ERR_UNKNOWN, false, "Unable to populate source groups");
+        psFree(x);
+        psFree(y);
+        psFree(groups);
+        return NULL;
+    }
+
+    psFree(x);
+    psFree(y);
+    return groups;
+}
+
+pmSourceGroups *pmSourceGroupsFromVectors(const pmReadout *readout, const psVector *x,
+                                          const psVector *y, int nThreads)
+{
+    PM_ASSERT_READOUT_NON_NULL(readout, NULL);
+    PM_ASSERT_READOUT_IMAGE(readout, NULL);
+    PS_ASSERT_VECTOR_NON_NULL(x, NULL);
+    PS_ASSERT_VECTOR_NON_NULL(y, NULL);
+    PS_ASSERT_VECTOR_TYPE(x, PS_TYPE_F32, NULL);
+    PS_ASSERT_VECTOR_TYPE(y, PS_TYPE_F32, NULL);
+    PS_ASSERT_VECTORS_SIZE_EQUAL(x, y, NULL);
+    PS_ASSERT_INT_NONNEGATIVE(nThreads, NULL);
+
+    pmSourceGroups *groups = pmSourceGroupsAlloc(readout, nThreads);
+    if (!pmSourceGroupsPopulate(groups, x, y)) {
+        psError(PS_ERR_UNKNOWN, false, "Unable to populate source groups");
+        psFree(groups);
+        return NULL;
+    }
+
+    return groups;
+}
+
+
+bool pmSourceGroupsPopulate(pmSourceGroups *groups, const psVector *x, const psVector *y)
+{
+    PS_ASSERT_PTR_NON_NULL(groups, false);
+    PS_ASSERT_VECTOR_NON_NULL(x, NULL);
+    PS_ASSERT_VECTOR_NON_NULL(y, NULL);
+    PS_ASSERT_VECTOR_TYPE(x, PS_TYPE_F32, NULL);
+    PS_ASSERT_VECTOR_TYPE(y, PS_TYPE_F32, NULL);
+    PS_ASSERT_VECTORS_SIZE_EQUAL(x, y, NULL);
 
     // Populate the groups
+    int numSources = x->n;                // Number of sources
+    long total = groups->Cx * groups->Cy; // Total size
     for (int i = 0; i < groups->groups->n; i++) {
-        psArray *cells = psArrayAlloc(Cx * Cy); // Cells within a group
+        psArray *cells = psArrayAlloc(total); // Cells within a group
         groups->groups->data[i] = cells;
         for (int j = 0; j < cells->n; j++) {
-            cells->data[j] = psArrayAllocEmpty(numSources / (Cx * Cy));
+            cells->data[j] = psVectorAllocEmpty(numSources / total, PS_TYPE_S32);
         }
     }
@@ -101,11 +168,10 @@
     // Populate the cells
     for (int i = 0; i < numSources; i++) {
-        pmSource *source = sources->data[i]; // Source of interest
         int group = 0, cell = 0;        // Group and cell index for source
-        pmSourceGroupsCoordToCell(&group, &cell, source->peak->xf, source->peak->yf, groups);
+        pmSourceGroupsCoordToCell(&group, &cell, x->data.F32[i], y->data.F32[i], groups);
 
         psArray *cells = groups->groups->data[group]; // Cells for group
-        psArray *cellSources = cells->data[cell];     // Array of sources for cell within group
-        psArrayAdd(cellSources, cellSources->nalloc, source);
+        psVector *cellSources = cells->data[cell];    // Indices of sources for cell within group
+        psVectorAppend(cellSources, i);
     }
 
