IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jun 4, 2015, 8:49:25 AM (11 years ago)
Author:
eugene
Message:

rice and gzip2 both work for images; working on tables

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/ohana.20150429/src/libfits/table/F_uncompress_T.c

    r38356 r38363  
    33# include <zlib.h>
    44
    5 # define ESCAPE(A) { fprintf (stderr, "error in %s @ line %d\n", __func__, __LINE__); goto escape; }
    6 
    7 int gfits_distribute_table_data (FTable *table, char *raw, int col, int row_start, int Nrows, int rowsize);
     5# define ESCAPE { fprintf (stderr, "error in %s @ line %d\n", __func__, __LINE__); goto escape; }
     6
     7int gfits_distribute_table_data (FTable *table, TableField *field, char *raw, int row_start, int Nrows);
     8int gfits_distribute_table_gzp2 (FTable *table, TableField *field, char *raw, int row_start, int Nrows);
    89
    910# define VERBOSE_DUMP 0
     
    5354
    5455  int ztilelen;
    55   if (!gfits_scan (srcheader, "ZTILELEN", "%d", 1, &ztilelen)) ESCAPE(A);
     56  if (!gfits_scan (srcheader, "ZTILELEN", "%d", 1, &ztilelen)) ESCAPE;
    5657  // XXX if ZTILELEN is missing, it should have the value of ZNAXIS2
    5758
     
    6364
    6465  // creates an empty (Naxes = 2, Naxis[i] = 0) table header with XTENSION = BINTABLE, EXTNAME = COMPRESSED_TABLE
    65   if (!gfits_create_table_header (tgtheader, "BINTABLE", extname)) ESCAPE(A);
     66  if (!gfits_create_table_header (tgtheader, "BINTABLE", extname)) ESCAPE;
    6667
    6768  int Nfields;
    68   if (!gfits_scan (srcheader, "TFIELDS", "%d", 1, &Nfields)) ESCAPE(A);
     69  if (!gfits_scan (srcheader, "TFIELDS", "%d", 1, &Nfields)) ESCAPE;
    6970
    7071  // below we generate a fake table with tmpbuffers.  allocated it to the max needed size
     
    7677  for (i = 0; i < Nfields; i++) {
    7778    snprintf (keyword, 80, "TTYPE%d", i+1);
    78     if (!gfits_scan (srcheader, keyword, "%s", 1, fields[i].ttype)) ESCAPE(A);
    79     if (!gfits_scan_alt (srcheader, keyword, "%C", 1, fields[i].ttype_cmt)) ESCAPE(A);
     79    if (!gfits_scan (srcheader, keyword, "%s", 1, fields[i].ttype)) ESCAPE;
     80    if (!gfits_scan_alt (srcheader, keyword, "%C", 1, fields[i].ttype_cmt)) ESCAPE;
    8081
    8182    // TUNIT is not mandatory
     
    8485      fields[i].tunit[0] = 0;
    8586    } else {
    86       if (!gfits_scan_alt (srcheader, keyword, "%C", 1, fields[i].tunit_cmt)) ESCAPE(A);
     87      if (!gfits_scan_alt (srcheader, keyword, "%C", 1, fields[i].tunit_cmt)) ESCAPE;
    8788    }
    8889   
    8990    snprintf (keyword, 80, "ZFORM%d", i+1);
    90     if (!gfits_scan (srcheader, keyword, "%s", 1, fields[i].tformat)) ESCAPE(A);
    91     if (!gfits_scan_alt (srcheader, keyword, "%C", 1, fields[i].tformat_cmt)) ESCAPE(A);
     91    if (!gfits_scan (srcheader, keyword, "%s", 1, fields[i].tformat)) ESCAPE;
     92    if (!gfits_scan_alt (srcheader, keyword, "%C", 1, fields[i].tformat_cmt)) ESCAPE;
    9293
    9394    snprintf (keyword, 80, "ZCTYP%d", i+1);
     
    9697    }
    9798
    98     if (!gfits_bintable_format (fields[i].tformat, fields[i].datatype, &fields[i].Nvalues, &fields[i].pixsize)) ESCAPE(A);
     99    if (!gfits_bintable_format (fields[i].tformat, fields[i].datatype, &fields[i].Nvalues, &fields[i].pixsize)) ESCAPE;
    99100    fields[i].rowsize = fields[i].Nvalues*fields[i].pixsize;
    100101    max_width = MAX(max_width, fields[i].rowsize);
     
    103104    offset += fields[i].rowsize;
    104105
    105     if (!gfits_varlength_column_define (srctable, &fields[i].zdef, i + 1)) ESCAPE(A);
    106 
    107     if (!gfits_define_bintable_column (tgtheader, fields[i].tformat, fields[i].ttype, fields[i].ttype_cmt, fields[i].tunit, 1.0, 0.0)) ESCAPE (A);
     106    if (!gfits_varlength_column_define (srctable, &fields[i].zdef, i + 1)) ESCAPE;
     107
     108    if (!gfits_define_bintable_column (tgtheader, fields[i].tformat, fields[i].ttype, fields[i].ttype_cmt, fields[i].tunit, 1.0, 0.0)) ESCAPE;
    108109  }   
    109110
    110111  // allocates the default data array (tgttable->buffer)
    111   if (!gfits_create_table (tgtheader, tgttable)) ESCAPE (A);
     112  if (!gfits_create_table (tgtheader, tgttable)) ESCAPE;
    112113
    113114  // copy original header to output header (XXX this needs to be finished)
    114   if (!gfits_copy_keywords_compress (srcheader, tgtheader)) ESCAPE (A);
     115  if (!gfits_copy_keywords_compress (srcheader, tgtheader)) ESCAPE;
    115116 
    116117  off_t Nx, Ny;
    117   if (!gfits_scan (srcheader, "ZNAXIS1", OFF_T_FMT, 1, &Nx)) ESCAPE (A);
    118   if (!gfits_scan (srcheader, "ZNAXIS2", OFF_T_FMT, 1, &Ny)) ESCAPE (A);
     118  if (!gfits_scan (srcheader, "ZNAXIS1", OFF_T_FMT, 1, &Nx)) ESCAPE;
     119  if (!gfits_scan (srcheader, "ZNAXIS2", OFF_T_FMT, 1, &Ny)) ESCAPE;
    119120  myAssert (Nx == tgtheader->Naxis[0], "table definition error?");
    120121
     
    123124  ALLOCATE_ZERO (tmpbuffer, char, max_width*Ny);
    124125  for (i = 0; i < Nfields; i++) {
    125     if (!gfits_set_bintable_column (tgtheader, tgttable, fields[i].ttype, tmpbuffer, Ny)) ESCAPE (A);
     126    if (!gfits_set_bintable_column (tgtheader, tgttable, fields[i].ttype, tmpbuffer, Ny)) ESCAPE;
    126127  }
    127128  free (tmpbuffer);
     
    153154      off_t Nzdata;
    154155      char *zdata = gfits_varlength_column_pointer (srctable, &fields[i].zdef, row, &Nzdata);
    155       if (!zdata) ESCAPE(A);
     156      if (!zdata) ESCAPE;
    156157   
     158      if (strcasecmp(fields[i].zctype, "GZIP_1") && strcasecmp(fields[i].zctype, "GZIP_2") && strcasecmp(fields[i].zctype, "RICE_1")) {
     159        // Nzdata is number of bytes
     160        if (!gfits_byteswap_zdata (zdata, Nzdata, fields[i].pixsize)) ESCAPE;
     161      }
     162
    157163      int Nrows = (row == Ntile - 1) ? ztilelast : ztilelen;
    158164      int Nraw = Nraw_alloc; // expected number of pixel: Nrows*fields[i].Nvalues
    159       if (!gfits_uncompress_data (zdata, Nzdata, fields[i].zctype, NULL, NULL, 0, raw, &Nraw, fields[i].pixsize)) ESCAPE(A);
     165      if (!gfits_uncompress_data (zdata, Nzdata, fields[i].zctype, NULL, NULL, 0, raw, &Nraw, fields[i].pixsize)) ESCAPE;
    160166
    161167      if (!strcasecmp(fields[i].zctype, "GZIP_1")) {
    162168        myAssert ((fields[i].zdef.format != 'C') && (fields[i].zdef.format != 'M'), "swap is probably wrong for C or M columns");
    163         if (!gfits_byteswap_zdata (raw, Nraw * fields[i].pixsize, fields[i].pixsize)) ESCAPE(A);
     169        if (!gfits_byteswap_zdata (raw, Nraw * fields[i].pixsize, fields[i].pixsize)) ESCAPE;
    164170      }
    165171
     
    171177
    172178      // copy the raw pixels from their native matrix locations to the temporary output buffer
    173       if (!gfits_distribute_table_data (tgttable, raw, fields[i].offset, row_start, Nrows, fields[i].rowsize)) ESCAPE(A);
    174      
    175       // XXX need to activate
    176       // if (FALSE) gfits_byteswap_zdata (zdata, Nzdata, zdata_pixsize) ESCAPE(A);
     179      if (!strcasecmp(fields[i].zctype, "GZIP_2")) {
     180        if (!gfits_distribute_table_gzp2 (tgttable, &fields[i], raw, row_start, Nrows)) ESCAPE;
     181      } else {
     182        if (!gfits_distribute_table_data (tgttable, &fields[i], raw, row_start, Nrows)) ESCAPE;
     183      }     
    177184    }
    178185  }
     
    194201// raw_pixsize is the bytes / pixel for the input matrix
    195202// place the raw image bytes for the current tile into the tile buffer
    196 int gfits_distribute_table_data (FTable *table, char *raw, int col, int row_start, int Nrows, int rowsize) {
     203int gfits_distribute_table_data (FTable *table, TableField *field, char *raw, int row_start, int Nrows) {
    197204
    198205  off_t i;
     
    202209  off_t Nx = table->header->Naxis[0];
    203210
    204   if (VERBOSE) fprintf (stderr, "collect: ");
     211  if (VERBOSE) fprintf (stderr, "distribute: ");
    205212  for (i = 0; i < Nrows; i++) {
    206213    int row = row_start + i;
    207     memcpy (&table->buffer[Nx*row + col], &raw[i*rowsize], rowsize);
     214    memcpy (&table->buffer[Nx*row + field->offset], &raw[i*field->rowsize], field->rowsize);
    208215# if (VERBOSE)
    209     int j; for (j = 0; j < rowsize; j++) fprintf (stderr, "0x%02hhx ", table->buffer[Nx*row + col + j]);
     216    int j; for (j = 0; j < field->rowsize; j++) fprintf (stderr, "0x%02hhx ", table->buffer[Nx*row + field->offset + j]);
    210217# endif
    211218  }
     
    214221  return (TRUE);
    215222}
     223
     224int gfits_distribute_table_gzp2 (FTable *table, TableField *field, char *raw, int row_start, int Nrows) {
     225
     226  off_t i, j, k;
     227
     228  // we are copying NN rows into the column which starts at XX and has MM bytes per row
     229
     230  off_t Nx = table->header->Naxis[0];
     231
     232  for (k = 0; k < field->pixsize; k++) {
     233    for (i = 0; i < Nrows; i++) {
     234      int row = row_start + i;
     235      char *src = &raw[i*field->rowsize + k*Nrows*field->Nvalues];
     236      char *tgt = &table->buffer[Nx*row + field->offset + k];
     237      for (j = 0; j < field->Nvalues; j++, tgt+=field->pixsize, src++) {
     238        *tgt = *src;
     239      }
     240    }
     241  }
     242  return (TRUE);
     243}
Note: See TracChangeset for help on using the changeset viewer.