- Timestamp:
- Feb 2, 2009, 2:37:06 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/pap_branch_20090128/psModules/src/camera/pmFPAWrite.c
r21264 r21269 9 9 10 10 #include "pmConfig.h" 11 #include "pmConfigMask.h" 11 12 #include "pmHDU.h" 12 13 #include "pmFPA.h" … … 74 75 } 75 76 76 77 77 // Indicate whether a covariance matrix is defined 78 static 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) \ 85 static 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 100 SEARCH_COVARIANCES(cellSearchCovariances, pmCell, pmReadout, readouts, readoutSearchCovariances); 101 SEARCH_COVARIANCES(chipSearchCovariances, pmChip, pmCell, cells, cellSearchCovariances); 102 SEARCH_COVARIANCES(fpaSearchCovariances, pmFPA, pmChip, chips, chipSearchCovariances); 78 103 79 104 // Some type-specific additions to the header … … 81 106 pmChip *chip, // Chip of interest, or NULL 82 107 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 ) 85 111 { 86 112 switch (type) { … … 94 120 } 95 121 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 96 129 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 } 98 140 99 141 … … 137 179 return false; 138 180 } 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 } 141 185 if (!appropriateWriteFunc(hdu, fits, config, type)) { 142 186 psError(PS_ERR_IO, false, "Unable to write HDU for cell.\n"); … … 189 233 return false; 190 234 } 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 191 241 if (!appropriateWriteFunc(hdu, fits, config, type)) { 192 242 psError(PS_ERR_IO, false, "Unable to write HDU for chip.\n"); … … 253 303 return false; 254 304 } 305 if (!writeUpdateHeader(fpa, NULL, NULL, type, config)) { 306 psError(PS_ERR_UNKNOWN, false, "Unable to update header for writing"); 307 return false; 308 } 255 309 if (!appropriateWriteFunc(hdu, fits, config, type)) { 256 310 psError(PS_ERR_IO, false, "Unable to write HDU for FPA.\n"); … … 535 589 return numWrite; 536 590 } 591 592 bool 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 677 bool 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 694 bool 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.
