Changeset 23351 for branches/cnb_branches/cnb_branch_20090301/psModules/src/imcombine/pmSubtractionMatch.c
- Timestamp:
- Mar 17, 2009, 12:07:42 PM (17 years ago)
- Location:
- branches/cnb_branches/cnb_branch_20090301/psModules
- Files:
-
- 2 edited
-
. (modified) (1 prop)
-
src/imcombine/pmSubtractionMatch.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/cnb_branches/cnb_branch_20090301/psModules
-
Property svn:mergeinfo
set to (toggle deleted branches)
/branches/cnb_branches/cnb_branch_20090215/psModules merged eligible /trunk/psModules merged eligible /branches/cnb_branch_20090215/psModules 21495-22685 /branches/eam_branches/eam_branch_20090303/psModules 23158-23228
-
Property svn:mergeinfo
set to (toggle deleted branches)
-
branches/cnb_branches/cnb_branch_20090301/psModules/src/imcombine/pmSubtractionMatch.c
r21422 r23351 90 90 } 91 91 92 // Check input arguments 93 static bool subtractionMatchCheck(pmReadout *conv1, pmReadout *conv2, // Convolved images 94 const pmReadout *ro1, const pmReadout *ro2, // Input images 95 int stride, // Size for convolution patches 96 float sysError, // Relative systematic error 97 psImageMaskType maskVal, // Value to mask for input 98 psImageMaskType maskBad, // Mask for output bad pixels 99 psImageMaskType maskPoor, // Mask for output poor pixels 100 float poorFrac, // Fraction for "poor" 101 float badFrac, // Maximum fraction of bad input pixels to accept 102 pmSubtractionMode subMode // Mode of subtraction 103 ) 104 { 105 if (subMode != PM_SUBTRACTION_MODE_2) { 106 PM_ASSERT_READOUT_NON_NULL(conv1, false); 107 if (conv1->image) { 108 psFree(conv1->image); 109 conv1->image = NULL; 110 } 111 if (conv1->mask) { 112 psFree(conv1->mask); 113 conv1->mask = NULL; 114 } 115 if (conv1->variance) { 116 psFree(conv1->variance); 117 conv1->variance = NULL; 118 } 119 } 120 if (subMode != PM_SUBTRACTION_MODE_1) { 121 PM_ASSERT_READOUT_NON_NULL(conv2, false); 122 if (conv2->image) { 123 psFree(conv2->image); 124 conv2->image = NULL; 125 } 126 if (conv2->mask) { 127 psFree(conv2->mask); 128 conv2->mask = NULL; 129 } 130 if (conv2->variance) { 131 psFree(conv2->variance); 132 conv2->variance = NULL; 133 } 134 } 135 136 PM_ASSERT_READOUT_NON_NULL(ro1, false); 137 PM_ASSERT_READOUT_NON_NULL(ro2, false); 138 PM_ASSERT_READOUT_IMAGE(ro1, false); 139 PM_ASSERT_READOUT_IMAGE(ro2, false); 140 PS_ASSERT_IMAGES_SIZE_EQUAL(ro1->image, ro2->image, false); 141 PS_ASSERT_INT_NONNEGATIVE(stride, false); 142 if (isfinite(sysError)) { 143 PS_ASSERT_FLOAT_LARGER_THAN_OR_EQUAL(sysError, 0.0, false); 144 PS_ASSERT_FLOAT_LESS_THAN(sysError, 1.0, false); 145 } 146 // Don't care about maskVal 147 // Don't care about maskBad 148 // Don't care about maskPoor 149 PS_ASSERT_FLOAT_LARGER_THAN(poorFrac, 0.0, false); 150 PS_ASSERT_FLOAT_LESS_THAN_OR_EQUAL(poorFrac, 1.0, false); 151 if (isfinite(badFrac)) { 152 PS_ASSERT_FLOAT_LARGER_THAN(badFrac, 0.0, false); 153 PS_ASSERT_FLOAT_LESS_THAN_OR_EQUAL(badFrac, 1.0, false); 154 } 155 156 return true; 157 } 158 159 160 161 bool pmSubtractionMatchPrecalc(pmReadout *conv1, pmReadout *conv2, const pmReadout *ro1, const pmReadout *ro2, 162 psMetadata *analysis, int stride, float sysError, 163 psImageMaskType maskVal, psImageMaskType maskBad, psImageMaskType maskPoor, 164 float poorFrac, float badFrac) 165 { 166 PS_ASSERT_METADATA_NON_NULL(analysis, false); 167 168 // Extract the kernels 169 pmSubtractionMode mode = PM_SUBTRACTION_MODE_UNSURE; // Subtraction mode: which image to convolve 170 int size = 0; // Size of kernel 171 psList *kernelList = psListAlloc(NULL); // List of kernels 172 { 173 psMetadataIterator *iter = psMetadataIteratorAlloc(analysis, PS_LIST_HEAD, 174 "^" PM_SUBTRACTION_ANALYSIS_KERNEL "$"); 175 psMetadataItem *item; // Item from iteration 176 while ((item = psMetadataGetAndIncrement(iter))) { 177 if (item->type != PS_DATA_UNKNOWN) { 178 psError(PS_ERR_BAD_PARAMETER_TYPE, true, "Unexpected type for kernel."); 179 psFree(iter); 180 psFree(kernelList); 181 return false; 182 } 183 pmSubtractionKernels *kernel = item->data.V; // Kernel 184 PM_ASSERT_SUBTRACTION_KERNELS_NON_NULL(kernel, false); 185 size = PS_MAX(size, kernel->size); 186 if (mode == PM_SUBTRACTION_MODE_UNSURE) { 187 mode = kernel->mode; 188 } else if (kernel->mode != mode) { 189 // There's some confusion, so let's set the mode to dual convolution. 190 // This is only used for the subtraction mask, so it's not a big deal. 191 mode = PM_SUBTRACTION_MODE_DUAL; 192 } 193 psListAdd(kernelList, PS_LIST_TAIL, kernel); 194 } 195 psFree(iter); 196 } 197 if (psListLength(kernelList) == 0) { 198 psError(PS_ERR_BAD_PARAMETER_VALUE, true, "Unable to find kernels"); 199 psFree(kernelList); 200 return false; 201 } 202 psArray *kernels = psListToArray(kernelList); // Array of kernels 203 psFree(kernelList); 204 205 // Extract the regions 206 psArray *regions = psArrayAllocEmpty(kernels->n); // Array of regions 207 { 208 psMetadataIterator *iter = psMetadataIteratorAlloc(analysis, PS_LIST_HEAD, 209 "^" PM_SUBTRACTION_ANALYSIS_REGION "$"); 210 psMetadataItem *item; // Item from iteration 211 while ((item = psMetadataGetAndIncrement(iter))) { 212 if (item->type != PS_DATA_REGION) { 213 psError(PS_ERR_BAD_PARAMETER_TYPE, true, "Unexpected type for region."); 214 psFree(iter); 215 psFree(kernels); 216 psFree(regions); 217 return false; 218 } 219 psRegion *region = item->data.V; // Region 220 psArrayAdd(regions, regions->n, region); 221 } 222 psFree(iter); 223 } 224 if (regions->n != kernels->n) { 225 psError(PS_ERR_BAD_PARAMETER_VALUE, true, "Differing number of kernels (%ld) and regions (%ld)", 226 kernels->n, regions->n); 227 psFree(regions); 228 psFree(kernels); 229 return false; 230 } 231 232 if (!subtractionMatchCheck(conv1, conv2, ro1, ro2, stride, sysError, maskVal, maskBad, maskPoor, 233 poorFrac, badFrac, mode)) { 234 psFree(kernels); 235 psFree(regions); 236 return false; 237 } 238 239 psImage *subMask = pmSubtractionMask(ro1->mask, ro2 ? ro2->mask : NULL, maskVal, size, 0, 240 badFrac, useFFT); // Subtraction mask 241 if (!subMask) { 242 psError(PS_ERR_UNKNOWN, false, "Unable to generate subtraction mask."); 243 psFree(kernels); 244 psFree(regions); 245 return false; 246 } 247 248 psMetadata *outAnalysis = psMetadataAlloc(); // Output analysis values 249 250 psTrace("psModules.imcombine", 2, "Convolving...\n"); 251 for (int i = 0; i < kernels->n; i++) { 252 pmSubtractionKernels *kernel = kernels->data[i]; // Kernel of interest 253 psRegion *region = regions->data[i]; // Region of interest 254 255 if (!pmSubtractionAnalysis(outAnalysis, kernel, region, ro1->image->numCols, ro1->image->numRows)) { 256 psError(PS_ERR_UNKNOWN, false, "Unable to generate QA data"); 257 psFree(outAnalysis); 258 psFree(subMask); 259 psFree(kernels); 260 psFree(regions); 261 return false; 262 } 263 264 if (!pmSubtractionConvolve(conv1, conv2, ro1, ro2, subMask, stride, maskBad, maskPoor, poorFrac, 265 sysError, region, kernel, true, useFFT)) { 266 psError(PS_ERR_UNKNOWN, false, "Unable to convolve image."); 267 psFree(outAnalysis); 268 psFree(subMask); 269 psFree(kernels); 270 psFree(regions); 271 return false; 272 } 273 } 274 275 psFree(subMask); 276 psFree(kernels); 277 psFree(regions); 278 279 if (conv1) { 280 psMetadataCopy(conv1->analysis, outAnalysis); 281 } 282 if (conv2) { 283 psMetadataCopy(conv2->analysis, outAnalysis); 284 } 285 psFree(outAnalysis); 286 287 return true; 288 } 289 92 290 93 291 bool pmSubtractionMatch(pmReadout *conv1, pmReadout *conv2, const pmReadout *ro1, const pmReadout *ro2, … … 101 299 psImageMaskType maskPoor, float poorFrac, float badFrac, pmSubtractionMode subMode) 102 300 { 103 if (subMode != PM_SUBTRACTION_MODE_2) { 104 PM_ASSERT_READOUT_NON_NULL(conv1, false); 105 if (conv1->image) { 106 psFree(conv1->image); 107 conv1->image = NULL; 108 } 109 if (conv1->mask) { 110 psFree(conv1->mask); 111 conv1->mask = NULL; 112 } 113 if (conv1->variance) { 114 psFree(conv1->variance); 115 conv1->variance = NULL; 116 } 117 } 118 if (subMode != PM_SUBTRACTION_MODE_1) { 119 PM_ASSERT_READOUT_NON_NULL(conv2, false); 120 if (conv2->image) { 121 psFree(conv2->image); 122 conv2->image = NULL; 123 } 124 if (conv2->mask) { 125 psFree(conv2->mask); 126 conv2->mask = NULL; 127 } 128 if (conv2->variance) { 129 psFree(conv2->variance); 130 conv2->variance = NULL; 131 } 132 } 133 134 PM_ASSERT_READOUT_NON_NULL(ro1, false); 135 PM_ASSERT_READOUT_NON_NULL(ro2, false); 136 PM_ASSERT_READOUT_IMAGE(ro1, false); 137 PM_ASSERT_READOUT_IMAGE(ro2, false); 138 PS_ASSERT_IMAGES_SIZE_EQUAL(ro1->image, ro2->image, false); 301 if (!subtractionMatchCheck(conv1, conv2, ro1, ro2, stride, sysError, maskVal, maskBad, maskPoor, 302 poorFrac, badFrac, subMode)) { 303 return false; 304 } 139 305 140 306 PS_ASSERT_INT_NONNEGATIVE(footprint, false); 141 PS_ASSERT_INT_NONNEGATIVE(stride, false);142 307 // regionSize can be just about anything (except maybe negative, but it can be NAN) 143 308 PS_ASSERT_FLOAT_LARGER_THAN(stampSpacing, 0.0, false); … … 168 333 PS_ASSERT_INT_POSITIVE(iter, false); 169 334 PS_ASSERT_FLOAT_LARGER_THAN(rej, 0.0, false); 170 if (isfinite(sysError)) {171 PS_ASSERT_FLOAT_LARGER_THAN_OR_EQUAL(sysError, 0.0, NULL);172 PS_ASSERT_FLOAT_LESS_THAN(sysError, 1.0, NULL);173 }174 // Don't care about maskVal175 // Don't care about maskBad176 // Don't care about maskPoor177 PS_ASSERT_FLOAT_LARGER_THAN(poorFrac, 0.0, NULL);178 PS_ASSERT_FLOAT_LESS_THAN_OR_EQUAL(poorFrac, 1.0, NULL);179 if (isfinite(badFrac)) {180 PS_ASSERT_FLOAT_LARGER_THAN(badFrac, 0.0, NULL);181 PS_ASSERT_FLOAT_LESS_THAN_OR_EQUAL(badFrac, 1.0, NULL);182 }183 335 184 336 // If the stamp footprint is smaller than the kernel size, then we won't get much signal in the outer … … 214 366 int numCols = ro1->image->numCols, numRows = ro1->image->numRows; // Image dimensions 215 367 216 psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS , 0); // Random number generator368 psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS); // Random number generator 217 369 218 370 memCheck("start");
Note:
See TracChangeset
for help on using the changeset viewer.
