Changeset 17354
- Timestamp:
- Apr 6, 2008, 2:44:17 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branch_20080324/psphot/src/psphotModelWithPSF.c
r17344 r17354 1 1 # include "psphotInternal.h" 2 # define SAVE_IMAGES 0 2 3 3 4 bool psphotModelWithPSF_LMM ( … … 36 37 37 38 // allocate internal arrays (current vs Guess) 38 psImage *alpha = psImageAlloc(params->n, params->n, PS_TYPE_F32); 39 psImage *Alpha = psImageAlloc(params->n, params->n, PS_TYPE_F32); 40 psVector *beta = psVectorAlloc(params->n, PS_TYPE_F32); 41 psVector *Beta = psVectorAlloc(params->n, PS_TYPE_F32); 39 psImage *Alpha = NULL; 40 psVector *Beta = NULL; 41 42 // Alpha & Beta only contain elements to represent the unmasked parameters 43 if (!psMinLM_AllocAB (&Alpha, &Beta, params, paramMask)) { 44 psAbort ("programming error: no unmasked parameters to be fit\n"); 45 } 46 47 // allocate internal arrays (current vs Guess) 48 psImage *alpha = psImageAlloc(Alpha->numCols, Alpha->numRows, PS_TYPE_F32); 49 psVector *beta = psVectorAlloc(Beta->n, PS_TYPE_F32); 42 50 psVector *Params = psVectorAlloc(params->n, PS_TYPE_F32); 43 51 … … 79 87 // dump some useful info if trace is defined 80 88 if (psTraceGetLevel("psphot") >= 6) { 81 p_psImagePrint(psTraceGetDestination(), Alpha, "alpha guess (1)"); 82 p_psVectorPrint(psTraceGetDestination(), Beta, "beta guess (1)"); 89 p_psImagePrint(psTraceGetDestination(), Alpha, "Alpha guess (1)"); 90 p_psVectorPrint(psTraceGetDestination(), Beta, "Beta guess (1)"); 91 p_psVectorPrint(psTraceGetDestination(), beta, "beta current (1)"); 83 92 } 84 93 if (psTraceGetLevel("psphot") >= 5) { … … 116 125 beta = psVectorCopy(beta, Beta, PS_TYPE_F32); 117 126 params = psVectorCopy(params, Params, PS_TYPE_F32); 118 lambda *= 0. 1;127 lambda *= 0.25; 119 128 120 129 // save the new convolved model image … … 130 139 // construct & return the covariance matrix (if requested) 131 140 if (covar != NULL) { 132 if (!psMinLM_GuessABP( covar, Beta, Params, alpha, beta, params, paramMask, NULL, 0.0, NULL)) {141 if (!psMinLM_GuessABP(Alpha, Beta, Params, alpha, beta, params, paramMask, NULL, 0.0, NULL)) { 133 142 psTrace ("psphot", 5, "failure to calculate covariance matrix\n"); 134 143 } 144 // set covar values which are not masked 145 psImageInit (covar, 0.0); 146 for (int j = 0, J = 0; j < params->n; j++) { 147 if (paramMask && (paramMask->data.U8[j])) { 148 covar->data.F32[j][j] = 1.0; 149 continue; 150 } 151 for (int k = 0, K = 0; k < params->n; k++) { 152 if (paramMask && (paramMask->data.U8[k])) continue; 153 covar->data.F32[j][k] = Alpha->data.F32[J][K]; 154 K++; 155 } 156 J++; 157 } 135 158 } 136 159 … … 177 200 } 178 201 179 // generate the model and derivative images for this parameter set202 // 1 *** generate the model and derivative images for this parameter set 180 203 181 204 // storage for model derivatives … … 223 246 224 247 for (int n = 0; n < params->n; n++) { 225 if ((paramMask != NULL) && (paramMask->data.U8[n])) { continue; }226 psImage *dmodel = pcm->dmodels->data[n];227 dmodel->data.F32[i][j] = deriv->data.F32[n];248 if ((paramMask != NULL) && (paramMask->data.U8[n])) { continue; } 249 psImage *dmodel = pcm->dmodels->data[n]; 250 dmodel->data.F32[i][j] = deriv->data.F32[n]; 228 251 } 229 252 } … … 231 254 psFree(coord); 232 255 psFree(deriv); 233 234 256 235 257 // convolve model and dmodel arrays with PSF 236 258 psImageConvolveDirect (pcm->modelConv, pcm->model, psf); 237 259 for (int n = 0; n < pcm->dmodels->n; n++) { 238 if (pcm->dmodels->data[n] == NULL) continue;239 psImage *dmodel = pcm->dmodels->data[n];240 psImage *dmodelConv = pcm->dmodelsConv->data[n];241 psImageConvolveDirect (dmodelConv, dmodel, psf);260 if (pcm->dmodels->data[n] == NULL) continue; 261 psImage *dmodel = pcm->dmodels->data[n]; 262 psImage *dmodelConv = pcm->dmodelsConv->data[n]; 263 psImageConvolveDirect (dmodelConv, dmodel, psf); 242 264 } 243 265 244 266 // XXX TEST : SAVE IMAGES 245 # if ( 1)267 # if (SAVE_IMAGES) 246 268 psphotSaveImage (NULL, psf->image, "psf.fits"); 247 269 psphotSaveImage (NULL, pcm->model, "model.fits"); … … 252 274 # endif 253 275 276 // 2 *** accumulate alpha & beta 277 254 278 // zero alpha and beta for summing below 255 279 psImageInit (alpha, 0.0); … … 259 283 for (psS32 i = 0; i < source->pixels->numRows; i++) { 260 284 for (psS32 j = 0; j < source->pixels->numCols; j++) { 261 // XXX are we doing the right thing with the mask?285 // XXX are we doing the right thing with the mask? 262 286 // skip masked points 263 287 if (source->maskObj->data.U8[i][j]) { … … 279 303 chisq += PS_SQR(delta) * yweight; 280 304 281 if (isnan(delta)) 282 psAbort("nan in delta"); 283 if (isnan(chisq)) 284 psAbort("nan in chisq"); 285 286 for (psS32 n1 = 0; n1 < params->n; n1++) { 287 if ((paramMask != NULL) && (paramMask->data.U8[n1])) { 288 continue; 289 } 290 psImage *dmodel = pcm->dmodelsConv->data[n1]; 291 float weight = dmodel->data.F32[i][j] * yweight; 292 for (psS32 n2 = 0; n2 <= n1; n2++) { 293 if ((paramMask != NULL) && (paramMask->data.U8[n2])) { 294 continue; 295 } 296 dmodel = pcm->dmodelsConv->data[n2]; 297 alpha->data.F32[n1][n2] += weight * dmodel->data.F32[i][j]; 298 } 299 beta->data.F32[n1] += weight * delta; 305 if (isnan(delta)) psAbort("nan in delta"); 306 if (isnan(chisq)) psAbort("nan in chisq"); 307 308 // alpha & beta only contain unmasked elements 309 for (int n1 = 0, N1 = 0; n1 < params->n; n1++) { 310 if ((paramMask != NULL) && (paramMask->data.U8[n1])) continue; 311 psImage *dmodel = pcm->dmodelsConv->data[n1]; 312 float weight = dmodel->data.F32[i][j] * yweight; 313 for (int n2 = 0, N2 = 0; n2 <= n1; n2++) { 314 if ((paramMask != NULL) && (paramMask->data.U8[n2])) continue; 315 dmodel = pcm->dmodelsConv->data[n2]; 316 alpha->data.F32[N1][N2] += weight * dmodel->data.F32[i][j]; 317 N2++; 318 } 319 beta->data.F32[N1] += weight * delta; 320 N1++; 300 321 } 301 322 } … … 303 324 304 325 // calculate lower-left half of alpha 305 for (psS32 j = 1; j < params->n; j++) {326 for (psS32 j = 1; j < alpha->numCols; j++) { 306 327 for (psS32 k = 0; k < j; k++) { 307 328 alpha->data.F32[k][j] = alpha->data.F32[j][k]; 308 }309 }310 311 // fill in pivots if we apply a mask312 if (paramMask != NULL) {313 for (psS32 j = 0; j < params->n; j++) {314 if (paramMask->data.U8[j]) {315 alpha->data.F32[j][j] = 1;316 beta->data.F32[j] = 1;317 }318 329 } 319 330 } … … 345 356 pcm->dmodels = psArrayAlloc (params->n); 346 357 for (psS32 n = 0; n < params->n; n++) { 347 if ((paramMask != NULL) && (paramMask->data.U8[n])) { continue; } 348 pcm->dmodels->data[n] = psImageCopy (NULL, source->pixels, PS_TYPE_F32); 358 pcm->dmodels->data[n] = NULL; 359 if ((paramMask != NULL) && (paramMask->data.U8[n])) { continue; } 360 pcm->dmodels->data[n] = psImageCopy (NULL, source->pixels, PS_TYPE_F32); 349 361 } 350 362 … … 353 365 pcm->dmodelsConv = psArrayAlloc (params->n); 354 366 for (psS32 n = 0; n < params->n; n++) { 355 if ((paramMask != NULL) && (paramMask->data.U8[n])) { continue; } 356 pcm->dmodelsConv->data[n] = psImageCopy (NULL, source->pixels, PS_TYPE_F32); 367 pcm->dmodelsConv->data[n] = NULL; 368 if ((paramMask != NULL) && (paramMask->data.U8[n])) { continue; } 369 pcm->dmodelsConv->data[n] = psImageCopy (NULL, source->pixels, PS_TYPE_F32); 357 370 } 358 371 … … 378 391 379 392 while () { 380 GuessABP (Alpha, Beta, Params, alpha, beta, params, paramMask, checkLimits, lambda)381 dLinear = dLinear(Beta, beta, lambda);382 chisq = SetABX (alpha, beta, params, paramMask, x, y, dy, func)383 convergence tests...393 GuessABP (Alpha, Beta, Params, alpha, beta, params, paramMask, checkLimits, lambda) 394 dLinear = dLinear(Beta, beta, lambda); 395 chisq = SetABX (alpha, beta, params, paramMask, x, y, dy, func) 396 convergence tests... 384 397 } 385 398 … … 388 401 ** GuessABP: 389 402 390 f_c = sum_i (kern_i * func (x_i; p_o))391 392 df_c/dp_o = d/dp_o [sum_i (kern_i * func (x_i; p_o))]393 394 df_c/dp_o = sum_i (d/dp_o [kern_i * func (x_i; p_o)])395 396 df_c/dp_o = sum_i (kern_i * d/dp_o [func (x_i; p_o)])397 398 - generate image arrays for func, dfunc/dp_j (not masked)399 - convolve each with psf400 - measure delta = f_conv - data401 - etc403 f_c = sum_i (kern_i * func (x_i; p_o)) 404 405 df_c/dp_o = d/dp_o [sum_i (kern_i * func (x_i; p_o))] 406 407 df_c/dp_o = sum_i (d/dp_o [kern_i * func (x_i; p_o)]) 408 409 df_c/dp_o = sum_i (kern_i * d/dp_o [func (x_i; p_o)]) 410 411 - generate image arrays for func, dfunc/dp_j (not masked) 412 - convolve each with psf 413 - measure delta = f_conv - data 414 - etc 402 415 */ 403 416
Note:
See TracChangeset
for help on using the changeset viewer.
