cfitsio/scalnull.c

230 lines
8.8 KiB
C

/* This file, scalnull.c, contains the FITSIO routines used to define */
/* the starting heap address, the value scaling and the null values. */
/* The FITSIO software was written by William Pence at the High Energy */
/* Astrophysic Science Archive Research Center (HEASARC) at the NASA */
/* Goddard Space Flight Center. */
#include <string.h>
#include "fitsio2.h"
/*--------------------------------------------------------------------------*/
int ffpthp(fitsfile *fptr, /* I - FITS file pointer */
long theap, /* I - starting addrss for the heap */
int *status) /* IO - error status */
/*
Define the starting address for the heap for a binary table.
The default address is NAXIS1 * NAXIS2. It is in units of
bytes relative to the beginning of the regular binary table data.
This routine also writes the appropriate THEAP keyword to the
FITS header.
*/
{
if (*status > 0 || theap < 1)
return(*status);
/* reset position to the correct HDU if necessary */
if (fptr->HDUposition != (fptr->Fptr)->curhdu)
ffmahd(fptr, (fptr->HDUposition) + 1, NULL, status);
(fptr->Fptr)->heapstart = theap;
ffukyj(fptr, "THEAP", theap, "byte offset to heap area", status);
return(*status);
}
/*--------------------------------------------------------------------------*/
int ffpscl(fitsfile *fptr, /* I - FITS file pointer */
double scale, /* I - scaling factor: value of BSCALE */
double zero, /* I - zero point: value of BZERO */
int *status) /* IO - error status */
/*
Define the linear scaling factor for the primary array or image extension
pixel values. This routine overrides the scaling values given by the
BSCALE and BZERO keywords if present. Note that this routine does not
write or modify the BSCALE and BZERO keywords, but instead only modifies
the values temporarily in the internal buffer. Thus, a subsequent call to
the ffrdef routine will reset the scaling back to the BSCALE and BZERO
keyword values (or 1. and 0. respectively if the keywords are not present).
*/
{
tcolumn *colptr;
int hdutype;
if (*status > 0)
return(*status);
if (scale == 0)
return(*status = ZERO_SCALE); /* zero scale value is illegal */
if (ffghdt(fptr, &hdutype, status) > 0) /* get HDU type */
return(*status);
if (hdutype != IMAGE_HDU)
return(*status = NOT_IMAGE); /* not proper HDU type */
if (fits_is_compressed_image(fptr, status)) /* compressed images */
{
(fptr->Fptr)->cn_bscale = scale;
(fptr->Fptr)->cn_bzero = zero;
return(*status);
}
/* set pointer to the first 'column' (contains group parameters if any) */
colptr = (fptr->Fptr)->tableptr;
colptr++; /* increment to the 2nd 'column' pointer (the image itself) */
colptr->tscale = scale;
colptr->tzero = zero;
return(*status);
}
/*--------------------------------------------------------------------------*/
int ffpnul(fitsfile *fptr, /* I - FITS file pointer */
LONGLONG nulvalue, /* I - null pixel value: value of BLANK */
int *status) /* IO - error status */
/*
Define the value used to represent undefined pixels in the primary array or
image extension. This only applies to integer image pixel (i.e. BITPIX > 0).
This routine overrides the null pixel value given by the BLANK keyword
if present. Note that this routine does not write or modify the BLANK
keyword, but instead only modifies the value temporarily in the internal
buffer. Thus, a subsequent call to the ffrdef routine will reset the null
value back to the BLANK keyword value (or not defined if the keyword is not
present).
*/
{
tcolumn *colptr;
int hdutype;
if (*status > 0)
return(*status);
if (ffghdt(fptr, &hdutype, status) > 0) /* get HDU type */
return(*status);
if (hdutype != IMAGE_HDU)
return(*status = NOT_IMAGE); /* not proper HDU type */
if (fits_is_compressed_image(fptr, status)) /* ignore compressed images */
return(*status);
/* set pointer to the first 'column' (contains group parameters if any) */
colptr = (fptr->Fptr)->tableptr;
colptr++; /* increment to the 2nd 'column' pointer (the image itself) */
colptr->tnull = nulvalue;
return(*status);
}
/*--------------------------------------------------------------------------*/
int fftscl(fitsfile *fptr, /* I - FITS file pointer */
int colnum, /* I - column number to apply scaling to */
double scale, /* I - scaling factor: value of TSCALn */
double zero, /* I - zero point: value of TZEROn */
int *status) /* IO - error status */
/*
Define the linear scaling factor for the TABLE or BINTABLE extension
column values. This routine overrides the scaling values given by the
TSCALn and TZEROn keywords if present. Note that this routine does not
write or modify the TSCALn and TZEROn keywords, but instead only modifies
the values temporarily in the internal buffer. Thus, a subsequent call to
the ffrdef routine will reset the scaling back to the TSCALn and TZEROn
keyword values (or 1. and 0. respectively if the keywords are not present).
*/
{
tcolumn *colptr;
int hdutype;
if (*status > 0)
return(*status);
if (scale == 0)
return(*status = ZERO_SCALE); /* zero scale value is illegal */
if (ffghdt(fptr, &hdutype, status) > 0) /* get HDU type */
return(*status);
if (hdutype == IMAGE_HDU)
return(*status = NOT_TABLE); /* not proper HDU type */
colptr = (fptr->Fptr)->tableptr; /* set pointer to the first column */
colptr += (colnum - 1); /* increment to the correct column */
colptr->tscale = scale;
colptr->tzero = zero;
return(*status);
}
/*--------------------------------------------------------------------------*/
int fftnul(fitsfile *fptr, /* I - FITS file pointer */
int colnum, /* I - column number to apply nulvalue to */
LONGLONG nulvalue, /* I - null pixel value: value of TNULLn */
int *status) /* IO - error status */
/*
Define the value used to represent undefined pixels in the BINTABLE column.
This only applies to integer datatype columns (TFORM = B, I, or J).
This routine overrides the null pixel value given by the TNULLn keyword
if present. Note that this routine does not write or modify the TNULLn
keyword, but instead only modifies the value temporarily in the internal
buffer. Thus, a subsequent call to the ffrdef routine will reset the null
value back to the TNULLn keyword value (or not defined if the keyword is not
present).
*/
{
tcolumn *colptr;
int hdutype;
if (*status > 0)
return(*status);
if (ffghdt(fptr, &hdutype, status) > 0) /* get HDU type */
return(*status);
if (hdutype != BINARY_TBL)
return(*status = NOT_BTABLE); /* not proper HDU type */
colptr = (fptr->Fptr)->tableptr; /* set pointer to the first column */
colptr += (colnum - 1); /* increment to the correct column */
colptr->tnull = nulvalue;
return(*status);
}
/*--------------------------------------------------------------------------*/
int ffsnul(fitsfile *fptr, /* I - FITS file pointer */
int colnum, /* I - column number to apply nulvalue to */
char *nulstring, /* I - null pixel value: value of TNULLn */
int *status) /* IO - error status */
/*
Define the string used to represent undefined pixels in the ASCII TABLE
column. This routine overrides the null value given by the TNULLn keyword
if present. Note that this routine does not write or modify the TNULLn
keyword, but instead only modifies the value temporarily in the internal
buffer. Thus, a subsequent call to the ffrdef routine will reset the null
value back to the TNULLn keyword value (or not defined if the keyword is not
present).
*/
{
tcolumn *colptr;
int hdutype;
if (*status > 0)
return(*status);
if (ffghdt(fptr, &hdutype, status) > 0) /* get HDU type */
return(*status);
if (hdutype != ASCII_TBL)
return(*status = NOT_ATABLE); /* not proper HDU type */
colptr = (fptr->Fptr)->tableptr; /* set pointer to the first column */
colptr += (colnum - 1); /* increment to the correct column */
colptr->strnull[0] = '\0';
strncat(colptr->strnull, nulstring, 19); /* limit string to 19 chars */
return(*status);
}