IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 41175


Ignore:
Timestamp:
Nov 27, 2019, 12:07:48 PM (6 years ago)
Author:
eugene
Message:

tweaking pmSourceFitModel tests

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

Legend:

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

    r38280 r41175  
    1212
    1313TEST_PROGS = \
    14         tap_pmPeaks \
    15         tap_pmGrowthCurve \
    16         tap_pmMoments \
    17         tap_pmSource \
    18         tap_pmModel \
    19         tap_pmModelUtils \
    20         tap_pmModelClass \
    21         tap_pmModel_CentralPixel \
    22         tap_pmModel_CentralPixel_v2 \
    23         tap_pmModel_SET_FWHM \
    24         tap_pmPSF \
    25         tap_pmTrend2D \
    26         tap_pmResiduals \
    27         tap_pmSourceExtendedPars \
    28         tap_pmSourceSky \
    29         tap_pmSourceMoments \
    30         tap_pmSourceIO_PS1_DEV_0 \
    31         tap_pmSourceIO_PS1_DEV_1 \
    32         tap_pmSourceIO_SMPDATA \
    33         tap_pmSourceContour \
    34         tap_pmSourceUtils \
    35         tap_pmSourceFitSet \
    36         tap_pmPSF_IO \
    37         tap_pmSourceIO_SMPDATA
     14        tap_pmSourceFitModel
     15
     16#       tap_pmPeaks \
     17#       tap_pmGrowthCurve \
     18#       tap_pmMoments \
     19#       tap_pmSource \
     20#       tap_pmModel \
     21#       tap_pmModelUtils \
     22#       tap_pmModelClass \
     23#       tap_pmModel_CentralPixel \
     24#       tap_pmModel_CentralPixel_v2 \
     25#       tap_pmModel_SET_FWHM \
     26#       tap_pmPSF \
     27#       tap_pmTrend2D \
     28#       tap_pmResiduals \
     29#       tap_pmSourceExtendedPars \
     30#       tap_pmSourceSky \
     31#       tap_pmSourceMoments \
     32#       tap_pmSourceIO_PS1_DEV_0 \
     33#       tap_pmSourceIO_PS1_DEV_1 \
     34#       tap_pmSourceIO_SMPDATA \
     35#       tap_pmSourceContour \
     36#       tap_pmSourceUtils \
     37#       tap_pmSourceFitSet \
     38#       tap_pmPSF_IO \
     39#       tap_pmSourceIO_SMPDATA
    3840
    3941if BUILD_TESTS
  • trunk/psModules/test/objects/tap_pmSourceFitModel.c

    r23259 r41175  
    77#include "pstap.h"
    88
     9# define SKY_NOISE 10.0
     10# define READ_NOISE 0.0
     11
    912bool fitModels (psRandom *seed, float flux, float radius, float sigma);
    1013bool fitModelFlux (psRandom *seed, float flux, float radius, float sigma);
     14bool fitModelFluxOne (psRandom *seed, float flux, float radius, float sigma);
    1115
    1216// tests to check accuracy of fitted models for a range of fit radii, sigma, and flux.
     
    1822int main (void)
    1923{
    20     pmModelGroupInit ();
    21     pmSourceFitModelInit (15, 0.01, 1.0, true);
     24    pmModelClassInit ();
     25    // pmSourceFitModelInit (15, 0.01, 1.0, true);
    2226
    2327    // psTraceSetLevel ("psModules.objects.pmSourceFitModel", 10);
    24     // psTraceSetLevel ("psLib.math.psMinimizeLMChi2", 10);
     28    // psTraceSetLevel ("psLib.math.psMinimizeLMChi2_Alt", 5);
    2529
    2630    plan_tests(240);
     
    2832    // build a gauss-deviate vector (mean = 0.0, sigma = 1.0)
    2933    psRandom *seed = psRandomAllocSpecific (PS_RANDOM_TAUS, 0);
     34
     35    // try a single model
     36    // fitModelFluxOne (seed, 10000.0, 10.0, 2.0);
     37    // return exit_status();
    3038
    3139    static float radius[] = {3.0, 5.0, 7.0, 10.0, 15.0, 25.0};
     
    3644    bool status = fitModels (seed, 10000.0, 10.0, 2.0);
    3745    skip_start (!status, 240, "*** BASIC MODEL FITTING FAILS! *** : skipping related tests");
     46    // exit (1);
    3847
    3948    for (int i = 0; i < sizeof(sigma)/sizeof(float); i++) {
     
    7483
    7584    float signal = 2*M_PI*sigma*sigma*flux;
    76     float noise = sqrt(signal + 4*M_PI*sigma*sigma*(100 + PS_SQR(5)));
     85    float noise = sqrt(signal + 4*M_PI*sigma*sigma*(SKY_NOISE*SKY_NOISE + PS_SQR(READ_NOISE)));
    7786    float dMag = noise / signal;
    7887    float dPos = sigma * dMag;
     
    8493    psStats *stats = psStatsAlloc (PS_STAT_SAMPLE_MEAN | PS_STAT_SAMPLE_STDEV);
    8594    psVectorStats (stats, par1, NULL, NULL, 0);
    86     ok ((stats->sampleStdev/dMag < 2.0), "Io ref/fit stdev: %e : %e sigma", stats->sampleStdev, stats->sampleStdev/dMag);
     95    ok ((stats->sampleStdev/dMag < 1.5), "Io ref/fit stdev: %e : %e sigma", stats->sampleStdev, stats->sampleStdev/dMag);
    8796    psVectorStats (stats, par2, NULL, NULL, 0);
    88     ok ((stats->sampleStdev/dPos < 2.0), "Xo ref/fit stdev: %e : %e sigma", stats->sampleStdev, stats->sampleStdev/dPos);
     97    ok ((stats->sampleStdev/dPos < 1.5), "Xo ref-fit stdev: %e : %e sigma", stats->sampleStdev, stats->sampleStdev/dPos);
    8998    psVectorStats (stats, par3, NULL, NULL, 0);
    90     ok ((stats->sampleStdev/dPos < 2.0), "Yo ref/fit stdev: %e : %e sigma", stats->sampleStdev, stats->sampleStdev/dPos);
     99    ok ((stats->sampleStdev/dPos < 1.5), "Yo ref-fit stdev: %e : %e sigma", stats->sampleStdev, stats->sampleStdev/dPos);
    91100    psVectorStats (stats, par4, NULL, NULL, 0);
    92     ok ((stats->sampleStdev/dMag < 2.0), "Sx ref/fit stdev: %e : %e sigma", stats->sampleStdev, stats->sampleStdev/dMag);
     101    ok ((stats->sampleStdev/dMag < 1.5), "Sx ref/fit stdev: %e : %e sigma", stats->sampleStdev, stats->sampleStdev/dMag);
    93102    psVectorStats (stats, par5, NULL, NULL, 0);
    94     ok ((stats->sampleStdev/dMag < 2.0), "Sy ref/fit stdev: %e : %e sigma", stats->sampleStdev, stats->sampleStdev/dMag);
     103    ok ((stats->sampleStdev/dMag < 1.5), "Sy ref/fit stdev: %e : %e sigma", stats->sampleStdev, stats->sampleStdev/dMag);
    95104
    96105    psFree (par1);
     
    107116bool fitModelFlux (psRandom *seed, float flux, float radius, float sigma)
    108117{
     118
     119  psImageMaskType maskVal = 0x01;
    109120
    110121    psVector *rnd = psVectorAlloc (1000, PS_TYPE_F32);
     
    128139    source->modelEXT->params->data.F32[6] = 0;
    129140
    130     source->pixels = psImageAlloc (100, 100, PS_TYPE_F32);
    131     source->weight = psImageAlloc (100, 100, PS_TYPE_F32);
    132     source->mask   = psImageAlloc (100, 100, PS_TYPE_U8);
     141    source->pixels   = psImageAlloc (100, 100, PS_TYPE_F32);
     142    source->variance = psImageAlloc (100, 100, PS_TYPE_F32);
     143    source->maskObj  = psImageAlloc (100, 100, PS_TYPE_IMAGE_MASK);
    133144    psImageInit (source->pixels, 0.0);
    134     psImageInit (source->weight, 0.0);
    135     psImageInit (source->mask, 0);
     145    psImageInit (source->variance, 0.0);
     146    psImageInit (source->maskObj, 0);
    136147
    137148    // create an image with the model, and add noise: gain is 1, subtracted sky is 100, readnoise is 5
    138     pmModelAdd (source->pixels, source->mask, source->modelEXT, PM_MODEL_OP_FULL);
     149    pmModelAdd (source->pixels, source->maskObj, source->modelEXT, PM_MODEL_OP_FULL, maskVal);
    139150    int npix = 0;
    140151    for (int j = 0; j < source->pixels->numRows; j++) {
    141152        for (int i = 0; i < source->pixels->numCols; i++) {
    142153            float flux = source->pixels->data.F32[j][i];
    143             float var = flux + 100 + PS_SQR(5);
     154            float var = flux + PS_SQR(SKY_NOISE) + PS_SQR(READ_NOISE);
    144155            source->pixels->data.F32[j][i] += rnd->data.F32[npix]*sqrt(var);
    145             source->weight->data.F32[j][i] = var;
     156            source->variance->data.F32[j][i] = var;
    146157            npix ++;
    147158            if (npix == rnd->n)
     
    154165    // psFitsClose (fits);
    155166
     167    pmSourceFitOptions *fitOptions = pmSourceFitOptionsAlloc();
     168    fitOptions->mode          = PM_SOURCE_FIT_PSF;
     169    fitOptions->covarFactor   = 1.0;
     170
    156171    // save the original model, modify params
    157172    pmModel *guess = pmModelCopy (source->modelEXT);
    158     guess->params->data.F32[1] *= 0.9;
    159     guess->params->data.F32[2] += 1.0;
    160     guess->params->data.F32[3] -= 1.0;
    161     guess->params->data.F32[4] *= 0.9;
    162     guess->params->data.F32[5] *= 0.9;
    163 
    164     psImageKeepCircle (source->mask, 50, 50, radius, "OR", PM_MASK_MARK);
    165     bool status = pmSourceFitModel (source, guess, PM_SOURCE_FIT_EXT);
     173    if (fitOptions->mode == PM_SOURCE_FIT_PSF) {
     174      guess->params->data.F32[1] *= 0.9;
     175      guess->params->data.F32[2] += 1.0;
     176      guess->params->data.F32[3] -= 1.0;
     177    }
     178    if (fitOptions->mode == PM_SOURCE_FIT_EXT) {
     179      guess->params->data.F32[1] *= 0.9;
     180      guess->params->data.F32[4] *= 0.9;
     181      guess->params->data.F32[5] *= 0.9;
     182    }
     183
     184    // use maskVal to exclude pixels outside the circle
     185    psImageKeepCircle (source->maskObj, 50, 50, radius, "OR", maskVal);
     186
     187    bool status = pmSourceFitModel (source, guess, fitOptions, maskVal);
     188    // fprintf (stderr, "Io: %8.1f %8.1f\n", source->modelEXT->params->data.F32[1], guess->params->data.F32[1]);
    166189    if (!status) {
    167190        psFree (rnd);
     
    170193        return false;
    171194    }
    172     psImageKeepCircle (source->mask, 50, 50, radius, "AND", PS_NOT_U8(PM_MASK_MARK));
    173 
    174     par1->data.F32[par1->n] = (source->modelEXT->params->data.F32[1] / guess->params->data.F32[1]);
     195    psImageMaskPixels (source->maskObj, "AND", PS_NOT_IMAGE_MASK(maskVal));
     196
     197    // par1->data.F32[par1->n] = (guess->params->data.F32[1]);
     198    par1->data.F32[par1->n] = (guess->params->data.F32[1] / source->modelEXT->params->data.F32[1]);
    175199    par2->data.F32[par2->n] = (source->modelEXT->params->data.F32[2] - guess->params->data.F32[2]);
    176200    par3->data.F32[par3->n] = (source->modelEXT->params->data.F32[3] - guess->params->data.F32[3]);
     
    187211    psFree (source);
    188212    psFree (guess);
     213    psFree (fitOptions);
    189214
    190215    return true;
    191216}
     217
     218bool fitModelFluxOne (psRandom *seed, float flux, float radius, float sigma)
     219{
     220
     221  psImageMaskType maskVal = 0x01;
     222
     223  psVector *rnd = psVectorAlloc (1000, PS_TYPE_F32);
     224  for (int i = 0; i < rnd->n; i++) {
     225    rnd->data.F32[i] = psRandomGaussian (seed);
     226  }
     227
     228  // construct a model
     229  pmSource *source = pmSourceAlloc ();
     230  source->moments = pmMomentsAlloc ();
     231
     232  pmModelType type = pmModelClassGetType ("PS_MODEL_GAUSS");
     233  source->modelEXT = pmModelAlloc (type);
     234
     235  source->modelEXT->params->data.F32[0] = 0;
     236  source->modelEXT->params->data.F32[1] = flux;
     237  source->modelEXT->params->data.F32[2] = 50;
     238  source->modelEXT->params->data.F32[3] = 50;
     239  source->modelEXT->params->data.F32[4] = 2.0*sqrt(sigma);
     240  source->modelEXT->params->data.F32[5] = 2.0*sqrt(sigma);
     241  source->modelEXT->params->data.F32[6] = 0;
     242
     243  source->pixels   = psImageAlloc (100, 100, PS_TYPE_F32);
     244  source->variance = psImageAlloc (100, 100, PS_TYPE_F32);
     245  source->maskObj  = psImageAlloc (100, 100, PS_TYPE_IMAGE_MASK);
     246  psImageInit (source->pixels, 0.0);
     247  psImageInit (source->variance, 0.0);
     248  psImageInit (source->maskObj, 0);
     249
     250  // create an image with the model, and add noise: gain is 1, subtracted sky is 100, readnoise is 5
     251  pmModelAdd (source->pixels, source->maskObj, source->modelEXT, PM_MODEL_OP_FULL, maskVal);
     252  int npix = 0;
     253  for (int j = 0; j < source->pixels->numRows; j++) {
     254    for (int i = 0; i < source->pixels->numCols; i++) {
     255      float flux = source->pixels->data.F32[j][i];
     256      float var = flux + 100 + PS_SQR(5);
     257      source->pixels->data.F32[j][i] += rnd->data.F32[npix]*sqrt(var);
     258      source->variance->data.F32[j][i] = var;
     259      npix ++;
     260      if (npix == rnd->n)
     261        npix = 0;
     262    }
     263  }
     264
     265  // psFits *fits = psFitsOpen ("test.fits", "w");
     266  // psFitsWriteImage (fits, NULL, source->pixels, 0, NULL);
     267  // psFitsClose (fits);
     268
     269  // EXT vs PSF fitting:
     270  // EXT fits Io, Sxx, Sxy, Syy
     271  // PSF fits Io, Xo, Yo
     272  pmSourceFitOptions *fitOptions = pmSourceFitOptionsAlloc();
     273  fitOptions->mode = PM_SOURCE_FIT_EXT;
     274  // fitOptions->mode = PM_SOURCE_FIT_PSF;
     275  fitOptions->covarFactor   = 1.0;
     276
     277  // save the original model, modify params
     278  pmModel *guess = pmModelCopy (source->modelEXT);
     279  if (fitOptions->mode == PM_SOURCE_FIT_PSF) {
     280    guess->params->data.F32[1] *= 0.9;
     281    guess->params->data.F32[2] += 1.0;
     282    guess->params->data.F32[3] -= 1.0;
     283  }
     284  if (fitOptions->mode == PM_SOURCE_FIT_EXT) {
     285    guess->params->data.F32[1] *= 0.9;
     286    guess->params->data.F32[4] *= 0.9;
     287    guess->params->data.F32[5] *= 0.9;
     288  }
     289
     290  // use maskVal to exclude pixels outside the circle
     291  psImageKeepCircle (source->maskObj, 50, 50, radius, "OR", maskVal);
     292
     293  // I need to use psTrace to get verbosity from the fit...
     294  bool status = pmSourceFitModel (source, guess, fitOptions, maskVal);
     295  if (!status) {
     296    psFree (rnd);
     297    psFree (source);
     298    psFree (guess);
     299    psFree (fitOptions);
     300    fprintf (stderr, "failed\n");
     301    return false;
     302  }
     303  psImageMaskPixels (source->maskObj, "AND", PS_NOT_IMAGE_MASK(maskVal));
     304
     305  psFree (rnd);
     306  psFree (source);
     307  psFree (guess);
     308  psFree (fitOptions);
     309
     310  return true;
     311}
Note: See TracChangeset for help on using the changeset viewer.