Index: /trunk/Ohana/src/libfits/table/F_table_format.c
===================================================================
--- /trunk/Ohana/src/libfits/table/F_table_format.c	(revision 3489)
+++ /trunk/Ohana/src/libfits/table/F_table_format.c	(revision 3490)
@@ -80,5 +80,5 @@
 }
 
-/***********************/
+/** extract a table subset to a vtable ***/
 int fits_table_to_vtable (FTable *ftable, VTable *vtable, int start, int Nkeep) {
 
@@ -110,4 +110,32 @@
 
   return (TRUE);
+}
+
+/** convert specified rows to vtable */
+int fits_vtable_from_ftable (FTable *ftable, VTable *vtable, int *row, int Nrow) {
+
+  int i, N, Nx, Ny;
+
+  fits_scan (ftable[0].header, "NAXIS1", "%d", 1, &Nx);
+  fits_scan (ftable[0].header, "NAXIS2", "%d", 1, &Ny);
+
+  /* make empty vtable from table */
+  vtable[0].header = ftable[0].header;  /* make this a copy? */
+  vtable[0].size   = ftable[0].size;
+  vtable[0].pad    = vtable[0].size - Nx*Ny;
+  vtable[0].Nrow   = Ny;
+
+  /* insert selected rows in vtable (mask rows marked with -1) */ 
+  ALLOCATE (vtable[0].row, int, Nrow);
+  ALLOCATE (vtable[0].buffer, char *, Nrow);
+  for (N = i = 0; i < Nrow; i++) {
+    if (row[i] == -1) continue;
+    vtable[0].row[N] = row[i];
+    ALLOCATE (vtable[0].buffer[N], char, Nx);
+    memcpy (vtable[0].buffer[N], &ftable[0].buffer[Nx*row[i]], Nx);
+    N++;
+  }
+  vtable[0].Nrow = N;
+  return (vtable);
 }
 
