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