Changeset 25738 for trunk/psModules/src/objects/models/pmModel_PS1_V1.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_PS1_V1.c (modified) (6 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_PS1_V1.c
r23962 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_PS1_V1.h" 30 22 31 # define PM_MODEL_FUNC pmModelFunc_PS1_V1 23 32 # define PM_MODEL_FLUX pmModelFlux_PS1_V1 … … 28 37 # define PM_MODEL_PARAMS_FROM_PSF pmModelParamsFromPSF_PS1_V1 29 38 # define PM_MODEL_FIT_STATUS pmModelFitStatus_PS1_V1 39 # define PM_MODEL_SET_LIMITS pmModelSetLimits_PS1_V1 30 40 31 41 # define ALPHA 1.666 32 42 # define ALPHA_M 0.666 43 44 // Lax parameter limits 45 static float paramsMinLax[] = { -1.0e3, 1.0e-2, -100, -100, 0.5, 0.5, -1.0, -1.0 }; 46 static float paramsMaxLax[] = { 1.0e5, 1.0e8, 1.0e4, 1.0e4, 100, 100, 1.0, 20.0 }; 47 48 // Strict parameter limits 49 // k = PAR_7 < 0 is very undesirable (big divot in the middle) 50 static float paramsMinStrict[] = { -1.0e3, 1.0e-2, -100, -100, 0.5, 0.5, -1.0, 0.0 }; 51 static float paramsMaxStrict[] = { 1.0e5, 1.0e8, 1.0e4, 1.0e4, 100, 100, 1.0, 20.0 }; 52 53 // Parameter limits to use 54 static float *paramsMinUse = paramsMinLax; 55 static float *paramsMaxUse = paramsMaxLax; 56 static float betaUse[] = { 1000, 3e6, 5, 5, 1.0, 1.0, 0.5, 2.0 }; 57 58 static bool limitsApply = true; // Apply limits? 59 33 60 34 61 psF32 PM_MODEL_FUNC (psVector *deriv, … … 84 111 bool PM_MODEL_LIMITS (psMinConstraintMode mode, int nParam, float *params, float *beta) 85 112 { 86 float beta_lim = 0, params_min = 0, params_max = 0; 87 float f1 = 0, f2 = 0, q1 = 0, q2 = 0; 113 if (!limitsApply) { 114 return true; 115 } 116 psAssert(nParam >= 0 && nParam <= PM_PAR_7, "Parameter index is out of bounds"); 88 117 89 118 // we need to calculate the limits for SXY specially 119 float q2 = NAN; 90 120 if (nParam == PM_PAR_SXY) { 91 f 1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]);92 f 2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]);93 q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2);121 float f1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]); 122 float f2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]); 123 float q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2); 94 124 q1 = (q1 < 0.0) ? 0.0 : q1; 95 125 // if q1 < 0.0, f2 ~ f1, we have a very large axis ratio near 45deg.. Saturate at that 96 126 // angle and let f2,f1 fight it out 97 q2 = 0.5*sqrt(q1);127 q2 = 0.5*sqrtf(q1); 98 128 } 99 129 100 130 switch (mode) { 101 case PS_MINIMIZE_BETA_LIMIT: 102 switch (nParam) { 103 case PM_PAR_SKY: 104 beta_lim = 1000; 105 break; 106 case PM_PAR_I0: 107 beta_lim = 3e6; 108 break; 109 case PM_PAR_XPOS: 110 beta_lim = 5; 111 break; 112 case PM_PAR_YPOS: 113 beta_lim = 5; 114 break; 115 case PM_PAR_SXX: 116 beta_lim = 1.0; 117 break; 118 case PM_PAR_SYY: 119 beta_lim = 1.0; 120 break; 121 case PM_PAR_SXY: 122 beta_lim = 0.5*q2; 123 break; 124 case PM_PAR_7: 125 beta_lim = 2.0; 126 break; 127 default: 128 psAbort("invalid parameter %d for beta test", nParam); 129 } 130 if (fabs(beta[nParam]) > fabs(beta_lim)) { 131 beta[nParam] = (beta[nParam] > 0) ? fabs(beta_lim) : -fabs(beta_lim); 132 psTrace ("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g", 133 nParam, beta[nParam], beta_lim); 134 return false; 135 } 136 return true; 137 case PS_MINIMIZE_PARAM_MIN: 138 switch (nParam) { 139 case PM_PAR_SKY: 140 params_min = -1000; 141 break; 142 case PM_PAR_I0: 143 params_min = 0.01; 144 break; 145 case PM_PAR_XPOS: 146 params_min = -100; 147 break; 148 case PM_PAR_YPOS: 149 params_min = -100; 150 break; 151 case PM_PAR_SXX: 152 params_min = 0.5; 153 break; 154 case PM_PAR_SYY: 155 params_min = 0.5; 156 break; 157 case PM_PAR_SXY: 158 params_min = -q2; 159 break; 160 case PM_PAR_7: 161 params_min = -1.0; 162 break; 163 default: 164 psAbort("invalid parameter %d for param min test", nParam); 165 } 166 if (params[nParam] < params_min) { 167 params[nParam] = params_min; 168 psTrace ("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g", 169 nParam, params[nParam], params_min); 170 return false; 171 } 172 return true; 173 case PS_MINIMIZE_PARAM_MAX: 174 switch (nParam) { 175 case PM_PAR_SKY: 176 params_max = 1e5; 177 break; 178 case PM_PAR_I0: 179 params_max = 1e8; 180 break; 181 case PM_PAR_XPOS: 182 params_max = 1e4; 183 break; 184 case PM_PAR_YPOS: 185 params_max = 1e4; 186 break; 187 case PM_PAR_SXX: 188 params_max = 100; 189 break; 190 case PM_PAR_SYY: 191 params_max = 100; 192 break; 193 case PM_PAR_SXY: 194 params_max = +q2; 195 break; 196 case PM_PAR_7: 197 params_max = 20.0; 198 break; 199 default: 200 psAbort("invalid parameter %d for param max test", nParam); 201 } 202 if (params[nParam] > params_max) { 203 params[nParam] = params_max; 204 psTrace ("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g", 205 nParam, params[nParam], params_max); 206 return false; 207 } 208 return true; 209 default: 131 case PS_MINIMIZE_BETA_LIMIT: { 132 psAssert(beta, "Require beta to limit beta"); 133 float limit = betaUse[nParam]; 134 if (nParam == PM_PAR_SXY) { 135 limit *= q2; 136 } 137 if (fabs(beta[nParam]) > fabs(limit)) { 138 beta[nParam] = (beta[nParam] > 0) ? fabs(limit) : -fabs(limit); 139 psTrace("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g", 140 nParam, beta[nParam], limit); 141 return false; 142 } 143 return true; 144 } 145 case PS_MINIMIZE_PARAM_MIN: { 146 psAssert(params, "Require parameters to limit parameters"); 147 psAssert(paramsMinUse, "Require parameter limits to limit parameters"); 148 float limit = paramsMinUse[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_min; %g v. %g", 155 nParam, params[nParam], limit); 156 return false; 157 } 158 return true; 159 } 160 case PS_MINIMIZE_PARAM_MAX: { 161 psAssert(params, "Require parameters to limit parameters"); 162 psAssert(paramsMaxUse, "Require parameter limits to limit parameters"); 163 float limit = paramsMaxUse[nParam]; 164 if (nParam == PM_PAR_SXY) { 165 limit *= q2; 166 } 167 if (params[nParam] > limit) { 168 params[nParam] = limit; 169 psTrace("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g", 170 nParam, params[nParam], limit); 171 return false; 172 } 173 return true; 174 } 175 default: 210 176 psAbort("invalid choice for limits"); 211 177 } … … 299 265 psF32 *PAR = params->data.F32; 300 266 301 if (flux <= 0) 302 return (1.0); 303 if (PAR[PM_PAR_I0] <= 0) 304 return (1.0); 305 if (flux >= PAR[PM_PAR_I0]) 306 return (1.0); 267 if (flux <= 0) { 268 return 1.0; 269 } 270 if (PAR[PM_PAR_I0] <= 0) { 271 return 1.0; 272 } 273 if (flux >= PAR[PM_PAR_I0]) { 274 return 1.0; 275 } 276 if (PAR[PM_PAR_7] == 0.0) { 277 return powf(PAR[PM_PAR_I0] / flux - 1.0, 1.0 / ALPHA); 278 } 307 279 308 280 shape.sx = PAR[PM_PAR_SXX] / M_SQRT2; … … 468 440 } 469 441 442 443 void PM_MODEL_SET_LIMITS(pmModelLimitsType type) 444 { 445 switch (type) { 446 case PM_MODEL_LIMITS_NONE: 447 paramsMinUse = NULL; 448 paramsMaxUse = NULL; 449 limitsApply = true; 450 break; 451 case PM_MODEL_LIMITS_IGNORE: 452 paramsMinUse = NULL; 453 paramsMaxUse = NULL; 454 limitsApply = false; 455 break; 456 case PM_MODEL_LIMITS_LAX: 457 paramsMinUse = paramsMinLax; 458 paramsMaxUse = paramsMaxLax; 459 limitsApply = true; 460 break; 461 case PM_MODEL_LIMITS_STRICT: 462 paramsMinUse = paramsMinStrict; 463 paramsMaxUse = paramsMaxStrict; 464 limitsApply = true; 465 break; 466 default: 467 psAbort("Unrecognised model limits type: %x", type); 468 } 469 return; 470 } 471 472 470 473 # undef PM_MODEL_FUNC 471 474 # undef PM_MODEL_FLUX … … 476 479 # undef PM_MODEL_PARAMS_FROM_PSF 477 480 # undef PM_MODEL_FIT_STATUS 481 # undef PM_MODEL_SET_LIMITS 478 482 # undef ALPHA 479 483 # undef ALPHA_M
Note:
See TracChangeset
for help on using the changeset viewer.
