IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
May 3, 2010, 8:41:49 AM (16 years ago)
Author:
eugene
Message:

updates from trunk

Location:
branches/tap_branches
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/tap_branches

  • branches/tap_branches/psModules

  • branches/tap_branches/psModules/src/objects/pmSourcePhotometry.c

    r25754 r27838  
    109109        psAssert (isfinite(fluxScale), "how can the flux scale be invalid? source at %d, %d\n", source->peak->x, source->peak->y);
    110110        psAssert (fluxScale > 0.0, "how can the flux scale be negative? source at %d, %d\n", source->peak->x, source->peak->y);
    111         source->psfMag = -2.5*log10(fluxScale * source->modelPSF->params->data.F32[PM_PAR_I0]);
     111        source->psfFlux = fluxScale * source->modelPSF->params->data.F32[PM_PAR_I0];
     112        source->psfFluxErr = fluxScale * source->modelPSF->dparams->data.F32[PM_PAR_I0];
     113        source->psfMag = -2.5*log10(source->psfFlux);
    112114    } else {
    113         status = pmSourcePhotometryModel (&source->psfMag, source->modelPSF);
     115        status = pmSourcePhotometryModel (&source->psfMag, &source->psfFlux, source->modelPSF);
     116        source->psfFluxErr = source->psfFlux * (source->modelPSF->dparams->data.F32[PM_PAR_I0] / source->modelPSF->params->data.F32[PM_PAR_I0]);
    114117    }
    115118
     
    119122        for (int i = 0; i < source->modelFits->n; i++) {
    120123            pmModel *model = source->modelFits->data[i];
    121             status = pmSourcePhotometryModel (&model->mag, model);
     124            status = pmSourcePhotometryModel (&model->mag, NULL, model);
    122125            if (model == source->modelEXT) foundEXT = true;
    123126        }
     
    125128            source->extMag = source->modelEXT->mag;
    126129        } else {
    127             status = pmSourcePhotometryModel (&source->extMag, source->modelEXT);
     130            status = pmSourcePhotometryModel (&source->extMag, NULL, source->modelEXT);
    128131        }
    129132    } else {
    130133        if (source->modelEXT) {
    131             status = pmSourcePhotometryModel (&source->extMag, source->modelEXT);
     134            status = pmSourcePhotometryModel (&source->extMag, NULL, source->modelEXT);
    132135        }
    133136    }
     
    143146    if (mode & PM_SOURCE_PHOT_WEIGHT) {
    144147        pmSourcePixelWeight (&source->pixWeight, model, source->maskObj, maskVal);
     148    }
     149
     150    // measure the contribution of included pixels
     151    if (mode & PM_SOURCE_PHOT_DIFFSTATS) {
     152        pmSourceMeasureDiffStats (source, maskVal);
    145153    }
    146154
     
    217225
    218226// return source model magnitude
    219 bool pmSourcePhotometryModel (float *fitMag, pmModel *model)
    220 {
    221     PS_ASSERT_PTR_NON_NULL(fitMag, false);
    222     if (model == NULL) {
    223         return false;
    224     }
    225 
    226     float fitSum = 0;
    227     *fitMag = NAN;
     227bool pmSourcePhotometryModel (float *fitMag, float *fitFlux, pmModel *model)
     228{
     229    psAssert (fitMag || fitFlux, "at least one of magnitude or flux must be requested (not NULL)");
     230    if (model == NULL) return false;
     231
     232    float mag  = NAN;
     233    float flux = NAN;
    228234
    229235    // measure fitMag
    230     fitSum = model->modelFlux (model->params);
    231     if (fitSum <= 0)
    232         return false;
    233     if (!isfinite(fitSum))
    234         return false;
    235     *fitMag = -2.5*log10(fitSum);
     236    flux = model->modelFlux (model->params);
     237    if (flux > 0) {
     238        mag = -2.5*log10(flux);
     239    }
     240    if (fitMag) {
     241        *fitMag = mag;
     242    }
     243    if (fitFlux) {
     244        *fitFlux = flux;
     245    }
     246
     247    if (flux <= 0) return false;
     248    if (!isfinite(flux)) return false;
    236249
    237250    return (true);
     
    356369
    357370    *pixWeight = validSum / modelSum;
     371    return (true);
     372}
     373
     374# define FLUX_LIMIT 3.0
     375
     376// return source aperture magnitude
     377bool pmSourceMeasureDiffStats (pmSource *source, psImageMaskType maskVal)
     378{
     379    PS_ASSERT_PTR_NON_NULL(source, false);
     380
     381    if (source->diffStats == NULL) {
     382        source->diffStats = pmSourceDiffStatsAlloc();
     383    }
     384
     385    float fGood = 0.0;
     386    float fBad  = 0.0;
     387    int   nGood = 0;
     388    int   nMask = 0;
     389    int   nBad  = 0;
     390   
     391    psImage *flux     = source->pixels;
     392    psImage *variance = source->variance;
     393    psImage *mask     = source->maskObj;
     394
     395    for (int iy = 0; iy < flux->numRows; iy++) {
     396        for (int ix = 0; ix < flux->numCols; ix++) {
     397            if (mask->data.PS_TYPE_IMAGE_MASK_DATA[iy][ix] & maskVal) {
     398                nMask ++;
     399                continue;
     400            }
     401
     402            float SN = flux->data.F32[iy][ix] / sqrt(variance->data.F32[iy][ix]);
     403
     404            if (SN > +FLUX_LIMIT) {
     405                nGood ++;
     406                fGood += fabs(flux->data.F32[iy][ix]);
     407            }
     408
     409            if (SN < -FLUX_LIMIT) {
     410                nBad ++;
     411                fBad += fabs(flux->data.F32[iy][ix]);
     412            }
     413        }
     414    }
     415
     416    source->diffStats->nGood      = nGood;
     417    source->diffStats->fRatio     = (fGood + fBad         == 0.0) ? NAN : fGood / (fGood + fBad);         
     418    source->diffStats->nRatioBad  = (nGood + nBad         == 0)   ? NAN : nGood / (float) (nGood + nBad);         
     419    source->diffStats->nRatioMask = (nGood + nMask        == 0)   ? NAN : nGood / (float) (nGood + nMask);         
     420    source->diffStats->nRatioAll  = (nGood + nMask + nBad == 0)   ? NAN : nGood / (float) (nGood + nMask + nBad);
     421
    358422    return (true);
    359423}
     
    545609
    546610// determine chisq, etc for linear normalization-only fit
    547 bool pmSourceChisq (pmModel *model, psImage *image, psImage *mask, psImage *variance,
    548                     psImageMaskType maskVal)
     611bool pmSourceChisq (pmModel *model, psImage *image, psImage *mask, psImage *variance, psImageMaskType maskVal, const float covarFactor)
    549612{
    550613    PS_ASSERT_PTR_NON_NULL(model, false);
     
    561624            if (variance->data.F32[j][i] <= 0)
    562625                continue;
    563             dC += PS_SQR (image->data.F32[j][i]) / variance->data.F32[j][i];
     626            dC += PS_SQR (image->data.F32[j][i]) / (covarFactor * variance->data.F32[j][i]);
    564627            Npix ++;
    565628        }
     
    573636
    574637
    575 double pmSourceModelWeight(const pmSource *Mi,
    576                       int term,
    577                       const bool unweighted_sum) // should the cross product be weighted?
     638double pmSourceModelWeight(const pmSource *Mi, int term, const bool unweighted_sum, const float covarFactor)
    578639{
    579640    PS_ASSERT_PTR_NON_NULL(Mi, NAN);
     
    594655                continue;
    595656            if (!unweighted_sum) {
    596                 wt = Wi->data.F32[yi][xi];
     657                wt = covarFactor * Wi->data.F32[yi][xi];
    597658                if (wt == 0)
    598659                    continue;
     
    623684}
    624685
    625 double pmSourceModelDotModel (const pmSource *Mi,
    626                               const pmSource *Mj,
    627                               const bool unweighted_sum) // should the cross product be weighted?
     686double pmSourceModelDotModel (const pmSource *Mi, const pmSource *Mj, const bool unweighted_sum, const float covarFactor)
    628687{
    629688    PS_ASSERT_PTR_NON_NULL(Mi, NAN);
     
    677736                flux += (Pi->data.F32[yi][xi] * Pj->data.F32[yj][xj]);
    678737            } else {
    679                 wt = Wi->data.F32[yi][xi];
     738                wt = covarFactor * Wi->data.F32[yi][xi];
    680739                if (wt > 0) {
    681740                    flux += (Pi->data.F32[yi][xi] * Pj->data.F32[yj][xj]) / wt;
     
    687746}
    688747
    689 double pmSourceDataDotModel (const pmSource *Mi,
    690                              const pmSource *Mj,
    691                              const bool unweighted_sum) // should the cross product be weighted?
     748double pmSourceDataDotModel (const pmSource *Mi, const pmSource *Mj, const bool unweighted_sum, const float covarFactor)
    692749{
    693750    PS_ASSERT_PTR_NON_NULL(Mi, NAN);
     
    741798                flux += (Pi->data.F32[yi][xi] * Pj->data.F32[yj][xj]);
    742799            } else {
    743                 wt = Wi->data.F32[yi][xi];
     800                wt = covarFactor * Wi->data.F32[yi][xi];
    744801                if (wt > 0) {
    745802                    flux += (Pi->data.F32[yi][xi] * Pj->data.F32[yj][xj]) / wt;
Note: See TracChangeset for help on using the changeset viewer.