- 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_GAUSS.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_GAUSS.h" 29 21 30 # define PM_MODEL_FUNC pmModelFunc_GAUSS 22 31 # define PM_MODEL_FLUX pmModelFlux_GAUSS … … 27 36 # define PM_MODEL_PARAMS_FROM_PSF pmModelParamsFromPSF_GAUSS 28 37 # define PM_MODEL_FIT_STATUS pmModelFitStatus_GAUSS 38 # define PM_MODEL_SET_LIMITS pmModelSetLimits_GAUSS 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) … … 70 95 bool PM_MODEL_LIMITS (psMinConstraintMode mode, int nParam, float *params, float *beta) 71 96 { 72 float beta_lim = 0, params_min = 0, params_max = 0; 73 float f1 = 0, f2 = 0, q1 = 0, q2 = 0; 97 if (!limitsApply) { 98 return true; 99 } 100 psAssert(nParam >= 0 && nParam <= PM_PAR_7, "Parameter index is out of bounds"); 74 101 75 102 // we need to calculate the limits for SXY specially 103 float q2 = NAN; 76 104 if (nParam == PM_PAR_SXY) { 77 f 1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]);78 f 2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]);79 q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2);80 q1 = PS_MAX (0.0, q1);105 float f1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]); 106 float f2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]); 107 float q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2); 108 q1 = (q1 < 0.0) ? 0.0 : q1; 81 109 // if q1 < 0.0, f2 ~ f1, we have a very large axis ratio near 45deg.. Saturate at that 82 110 // angle and let f2,f1 fight it out 83 q2 = 0.5*sqrt(q1);111 q2 = 0.5*sqrtf(q1); 84 112 } 85 113 86 114 switch (mode) { 87 case PS_MINIMIZE_BETA_LIMIT: 88 switch (nParam) { 89 case PM_PAR_SKY: 90 beta_lim = 1000; 91 break; 92 case PM_PAR_I0: 93 beta_lim = 3e6; 94 break; 95 case PM_PAR_XPOS: 96 beta_lim = 5; 97 break; 98 case PM_PAR_YPOS: 99 beta_lim = 5; 100 break; 101 case PM_PAR_SXX: 102 beta_lim = 2.0; 103 break; 104 case PM_PAR_SYY: 105 beta_lim = 2.0; 106 break; 107 case PM_PAR_SXY: 108 beta_lim = 0.5*q2; 109 break; 110 default: 111 psAbort("invalid parameter %d for beta test", nParam); 112 } 113 if (fabs(beta[nParam]) > fabs(beta_lim)) { 114 beta[nParam] = (beta[nParam] > 0) ? fabs(beta_lim) : -fabs(beta_lim); 115 psTrace ("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g", 116 nParam, beta[nParam], beta_lim); 117 return false; 118 } 119 return true; 120 case PS_MINIMIZE_PARAM_MIN: 121 switch (nParam) { 122 case PM_PAR_SKY: 123 params_min = -1000; 124 break; 125 case PM_PAR_I0: 126 params_min = 0.01; 127 break; 128 case PM_PAR_XPOS: 129 params_min = -100; 130 break; 131 case PM_PAR_YPOS: 132 params_min = -100; 133 break; 134 case PM_PAR_SXX: 135 params_min = 0.5; 136 break; 137 case PM_PAR_SYY: 138 params_min = 0.5; 139 break; 140 case PM_PAR_SXY: 141 params_min = -q2; 142 break; 143 default: 144 psAbort("invalid parameter %d for param min test", nParam); 145 } 146 if (params[nParam] < params_min) { 147 params[nParam] = params_min; 148 psTrace ("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g", 149 nParam, params[nParam], params_min); 150 return false; 151 } 152 return true; 153 case PS_MINIMIZE_PARAM_MAX: 154 switch (nParam) { 155 case PM_PAR_SKY: 156 params_max = 1e5; 157 break; 158 case PM_PAR_I0: 159 params_max = 1e8; 160 break; 161 case PM_PAR_XPOS: 162 params_max = 1e4; 163 break; 164 case PM_PAR_YPOS: 165 params_max = 1e4; 166 break; 167 case PM_PAR_SXX: 168 params_max = 100; 169 break; 170 case PM_PAR_SYY: 171 params_max = 100; 172 break; 173 case PM_PAR_SXY: 174 params_max = +q2; 175 break; 176 default: 177 psAbort("invalid parameter %d for param max test", nParam); 178 } 179 if (params[nParam] > params_max) { 180 params[nParam] = params_max; 181 psTrace ("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g", 182 nParam, params[nParam], params_max); 183 return false; 184 } 185 return true; 115 case PS_MINIMIZE_BETA_LIMIT: { 116 psAssert(beta, "Require beta to limit beta"); 117 float limit = betaUse[nParam]; 118 if (nParam == PM_PAR_SXY) { 119 limit *= q2; 120 } 121 if (fabs(beta[nParam]) > fabs(limit)) { 122 beta[nParam] = (beta[nParam] > 0) ? fabs(limit) : -fabs(limit); 123 psTrace("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g", 124 nParam, beta[nParam], limit); 125 return false; 126 } 127 return true; 128 } 129 case PS_MINIMIZE_PARAM_MIN: { 130 psAssert(params, "Require parameters to limit parameters"); 131 psAssert(paramsMinUse, "Require parameter limits to limit parameters"); 132 float limit = paramsMinUse[nParam]; 133 if (nParam == PM_PAR_SXY) { 134 limit *= q2; 135 } 136 if (params[nParam] < limit) { 137 params[nParam] = limit; 138 psTrace("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g", 139 nParam, params[nParam], limit); 140 return false; 141 } 142 return true; 143 } 144 case PS_MINIMIZE_PARAM_MAX: { 145 psAssert(params, "Require parameters to limit parameters"); 146 psAssert(paramsMaxUse, "Require parameter limits to limit parameters"); 147 float limit = paramsMaxUse[nParam]; 148 if (nParam == PM_PAR_SXY) { 149 limit *= q2; 150 } 151 if (params[nParam] > limit) { 152 params[nParam] = limit; 153 psTrace("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g", 154 nParam, params[nParam], limit); 155 return false; 156 } 157 return true; 158 } 186 159 default: 187 160 psAbort("invalid choice for limits"); … … 384 357 } 385 358 359 void PM_MODEL_SET_LIMITS(pmModelLimitsType type) 360 { 361 switch (type) { 362 case PM_MODEL_LIMITS_NONE: 363 paramsMinUse = NULL; 364 paramsMaxUse = NULL; 365 limitsApply = true; 366 break; 367 case PM_MODEL_LIMITS_IGNORE: 368 paramsMinUse = NULL; 369 paramsMaxUse = NULL; 370 limitsApply = false; 371 break; 372 case PM_MODEL_LIMITS_LAX: 373 paramsMinUse = paramsMinLax; 374 paramsMaxUse = paramsMaxLax; 375 limitsApply = true; 376 break; 377 case PM_MODEL_LIMITS_STRICT: 378 paramsMinUse = paramsMinStrict; 379 paramsMaxUse = paramsMaxStrict; 380 limitsApply = true; 381 break; 382 default: 383 psAbort("Unrecognised model limits type: %x", type); 384 } 385 return; 386 } 387 386 388 # undef PM_MODEL_FUNC 387 389 # undef PM_MODEL_FLUX … … 392 394 # undef PM_MODEL_PARAMS_FROM_PSF 393 395 # undef PM_MODEL_FIT_STATUS 396 # undef PM_MODEL_SET_LIMITS
Note:
See TracChangeset
for help on using the changeset viewer.
