IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Aug 17, 2007, 11:27:05 AM (19 years ago)
Author:
eugene
Message:

changed APIs pmIsFooBar to pmFooBarTest

changed pmModelGroup to pmModelClass (and rationalized some names)

using pmModelPSFforXY for clearer code

using new pmModel member functions for limits, etc

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branch_20070817/psphot/src/models/pmModel_TEST1.c

    r11702 r14545  
    1616 *****************************************************************************/
    1717
    18 # define PM_MODEL_FUNC       pmModelFunc_TEST1
    19 # define PM_MODEL_FLUX       pmModelFlux_TEST1
    20 # define PM_MODEL_GUESS      pmModelGuess_TEST1
    21 # define PM_MODEL_LIMITS     pmModelLimits_TEST1
    22 # define PM_MODEL_RADIUS     pmModelRadius_TEST1
    23 # define PM_MODEL_FROM_PSF   pmModelFromPSF_TEST1
    24 # define PM_MODEL_FIT_STATUS pmModelFitStatus_TEST1
    25 
    26 // XXX consider changing to form PAR[SXY]*(1/PAR[SXX]^2 + 1/PAR[SYY]^2)*X*Y
    27 // this would provide natural limits on PAR[SXY] of -0.25 : +0.25
     18# define PM_MODEL_FUNC            pmModelFunc_TEST1
     19# define PM_MODEL_FLUX            pmModelFlux_TEST1
     20# define PM_MODEL_GUESS           pmModelGuess_TEST1
     21# define PM_MODEL_LIMITS          pmModelLimits_TEST1
     22# define PM_MODEL_RADIUS          pmModelRadius_TEST1
     23# define PM_MODEL_FROM_PSF        pmModelFromPSF_TEST1
     24# define PM_MODEL_PARAMS_FROM_PSF pmModelParamsFromPSF_TEST1
     25# define PM_MODEL_FIT_STATUS      pmModelFitStatus_TEST1
    2826
    2927// the model is a function of the pixel coordinate (pixcoord[0,1] = x,y)
    3028psF32 PM_MODEL_FUNC(psVector *deriv,
    31                          const psVector *params,
    32                          const psVector *pixcoord)
     29                    const psVector *params,
     30                    const psVector *pixcoord)
    3331{
    3432    psF32 *PAR = params->data.F32;
     
    125123
    126124// make an initial guess for parameters
    127 bool PM_MODEL_GUESS (pmModel *model, pmSource *source)
    128 {
     125bool PM_MODEL_GUESS (void *inModel, void *inSource)
     126{
     127    pmModel *model = inModel;
     128    pmSource *source = inSource;
    129129
    130130    pmMoments *moments = source->moments;
     
    160160    norm = 0.0;
    161161
    162     # define DZ 0.25
     162# define DZ 0.25
    163163
    164164    float f0 = 1.0;
     
    207207}
    208208
    209 bool PM_MODEL_FROM_PSF (pmModel *modelPSF, pmModel *modelFLT, pmPSF *psf)
    210 {
     209bool PM_MODEL_FROM_PSF (void *inModelPSF, void *inModelFLT, void *inPSF)
     210{
     211    pmModel *modelPSF = inModelPSF;
     212    pmModel *modelFLT = inModelFLT;
     213    pmPSF *psf = inPSF;
    211214
    212215    psF32 *out = modelPSF->params->data.F32;
     
    232235}
    233236
     237// construct the PSF model from the FLT model and the psf
     238// XXX is this sufficiently general do be a global function, not a pmModelClass function?
     239bool PM_MODEL_PARAMS_FROM_PSF (void *inModel, void *inPSF, float Xo, float Yo, float Io)
     240{
     241    pmModel *model = inModel;
     242    pmPSF *psf = inPSF;
     243
     244    psF32 *PAR = model->params->data.F32;
     245
     246    // we require these two parameters to exist
     247    assert (psf->params_NEW->n > PM_PAR_YPOS);
     248    assert (psf->params_NEW->n > PM_PAR_XPOS);
     249
     250    PAR[PM_PAR_SKY]  = 0.0;
     251    PAR[PM_PAR_I0]   = Io;
     252    PAR[PM_PAR_XPOS] = Xo;
     253    PAR[PM_PAR_YPOS] = Yo;
     254   
     255    // supply the model-fitted parameters, or copy from the input
     256    for (int i = 0; i < psf->params_NEW->n; i++) {
     257        if (i == PM_PAR_SKY) continue;
     258        psPolynomial2D *poly = psf->params_NEW->data[i];
     259        assert (poly);
     260        PAR[i] = psPolynomial2DEval(poly, Xo, Yo);
     261    }
     262
     263    // the 2D PSF model fits polarization terms (E0,E1,E2)
     264    // convert to shape terms (SXX,SYY,SXY)
     265    // XXX user-defined value for limit?
     266    if (!pmPSF_FitToModel (PAR, 0.1)) {
     267        psError(PM_ERR_PSF, false, "Failed to fit object at (r,c) = (%.1f,%.1f)", Xo, Yo);
     268        return false;
     269    }
     270
     271    // apply the model limits here: this truncates excessive extrapolation
     272    // XXX do we need to do this still?  should we put in asserts to test?
     273    for (int i = 0; i < psf->params_NEW->n; i++) {
     274        // apply the limits to all components or just the psf-model parameters?
     275        if (psf->params_NEW->data[i] == NULL)
     276            continue;
     277
     278        bool status = true;
     279        status &= PM_MODEL_LIMITS (PS_MINIMIZE_PARAM_MIN, i, PAR, NULL);
     280        status &= PM_MODEL_LIMITS (PS_MINIMIZE_PARAM_MAX, i, PAR, NULL);
     281        if (!status) {
     282            psTrace ("psModules.objects", 5, "Hitting parameter limits at (r,c) = (%.1f, %.1f)", Xo, Yo);
     283            model->flags |= PM_MODEL_STATUS_LIMITS;
     284        }
     285    }
     286    return(true);
     287}
     288
    234289// XXX double-check these definitions below
    235290// this test is invalid if the parameters are derived
    236291// from the PSF model
    237 bool PM_MODEL_FIT_STATUS (pmModel *model)
    238 {
     292bool PM_MODEL_FIT_STATUS (void *inModel)
     293{
     294    pmModel *model = inModel;
    239295
    240296    psF32 dP;
     
    265321# undef PM_MODEL_RADIUS
    266322# undef PM_MODEL_FROM_PSF
     323# undef PM_MODEL_PARAMS_FROM_PSF
    267324# undef PM_MODEL_FIT_STATUS
Note: See TracChangeset for help on using the changeset viewer.