Changeset 14513 for trunk/psModules/src/imcombine/pmSubtractionStamps.c
- Timestamp:
- Aug 15, 2007, 1:17:56 PM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/imcombine/pmSubtractionStamps.c
r14480 r14513 9 9 #include "pmSubtractionStamps.h" 10 10 11 12 #define PM_SUBTRACTION_MASK_BAD_STAMP (PM_SUBTRACTION_MASK_BORDER | PM_SUBTRACTION_MASK_FOOTPRINT | \ 13 PM_SUBTRACTION_MASK_REJ) // Mask indicates a stamp would be bad 14 15 11 16 ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 12 17 // Private (file-static) functions … … 31 36 psMemSetDeallocator(stamp, (psFreeFunc)subtractionStampFree); 32 37 33 stamp->x = 0;34 stamp->y = 0;35 stamp->xNorm = 0.0;36 stamp->yNorm = 0.0;38 stamp->x = NAN; 39 stamp->y = NAN; 40 stamp->xNorm = NAN; 41 stamp->yNorm = NAN; 37 42 stamp->matrix = NULL; 38 43 stamp->vector = NULL; … … 131 136 for (int x = xStart; x <= xStop ; x++) { 132 137 if ((!subMask || !(subMask->data.PS_TYPE_MASK_DATA[y][x] & 133 (PM_SUBTRACTION_MASK_BORDER | PM_SUBTRACTION_MASK_FOOTPRINT | 134 PM_SUBTRACTION_MASK_REJ))) && 138 PM_SUBTRACTION_MASK_BAD_STAMP)) && 135 139 image->data.F32[y][x] > fluxBest) { 136 140 fluxBest = image->data.F32[y][x]; … … 143 147 stamp->x = xBest; 144 148 stamp->y = yBest; 145 stamp->xNorm = 2.0 * (float)(xBest - numCols/2.0) / (float)numCols;146 stamp->yNorm = 2.0 * (float)(yBest - numRows/2.0) / (float)numRows;147 149 148 150 // Reset the postage stamps since we're making a new stamp … … 156 158 numFound++; 157 159 psTrace("psModules.imcombine", 5, "Found stamp in region (%d,%d): %d,%d\n", 158 i, j, stamp->x,stamp->y);160 i, j, (int)stamp->x, (int)stamp->y); 159 161 } else { 160 162 stamp->status = PM_SUBTRACTION_STAMP_NONE; … … 166 168 psLogMsg("psModules.imcombine", PS_LOG_INFO, "Found %d stamps in %dx%d regions", 167 169 numFound, xNumStamps, yNumStamps); 170 171 return stamps; 172 } 173 174 175 psArray *pmSubtractionSetStamps(const psVector *x, const psVector *y, 176 const psImage *subMask, const psRegion *region) 177 { 178 PS_ASSERT_VECTOR_NON_NULL(x, false); 179 PS_ASSERT_VECTOR_TYPE(x, PS_TYPE_F32, false); 180 PS_ASSERT_VECTOR_NON_NULL(y, false); 181 PS_ASSERT_VECTOR_TYPE(y, PS_TYPE_F32, false); 182 PS_ASSERT_VECTORS_SIZE_EQUAL(y, x, false); 183 if (subMask) { 184 PS_ASSERT_IMAGE_NON_NULL(subMask, false); 185 PS_ASSERT_IMAGE_TYPE(subMask, PS_TYPE_MASK, false); 186 } 187 188 int num = x->n; // Number of stamps 189 psArray *stamps = psArrayAllocEmpty(num); // Stamps, to return 190 191 for (int i = 0; i < num; i++) { 192 int xStamp = x->data.F32[i] + 0.5, yStamp = y->data.F32[i] + 0.5; // Pixel coords of stamp 193 if (region && (xStamp < region->x0 || xStamp > region->x1 || 194 yStamp < region->y0 || yStamp > region->y1)) { 195 // Not interested at this time 196 continue; 197 } 198 199 if (subMask && subMask->data.PS_TYPE_MASK_DATA[yStamp][xStamp] & PM_SUBTRACTION_MASK_BAD_STAMP) { 200 // It's bad 201 continue; 202 } 203 204 pmSubtractionStamp *stamp = pmSubtractionStampAlloc(PM_SUBTRACTION_STAMP_CALCULATE); // Stamp 205 stamp->x = x->data.F32[i]; 206 stamp->y = y->data.F32[i]; 207 stamps->data[stamps->n++] = stamp; 208 } 168 209 169 210 return stamps; … … 198 239 for (int i = 0; i < stamps->n; i++) { 199 240 pmSubtractionStamp *stamp = stamps->data[i]; // Stamp of interest 200 201 202 int x = stamp->x, y = stamp->y; // Stamp coordinates 241 if (!stamp || stamp->status != PM_SUBTRACTION_STAMP_CALCULATE) { 242 continue; 243 } 244 245 if (isnan(stamp->xNorm)) { 246 stamp->xNorm = 2.0 * (stamp->x - (float)numCols/2.0) / (float)numCols; 247 } 248 if (isnan(stamp->yNorm)) { 249 stamp->yNorm = 2.0 * (stamp->y - (float)numRows/2.0) / (float)numRows; 250 } 251 252 int x = stamp->x + 0.5, y = stamp->y + 0.5; // Stamp coordinates 203 253 if (x < size || x > numCols - size || y < size || y > numRows - size) { 204 254 psError(PS_ERR_UNKNOWN, false, "Stamp %d (%d,%d) is within the image border.\n", i, x, y); … … 228 278 229 279 280 psArray *pmSubtractionGenerateStamps(const psVector *x, const psVector *y, const psVector *flux, 281 float sigma, int footprint, const pmSubtractionKernels *kernels) 282 { 283 PS_ASSERT_VECTOR_NON_NULL(x, false); 284 PS_ASSERT_VECTOR_TYPE(x, PS_TYPE_F32, false); 285 PS_ASSERT_VECTOR_NON_NULL(y, false); 286 PS_ASSERT_VECTOR_TYPE(y, PS_TYPE_F32, false); 287 PS_ASSERT_VECTORS_SIZE_EQUAL(y, x, false); 288 PS_ASSERT_VECTOR_NON_NULL(flux, false); 289 PS_ASSERT_VECTOR_TYPE(flux, PS_TYPE_F32, false); 290 PS_ASSERT_VECTORS_SIZE_EQUAL(flux, y, false); 291 PS_ASSERT_FLOAT_LARGER_THAN(sigma, 0.0, false); 292 293 int size = kernels->size + footprint; // Size of postage stamps 294 int num = x->n; // Number of stamps 295 psArray *stamps = psArrayAlloc(num); // Stamps, to return 296 297 for (int i = 0; i < num; i++) { 298 pmSubtractionStamp *stamp = pmSubtractionStampAlloc(PM_SUBTRACTION_STAMP_CALCULATE); // Stamp 299 stamps->data[i] = stamp; 300 301 stamp->x = x->data.F32[i]; 302 stamp->y = y->data.F32[i]; 303 304 float xStamp = x->data.F32[i] - (int)(stamp->x + 0.5); // x coordinate of star in stamp frame 305 float yStamp = y->data.F32[i] - (int)(stamp->y + 0.5); // y coordinate of star in stamp frame 306 float fluxStamp = flux->data.F32[i]; // Flux of star 307 308 stamp->input = psKernelAlloc(-size, size, -size, size); 309 psKernel *input = stamp->input; // Target stamp 310 311 // Put in a Gaussian, just for fun! 312 for (int y = -size; y <= size; y++) { 313 for (int x = -size; x <= size; x++) { 314 input->kernel[y][x] = fluxStamp / sigma * 0.5 * M_2_SQRTPI * M_SQRT1_2 * 315 expf(0.5 * (PS_SQR(x + xStamp) + PS_SQR(y + yStamp)) / PS_SQR(sigma)); 316 } 317 } 318 319 } 320 321 return stamps; 322 }
Note:
See TracChangeset
for help on using the changeset viewer.
