Changeset 38441 for trunk/Ohana/src/opihi/lib.shell/VectorIO.c
- Timestamp:
- Jun 12, 2015, 6:18:23 PM (11 years ago)
- Location:
- trunk/Ohana
- Files:
-
- 2 edited
-
. (modified) (1 prop)
-
src/opihi/lib.shell/VectorIO.c (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Ohana
-
Property svn:mergeinfo
set to
/branches/eam_branches/ohana.20150429 merged eligible
-
Property svn:mergeinfo
set to
-
trunk/Ohana/src/opihi/lib.shell/VectorIO.c
r37049 r38441 1 1 # include "opihi.h" 2 2 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) 4 static int WriteVectorTable (FTable *ftable, char *extname, Vector **vec, int Nvec, char *format, char nativeOrder) { 5 5 6 6 int j; … … 8 8 char *tformat = NULL; 9 9 10 Header *theader = ftable->header; 10 11 gfits_create_table_header (theader, "BINTABLE", extname); 11 12 … … 58 59 for (j = 0; j < Nvec; j++) { 59 60 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); 61 62 } 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); 63 64 } 64 65 } … … 70 71 } 71 72 73 # define VERBOSE 0 74 int 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 86 int 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 72 104 // 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;105 int 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; 79 111 80 112 FILE *f = NULL; … … 91 123 } 92 124 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 } 94 154 95 155 if (!append) { 156 Header header; 157 Matrix matrix; 96 158 gfits_init_header (&header); 159 gfits_init_matrix (&matrix); 97 160 header.extend = TRUE; 98 161 gfits_create_header (&header); … … 103 166 gfits_free_matrix (&matrix); 104 167 } 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 } 110 180 111 181 fclose (f); … … 114 184 115 185 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 } 122 193 123 194 fclose (f); … … 249 320 ASSIGN_DATA(short, short, Int); 250 321 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 252 323 ASSIGN_DATA(float, float, Flt); 253 324 ASSIGN_DATA(double, double, Flt); … … 274 345 ASSIGN_DATA_TRANSPOSE(short, short, Int); 275 346 ASSIGN_DATA_TRANSPOSE(int, int, Int); 276 ASSIGN_DATA_TRANSPOSE(int64_t, int64_t, Int);347 ASSIGN_DATA_TRANSPOSE(int64_t, int64_t, Flt); 277 348 ASSIGN_DATA_TRANSPOSE(float, float, Flt); 278 349 ASSIGN_DATA_TRANSPOSE(double, double, Flt);
Note:
See TracChangeset
for help on using the changeset viewer.
