Index: trunk/Ohana/src/opihi/cmd.data/Makefile
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/Makefile	(revision 38153)
+++ trunk/Ohana/src/opihi/cmd.data/Makefile	(revision 38234)
@@ -91,4 +91,5 @@
 $(SRC)/mget.$(ARCH).o		\
 $(SRC)/mget3d.$(ARCH).o		\
+$(SRC)/mslice.$(ARCH).o		\
 $(SRC)/minterpolate.$(ARCH).o	\
 $(SRC)/medimage.$(ARCH).o	\
Index: trunk/Ohana/src/opihi/cmd.data/init.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/init.c	(revision 38153)
+++ trunk/Ohana/src/opihi/cmd.data/init.c	(revision 38234)
@@ -82,4 +82,5 @@
 int mget             PROTO((int, char **));
 int mget3d           PROTO((int, char **));
+int mslice           PROTO((int, char **));
 int minterp          PROTO((int, char **));
 int medimage_command PROTO((int, char **));
@@ -248,4 +249,5 @@
   {1, "mget",         mget,             "extract a vector from an image"},
   {1, "mget3d",       mget3d,           "extract a vector from a 3D image"},
+  {1, "mslice",       mslice,           "extract an image plane from a 3D image"},
   {1, "imget",        mget,             "extract a vector from an image"},
   {1, "minterp",      minterp,          "interpolate image pixels"},
Index: trunk/Ohana/src/opihi/cmd.data/mslice.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/mslice.c	(revision 38234)
+++ trunk/Ohana/src/opihi/cmd.data/mslice.c	(revision 38234)
@@ -0,0 +1,46 @@
+# include "data.h"
+
+int mslice (int argc, char **argv) {
+  
+  int i;
+  Buffer *in, *out;
+
+  if (argc != 4) {
+    gprint (GP_ERR, "USAGE: mget <input> <output> plane\n");
+    return (FALSE);
+  }
+
+  int plane = atoi(argv[3]);
+
+  if ((in = SelectBuffer (argv[1], OLDBUFFER, TRUE)) == NULL) return (FALSE);
+  if (in[0].matrix.Naxes < 3) {
+    gprint (GP_ERR, "buffer is not 3D\n");
+    return FALSE;
+  }
+  if ((out = SelectBuffer (argv[2], ANYBUFFER, TRUE)) == NULL) return (FALSE);
+
+  int Nx = in[0].matrix.Naxis[0];
+  int Ny = in[0].matrix.Naxis[1];
+  int Nz = in[0].matrix.Naxis[2];
+
+  int invalid = FALSE;
+  invalid = invalid || (plane < 0);
+  invalid = invalid || (plane >= Nz);
+  if (invalid) {
+    gprint (GP_ERR, "plane %d out of range\n", plane);
+    return (FALSE);
+  }
+
+  /* I should encapsulate this in a create_default_buffer */
+  gfits_free_matrix (&out[0].matrix);
+  gfits_free_header (&out[0].header);
+  CreateBuffer (out, Nx, Ny, -32, 1.0, 0.0);
+
+  float *inF  = (float *) in[0].matrix.buffer + plane*Nx*Ny;
+  float *outF = (float *) out[0].matrix.buffer;
+
+  for (i = 0; i < Nx*Ny; i++, inF ++, outF++) {
+    *outF = *inF;
+  }
+  return (TRUE);
+}
Index: trunk/Ohana/src/opihi/cmd.data/rd.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/rd.c	(revision 38153)
+++ trunk/Ohana/src/opihi/cmd.data/rd.c	(revision 38234)
@@ -170,5 +170,5 @@
   if (plane >= 0) {
     // we are requesting a specific plane (-1 : all data)
-    int tooFar = Nz ? (plane >= Nz) : (plane > Nz);
+    int tooFar = (Nz > 0) ? (plane >= Nz) : (plane > 0);
     if (tooFar) {
       gprint (GP_ERR, "-plane is too large: %d total planes\n", Nz);
