Index: branches/eam_branches/ipp-20130904/Ohana/src/opihi/cmd.data/read_vectors.c
===================================================================
--- branches/eam_branches/ipp-20130904/Ohana/src/opihi/cmd.data/read_vectors.c	(revision 36274)
+++ branches/eam_branches/ipp-20130904/Ohana/src/opihi/cmd.data/read_vectors.c	(revision 36286)
@@ -23,4 +23,5 @@
 // vector types
 enum {COLTYPE_NONE, COLTYPE_FLT, COLTYPE_INT, COLTYPE_TIME, COLTYPE_CHAR};
+static int FITS_TRANSPOSE;
 
 int read_vectors (int argc, char **argv) {
@@ -34,4 +35,10 @@
 
   char *buffer = NULL;
+
+  FITS_TRANSPOSE = FALSE;
+  if ((Narg = get_argument (argc, argv, "-transpose"))) {
+    remove_argument (Narg, &argc, argv);
+    FITS_TRANSPOSE = TRUE;
+  }
 
   /* auto-sense table type */
@@ -410,60 +417,122 @@
     }
 	
-    // define the multifield vector names
-    ALLOCATE (vec, Vector *, Nval);
-    for (j = 0; j < Nval; j++) {
-      if (Nval == 1) 
-	sprintf (name, "%s", argv[i]);
-      else
-	sprintf (name, "%s:%d", argv[i], j);
-      if ((vec[j] = SelectVector (name, ANYVECTOR, TRUE)) == NULL) ESCAPE ("bad vector name");
-      ResetVector (vec[j], vecType, Ny);
-    }
-
-    if (!strcmp (type, "char")) {
-      char *Ptr = data;
+    if (!FITS_TRANSPOSE) {
+      // define the multifield vector names (Nval vectors x Ny elements)
+      ALLOCATE (vec, Vector *, Nval);
+      for (j = 0; j < Nval; j++) {
+	if (Nval == 1) 
+	  sprintf (name, "%s", argv[i]);
+	else
+	  sprintf (name, "%s:%d", argv[i], j);
+	if ((vec[j] = SelectVector (name, ANYVECTOR, TRUE)) == NULL) ESCAPE ("bad vector name");
+	ResetVector (vec[j], vecType, Ny);
+      }
+
+      if (!strcmp (type, "char")) {
+	char *Ptr = data;
+	for (j = 0; j < Ny; j++) {
+	  for (k = 0; k < Nval; k++, Ptr++) {
+	    vec[k][0].elements.Int[j] = *Ptr;
+	  }
+	}
+      }
+      if (!strcmp (type, "short")) {
+	short *Ptr = data;
+	for (j = 0; j < Ny; j++) {
+	  for (k = 0; k < Nval; k++, Ptr++) {
+	    vec[k][0].elements.Int[j] = *Ptr;
+	  }
+	}
+      }
+      if (!strcmp (type, "int")) {
+	int *Ptr = data;
+	for (j = 0; j < Ny; j++) {
+	  for (k = 0; k < Nval; k++, Ptr++) {
+	    vec[k][0].elements.Int[j] = *Ptr;
+	  }
+	}
+      }
+      if (!strcmp (type, "int64_t")) {
+	int64_t *Ptr = data;
+	for (j = 0; j < Ny; j++) {
+	  for (k = 0; k < Nval; k++, Ptr++) {
+	    vec[k][0].elements.Int[j] = *Ptr;
+	  }
+	}
+      }
+      if (!strcmp (type, "float")) {
+	float *Ptr = data;
+	for (j = 0; j < Ny; j++) {
+	  for (k = 0; k < Nval; k++, Ptr++) {
+	    vec[k][0].elements.Flt[j] = *Ptr;
+	  }
+	}
+      }
+      if (!strcmp (type, "double")) {
+	double *Ptr = data;
+	for (j = 0; j < Ny; j++) {
+	  for (k = 0; k < Nval; k++, Ptr++) {
+	    vec[k][0].elements.Flt[j] = *Ptr;
+	  }
+	}
+      }
+    } else {
+      // define the multifield vector names (Ny vectors x Nval elements)
+      ALLOCATE (vec, Vector *, Ny);
       for (j = 0; j < Ny; j++) {
-	for (k = 0; k < Nval; k++, Ptr++) {
-	  vec[k][0].elements.Int[j] = *Ptr;
-	}
-      }
-    }
-    if (!strcmp (type, "short")) {
-      short *Ptr = data;
-      for (j = 0; j < Ny; j++) {
-	for (k = 0; k < Nval; k++, Ptr++) {
-	  vec[k][0].elements.Int[j] = *Ptr;
-	}
-      }
-    }
-    if (!strcmp (type, "int")) {
-      int *Ptr = data;
-      for (j = 0; j < Ny; j++) {
-	for (k = 0; k < Nval; k++, Ptr++) {
-	  vec[k][0].elements.Int[j] = *Ptr;
-	}
-      }
-    }
-    if (!strcmp (type, "int64_t")) {
-      int64_t *Ptr = data;
-      for (j = 0; j < Ny; j++) {
-	for (k = 0; k < Nval; k++, Ptr++) {
-	  vec[k][0].elements.Int[j] = *Ptr;
-	}
-      }
-    }
-    if (!strcmp (type, "float")) {
-      float *Ptr = data;
-      for (j = 0; j < Ny; j++) {
-	for (k = 0; k < Nval; k++, Ptr++) {
-	  vec[k][0].elements.Flt[j] = *Ptr;
-	}
-      }
-    }
-    if (!strcmp (type, "double")) {
-      double *Ptr = data;
-      for (j = 0; j < Ny; j++) {
-	for (k = 0; k < Nval; k++, Ptr++) {
-	  vec[k][0].elements.Flt[j] = *Ptr;
+	if (Ny == 1) 
+	  sprintf (name, "%s", argv[i]);
+	else
+	  sprintf (name, "%s:%d", argv[i], j);
+	if ((vec[j] = SelectVector (name, ANYVECTOR, TRUE)) == NULL) ESCAPE ("bad vector name");
+	ResetVector (vec[j], vecType, Nval);
+      }
+
+      if (!strcmp (type, "char")) {
+	char *Ptr = data;
+	for (j = 0; j < Ny; j++) {
+	  for (k = 0; k < Nval; k++, Ptr++) {
+	    vec[j][0].elements.Int[k] = *Ptr;
+	  }
+	}
+      }
+      if (!strcmp (type, "short")) {
+	short *Ptr = data;
+	for (j = 0; j < Ny; j++) {
+	  for (k = 0; k < Nval; k++, Ptr++) {
+	    vec[j][0].elements.Int[k] = *Ptr;
+	  }
+	}
+      }
+      if (!strcmp (type, "int")) {
+	int *Ptr = data;
+	for (j = 0; j < Ny; j++) {
+	  for (k = 0; k < Nval; k++, Ptr++) {
+	    vec[j][0].elements.Int[k] = *Ptr;
+	  }
+	}
+      }
+      if (!strcmp (type, "int64_t")) {
+	int64_t *Ptr = data;
+	for (j = 0; j < Ny; j++) {
+	  for (k = 0; k < Nval; k++, Ptr++) {
+	    vec[j][0].elements.Int[k] = *Ptr;
+	  }
+	}
+      }
+      if (!strcmp (type, "float")) {
+	float *Ptr = data;
+	for (j = 0; j < Ny; j++) {
+	  for (k = 0; k < Nval; k++, Ptr++) {
+	    vec[j][0].elements.Flt[k] = *Ptr;
+	  }
+	}
+      }
+      if (!strcmp (type, "double")) {
+	double *Ptr = data;
+	for (j = 0; j < Ny; j++) {
+	  for (k = 0; k < Nval; k++, Ptr++) {
+	    vec[j][0].elements.Flt[k] = *Ptr;
+	  }
 	}
       }
