Changeset 14655 for trunk/psphot/src/models/pmModel_TEST1.c
- Timestamp:
- Aug 23, 2007, 2:40:16 PM (19 years ago)
- File:
-
- 1 edited
-
trunk/psphot/src/models/pmModel_TEST1.c (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psphot/src/models/pmModel_TEST1.c
r11702 r14655 16 16 *****************************************************************************/ 17 17 18 # 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 # define PM_MODEL_FIT_STATUS pmModelFitStatus_TEST1 25 26 // XXX consider changing to form PAR[SXY]*(1/PAR[SXX]^2 + 1/PAR[SYY]^2)*X*Y 27 // this would provide natural limits on PAR[SXY] of -0.25 : +0.25 18 # 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 # define PM_MODEL_PARAMS_FROM_PSF pmModelParamsFromPSF_TEST1 25 # define PM_MODEL_FIT_STATUS pmModelFitStatus_TEST1 28 26 29 27 // the model is a function of the pixel coordinate (pixcoord[0,1] = x,y) 30 28 psF32 PM_MODEL_FUNC(psVector *deriv, 31 const psVector *params,32 const psVector *pixcoord)29 const psVector *params, 30 const psVector *pixcoord) 33 31 { 34 32 psF32 *PAR = params->data.F32; … … 127 125 bool PM_MODEL_GUESS (pmModel *model, pmSource *source) 128 126 { 129 130 127 pmMoments *moments = source->moments; 131 128 psF32 *PAR = model->params->data.F32; … … 160 157 norm = 0.0; 161 158 162 # define DZ 0.25159 # define DZ 0.25 163 160 164 161 float f0 = 1.0; … … 209 206 bool PM_MODEL_FROM_PSF (pmModel *modelPSF, pmModel *modelFLT, pmPSF *psf) 210 207 { 211 212 208 psF32 *out = modelPSF->params->data.F32; 213 209 psF32 *in = modelFLT->params->data.F32; 214 210 215 211 // we require these two parameters to exist 216 assert (psf->params _NEW->n > PM_PAR_YPOS);217 assert (psf->params _NEW->n > PM_PAR_XPOS);218 219 for (int i = 0; i < psf->params _NEW->n; i++) {220 if (psf->params _NEW->data[i] == NULL) {212 assert (psf->params->n > PM_PAR_YPOS); 213 assert (psf->params->n > PM_PAR_XPOS); 214 215 for (int i = 0; i < psf->params->n; i++) { 216 if (psf->params->data[i] == NULL) { 221 217 out[i] = in[i]; 222 218 } else { 223 psPolynomial2D *poly = psf->params _NEW->data[i];219 psPolynomial2D *poly = psf->params->data[i]; 224 220 out[i] = psPolynomial2DEval(poly, in[PM_PAR_XPOS], in[PM_PAR_YPOS]); 225 221 } … … 229 225 out[PM_PAR_SXY] = pmPSF_SXYtoModel (out); 230 226 227 return(true); 228 } 229 230 // construct the PSF model from the FLT model and the psf 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) 233 { 234 psF32 *PAR = model->params->data.F32; 235 236 // we require these two parameters to exist 237 assert (psf->params->n > PM_PAR_YPOS); 238 assert (psf->params->n > PM_PAR_XPOS); 239 240 PAR[PM_PAR_SKY] = 0.0; 241 PAR[PM_PAR_I0] = Io; 242 PAR[PM_PAR_XPOS] = Xo; 243 PAR[PM_PAR_YPOS] = Yo; 244 245 // supply the model-fitted parameters, or copy from the input 246 for (int i = 0; i < psf->params->n; i++) { 247 if (i == PM_PAR_SKY) continue; 248 psPolynomial2D *poly = psf->params->data[i]; 249 assert (poly); 250 PAR[i] = psPolynomial2DEval(poly, Xo, Yo); 251 } 252 253 // the 2D PSF model fits polarization terms (E0,E1,E2) 254 // convert to shape terms (SXX,SYY,SXY) 255 // XXX user-defined value for limit? 256 if (!pmPSF_FitToModel (PAR, 0.1)) { 257 psError(PM_ERR_PSF, false, "Failed to fit object at (r,c) = (%.1f,%.1f)", Xo, Yo); 258 return false; 259 } 260 261 // apply the model limits here: this truncates excessive extrapolation 262 // XXX do we need to do this still? should we put in asserts to test? 263 for (int i = 0; i < psf->params->n; i++) { 264 // apply the limits to all components or just the psf-model parameters? 265 if (psf->params->data[i] == NULL) 266 continue; 267 268 bool status = true; 269 status &= PM_MODEL_LIMITS (PS_MINIMIZE_PARAM_MIN, i, PAR, NULL); 270 status &= PM_MODEL_LIMITS (PS_MINIMIZE_PARAM_MAX, i, PAR, NULL); 271 if (!status) { 272 psTrace ("psModules.objects", 5, "Hitting parameter limits at (r,c) = (%.1f, %.1f)", Xo, Yo); 273 model->flags |= PM_MODEL_STATUS_LIMITS; 274 } 275 } 231 276 return(true); 232 277 } … … 237 282 bool PM_MODEL_FIT_STATUS (pmModel *model) 238 283 { 239 240 284 psF32 dP; 241 285 bool status; … … 265 309 # undef PM_MODEL_RADIUS 266 310 # undef PM_MODEL_FROM_PSF 311 # undef PM_MODEL_PARAMS_FROM_PSF 267 312 # undef PM_MODEL_FIT_STATUS
Note:
See TracChangeset
for help on using the changeset viewer.
