Unverified Commit b2cfd631 authored by Emmanuel Bertin's avatar Emmanuel Bertin Committed by GitHub
Browse files

Merge pull request #10 from teake/teake/merge-roy

Rice compression support
parents 33253012 a7f2fe76
...@@ -53,6 +53,7 @@ sinclude(acx_atlas.m4) ...@@ -53,6 +53,7 @@ sinclude(acx_atlas.m4)
sinclude(acx_openblas.m4) sinclude(acx_openblas.m4)
sinclude(acx_fftw.m4) sinclude(acx_fftw.m4)
sinclude(acx_mkl.m4) sinclude(acx_mkl.m4)
sinclude(acx_cfitsio.m4)
sinclude(acx_prog_cc_optim.m4) sinclude(acx_prog_cc_optim.m4)
sinclude(acx_pthread.m4) sinclude(acx_pthread.m4)
sinclude(acx_urbi_resolve_dir.m4) sinclude(acx_urbi_resolve_dir.m4)
...@@ -180,6 +181,20 @@ AC_ARG_WITH(openblas-incdir, ...@@ -180,6 +181,20 @@ AC_ARG_WITH(openblas-incdir,
[AS_HELP_STRING([--with-openblas-incdir=<OpenBLAS header dir>], [AS_HELP_STRING([--with-openblas-incdir=<OpenBLAS header dir>],
[Provide an alternative path to the OpenBLAS header directory])]) [Provide an alternative path to the OpenBLAS header directory])])
# Provide special option for CFITSIO
AC_MSG_CHECKING([whether CFITSIO support is enabled])
AC_ARG_ENABLE(cfitsio,
[AS_HELP_STRING([--enable-cfitsio],
[Enable support for compressed FITS files through the CFITSIO library (default = no)])],
AC_MSG_RESULT([yes]),
AC_MSG_RESULT([no]))
AC_ARG_WITH(cfitsio-libdir,
[AS_HELP_STRING([--with-cfitsio-libdir=<CFITSIO library path>],
[Provide an alternative path to the CFITSIO library])])
AC_ARG_WITH(cfitsio-incdir,
[AS_HELP_STRING([--with-cfitsio-incdir=<CFITSIO header dir>],
[Provide an alternative path to the CFITSIO header directory])])
# Provide a special option for the default XSLT URL # Provide a special option for the default XSLT URL
with_xsl_url="file://"$(URBI_RESOLVE_DIR([$datadir]))"/$PACKAGE_TARNAME/$PACKAGE_TARNAME.xsl" with_xsl_url="file://"$(URBI_RESOLVE_DIR([$datadir]))"/$PACKAGE_TARNAME/$PACKAGE_TARNAME.xsl"
AC_ARG_WITH(xsl_url, AC_ARG_WITH(xsl_url,
...@@ -305,6 +320,20 @@ if test "$enable_model_fitting" != "no"; then ...@@ -305,6 +320,20 @@ if test "$enable_model_fitting" != "no"; then
fi fi
fi fi
AS_IF([test "x$enable_cfitsio" = "xyes"], [
ACX_CFITSIO($with_cfitsio_libdir, $with_cfitsio_incdir,, no,
[
AM_CFLAGS="$AM_CFLAGS $CFITSIO_CFLAGS "
AM_LDFLAGS="$AM_LDFLAGS $CFITSIO_LDFLAGS "
LIBS="$CFITSIO_LIBS $LIBS"
if test "$CFITSIO_WARN" != ""; then
AC_MSG_WARN([$CFITSIO_WARN])
fi
],
AC_MSG_ERROR([$CFITSIO_ERROR Exiting.])
)
])
AM_CONDITIONAL(USE_MODEL, [test "$enable_model_fitting" != "no"]) AM_CONDITIONAL(USE_MODEL, [test "$enable_model_fitting" != "no"])
# Compile with profiling option # Compile with profiling option
......
dnl
dnl acx_cfitsio.m4
dnl
dnl Figure out if the CFITSIO library and header files are installed.
dnl
dnl %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
dnl
dnl This file part of: AstrOmatic software
dnl
dnl Copyright: (C) 2019 IAP/CNRS/UPMC
dnl
dnl License: GNU General Public License
dnl
dnl AstrOmatic software is free software: you can redistribute it and/or
dnl modify it under the terms of the GNU General Public License as
dnl published by the Free Software Foundation, either version 3 of the
dnl License, or (at your option) any later version.
dnl AstrOmatic software is distributed in the hope that it will be useful,
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
dnl GNU General Public License for more details.
dnl You should have received a copy of the GNU General Public License
dnl along with AstrOmatic software.
dnl If not, see <http://www.gnu.org/licenses/>.
dnl
dnl Last modified: 16/07/2019
dnl
dnl %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
dnl
dnl @synopsis ACX_CFITSIO([CFITSIO_LIBSDIR, CFITSIO_INCDIR, CFITSIO_PFLAG,
dnl ILP64_FLAG, [ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]])
dnl
dnl You may wish to use these variables in your default LIBS:
dnl
dnl LIBS="$CFITSIO_LIBS $LIBS"
dnl
dnl ACTION-IF-FOUND is a list of shell commands to run if CFITSIO
dnl is found (HAVE_CFITSIO is defined first), and ACTION-IF-NOT-FOUND
dnl is a list of commands to run it if it is not found.
AC_DEFUN([ACX_CFITSIO], [
AC_REQUIRE([AC_CANONICAL_HOST])
dnl --------------------
dnl Search include files
dnl --------------------
CFITSIO_ERROR=""
if test x$2 = x; then
[acx_cfitsio_incdir="/"]
AC_CHECK_HEADERS(
[${acx_cfitsio_incdir}fitsio.h],,
[
[acx_cfitsio_incdir=""]
AC_CHECK_HEADER(
[fitsio.h],,
[CFITSIO_ERROR="CFITSIO header files not found!"]
)
]
)
else
acx_cfitsio_incdir="$2/"
AC_CHECK_HEADER(
[${acx_cfitsio_incdir}fitsio.h],,
[
[acx_cfitsio_incdir="$2/include/"]
AC_CHECK_HEADERS(
[${acx_cfitsio_incdir}fitsio.h],,
[CFITSIO_ERROR="CFITSIO header files not found in "$2"!"]
)]
)
fi
if test "x$CFITSIO_ERROR" = "x"; then
AC_DEFINE_UNQUOTED(FITSIO_H, "${acx_cfitsio_incdir}fitsio.h", [CFITSIO header filename.])
dnl ----------------------------
dnl Search CFITSIO library file
dnl ----------------------------
OLIBS="$LIBS"
LIBS=""
if test x$4 = xyes; then
acx_cfitsio_suffix="64"
CFITSIO_CFLAGS="-DCFITSIO_USE64BITINT -DLAPACK_ILP64"
else
acx_cfitsio_suffix=""
CFITSIO_CFLAGS=""
fi
if test x$1 = x; then
acx_cfitsio_libopt=""
else
acx_cfitsio_libopt="-L$1"
fi
AC_SEARCH_LIBS(
[ffmahd], ["cfitsio"$acx_cfitsio_suffix],,
[CFITSIO_ERROR="CFITSIO"$acx_cfitsio_suffix" library file not found!"],
$acx_cfitsio_libopt
)
LIBS="$OLIBS"
fi
dnl -------------------------------------------------------------------------
dnl Finally execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND
dnl -------------------------------------------------------------------------
if test "x$CFITSIO_ERROR" = "x"; then
AC_DEFINE(HAVE_CFITSIO,1, [Define if you have the CFITSIO library and header files.])
CFITSIO_LIBS="$acx_cfitsio_libopt $ac_cv_search_ffmahd"
AC_SUBST(CFITSIO_CFLAGS)
AC_SUBST(CFITSIO_LDFLAGS, "")
AC_SUBST(CFITSIO_LIBS)
AC_SUBST(CFITSIO_WARN)
$5
else
AC_SUBST(CFITSIO_ERROR)
$6
fi
])dnl ACX_CFITSIO
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* This file part of: SExtractor * This file part of: SExtractor
* *
* Copyright: (C) 1993-2016 IAP/CNRS/UPMC * Copyright: (C) 1993-2016 Emmanuel Bertin -- IAP/CNRS/UPMC
* *
* License: GNU General Public License * License: GNU General Public License
* *
...@@ -280,8 +280,7 @@ void examineiso(picstruct *field, picstruct *dfield, objstruct *obj, ...@@ -280,8 +280,7 @@ void examineiso(picstruct *field, picstruct *dfield, objstruct *obj,
emy2 /= flux2; /* variance of ym */ emy2 /= flux2; /* variance of ym */
emxy /= flux2; /* covariance */ emxy /= flux2; /* covariance */
/*-- Handle fully correlated profile /*-- Handle fully correlated profiles (which cause a singularity...) */
s (which cause a singularity...) */
esum *= 0.08333/flux2; esum *= 0.08333/flux2;
if (obj->singuflag && (emx2*emy2-emxy*emxy) < esum*esum) if (obj->singuflag && (emx2*emy2-emxy*emxy) < esum*esum)
{ {
...@@ -718,10 +717,10 @@ void endobject(picstruct *field, picstruct *dfield, picstruct *wfield, ...@@ -718,10 +717,10 @@ void endobject(picstruct *field, picstruct *dfield, picstruct *wfield,
dgeo_copy(dgeofield, outobj2.vignet_dgeox , outobj2.vignet_dgeoy, dgeo_copy(dgeofield, outobj2.vignet_dgeox , outobj2.vignet_dgeoy,
prefs.vignet_dgeoxsize[0],prefs.vignet_dgeoxsize[1], ix,iy); prefs.vignet_dgeoxsize[0],prefs.vignet_dgeoxsize[1], ix,iy);
else { else {
if (FLAG(obj2.vignet_dgeox)) if (FLAG(obj2.vignet_dgeox))
dgeo_copy(dgeofield, outobj2.vignet_dgeox, NULL, dgeo_copy(dgeofield, outobj2.vignet_dgeox, NULL,
prefs.vignet_dgeoxsize[0],prefs.vignet_dgeoxsize[1], ix,iy); prefs.vignet_dgeoxsize[0],prefs.vignet_dgeoxsize[1], ix,iy);
if (FLAG(obj2.vignet_dgeoy)) if (FLAG(obj2.vignet_dgeoy))
dgeo_copy(dgeofield, NULL, outobj2.vignet_dgeoy, dgeo_copy(dgeofield, NULL, outobj2.vignet_dgeoy,
prefs.vignet_dgeoysize[0],prefs.vignet_dgeoysize[1], ix,iy); prefs.vignet_dgeoysize[0],prefs.vignet_dgeoysize[1], ix,iy);
} }
......
...@@ -52,8 +52,10 @@ void makeback(picstruct *field, picstruct *wfield, int wscale_flag) ...@@ -52,8 +52,10 @@ void makeback(picstruct *field, picstruct *wfield, int wscale_flag)
{ {
backstruct *backmesh,*wbackmesh, *bm,*wbm; backstruct *backmesh,*wbackmesh, *bm,*wbm;
tabstruct *tab, *wtab;
PIXTYPE *buf,*wbuf, *buft,*wbuft; PIXTYPE *buf,*wbuf, *buft,*wbuft;
OFF_T fcurpos,wfcurpos, wfcurpos2,fcurpos2, bufshift, jumpsize; OFF_T2 fcurpos,wfcurpos, wfcurpos2,fcurpos2, bufshift, jumpsize;
OFF_T2 currentElement, wcurrentElement, currentElement2, wcurrentElement2;
size_t bufsize, bufsize2, size_t bufsize, bufsize2,
size,meshsize; size,meshsize;
int i,j,k,m,n, step, nlines, int i,j,k,m,n, step, nlines,
...@@ -65,7 +67,11 @@ void makeback(picstruct *field, picstruct *wfield, int wscale_flag) ...@@ -65,7 +67,11 @@ void makeback(picstruct *field, picstruct *wfield, int wscale_flag)
/* If the weight-map is not an external one, no stats are needed for it */ /* If the weight-map is not an external one, no stats are needed for it */
if (wfield && wfield->flags&(INTERP_FIELD|BACKRMS_FIELD)) if (wfield && wfield->flags&(INTERP_FIELD|BACKRMS_FIELD))
wfield= NULL; wfield= NULL;
tab = field->tab;
if (wfield)
wtab = wfield->tab;
else
wtab = NULL; /* to avoid gcc -Wall warnings */
w = field->width; w = field->width;
bw = field->backw; bw = field->backw;
bh = field->backh; bh = field->backh;
...@@ -83,12 +89,17 @@ void makeback(picstruct *field, picstruct *wfield, int wscale_flag) ...@@ -83,12 +89,17 @@ void makeback(picstruct *field, picstruct *wfield, int wscale_flag)
wfcurpos = wfcurpos2 = 0; /* to avoid gcc -Wall warnings */ wfcurpos = wfcurpos2 = 0; /* to avoid gcc -Wall warnings */
QFTELL(field->file, fcurpos, field->filename); QFTELL(field->file, fcurpos, field->filename);
currentElement = (tab->currentElement == 0) ? 1 : tab->currentElement; // CFITSIO
if (wfield) if (wfield)
{
QFTELL(wfield->file, wfcurpos, wfield->filename); QFTELL(wfield->file, wfcurpos, wfield->filename);
wcurrentElement = (wtab->currentElement == 0) ? 1 : wtab->currentElement; // CFITSIO
}
/* Allocate a correct amount of memory to store pixels */ /* Allocate a correct amount of memory to store pixels */
bufsize = (OFF_T)w*bh; bufsize = (OFF_T2)w*bh;
meshsize = (size_t)bufsize; meshsize = (size_t)bufsize;
nlines = 0; nlines = 0;
if (bufsize > (size_t)BACK_BUFSIZE) if (bufsize > (size_t)BACK_BUFSIZE)
...@@ -96,8 +107,8 @@ void makeback(picstruct *field, picstruct *wfield, int wscale_flag) ...@@ -96,8 +107,8 @@ void makeback(picstruct *field, picstruct *wfield, int wscale_flag)
nlines = BACK_BUFSIZE/w; nlines = BACK_BUFSIZE/w;
step = (field->backh-1)/nlines+1; step = (field->backh-1)/nlines+1;
bufsize = (size_t)(nlines = field->backh/step)*w; bufsize = (size_t)(nlines = field->backh/step)*w;
bufshift = (step/2)*(OFF_T)w; bufshift = (step/2)*(OFF_T2)w;
jumpsize = (step-1)*(OFF_T)w; jumpsize = (step-1)*(OFF_T2)w;
} }
else else
bufshift = jumpsize = 0; /* to avoid gcc -Wall warnings */ bufshift = jumpsize = 0; /* to avoid gcc -Wall warnings */
...@@ -172,16 +183,19 @@ void makeback(picstruct *field, picstruct *wfield, int wscale_flag) ...@@ -172,16 +183,19 @@ void makeback(picstruct *field, picstruct *wfield, int wscale_flag)
{ {
/*---- Image size too big, we have to skip a few data !*/ /*---- Image size too big, we have to skip a few data !*/
QFTELL(field->file, fcurpos2, field->filename); QFTELL(field->file, fcurpos2, field->filename);
if (wfield) currentElement2 = (tab->currentElement == 0) ? 1 : tab->currentElement; // CFITSIO
if (wfield){
QFTELL(wfield->file, wfcurpos2, wfield->filename); QFTELL(wfield->file, wfcurpos2, wfield->filename);
wcurrentElement2 = (wtab->currentElement == 0) ? 1 : wtab->currentElement; // CFITSIO
}
if (j == ny-1 && (n=field->height%field->backh)) if (j == ny-1 && (n=field->height%field->backh))
{ {
meshsize = n*(size_t)w; meshsize = n*(size_t)w;
nlines = BACK_BUFSIZE/w; nlines = BACK_BUFSIZE/w;
step = (n-1)/nlines+1; step = (n-1)/nlines+1;
bufsize = (nlines = n/step)*(size_t)w; bufsize = (nlines = n/step)*(size_t)w;
bufshift = (step/2)*(OFF_T)w; bufshift = (step/2)*(OFF_T2)w;
jumpsize = (step-1)*(OFF_T)w; jumpsize = (step-1)*(OFF_T2)w;
free(buf); free(buf);
QMALLOC(buf, PIXTYPE, bufsize); /* pixel buffer */ QMALLOC(buf, PIXTYPE, bufsize); /* pixel buffer */
if (wfield) if (wfield)
...@@ -192,35 +206,46 @@ void makeback(picstruct *field, picstruct *wfield, int wscale_flag) ...@@ -192,35 +206,46 @@ void makeback(picstruct *field, picstruct *wfield, int wscale_flag)
} }
/*---- Read and skip, read and skip, etc... */ /*---- Read and skip, read and skip, etc... */
QFSEEK(field->file, bufshift*(OFF_T)field->bytepix, SEEK_CUR, QFSEEK(field->file, bufshift*(OFF_T2)field->bytepix, SEEK_CUR,
field->filename); field->filename);
tab->currentElement += bufshift; // CFITSIO
buft = buf; buft = buf;
for (i=nlines; i--; buft += w) for (i=nlines; i--; buft += w)
{ {
read_body(field->tab, buft, w); read_body(field->tab, buft, w);
if (i) if (i) {
QFSEEK(field->file, jumpsize*(OFF_T)field->bytepix, SEEK_CUR, QFSEEK(field->file, jumpsize*(OFF_T2)field->bytepix, SEEK_CUR,
field->filename); field->filename);
tab->currentElement += jumpsize; // CFITSIO
}
} }
if (wfield) if (wfield)
{ {
/*------ Read and skip, read and skip, etc... now on the weight-map */ /*------ Read and skip, read and skip, etc... now on the weight-map */
QFSEEK(wfield->file, bufshift*(OFF_T)wfield->bytepix, SEEK_CUR, QFSEEK(wfield->file, bufshift*(OFF_T2)wfield->bytepix, SEEK_CUR,
wfield->filename); wfield->filename);
wtab->currentElement += bufshift; // CFITSIO
wbuft = wbuf; wbuft = wbuf;
for (i=nlines; i--; wbuft += w) for (i=nlines; i--; wbuft += w)
{ {
read_body(wfield->tab, wbuft, w); read_body(wfield->tab, wbuft, w);
weight_to_var(wfield, wbuft, w); weight_to_var(wfield, wbuft, w);
if (i) if (i){
QFSEEK(wfield->file, jumpsize*(OFF_T)wfield->bytepix, SEEK_CUR, QFSEEK(wfield->file, jumpsize*(OFF_T2)wfield->bytepix, SEEK_CUR,
wfield->filename); wfield->filename);
wtab->currentElement += jumpsize; // CFITSIO
}
} }
} }
backstat(backmesh, wbackmesh, buf, wbuf, bufsize, nx, w, bw, backstat(backmesh, wbackmesh, buf, wbuf, bufsize, nx, w, bw,
wfield?wfield->weight_thresh:0.0); wfield?wfield->weight_thresh:0.0);
QFSEEK(field->file, fcurpos2, SEEK_SET, field->filename); QFSEEK(field->file, fcurpos2, SEEK_SET, field->filename);
tab->currentElement = currentElement2; // CFITSIO
bm = backmesh; bm = backmesh;
for (m=nx; m--; bm++) for (m=nx; m--; bm++)
if (bm->mean <= -BIG) if (bm->mean <= -BIG)
...@@ -230,6 +255,7 @@ void makeback(picstruct *field, picstruct *wfield, int wscale_flag) ...@@ -230,6 +255,7 @@ void makeback(picstruct *field, picstruct *wfield, int wscale_flag)
if (wfield) if (wfield)
{ {
QFSEEK(wfield->file, wfcurpos2, SEEK_SET, wfield->filename); QFSEEK(wfield->file, wfcurpos2, SEEK_SET, wfield->filename);
wtab->currentElement = wcurrentElement2; // CFITSIO
wbm = wbackmesh; wbm = wbackmesh;
for (m=nx; m--; wbm++) for (m=nx; m--; wbm++)
if (wbm->mean <= -BIG) if (wbm->mean <= -BIG)
...@@ -284,8 +310,11 @@ void makeback(picstruct *field, picstruct *wfield, int wscale_flag) ...@@ -284,8 +310,11 @@ void makeback(picstruct *field, picstruct *wfield, int wscale_flag)
/* Go back to the original position */ /* Go back to the original position */
QFSEEK(field->file, fcurpos, SEEK_SET, field->filename); QFSEEK(field->file, fcurpos, SEEK_SET, field->filename);
if (wfield) tab->currentElement = currentElement; // CFITSIO
if (wfield) {
QFSEEK(wfield->file, wfcurpos, SEEK_SET, wfield->filename); QFSEEK(wfield->file, wfcurpos, SEEK_SET, wfield->filename);
wfield->tab->currentElement = wcurrentElement; // CFITSIO
}
/* Median-filter and check suitability of the background map */ /* Median-filter and check suitability of the background map */
NFPRINTF(OUTPUT, "Filtering background map(s)"); NFPRINTF(OUTPUT, "Filtering background map(s)");
......
...@@ -1059,7 +1059,7 @@ void reendcat() ...@@ -1059,7 +1059,7 @@ void reendcat()
{ {
keystruct *key; keystruct *key;
tabstruct *tab; tabstruct *tab;
OFF_T pos; OFF_T2 pos;
char *head; char *head;
switch(prefs.cat_type) switch(prefs.cat_type)
...@@ -1127,4 +1127,3 @@ void zerocat(void) ...@@ -1127,4 +1127,3 @@ void zerocat(void)
} }
...@@ -70,6 +70,7 @@ picstruct *newfield(char *filename, int flags, int ext) ...@@ -70,6 +70,7 @@ picstruct *newfield(char *filename, int flags, int ext)
field->cat = cat; field->cat = cat;
nok = 0; nok = 0;
tab = cat->tab; tab = cat->tab;
if(tab->isTileCompressed) nok++;
if (tab->naxis >= 2 if (tab->naxis >= 2
&& strncmp(tab->xtension, "BINTABLE", 8) && strncmp(tab->xtension, "BINTABLE", 8)
&& strncmp(tab->xtension, "ASCTABLE", 8)) && strncmp(tab->xtension, "ASCTABLE", 8))
...@@ -78,6 +79,7 @@ picstruct *newfield(char *filename, int flags, int ext) ...@@ -78,6 +79,7 @@ picstruct *newfield(char *filename, int flags, int ext)
for (ntab=cat->ntab; ext2-- && ntab--;) for (ntab=cat->ntab; ext2-- && ntab--;)
{ {
tab=tab->nexttab; tab=tab->nexttab;
if(tab->isTileCompressed) nok++;
if (tab->naxis >= 2 if (tab->naxis >= 2
&& strncmp(tab->xtension, "BINTABLE", 8) && strncmp(tab->xtension, "BINTABLE", 8)
&& strncmp(tab->xtension, "ASCTABLE", 8)) && strncmp(tab->xtension, "ASCTABLE", 8))
......
...@@ -85,7 +85,7 @@ PIXTYPE *alloc_body(tabstruct *tab, void (*func)(PIXTYPE *ptr, int npix)) ...@@ -85,7 +85,7 @@ PIXTYPE *alloc_body(tabstruct *tab, void (*func)(PIXTYPE *ptr, int npix))
tab->extname); tab->extname);
/* Decide if the data will go in physical memory or on swap-space */ /* 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); size = npix*sizeof(PIXTYPE);
if (size < body_ramleft) if (size < body_ramleft)
{ {
...@@ -93,6 +93,7 @@ PIXTYPE *alloc_body(tabstruct *tab, void (*func)(PIXTYPE *ptr, int npix)) ...@@ -93,6 +93,7 @@ PIXTYPE *alloc_body(tabstruct *tab, void (*func)(PIXTYPE *ptr, int npix))
if ((tab->bodybuf = malloc(size))) if ((tab->bodybuf = malloc(size)))
{ {
QFSEEK(tab->cat->file, tab->bodypos, SEEK_SET, tab->cat->filename); QFSEEK(tab->cat->file, tab->bodypos, SEEK_SET, tab->cat->filename);
tab->currentElement = 1; // CFITSIO
read_body(tab, (PIXTYPE *)tab->bodybuf, npix); read_body(tab, (PIXTYPE *)tab->bodybuf, npix);
/*---- Apply pixel processing */ /*---- Apply pixel processing */
if (func) if (func)
...@@ -120,6 +121,7 @@ PIXTYPE *alloc_body(tabstruct *tab, void (*func)(PIXTYPE *ptr, int npix)) ...@@ -120,6 +121,7 @@ PIXTYPE *alloc_body(tabstruct *tab, void (*func)(PIXTYPE *ptr, int npix))
if (!spoonful) if (!spoonful)
spoonful = DATA_BUFSIZE; spoonful = DATA_BUFSIZE;
QFSEEK(tab->cat->file, tab->bodypos, SEEK_SET, tab->cat->filename); QFSEEK(tab->cat->file, tab->bodypos, SEEK_SET, tab->cat->filename);
tab->currentElement = 1; // CFITSIO
read_body(tab, buffer, spoonful/sizeof(PIXTYPE)); read_body(tab, buffer, spoonful/sizeof(PIXTYPE));
/*-- Apply pixel processing */ /*-- Apply pixel processing */
if (func) if (func)
...@@ -294,6 +296,97 @@ void free_body(tabstruct *tab) ...@@ -294,6 +296,97 @@ void free_body(tabstruct *tab)
return; return;
} }
#ifdef HAVE_CFITSIO
void writeCfitsio(tabstruct *tab, size_t spoonful, void *cbufdata0) {
int status = 0; fits_write_img(tab->infptr, TFLOAT, tab->currentElement, spoonful, cbufdata0, &status);
if (status != 0) {
printf("CFITSIO ERROR writing start=%d end=%d absolute end=%d\n", tab->currentElement, (tab->currentElement + spoonful) , (tab->naxisn[0]*tab->naxisn[1]));
fits_report_error(stderr, status);
}
tab->currentElement = tab->currentElement + spoonful;
}
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;
}
#endif
void readSpoonful(tabstruct *tab, size_t spoonful, double* bufdata0, char* bufdata) {
#ifdef HAVE_CFITSIO
if(tab->isTileCompressed)
readTileCompressed(tab, spoonful, bufdata0);
else
#endif
QFREAD(bufdata, spoonful*tab->bytepix, tab->cat->file, tab->cat->filename);
}
void writeSpoonful(tabstruct *tab, size_t spoonful, void *cbufdata0) {
#ifdef HAVE_CFITSIO
if (0 && tab->infptr != NULL)
writeCfitsio(tab, spoonful, cbufdata0);
else
#endif
QFWRITE(cbufdata0, spoonful * tab->bytepix, tab->cat->file, tab->cat->filename);
}
/******* read_body ************************************************************ /******* read_body ************************************************************
PROTO read_body(tabstruct *tab, PIXTYPE *ptr, long size) PROTO read_body(tabstruct *tab, PIXTYPE *ptr, long size)
...@@ -323,15 +416,21 @@ void read_body(tabstruct *tab, PIXTYPE *ptr, size_t size) ...@@ -323,15 +416,21 @@ void read_body(tabstruct *tab, PIXTYPE *ptr, size_t size)
int curval, dval, blankflag, bswapflag, ival, iblank; int curval, dval, blankflag, bswapflag, ival, iblank;
size_t i, bowl, spoonful, npix; size_t i, bowl, spoonful, npix;
PIXTYPE bs,bz; //PIXTYPE bs,bz;
double bs,bz;
/* a NULL cat structure indicates that no data can be read */ /* a NULL cat structure indicates that no data can be read */
if (!(cat = tab->cat)) if (!(cat = tab->cat))
return; return;
bs = (PIXTYPE)tab->bscale; // this cast from double to float loses precision
bz = (PIXTYPE)tab->bzero; //bs = (PIXTYPE)tab->bscale;
//bz = (PIXTYPE)tab->bzero;
bs = tab->bscale;
bz = tab->bzero;
blankflag = tab->blankflag; blankflag = tab->blankflag;
bswapflag = *((char *)&ashort); // Byte-swapping flag bswapflag = *((char *)&ashort); // Byte-swapping flag
...@@ -346,7 +445,8 @@ void read_body(tabstruct *tab, PIXTYPE *ptr, size_t size) ...@@ -346,7 +445,8 @@ void read_body(tabstruct *tab, PIXTYPE *ptr, size_t size)
if (spoonful>size) if (spoonful>size)
spoonful = size; spoonful = size;
bufdata = (char *)bufdata0; bufdata = (char *)bufdata0;
QFREAD(bufdata, spoonful*tab->bytepix, cat->file, cat->filename); readSpoonful(tab, spoonful, bufdata0, bufdata);
switch(tab->bitpix) switch(tab->bitpix)
{ {
case BP_BYTE: case BP_BYTE:
...@@ -383,6 +483,7 @@ void read_body(tabstruct *tab, PIXTYPE *ptr, size_t size) ...@@ -383,6 +483,7 @@ void read_body(tabstruct *tab, PIXTYPE *ptr, size_t size)
break; break;
case BP_SHORT: case BP_SHORT:
if (!tab->isTileCompressed)
if (bswapflag) if (bswapflag)
swapbytes(bufdata, 2, spoonful); swapbytes(bufdata, 2, spoonful);
if (blankflag) if (blankflag)
...@@ -418,6 +519,7 @@ void read_body(tabstruct *tab, PIXTYPE *ptr, size_t size) ...@@ -418,6 +519,7 @@ void read_body(tabstruct *tab, PIXTYPE *ptr, size_t size)
break; break;
case BP_LONG: case BP_LONG:
if (!tab->isTileCompressed)
if (bswapflag) if (bswapflag)
swapbytes(bufdata, 4, spoonful); swapbytes(bufdata, 4, spoonful);
if (blankflag) if (blankflag)
...@@ -454,6 +556,7 @@ void read_body(tabstruct *tab, PIXTYPE *ptr, size_t size) ...@@ -454,6 +556,7 @@ void read_body(tabstruct *tab, PIXTYPE *ptr, size_t size)
#ifdef HAVE_LONG_LONG_INT #ifdef HAVE_LONG_LONG_INT
case BP_LONGLONG: case BP_LONGLONG:
if (!tab->isTileCompressed)
if (bswapflag) if (bswapflag)
swapbytes(bufdata, 8, spoonful); swapbytes(bufdata, 8, spoonful);
if (blankflag) if (blankflag)
...@@ -489,6 +592,7 @@ void read_body(tabstruct *tab, PIXTYPE *ptr, size_t size) ...@@ -489,6 +592,7 @@ void read_body(tabstruct *tab, PIXTYPE *ptr, size_t size)
break; break;
#endif #endif
case BP_FLOAT: case BP_FLOAT:
if (!tab->isTileCompressed)
if (bswapflag) if (bswapflag)
swapbytes(bufdata, 4, spoonful); swapbytes(bufdata, 4, spoonful);
#pragma ivdep #pragma ivdep
...@@ -499,6 +603,7 @@ void read_body(tabstruct *tab, PIXTYPE *ptr, size_t size) ...@@ -499,6 +603,7 @@ void read_body(tabstruct *tab, PIXTYPE *ptr, size_t size)
case BP_DOUBLE: case BP_DOUBLE:
if (bswapflag) if (bswapflag)
{ {
if (!tab->isTileCompressed)
swapbytes(bufdata, 8, spoonful); swapbytes(bufdata, 8, spoonful);
#pragma ivdep #pragma ivdep
for (i=spoonful; i--; bufdata += sizeof(double)) for (i=spoonful; i--; bufdata += sizeof(double))
...@@ -660,7 +765,8 @@ void read_ibody(tabstruct *tab, FLAGTYPE *ptr, size_t size) ...@@ -660,7 +765,8 @@ void read_ibody(tabstruct *tab, FLAGTYPE *ptr, size_t size)
if (spoonful>size) if (spoonful>size)
spoonful = size; spoonful = size;
bufdata = (char *)bufdata0; bufdata = (char *)bufdata0;
QFREAD(bufdata, spoonful*tab->bytepix, cat->file, cat->filename); readSpoonful(tab, spoonful, bufdata0, bufdata);
switch(tab->bitpix) switch(tab->bitpix)
{ {
case BP_BYTE: case BP_BYTE:
...@@ -670,6 +776,7 @@ void read_ibody(tabstruct *tab, FLAGTYPE *ptr, size_t size) ...@@ -670,6 +776,7 @@ void read_ibody(tabstruct *tab, FLAGTYPE *ptr, size_t size)
break; break;
case BP_SHORT: case BP_SHORT:
if (!tab->isTileCompressed)
if (bswapflag) if (bswapflag)
swapbytes(bufdata, 2, spoonful); swapbytes(bufdata, 2, spoonful);
#pragma ivdep #pragma ivdep
...@@ -678,6 +785,7 @@ void read_ibody(tabstruct *tab, FLAGTYPE *ptr, size_t size) ...@@ -678,6 +785,7 @@ void read_ibody(tabstruct *tab, FLAGTYPE *ptr, size_t size)
break; break;
case BP_LONG: case BP_LONG:
if (!tab->isTileCompressed)
if (bswapflag) if (bswapflag)
swapbytes(bufdata, 4, spoonful); swapbytes(bufdata, 4, spoonful);
#pragma ivdep #pragma ivdep
...@@ -687,6 +795,7 @@ void read_ibody(tabstruct *tab, FLAGTYPE *ptr, size_t size) ...@@ -687,6 +795,7 @@ void read_ibody(tabstruct *tab, FLAGTYPE *ptr, size_t size)
#ifdef HAVE_LONG_LONG_INT #ifdef HAVE_LONG_LONG_INT
case BP_LONGLONG: case BP_LONGLONG:
if (!tab->isTileCompressed)
if (bswapflag) if (bswapflag)
swapbytes(bufdata, 8, spoonful); swapbytes(bufdata, 8, spoonful);
#pragma ivdep #pragma ivdep
...@@ -931,6 +1040,10 @@ void write_body(tabstruct *tab, PIXTYPE *ptr, size_t size) ...@@ -931,6 +1040,10 @@ void write_body(tabstruct *tab, PIXTYPE *ptr, size_t size)
#pragma ivdep #pragma ivdep
for (i=spoonful; i--;) for (i=spoonful; i--;)
*(bufdata++) = (*(ptr++)-bz)/bs; *(bufdata++) = (*(ptr++)-bz)/bs;
// TODO not yet writing CFitsIO from SExtractor. CFITSIO - only perform byte-swap if we are NOT writing a tile-compressed format using cfitsio
// if (tab->infptr == NULL) // TODO
if (bswapflag) if (bswapflag)
swapbytes(cbufdata0, 4, spoonful); swapbytes(cbufdata0, 4, spoonful);
} }
...@@ -952,7 +1065,8 @@ void write_body(tabstruct *tab, PIXTYPE *ptr, size_t size) ...@@ -952,7 +1065,8 @@ void write_body(tabstruct *tab, PIXTYPE *ptr, size_t size)
"read_body()"); "read_body()");
break; break;
} }
QFWRITE(cbufdata0, spoonful*tab->bytepix, cat->file, cat->filename);
writeSpoonful(tab, spoonful, cbufdata0);
} }
break; break;
......
...@@ -167,6 +167,64 @@ int close_cat(catstruct *cat) ...@@ -167,6 +167,64 @@ int close_cat(catstruct *cat)
return RETURN_OK; return RETURN_OK;
} }
int open_cfitsio(catstruct *cat)
{
#ifdef HAVE_CFITSIO
fitsfile *infptr;
int status;
status = 0;
fits_open_file(&infptr, cat->filename, READONLY, &status);
if (status != 0) {
fits_report_error(stderr, status);
printf("ERROR could not open FITS file with cfitsio: %s\n", cat->filename);
}
cat->tab->infptr = infptr;
return status;
#else
return 1;
#endif
}
int close_cfitsio(catstruct *cat)
{
#ifdef HAVE_CFITSIO
int status = 0;
if (cat->tab->infptr) {
; 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 {
cat->tab->infptr == NULL;
}
}
return status;
#else
return 1;
#endif
}
void hdu_seek(tabstruct *tab) {
#ifdef HAVE_CFITSIO
if(!tab->infptr) {
tab->infptr = tab->prevtab->infptr;
}
int status = 0;
int hdutype;
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, tab->cat->filename);
if (tab->tabsize)
// IMPORTANT: moving to start of next header using fseek and cfitsio position rather than table size, as done previously
fseek(tab->cat->file, tab->infptr->Fptr->headstart[tab->hdunum], SEEK_SET);
#else
if (tab->tabsize)
QFSEEK(tab->cat->file, PADTOTAL(tab->tabsize), SEEK_CUR, tab->cat->filename);
#endif
}
/****** free_cat *************************************************************** /****** free_cat ***************************************************************
PROTO void free_cat(catstruct **cat, int ncat) PROTO void free_cat(catstruct **cat, int ncat)
...@@ -324,23 +382,24 @@ int map_cat(catstruct *cat) ...@@ -324,23 +382,24 @@ int map_cat(catstruct *cat)
prevtab = NULL; prevtab = NULL;
QCALLOC(tab, tabstruct, 1); QCALLOC(tab, tabstruct, 1);
tab->cat = cat; tab->cat = cat;
cat->tab = tab;
QFTELL(cat->file, tab->headpos, cat->filename); QFTELL(cat->file, tab->headpos, cat->filename);
open_cfitsio(cat);
for (ntab=0; !get_head(tab); ntab++) for (ntab=0; !get_head(tab); ntab++)
{ {
readbasic_head(tab); readbasic_head(tab);
readbintabparam_head(tab); readbintabparam_head(tab);
QFTELL(cat->file, tab->bodypos, cat->filename); QFTELL(cat->file, tab->bodypos, cat->filename);
tab->nseg = tab->seg = 1; tab->nseg = tab->seg = 1;
if (tab->tabsize) tab->hdunum = ntab + 1;
QFSEEK(cat->file, PADTOTAL(tab->tabsize), SEEK_CUR, cat->filename);
if (prevtab) if (prevtab)
{ {
tab->prevtab = prevtab; tab->prevtab = prevtab;
prevtab->nexttab = tab; prevtab->nexttab = tab;
} }
else
cat->tab = tab;
prevtab = tab; prevtab = tab;
hdu_seek(tab);
QCALLOC(tab, tabstruct, 1); QCALLOC(tab, tabstruct, 1);
tab->cat = cat; tab->cat = cat;
QFTELL(cat->file, tab->headpos, cat->filename); QFTELL(cat->file, tab->headpos, cat->filename);
......
...@@ -36,6 +36,10 @@ ...@@ -36,6 +36,10 @@
#include <sys/types.h> #include <sys/types.h>
#endif #endif
#ifdef HAVE_CFITSIO
#include FITSIO_H
#endif
#define MAXCHARS 256 /* max. number of characters */ #define MAXCHARS 256 /* max. number of characters */
#define WARNING_NMAX 1000 /* max. number of recorded warnings */ #define WARNING_NMAX 1000 /* max. number of recorded warnings */
...@@ -107,10 +111,11 @@ typedef long long SLONGLONG; ...@@ -107,10 +111,11 @@ typedef long long SLONGLONG;
typedef union {int l[2];} SLONGLONG; typedef union {int l[2];} SLONGLONG;
#endif #endif
#if defined(_FILE_OFFSET_BITS) && !defined(OFF_T) // CFITSIO changed OFF_T to OFF_T2 due to clash with cfitsio lib
#define OFF_T off_t #if defined(_FILE_OFFSET_BITS) && !defined(OFF_T2)
#define OFF_T2 off_t
#else #else
#define OFF_T long #define OFF_T2 long
#endif #endif
/*------------------------------- constants ---------------------------------*/ /*------------------------------- constants ---------------------------------*/
...@@ -180,8 +185,8 @@ typedef struct structtab ...@@ -180,8 +185,8 @@ typedef struct structtab
char *headbuf; /* buffer containing the header */ char *headbuf; /* buffer containing the header */
int headnblock; /* number of FITS blocks */ int headnblock; /* number of FITS blocks */
char *bodybuf; /* buffer containing the body */ char *bodybuf; /* buffer containing the body */
OFF_T bodypos; /* position of the body in the file */ OFF_T2 bodypos; /* position of the body in the file */
OFF_T headpos; /* position of the head in the file */ OFF_T2 headpos; /* position of the head in the file */
struct structcat *cat; /* (original) parent catalog */ struct structcat *cat; /* (original) parent catalog */
struct structtab *prevtab, *nexttab; /* previous and next tab in chain */ struct structtab *prevtab, *nexttab; /* previous and next tab in chain */
int seg; /* segment position */ int seg; /* segment position */
...@@ -191,6 +196,14 @@ typedef struct structtab ...@@ -191,6 +196,14 @@ typedef struct structtab
int swapflag; /* mapped to a swap file ? */ int swapflag; /* mapped to a swap file ? */
char swapname[MAXCHARS]; /* name of the swapfile */ char swapname[MAXCHARS]; /* name of the swapfile */
unsigned int bodysum; /* Checksum of the FITS body */ unsigned int bodysum; /* Checksum of the FITS body */
#ifdef HAVE_CFITSIO
fitsfile *infptr; /* a cfitsio pointer to the file */
#endif
int hdunum; /* FITS HDU number for this 'table' */
int isTileCompressed; /* is this a tile compressed image? */
long currentElement; /* tracks the current image pixel */
} tabstruct; } tabstruct;
...@@ -271,6 +284,7 @@ extern int about_cat(catstruct *cat, FILE *stream), ...@@ -271,6 +284,7 @@ extern int about_cat(catstruct *cat, FILE *stream),
add_tab(tabstruct *tab, catstruct *cat, int pos), add_tab(tabstruct *tab, catstruct *cat, int pos),
blank_keys(tabstruct *tab), blank_keys(tabstruct *tab),
close_cat(catstruct *cat), close_cat(catstruct *cat),
close_cfitsio(catstruct *cat),
copy_key(tabstruct *tabin, char *keyname, tabstruct *tabout, copy_key(tabstruct *tabin, char *keyname, tabstruct *tabout,
int pos), int pos),
copy_tab(catstruct *catin, char *tabname, int seg, copy_tab(catstruct *catin, char *tabname, int seg,
......
...@@ -114,15 +114,37 @@ void readbasic_head(tabstruct *tab) ...@@ -114,15 +114,37 @@ void readbasic_head(tabstruct *tab)
filename = (tab->cat? tab->cat->filename : strcpy(name, "internal header")); filename = (tab->cat? tab->cat->filename : strcpy(name, "internal header"));
if (fitsread(tab->headbuf, "BITPIX ", &tab->bitpix, H_INT, T_LONG) // CFITSIO
char NAXIS_KEYWORD[14];
char BITPIX_KEYWORD[14];
if (fitsread(tab->headbuf, "ZIMAGE ", str, H_STRING, T_STRING) == RETURN_OK) {
tab->isTileCompressed = 1;
#ifndef HAVE_CFITSIO
error(EXIT_FAILURE, "*Error*: No CFITSIO support but detected tile compression in ", filename);
#endif
strcpy(NAXIS_KEYWORD, "ZNAXIS ");
strcpy(BITPIX_KEYWORD, "ZBITPIX ");
}
else {
tab->isTileCompressed = 0;
strcpy(NAXIS_KEYWORD, "NAXIS ");
strcpy(BITPIX_KEYWORD, "BITPIX ");
}
if (fitsread(tab->headbuf, BITPIX_KEYWORD, &tab->bitpix, H_INT, T_LONG)
==RETURN_ERROR) ==RETURN_ERROR)
error(EXIT_FAILURE, "*Error*: Corrupted FITS header in ", filename); error(EXIT_FAILURE, "*Error*: Corrupted FITS header in ", filename);
tab->bytepix = tab->bitpix>0?(tab->bitpix/8):(-tab->bitpix/8); tab->bytepix = tab->bitpix>0?(tab->bitpix/8):(-tab->bitpix/8);
if (fitsread(tab->headbuf, "NAXIS ", &tab->naxis, H_INT, T_LONG) if (fitsread(tab->headbuf, NAXIS_KEYWORD, &tab->naxis, H_INT, T_LONG)
==RETURN_ERROR) ==RETURN_ERROR) {
error(EXIT_FAILURE, "*Error*: Corrupted FITS header in ", filename); error(EXIT_FAILURE, "*Error*: Corrupted FITS header in ", filename);
}
tabsize = 0; tabsize = 0;
if (tab->naxis>0) if (tab->naxis>0)
...@@ -133,7 +155,11 @@ void readbasic_head(tabstruct *tab) ...@@ -133,7 +155,11 @@ void readbasic_head(tabstruct *tab)
tabsize = 1; tabsize = 1;
for (i=0; i<tab->naxis && i<999; i++) for (i=0; i<tab->naxis && i<999; i++)
{ {
sprintf(key,"NAXIS%-3d", i+1); // CFITSIO
if (tab->isTileCompressed)
sprintf(key,"ZNAXIS%-2d", (i+1));
else
sprintf(key,"NAXIS%-3d", (i+1));
if (fitsread(tab->headbuf, key, &tab->naxisn[i], H_INT, T_LONG) if (fitsread(tab->headbuf, key, &tab->naxisn[i], H_INT, T_LONG)
==RETURN_ERROR) ==RETURN_ERROR)
error(EXIT_FAILURE, "*Error*: incoherent FITS header in ", filename); error(EXIT_FAILURE, "*Error*: incoherent FITS header in ", filename);
...@@ -144,6 +170,10 @@ void readbasic_head(tabstruct *tab) ...@@ -144,6 +170,10 @@ void readbasic_head(tabstruct *tab)
/*random groups parameters (optional)*/ /*random groups parameters (optional)*/
tab->pcount = 0; tab->pcount = 0;
fitsread(tab->headbuf, "PCOUNT ", &tab->pcount, H_INT, T_LONG); fitsread(tab->headbuf, "PCOUNT ", &tab->pcount, H_INT, T_LONG);
// CFITSIO TODO HACK
if (tab->isTileCompressed) tab->pcount = 0;
tab->gcount = 1; tab->gcount = 1;
fitsread(tab->headbuf, "GCOUNT ", &tab->gcount, H_INT, T_LONG); fitsread(tab->headbuf, "GCOUNT ", &tab->gcount, H_INT, T_LONG);
...@@ -284,7 +314,9 @@ int readbintabparam_head(tabstruct *tab) ...@@ -284,7 +314,9 @@ int readbintabparam_head(tabstruct *tab)
key->htype = H_STRING; key->htype = H_STRING;
break; break;
default: default:
error(EXIT_FAILURE, "*Error*: Unknown TFORM in ", cat->filename); // CFITSIO TODO dodgy
key->ttype = T_FLOAT;
//error(EXIT_FAILURE, "*Error*: Unknown TFORM in ", cat->filename);
} }
/*--handle the special case of multimensional arrays*/ /*--handle the special case of multimensional arrays*/
......
...@@ -365,7 +365,7 @@ void end_writeobj(catstruct *cat, tabstruct *tab, char *buf) ...@@ -365,7 +365,7 @@ void end_writeobj(catstruct *cat, tabstruct *tab, char *buf)
{ {
keystruct *key; keystruct *key;
OFF_T pos; OFF_T2 pos;
int k; int k;
/* Make the table parameters reflect its content*/ /* Make the table parameters reflect its content*/
......
...@@ -282,6 +282,7 @@ void makeit() ...@@ -282,6 +282,7 @@ void makeit()
if ((imatab->naxis < 2) if ((imatab->naxis < 2)
|| !strncmp(imatab->xtension, "BINTABLE", 8) || !strncmp(imatab->xtension, "BINTABLE", 8)
|| !strncmp(imatab->xtension, "ASCTABLE", 8)) || !strncmp(imatab->xtension, "ASCTABLE", 8))
if (!imatab->isTileCompressed)
continue; continue;
next++; next++;
} }
...@@ -321,6 +322,7 @@ void makeit() ...@@ -321,6 +322,7 @@ void makeit()
if (!forcextflag && ((imatab->naxis < 2) if (!forcextflag && ((imatab->naxis < 2)
|| !strncmp(imatab->xtension, "BINTABLE", 8) || !strncmp(imatab->xtension, "BINTABLE", 8)
|| !strncmp(imatab->xtension, "ASCTABLE", 8))) || !strncmp(imatab->xtension, "ASCTABLE", 8)))
if (!imatab->isTileCompressed)
continue; continue;
nok++; nok++;
...@@ -720,6 +722,10 @@ static int selectext(char *filename) ...@@ -720,6 +722,10 @@ static int selectext(char *filename)
if ((bracr=strrchr(bracl+1, ']'))) if ((bracr=strrchr(bracl+1, ']')))
*bracr = '\0'; *bracr = '\0';
next = strtol(bracl+1, NULL, 0); next = strtol(bracl+1, NULL, 0);
// VERY BAD HACK to check if this is tile-compressed, if so, add +1 to extension number requested
if (strstr(filename, ".fits.fz") != NULL) next = next + 1;
return next; return next;
} }
......
...@@ -93,7 +93,12 @@ void *loadstrip(picstruct *field, picstruct *wfield) ...@@ -93,7 +93,12 @@ void *loadstrip(picstruct *field, picstruct *wfield)
else if (flags & INTERP_FIELD) else if (flags & INTERP_FIELD)
copydata(field, 0, nbpix); copydata(field, 0, nbpix);
else else
{
tab->currentElement = 1;
read_body(tab, data, nbpix); read_body(tab, data, nbpix);
//printf("read 1: data[0] = %f %f %f %f %f %f\n", data[0], data[1], data[222], data[777], data[field->width-1], data[nbpix-1]);
}
if (flags & (WEIGHT_FIELD|RMS_FIELD|BACKRMS_FIELD|VAR_FIELD)) if (flags & (WEIGHT_FIELD|RMS_FIELD|BACKRMS_FIELD|VAR_FIELD))
weight_to_var(field, data, nbpix); weight_to_var(field, data, nbpix);
if ((flags & MEASURE_FIELD) && (check=prefs.check[CHECK_IDENTICAL])) if ((flags & MEASURE_FIELD) && (check=prefs.check[CHECK_IDENTICAL]))
...@@ -198,8 +203,12 @@ void *loadstrip(picstruct *field, picstruct *wfield) ...@@ -198,8 +203,12 @@ void *loadstrip(picstruct *field, picstruct *wfield)
backrmsline(field, field->ymax, data); backrmsline(field, field->ymax, data);
else if (flags & INTERP_FIELD) else if (flags & INTERP_FIELD)
copydata(field, field->stripylim*w, w); copydata(field, field->stripylim*w, w);
else else {
read_body(tab, data, w); read_body(tab, data, w);
//printf("read 2: data[0] = %f %f %f %f %f %f\n", data[0], data[1], data[222], data[777], data[field->width-1], data[w-1]);
}
if (flags & (WEIGHT_FIELD|RMS_FIELD|BACKRMS_FIELD|VAR_FIELD)) if (flags & (WEIGHT_FIELD|RMS_FIELD|BACKRMS_FIELD|VAR_FIELD))
weight_to_var(field, data, w); weight_to_var(field, data, w);
......
...@@ -621,7 +621,7 @@ typedef struct pic ...@@ -621,7 +621,7 @@ typedef struct pic
int interp_xtimeout; /* interpolation timeout value in x */ int interp_xtimeout; /* interpolation timeout value in x */
int interp_ytimeout; /* interpolation timeout value in y */ int interp_ytimeout; /* interpolation timeout value in y */
struct pic *reffield; /* pointer to a reference field */ struct pic *reffield; /* pointer to a reference field */
OFF_T mefpos; /* Position in a MEF file */ OFF_T2 mefpos; /* Position in a MEF file */
} picstruct; } picstruct;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment