IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Aug 30, 2007, 11:52:56 AM (19 years ago)
Author:
Paul Price
Message:

Cleaning up, consolidating some duplicated code. Fixing photometric preservation for optimum kernels.

File:
1 edited

Legend:

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

    r14709 r14710  
    44 *  @author GLG, MHPCC
    55 *
    6  *  @version $Revision: 1.50 $ $Name: not supported by cvs2svn $
    7  *  @date $Date: 2007-08-30 21:45:26 $
     6 *  @version $Revision: 1.51 $ $Name: not supported by cvs2svn $
     7 *  @date $Date: 2007-08-30 21:52:56 $
    88 *
    99 *  Copyright 2004-2007 Institute for Astronomy, University of Hawaii
     
    621621
    622622        // Generate least-squares vector and matrix
     623        bool bad = false;           // Are there bad values?
    623624        for (int j = 0; j < numKernels; j++) {
    624625            psKernel *jConv = convolutions->data[j]; // Convolution for j-th element
    625626
    626             // Generate upper diagonals of matrix
    627             for (int k = 0; k < numKernels; k++) {
     627            // Generate matrix
     628            for (int k = j; k < numKernels; k++) {
    628629                psKernel *kConv = convolutions->data[k]; // Convolution for k-th element
    629630                double sumCC = 0.0; // Sum of the convolution products
     
    633634                    }
    634635                }
     636
     637                if (!isfinite(sumCC) {
     638                    bad = true;
     639                }
    635640                // Generate the pseudo-convolutions from the spatial polynomial terms
    636641                for (int jyOrder = 0, jIndex = j; jyOrder <= spatialOrder; jyOrder++) {
    637642                    for (int jxOrder = 0; jxOrder <= spatialOrder - jyOrder;
    638643                         jxOrder++, jIndex += numKernels) {
    639                         for (int kyOrder = 0, kIndex = k; kyOrder <= spatialOrder; kyOrder++) {
    640                             for (int kxOrder = 0; kxOrder <= spatialOrder - kyOrder;
     644                        for (int kyOrder = jyOrder, kIndex = k; kyOrder <= spatialOrder; kyOrder++) {
     645                            for (int kxOrder = jxOrder; kxOrder <= spatialOrder - kyOrder;
    641646                                 kxOrder++, kIndex += numKernels) {
    642                                 stampMatrix->data.F64[jIndex][kIndex] = sumCC *
    643                                     polyValues->data.F64[jyOrder][jxOrder] *
    644                                     polyValues->data.F64[kyOrder][kxOrder];
     647                                double convPoly = sumCC * polyValues->data.F64[jyOrder][jxOrder] *
     648                                    polyValues->data.F64[kyOrder][kxOrder]; // Temporary value
     649                                stampMatrix->data.F64[jIndex][kIndex] = convPoly;
     650                                stampMatrix->data.F64[kIndex][jIndex] = convPoly;
    645651                            }
    646652                        }
     
    659665                }
    660666            }
     667            if (!isfinite(sumC) || !isfinite(sumIC)) {
     668                bad = true;
     669            }
    661670            for (int jyOrder = 0, jIndex = j; jyOrder <= spatialOrder; jyOrder++) {
    662671                for (int jxOrder = 0; jxOrder <= spatialOrder - jyOrder;
    663672                     jxOrder++, jIndex += numKernels) {
    664673                    stampVector->data.F64[jIndex] = sumIC * polyValues->data.F64[jyOrder][jxOrder];
    665                     stampMatrix->data.F64[jIndex][bgIndex] = sumC * polyValues->data.F64[jyOrder][jxOrder];
    666                     stampMatrix->data.F64[bgIndex][jIndex] = sumC * polyValues->data.F64[jyOrder][jxOrder];
     674
     675                    double convPoly = sumC * polyValues->data.F64[jyOrder][jxOrder]; // Value
     676                    stampMatrix->data.F64[jIndex][bgIndex] = convPoly;
     677                    stampMatrix->data.F64[bgIndex][jIndex] = convPoly;
    667678                }
    668679            }
     
    681692            }
    682693        }
     694        if (!isfinite(sum1) || !isfinite(sumI)) {
     695            bad = true;
     696        }
    683697        stampMatrix->data.F64[bgIndex][bgIndex] = sum1;
    684698        stampVector->data.F64[bgIndex] = sumI;
    685 
    686         // Fill in lower diagonals of symmetric matrix, while checking for bad values
    687         // Note, there are two symmetries going on here --- the matrix is C_i C_j P_i P_j
    688         bool bad = false;           // Are there bad values?
    689 #if 0
    690         for (int j = 0; j < numKernels; j++) {
    691             for (int jSpatial = 0, jIndex = j; jSpatial < numSpatial; jSpatial++, jIndex += numKernels) {
    692                 for (int k = 0; k < j; k++) {
    693                     for (int kSpatial = 0, kIndex = k; kSpatial < numSpatial;
    694                          kSpatial++, kIndex += numKernels) {
    695                         double value = stampMatrix->data.F64[kIndex][jIndex]; // Value of matrix
    696                         stampMatrix->data.F64[jIndex][kIndex] = value;
    697                         if (!isfinite(value)) {
    698                             bad = true;
    699                         }
    700                     }
    701                 }
    702 
    703                 stampMatrix->data.F64[bgIndex][jIndex] = stampMatrix->data.F64[jIndex][bgIndex];
    704                 if (!isfinite(stampMatrix->data.F64[jIndex][bgIndex]) ||
    705                     !isfinite(stampMatrix->data.F64[jIndex][jIndex]) ||
    706                     !isfinite(stampVector->data.F64[jIndex])) {
    707                     bad = true;
    708                 }
    709             }
    710         }
    711 #endif
    712         if (!isfinite(stampVector->data.F64[bgIndex])) {
    713             bad = true;
    714         }
    715699
    716700        if (bad) {
Note: See TracChangeset for help on using the changeset viewer.