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

    r20001 r27840  
    11/******************************************************************************
    22 * this file defines the SERSIC 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
     
    2323   *****************************************************************************/
    2424
     25#include <stdio.h>
     26#include <pslib.h>
     27
     28#include "pmMoments.h"
     29#include "pmPeaks.h"
     30#include "pmSource.h"
     31#include "pmModel.h"
     32#include "pmModel_SERSIC.h"
     33
    2534# define PM_MODEL_FUNC            pmModelFunc_SERSIC
    2635# define PM_MODEL_FLUX            pmModelFlux_SERSIC
     
    3140# define PM_MODEL_PARAMS_FROM_PSF pmModelParamsFromPSF_SERSIC
    3241# define PM_MODEL_FIT_STATUS      pmModelFitStatus_SERSIC
     42# define PM_MODEL_SET_LIMITS      pmModelSetLimits_SERSIC
     43
     44// the model is a function of the pixel coordinate (pixcoord[0,1] = x,y)
     45// 0.5 PIX: the parameters are defined in terms of pixel coords, so the incoming pixcoords
     46// values need to be pixel coords
     47
     48// Lax parameter limits
     49static float paramsMinLax[] = { -1.0e3, 1.0e-2, -100, -100, 0.05, 0.05, -1.0, 0.05 };
     50static float paramsMaxLax[] = { 1.0e5, 1.0e8, 1.0e4, 1.0e4, 100, 100, 1.0, 4.0 };
     51
     52// Moderate parameter limits
     53static float *paramsMinModerate = paramsMinLax;
     54static float *paramsMaxModerate = paramsMaxLax;
     55
     56// Strict parameter limits
     57static float *paramsMinStrict = paramsMinLax;
     58static float *paramsMaxStrict = paramsMaxLax;
     59
     60// Parameter limits to use
     61static float *paramsMinUse = paramsMinLax;
     62static float *paramsMaxUse = paramsMaxLax;
     63static float betaUse[] = { 1000, 3e6, 5, 5, 1.0, 1.0, 0.5, 2.0 };
     64
     65static bool limitsApply = true;         // Apply limits?
    3366
    3467psF32 PM_MODEL_FUNC (psVector *deriv,
     
    91124bool PM_MODEL_LIMITS (psMinConstraintMode mode, int nParam, float *params, float *beta)
    92125{
    93     float beta_lim = 0, params_min = 0, params_max = 0;
    94     float f1 = 0, f2 = 0, q1 = 0, q2 = 0;
     126    if (!limitsApply) {
     127        return true;
     128    }
     129    psAssert(nParam >= 0 && nParam <= PM_PAR_7, "Parameter index is out of bounds");
    95130
    96131    // we need to calculate the limits for SXY specially
     132    float q2 = NAN;
    97133    if (nParam == PM_PAR_SXY) {
    98         f1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]);
    99         f2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]);
    100         q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2);
     134        float f1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]);
     135        float f2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]);
     136        float q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2);
    101137        q1 = (q1 < 0.0) ? 0.0 : q1;
    102138        // if q1 < 0.0, f2 ~ f1, we have a very large axis ratio near 45deg..  Saturate at that
    103139        // angle and let f2,f1 fight it out
    104         q2  = 0.5*sqrt (q1);
     140        q2 = 0.5*sqrtf(q1);
    105141    }
    106142
    107143    switch (mode) {
    108     case PS_MINIMIZE_BETA_LIMIT:
    109         switch (nParam) {
    110         case PM_PAR_SKY:
    111             beta_lim = 1000;
    112             break;
    113         case PM_PAR_I0:
    114             beta_lim = 3e6;
    115             break;
    116         case PM_PAR_XPOS:
    117             beta_lim = 5;
    118             break;
    119         case PM_PAR_YPOS:
    120             beta_lim = 5;
    121             break;
    122         case PM_PAR_SXX:
    123             beta_lim = 1.0;
    124             break;
    125         case PM_PAR_SYY:
    126             beta_lim = 1.0;
    127             break;
    128         case PM_PAR_SXY:
    129             beta_lim =  0.5*q2;
    130             break;
    131         case PM_PAR_7:
    132             beta_lim = 2.0;
    133             break;
    134         default:
    135             psAbort("invalid parameter %d for beta test", nParam);
    136         }
    137         if (fabs(beta[nParam]) > fabs(beta_lim)) {
    138             beta[nParam] = (beta[nParam] > 0) ? fabs(beta_lim) : -fabs(beta_lim);
    139             psTrace ("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g",
    140                      nParam, beta[nParam], beta_lim);
    141             return false;
    142         }
    143         return true;
    144     case PS_MINIMIZE_PARAM_MIN:
    145         switch (nParam) {
    146         case PM_PAR_SKY:
    147             params_min = -1000;
    148             break;
    149         case PM_PAR_I0:
    150             params_min =     0.01;
    151             break;
    152         case PM_PAR_XPOS:
    153             params_min =  -100;
    154             break;
    155         case PM_PAR_YPOS:
    156             params_min =  -100;
    157             break;
    158         case PM_PAR_SXX:
    159             params_min =   0.05;
    160             break;
    161         case PM_PAR_SYY:
    162             params_min =   0.05;
    163             break;
    164         case PM_PAR_SXY:
    165             params_min =  -q2;
    166             break;
    167         case PM_PAR_7:
    168             params_min =   0.05;
    169             break;
    170         default:
    171             psAbort("invalid parameter %d for param min test", nParam);
    172         }
    173         if (params[nParam] < params_min) {
    174             params[nParam] = params_min;
    175             psTrace ("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g",
    176                      nParam, params[nParam], params_min);
    177             return false;
    178         }
    179         return true;
    180     case PS_MINIMIZE_PARAM_MAX:
    181         switch (nParam) {
    182         case PM_PAR_SKY:
    183             params_max =   1e5;
    184             break;
    185         case PM_PAR_I0:
    186             params_max =   1e8;
    187             break;
    188         case PM_PAR_XPOS:
    189             params_max =   1e4;
    190             break;
    191         case PM_PAR_YPOS:
    192             params_max =   1e4;
    193             break;
    194         case PM_PAR_SXX:
    195             params_max =   100;
    196             break;
    197         case PM_PAR_SYY:
    198             params_max =   100;
    199             break;
    200         case PM_PAR_SXY:
    201             params_max =  +q2;
    202             break;
    203         case PM_PAR_7:
    204             params_max =   4.0;
    205             break;
    206         default:
    207             psAbort("invalid parameter %d for param max test", nParam);
    208         }
    209         if (params[nParam] > params_max) {
    210             params[nParam] = params_max;
    211             psTrace ("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g",
    212                      nParam, params[nParam], params_max);
    213             return false;
    214         }
    215         return true;
    216     default:
     144      case PS_MINIMIZE_BETA_LIMIT: {
     145          psAssert(beta, "Require beta to limit beta");
     146          float limit = betaUse[nParam];
     147          if (nParam == PM_PAR_SXY) {
     148              limit *= q2;
     149          }
     150          if (fabs(beta[nParam]) > fabs(limit)) {
     151              beta[nParam] = (beta[nParam] > 0) ? fabs(limit) : -fabs(limit);
     152              psTrace("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g",
     153                      nParam, beta[nParam], limit);
     154              return false;
     155          }
     156          return true;
     157      }
     158      case PS_MINIMIZE_PARAM_MIN: {
     159          psAssert(params, "Require parameters to limit parameters");
     160          psAssert(paramsMinUse, "Require parameter limits to limit parameters");
     161          float limit = paramsMinUse[nParam];
     162          if (nParam == PM_PAR_SXY) {
     163              limit *= q2;
     164          }
     165          if (params[nParam] < limit) {
     166              params[nParam] = limit;
     167              psTrace("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g",
     168                      nParam, params[nParam], limit);
     169              return false;
     170          }
     171          return true;
     172      }
     173      case PS_MINIMIZE_PARAM_MAX: {
     174          psAssert(params, "Require parameters to limit parameters");
     175          psAssert(paramsMaxUse, "Require parameter limits to limit parameters");
     176          float limit = paramsMaxUse[nParam];
     177          if (nParam == PM_PAR_SXY) {
     178              limit *= q2;
     179          }
     180          if (params[nParam] > limit) {
     181              params[nParam] = limit;
     182              psTrace("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g",
     183                      nParam, params[nParam], limit);
     184              return false;
     185          }
     186          return true;
     187      }
     188      default:
    217189        psAbort("invalid choice for limits");
    218190    }
     
    221193}
    222194
    223 
    224195// make an initial guess for parameters
     196// 0.5 PIX: moments and peaks are in pixel coords, thus so are model parameters
    225197bool PM_MODEL_GUESS (pmModel *model, pmSource *source)
    226198{
     
    247219    if (!isfinite(shape.sxy)) return false;
    248220
    249     // XXX PAR[PM_PAR_SKY]  = moments->Sky;
    250221    PAR[PM_PAR_SKY]  = 0.0;
    251222    PAR[PM_PAR_I0]   = peak->flux;
     
    321292
    322293    psF64 z = pow (-log(limit), (1.0 / PAR[PM_PAR_7]));
     294    psAssert (isfinite(z), "fix this code: z should not be nan for %f", PAR[PM_PAR_7]);
    323295
    324296    psF64 radius = sigma * sqrt (2.0 * z);
     297    psAssert (isfinite(radius), "fix this code: radius should not be nan for %f, %f", PAR[PM_PAR_7], sigma);
    325298
    326299    if (isnan(radius))
     
    429402bool PM_MODEL_FIT_STATUS (pmModel *model)
    430403{
    431 
    432     psF32 dP;
    433404    bool  status;
    434405
     
    436407    psF32 *dPAR = model->dparams->data.F32;
    437408
    438     dP = 0;
    439     dP += PS_SQR(dPAR[PM_PAR_SXX] / PAR[PM_PAR_SXX]);
    440     dP += PS_SQR(dPAR[PM_PAR_SYY] / PAR[PM_PAR_SYY]);
    441     dP = sqrt (dP);
    442 
    443409    status = true;
    444 //    status &= (dP < 0.5);
    445410    status &= (PAR[PM_PAR_I0] > 0);
    446411    status &= ((dPAR[PM_PAR_I0]/PAR[PM_PAR_I0]) < 0.5);
    447412
    448     fprintf (stderr, "SERSIC status pars: dP: %f, I0: %f, S/N: %f\n",
    449              dP, PAR[PM_PAR_I0], (dPAR[PM_PAR_I0]/PAR[PM_PAR_I0]));
    450 
    451413    return status;
     414}
     415
     416
     417void PM_MODEL_SET_LIMITS(pmModelLimitsType type)
     418{
     419    switch (type) {
     420      case PM_MODEL_LIMITS_NONE:
     421        paramsMinUse = NULL;
     422        paramsMaxUse = NULL;
     423        limitsApply = true;
     424        break;
     425      case PM_MODEL_LIMITS_IGNORE:
     426        paramsMinUse = NULL;
     427        paramsMaxUse = NULL;
     428        limitsApply = false;
     429        break;
     430      case PM_MODEL_LIMITS_LAX:
     431        paramsMinUse = paramsMinLax;
     432        paramsMaxUse = paramsMaxLax;
     433        limitsApply = true;
     434        break;
     435      case PM_MODEL_LIMITS_MODERATE:
     436        paramsMinUse = paramsMinModerate;
     437        paramsMaxUse = paramsMaxModerate;
     438        limitsApply = true;
     439        break;
     440      case PM_MODEL_LIMITS_STRICT:
     441        paramsMinUse = paramsMinStrict;
     442        paramsMaxUse = paramsMaxStrict;
     443        limitsApply = true;
     444        break;
     445      default:
     446        psAbort("Unrecognised model limits type: %x", type);
     447    }
     448    return;
    452449}
    453450
     
    460457# undef PM_MODEL_PARAMS_FROM_PSF
    461458# undef PM_MODEL_FIT_STATUS
     459# undef PM_MODEL_SET_LIMITS
Note: See TracChangeset for help on using the changeset viewer.