IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 10079


Ignore:
Timestamp:
Nov 17, 2006, 11:53:21 PM (19 years ago)
Author:
magnier
Message:

defined a basic set of pmSourceFitModel tests

Location:
trunk/psModules/test/objects
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/psModules/test/objects/Makefile.am

    r9877 r10079  
    1717check_PROGRAMS = \
    1818        tap_pmSourcePhotometry \
    19         tap_pmGrowthCurve
     19        tap_pmGrowthCurve \
     20        tap_pmSourceFitModel
    2021
    2122test: check
  • trunk/psModules/test/objects/tap_pmSourceFitModel.c

    r10075 r10079  
    77#include "pstap.h"
    88
     9bool fitModelFlux (psRandom *seed, float flux, float radius);
     10
    911int main (void)
    1012{
    11 
    1213    pmModelGroupInit ();
     14    // psTraceSetLevel ("psLib.math.psMinimizeLMChi2", 6);
    1315
    1416    plan_tests(240);
    1517
    16     diag("measure the photometry bias as a function of magnitude for a sky offset");
     18    // build a gauss-deviate vector (mean = 0.0, sigma = 1.0)
     19    psRandom *seed = psRandomAlloc (PS_RANDOM_TAUS, 0);
    1720
     21    # if (0)
     22
     23        fitModelFlux (seed, 10000.0);
     24    fitModelFlux (seed, 3000.0);
     25    fitModelFlux (seed, 1000.0);
     26    fitModelFlux (seed, 300.0);
     27    fitModelFlux (seed, 100.0);
     28    fitModelFlux (seed, 30.0);
     29    # endif
     30
     31    fitModelFlux (seed, 30.0, 4.0);
     32    fitModelFlux (seed, 30.0, 5.0);
     33    fitModelFlux (seed, 30.0, 7.0);
     34    fitModelFlux (seed, 30.0, 10.0);
     35    fitModelFlux (seed, 30.0, 15.0);
     36    fitModelFlux (seed, 30.0, 20.0);
     37    fitModelFlux (seed, 30.0, 25.0);
     38    fitModelFlux (seed, 30.0, 35.0);
     39
     40    return exit_status();
    1841}
     42
     43bool fitModelFlux (psRandom *seed, float flux, float radius)
     44{
     45
     46    psMemId id = psMemGetId();
     47    diag("test model fit");
     48
     49    psVector *rnd = psVectorAlloc (1000, PS_TYPE_F32);
     50    for (int i = 0; i < rnd->n; i++) {
     51        rnd->data.F32[i] = psRandomGaussian (seed);
     52    }
     53
     54    // construct a model
     55    pmSource *source = pmSourceAlloc ();
     56    source->moments = pmMomentsAlloc ();
     57
     58    pmModelGroupInit ();
     59    pmModelType type = pmModelSetType ("PS_MODEL_GAUSS");
     60    source->modelEXT = pmModelAlloc (type);
     61
     62    source->modelEXT->params->data.F32[0] = 0;
     63    source->modelEXT->params->data.F32[1] = flux;
     64    source->modelEXT->params->data.F32[2] = 50;
     65    source->modelEXT->params->data.F32[3] = 50;
     66    source->modelEXT->params->data.F32[4] = 2.0*sqrt(2.0);
     67    source->modelEXT->params->data.F32[5] = 2.0*sqrt(2.0);
     68    source->modelEXT->params->data.F32[6] = 0;
     69
     70    source->pixels = psImageAlloc (100, 100, PS_TYPE_F32);
     71    source->weight = psImageAlloc (100, 100, PS_TYPE_F32);
     72    source->mask   = psImageAlloc (100, 100, PS_TYPE_U8);
     73    psImageInit (source->pixels, 0.0);
     74    psImageInit (source->weight, 0.0);
     75    psImageInit (source->mask, 0);
     76
     77    // create an image with the model, and add noise: gain is 1, subtracted sky is 100, readnoise is 5
     78    pmModelAdd (source->pixels, source->mask, source->modelEXT, false, false);
     79    int npix = 0;
     80    for (int j = 0; j < source->pixels->numRows; j++) {
     81        for (int i = 0; i < source->pixels->numCols; i++) {
     82            float flux = source->pixels->data.F32[j][i];
     83            float var = flux + 100 + PS_SQR(5);
     84            source->pixels->data.F32[j][i] += rnd->data.F32[npix]*sqrt(var);
     85            source->weight->data.F32[j][i] = var;
     86            npix ++;
     87            if (npix == rnd->n)
     88                npix = 0;
     89        }
     90    }
     91
     92    psFits *fits = psFitsOpen ("test.fits", "w");
     93    psFitsWriteImage (fits, NULL, source->pixels, 0, NULL);
     94    psFitsClose (fits);
     95
     96    // save the original model, modify params
     97    pmModel *guess = pmModelCopy (source->modelEXT);
     98    guess->params->data.F32[1] *= 0.9;
     99    guess->params->data.F32[2] += 1.0;
     100    guess->params->data.F32[3] -= 1.0;
     101    guess->params->data.F32[4] *= 0.9;
     102    guess->params->data.F32[5] *= 0.9;
     103
     104    pmSourceFitModelInit (15, 0.1, 100, true);
     105
     106    psImageKeepCircle (source->mask, 50, 50, radius, "OR", PM_MASK_MARK);
     107    pmSourceFitModel (source, guess, PM_SOURCE_FIT_EXT);
     108    psImageKeepCircle (source->mask, 50, 50, radius, "AND", PS_NOT_U8(PM_MASK_MARK));
     109
     110    ok_float_tol (guess->params->data.F32[1], source->modelEXT->params->data.F32[1], 100, "Io fitted: %f vs %f", guess->params->data.F32[1], source->modelEXT->params->data.F32[1]);
     111    ok_float_tol (guess->params->data.F32[2], source->modelEXT->params->data.F32[2], 0.01, "Xo fitted: %f vs %f", guess->params->data.F32[2], source->modelEXT->params->data.F32[2]);
     112    ok_float_tol (guess->params->data.F32[3], source->modelEXT->params->data.F32[3], 0.01, "Yo fitted: %f vs %f", guess->params->data.F32[3], source->modelEXT->params->data.F32[3]);
     113    ok_float_tol (guess->params->data.F32[4], source->modelEXT->params->data.F32[4], 0.01, "Sx fitted: %f vs %f", guess->params->data.F32[4], source->modelEXT->params->data.F32[4]);
     114    ok_float_tol (guess->params->data.F32[5], source->modelEXT->params->data.F32[5], 0.01, "Sy fitted: %f vs %f", guess->params->data.F32[5], source->modelEXT->params->data.F32[5]);
     115
     116    ok(!psMemCheckLeaks (id, NULL, NULL, false), "no memory leaks");
     117    return true;
     118}
Note: See TracChangeset for help on using the changeset viewer.