Changeset 29506
- Timestamp:
- Oct 21, 2010, 6:14:32 AM (16 years ago)
- Location:
- branches/eam_branches/ipp-20100823/psModules/src/imcombine
- Files:
-
- 2 edited
-
pmSubtractionEquation.c (modified) (5 diffs)
-
pmSubtractionKernels.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/ipp-20100823/psModules/src/imcombine/pmSubtractionEquation.c
r29490 r29506 21 21 22 22 // XXX TEST: 23 # define USE_WINDOW // window to avoid neighbor contamination23 //# define USE_WINDOW // window to avoid neighbor contamination 24 24 25 25 # define PENALTY false … … 1091 1091 } 1092 1092 1093 #if 11093 #if 0 1094 1094 psImage *save = psImageCopy(NULL, sumMatrix, PS_TYPE_F32); 1095 1095 psFitsWriteImageSimple ("sumMatrix.fits", save, NULL); … … 1115 1115 } 1116 1116 1117 # if (0) 1117 1118 for (int i = 0; i < solution->n; i++) { 1118 1119 psLogMsg("psModules.imcombine", PS_LOG_DETAIL, "Single solution %d: %lf\n", i, solution->data.F64[i]); 1119 1120 } 1121 # endif 1120 1122 1121 1123 if (!kernels->solution1) { … … 1169 1171 } 1170 1172 1171 #if 11173 #if 0 1172 1174 psImage *save = psImageCopy(NULL, sumMatrix, PS_TYPE_F32); 1173 1175 psFitsWriteImageSimple ("sumMatrix.fits", save, NULL); … … 1187 1189 solution = psMatrixSolveSVD(solution, sumMatrix, sumVector, NAN); 1188 1190 1189 #if ( 1)1191 #if (0) 1190 1192 for (int i = 0; i < solution->n; i++) { 1191 1193 fprintf(stderr, "Dual solution %d: %lf\n", i, solution->data.F64[i]); -
branches/eam_branches/ipp-20100823/psModules/src/imcombine/pmSubtractionKernels.c
r29490 r29506 183 183 } 184 184 185 # define CENTRAL_DELTA 0 186 187 # if (CENTRAL_DELTA) 188 185 189 // XXX *** this code used the central pixel to force zero net flux, 186 190 // Alard actually uses kernel(0) for this purpose (for even order, kernel[i] = kernel'[i] - kernel[0]) 187 188 191 static bool pmSubtractionKernelPreCalcNormalize(pmSubtractionKernels *kernels, pmSubtractionKernelPreCalc *preCalc, 189 192 int index, int uOrder, int vOrder, float fwhm, … … 290 293 return true; 291 294 } 295 296 # else /* CENTRAL_DELTA */ 297 298 static bool zeroIsNormal = false; 299 300 // this code uses kernel(0) to force zero flux, and is invalid for other kinds of normalizations 301 static bool pmSubtractionKernelPreCalcNormalize(pmSubtractionKernels *kernels, pmSubtractionKernelPreCalc *preCalc, 302 int index, int uOrder, int vOrder, float fwhm, 303 bool AlardLuptonStyle, bool forceZeroNull) 304 { 305 // 1) for odd functions: no renormalization 306 // 2) for even functions, normalize the kernel to unity 307 // 3) for even functions & index > 0, subtract kernel(0) 308 309 // Calculate moments 310 double sum = 0.0, sum2 = 0.0; // Sum of kernel component 311 float min = INFINITY, max = -INFINITY; // Minimum and maximum kernel value 312 313 for (int v = preCalc->kernel->yMin; v <= preCalc->kernel->yMax; v++) { 314 for (int u = preCalc->kernel->xMin; u <= preCalc->kernel->xMax; u++) { 315 double value = preCalc->kernel->kernel[v][u]; 316 double value2 = PS_SQR(value); 317 sum += value; 318 sum2 += value2; 319 min = PS_MIN(value, min); 320 max = PS_MAX(value, max); 321 } 322 } 323 324 #if 0 325 fprintf(stderr, "%d raw: %lf, null: %f, min: %lf, max: %lf\n", index, sum, preCalc->kernel->kernel[0][0], min, max); 326 #endif 327 328 float scale2D = 1.0; // Scaling for 2-D kernels 329 float scale1D = 1.0; // Scaling for 1-D kernels 330 331 if (uOrder % 2 == 0 && vOrder % 2 == 0) { 332 333 scale2D = 1.0 / sum; // Scaling for 2-D kernels 334 scale1D = sqrtf(scale2D); // Scaling for 1-D kernels 335 336 for (int v = preCalc->kernel->yMin; v <= preCalc->kernel->yMax; v++) { 337 for (int u = preCalc->kernel->xMin; u <= preCalc->kernel->xMax; u++) { 338 preCalc->kernel->kernel[v][u] *= scale2D; 339 } 340 } 341 if (index == 0) { 342 zeroIsNormal = true; 343 } else { 344 psAssert(zeroIsNormal, "failed to normalize zero kernel first"); 345 pmSubtractionKernelPreCalc *zeroKernel = kernels->preCalc->data[0]; 346 psAssert(zeroKernel, "failed to supply zero kernel"); 347 for (int v = preCalc->kernel->yMin; v <= preCalc->kernel->yMax; v++) { 348 for (int u = preCalc->kernel->xMin; u <= preCalc->kernel->xMax; u++) { 349 preCalc->kernel->kernel[v][u] -= zeroKernel->kernel->kernel[v][u]; 350 } 351 } 352 } 353 354 // XXX why do we bother renormlizing the 1D kernels? I don't think we use them again... 355 if (preCalc->xKernel) { 356 psBinaryOp(preCalc->xKernel, preCalc->xKernel, "*", psScalarAlloc(scale1D, PS_TYPE_F32)); 357 } 358 if (preCalc->yKernel) { 359 psBinaryOp(preCalc->yKernel, preCalc->yKernel, "*", psScalarAlloc(scale1D, PS_TYPE_F32)); 360 } 361 } 362 363 #if 0 364 { 365 double Sum = 0.0; // Sum of kernel component 366 double Sum2 = 0.0; // Sum of kernel component 367 float min = INFINITY, max = -INFINITY; // Minimum and maximum kernel value 368 for (int v = preCalc->kernel->yMin; v <= preCalc->kernel->yMax; v++) { 369 for (int u = preCalc->kernel->xMin; u <= preCalc->kernel->xMax; u++) { 370 double value = preCalc->kernel->kernel[v][u]; 371 Sum += value; 372 Sum2 += PS_SQR(value); 373 min = PS_MIN(preCalc->kernel->kernel[v][u], min); 374 max = PS_MAX(preCalc->kernel->kernel[v][u], max); 375 } 376 } 377 fprintf(stderr, "%d sum: %lf, sum2: %lf, null: %f, min: %lf, max: %lf, scale: %f\n", index, Sum, Sum2, preCalc->kernel->kernel[0][0], min, max, scale2D); 378 } 379 #endif 380 381 kernels->widths->data.F32[index] = fwhm; 382 kernels->u->data.S32[index] = uOrder; 383 kernels->v->data.S32[index] = vOrder; 384 if (kernels->preCalc->data[index]) { 385 psFree(kernels->preCalc->data[index]); 386 } 387 kernels->preCalc->data[index] = preCalc; 388 psTrace("psModules.imcombine", 7, "Kernel %d: %f %d %d\n", index, fwhm, uOrder, vOrder); 389 390 return true; 391 } 392 # endif /* Central Delta */ 292 393 293 394 pmSubtractionKernels *p_pmSubtractionKernelsRawISIS(int size, int spatialOrder,
Note:
See TracChangeset
for help on using the changeset viewer.
