- Timestamp:
- May 3, 2010, 8:45:22 AM (16 years ago)
- Location:
- branches/simmosaic_branches
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/simmosaic_branches
- Property svn:mergeinfo changed
-
branches/simmosaic_branches/psModules
-
Property svn:mergeinfo
set to (toggle deleted branches)
/trunk/psModules merged eligible /branches/eam_branches/stackphot.20100406/psModules 27623-27653 /branches/pap_delete/psModules 27530-27595
-
Property svn:mergeinfo
set to (toggle deleted branches)
-
branches/simmosaic_branches/psModules/src/imcombine/pmSubtractionAnalysis.c
r23780 r27839 16 16 #define KERNEL_MOSAIC 2 // Half-number of kernel instances in the mosaic image 17 17 18 19 bool pmSubtractionAnalysis(psMetadata *analysis, pmSubtractionKernels *kernels, psRegion *region, 18 //#define TESTING 19 20 bool pmSubtractionAnalysis(psMetadata *analysis, psMetadata *header, 21 pmSubtractionKernels *kernels, psRegion *region, 20 22 int numCols, int numRows) 21 23 { 22 if (analysis) { 23 PS_ASSERT_METADATA_NON_NULL(analysis, false); 24 } 24 PS_ASSERT_METADATA_NON_NULL(analysis, false); 25 PS_ASSERT_METADATA_NON_NULL(header, false); 25 26 PM_ASSERT_SUBTRACTION_KERNELS_NON_NULL(kernels, false); 26 27 PM_ASSERT_SUBTRACTION_KERNELS_SOLUTION(kernels, false); … … 38 39 PS_DATA_REGION | PS_META_DUPLICATE_OK, 39 40 "Region over which subtraction was performed", subRegion); 41 42 psString string = psRegionToString(*subRegion); 40 43 psFree(subRegion); 44 45 psMetadataAddStr(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_REGION, PS_META_DUPLICATE_OK, 46 "Region over which subtraction was performed", string); 47 psFree(string); 41 48 } 42 49 … … 45 52 PS_DATA_UNKNOWN | PS_META_DUPLICATE_OK, "Subtraction kernels", kernels); 46 53 psMetadataAddS32(analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MODE, 47 PS_META_DUPLICATE_OK, "Subtraction kernels", kernels->mode); 54 PS_META_DUPLICATE_OK, "Subtraction mode", kernels->mode); 55 psMetadataAddS32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MODE, 56 PS_META_DUPLICATE_OK, "Subtraction mode", kernels->mode); 48 57 49 58 // Realisations of kernel … … 65 74 false); // Image of the kernel 66 75 if (!kernel) { 67 psError( PS_ERR_UNKNOWN, false, "Unable to generate kernel image.");76 psError(psErrorCodeLast(), false, "Unable to generate kernel image."); 68 77 psFree(convKernels); 69 78 return false; … … 72 81 if (psImageOverlaySection(convKernels, kernel, (i + KERNEL_MOSAIC) * fullSize, 73 82 (j + KERNEL_MOSAIC) * fullSize, "=") == 0) { 74 psError( PS_ERR_UNKNOWN, false, "Unable to overlay kernel image.");83 psError(psErrorCodeLast(), false, "Unable to overlay kernel image."); 75 84 psFree(kernel); 76 85 psFree(convKernels); … … 84 93 true); // Image of the kernel 85 94 if (!kernel) { 86 psError( PS_ERR_UNKNOWN, false, "Unable to generate kernel image.");95 psError(psErrorCodeLast(), false, "Unable to generate kernel image."); 87 96 psFree(convKernels); 88 97 return false; … … 92 101 (2 * KERNEL_MOSAIC + 1 + i + KERNEL_MOSAIC) * fullSize + 4, 93 102 (j + KERNEL_MOSAIC) * fullSize, "=") == 0) { 94 psError( PS_ERR_UNKNOWN, false, "Unable to overlay kernel image.");103 psError(psErrorCodeLast(), false, "Unable to overlay kernel image."); 95 104 psFree(kernel); 96 105 psFree(convKernels); … … 108 117 } 109 118 110 111 #if 0 119 // sample difference images 120 { 121 psMetadataAddArray(analysis, PS_LIST_TAIL, "SUBTRACTION.SAMPLE.STAMP.SET", PS_META_DUPLICATE_OK, "Sample Difference Stamps", kernels->sampleStamps); 122 } 123 124 #ifdef TESTING 112 125 // Generate images of the kernel components 113 126 { 114 127 psMetadata *header = psMetadataAlloc(); // Header 115 for (int i = 0; i < solution->n; i++) {128 for (int i = 0; i < kernels->solution1->n; i++) { 116 129 psString name = NULL; // Header keyword 117 130 psStringAppend(&name, "SOLN%04d", i); 118 psMetadataAddF64(header, PS_LIST_TAIL, name, 0, NULL, solution->data.F64[i]);131 psMetadataAddF64(header, PS_LIST_TAIL, name, 0, NULL, kernels->solution1->data.F64[i]); 119 132 psFree(name); 120 133 } 121 psArray *kernelImages = pmSubtractionKernelSolutions( solution, kernels, 0.0, 0.0);122 psFits *kernelFile = psFitsOpen("kernels .fits", "w");134 psArray *kernelImages = pmSubtractionKernelSolutions(kernels, 0.0, 0.0, false); 135 psFits *kernelFile = psFitsOpen("kernels1.fits", "w"); 123 136 (void)psFitsWriteImageCube(kernelFile, header, kernelImages, NULL); 124 137 psFitsClose(kernelFile); … … 126 139 psFree(header); 127 140 } 141 if (kernels->solution2) { 142 psMetadata *header = psMetadataAlloc(); // Header 143 for (int i = 0; i < kernels->solution2->n; i++) { 144 psString name = NULL; // Header keyword 145 psStringAppend(&name, "SOLN%04d", i); 146 psMetadataAddF64(header, PS_LIST_TAIL, name, 0, NULL, kernels->solution2->data.F64[i]); 147 psFree(name); 148 } 149 psArray *kernelImages = pmSubtractionKernelSolutions(kernels, 0.0, 0.0, true); 150 psFits *kernelFile = psFitsOpen("kernels2.fits", "w"); 151 (void)psFitsWriteImageCube(kernelFile, header, kernelImages, NULL); 152 psFitsClose(kernelFile); 153 psFree(kernelImages); 154 psFree(header); 155 } 128 156 #endif 129 157 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 158 169 159 // Kernel shape … … 171 161 psImage *image = pmSubtractionKernelImage(kernels, 0.5, 0.5, false); // Image of the kernel 172 162 if (!image) { 173 psError( PS_ERR_UNKNOWN, false, "Unable to generate image of kernel.");163 psError(psErrorCodeLast(), false, "Unable to generate image of kernel."); 174 164 return false; 175 165 } … … 201 191 psFree(image); 202 192 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); 193 { 194 psMetadataItem *item = psMetadataLookup(analysis, PM_SUBTRACTION_ANALYSIS_DECONV_MAX); // Previous 195 if (item) { 196 max = item->data.F32 = PS_MAX(item->data.F32, max); 197 } else { 198 psMetadataAddF32(analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_DECONV_MAX, 0, 199 "Maximum deconvolution fraction", max); 200 } 201 } 202 203 { 204 psMetadataItem *item = psMetadataLookup(header, PM_SUBTRACTION_ANALYSIS_DECONV_MAX); // Previous 205 if (item) { 206 item->data.F32 = max; 207 } else { 208 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_DECONV_MAX, 0, 209 "Maximum deconvolution fraction", max); 210 } 209 211 } 210 212 } … … 214 216 psImage *image = pmSubtractionKernelImage(kernels, 0.5, 0.5, false); // Image of the kernel 215 217 if (!image) { 216 psError( PS_ERR_UNKNOWN, false, "Unable to generate image of kernel.");218 psError(psErrorCodeLast(), false, "Unable to generate image of kernel."); 217 219 return false; 218 220 } … … 254 256 psMetadataAddF32(analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MYY, 255 257 PS_META_DUPLICATE_OK, "Moment in yy", m02); 258 259 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_NORM, 260 PS_META_DUPLICATE_OK, "Normalisation", m00); 261 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MX, 262 PS_META_DUPLICATE_OK, "Moment in x", m10); 263 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MY, 264 PS_META_DUPLICATE_OK, "Moment in y", m01); 265 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MXX, 266 PS_META_DUPLICATE_OK, "Moment in xx", m20); 267 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MXY, 268 PS_META_DUPLICATE_OK, "Moment in xy", m11); 269 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_MYY, 270 PS_META_DUPLICATE_OK, "Moment in yy", m02); 256 271 } 257 272 258 273 // Difference in background 259 274 { 260 psImage *polyValues = p_pmSubtractionPolynomialFromCoords(NULL, kernels, numCols, numRows, 261 numCols / 2.0, numRows / 2.0); // Polynomial 275 psImage *polyValues = p_pmSubtractionPolynomial(NULL, kernels->spatialOrder, 0.0, 0.0); // Polynomial 262 276 float bg = p_pmSubtractionSolutionBackground(kernels, polyValues); // Background difference 263 277 264 278 psMetadataAddF32(analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_BGDIFF, 279 PS_META_DUPLICATE_OK, "Background difference", bg); 280 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_BGDIFF, 265 281 PS_META_DUPLICATE_OK, "Background difference", bg); 266 282 psFree(polyValues); … … 275 291 psMetadataAddF32(analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_DEV_RMS, 0, "RMS stamp deviation", 276 292 kernels->rms); 293 294 psMetadataAddS32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_STAMPS, 0, "Number of stamps", 295 kernels->numStamps); 296 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_DEV_MEAN, 0, "Mean stamp deviation", 297 kernels->mean); 298 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_DEV_RMS, 0, "RMS stamp deviation", 299 kernels->rms); 300 301 psMetadataAddF32(analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_FSIGMA_RES_MEAN, 0, "Mean Fractional Sigma of Residuals", kernels->fSigResMean); 302 psMetadataAddF32(analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_FSIGMA_RES_STDEV, 0, "Mean Fractional Sigma of Residuals", kernels->fSigResStdev); 303 psMetadataAddF32(analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_FMIN_RES_MEAN, 0, "Mean Fractional Sigma of Residuals", kernels->fSigResMean); 304 psMetadataAddF32(analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_FMIN_RES_STDEV, 0, "Mean Fractional Sigma of Residuals", kernels->fSigResStdev); 305 psMetadataAddF32(analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_FMAX_RES_MEAN, 0, "Mean Fractional Sigma of Residuals", kernels->fSigResMean); 306 psMetadataAddF32(analysis, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_FMAX_RES_STDEV, 0, "Mean Fractional Sigma of Residuals", kernels->fSigResStdev); 307 308 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_FSIGMA_RES_MEAN, 0, "Mean Fractional Sigma of Residuals", kernels->fSigResMean); 309 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_FSIGMA_RES_STDEV, 0, "Mean Fractional Sigma of Residuals", kernels->fSigResStdev); 310 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_FMIN_RES_MEAN, 0, "Mean Fractional Sigma of Residuals", kernels->fSigResMean); 311 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_FMIN_RES_STDEV, 0, "Mean Fractional Sigma of Residuals", kernels->fSigResStdev); 312 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_FMAX_RES_MEAN, 0, "Mean Fractional Sigma of Residuals", kernels->fSigResMean); 313 psMetadataAddF32(header, PS_LIST_TAIL, PM_SUBTRACTION_ANALYSIS_FMAX_RES_STDEV, 0, "Mean Fractional Sigma of Residuals", kernels->fSigResStdev); 277 314 } 278 315
Note:
See TracChangeset
for help on using the changeset viewer.
