IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 27791


Ignore:
Timestamp:
Apr 28, 2010, 12:13:30 PM (16 years ago)
Author:
Paul Price
Message:

Adding more simulations. The entire pipeline is more or less simulated, measuring the noise model at each stage.

Location:
branches/pap/archive/variance_covariance
Files:
1 added
1 moved

Legend:

Unmodified
Added
Removed
  • branches/pap/archive/variance_covariance/simulate.c

    r27787 r27791  
    77#define SKY_SIZE 1000
    88#define SIZE 1024
    9 #define OUTPUT_ROOT "stack"
     9#define OUTPUT_ROOT "test"
    1010#define SCALE 0.654321
    1111#define ROT M_PI_2
    1212#define INTERPOLATION PS_INTERPOLATE_LANCZOS3
    1313#define OFFSET 16
     14#define SMOOTH_SIGMA 6.54321
     15#define SMOOTH_N_SIGMA 2.0
     16#define DUAL_KERNEL "sub.subkernel"
    1417
    1518static const float variances[] = { 3.0, 10.0, 30.0, 100.0, 300.0, 1000.0, 3000.0, 10000.0 };
     
    2124                                 "test.29.kernel", "test.35.kernel", "test.41.kernel", "test.47.kernel" };
    2225
    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 }
    6526
    6627void writeImage(const psImage *image, const char *suffix)
     
    143104}
    144105
     106void 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
     132void 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
     169void 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
     188void 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}
    145230
    146231int main(int argc, char *argv[])
    147232{
    148233    psArray *readouts = psArrayAlloc(NUM);
    149     psArray *covars = psArrayAlloc(NUM);
    150     psVector *weights = psVectorAlloc(NUM, PS_TYPE_F32);
    151234    psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS);
    152235    for (int i = 0; i < NUM; i++) {
     
    206289                meanVar(warpVariance, warpMask, warpCovar));
    207290
     291        phot(warpImage, warpMask, warpVariance, warpCovar);
     292
    208293        pmReadout *ro = pmReadoutAlloc(NULL);
    209294        ro->image = warpImage;
     
    238323                meanVar(conv->variance, conv->mask, conv->covariance));
    239324
    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);
    243326        readouts->data[i] = conv;
    244327    }
    245328
    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]);
    259363            }
    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.