IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 9952


Ignore:
Timestamp:
Nov 13, 2006, 12:26:09 PM (19 years ago)
Author:
Paul Price
Message:

Doing fringe processing using the pmFPAfile framework, with FRINGE type for the reference fringes.

Location:
trunk/ppImage/src
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/ppImage/src/Makefile.am

    r9857 r9952  
    55        ppImageOptions.h \
    66        ppImageDetrendFringe.h \
     7        ppImagePreserve.h \
    78        ppMem.h
    89
     
    2021        ppImageDetrendNonLinear.c \
    2122        ppImageDetrendFringe.c \
     23        ppImagePreserve.c \
    2224        ppImageRebinReadout.c \
    2325        ppImageMosaic.c \
     
    4143        ppImageDetrendNonLinear.c \
    4244        ppImageDetrendFringe.c \
     45        ppImagePreserve.c \
    4346        ppImageRebinReadout.c \
    4447        ppImageMosaic.c \
  • trunk/ppImage/src/ppImageArguments.c

    r9342 r9952  
    3333                         "Filename for summary statistics", argv[N]);
    3434        psArgumentRemove(N, &argc, argv);
     35    }
     36
     37    if ((N = psArgumentGet(argc, argv, "-fringeimage"))) {
     38        psArgumentRemove(N, &argc, argv);
     39        psMetadataAddBool(options, PS_LIST_TAIL, "INPUT_IS_FRINGE", PS_META_REPLACE,
     40                          "Input is fringe image", true);
    3541    }
    3642
     
    7379    if ((N = psArgumentGet(argc, argv, "-norm"))) {
    7480        psArgumentRemove(N, &argc, argv);
    75         psMetadataAddStr(config->arguments, PS_LIST_TAIL, "NORMALISATION", PS_TYPE_F32,
    76                          "Normalisation to apply", argv[N]);
     81        float norm = atof(argv[N]);
     82        psMetadataAddF32(config->arguments, PS_LIST_TAIL, "NORMALISATION", 0,
     83                         "Normalisation to apply", norm);
    7784        psArgumentRemove(N, &argc, argv);
    7885    }
  • trunk/ppImage/src/ppImageDetrendFringe.c

    r9857 r9952  
    55#include "ppImageDetrendFringe.h"
    66
    7 bool ppImageDetrendFringeMeasure(pmFringeStats **science, // (Ptr to) science fringe measurements
    8                                  psArray *references, // Array of reference fringe measurements
    9                                  const pmReadout *readout, // Readout to measure
     7bool ppImageDetrendFringeMeasure(pmReadout *readout, // Readout to measure
     8                                 pmCell *fringe, // Fringe cell (each readout is a different component)
    109                                 const ppImageOptions *options // Options
    1110                                 )
    1211{
    13     assert(science);
    14     PS_ASSERT_ARRAY_NON_NULL(references, false);
     12    PS_ASSERT_PTR_NON_NULL(readout, false);
     13    PS_ASSERT_PTR_NON_NULL(fringe, false);
     14    PS_ASSERT_PTR_NON_NULL(options, false);
     15
     16    // Reference fringe measurements
     17    psArray *references = psMemIncrRefCounter(psMetadataLookupPtr(NULL, fringe->analysis,
     18                                                                  "FRINGE.MEASUREMENTS"));
     19    if (!references) {
     20        references = pmFringesParse(fringe); // Reference fringes
     21        if (!references) {
     22            psError(PS_ERR_IO, false, "Unable to find fringe references.\n");
     23            return false;
     24        }
     25        psMetadataAdd(fringe->analysis, PS_LIST_TAIL, "FRINGE.MEASUREMENTS", PS_DATA_UNKNOWN,
     26                      "Fringe measurements", references);
     27    }
    1528
    1629    pmFringeStats *reference = references->data[0]; // Take the first as representative
    1730    pmFringeRegions *regions = reference->regions; // Regions to measure
    18     pmFringeStats *fringe = pmFringeStatsMeasure(regions, readout, options->maskValue); // Fringe stats
     31    pmFringeStats *measurements = pmFringeStatsMeasure(regions, readout, options->maskValue); // Fringe stats
    1932
    2033    // Normalise measurements by the exposure time
     
    2336    if (!mdok || !isfinite(expTime)) {
    2437        psError(PS_ERR_UNKNOWN, false, "CELL.EXPOSURE is not set for --- can't normalise fringes\n");
    25         psFree(fringe);
     38        psFree(measurements);
    2639        return false;
    2740    }
     
    3043        expTime = 1.0;
    3144    }
    32     psBinaryOp(fringe->f, fringe->f, "*", psScalarAlloc(1.0 / expTime, PS_TYPE_F32));
    33     psBinaryOp(fringe->df, fringe->df, "*", psScalarAlloc(1.0 / expTime, PS_TYPE_F32));
     45    psBinaryOp(measurements->f, measurements->f, "*", psScalarAlloc(1.0 / expTime, PS_TYPE_F32));
     46    psBinaryOp(measurements->df, measurements->df, "*", psScalarAlloc(1.0 / expTime, PS_TYPE_F32));
    3447
    35     if (!*science) {
    36         // Only a single readout
    37         *science = fringe;
    38     } else {
     48    // Science fringe measurements
     49    pmFringeStats *previous = psMetadataLookupPtr(NULL, readout->parent->analysis, "FRINGE.MEASUREMENTS");
     50    if (previous) {
    3951        // Multiple readouts: concatenate
    4052        psArray *concatenate = psArrayAlloc(2); // Array to hold fringes
    4153
    4254        // Concatenate science measurements
    43         concatenate->data[0] = *science;
    44         concatenate->data[1] = fringe;
    45         pmFringeStats *sciNew = pmFringeStatsConcatenate(concatenate, NULL, NULL); // New measurements
    46         psFree(*science);
    47         *science = sciNew;
     55        concatenate->data[0] = previous;
     56        concatenate->data[1] = measurements;
     57        pmFringeStats *new = pmFringeStatsConcatenate(concatenate, NULL, NULL); // New measurements
     58        psFree(measurements);
     59        measurements = new;
    4860
    49         // Concatenate reference measurements
     61        // Concatenate reference measurements (duplication, so the science and reference line up)
    5062        for (int i = 0; i < references->n; i++) {
    5163            concatenate->data[0] = concatenate->data[1] = references->data[i];
     
    5466            references->data[i] = refNew;
    5567        }
    56 
    5768        concatenate->data[0] = concatenate->data[1] = NULL;
    5869        psFree(concatenate);
    5970    }
     71
     72    psMetadataAdd(readout->parent->analysis, PS_LIST_TAIL, "FRINGE.MEASUREMENTS",
     73                  PS_DATA_UNKNOWN | PS_META_REPLACE, "Fringe measurements", measurements);
     74    psFree(measurements);
     75
     76    psFree(references);
    6077
    6178    return true;
     
    6380
    6481
     82// Pull the fringes out of the cell analysis FRINGE.MEASUREMENTS for a chip
     83static psArray *getFringes(const pmChip *chip // Chip of interest
     84    )
     85{
     86    psArray *cells = chip->cells;       // Component cells
     87    psArray *fringes = psArrayAlloc(cells->n); // Fringes, to return
     88    for (int i = 0; i < cells->n; i++) {
     89        pmCell *cell = cells->data[i];  // Cell of interest
     90        fringes->data[i] = psMemIncrRefCounter(psMetadataLookupPtr(NULL, cell->analysis,
     91                                                                   "FRINGE.MEASUREMENTS"));
     92    }
     93
     94    return fringes;
     95}
     96
    6597
    6698// Solve the fringe system: we have science fringe measurements for each cell, and an array of reference
    6799// fringe measurements for each cell.  Need to concatenate these together first, and then solve.
    68 pmFringeScale *ppImageDetrendFringeSolve(psArray *science, // Science fringe measurements (per cell)
    69                                          psArray *references, // Array of array of fringe measurements
    70                                          const ppImageOptions *options // Options
     100bool ppImageDetrendFringeSolve(pmChip *scienceChip, // Chip with science
     101                               const pmChip *refChip, // Chip with reference fringes
     102                               const ppImageOptions *options // Options
    71103    )
    72104{
     105    PS_ASSERT_PTR_NON_NULL(scienceChip, NULL);
     106    PS_ASSERT_PTR_NON_NULL(refChip, NULL);
     107    PS_ASSERT_PTR_NON_NULL(options, NULL);
     108
     109    psArray *science = getFringes(scienceChip); // Fringe measurements on science chip
    73110    pmFringeStats *scienceCat = pmFringeStatsConcatenate(science, NULL, NULL); // Science fringes
     111    psFree(science);
    74112
    75113    // Need to transform the array of cells each with an array of fringes --> array of fringes for the chip as
    76114    // a whole
     115    psArray *references = getFringes(refChip); // Fringe measurements on reference chip
    77116    int numRefs = ((psArray*)references->data[0])->n; // Number of reference fringes
    78117    psArray *referencesCat = psArrayAlloc(numRefs); // Reference fringes
     
    86125        psFree(refs);
    87126    }
     127    psFree(references);
    88128
    89129    // Now we can solve
     
    92132                                                   options->fringeIter, options->fringeKeep);
    93133
     134    psMetadataAdd(scienceChip->analysis, PS_LIST_TAIL, "FRINGE.SOLUTION", PS_DATA_UNKNOWN,
     135                  "Fringe solution", solution);
     136    psFree(solution);
    94137    psFree(scienceCat);
    95138    psFree(referencesCat);
    96139
    97     return solution;
     140    return true;
    98141}
    99142
    100143
    101144psImage *ppImageDetrendFringeGenerate(pmCell *science, // Science cell
    102                                       pmCell *fringes, // Fringe cell, one readout per fringe component
    103                                       const pmFringeScale *solution // Fringe solution to apply
     145                                      pmCell *fringes // Fringe cell, one readout per fringe component
    104146    )
    105147{
    106148    PS_ASSERT_PTR_NON_NULL(science, false);
    107     PS_ASSERT_PTR_NON_NULL(solution, false);
     149    PS_ASSERT_PTR_NON_NULL(fringes, false);
     150
     151    pmFringeScale *solution = psMetadataLookupPtr(NULL, science->parent->analysis, "FRINGE.SOLUTION");
    108152    assert(fringes->readouts->n == solution->nFringeFrames);
    109153
  • trunk/ppImage/src/ppImageDetrendFringe.h

    r9857 r9952  
    66#include "ppImageOptions.h"
    77
    8 bool ppImageDetrendFringeMeasure(pmFringeStats **science, // (Ptr to) science fringe measurements
    9                                  psArray *references, // Array of reference fringe measurements
    10                                  const pmReadout *readout, // Readout to measure
     8bool ppImageDetrendFringeMeasure(pmReadout *readout, // Readout to measure
     9                                 pmCell *fringe, // Fringe cell (each readout is a different component)
    1110                                 const ppImageOptions *options // Options
    1211    );
    1312
    14 pmFringeScale *ppImageDetrendFringeSolve(psArray *science, // Science fringe measurements (per cell)
    15                                          psArray *references, // Array of array of fringe measurements
    16                                          const ppImageOptions *options // Options
     13bool ppImageDetrendFringeSolve(pmChip *scienceChip, // Chip with science
     14                               const pmChip *refChip, // Chip with reference fringes
     15                               const ppImageOptions *options // Options
    1716    );
    1817
     18
    1919psImage *ppImageDetrendFringeGenerate(pmCell *science, // Science cell
    20                                       pmCell *fringes, // Fringe cell, one readout per fringe component
    21                                       const pmFringeScale *solution // Fringe solution to apply
     20                                      pmCell *fringes // Fringe cell, one readout per fringe component
    2221    );
    2322
     23
    2424#endif
  • trunk/ppImage/src/ppImageDetrendReadout.c

    r9342 r9952  
    44
    55#include "ppImage.h"
     6#include "ppImageDetrendFringe.h"
    67
    78bool ppImageDetrendReadout (pmConfig *config, ppImageOptions *options, pmFPAview *view)
     
    7273    }
    7374
     75    if (options->doFringe) {
     76        pmCell *fringe = pmFPAfileThisCell(config->files, detview, "PPIMAGE.FRINGE");
     77        if (!ppImageDetrendFringeMeasure(input, fringe, options)) {
     78            return false;
     79        }
     80    }
     81
    7482    psFree (detview);
    7583    return true;
  • trunk/ppImage/src/ppImageLoop.c

    r9871 r9952  
    66#include "ppImage.h"
    77#include "ppImageDetrendFringe.h"
     8
    89
    910bool ppImageLoop (pmConfig *config, ppImageOptions *options) {
     
    4546        if (!pmFPAfileIOChecks (config, view, PM_FPA_BEFORE)) return false;
    4647
    47         const char *chipName = psMetadataLookupStr(NULL, chip->concepts, "CHIP.NAME"); // Name of chip
    48         psArray *fringeRef = NULL;      // Array of array of fringe statistics for reference --- for each cell
    49         psArray *fringeSci = NULL;      // Array of fringe statistics for science --- for each cell
    50         if (options->doFringe) {
    51             fringeRef = psArrayAlloc(chip->cells->n);
    52             fringeSci = psArrayAlloc(chip->cells->n);
    53         }
    54 
    5548        while ((cell = pmFPAviewNextCell (view, input->fpa, 1)) != NULL) {
    5649            psLogMsg ("ppImageLoop", 4, "Cell %d: %x %x\n", view->cell, cell->file_exists, cell->process);
    5750            if (!cell->process || !cell->file_exists) { continue; }
    5851            if (!pmFPAfileIOChecks (config, view, PM_FPA_BEFORE)) return false;
    59             const char *cellName = psMetadataLookupStr(NULL, cell->concepts, "CELL.NAME"); // Name of cell
    60 
    61             if (options->doFringe) {
    62                 pmFPAfile *fringeFile = psMetadataLookupPtr(&status, config->files, "PPIMAGE.FRINGE");
    63                 if (!status || !fringeFile) {
    64                     psErrorStackPrint(stderr, "Can't find fringe data!\n");
    65                     exit(EXIT_FAILURE);
    66                 }
    67 
    68                 psString fringeExt = NULL; // Fringe extension name
    69                 psStringAppend(&fringeExt, "FRINGE_%s_%s", chipName, cellName);
    70                 fringeRef->data[view->cell] = pmFringesReadFits(NULL, fringeFile->fits, fringeExt);
    71                 psFree(fringeExt);
    72             }
    7352
    7453            // process each of the readouts
     
    8059                if (!ppImageDetrendReadout (config, options, view)) return false;
    8160
    82                 if (options->doFringe) {
    83                     ppImageDetrendFringeMeasure((pmFringeStats**)(&fringeSci->data[view->cell]),
    84                                                 fringeRef->data[view->cell], readout, options);
    85                 }
    8661            }
    8762        }
    8863
    8964        // Solve the fringe system
    90         pmFringeScale *fringeSoln = NULL; // Solution for the fringes
    9165        if (options->doFringe) {
    92             fringeSoln = ppImageDetrendFringeSolve(fringeSci, fringeRef, options);
    93             psFree(fringeSci);
    94             psFree(fringeRef);
     66            pmChip *fringe = pmFPAfileThisChip(config->files, view, "PPIMAGE.FRINGE");
     67            if (!ppImageDetrendFringeSolve(chip, fringe, options)) {
     68                return false;
     69            }
    9570        }
    9671
     
    10378            if (options->doFringe) {
    10479                psTrace("ppImage", 3, "Applying fringe correction...\n");
    105                 bool mdok;                          // Status of MD lookup
    106                 pmFPAfile *fringeFile = psMetadataLookupPtr(&mdok, config->files, "PPIMAGE.FRINGE");
    107                 pmCell *fringeCell = pmFPAviewThisCell(view, fringeFile->fpa);
    108                 psImage *fringe = ppImageDetrendFringeGenerate(cell, fringeCell, fringeSoln);
     80                pmCell *fringeCell = pmFPAfileThisCell(config->files, view, "PPIMAGE.FRINGE");
     81                psImage *fringe = ppImageDetrendFringeGenerate(cell, fringeCell);
    10982                while ((readout = pmFPAviewNextReadout (view, input->fpa, 1)) != NULL) {
    11083                    if (!readout->data_exists) { continue; }
     
    12598            if (!pmFPAfileIOChecks (config, view, PM_FPA_AFTER)) return false;
    12699        }
    127         psFree(fringeSoln);
    128100
    129101        ppImageMosaicChip (config, view, "PPIMAGE.OUTPUT.CHIP", "PPIMAGE.OUTPUT");
     
    163135    if (!pmFPAfileIOChecks (config, view, PM_FPA_AFTER)) return false;
    164136
    165     psFree (view);
     137    psFree(view);
     138
    166139    return true;
    167140}
  • trunk/ppImage/src/ppImageParseCamera.c

    r9857 r9952  
    1212    // the input image defines the camera, and all recipes and options the follow
    1313    pmFPAfile *input = pmFPAfileDefineFromArgs (&status, config, "PPIMAGE.INPUT", "INPUT");
    14     if (!status) {
     14    if (!status || !input) {
    1515        psError(PS_ERR_IO, false, "Failed to build FPA from PPIMAGE.INPUT");
    1616        return NULL;
     
    177177    psFree (chips);
    178178
     179    if (psMetadataLookupBool(NULL, recipe, "INPUT_IS_FRINGE")) {
     180        // It's a fringe file, so change the file type
     181        input->type = PM_FPA_FILE_FRINGE;
     182        output->type = PM_FPA_FILE_FRINGE;
     183    }
     184
    179185    return (options);
    180186}
Note: See TracChangeset for help on using the changeset viewer.