Index: /trunk/Ohana/src/opihi/cmd.data/Makefile
===================================================================
--- /trunk/Ohana/src/opihi/cmd.data/Makefile	(revision 7948)
+++ /trunk/Ohana/src/opihi/cmd.data/Makefile	(revision 7949)
@@ -63,4 +63,5 @@
 $(SDIR)/list_vectors.$(ARCH).o	\
 $(SDIR)/load.$(ARCH).o		\
+$(SDIR)/lookup.$(ARCH).o	\
 $(SDIR)/mcreate.$(ARCH).o	\
 $(SDIR)/medacc.$(ARCH).o	\
Index: /trunk/Ohana/src/opihi/cmd.data/init.c
===================================================================
--- /trunk/Ohana/src/opihi/cmd.data/init.c	(revision 7948)
+++ /trunk/Ohana/src/opihi/cmd.data/init.c	(revision 7949)
@@ -48,4 +48,5 @@
 int list_vectors     PROTO((int, char **));
 int load             PROTO((int, char **));
+int lookup           PROTO((int, char **));
 int mcreate          PROTO((int, char **));
 int medacc           PROTO((int, char **));
@@ -157,4 +158,5 @@
   {"vectors", 	   list_vectors,     "list vectors"},
   {"load",         load,	     "load an SAOimage style overlay"},
+  {"lookup",       lookup,	     "convert vector via lookup table (vector pair)"},
   {"mcreate", 	   mcreate,	     "create a matrix"},
   {"medacc",       medacc,	     "accumulate vector values in another vector"},
Index: /trunk/Ohana/src/opihi/cmd.data/lookup.c
===================================================================
--- /trunk/Ohana/src/opihi/cmd.data/lookup.c	(revision 7949)
+++ /trunk/Ohana/src/opihi/cmd.data/lookup.c	(revision 7949)
@@ -0,0 +1,41 @@
+# include "data.h"
+
+int lookup (int argc, char **argv) {
+  
+  int i, Nbins, bin, N, Normalize;
+  float start, end, delta;
+  float *V, *K, *O, *NV;
+  Vector *val, *key, *out;
+
+  if (argc != 5) {
+    gprint (GP_ERR, "USAGE: lookup (input) (output) (x) (y)\n");
+    return (FALSE);
+  }
+
+  if ((in  = SelectVector (argv[1], OLDVECTOR, TRUE)) == NULL) return (FALSE);
+  if ((out = SelectVector (argv[2], ANYVECTOR, TRUE)) == NULL) return (FALSE);
+  if ((xv  = SelectVector (argv[3], OLDVECTOR, TRUE)) == NULL) return (FALSE);
+  if ((yv  = SelectVector (argv[4], OLDVECTOR, TRUE)) == NULL) return (FALSE);
+
+  if (xv[0].Nelements != yv[0].Nelements) {
+      gprint (GP_ERR, "unmatched lookup table lengths\n");
+      return (FALSE);
+  }
+
+  out[0].Nelements = in[0].Nelements;
+  REALLOCATE (out[0].elements, float, out[0].Nelements);
+
+  ip = in[0].elements;
+  op = out[0].elements;
+
+  for (i = 0; i < in[0].Nelements; i++, ip++, op++) {
+    // re-write this using bisection
+    xp = xv[0].elements;
+    yp = yv[0].elements;
+
+    for (j = 0; (*ip < *xp) && (j < yv[0].Nelements); j++);
+    *op = j;
+  }      
+
+  return (TRUE);
+}
