IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Apr 14, 2006, 11:43:59 AM (20 years ago)
Author:
magnier
Message:

added JPEG and PSF I/O methods to pmFPAfile, added pmSourcePixelWeights

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/rel10_ifa/psModules/src/objects/pmSourcePhotometry.c

    r6751 r6859  
    33 *  @author EAM, IfA; GLG, MHPCC
    44 *
    5  *  @version $Revision: 1.1.2.3 $ $Name: not supported by cvs2svn $
    6  *  @date $Date: 2006-04-01 02:47:20 $
     5 *  @version $Revision: 1.1.2.4 $ $Name: not supported by cvs2svn $
     6 *  @date $Date: 2006-04-14 21:43:59 $
    77 *
    88 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    2525#include "pmSourcePhotometry.h"
    2626
     27# define DO_SKY 0
     28
    2729static float AP_MIN_SN = 0.0;
    2830
     
    105107    status = pmSourcePhotometryModel (&source->extMag, source->modelEXT);
    106108
     109    // measure the weight of included pixels
     110    status = pmSourcePixelWeight (&source->pixWeight, model, source->pixels, source->mask);
     111
    107112    // measure object aperture photometry
    108113    if (SN > AP_MIN_SN) {
     
    169174}
    170175
    171 # define DO_SKY 0
    172176// return source aperture magnitude
    173177bool pmSourcePhotometryAper (float *apMag, pmModel *model, psImage *image, psImage *mask)
     
    202206}
    203207
    204 # if (0)
    205     // XXX split into ap, psf, ext mags?
    206     bool pmSourcePhotometry (float *fitMag, float *apMag, pmModel *model, psImage *image, psImage *mask)
    207 {
    208 
    209     float obsSum = 0;
    210     float fitSum = 0;
    211     float sky = model->params->data.F32[0];
    212 
    213     *fitMag = 99.0;
    214     *obsMag = 99.0;
    215 
    216     // measure fitMag
    217     pmModelFlux modelFluxFunc = pmModelFlux_GetFunction (model->type);
    218     fitSum = modelFluxFunc (model->params);
    219     if (fitSum <= 0)
    220         return false;
    221     if (!isfinite(fitSum))
    222         return false;
    223     *fitMag = -2.5*log10(fitSum);
    224 
    225     // measure apMag
    226     for (int ix = 0; ix < image->numCols; ix++) {
    227         for (int iy = 0; iy < image->numRows; iy++) {
    228             if (mask->data.U8[iy][ix])
    229                 continue;
    230             obsSum += image->data.F32[iy][ix] - sky;
    231         }
    232     }
    233     if (obsSum <= 0)
    234         return false;
    235     *obsMag = -2.5*log10(obsSum);
    236 
     208// return source aperture magnitude
     209bool pmSourcePixelWeight (float *pixWeight, pmModel *model, psImage *image, psImage *mask)
     210{
     211    float modelSum = 0;
     212    float validSum = 0;
     213    float sky = 0;
     214    float value;
     215
     216    int Xo, Yo, dP;
     217    int dX, DX, NX;
     218    int dY, DY, NY;
     219
     220    *pixWeight = 0.0;
     221
     222    if (model == NULL)
     223        return false;
     224
     225    // we only care about the value of the object model, not the local sky
     226    if (DO_SKY) {
     227        sky = model->params->data.F32[0];
     228    } else {
     229        sky = 0;
     230    }
     231
     232    // the model function returns the source flux at a position
     233    pmModelFunc modelFunc = pmModelFunc_GetFunction (model->type);
     234    psVector *coord = psVectorAlloc(2, PS_TYPE_F32);
     235    psVector *params = model->params;
     236
     237    Xo = params->data.F32[2];
     238    Yo = params->data.F32[3];
     239
     240    dX = Xo - image->col0;
     241    dP = image->numCols - dX;
     242    DX = PS_MAX(dX, dP);
     243    NX = image->numCols;
     244
     245    dY = Yo - image->row0;
     246    dP = image->numRows - dY;
     247    DY = PS_MAX(dY, dP);
     248    NY = image->numRows;
     249
     250    // measure modelSum and validSum
     251    // XXX this does not work for sources near the edge: we need to measure for
     252    // a full square region
     253    for (int ix = -DX; ix < DX + 1; ix++) {
     254        int mx = ix + dX;
     255        for (int iy = -DY; iy < DY + 1; iy++) {
     256            int my = iy + dY;
     257
     258            coord->data.F32[0] = (psF32) (ix + Xo);
     259            coord->data.F32[1] = (psF32) (iy + Yo);
     260
     261            // for the full model, add all points
     262            value = modelFunc (NULL, params, coord) - sky;
     263            modelSum += value;
     264
     265            // include count only the unmasked pixels within the image area
     266            if (mx < 0)
     267                continue;
     268            if (my < 0)
     269                continue;
     270            if (mx >= NX)
     271                continue;
     272            if (my >= NY)
     273                continue;
     274            if (mask->data.U8[my][mx])
     275                continue;
     276
     277            validSum += value;
     278        }
     279    }
     280    if (validSum <= 0)
     281        return false;
     282
     283    *pixWeight = validSum / modelSum;
    237284    return (true);
    238285}
    239 # endif
    240286
    241287float pmSourceCrossProduct (pmSource *Mi, pmSource *Mj)
Note: See TracChangeset for help on using the changeset viewer.