IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
May 23, 2007, 12:41:52 PM (19 years ago)
Author:
Paul Price
Message:

Bug fixes and small improvements to get it working properly. Seems to work OK now, but hasn't been tested rigourously.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ppStack/src/ppStackReadout.c

    r13464 r13489  
    1717bool ppStackReadout(pmConfig *config, const pmFPAview *view)
    1818{
    19     // XXX Somehow need to add an HDU in to the output so that we can actually write it out!
     19    // Get the recipe values
     20    int iter = psMetadataLookupS32(NULL, config->arguments, "ITER"); // Rejection iterations
     21    float combineRej = psMetadataLookupF32(NULL, config->arguments, "COMBINE.REJ"); // Combination threshold
     22    float convolveRej = psMetadataLookupF32(NULL, config->arguments, "CONVOLVE.REJ"); // Convolution threshold
     23    float extent = psMetadataLookupF32(NULL, config->arguments, "EXTENT"); // Extent of convolution
     24    psMaskType maskBad = psMetadataLookupU8(NULL, config->arguments, "MASK.BAD"); // Value to mask
     25    psMaskType maskBlank = psMetadataLookupU8(NULL, config->arguments, "MASK.BLANK"); // Mask for blank reg.
    2026
    2127    // Get the output target
     
    3137                                                            "^PPSTACK.INPUT$"); // Iterator over input files
    3238    psMetadataItem *item;               // Item from iteration
     39    psStats *stats = psStatsAlloc(PS_STAT_ROBUST_MEDIAN); // Statistics
     40    psRandom *rng = psRandomAlloc(0, PS_RANDOM_TAUS); // Random number generator
    3341    while ((item = psMetadataGetAndIncrement(inputIter))) {
    3442        assert(item->type == PS_DATA_UNKNOWN);
    3543        pmFPAfile *inputFile = item->data.V; // An input file
    3644        pmReadout *ro = pmFPAviewThisReadout(view, inputFile->fpa); // Corresponding readout
     45
     46        // Brain-dead background subtraction
     47        if (!psImageBackground(stats, ro->image, ro->mask, maskBad, rng)) {
     48            psError(PS_ERR_UNKNOWN, false, "Unable to get image background on image %ld", stack->n);
     49            psFree(stats);
     50            psFree(rng);
     51            psFree(inputIter);
     52            psFree(stack);
     53            psFree(outRO);
     54            return false;
     55        }
     56        (void)psBinaryOp(ro->image, ro->image, "-", psScalarAlloc(stats->robustMedian, PS_TYPE_F32));
     57
     58        // Normalise each input by the exposure time
     59        float exposure = psMetadataLookupF32(NULL, ro->parent->concepts, "CELL.EXPOSURE"); // Exposure time
     60        if (!isfinite(exposure)) {
     61            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
     62                    "CELL.EXPOSURE is not set for input file %ld", stack->n);
     63            psFree(stats);
     64            psFree(rng);
     65            psFree(inputIter);
     66            psFree(outRO);
     67            psFree(stack);
     68            return false;
     69        }
     70        (void)psBinaryOp(ro->image, ro->image, "/", psScalarAlloc(exposure, PS_TYPE_F32));
    3771        pmStackData *data = pmStackDataAlloc(ro, SEEING, WEIGHT); // Data to stack
    3872        psArrayAdd(stack, ARRAY_BUFFER, data);
    3973    }
    4074    psFree(inputIter);
     75    psFree(stats);
     76    psFree(rng);
    4177
    42     // Get the recipe values
    43     int iter = psMetadataLookupS32(NULL, config->arguments, "ITER"); // Rejection iterations
    44     float rej = psMetadataLookupF32(NULL, config->arguments, "REJ"); // Rejection threshold
    45     float extent = psMetadataLookupF32(NULL, config->arguments, "EXTENT"); // Extent of convolution
    46     psMaskType maskBad = psMetadataLookupU8(NULL, config->arguments, "MASK.BAD"); // Value to mask
    47     psMaskType maskBlank = psMetadataLookupU8(NULL, config->arguments, "MASK.BLANK"); // Mask for blank reg.
    48 
    49     if (!pmStackCombine(outRO, stack, maskBad, maskBlank, iter, rej)) {
     78    if (!pmStackCombine(outRO, stack, maskBad, maskBlank, iter, combineRej)) {
    5079        psError(PS_ERR_UNKNOWN, false, "Unable to combine input readouts with rejection.");
    5180        psFree(stack);
     
    5483    }
    5584
    56     if (!pmStackReject(stack, maskBad, extent, rej)) {
     85#if 1
     86    {
     87        psFits *fits = psFitsOpen("combined.fits", "w");
     88        psFitsWriteImage(fits, NULL, outRO->image, 0, NULL);
     89        psFitsClose(fits);
     90    }
     91
     92    for (int i = 0; i < num; i++) {
     93        pmStackData *data = stack->data[i]; // Data for this image
     94        psImage *inspected = psPixelsToMask(NULL, data->pixels,
     95                                            psRegionSet(0, data->sky->image->numCols,
     96                                                        0, data->sky->image->numRows),
     97                                            maskBlank);
     98        psString name = NULL;           // Name of image
     99        psStringAppend(&name, "inspect%03d.fits", i);
     100        psFits *fits = psFitsOpen(name, "w");
     101        psFree(name);
     102        psFitsWriteImage(fits, NULL, inspected, 0, NULL);
     103        psFitsClose(fits);
     104    }
     105#endif
     106
     107    if (!pmStackReject(stack, maskBad, extent, convolveRej)) {
    57108        psError(PS_ERR_UNKNOWN, false, "Unable to reject input pixels.");
    58109        psFree(stack);
     
    61112    }
    62113
    63     if (!pmStackCombine(outRO, stack, maskBad, maskBlank, 0, 0.0)) {
     114#if 1
     115    for (int i = 0; i < num; i++) {
     116        pmStackData *data = stack->data[i]; // Data for this image
     117        psImage *rejected = psPixelsToMask(NULL, data->pixels,
     118                                           psRegionSet(0, data->sky->image->numCols,
     119                                                       0, data->sky->image->numRows),
     120                                           maskBlank);
     121        psString name = NULL;           // Name of image
     122        psStringAppend(&name, "reject%03d.fits", i);
     123        psFits *fits = psFitsOpen(name, "w");
     124        psFree(name);
     125        psFitsWriteImage(fits, NULL, rejected, 0, NULL);
     126        psFitsClose(fits);
     127    }
     128#endif
     129
     130    if (!pmStackCombine(outRO, stack, maskBad, maskBlank, 0, combineRej)) {
    64131        psError(PS_ERR_UNKNOWN, false, "Unable to combine input readouts.");
    65132        psFree(stack);
     
    68135    }
    69136
     137    outRO->data_exists = true;
     138    outRO->parent->data_exists = true;
     139    outRO->parent->parent->data_exists = true;
     140
    70141    psFree(stack);
    71142    psFree(outRO);                      // Drop reference
Note: See TracChangeset for help on using the changeset viewer.