- Timestamp:
- Sep 15, 2009, 4:03:13 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/20090715/psModules/src/imcombine/pmSubtractionAnalysis.c
r23780 r25407 17 17 18 18 19 bool pmSubtractionAnalysis(psMetadata *analysis, pmSubtractionKernels *kernels, psRegion *region, 19 bool pmSubtractionAnalysis(psMetadata *analysis, psMetadata *header, 20 pmSubtractionKernels *kernels, psRegion *region, 20 21 int numCols, int numRows) 21 22 { 22 if (analysis) { 23 PS_ASSERT_METADATA_NON_NULL(analysis, false); 24 } 23 PS_ASSERT_METADATA_NON_NULL(analysis, false); 24 PS_ASSERT_METADATA_NON_NULL(header, false); 25 25 PM_ASSERT_SUBTRACTION_KERNELS_NON_NULL(kernels, false); 26 26 PM_ASSERT_SUBTRACTION_KERNELS_SOLUTION(kernels, false); … … 38 38 PS_DATA_REGION | PS_META_DUPLICATE_OK, 39 39 "Region over which subtraction was performed", subRegion); 40 41 psString string = psRegionToString(*subRegion); 40 42 psFree(subRegion); 43 44 psMetadataAddStr(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_REGION, PS_META_DUPLICATE_OK, 45 "Region over which subtraction was performed", string); 46 psFree(string); 41 47 } 42 48 … … 45 51 PS_DATA_UNKNOWN | PS_META_DUPLICATE_OK, "Subtraction kernels", kernels); 46 52 psMetadataAddS32(analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MODE, 47 PS_META_DUPLICATE_OK, "Subtraction kernels", kernels->mode); 53 PS_META_DUPLICATE_OK, "Subtraction mode", kernels->mode); 54 psMetadataAddS32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MODE, 55 PS_META_DUPLICATE_OK, "Subtraction mode", kernels->mode); 48 56 49 57 // Realisations of kernel … … 113 121 { 114 122 psMetadata *header = psMetadataAlloc(); // Header 115 for (int i = 0; i < solution->n; i++) {123 for (int i = 0; i < kernels->solution1->n; i++) { 116 124 psString name = NULL; // Header keyword 117 125 psStringAppend(&name, "SOLN%04d", i); 118 psMetadataAddF64(header, PS_LIST_TAIL, name, 0, NULL, solution->data.F64[i]);126 psMetadataAddF64(header, PS_LIST_TAIL, name, 0, NULL, kernels->solution1->data.F64[i]); 119 127 psFree(name); 120 128 } 121 psArray *kernelImages = pmSubtractionKernelSolutions( solution, kernels, 0.0, 0.0);129 psArray *kernelImages = pmSubtractionKernelSolutions(kernels, 0.0, 0.0, false); 122 130 psFits *kernelFile = psFitsOpen("kernels.fits", "w"); 123 131 (void)psFitsWriteImageCube(kernelFile, header, kernelImages, NULL); … … 128 136 #endif 129 137 130 131 // Set the variance factors132 float vf1 = 1.0, vf2 = 1.0; // Variance factors for each image133 switch (kernels->mode) {134 case PM_SUBTRACTION_MODE_1:135 vf1 = pmSubtractionVarianceFactor(kernels, 0.5, 0.5, false);136 break;137 case PM_SUBTRACTION_MODE_2:138 vf2 = pmSubtractionVarianceFactor(kernels, 0.5, 0.5, false);139 break;140 case PM_SUBTRACTION_MODE_DUAL:141 vf1 = pmSubtractionVarianceFactor(kernels, 0.5, 0.5, false);142 vf2 = pmSubtractionVarianceFactor(kernels, 0.5, 0.5, true);143 break;144 default:145 psAbort("Invalid subtraction mode: %x", kernels->mode);146 }147 148 // Weight by the area149 if (region) {150 float norm = (region->x1 - region->x0 + 1) * (region->y1 - region->y0 + 1) / (numCols * numRows);151 vf1 *= norm;152 vf2 *= norm;153 }154 155 // Update the variance factor156 #define UPDATE_VARFACTOR(VF, ANALYSIS) { \157 psMetadataItem *vfItem = psMetadataLookup(analysis, ANALYSIS); \158 if (vfItem) { \159 psAssert(vfItem->type == PS_TYPE_F32, "Should be the type we said."); \160 vfItem->data.F32 += VF; \161 } else { \162 psMetadataAddF32(analysis, PS_LIST_TAIL, ANALYSIS, 0, "Variance factor weighted by the area", VF); \163 } \164 }165 166 UPDATE_VARFACTOR(vf1, PM_SUBTRACTION_ANALYSIS_VARFACTOR_1);167 UPDATE_VARFACTOR(vf2, PM_SUBTRACTION_ANALYSIS_VARFACTOR_2);168 138 169 139 // Kernel shape … … 201 171 psFree(image); 202 172 203 psMetadataItem *item = psMetadataLookup(analysis, PM_SUBTRACTION_ANALYSIS_DECONV_MAX); // Previous 204 if (item) { 205 item->data.F32 = PS_MAX(item->data.F32, max); 206 } else { 207 psMetadataAddF32(analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_DECONV_MAX, 0, 208 "Maximum deconvolution fraction", max); 173 { 174 psMetadataItem *item = psMetadataLookup(analysis, PM_SUBTRACTION_ANALYSIS_DECONV_MAX); // Previous 175 if (item) { 176 max = item->data.F32 = PS_MAX(item->data.F32, max); 177 } else { 178 psMetadataAddF32(analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_DECONV_MAX, 0, 179 "Maximum deconvolution fraction", max); 180 } 181 } 182 183 { 184 psMetadataItem *item = psMetadataLookup(header, PM_SUBTRACTION_ANALYSIS_DECONV_MAX); // Previous 185 if (item) { 186 item->data.F32 = max; 187 } else { 188 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_DECONV_MAX, 0, 189 "Maximum deconvolution fraction", max); 190 } 209 191 } 210 192 } … … 254 236 psMetadataAddF32(analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MYY, 255 237 PS_META_DUPLICATE_OK, "Moment in yy", m02); 238 239 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_NORM, 240 PS_META_DUPLICATE_OK, "Normalisation", m00); 241 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MX, 242 PS_META_DUPLICATE_OK, "Moment in x", m10); 243 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MY, 244 PS_META_DUPLICATE_OK, "Moment in y", m01); 245 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MXX, 246 PS_META_DUPLICATE_OK, "Moment in xx", m20); 247 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MXY, 248 PS_META_DUPLICATE_OK, "Moment in xy", m11); 249 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MYY, 250 PS_META_DUPLICATE_OK, "Moment in yy", m02); 256 251 } 257 252 … … 263 258 264 259 psMetadataAddF32(analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_BGDIFF, 260 PS_META_DUPLICATE_OK, "Background difference", bg); 261 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_BGDIFF, 265 262 PS_META_DUPLICATE_OK, "Background difference", bg); 266 263 psFree(polyValues); … … 275 272 psMetadataAddF32(analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_DEV_RMS, 0, "RMS stamp deviation", 276 273 kernels->rms); 274 275 psMetadataAddS32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_STAMPS, 0, "Number of stamps", 276 kernels->numStamps); 277 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_DEV_MEAN, 0, "Mean stamp deviation", 278 kernels->mean); 279 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_DEV_RMS, 0, "RMS stamp deviation", 280 kernels->rms); 277 281 } 278 282
Note:
See TracChangeset
for help on using the changeset viewer.
