Changeset 8046 for trunk/psphot/src/psphotChoosePSF.c
- Timestamp:
- Aug 1, 2006, 4:15:32 PM (20 years ago)
- File:
-
- 1 edited
-
trunk/psphot/src/psphotChoosePSF.c (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psphot/src/psphotChoosePSF.c
r7758 r8046 2 2 3 3 // try PSF models and select best option 4 pmPSF *psphotChoosePSF (pmReadout *readout, psArray *sources, psMetadata *recipe) { 4 pmPSF *psphotChoosePSF (pmReadout *readout, psArray *sources, psMetadata *recipe) { 5 5 6 bool status;7 char *modelName;8 pmPSF *psf = NULL;9 pmPSFtry *try = NULL;10 psArray *stars = NULL;6 bool status; 7 char *modelName; 8 pmPSF *psf = NULL; 9 pmPSFtry *try = NULL; 10 psArray *stars = NULL; 11 11 12 12 psTimerStart ("psphot"); … … 32 32 // select the candidate PSF stars (pointers to original sources) 33 33 for (int i = 0; (i < sources->n) && (stars->n < NSTARS); i++) { 34 pmSource *source = sources->data[i];35 if (source->mode & PM_SOURCE_MODE_PSFSTAR) psArrayAdd (stars, 200, source);34 pmSource *source = sources->data[i]; 35 if (source->mode & PM_SOURCE_MODE_PSFSTAR) psArrayAdd (stars, 200, source); 36 36 } 37 37 psLogMsg ("psphot.pspsf", 4, "selected candidate %d PSF objects\n", stars->n); … … 47 47 48 48 if (mdi->type == PS_DATA_STRING) { 49 list = psListAlloc(NULL);50 psListAdd (list, PS_LIST_HEAD, mdi);49 list = psListAlloc(NULL); 50 psListAdd (list, PS_LIST_HEAD, mdi); 51 51 } else { 52 if (mdi->type != PS_DATA_METADATA_MULTI) psAbort ("psphotChoosePSF", "missing PSF_MODEL selection");53 list = psMemIncrRefCounter(mdi->data.list);52 if (mdi->type != PS_DATA_METADATA_MULTI) psAbort ("psphotChoosePSF", "missing PSF_MODEL selection"); 53 list = psMemIncrRefCounter(mdi->data.list); 54 54 } 55 55 … … 59 59 60 60 // try each model option listed in config 61 psListIterator *iter = psListIteratorAlloc (list, PS_LIST_HEAD, FALSE); 62 for (int i = 0; i < models->n; i++) { 63 psMetadataItem *item = psListGetAndIncrement (iter);64 modelName = item->data.V;65 models->data[i] = pmPSFtryModel (stars, modelName, RADIUS, POISSON_ERRORS);61 psListIterator *iter = psListIteratorAlloc (list, PS_LIST_HEAD, FALSE); 62 for (int i = 0; i < models->n; i++) { 63 psMetadataItem *item = psListGetAndIncrement (iter); 64 modelName = item->data.V; 65 models->data[i] = pmPSFtryModel (stars, modelName, RADIUS, POISSON_ERRORS); 66 66 } 67 67 psFree (iter); … … 75 75 float bestM = try->psf->dApResid; 76 76 for (int i = 1; i < models->n; i++) { 77 try = models->data[i];78 float M = try->psf->dApResid;79 if (M < bestM) {80 bestM = M;81 bestN = i;82 }77 try = models->data[i]; 78 float M = try->psf->dApResid; 79 if (M < bestM) { 80 bestM = M; 81 bestN = i; 82 } 83 83 } 84 84 85 85 // use the best model: 86 86 try = models->data[bestN]; … … 88 88 // unset the PSFSTAR flag for stars not used for PSF model 89 89 for (int i = 0; i < try->sources->n; i++) { 90 pmSource *source = try->sources->data[i];91 if (try->mask->data.U8[i] & PSFTRY_MASK_EXT_FAIL) {92 source->mode &= ~PM_SOURCE_MODE_PSFSTAR;93 }90 pmSource *source = try->sources->data[i]; 91 if (try->mask->data.U8[i] & PSFTRY_MASK_EXT_FAIL) { 92 source->mode &= ~PM_SOURCE_MODE_PSFSTAR; 93 } 94 94 } 95 95 … … 130 130 // get the model full-width at half-max 131 131 psF64 FWHM_X = 2*modelRadiusFunc (modelPSF->params, 0.5); 132 132 133 133 shape.sx = modelPSF->params->data.F32[4]; 134 134 shape.sy = modelPSF->params->data.F32[5]; … … 141 141 psMetadataAdd (recipe, PS_LIST_TAIL, "FWHM_Y", PS_DATA_F32 | PS_META_REPLACE, "PSF FWHM Minor axis", FWHM_Y); 142 142 psMetadataAdd (recipe, PS_LIST_TAIL, "ANGLE", PS_DATA_F32 | PS_META_REPLACE, "PSF angle", axes.theta); 143 143 144 144 psFree (modelEXT); 145 145 psFree (modelPSF); … … 150 150 bool psphotMomentsStats (pmReadout *readout, psMetadata *recipe, psArray *sources) { 151 151 152 // without the PSF model, we can only rely on the source->moments 152 // without the PSF model, we can only rely on the source->moments 153 153 // as a measure of the FWHM values 154 154 155 double FWHM_X , FWHM_Y, FWHM_T;156 int FWHM_N ;155 double FWHM_X = 0.0, FWHM_Y = 0.0, FWHM_T = 0.0; 156 int FWHM_N = 0; 157 157 158 158 psEllipseMoments moments; 159 159 psEllipseAxes axes; 160 160 161 FWHM_N = 0; 162 FWHM_X = FWHM_Y = 0.0; 161 for (int i = 0; i < sources->n; i++) { 162 pmSource *source = sources->data[i]; 163 if (!(source->mode & PM_SOURCE_MODE_PSFSTAR)) continue; 163 164 164 for (int i = 0; i < sources->n; i++) { 165 pmSource *source = sources->data[i]; 166 if (!(source->mode & PM_SOURCE_MODE_PSFSTAR)) continue; 167 168 // moments->Sx,Sy are roughly sigma_x,y 169 moments.x2 = PS_SQR(source->moments->Sx); 170 moments.y2 = PS_SQR(source->moments->Sy); 171 moments.xy = source->moments->Sxy; 165 // moments->Sx,Sy are roughly sigma_x,y 166 moments.x2 = PS_SQR(source->moments->Sx); 167 moments.y2 = PS_SQR(source->moments->Sy); 168 moments.xy = source->moments->Sxy; 172 169 173 axes = psEllipseMomentsToAxes (moments);170 axes = psEllipseMomentsToAxes (moments); 174 171 175 FWHM_X += axes.major * 2.35;176 FWHM_Y += axes.minor * 2.35;177 FWHM_T += axes.theta;178 FWHM_N ++;172 FWHM_X += axes.major * 2.35; 173 FWHM_Y += axes.minor * 2.35; 174 FWHM_T += axes.theta; 175 FWHM_N ++; 179 176 } 180 177 … … 186 183 psMetadataAdd (recipe, PS_LIST_TAIL, "FWHM_Y", PS_DATA_F32 | PS_META_REPLACE, "PSF FWHM Minor axis", FWHM_Y); 187 184 psMetadataAdd (recipe, PS_LIST_TAIL, "ANGLE", PS_DATA_F32 | PS_META_REPLACE, "PSF angle", FWHM_T); 188 185 189 186 return true; 190 187 }
Note:
See TracChangeset
for help on using the changeset viewer.
