IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Feb 23, 2006, 6:16:11 PM (20 years ago)
Author:
eugene
Message:

fixed some errors with double sources, added second-pass linear PSF fit, multiple-depths

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psphot/src/pmSourceFitSet.c

    r6441 r6481  
    7474    int nPar = model->params->n - 1;  // number of object parameters (excluding sky)
    7575
     76    // define parameter vectors for source set
    7677    psVector *params = psVectorAlloc (nSrc*nPar + 1, PS_TYPE_F32);
    7778    psVector *dparams = psVectorAlloc (nSrc*nPar + 1, PS_TYPE_F32);
    78     psVector *paramMask = PSF ? psVectorAlloc (nSrc*nPar + 1, PS_TYPE_U8) : NULL;
     79
     80    pmModelLimits modelLimits = pmModelLimits_GetFunction (model->type);
     81
     82    // define limits for single-source model
     83    psVector *oneDelta;
     84    psVector *oneParMin;
     85    psVector *oneParMax;
     86    modelLimits (&oneDelta, &oneParMin, &oneParMax);
     87
     88    psMinConstrain *constrain = psMinConstrainAlloc();
     89    constrain->paramDelta = psVectorAlloc (nSrc*nPar + 1, PS_TYPE_F32);
     90    constrain->paramMin = psVectorAlloc (nSrc*nPar + 1, PS_TYPE_F32);
     91    constrain->paramMax = psVectorAlloc (nSrc*nPar + 1, PS_TYPE_F32);
     92    constrain->paramMask = PSF ? psVectorAlloc (nSrc*nPar + 1, PS_TYPE_U8) : NULL;
    7993
    8094    // all but the sky are allowed to vary independently (subject to PSF)
     95    // set the parameters from the multiple models
     96    // also, set limits based on single-source limits
    8197    params->data.F32[0] = model->params->data.F32[0];
     98    constrain->paramDelta->data.F32[0] = oneDelta->data.F32[0];
     99    constrain->paramMin->data.F32[0]   = oneParMin->data.F32[0];
     100    constrain->paramMax->data.F32[0]   = oneParMax->data.F32[0];
     101    constrain->paramMask->data.U8[0]   = 0;
    82102    for (int i = 0; i < nSrc; i++) {
    83103      model = modelSet->data[i];
     
    85105        params->data.F32[i*nPar + n] = model->params->data.F32[n];
    86106        dparams->data.F32[i*nPar + n] = model->dparams->data.F32[n];
     107        constrain->paramDelta->data.F32[i*nPar + n] = oneDelta->data.F32[n];
     108        constrain->paramMin->data.F32[i*nPar + n]   = oneParMin->data.F32[n];
     109        constrain->paramMax->data.F32[i*nPar + n]   = oneParMax->data.F32[n];
    87110        if (PSF) {
    88             paramMask->data.U8[i*nPar + n] = (n < 4) ? 0 : 1;
     111            constrain->paramMask->data.U8[i*nPar + n] = (n < 4) ? 0 : 1;
    89112        }
    90113      }
     114    }
     115    psFree (oneDelta);
     116    psFree (oneParMin);
     117    psFree (oneParMax);
     118
     119    if (psTraceGetLevel(__func__) >= 5) {
     120        for (int i = 0; i < params->n; i++) {
     121            fprintf (stderr, "%d %f %d\n", i, params->data.F32[i], constrain->paramMask->data.U8[i]);
     122        }
    91123    }
    92124
     
    126158    }
    127159    if (nPix <  nParams + 1) {
    128         psTrace (".pmObjects.pmSourceFitModel", 4, "insufficient valid pixels\n");
    129         psTrace(__func__, 3, "---- %s(false) end ----\n", __func__);
     160        psTrace (__func__, 4, "insufficient valid pixels\n");
     161        psTrace(__func__, 3, "---- %s() end : fail pixels ----\n", __func__);
    130162        model->status = PM_MODEL_BADARGS;
    131163        psFree (x);
     
    134166        psFree (params);
    135167        psFree (dparams);
    136         psFree (paramMask);
     168        psFree(constrain->paramMask);
     169        psFree(constrain->paramMin);
     170        psFree(constrain->paramMax);
     171        psFree(constrain->paramDelta);
     172        psFree(constrain);
    137173        return(false);
    138174    }
     
    143179    psMinimization *myMin = psMinimizationAlloc(PM_SOURCE_FIT_MODEL_NUM_ITERATIONS,
    144180                            PM_SOURCE_FIT_MODEL_TOLERANCE);
    145     psMinConstrain *constrain = psMinConstrainAlloc();
    146     constrain->paramMask = paramMask;
    147 
    148     // Set the parameter range checks
    149     pmModelLimits modelLimits = pmModelLimits_GetFunction (model->type);
    150     modelLimits (&constrain->paramDelta, &constrain->paramMin, &constrain->paramMax);
    151181
    152182    psImage *covar = psImageAlloc (params->n, params->n, PS_TYPE_F64);
    153183
    154     psTrace (".pmObjects.pmSourceFitSet", 5, "fitting function\n");
     184    psTrace (__func__, 5, "fitting function\n");
    155185    fitStatus = psMinimizeLMChi2(myMin, covar, params, constrain, x, y, yErr, pmModelFitSet);
    156186
    157187    // parameter errors from the covariance matrix
    158188    for (int i = 0; i < dparams->n; i++) {
    159         if ((paramMask != NULL) && paramMask->data.U8[i])
     189        if ((constrain->paramMask != NULL) && constrain->paramMask->data.U8[i])
    160190            continue;
    161191        dparams->data.F32[i] = sqrt(covar->data.F64[i][i]);
     
    163193
    164194    // get the Gauss-Newton distance for fixed model parameters
    165     if (paramMask != NULL) {
     195    if (constrain->paramMask != NULL) {
    166196        psVector *delta = psVectorAlloc (params->n, PS_TYPE_F64);
    167197        psMinimizeGaussNewtonDelta(delta, params, NULL, x, y, yErr, pmModelFitSet);
    168198        for (int i = 0; i < dparams->n; i++) {
    169             if (!paramMask->data.U8[i])
     199            if (!constrain->paramMask->data.U8[i])
    170200                continue;
    171201            dparams->data.F32[i] = delta->data.F64[i];
     
    220250
    221251    rc = (onPic && fitStatus);
    222     psTrace(__func__, 3, "---- %s(%d) end ----\n", __func__, rc);
     252    psTrace (__func__, 5, "onPic: %d, fitStatus: %d, nIter: %d, chisq: %f, nDof: %d\n", onPic, fitStatus, model->nIter, model->chisq, model->nDOF);
     253    psTrace(__func__, 3, "---- %s end : status %d ----\n", __func__, rc);
    223254    return(rc);
    224255}
Note: See TracChangeset for help on using the changeset viewer.