Changeset 27840 for branches/simtest_nebulous_branches/psModules/src/objects/models/pmModel_SERSIC.c
- Timestamp:
- May 3, 2010, 8:50:52 AM (16 years ago)
- Location:
- branches/simtest_nebulous_branches
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/simtest_nebulous_branches
- Property svn:mergeinfo changed
-
branches/simtest_nebulous_branches/psModules
-
Property svn:mergeinfo
set to (toggle deleted branches)
/trunk/psModules merged eligible /branches/eam_branches/stackphot.20100406/psModules 27623-27653 /branches/pap_delete/psModules 27530-27595
-
Property svn:mergeinfo
set to (toggle deleted branches)
-
branches/simtest_nebulous_branches/psModules/src/objects/models/pmModel_SERSIC.c
r20001 r27840 1 1 /****************************************************************************** 2 2 * this file defines the SERSIC source shape model. Note that these model functions are loaded 3 * by pmModel Group.c using 'include', and thus need no 'include' statements of their own. The3 * by pmModelClass.c using 'include', and thus need no 'include' statements of their own. The 4 4 * models use a psVector to represent the set of parameters, with the sequence used to specify 5 5 * the meaning of the parameter. The meaning of the parameters may thus vary depending on the 6 * specifics of the model. All models which are used a PSF representations share a few6 * specifics of the model. All models which are used as a PSF representations share a few 7 7 * parameters, for which # define names are listed in pmModel.h: 8 8 … … 23 23 *****************************************************************************/ 24 24 25 #include <stdio.h> 26 #include <pslib.h> 27 28 #include "pmMoments.h" 29 #include "pmPeaks.h" 30 #include "pmSource.h" 31 #include "pmModel.h" 32 #include "pmModel_SERSIC.h" 33 25 34 # define PM_MODEL_FUNC pmModelFunc_SERSIC 26 35 # define PM_MODEL_FLUX pmModelFlux_SERSIC … … 31 40 # define PM_MODEL_PARAMS_FROM_PSF pmModelParamsFromPSF_SERSIC 32 41 # define PM_MODEL_FIT_STATUS pmModelFitStatus_SERSIC 42 # define PM_MODEL_SET_LIMITS pmModelSetLimits_SERSIC 43 44 // the model is a function of the pixel coordinate (pixcoord[0,1] = x,y) 45 // 0.5 PIX: the parameters are defined in terms of pixel coords, so the incoming pixcoords 46 // values need to be pixel coords 47 48 // Lax parameter limits 49 static float paramsMinLax[] = { -1.0e3, 1.0e-2, -100, -100, 0.05, 0.05, -1.0, 0.05 }; 50 static float paramsMaxLax[] = { 1.0e5, 1.0e8, 1.0e4, 1.0e4, 100, 100, 1.0, 4.0 }; 51 52 // Moderate parameter limits 53 static float *paramsMinModerate = paramsMinLax; 54 static float *paramsMaxModerate = paramsMaxLax; 55 56 // Strict parameter limits 57 static float *paramsMinStrict = paramsMinLax; 58 static float *paramsMaxStrict = paramsMaxLax; 59 60 // Parameter limits to use 61 static float *paramsMinUse = paramsMinLax; 62 static float *paramsMaxUse = paramsMaxLax; 63 static float betaUse[] = { 1000, 3e6, 5, 5, 1.0, 1.0, 0.5, 2.0 }; 64 65 static bool limitsApply = true; // Apply limits? 33 66 34 67 psF32 PM_MODEL_FUNC (psVector *deriv, … … 91 124 bool PM_MODEL_LIMITS (psMinConstraintMode mode, int nParam, float *params, float *beta) 92 125 { 93 float beta_lim = 0, params_min = 0, params_max = 0; 94 float f1 = 0, f2 = 0, q1 = 0, q2 = 0; 126 if (!limitsApply) { 127 return true; 128 } 129 psAssert(nParam >= 0 && nParam <= PM_PAR_7, "Parameter index is out of bounds"); 95 130 96 131 // we need to calculate the limits for SXY specially 132 float q2 = NAN; 97 133 if (nParam == PM_PAR_SXY) { 98 f 1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]);99 f 2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]);100 q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2);134 float f1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]); 135 float f2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]); 136 float q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2); 101 137 q1 = (q1 < 0.0) ? 0.0 : q1; 102 138 // if q1 < 0.0, f2 ~ f1, we have a very large axis ratio near 45deg.. Saturate at that 103 139 // angle and let f2,f1 fight it out 104 q2 = 0.5*sqrt(q1);140 q2 = 0.5*sqrtf(q1); 105 141 } 106 142 107 143 switch (mode) { 108 case PS_MINIMIZE_BETA_LIMIT: 109 switch (nParam) { 110 case PM_PAR_SKY: 111 beta_lim = 1000; 112 break; 113 case PM_PAR_I0: 114 beta_lim = 3e6; 115 break; 116 case PM_PAR_XPOS: 117 beta_lim = 5; 118 break; 119 case PM_PAR_YPOS: 120 beta_lim = 5; 121 break; 122 case PM_PAR_SXX: 123 beta_lim = 1.0; 124 break; 125 case PM_PAR_SYY: 126 beta_lim = 1.0; 127 break; 128 case PM_PAR_SXY: 129 beta_lim = 0.5*q2; 130 break; 131 case PM_PAR_7: 132 beta_lim = 2.0; 133 break; 134 default: 135 psAbort("invalid parameter %d for beta test", nParam); 136 } 137 if (fabs(beta[nParam]) > fabs(beta_lim)) { 138 beta[nParam] = (beta[nParam] > 0) ? fabs(beta_lim) : -fabs(beta_lim); 139 psTrace ("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g", 140 nParam, beta[nParam], beta_lim); 141 return false; 142 } 143 return true; 144 case PS_MINIMIZE_PARAM_MIN: 145 switch (nParam) { 146 case PM_PAR_SKY: 147 params_min = -1000; 148 break; 149 case PM_PAR_I0: 150 params_min = 0.01; 151 break; 152 case PM_PAR_XPOS: 153 params_min = -100; 154 break; 155 case PM_PAR_YPOS: 156 params_min = -100; 157 break; 158 case PM_PAR_SXX: 159 params_min = 0.05; 160 break; 161 case PM_PAR_SYY: 162 params_min = 0.05; 163 break; 164 case PM_PAR_SXY: 165 params_min = -q2; 166 break; 167 case PM_PAR_7: 168 params_min = 0.05; 169 break; 170 default: 171 psAbort("invalid parameter %d for param min test", nParam); 172 } 173 if (params[nParam] < params_min) { 174 params[nParam] = params_min; 175 psTrace ("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g", 176 nParam, params[nParam], params_min); 177 return false; 178 } 179 return true; 180 case PS_MINIMIZE_PARAM_MAX: 181 switch (nParam) { 182 case PM_PAR_SKY: 183 params_max = 1e5; 184 break; 185 case PM_PAR_I0: 186 params_max = 1e8; 187 break; 188 case PM_PAR_XPOS: 189 params_max = 1e4; 190 break; 191 case PM_PAR_YPOS: 192 params_max = 1e4; 193 break; 194 case PM_PAR_SXX: 195 params_max = 100; 196 break; 197 case PM_PAR_SYY: 198 params_max = 100; 199 break; 200 case PM_PAR_SXY: 201 params_max = +q2; 202 break; 203 case PM_PAR_7: 204 params_max = 4.0; 205 break; 206 default: 207 psAbort("invalid parameter %d for param max test", nParam); 208 } 209 if (params[nParam] > params_max) { 210 params[nParam] = params_max; 211 psTrace ("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g", 212 nParam, params[nParam], params_max); 213 return false; 214 } 215 return true; 216 default: 144 case PS_MINIMIZE_BETA_LIMIT: { 145 psAssert(beta, "Require beta to limit beta"); 146 float limit = betaUse[nParam]; 147 if (nParam == PM_PAR_SXY) { 148 limit *= q2; 149 } 150 if (fabs(beta[nParam]) > fabs(limit)) { 151 beta[nParam] = (beta[nParam] > 0) ? fabs(limit) : -fabs(limit); 152 psTrace("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g", 153 nParam, beta[nParam], limit); 154 return false; 155 } 156 return true; 157 } 158 case PS_MINIMIZE_PARAM_MIN: { 159 psAssert(params, "Require parameters to limit parameters"); 160 psAssert(paramsMinUse, "Require parameter limits to limit parameters"); 161 float limit = paramsMinUse[nParam]; 162 if (nParam == PM_PAR_SXY) { 163 limit *= q2; 164 } 165 if (params[nParam] < limit) { 166 params[nParam] = limit; 167 psTrace("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g", 168 nParam, params[nParam], limit); 169 return false; 170 } 171 return true; 172 } 173 case PS_MINIMIZE_PARAM_MAX: { 174 psAssert(params, "Require parameters to limit parameters"); 175 psAssert(paramsMaxUse, "Require parameter limits to limit parameters"); 176 float limit = paramsMaxUse[nParam]; 177 if (nParam == PM_PAR_SXY) { 178 limit *= q2; 179 } 180 if (params[nParam] > limit) { 181 params[nParam] = limit; 182 psTrace("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g", 183 nParam, params[nParam], limit); 184 return false; 185 } 186 return true; 187 } 188 default: 217 189 psAbort("invalid choice for limits"); 218 190 } … … 221 193 } 222 194 223 224 195 // make an initial guess for parameters 196 // 0.5 PIX: moments and peaks are in pixel coords, thus so are model parameters 225 197 bool PM_MODEL_GUESS (pmModel *model, pmSource *source) 226 198 { … … 247 219 if (!isfinite(shape.sxy)) return false; 248 220 249 // XXX PAR[PM_PAR_SKY] = moments->Sky;250 221 PAR[PM_PAR_SKY] = 0.0; 251 222 PAR[PM_PAR_I0] = peak->flux; … … 321 292 322 293 psF64 z = pow (-log(limit), (1.0 / PAR[PM_PAR_7])); 294 psAssert (isfinite(z), "fix this code: z should not be nan for %f", PAR[PM_PAR_7]); 323 295 324 296 psF64 radius = sigma * sqrt (2.0 * z); 297 psAssert (isfinite(radius), "fix this code: radius should not be nan for %f, %f", PAR[PM_PAR_7], sigma); 325 298 326 299 if (isnan(radius)) … … 429 402 bool PM_MODEL_FIT_STATUS (pmModel *model) 430 403 { 431 432 psF32 dP;433 404 bool status; 434 405 … … 436 407 psF32 *dPAR = model->dparams->data.F32; 437 408 438 dP = 0;439 dP += PS_SQR(dPAR[PM_PAR_SXX] / PAR[PM_PAR_SXX]);440 dP += PS_SQR(dPAR[PM_PAR_SYY] / PAR[PM_PAR_SYY]);441 dP = sqrt (dP);442 443 409 status = true; 444 // status &= (dP < 0.5);445 410 status &= (PAR[PM_PAR_I0] > 0); 446 411 status &= ((dPAR[PM_PAR_I0]/PAR[PM_PAR_I0]) < 0.5); 447 412 448 fprintf (stderr, "SERSIC status pars: dP: %f, I0: %f, S/N: %f\n",449 dP, PAR[PM_PAR_I0], (dPAR[PM_PAR_I0]/PAR[PM_PAR_I0]));450 451 413 return status; 414 } 415 416 417 void PM_MODEL_SET_LIMITS(pmModelLimitsType type) 418 { 419 switch (type) { 420 case PM_MODEL_LIMITS_NONE: 421 paramsMinUse = NULL; 422 paramsMaxUse = NULL; 423 limitsApply = true; 424 break; 425 case PM_MODEL_LIMITS_IGNORE: 426 paramsMinUse = NULL; 427 paramsMaxUse = NULL; 428 limitsApply = false; 429 break; 430 case PM_MODEL_LIMITS_LAX: 431 paramsMinUse = paramsMinLax; 432 paramsMaxUse = paramsMaxLax; 433 limitsApply = true; 434 break; 435 case PM_MODEL_LIMITS_MODERATE: 436 paramsMinUse = paramsMinModerate; 437 paramsMaxUse = paramsMaxModerate; 438 limitsApply = true; 439 break; 440 case PM_MODEL_LIMITS_STRICT: 441 paramsMinUse = paramsMinStrict; 442 paramsMaxUse = paramsMaxStrict; 443 limitsApply = true; 444 break; 445 default: 446 psAbort("Unrecognised model limits type: %x", type); 447 } 448 return; 452 449 } 453 450 … … 460 457 # undef PM_MODEL_PARAMS_FROM_PSF 461 458 # undef PM_MODEL_FIT_STATUS 459 # undef PM_MODEL_SET_LIMITS
Note:
See TracChangeset
for help on using the changeset viewer.
