FACT++  1.0
fits::Table::Table ( const std::vector< std::string > &  vec,
off_t  off 
)
inline

Definition at line 241 of file fits.h.

References ___err___, gLog, i, id, size, str, and type.

241  : offset(off),
242  keys(ParseBlock(vec))
243  {
244  is_compressed = HasKey("ZTABLE") && Check("ZTABLE", 'B', "T");
245 
246  if (!Check("XTENSION", 'T', "BINTABLE") ||
247  !Check("NAXIS", 'I', "2") ||
248  !Check("BITPIX", 'I', "8") ||
249  !Check("GCOUNT", 'I', "1") ||
250  !Check("EXTNAME", 'T') ||
251  !Check("NAXIS1", 'I') ||
252  !Check("NAXIS2", 'I') ||
253  !Check("TFIELDS", 'I'))
254  return;
255 
256  if (is_compressed)
257  {
258  if (!Check("ZNAXIS1", 'I') ||
259  !Check("ZNAXIS2", 'I') ||
260  !Check("ZPCOUNT", 'I', "0"))
261  return;
262  }
263  else
264  {
265  if (!Check("PCOUNT", 'I', "0"))
266  return;
267  }
268 
269  total_bytes = Get<size_t>("NAXIS1")*Get<size_t>("NAXIS2");
270  bytes_per_row = is_compressed ? Get<size_t>("ZNAXIS1") : Get<size_t>("NAXIS1");
271  num_rows = is_compressed ? Get<size_t>("ZNAXIS2") : Get<size_t>("NAXIS2");
272  num_cols = Get<size_t>("TFIELDS");
273  datasum = Get<int64_t>("DATASUM", -1);
274  size_t bytes = 0;
275 
276  const std::string tFormName = is_compressed ? "ZFORM" : "TFORM";
277  for (long long unsigned int i=1; i<=num_cols; i++)
278  {
279  const std::string num(std::to_string(i));
280 
281  if (!Check("TTYPE"+num, 'T') ||
282  !Check(tFormName+num, 'T'))
283  return;
284 
285  const std::string id = Get<std::string>("TTYPE"+num);
286  const std::string fmt = Get<std::string>(tFormName+num);
287  const std::string unit = Get<std::string>("TUNIT"+num, "");
288  const std::string comp = Get<std::string>("ZCTYP"+num, "");
289 
290  Compression_t compress = kCompUnknown;
291  if (comp == "FACT")
292  compress = kCompFACT;
293 
294  std::istringstream sin(fmt);
295  int n = 0;
296  sin >> n;
297  if (!sin)
298  n = 1;
299 
300  const char type = fmt[fmt.length()-1];
301 
302  size_t size = 0;
303  switch (type)
304  {
305  // We could use negative values to mark floats
306  // otheriwse we could just cast them to int64_t?
307  case 'L': // logical
308  case 'A': // char
309  case 'B': size = 1; break; // byte
310  case 'I': size = 2; break; // short
311  case 'J': size = 4; break; // int
312  case 'K': size = 8; break; // long long
313  case 'E': size = 4; break; // float
314  case 'D': size = 8; break; // double
315  // case 'X': size = n; break; // bits (n=number of bytes needed to contain all bits)
316  // case 'C': size = 8; break; // complex float
317  // case 'M': size = 16; break; // complex double
318  // case 'P': size = 8; break; // array descriptor (32bit)
319  // case 'Q': size = 16; break; // array descriptor (64bit)
320  default:
321  {
322  std::ostringstream str;
323  str << "FITS format TFORM='" << fmt << "' not yet supported.";
324 #ifdef __EXCEPTIONS
325  throw std::runtime_error(str.str());
326 #else
327  gLog << ___err___ << "ERROR - " << str.str() << std::endl;
328  return;
329 #endif
330  }
331  }
332 
333  const Table::Column col = { bytes, size_t(n), size, n*size, type, unit, compress};
334 
335  cols[id] = col;
336  sorted_cols.emplace_back(col);
337  bytes += n*size;
338  }
339 
340  if (bytes!=bytes_per_row)
341  {
342  std::ostringstream str;
343  str << "Sum of bytes in columns [" << bytes << "] does not match (Z)NAXIS2 [" << bytes_per_row << "].";
344 
345 #ifdef __EXCEPTIONS
346  throw std::runtime_error(str.str());
347 #else
348  gLog << ___err___ << "ERROR - " << str.str() << std::endl;
349  return;
350 #endif
351  }
352 
353  name = Get<std::string>("EXTNAME");
354  }
size_t bytes_per_row
Definition: fits.h:96
bool is_compressed
Definition: fits.h:93
std::string name
Definition: fits.h:95
int i
Definition: db_dim_client.c:21
char str[80]
Definition: test_client.c:7
size_t num_cols
Definition: fits.h:98
char id[4]
Definition: FITS.h:71
int64_t datasum
Definition: fits.h:120
bool Check(const std::string &key, char type, const std::string &value="") const
Definition: fits.h:135
SortedColumns sorted_cols
Definition: fits.h:117
#define gLog
Definition: fits.h:36
size_t total_bytes
Definition: fits.h:99
#define ___err___
Definition: fits.h:37
Compression_t
Definition: fits.h:59
Columns cols
Definition: fits.h:116
size_t num_rows
Definition: fits.h:97
int type
Keys keys
Definition: fits.h:118
int size
Definition: db_dim_server.c:17
off_t offset
Definition: fits.h:91
Keys ParseBlock(const std::vector< std::string > &vec) const
Definition: fits.h:177
bool HasKey(const std::string &key) const
Definition: fits.h:397