IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Oct 29, 2006, 5:02:59 PM (20 years ago)
Author:
magnier
Message:

major cleanup of model code, fixes to use new param defs

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psModules/src/objects/models/pmModel_WAUSS.c

    r9621 r9775  
    1 #ifdef HAVE_CONFIG_H
    2 #include <config.h>
    3 #endif
     1/******************************************************************************
     2 * this file defines the WAUSS source shape model (XXX need a better name!).  Note that these
     3 * model functions are loaded by pmModelGroup.c using 'include', and thus need no 'include'
     4 * statements of their own.  The models use a psVector to represent the set of parameters, with
     5 * the sequence used to specify the meaning of the parameter.  The meaning of the parameters
     6 * may thus vary depending on the specifics of the model.  All models which are used a PSF
     7 * representations share a few parameters, for which # define names are listed in pmModel.h:
     8 
     9   power-law with fitted linear term
     10   1 / (1 + Az + Bz^2 + z^3/6)
     11 
     12   * PM_PAR_SKY 0   - local sky : note that this is unused and may be dropped in the future
     13   * PM_PAR_I0 1    - central intensity
     14   * PM_PAR_XPOS 2  - X center of object
     15   * PM_PAR_YPOS 3  - Y center of object
     16   * PM_PAR_SXX 4   - X^2 term of elliptical contour (SigmaX / sqrt(2))
     17   * PM_PAR_SYY 5   - Y^2 term of elliptical contour (SigmaY / sqrt(2))
     18   * PM_PAR_SXY 6   - X*Y term of elliptical contour
     19   * PM_PAR_7   7   - amplitude of the linear component (A)
     20   * PM_PAR_8   8   - amplitude of the quadratic component (B)
     21   *****************************************************************************/
    422
    5 /******************************************************************************
    6     params->data.F32[0] = So;
    7     params->data.F32[1] = Zo;
    8     params->data.F32[2] = Xo;
    9     params->data.F32[3] = Yo;
    10     params->data.F32[4] = sqrt(2.0) / SigmaX;
    11     params->data.F32[5] = sqrt(2.0) / SigmaY;
    12     params->data.F32[6] = Sxy;
    13 *****************************************************************************/
     23/***
     24    XXXX the model in this file needs to be tested more carefully.
     25    fix up the code to follow conventions in the other model function files.
     26***/
    1427
    15 psF64 psModelFunc_WAUSS(psVector *deriv,
    16                         const psVector *params,
    17                         const psVector *x)
     28XXX broken code
     29
     30# define PM_MODEL_FUNC       pmModelFunc_WAUSS
     31# define PM_MODEL_FLUX       pmModelFlux_WAUSS
     32# define PM_MODEL_GUESS      pmModelGuess_WAUSS
     33# define PM_MODEL_LIMITS     pmModelLimits_WAUSS
     34# define PM_MODEL_RADIUS     pmModelRadius_WAUSS
     35# define PM_MODEL_FROM_PSF   pmModelFromPSF_WAUSS
     36# define PM_MODEL_FIT_STATUS pmModelFitStatus_WAUSS
     37
     38psF64 PS_MODEL_FUNC (psVector *deriv,
     39                     const psVector *params,
     40                     const psVector *x)
    1841{
    1942    psF32 X = x->data.F32[0] - params->data.F32[2];
     
    4366}
    4467
    45 // this is probably wrong since it uses the gauss integral 2 pi sigma^2
    46 psF64 psModelFlux_WAUSS(const psVector *params)
     68bool PM_MODEL_LIMITS  (psVector **beta_lim, psVector **params_min, psVector **params_max)
    4769{
    48     psF64 A1   = 1 / PS_SQR(params->data.F32[4]);
    49     psF64 A2   = 1 / PS_SQR(params->data.F32[5]);
    50     psF64 A3   = params->data.F32[6];
    51     psF64 Area = 2.0 * M_PI / sqrt(A1*A2 - PS_SQR(A3));
    52     // Area is equivalent to 2 pi sigma^2
    5370
    54     psF64 Flux = params->data.F32[1] * Area;
     71    *beta_lim   = psVectorAlloc (8, PS_TYPE_F32);
     72    *params_min = psVectorAlloc (8, PS_TYPE_F32);
     73    *params_max = psVectorAlloc (8, PS_TYPE_F32);
    5574
    56     return(Flux);
     75    beta_lim[0][0].data.F32[PM_PAR_SKY] = 1000;
     76    beta_lim[0][0].data.F32[PM_PAR_I0] = 3e6;
     77    beta_lim[0][0].data.F32[PM_PAR_XPOS] = 5;
     78    beta_lim[0][0].data.F32[PM_PAR_YPOS] = 5;
     79    beta_lim[0][0].data.F32[PM_PAR_SXX] = 0.5;
     80    beta_lim[0][0].data.F32[PM_PAR_SYY] = 0.5;
     81    beta_lim[0][0].data.F32[PM_PAR_SXY] = 0.5;
     82    beta_lim[0][0].data.F32[PM_PAR_7] = 0.5;
     83
     84    params_min[0][0].data.F32[PM_PAR_SKY] = -1000;
     85    params_min[0][0].data.F32[PM_PAR_I0] = 0;
     86    params_min[0][0].data.F32[PM_PAR_XPOS] = -100;
     87    params_min[0][0].data.F32[PM_PAR_YPOS] = -100;
     88    params_min[0][0].data.F32[PM_PAR_SXX] = 0.5;
     89    params_min[0][0].data.F32[PM_PAR_SYY] = 0.5;
     90    params_min[0][0].data.F32[PM_PAR_SXY] = -5.0;
     91    params_min[0][0].data.F32[PM_PAR_7] = 0.1;
     92
     93    params_max[0][0].data.F32[PM_PAR_SKY] = 1e5;
     94    params_max[0][0].data.F32[PM_PAR_I0] = 1e8;
     95    params_max[0][0].data.F32[PM_PAR_XPOS] = 1e4;  // this should be set by image dimensions!
     96    params_max[0][0].data.F32[PM_PAR_YPOS] = 1e4;  // this should be set by image dimensions!
     97    params_max[0][0].data.F32[PM_PAR_SXX] = 100.0;
     98    params_max[0][0].data.F32[PM_PAR_SYY] = 100.0;
     99    params_max[0][0].data.F32[PM_PAR_SXY] = +5.0;
     100    params_max[0][0].data.F32[PM_PAR_7] = 10.0;
     101
     102    return (TRUE);
    57103}
    58104
    59 // return the radius which yields the requested flux
    60 psF64 psModelRadius_WAUSS  (const psVector *params, psF64 flux)
    61 {
    62     if (flux <= 0)
    63         return (1.0);
    64     if (params->data.F32[1] <= 0)
    65         return (1.0);
    66     if (flux >= params->data.F32[1] <= 0)
    67         return (1.0);
    68 
    69     psF64 sigma  = sqrt(2.0) * hypot (1.0 / params->data.F32[4], 1.0 / params->data.F32[5]);
    70     psF64 radius = sigma * sqrt (2.0 * log(params->data.F32[1] / flux));
    71     return (radius);
    72 }
    73 
    74 bool psModelGuess_WAUSS (psModel *model, psSource *source)
     105bool PS_MODEL_GUESS  (psModel *model, psSource *source)
    75106{
    76107
     
    90121}
    91122
    92 bool psModelFromPSF_WAUSS (psModel *modelPSF, psModel *modelFLT, pmPSF *psf)
     123// this is probably wrong since it uses the gauss integral 2 pi sigma^2
     124psF64 PS_MODEL_FLUX (const psVector *params)
     125{
     126    psF64 A1   = 1 / PS_SQR(params->data.F32[4]);
     127    psF64 A2   = 1 / PS_SQR(params->data.F32[5]);
     128    psF64 A3   = params->data.F32[6];
     129    psF64 Area = 2.0 * M_PI / sqrt(A1*A2 - PS_SQR(A3));
     130    // Area is equivalent to 2 pi sigma^2
     131
     132    psF64 Flux = params->data.F32[1] * Area;
     133
     134    return(Flux);
     135}
     136
     137// return the radius which yields the requested flux
     138psF64 PS_MODEL_RADIUS   (const psVector *params, psF64 flux)
     139{
     140    if (flux <= 0)
     141        return (1.0);
     142    if (params->data.F32[1] <= 0)
     143        return (1.0);
     144    if (flux >= params->data.F32[1] <= 0)
     145        return (1.0);
     146
     147    psF64 sigma  = sqrt(2.0) * hypot (1.0 / params->data.F32[4], 1.0 / params->data.F32[5]);
     148    psF64 radius = sigma * sqrt (2.0 * log(params->data.F32[1] / flux));
     149    return (radius);
     150}
     151
     152bool PS_MODEL_FROM_PSF  (psModel *modelPSF, psModel *modelFLT, pmPSF *psf)
    93153{
    94154
     
    107167    return(true);
    108168}
     169
     170bool PM_MODEL_FIT_STATUS (pmModel *model)
     171{
     172
     173    psF32 dP;
     174    bool  status;
     175
     176    psF32 *PAR  = model->params->data.F32;
     177    psF32 *dPAR = model->dparams->data.F32;
     178
     179    dP = 0;
     180    dP += PS_SQR(dPAR[PM_PAR_SXX] / PAR[PM_PAR_SXX]);
     181    dP += PS_SQR(dPAR[PM_PAR_SYY] / PAR[PM_PAR_SYY]);
     182    dP = sqrt (dP);
     183
     184    status = true;
     185    status &= (dP < 0.5);
     186    status &= (PAR[PM_PAR_I0] > 0);
     187    status &= ((dPAR[PM_PAR_I0]/PAR[PM_PAR_I0]) < 0.5);
     188
     189    return status;
     190}
     191
     192# undef PM_MODEL_FUNC
     193# undef PM_MODEL_FLUX
     194# undef PM_MODEL_GUESS
     195# undef PM_MODEL_LIMITS
     196# undef PM_MODEL_RADIUS
     197# undef PM_MODEL_FROM_PSF
     198# undef PM_MODEL_FIT_STATUS
Note: See TracChangeset for help on using the changeset viewer.