- Timestamp:
- Oct 2, 2009, 12:11:34 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/20090715/psModules/src/objects/models/pmModel_PGAUSS.c
r25683 r25745 19 19 *****************************************************************************/ 20 20 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_PGAUSS.h" 29 21 30 # define PM_MODEL_FUNC pmModelFunc_PGAUSS 22 31 # define PM_MODEL_FLUX pmModelFlux_PGAUSS … … 27 36 # define PM_MODEL_PARAMS_FROM_PSF pmModelParamsFromPSF_PGAUSS 28 37 # define PM_MODEL_FIT_STATUS pmModelFitStatus_PGAUSS 38 # define PM_MODEL_SET_LIMITS pmModelSetLimits_PGAUSS 39 40 // Lax parameter limits 41 static float paramsMinLax[] = { -1.0e3, 1.0e-2, -100, -100, 0.5, 0.5, -1.0 }; 42 static float paramsMaxLax[] = { 1.0e5, 1.0e8, 1.0e4, 1.0e4, 100, 100, 1.0 }; 43 44 // Strict parameter limits 45 static float *paramsMinStrict = paramsMinLax; 46 static float *paramsMaxStrict = paramsMaxLax; 47 48 // Parameter limits to use 49 static float *paramsMinUse = paramsMinLax; 50 static float *paramsMaxUse = paramsMaxLax; 51 static float betaUse[] = { 1000, 3e6, 5, 5, 2.0, 2.0, 0.5 }; 52 53 static bool limitsApply = true; // Apply limits? 29 54 30 55 // the model is a function of the pixel coordinate (pixcoord[0,1] = x,y) … … 71 96 bool PM_MODEL_LIMITS (psMinConstraintMode mode, int nParam, float *params, float *beta) 72 97 { 73 float beta_lim = 0, params_min = 0, params_max = 0; 74 float f1 = 0, f2 = 0, q1 = 0, q2 = 0; 98 if (!limitsApply) { 99 return true; 100 } 101 psAssert(nParam >= 0 && nParam <= PM_PAR_7, "Parameter index is out of bounds"); 75 102 76 103 // we need to calculate the limits for SXY specially 104 float q2 = NAN; 77 105 if (nParam == PM_PAR_SXY) { 78 f 1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]);79 f 2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]);80 q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2);81 q1 = PS_MAX (0.0, q1);106 float f1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]); 107 float f2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]); 108 float q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2); 109 q1 = (q1 < 0.0) ? 0.0 : q1; 82 110 // if q1 < 0.0, f2 ~ f1, we have a very large axis ratio near 45deg.. Saturate at that 83 111 // angle and let f2,f1 fight it out 84 q2 = 0.5*sqrt(q1);112 q2 = 0.5*sqrtf(q1); 85 113 } 86 114 87 115 switch (mode) { 88 case PS_MINIMIZE_BETA_LIMIT: 89 switch (nParam) { 90 case PM_PAR_SKY: 91 beta_lim = 1000; 92 break; 93 case PM_PAR_I0: 94 beta_lim = 3e6; 95 break; 96 case PM_PAR_XPOS: 97 beta_lim = 5; 98 break; 99 case PM_PAR_YPOS: 100 beta_lim = 5; 101 break; 102 case PM_PAR_SXX: 103 beta_lim = 2.0; 104 break; 105 case PM_PAR_SYY: 106 beta_lim = 2.0; 107 break; 108 case PM_PAR_SXY: 109 beta_lim = 0.5*q2; 110 break; 111 default: 112 psAbort("invalid parameter %d for beta test", nParam); 113 } 114 if (fabs(beta[nParam]) > fabs(beta_lim)) { 115 beta[nParam] = (beta[nParam] > 0) ? fabs(beta_lim) : -fabs(beta_lim); 116 psTrace ("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g", 117 nParam, beta[nParam], beta_lim); 118 return false; 119 } 120 return true; 121 case PS_MINIMIZE_PARAM_MIN: 122 switch (nParam) { 123 case PM_PAR_SKY: 124 params_min = -1000; 125 break; 126 case PM_PAR_I0: 127 params_min = 0.01; 128 break; 129 case PM_PAR_XPOS: 130 params_min = -100; 131 break; 132 case PM_PAR_YPOS: 133 params_min = -100; 134 break; 135 case PM_PAR_SXX: 136 params_min = 0.5; 137 break; 138 case PM_PAR_SYY: 139 params_min = 0.5; 140 break; 141 case PM_PAR_SXY: 142 params_min = -q2; 143 break; 144 default: 145 psAbort("invalid parameter %d for param min test", nParam); 146 } 147 if (params[nParam] < params_min) { 148 params[nParam] = params_min; 149 psTrace ("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g", 150 nParam, params[nParam], params_min); 151 return false; 152 } 153 return true; 154 case PS_MINIMIZE_PARAM_MAX: 155 switch (nParam) { 156 case PM_PAR_SKY: 157 params_max = 1e5; 158 break; 159 case PM_PAR_I0: 160 params_max = 1e8; 161 break; 162 case PM_PAR_XPOS: 163 params_max = 1e4; 164 break; 165 case PM_PAR_YPOS: 166 params_max = 1e4; 167 break; 168 case PM_PAR_SXX: 169 params_max = 100; 170 break; 171 case PM_PAR_SYY: 172 params_max = 100; 173 break; 174 case PM_PAR_SXY: 175 params_max = +q2; 176 break; 177 default: 178 psAbort("invalid parameter %d for param max test", nParam); 179 } 180 if (params[nParam] > params_max) { 181 params[nParam] = params_max; 182 psTrace ("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g", 183 nParam, params[nParam], params_max); 184 return false; 185 } 186 return true; 187 default: 116 case PS_MINIMIZE_BETA_LIMIT: { 117 psAssert(beta, "Require beta to limit beta"); 118 float limit = betaUse[nParam]; 119 if (nParam == PM_PAR_SXY) { 120 limit *= q2; 121 } 122 if (fabs(beta[nParam]) > fabs(limit)) { 123 beta[nParam] = (beta[nParam] > 0) ? fabs(limit) : -fabs(limit); 124 psTrace("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g", 125 nParam, beta[nParam], limit); 126 return false; 127 } 128 return true; 129 } 130 case PS_MINIMIZE_PARAM_MIN: { 131 psAssert(params, "Require parameters to limit parameters"); 132 psAssert(paramsMinUse, "Require parameter limits to limit parameters"); 133 float limit = paramsMinUse[nParam]; 134 if (nParam == PM_PAR_SXY) { 135 limit *= q2; 136 } 137 if (params[nParam] < limit) { 138 params[nParam] = limit; 139 psTrace("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g", 140 nParam, params[nParam], limit); 141 return false; 142 } 143 return true; 144 } 145 case PS_MINIMIZE_PARAM_MAX: { 146 psAssert(params, "Require parameters to limit parameters"); 147 psAssert(paramsMaxUse, "Require parameter limits to limit parameters"); 148 float limit = paramsMaxUse[nParam]; 149 if (nParam == PM_PAR_SXY) { 150 limit *= q2; 151 } 152 if (params[nParam] > limit) { 153 params[nParam] = limit; 154 psTrace("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g", 155 nParam, params[nParam], limit); 156 return false; 157 } 158 return true; 159 } 160 default: 188 161 psAbort("invalid choice for limits"); 189 162 } … … 191 164 return false; 192 165 } 166 193 167 194 168 // make an initial guess for parameters … … 432 406 } 433 407 408 409 void PM_MODEL_SET_LIMITS(pmModelLimitsType type) 410 { 411 switch (type) { 412 case PM_MODEL_LIMITS_NONE: 413 paramsMinUse = NULL; 414 paramsMaxUse = NULL; 415 limitsApply = true; 416 break; 417 case PM_MODEL_LIMITS_IGNORE: 418 paramsMinUse = NULL; 419 paramsMaxUse = NULL; 420 limitsApply = false; 421 break; 422 case PM_MODEL_LIMITS_LAX: 423 paramsMinUse = paramsMinLax; 424 paramsMaxUse = paramsMaxLax; 425 limitsApply = true; 426 break; 427 case PM_MODEL_LIMITS_STRICT: 428 paramsMinUse = paramsMinStrict; 429 paramsMaxUse = paramsMaxStrict; 430 limitsApply = true; 431 break; 432 default: 433 psAbort("Unrecognised model limits type: %x", type); 434 } 435 return; 436 } 437 434 438 # undef PM_MODEL_FUNC 435 439 # undef PM_MODEL_FLUX … … 440 444 # undef PM_MODEL_PARAMS_FROM_PSF 441 445 # undef PM_MODEL_FIT_STATUS 446 # undef PM_MODEL_SET_LIMITS
Note:
See TracChangeset
for help on using the changeset viewer.
