Changeset 28484 for branches/pap/psModules/src/objects/pmPSF_IO.c
- Timestamp:
- Jun 24, 2010, 2:59:09 PM (16 years ago)
- Location:
- branches/pap
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/pap
- Property svn:mergeinfo changed
-
branches/pap/psModules
- Property svn:mergeinfo changed
/branches/czw_branch/20100519/psModules (added) merged: 28164,28304,28334,28338
- Property svn:mergeinfo changed
-
branches/pap/psModules/src/objects/pmPSF_IO.c
r27531 r28484 174 174 PS_ASSERT_PTR_NON_NULL(chip, false); 175 175 176 if (!pmPSFmodelWrite(chip->analysis, view, file, config)) { 176 // We need the readout as well, because that has the PSF analysis data (e.g., clumps) 177 // There is only one, because photometry is done on chip-mosaicked data. 178 pmFPAview *roView = pmFPAviewAlloc(0); // View to readout 179 *roView = *view; 180 roView->cell = 0; 181 roView->readout = 0; 182 pmReadout *ro = pmFPAviewThisReadout(roView, chip->parent); // Readout with analysis data 183 psFree(roView); 184 185 if (!pmPSFmodelWrite(chip->analysis, ro ? ro->analysis : NULL, view, file, config)) { 177 186 psError(psErrorCodeLast(), false, "Failed to write PSF for chip"); 178 187 return false; … … 189 198 // else 190 199 // - psf table (+header) : FITS Table 191 bool pmPSFmodelWrite ( psMetadata *analysis, const pmFPAview *view,200 bool pmPSFmodelWrite (const psMetadata *chipAnalysis, const psMetadata *roAnalysis, const pmFPAview *view, 192 201 pmFPAfile *file, pmConfig *config) 193 202 { … … 198 207 char *headName, *tableName, *residName; 199 208 200 if (! analysis) {209 if (!chipAnalysis) { 201 210 psError(PM_ERR_PROG, true, "No analysis metadata for chip."); 202 211 return false; 212 } 213 if (!roAnalysis) { 214 psWarning("No analysis metadata for PSF, clump parameters cannot be saved."); 203 215 } 204 216 … … 314 326 315 327 // select the psf of interest 316 pmPSF *psf = psMetadataLookupPtr (&status, analysis, "PSPHOT.PSF");328 pmPSF *psf = psMetadataLookupPtr (&status, chipAnalysis, "PSPHOT.PSF"); 317 329 if (!psf) { 318 330 psError(PM_ERR_PROG, true, "missing PSF for this analysis metadata"); … … 346 358 347 359 // we now save clump parameters for each region : need to save all of those 348 int nRegions = psMetadataLookupS32 (&status, analysis, "PSF.CLUMP.NREGIONS"); 349 psMetadataAddS32 (header, PS_LIST_TAIL, "PSF_CLN", PS_META_REPLACE, "number of psf clump regions", nRegions); 350 for (int i = 0; i < nRegions; i++) { 351 char regionName[64]; 352 snprintf (regionName, 64, "PSF.CLUMP.REGION.%03d", i); 353 psMetadata *regionMD = psMetadataLookupPtr (&status, analysis, regionName); 354 355 psfClump.X = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.X"); assert (status); 356 psfClump.Y = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.Y"); assert (status); 357 psfClump.dX = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DX"); assert (status); 358 psfClump.dY = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DY"); assert (status); 359 360 char key[16]; 361 snprintf (key, 9, "CLX_%03d", i); 362 psMetadataAddF32 (header, PS_LIST_TAIL, key, PS_META_REPLACE, "psf clump center", psfClump.X); 363 snprintf (key, 9, "CLY_%03d", i); 364 psMetadataAddF32 (header, PS_LIST_TAIL, key, PS_META_REPLACE, "psf clump center", psfClump.Y); 365 snprintf (key, 9, "CLDX_%03d", i); 366 psMetadataAddF32 (header, PS_LIST_TAIL, key, PS_META_REPLACE, "psf clump size", psfClump.dX); 367 snprintf (key, 9, "CLDY_%03d", i); 368 psMetadataAddF32 (header, PS_LIST_TAIL, key, PS_META_REPLACE, "psf clump size", psfClump.dY); 360 if (roAnalysis) { 361 int nRegions = psMetadataLookupS32 (&status, roAnalysis, "PSF.CLUMP.NREGIONS"); 362 psMetadataAddS32 (header, PS_LIST_TAIL, "PSF_CLN", PS_META_REPLACE, "number of psf clump regions", nRegions); 363 for (int i = 0; i < nRegions; i++) { 364 char regionName[64]; 365 snprintf (regionName, 64, "PSF.CLUMP.REGION.%03d", i); 366 psMetadata *regionMD = psMetadataLookupPtr (&status, roAnalysis, regionName); 367 368 psfClump.X = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.X"); assert (status); 369 psfClump.Y = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.Y"); assert (status); 370 psfClump.dX = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DX"); assert (status); 371 psfClump.dY = psMetadataLookupF32 (&status, regionMD, "PSF.CLUMP.DY"); assert (status); 372 373 char key[16]; 374 snprintf (key, 9, "CLX_%03d", i); 375 psMetadataAddF32 (header, PS_LIST_TAIL, key, PS_META_REPLACE, "psf clump center", psfClump.X); 376 snprintf (key, 9, "CLY_%03d", i); 377 psMetadataAddF32 (header, PS_LIST_TAIL, key, PS_META_REPLACE, "psf clump center", psfClump.Y); 378 snprintf (key, 9, "CLDX_%03d", i); 379 psMetadataAddF32 (header, PS_LIST_TAIL, key, PS_META_REPLACE, "psf clump size", psfClump.dX); 380 snprintf (key, 9, "CLDY_%03d", i); 381 psMetadataAddF32 (header, PS_LIST_TAIL, key, PS_META_REPLACE, "psf clump size", psfClump.dY); 382 } 369 383 } 370 384 … … 492 506 493 507 // write the residuals as planes of the image 494 psArray *images = psArrayAllocEmpty (1);495 psArrayAdd (images, 1, psf->residuals->Ro); // z = 0 is Ro508 psArray *images = psArrayAllocEmpty (1); 509 psArrayAdd (images, 1, psf->residuals->Ro); // z = 0 is Ro 496 510 497 511 if (psf->residuals->Rx) { 498 512 psArrayAdd (images, 1, psf->residuals->Rx); 499 513 psArrayAdd (images, 1, psf->residuals->Ry); 500 }501 502 // note that all N plane are implicitly of the same type, so we convert the mask503 if (psf->residuals->mask) {504 psImage *mask = psImageCopy (NULL, psf->residuals->mask, psf->residuals->Ro->type.type);505 psArrayAdd (images, 1, mask);506 psFree (mask);507 }508 509 // psFitsWriteImageCube (file->fits, header, images, residName);510 // psFree (images);511 512 if (!psFitsWriteImageCube (file->fits, header, images, residName)) {514 } 515 516 // note that all N plane are implicitly of the same type, so we convert the mask 517 if (psf->residuals->mask) { 518 psImage *mask = psImageCopy (NULL, psf->residuals->mask, psf->residuals->Ro->type.type); 519 psArrayAdd (images, 1, mask); 520 psFree (mask); 521 } 522 523 // psFitsWriteImageCube (file->fits, header, images, residName); 524 // psFree (images); 525 526 if (!psFitsWriteImageCube (file->fits, header, images, residName)) { 513 527 psError(psErrorCodeLast(), false, "Unable to write PSF residuals."); 514 528 psFree(images); … … 728 742 PS_ASSERT_PTR_NON_NULL(file->fpa, false); 729 743 730 if (!pmPSFmodelRead (chip->analysis, view, file, config)) { 744 // We need the readout as well, because that has the PSF analysis data (e.g., clumps) 745 // There may be only one, because photometry is done on chip-mosaicked data. 746 if (chip->cells->n != 1) { 747 psError(PM_ERR_PROG, true, "Chip to receive PSF has %ld cells (should be only one)", 748 chip->cells->n); 749 return false; 750 } 751 pmCell *cell = chip->cells->data[0]; // Cell to receive PSF 752 pmReadout *ro = NULL; // Readout to receive PSF 753 if (cell->readouts->n == 0) { 754 ro = pmReadoutAlloc(cell); 755 psFree(ro); // Drop reference 756 } else if (cell->readouts->n != 1) { 757 psError(PM_ERR_PROG, true, "Cell to receive PSF has %ld readouts (should be only one)", 758 cell->readouts->n); 759 return false; 760 } else { 761 ro = cell->readouts->data[0]; 762 } 763 PM_ASSERT_READOUT_NON_NULL(ro, false); 764 if (!ro->analysis) { 765 ro->analysis = psMetadataAlloc(); 766 } 767 768 if (!pmPSFmodelRead(chip->analysis, ro->analysis, view, file, config)) { 731 769 psError(psErrorCodeLast(), false, "Failed to write PSF for chip"); 732 770 return false; … … 737 775 // for each Readout (ie, analysed image), we write out: header + table with PSF model parameters, 738 776 // and header + image for the PSF residual images 739 bool pmPSFmodelRead (psMetadata * analysis, const pmFPAview *view, pmFPAfile *file, const pmConfig *config)777 bool pmPSFmodelRead (psMetadata *chipAnalysis, psMetadata *roAnalysis, const pmFPAview *view, pmFPAfile *file, const pmConfig *config) 740 778 { 779 PS_ASSERT_METADATA_NON_NULL(chipAnalysis, false); 741 780 PS_ASSERT_PTR_NON_NULL(view, false); 742 781 PS_ASSERT_PTR_NON_NULL(file, false); … … 803 842 804 843 // read the psf clump data for each region 805 int nRegions = psMetadataLookupS32 (&status, header, "PSF_CLN"); 806 if (!status) { 807 // read old-style psf clump data 808 809 char regionName[64]; 810 snprintf (regionName, 64, "PSF.CLUMP.REGION.000"); 811 psMetadataAddS32 (analysis, PS_LIST_TAIL, "PSF.CLUMP.NREGIONS", PS_META_REPLACE, "psf clump regions", 1); 812 813 psMetadata *regionMD = psMetadataLookupPtr (&status, analysis, regionName); 814 if (!regionMD) { 815 regionMD = psMetadataAlloc(); 816 psMetadataAddMetadata (analysis, PS_LIST_TAIL, regionName, PS_META_REPLACE, "psf clump region", regionMD); 817 psFree (regionMD); 818 } 819 820 // psf clump data 821 pmPSFClump psfClump; 822 823 psfClump.X = psMetadataLookupF32 (&status, header, "PSF_CLX" ); assert(status); 824 psfClump.Y = psMetadataLookupF32 (&status, header, "PSF_CLY" ); assert(status); 825 psfClump.dX = psMetadataLookupF32 (&status, header, "PSF_CLDX"); assert(status); 826 psfClump.dY = psMetadataLookupF32 (&status, header, "PSF_CLDY"); assert(status); 827 828 psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.X", PS_META_REPLACE, "psf clump center", psfClump.X); 829 psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.Y", PS_META_REPLACE, "psf clump center", psfClump.Y); 830 psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.DX", PS_META_REPLACE, "psf clump center", psfClump.dX); 831 psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.DY", PS_META_REPLACE, "psf clump center", psfClump.dY); 832 } else { 833 psMetadataAddS32 (analysis, PS_LIST_TAIL, "PSF.CLUMP.NREGIONS", PS_META_REPLACE, "psf clump regions", nRegions); 834 835 for (int i = 0; i < nRegions; i++) { 836 char key[10]; 844 if (roAnalysis) { 845 int nRegions = psMetadataLookupS32 (&status, header, "PSF_CLN"); 846 if (!status) { 847 // read old-style psf clump data 848 837 849 char regionName[64]; 838 snprintf (regionName, 64, "PSF.CLUMP.REGION.%03d", i); 839 840 psMetadata *regionMD = psMetadataLookupPtr (&status, analysis, regionName); 850 snprintf (regionName, 64, "PSF.CLUMP.REGION.000"); 851 psMetadataAddS32 (roAnalysis, PS_LIST_TAIL, "PSF.CLUMP.NREGIONS", PS_META_REPLACE, "psf clump regions", 1); 852 853 psMetadata *regionMD = psMetadataLookupPtr (&status, roAnalysis, regionName); 841 854 if (!regionMD) { 842 855 regionMD = psMetadataAlloc(); 843 psMetadataAddMetadata ( analysis, PS_LIST_TAIL, regionName, PS_META_REPLACE, "psf clump region", regionMD);856 psMetadataAddMetadata (roAnalysis, PS_LIST_TAIL, regionName, PS_META_REPLACE, "psf clump region", regionMD); 844 857 psFree (regionMD); 845 858 } … … 848 861 pmPSFClump psfClump; 849 862 850 snprintf (key, 9, "CLX_%03d", i); 851 psfClump.X = psMetadataLookupF32 (&status, header, key); assert(status); 852 snprintf (key, 9, "CLY_%03d", i); 853 psfClump.Y = psMetadataLookupF32 (&status, header, key); assert(status); 854 snprintf (key, 9, "CLDX_%03d", i); 855 psfClump.dX = psMetadataLookupF32 (&status, header, key); assert(status); 856 snprintf (key, 9, "CLDY_%03d", i); 857 psfClump.dY = psMetadataLookupF32 (&status, header, key); assert(status); 863 psfClump.X = psMetadataLookupF32 (&status, header, "PSF_CLX" ); assert(status); 864 psfClump.Y = psMetadataLookupF32 (&status, header, "PSF_CLY" ); assert(status); 865 psfClump.dX = psMetadataLookupF32 (&status, header, "PSF_CLDX"); assert(status); 866 psfClump.dY = psMetadataLookupF32 (&status, header, "PSF_CLDY"); assert(status); 858 867 859 868 psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.X", PS_META_REPLACE, "psf clump center", psfClump.X); … … 861 870 psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.DX", PS_META_REPLACE, "psf clump center", psfClump.dX); 862 871 psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.DY", PS_META_REPLACE, "psf clump center", psfClump.dY); 872 } else { 873 psMetadataAddS32 (roAnalysis, PS_LIST_TAIL, "PSF.CLUMP.NREGIONS", PS_META_REPLACE, "psf clump regions", nRegions); 874 875 for (int i = 0; i < nRegions; i++) { 876 char key[10]; 877 char regionName[64]; 878 snprintf (regionName, 64, "PSF.CLUMP.REGION.%03d", i); 879 880 psMetadata *regionMD = psMetadataLookupPtr (&status, roAnalysis, regionName); 881 if (!regionMD) { 882 regionMD = psMetadataAlloc(); 883 psMetadataAddMetadata (roAnalysis, PS_LIST_TAIL, regionName, PS_META_REPLACE, "psf clump region", regionMD); 884 psFree (regionMD); 885 } 886 887 // psf clump data 888 pmPSFClump psfClump; 889 890 snprintf (key, 9, "CLX_%03d", i); 891 psfClump.X = psMetadataLookupF32 (&status, header, key); assert(status); 892 snprintf (key, 9, "CLY_%03d", i); 893 psfClump.Y = psMetadataLookupF32 (&status, header, key); assert(status); 894 snprintf (key, 9, "CLDX_%03d", i); 895 psfClump.dX = psMetadataLookupF32 (&status, header, key); assert(status); 896 snprintf (key, 9, "CLDY_%03d", i); 897 psfClump.dY = psMetadataLookupF32 (&status, header, key); assert(status); 898 899 psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.X", PS_META_REPLACE, "psf clump center", psfClump.X); 900 psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.Y", PS_META_REPLACE, "psf clump center", psfClump.Y); 901 psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.DX", PS_META_REPLACE, "psf clump center", psfClump.dX); 902 psMetadataAddF32 (regionMD, PS_LIST_TAIL, "PSF.CLUMP.DY", PS_META_REPLACE, "psf clump center", psfClump.dY); 903 } 863 904 } 864 905 } … … 1019 1060 } 1020 1061 1021 // note that all N plane are implicitly of the same type, so we convert the mask1022 psImage *mask = psImageCopy(NULL, psf->residuals->mask, psf->residuals->Ro->type.type);1023 psImageInit (psf->residuals->mask, 0);1024 psImageInit (psf->residuals->Rx, 0.0);1025 psImageInit (psf->residuals->Ry, 0.0);1026 switch (Nz) {1027 case 1: // Ro only1028 break;1029 case 2: // Ro and mask1062 // note that all N plane are implicitly of the same type, so we convert the mask 1063 psImage *mask = psImageCopy(NULL, psf->residuals->mask, psf->residuals->Ro->type.type); 1064 psImageInit (psf->residuals->mask, 0); 1065 psImageInit (psf->residuals->Rx, 0.0); 1066 psImageInit (psf->residuals->Ry, 0.0); 1067 switch (Nz) { 1068 case 1: // Ro only 1069 break; 1070 case 2: // Ro and mask 1030 1071 if (!psFitsReadImageBuffer(mask, file->fits, fullImage, 1)) { 1031 1072 psError(psErrorCodeLast(), false, "Unable to read PSF residual image."); 1032 1073 return false; 1033 1074 } 1034 psImageCopy (psf->residuals->mask, mask, PM_TYPE_RESID_MASK);1035 break;1036 case 3: // Ro, Rx and Ry, no mask1075 psImageCopy (psf->residuals->mask, mask, PM_TYPE_RESID_MASK); 1076 break; 1077 case 3: // Ro, Rx and Ry, no mask 1037 1078 if (!psFitsReadImageBuffer(psf->residuals->Rx, file->fits, fullImage, 1)) { 1038 1079 psError(psErrorCodeLast(), false, "Unable to read PSF residual image."); … … 1043 1084 return false; 1044 1085 } 1045 break;1046 case 4: // Ro, Rx, Ry, and mask:1086 break; 1087 case 4: // Ro, Rx, Ry, and mask: 1047 1088 if (!psFitsReadImageBuffer(psf->residuals->Rx, file->fits, fullImage, 1)) { 1048 1089 psError(psErrorCodeLast(), false, "Unable to read PSF residual image."); … … 1057 1098 return false; 1058 1099 } 1059 psImageCopy (psf->residuals->mask, mask, PM_TYPE_RESID_MASK);1060 break;1061 } 1062 psFree (mask);1063 } 1064 1065 psMetadataAdd ( analysis, PS_LIST_TAIL, "PSPHOT.PSF", PS_DATA_UNKNOWN, "psphot psf", psf);1100 psImageCopy (psf->residuals->mask, mask, PM_TYPE_RESID_MASK); 1101 break; 1102 } 1103 psFree (mask); 1104 } 1105 1106 psMetadataAdd (chipAnalysis, PS_LIST_TAIL, "PSPHOT.PSF", PS_DATA_UNKNOWN, "psphot psf", psf); 1066 1107 psFree (psf); 1067 1108
Note:
See TracChangeset
for help on using the changeset viewer.
