Changeset 41124 for branches/eam_branches/ipp-20191011
- Timestamp:
- Nov 10, 2019, 9:46:19 AM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/ipp-20191011/psModules/test/objects/tap_pmSourceFitModel.c
r40961 r41124 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. … … 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"); 38 exit (1);46 // exit (1); 39 47 40 48 for (int i = 0; i < sizeof(sigma)/sizeof(float); i++) { … … 75 83 76 84 float signal = 2*M_PI*sigma*sigma*flux; 77 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))); 78 86 float dMag = noise / signal; 79 87 float dPos = sigma * dMag; … … 85 93 psStats *stats = psStatsAlloc (PS_STAT_SAMPLE_MEAN | PS_STAT_SAMPLE_STDEV); 86 94 psVectorStats (stats, par1, NULL, NULL, 0); 87 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); 88 96 psVectorStats (stats, par2, NULL, NULL, 0); 89 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); 90 98 psVectorStats (stats, par3, NULL, NULL, 0); 91 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); 92 100 psVectorStats (stats, par4, NULL, NULL, 0); 93 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); 94 102 psVectorStats (stats, par5, NULL, NULL, 0); 95 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); 96 104 97 105 psFree (par1); … … 144 152 for (int i = 0; i < source->pixels->numCols; i++) { 145 153 float flux = source->pixels->data.F32[j][i]; 146 float var = flux + 100 + PS_SQR(5);154 float var = flux + PS_SQR(SKY_NOISE) + PS_SQR(READ_NOISE); 147 155 source->pixels->data.F32[j][i] += rnd->data.F32[npix]*sqrt(var); 148 156 source->variance->data.F32[j][i] = var; … … 157 165 // psFitsClose (fits); 158 166 167 pmSourceFitOptions *fitOptions = pmSourceFitOptionsAlloc(); 168 fitOptions->mode = PM_SOURCE_FIT_PSF; 169 fitOptions->covarFactor = 1.0; 170 159 171 // save the original model, modify params 160 172 pmModel *guess = pmModelCopy (source->modelEXT); 161 guess->params->data.F32[1] *= 0.9; 162 guess->params->data.F32[2] += 1.0; 163 guess->params->data.F32[3] -= 1.0; 164 guess->params->data.F32[4] *= 0.9; 165 guess->params->data.F32[5] *= 0.9; 166 167 pmSourceFitOptions *fitOptions = pmSourceFitOptionsAlloc(); 168 fitOptions->mode = PM_SOURCE_FIT_EXT; 169 fitOptions->covarFactor = 1.0; 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 } 170 183 171 184 // use maskVal to exclude pixels outside the circle … … 173 186 174 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]); 175 189 if (!status) { 176 190 psFree (rnd); … … 181 195 psImageMaskPixels (source->maskObj, "AND", PS_NOT_IMAGE_MASK(maskVal)); 182 196 183 par1->data.F32[par1->n] = (source->modelEXT->params->data.F32[1] / guess->params->data.F32[1]); 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]); 184 199 par2->data.F32[par2->n] = (source->modelEXT->params->data.F32[2] - guess->params->data.F32[2]); 185 200 par3->data.F32[par3->n] = (source->modelEXT->params->data.F32[3] - guess->params->data.F32[3]); … … 196 211 psFree (source); 197 212 psFree (guess); 213 psFree (fitOptions); 198 214 199 215 return true; 200 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.
