Index: trunk/Ohana/src/opihi/cmd.data/plot.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/plot.c	(revision 32346)
+++ trunk/Ohana/src/opihi/cmd.data/plot.c	(revision 34584)
@@ -3,5 +3,6 @@
 int plot (int argc, char **argv) {
   
-  int kapa, N, Npts;
+  char *out;
+  int kapa, N, Npts, valid, size, i;
   Graphdata graphmode;
   Vector *xvec, *yvec, *dxmvec, *dxpvec, *dymvec, *dypvec;
@@ -32,7 +33,27 @@
   }
 
-  if (argc != 3) {
+  valid  = (argc == 3);
+  valid |= (argc > 4) && !strcmp (argv[3], "where");
+  if (!valid) {
     gprint (GP_ERR, "USAGE: plot <x> <y> [style]\n");
+    gprint (GP_ERR, "   OR: plot <x> <y> [style] where (condition)\n");
     return (FALSE);
+  }
+
+  // tvec is used for logical test (truth vector)
+  Vector *tvec = NULL;
+  char *mask = NULL;
+  if (argc > 4) {
+    out = dvomath (argc - 4, &argv[4], &size, 1);
+    if (out == NULL) {
+      print_error ();
+      return FALSE;
+    }
+    if ((tvec = SelectVector (out, OLDVECTOR, TRUE)) == NULL) {
+      gprint (GP_ERR, " invalid logic result\n");
+      DeleteNamedVector (out);
+      free (out);
+      return (FALSE);
+    }
   }
 
@@ -53,4 +74,8 @@
     return (FALSE);
   }
+  if (tvec && tvec[0].Nelements != yvec[0].Nelements) {
+    gprint (GP_ERR, "logic test vector not the same length as data vectors\n");
+    return (FALSE);
+  }
   if (dypvec && (dypvec->Nelements != xvec->Nelements)) goto mismatch;
   if (dymvec && (dymvec->Nelements != xvec->Nelements)) goto mismatch;
@@ -59,17 +84,39 @@
 
   Npts = xvec[0].Nelements;
-  if (Npts == 0) return (TRUE);
+  if (Npts == 0) {
+    if (tvec) DeleteVector (tvec);
+    return (TRUE);
+  }
+
+  if (tvec) {
+    Npts = 0;
+    ALLOCATE (mask, char, tvec->Nelements);
+    for (i = 0; i < tvec->Nelements; i++) {
+      mask[i] = (tvec->type == OPIHI_FLT) ? (tvec->elements.Flt[i] == 0.0) : (tvec->elements.Int[i] == 0.0);
+      if (!mask[i]) Npts ++;
+    }
+    if (Npts == 0) {
+      DeleteVector (tvec);
+      free (mask);
+      return TRUE;
+    }
+  }
 
   if (!KapaPrepPlot (kapa, Npts, &graphmode)) return (FALSE);
   
-  PlotVectorSingle (kapa, xvec, "x");
-  PlotVectorSingle (kapa, yvec, "y");
+  PlotVectorSingle (kapa, xvec, mask, "x");
+  PlotVectorSingle (kapa, yvec, mask, "y");
   if (graphmode.etype & 0x01) {
-    PlotVectorSingle (kapa, dymvec, "dym");
-    PlotVectorSingle (kapa, dypvec, "dyp");
+    PlotVectorSingle (kapa, dymvec, mask, "dym");
+    PlotVectorSingle (kapa, dypvec, mask, "dyp");
   }
   if (graphmode.etype & 0x02) {
-    PlotVectorSingle (kapa, dxmvec, "dxm");
-    PlotVectorSingle (kapa, dxpvec, "dxp");
+    PlotVectorSingle (kapa, dxmvec, mask, "dxm");
+    PlotVectorSingle (kapa, dxpvec, mask, "dxp");
+  }
+
+  if (tvec) {
+    free (mask);
+    DeleteVector (tvec);
   }
   return (TRUE);
