IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 15439


Ignore:
Timestamp:
Nov 2, 2007, 3:44:27 PM (19 years ago)
Author:
eugene
Message:

adding code from CFITSIO for reading various compressions

Location:
branches/eam_branch_20071015/Ohana/src/libfits
Files:
7 added
5 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branch_20071015/Ohana/src/libfits/Makefile

    r15353 r15439  
    1010MATR    =       $(HOME)/matrix
    1111TABL    =       $(HOME)/table
     12EXT     =       $(HOME)/extern
    1213INC     =       $(HOME)/include
    1314MAN     =       $(HOME)/doc
     
    1617# programs may add their own internal requirements here
    1718FULL_CFLAGS   = $(BASE_CFLAGS) -fPIC -Wall -Werror
    18 FULL_CPPFLAGS = $(BASE_CPPFLAGS)
     19FULL_CPPFLAGS = $(BASE_CPPFLAGS) -I$(EXT)
    1920FULL_LDFLAGS  = $(BASE_LDFLAGS)
    2021
     
    4344$(MATR)/F_convert_format.$(ARCH).o              $(MATR)/F_read_segment.$(ARCH).o \
    4445$(MATR)/F_read_portion.$(ARCH).o                $(MATR)/F_load_M.$(ARCH).o       \
    45 $(MATR)/F_matrix.$(ARCH).o                      $(MATR)/F_compress_M.$(ARCH).o
     46$(MATR)/F_matrix.$(ARCH).o                      $(MATR)/F_compress_M.$(ARCH).o   \
     47$(MATR)/F_uncompress_data.$(ARCH).o
    4648
    4749TABLE_OBJ = \
     
    5456$(TABL)/F_table_varlength.$(ARCH).o
    5557
    56 OBJS = $(HEADER_OBJ) $(MATRIX_OBJ) $(TABLE_OBJ)
     58EXTERN_OBJ = \
     59$(EXT)/fits_hcompress.$(ARCH).o \
     60$(EXT)/fits_hdecompress.$(ARCH).o \
     61$(EXT)/pliocomp.$(ARCH).o \
     62$(EXT)/ricecomp.$(ARCH).o
     63
     64OBJS = $(HEADER_OBJ) $(MATRIX_OBJ) $(TABLE_OBJ) $(EXTERN_OBJ)
     65
     66extern: $(EXTERN_OBJ)
    5767
    5868$(OBJS): $(INCS)
  • branches/eam_branch_20071015/Ohana/src/libfits/header/F_copy_H.c

    r7039 r15439  
    88
    99  out[0].simple = in[0].simple;
     10  out[0].unsign = in[0].unsign;
     11  out[0].extend = in[0].extend;
    1012  out[0].bitpix = in[0].bitpix;
    11   out[0].extend = in[0].extend;
    12   out[0].unsign = in[0].unsign;
    13   out[0].size   = in[0].size;
    14   out[0].bscale = in[0].bscale;
    15   out[0].bzero  = in[0].bzero;
     13
    1614  out[0].Naxes  = in[0].Naxes;
    1715  for (i = 0; i < FT_MAX_NAXES; i++)
    1816    out[0].Naxis[i] = in[0].Naxis[i];
     17
     18  out[0].size   = in[0].size;
     19
     20  out[0].pcount = in[0].pcount;
     21  out[0].gcount = in[0].gcount;
     22  out[0].bzero  = in[0].bzero;
     23  out[0].bscale = in[0].bscale;
    1924
    2025  ALLOCATE (out[0].buffer, char, out[0].size);
  • branches/eam_branch_20071015/Ohana/src/libfits/include/gfitsio.h

    r15425 r15439  
    8989
    9090typedef struct {
    91   int  length;
    92   int  offset;
    93   int  maxlen;
    94   int  nbytes;
    95   int  Nstart;
    96   int  theap;
    97   char format;
    98   char cmptype[81];
     91  int  maxlen;                // max size of all table rows
     92  int  nbytes;                // number of bytes per column element
     93  int  Nstart;                // byte offset of this column
     94  int  heap_start;            // byte offset to start of HEAP
     95  char format;                // data format character (one of: XLABIJEDCM)
    9996} VarLengthColumn;
    10097
     
    156153int     gfits_write_matrix             PROTO((char *filename, Matrix *matrix));
    157154int     gfits_uncompress_image         PROTO((Header *header, Matrix *matrix, FTable *ftable, int primary));
    158 int     gfits_uncompress_data          PROTO((char *zdata, int Nzdata, char *cmptype, char **optname, char **optvalue, int Nopt, char *outdata, int *Nout));
     155int     gfits_uncompress_data          PROTO((char *zdata, int Nzdata, char *cmptype, char **optname, char **optvalue, int Nopt, char *outdata, int *Nout, int out_pixsize));
    159156int     gfits_distribute_data          PROTO((Matrix *matrix, int bitpix, char *data, int Ndata, int *otile, int *ztile, float zscale, float zzero));
    160157int     gfits_byteswap_zdata           PROTO((char *zdata, int Nzdata, int bitpix));
     158int     gfits_extension_is_compressed  PROTO((Header *header));
     159int     gfits_tile_size                PROTO((Matrix *matrix, int *otile, int *ztile));
    161160
    162161/******************************* Table functions *************/
  • branches/eam_branch_20071015/Ohana/src/libfits/matrix/F_compress_M.c

    r15425 r15439  
    88  gfits_print (header, NAME, TYPE, 1, OUT); }
    99
    10 # define MOD_KEYWORD_REQUIRED(NAME,ZNAME,TYPE,IN,OUT) { \
     10# define MOD_KEYWORD_REQUIRED(ZNAME,NAME,TYPE,IN,OUT) { \
    1111  if (!gfits_scan (header, ZNAME, TYPE, 1, IN)) ESCAPE; \
    1212  gfits_delete (header, ZNAME, 1); \
     
    3030int gfits_uncompress_image (Header *header, Matrix *matrix, FTable *ftable, int primary) {
    3131
    32   int i, j, status, zimage, zcol, Nzrows, Nout, Nzdata;
     32  int i, j, status, zimage, zcol, Nzrows, Nout, Nzdata, max_tile_size, bytes_per_pixel;
    3333  char cmptype[80];
    3434  char zaxis[10], naxis[10], key[10], word[81], exttype[81], checksum[81], datasum[81];
     
    145145  gfits_create_matrix (header, matrix);
    146146
    147   // XXX is maxlen in bytes or in pixels?
    148   ALLOCATE (out, char, zdef.maxlen);
    149 
    150147  // counters for tile numbers
    151148  ALLOCATE (otile, int, matrix->Naxes);
    152149  ALLOCATE (ntile, int, matrix->Naxes);
     150  max_tile_size = 1;
    153151  for (i = 0; i < matrix->Naxes; i++) {
    154152    otile[i] = 0;
    155153    ntile[i] = (matrix->Naxis[i] % ztile[i]) ? (matrix->Naxis[i] / ztile[i] + 1) : (matrix->Naxis[i] / ztile[i]);
    156   }
     154    max_tile_size *= ztile[i];
     155  }
     156
     157  // max_tile_size is in pixels
     158  bytes_per_pixel = abs(header[0].bitpix) / 8;
     159  ALLOCATE (out, char, bytes_per_pixel*max_tile_size);
    157160
    158161  // uncompress the data
    159162  Nzrows = ftable->header->Naxis[1];
    160163  for (i = 0; i < Nzrows; i++) {
     164
     165    // expected output size for this tile
     166    Nout = gfits_tile_size (matrix, otile, ztile);
     167
    161168    switch (zdef.format) {
    162 
    163       // may need to multiple by byte/pix
    164       Nout = zdef.maxlen;
    165 
    166169      // gfits_varlength returns a pointer to a chunk of Nzdata of data elements starting at zdata.
    167170      // uncompress_data uncompresses from zdata to the temporary output buffer which must be allocated
     171
    168172      // XXX need to have an API to send the user data
     173
     174      // XXX need to byte-swap the table column; this needs to be worked out more clearly
     175      // in the APIs: do the table read / column extract functions swap or not?.  we have
     176      // put the byte-swapping in gifts_varlength_column_pointer, but this is fairly weak.
    169177
    170178      case 'B': {
    171179        char *zdata;
    172180        zdata = gfits_varlength_column_pointer (ftable, &zdef, i, &Nzdata);
    173         gfits_byteswap_zdata (zdata, Nzdata, 8);
    174         gfits_uncompress_data (zdata, Nzdata, zdef.cmptype, optname, optvalue, Noptions, out, &Nout);
    175         gfits_distribute_data (matrix, 8, out, Nout, otile, ztile, zscale, zzero);      // copy the uncompressed pixels into their correct locations
     181        if (!zdata) return (FALSE);
     182        if (!gfits_byteswap_zdata ((char *)zdata, Nzdata, 8)) return (FALSE);
     183        if (!gfits_uncompress_data ((char *)zdata, Nzdata, cmptype, optname, optvalue, Noptions, out, &Nout, bytes_per_pixel)) return (FALSE);
     184        if (!gfits_distribute_data (matrix, 8, out, Nout, otile, ztile, zscale, zzero)) return (FALSE);
     185        // copy the uncompressed pixels into their correct locations       
    176186        break;
    177187      }
     
    180190        short *zdata;
    181191        zdata = gfits_varlength_column_pointer (ftable, &zdef, i, &Nzdata);
    182         gfits_byteswap_zdata ((char *) zdata, Nzdata, 16);
    183         gfits_uncompress_data ((char *) zdata, Nzdata, zdef.cmptype, optname, optvalue, Noptions, out, &Nout);
    184         gfits_distribute_data (matrix, 16, out, Nout, otile, ztile, zscale, zzero);     // copy the uncompressed pixels into their correct locations
     192        if (!zdata) return (FALSE);
     193        if (!gfits_byteswap_zdata ((char *)zdata, Nzdata, 16)) return (FALSE);
     194        if (!gfits_uncompress_data ((char *)zdata, Nzdata, cmptype, optname, optvalue, Noptions, out, &Nout, bytes_per_pixel)) return (FALSE);
     195        if (!gfits_distribute_data (matrix, 16, out, Nout, otile, ztile, zscale, zzero)) return (FALSE);
     196        // copy the uncompressed pixels into their correct locations       
    185197        break;
    186198      }
     
    188200      case 'J': {
    189201        int *zdata;
    190         zdata = gfits_varlength_column_pointer (ftable, &zdef, i, &Nzdata);
    191         gfits_byteswap_zdata ((char *) zdata, Nzdata, 32);
    192         gfits_uncompress_data ((char *) zdata, Nzdata, zdef.cmptype, optname, optvalue, Noptions, out, &Nout);
    193         gfits_distribute_data (matrix, 32, out, Nout, otile, ztile, zscale, zzero);     // copy the uncompressed pixels into their correct locations
     202        if (!zdata) return (FALSE);
     203        if (!gfits_byteswap_zdata ((char *)zdata, Nzdata, 32)) return (FALSE);
     204        if (!gfits_uncompress_data ((char *)zdata, Nzdata, cmptype, optname, optvalue, Noptions, out, &Nout, bytes_per_pixel)) return (FALSE);
     205        if (!gfits_distribute_data (matrix, 32, out, Nout, otile, ztile, zscale, zzero)) return (FALSE);
     206        // copy the uncompressed pixels into their correct locations       
    194207        break;
    195208      }
    196209
    197210      default:
    198         abort();
     211        fprintf (stderr, "invalid size for compressed data: %c\n", zdef.format); 
     212        return (FALSE);
    199213    }
    200214
     
    212226}
    213227
    214 int gfits_uncompress_data (char *zdata, int Nzdata, char *cmptype, char **optname, char **optvalue, int Nopt, char *outdata, int *Nout) {
    215 
    216   // XXX allow lowercase value?
    217   if (!strcasecmp(cmptype, "GZIP")) {
    218     unsigned long tNout = *Nout;
    219     uncompress ((Bytef *) outdata, &tNout, (Bytef *) zdata, Nzdata);
    220     *Nout = tNout;
    221     return (TRUE);
    222   }
    223 
    224   if (!strcasecmp(cmptype, "RICE")) {
     228int gfits_tile_size (Matrix *matrix, int *otile, int *ztile) {
     229
     230  int i, Npixels, Ndimen;
     231
     232  // true sizes of this tile (in pixels)
     233  Npixels = 1;
     234  for (i = 0; i < matrix->Naxes; i++) {
     235    Ndimen = MIN ((matrix->Naxis[i] - otile[i]*ztile[i]), ztile[i]);
     236    Npixels *= Ndimen;
    225237  }
    226238 
    227   if (!strcasecmp(cmptype, "PLIO")) {
    228   }
    229 
    230   if (!strcasecmp(cmptype, "HCOMPRESS")) {
    231   }
    232   return (TRUE);
     239  return (Npixels);
    233240}
    234241
     
    399406  return (TRUE);
    400407}
     408
     409int gfits_extension_is_compressed (Header *header) {
     410
     411    int has_extname, has_zimage, zimage;
     412    char extname[80];
     413
     414    has_extname = gfits_scan (header, "EXTNAME", "%s", 1, extname);
     415    has_zimage  = gfits_scan (header, "ZIMAGE", "%t", 1, &zimage);
     416
     417    if (has_zimage && zimage) return (TRUE);
     418    if (has_extname) {
     419        if (!strcmp (extname, "COMPRESSED_IMAGE")) return (TRUE);
     420    }
     421
     422    return (FALSE);
     423}
     424
     425int gfits_compressed_is_primary (Header *header) {
     426
     427    int has_ztension, has_zimage;
     428    int ztension, zimage;
     429
     430    has_zimage   = gfits_scan (header, "ZIMAGE",   "%t", 1, &zimage);
     431    has_ztension = gfits_scan (header, "ZTENSION", "%t", 1, &ztension);
     432
     433    if (has_zimage && zimage) return (TRUE);
     434
     435    return (FALSE);
     436}
  • branches/eam_branch_20071015/Ohana/src/libfits/table/F_table_varlength.c

    r15353 r15439  
    44int gfits_varlength_column_define (FTable *ftable, VarLengthColumn *def, int column) {
    55
    6   int i, N, Nv, Nb;
     6  int i, Nv, Nb;
    77  char *p1, *p2, *p3;
    88  char field[81];
     
    3939  if (*p1 == 'P') { return (FALSE); }
    4040
    41   def[0].nbytes = 0;
    42   if (*p1 == 'X') { def[0].nbytes = 1;  def[0].format = *p1; }
    43   if (*p1 == 'L') { def[0].nbytes = 1;  def[0].format = *p1; }
    44   if (*p1 == 'A') { def[0].nbytes = 1;  def[0].format = *p1; }
    45   if (*p1 == 'B') { def[0].nbytes = 1;  def[0].format = *p1; }
    46   if (*p1 == 'I') { def[0].nbytes = 2;  def[0].format = *p1; }
    47   if (*p1 == 'J') { def[0].nbytes = 4;  def[0].format = *p1; }
    48   if (*p1 == 'E') { def[0].nbytes = 4;  def[0].format = *p1; }
    49   if (*p1 == 'D') { def[0].nbytes = 8;  def[0].format = *p1; }
    50   if (*p1 == 'C') { def[0].nbytes = 8;  def[0].format = *p1; }
    51   if (*p1 == 'M') { def[0].nbytes = 16; def[0].format = *p1; }
    52   if (!def[0].nbytes) { return (FALSE); }
     41  def->nbytes = 0;
     42  if (*p1 == 'X') { def->nbytes = 1;  def->format = *p1; }
     43  if (*p1 == 'L') { def->nbytes = 1;  def->format = *p1; }
     44  if (*p1 == 'A') { def->nbytes = 1;  def->format = *p1; }
     45  if (*p1 == 'B') { def->nbytes = 1;  def->format = *p1; }
     46  if (*p1 == 'I') { def->nbytes = 2;  def->format = *p1; }
     47  if (*p1 == 'J') { def->nbytes = 4;  def->format = *p1; }
     48  if (*p1 == 'E') { def->nbytes = 4;  def->format = *p1; }
     49  if (*p1 == 'D') { def->nbytes = 8;  def->format = *p1; }
     50  if (*p1 == 'C') { def->nbytes = 8;  def->format = *p1; }
     51  if (*p1 == 'M') { def->nbytes = 16; def->format = *p1; }
     52  if (!def->nbytes) { return (FALSE); }
    5353 
    5454  /* scan columns to find column offset */
    55   def[0].Nstart = 0;
    56   for (i = 1; i < N; i++) {
     55  def->Nstart = 0;
     56  for (i = 1; i < column; i++) {
    5757    sprintf (field, "TFORM%d", i);
    5858    gfits_scan (ftable->header, field, "%s", 1, format);
    5959    gfits_bintable_format (format, tmpline, &Nv, &Nb);
    60     def[0].Nstart += Nv*Nb;
     60    def->Nstart += Nv*Nb;
    6161  }
    6262
    63   if (!gfits_scan (ftable->header, "THEAP", "%d", 1, &def[0].theap)) {
    64     def[0].theap = ftable->header->Naxis[0]*ftable->header->Naxis[1];
     63  if (!gfits_scan (ftable->header, "THEAP", "%d", 1, &def->heap_start)) {
     64    def->heap_start = ftable->header->Naxis[0]*ftable->header->Naxis[1];
    6565  }
    6666
     
    7070void *gfits_varlength_column_pointer (FTable *ftable, VarLengthColumn *column, int row, int *length) {
    7171
    72   int offset, Ny, *ptr;
     72  int offset, Nx, *ptr;
    7373
    7474  // find the values for the specified row
    7575  // the values in the main table for this row and varlength column:
    76   Ny = ftable->header->Naxis[1];
    77   ptr = (int *) &ftable->buffer[row*Ny + column->Nstart];
    78   offset = ptr[0];
    79   *length = ptr[1];
     76  Nx = ftable->header->Naxis[0];
     77
     78# define SWAP_WORD \
     79  tmp = pchar[0]; pchar[0] = pchar[3]; pchar[3] = tmp; \
     80  tmp = pchar[1]; pchar[1] = pchar[2]; pchar[2] = tmp;
     81
     82# ifdef BYTE_SWAP
     83  char *pchar, tmp;
     84  pchar = &ftable->buffer[row*Nx + column->Nstart];
     85  SWAP_WORD;
     86  pchar = &ftable->buffer[row*Nx + column->Nstart + 4];
     87  SWAP_WORD;
     88# endif
     89
     90  ptr = (int *) &ftable->buffer[row*Nx + column->Nstart];
     91  *length = ptr[0];
     92  offset = ptr[1];
    8093
    8194  switch (column->format) {
     
    8598    case 'B': {
    8699      char *result;
    87       result = (char *) ftable->buffer + column->theap + offset;
     100      result = (char *) ftable->buffer + column->heap_start + offset;
    88101      return result;
    89102    }
    90103    case 'I': {
    91104      short *result;
    92       result = (short *) ftable->buffer + column->theap + offset;
     105      result = (short *) ftable->buffer + column->heap_start + offset;
    93106      return result;
    94107    }
    95108    case 'J': {
    96109      int *result;
    97       result = (int *) ftable->buffer + column->theap + offset;
     110      result = (int *) ftable->buffer + column->heap_start + offset;
    98111      return result;
    99112    }
     
    101114    case 'C': {
    102115      float *result;
    103       result = (float *) ftable->buffer + column->theap + offset;
     116      result = (float *) ftable->buffer + column->heap_start + offset;
    104117      return result;
    105118    }
     
    107120    case 'M': {
    108121      double *result;
    109       result = (double *) ftable->buffer + column->theap + offset;
     122      result = (double *) ftable->buffer + column->heap_start + offset;
    110123      return result;
    111124    }
Note: See TracChangeset for help on using the changeset viewer.