/* field.c *%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% * * Part of: WeightWatcher * * Author: E.BERTIN (IAP, Leiden observatory & ESO) * * Contents: Handling of field structures. * * Last modify: 25/07/97 * *%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */ #include #include #include #include "define.h" #include "globals.h" #include "field.h" #include "fitscat.h" /********************************* newfield **********************************/ /* Returns a pointer to a new field, ready to go! */ picstruct *newfield(char *filename, int flags, picstruct *mfield) { picstruct *field; double dval; int ival; /* First allocate memory for the new field (and nullify pointers) */ QCALLOC(field, picstruct, 1); if (mfield) *field = *mfield; field->flags = flags; strcpy (field->filename, filename); /* A short, "relative" version of the filename */ if (!(field->rfilename=strrchr(field->filename, '/'))) field->rfilename = field->filename; if (mfield) { sprintf(gstr, "Opening %s", field->rfilename); NFPRINTF(OUTPUT, gstr); if (!(field->file = fopen(field->filename, "wb"))) error(EXIT_FAILURE, "*Error*: Cannot open for output ",field->filename); QMALLOC(field->fitshead, char, field->fitsheadsize); memcpy(field->fitshead, mfield->fitshead, field->fitsheadsize); /*-- Neutralize possible scaling factors */ dval = 1.0; fitswrite(field->fitshead, "BSCALE ",&dval,H_FLOAT,T_DOUBLE); dval = 0.0; fitswrite(field->fitshead, "BZERO ",&dval,H_FLOAT,T_DOUBLE); if (field->compress_type != COMPRESS_NONE) { field->compress_type = COMPRESS_NONE; fitswrite(field->fitshead, "IMAGECOD", "NONE", H_STRING, T_STRING); } fitswrite(field->fitshead, "ORIGIN ", BANNER, H_STRING, T_STRING); if (flags & FLAG_FIELD) { ival = 1; fitswrite(field->fitshead, "BITSGN ",&ival, H_INT, T_LONG); fitswrite(field->fitshead, "BITPIX ", &field->bitpix, H_INT, T_LONG); fitswrite(field->fitshead, "OBJECT ", "FLAG MAP", H_STRING,T_STRING); } else { ival = 1; fitswrite(field->fitshead, "BITSGN ",&ival, H_INT, T_LONG); fitswrite(field->fitshead, "OBJECT ", "WEIGHT MAP", H_STRING,T_STRING); field->bitpix = BP_FLOAT; } fitswrite(field->fitshead, "BITPIX ", &field->bitpix, H_INT, T_LONG); field->bytepix = (field->bitpix>0?field->bitpix:-field->bitpix)>>3; QFWRITE(field->fitshead,field->fitsheadsize,field->file,field->filename); } else { sprintf(gstr, "Looking for %s", field->rfilename); NFPRINTF(OUTPUT, gstr); /*-- Check the image exists and read important info (image size, etc...) */ readimagehead(field); if (prefs.verbose_type != QUIET) fprintf(OUTPUT, "Frame: \"%.20s\" / %d x %d / %d bits %s data\n", field->ident, field->width, field->height, field->bytepix*8, field->bitpix>0? (field->compress_type!=COMPRESS_NONE?"COMPRESSED":"INTEGER") :"FLOATING POINT"); /*-- Provide a buffer for compressed data */ if (field->compress_type != COMPRESS_NONE) QMALLOC(field->compress_buf, char, FBSIZE); } field->stripheight = prefs.mem_bufsize; if (field->stripheight>field->height) field->stripheight = field->height; if (!(field->strip=malloc(field->stripheight*field->width*4))) error(EXIT_FAILURE,"Not enough memory for the image buffer in ", field->rfilename); return field; } /********************************* endfield **********************************/ /* Free and close everything related to a field structure. */ void endfield(picstruct *field) { fclose(field->file); free(field->fitshead); free(field->strip); free(field->compress_buf); free(field); return; }