IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 17354


Ignore:
Timestamp:
Apr 6, 2008, 2:44:17 PM (18 years ago)
Author:
eugene
Message:

make consistent with LMM code: Alpha,Beta do not include masked parameters

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branch_20080324/psphot/src/psphotModelWithPSF.c

    r17344 r17354  
    11# include "psphotInternal.h"
     2# define SAVE_IMAGES 0
    23
    34bool psphotModelWithPSF_LMM (
     
    3637
    3738    // allocate internal arrays (current vs Guess)
    38     psImage *alpha   = psImageAlloc(params->n, params->n, PS_TYPE_F32);
    39     psImage *Alpha   = psImageAlloc(params->n, params->n, PS_TYPE_F32);
    40     psVector *beta   = psVectorAlloc(params->n, PS_TYPE_F32);
    41     psVector *Beta   = psVectorAlloc(params->n, PS_TYPE_F32);
     39    psImage *Alpha = NULL;
     40    psVector *Beta = NULL;
     41
     42    // Alpha & Beta only contain elements to represent the unmasked parameters
     43    if (!psMinLM_AllocAB (&Alpha, &Beta, params, paramMask)) {
     44        psAbort ("programming error: no unmasked parameters to be fit\n");
     45    }
     46   
     47    // allocate internal arrays (current vs Guess)
     48    psImage *alpha   = psImageAlloc(Alpha->numCols, Alpha->numRows, PS_TYPE_F32);
     49    psVector *beta   = psVectorAlloc(Beta->n, PS_TYPE_F32);
    4250    psVector *Params = psVectorAlloc(params->n, PS_TYPE_F32);
    4351
     
    7987        // dump some useful info if trace is defined
    8088        if (psTraceGetLevel("psphot") >= 6) {
    81             p_psImagePrint(psTraceGetDestination(), Alpha, "alpha guess (1)");
    82             p_psVectorPrint(psTraceGetDestination(), Beta, "beta guess (1)");
     89            p_psImagePrint(psTraceGetDestination(), Alpha, "Alpha guess (1)");
     90            p_psVectorPrint(psTraceGetDestination(), Beta, "Beta guess (1)");
     91            p_psVectorPrint(psTraceGetDestination(), beta, "beta current (1)");
    8392        }
    8493        if (psTraceGetLevel("psphot") >= 5) {
     
    116125            beta   = psVectorCopy(beta, Beta, PS_TYPE_F32);
    117126            params = psVectorCopy(params, Params, PS_TYPE_F32);
    118             lambda *= 0.1;
     127            lambda *= 0.25;
    119128
    120129            // save the new convolved model image
     
    130139    // construct & return the covariance matrix (if requested)
    131140    if (covar != NULL) {
    132         if (!psMinLM_GuessABP(covar, Beta, Params, alpha, beta, params, paramMask, NULL, 0.0, NULL)) {
     141        if (!psMinLM_GuessABP(Alpha, Beta, Params, alpha, beta, params, paramMask, NULL, 0.0, NULL)) {
    133142            psTrace ("psphot", 5, "failure to calculate covariance matrix\n");
    134143        }
     144        // set covar values which are not masked
     145        psImageInit (covar, 0.0);
     146        for (int j = 0, J = 0; j < params->n; j++) {
     147            if (paramMask && (paramMask->data.U8[j])) {
     148                covar->data.F32[j][j] = 1.0;
     149                continue;
     150            }
     151            for (int k = 0, K = 0; k < params->n; k++) {
     152                if (paramMask && (paramMask->data.U8[k])) continue;
     153                covar->data.F32[j][k] = Alpha->data.F32[J][K];
     154                K++;
     155            }
     156            J++;
     157        }
    135158    }
    136159
     
    177200    }
    178201
    179     // generate the model and derivative images for this parameter set
     202    // 1 *** generate the model and derivative images for this parameter set
    180203
    181204    // storage for model derivatives
     
    223246
    224247            for (int n = 0; n < params->n; n++) {
    225               if ((paramMask != NULL) && (paramMask->data.U8[n])) { continue; }
    226               psImage *dmodel = pcm->dmodels->data[n];
    227               dmodel->data.F32[i][j] = deriv->data.F32[n];
     248                if ((paramMask != NULL) && (paramMask->data.U8[n])) { continue; }
     249                psImage *dmodel = pcm->dmodels->data[n];
     250                dmodel->data.F32[i][j] = deriv->data.F32[n];
    228251            }
    229252        }
     
    231254    psFree(coord);
    232255    psFree(deriv);
    233 
    234256
    235257    // convolve model and dmodel arrays with PSF
    236258    psImageConvolveDirect (pcm->modelConv, pcm->model, psf);
    237259    for (int n = 0; n < pcm->dmodels->n; n++) {
    238       if (pcm->dmodels->data[n] == NULL) continue;
    239       psImage *dmodel = pcm->dmodels->data[n];
    240       psImage *dmodelConv = pcm->dmodelsConv->data[n];
    241       psImageConvolveDirect (dmodelConv, dmodel, psf);
     260        if (pcm->dmodels->data[n] == NULL) continue;
     261        psImage *dmodel = pcm->dmodels->data[n];
     262        psImage *dmodelConv = pcm->dmodelsConv->data[n];
     263        psImageConvolveDirect (dmodelConv, dmodel, psf);
    242264    }
    243265
    244266    // XXX TEST : SAVE IMAGES
    245 # if (1)
     267# if (SAVE_IMAGES)
    246268    psphotSaveImage (NULL, psf->image, "psf.fits");
    247269    psphotSaveImage (NULL, pcm->model, "model.fits");
     
    252274# endif
    253275
     276    // 2 *** accumulate alpha & beta
     277
    254278    // zero alpha and beta for summing below
    255279    psImageInit (alpha, 0.0);
     
    259283    for (psS32 i = 0; i < source->pixels->numRows; i++) {
    260284        for (psS32 j = 0; j < source->pixels->numCols; j++) {
    261           // XXX are we doing the right thing with the mask?
     285            // XXX are we doing the right thing with the mask?
    262286            // skip masked points
    263287            if (source->maskObj->data.U8[i][j]) {
     
    279303            chisq += PS_SQR(delta) * yweight;
    280304
    281             if (isnan(delta))
    282               psAbort("nan in delta");
    283             if (isnan(chisq))
    284               psAbort("nan in chisq");
    285 
    286             for (psS32 n1 = 0; n1 < params->n; n1++) {
    287               if ((paramMask != NULL) && (paramMask->data.U8[n1])) {
    288                 continue;
    289               }
    290               psImage *dmodel = pcm->dmodelsConv->data[n1];
    291               float weight = dmodel->data.F32[i][j] * yweight;
    292               for (psS32 n2 = 0; n2 <= n1; n2++) {
    293                 if ((paramMask != NULL) && (paramMask->data.U8[n2])) {
    294                   continue;
    295                 }
    296                 dmodel = pcm->dmodelsConv->data[n2];
    297                 alpha->data.F32[n1][n2] += weight * dmodel->data.F32[i][j];
    298               }
    299               beta->data.F32[n1] += weight * delta;
     305            if (isnan(delta)) psAbort("nan in delta");
     306            if (isnan(chisq)) psAbort("nan in chisq");
     307
     308            // alpha & beta only contain unmasked elements
     309            for (int n1 = 0, N1 = 0; n1 < params->n; n1++) {
     310                if ((paramMask != NULL) && (paramMask->data.U8[n1])) continue;
     311                psImage *dmodel = pcm->dmodelsConv->data[n1];
     312                float weight = dmodel->data.F32[i][j] * yweight;
     313                for (int n2 = 0, N2 = 0; n2 <= n1; n2++) {
     314                    if ((paramMask != NULL) && (paramMask->data.U8[n2])) continue;
     315                    dmodel = pcm->dmodelsConv->data[n2];
     316                    alpha->data.F32[N1][N2] += weight * dmodel->data.F32[i][j];
     317                    N2++;
     318                }
     319                beta->data.F32[N1] += weight * delta;
     320                N1++;
    300321            }
    301322        }
     
    303324
    304325    // calculate lower-left half of alpha
    305     for (psS32 j = 1; j < params->n; j++) {
     326    for (psS32 j = 1; j < alpha->numCols; j++) {
    306327        for (psS32 k = 0; k < j; k++) {
    307328            alpha->data.F32[k][j] = alpha->data.F32[j][k];
    308         }
    309     }
    310 
    311     // fill in pivots if we apply a mask
    312     if (paramMask != NULL) {
    313         for (psS32 j = 0; j < params->n; j++) {
    314             if (paramMask->data.U8[j]) {
    315                 alpha->data.F32[j][j] = 1;
    316                 beta->data.F32[j] = 1;
    317             }
    318329        }
    319330    }
     
    345356    pcm->dmodels = psArrayAlloc (params->n);
    346357    for (psS32 n = 0; n < params->n; n++) {
    347       if ((paramMask != NULL) && (paramMask->data.U8[n])) { continue; }
    348       pcm->dmodels->data[n] = psImageCopy (NULL, source->pixels, PS_TYPE_F32);
     358        pcm->dmodels->data[n] = NULL;
     359        if ((paramMask != NULL) && (paramMask->data.U8[n])) { continue; }
     360        pcm->dmodels->data[n] = psImageCopy (NULL, source->pixels, PS_TYPE_F32);
    349361    }
    350362
     
    353365    pcm->dmodelsConv = psArrayAlloc (params->n);
    354366    for (psS32 n = 0; n < params->n; n++) {
    355       if ((paramMask != NULL) && (paramMask->data.U8[n])) { continue; }
    356       pcm->dmodelsConv->data[n] = psImageCopy (NULL, source->pixels, PS_TYPE_F32);
     367        pcm->dmodelsConv->data[n] = NULL;
     368        if ((paramMask != NULL) && (paramMask->data.U8[n])) { continue; }
     369        pcm->dmodelsConv->data[n] = psImageCopy (NULL, source->pixels, PS_TYPE_F32);
    357370    }
    358371
     
    378391 
    379392 while () {
    380    GuessABP (Alpha, Beta, Params, alpha, beta, params, paramMask, checkLimits, lambda)
    381    dLinear = dLinear(Beta, beta, lambda);
    382    chisq = SetABX (alpha, beta, params, paramMask, x, y, dy, func)
    383    convergence tests...
     393 GuessABP (Alpha, Beta, Params, alpha, beta, params, paramMask, checkLimits, lambda)
     394 dLinear = dLinear(Beta, beta, lambda);
     395 chisq = SetABX (alpha, beta, params, paramMask, x, y, dy, func)
     396 convergence tests...
    384397 }
    385398 
     
    388401 ** GuessABP:
    389402
    390       f_c = sum_i (kern_i * func (x_i; p_o))
    391 
    392 df_c/dp_o = d/dp_o [sum_i (kern_i * func (x_i; p_o))]
    393 
    394 df_c/dp_o = sum_i (d/dp_o [kern_i * func (x_i; p_o)])
    395 
    396 df_c/dp_o = sum_i (kern_i * d/dp_o [func (x_i; p_o)])
    397 
    398 - generate image arrays for func, dfunc/dp_j (not masked)
    399 - convolve each with psf
    400 - measure delta = f_conv - data
    401 - etc
     403 f_c = sum_i (kern_i * func (x_i; p_o))
     404
     405 df_c/dp_o = d/dp_o [sum_i (kern_i * func (x_i; p_o))]
     406
     407 df_c/dp_o = sum_i (d/dp_o [kern_i * func (x_i; p_o)])
     408
     409 df_c/dp_o = sum_i (kern_i * d/dp_o [func (x_i; p_o)])
     410
     411 - generate image arrays for func, dfunc/dp_j (not masked)
     412 - convolve each with psf
     413 - measure delta = f_conv - data
     414 - etc
    402415*/
    403416
Note: See TracChangeset for help on using the changeset viewer.