IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
May 3, 2010, 8:50:52 AM (16 years ago)
Author:
eugene
Message:

updates from trunk

Location:
branches/simtest_nebulous_branches
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/simtest_nebulous_branches

  • branches/simtest_nebulous_branches/psModules

  • branches/simtest_nebulous_branches/psModules/src/objects/models/pmModel_GAUSS.c

    r20001 r27840  
    11/******************************************************************************
    22 * this file defines the GAUSS source shape model.  Note that these model functions are loaded
    3  * by pmModelGroup.c using 'include', and thus need no 'include' statements of their own.  The
     3 * by pmModelClass.c using 'include', and thus need no 'include' statements of their own.  The
    44 * models use a psVector to represent the set of parameters, with the sequence used to specify
    55 * the meaning of the parameter.  The meaning of the parameters may thus vary depending on the
    6  * specifics of the model.  All models which are used a PSF representations share a few
     6 * specifics of the model.  All models which are used as a PSF representations share a few
    77 * parameters, for which # define names are listed in pmModel.h:
    88
     
    1919 *****************************************************************************/
    2020
     21#include <stdio.h>
     22#include <pslib.h>
     23
     24#include "pmMoments.h"
     25#include "pmPeaks.h"
     26#include "pmSource.h"
     27#include "pmModel.h"
     28#include "pmModel_GAUSS.h"
     29
    2130# define PM_MODEL_FUNC            pmModelFunc_GAUSS
    2231# define PM_MODEL_FLUX            pmModelFlux_GAUSS
     
    2736# define PM_MODEL_PARAMS_FROM_PSF pmModelParamsFromPSF_GAUSS
    2837# define PM_MODEL_FIT_STATUS      pmModelFitStatus_GAUSS
     38# define PM_MODEL_SET_LIMITS      pmModelSetLimits_GAUSS
     39
     40// Lax parameter limits
     41static float paramsMinLax[] = { -1.0e3, 1.0e-2, -100, -100, 0.5, 0.5, -1.0 };
     42static float paramsMaxLax[] = { 1.0e5, 1.0e8, 1.0e4, 1.0e4, 100, 100, 1.0 };
     43
     44// Moderate parameter limits
     45static float *paramsMinModerate = paramsMinLax;
     46static float *paramsMaxModerate = paramsMaxLax;
     47
     48// Strict parameter limits
     49static float *paramsMinStrict = paramsMinLax;
     50static float *paramsMaxStrict = paramsMaxLax;
     51
     52// Parameter limits to use
     53static float *paramsMinUse = paramsMinLax;
     54static float *paramsMaxUse = paramsMaxLax;
     55static float betaUse[] = { 1000, 3e6, 5, 5, 2.0, 2.0, 0.5 };
     56
     57static bool limitsApply = true;         // Apply limits?
    2958
    3059// the model is a function of the pixel coordinate (pixcoord[0,1] = x,y)
     60// 0.5 PIX: the parameters are defined in terms of pixel coords, so the incoming pixcoords
     61// values need to be pixel coords
    3162psF32 PM_MODEL_FUNC(psVector *deriv,
    3263                    const psVector *params,
     
    6899bool PM_MODEL_LIMITS (psMinConstraintMode mode, int nParam, float *params, float *beta)
    69100{
    70     float beta_lim = 0, params_min = 0, params_max = 0;
    71     float f1 = 0, f2 = 0, q1 = 0, q2 = 0;
     101    if (!limitsApply) {
     102        return true;
     103    }
     104    psAssert(nParam >= 0 && nParam <= PM_PAR_7, "Parameter index is out of bounds");
    72105
    73106    // we need to calculate the limits for SXY specially
     107    float q2 = NAN;
    74108    if (nParam == PM_PAR_SXY) {
    75         f1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]);
    76         f2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]);
    77         q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2);
    78         q1 = PS_MAX (0.0, q1);
     109        float f1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]);
     110        float f2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]);
     111        float q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2);
     112        q1 = (q1 < 0.0) ? 0.0 : q1;
    79113        // if q1 < 0.0, f2 ~ f1, we have a very large axis ratio near 45deg..  Saturate at that
    80114        // angle and let f2,f1 fight it out
    81         q2  = 0.5*sqrt (q1);
     115        q2 = 0.5*sqrtf(q1);
    82116    }
    83117
    84118    switch (mode) {
    85     case PS_MINIMIZE_BETA_LIMIT:
    86         switch (nParam) {
    87         case PM_PAR_SKY:
    88             beta_lim = 1000;
    89             break;
    90         case PM_PAR_I0:
    91             beta_lim = 3e6;
    92             break;
    93         case PM_PAR_XPOS:
    94             beta_lim = 5;
    95             break;
    96         case PM_PAR_YPOS:
    97             beta_lim = 5;
    98             break;
    99         case PM_PAR_SXX:
    100             beta_lim = 2.0;
    101             break;
    102         case PM_PAR_SYY:
    103             beta_lim = 2.0;
    104             break;
    105         case PM_PAR_SXY:
    106             beta_lim =  0.5*q2;
    107             break;
    108         default:
    109             psAbort("invalid parameter %d for beta test", nParam);
    110         }
    111         if (fabs(beta[nParam]) > fabs(beta_lim)) {
    112             beta[nParam] = (beta[nParam] > 0) ? fabs(beta_lim) : -fabs(beta_lim);
    113             psTrace ("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g",
    114                      nParam, beta[nParam], beta_lim);
    115             return false;
    116         }
    117         return true;
    118     case PS_MINIMIZE_PARAM_MIN:
    119         switch (nParam) {
    120         case PM_PAR_SKY:
    121             params_min = -1000;
    122             break;
    123         case PM_PAR_I0:
    124             params_min =   0.01;
    125             break;
    126         case PM_PAR_XPOS:
    127             params_min =  -100;
    128             break;
    129         case PM_PAR_YPOS:
    130             params_min =  -100;
    131             break;
    132         case PM_PAR_SXX:
    133             params_min =   0.5;
    134             break;
    135         case PM_PAR_SYY:
    136             params_min =   0.5;
    137             break;
    138         case PM_PAR_SXY:
    139             params_min =   -q2;
    140             break;
    141         default:
    142             psAbort("invalid parameter %d for param min test", nParam);
    143         }
    144         if (params[nParam] < params_min) {
    145             params[nParam] = params_min;
    146             psTrace ("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g",
    147                      nParam, params[nParam], params_min);
    148             return false;
    149         }
    150         return true;
    151     case PS_MINIMIZE_PARAM_MAX:
    152         switch (nParam) {
    153         case PM_PAR_SKY:
    154             params_max =   1e5;
    155             break;
    156         case PM_PAR_I0:
    157             params_max =   1e8;
    158             break;
    159         case PM_PAR_XPOS:
    160             params_max =   1e4;
    161             break;
    162         case PM_PAR_YPOS:
    163             params_max =   1e4;
    164             break;
    165         case PM_PAR_SXX:
    166             params_max =   100;
    167             break;
    168         case PM_PAR_SYY:
    169             params_max =   100;
    170             break;
    171         case PM_PAR_SXY:
    172             params_max =   +q2;
    173             break;
    174         default:
    175             psAbort("invalid parameter %d for param max test", nParam);
    176         }
    177         if (params[nParam] > params_max) {
    178             params[nParam] = params_max;
    179             psTrace ("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g",
    180                      nParam, params[nParam], params_max);
    181             return false;
    182         }
    183         return true;
     119      case PS_MINIMIZE_BETA_LIMIT: {
     120          psAssert(beta, "Require beta to limit beta");
     121          float limit = betaUse[nParam];
     122          if (nParam == PM_PAR_SXY) {
     123              limit *= q2;
     124          }
     125          if (fabs(beta[nParam]) > fabs(limit)) {
     126              beta[nParam] = (beta[nParam] > 0) ? fabs(limit) : -fabs(limit);
     127              psTrace("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g",
     128                      nParam, beta[nParam], limit);
     129              return false;
     130          }
     131          return true;
     132      }
     133      case PS_MINIMIZE_PARAM_MIN: {
     134          psAssert(params, "Require parameters to limit parameters");
     135          psAssert(paramsMinUse, "Require parameter limits to limit parameters");
     136          float limit = paramsMinUse[nParam];
     137          if (nParam == PM_PAR_SXY) {
     138              limit *= q2;
     139          }
     140          if (params[nParam] < limit) {
     141              params[nParam] = limit;
     142              psTrace("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g",
     143                      nParam, params[nParam], limit);
     144              return false;
     145          }
     146          return true;
     147      }
     148      case PS_MINIMIZE_PARAM_MAX: {
     149          psAssert(params, "Require parameters to limit parameters");
     150          psAssert(paramsMaxUse, "Require parameter limits to limit parameters");
     151          float limit = paramsMaxUse[nParam];
     152          if (nParam == PM_PAR_SXY) {
     153              limit *= q2;
     154          }
     155          if (params[nParam] > limit) {
     156              params[nParam] = limit;
     157              psTrace("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g",
     158                      nParam, params[nParam], limit);
     159              return false;
     160          }
     161          return true;
     162      }
    184163    default:
    185164        psAbort("invalid choice for limits");
     
    190169
    191170// make an initial guess for parameters
     171// 0.5 PIX: moments and peaks are in pixel coords, thus so are model parameters
    192172bool PM_MODEL_GUESS (pmModel *model, pmSource *source)
    193173{
     
    205185    psEllipseShape shape = psEllipseAxesToShape (axes);
    206186
    207     PAR[PM_PAR_SKY]  = moments->Sky;
     187    PAR[PM_PAR_SKY]  = 0.0;
    208188    PAR[PM_PAR_I0]   = peak->flux;
    209189    PAR[PM_PAR_XPOS] = peak->xf;
     
    257237    psEllipseAxes axes = psEllipseShapeToAxes (shape, 20.0);
    258238    psF64 radius = axes.major * sqrt (2.0 * log(PAR[PM_PAR_I0] / flux));
     239    psAssert (isfinite(radius), "fix this code: radius should not be nan for %f", PAR[PM_PAR_I0]);
     240
    259241    return (radius);
    260242}
     
    367349bool PM_MODEL_FIT_STATUS (pmModel *model)
    368350{
    369     psF32 dP;
    370351    bool  status;
    371352
     
    373354    psF32 *dPAR = model->dparams->data.F32;
    374355
    375     dP = 0;
    376     dP += PS_SQR(dPAR[PM_PAR_SXX] / PAR[PM_PAR_SXX]);
    377     dP += PS_SQR(dPAR[PM_PAR_SYY] / PAR[PM_PAR_SYY]);
    378     dP = sqrt (dP);
    379 
    380356    status = true;
    381     status &= (dP < 0.5);
    382357    status &= (PAR[PM_PAR_I0] > 0);
    383358    status &= ((dPAR[PM_PAR_I0]/PAR[PM_PAR_I0]) < 0.5);
    384359
    385     if (status)
    386         return true;
    387     return false;
     360    return status;
     361}
     362
     363void PM_MODEL_SET_LIMITS(pmModelLimitsType type)
     364{
     365    switch (type) {
     366      case PM_MODEL_LIMITS_NONE:
     367        paramsMinUse = NULL;
     368        paramsMaxUse = NULL;
     369        limitsApply = true;
     370        break;
     371      case PM_MODEL_LIMITS_IGNORE:
     372        paramsMinUse = NULL;
     373        paramsMaxUse = NULL;
     374        limitsApply = false;
     375        break;
     376      case PM_MODEL_LIMITS_LAX:
     377        paramsMinUse = paramsMinLax;
     378        paramsMaxUse = paramsMaxLax;
     379        limitsApply = true;
     380        break;
     381      case PM_MODEL_LIMITS_MODERATE:
     382        paramsMinUse = paramsMinModerate;
     383        paramsMaxUse = paramsMaxModerate;
     384        limitsApply = true;
     385        break;
     386      case PM_MODEL_LIMITS_STRICT:
     387        paramsMinUse = paramsMinStrict;
     388        paramsMaxUse = paramsMaxStrict;
     389        limitsApply = true;
     390        break;
     391      default:
     392        psAbort("Unrecognised model limits type: %x", type);
     393    }
     394    return;
    388395}
    389396
     
    396403# undef PM_MODEL_PARAMS_FROM_PSF
    397404# undef PM_MODEL_FIT_STATUS
     405# undef PM_MODEL_SET_LIMITS
Note: See TracChangeset for help on using the changeset viewer.