From f4dfc8ef155432592bbc88f7b476c712697ebf14 Mon Sep 17 00:00:00 2001 From: rhenders Date: Fri, 11 Oct 2013 11:49:09 +0000 Subject: [PATCH] Changes to support short-integer images --- src/fits/fitsbody.c | 104 +++++++++++++++++++++++++++++--------------- src/fits/fitscat.c | 23 +++++++++- src/fits/fitscat.h | 1 + src/fits/fitshead.c | 4 ++ 4 files changed, 96 insertions(+), 36 deletions(-) diff --git a/src/fits/fitsbody.c b/src/fits/fitsbody.c index 66c55d8..72ff7a0 100644 --- a/src/fits/fitsbody.c +++ b/src/fits/fitsbody.c @@ -85,8 +85,6 @@ PIXTYPE *alloc_body(tabstruct *tab, void (*func)(PIXTYPE *ptr, int npix)) tab->extname); /* Decide if the data will go in physical memory or on swap-space */ - - //npix = tab->tabsize/tab->bytepix; npix = tab->naxisn[0] * tab->naxisn[1]; size = npix*sizeof(PIXTYPE); @@ -300,6 +298,61 @@ void free_body(tabstruct *tab) } +void readTileCompressed(tabstruct *tab, size_t spoonful, double* bufdata0) { + + int status, hdutype; + + // first of all, move to correct HDU + status = 0; fits_movabs_hdu(tab->infptr, tab->hdunum, &hdutype, &status); + if (status != 0) { + + printf("Error moving to HDU %d\n", tab->hdunum); + fits_report_error(stderr, status); + } + + // pixels count from 1 + if (tab->currentElement == 0) tab->currentElement = 1; + + // now read section of image + int datatype; + switch(tab->bitpix){ + case BYTE_IMG: + datatype = TBYTE; + break; + case SHORT_IMG: + datatype = TSHORT; + break; + case LONG_IMG: + datatype = TLONG; + break; + case FLOAT_IMG: + datatype = TFLOAT; + break; + case DOUBLE_IMG: + datatype = TDOUBLE; + break; + } + + int anynul; + double bscale = 1.0, bzero = 0.0, nulval = 0.; + + // turn off any scaling so that we copy raw pixel values + status = 0; fits_set_bscale(tab->infptr, bscale, bzero, &status); + + // now read the image + status = 0; fits_read_img(tab->infptr, datatype, tab->currentElement, spoonful, &nulval, bufdata0, &anynul, &status); + + // report reading error + if (status != 0) { + + printf("CFITSIO ERROR reading start=%d end=%d absolute end=%d\n", tab->currentElement, (tab->currentElement + spoonful) , (tab->naxisn[0]*tab->naxisn[1])); + fits_report_error(stderr, status); + } + + // update file 'pointer' + tab->currentElement += spoonful; + } + /******* read_body ************************************************************ PROTO read_body(tabstruct *tab, PIXTYPE *ptr, long size) PURPOSE Read floating point values from the body of a FITS table. @@ -357,38 +410,11 @@ void read_body(tabstruct *tab, PIXTYPE *ptr, size_t size) bufdata = (char *)bufdata0; // CFITSIO - if (tab->isTileCompressed) { - - int status, hdutype; - - // first of all, move to correct HDU - status = 0; fits_movabs_hdu(tab->infptr, tab->hdunum, &hdutype, &status); - if (status != 0) { - - printf("Error moving to HDU %d\n", tab->hdunum); - fits_report_error(stderr, status); - } - - // pixels count from 1 - if (tab->currentElement == 0) tab->currentElement = 1; - - // now read section of image - status = 0; fits_read_img(tab->infptr, TFLOAT, tab->currentElement, spoonful, NULL, bufdata, NULL, &status); - - //printf("CFITSIO OK reading start=%d end=%d absolute end=%d\n", tab->currentElement, (tab->currentElement + spoonful) , (tab->naxisn[0]*tab->naxisn[1])); - - // report reading error - if (status != 0) { - - printf("CFITSIO ERROR reading start=%d end=%d absolute end=%d\n", tab->currentElement, (tab->currentElement + spoonful) , (tab->naxisn[0]*tab->naxisn[1])); - fits_report_error(stderr, status); - } - - // update file 'pointer' - tab->currentElement += spoonful; - } + if (tab->isTileCompressed) + readTileCompressed(tab, spoonful, bufdata0); else QFREAD(bufdata, spoonful*tab->bytepix, cat->file, cat->filename); + switch(tab->bitpix) { case BP_BYTE: @@ -666,8 +692,6 @@ void read_body(tabstruct *tab, PIXTYPE *ptr, size_t size) "read_body()"); } - //printf("SSSS %f %f %f %f %f\n", bufdata[0], bufdata[10], bufdata[100], bufdata[1000], bufdata[spoonful-1]); - return; } @@ -706,7 +730,13 @@ void read_ibody(tabstruct *tab, FLAGTYPE *ptr, size_t size) if (spoonful>size) spoonful = size; bufdata = (char *)bufdata0; + + // CFITSIO + if (tab->isTileCompressed) + readTileCompressed(tab, spoonful, bufdata0); + else QFREAD(bufdata, spoonful*tab->bytepix, cat->file, cat->filename); + switch(tab->bitpix) { case BP_BYTE: @@ -716,6 +746,7 @@ void read_ibody(tabstruct *tab, FLAGTYPE *ptr, size_t size) break; case BP_SHORT: + if (!tab->isTileCompressed) if (bswapflag) swapbytes(bufdata, 2, spoonful); #pragma ivdep @@ -724,6 +755,7 @@ void read_ibody(tabstruct *tab, FLAGTYPE *ptr, size_t size) break; case BP_LONG: + if (!tab->isTileCompressed) if (bswapflag) swapbytes(bufdata, 4, spoonful); #pragma ivdep @@ -733,6 +765,7 @@ void read_ibody(tabstruct *tab, FLAGTYPE *ptr, size_t size) #ifdef HAVE_LONG_LONG_INT case BP_LONGLONG: + if (!tab->isTileCompressed) if (bswapflag) swapbytes(bufdata, 8, spoonful); #pragma ivdep @@ -974,7 +1007,8 @@ void write_body(tabstruct *tab, PIXTYPE *ptr, size_t size) for (i=spoonful; i--;) *(bufdata++) = (*(ptr++)-bz)/bs; - // CFITSIO - only perform byte-swap if we are NOT writing a tile-compressed format using cfitsio + + // TODO not yet writing CFitsIO from SExtractor. CFITSIO - only perform byte-swap if we are NOT writing a tile-compressed format using cfitsio if (0 && tab->infptr == NULL) // TODO if (bswapflag) swapbytes(cbufdata0, 4, spoonful); diff --git a/src/fits/fitscat.c b/src/fits/fitscat.c index b621779..1f498fc 100644 --- a/src/fits/fitscat.c +++ b/src/fits/fitscat.c @@ -166,6 +166,25 @@ int close_cat(catstruct *cat) } +int close_cfitsio(catstruct *cat) +{ + + if (cat->tab->infptr) { + + int status = 0; fits_close_file(cat->tab->infptr, &status); + if (status != 0) { + fits_report_error(stderr, status); + printf("ERROR could not close FITS file with cfitsio: %s\n", cat->filename); + } + else { + //printf("SUCCESS CFITSIO CLOSE\n\n"); + cat->tab->infptr == NULL; + } + + } + //printf("NO CFITSIO FILE TO CLOSE\n"); +} + /****** free_cat *************************************************************** PROTO void free_cat(catstruct **cat, int ncat) PURPOSE Free all structures allocated for one or several FITS catalog. @@ -346,7 +365,9 @@ int map_cat(catstruct *cat) tab->infptr = infptr; status = 0; fits_movabs_hdu(tab->infptr, tab->hdunum, &hdutype, &status); if (status != 0) printf("ERROR could not move to hdu %d in file %s\n", tab->hdunum, cat->filename); - tab->tabsize = infptr->Fptr->rowlength; + //tab->tabsize = infptr->Fptr->rowlength; + + //printf("TABSIZE = %ld\n", tab->tabsize); if (tab->tabsize) { diff --git a/src/fits/fitscat.h b/src/fits/fitscat.h index 6b4d4af..beb9d99 100644 --- a/src/fits/fitscat.h +++ b/src/fits/fitscat.h @@ -282,6 +282,7 @@ extern int about_cat(catstruct *cat, FILE *stream), add_tab(tabstruct *tab, catstruct *cat, int pos), blank_keys(tabstruct *tab), close_cat(catstruct *cat), + close_cfitsio(catstruct *cat), copy_key(tabstruct *tabin, char *keyname, tabstruct *tabout, int pos), copy_tab(catstruct *catin, char *tabname, int seg, diff --git a/src/fits/fitshead.c b/src/fits/fitshead.c index a83ebba..8a95f02 100644 --- a/src/fits/fitshead.c +++ b/src/fits/fitshead.c @@ -168,6 +168,10 @@ void readbasic_head(tabstruct *tab) /*random groups parameters (optional)*/ tab->pcount = 0; fitsread(tab->headbuf, "PCOUNT ", &tab->pcount, H_INT, T_LONG); + + // CFITSIO TODO HACK + if (tab->isTileCompressed) tab->pcount = 0; + tab->gcount = 1; fitsread(tab->headbuf, "GCOUNT ", &tab->gcount, H_INT, T_LONG); -- GitLab