Index: /trunk/Ohana/src/opihi/cmd.astro/czplot.c
===================================================================
--- /trunk/Ohana/src/opihi/cmd.astro/czplot.c	(revision 35756)
+++ /trunk/Ohana/src/opihi/cmd.astro/czplot.c	(revision 35757)
@@ -3,5 +3,7 @@
 int czplot (int argc, char **argv) {
   
-  int i, kapa, Npts, status;
+  char *outname = NULL;
+  int i, kapa, valid, size;
+  int Npts, status;
   double min, range, Rmin, Rmax;
   opihi_flt *out, *r, *d, *x, *y;
@@ -11,6 +13,9 @@
   if (!style_args (&graphmode, &argc, argv, &kapa)) return FALSE;
 
-  if (argc != 6) {
+  valid  = (argc == 6);
+  valid |= (argc > 7) && !strcmp (argv[6], "where");
+  if (!valid) {
     gprint (GP_ERR, "USAGE: czplot <x> <y> <z> min max\n");
+    gprint (GP_ERR, "   OR: czplot <x> <y> <z> min max where (condition)\n");
     return (FALSE);
   }
@@ -21,4 +26,21 @@
   Rmax = graphmode.coords.crval1 + 182.0;
 
+  // tvec is used for logical test (truth vector)
+  Vector *tvec = NULL;
+  char *mask = NULL;
+  if (argc > 7) {
+    outname = dvomath (argc - 7, &argv[7], &size, 1);
+    if (outname == NULL) {
+      print_error ();
+      return FALSE;
+    }
+    if ((tvec = SelectVector (outname, OLDVECTOR, TRUE)) == NULL) {
+      gprint (GP_ERR, " invalid logic result\n");
+      DeleteNamedVector (outname);
+      free (outname);
+      return (FALSE);
+    }
+  }
+
   /* find vectors */
   if ((xvec = SelectVector (argv[1], OLDVECTOR, TRUE)) == NULL) return (FALSE);
@@ -38,8 +60,17 @@
     return (FALSE);
   }
+  if (tvec && (xvec[0].Nelements != tvec[0].Nelements)) {
+    gprint (GP_ERR, "logic test vector not the same length as data vectors\n");
+    return (FALSE);
+  }
+
   SetVector (&Xvec, OPIHI_FLT, xvec[0].Nelements);
   SetVector (&Yvec, OPIHI_FLT, xvec[0].Nelements);
   SetVector (&Zvec, OPIHI_FLT, xvec[0].Nelements);
   
+  if (tvec) {
+    ALLOCATE (mask, char, tvec->Nelements);
+  }
+
   r   = xvec[0].elements.Flt;
   d   = yvec[0].elements.Flt;
@@ -64,4 +95,11 @@
       *out = MIN (1.0, MAX (0.01, (in[i] - min) / range));
     }
+
+    if (mask) {
+      // NOTE: the X,Y,Z sequence is not (necessarily) the same as the RA,DEC,zvec seq
+      // I only set the mask for points sent to kapa...
+      mask[Npts] = (tvec->type == OPIHI_FLT) ? (tvec->elements.Flt[i] == 0.0) : (tvec->elements.Int[i] == 0.0);
+    }
+
     x++;
     y++;
@@ -76,5 +114,5 @@
   graphmode.size = -1; /* point size determined by Zvec */
   graphmode.etype = 0;
-  PlotVectorTriplet (kapa, &Xvec, &Yvec, &Zvec, NULL, &graphmode);
+  PlotVectorTriplet (kapa, &Xvec, &Yvec, &Zvec, mask, &graphmode);
 
   free (Xvec.elements.Flt);
@@ -82,5 +120,132 @@
   free (Zvec.elements.Flt);
 
+  if (mask) free (mask);
+
   return (TRUE);
 
 }
+
+int czcplot (int argc, char **argv) {
+  
+  char *outname = NULL;
+  int i, kapa, valid, size;
+  int Npts, status;
+  double min, range, Rmin, Rmax;
+  opihi_flt *out, *r, *d, *x, *y;
+  Vector Xvec, Yvec, Zvec, *xvec, *yvec, *zvec;
+  Graphdata graphmode;
+
+  if (!style_args (&graphmode, &argc, argv, &kapa)) return FALSE;
+
+  valid  = (argc == 6);
+  valid |= (argc > 7) && !strcmp (argv[6], "where");
+  if (!valid) {
+    gprint (GP_ERR, "USAGE: czcplot <x> <y> <z> min max\n");
+    gprint (GP_ERR, "   OR: czcplot <x> <y> <z> min max where (condition)\n");
+    return (FALSE);
+  }
+
+  min = atof(argv[4]);
+  range = atof(argv[5]) - min;
+  Rmin = graphmode.coords.crval1 - 182.0;
+  Rmax = graphmode.coords.crval1 + 182.0;
+
+  // tvec is used for logical test (truth vector)
+  Vector *tvec = NULL;
+  char *mask = NULL;
+  if (argc > 7) {
+    outname = dvomath (argc - 7, &argv[7], &size, 1);
+    if (outname == NULL) {
+      print_error ();
+      return FALSE;
+    }
+    if ((tvec = SelectVector (outname, OLDVECTOR, TRUE)) == NULL) {
+      gprint (GP_ERR, " invalid logic result\n");
+      DeleteNamedVector (outname);
+      free (outname);
+      return (FALSE);
+    }
+  }
+
+  /* find vectors */
+  if ((xvec = SelectVector (argv[1], OLDVECTOR, TRUE)) == NULL) return (FALSE);
+  if ((yvec = SelectVector (argv[2], OLDVECTOR, TRUE)) == NULL) return (FALSE);
+  if ((zvec = SelectVector (argv[3], OLDVECTOR, TRUE)) == NULL) return (FALSE);
+
+  REQUIRE_VECTOR_FLT (xvec, FALSE); 
+  REQUIRE_VECTOR_FLT (yvec, FALSE); 
+  REQUIRE_VECTOR_FLT (zvec, FALSE); 
+
+  if (xvec[0].Nelements != yvec[0].Nelements) {
+    gprint (GP_ERR, "vectors %s and %s not the same length\n", argv[1], argv[2]);
+    return (FALSE);
+  }
+  if (xvec[0].Nelements != zvec[0].Nelements) {
+    gprint (GP_ERR, "vectors %s and %s not the same length\n", argv[1], argv[3]);
+    return (FALSE);
+  }
+  if (tvec && (xvec[0].Nelements != tvec[0].Nelements)) {
+    gprint (GP_ERR, "logic test vector not the same length as data vectors\n");
+    return (FALSE);
+  }
+
+  SetVector (&Xvec, OPIHI_FLT, xvec[0].Nelements);
+  SetVector (&Yvec, OPIHI_FLT, xvec[0].Nelements);
+  SetVector (&Zvec, OPIHI_FLT, xvec[0].Nelements);
+  
+  if (tvec) {
+    ALLOCATE (mask, char, tvec->Nelements);
+  }
+
+  r   = xvec[0].elements.Flt;
+  d   = yvec[0].elements.Flt;
+  x   = Xvec.elements.Flt;
+  y   = Yvec.elements.Flt;
+  out = Zvec.elements.Flt;
+
+  Npts = 0;
+  for (i = 0; i < xvec[0].Nelements; i++, r++, d++) {
+    *r = ohana_normalize_angle (*r);
+    while (*r < Rmin) *r += 360.0;
+    while (*r > Rmax) *r -= 360.0;
+
+    status = RD_to_XY (x, y, *r, *d, &graphmode.coords);
+    if (!status) continue;
+
+    if (zvec->type == OPIHI_FLT) {
+      opihi_flt *in  = zvec[0].elements.Flt;
+      *out = MIN (1.0, MAX (0.01, (in[i] - min) / range));
+    } else {
+      opihi_int *in  = zvec[0].elements.Int;
+      *out = MIN (1.0, MAX (0.01, (in[i] - min) / range));
+    }
+
+    if (mask) {
+      // NOTE: the X,Y,Z sequence is not (necessarily) the same as the RA,DEC,zvec seq
+      // I only set the mask for points sent to kapa...
+      mask[Npts] = (tvec->type == OPIHI_FLT) ? (tvec->elements.Flt[i] == 0.0) : (tvec->elements.Int[i] == 0.0);
+    }
+
+    x++;
+    y++;
+    out++;
+    Npts++;
+  }
+  Xvec.Nelements = Npts;
+  Yvec.Nelements = Npts;
+  Zvec.Nelements = Npts;
+
+  graphmode.style = 2;
+  graphmode.color = -1; /* point color determined by Zvec */
+  graphmode.etype = 0;
+  PlotVectorTriplet (kapa, &Xvec, &Yvec, &Zvec, mask, &graphmode);
+
+  free (Xvec.elements.Flt);
+  free (Yvec.elements.Flt);
+  free (Zvec.elements.Flt);
+
+  if (mask) free (mask);
+
+  return (TRUE);
+
+}
Index: /trunk/Ohana/src/opihi/cmd.astro/init.c
===================================================================
--- /trunk/Ohana/src/opihi/cmd.astro/init.c	(revision 35756)
+++ /trunk/Ohana/src/opihi/cmd.astro/init.c	(revision 35757)
@@ -12,4 +12,5 @@
 int cval                    PROTO((int, char **));
 int czplot                  PROTO((int, char **));
+int czcplot                 PROTO((int, char **));
 int drizzle                 PROTO((int, char **));
 int flux                    PROTO((int, char **));
@@ -70,4 +71,5 @@
   {1, "cval",        cval,         "cosmic ray flux?"},
   {1, "czplot",      czplot,       "plot scaled vectors in sky coordinates"},
+  {1, "czcplot",     czcplot,      "plot color-scaled vectors in sky coordinates"},
   {1, "drizzle",     drizzle,      "transform image to image"},
   {1, "flux",        flux,         "flux in a convex contour"},
Index: /trunk/Ohana/src/opihi/cmd.data/tv.c
===================================================================
--- /trunk/Ohana/src/opihi/cmd.data/tv.c	(revision 35756)
+++ /trunk/Ohana/src/opihi/cmd.data/tv.c	(revision 35757)
@@ -21,5 +21,5 @@
   /* shell exits on pipe close, FIX */
   if ((N = get_argument (argc, argv, "-kill"))) {
-    KiiClose (kapa);
+    KapaClose (kapa);
     return (TRUE);
   }
Index: /trunk/Ohana/src/opihi/dvo/hosts.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/hosts.c	(revision 35756)
+++ /trunk/Ohana/src/opihi/dvo/hosts.c	(revision 35757)
@@ -3,5 +3,5 @@
 # define DVO_MAX_PATH 1024
 
-enum {TEMP_NONE, TEMP_DVO_RESULTS, TEMP_DVO_LOG, TEMP_RELPHOT_RESULTS, TEMP_RELPHOT_LOG};
+enum {TEMP_NONE, TEMP_DVO_RESULTS, TEMP_DVO_LOG, TEMP_RELASTRO_CATALOG, TEMP_RELPHOT_CATALOG, TEMP_RELPHOT_LOG, TEMP_DVOPSPS_DET, TEMP_FIXSTKIDS_RESULTS};
 
 // functions to manage the remote hosts
@@ -58,8 +58,11 @@
       TEMP_TYPE = TEMP_NONE;
       remove_argument (N, &argc, argv);
-      if (!strcasecmp(argv[N], "dvo.results"))     TEMP_TYPE = TEMP_DVO_RESULTS;
-      if (!strcasecmp(argv[N], "dvo.log"))         TEMP_TYPE = TEMP_DVO_LOG;
-      if (!strcasecmp(argv[N], "relphot.results")) TEMP_TYPE = TEMP_RELPHOT_RESULTS;
-      if (!strcasecmp(argv[N], "relphot.log"))     TEMP_TYPE = TEMP_RELPHOT_LOG;
+      if (!strcasecmp(argv[N], "dvo.results"))       TEMP_TYPE = TEMP_DVO_RESULTS;
+      if (!strcasecmp(argv[N], "dvo.log"))           TEMP_TYPE = TEMP_DVO_LOG;
+      if (!strcasecmp(argv[N], "relastro.catalog"))   TEMP_TYPE = TEMP_RELASTRO_CATALOG;
+      if (!strcasecmp(argv[N], "relphot.catalog"))   TEMP_TYPE = TEMP_RELPHOT_CATALOG;
+      if (!strcasecmp(argv[N], "relphot.log"))       TEMP_TYPE = TEMP_RELPHOT_LOG;
+      if (!strcasecmp(argv[N], "dvopsps.det"))       TEMP_TYPE = TEMP_DVOPSPS_DET;
+      if (!strcasecmp(argv[N], "fixstkids.results")) TEMP_TYPE = TEMP_FIXSTKIDS_RESULTS;
       if (TEMP_TYPE == TEMP_NONE) {
 	gprint (GP_ERR, "USAGE: hosts purge-temp [-type (type)]\n");
@@ -94,16 +97,24 @@
     int i;
     for (i = 0; i < table->Nhosts; i++) {
+      if (HOST_ID && (HOST_ID != table->hosts[i].hostID)) continue;
+
       pglob.gl_offs = 0;
       char name[DVO_MAX_PATH];
       if (ALL_PID) {
-	if (TEMP_TYPE == TEMP_DVO_RESULTS)     snprintf (name, DVO_MAX_PATH, "%s/dvo.results.*.fits", table->hosts[i].pathname);
-	if (TEMP_TYPE == TEMP_DVO_LOG)         snprintf (name, DVO_MAX_PATH, "%s/dvo.results.*.fits.log", table->hosts[i].pathname);
-	if (TEMP_TYPE == TEMP_RELPHOT_RESULTS) snprintf (name, DVO_MAX_PATH, "%s/log.rlpc.*", table->hosts[i].pathname);
-	if (TEMP_TYPE == TEMP_RELPHOT_LOG)     snprintf (name, DVO_MAX_PATH, "%s/relphot.catalog.subset.dat", table->hosts[i].pathname);
+	if (TEMP_TYPE == TEMP_DVO_RESULTS)     	 snprintf (name, DVO_MAX_PATH, "%s/dvo.results.*.fits", table->hosts[i].pathname);
+	if (TEMP_TYPE == TEMP_DVO_LOG)         	 snprintf (name, DVO_MAX_PATH, "%s/dvo.results.*.fits.log", table->hosts[i].pathname);
+	if (TEMP_TYPE == TEMP_RELASTRO_CATALOG)  snprintf (name, DVO_MAX_PATH, "%s/relastro.catalog.subset.dat", table->hosts[i].pathname);
+	if (TEMP_TYPE == TEMP_RELPHOT_CATALOG) 	 snprintf (name, DVO_MAX_PATH, "%s/relphot.catalog.subset.dat", table->hosts[i].pathname);
+	if (TEMP_TYPE == TEMP_RELPHOT_LOG)     	 snprintf (name, DVO_MAX_PATH, "%s/log.rlpc.*", table->hosts[i].pathname);
+	if (TEMP_TYPE == TEMP_DVOPSPS_DET)     	 snprintf (name, DVO_MAX_PATH, "%s/dvopsps.*.det.dat", table->hosts[i].pathname);
+	if (TEMP_TYPE == TEMP_FIXSTKIDS_RESULTS) snprintf (name, DVO_MAX_PATH, "%s/fixstkids.results.*.dat", table->hosts[i].pathname);
       } else {
-	if (TEMP_TYPE == TEMP_DVO_RESULTS)     snprintf (name, DVO_MAX_PATH, "%s/dvo.results.%05d.*.fits", table->hosts[i].pathname, PID);
-	if (TEMP_TYPE == TEMP_DVO_LOG)         snprintf (name, DVO_MAX_PATH, "%s/dvo.results.%05d.*.fits.log", table->hosts[i].pathname, PID);
-	if (TEMP_TYPE == TEMP_RELPHOT_RESULTS) snprintf (name, DVO_MAX_PATH, "%s/log.rlpc.*", table->hosts[i].pathname);
-	if (TEMP_TYPE == TEMP_RELPHOT_LOG)     snprintf (name, DVO_MAX_PATH, "%s/relphot.catalog.subset.dat", table->hosts[i].pathname);
+	if (TEMP_TYPE == TEMP_DVO_RESULTS)     	 snprintf (name, DVO_MAX_PATH, "%s/dvo.results.%05d.*.fits", table->hosts[i].pathname, PID);
+	if (TEMP_TYPE == TEMP_DVO_LOG)         	 snprintf (name, DVO_MAX_PATH, "%s/dvo.results.%05d.*.fits.log", table->hosts[i].pathname, PID);
+	if (TEMP_TYPE == TEMP_RELASTRO_CATALOG)  snprintf (name, DVO_MAX_PATH, "%s/relastro.catalog.subset.dat", table->hosts[i].pathname);
+	if (TEMP_TYPE == TEMP_RELPHOT_CATALOG) 	 snprintf (name, DVO_MAX_PATH, "%s/relphot.catalog.subset.dat", table->hosts[i].pathname);
+	if (TEMP_TYPE == TEMP_RELPHOT_LOG)     	 snprintf (name, DVO_MAX_PATH, "%s/log.rlpc.*", table->hosts[i].pathname);
+	if (TEMP_TYPE == TEMP_DVOPSPS_DET)     	 snprintf (name, DVO_MAX_PATH, "%s/dvopsps.%05d.*.det.dat", table->hosts[i].pathname, PID);
+	if (TEMP_TYPE == TEMP_FIXSTKIDS_RESULTS) snprintf (name, DVO_MAX_PATH, "%s/fixstkids.results.%05d.*.dat", table->hosts[i].pathname, PID);
       }
       if (VERBOSE) gprint (GP_ERR, "checking %s\n", name);
