Changeset 15843 for trunk/psphot/src/models/pmModel_TEST1.c
- Timestamp:
- Dec 14, 2007, 3:24:38 PM (19 years ago)
- File:
-
- 1 edited
-
trunk/psphot/src/models/pmModel_TEST1.c (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psphot/src/models/pmModel_TEST1.c
r15000 r15843 16 16 *****************************************************************************/ 17 17 18 # define PM_MODEL_FUNC pmModelFunc_TEST119 # define PM_MODEL_FLUX pmModelFlux_TEST120 # define PM_MODEL_GUESS pmModelGuess_TEST121 # define PM_MODEL_LIMITS pmModelLimits_TEST122 # define PM_MODEL_RADIUS pmModelRadius_TEST123 # define PM_MODEL_FROM_PSF pmModelFromPSF_TEST118 # define PM_MODEL_FUNC pmModelFunc_TEST1 19 # define PM_MODEL_FLUX pmModelFlux_TEST1 20 # define PM_MODEL_GUESS pmModelGuess_TEST1 21 # define PM_MODEL_LIMITS pmModelLimits_TEST1 22 # define PM_MODEL_RADIUS pmModelRadius_TEST1 23 # define PM_MODEL_FROM_PSF pmModelFromPSF_TEST1 24 24 # define PM_MODEL_PARAMS_FROM_PSF pmModelParamsFromPSF_TEST1 25 25 # define PM_MODEL_FIT_STATUS pmModelFitStatus_TEST1 … … 27 27 // the model is a function of the pixel coordinate (pixcoord[0,1] = x,y) 28 28 psF32 PM_MODEL_FUNC(psVector *deriv, 29 const psVector *params,30 const psVector *pixcoord)29 const psVector *params, 30 const psVector *pixcoord) 31 31 { 32 32 psF32 *PAR = params->data.F32; … … 57 57 58 58 // define the parameter limits 59 bool PM_MODEL_LIMITS (psMinConstraintMode mode, int nParam, float *params, float *beta) 59 bool PM_MODEL_LIMITS (psMinConstraintMode mode, int nParam, float *params, float *beta) 60 60 { 61 61 float beta_lim = 0; … … 65 65 switch (mode) { 66 66 case PS_MINIMIZE_BETA_LIMIT: 67 switch (nParam) {68 case PM_PAR_SKY: beta_lim = 1000; break;69 case PM_PAR_I0: beta_lim = 3e6; break;70 case PM_PAR_XPOS: beta_lim = 5; break;71 case PM_PAR_YPOS: beta_lim = 5; break;72 case PM_PAR_SXX: beta_lim = 0.5; break;73 case PM_PAR_SYY: beta_lim = 0.5; break;74 case PM_PAR_SXY: beta_lim = 0.5; break;75 default:76 psAbort("invalid parameter %d for beta test", nParam);77 }78 if (fabs(beta[nParam]) > fabs(beta_lim)) {79 beta[nParam] = (beta[nParam] > 0) ? fabs(beta_lim) : -fabs(beta_lim);80 return false;81 }82 return true;67 switch (nParam) { 68 case PM_PAR_SKY: beta_lim = 1000; break; 69 case PM_PAR_I0: beta_lim = 3e6; break; 70 case PM_PAR_XPOS: beta_lim = 5; break; 71 case PM_PAR_YPOS: beta_lim = 5; break; 72 case PM_PAR_SXX: beta_lim = 0.5; break; 73 case PM_PAR_SYY: beta_lim = 0.5; break; 74 case PM_PAR_SXY: beta_lim = 0.5; break; 75 default: 76 psAbort("invalid parameter %d for beta test", nParam); 77 } 78 if (fabs(beta[nParam]) > fabs(beta_lim)) { 79 beta[nParam] = (beta[nParam] > 0) ? fabs(beta_lim) : -fabs(beta_lim); 80 return false; 81 } 82 return true; 83 83 case PS_MINIMIZE_PARAM_MIN: 84 switch (nParam) {85 case PM_PAR_SKY: params_min = -1000; break;86 case PM_PAR_I0: params_min = 0; break;87 case PM_PAR_XPOS: params_min = -100; break;88 case PM_PAR_YPOS: params_min = -100; break;89 case PM_PAR_SXX: params_min = 0.5; break;90 case PM_PAR_SYY: params_min = 0.5; break;91 case PM_PAR_SXY: params_min = -5.0; break;92 default:93 psAbort("invalid parameter %d for param min test", nParam);94 }95 if (params[nParam] < params_min) {96 params[nParam] = params_min;97 return false;98 }99 return true;84 switch (nParam) { 85 case PM_PAR_SKY: params_min = -1000; break; 86 case PM_PAR_I0: params_min = 0; break; 87 case PM_PAR_XPOS: params_min = -100; break; 88 case PM_PAR_YPOS: params_min = -100; break; 89 case PM_PAR_SXX: params_min = 0.5; break; 90 case PM_PAR_SYY: params_min = 0.5; break; 91 case PM_PAR_SXY: params_min = -5.0; break; 92 default: 93 psAbort("invalid parameter %d for param min test", nParam); 94 } 95 if (params[nParam] < params_min) { 96 params[nParam] = params_min; 97 return false; 98 } 99 return true; 100 100 case PS_MINIMIZE_PARAM_MAX: 101 switch (nParam) {102 case PM_PAR_SKY: params_max = 1e5; break;103 case PM_PAR_I0: params_max = 1e8; break;104 case PM_PAR_XPOS: params_max = 1e4; break;105 case PM_PAR_YPOS: params_max = 1e4; break;106 case PM_PAR_SXX: params_max = 100; break;107 case PM_PAR_SYY: params_max = 100; break;108 case PM_PAR_SXY: params_max = +5.0; break;109 default:110 psAbort("invalid parameter %d for param max test", nParam);111 }112 if (params[nParam] > params_max) {113 params[nParam] = params_max;114 return false;115 }116 return true;101 switch (nParam) { 102 case PM_PAR_SKY: params_max = 1e5; break; 103 case PM_PAR_I0: params_max = 1e8; break; 104 case PM_PAR_XPOS: params_max = 1e4; break; 105 case PM_PAR_YPOS: params_max = 1e4; break; 106 case PM_PAR_SXX: params_max = 100; break; 107 case PM_PAR_SYY: params_max = 100; break; 108 case PM_PAR_SXY: params_max = +5.0; break; 109 default: 110 psAbort("invalid parameter %d for param max test", nParam); 111 } 112 if (params[nParam] > params_max) { 113 params[nParam] = params_max; 114 return false; 115 } 116 return true; 117 117 default: 118 psAbort("invalid choice for limits");118 psAbort("invalid choice for limits"); 119 119 } 120 120 psAbort("should not reach here"); … … 204 204 } 205 205 206 bool PM_MODEL_FROM_PSF (pmModel *modelPSF, pmModel *modelFLT, pmPSF *psf)206 bool PM_MODEL_FROM_PSF (pmModel *modelPSF, pmModel *modelFLT, const pmPSF *psf) 207 207 { 208 208 psF32 *out = modelPSF->params->data.F32; … … 214 214 215 215 for (int i = 0; i < psf->params->n; i++) { 216 if (psf->params->data[i] == NULL) {217 out[i] = in[i];218 } else { 219 pmTrend2D *trend = psf->params->data[i];220 out[i] = pmTrend2DEval(trend, in[PM_PAR_XPOS], in[PM_PAR_YPOS]);221 }216 if (psf->params->data[i] == NULL) { 217 out[i] = in[i]; 218 } else { 219 pmTrend2D *trend = psf->params->data[i]; 220 out[i] = pmTrend2DEval(trend, in[PM_PAR_XPOS], in[PM_PAR_YPOS]); 221 } 222 222 } 223 223 … … 230 230 // construct the PSF model from the FLT model and the psf 231 231 // XXX is this sufficiently general do be a global function, not a pmModelClass function? 232 bool PM_MODEL_PARAMS_FROM_PSF (pmModel *model, pmPSF *psf, float Xo, float Yo, float Io)232 bool PM_MODEL_PARAMS_FROM_PSF (pmModel *model, const pmPSF *psf, float Xo, float Yo, float Io) 233 233 { 234 234 psF32 *PAR = model->params->data.F32; … … 242 242 PAR[PM_PAR_XPOS] = Xo; 243 243 PAR[PM_PAR_YPOS] = Yo; 244 244 245 245 // supply the model-fitted parameters, or copy from the input 246 246 for (int i = 0; i < psf->params->n; i++) { 247 if (i == PM_PAR_SKY) continue;248 pmTrend2D *trend = psf->params->data[i];249 PAR[i] = pmTrend2DEval(trend, Xo, Yo);247 if (i == PM_PAR_SKY) continue; 248 pmTrend2D *trend = psf->params->data[i]; 249 PAR[i] = pmTrend2DEval(trend, Xo, Yo); 250 250 } 251 251 … … 254 254 // XXX user-defined value for limit? 255 255 if (!pmPSF_FitToModel (PAR, 0.1)) { 256 psError(PM_ERR_PSF, false, "Failed to fit object at (r,c) = (%.1f,%.1f)", Xo, Yo);257 return false;256 psError(PM_ERR_PSF, false, "Failed to fit object at (r,c) = (%.1f,%.1f)", Xo, Yo); 257 return false; 258 258 } 259 259 … … 265 265 continue; 266 266 267 bool status = true;267 bool status = true; 268 268 status &= PM_MODEL_LIMITS (PS_MINIMIZE_PARAM_MIN, i, PAR, NULL); 269 269 status &= PM_MODEL_LIMITS (PS_MINIMIZE_PARAM_MAX, i, PAR, NULL); 270 if (!status) {271 psTrace ("psModules.objects", 5, "Hitting parameter limits at (r,c) = (%.1f, %.1f)", Xo, Yo);272 model->flags |= PM_MODEL_STATUS_LIMITS;273 }270 if (!status) { 271 psTrace ("psModules.objects", 5, "Hitting parameter limits at (r,c) = (%.1f, %.1f)", Xo, Yo); 272 model->flags |= PM_MODEL_STATUS_LIMITS; 273 } 274 274 } 275 275 return(true);
Note:
See TracChangeset
for help on using the changeset viewer.
