IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jul 1, 2021, 1:55:50 PM (5 years ago)
Author:
eugene
Message:

enable write to FITS image extensions in compressed and uncompressed modes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/opihi/cmd.data/wd.c

    r38441 r41674  
    11# include "data.h"
     2FILE *gfits_open_and_extend (char *filename);
    23
    34int wd (int argc, char **argv) {
     
    9899  // it updates NEXTEND and set EXTEND to TRUE, and modifies the PHU header (neither should happen)
    99100  // if those keywords do not exist...
    100   if (Extend) {
    101     Header Xhead;
    102     FILE *f;
    103     off_t nbytes;
    104     int status, Nextend;
    105 
    106     /* assume failure means non-existent file */
    107     if (!gfits_read_header (argv[2], &Xhead)) {
    108 
    109       gfits_init_header (&Xhead);
    110       Xhead.bitpix = 16;
    111       Xhead.extend = TRUE;
    112       gfits_create_header (&Xhead);
    113 
    114       gfits_modify (&Xhead, "NEXTEND", "%d", 1, 0);
    115       f = fopen (argv[2], "w");
    116       fclose (f);
    117     }
    118 
    119     gfits_modify_alt (&Xhead, "EXTEND", "%t", 1, TRUE);
    120 
    121     Nextend = 0;
    122     gfits_scan (&Xhead, "NEXTEND", "%d", 1, &Nextend);
    123     Nextend ++;
    124     gfits_modify (&Xhead, "NEXTEND", "%d", 1, Nextend);
    125 
    126     /* write the main header to the start of the file */
    127     f = fopen (argv[2], "r+");
    128     if (f == NULL) {
    129       gprint (GP_ERR, "failed to write file\n");
     101  if (Extend && !CompressMode) {
     102    int status = TRUE;
     103
     104    FILE *f = gfits_open_and_extend (argv[2]);
     105    if (!f) {
     106      gprint (GP_ERR, "failed to extend file %s\n", argv[2]);
    130107      status = FALSE;
    131108      goto done1;
    132109    }
    133    
    134     /* position to begining of file to write header */
    135     fseeko (f, 0LL, SEEK_SET);
    136     nbytes = fwrite (Xhead.buffer, 1, Xhead.datasize, f);
    137     if (nbytes != Xhead.datasize) {
    138       gprint (GP_ERR, "ERROR: failed writing data to image header\n");
    139       status = FALSE;
    140       goto done1;
    141     }
    142    
     110
    143111    /* fix up header */
    144112    {
     
    153121    /* position to end of file to write new extend */
    154122    fseeko (f, 0LL, SEEK_END);
    155     nbytes = fwrite (temp_header.buffer, 1, temp_header.datasize, f);
    156     fclose (f);
     123    off_t nbytes = fwrite (temp_header.buffer, 1, temp_header.datasize, f);
    157124    if (nbytes != temp_header.datasize) {
     125      fclose (f);
    158126      gprint (GP_ERR, "failed to write file\n");
    159127      status = FALSE;
    160128      goto done1;
    161129    }
     130
    162131    /* write the matrix buffer (automatically goes to end of file */
    163     if (!gfits_write_matrix (argv[2], &temp_matrix)) {
     132    if (!gfits_fwrite_matrix (f, &temp_matrix)) {
     133      fclose (f);
    164134      gprint (GP_ERR, "failed to write file\n");
    165135      status = FALSE;
    166136      goto done1;
    167137    }
     138    fclose (f);
    168139    status = TRUE;
     140
    169141  done1:
    170     gfits_free_header (&Xhead);
    171142    gfits_free_header (&temp_header);
    172143    gfits_free_matrix (&temp_matrix);
     
    180151    Matrix myMatrix;
    181152
    182     FILE *f = fopen (argv[2], "w");
    183     if (!f) {
    184       fprintf (stderr, "ERROR: cannot open image subset file for output %s\n", argv[2]);
    185       FREE (CompressMode);
    186       return FALSE;
    187     }
    188    
    189     gfits_init_header (&myHeader);
    190     myHeader.extend = TRUE;
    191     gfits_create_header (&myHeader);
    192     gfits_create_matrix (&myHeader, &myMatrix);
    193     gfits_fwrite_header  (f, &myHeader);
    194     gfits_fwrite_matrix  (f, &myMatrix);
    195     gfits_free_header (&myHeader);
    196     gfits_free_matrix (&myMatrix);
     153    FILE *f;
     154
     155    if (Extend) {
     156      // keeps an existing file
     157      f = gfits_open_and_extend (argv[2]);
     158      fseeko (f, 0LL, SEEK_END);
     159    } else {
     160      // replaces an existing file
     161      f = fopen (argv[2], "w");
     162      if (!f) {
     163        fprintf (stderr, "ERROR: cannot open image subset file for output %s\n", argv[2]);
     164        FREE (CompressMode);
     165        return FALSE;
     166      }
     167   
     168      gfits_init_header (&myHeader);
     169      myHeader.extend = TRUE;
     170      gfits_create_header (&myHeader);
     171      gfits_create_matrix (&myHeader, &myMatrix);
     172      gfits_fwrite_header  (f, &myHeader);
     173      gfits_fwrite_matrix  (f, &myMatrix);
     174      gfits_free_header (&myHeader);
     175      gfits_free_matrix (&myMatrix);
     176    }
    197177
    198178    FTable ftable;
     
    236216  return (TRUE);
    237217}
     218
     219// prepare the file to add an extension:
     220// read the PHU, update NEXTEND, write back header
     221// return the file pointer open and ready for write
     222FILE *gfits_open_and_extend (char *filename) {
     223
     224  Header Xhead;
     225  FILE *f = NULL;
     226  struct stat filestat;
     227
     228  // does the file already exist?
     229  int status = stat (filename, &filestat);
     230  if (status == 0) { /* file exists, are permissions OK? */
     231    f = fopen (filename, "r+");
     232    if (f == NULL) {
     233      gprint (GP_ERR, "failed to open file %s for write\n", filename);
     234      return NULL;
     235    }
     236
     237    status = gfits_fread_header (f, &Xhead);
     238    if (!status) {
     239      gprint (GP_ERR, "failed to read header for existing file %s\n", filename);
     240      return NULL;
     241    }
     242  } else {
     243    f = fopen (filename, "w");
     244    if (f == NULL) {
     245      gprint (GP_ERR, "failed to create file %s for write\n", filename);
     246      return NULL;
     247    }
     248
     249    // create an empty header
     250    gfits_init_header (&Xhead);
     251    Xhead.bitpix = 16;
     252    Xhead.extend = TRUE;
     253    gfits_create_header (&Xhead);
     254
     255    gfits_modify (&Xhead, "NEXTEND", "%d", 1, 0);
     256  }
     257
     258  gfits_modify_alt (&Xhead, "EXTEND", "%t", 1, TRUE);
     259
     260  int Nextend = 0;
     261  gfits_scan (&Xhead, "NEXTEND", "%d", 1, &Nextend);
     262  Nextend ++;
     263  gfits_modify (&Xhead, "NEXTEND", "%d", 1, Nextend);
     264
     265  /* position to begining of file to write header */
     266  fseeko (f, 0LL, SEEK_SET);
     267  off_t nbytes = fwrite (Xhead.buffer, 1, Xhead.datasize, f);
     268  if (nbytes != Xhead.datasize) {
     269    gfits_free_header (&Xhead);
     270    gprint (GP_ERR, "ERROR: failed writing data to image header\n");
     271    return NULL;
     272  }
     273  gfits_free_header (&Xhead);
     274   
     275  return (f);
     276}
     277
     278
     279///    /* fix up header */
     280///    {
     281///      static char simple[] = "XTENSION= 'IMAGE  '            / Image extension";
     282///      int Ns, No;
     283///      Ns = strlen (simple);
     284///      No = 80 - Ns;
     285///      strncpy (temp_header.buffer, simple, Ns);
     286///      memset (&temp_header.buffer[Ns], ' ', No);
     287///    }
     288///
     289///    /* position to end of file to write new extend */
     290///    fseeko (f, 0LL, SEEK_END);
     291///    nbytes = fwrite (temp_header.buffer, 1, temp_header.datasize, f);
     292///    fclose (f);
     293///    if (nbytes != temp_header.datasize) {
     294///      gprint (GP_ERR, "failed to write file\n");
     295///      status = FALSE;
     296///      goto done1;
     297///    }
     298///
     299///  }
Note: See TracChangeset for help on using the changeset viewer.