IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Apr 14, 2006, 11:58:44 AM (20 years ago)
Author:
eugene
Message:

renamed config to recipe in lower-level functions, added pixel weights to pmSource, other cleanups

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psphot/src/psphotChoosePSF.c

    r6851 r6862  
    11# include "psphot.h"
    22
    3 // 2006.02.07 : no leaks!
    43// try PSF models and select best option
    5 pmPSF *psphotChoosePSF (psArray *sources, psMetadata *config) {
     4pmPSF *psphotChoosePSF (pmReadout *readout, psArray *sources, psMetadata *recipe) {
    65
    76    bool            status;
    87    char           *modelName;
    9     pmPSFtry       *try   = NULL;
     8    pmPSF          *psf = NULL;
     9    pmPSFtry       *try = NULL;
    1010    psArray        *stars = NULL;
    1111
     
    1313
    1414    // 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;
    2217
    2318    // examine PSF sources in S/N order (brightest first)
     
    2520
    2621    // array to store candidate PSF stars
    27     int NSTARS = psMetadataLookupS32 (&status, config, "PSF_MAX_NSTARS");
     22    int NSTARS = psMetadataLookupS32 (&status, recipe, "PSF_MAX_NSTARS");
    2823    if (!status) NSTARS = PS_MIN (sources->n, 200);
    2924
    3025    // 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");
    3227    if (!status) POISSON_ERRORS = true;
    3328    pmSourceFitModelInit (15, 0.1, POISSON_ERRORS);
     
    4540    // get the fixed PSF fit radius
    4641    // 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");
    4843
    4944    // get the list pointers for the PSF_MODEL entries
    5045    psList *list = NULL;
    51     psMetadataItem *mdi = psMetadataLookup (config, "PSF_MODEL");
     46    psMetadataItem *mdi = psMetadataLookup (recipe, "PSF_MODEL");
    5247    if (mdi == NULL) psAbort ("psphotChoosePSF", "missing PSF_MODEL selection");
    5348
     
    10095
    10196    // save only the best model;
    102     pmPSF *psf = psMemCopy(try->psf);
     97    psf = psMemCopy(try->psf);
    10398    psFree (models);
    10499
    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);
    106101
    107102    modelName = pmModelGetType (psf->type);
     
    109104    psLogMsg ("psphot.pspsf", 3, "selected psf model %s, ApResid: %f +/- %f\n", modelName, psf->ApResid, psf->dApResid);
    110105
    111     char *breakPt = psMetadataLookupStr (&status, config, "BREAK_POINT");
     106    char *breakPt = psMetadataLookupStr (&status, recipe, "BREAK_POINT");
    112107    if (!strcasecmp (breakPt, "PSFFIT")) exit (0);
    113108
    114109    return (psf);
    115110}
     111
     112bool 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.