Changeset 26182 for trunk/psModules/src/objects/pmSourceGroups.c
- Timestamp:
- Nov 18, 2009, 10:48:22 AM (17 years ago)
- File:
-
- 1 edited
-
trunk/psModules/src/objects/pmSourceGroups.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/objects/pmSourceGroups.c
r26172 r26182 56 56 57 57 58 pmSourceGroups *pmSourceGroupsAlloc(const pmReadout *readout, const psArray *sources,int nThreads)58 pmSourceGroups *pmSourceGroupsAlloc(const pmReadout *readout, int nThreads) 59 59 { 60 60 pmSourceGroups *groups = psAlloc(sizeof(pmSourceGroups)); // Groups, to return … … 88 88 groups->groups = psArrayAlloc(4); 89 89 90 long numSources = sources->n; // Number of input sources 90 return groups; 91 } 92 93 94 95 pmSourceGroups *pmSourceGroupsFromSources(const pmReadout *readout, const psArray *sources, int nThreads) 96 { 97 PM_ASSERT_READOUT_NON_NULL(readout, NULL); 98 PM_ASSERT_READOUT_IMAGE(readout, NULL); 99 PS_ASSERT_ARRAY_NON_NULL(sources, NULL); 100 PS_ASSERT_INT_NONNEGATIVE(nThreads, NULL); 101 102 pmSourceGroups *groups = pmSourceGroupsAlloc(readout, nThreads); 103 104 int numSources = sources->n; // Number of sources 105 psVector *x = psVectorAlloc(numSources, PS_TYPE_F32), *y = psVectorAlloc(numSources, PS_TYPE_F32); 106 for (int i = 0; i < numSources; i++) { 107 pmSource *source = sources->data[i]; // Source of interest 108 x->data.F32[i] = source->peak->xf; 109 y->data.F32[i] = source->peak->yf; 110 } 111 112 if (!pmSourceGroupsPopulate(groups, x, y)) { 113 psError(PS_ERR_UNKNOWN, false, "Unable to populate source groups"); 114 psFree(x); 115 psFree(y); 116 psFree(groups); 117 return NULL; 118 } 119 120 psFree(x); 121 psFree(y); 122 return groups; 123 } 124 125 pmSourceGroups *pmSourceGroupsFromVectors(const pmReadout *readout, const psVector *x, 126 const psVector *y, int nThreads) 127 { 128 PM_ASSERT_READOUT_NON_NULL(readout, NULL); 129 PM_ASSERT_READOUT_IMAGE(readout, NULL); 130 PS_ASSERT_VECTOR_NON_NULL(x, NULL); 131 PS_ASSERT_VECTOR_NON_NULL(y, NULL); 132 PS_ASSERT_VECTOR_TYPE(x, PS_TYPE_F32, NULL); 133 PS_ASSERT_VECTOR_TYPE(y, PS_TYPE_F32, NULL); 134 PS_ASSERT_VECTORS_SIZE_EQUAL(x, y, NULL); 135 PS_ASSERT_INT_NONNEGATIVE(nThreads, NULL); 136 137 pmSourceGroups *groups = pmSourceGroupsAlloc(readout, nThreads); 138 if (!pmSourceGroupsPopulate(groups, x, y)) { 139 psError(PS_ERR_UNKNOWN, false, "Unable to populate source groups"); 140 psFree(groups); 141 return NULL; 142 } 143 144 return groups; 145 } 146 147 148 bool pmSourceGroupsPopulate(pmSourceGroups *groups, const psVector *x, const psVector *y) 149 { 150 PS_ASSERT_PTR_NON_NULL(groups, false); 151 PS_ASSERT_VECTOR_NON_NULL(x, NULL); 152 PS_ASSERT_VECTOR_NON_NULL(y, NULL); 153 PS_ASSERT_VECTOR_TYPE(x, PS_TYPE_F32, NULL); 154 PS_ASSERT_VECTOR_TYPE(y, PS_TYPE_F32, NULL); 155 PS_ASSERT_VECTORS_SIZE_EQUAL(x, y, NULL); 91 156 92 157 // Populate the groups 158 int numSources = x->n; // Number of sources 159 long total = groups->Cx * groups->Cy; // Total size 93 160 for (int i = 0; i < groups->groups->n; i++) { 94 psArray *cells = psArrayAlloc( Cx * Cy); // Cells within a group161 psArray *cells = psArrayAlloc(total); // Cells within a group 95 162 groups->groups->data[i] = cells; 96 163 for (int j = 0; j < cells->n; j++) { 97 cells->data[j] = ps ArrayAllocEmpty(numSources / (Cx * Cy));164 cells->data[j] = psVectorAllocEmpty(numSources / total, PS_TYPE_S32); 98 165 } 99 166 } … … 101 168 // Populate the cells 102 169 for (int i = 0; i < numSources; i++) { 103 pmSource *source = sources->data[i]; // Source of interest104 170 int group = 0, cell = 0; // Group and cell index for source 105 pmSourceGroupsCoordToCell(&group, &cell, source->peak->xf, source->peak->yf, groups);171 pmSourceGroupsCoordToCell(&group, &cell, x->data.F32[i], y->data.F32[i], groups); 106 172 107 173 psArray *cells = groups->groups->data[group]; // Cells for group 108 ps Array *cellSources = cells->data[cell]; // Arrayof sources for cell within group109 ps ArrayAdd(cellSources, cellSources->nalloc, source);174 psVector *cellSources = cells->data[cell]; // Indices of sources for cell within group 175 psVectorAppend(cellSources, i); 110 176 } 111 177
Note:
See TracChangeset
for help on using the changeset viewer.
