Changeset 25738 for trunk/psModules/src/objects/models/pmModel_QGAUSS.c
- Timestamp:
- Oct 1, 2009, 4:03:58 PM (17 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
-
. (modified) (1 prop)
-
psModules/src/objects/models/pmModel_QGAUSS.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk
- Property svn:mergeinfo changed
/branches/pap merged: 25508,25521,25548,25553,25556,25559-25561,25563-25565,25568-25569,25695,25697,25715,25717-25718
- Property svn:mergeinfo changed
-
trunk/psModules/src/objects/models/pmModel_QGAUSS.c
r20001 r25738 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_QGAUSS.h" 30 22 31 # define PM_MODEL_FUNC pmModelFunc_QGAUSS 23 32 # define PM_MODEL_FLUX pmModelFlux_QGAUSS … … 28 37 # define PM_MODEL_PARAMS_FROM_PSF pmModelParamsFromPSF_QGAUSS 29 38 # define PM_MODEL_FIT_STATUS pmModelFitStatus_QGAUSS 39 # define PM_MODEL_SET_LIMITS pmModelSetLimits_QGAUSS 40 41 // Lax parameter limits 42 static float paramsMinLax[] = { -1.0e3, 1.0e-2, -100, -100, 0.5, 0.5, -1.0, 0.1 }; 43 static float paramsMaxLax[] = { 1.0e5, 1.0e8, 1.0e4, 1.0e4, 100, 100, 1.0, 20.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 = paramsMinLax; 51 static float *paramsMaxUse = paramsMaxLax; 52 static float betaUse[] = { 1000, 3e6, 5, 5, 1.0, 1.0, 0.5 }; 53 54 static bool limitsApply = true; // Apply limits? 30 55 31 56 psF32 PM_MODEL_FUNC (psVector *deriv, … … 79 104 # define AR_MAX 20.0 80 105 # define AR_RATIO 0.99 106 81 107 bool PM_MODEL_LIMITS (psMinConstraintMode mode, int nParam, float *params, float *beta) 82 108 { 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"); 85 113 86 114 // we need to calculate the limits for SXY specially 115 float q2 = NAN; 87 116 if (nParam == PM_PAR_SXY) { 88 f 1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]);89 f 2 = 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); 91 120 q1 = (q1 < 0.0) ? 0.0 : q1; 92 121 // if q1 < 0.0, f2 ~ f1, we have a very large axis ratio near 45deg.. Saturate at that 93 122 // angle and let f2,f1 fight it out 94 q2 = 0.5*sqrt(q1);123 q2 = 0.5*sqrtf(q1); 95 124 } 96 125 97 126 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 } 206 171 default: 207 172 psAbort("invalid choice for limits"); … … 464 429 } 465 430 431 432 void 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 466 461 # undef PM_MODEL_FUNC 467 462 # undef PM_MODEL_FLUX … … 472 467 # undef PM_MODEL_PARAMS_FROM_PSF 473 468 # undef PM_MODEL_FIT_STATUS 469 # undef PM_MODEL_SET_LIMITS
Note:
See TracChangeset
for help on using the changeset viewer.
