IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Nov 2, 2009, 10:38:23 AM (17 years ago)
Author:
Paul Price
Message:

Merging PSF-matching code from branches/pap/ for dual convolution.

Location:
trunk/psModules/src/imcombine
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/psModules/src/imcombine

  • trunk/psModules/src/imcombine/pmSubtractionKernels.c

    r25120 r25999  
    8181    kernels->penalties = psVectorRealloc(kernels->penalties, start + numNew);
    8282    kernels->inner = start;
     83    kernels->num += numNew;
    8384
    8485    // Generate a set of kernels for each (u,v)
     
    9495            kernels->v->data.S32[index] = v;
    9596            kernels->preCalc->data[index] = NULL;
    96             kernels->penalties->data.F32[index] = kernels->penalty * (PS_SQR(u) + PS_SQR(v));
     97            kernels->penalties->data.F32[index] = kernels->penalty * PS_SQR(PS_SQR(u) + PS_SQR(v));
    9798
    9899            psTrace("psModules.imcombine", 7, "Kernel %d: %d %d\n", index, u, v);
    99100        }
    100101    }
     102
     103    kernels->widths->n = start + numNew;
     104    kernels->u->n = start + numNew;
     105    kernels->v->n = start + numNew;
     106    kernels->preCalc->n = start + numNew;
     107    kernels->penalties->n = start + numNew;
    101108
    102109    return true;
     
    140147        for (int uOrder = 0; uOrder <= orders->data.S32[i]; uOrder++) {
    141148            for (int vOrder = 0; vOrder <= orders->data.S32[i] - uOrder; vOrder++, index++) {
    142                 psArray *preCalc = psArrayAlloc(2); // Array to hold precalculated values
     149                psArray *preCalc = psArrayAlloc(3); // Array to hold precalculated values
    143150                psVector *xKernel = preCalc->data[0] = subtractionKernelISIS(sigma, uOrder, size); // x Kernel
    144151                psVector *yKernel = preCalc->data[1] = subtractionKernelISIS(sigma, vOrder, size); // y Kernel
     152                psKernel *kernel = preCalc->data[2] = psKernelAlloc(-size, size, -size, size);      // Kernel
    145153
    146154                // Calculate moments
     
    149157                    for (int u = -size, x = 0; u <= size; u++, x++) {
    150158                        double value = xKernel->data.F32[x] * yKernel->data.F32[y]; // Value of kernel
    151                         moment += value * (PS_SQR(u) + PS_SQR(v));
     159                        kernel->kernel[v][u] = value;
     160                        moment += value * PS_SQR((PS_SQR(u) + PS_SQR(v)));
    152161                    }
    153162                }
     
    164173                    psBinaryOp(xKernel, xKernel, "*", psScalarAlloc(sum, PS_TYPE_F32));
    165174                    psBinaryOp(yKernel, yKernel, "*", psScalarAlloc(sum, PS_TYPE_F32));
     175                    psBinaryOp(kernel->image, kernel->image, "*", psScalarAlloc(PS_SQR(sum), PS_TYPE_F32));
     176                    kernel->kernel[0][0] -= 1.0;
    166177                    moment *= PS_SQR(sum);
    167178                }
     179
     180
     181#if 0
     182                double sum = 0.0;   // Sum of kernel component
     183                for (int v = -size; v <= size; v++) {
     184                    for (int u = -size; u <= size; u++) {
     185                        sum += kernel->kernel[v][u];
     186                    }
     187                }
     188                fprintf(stderr, "%d sum: %lf\n", index, sum);
     189#endif
    168190
    169191                kernels->widths->data.F32[index] = fwhms->data.F32[i];
     
    456478    PS_ASSERT_INT_LESS_THAN(inner, size, NULL);
    457479
    458     // XXX GUNK doesn't seem to work --- doesn't add the POIS components, or at least, they're not noticed
    459 
    460480    pmSubtractionKernels *kernels = p_pmSubtractionKernelsRawISIS(size, spatialOrder, fwhms, orders,
    461481                                                                  penalty, mode); // Kernels
     482    kernels->type = PM_SUBTRACTION_KERNEL_GUNK;
    462483    psStringPrepend(&kernels->description, "GUNK=");
    463484    psStringAppend(&kernels->description, "+POIS(%d,%d)", inner, spatialOrder);
     
    577598                                    poly->data.F32[j] = polyVal;
    578599                                    norm += polyVal;
    579                                     moment += polyVal * (PS_SQR(u) + PS_SQR(v));
     600                                    moment += polyVal * PS_SQR(PS_SQR(u) + PS_SQR(v));
    580601
    581602                                    psVectorExtend(uCoords, RINGS_BUFFER, 1);
     
    603624                        psBinaryOp(poly, poly, "*", psScalarAlloc(1.0 / norm, PS_TYPE_F32));
    604625                    }
    605 //                    moment /= norm;
     626                    moment /= norm;
    606627                }
    607628
Note: See TracChangeset for help on using the changeset viewer.