IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Oct 25, 2010, 2:45:41 PM (16 years ago)
Author:
eugene
Message:

merge changes from eam_branches/ipp-20100823

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psModules/src/imcombine/pmSubtractionKernels.c

    r29004 r29543  
    183183}
    184184
     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])
    185191static bool pmSubtractionKernelPreCalcNormalize(pmSubtractionKernels *kernels, pmSubtractionKernelPreCalc *preCalc,
    186192                                                int index, int uOrder, int vOrder, float fwhm,
     
    220226            // Re-normalize
    221227            // scale2D  = 1.0 / fabs(sum);
    222             scale2D  = 1.0 / sqrt(sum2);
     228            scale2D  = 1.0 / sqrt(sum2) / PS_SQR(fwhm);
    223229            zeroNull = true;
    224230        } else {
    225231            // Odd functions: choose normalisation so that parameters have about the same strength as for even
    226232            // 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);
    228234            zeroNull = false;
    229235        }
     
    235241    if (forceZeroNull) {
    236242        // 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);
    238244        zeroNull = true;
    239245    }
    240246    if (!forceZeroNull && ((uOrder % 2) || (vOrder % 2))) {
    241247        // Odd function
    242         scale2D = 1.0 / sqrt(sum2);
     248        scale2D = 1.0 / sqrt(sum2) / PS_SQR(fwhm);
    243249    }
    244250
     
    255261    if (zeroNull) {
    256262        // preCalc->kernel->kernel[0][0] -= 1.0;
    257         preCalc->kernel->kernel[0][0] -= sum / sqrt (sum2);
    258     }
    259 
    260 #if 1
     263        preCalc->kernel->kernel[0][0] -= sum * scale2D;
     264    }
     265
     266#if 0
    261267    {
    262268        double Sum = 0.0;   // Sum of kernel component
     
    287293    return true;
    288294}
     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 */
    289393
    290394pmSubtractionKernels *p_pmSubtractionKernelsRawISIS(int size, int spatialOrder,
     
    603707    kernels->sampleStamps = NULL;
    604708
    605     kernels->fSigResMean  = NAN;
    606     kernels->fSigResStdev = NAN;
    607     kernels->fMaxResMean  = NAN;
    608     kernels->fMaxResStdev = NAN;
    609     kernels->fMinResMean  = NAN;
    610     kernels->fMinResStdev = 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;
    611715
    612716    return kernels;
Note: See TracChangeset for help on using the changeset viewer.