- Timestamp:
- May 3, 2010, 8:50:52 AM (16 years ago)
- Location:
- branches/simtest_nebulous_branches
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/simtest_nebulous_branches
- Property svn:mergeinfo changed
-
branches/simtest_nebulous_branches/ppSub/src
- Property svn:ignore
-
old new 13 13 ppSubErrorCodes.c 14 14 ppSubVersionDefinitions.h 15 ppSubConvolve
-
- Property svn:ignore
-
branches/simtest_nebulous_branches/ppSub/src/ppSubMakePSF.c
r23763 r27840 21 21 22 22 #include "ppSub.h" 23 24 psArray *ppSubSelectPSFSources(psArray *sources); 23 25 24 26 bool ppSubMakePSF(ppSubData *data) … … 57 59 pmFPAfile *photFile = psMetadataLookupPtr(&mdok, config->files, "PSPHOT.INPUT"); // Photometry file 58 60 if (!pmFPACopy(photFile->fpa, minuendFile->fpa)) { 59 psError(P S_ERR_UNKNOWN, false, "Unable to copy FPA for photometry");61 psError(PPSUB_ERR_CONFIG, false, "Unable to copy FPA for photometry"); 60 62 psFree(view); 61 63 return false; 62 64 } 65 63 66 pmReadout *photRO = pmFPAviewThisReadout(view, photFile->fpa); // Readout to photometer 64 if (psMetadataLookup(photRO->analysis, "PSPHOT.SOURCES")) { 65 psMetadataRemoveKey(photRO->analysis, "PSPHOT.SOURCES"); 67 68 // we need to remove any existing PSPHOT.DETECTIONS (why not do this in psphot?) 69 if (psMetadataLookup(photRO->analysis, "PSPHOT.DETECTIONS")) { 70 psMetadataRemoveKey(photRO->analysis, "PSPHOT.DETECTIONS"); 66 71 } 72 if (psMetadataLookup(photRO->parent->parent->analysis, "PSPHOT.PSF")) { 73 psMetadataRemoveKey(photRO->parent->parent->analysis, "PSPHOT.PSF"); 74 } 75 76 # ifdef TESTING 77 // XXX for testing, dump these images: 78 psphotSaveImage (NULL, photRO->image, "findpsf.im.fits"); 79 psphotSaveImage (NULL, photRO->variance, "findpsf.wt.fits"); 80 psphotSaveImage (NULL, photRO->mask, "findpsf.mk.fits"); 81 # endif 67 82 68 83 // Extract the loaded sources from the associated readout, and generate PSF 69 84 // Here, we assume the image is background-subtracted 70 psArray *sources = psMetadataLookupPtr(&mdok, minuend->analysis, "PSPHOT.SOURCES"); 71 if (!psphotReadoutFindPSF(config, view, sources)) { 85 pmDetections *detections = psMetadataLookupPtr(&mdok, minuend->analysis, "PSPHOT.DETECTIONS"); 86 if (!detections || !detections->allSources) { 87 psError(PPSUB_ERR_CONFIG, true, "No sources from which to determine PSF."); 88 return false; 89 } 90 psArray *sources = detections->allSources; 91 92 // XXX filter sources? limit the total number and return only brighter objects? 93 // use flags to toss totally bogus entries? 94 psArray *goodSources = ppSubSelectPSFSources (sources); 95 if (!psphotReadoutFindPSF(config, view, goodSources)) { 72 96 // This is likely a data quality issue 73 97 // XXX Split into multiple cases using error codes? … … 76 100 ppSubDataQuality(data, PSPHOT_ERR_PSF, PPSUB_FILES_PHOT_SUB | PPSUB_FILES_PHOT_INV); 77 101 psFree(view); 102 psFree(goodSources); 78 103 return true; 104 } 105 106 // save the resulting PSF information on the pmFPAfile PSPHOT.PSF.LOAD 107 pmFPAfile *psfFile = psMetadataLookupPtr(&mdok, config->files, "PSPHOT.PSF.LOAD"); // PSF file 108 if (!ppSubCopyPSF(psfFile, photFile, view)) { 109 psErrorStackPrint(stderr, "PSF was not generated"); 110 psWarning("PSF was not generated --- suspect bad data quality."); 111 ppSubDataQuality(data, psErrorCodeLast(), PPSUB_FILES_PHOT_SUB | PPSUB_FILES_PHOT_INV); 79 112 } 80 113 … … 82 115 psMetadataRemoveKey(photRO->analysis, "PSPHOT.HEADER"); 83 116 84 if (!data->quality) { 85 data->psf = psMemIncrRefCounter(psMetadataLookupPtr(NULL, photRO->parent->parent->analysis, 86 "PSPHOT.PSF")); 87 } 88 117 psFree(goodSources); 89 118 psFree(view); 90 119 91 120 return true; 92 121 } 122 123 bool ppSubCopyPSF(pmFPAfile *output, pmFPAfile *input, pmFPAview *view) 124 { 125 pmChip *inputChip = pmFPAviewThisChip(view, input->fpa); // Chip with PSF info 126 pmChip *outputChip = pmFPAviewThisChip(view, output->fpa); // Chip to store PSF info 127 128 pmReadout *inputRO = pmFPAviewThisReadout(view, input->fpa); // Readout with PSF info 129 pmReadout *outputRO = pmFPAviewThisReadout(view, output->fpa); // Readout to store PSF info 130 131 if (!outputRO) { 132 pmCell *outputCell = pmFPAviewThisCell(view, output->fpa); 133 outputRO = pmReadoutAlloc(outputCell); 134 outputRO->image = psMemIncrRefCounter(inputRO->image); 135 } 136 137 // Copy the PSF-related data 138 psMetadataIterator *iter = psMetadataIteratorAlloc(inputRO->analysis, PS_LIST_HEAD, "^PSF\\.CLUMP.*"); 139 psMetadataItem *item; // Item from iteration 140 while ((item = psMetadataGetAndIncrement(iter))) { 141 psMetadataAddItem(outputRO->analysis, item, PS_LIST_TAIL, PS_META_REPLACE); 142 } 143 psFree(iter); 144 145 // copy the PSF model data 146 pmPSF *psf = psMetadataLookupPtr(NULL, inputChip->analysis, "PSPHOT.PSF"); // PSF for photometry 147 if (!psf) { 148 psErrorStackPrint(stderr, "No PSF available"); 149 return false; 150 } 151 152 psMetadataAddPtr(outputChip->analysis, PS_LIST_TAIL, "PSPHOT.PSF", PS_DATA_UNKNOWN | PS_META_REPLACE, 153 "PSF from ppSubMakePSF", psf); 154 155 return true; 156 } 157 158 159 // XXX hardwired MAX for now 160 # define MAX_NPSF 500 161 162 psArray *ppSubSelectPSFSources(psArray *sources){ 163 164 sources = psArraySort (sources, pmSourceSortBySN); 165 166 psArray *subset = psArrayAllocEmpty(MAX_NPSF); 167 168 int nPSF = 0; 169 for (int i = 0; (nPSF < MAX_NPSF) && (i < sources->n); i++) { 170 171 pmSource *source = sources->data[i]; 172 if (!source) continue; 173 174 // skip non-astronomical objects (very likely defects) 175 if (source->type == PM_SOURCE_TYPE_DEFECT) continue; 176 if (source->type == PM_SOURCE_TYPE_SATURATED) continue; 177 if (source->mode & PM_SOURCE_MODE_SATSTAR) continue; 178 179 psArrayAdd (subset, 100, source); 180 nPSF++; 181 } 182 183 return subset; 184 }
Note:
See TracChangeset
for help on using the changeset viewer.
