IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Feb 2, 2009, 2:37:06 PM (17 years ago)
Author:
Paul Price
Message:

Reverting to writing covariance matrices per chip/cell. This allows simple visualisation of the covariance matrix, and a simpler system for reading and writing them.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/pap_branch_20090128/psModules/src/camera/pmFPAWrite.c

    r21264 r21269  
    99
    1010#include "pmConfig.h"
     11#include "pmConfigMask.h"
    1112#include "pmHDU.h"
    1213#include "pmFPA.h"
     
    7475}
    7576
    76 
    77 
     77// Indicate whether a covariance matrix is defined
     78static bool readoutSearchCovariances(pmReadout *ro)
     79{
     80    return ro->covariance ? true : false;
     81}
     82
     83// Search for a covariance matrix
     84#define SEARCH_COVARIANCES(NAME, PARENT, CHILD, CHILDREN, TESTFUNC) \
     85static bool NAME(PARENT *parent) \
     86{ \
     87    if (!parent || !parent->CHILDREN) { \
     88        return false; \
     89    } \
     90    psArray *children = parent->CHILDREN; /* Array of children */ \
     91    for (int i = 0; i < children->n; i++) { \
     92        CHILD *child = children->data[i]; /* Child of interest */ \
     93        if (child && TESTFUNC(child)) { \
     94            return true; \
     95        } \
     96    } \
     97    return false; \
     98}
     99
     100SEARCH_COVARIANCES(cellSearchCovariances, pmCell, pmReadout, readouts, readoutSearchCovariances);
     101SEARCH_COVARIANCES(chipSearchCovariances, pmChip, pmCell,    cells,    cellSearchCovariances);
     102SEARCH_COVARIANCES(fpaSearchCovariances,  pmFPA,  pmChip,    chips,    chipSearchCovariances);
    78103
    79104// Some type-specific additions to the header
     
    81106                              pmChip *chip, // Chip of interest, or NULL
    82107                              pmCell *cell, // Cell of interest, or NULL
    83                               fpaWriteType type // Type to write
    84     )
     108                              fpaWriteType type, // Type to write
     109                              pmConfig *config // Configuration
     110                              )
    85111{
    86112    switch (type) {
     
    94120      }
    95121      case FPA_WRITE_TYPE_VARIANCE: {
     122          bool covar = false;           // Are covariances present?
     123          if ((cell && cellSearchCovariances(cell)) ||
     124              (!cell && ((chip && chipSearchCovariances(chip)) ||
     125                         (!chip && fpa && fpaSearchCovariances)))) {
     126              covar = true;
     127          }
     128
    96129          pmHDU *hdu = pmHDUGetLowest(fpa, chip, cell); // Header being written
    97 
     130          psMetadataAddBool(hdu->header, PS_LIST_TAIL, PM_HDU_COVARIANCE_KEYWORD, PS_META_REPLACE,
     131                            "Is a covariance matrix present?", covar);
     132          break;
     133      }
     134      default:
     135        break;
     136    }
     137
     138    return true;
     139}
    98140
    99141
     
    137179            return false;
    138180        }
    139 
    140 
     181        if (!writeUpdateHeader(NULL, NULL, cell, type, config)) {
     182            psError(PS_ERR_UNKNOWN, false, "Unable to update header for writing");
     183            return false;
     184        }
    141185        if (!appropriateWriteFunc(hdu, fits, config, type)) {
    142186            psError(PS_ERR_IO, false, "Unable to write HDU for cell.\n");
     
    189233                return false;
    190234            }
     235
     236            if (!writeUpdateHeader(NULL, chip, NULL, type, config)) {
     237                psError(PS_ERR_UNKNOWN, false, "Unable to update header for writing");
     238                return false;
     239            }
     240
    191241            if (!appropriateWriteFunc(hdu, fits, config, type)) {
    192242                psError(PS_ERR_IO, false, "Unable to write HDU for chip.\n");
     
    253303                return false;
    254304            }
     305            if (!writeUpdateHeader(fpa, NULL, NULL, type, config)) {
     306                psError(PS_ERR_UNKNOWN, false, "Unable to update header for writing");
     307                return false;
     308            }
    255309            if (!appropriateWriteFunc(hdu, fits, config, type))  {
    256310                psError(PS_ERR_IO, false, "Unable to write HDU for FPA.\n");
     
    535589    return numWrite;
    536590}
     591
     592bool pmCellWriteCovariance(psFits *fits, const pmCell *cell)
     593{
     594    PS_ASSERT_PTR_NON_NULL(cell, false);
     595    PS_ASSERT_PTR_NON_NULL(fits, false);
     596
     597    int numCovar = 0;
     598    psArray *readouts = cell->readouts; // Array of readouts
     599    for (int i = 0; i < readouts->n; i++) {
     600        pmReadout *readout = readouts->data[i]; // The readout of interest
     601        if (readout && readout->covariance) {
     602            numCovar++;
     603        }
     604    }
     605    if (numCovar == 0) {
     606        return true;
     607    }
     608    if (numCovar != readouts->n) {
     609        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
     610                "Number of covariances (%d) doesn't match number of readouts (%ld)",
     611                numCovar, readouts->n);
     612        return false;
     613    }
     614
     615    // Check size of covariances
     616    int xMinCovar = INT_MAX, xMaxCovar = INT_MIN, yMinCovar = INT_MAX, yMaxCovar = INT_MIN; // Size
     617    for (int i = 0; i < readouts->n; i++) {
     618        pmReadout *readout = readouts->data[i]; // The readout of interest
     619        psAssert(readout, "Should be defined.");
     620        psKernel *covar = readout->covariance; // Covariance matrix
     621        psAssert(covar, "Should be defined.");
     622        xMinCovar = PS_MIN(xMinCovar, covar->xMin);
     623        xMaxCovar = PS_MAX(xMaxCovar, covar->xMax);
     624        yMinCovar = PS_MIN(yMinCovar, covar->yMin);
     625        yMaxCovar = PS_MAX(yMaxCovar, covar->yMax);
     626    }
     627
     628    // Correct covariances to common size
     629    psArray *images = psArrayAlloc(numCovar); // Array of images
     630    for (int i = 0; i < readouts->n; i++) {
     631        pmReadout *readout = readouts->data[i]; // The readout of interest
     632        psAssert(readout, "Should be defined.");
     633        psKernel *covar = readout->covariance; // Covariance matrix
     634        psAssert(covar, "Should be defined.");
     635        int xMin = covar->xMin, xMax = covar->xMax, yMin = covar->yMin, yMax = covar->yMax;// Size
     636        if (xMin == xMinCovar && xMax == xMaxCovar && yMin == yMinCovar && yMax == yMaxCovar) {
     637            images->data[i] = psMemIncrRefCounter(covar->image);
     638        } else {
     639            psImage *new = psImageAlloc(xMaxCovar - xMinCovar + 1, yMaxCovar - yMinCovar + 1, PS_TYPE_F32);
     640            psImageInit(new, 0);
     641            psImageOverlaySection(new, covar->image, xMinCovar - xMin, yMinCovar - yMin, "=");
     642            images->data[i] = new;
     643        }
     644    }
     645
     646    // Determine extension name
     647    const char *chipName = psMetadataLookupStr(NULL, cell->parent->concepts, "CHIP.NAME"); // Name of chip
     648    const char *cellName = psMetadataLookupStr(NULL, cell->concepts, "CELL.NAME"); // Name of cell
     649    psString extname = NULL;            // Extension name
     650    psStringAppend(&extname, "COVAR_%s_%s", chipName, cellName);
     651
     652    // Generate header
     653    pmHDU *hdu = pmHDUFromCell(cell);   // HDU for cell
     654    psMetadata *header = psMetadataCopy(NULL, hdu->header); // Header to write
     655    psMetadataAddS32(header, PS_LIST_TAIL, "COVARIANCE.CENTRE.X", PS_META_REPLACE,
     656                     "Centre of covariance matrix in x", -xMinCovar);
     657    psMetadataAddS32(header, PS_LIST_TAIL, "COVARIANCE.CENTRE.Y", PS_META_REPLACE,
     658                     "Centre of covariance matrix in y", -yMinCovar);
     659
     660    // Write images
     661    if (!psFitsWriteImageCube(fits, header, images, extname)) {
     662        psError(PS_ERR_UNKNOWN, false, "Unable to write covariances from chip %s, cell %s to extension %s",
     663                chipName, cellName, extname);
     664        psFree(extname);
     665        psFree(header);
     666        psFree(images);
     667        return 0;
     668    }
     669    psFree(extname);
     670    psFree(header);
     671    psFree(images);
     672
     673    return true;
     674}
     675
     676
     677bool pmChipWriteCovariance(psFits *fits, const pmChip *chip)
     678{
     679    PS_ASSERT_PTR_NON_NULL(chip, false);
     680    PS_ASSERT_PTR_NON_NULL(fits, false);
     681
     682    psArray *cells = chip->cells;       // Array of cells
     683    for (int i = 0; i < cells->n; i++) {
     684        pmCell *cell = cells->data[i];  // Cell of interest
     685        if (!pmCellWriteCovariance(fits, cell)) {
     686            return false;
     687        }
     688    }
     689
     690    return true;
     691}
     692
     693
     694bool pmFPAWriteCovariance(psFits *fits, const pmFPA *fpa)
     695{
     696    PS_ASSERT_PTR_NON_NULL(fpa, false);
     697    PS_ASSERT_PTR_NON_NULL(fits, false);
     698
     699    psArray *chips = fpa->chips;        // Array of chips
     700    for (int i = 0; i < chips->n; i++) {
     701        pmChip *chip = chips->data[i];  // Chip of interest
     702        if (!pmChipWriteCovariance(fits, chip)) {
     703            return false;
     704        }
     705    }
     706
     707    return true;
     708}
Note: See TracChangeset for help on using the changeset viewer.