IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 40334


Ignore:
Timestamp:
Jan 31, 2018, 9:52:31 AM (8 years ago)
Author:
eugene
Message:

generalize mslice to all 3D slices

File:
1 edited

Legend:

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

    r39233 r40334  
    33int mslice (int argc, char **argv) {
    44 
    5   int i;
     5  int N;
    66  Buffer *in, *out;
    77
     8  int Dir = 0;
     9  if ((N = get_argument (argc, argv, "-x"))) {
     10    remove_argument (N, &argc, argv);
     11    Dir = 1;   
     12  }
     13  if ((N = get_argument (argc, argv, "-y"))) {
     14    remove_argument (N, &argc, argv);
     15    if (Dir) {
     16      gprint (GP_ERR, "ERROR: multiple -x,-y,-z options are not allowed\n");
     17      return FALSE;
     18    }
     19    Dir = 2;   
     20  }
     21  if ((N = get_argument (argc, argv, "-z"))) {
     22    remove_argument (N, &argc, argv);
     23    if (Dir) {
     24      gprint (GP_ERR, "ERROR: multiple -x,-y,-z options are not allowed\n");
     25      return FALSE;
     26    }
     27    Dir = 3;   
     28  }
     29  if (!Dir) Dir = 3;
     30
    831  if (argc != 4) {
    9     gprint (GP_ERR, "USAGE: mget <input> <output> plane\n");
     32    gprint (GP_ERR, "USAGE: mslice <input> <output> plane [-x,-y,-z]\n");
     33    gprint (GP_ERR, "  -z is default\n");
    1034    return (FALSE);
    1135  }
     
    2448  int Nz = in[0].matrix.Naxis[2];
    2549
     50  int NplaneMax = 0;
     51  int Nout1 = 0;
     52  int Nout2 = 0;
     53  switch (Dir) {
     54    case 1: NplaneMax = Nx; Nout1 = Ny; Nout2 = Nz; break;
     55    case 2: NplaneMax = Ny; Nout1 = Nx; Nout2 = Nz; break;
     56    case 3: NplaneMax = Nz; Nout1 = Nx; Nout2 = Ny; break;
     57    default: myAbort ("impossible");
     58  }
     59
    2660  int invalid = FALSE;
    2761  invalid = invalid || (plane < 0);
    28   invalid = invalid || (plane >= Nz);
     62  invalid = invalid || (plane >= NplaneMax);
    2963  if (invalid) {
    30     gprint (GP_ERR, "plane %d out of range\n", plane);
     64    gprint (GP_ERR, "plane %d out of range (max = %d)\n", plane, NplaneMax);
    3165    return (FALSE);
    3266  }
    3367
    3468  /* I should encapsulate this in a create_default_buffer */
     69 
    3570  gfits_free_matrix (&out[0].matrix);
    3671  gfits_free_header (&out[0].header);
    37   if (!CreateBuffer (out, Nx, Ny, -32, 1.0, 0.0)) return FALSE;
     72  if (!CreateBuffer (out, Nout1, Nout2, -32, 1.0, 0.0)) return FALSE;
    3873
    39   float *inF  = (float *) in[0].matrix.buffer + plane*Nx*Ny;
    40   float *outF = (float *) out[0].matrix.buffer;
     74  // pixel (ix, iy, iz) : in[0].matrix.buffer + ix + iy*Nx + iz*Nx*Ny
    4175
    42   for (i = 0; i < Nx*Ny; i++, inF ++, outF++) {
    43     *outF = *inF;
     76  switch (Dir) {
     77    case 1: {
     78      float *outF = (float *) out[0].matrix.buffer;
     79     
     80      // pixel (ix, iy, iz) : in[0].matrix.buffer + ix + iy*Nx + iz*Nx*Ny
     81
     82      for (int iz = 0; iz < Nz; iz++) {
     83        float *inF  = (float *) in[0].matrix.buffer + plane + iz*Nx*Ny;
     84        for (int iy = 0; iy < Ny; iy++, inF += Nx, outF++) {
     85          *outF = *inF;
     86        }
     87      }
     88      break;
     89    }
     90    case 2: {
     91
     92      float *outF = (float *) out[0].matrix.buffer;
     93
     94      for (int iz = 0; iz < Nz; iz++) {
     95        float *inF  = (float *) in[0].matrix.buffer + plane*Nx + iz*Nx*Ny;
     96        for (int ix = 0; ix < Nx; ix++, inF++, outF++) {
     97          *outF = *inF;
     98        }
     99      }
     100      break;
     101    }
     102    case 3: {
     103      float *inF  = (float *) in[0].matrix.buffer + plane*Nx*Ny;
     104      float *outF = (float *) out[0].matrix.buffer;
     105     
     106      for (int i = 0; i < Nx*Ny; i++, inF ++, outF++) {
     107        *outF = *inF;
     108      }
     109      break;
     110    }
     111    default: myAbort ("impossible");
    44112  }
    45113  return (TRUE);
Note: See TracChangeset for help on using the changeset viewer.