IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Oct 1, 2009, 4:03:58 PM (17 years ago)
Author:
Paul Price
Message:

Merging stack development branch (implement lax and strict PSF model limits) from branches/pap

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/psModules/src/objects/models/pmModel_QGAUSS.c

    r20001 r25738  
    2020   *****************************************************************************/
    2121
     22#include <stdio.h>
     23#include <pslib.h>
     24
     25#include "pmMoments.h"
     26#include "pmPeaks.h"
     27#include "pmSource.h"
     28#include "pmModel.h"
     29#include "pmModel_QGAUSS.h"
     30
    2231# define PM_MODEL_FUNC            pmModelFunc_QGAUSS
    2332# define PM_MODEL_FLUX            pmModelFlux_QGAUSS
     
    2837# define PM_MODEL_PARAMS_FROM_PSF pmModelParamsFromPSF_QGAUSS
    2938# define PM_MODEL_FIT_STATUS      pmModelFitStatus_QGAUSS
     39# define PM_MODEL_SET_LIMITS      pmModelSetLimits_QGAUSS
     40
     41// Lax parameter limits
     42static float paramsMinLax[] = { -1.0e3, 1.0e-2, -100, -100, 0.5, 0.5, -1.0, 0.1 };
     43static float paramsMaxLax[] = { 1.0e5, 1.0e8, 1.0e4, 1.0e4, 100, 100, 1.0, 20.0 };
     44
     45// Strict parameter limits
     46static float *paramsMinStrict = paramsMinLax;
     47static float *paramsMaxStrict = paramsMaxLax;
     48
     49// Parameter limits to use
     50static float *paramsMinUse = paramsMinLax;
     51static float *paramsMaxUse = paramsMaxLax;
     52static float betaUse[] = { 1000, 3e6, 5, 5, 1.0, 1.0, 0.5 };
     53
     54static bool limitsApply = true;         // Apply limits?
    3055
    3156psF32 PM_MODEL_FUNC (psVector *deriv,
     
    79104# define AR_MAX 20.0
    80105# define AR_RATIO 0.99
     106
    81107bool PM_MODEL_LIMITS (psMinConstraintMode mode, int nParam, float *params, float *beta)
    82108{
    83     float beta_lim = 0, params_min = 0, params_max = 0;
    84     float f1 = 0, f2 = 0, q1 = 0, q2 = 0;
     109    if (!limitsApply) {
     110        return true;
     111    }
     112    psAssert(nParam >= 0 && nParam <= PM_PAR_7, "Parameter index is out of bounds");
    85113
    86114    // we need to calculate the limits for SXY specially
     115    float q2 = NAN;
    87116    if (nParam == PM_PAR_SXY) {
    88         f1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]);
    89         f2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]);
    90         q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2);
     117        float f1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]);
     118        float f2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]);
     119        float q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2);
    91120        q1 = (q1 < 0.0) ? 0.0 : q1;
    92121        // if q1 < 0.0, f2 ~ f1, we have a very large axis ratio near 45deg..  Saturate at that
    93122        // angle and let f2,f1 fight it out
    94         q2  = 0.5*sqrt (q1);
     123        q2 = 0.5*sqrtf(q1);
    95124    }
    96125
    97126    switch (mode) {
    98     case PS_MINIMIZE_BETA_LIMIT:
    99         switch (nParam) {
    100         case PM_PAR_SKY:
    101             beta_lim = 1000;
    102             break;
    103         case PM_PAR_I0:
    104             beta_lim = 3e6;
    105             break;
    106         case PM_PAR_XPOS:
    107             beta_lim = 5;
    108             break;
    109         case PM_PAR_YPOS:
    110             beta_lim = 5;
    111             break;
    112         case PM_PAR_SXX:
    113             beta_lim = 1.0;
    114             break;
    115         case PM_PAR_SYY:
    116             beta_lim = 1.0;
    117             break;
    118         case PM_PAR_SXY:
    119             beta_lim =  0.5*q2;
    120             break;
    121         case PM_PAR_7:
    122             beta_lim = 2.0;
    123             break;
    124         default:
    125             psAbort("invalid parameter %d for beta test", nParam);
    126         }
    127         if (fabs(beta[nParam]) > fabs(beta_lim)) {
    128             beta[nParam] = (beta[nParam] > 0) ? fabs(beta_lim) : -fabs(beta_lim);
    129             psTrace ("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g",
    130                      nParam, beta[nParam], beta_lim);
    131             return false;
    132         }
    133         return true;
    134     case PS_MINIMIZE_PARAM_MIN:
    135         switch (nParam) {
    136         case PM_PAR_SKY:
    137             params_min = -1000;
    138             break;
    139         case PM_PAR_I0:
    140             params_min =   0.01;
    141             break;
    142         case PM_PAR_XPOS:
    143             params_min =  -100;
    144             break;
    145         case PM_PAR_YPOS:
    146             params_min =  -100;
    147             break;
    148         case PM_PAR_SXX:
    149             params_min =   0.5;
    150             break;
    151         case PM_PAR_SYY:
    152             params_min =   0.5;
    153             break;
    154         case PM_PAR_SXY:
    155             params_min =  -q2;
    156             break;
    157         case PM_PAR_7:
    158             params_min =   0.1;
    159             break;
    160         default:
    161             psAbort("invalid parameter %d for param min test", nParam);
    162         }
    163         if (params[nParam] < params_min) {
    164             params[nParam] = params_min;
    165             psTrace ("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g",
    166                      nParam, params[nParam], params_min);
    167             return false;
    168         }
    169         return true;
    170     case PS_MINIMIZE_PARAM_MAX:
    171         switch (nParam) {
    172         case PM_PAR_SKY:
    173             params_max =   1e5;
    174             break;
    175         case PM_PAR_I0:
    176             params_max =   1e8;
    177             break;
    178         case PM_PAR_XPOS:
    179             params_max =   1e4;
    180             break;
    181         case PM_PAR_YPOS:
    182             params_max =   1e4;
    183             break;
    184         case PM_PAR_SXX:
    185             params_max =   100;
    186             break;
    187         case PM_PAR_SYY:
    188             params_max =   100;
    189             break;
    190         case PM_PAR_SXY:
    191             params_max =  +q2;
    192             break;
    193         case PM_PAR_7:
    194             params_max =  20.0;
    195             break;
    196         default:
    197             psAbort("invalid parameter %d for param max test", nParam);
    198         }
    199         if (params[nParam] > params_max) {
    200             params[nParam] = params_max;
    201             psTrace ("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g",
    202                      nParam, params[nParam], params_max);
    203             return false;
    204         }
    205         return true;
     127      case PS_MINIMIZE_BETA_LIMIT: {
     128          psAssert(beta, "Require beta to limit beta");
     129          float limit = betaUse[nParam];
     130          if (nParam == PM_PAR_SXY) {
     131              limit *= q2;
     132          }
     133          if (fabs(beta[nParam]) > fabs(limit)) {
     134              beta[nParam] = (beta[nParam] > 0) ? fabs(limit) : -fabs(limit);
     135              psTrace("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g",
     136                      nParam, beta[nParam], limit);
     137              return false;
     138          }
     139          return true;
     140      }
     141      case PS_MINIMIZE_PARAM_MIN: {
     142          psAssert(params, "Require parameters to limit parameters");
     143          psAssert(paramsMinUse, "Require parameter limits to limit parameters");
     144          float limit = paramsMinUse[nParam];
     145          if (nParam == PM_PAR_SXY) {
     146              limit *= q2;
     147          }
     148          if (params[nParam] < limit) {
     149              params[nParam] = limit;
     150              psTrace("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g",
     151                      nParam, params[nParam], limit);
     152              return false;
     153          }
     154          return true;
     155      }
     156      case PS_MINIMIZE_PARAM_MAX: {
     157          psAssert(params, "Require parameters to limit parameters");
     158          psAssert(paramsMaxUse, "Require parameter limits to limit parameters");
     159          float limit = paramsMaxUse[nParam];
     160          if (nParam == PM_PAR_SXY) {
     161              limit *= q2;
     162          }
     163          if (params[nParam] > limit) {
     164              params[nParam] = limit;
     165              psTrace("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g",
     166                      nParam, params[nParam], limit);
     167              return false;
     168          }
     169          return true;
     170      }
    206171    default:
    207172        psAbort("invalid choice for limits");
     
    464429}
    465430
     431
     432void PM_MODEL_SET_LIMITS(pmModelLimitsType type)
     433{
     434    switch (type) {
     435      case PM_MODEL_LIMITS_NONE:
     436        paramsMinUse = NULL;
     437        paramsMaxUse = NULL;
     438        limitsApply = true;
     439        break;
     440      case PM_MODEL_LIMITS_IGNORE:
     441        paramsMinUse = NULL;
     442        paramsMaxUse = NULL;
     443        limitsApply = false;
     444        break;
     445      case PM_MODEL_LIMITS_LAX:
     446        paramsMinUse = paramsMinLax;
     447        paramsMaxUse = paramsMaxLax;
     448        limitsApply = true;
     449        break;
     450      case PM_MODEL_LIMITS_STRICT:
     451        paramsMinUse = paramsMinStrict;
     452        paramsMaxUse = paramsMaxStrict;
     453        limitsApply = true;
     454        break;
     455      default:
     456        psAbort("Unrecognised model limits type: %x", type);
     457    }
     458    return;
     459}
     460
    466461# undef PM_MODEL_FUNC
    467462# undef PM_MODEL_FLUX
     
    472467# undef PM_MODEL_PARAMS_FROM_PSF
    473468# undef PM_MODEL_FIT_STATUS
     469# undef PM_MODEL_SET_LIMITS
Note: See TracChangeset for help on using the changeset viewer.