Changeset 28159
- Timestamp:
- May 28, 2010, 12:04:26 PM (16 years ago)
- File:
-
- 1 edited
-
trunk/archive/noise_model/simulate.c (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/archive/noise_model/simulate.c
r28006 r28159 10 10 #define SCALE 0.654321 11 11 #define ROT M_PI_2 12 #define INTERPOLATION PS_INTERPOLATE_LANCZOS 312 #define INTERPOLATION PS_INTERPOLATE_LANCZOS4 13 13 #define OFFSET 16 14 14 #define SMOOTH_SIGMA 6.54321 15 15 #define SMOOTH_N_SIGMA 2.0 16 16 #define DUAL_KERNEL "sub.subkernel" 17 #define WARP_NUM 10000 17 18 18 19 static const float variances[] = { 3.0, 10.0, 30.0, 100.0, 300.0, 1000.0, 3000.0, 10000.0 }; … … 94 95 } 95 96 } 96 psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS); 97 psStats *stats = psStatsAlloc(PS_STAT_ROBUST_STDEV); 98 psImageBackground(stats, NULL, sn, mask, 0xFF, rng); 99 float noise = stats->robustStdev; 97 psStats *stats = psStatsAlloc(PS_STAT_SAMPLE_STDEV); 98 psImageStats(stats, sn, mask, 0xFF); 99 float noise = stats->sampleStdev; 100 100 psFree(stats); 101 psFree(rng); 101 102 psHistogram *hist = psHistogramAlloc(-5, +5, 1001); 103 psVector *data = psVectorAlloc(sn->numCols * sn->numRows, PS_TYPE_F32); 104 psVector *dataMask = psVectorAlloc(sn->numCols * sn->numRows, PS_TYPE_VECTOR_MASK); 105 psVectorInit(dataMask, 0); 106 long num = 0; 107 for (int y = 0, i = 0; y < sn->numRows; y++) { 108 for (int x = 0; x < sn->numCols; x++, i++) { 109 data->data.F32[i] = sn->data.F32[y][x]; 110 if (mask->data.PS_TYPE_IMAGE_MASK_DATA[y][x]) { 111 dataMask->data.PS_TYPE_VECTOR_MASK_DATA[i] = 0xFF; 112 } else { 113 num++; 114 } 115 } 116 } 117 psVectorHistogram(hist, data, NULL, dataMask, 0xFF); 118 psFree(data); 119 psFree(dataMask); 102 120 psFree(sn); 121 122 static int number = 0; 123 psString name = NULL; 124 fprintf(stderr, "Writing histogram %d\n", number); 125 psStringAppend(&name, "hist_%d.dat", number++); 126 FILE *file = fopen(name, "w"); 127 psFree(name); 128 fprintf(stderr, "# Sig Frac\n"); 129 for (int i = 0; i < hist->bounds->n - 1; i++) { 130 fprintf(file, "%f %f\n", 131 0.5 * (hist->bounds->data.F32[i] + hist->bounds->data.F32[i+1]), 132 hist->nums->data.F32[i] / num); 133 } 134 fclose(file); 135 psFree(hist); 136 103 137 return noise; 104 138 } 105 139 140 void convolve(psImage **smoothImage, psImage **smoothMask, psImage **smoothVariance, psKernel **smoothCovar, 141 const psImage *image, const psImage *mask, const psImage *variance, const psKernel *covar, 142 const psKernel *kernel) 143 { 144 psKernel *kernel2 = psKernelAlloc(kernel->xMin, kernel->xMax, kernel->yMin, kernel->yMax); 145 double sum = 0.0, sum2 = 0.0; 146 for (int y = kernel->yMin; y <= kernel->yMax; y++) { 147 for (int x = kernel->xMin; x <= kernel->xMax; x++) { 148 sum += kernel->kernel[y][x]; 149 sum2 += kernel2->kernel[y][x] = PS_SQR(kernel->kernel[y][x]); 150 } 151 } 152 for (int y = kernel->yMin; y <= kernel->yMax; y++) { 153 for (int x = kernel->xMin; x <= kernel->xMax; x++) { 154 kernel2->kernel[y][x] /= sum2; 155 } 156 } 157 *smoothImage = psImageConvolveDirect(NULL, image, kernel); 158 *smoothVariance = psImageConvolveDirect(NULL, variance, kernel2); 159 *smoothCovar = psImageCovarianceCalculate(kernel, covar); 160 *smoothMask = psImageCopy(NULL, mask, PS_TYPE_IMAGE_MASK); // Cheating 161 psFree(kernel2); 162 } 163 164 106 165 void phot(psImage *image, psImage *mask, psImage *variance, psKernel *covar) 107 166 { 167 #if 1 108 168 psImage *smoothImage = psImageCopy(NULL, image, PS_TYPE_F32); 169 psImage *smoothVariance = psImageCopy(NULL, variance, PS_TYPE_F32); 109 170 psImageSmoothMask(smoothImage, smoothImage, mask, 0xFF, SMOOTH_SIGMA, SMOOTH_N_SIGMA, 0.1); 110 psImage *smoothVariance = psImageCopy(NULL, variance, PS_TYPE_F32);111 171 psImageSmoothMask(smoothVariance, smoothVariance, mask, 0xFF, 112 SMOOTH_SIGMA * M_SQRT1_2, SMOOTH_N_SIGMA , 0.1);172 SMOOTH_SIGMA * M_SQRT1_2, SMOOTH_N_SIGMA / M_SQRT1_2, 0.1); 113 173 int extent = SMOOTH_SIGMA * SMOOTH_N_SIGMA + 0.5; 114 174 psImage *smoothMask = psImageConvolveMask(NULL, mask, 0xFF, 0xFF, -extent, extent, -extent, extent); … … 118 178 psFree(kernel); 119 179 psImageCovarianceTransfer(smoothVariance, smoothCovar); 180 #else 181 psKernel *kernel = psImageSmoothKernel(SMOOTH_SIGMA, SMOOTH_N_SIGMA); // Kernel used for smoothing 182 psKernel *kernel2 = psKernelAlloc(kernel->xMin, kernel->xMax, kernel->yMin, kernel->yMax); 183 double sum = 0.0, sum2 = 0.0; 184 for (int y = kernel->yMin; y <= kernel->yMax; y++) { 185 for (int x = kernel->xMin; x <= kernel->xMax; x++) { 186 sum += kernel->kernel[y][x]; 187 sum2 += kernel2->kernel[y][x] = PS_SQR(kernel->kernel[y][x]); 188 } 189 } 190 fprintf(stderr, "Kernel sum: %f %f\n", sum, sum2); 191 for (int y = kernel->yMin; y <= kernel->yMax; y++) { 192 for (int x = kernel->xMin; x <= kernel->xMax; x++) { 193 kernel2->kernel[y][x] /= sum2; 194 } 195 } 196 psImage *smoothImage = psImageConvolveDirect(NULL, image, kernel); 197 psImage *smoothVariance = psImageConvolveDirect(NULL, variance, kernel2); 198 psKernel *smoothCovar = psImageCovarianceCalculate(kernel, covar); 199 psImage *smoothMask = psImageCopy(NULL, mask, PS_TYPE_IMAGE_MASK); 200 #endif 120 201 121 202 fprintf(stderr, "Phot: S/N: %f Covar: %f Var: %f\n", … … 200 281 float xOffset = psRandomUniform(rng) * 2 * OFFSET - OFFSET; 201 282 float yOffset = psRandomUniform(rng) * 2 * OFFSET - OFFSET; 202 for (int y = 0; y < SKY_SIZE; y++) { 203 for (int x = 0; x < SKY_SIZE; x++) { 204 float xIn = SCALE * ((x - SKY_SIZE/2) * cos(ROT) + (y - SKY_SIZE/2) * sin(ROT)) + DET_SIZE / 2 + xOffset; 205 float yIn = SCALE * ((x - SKY_SIZE/2) * -sin(ROT) + (y - SKY_SIZE/2) * cos(ROT)) + DET_SIZE / 2 + yOffset; 206 207 double img, var; 208 psImageMaskType msk; 283 for (int y = 0, index = 0; y < SKY_SIZE; y++) { 284 float dy = y - SKY_SIZE/2; 285 for (int x = 0; x < SKY_SIZE; x++, index++) { 286 float dx = x - SKY_SIZE/2; 287 float xIn = SCALE * (dx * cos(ROT) + dy * sin(ROT)) + DET_SIZE / 2 + xOffset; 288 float yIn = SCALE * (dx * -sin(ROT) + dy * cos(ROT)) + DET_SIZE / 2 + yOffset; 289 290 #if 0 291 xIn += 0.12345e-6 * PS_SQR(dx); 292 yIn += 0.12345e-6 * PS_SQR(dy); 293 #endif 294 295 double img = NAN, var = NAN; 296 psImageMaskType msk = 0; 209 297 psImageInterpolate(&img, &var, &msk, xIn, yIn, interp); 210 298 211 299 (*outImage)->data.F32[y][x] = img; 212 300 (*outVariance)->data.F32[y][x] = var; 213 (*outMask)->data.PS_TYPE_IMAGE_MASK_DATA[y][x] = isfinite(img) || isfinite(var) ? msk : 0xFF; 214 } 215 } 216 217 psArray *covariances = psArrayAlloc(1000); 218 for (int i = 0; i < covariances->n; i++) { 301 (*outMask)->data.PS_TYPE_IMAGE_MASK_DATA[y][x] = isfinite(img) && isfinite(var) ? msk : 0xFF; 302 } 303 } 304 305 psArray *covariances = psArrayAlloc(WARP_NUM); 306 psVector *factors = psVectorAlloc(WARP_NUM, PS_TYPE_F32); 307 double mean = 0.0; 308 for (int i = 0; i < WARP_NUM; i++) { 219 309 psKernel *kernel = psImageInterpolationKernel(psRandomUniform(rng), psRandomUniform(rng), 220 310 INTERPOLATION); 221 covariances->data[i] = psImageCovarianceCalculate(kernel, inCovar);311 psKernel *covar = covariances->data[i] = psImageCovarianceCalculate(kernel, inCovar); 222 312 psFree(kernel); 313 mean += factors->data.F32[i] = psImageCovarianceFactor(covar); 223 314 } 224 315 psFree(rng); 225 316 psKernel *avgCovar = psImageCovarianceAverage(covariances); 226 317 psFree(covariances); 318 227 319 *outCovar = psImageCovarianceScale(avgCovar, SCALE); 228 320 psFree(avgCovar); 321 322 mean /= WARP_NUM; 323 324 double stdev = 0.0; 325 for (int i = 0; i < WARP_NUM; i++) { 326 stdev += PS_SQR(factors->data.F32[i] - mean); 327 } 328 stdev = sqrt(stdev/(WARP_NUM-1)); 329 fprintf(stderr, "Warp covariance mean: %f stdev: %f\n", mean, stdev); 330 psFree(factors); 229 331 } 230 332 … … 265 367 #endif 266 368 267 psImageCovarianceTransfer(inVariance, inCovar); 369 // psImageCovarianceTransfer(inVariance, inCovar); 370 371 { 372 psString imageName = NULL, maskName = NULL, varName = NULL; 373 psStringAppend(&imageName, "input.image.%d.fits", i); 374 psStringAppend(&maskName, "input.mask.%d.fits", i); 375 psStringAppend(&varName, "input.var.%d.fits", i); 376 writeImage(inImage, imageName); 377 writeImage(inMask, maskName); 378 writeImage(inVariance, varName); 379 psFree(imageName); 380 psFree(maskName); 381 psFree(varName); 382 } 268 383 269 384 fprintf(stderr, "Input image %d: S/N: %f Covar: %f Var: %f\n", … … 272 387 psImageCovarianceFactor(inCovar), 273 388 meanVar(inVariance, inMask, inCovar)); 389 390 phot(inImage, inMask, inVariance, inCovar); 274 391 275 392 psImage *warpImage = NULL, *warpMask = NULL, *warpVariance = NULL; … … 281 398 psFree(inCovar); 282 399 283 psImageCovarianceTransfer(warpVariance, warpCovar); 400 // psImageCovarianceTransfer(warpVariance, warpCovar); 401 402 { 403 psString imageName = NULL, maskName = NULL, varName = NULL, covarName = NULL; 404 psStringAppend(&imageName, "warp.image.%d.fits", i); 405 psStringAppend(&maskName, "warp.mask.%d.fits", i); 406 psStringAppend(&varName, "warp.var.%d.fits", i); 407 psStringAppend(&covarName, "warp.covar.%d.fits", i); 408 writeImage(warpImage, imageName); 409 writeImage(warpMask, maskName); 410 writeImage(warpVariance, varName); 411 writeImage(warpCovar->image, covarName); 412 psFree(imageName); 413 psFree(maskName); 414 psFree(varName); 415 psFree(covarName); 416 } 284 417 285 418 fprintf(stderr, "Warp image %d: S/N: %f Covar: %f Var: %f\n", … … 300 433 pmReadoutReadSubtractionKernels(ro, fits); 301 434 pmSubtractionKernels *kernels = psMetadataLookupPtr(NULL, ro->analysis, PM_SUBTRACTION_ANALYSIS_KERNEL); 435 #if 0 436 for (int i = 0; i < kernels->num; i++) { 437 for (int y = 0, index = i; y < kernels->spatialOrder; y++) { 438 for (int x = 0; x < kernels->spatialOrder - y; x++, index++) { 439 if (x != 0 && y != 0) { 440 if (kernels->solution1) { 441 kernels->solution1->data.F64[index] = 0.0; 442 } 443 if (kernels->solution2) { 444 kernels->solution2->data.F64[index] = 0.0; 445 } 446 } 447 } 448 } 449 } 450 #endif 451 302 452 kernels->xMax = SKY_SIZE; 303 453 kernels->yMax = SKY_SIZE; … … 305 455 306 456 pmReadout *conv = pmReadoutAlloc(NULL); 457 #if 1 307 458 conv->image = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_F32); 308 459 conv->mask = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_IMAGE_MASK); 309 460 conv->variance = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_F32); 310 if (!pmSubtractionMatchPrecalc(NULL, conv, NULL, ro, ro->analysis, 32, 0.0, 0.0 01,461 if (!pmSubtractionMatchPrecalc(NULL, conv, NULL, ro, ro->analysis, 32, 0.0, 0.01, 311 462 0xFF, 0xF0, 0x0F, 0.1, 1.0)) { 312 463 psErrorStackPrint(stderr, "Error:"); 313 464 exit(1); 314 465 } 466 #else 467 { 468 psKernel *kernel = pmSubtractionKernel(kernels, 0.0, 0.0, false); 469 convolve(&conv->image, &conv->mask, &conv->variance, &conv->covariance, 470 ro->image, ro->mask, ro->variance, ro->covariance, 471 kernel); 472 psFree(kernel); 473 } 474 #endif 315 475 psFree(ro); 316 476 317 psImageCovarianceTransfer(conv->variance, conv->covariance); 477 // psImageCovarianceTransfer(conv->variance, conv->covariance); 478 479 { 480 psString imageName = NULL, maskName = NULL, varName = NULL, covarName = NULL; 481 psStringAppend(&imageName, "conv.image.%d.fits", i); 482 psStringAppend(&maskName, "conv.mask.%d.fits", i); 483 psStringAppend(&varName, "conv.var.%d.fits", i); 484 psStringAppend(&covarName, "conv.covar.%d.fits", i); 485 writeImage(conv->image, imageName); 486 writeImage(conv->mask, maskName); 487 writeImage(conv->variance, varName); 488 writeImage(conv->covariance->image, covarName); 489 psFree(imageName); 490 psFree(maskName); 491 psFree(varName); 492 psFree(covarName); 493 } 318 494 319 495 fprintf(stderr, "Conv Image %d: S/N: %f Covar: %f Var: %f\n", … … 325 501 phot(conv->image, conv->mask, conv->variance, conv->covariance); 326 502 readouts->data[i] = conv; 503 327 504 } 328 505
Note:
See TracChangeset
for help on using the changeset viewer.
