IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 26836


Ignore:
Timestamp:
Feb 9, 2010, 8:18:37 PM (16 years ago)
Author:
Paul Price
Message:

Adding I/O for pattern correction (both row and cell, in the same parts).

Location:
branches/eam_branches/20091201/psModules/src
Files:
2 added
7 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/20091201/psModules/src/camera/pmFPAfile.c

    r23746 r26836  
    519519    if (!strcasecmp(type, "SUBKERNEL"))     {
    520520        return PM_FPA_FILE_SUBKERNEL;
     521    }
     522    if (!strcasecmp(type, "PATTERN")) {
     523        return PM_FPA_FILE_PATTERN;
    521524    }
    522525
     
    563566      case PM_FPA_FILE_SUBKERNEL:
    564567        return ("SUBKERNEL");
     568      case PM_FPA_FILE_PATTERN:
     569        return "PATTERN";
    565570      default:
    566571        return ("NONE");
  • branches/eam_branches/20091201/psModules/src/camera/pmFPAfile.h

    r25979 r26836  
    4949    PM_FPA_FILE_SUBKERNEL,
    5050    PM_FPA_FILE_SRCTEXT,
     51    PM_FPA_FILE_PATTERN,
    5152} pmFPAfileType;
    5253
  • branches/eam_branches/20091201/psModules/src/camera/pmFPAfileIO.c

    r25979 r26836  
    4343#include "pmFPAConstruct.h"
    4444#include "pmSubtractionIO.h"
     45#include "pmPatternIO.h"
    4546#include "pmConcepts.h"
    4647#include "pmConfigRun.h"
     
    6667
    6768        switch (place) {
    68           case PM_FPA_BEFORE:
     69          case PM_FPA_BEFORE:
    6970            if (!pmFPAfileRead (file, view, config)) {
    7071                psError(PS_ERR_IO, false, "failed READ in FPA_BEFORE block for %s", file->name);
     
    7677            }
    7778            break;
    78           case PM_FPA_AFTER:
    79             if (!pmFPAfileWrite (file, view, config)) {
     79          case PM_FPA_AFTER:
     80            if (!pmFPAfileWrite (file, view, config)) {
    8081                psError(PS_ERR_IO, false, "failed WRITE in FPA_AFTER block for %s", file->name);
    8182                goto failure;
     
    8687            }
    8788            break;
    88           default:
     89          default:
    8990            psAbort("You can't get here");
    9091        }
     
    202203        status = pmSubtractionReadKernels(view, file, config);
    203204        break;
     205      case PM_FPA_FILE_PATTERN:
     206        status = pmPatternRead(view, file, config);
     207        break;
    204208      case PM_FPA_FILE_SX:
    205209      case PM_FPA_FILE_RAW:
     
    273277      case PM_FPA_FILE_VARIANCE:
    274278      case PM_FPA_FILE_FRINGE:
    275       case PM_FPA_FILE_DARK: {
    276           // create FPA structure component based on view
    277           psMetadata *format = file->format; // Camera format configuration
    278           if (!format) {
    279               format = config->format;
    280           }
    281 
    282           pmFPA *nameSource = file->src; // Source of FPA.OBS
    283           if (!nameSource) {
    284               nameSource = file->fpa;
    285           }
    286           bool mdok;                  // Status of MD lookup
    287           const char *fpaObs = psMetadataLookupStr(&mdok, nameSource->concepts, "FPA.OBS"); // Obs. id
    288 
    289           pmFPAAddSourceFromView(file->fpa, fpaObs, view, format);
    290           psTrace ("psModules.camera", 5, "created fpa data elements for %s (%s) (%d:%d:%d)\n",
    291                    file->name, file->name, view->chip, view->cell, view->readout);
    292           break;
    293       }
     279      case PM_FPA_FILE_DARK:
     280      case PM_FPA_FILE_PATTERN:
     281        {
     282            // create FPA structure component based on view
     283            psMetadata *format = file->format; // Camera format configuration
     284            if (!format) {
     285                format = config->format;
     286            }
     287
     288            pmFPA *nameSource = file->src; // Source of FPA.OBS
     289            if (!nameSource) {
     290                nameSource = file->fpa;
     291            }
     292            bool mdok;                  // Status of MD lookup
     293            const char *fpaObs = psMetadataLookupStr(&mdok, nameSource->concepts, "FPA.OBS"); // Obs. id
     294
     295            pmFPAAddSourceFromView(file->fpa, fpaObs, view, format);
     296            psTrace ("psModules.camera", 5, "created fpa data elements for %s (%s) (%d:%d:%d)\n",
     297                     file->name, file->name, view->chip, view->cell, view->readout);
     298            break;
     299        }
    294300      case PM_FPA_FILE_HEADER:
    295301        psAbort ("Create not defined for HEADER");
     
    462468        status = pmSubtractionWriteKernels(view, file, config);
    463469        break;
     470      case PM_FPA_FILE_PATTERN:
     471        status = pmPatternWrite(view, file, config);
     472        break;
    464473      case PM_FPA_FILE_SX:
    465474      case PM_FPA_FILE_RAW:
     
    543552      case PM_FPA_FILE_DARK:
    544553      case PM_FPA_FILE_SUBKERNEL:
     554      case PM_FPA_FILE_PATTERN:
    545555      case PM_FPA_FILE_CMF:
    546556      case PM_FPA_FILE_WCS:
     
    610620        break;
    611621      case PM_FPA_FILE_SUBKERNEL:
     622      case PM_FPA_FILE_PATTERN:
    612623      case PM_FPA_FILE_SX:
    613624      case PM_FPA_FILE_RAW:
     
    771782      case PM_FPA_FILE_DARK:
    772783      case PM_FPA_FILE_SUBKERNEL:
     784      case PM_FPA_FILE_PATTERN:
    773785      case PM_FPA_FILE_CMF:
    774786      case PM_FPA_FILE_WCS:
     
    962974      case PM_FPA_FILE_SUBKERNEL:
    963975        status = pmSubtractionWritePHU(view, file, config);
     976        break;
     977      case PM_FPA_FILE_PATTERN:
     978        status = pmPatternWritePHU(view, file, config);
     979        break;
    964980      case PM_FPA_FILE_CMF:
    965981        status = pmSource_CMF_WritePHU (view, file, config);
  • branches/eam_branches/20091201/psModules/src/detrend/Makefile.am

    r24891 r26836  
    1717        pmDark.c \
    1818        pmRemnance.c \
    19         pmPattern.c
     19        pmPattern.c \
     20        pmPatternIO.c
    2021
    2122#       pmSkySubtract.c
     
    3536        pmDark.h \
    3637        pmRemnance.h \
    37         pmPattern.h
     38        pmPattern.h \
     39        pmPatternIO.h
    3840
    3941#       pmSkySubtract.h
  • branches/eam_branches/20091201/psModules/src/detrend/pmPattern.c

    r26819 r26836  
    11#include <stdio.h>
     2#include <string.h>
    23#include <pslib.h>
    34
     
    910// Mask a row as bad
    1011static void patternMaskRow(pmReadout *ro, // Readout to mask
    11                            int y,         // Row to mask
     12                           int y,       // Row to mask
    1213                           psImageMaskType bad // Mask value to give
    1314                           )
     
    1718    psAssert(y < image->numRows, "Row not in image");
    1819
    19     int numCols = image->numCols;       // Size of image
     20    int numCols = image->numCols;       // Number of columns
    2021    for (int x = 0; x < numCols; x++) {
    2122        image->data.F32[y][x] = NAN;
     
    2930    return;
    3031}
     32
     33//////////////////////////////////////////////////////////////////////////////////////////////////////////////
     34// Measurement and application
     35//////////////////////////////////////////////////////////////////////////////////////////////////////////////
    3136
    3237bool pmPatternRow(pmReadout *ro, int order, int iter, float rej, float thresh,
     
    8085    psPolynomial1D *poly = psPolynomial1DAlloc(PS_POLYNOMIAL_ORD, order); // Polynomial to fit
    8186    psVector *data = psVectorAlloc(numCols, PS_TYPE_F32); // Data to fit
     87    psArray *corrs = psArrayAlloc(numRows); // Correction parameters
     88
     89    psImage *corr = psImageAlloc(order + 1, numRows, PS_TYPE_F64); // Corrections applied
    8290
    8391    for (int y = 0; y < numRows; y++) {
     
    105113            continue;
    106114        }
     115
     116        memcpy(corr->data.F64[y], poly->coeff, (order + 1) * PSELEMTYPE_SIZEOF(PS_TYPE_F64));
     117        corr->data.F64[y][0] -= background;
     118
    107119        psVector *solution = psPolynomial1DEvalVector(poly, indices); // Solution vector
    108120        if (!solution) {
     
    118130        psFree(solution);
    119131    }
     132
     133    psMetadataAddImage(ro->analysis, PS_LIST_TAIL, PM_PATTERN_ROW_CORRECTION, PS_META_REPLACE,
     134                       "Pattern row correction", corr);
     135    psFree(corrs);
    120136
    121137    psFree(indices);
     
    128144}
    129145
    130 
     146bool pmPatternRowApply(pmReadout *ro, psImageMaskType maskBad)
     147{
     148    PM_ASSERT_READOUT_NON_NULL(ro, false);
     149    PM_ASSERT_READOUT_IMAGE(ro, false);
     150
     151    bool mdok;                          // Status of MD lookup
     152    psImage *corr = psMetadataLookupPtr(&mdok, ro->analysis, PM_PATTERN_ROW_CORRECTION); // Correction
     153    if (!mdok) {
     154        // No correction to apply
     155        return true;
     156    }
     157
     158    psImage *image = ro->image; // Image of interest
     159    int numCols = image->numCols, numRows = image->numRows; // Size of image
     160
     161    psPolynomial1D *poly = psPolynomial1DAlloc(PS_POLYNOMIAL_ORD, numCols - 1); // Polynomial to apply
     162    psVector *indices = psVectorAlloc(numCols, PS_TYPE_F32); // Indices for polynomial
     163    float norm = 2.0 / (float)numCols;  // Normalisation for indices
     164    for (int x = 0; x < numCols; x++) {
     165        indices->data.F32[x] = x * norm - 1.0;
     166    }
     167
     168    for (int y = 0; y < numRows; y++) {
     169        memcpy(poly->coeff, corr->data.F64[y], numCols * PSELEMTYPE_SIZEOF(PS_TYPE_F64));
     170        psVector *solution = psPolynomial1DEvalVector(poly, indices); // Solution vector
     171        if (!solution) {
     172            psWarning("Unable to evaluate polynomial for row %d", y);
     173            psErrorClear();
     174            patternMaskRow(ro, y, maskBad);
     175            continue;
     176        }
     177
     178        for (int x = 0; x < numCols; x++) {
     179            image->data.F32[y][x] -= solution->data.F32[x];
     180        }
     181        psFree(solution);
     182    }
     183
     184    psFree(poly);
     185    psFree(indices);
     186
     187    return true;
     188}
    131189
    132190
     
    255313            psImageInit(ro->image, NAN);
    256314            psBinaryOp(ro->mask, ro->mask, "|", psScalarAlloc(maskBad, PS_TYPE_IMAGE_MASK));
     315            psMetadataAddF32(ro->analysis, PS_LIST_TAIL, PM_PATTERN_CELL_CORRECTION, PS_META_REPLACE,
     316                             "Pattern cell correction solution", NAN);
    257317            continue;
    258318        }
     
    262322                 cellName, correction);
    263323        psBinaryOp(ro->image, ro->image, "+", psScalarAlloc(correction, PS_TYPE_F32));
     324        psMetadataAddF32(ro->analysis, PS_LIST_TAIL, PM_PATTERN_CELL_CORRECTION, PS_META_REPLACE,
     325                         "Pattern cell correction solution", correction);
    264326    }
    265327
     
    269331    return true;
    270332}
     333
     334bool pmPatternCellApply(pmReadout *ro, psImageMaskType maskBad)
     335{
     336    PM_ASSERT_READOUT_NON_NULL(ro, false);
     337    PM_ASSERT_READOUT_IMAGE(ro, false);
     338
     339    bool mdok;                          // Status of MD lookup
     340    float corr = psMetadataLookupF32(&mdok, ro->analysis, PM_PATTERN_CELL_CORRECTION); // Correction to apply
     341    if (!mdok) {
     342        // No correction to apply
     343        return true;
     344    }
     345
     346    psImage *image = ro->image, *mask = ro->mask; // Image and mask of interest
     347    int numCols = image->numCols, numRows = image->numRows; // Size of image
     348
     349    if (!isfinite(corr)) {
     350        for (int y = 0; y < numRows; y++) {
     351            for (int x = 0; x < numCols; x++) {
     352                image->data.F32[y][x] = NAN;
     353            }
     354        }
     355        if (mask) {
     356            for (int y = 0; y < numRows; y++) {
     357                for (int x = 0; x < numCols; x++) {
     358                    mask->data.PS_TYPE_IMAGE_MASK_DATA[y][x] |= maskBad;
     359                }
     360            }
     361        }
     362    } else {
     363        for (int y = 0; y < numRows; y++) {
     364            for (int x = 0; x < numCols; x++) {
     365                image->data.F32[y][x] += corr;
     366            }
     367        }
     368    }
     369
     370    return true;
     371}
     372
     373
  • branches/eam_branches/20091201/psModules/src/detrend/pmPattern.h

    r26776 r26836  
    1818/// @{
    1919
     20#define PM_PATTERN_ROW_CORRECTION "PATTERN.ROW.CORRECTION" // Pattern row correction on analysis metadata
     21#define PM_PATTERN_CELL_CORRECTION "PATTERN.CELL.CORRECTION" // Pattern cell correction on analysis metadata
     22
    2023/// Fit and remove pattern noise over rows
    2124bool pmPatternRow(
     
    3134    );
    3235
     36/// Apply previously measured row pattern correction
     37bool pmPatternRowApply(pmReadout *ro,   ///< Readout to correct
     38                       psImageMaskType maskBad ///< Mask value to give bad pixels
     39                       );
     40
    3341/// Fix the background on cells known to be troublesome
    3442bool pmPatternCell(
     
    4149    );
    4250
     51/// Apply previously measured cell pattern correction
     52bool pmPatternCellApply(pmReadout *ro,          ///< Readout to correct
     53                        psImageMaskType maskBad ///< Mask value to give bad pixels
     54                        );
     55
    4356
    4457/// @}
  • branches/eam_branches/20091201/psModules/src/psmodules.h

    r26693 r26836  
    7979#include <pmRemnance.h>
    8080#include <pmPattern.h>
     81#include <pmPatternIO.h>
    8182
    8283// the following headers are from psModule:astrom
Note: See TracChangeset for help on using the changeset viewer.