IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 28159


Ignore:
Timestamp:
May 28, 2010, 12:04:26 PM (16 years ago)
Author:
Paul Price
Message:

Bug fixes, getting ready for publication. Added histogram S/N ouput.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/archive/noise_model/simulate.c

    r28006 r28159  
    1010#define SCALE 0.654321
    1111#define ROT M_PI_2
    12 #define INTERPOLATION PS_INTERPOLATE_LANCZOS3
     12#define INTERPOLATION PS_INTERPOLATE_LANCZOS4
    1313#define OFFSET 16
    1414#define SMOOTH_SIGMA 6.54321
    1515#define SMOOTH_N_SIGMA 2.0
    1616#define DUAL_KERNEL "sub.subkernel"
     17#define WARP_NUM 10000
    1718
    1819static const float variances[] = { 3.0, 10.0, 30.0, 100.0, 300.0, 1000.0, 3000.0, 10000.0 };
     
    9495        }
    9596    }
    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;
    100100    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);
    102120    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
    103137    return noise;
    104138}
    105139
     140void 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
    106165void phot(psImage *image, psImage *mask, psImage *variance, psKernel *covar)
    107166{
     167#if 1
    108168    psImage *smoothImage = psImageCopy(NULL, image, PS_TYPE_F32);
     169    psImage *smoothVariance = psImageCopy(NULL, variance, PS_TYPE_F32);
    109170    psImageSmoothMask(smoothImage, smoothImage, mask, 0xFF, SMOOTH_SIGMA, SMOOTH_N_SIGMA, 0.1);
    110     psImage *smoothVariance = psImageCopy(NULL, variance, PS_TYPE_F32);
    111171    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);
    113173    int extent = SMOOTH_SIGMA * SMOOTH_N_SIGMA + 0.5;
    114174    psImage *smoothMask = psImageConvolveMask(NULL, mask, 0xFF, 0xFF, -extent, extent, -extent, extent);
     
    118178    psFree(kernel);
    119179    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
    120201
    121202    fprintf(stderr, "Phot: S/N: %f Covar: %f Var: %f\n",
     
    200281    float xOffset = psRandomUniform(rng) * 2 * OFFSET - OFFSET;
    201282    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;
    209297            psImageInterpolate(&img, &var, &msk, xIn, yIn, interp);
    210298
    211299            (*outImage)->data.F32[y][x] = img;
    212300            (*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++) {
    219309        psKernel *kernel = psImageInterpolationKernel(psRandomUniform(rng), psRandomUniform(rng),
    220310                                                      INTERPOLATION);
    221         covariances->data[i] = psImageCovarianceCalculate(kernel, inCovar);
     311        psKernel *covar = covariances->data[i] = psImageCovarianceCalculate(kernel, inCovar);
    222312        psFree(kernel);
     313        mean += factors->data.F32[i] = psImageCovarianceFactor(covar);
    223314    }
    224315    psFree(rng);
    225316    psKernel *avgCovar = psImageCovarianceAverage(covariances);
    226317    psFree(covariances);
     318
    227319    *outCovar = psImageCovarianceScale(avgCovar, SCALE);
    228320    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);
    229331}
    230332
     
    265367#endif
    266368
    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        }
    268383
    269384        fprintf(stderr, "Input image %d: S/N: %f Covar: %f Var: %f\n",
     
    272387                psImageCovarianceFactor(inCovar),
    273388                meanVar(inVariance, inMask, inCovar));
     389
     390        phot(inImage, inMask, inVariance, inCovar);
    274391
    275392        psImage *warpImage = NULL, *warpMask = NULL, *warpVariance = NULL;
     
    281398        psFree(inCovar);
    282399
    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        }
    284417
    285418        fprintf(stderr, "Warp image %d: S/N: %f Covar: %f Var: %f\n",
     
    300433        pmReadoutReadSubtractionKernels(ro, fits);
    301434        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
    302452        kernels->xMax = SKY_SIZE;
    303453        kernels->yMax = SKY_SIZE;
     
    305455
    306456        pmReadout *conv = pmReadoutAlloc(NULL);
     457#if 1
    307458        conv->image = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_F32);
    308459        conv->mask = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_IMAGE_MASK);
    309460        conv->variance = psImageAlloc(SKY_SIZE, SKY_SIZE, PS_TYPE_F32);
    310         if (!pmSubtractionMatchPrecalc(NULL, conv, NULL, ro, ro->analysis, 32, 0.0, 0.001,
     461        if (!pmSubtractionMatchPrecalc(NULL, conv, NULL, ro, ro->analysis, 32, 0.0, 0.01,
    311462                                       0xFF, 0xF0, 0x0F, 0.1, 1.0)) {
    312463            psErrorStackPrint(stderr, "Error:");
    313464            exit(1);
    314465        }
     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
    315475        psFree(ro);
    316476
    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        }
    318494
    319495        fprintf(stderr, "Conv Image %d: S/N: %f Covar: %f Var: %f\n",
     
    325501        phot(conv->image, conv->mask, conv->variance, conv->covariance);
    326502        readouts->data[i] = conv;
     503
    327504    }
    328505
Note: See TracChangeset for help on using the changeset viewer.