IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jan 11, 2015, 2:14:39 PM (12 years ago)
Author:
eugene
Message:

merge changes from eam branch ipp-20140904

Location:
trunk/Ohana
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana

  • trunk/Ohana/src/opihi/cmd.data/read_vectors.c

    r37049 r37807  
    55
    66void read_vectors_cleanup ();
     7int read_table_sizes (Header *header);
    78
    89int datafile (int argc, char **argv) {
     
    331332
    332333  off_t Nbytes;
    333   int i, j, N, Nextend, Ny, Binary, vecType, padIfShort;
    334   char type[16], ID[80], *CCDKeyword;
     334  int i, j, N, Ny, Binary, vecType;
     335  char type[16], ID[80];
    335336  FTable table;
    336337  Header header;
    337338  Vector **vec;
    338   int FITS_TRANSPOSE;
    339339
    340340  table.buffer = NULL;
    341341  header.buffer = NULL;
    342342
    343   FITS_TRANSPOSE = FALSE;
     343  int FITS_TRANSPOSE = FALSE;
    344344  if ((N = get_argument (argc, argv, "-transpose"))) {
    345345    remove_argument (N, &argc, argv);
     
    347347  }
    348348
    349   CCDKeyword = NULL;
     349  char *CCDKeyword = NULL;
    350350  if ((N = get_argument (argc, argv, "-keyword"))) {
    351351    remove_argument (N, &argc, argv);
     
    354354  }
    355355
    356   padIfShort = FALSE;
     356  int padIfShort = FALSE;
    357357  if ((N = get_argument (argc, argv, "-pad-if-short"))) {
    358358    remove_argument (N, &argc, argv);
     
    360360  }
    361361
    362   Nextend = -1;
     362  int getSizes = FALSE;
     363  if ((N = get_argument (argc, argv, "-sizes"))) {
     364    remove_argument (N, &argc, argv);
     365    getSizes = TRUE;
     366  }
     367
     368  int Nextend = -1;
    363369  if ((N = get_argument (argc, argv, "-extnum"))) {
    364370    remove_argument (N, &argc, argv);
    365371    Nextend = atoi (extname);
     372  }
     373
     374  int start = 0;
     375  int Nrows = -1; // -1 : read entire table
     376  if ((N = get_argument (argc, argv, "-range"))) {
     377    remove_argument (N, &argc, argv);
     378    start = atoi (argv[N]);
     379    remove_argument (N, &argc, argv);
     380    Nrows = atoi (argv[N]);
     381    remove_argument (N, &argc, argv);
     382  }
     383
     384  // if CharAsVectors, char fields will be saved as vectors NAME:0 -- NAME:n for n characters
     385  // else char fields will be saved as $NAME:0 - $NAME:m for m rows
     386  // if (Ny > 10000), force CharAsVectors
     387  int CharAsVectors = FALSE;
     388  if ((N = get_argument (argc, argv, "-char-vectors"))) {
     389    remove_argument (N, &argc, argv);
     390    CharAsVectors = TRUE;
    366391  }
    367392
     
    397422    }
    398423    if (!gfits_load_header (f, &header)) ESCAPE ("error reading header for extension %d\n", Nextend);
    399     if (!gfits_fread_ftable_data (f, &table, padIfShort)) ESCAPE ("error reading table for extension %d\n", Nextend);
    400 
     424
     425    if (getSizes) {
     426      read_table_sizes (&header);
     427      if (CCDKeyword != NULL) free (CCDKeyword);
     428      gfits_free_header (&header);
     429      return TRUE;
     430    }
     431
     432    if (Nrows == -1) {
     433      Nrows = header.Naxis[1] - start;
     434    }
     435    if (start < 0) ESCAPE ("invalid range: start < 0\n");
     436    if (start >= header.Naxis[1]) ESCAPE ("invalid range: start >= Ny (%d)\n", header.Naxis[1]);
     437    if (Nrows < 0) ESCAPE ("invalid range: Nrows < 0\n");
     438    if (start + Nrows > header.Naxis[1]) ESCAPE ("invalid range: start + Nrows > Ny (%d)\n", header.Naxis[1]);
     439
     440    // Ny = 100, start = 0, Nrows = -1 -> Nrows => 100
     441    // Ny = 100, start = 10, Nrows = 90
     442
     443    if (!gfits_fread_ftable_range (f, padIfShort, &table, start, Nrows)) ESCAPE ("error reading table for extension %d\n", Nextend);
    401444  } else {
    402445    if (CCDKeyword == NULL) {
     
    428471        continue;
    429472      }
    430       if (!gfits_fread_ftable_data (f, &table, padIfShort)) ESCAPE ("error reading table for extension\n");
     473
     474      if (Nrows == -1) {
     475        Nrows = header.Naxis[1] - start;
     476      }
     477      if (start < 0) ESCAPE ("invalid range: start < 0\n");
     478      if (start >= header.Naxis[1]) ESCAPE ("invalid range: start >= Ny (%d)\n", header.Naxis[1]);
     479      if (Nrows < 0) ESCAPE ("invalid range: Nrows < 0\n");
     480      if (start + Nrows > header.Naxis[1]) ESCAPE ("invalid range: start + Nrows > Ny (%d)\n", header.Naxis[1]);
     481
     482      if (!gfits_fread_ftable_range (f, padIfShort, &table, start, Nrows)) ESCAPE ("error reading table for extension %d\n", Nextend);
     483
     484      // if (!gfits_fread_ftable_data (f, &table, padIfShort)) ESCAPE ("error reading table for extension\n");
     485
    431486      break;
    432487    }
     
    465520    if (!FITS_TRANSPOSE) {
    466521      // read string column into a list rather than a vector
    467       if (!strcmp (type, "char")) {
     522      if (!strcmp (type, "char") && !CharAsVectors && (Ny < 3000)) {
    468523        char *fieldName = argv[i];
    469524        char *Ptr = data;
     
    537592  if (vec) free (vec);
    538593}
     594
     595// read -fits foo -sizes -- Nx, Ny, Nfields -> $table:Nx, $table:Ny, $table:$Nfields
     596// read -fits foo -fields
     597
     598int read_table_sizes (Header *header) {
     599 
     600  int Nfields;
     601
     602  gfits_scan (header, "TFIELDS", "%d", 1, &Nfields);
     603
     604  set_int_variable ("table:Nx", header->Naxis[0]);
     605  set_int_variable ("table:Nx", header->Naxis[0]);
     606  set_int_variable ("table:Nfields", Nfields);
     607
     608  return TRUE;
     609}
     610
Note: See TracChangeset for help on using the changeset viewer.