Changeset 29543 for trunk/psModules/src/imcombine/pmSubtractionKernels.c
- Timestamp:
- Oct 25, 2010, 2:45:41 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/imcombine/pmSubtractionKernels.c
r29004 r29543 183 183 } 184 184 185 # define CENTRAL_DELTA 0 186 187 # if (CENTRAL_DELTA) 188 189 // XXX *** this code used the central pixel to force zero net flux, 190 // Alard actually uses kernel(0) for this purpose (for even order, kernel[i] = kernel'[i] - kernel[0]) 185 191 static bool pmSubtractionKernelPreCalcNormalize(pmSubtractionKernels *kernels, pmSubtractionKernelPreCalc *preCalc, 186 192 int index, int uOrder, int vOrder, float fwhm, … … 220 226 // Re-normalize 221 227 // scale2D = 1.0 / fabs(sum); 222 scale2D = 1.0 / sqrt(sum2) ;228 scale2D = 1.0 / sqrt(sum2) / PS_SQR(fwhm); 223 229 zeroNull = true; 224 230 } else { 225 231 // Odd functions: choose normalisation so that parameters have about the same strength as for even 226 232 // functions, no subtraction of null pixel because the sum is already (near) zero 227 scale2D = 1.0 / sqrt(sum2) ;233 scale2D = 1.0 / sqrt(sum2) / PS_SQR(fwhm); 228 234 zeroNull = false; 229 235 } … … 235 241 if (forceZeroNull) { 236 242 // Force rescaling and subtraction of null pixel even though the order doesn't indicate it's even 237 scale2D = 1.0 / fabs(sum) ;243 scale2D = 1.0 / fabs(sum) / PS_SQR(fwhm); 238 244 zeroNull = true; 239 245 } 240 246 if (!forceZeroNull && ((uOrder % 2) || (vOrder % 2))) { 241 247 // Odd function 242 scale2D = 1.0 / sqrt(sum2) ;248 scale2D = 1.0 / sqrt(sum2) / PS_SQR(fwhm); 243 249 } 244 250 … … 255 261 if (zeroNull) { 256 262 // preCalc->kernel->kernel[0][0] -= 1.0; 257 preCalc->kernel->kernel[0][0] -= sum / sqrt (sum2);258 } 259 260 #if 1263 preCalc->kernel->kernel[0][0] -= sum * scale2D; 264 } 265 266 #if 0 261 267 { 262 268 double Sum = 0.0; // Sum of kernel component … … 287 293 return true; 288 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 */ 289 393 290 394 pmSubtractionKernels *p_pmSubtractionKernelsRawISIS(int size, int spatialOrder, … … 603 707 kernels->sampleStamps = NULL; 604 708 605 kernels->f SigResMean = NAN;606 kernels->f SigResStdev = NAN;607 kernels->f MaxResMean = NAN;608 kernels->f MaxResStdev = NAN;609 kernels->f MinResMean = NAN;610 kernels->f MinResStdev = NAN;709 kernels->fResSigmaMean = NAN; 710 kernels->fResSigmaStdev = NAN; 711 kernels->fResOuterMean = NAN; 712 kernels->fResOuterStdev = NAN; 713 kernels->fResTotalMean = NAN; 714 kernels->fResTotalStdev = NAN; 611 715 612 716 return kernels;
Note:
See TracChangeset
for help on using the changeset viewer.
