Changeset 26894 for trunk/psphot/src/psphotImageQuality.c
- Timestamp:
- Feb 10, 2010, 7:36:29 PM (16 years ago)
- File:
-
- 1 edited
-
trunk/psphot/src/psphotImageQuality.c (modified) (16 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psphot/src/psphotImageQuality.c
r25755 r26894 4 4 // XXX Lots of code duplication here 5 5 6 // for now, let's store the detections on the readout->analysis for each readout 7 bool psphotImageQuality (pmConfig *config, const pmFPAview *view) 8 { 9 bool status = true; 10 11 // select the appropriate recipe information 12 psMetadata *recipe = psMetadataLookupPtr (&status, config->recipes, PSPHOT_RECIPE); 13 psAssert (recipe, "missing recipe?"); 14 15 int num = psMetadataLookupS32 (&status, config->arguments, "PSPHOT.INPUT.NUM"); 16 psAssert (status, "programming error: must define PSPHOT.INPUT.NUM"); 17 18 // loop over the available readouts 19 for (int i = 0; i < num; i++) { 20 if (!psphotImageQualityReadout (config, view, "PSPHOT.INPUT", i, recipe)) { 21 psError (PSPHOT_ERR_CONFIG, false, "failed on to measure image quality for PSPHOT.INPUT entry %d", i); 22 return false; 23 } 24 } 25 return true; 26 } 27 6 28 // selecting the 'good' stars (likely to be psf stars), measure the M_cn, M_sn terms for n = 2,3,4 7 bool psphotImageQuality (psMetadata *recipe, psArray *sources)29 bool psphotImageQualityReadout(pmConfig *config, const pmFPAview *view, const char *filename, int index, psMetadata *recipe) 8 30 { 31 bool status = true; 32 33 // find the currently selected readout 34 pmFPAfile *file = pmFPAfileSelectSingle(config->files, filename, index); // File of interest 35 psAssert (file, "missing file?"); 36 37 pmReadout *readout = pmFPAviewThisReadout(view, file->fpa); 38 psAssert (readout, "missing readout?"); 39 40 // if we have a PSF, skip this analysis 41 if (psMetadataLookupPtr (&status, readout->analysis, "PSPHOT.PSF")) { 42 return true; 43 } 44 45 pmDetections *detections = psMetadataLookupPtr (&status, readout->analysis, "PSPHOT.DETECTIONS"); 46 psAssert (detections, "missing detections?"); 47 48 psArray *sources = detections->newSources; 49 psAssert (sources, "missing sources?"); 50 51 if (!sources->n) { 52 psLogMsg ("psphot", PS_LOG_INFO, "no sources, skipping image quality"); 53 return true; 54 } 55 9 56 psVector *FWHM_MAJOR = psVectorAllocEmpty(100, PS_TYPE_F32); 10 57 psVector *FWHM_MINOR = psVectorAllocEmpty(100, PS_TYPE_F32); … … 81 128 82 129 if (num == 0) { 83 psWarning("Unable to find sources from which to measure image quality"); 84 return false; 85 } 86 87 psMetadataAddS32(recipe, PS_LIST_TAIL, "IQ_NSTAR", PS_META_REPLACE, 88 "Number of stars used for IQ measurements", M2->n); 130 psLogMsg ("psphot", PS_LOG_INFO, "no valid sources for image quality, skipping"); 131 return true; 132 } 133 134 psMetadataAddS32(readout->analysis, PS_LIST_TAIL, "IQ_NSTAR", PS_META_REPLACE, "Number of stars used for IQ measurements", M2->n); 89 135 90 136 // XXX make this a recipe option … … 98 144 99 145 float fwhm_major = stats->sampleMean; 100 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_FW1", PS_META_REPLACE, 101 "FWHM of Major Axis from moments", stats->sampleMean); 102 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_FW1_E", PS_META_REPLACE, 103 "FWHM scatter (Major) from moments", stats->sampleStdev); 146 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_FW1", PS_META_REPLACE, "FWHM of Major Axis from moments", stats->sampleMean); 147 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_FW1_E", PS_META_REPLACE, "FWHM scatter (Major) from moments", stats->sampleStdev); 104 148 105 149 if (!psVectorStats(stats, FWHM_MINOR, NULL, NULL, 0)) { … … 108 152 } 109 153 float fwhm_minor = stats->sampleMean; 110 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_FW2", PS_META_REPLACE, 111 "FWHM of Minor Axis from moments", stats->sampleMean); 112 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_FW2_E", PS_META_REPLACE, 113 "FWHM scatter (Minor) from moments", stats->sampleStdev); 154 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_FW2", PS_META_REPLACE, "FWHM of Minor Axis from moments", stats->sampleMean); 155 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_FW2_E", PS_META_REPLACE, "FWHM scatter (Minor) from moments", stats->sampleStdev); 114 156 115 157 if (!psVectorStats(stats, M2, NULL, NULL, 0)) { … … 119 161 float vM2 = stats->sampleMean; 120 162 float dM2 = stats->sampleStdev; 121 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2", PS_META_REPLACE, 122 "M_2 = sqrt (M_c2^2 + M_s2^2)", vM2); 123 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2_ER", PS_META_REPLACE, 124 "Stdev of M_2", dM2); 125 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2_LQ", PS_META_REPLACE, 126 "Lower Quartile of M_2", stats->sampleLQ); 127 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2_UQ", PS_META_REPLACE, 128 "Upper Quartile of M_2", stats->sampleUQ); 163 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M2", PS_META_REPLACE, "M_2 = sqrt (M_c2^2 + M_s2^2)", vM2); 164 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M2_ER", PS_META_REPLACE, "Stdev of M_2", dM2); 165 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M2_LQ", PS_META_REPLACE, "Lower Quartile of M_2", stats->sampleLQ); 166 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M2_UQ", PS_META_REPLACE, "Upper Quartile of M_2", stats->sampleUQ); 129 167 130 168 if (!psVectorStats(stats, M2c, NULL, NULL, 0)) { … … 132 170 goto FAIL; 133 171 } 134 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2C", PS_META_REPLACE, 135 "M_2c = sum f r^2 cos(2phi) / sum f", stats->sampleMean); 136 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2C_E", PS_META_REPLACE, 137 "Stdev of M_2c", stats->sampleStdev); 138 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2C_L", PS_META_REPLACE, 139 "Lower Quartile of M_2c", stats->sampleLQ); 140 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2C_U", PS_META_REPLACE, 141 "Upper Quartile of M_2c", stats->sampleUQ); 172 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M2C", PS_META_REPLACE, "M_2c = sum f r^2 cos(2phi) / sum f", stats->sampleMean); 173 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M2C_E", PS_META_REPLACE, "Stdev of M_2c", stats->sampleStdev); 174 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M2C_L", PS_META_REPLACE, "Lower Quartile of M_2c", stats->sampleLQ); 175 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M2C_U", PS_META_REPLACE, "Upper Quartile of M_2c", stats->sampleUQ); 142 176 143 177 if (!psVectorStats(stats, M2s, NULL, NULL, 0)) { … … 145 179 goto FAIL; 146 180 } 147 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2S", PS_META_REPLACE, 148 "M_2s = sum f r^2 cos(2phi) / sum f", stats->sampleMean); 149 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2S_E", PS_META_REPLACE, 150 "Stdev of M_2s", stats->sampleStdev); 151 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2S_L", PS_META_REPLACE, 152 "Lower Quartile of M_2s", stats->sampleLQ); 153 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2S_U", PS_META_REPLACE, 154 "Upper Quartile of M_2s", stats->sampleUQ); 181 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M2S", PS_META_REPLACE, "M_2s = sum f r^2 cos(2phi) / sum f", stats->sampleMean); 182 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M2S_E", PS_META_REPLACE, "Stdev of M_2s", stats->sampleStdev); 183 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M2S_L", PS_META_REPLACE, "Lower Quartile of M_2s", stats->sampleLQ); 184 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M2S_U", PS_META_REPLACE, "Upper Quartile of M_2s", stats->sampleUQ); 155 185 156 186 if (!psVectorStats(stats, M3, NULL, NULL, 0)) { … … 160 190 float vM3 = stats->sampleMean; 161 191 float dM3 = stats->sampleStdev; 162 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M3", PS_META_REPLACE, 163 "M_3 = sqrt (M_c3^2 + M_s3^2)", vM3); 164 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M3_ER", PS_META_REPLACE, 165 "Stdev of M_3", dM3); 166 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M3_LQ", PS_META_REPLACE, 167 "Lower Quartile of M_3", stats->sampleLQ); 168 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M3_UQ", PS_META_REPLACE, 169 "Upper Quartile of M_3", stats->sampleUQ); 192 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M3", PS_META_REPLACE, "M_3 = sqrt (M_c3^2 + M_s3^2)", vM3); 193 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M3_ER", PS_META_REPLACE, "Stdev of M_3", dM3); 194 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M3_LQ", PS_META_REPLACE, "Lower Quartile of M_3", stats->sampleLQ); 195 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M3_UQ", PS_META_REPLACE, "Upper Quartile of M_3", stats->sampleUQ); 170 196 171 197 if (!psVectorStats(stats, M4, NULL, NULL, 0)) { … … 175 201 float vM4 = stats->sampleMean; 176 202 float dM4 = stats->sampleStdev; 177 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M4", PS_META_REPLACE, 178 "M_4 = sqrt (M_c4^2 + M_s4^2)", vM4); 179 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M4_ER", PS_META_REPLACE, 180 "Stdev of M_4", dM4); 181 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M4_LQ", PS_META_REPLACE, 182 "Lower Quartile of M_4", stats->sampleLQ); 183 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M4_UQ", PS_META_REPLACE, 184 "Upper Quartile of M_4", stats->sampleUQ); 203 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M4", PS_META_REPLACE, "M_4 = sqrt (M_c4^2 + M_s4^2)", vM4); 204 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M4_ER", PS_META_REPLACE, "Stdev of M_4", dM4); 205 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M4_LQ", PS_META_REPLACE, "Lower Quartile of M_4", stats->sampleLQ); 206 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M4_UQ", PS_META_REPLACE, "Upper Quartile of M_4", stats->sampleUQ); 185 207 186 208 #else … … 192 214 } 193 215 float fwhm_major = stats->robustMedian; 194 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_FW1", PS_META_REPLACE, 195 "FWHM of Major Axis from moments", stats->robustMedian); 196 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_FW1_E", PS_META_REPLACE, 197 "FWHM scatter (Major) from moments", stats->robustStdev); 216 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_FW1", PS_META_REPLACE, "FWHM of Major Axis from moments", stats->robustMedian); 217 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_FW1_E", PS_META_REPLACE, "FWHM scatter (Major) from moments", stats->robustStdev); 198 218 199 219 if (!psVectorStats(stats, FWHM_MINOR, NULL, NULL, 0)) { … … 202 222 } 203 223 float fwhm_minor = stats->robustMedian; 204 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_FW2", PS_META_REPLACE, 205 "FWHM of Minor Axis from moments", stats->robustMedian); 206 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_FW2_E", PS_META_REPLACE, 207 "FWHM scatter (Minor) from moments", stats->robustStdev); 224 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_FW2", PS_META_REPLACE, "FWHM of Minor Axis from moments", stats->robustMedian); 225 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_FW2_E", PS_META_REPLACE, "FWHM scatter (Minor) from moments", stats->robustStdev); 208 226 209 227 if (!psVectorStats(stats, M2, NULL, NULL, 0)) { … … 213 231 float vM2 = stats->robustMedian; 214 232 float dM2 = stats->robustStdev; 215 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2", PS_META_REPLACE, 216 "M_2 = sqrt (M_c2^2 + M_s2^2)", vM2); 217 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2_ER", PS_META_REPLACE, 218 "Stdev of M_2", dM2); 219 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2_LQ", PS_META_REPLACE, 220 "Lower Quartile of M_2", stats->robustLQ); 221 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2_UQ", PS_META_REPLACE, 222 "Upper Quartile of M_2", stats->robustUQ); 233 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M2", PS_META_REPLACE, "M_2 = sqrt (M_c2^2 + M_s2^2)", vM2); 234 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M2_ER", PS_META_REPLACE, "Stdev of M_2", dM2); 235 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M2_LQ", PS_META_REPLACE, "Lower Quartile of M_2", stats->robustLQ); 236 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M2_UQ", PS_META_REPLACE, "Upper Quartile of M_2", stats->robustUQ); 223 237 224 238 if (!psVectorStats(stats, M2c, NULL, NULL, 0)) { … … 226 240 goto FAIL; 227 241 } 228 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2C", PS_META_REPLACE, 229 "M_2c = sum f r^2 cos(2phi) / sum f", stats->robustMedian); 230 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2C_E", PS_META_REPLACE, 231 "Stdev of M_2c", stats->robustStdev); 232 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2C_L", PS_META_REPLACE, 233 "Lower Quartile of M_2c", stats->robustLQ); 234 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2C_U", PS_META_REPLACE, 235 "Upper Quartile of M_2c", stats->robustUQ); 242 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M2C", PS_META_REPLACE, "M_2c = sum f r^2 cos(2phi) / sum f", stats->robustMedian); 243 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M2C_E", PS_META_REPLACE, "Stdev of M_2c", stats->robustStdev); 244 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M2C_L", PS_META_REPLACE, "Lower Quartile of M_2c", stats->robustLQ); 245 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M2C_U", PS_META_REPLACE, "Upper Quartile of M_2c", stats->robustUQ); 236 246 237 247 if (!psVectorStats(stats, M2s, NULL, NULL, 0)) { … … 239 249 goto FAIL; 240 250 } 241 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2S", PS_META_REPLACE, 242 "M_2s = sum f r^2 cos(2phi) / sum f", stats->robustMedian); 243 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2S_E", PS_META_REPLACE, 244 "Stdev of M_2s", stats->robustStdev); 245 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2S_L", PS_META_REPLACE, 246 "Lower Quartile of M_2s", stats->robustLQ); 247 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2S_U", PS_META_REPLACE, 248 "Upper Quartile of M_2s", stats->robustUQ); 251 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M2S", PS_META_REPLACE, "M_2s = sum f r^2 cos(2phi) / sum f", stats->robustMedian); 252 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M2S_E", PS_META_REPLACE, "Stdev of M_2s", stats->robustStdev); 253 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M2S_L", PS_META_REPLACE, "Lower Quartile of M_2s", stats->robustLQ); 254 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M2S_U", PS_META_REPLACE, "Upper Quartile of M_2s", stats->robustUQ); 249 255 250 256 if (!psVectorStats(stats, M3, NULL, NULL, 0)) { … … 254 260 float vM3 = stats->robustMedian; 255 261 float dM3 = stats->robustStdev; 256 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M3", PS_META_REPLACE, 257 "M_3 = sqrt (M_c3^2 + M_s3^2)", vM3); 258 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M3_ER", PS_META_REPLACE, 259 "Stdev of M_3", dM3); 260 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M3_LQ", PS_META_REPLACE, 261 "Lower Quartile of M_3", stats->robustLQ); 262 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M3_UQ", PS_META_REPLACE, 263 "Upper Quartile of M_3", stats->robustUQ); 262 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M3", PS_META_REPLACE, "M_3 = sqrt (M_c3^2 + M_s3^2)", vM3); 263 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M3_ER", PS_META_REPLACE, "Stdev of M_3", dM3); 264 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M3_LQ", PS_META_REPLACE, "Lower Quartile of M_3", stats->robustLQ); 265 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M3_UQ", PS_META_REPLACE, "Upper Quartile of M_3", stats->robustUQ); 264 266 265 267 if (!psVectorStats(stats, M4, NULL, NULL, 0)) { … … 269 271 float vM4 = stats->robustMedian; 270 272 float dM4 = stats->robustStdev; 271 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M4", PS_META_REPLACE, 272 "M_4 = sqrt (M_c4^2 + M_s4^2)", vM4); 273 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M4_ER", PS_META_REPLACE, 274 "Stdev of M_4", dM4); 275 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M4_LQ", PS_META_REPLACE, 276 "Lower Quartile of M_4", stats->robustLQ); 277 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M4_UQ", PS_META_REPLACE, 278 "Upper Quartile of M_4", stats->robustUQ); 273 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M4", PS_META_REPLACE, "M_4 = sqrt (M_c4^2 + M_s4^2)", vM4); 274 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M4_ER", PS_META_REPLACE, "Stdev of M_4", dM4); 275 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M4_LQ", PS_META_REPLACE, "Lower Quartile of M_4", stats->robustLQ); 276 psMetadataAddF32(readout->analysis, PS_LIST_TAIL, "IQ_M4_UQ", PS_META_REPLACE, "Upper Quartile of M_4", stats->robustUQ); 279 277 #endif 280 278
Note:
See TracChangeset
for help on using the changeset viewer.
