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_TGAUSS.c

    r9621 r9775  
    1 #ifdef HAVE_CONFIG_H
    2 #include <config.h>
    3 #endif
    4 
    51/******************************************************************************
    6     one component, two slopes:
    7     1 / (1 + z^M + z^N)
     2 * this file defines the TGAUSS 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:
    88 
    9     params->data.F32[0] = So;
    10     params->data.F32[1] = Zo;
    11     params->data.F32[2] = Xo;
    12     params->data.F32[3] = Yo;
    13     params->data.F32[4] = sqrt(2.0) / SigmaX;
    14     params->data.F32[5] = sqrt(2.0) / SigmaY;
    15     params->data.F32[6] = Sxy;
    16     params->data.F32[7] =
    17 *****************************************************************************/
    18 
    19 psF64 psModelFunc_TGAUSS(psVector *deriv,
    20                          const psVector *params,
    21                          const psVector *x)
     9   power-law with fixed slope and fitted amplitude
     10   1 / (1 + z + kz^2.2)
     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 (sqrt(2) / SigmaX)
     17   * PM_PAR_SYY 5   - Y^2 term of elliptical contour (sqrt(2) / SigmaY)
     18   * PM_PAR_SXY 6   - X*Y term of elliptical contour
     19   * PM_PAR_7   7   - amplitude of high-order component (k)
     20   *****************************************************************************/
     21
     22/***
     23    XXXX the model in this file needs to be tested more carefully.
     24    fix up the code to follow conventions in the other model function files.
     25***/
     26
     27XXX broken code
     28
     29# define PM_MODEL_FUNC       pmModelFunc_TGAUSS
     30# define PM_MODEL_FLUX       pmModelFlux_TGAUSS
     31# define PM_MODEL_GUESS      pmModelGuess_TGAUSS
     32# define PM_MODEL_LIMITS     pmModelLimits_TGAUSS
     33# define PM_MODEL_RADIUS     pmModelRadius_TGAUSS
     34# define PM_MODEL_FROM_PSF   pmModelFromPSF_TGAUSS
     35# define PM_MODEL_FIT_STATUS pmModelFitStatus_TGAUSS
     36
     37psF64 PS_MODEL_FUNC (psVector *deriv,
     38                     const psVector *params,
     39                     const psVector *x)
    2240{
    2341    psF32 *PAR = params->data.F32;
     
    5068}
    5169
    52 psF64 psModelFlux_TGAUSS(const psVector *params)
    53 {
    54     psF64 A1   = 1 / PS_SQR(params->data.F32[4]);
    55     psF64 A2   = 1 / PS_SQR(params->data.F32[5]);
    56     psF64 A3   = params->data.F32[6];
    57     psF64 Area = 2.0 * M_PI / sqrt(A1*A2 - PS_SQR(A3));
    58     // Area is equivalent to 2 pi sigma^2
    59 
    60     psF64 Flux = params->data.F32[1] * Area;
    61 
    62     return(Flux);
    63 }
    64 
    65 // define this function so it never returns Inf or NaN
    66 // return the radius which yields the requested flux
    67 psF64 psModelRadius_TGAUSS  (const psVector *params, psF64 flux)
    68 {
    69     if (flux <= 0)
    70         return (1.0);
    71     if (params->data.F32[1] <= 0)
    72         return (1.0);
    73     if (flux >= params->data.F32[1])
    74         return (1.0);
    75 
    76     psF64 sigma  = sqrt(2.0) * hypot (1.0 / params->data.F32[4], 1.0 / params->data.F32[5]);
    77     psF64 radius = sigma * sqrt (2.0 * log(params->data.F32[1] / flux));
    78     if (isnan(radius)) {
    79         fprintf (stderr, "error in code\n");
    80     }
    81     return (radius);
    82 }
    83 
    84 bool psModelGuess_TGAUSS (psModel *model, psSource *source)
     70bool PM_MODEL_LIMITS  (psVector **beta_lim, psVector **params_min, psVector **params_max)
     71{
     72
     73    *beta_lim   = psVectorAlloc (8, PS_TYPE_F32);
     74    *params_min = psVectorAlloc (8, PS_TYPE_F32);
     75    *params_max = psVectorAlloc (8, PS_TYPE_F32);
     76
     77    beta_lim[0][0].data.F32[PM_PAR_SKY] = 1000;
     78    beta_lim[0][0].data.F32[PM_PAR_I0] = 3e6;
     79    beta_lim[0][0].data.F32[PM_PAR_XPOS] = 5;
     80    beta_lim[0][0].data.F32[PM_PAR_YPOS] = 5;
     81    beta_lim[0][0].data.F32[PM_PAR_SXX] = 0.5;
     82    beta_lim[0][0].data.F32[PM_PAR_SYY] = 0.5;
     83    beta_lim[0][0].data.F32[PM_PAR_SXY] = 0.5;
     84    beta_lim[0][0].data.F32[PM_PAR_7] = 0.5;
     85
     86    params_min[0][0].data.F32[PM_PAR_SKY] = -1000;
     87    params_min[0][0].data.F32[PM_PAR_I0] = 0;
     88    params_min[0][0].data.F32[PM_PAR_XPOS] = -100;
     89    params_min[0][0].data.F32[PM_PAR_YPOS] = -100;
     90    params_min[0][0].data.F32[PM_PAR_SXX] = 0.5;
     91    params_min[0][0].data.F32[PM_PAR_SYY] = 0.5;
     92    params_min[0][0].data.F32[PM_PAR_SXY] = -5.0;
     93    params_min[0][0].data.F32[PM_PAR_7] = 0.1;
     94
     95    params_max[0][0].data.F32[PM_PAR_SKY] = 1e5;
     96    params_max[0][0].data.F32[PM_PAR_I0] = 1e8;
     97    params_max[0][0].data.F32[PM_PAR_XPOS] = 1e4;  // this should be set by image dimensions!
     98    params_max[0][0].data.F32[PM_PAR_YPOS] = 1e4;  // this should be set by image dimensions!
     99    params_max[0][0].data.F32[PM_PAR_SXX] = 100.0;
     100    params_max[0][0].data.F32[PM_PAR_SYY] = 100.0;
     101    params_max[0][0].data.F32[PM_PAR_SXY] = +5.0;
     102    params_max[0][0].data.F32[PM_PAR_7] = 10.0;
     103
     104    return (TRUE);
     105}
     106
     107bool PS_MODEL_GUESS  (psModel *model, psSource *source)
    85108{
    86109
     
    99122}
    100123
    101 bool psModelFromPSF_TGAUSS (psModel *modelPSF, psModel *modelFLT, pmPSF *psf)
     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// define this function so it never returns Inf or NaN
     138// return the radius which yields the requested flux
     139psF64 PS_MODEL_RADIUS   (const psVector *params, psF64 flux)
     140{
     141    if (flux <= 0)
     142        return (1.0);
     143    if (params->data.F32[1] <= 0)
     144        return (1.0);
     145    if (flux >= params->data.F32[1])
     146        return (1.0);
     147
     148    psF64 sigma  = sqrt(2.0) * hypot (1.0 / params->data.F32[4], 1.0 / params->data.F32[5]);
     149    psF64 radius = sigma * sqrt (2.0 * log(params->data.F32[1] / flux));
     150    if (isnan(radius)) {
     151        fprintf (stderr, "error in code\n");
     152    }
     153    return (radius);
     154}
     155
     156bool PS_MODEL_FROM_PSF  (psModel *modelPSF, psModel *modelFLT, pmPSF *psf)
    102157{
    103158
     
    116171    return(true);
    117172}
     173
     174bool PM_MODEL_FIT_STATUS (pmModel *model)
     175{
     176
     177    psF32 dP;
     178    bool  status;
     179
     180    psF32 *PAR  = model->params->data.F32;
     181    psF32 *dPAR = model->dparams->data.F32;
     182
     183    dP = 0;
     184    dP += PS_SQR(dPAR[PM_PAR_SXX] / PAR[PM_PAR_SXX]);
     185    dP += PS_SQR(dPAR[PM_PAR_SYY] / PAR[PM_PAR_SYY]);
     186    dP = sqrt (dP);
     187
     188    status = true;
     189    status &= (dP < 0.5);
     190    status &= (PAR[PM_PAR_I0] > 0);
     191    status &= ((dPAR[PM_PAR_I0]/PAR[PM_PAR_I0]) < 0.5);
     192
     193    return status;
     194}
     195
     196# undef PM_MODEL_FUNC
     197# undef PM_MODEL_FLUX
     198# undef PM_MODEL_GUESS
     199# undef PM_MODEL_LIMITS
     200# undef PM_MODEL_RADIUS
     201# undef PM_MODEL_FROM_PSF
     202# undef PM_MODEL_FIT_STATUS
Note: See TracChangeset for help on using the changeset viewer.