IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jun 12, 2015, 6:18:23 PM (11 years ago)
Author:
eugene
Message:

merge changes from EAM dev branch ohana.20150429

Location:
trunk/Ohana
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana

  • trunk/Ohana/src/opihi/lib.shell/VectorIO.c

    r37049 r38441  
    11# include "opihi.h"
    22 
    3 // write a set of vectors to a FITS file (vectors names become fits column names)
    4 int WriteVectorTable (Header *theader, FTable *ftable, char *extname, Vector **vec, int Nvec, char *format) {
     3// write a set of vectors to a FITS FTable structure (vectors names become fits column names)
     4static int WriteVectorTable (FTable *ftable, char *extname, Vector **vec, int Nvec, char *format, char nativeOrder) {
    55 
    66  int j;
     
    88  char *tformat = NULL;
    99
     10  Header *theader = ftable->header;
    1011  gfits_create_table_header (theader, "BINTABLE", extname);
    1112
     
    5859  for (j = 0; j < Nvec; j++) {
    5960    if (vec[j][0].type == OPIHI_FLT) {
    60       gfits_set_bintable_column_reformat (theader, ftable, vec[j][0].name, "double", vec[j][0].elements.Flt, vec[j][0].Nelements);
     61      gfits_set_bintable_column_reformat (theader, ftable, vec[j][0].name, "double", vec[j][0].elements.Flt, vec[j][0].Nelements, nativeOrder);
    6162    } else {
    62       gfits_set_bintable_column_reformat (theader, ftable, vec[j][0].name, "int", vec[j][0].elements.Int, vec[j][0].Nelements);
     63      gfits_set_bintable_column_reformat (theader, ftable, vec[j][0].name, "int", vec[j][0].elements.Int, vec[j][0].Nelements, nativeOrder);
    6364    }
    6465  }
     
    7071}
    7172 
     73# define VERBOSE 0
     74int dump_raw_table (FTable *table, char *message) {
     75# if (VERBOSE)
     76  int i;
     77  fprintf (stderr, "%s data: ", message);
     78  for (i = 0; i < table->header->Naxis[0]*table->header->Naxis[1]; i++) {
     79    fprintf (stderr, "0x%02hhx ", table->buffer[i]);
     80  }
     81  fprintf (stderr, "\n");
     82# endif
     83  return TRUE;
     84}
     85
     86int dump_cmp_table (FTable *table, char *message) {
     87# if (VERBOSE)
     88  int i;
     89  fprintf (stderr, "%s pntr: ", message);
     90  for (i = 0; i < table->header->Naxis[0]*table->header->Naxis[1]; i++) {
     91    fprintf (stderr, "0x%02hhx ", table->buffer[i]);
     92  }
     93  fprintf (stderr, "\n");
     94
     95  fprintf (stderr, "%s data: ", message);
     96  for (i = 0; i < table->header->pcount; i++) {
     97    fprintf (stderr, "0x%02hhx ", table->buffer[table->heap_start + i]);
     98  }
     99  fprintf (stderr, "\n");
     100# endif
     101  return TRUE;
     102}
     103
    72104// write a set of vectors to a FITS file (vectors names become fits column names)
    73 int WriteVectorTableFITS (char *filename, char *extname, Vector **vec, int Nvec, int append, char *format) {
    74  
    75   Header header;
    76   Matrix matrix;
    77   Header theader;
    78   FTable ftable;
     105int WriteVectorTableFITS (char *filename, char *extname, Vector **vec, int Nvec, int append, char *compress, char *format) {
     106 
     107  Header rawheader;
     108  Header cmpheader;
     109  FTable rawtable;
     110  FTable cmptable;
    79111
    80112  FILE *f = NULL;
     
    91123  }
    92124
    93   if (!WriteVectorTable (&theader, &ftable, extname, vec, Nvec, format)) goto escape;
     125  // init so free below does not fail if table is not created
     126  gfits_init_header (&rawheader);
     127  gfits_init_header (&cmpheader);
     128  gfits_init_table (&rawtable);
     129  gfits_init_table (&cmptable);
     130
     131  rawtable.header = &rawheader;
     132  if (!WriteVectorTable (&rawtable, extname, vec, Nvec, format, (compress != NULL))) goto escape;
     133  // NOTE : for compression, the table is constructed in native by order
     134
     135  FTable *outtable = &rawtable;
     136  Header *outheader = &rawheader;
     137
     138  if (compress) {
     139    cmptable.header = &cmpheader;
     140
     141    dump_raw_table (&rawtable, "wd raw");
     142    if (!gfits_compress_table (&rawtable, &cmptable, 0, compress)) goto escape;
     143
     144    int i, Nfields;
     145    if (!gfits_scan (&cmpheader, "TFIELDS", "%d", 1, &Nfields)) goto escape;
     146    for (i = 0; i < Nfields; i++) {
     147      gfits_byteswap_varlength_column (&cmptable, i+1);
     148    }
     149    dump_cmp_table (&cmptable, "wd cmp");
     150
     151    outtable = &cmptable;
     152    outheader = &cmpheader;
     153  }
    94154
    95155  if (!append) {
     156    Header header;
     157    Matrix matrix;
    96158    gfits_init_header (&header);
     159    gfits_init_matrix (&matrix);
    97160    header.extend = TRUE;
    98161    gfits_create_header (&header);
     
    103166    gfits_free_matrix (&matrix);
    104167  }
    105   gfits_fwrite_Theader (f, &theader);
    106   gfits_fwrite_table  (f, &ftable);
    107 
    108   gfits_free_header (&theader);
    109   gfits_free_table (&ftable);
     168
     169  // write the actual table data
     170  gfits_fwrite_Theader (f, outheader);
     171  gfits_fwrite_table  (f, outtable);
     172
     173  gfits_free_header (&rawheader);
     174  gfits_free_table (&rawtable);
     175
     176  if (compress) {
     177    gfits_free_header (&cmpheader);
     178    gfits_free_table (&cmptable);
     179  }
    110180
    111181  fclose (f);
     
    114184
    115185 escape:
    116   if (!append) {
    117     gfits_free_header (&header);
    118     gfits_free_matrix (&matrix);
    119   }
    120   gfits_free_header (&theader);
    121   gfits_free_table (&ftable);
     186  gfits_free_header (&rawheader);
     187  gfits_free_table (&rawtable);
     188
     189  if (compress) {
     190    gfits_free_header (&cmpheader);
     191    gfits_free_table (&cmptable);
     192  }
    122193
    123194  fclose (f);
     
    249320  ASSIGN_DATA(short,   short,   Int);
    250321  ASSIGN_DATA(int,     int,     Int);
    251   ASSIGN_DATA(int64_t, int64_t, Int);
     322  ASSIGN_DATA(int64_t, int64_t, Flt); // int64_t has a problem: Int is too small, Flt is wrong precision
    252323  ASSIGN_DATA(float,   float,   Flt);
    253324  ASSIGN_DATA(double,  double,  Flt);
     
    274345  ASSIGN_DATA_TRANSPOSE(short,   short,   Int);
    275346  ASSIGN_DATA_TRANSPOSE(int,     int,     Int);
    276   ASSIGN_DATA_TRANSPOSE(int64_t, int64_t, Int);
     347  ASSIGN_DATA_TRANSPOSE(int64_t, int64_t, Flt);
    277348  ASSIGN_DATA_TRANSPOSE(float,   float,   Flt);
    278349  ASSIGN_DATA_TRANSPOSE(double,  double,  Flt);
Note: See TracChangeset for help on using the changeset viewer.