IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 29506


Ignore:
Timestamp:
Oct 21, 2010, 6:14:32 AM (16 years ago)
Author:
eugene
Message:

subtract kernel(0) instead of delta function

Location:
branches/eam_branches/ipp-20100823/psModules/src/imcombine
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/ipp-20100823/psModules/src/imcombine/pmSubtractionEquation.c

    r29490 r29506  
    2121
    2222// XXX TEST:
    23 # define USE_WINDOW                      // window to avoid neighbor contamination
     23//# define USE_WINDOW                      // window to avoid neighbor contamination
    2424
    2525# define PENALTY false
     
    10911091        }
    10921092
    1093 #if 1
     1093#if 0
    10941094        psImage *save = psImageCopy(NULL, sumMatrix, PS_TYPE_F32);
    10951095        psFitsWriteImageSimple ("sumMatrix.fits", save, NULL);
     
    11151115        }
    11161116
     1117# if (0)
    11171118        for (int i = 0; i < solution->n; i++) {
    11181119            psLogMsg("psModules.imcombine", PS_LOG_DETAIL, "Single solution %d: %lf\n", i, solution->data.F64[i]);
    11191120        }
     1121# endif
    11201122
    11211123        if (!kernels->solution1) {
     
    11691171        }
    11701172
    1171 #if 1
     1173#if 0
    11721174        psImage *save = psImageCopy(NULL, sumMatrix, PS_TYPE_F32);
    11731175        psFitsWriteImageSimple ("sumMatrix.fits", save, NULL);
     
    11871189        solution = psMatrixSolveSVD(solution, sumMatrix, sumVector, NAN);
    11881190
    1189 #if (1)
     1191#if (0)
    11901192        for (int i = 0; i < solution->n; i++) {
    11911193            fprintf(stderr, "Dual solution %d: %lf\n", i, solution->data.F64[i]);
  • branches/eam_branches/ipp-20100823/psModules/src/imcombine/pmSubtractionKernels.c

    r29490 r29506  
    183183}
    184184
     185# define CENTRAL_DELTA 0
     186
     187# if (CENTRAL_DELTA)
     188
    185189// XXX *** this code used the central pixel to force zero net flux,
    186190// Alard actually uses kernel(0) for this purpose (for even order, kernel[i] = kernel'[i] - kernel[0])
    187 
    188191static bool pmSubtractionKernelPreCalcNormalize(pmSubtractionKernels *kernels, pmSubtractionKernelPreCalc *preCalc,
    189192                                                int index, int uOrder, int vOrder, float fwhm,
     
    290293    return true;
    291294}
     295
     296# else /* CENTRAL_DELTA */
     297
     298static bool zeroIsNormal = false;
     299
     300// this code uses kernel(0) to force zero flux, and is invalid for other kinds of normalizations
     301static 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 */
    292393
    293394pmSubtractionKernels *p_pmSubtractionKernelsRawISIS(int size, int spatialOrder,
Note: See TracChangeset for help on using the changeset viewer.