Changeset 7875
- Timestamp:
- Jul 11, 2006, 6:44:01 PM (20 years ago)
- Location:
- trunk/psModules/src/detrend
- Files:
-
- 2 edited
-
pmFringeStats.c (modified) (12 diffs)
-
pmFringeStats.h (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/detrend/pmFringeStats.c
r7836 r7875 3 3 * @author Eugene Magnier, IfA 4 4 * 5 * @version $Revision: 1.1 2$ $Name: not supported by cvs2svn $6 * @date $Date: 2006-07- 07 03:26:22$5 * @version $Revision: 1.13 $ $Name: not supported by cvs2svn $ 6 * @date $Date: 2006-07-12 04:44:01 $ 7 7 * 8 8 * Copyright 2004 IfA … … 56 56 } 57 57 58 bool pmFringeRegionsCreatePoints(pmFringeRegions *fringe, const psImage *image )58 bool pmFringeRegionsCreatePoints(pmFringeRegions *fringe, const psImage *image, psRandom *random) 59 59 { 60 60 PS_ASSERT_PTR_NON_NULL(fringe, false); … … 65 65 // create fringe->nRequested 66 66 67 psRandom *rnd = psRandomAlloc(PS_RANDOM_TAUS, 0); 67 psRandom *rng; 68 if (random) { 69 rng = psMemIncrRefCounter(random); 70 } else { 71 rng = psRandomAlloc(PS_RANDOM_TAUS, 0); 72 } 68 73 69 74 fringe->x = psVectorRecycle(fringe->x, fringe->nRequested, PS_TYPE_F32); … … 84 89 // generate random points located within image bounds 85 90 for (int i = 0; i < fringe->nRequested; i++) { 86 frnd = psRandomUniform(rn d);91 frnd = psRandomUniform(rng); 87 92 xPt[i] = (nX - 2*dX)* frnd + dX; 88 frnd = psRandomUniform(rn d);93 frnd = psRandomUniform(rng); 89 94 yPt[i] = (nY - 2*dY)* frnd + dY; 90 95 } 96 97 psFree(rng); 98 91 99 return true; 92 100 } 93 101 102 bool pmFringeRegionsWriteFits(psFits *fits, psMetadata *header, 103 const pmFringeRegions *regions, const char *extname) 104 { 105 // Make sure the input is well-behaved 106 PS_ASSERT_PTR_NON_NULL(fits, false); 107 PS_ASSERT_PTR_NON_NULL(regions, false); 108 psVector *x = regions->x; // The x positions 109 psVector *y = regions->y; // The y positions 110 psVector *mask = regions->mask; // The region mask 111 int numRows = regions->nRequested; // Number of rows in the table 112 PS_ASSERT_INT_POSITIVE(numRows, false); 113 PS_ASSERT_VECTOR_NON_NULL(x, false); 114 PS_ASSERT_VECTOR_NON_NULL(y, false); 115 PS_ASSERT_VECTOR_TYPE(x, PS_TYPE_F32, false); 116 PS_ASSERT_VECTOR_TYPE(y, PS_TYPE_F32, false); 117 PS_ASSERT_VECTOR_SIZE(x, numRows, false); 118 PS_ASSERT_VECTOR_SIZE(y, numRows, false); 119 if (mask) { 120 PS_ASSERT_VECTOR_NON_NULL(mask, false); 121 PS_ASSERT_VECTOR_TYPE(mask, PS_TYPE_U8, false); 122 PS_ASSERT_VECTOR_SIZE(mask, numRows, false); 123 } 124 125 // We need to write: 126 // Scalars: dX, dY, nX, nY 127 // Vectors: x, y 128 129 psMetadata *scalars = psMetadataAlloc(); // Metadata to hold the scalars; will be the header 130 psMetadataAddF32(scalars, PS_LIST_TAIL, "PSFRNGDX", PS_META_REPLACE, "Median box half-width", 131 regions->dX); 132 psMetadataAddF32(scalars, PS_LIST_TAIL, "PSFRNGDY", PS_META_REPLACE, "Median box half-height", 133 regions->dY); 134 psMetadataAddF32(scalars, PS_LIST_TAIL, "PSFRNGNX", PS_META_REPLACE, "Large-scale smoothing in x", 135 regions->nX); 136 psMetadataAddF32(scalars, PS_LIST_TAIL, "PSFRNGNY", PS_META_REPLACE, "Large-scale smoothing in y", 137 regions->nY); 138 139 psArray *table = psArrayAlloc(numRows); // The table 140 table->n = numRows; 141 // Translate the vectors into the required format for psFitsWriteTable() 142 for (long i = 0; i < numRows; i++) { 143 psMetadata *row = psMetadataAlloc(); 144 psMetadataAddF32(row, PS_LIST_TAIL, "x", PS_META_REPLACE, "Fringe position in x", x->data.F32[i]); 145 psMetadataAddF32(row, PS_LIST_TAIL, "y", PS_META_REPLACE, "Fringe position in y", y->data.F32[i]); 146 table->data[i] = row; 147 } 148 149 bool success; // Success of operation 150 if (!(success = psFitsWriteTable(fits, scalars, table, extname))) { 151 psError(PS_ERR_IO, false, "Unable to write fringe data to extension %s\n", extname); 152 } 153 psFree(scalars); 154 psFree(table); 155 156 return success; 157 } 158 159 pmFringeRegions *pmFringeRegionsReadFits(psMetadata *header, const psFits *fits, const char *extname) 160 { 161 PS_ASSERT_PTR_NON_NULL(fits, NULL); 162 163 if (extname && strlen(extname) > 0) { 164 if (!psFitsMoveExtName(fits, extname)) { 165 psError(PS_ERR_IO, false, "Unable to move to extension %s\n", extname); 166 return NULL; 167 } 168 } else if (!psFitsMoveExtNum(fits, 0, false)) { 169 psError(PS_ERR_IO, false, "Unable to move to PHU\n"); 170 return NULL; 171 } 172 173 psMetadata *headerCopy = psMemIncrRefCounter(header); // Copy of the header, or NULL 174 175 headerCopy = psFitsReadHeader(headerCopy, fits); // The FITS header 176 if (!headerCopy) { 177 psError(PS_ERR_IO, false, "Unable to read header for extension %s\n", extname); 178 psFree(header); 179 return NULL; 180 } 181 182 // Read the scalars from the header 183 #define READ_SCALAR(SCALAR, NAME) \ 184 int SCALAR = psMetadataLookupS32(&mdok, header, NAME); \ 185 if (!mdok || SCALAR <= 0) { \ 186 psError(PS_ERR_IO, true, "Unable to find " NAME " in header of extension %s.\n", extname); \ 187 psFree(header); \ 188 return NULL; \ 189 } 190 191 // Need to retrieve the scalars: dX, dY, nX, nY 192 bool mdok = true; // Status of MD lookup 193 READ_SCALAR(dX, "PSFRNGDX"); 194 READ_SCALAR(dY, "PSFRNGDY"); 195 READ_SCALAR(nX, "PSFRNGNX"); 196 READ_SCALAR(nY, "PSFRNGNY"); 197 psFree(header); 198 199 // Now the vectors: x, y 200 psArray *table = psFitsReadTable(fits); // The table 201 long numRows = table->n; // Number of rows 202 203 pmFringeRegions *regions = pmFringeRegionsAlloc(numRows, dX, dY, nX, nY); // The fringe regions 204 psVector *x = psVectorAlloc(numRows, PS_TYPE_F32); // x position 205 psVector *y = psVectorAlloc(numRows, PS_TYPE_F32); // y position 206 x->n = y->n = numRows; 207 regions->x = x; 208 regions->y = y; 209 210 #define READ_REGIONS_ROW(VECTOR, TYPE, NAME, DESCRIPTION) \ 211 VECTOR->data.TYPE[i] = psMetadataLookup##TYPE(&mdok, row, NAME); \ 212 if (!mdok) { \ 213 psError(PS_ERR_IO, true, "Unable to find " #DESCRIPTION " .\n"); \ 214 psFree(table); \ 215 psFree(regions); \ 216 return NULL; \ 217 } 218 219 // Translate the table into vectors 220 for (long i = 0; i < numRows; i++) { 221 psMetadata *row = table->data[i]; // Table row 222 READ_REGIONS_ROW(x, F32, "x", "x position"); 223 READ_REGIONS_ROW(y, F32, "y", "y position"); 224 } 225 psFree(table); 226 227 return regions; 228 } 94 229 95 230 ////////////////////////////////////////////////////////////////////////////////////////////////////////////// … … 129 264 if (!fringe->x || !fringe->y) { 130 265 // create the fringe vectors for this image 131 pmFringeRegionsCreatePoints(fringe, readout->image );266 pmFringeRegionsCreatePoints(fringe, readout->image, NULL); 132 267 } 133 268 … … 167 302 psImageStats(median, subImage, subMask, maskVal); 168 303 sky->data.F32[i][j] = median->sampleMedian; 304 psFree(subImage); 305 psFree(subMask); 169 306 } 170 307 } … … 193 330 (int)region.y0, (int)region.y1, fPt[i], dfPt[i]); 194 331 } 332 psFree(sky); 333 psFree(median); 334 psFree(medianSd); 195 335 196 336 return measurements; 197 337 } 198 338 199 bool pmFringeStatsWriteFits(psFits *fits, const pmFringeStats *fringe, const char *extname) 339 bool pmFringeStatsWriteFits(psFits *fits, 340 psMetadata *header, 341 const pmFringeStats *fringe, 342 const char *extname 343 ) 200 344 { 201 345 // Make sure the input is well-behaved … … 204 348 pmFringeRegions *regions = fringe->regions; // The fringe regions 205 349 PS_ASSERT_PTR_NON_NULL(regions, false); 206 psVector *x = regions->x; // The x positions 207 psVector *y = regions->y; // The y positions 208 psVector *mask = regions->mask; // The region mask 209 int numRows = x->n; // Number of rows in the table 210 PS_ASSERT_INT_POSITIVE(regions->nRequested, false); 211 PS_ASSERT_VECTOR_NON_NULL(x, false); 212 PS_ASSERT_VECTOR_NON_NULL(y, false); 213 PS_ASSERT_VECTOR_TYPE(x, PS_TYPE_F32, false); 214 PS_ASSERT_VECTOR_TYPE(y, PS_TYPE_F32, false); 215 PS_ASSERT_VECTOR_SIZE(y, numRows, false); 216 if (mask) { 217 PS_ASSERT_VECTOR_NON_NULL(mask, false); 218 PS_ASSERT_VECTOR_TYPE(mask, PS_TYPE_U8, false); 219 PS_ASSERT_VECTOR_SIZE(mask, numRows, false); 220 } 350 int numRows = regions->nRequested; // Number of rows in the table 351 PS_ASSERT_INT_POSITIVE(numRows, false); 221 352 psVector *f = fringe->f; // The fringe measurements 222 353 psVector *df = fringe->df; // The fringe standard deviatiations … … 229 360 230 361 // We need to write: 231 // Scalars: dX, dY, nX, nY 232 // Vectors: x, y, mask, f, df 233 234 psMetadata *scalars = psMetadataAlloc(); // Metadata to hold the scalars; will be the header 235 psMetadataAddF32(scalars, PS_LIST_TAIL, "PSFRNGDX", PS_META_REPLACE, "Median box half-width", 236 regions->dX); 237 psMetadataAddF32(scalars, PS_LIST_TAIL, "PSFRNGDY", PS_META_REPLACE, "Median box half-height", 238 regions->dY); 239 psMetadataAddF32(scalars, PS_LIST_TAIL, "PSFRNGNX", PS_META_REPLACE, "Large-scale smoothing in x", 240 regions->nX); 241 psMetadataAddF32(scalars, PS_LIST_TAIL, "PSFRNGNY", PS_META_REPLACE, "Large-scale smoothing in y", 242 regions->nY); 243 362 // Vectors: f, df 244 363 psArray *table = psArrayAlloc(numRows); // The table 245 364 table->n = numRows; … … 247 366 for (long i = 0; i < numRows; i++) { 248 367 psMetadata *row = psMetadataAlloc(); 249 psArraySet(table, i, row);250 psMetadataAddF32(row, PS_LIST_TAIL, "x", PS_META_REPLACE, "Fringe position in x", x->data.F32[i]);251 psMetadataAddF32(row, PS_LIST_TAIL, "y", PS_META_REPLACE, "Fringe position in y", y->data.F32[i]);252 if (mask) {253 psMetadataAddU8(row, PS_LIST_TAIL, "mask", PS_META_REPLACE, "Mask", mask->data.F32[i]);254 } else {255 psMetadataAddU8(row, PS_LIST_TAIL, "mask", PS_META_REPLACE, "Mask", 0);256 }257 368 psMetadataAddF32(row, PS_LIST_TAIL, "f", PS_META_REPLACE, "Fringe measurement", f->data.F32[i]); 258 369 psMetadataAddF32(row, PS_LIST_TAIL, "df", PS_META_REPLACE, "Fringe stdev", df->data.F32[i]); 259 psFree(row); // Drop reference 260 } 261 262 bool success; // Success of operation 263 if (!(success = psFitsWriteTable(fits, scalars, table, extname))) { 370 table->data[i] = row; 371 } 372 373 if (!psFitsWriteTable(fits, header, table, extname)) { 264 374 psError(PS_ERR_IO, false, "Unable to write fringe data to extension %s\n", extname); 265 } 266 psFree(scalars); 375 psFree(table); 376 return false; 377 } 378 267 379 psFree(table); 268 269 return success; 270 } 271 272 pmFringeStats *pmFringeStatsReadFits(const psFits *fits, const char *extname)380 return true; 381 } 382 383 pmFringeStats *pmFringeStatsReadFits(psMetadata *header, const psFits *fits, const char *extname, 384 pmFringeRegions *regions) 273 385 { 274 386 PS_ASSERT_PTR_NON_NULL(fits, NULL); 387 PS_ASSERT_PTR_NON_NULL(regions, NULL); 388 PS_ASSERT_INT_POSITIVE(regions->nRequested, NULL); 389 PS_ASSERT_VECTORS_SIZE_EQUAL(regions->x, regions->y, NULL); 390 PS_ASSERT_VECTOR_SIZE(regions->x, regions->nRequested, NULL); 275 391 276 392 if (extname && strlen(extname) > 0) { … … 284 400 } 285 401 286 psMetadata *header = psFitsReadHeader(NULL, fits); // The FITS header 287 if (!header) { 402 psMetadata *headerCopy = psMemIncrRefCounter(header); // Copy of the header, or NULL 403 404 headerCopy = psFitsReadHeader(headerCopy, fits); // The FITS header 405 if (!headerCopy) { 288 406 psError(PS_ERR_IO, false, "Unable to read header for extension %s\n", extname); 407 psFree(headerCopy); 289 408 return NULL; 290 409 } 291 292 // Read the scalars from the header 293 #define READ_SCALAR(SCALAR, NAME) \ 294 int SCALAR = psMetadataLookupS32(&mdok, header, NAME); \ 295 if (!mdok || SCALAR <= 0) { \ 296 psError(PS_ERR_IO, true, "Unable to find " NAME " in header of extension %s.\n", extname); \ 297 return NULL; \ 298 } 299 300 // Need to retrieve the scalars: dX, dY, nX, nY 301 bool mdok = true; // Status of MD lookup 302 READ_SCALAR(dX, "PSFRNGDX"); 303 READ_SCALAR(dY, "PSFRNGDX"); 304 READ_SCALAR(nX, "PSFRNGDX"); 305 READ_SCALAR(nY, "PSFRNGDX"); 306 psFree(header); 307 308 // Now the vectors: x, y, mask, f, df 410 psFree(headerCopy); 411 412 // Now the vectors: f, df 309 413 psArray *table = psFitsReadTable(fits); // The table 310 414 long numRows = table->n; // Number of rows 311 415 312 pmFringeRegions *regions = pmFringeRegionsAlloc(numRows, dX, dY, nX, nY); // The fringe regions313 psVector *x = psVectorAlloc(numRows, PS_TYPE_F32); // x position314 psVector *y = psVectorAlloc(numRows, PS_TYPE_F32); // y position315 psVector *mask = psVectorAlloc(numRows, PS_TYPE_U8); // mask316 x->n = y->n = mask->n = numRows;317 regions->x = x;318 regions->y = y;319 regions->mask = mask;320 416 pmFringeStats *fringes = pmFringeStatsAlloc(regions); // The fringe measurements 321 psFree(regions); // Drop reference322 417 psVector *f = fringes->f; // fringe measurement 323 psVector *df = fringes->df; // fringe stdev324 325 #define READ_ ROW(VECTOR, TYPE, NAME, DESCRIPTION) \418 psVector *df = fringes->df; // fringe stdev 419 420 #define READ_STATS_ROW(VECTOR, TYPE, NAME, DESCRIPTION) \ 326 421 VECTOR->data.TYPE[i] = psMetadataLookup##TYPE(&mdok, row, NAME); \ 327 422 if (!mdok) { \ … … 333 428 334 429 // Translate the table into vectors 430 bool mdok; // Status of MD lookup 335 431 for (long i = 0; i < numRows; i++) { 336 432 psMetadata *row = table->data[i]; // Table row 337 READ_ROW(x, F32, "x", "x position"); 338 READ_ROW(y, F32, "y", "y position"); 339 READ_ROW(mask, U8, "mask", "mask value"); 340 READ_ROW(f, F32, "f", "fringe measurement"); 341 READ_ROW(df, F32, "df", "fringe standard deviation"); 433 READ_STATS_ROW(f, F32, "f", "fringe measurement"); 434 READ_STATS_ROW(df, F32, "df", "fringe standard deviation"); 342 435 } 343 436 psFree(table); -
trunk/psModules/src/detrend/pmFringeStats.h
r7828 r7875 5 5 * @author Eugene Magnier, IfA 6 6 * 7 * @version $Revision: 1. 6$ $Name: not supported by cvs2svn $8 * @date $Date: 2006-07- 06 03:29:28$7 * @version $Revision: 1.7 $ $Name: not supported by cvs2svn $ 8 * @date $Date: 2006-07-12 04:44:01 $ 9 9 * 10 10 * Copyright 2004 IfA, University of Hawaii … … 45 45 // Generate the fringe points 46 46 bool pmFringeRegionsCreatePoints(pmFringeRegions *fringe, // Fringe regions 47 const psImage *image // Image for the regions (defines the size) 47 const psImage *image, // Image for the regions (defines the size) 48 psRandom *random // Random number generator 48 49 ); 50 51 // Write the regions to a FITS file 52 bool pmFringeRegionsWriteFits(psFits *fits, // Output FITS file 53 psMetadata *header, // Header to write, or NULL 54 const pmFringeRegions *regions, // Regions to write 55 const char *extname // Extension name, or NULL 56 ); 57 58 // Read the regions from a FITS file 59 pmFringeRegions *pmFringeRegionsReadFits(psMetadata *header, // Header to read, or NULL 60 const psFits *fits, // Input FITS file 61 const char *extname // Extension name, or NULL 62 ); 63 49 64 50 65 … … 84 99 // Write the fringe stats for an image to a FITS table 85 100 bool pmFringeStatsWriteFits(psFits *fits, // FITS file to which to write 101 psMetadata *header, // Header to write, or NULL 86 102 const pmFringeStats *fringe, // Fringe statistics to be written 87 103 const char *extname // Extension name for table … … 89 105 90 106 // Read the fringe stats for an image from a FITS table 91 pmFringeStats *pmFringeStatsReadFits(const psFits *fits, // FITS file from which to read 92 const char *extname // Extension name to read 107 pmFringeStats *pmFringeStatsReadFits(psMetadata *header, // Header to read, or NULL 108 const psFits *fits, // FITS file from which to read 109 const char *extname, // Extension name to read 110 pmFringeRegions *regions // Corresponding regions for fringe measurements 93 111 ); 94 112
Note:
See TracChangeset
for help on using the changeset viewer.
