Changeset 7562
- Timestamp:
- Jun 14, 2006, 12:04:40 PM (20 years ago)
- Location:
- trunk/psModules/src/detrend
- Files:
-
- 2 edited
-
pmFringeStats.c (modified) (2 diffs)
-
pmFringeStats.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/detrend/pmFringeStats.c
r7278 r7562 3 3 * @author Eugene Magnier, IfA 4 4 * 5 * @version $Revision: 1. 6$ $Name: not supported by cvs2svn $6 * @date $Date: 2006-06- 02 00:55:23$5 * @version $Revision: 1.7 $ $Name: not supported by cvs2svn $ 6 * @date $Date: 2006-06-14 22:04:40 $ 7 7 * 8 8 * Copyright 2004 IfA … … 192 192 } 193 193 194 195 bool pmFringeStatsWriteFits(psFits *fits, const pmFringeStats *fringe, const char *extname) 196 { 197 // Make sure the input is well-behaved 198 PS_ASSERT_PTR_NON_NULL(fits, false); 199 PS_ASSERT_PTR_NON_NULL(fringe, false); 200 pmFringeRegions *regions = fringe->regions; // The fringe regions 201 PS_ASSERT_PTR_NON_NULL(regions, false); 202 psVector *x = regions->x; // The x positions 203 psVector *y = regions->y; // The y positions 204 psVector *mask = regions->mask; // The region mask 205 int numRows = x->n; // Number of rows in the table 206 PS_ASSERT_INT_POSITIVE(regions->nRequested, false); 207 PS_ASSERT_VECTOR_NON_NULL(x, false); 208 PS_ASSERT_VECTOR_NON_NULL(y, false); 209 PS_ASSERT_VECTOR_TYPE(x, PS_TYPE_F32, false); 210 PS_ASSERT_VECTOR_TYPE(y, PS_TYPE_F32, false); 211 PS_ASSERT_VECTOR_SIZE(y, numRows, false); 212 if (mask) { 213 PS_ASSERT_VECTOR_NON_NULL(mask, false); 214 PS_ASSERT_VECTOR_TYPE(mask, PS_TYPE_U8, false); 215 PS_ASSERT_VECTOR_SIZE(mask, numRows, false); 216 } 217 psVector *f = fringe->f; // The fringe measurements 218 psVector *df = fringe->df; // The fringe standard deviatiations 219 PS_ASSERT_VECTOR_NON_NULL(f, false); 220 PS_ASSERT_VECTOR_NON_NULL(df, false); 221 PS_ASSERT_VECTOR_TYPE(f, PS_TYPE_F32, false); 222 PS_ASSERT_VECTOR_TYPE(df, PS_TYPE_F32, false); 223 PS_ASSERT_VECTOR_SIZE(f, numRows, false); 224 PS_ASSERT_VECTOR_SIZE(df, numRows, false); 225 226 if (extname && strlen(extname) > 0) { 227 if (!psFitsMoveExtName(fits, extname)) { 228 psError(PS_ERR_IO, false, "Unable to move to extension %s\n", extname); 229 return false; 230 } 231 } else if (!psFitsMoveExtNum(fits, 0, false)) { 232 psError(PS_ERR_IO, false, "Unable to move to PHU\n"); 233 return false; 234 } 235 236 // We need to write: 237 // Scalars: dX, dY, nX, nY 238 // Vectors: x, y, mask, f, df 239 240 psMetadata *scalars = psMetadataAlloc(); // Metadata to hold the scalars; will be the header 241 psMetadataAddF32(scalars, PS_LIST_TAIL, "PSFRNGDX", PS_META_REPLACE, "Median box half-width", 242 regions->dX); 243 psMetadataAddF32(scalars, PS_LIST_TAIL, "PSFRNGDY", PS_META_REPLACE, "Median box half-height", 244 regions->dY); 245 psMetadataAddF32(scalars, PS_LIST_TAIL, "PSFRNGNX", PS_META_REPLACE, "Large-scale smoothing in x", 246 regions->nX); 247 psMetadataAddF32(scalars, PS_LIST_TAIL, "PSFRNGNY", PS_META_REPLACE, "Large-scale smoothing in y", 248 regions->nY); 249 250 psArray *table = psArrayAlloc(numRows); // The table 251 // Translate the vectors into the required format for psFitsWriteTable() 252 for (long i = 0; i < numRows; i++) { 253 psMetadata *row = psMetadataAlloc(); 254 psArraySet(table, i, row); 255 psMetadataAddF32(row, PS_LIST_TAIL, "x", PS_META_REPLACE, "Fringe position in x", x->data.F32[i]); 256 psMetadataAddF32(row, PS_LIST_TAIL, "y", PS_META_REPLACE, "Fringe position in y", y->data.F32[i]); 257 if (mask) { 258 psMetadataAddU8(row, PS_LIST_TAIL, "mask", PS_META_REPLACE, "Mask", mask->data.F32[i]); 259 } else { 260 psMetadataAddU8(row, PS_LIST_TAIL, "mask", PS_META_REPLACE, "Mask", 0); 261 } 262 psMetadataAddF32(row, PS_LIST_TAIL, "f", PS_META_REPLACE, "Fringe measurement", f->data.F32[i]); 263 psMetadataAddF32(row, PS_LIST_TAIL, "df", PS_META_REPLACE, "Fringe stdev", df->data.F32[i]); 264 psFree(row); // Drop reference 265 } 266 267 bool success; // Success of operation 268 if (!(success = psFitsWriteTable(fits, scalars, table, extname))) { 269 psError(PS_ERR_IO, false, "Unable to write fringe data to extension %s\n", extname); 270 } 271 psFree(scalars); 272 psFree(table); 273 274 return success; 275 } 276 277 pmFringeStats *pmFringeStatsReadFits(const psFits *fits, const char *extname) 278 { 279 PS_ASSERT_PTR_NON_NULL(fits, NULL); 280 281 if (extname && strlen(extname) > 0) { 282 if (!psFitsMoveExtName(fits, extname)) { 283 psError(PS_ERR_IO, false, "Unable to move to extension %s\n", extname); 284 return NULL; 285 } 286 } else if (!psFitsMoveExtNum(fits, 0, false)) { 287 psError(PS_ERR_IO, false, "Unable to move to PHU\n"); 288 return NULL; 289 } 290 291 psMetadata *header = psFitsReadHeader(NULL, fits); // The FITS header 292 293 // Need to retrieve the scalars: dX, dY, nX, nY 294 bool mdok = true; // Status of MD lookup 295 int dX = psMetadataLookupS32(&mdok, header, "PSFRNGDX"); 296 if (!mdok || dX <= 0) { 297 psError(PS_ERR_IO, true, "Unable to find PSFRNGDX in header of extension %s.\n"); 298 return NULL; 299 } 300 int dY = psMetadataLookupS32(&mdok, header, "PSFRNGDY"); 301 if (!mdok || dY <= 0) { 302 psError(PS_ERR_IO, true, "Unable to find PSFRNGDY in header of extension %s.\n"); 303 return NULL; 304 } 305 int nX = psMetadataLookupS32(&mdok, header, "PSFRNGNX"); 306 if (!mdok || nX <= 0) { 307 psError(PS_ERR_IO, true, "Unable to find PSFRNGNX in header of extension %s.\n"); 308 return NULL; 309 } 310 int nY = psMetadataLookupS32(&mdok, header, "PSFRNGNY"); 311 if (!mdok || nY <= 0) { 312 psError(PS_ERR_IO, true, "Unable to find PSFRNGNY in header of extension %s.\n"); 313 return NULL; 314 } 315 316 // Now the vectors: x, y, mask, f, df 317 psArray *table = psFitsReadTable(fits); // The table 318 long numRows = table->n; // Number of rows 319 320 pmFringeRegions *regions = pmFringeRegionsAlloc(numRows, dX, dY, nX, nY); // The fringe regions 321 if (regions->x) { 322 psFree(regions->x); 323 } 324 if (regions->y) { 325 psFree(regions->y); 326 } 327 if (regions->mask) { 328 psFree(regions->mask); 329 } 330 331 psVector *x = psVectorAlloc(numRows, PS_TYPE_F32); // x position 332 psVector *y = psVectorAlloc(numRows, PS_TYPE_F32); // y position 333 psVector *mask = psVectorAlloc(numRows, PS_TYPE_U8); // mask 334 x->n = y->n = mask->n = numRows; 335 regions->x = x; 336 regions->y = y; 337 regions->mask = mask; 338 pmFringeStats *fringes = pmFringeStatsAlloc(regions); // The fringe measurements 339 psFree(regions); // Drop reference 340 psVector *f = fringes->f; // fringe measurement 341 psVector *df = fringes->df; // fringe stdev 342 343 // Translate the table into vectors 344 for (long i = 0; i < numRows; i++) { 345 psMetadata *row = table->data[i]; // Table row 346 x->data.F32[i] = psMetadataLookupF32(&mdok, row, "x"); 347 if (!mdok) { 348 psError(PS_ERR_IO, true, "Unable to find x position.\n"); 349 psFree(fringes); 350 return NULL; 351 } 352 y->data.F32[i] = psMetadataLookupF32(&mdok, row, "y"); 353 if (!mdok) { 354 psError(PS_ERR_IO, true, "Unable to find y position.\n"); 355 psFree(fringes); 356 return NULL; 357 } 358 mask->data.U8[i] = psMetadataLookupF32(&mdok, row, "mask"); 359 if (!mdok) { 360 psError(PS_ERR_IO, true, "Unable to find mask value.\n"); 361 psFree(fringes); 362 return NULL; 363 } 364 f->data.F32[i] = psMetadataLookupF32(&mdok, row, "f"); 365 if (!mdok) { 366 psError(PS_ERR_IO, true, "Unable to find fringe measurement.\n"); 367 psFree(fringes); 368 return NULL; 369 } 370 df->data.F32[i] = psMetadataLookupF32(&mdok, row, "df"); 371 if (!mdok) { 372 psError(PS_ERR_IO, true, "Unable to find fringe stdev.\n"); 373 psFree(fringes); 374 return NULL; 375 } 376 } 377 378 return fringes; 379 } 380 381 194 382 ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 195 383 // pmFringeScale -
trunk/psModules/src/detrend/pmFringeStats.h
r6957 r7562 5 5 * @author Eugene Magnier, IfA 6 6 * 7 * @version $Revision: 1. 4$ $Name: not supported by cvs2svn $8 * @date $Date: 2006-0 4-22 03:21:00 $7 * @version $Revision: 1.5 $ $Name: not supported by cvs2svn $ 8 * @date $Date: 2006-06-14 22:04:40 $ 9 9 * 10 10 * Copyright 2004 IfA, University of Hawaii … … 82 82 ); 83 83 84 // Write the fringe stats for an image to a FITS table 85 bool pmFringeStatsWriteFits(psFits *fits, // FITS file to which to write 86 const pmFringeStats *fringe, // Fringe statistics to be written 87 const char *extname // Extension name for table 88 ); 89 90 // 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 93 ); 84 94 85 95 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
Note:
See TracChangeset
for help on using the changeset viewer.
