Index: /trunk/Ohana/src/opihi/cmd.data/rd.c
===================================================================
--- /trunk/Ohana/src/opihi/cmd.data/rd.c	(revision 13039)
+++ /trunk/Ohana/src/opihi/cmd.data/rd.c	(revision 13040)
@@ -57,5 +57,4 @@
     return (FALSE);
   }
-  fclose (f);
 
   /* find matrix, free old data */
@@ -71,7 +70,10 @@
   status = FALSE;
 
+  /*** advance to the correct FITS extension ***/
+
+  /* FITS extension by number */
   if (extend) {
     /* load in appropriate header */
-    Nskip = gfits_read_Xheader (argv[2], &buf[0].header, Nextend);
+    Nskip = gfits_fread_Xheader (f, &buf[0].header, Nextend);
     if (!Nskip) {
       gprint (GP_ERR, "entry in %s not found\n", argv[2]);
@@ -79,42 +81,6 @@
       return (FALSE);
     }
-    /* fix up header */
-    {
-      static char simple[] = "SIMPLE  =                    T / Standard FITS";
-      int Ns, No;
-
-      Ns = strlen (simple);
-      No = 80 - Ns;
-      strncpy (buf[0].header.buffer, simple, Ns);
-      memset (&buf[0].header.buffer[Ns], ' ', No);
-    }
-    if (JustHead) {
-      /* should be in CreateMatrix / CreateBuffer function */
-      buf[0].header.Naxes = 0;
-      ALLOCATE (buf[0].matrix.buffer, char, 1);
-      buf[0].matrix.size = 0;
-      buf[0].bitpix = 16;
-      buf[0].bzero = 0;
-      buf[0].bscale = 1;
-      buf[0].matrix.bitpix = 16;
-      buf[0].matrix.bzero = 0;
-      buf[0].matrix.bscale = 1;
-      buf[0].header.bitpix = 16;
-      buf[0].header.bzero = 0;
-      buf[0].header.bscale = 1;
-      return (TRUE);
-    }
-    /* load matrix data */
-    f = fopen (argv[2], "r");
-    if (f == (FILE *) NULL) {
-      gprint (GP_ERR, "file %s not found\n", argv[2]);
-      DeleteBuffer (buf);
-      return (FALSE);
-    }
-    fseek (f, Nskip, SEEK_SET);
-    status = gfits_load_matrix (f, &buf[0].matrix, &buf[0].header);
-    fclose (f);
   } 
-
+  /* FITS extension by name */
   if (ccdsel) {
     char *CCDKeyword, ID[64];
@@ -128,5 +94,5 @@
     done = FALSE;
     for (i = 0; !done; i++) {
-      Nskip = gfits_read_Xheader (argv[2], &buf[0].header, i);
+      Nskip = gfits_fread_Xheader (f, &buf[0].header, i);
       if (!Nskip) {
 	gprint (GP_ERR, "extension %s in %s not found\n", ccdid, argv[2]);
@@ -144,75 +110,51 @@
       /* compare as numbers if both are pure numbers, else as strings */
       done = strnumcmp (ccdid, ID);
-
       if (!done) gfits_free_header (&buf[0].header);
     }
     free (CCDKeyword);
-
-    /* fix up header */
-    {
-      static char simple[] = "SIMPLE  =                    T / Standard FITS";
-      int Ns, No;
-
-      Ns = strlen (simple);
-      No = 80 - Ns;
-      strncpy (buf[0].header.buffer, simple, Ns);
-      memset (&buf[0].header.buffer[Ns], ' ', No);
-    }
-    if (JustHead) {
-      buf[0].header.Naxes = 0;
-      ALLOCATE (buf[0].matrix.buffer, char, 1);
-      buf[0].matrix.size = 0;
-      buf[0].bitpix = 16;
-      buf[0].bzero = 0;
-      buf[0].bscale = 1;
-      buf[0].matrix.bitpix = 16;
-      buf[0].matrix.bzero = 0;
-      buf[0].matrix.bscale = 1;
-      buf[0].header.bitpix = 16;
-      buf[0].header.bzero = 0;
-      buf[0].header.bscale = 1;
-      return (TRUE);
-    }
-    /* load matrix data */
-    f = fopen (argv[2], "r");
-    if (f == (FILE *) NULL) {
-      gprint (GP_ERR, "file %s not found\n", argv[2]);
-      DeleteBuffer (buf);
-      return (FALSE);
-    }
-    fseek (f, Nskip, SEEK_SET);
-    status = gfits_load_matrix (f, &buf[0].matrix, &buf[0].header);
-    fclose (f);
   }
 
-  if (!ccdsel && !extend) {
-    status = gfits_read_header (argv[2], &buf[0].header);
-    if (JustHead) {
-      buf[0].header.Naxes = 0;
-      ALLOCATE (buf[0].matrix.buffer, char, 1);
-      buf[0].matrix.size = 0;
-      buf[0].bitpix = 16;
-      buf[0].bzero = 0;
-      buf[0].matrix.bscale = 1;
-      buf[0].matrix.bitpix = 16;
-      buf[0].matrix.bzero = 0;
-      buf[0].matrix.bscale = 1;
-      return (TRUE);
-    }
-    Nplane = buf[0].header.Naxis[2];
-    if (Nplane > 0) {
-      if (plane > Nplane) {
-	gprint (GP_ERR, "-plane is too large: %d total planes\n", Nplane);
-	DeleteBuffer (buf);
-	return (FALSE);
-      }
-      buf[0].header.Naxis[2] = 0;
-      buf[0].header.Naxes = 2;
-      gfits_modify (&buf[0].header, "NAXIS", "%d", 1, 2);
-      gfits_delete (&buf[0].header, "NAXIS3", 1);
-    }
-    sprintf (region, "-1 -1 -1 -1 %d %d", (plane - 1), plane);
-    status = gfits_read_segment (argv[2], &buf[0].matrix, region);
+  /* fix up header, if needed */
+  if (extend || ccdsel) {
+    static char simple[] = "SIMPLE  =                    T / Standard FITS";
+    int Ns, No;
+
+    Ns = strlen (simple);
+    No = 80 - Ns;
+    strncpy (buf[0].header.buffer, simple, Ns);
+    memset (&buf[0].header.buffer[Ns], ' ', No);
   }
+
+  /* for JustHead, we skip reading the data segment */ 
+  if (JustHead) {
+    /* should be in CreateMatrix / CreateBuffer function */
+    buf[0].header.Naxes = 0;
+    ALLOCATE (buf[0].matrix.buffer, char, 1);
+    buf[0].matrix.size = 0;
+    buf[0].bitpix = 16;
+    buf[0].bzero = 0;
+    buf[0].bscale = 1;
+    buf[0].matrix.bitpix = 16;
+    buf[0].matrix.bzero = 0;
+    buf[0].matrix.bscale = 1;
+    buf[0].header.bitpix = 16;
+    buf[0].header.bzero = 0;
+    buf[0].header.bscale = 1;
+    return (TRUE);
+  }
+
+  /* check for valid plane */
+  Nplane = buf[0].header.Naxis[2];
+  if (Nplane == 0) Nplane = 1;
+  if (plane > Nplane) {
+    gprint (GP_ERR, "-plane is too large: %d total planes\n", Nplane);
+    DeleteBuffer (buf);
+    return (FALSE);
+  }
+
+  /* load matrix data */
+  sprintf (region, "-1 -1 -1 -1 %d %d", (plane - 1), plane);
+  status = gfits_fread_matrix_segment (f, &buf[0].matrix, &buf[0].header, region);
+  fclose (f);
 
   if (!status) {
@@ -221,6 +163,15 @@
     return (FALSE);
   }
+
+  /* adjust buffer to represent 2D data */
+  if (Nplane > 1) {
+    buf[0].header.Naxis[2] = 0;
+    buf[0].header.Naxes = 2;
+    gfits_modify (&buf[0].header, "NAXIS", "%d", 1, 2);
+    gfits_delete (&buf[0].header, "NAXIS3", 1);
+  }
+
+  /* we need to return a 2D array, convert 1D images to 2D (Naxis[1] = 1) */
   if (buf[0].header.Naxes == 1) {
-    /* we need to return an array, so make Naxis[1] = 1 */
     buf[0].header.Naxes = 2;
     buf[0].header.Naxis[1] = 1;
@@ -239,4 +190,3 @@
   
   return (TRUE);
-
 }
Index: /trunk/Ohana/src/opihi/cmd.data/rdseg.c
===================================================================
--- /trunk/Ohana/src/opihi/cmd.data/rdseg.c	(revision 13039)
+++ /trunk/Ohana/src/opihi/cmd.data/rdseg.c	(revision 13040)
@@ -38,5 +38,5 @@
   status = gfits_read_header (argv[2], &buf[0].header);
   sprintf (region, "%d %d %d %d 0 1", x, nx + x, y, ny + y);
-  status = gfits_read_segment (argv[2], &buf[0].matrix, region);
+  status = gfits_read_matrix_segment (argv[2], &buf[0].matrix, region);
   gfits_modify (&buf[0].header, "NAXIS1", "%d", 1, nx);
   gfits_modify (&buf[0].header, "NAXIS2", "%d", 1, ny);
