Changeset 6862 for trunk/psphot/src/psphotChoosePSF.c
- Timestamp:
- Apr 14, 2006, 11:58:44 AM (20 years ago)
- File:
-
- 1 edited
-
trunk/psphot/src/psphotChoosePSF.c (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psphot/src/psphotChoosePSF.c
r6851 r6862 1 1 # include "psphot.h" 2 2 3 // 2006.02.07 : no leaks!4 3 // try PSF models and select best option 5 pmPSF *psphotChoosePSF (p sArray *sources, psMetadata *config) {4 pmPSF *psphotChoosePSF (pmReadout *readout, psArray *sources, psMetadata *recipe) { 6 5 7 6 bool status; 8 7 char *modelName; 9 pmPSFtry *try = NULL; 8 pmPSF *psf = NULL; 9 pmPSFtry *try = NULL; 10 10 psArray *stars = NULL; 11 11 … … 13 13 14 14 // check if a PSF model is supplied by the user 15 char *psfFile = psMetadataLookupStr (&status, config, "PSF_INPUT_FILE"); 16 if (status) { 17 int Nfail; 18 psMetadata *psfData = psMetadataConfigParse (NULL, &Nfail, psfFile, FALSE); 19 pmPSF *psf = pmPSFfromMD (psfData); 20 return psf; 21 } 15 psf = psMetadataLookupPtr (&status, readout->analysis, "PSPHOT.PSF"); 16 if (psf != NULL) return psf; 22 17 23 18 // examine PSF sources in S/N order (brightest first) … … 25 20 26 21 // array to store candidate PSF stars 27 int NSTARS = psMetadataLookupS32 (&status, config, "PSF_MAX_NSTARS");22 int NSTARS = psMetadataLookupS32 (&status, recipe, "PSF_MAX_NSTARS"); 28 23 if (!status) NSTARS = PS_MIN (sources->n, 200); 29 24 30 25 // use poissonian errors or local-sky errors 31 bool POISSON_ERRORS = psMetadataLookupBool (&status, config, "POISSON_ERRORS");26 bool POISSON_ERRORS = psMetadataLookupBool (&status, recipe, "POISSON_ERRORS"); 32 27 if (!status) POISSON_ERRORS = true; 33 28 pmSourceFitModelInit (15, 0.1, POISSON_ERRORS); … … 45 40 // get the fixed PSF fit radius 46 41 // XXX EAM : check that PSF_FIT_RADIUS < SKY_OUTER_RADIUS 47 float RADIUS = psMetadataLookupF32 (&status, config, "PSF_FIT_RADIUS");42 float RADIUS = psMetadataLookupF32 (&status, recipe, "PSF_FIT_RADIUS"); 48 43 49 44 // get the list pointers for the PSF_MODEL entries 50 45 psList *list = NULL; 51 psMetadataItem *mdi = psMetadataLookup ( config, "PSF_MODEL");46 psMetadataItem *mdi = psMetadataLookup (recipe, "PSF_MODEL"); 52 47 if (mdi == NULL) psAbort ("psphotChoosePSF", "missing PSF_MODEL selection"); 53 48 … … 100 95 101 96 // save only the best model; 102 p mPSF *psf = psMemCopy(try->psf);97 psf = psMemCopy(try->psf); 103 98 psFree (models); 104 99 105 psMetadataAdd ( config, PS_LIST_TAIL, "NPSFSTAR", PS_DATA_S32 | PS_META_REPLACE, "number of stars used to make PSF", psf->nPSFstars);100 psMetadataAdd (recipe, PS_LIST_TAIL, "NPSFSTAR", PS_DATA_S32 | PS_META_REPLACE, "number of stars used to make PSF", psf->nPSFstars); 106 101 107 102 modelName = pmModelGetType (psf->type); … … 109 104 psLogMsg ("psphot.pspsf", 3, "selected psf model %s, ApResid: %f +/- %f\n", modelName, psf->ApResid, psf->dApResid); 110 105 111 char *breakPt = psMetadataLookupStr (&status, config, "BREAK_POINT");106 char *breakPt = psMetadataLookupStr (&status, recipe, "BREAK_POINT"); 112 107 if (!strcasecmp (breakPt, "PSFFIT")) exit (0); 113 108 114 109 return (psf); 115 110 } 111 112 bool psphotPSFstats (pmReadout *readout, psMetadata *recipe, pmPSF *psf) { 113 114 psEllipseShape shape; 115 psEllipseAxes axes; 116 117 psImage *image = readout->image; 118 119 pmModel *modelEXT = pmModelAlloc (psf->type); 120 121 // make a model with unit central intensity at the image center 122 modelEXT->params->data.F32[0] = 0; 123 modelEXT->params->data.F32[1] = 1; 124 modelEXT->params->data.F32[2] = 0.5*image->numCols; 125 modelEXT->params->data.F32[3] = 0.5*image->numRows; 126 127 // construct a PSF model at this coordinate 128 pmModel *modelPSF = pmModelFromPSF (modelEXT, psf); 129 130 // get the correct model-radius function 131 pmModelRadius modelRadiusFunc = pmModelRadius_GetFunction (psf->type); 132 133 // get the model full-width at half-max 134 psF64 FWHM_X = 2*modelRadiusFunc (modelPSF->params, 0.5); 135 136 shape.sx = modelPSF->params->data.F32[4]; 137 shape.sy = modelPSF->params->data.F32[5]; 138 shape.sxy = modelPSF->params->data.F32[6]; 139 axes = psEllipseShapeToAxes (shape); 140 141 psF64 FWHM_Y = FWHM_X * (axes.minor / axes.major); 142 143 psMetadataAdd (recipe, PS_LIST_TAIL, "FWHM_X", PS_DATA_F32 | PS_META_REPLACE, "PSF FWHM Major axis", FWHM_X); 144 psMetadataAdd (recipe, PS_LIST_TAIL, "FWHM_Y", PS_DATA_F32 | PS_META_REPLACE, "PSF FWHM Minor axis", FWHM_Y); 145 psMetadataAdd (recipe, PS_LIST_TAIL, "ANGLE", PS_DATA_F32 | PS_META_REPLACE, "PSF angle", axes.theta); 146 147 return true; 148 }
Note:
See TracChangeset
for help on using the changeset viewer.
