Changeset 20170
- Timestamp:
- Oct 15, 2008, 9:59:10 AM (18 years ago)
- Location:
- trunk/psphot/src
- Files:
-
- 2 edited
-
psphotImageQuality.c (modified) (1 diff)
-
psphotReadout.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psphot/src/psphotImageQuality.c
r19951 r20170 1 # include "psphotInternal.h" 2 # define USE_SAMPLE 1 /* sample vs robust stats */ 1 #include "psphotInternal.h" 2 #define USE_SAMPLE 1 /* sample vs robust stats */ 3 4 // XXX Lots of code duplication here 3 5 4 6 // selecting the 'good' stars (likely to be psf stars), measure the M_cn, M_sn terms for n = 2,3,4 5 bool psphotImageQuality (psMetadata *recipe, psArray *sources) { 6 7 psVector *FWHM_MAJOR = psVectorAllocEmpty (100, PS_TYPE_F32); 8 psVector *FWHM_MINOR = psVectorAllocEmpty (100, PS_TYPE_F32); 9 10 psVector *M2 = psVectorAllocEmpty (100, PS_TYPE_F32); 11 psVector *M3 = psVectorAllocEmpty (100, PS_TYPE_F32); 12 psVector *M4 = psVectorAllocEmpty (100, PS_TYPE_F32); 13 14 psVector *M2c = psVectorAllocEmpty (100, PS_TYPE_F32); 15 psVector *M2s = psVectorAllocEmpty (100, PS_TYPE_F32); 16 7 bool psphotImageQuality(psMetadata *recipe, psArray *sources) 8 { 9 psVector *FWHM_MAJOR = psVectorAllocEmpty(100, PS_TYPE_F32); 10 psVector *FWHM_MINOR = psVectorAllocEmpty(100, PS_TYPE_F32); 11 12 psVector *M2 = psVectorAllocEmpty(100, PS_TYPE_F32); 13 psVector *M3 = psVectorAllocEmpty(100, PS_TYPE_F32); 14 psVector *M4 = psVectorAllocEmpty(100, PS_TYPE_F32); 15 16 psVector *M2c = psVectorAllocEmpty(100, PS_TYPE_F32); 17 psVector *M2s = psVectorAllocEmpty(100, PS_TYPE_F32); 18 19 int num = 0; // Number of good sources 17 20 for (int i = 0; i < sources->n; i++) { 18 21 19 pmSource *source = sources->data[i]; 20 if (!source) continue; 21 22 // select by S/N? 23 // select by PSFSTAR mode? 24 // ?? 25 if (source->type != PM_SOURCE_TYPE_STAR) continue; 26 if (!(source->mode & PM_SOURCE_MODE_PSFSTAR)) continue; 27 28 pmMoments *moments = source->moments; 29 if (!moments) continue; 30 31 // if (source->moments->SN < XXX) continue; 32 33 // M_cn = \sum (f r^2 cos(n t)) / \sum (f) 34 // M_sn = \sum (f r^2 sin(n t)) / \sum (f) 35 36 // r^2 cos(2t) = r^2 cos^2 t - r^2 sin^2 t = x^2 - y^2 37 // r^2 sin(2t) = r^2 2 cos t sin t = 2 x y 38 39 // r^2 cos(3t) = r^2 cos^3 t - r^2 3 cos t sin^2 t = (x^3 - 3 x y^2) / r 40 // r^2 sin(3t) = r^2 3 cos^2 t sin t - sin^3 t = (3 x^2 y - y^3) / r 41 42 // r^2 cos(4t) = r^2 cos^4 t - r^2 6 cos^2 t sin^2 t + r^2 sin^4 t = (x^4 - 6 x^2 y^2 + y^4) / r^2 43 // r^2 sin(4t) = r^2 4 cos^3 t sin t - 4 sin^3 t cos t = (4 x^3 y - 4 y^3 x) / r^2 44 45 psEllipseMoments emoments; 46 emoments.x2 = moments->Mxx; 47 emoments.xy = moments->Mxy; 48 emoments.y2 = moments->Myy; 49 psEllipseAxes axes = psEllipseMomentsToAxes (emoments, 20.0); 50 51 psVectorAppend (FWHM_MAJOR, 2.355*axes.major); 52 psVectorAppend (FWHM_MINOR, 2.355*axes.minor); 53 54 // the moments->Mnnn terms contain the straight sums: for example: moments->Mxxx contains \sum x^3 / r 55 float M_c2 = moments->Mxx - moments->Myy; 56 float M_s2 = 2*moments->Mxy; 57 psVectorAppend (M2, hypot(M_c2, M_s2)); 58 psVectorAppend (M2c, M_c2); 59 psVectorAppend (M2s, M_s2); 60 61 float M_c3 = moments->Mxxx - 3.0*moments->Mxyy; 62 float M_s3 = 3.0*moments->Mxxy - moments->Myyy; 63 psVectorAppend (M3, hypot (M_c3, M_s3)); 64 65 float M_c4 = moments->Mxxxx - 6.0*moments->Mxxyy + moments->Myyyy; 66 float M_s4 = 4.0*moments->Mxxxy - 4.0*moments->Mxyyy; 67 psVectorAppend (M4, hypot (M_c4, M_s4)); 68 } 69 70 psMetadataAddS32 (recipe, PS_LIST_TAIL, "IQ_NSTAR", PS_META_REPLACE, "Number of stars used for IQ measurements", M2->n); 71 72 # if (USE_SAMPLE) 22 pmSource *source = sources->data[i]; 23 if (!source) { 24 continue; 25 } 26 27 // select by S/N? 28 // select by PSFSTAR mode? 29 // ?? 30 if (source->type != PM_SOURCE_TYPE_STAR || !(source->mode & PM_SOURCE_MODE_PSFSTAR)) { 31 continue; 32 } 33 34 pmMoments *moments = source->moments; 35 if (!moments) { 36 continue; 37 } 38 39 // if (source->moments->SN < XXX) continue; 40 41 // M_cn = \sum (f r^2 cos(n t)) / \sum (f) 42 // M_sn = \sum (f r^2 sin(n t)) / \sum (f) 43 44 // r^2 cos(2t) = r^2 cos^2 t - r^2 sin^2 t = x^2 - y^2 45 // r^2 sin(2t) = r^2 2 cos t sin t = 2 x y 46 47 // r^2 cos(3t) = r^2 cos^3 t - r^2 3 cos t sin^2 t = (x^3 - 3 x y^2) / r 48 // r^2 sin(3t) = r^2 3 cos^2 t sin t - sin^3 t = (3 x^2 y - y^3) / r 49 50 // r^2 cos(4t) = r^2 cos^4 t - r^2 6 cos^2 t sin^2 t + r^2 sin^4 t = (x^4 - 6 x^2 y^2 + y^4) / r^2 51 // r^2 sin(4t) = r^2 4 cos^3 t sin t - 4 sin^3 t cos t = (4 x^3 y - 4 y^3 x) / r^2 52 53 num++; 54 55 psEllipseMoments emoments; 56 emoments.x2 = moments->Mxx; 57 emoments.xy = moments->Mxy; 58 emoments.y2 = moments->Myy; 59 psEllipseAxes axes = psEllipseMomentsToAxes (emoments, 20.0); 60 61 psVectorAppend (FWHM_MAJOR, 2.355*axes.major); 62 psVectorAppend (FWHM_MINOR, 2.355*axes.minor); 63 64 // the moments->Mnnn terms contain the straight sums: for example: moments->Mxxx contains \sum x^3 / r 65 float M_c2 = moments->Mxx - moments->Myy; 66 float M_s2 = 2*moments->Mxy; 67 psVectorAppend (M2, hypot(M_c2, M_s2)); 68 psVectorAppend (M2c, M_c2); 69 psVectorAppend (M2s, M_s2); 70 71 float M_c3 = moments->Mxxx - 3.0*moments->Mxyy; 72 float M_s3 = 3.0*moments->Mxxy - moments->Myyy; 73 psVectorAppend (M3, hypot (M_c3, M_s3)); 74 75 float M_c4 = moments->Mxxxx - 6.0*moments->Mxxyy + moments->Myyyy; 76 float M_s4 = 4.0*moments->Mxxxy - 4.0*moments->Mxyyy; 77 psVectorAppend (M4, hypot (M_c4, M_s4)); 78 } 79 80 if (num == 0) { 81 psError(PSPHOT_ERR_PHOTOM, false, 82 "Unable to find sources from which to measure image quality"); 83 return false; 84 } 85 86 psMetadataAddS32(recipe, PS_LIST_TAIL, "IQ_NSTAR", PS_META_REPLACE, 87 "Number of stars used for IQ measurements", M2->n); 88 89 #if (USE_SAMPLE) 73 90 psStats *stats = psStatsAlloc (PS_STAT_SAMPLE_MEAN | PS_STAT_SAMPLE_STDEV | PS_STAT_SAMPLE_QUARTILE); 74 91 75 psVectorStats (stats, FWHM_MAJOR, NULL, NULL, 0); 92 if (!psVectorStats(stats, FWHM_MAJOR, NULL, NULL, 0)) { 93 psError(PSPHOT_ERR_UNKNOWN, false, "Unable to perform statistics to measure image quality"); 94 goto FAIL; 95 } 96 76 97 float fwhm_major = stats->sampleMean; 77 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_FW1", PS_META_REPLACE, "FWHM of Major Axis from moments", stats->sampleMean); 78 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_FW1_E", PS_META_REPLACE, "FWHM scatter (Major) from moments", stats->sampleStdev); 79 80 psVectorStats (stats, FWHM_MINOR, NULL, NULL, 0); 98 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_FW1", PS_META_REPLACE, 99 "FWHM of Major Axis from moments", stats->sampleMean); 100 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_FW1_E", PS_META_REPLACE, 101 "FWHM scatter (Major) from moments", stats->sampleStdev); 102 103 if (!psVectorStats(stats, FWHM_MINOR, NULL, NULL, 0)) { 104 psError(PSPHOT_ERR_UNKNOWN, false, "Unable to perform statistics to measure image quality"); 105 goto FAIL; 106 } 81 107 float fwhm_minor = stats->sampleMean; 82 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_FW2", PS_META_REPLACE, "FWHM of Minor Axis from moments", stats->sampleMean); 83 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_FW2_E", PS_META_REPLACE, "FWHM scatter (Minor) from moments", stats->sampleStdev); 84 85 psVectorStats (stats, M2, NULL, NULL, 0); 108 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_FW2", PS_META_REPLACE, 109 "FWHM of Minor Axis from moments", stats->sampleMean); 110 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_FW2_E", PS_META_REPLACE, 111 "FWHM scatter (Minor) from moments", stats->sampleStdev); 112 113 if (!psVectorStats(stats, M2, NULL, NULL, 0)) { 114 psError(PSPHOT_ERR_UNKNOWN, false, "Unable to perform statistics to measure image quality"); 115 goto FAIL; 116 } 86 117 float vM2 = stats->sampleMean; 87 118 float dM2 = stats->sampleStdev; 88 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M2", PS_META_REPLACE, "M_2 = sqrt (M_c2^2 + M_s2^2)", vM2); 89 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M2_ER", PS_META_REPLACE, "Stdev of M_2", dM2); 90 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M2_LQ", PS_META_REPLACE, "Lower Quartile of M_2", stats->sampleLQ); 91 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M2_UQ", PS_META_REPLACE, "Upper Quartile of M_2", stats->sampleUQ); 92 93 psVectorStats (stats, M2c, NULL, NULL, 0); 94 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M2C", PS_META_REPLACE, "M_2c = sum f r^2 cos(2phi) / sum f", stats->sampleMean); 95 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M2C_E", PS_META_REPLACE, "Stdev of M_2c", stats->sampleStdev); 96 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M2C_L", PS_META_REPLACE, "Lower Quartile of M_2c", stats->sampleLQ); 97 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M2C_U", PS_META_REPLACE, "Upper Quartile of M_2c", stats->sampleUQ); 98 99 psVectorStats (stats, M2s, NULL, NULL, 0); 100 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M2S", PS_META_REPLACE, "M_2s = sum f r^2 cos(2phi) / sum f", stats->sampleMean); 101 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M2S_E", PS_META_REPLACE, "Stdev of M_2s", stats->sampleStdev); 102 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M2S_L", PS_META_REPLACE, "Lower Quartile of M_2s", stats->sampleLQ); 103 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M2S_U", PS_META_REPLACE, "Upper Quartile of M_2s", stats->sampleUQ); 104 105 psVectorStats (stats, M3, NULL, NULL, 0); 119 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2", PS_META_REPLACE, 120 "M_2 = sqrt (M_c2^2 + M_s2^2)", vM2); 121 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2_ER", PS_META_REPLACE, 122 "Stdev of M_2", dM2); 123 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2_LQ", PS_META_REPLACE, 124 "Lower Quartile of M_2", stats->sampleLQ); 125 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2_UQ", PS_META_REPLACE, 126 "Upper Quartile of M_2", stats->sampleUQ); 127 128 if (!psVectorStats(stats, M2c, NULL, NULL, 0)) { 129 psError(PSPHOT_ERR_UNKNOWN, false, "Unable to perform statistics to measure image quality"); 130 goto FAIL; 131 } 132 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2C", PS_META_REPLACE, 133 "M_2c = sum f r^2 cos(2phi) / sum f", stats->sampleMean); 134 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2C_E", PS_META_REPLACE, 135 "Stdev of M_2c", stats->sampleStdev); 136 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2C_L", PS_META_REPLACE, 137 "Lower Quartile of M_2c", stats->sampleLQ); 138 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2C_U", PS_META_REPLACE, 139 "Upper Quartile of M_2c", stats->sampleUQ); 140 141 if (!psVectorStats(stats, M2s, NULL, NULL, 0)) { 142 psError(PSPHOT_ERR_UNKNOWN, false, "Unable to perform statistics to measure image quality"); 143 goto FAIL; 144 } 145 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2S", PS_META_REPLACE, 146 "M_2s = sum f r^2 cos(2phi) / sum f", stats->sampleMean); 147 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2S_E", PS_META_REPLACE, 148 "Stdev of M_2s", stats->sampleStdev); 149 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2S_L", PS_META_REPLACE, 150 "Lower Quartile of M_2s", stats->sampleLQ); 151 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2S_U", PS_META_REPLACE, 152 "Upper Quartile of M_2s", stats->sampleUQ); 153 154 if (!psVectorStats(stats, M3, NULL, NULL, 0)) { 155 psError(PSPHOT_ERR_UNKNOWN, false, "Unable to perform statistics to measure image quality"); 156 goto FAIL; 157 } 106 158 float vM3 = stats->sampleMean; 107 159 float dM3 = stats->sampleStdev; 108 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M3", PS_META_REPLACE, "M_3 = sqrt (M_c3^2 + M_s3^2)", vM3); 109 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M3_ER", PS_META_REPLACE, "Stdev of M_3", dM3); 110 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M3_LQ", PS_META_REPLACE, "Lower Quartile of M_3", stats->sampleLQ); 111 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M3_UQ", PS_META_REPLACE, "Upper Quartile of M_3", stats->sampleUQ); 112 113 psVectorStats (stats, M4, NULL, NULL, 0); 160 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M3", PS_META_REPLACE, 161 "M_3 = sqrt (M_c3^2 + M_s3^2)", vM3); 162 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M3_ER", PS_META_REPLACE, 163 "Stdev of M_3", dM3); 164 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M3_LQ", PS_META_REPLACE, 165 "Lower Quartile of M_3", stats->sampleLQ); 166 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M3_UQ", PS_META_REPLACE, 167 "Upper Quartile of M_3", stats->sampleUQ); 168 169 if (!psVectorStats(stats, M4, NULL, NULL, 0)) { 170 psError(PSPHOT_ERR_UNKNOWN, false, "Unable to perform statistics to measure image quality"); 171 goto FAIL; 172 } 114 173 float vM4 = stats->sampleMean; 115 174 float dM4 = stats->sampleStdev; 116 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M4", PS_META_REPLACE, "M_4 = sqrt (M_c4^2 + M_s4^2)", vM4); 117 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M4_ER", PS_META_REPLACE, "Stdev of M_4", dM4); 118 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M4_LQ", PS_META_REPLACE, "Lower Quartile of M_4", stats->sampleLQ); 119 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M4_UQ", PS_META_REPLACE, "Upper Quartile of M_4", stats->sampleUQ); 120 121 # else 175 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M4", PS_META_REPLACE, 176 "M_4 = sqrt (M_c4^2 + M_s4^2)", vM4); 177 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M4_ER", PS_META_REPLACE, 178 "Stdev of M_4", dM4); 179 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M4_LQ", PS_META_REPLACE, 180 "Lower Quartile of M_4", stats->sampleLQ); 181 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M4_UQ", PS_META_REPLACE, 182 "Upper Quartile of M_4", stats->sampleUQ); 183 184 #else 122 185 psStats *stats = psStatsAlloc (PS_STAT_ROBUST_MEDIAN | PS_STAT_ROBUST_STDEV | PS_STAT_ROBUST_QUARTILE); 123 186 124 psVectorStats (stats, FWHM_MAJOR, NULL, NULL, 0); 187 if (!psVectorStats(stats, FWHM_MAJOR, NULL, NULL, 0)) { 188 psError(PSPHOT_ERR_UNKNOWN, false, "Unable to perform statistics to measure image quality"); 189 goto FAIL; 190 } 125 191 float fwhm_major = stats->robustMedian; 126 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_FW1", PS_META_REPLACE, "FWHM of Major Axis from moments", stats->robustMedian); 127 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_FW1_E", PS_META_REPLACE, "FWHM scatter (Major) from moments", stats->robustStdev); 128 129 psVectorStats (stats, FWHM_MINOR, NULL, NULL, 0); 192 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_FW1", PS_META_REPLACE, 193 "FWHM of Major Axis from moments", stats->robustMedian); 194 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_FW1_E", PS_META_REPLACE, 195 "FWHM scatter (Major) from moments", stats->robustStdev); 196 197 if (!psVectorStats(stats, FWHM_MINOR, NULL, NULL, 0)) { 198 psError(PSPHOT_ERR_UNKNOWN, false, "Unable to perform statistics to measure image quality"); 199 goto FAIL; 200 } 130 201 float fwhm_minor = stats->robustMedian; 131 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_FW2", PS_META_REPLACE, "FWHM of Minor Axis from moments", stats->robustMedian); 132 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_FW2_E", PS_META_REPLACE, "FWHM scatter (Minor) from moments", stats->robustStdev); 133 134 psVectorStats (stats, M2, NULL, NULL, 0); 202 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_FW2", PS_META_REPLACE, 203 "FWHM of Minor Axis from moments", stats->robustMedian); 204 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_FW2_E", PS_META_REPLACE, 205 "FWHM scatter (Minor) from moments", stats->robustStdev); 206 207 if (!psVectorStats(stats, M2, NULL, NULL, 0)) { 208 psError(PSPHOT_ERR_UNKNOWN, false, "Unable to perform statistics to measure image quality"); 209 goto FAIL; 210 } 135 211 float vM2 = stats->robustMedian; 136 212 float dM2 = stats->robustStdev; 137 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M2", PS_META_REPLACE, "M_2 = sqrt (M_c2^2 + M_s2^2)", vM2); 138 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M2_ER", PS_META_REPLACE, "Stdev of M_2", dM2); 139 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M2_LQ", PS_META_REPLACE, "Lower Quartile of M_2", stats->robustLQ); 140 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M2_UQ", PS_META_REPLACE, "Upper Quartile of M_2", stats->robustUQ); 141 142 psVectorStats (stats, M2c, NULL, NULL, 0); 143 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M2C", PS_META_REPLACE, "M_2c = sum f r^2 cos(2phi) / sum f", stats->robustMedian); 144 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M2C_E", PS_META_REPLACE, "Stdev of M_2c", stats->robustStdev); 145 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M2C_L", PS_META_REPLACE, "Lower Quartile of M_2c", stats->robustLQ); 146 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M2C_U", PS_META_REPLACE, "Upper Quartile of M_2c", stats->robustUQ); 147 148 psVectorStats (stats, M2s, NULL, NULL, 0); 149 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M2S", PS_META_REPLACE, "M_2s = sum f r^2 cos(2phi) / sum f", stats->robustMedian); 150 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M2S_E", PS_META_REPLACE, "Stdev of M_2s", stats->robustStdev); 151 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M2S_L", PS_META_REPLACE, "Lower Quartile of M_2s", stats->robustLQ); 152 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M2S_U", PS_META_REPLACE, "Upper Quartile of M_2s", stats->robustUQ); 153 154 psVectorStats (stats, M3, NULL, NULL, 0); 213 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2", PS_META_REPLACE, 214 "M_2 = sqrt (M_c2^2 + M_s2^2)", vM2); 215 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2_ER", PS_META_REPLACE, 216 "Stdev of M_2", dM2); 217 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2_LQ", PS_META_REPLACE, 218 "Lower Quartile of M_2", stats->robustLQ); 219 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2_UQ", PS_META_REPLACE, 220 "Upper Quartile of M_2", stats->robustUQ); 221 222 if (!psVectorStats(stats, M2c, NULL, NULL, 0)) { 223 psError(PSPHOT_ERR_UNKNOWN, false, "Unable to perform statistics to measure image quality"); 224 goto FAIL; 225 } 226 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2C", PS_META_REPLACE, 227 "M_2c = sum f r^2 cos(2phi) / sum f", stats->robustMedian); 228 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2C_E", PS_META_REPLACE, 229 "Stdev of M_2c", stats->robustStdev); 230 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2C_L", PS_META_REPLACE, 231 "Lower Quartile of M_2c", stats->robustLQ); 232 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2C_U", PS_META_REPLACE, 233 "Upper Quartile of M_2c", stats->robustUQ); 234 235 if (!psVectorStats(stats, M2s, NULL, NULL, 0)) { 236 psError(PSPHOT_ERR_UNKNOWN, false, "Unable to perform statistics to measure image quality"); 237 goto FAIL; 238 } 239 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2S", PS_META_REPLACE, 240 "M_2s = sum f r^2 cos(2phi) / sum f", stats->robustMedian); 241 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2S_E", PS_META_REPLACE, 242 "Stdev of M_2s", stats->robustStdev); 243 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2S_L", PS_META_REPLACE, 244 "Lower Quartile of M_2s", stats->robustLQ); 245 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M2S_U", PS_META_REPLACE, 246 "Upper Quartile of M_2s", stats->robustUQ); 247 248 if (!psVectorStats(stats, M3, NULL, NULL, 0)) { 249 psError(PSPHOT_ERR_UNKNOWN, false, "Unable to perform statistics to measure image quality"); 250 goto FAIL; 251 } 155 252 float vM3 = stats->robustMedian; 156 253 float dM3 = stats->robustStdev; 157 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M3", PS_META_REPLACE, "M_3 = sqrt (M_c3^2 + M_s3^2)", vM3); 158 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M3_ER", PS_META_REPLACE, "Stdev of M_3", dM3); 159 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M3_LQ", PS_META_REPLACE, "Lower Quartile of M_3", stats->robustLQ); 160 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M3_UQ", PS_META_REPLACE, "Upper Quartile of M_3", stats->robustUQ); 161 162 psVectorStats (stats, M4, NULL, NULL, 0); 254 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M3", PS_META_REPLACE, 255 "M_3 = sqrt (M_c3^2 + M_s3^2)", vM3); 256 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M3_ER", PS_META_REPLACE, 257 "Stdev of M_3", dM3); 258 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M3_LQ", PS_META_REPLACE, 259 "Lower Quartile of M_3", stats->robustLQ); 260 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M3_UQ", PS_META_REPLACE, 261 "Upper Quartile of M_3", stats->robustUQ); 262 263 if (!psVectorStats(stats, M4, NULL, NULL, 0)) { 264 psError(PSPHOT_ERR_UNKNOWN, false, "Unable to perform statistics to measure image quality"); 265 goto FAIL; 266 } 163 267 float vM4 = stats->robustMedian; 164 268 float dM4 = stats->robustStdev; 165 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M4", PS_META_REPLACE, "M_4 = sqrt (M_c4^2 + M_s4^2)", vM4); 166 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M4_ER", PS_META_REPLACE, "Stdev of M_4", dM4); 167 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M4_LQ", PS_META_REPLACE, "Lower Quartile of M_4", stats->robustLQ); 168 psMetadataAddF32 (recipe, PS_LIST_TAIL, "IQ_M4_UQ", PS_META_REPLACE, "Upper Quartile of M_4", stats->robustUQ); 169 # endif 170 171 psLogMsg ("psphot", PS_LOG_INFO, "Image Quality Stats from %ld psf stars : FWHM (major, minor) : %f, %f M_2 : %f +/- %f, M_3 : %f +/- %f, M_4 : %f +/- %f\n", M2->n, fwhm_major, fwhm_minor, vM2, dM2, vM3, dM3, vM4, dM4); 172 173 psFree (FWHM_MAJOR); 174 psFree (FWHM_MINOR); 175 psFree (M2); 176 psFree (M2c); 177 psFree (M2s); 178 psFree (M3); 179 psFree (M4); 180 psFree (stats); 269 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M4", PS_META_REPLACE, 270 "M_4 = sqrt (M_c4^2 + M_s4^2)", vM4); 271 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M4_ER", PS_META_REPLACE, 272 "Stdev of M_4", dM4); 273 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M4_LQ", PS_META_REPLACE, 274 "Lower Quartile of M_4", stats->robustLQ); 275 psMetadataAddF32(recipe, PS_LIST_TAIL, "IQ_M4_UQ", PS_META_REPLACE, 276 "Upper Quartile of M_4", stats->robustUQ); 277 #endif 278 279 psLogMsg ("psphot", PS_LOG_INFO, 280 "Image Quality Stats from %ld psf stars : FWHM (major, minor) :" 281 "%f, %f M_2 : %f +/- %f, M_3 : %f +/- %f, M_4 : %f +/- %f\n", 282 M2->n, fwhm_major, fwhm_minor, vM2, dM2, vM3, dM3, vM4, dM4); 283 284 psFree(FWHM_MAJOR); 285 psFree(FWHM_MINOR); 286 psFree(M2); 287 psFree(M2c); 288 psFree(M2s); 289 psFree(M3); 290 psFree(M4); 291 psFree(stats); 181 292 182 293 return true; 294 295 FAIL: 296 psFree(FWHM_MAJOR); 297 psFree(FWHM_MINOR); 298 psFree(M2); 299 psFree(M2c); 300 psFree(M2s); 301 psFree(M3); 302 psFree(M4); 303 psFree(stats); 304 305 return false; 183 306 } -
trunk/psphot/src/psphotReadout.c
r19911 r20170 68 68 return psphotReadoutCleanup (config, readout, recipe, detections, psf, NULL); 69 69 } 70 70 71 71 // construct sources and measure basic stats 72 72 psArray *sources = psphotSourceStats (readout, recipe, detections); … … 95 95 } 96 96 97 psphotImageQuality (recipe, sources); 97 if (!psphotImageQuality (recipe, sources)) { 98 psLogMsg("psphot", 3, "failed to measure image quality"); 99 return psphotReadoutCleanup(config, readout, recipe, detections, psf, sources); 100 } 98 101 99 102 // if we were not supplied a PSF, choose one here
Note:
See TracChangeset
for help on using the changeset viewer.
