Changeset 27791
- Timestamp:
- Apr 28, 2010, 12:13:30 PM (16 years ago)
- Location:
- branches/pap/archive/variance_covariance
- Files:
-
- 1 added
- 1 moved
-
simulate.c (moved) (moved from branches/pap/archive/variance_covariance/stack.c ) (5 diffs)
-
sub.subkernel (added)
Legend:
- Unmodified
- Added
- Removed
-
branches/pap/archive/variance_covariance/simulate.c
r27787 r27791 7 7 #define SKY_SIZE 1000 8 8 #define SIZE 1024 9 #define OUTPUT_ROOT " stack"9 #define OUTPUT_ROOT "test" 10 10 #define SCALE 0.654321 11 11 #define ROT M_PI_2 12 12 #define INTERPOLATION PS_INTERPOLATE_LANCZOS3 13 13 #define OFFSET 16 14 #define SMOOTH_SIGMA 6.54321 15 #define SMOOTH_N_SIGMA 2.0 16 #define DUAL_KERNEL "sub.subkernel" 14 17 15 18 static const float variances[] = { 3.0, 10.0, 30.0, 100.0, 300.0, 1000.0, 3000.0, 10000.0 }; … … 21 24 "test.29.kernel", "test.35.kernel", "test.41.kernel", "test.47.kernel" }; 22 25 23 void warp(psImage **outImage, psImage **outMask, psImage **outVariance, psKernel **outCovar,24 const psImage *inImage, const psImage *inMask, const psImage *inVariance, const psKernel *inCovar)25 {26 psImageInterpolation *interp = psImageInterpolationAlloc(INTERPOLATION, inImage,27 inVariance, inMask, 0xFF,28 NAN, NAN, 0xF0, 0x0F, 0.1,29 1000);30 *outImage = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_F32);31 *outMask = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_IMAGE_MASK);32 *outVariance = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_F32);33 34 psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS);35 float xOffset = psRandomUniform(rng) * 2 * OFFSET - OFFSET;36 float yOffset = psRandomUniform(rng) * 2 * OFFSET - OFFSET;37 for (int y = 0; y < SKY_SIZE; y++) {38 for (int x = 0; x < SKY_SIZE; x++) {39 float xIn = SCALE * ((x - SKY_SIZE/2) * cos(ROT) + (y - SKY_SIZE/2) * sin(ROT)) + DET_SIZE / 2 + xOffset;40 float yIn = SCALE * ((x - SKY_SIZE/2) * -sin(ROT) + (y - SKY_SIZE/2) * cos(ROT)) + DET_SIZE / 2 + yOffset;41 42 double img, var;43 psImageMaskType msk;44 psImageInterpolate(&img, &var, &msk, xIn, yIn, interp);45 46 (*outImage)->data.F32[y][x] = img;47 (*outVariance)->data.F32[y][x] = var;48 (*outMask)->data.PS_TYPE_IMAGE_MASK_DATA[y][x] = isfinite(img) || isfinite(var) ? msk : 0xFF;49 }50 }51 52 psArray *covariances = psArrayAlloc(1000);53 for (int i = 0; i < covariances->n; i++) {54 psKernel *kernel = psImageInterpolationKernel(psRandomUniform(rng), psRandomUniform(rng),55 INTERPOLATION);56 covariances->data[i] = psImageCovarianceCalculate(kernel, inCovar);57 psFree(kernel);58 }59 psFree(rng);60 psKernel *avgCovar = psImageCovarianceAverage(covariances);61 psFree(covariances);62 *outCovar = psImageCovarianceScale(avgCovar, SCALE);63 psFree(avgCovar);64 }65 26 66 27 void writeImage(const psImage *image, const char *suffix) … … 143 104 } 144 105 106 void phot(psImage *image, psImage *mask, psImage *variance, psKernel *covar) 107 { 108 psImage *smoothImage = psImageCopy(NULL, image, PS_TYPE_F32); 109 psImageSmoothMask(smoothImage, smoothImage, mask, 0xFF, SMOOTH_SIGMA, SMOOTH_N_SIGMA, 0.1); 110 psImage *smoothVariance = psImageCopy(NULL, variance, PS_TYPE_F32); 111 psImageSmoothMask(smoothVariance, smoothVariance, mask, 0xFF, 112 SMOOTH_SIGMA * M_SQRT1_2, SMOOTH_N_SIGMA, 0.1); 113 int extent = SMOOTH_SIGMA * SMOOTH_N_SIGMA + 0.5; 114 psImage *smoothMask = psImageConvolveMask(NULL, mask, 0xFF, 0xFF, -extent, extent, -extent, extent); 115 116 psKernel *kernel = psImageSmoothKernel(SMOOTH_SIGMA, SMOOTH_N_SIGMA); // Kernel used for smoothing 117 psKernel *smoothCovar = psImageCovarianceCalculate(kernel, covar); 118 psFree(kernel); 119 psImageCovarianceTransfer(smoothVariance, smoothCovar); 120 121 fprintf(stderr, "Phot: S/N: %f Covar: %f Var: %f\n", 122 signoise(smoothImage, smoothMask, smoothVariance, smoothCovar), 123 psImageCovarianceFactor(smoothCovar), 124 meanVar(smoothVariance, smoothMask, smoothCovar)); 125 126 psFree(smoothImage); 127 psFree(smoothMask); 128 psFree(smoothVariance); 129 psFree(smoothCovar); 130 } 131 132 void stack(psImage **stackImage, psImage **stackMask, psImage **stackVariance, psKernel **stackCovar, 133 psArray *readouts) 134 { 135 int num = readouts->n; 136 psArray *covars = psArrayAlloc(num); 137 psVector *weights = psVectorAlloc(num, PS_TYPE_F32); 138 for (int i = 0; i < num; i++) { 139 pmReadout *ro = readouts->data[i]; 140 weights->data.F32[i] = 1.0 / meanVar(ro->variance, ro->mask, ro->covariance); 141 covars->data[i] = psMemIncrRefCounter(ro->covariance); 142 } 143 144 *stackImage = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_F32); 145 *stackMask = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_IMAGE_MASK); 146 *stackVariance = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_F32); 147 for (int y = 0; y < SKY_SIZE; y++) { 148 for (int x = 0; x < SKY_SIZE; x++) { 149 double sumValueWeight = 0.0; 150 double sumWeight = 0.0; 151 double sumVarianceWeight = 0.0; 152 for (int i = 0; i < readouts->n; i++) { 153 pmReadout *ro = readouts->data[i]; 154 sumValueWeight += ro->image->data.F32[y][x] * weights->data.F32[i]; 155 sumWeight += weights->data.F32[i]; 156 sumVarianceWeight += ro->variance->data.F32[y][x] * PS_SQR(weights->data.F32[i]); 157 } 158 (*stackImage)->data.F32[y][x] = sumValueWeight / sumWeight; 159 (*stackVariance)->data.F32[y][x] = sumVarianceWeight / PS_SQR(sumWeight); 160 (*stackMask)->data.PS_TYPE_IMAGE_MASK_DATA[y][x] = (isfinite((*stackImage)->data.F32[y][x]) && isfinite((*stackVariance)->data.F32[y][x])) ? 0x00 : 0xFF; 161 } 162 } 163 164 *stackCovar = psImageCovarianceAverageWeighted(covars, weights); 165 psFree(weights); 166 psFree(covars); 167 } 168 169 void diff(psImage **diffImage, psImage **diffMask, psImage **diffVariance, psKernel **diffCovar, 170 const psImage *image1, const psImage *mask1, const psImage *variance1, const psKernel *covar1, 171 const psImage *image2, const psImage *mask2, const psImage *variance2, const psKernel *covar2) 172 { 173 *diffImage = (psImage*)psBinaryOp(NULL, (psPtr)image1, "-", (psPtr)image2); 174 *diffMask = (psImage*)psBinaryOp(NULL, (psPtr)mask1, "|", (psPtr)mask2); 175 *diffVariance = (psImage*)psBinaryOp(NULL, (psPtr)variance1, "+", (psPtr)variance2); 176 psArray *covars = psArrayAlloc(2); 177 covars->data[0] = psMemIncrRefCounter((psPtr)covar1); 178 covars->data[1] = psMemIncrRefCounter((psPtr)covar2); 179 psVector *weights = psVectorAlloc(2, PS_TYPE_F32); 180 weights->data.F32[0] = meanVar(variance1, mask1, covar1); 181 weights->data.F32[1] = meanVar(variance2, mask2, covar2); 182 *diffCovar = psImageCovarianceAverageWeighted(covars, weights); 183 psFree(covars); 184 psFree(weights); 185 } 186 187 188 void warp(psImage **outImage, psImage **outMask, psImage **outVariance, psKernel **outCovar, 189 const psImage *inImage, const psImage *inMask, const psImage *inVariance, const psKernel *inCovar) 190 { 191 psImageInterpolation *interp = psImageInterpolationAlloc(INTERPOLATION, inImage, 192 inVariance, inMask, 0xFF, 193 NAN, NAN, 0xF0, 0x0F, 0.1, 194 1000); 195 *outImage = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_F32); 196 *outMask = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_IMAGE_MASK); 197 *outVariance = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_F32); 198 199 psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS); 200 float xOffset = psRandomUniform(rng) * 2 * OFFSET - OFFSET; 201 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; 209 psImageInterpolate(&img, &var, &msk, xIn, yIn, interp); 210 211 (*outImage)->data.F32[y][x] = img; 212 (*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++) { 219 psKernel *kernel = psImageInterpolationKernel(psRandomUniform(rng), psRandomUniform(rng), 220 INTERPOLATION); 221 covariances->data[i] = psImageCovarianceCalculate(kernel, inCovar); 222 psFree(kernel); 223 } 224 psFree(rng); 225 psKernel *avgCovar = psImageCovarianceAverage(covariances); 226 psFree(covariances); 227 *outCovar = psImageCovarianceScale(avgCovar, SCALE); 228 psFree(avgCovar); 229 } 145 230 146 231 int main(int argc, char *argv[]) 147 232 { 148 233 psArray *readouts = psArrayAlloc(NUM); 149 psArray *covars = psArrayAlloc(NUM);150 psVector *weights = psVectorAlloc(NUM, PS_TYPE_F32);151 234 psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS); 152 235 for (int i = 0; i < NUM; i++) { … … 206 289 meanVar(warpVariance, warpMask, warpCovar)); 207 290 291 phot(warpImage, warpMask, warpVariance, warpCovar); 292 208 293 pmReadout *ro = pmReadoutAlloc(NULL); 209 294 ro->image = warpImage; … … 238 323 meanVar(conv->variance, conv->mask, conv->covariance)); 239 324 240 weights->data.F32[i] = 1.0 / meanVar(conv->variance, conv->mask, conv->covariance); 241 242 covars->data[i] = psMemIncrRefCounter(conv->covariance); 325 phot(conv->image, conv->mask, conv->variance, conv->covariance); 243 326 readouts->data[i] = conv; 244 327 } 245 328 246 psImage *stackImage = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_F32); 247 psImage *stackMask = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_IMAGE_MASK); 248 psImage *stackVariance = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_F32); 249 for (int y = 0; y < SKY_SIZE; y++) { 250 for (int x = 0; x < SKY_SIZE; x++) { 251 double sumValueWeight = 0.0; 252 double sumWeight = 0.0; 253 double sumVarianceWeight = 0.0; 254 for (int i = 0; i < NUM; i++) { 255 pmReadout *ro = readouts->data[i]; 256 sumValueWeight += ro->image->data.F32[y][x] * weights->data.F32[i]; 257 sumWeight += weights->data.F32[i]; 258 sumVarianceWeight += ro->variance->data.F32[y][x] * PS_SQR(weights->data.F32[i]); 329 { 330 pmReadout *minuend = readouts->data[0]; 331 pmReadout *subtrahend = readouts->data[readouts->n - 1]; 332 psImage *diffImage = NULL, *diffMask = NULL, *diffVariance = NULL; 333 psKernel *diffCovar = NULL; 334 diff(&diffImage, &diffMask, &diffVariance, &diffCovar, 335 minuend->image, minuend->mask, minuend->variance, minuend->covariance, 336 subtrahend->image, subtrahend->mask, subtrahend->variance, subtrahend->covariance); 337 psImageCovarianceTransfer(diffVariance, diffCovar); 338 fprintf(stderr, "WW Diff Image: S/N: %f Covar: %f Var: %f\n", 339 signoise(diffImage, diffMask, diffVariance, diffCovar), 340 psImageCovarianceFactor(diffCovar), 341 meanVar(diffVariance, diffMask, diffCovar)); 342 343 writeImage(diffImage, "wwdiff.image.fits"); 344 writeImage(diffMask, "wwdiff.mask.fits"); 345 writeImage(diffVariance, "wwdiff.variance.fits"); 346 writeImage(diffCovar->image, "wwdiff.covar.fits"); 347 348 psFree(diffImage); 349 psFree(diffMask); 350 psFree(diffVariance); 351 psFree(diffCovar); 352 } 353 354 // stack-stack diff 355 { 356 psArray *readouts1 = psArrayAllocEmpty(NUM); 357 psArray *readouts2 = psArrayAllocEmpty(NUM); 358 for (int i = 0; i < NUM; i++) { 359 if (i <= NUM / 2) { 360 psArrayAdd(readouts1, 0, readouts->data[i]); 361 } else { 362 psArrayAdd(readouts2, 0, readouts->data[i]); 259 363 } 260 stackImage->data.F32[y][x] = sumValueWeight / sumWeight; 261 stackVariance->data.F32[y][x] = sumVarianceWeight / PS_SQR(sumWeight); 262 stackMask->data.PS_TYPE_IMAGE_MASK_DATA[y][x] = (isfinite(stackImage->data.F32[y][x]) && isfinite(stackVariance->data.F32[y][x])) ? 0x00 : 0xFF; 263 } 264 } 265 266 psKernel *stackCovar = psImageCovarianceAverageWeighted(covars, weights); 267 psFree(weights); 268 psFree(covars); 269 psFree(readouts); 270 271 psImageCovarianceTransfer(stackVariance, stackCovar); 272 273 writeImage(stackImage, "image.fits"); 274 writeImage(stackMask, "mask.fits"); 275 writeImage(stackVariance, "variance.fits"); 276 writeImage(stackCovar->image, "covar.fits"); 277 278 fprintf(stderr, "Stack: S/N: %f Covar: %f Var: %f\n", 279 signoise(stackImage, stackMask, stackVariance, stackCovar), 280 psImageCovarianceFactor(stackCovar), 281 meanVar(stackVariance, stackMask, stackCovar)); 282 283 float smoothSigma = 6.680111; 284 float smoothNsigma = 2.000000; 285 286 psKernel *kernel = psImageSmoothKernel(smoothSigma, smoothNsigma); // Kernel used for smoothing 287 288 psKernel *smoothCovar = psImageCovarianceCalculate(kernel, stackCovar); 289 psImage *smoothImage = psImageCopy(NULL, stackImage, PS_TYPE_F32); 290 psImageSmoothMask(smoothImage, smoothImage, stackMask, 0xFF, 291 smoothSigma, smoothNsigma, 0.1); 292 psImage *smoothVariance = psImageCopy(NULL, stackVariance, PS_TYPE_F32); 293 psImageSmoothMask(smoothVariance, smoothVariance, stackMask, 0xFF, 294 smoothSigma * M_SQRT1_2, smoothNsigma, 0.1); 295 int extent = smoothSigma * smoothNsigma + 0.5; 296 psImage *smoothMask = psImageConvolveMask(NULL, stackMask, 0xFF, 0xFF, -extent, extent, -extent, extent); 297 298 psImageCovarianceTransfer(smoothVariance, smoothCovar); 299 300 fprintf(stderr, "Smoothed: S/N: %f Covar: %f Var: %f\n", 301 signoise(smoothImage, smoothMask, smoothVariance, smoothCovar), 302 psImageCovarianceFactor(smoothCovar), 303 meanVar(smoothVariance, smoothMask, smoothCovar)); 304 305 psFree(stackImage); 306 psFree(stackMask); 307 psFree(stackVariance); 308 psFree(stackCovar); 309 310 psFree(smoothImage); 311 psFree(smoothMask); 312 psFree(smoothVariance); 313 psFree(smoothCovar); 314 } 364 } 365 366 psImage *stackImage1 = NULL, *stackMask1 = NULL, *stackVariance1 = NULL; 367 psKernel *stackCovar1 = NULL; 368 psImage *stackImage2 = NULL, *stackMask2 = NULL, *stackVariance2 = NULL; 369 psKernel *stackCovar2 = NULL; 370 stack(&stackImage1, &stackMask1, &stackVariance1, &stackCovar1, readouts1); 371 stack(&stackImage2, &stackMask2, &stackVariance2, &stackCovar2, readouts2); 372 psFree(readouts1); 373 psFree(readouts2); 374 psImageCovarianceTransfer(stackVariance1, stackCovar1); 375 psImageCovarianceTransfer(stackVariance2, stackCovar2); 376 fprintf(stderr, "Stack 1: S/N: %f Covar: %f Var: %f\n", 377 signoise(stackImage1, stackMask1, stackVariance1, stackCovar1), 378 psImageCovarianceFactor(stackCovar1), 379 meanVar(stackVariance1, stackMask1, stackCovar1)); 380 fprintf(stderr, "Stack 2: S/N: %f Covar: %f Var: %f\n", 381 signoise(stackImage2, stackMask2, stackVariance2, stackCovar2), 382 psImageCovarianceFactor(stackCovar2), 383 meanVar(stackVariance2, stackMask2, stackCovar2)); 384 phot(stackImage1, stackMask1, stackVariance1, stackCovar1); 385 phot(stackImage2, stackMask2, stackVariance2, stackCovar2); 386 387 pmReadout *stack1 = pmReadoutAlloc(NULL); 388 pmReadout *stack2 = pmReadoutAlloc(NULL); 389 stack1->image = stackImage1; 390 stack1->mask = stackMask1; 391 stack1->variance = stackVariance1; 392 stack1->covariance = stackCovar1; 393 stack2->image = stackImage2; 394 stack2->mask = stackMask2; 395 stack2->variance = stackVariance2; 396 stack2->covariance = stackCovar2; 397 398 psFits *fits = psFitsOpen(DUAL_KERNEL, "r"); 399 pmReadoutReadSubtractionKernels(stack1, fits); 400 psFitsClose(fits); 401 pmSubtractionKernels *kernel = psMetadataLookupPtr(NULL, stack1->analysis, 402 PM_SUBTRACTION_ANALYSIS_KERNEL); 403 kernel->xMax = SKY_SIZE; 404 kernel->yMax = SKY_SIZE; 405 406 pmReadout *convStack1 = pmReadoutAlloc(NULL); 407 pmReadout *convStack2 = pmReadoutAlloc(NULL); 408 convStack1->image = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_F32); 409 convStack1->mask = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_IMAGE_MASK); 410 convStack1->variance = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_F32); 411 convStack2->image = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_F32); 412 convStack2->mask = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_IMAGE_MASK); 413 convStack2->variance = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_F32); 414 415 if (!pmSubtractionMatchPrecalc(convStack1, convStack2, stack1, stack2, stack1->analysis, 416 32, 0.0, 0.001, 0xFF, 0xF0, 0x0F, 0.1, 1.0)) { 417 psErrorStackPrint(stderr, "Error:"); 418 exit(1); 419 } 420 psFree(stack1); 421 psFree(stack2); 422 423 psImageCovarianceTransfer(convStack1->variance, convStack1->covariance); 424 psImageCovarianceTransfer(convStack2->variance, convStack2->covariance); 425 426 fprintf(stderr, "Conv stack 1: S/N: %f Covar: %f Var: %f\n", 427 signoise(convStack1->image, convStack1->mask, convStack1->variance, convStack1->covariance), 428 psImageCovarianceFactor(convStack1->covariance), 429 meanVar(convStack1->variance, convStack1->mask, convStack1->covariance)); 430 fprintf(stderr, "Conv stack 2: S/N: %f Covar: %f Var: %f\n", 431 signoise(convStack2->image, convStack2->mask, convStack2->variance, convStack2->covariance), 432 psImageCovarianceFactor(convStack2->covariance), 433 meanVar(convStack2->variance, convStack2->mask, convStack2->covariance)); 434 435 psImage *diffImage = NULL, *diffMask = NULL, *diffVariance = NULL; 436 psKernel *diffCovar = NULL; 437 diff(&diffImage, &diffMask, &diffVariance, &diffCovar, 438 convStack1->image, convStack1->mask, convStack1->variance, convStack1->covariance, 439 convStack2->image, convStack2->mask, convStack2->variance, convStack2->covariance); 440 psImageCovarianceTransfer(diffVariance, diffCovar); 441 fprintf(stderr, "SS Diff Image: S/N: %f Covar: %f Var: %f\n", 442 signoise(diffImage, diffMask, diffVariance, diffCovar), 443 psImageCovarianceFactor(diffCovar), 444 meanVar(diffVariance, diffMask, diffCovar)); 445 446 writeImage(diffImage, "ssdiff.image.fits"); 447 writeImage(diffMask, "ssdiff.mask.fits"); 448 writeImage(diffVariance, "ssdiff.variance.fits"); 449 writeImage(diffCovar->image, "ssdiff.covar.fits"); 450 451 phot(diffImage, diffMask, diffVariance, diffCovar); 452 453 psFree(diffImage); 454 psFree(diffMask); 455 psFree(diffVariance); 456 psFree(diffCovar); 457 458 psFree(convStack1); 459 psFree(convStack2); 460 } 461 462 // Full stack and warp-stack diff 463 { 464 psImage *stackImage = NULL, *stackMask = NULL, *stackVariance = NULL; 465 psKernel *stackCovar = NULL; 466 stack(&stackImage, &stackMask, &stackVariance, &stackCovar, readouts); 467 psImageCovarianceTransfer(stackVariance, stackCovar); 468 469 writeImage(stackImage, "stack.image.fits"); 470 writeImage(stackMask, "stack.mask.fits"); 471 writeImage(stackVariance, "stack.variance.fits"); 472 writeImage(stackCovar->image, "stack.covar.fits"); 473 474 fprintf(stderr, "Stack: S/N: %f Covar: %f Var: %f\n", 475 signoise(stackImage, stackMask, stackVariance, stackCovar), 476 psImageCovarianceFactor(stackCovar), 477 meanVar(stackVariance, stackMask, stackCovar)); 478 479 phot(stackImage, stackMask, stackVariance, stackCovar); 480 481 pmReadout *stack = pmReadoutAlloc(NULL); 482 stack->image = stackImage; 483 stack->mask = stackMask; 484 stack->variance = stackVariance; 485 stack->covariance = stackCovar; 486 487 psFits *fits = psFitsOpen(DUAL_KERNEL, "r"); 488 pmReadoutReadSubtractionKernels(stack, fits); 489 psFitsClose(fits); 490 pmSubtractionKernels *kernel = psMetadataLookupPtr(NULL, stack->analysis, 491 PM_SUBTRACTION_ANALYSIS_KERNEL); 492 kernel->xMax = SKY_SIZE; 493 kernel->yMax = SKY_SIZE; 494 495 pmReadout *warp = readouts->data[readouts->n - 1]; 496 pmReadout *convStack = pmReadoutAlloc(NULL); 497 pmReadout *convWarp = pmReadoutAlloc(NULL); 498 convStack->image = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_F32); 499 convStack->mask = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_IMAGE_MASK); 500 convStack->variance = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_F32); 501 convWarp->image = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_F32); 502 convWarp->mask = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_IMAGE_MASK); 503 convWarp->variance = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_F32); 504 505 if (!pmSubtractionMatchPrecalc(convStack, convWarp, stack, warp, stack->analysis, 506 32, 0.0, 0.001, 0xFF, 0xF0, 0x0F, 0.1, 1.0)) { 507 psErrorStackPrint(stderr, "Error:"); 508 exit(1); 509 } 510 psFree(stack); 511 psFree(readouts); 512 513 psImageCovarianceTransfer(convStack->variance, convStack->covariance); 514 psImageCovarianceTransfer(convWarp->variance, convWarp->covariance); 515 516 fprintf(stderr, "Conv stack: S/N: %f Covar: %f Var: %f\n", 517 signoise(convStack->image, convStack->mask, convStack->variance, convStack->covariance), 518 psImageCovarianceFactor(convStack->covariance), 519 meanVar(convStack->variance, convStack->mask, convStack->covariance)); 520 fprintf(stderr, "Conv warp: S/N: %f Covar: %f Var: %f\n", 521 signoise(convWarp->image, convWarp->mask, convWarp->variance, convWarp->covariance), 522 psImageCovarianceFactor(convWarp->covariance), 523 meanVar(convWarp->variance, convWarp->mask, convWarp->covariance)); 524 525 psImage *diffImage = NULL, *diffMask = NULL, *diffVariance = NULL; 526 psKernel *diffCovar = NULL; 527 diff(&diffImage, &diffMask, &diffVariance, &diffCovar, 528 convStack->image, convStack->mask, convStack->variance, convStack->covariance, 529 convWarp->image, convWarp->mask, convWarp->variance, convWarp->covariance); 530 psFree(convStack); 531 psFree(convWarp); 532 psImageCovarianceTransfer(diffVariance, diffCovar); 533 fprintf(stderr, "WS Diff Image: S/N: %f Covar: %f Var: %f\n", 534 signoise(diffImage, diffMask, diffVariance, diffCovar), 535 psImageCovarianceFactor(diffCovar), 536 meanVar(diffVariance, diffMask, diffCovar)); 537 538 writeImage(diffImage, "wsdiff.image.fits"); 539 writeImage(diffMask, "wsdiff.mask.fits"); 540 writeImage(diffVariance, "wsdiff.variance.fits"); 541 writeImage(diffCovar->image, "wsdiff.covar.fits"); 542 543 phot(diffImage, diffMask, diffVariance, diffCovar); 544 545 psFree(diffImage); 546 psFree(diffMask); 547 psFree(diffVariance); 548 psFree(diffCovar); 549 } 550 551 }
Note:
See TracChangeset
for help on using the changeset viewer.
