- 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_GAUSS.c
r20001 r27840 1 1 /****************************************************************************** 2 2 * this file defines the GAUSS 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 … … 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 // Moderate parameter limits 45 static float *paramsMinModerate = paramsMinLax; 46 static float *paramsMaxModerate = paramsMaxLax; 47 48 // Strict parameter limits 49 static float *paramsMinStrict = paramsMinLax; 50 static float *paramsMaxStrict = paramsMaxLax; 51 52 // Parameter limits to use 53 static float *paramsMinUse = paramsMinLax; 54 static float *paramsMaxUse = paramsMaxLax; 55 static float betaUse[] = { 1000, 3e6, 5, 5, 2.0, 2.0, 0.5 }; 56 57 static bool limitsApply = true; // Apply limits? 29 58 30 59 // the model is a function of the pixel coordinate (pixcoord[0,1] = x,y) 60 // 0.5 PIX: the parameters are defined in terms of pixel coords, so the incoming pixcoords 61 // values need to be pixel coords 31 62 psF32 PM_MODEL_FUNC(psVector *deriv, 32 63 const psVector *params, … … 68 99 bool PM_MODEL_LIMITS (psMinConstraintMode mode, int nParam, float *params, float *beta) 69 100 { 70 float beta_lim = 0, params_min = 0, params_max = 0; 71 float f1 = 0, f2 = 0, q1 = 0, q2 = 0; 101 if (!limitsApply) { 102 return true; 103 } 104 psAssert(nParam >= 0 && nParam <= PM_PAR_7, "Parameter index is out of bounds"); 72 105 73 106 // we need to calculate the limits for SXY specially 107 float q2 = NAN; 74 108 if (nParam == PM_PAR_SXY) { 75 f 1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]);76 f 2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]);77 q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2);78 q1 = PS_MAX (0.0, q1);109 float f1 = 1.0 / PS_SQR(params[PM_PAR_SYY]) + 1.0 / PS_SQR(params[PM_PAR_SXX]); 110 float f2 = 1.0 / PS_SQR(params[PM_PAR_SYY]) - 1.0 / PS_SQR(params[PM_PAR_SXX]); 111 float q1 = PS_SQR(f1)*AR_RATIO - PS_SQR(f2); 112 q1 = (q1 < 0.0) ? 0.0 : q1; 79 113 // if q1 < 0.0, f2 ~ f1, we have a very large axis ratio near 45deg.. Saturate at that 80 114 // angle and let f2,f1 fight it out 81 q2 = 0.5*sqrt(q1);115 q2 = 0.5*sqrtf(q1); 82 116 } 83 117 84 118 switch (mode) { 85 case PS_MINIMIZE_BETA_LIMIT: 86 switch (nParam) { 87 case PM_PAR_SKY: 88 beta_lim = 1000; 89 break; 90 case PM_PAR_I0: 91 beta_lim = 3e6; 92 break; 93 case PM_PAR_XPOS: 94 beta_lim = 5; 95 break; 96 case PM_PAR_YPOS: 97 beta_lim = 5; 98 break; 99 case PM_PAR_SXX: 100 beta_lim = 2.0; 101 break; 102 case PM_PAR_SYY: 103 beta_lim = 2.0; 104 break; 105 case PM_PAR_SXY: 106 beta_lim = 0.5*q2; 107 break; 108 default: 109 psAbort("invalid parameter %d for beta test", nParam); 110 } 111 if (fabs(beta[nParam]) > fabs(beta_lim)) { 112 beta[nParam] = (beta[nParam] > 0) ? fabs(beta_lim) : -fabs(beta_lim); 113 psTrace ("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g", 114 nParam, beta[nParam], beta_lim); 115 return false; 116 } 117 return true; 118 case PS_MINIMIZE_PARAM_MIN: 119 switch (nParam) { 120 case PM_PAR_SKY: 121 params_min = -1000; 122 break; 123 case PM_PAR_I0: 124 params_min = 0.01; 125 break; 126 case PM_PAR_XPOS: 127 params_min = -100; 128 break; 129 case PM_PAR_YPOS: 130 params_min = -100; 131 break; 132 case PM_PAR_SXX: 133 params_min = 0.5; 134 break; 135 case PM_PAR_SYY: 136 params_min = 0.5; 137 break; 138 case PM_PAR_SXY: 139 params_min = -q2; 140 break; 141 default: 142 psAbort("invalid parameter %d for param min test", nParam); 143 } 144 if (params[nParam] < params_min) { 145 params[nParam] = params_min; 146 psTrace ("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g", 147 nParam, params[nParam], params_min); 148 return false; 149 } 150 return true; 151 case PS_MINIMIZE_PARAM_MAX: 152 switch (nParam) { 153 case PM_PAR_SKY: 154 params_max = 1e5; 155 break; 156 case PM_PAR_I0: 157 params_max = 1e8; 158 break; 159 case PM_PAR_XPOS: 160 params_max = 1e4; 161 break; 162 case PM_PAR_YPOS: 163 params_max = 1e4; 164 break; 165 case PM_PAR_SXX: 166 params_max = 100; 167 break; 168 case PM_PAR_SYY: 169 params_max = 100; 170 break; 171 case PM_PAR_SXY: 172 params_max = +q2; 173 break; 174 default: 175 psAbort("invalid parameter %d for param max test", nParam); 176 } 177 if (params[nParam] > params_max) { 178 params[nParam] = params_max; 179 psTrace ("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g", 180 nParam, params[nParam], params_max); 181 return false; 182 } 183 return true; 119 case PS_MINIMIZE_BETA_LIMIT: { 120 psAssert(beta, "Require beta to limit beta"); 121 float limit = betaUse[nParam]; 122 if (nParam == PM_PAR_SXY) { 123 limit *= q2; 124 } 125 if (fabs(beta[nParam]) > fabs(limit)) { 126 beta[nParam] = (beta[nParam] > 0) ? fabs(limit) : -fabs(limit); 127 psTrace("psModules.objects", 5, "|beta[nParam==%d]| > |beta_lim|; %g v. %g", 128 nParam, beta[nParam], limit); 129 return false; 130 } 131 return true; 132 } 133 case PS_MINIMIZE_PARAM_MIN: { 134 psAssert(params, "Require parameters to limit parameters"); 135 psAssert(paramsMinUse, "Require parameter limits to limit parameters"); 136 float limit = paramsMinUse[nParam]; 137 if (nParam == PM_PAR_SXY) { 138 limit *= q2; 139 } 140 if (params[nParam] < limit) { 141 params[nParam] = limit; 142 psTrace("psModules.objects", 5, "params[nParam==%d] < params_min; %g v. %g", 143 nParam, params[nParam], limit); 144 return false; 145 } 146 return true; 147 } 148 case PS_MINIMIZE_PARAM_MAX: { 149 psAssert(params, "Require parameters to limit parameters"); 150 psAssert(paramsMaxUse, "Require parameter limits to limit parameters"); 151 float limit = paramsMaxUse[nParam]; 152 if (nParam == PM_PAR_SXY) { 153 limit *= q2; 154 } 155 if (params[nParam] > limit) { 156 params[nParam] = limit; 157 psTrace("psModules.objects", 5, "params[nParam==%d] > params_max; %g v. %g", 158 nParam, params[nParam], limit); 159 return false; 160 } 161 return true; 162 } 184 163 default: 185 164 psAbort("invalid choice for limits"); … … 190 169 191 170 // make an initial guess for parameters 171 // 0.5 PIX: moments and peaks are in pixel coords, thus so are model parameters 192 172 bool PM_MODEL_GUESS (pmModel *model, pmSource *source) 193 173 { … … 205 185 psEllipseShape shape = psEllipseAxesToShape (axes); 206 186 207 PAR[PM_PAR_SKY] = moments->Sky;187 PAR[PM_PAR_SKY] = 0.0; 208 188 PAR[PM_PAR_I0] = peak->flux; 209 189 PAR[PM_PAR_XPOS] = peak->xf; … … 257 237 psEllipseAxes axes = psEllipseShapeToAxes (shape, 20.0); 258 238 psF64 radius = axes.major * sqrt (2.0 * log(PAR[PM_PAR_I0] / flux)); 239 psAssert (isfinite(radius), "fix this code: radius should not be nan for %f", PAR[PM_PAR_I0]); 240 259 241 return (radius); 260 242 } … … 367 349 bool PM_MODEL_FIT_STATUS (pmModel *model) 368 350 { 369 psF32 dP;370 351 bool status; 371 352 … … 373 354 psF32 *dPAR = model->dparams->data.F32; 374 355 375 dP = 0;376 dP += PS_SQR(dPAR[PM_PAR_SXX] / PAR[PM_PAR_SXX]);377 dP += PS_SQR(dPAR[PM_PAR_SYY] / PAR[PM_PAR_SYY]);378 dP = sqrt (dP);379 380 356 status = true; 381 status &= (dP < 0.5);382 357 status &= (PAR[PM_PAR_I0] > 0); 383 358 status &= ((dPAR[PM_PAR_I0]/PAR[PM_PAR_I0]) < 0.5); 384 359 385 if (status) 386 return true; 387 return false; 360 return status; 361 } 362 363 void PM_MODEL_SET_LIMITS(pmModelLimitsType type) 364 { 365 switch (type) { 366 case PM_MODEL_LIMITS_NONE: 367 paramsMinUse = NULL; 368 paramsMaxUse = NULL; 369 limitsApply = true; 370 break; 371 case PM_MODEL_LIMITS_IGNORE: 372 paramsMinUse = NULL; 373 paramsMaxUse = NULL; 374 limitsApply = false; 375 break; 376 case PM_MODEL_LIMITS_LAX: 377 paramsMinUse = paramsMinLax; 378 paramsMaxUse = paramsMaxLax; 379 limitsApply = true; 380 break; 381 case PM_MODEL_LIMITS_MODERATE: 382 paramsMinUse = paramsMinModerate; 383 paramsMaxUse = paramsMaxModerate; 384 limitsApply = true; 385 break; 386 case PM_MODEL_LIMITS_STRICT: 387 paramsMinUse = paramsMinStrict; 388 paramsMaxUse = paramsMaxStrict; 389 limitsApply = true; 390 break; 391 default: 392 psAbort("Unrecognised model limits type: %x", type); 393 } 394 return; 388 395 } 389 396 … … 396 403 # undef PM_MODEL_PARAMS_FROM_PSF 397 404 # undef PM_MODEL_FIT_STATUS 405 # undef PM_MODEL_SET_LIMITS
Note:
See TracChangeset
for help on using the changeset viewer.
