Changeset 41175
- Timestamp:
- Nov 27, 2019, 12:07:48 PM (6 years ago)
- Location:
- trunk/psModules/test/objects
- Files:
-
- 2 edited
- 1 copied
-
Makefile.am (modified) (1 diff)
-
tap_pmSourceFitModel.c (modified) (11 diffs)
-
tap_pmSourceFitModelBasic.c (copied) (copied from branches/eam_branches/ipp-20191011/psModules/test/objects/tap_pmSourceFitModelBasic.c )
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/test/objects/Makefile.am
r38280 r41175 12 12 13 13 TEST_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 38 40 39 41 if BUILD_TESTS -
trunk/psModules/test/objects/tap_pmSourceFitModel.c
r23259 r41175 7 7 #include "pstap.h" 8 8 9 # define SKY_NOISE 10.0 10 # define READ_NOISE 0.0 11 9 12 bool fitModels (psRandom *seed, float flux, float radius, float sigma); 10 13 bool fitModelFlux (psRandom *seed, float flux, float radius, float sigma); 14 bool fitModelFluxOne (psRandom *seed, float flux, float radius, float sigma); 11 15 12 16 // tests to check accuracy of fitted models for a range of fit radii, sigma, and flux. … … 18 22 int main (void) 19 23 { 20 pmModel GroupInit ();21 pmSourceFitModelInit (15, 0.01, 1.0, true);24 pmModelClassInit (); 25 // pmSourceFitModelInit (15, 0.01, 1.0, true); 22 26 23 27 // psTraceSetLevel ("psModules.objects.pmSourceFitModel", 10); 24 // psTraceSetLevel ("psLib.math.psMinimizeLMChi2 ", 10);28 // psTraceSetLevel ("psLib.math.psMinimizeLMChi2_Alt", 5); 25 29 26 30 plan_tests(240); … … 28 32 // build a gauss-deviate vector (mean = 0.0, sigma = 1.0) 29 33 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(); 30 38 31 39 static float radius[] = {3.0, 5.0, 7.0, 10.0, 15.0, 25.0}; … … 36 44 bool status = fitModels (seed, 10000.0, 10.0, 2.0); 37 45 skip_start (!status, 240, "*** BASIC MODEL FITTING FAILS! *** : skipping related tests"); 46 // exit (1); 38 47 39 48 for (int i = 0; i < sizeof(sigma)/sizeof(float); i++) { … … 74 83 75 84 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))); 77 86 float dMag = noise / signal; 78 87 float dPos = sigma * dMag; … … 84 93 psStats *stats = psStatsAlloc (PS_STAT_SAMPLE_MEAN | PS_STAT_SAMPLE_STDEV); 85 94 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); 87 96 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); 89 98 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); 91 100 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); 93 102 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); 95 104 96 105 psFree (par1); … … 107 116 bool fitModelFlux (psRandom *seed, float flux, float radius, float sigma) 108 117 { 118 119 psImageMaskType maskVal = 0x01; 109 120 110 121 psVector *rnd = psVectorAlloc (1000, PS_TYPE_F32); … … 128 139 source->modelEXT->params->data.F32[6] = 0; 129 140 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); 133 144 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); 136 147 137 148 // 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); 139 150 int npix = 0; 140 151 for (int j = 0; j < source->pixels->numRows; j++) { 141 152 for (int i = 0; i < source->pixels->numCols; i++) { 142 153 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); 144 155 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; 146 157 npix ++; 147 158 if (npix == rnd->n) … … 154 165 // psFitsClose (fits); 155 166 167 pmSourceFitOptions *fitOptions = pmSourceFitOptionsAlloc(); 168 fitOptions->mode = PM_SOURCE_FIT_PSF; 169 fitOptions->covarFactor = 1.0; 170 156 171 // save the original model, modify params 157 172 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]); 166 189 if (!status) { 167 190 psFree (rnd); … … 170 193 return false; 171 194 } 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]); 175 199 par2->data.F32[par2->n] = (source->modelEXT->params->data.F32[2] - guess->params->data.F32[2]); 176 200 par3->data.F32[par3->n] = (source->modelEXT->params->data.F32[3] - guess->params->data.F32[3]); … … 187 211 psFree (source); 188 212 psFree (guess); 213 psFree (fitOptions); 189 214 190 215 return true; 191 216 } 217 218 bool 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.
