Changeset 19383
- Timestamp:
- Sep 4, 2008, 9:51:09 PM (18 years ago)
- Location:
- trunk/psLib/src/fits
- Files:
-
- 4 edited
-
psFitsImage.c (modified) (15 diffs)
-
psFitsImage.h (modified) (3 diffs)
-
psFitsScale.c (modified) (6 diffs)
-
psFitsScale.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/fits/psFitsImage.c
r19270 r19383 7 7 * @author Robert DeSonia, MHPCC 8 8 * 9 * @version $Revision: 1.3 8$ $Name: not supported by cvs2svn $10 * @date $Date: 2008-0 8-29 01:01:39 $9 * @version $Revision: 1.39 $ $Name: not supported by cvs2svn $ 10 * @date $Date: 2008-09-05 07:51:09 $ 11 11 * 12 12 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 28 28 #include "psLogMsg.h" 29 29 #include "psTrace.h" 30 #include "psVector.h"31 30 #include "psRandom.h" 31 #include "psImage.h" 32 32 #include "psImageStructManip.h" 33 33 … … 249 249 psFitsFloat *floatType, // Type of custom floating-point 250 250 psFits *fits, // FITS file pointer 251 const psImage *image, // Current type 251 const psImage *image, // Image to convert 252 const psImage *mask, // Mask image, or NULL 253 psMaskType maskVal, // Value to mask 252 254 psRandom *rng, // Random number generator 253 255 bool newScaleZero // Determine a new BSCALE and BZERO? … … 285 287 if (newScaleZero) { 286 288 // Choose an appropriate BSCALE and BZERO 287 if (!psFitsScaleDetermine(bscale, bzero, blank, image, fits)) {289 if (!psFitsScaleDetermine(bscale, bzero, blank, image, mask, maskVal, fits)) { 288 290 // We can't have the write dying for this reason --- try to save it somehow! 289 291 psWarning("Unable to determine BSCALE and BZERO for image --- refusing to quantise."); … … 404 406 } 405 407 406 psImage *psFitsReadImage(const psFits *fits, // the psFits object408 psImage *psFitsReadImage(const psFits *fits, // the psFits object 407 409 psRegion region, // the region in the FITS image to read 408 410 int z // the z-plane in the FITS image cube to read … … 445 447 } 446 448 447 psImage *psFitsReadImageBuffer(psImage *outImage, // Output image buffer449 psImage *psFitsReadImageBuffer(psImage *outImage, // Output image buffer 448 450 const psFits *fits, // the psFits object 449 451 psRegion region, // the region in the FITS image to read … … 497 499 } 498 500 499 bool psFitsWriteImage(psFits* fits, 500 psMetadata* header, 501 const psImage* input, 502 int numZPlanes, 503 const char* extname) 501 bool psFitsWriteImage(psFits *fits, psMetadata *header, const psImage *input, 502 int numZPlanes, const char *extname) 503 { 504 return psFitsWriteImageWithMask(fits, header, input, NULL, 0, numZPlanes, extname); 505 } 506 507 bool psFitsWriteImageWithMask(psFits *fits, psMetadata *header, const psImage *input, 508 const psImage *mask, psMaskType maskVal, int numZPlanes, 509 const char *extname) 504 510 { 505 511 PS_ASSERT_FITS_NON_NULL(fits, false); … … 509 515 510 516 psFitsMoveLast(fits); 511 return psFitsInsertImage(fits,header,input,numZPlanes,extname,true); 512 } 513 514 bool psFitsInsertImage(psFits* fits, psMetadata* header, const psImage* image, int numZPlanes, 515 const char* extname, bool after) 517 return psFitsInsertImageWithMask(fits, header, input, mask, maskVal, numZPlanes, extname, true); 518 } 519 520 bool psFitsInsertImage(psFits *fits, psMetadata *header, const psImage *image, int numZPlanes, 521 const char *extname, bool after) 522 { 523 return psFitsInsertImageWithMask(fits, header, image, NULL, 0, numZPlanes, extname, after); 524 } 525 526 bool psFitsInsertImageWithMask(psFits *fits, psMetadata *header, const psImage *image, 527 const psImage *mask, psMaskType maskVal, int numZPlanes, 528 const char *extname, bool after) 516 529 { 517 530 PS_ASSERT_FITS_NON_NULL(fits, false); 518 531 PS_ASSERT_FITS_WRITABLE(fits, false); 519 532 PS_ASSERT_IMAGE_NON_NULL(image, false); 533 if (mask) { 534 PS_ASSERT_IMAGE_TYPE(mask, PS_TYPE_MASK, false); 535 PS_ASSERT_IMAGES_SIZE_EQUAL(mask, image, false); 536 } 520 537 521 538 int numCols = image->numCols; // Number of columns for image … … 529 546 psFitsFloat floatType; // Custom floating-point convention type 530 547 psImage *diskImage = imageToDiskRepresentation(&bscale, &bzero, &blank, &floatType, fits, image, 531 NULL, true); // Image to write out548 mask, maskVal, NULL, true); // Image to write out 532 549 if (!diskImage) { 533 550 psError(PS_ERR_UNKNOWN, false, "Unable to convert image to desired disk format."); … … 557 574 } 558 575 if (cfitsioBzero != 0.0) { 559 // p_psFitsTypeToCfitsio and imageToDiskRepresentation must not clash!560 psAssert(bzero == 0.0 && bscale == 1.0, "impossible");576 psAssert(bzero == 0.0 && bscale == 1.0, 577 "p_psFitsTypeToCfitsio and imageToDiskRepresentation must not clash!"); 561 578 bscale = 1.0; 562 579 bzero = cfitsioBzero; … … 564 581 565 582 psFitsOptions *options = fits->options; // FITS I/O options 566 psAssert(!useRequestedScale || !options || bitPix == options->bitpix || options->bitpix == 0, "impossible"); 583 psAssert(!useRequestedScale || !options || bitPix == options->bitpix || options->bitpix == 0, 584 "Something's not consistent"); 567 585 568 586 int naxis = 3; // Number of axes … … 630 648 // own quantisation, the correct keyword is always "BLANK" instead of "ZBLANK". 631 649 fits_write_key_lng(fits->fd, "BLANK", blank, "Value for undefined pixels", &status); 650 // But it seems that cfitsio uses ZBLANK 651 fits_write_key_lng(fits->fd, "ZBLANK", blank, "Value for undefined pixels", &status); 632 652 fits_set_imgnull(fits->fd, blank, &status); 633 653 if (psFitsError(status, true, "Could not write BLANK header to file.")) { … … 681 701 } 682 702 683 bool psFitsUpdateImage(psFits* fits, const psImage* input, int x0, int y0, int z) 703 bool psFitsUpdateImage(psFits *fits, const psImage *input, int x0, int y0, int z) 704 { 705 return psFitsUpdateImageWithMask(fits, input, NULL, 0, x0, y0, z); 706 } 707 708 bool psFitsUpdateImageWithMask(psFits *fits, const psImage *input, const psImage *mask, psMaskType maskVal, 709 int x0, int y0, int z) 684 710 { 685 711 PS_ASSERT_FITS_NON_NULL(fits, false); 686 712 PS_ASSERT_FITS_WRITABLE(fits, false); 687 713 PS_ASSERT_IMAGE_NON_NULL(input, false); 714 if (mask) { 715 PS_ASSERT_IMAGE_TYPE(mask, PS_TYPE_MASK, false); 716 PS_ASSERT_IMAGES_SIZE_EQUAL(mask, input, false); 717 } 688 718 689 719 int status = 0; … … 709 739 psFitsFloat floatType; // Custom floating-point convention type 710 740 psImage *diskImage = imageToDiskRepresentation(&bscale, &bzero, &blank, &floatType, fits, input, 711 NULL, false); // Image to write out741 mask, maskVal, NULL, false); // Image to write out 712 742 if (!diskImage) { 713 743 psError(PS_ERR_UNKNOWN, false, "Unable to convert image to desired disk format."); … … 737 767 } 738 768 if (cfitsioBzero != 0.0) { 739 // p_psFitsTypeToCfitsio and imageToDiskRepresentation must not clash!740 psAssert(bzero == 0.0 && bscale == 1.0, "impossible");769 psAssert(bzero == 0.0 && bscale == 1.0, 770 "p_psFitsTypeToCfitsio and imageToDiskRepresentation must not clash!"); 741 771 bscale = 1.0; 742 772 bzero = cfitsioBzero; 743 773 } 744 774 psFitsOptions *options = fits->options; // FITS I/O options 745 psAssert(!useRequestedScale || !options || bitPix == options->bitpix || options->bitpix == 0, "impossible"); 775 psAssert(!useRequestedScale || !options || bitPix == options->bitpix || options->bitpix == 0, 776 "Something's not consistent"); 746 777 747 778 // Check to see if the HDU has the same datatype -
trunk/psLib/src/fits/psFitsImage.h
r15630 r19383 4 4 * @author Robert DeSonia, MHPCC 5 5 * 6 * @version $Revision: 1. 8$ $Name: not supported by cvs2svn $7 * @date $Date: 200 7-11-16 01:04:56$6 * @version $Revision: 1.9 $ $Name: not supported by cvs2svn $ 7 * @date $Date: 2008-09-05 07:51:09 $ 8 8 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii 9 9 */ … … 23 23 24 24 /// Return the dimensions and type of the FITS image 25 bool psFitsImageSize(int *numCols, int *numRows, ///< Size of image 26 psElemType *type, ///< Type of image 27 const psFits *fits, ///< FITS file pointer 28 psRegion region ///< Region in the FITS image to read 25 bool psFitsImageSize( 26 int *numCols, int *numRows, ///< Size of image 27 psElemType *type, ///< Type of image 28 const psFits *fits, ///< FITS file pointer 29 psRegion region ///< Region in the FITS image to read 29 30 ); 30 31 … … 33 34 * @return psImage* the read image or NULL if there was an error. 34 35 */ 35 psImage *psFitsReadImage(36 const psFits * fits,///< the psFits object37 psRegion region, ///< the region in the FITS image to read38 int z ///< the z-plane in the FITS image cube to read36 psImage *psFitsReadImage( 37 const psFits *fits, ///< the psFits object 38 psRegion region, ///< the region in the FITS image to read 39 int z ///< the z-plane in the FITS image cube to read 39 40 ); 40 41 41 // Read an image into an extant buffer 42 psImage* psFitsReadImageBuffer(psImage *output, // Output image buffer 43 const psFits *fits, // the psFits object 44 psRegion region, // the region in the FITS image to read 45 int z // the z-plane in the FITS image cube to read 46 ); 42 /** Read an image into an extant buffer 43 */ 44 psImage *psFitsReadImageBuffer( 45 psImage *output, ///< Output image buffer 46 const psFits *fits, ///< the psFits object 47 psRegion region, ///< the region in the FITS image to read 48 int z ///< the z-plane in the FITS image cube to read 49 ); 47 50 48 /** Writes an image, given the desired region and z-plane. 51 /** Writes an image to a FITS file 52 * 53 * A new IMAGE HDU is appended to the end of the FITS file. 49 54 * 50 55 * @return bool TRUE is the write was successful, otherwise FALSE. 51 56 */ 52 57 bool psFitsWriteImage( 53 psFits * fits,///< the psFits object54 psMetadata *header, ///< header items for the new HDU. Can be NULL.55 const psImage * input,///< the image to output56 int depth, ///< the number of z-planes of the FITS image data cube57 const char * extname///< FITS extension name58 psFits *fits, ///< the psFits object 59 psMetadata *header, ///< header items for the new HDU. Can be NULL. 60 const psImage *input, ///< the image to output 61 int depth, ///< the number of z-planes of the FITS image data cube 62 const char *extname ///< FITS extension name 58 63 ); 59 64 60 /** Writes an image, given the desired region and z-plane. A new IMAGE HDU is 61 * appended to the end of the FITS file. 65 /** Writes an image to a FITS file, optionally using the supplied mask image to do statistics when compressing 66 * 67 * A new IMAGE HDU is appended to the end of the FITS file. 68 * 69 * @return bool TRUE is the write was successful, otherwise FALSE. 70 */ 71 bool psFitsWriteImageWithMask( 72 psFits *fits, ///< the psFits object 73 psMetadata *header, ///< header items for the new HDU. Can be NULL. 74 const psImage *input, ///< the image to output 75 const psImage *mask, ///< the mask image 76 psMaskType maskVal, ///< value to mask 77 int depth, ///< the number of z-planes of the FITS image data cube 78 const char *extname ///< FITS extension name 79 ); 80 81 /** Insert an image in a FITS file 62 82 * 63 83 * @return bool TRUE is the write was successful, otherwise FALSE. 64 84 */ 65 85 bool psFitsInsertImage( 66 psFits * fits,///< the psFits object67 psMetadata *header, ///< header items for the new HDU. Can be NULL.68 const psImage * input,///< the image to output69 int depth, ///< the number of z-planes of the FITS image data cube70 const char * extname,///< FITS extension name71 bool after ///< if TRUE, inserts HDU after current HDU, otherwise before86 psFits *fits, ///< the psFits object 87 psMetadata *header, ///< header items for the new HDU. Can be NULL. 88 const psImage *input, ///< the image to output 89 int depth, ///< the number of z-planes of the FITS image data cube 90 const char *extname, ///< FITS extension name 91 bool after ///< if TRUE, inserts HDU after current HDU, otherwise before 72 92 ); 73 93 74 /** Updates the FITS file image, given the desired region and z-plane. a new 75 * IMAGE HDU is inserted before or after, depending on the AFTER parameter, 76 * the current HDU. 94 /** Insert an image in a FITS file, optionally using the supplied mask image to do statistics when compressing 95 * 96 * @return bool TRUE is the write was successful, otherwise FALSE. 97 */ 98 bool psFitsInsertImageWithMask( 99 psFits *fits, ///< the psFits object 100 psMetadata *header, ///< header items for the new HDU. Can be NULL. 101 const psImage *input, ///< the image to output 102 const psImage *mask, ///< the mask image 103 psMaskType maskVal, ///< value to mask 104 int depth, ///< the number of z-planes of the FITS image data cube 105 const char *extname, ///< FITS extension name 106 bool after ///< if TRUE, inserts HDU after current HDU, otherwise before 107 ); 108 109 /** Updates an existing FITS file image 77 110 * 78 111 * @return bool TRUE is the write was successful, otherwise FALSE. 79 112 */ 80 113 bool psFitsUpdateImage( 81 psFits* fits, ///< the psFits object 82 const psImage* input, ///< the image to output 83 int x0, ///< psImage's x-axis origin in FITS image coordinates 84 int y0, ///< psImage's y-axis origin in FITS image coordinates 85 int z ///< the z-planes of the FITS image data cube to write 114 psFits *fits, ///< the psFits object 115 const psImage *input, ///< the image to output 116 int x0, ///< psImage's x-axis origin in FITS image coordinates 117 int y0, ///< psImage's y-axis origin in FITS image coordinates 118 int z ///< the z-planes of the FITS image data cube to write 119 ); 120 121 /** Updates an existing FITS file image, optionally using the supplied mask image to do statistics when 122 ** compressing 123 * 124 * @return bool TRUE is the write was successful, otherwise FALSE. 125 */ 126 bool psFitsUpdateImageWithMask( 127 psFits *fits, ///< the psFits object 128 const psImage *input, ///< the image to output 129 const psImage *mask, ///< the mask image 130 psMaskType maskVal, ///< value to mask 131 int x0, ///< psImage's x-axis origin in FITS image coordinates 132 int y0, ///< psImage's y-axis origin in FITS image coordinates 133 int z ///< the z-planes of the FITS image data cube to write 86 134 ); 87 135 88 136 psArray *psFitsReadImageCube(const psFits *fits, psRegion region); 137 89 138 bool psFitsWriteImageCube(psFits *fits, psMetadata *header, const psArray *input, const char *extname); 139 90 140 bool psFitsUpdateImageCube(psFits *fits, const psArray *input, int x0, int y0); 91 141 -
trunk/psLib/src/fits/psFitsScale.c
r18156 r19383 13 13 #include "psTrace.h" 14 14 15 #include "psImage.h" 15 16 #include "psFits.h" 16 17 #include "psImageBackground.h" … … 98 99 double *bzero, // Zero point, to return 99 100 const psImage *image, // Image to scale 101 const psImage *mask, // Mask image 102 psMaskType maskVal, // Value to mask 100 103 const psFitsOptions *options // FITS options 101 104 ) … … 112 115 psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, seed); 113 116 psStats *stats = psStatsAlloc(MEAN_STAT | STDEV_STAT); // Statistics object 114 if (!psImageBackground(stats, NULL, image, NULL, 0, rng)) {117 if (!psImageBackground(stats, NULL, image, mask, maskVal, rng)) { 115 118 psError(PS_ERR_UNKNOWN, false, "Unable to perform statistics on image"); 116 119 psFree(rng); … … 163 166 ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 164 167 165 bool psFitsScaleDetermine(double *bscale, // Scaling, to return 166 double *bzero, // Zero point, to return 167 long *blank, // Blank value, to return 168 const psImage *image, // Image to scale 169 const psFits *fits // FITS options 170 ) 168 bool psFitsScaleDetermine(double *bscale, double *bzero, long *blank, const psImage *image, 169 const psImage *mask, psMaskType maskVal, const psFits *fits) 171 170 { 172 171 PS_ASSERT_PTR_NON_NULL(bscale, false); … … 174 173 PS_ASSERT_PTR_NON_NULL(blank, false); 175 174 PS_ASSERT_IMAGE_NON_NULL(image, false); 175 if (mask) { 176 PS_ASSERT_IMAGE_TYPE(mask, PS_TYPE_MASK, false); 177 PS_ASSERT_IMAGES_SIZE_EQUAL(mask, image, false); 178 } 176 179 PS_ASSERT_FITS_NON_NULL(fits, false); 177 180 … … 216 219 case PS_FITS_SCALE_STDEV_NEGATIVE: 217 220 case PS_FITS_SCALE_STDEV_BOTH: 218 if (!scaleStdev(bscale, bzero, image, options)) {221 if (!scaleStdev(bscale, bzero, image, mask, maskVal, options)) { 219 222 psError(PS_ERR_UNKNOWN, false, "Unable to set BSCALE and BZERO from stdev"); 220 223 return false; -
trunk/psLib/src/fits/psFitsScale.h
r17660 r19383 12 12 long *blank, ///< Blank value, to return 13 13 const psImage *image, ///< Image to scale 14 const psImage *mask, ///< Mask image 15 psMaskType maskVal, ///< Value to mask 14 16 const psFits *fits ///< FITS options 15 17 );
Note:
See TracChangeset
for help on using the changeset viewer.
