Index: /trunk/Ohana/src/opihi/dvo/pmeasure.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/pmeasure.c	(revision 16855)
+++ /trunk/Ohana/src/opihi/dvo/pmeasure.c	(revision 16856)
@@ -1,15 +1,19 @@
 # include "dvoshell.h"
 # define NCHUNK 10000
+
+enum {FLAG_IGNORE, FLAG_SKIP, FLAG_KEEP};
 
 int pmeasure (int argc, char **argv) {
   
   FILE *f;
-  int i, j, k, m, kapa, Narg, Npts, NPTS, status, VERBOSE;
+  int i, j, k, m, kapa, Narg, Npts, NPTS, status, VERBOSE, TimeSelect;
   double Mz, Mr, mag;
-  double Radius, Rmin, Rmax, R, D;
+  double Radius, Rmin, Rmax, R, D, trange;
   unsigned IDclip, IDchoice, LimExclude;
-  unsigned FlagChoice, FlagClip, flags;
+  unsigned dbFlagChoice, dbFlagClip;
+  unsigned photFlagChoice, photFlagClip;
   int PhotcodeClip;
   float *Xvec, *Yvec, *Zvec;
+  time_t tzero, tend;
 
   SkyTable *sky;
@@ -33,22 +37,84 @@
     remove_argument (Narg, &argc, argv);
   }
+  if ((Narg = get_argument (argc, argv, "-photcode"))) {
+    remove_argument (Narg, &argc, argv);
+    PhotcodeClip = GetPhotcodeCodebyName (argv[Narg]);
+    remove_argument (Narg, &argc, argv);
+  }
   IDchoice = 0;
   IDclip = FALSE;
   if ((Narg = get_argument (argc, argv, "-ID"))) {
     remove_argument (Narg, &argc, argv);
-    IDchoice  = atoi(argv[Narg]);
+    IDchoice  = strtol(argv[Narg], NULL, 0);
     remove_argument (Narg, &argc, argv);
     IDclip = TRUE;
   }
-  FlagChoice = 0;
-  FlagClip = FALSE;
-  if ((Narg = get_argument (argc, argv, "-flag"))) {
-    remove_argument (Narg, &argc, argv);
-    FlagChoice  = atoi(argv[Narg]);
-    remove_argument (Narg, &argc, argv);
-    FlagClip = TRUE;
-  }
-
-  // XXX Add time restrictions
+  dbFlagChoice = 0;
+  dbFlagClip = FLAG_IGNORE;
+  if ((Narg = get_argument (argc, argv, "-dbflag"))) {
+    remove_argument (Narg, &argc, argv);
+    dbFlagChoice  = strtol(argv[Narg], NULL, 0);
+    remove_argument (Narg, &argc, argv);
+    dbFlagClip = FLAG_SKIP;
+  }
+  if ((Narg = get_argument (argc, argv, "+dbflag"))) {
+    remove_argument (Narg, &argc, argv);
+    dbFlagChoice  = strtol(argv[Narg], NULL, 0);
+    remove_argument (Narg, &argc, argv);
+    dbFlagClip = FLAG_KEEP;
+  }
+  photFlagChoice = 0;
+  photFlagClip = FLAG_IGNORE;
+  if ((Narg = get_argument (argc, argv, "-photflag"))) {
+    remove_argument (Narg, &argc, argv);
+    photFlagChoice  = strtol(argv[Narg], NULL, 0);
+    remove_argument (Narg, &argc, argv);
+    photFlagClip = FLAG_SKIP;
+  }
+  if ((Narg = get_argument (argc, argv, "+photflag"))) {
+    remove_argument (Narg, &argc, argv);
+    photFlagChoice  = strtol(argv[Narg], NULL, 0);
+    remove_argument (Narg, &argc, argv);
+    photFlagClip = FLAG_KEEP;
+  }
+
+  TimeSelect = FALSE;
+  if ((Narg = get_argument (argc, argv, "-time"))) {
+    remove_argument (Narg, &argc, argv);
+    if (!ohana_str_to_time (argv[Narg], &tzero)) {
+      gprint (GP_ERR, "syntax error\n");
+      return FALSE;
+    }
+    remove_argument (Narg, &argc, argv);
+    if (!ohana_str_to_dtime (argv[Narg], &trange)) { 
+      gprint (GP_ERR, "syntax error\n");
+      return FALSE;
+    }
+    remove_argument (Narg, &argc, argv);
+    if (trange < 0) {
+      trange = fabs (trange);
+      tzero -= trange;
+    }
+    TimeSelect = TRUE;
+  }
+  if ((Narg = get_argument (argc, argv, "-trange"))) {
+    remove_argument (Narg, &argc, argv);
+    if (!ohana_str_to_time (argv[Narg], &tzero)) { 
+      gprint (GP_ERR, "syntax error\n");
+      return FALSE;
+    }
+    remove_argument (Narg, &argc, argv);
+    if (!ohana_str_to_time (argv[Narg], &tend)) { 
+      gprint (GP_ERR, "syntax error\n");
+      return FALSE;
+    }
+    remove_argument (Narg, &argc, argv);
+    trange = tend - tzero;
+    if (trange < 0) {
+      trange = fabs (trange);
+      tzero -= trange;
+    }
+    TimeSelect = TRUE;
+  }
 
   LimExclude = FALSE;
@@ -74,5 +140,17 @@
 
   if (argc != 2) {
-    gprint (GP_ERR, "USAGE: pmeasure (-all) [-m M M] [-p photcode] [-ID ID] [-flag value] [-x]\n");
+    gprint (GP_ERR, "USAGE: pmeasure (-all) [-m M M]\n");
+    gprint (GP_ERR, " options:\n");
+    gprint (GP_ERR, " [-p photcode]\n");
+    gprint (GP_ERR, " [-photcode photcode]\n");
+    gprint (GP_ERR, " [-ID ID]\n");
+    gprint (GP_ERR, " [-dbflag value] : skip matches to these flags\n");
+    gprint (GP_ERR, " [+dbflag value] : keep matches to these flags\n");
+    gprint (GP_ERR, " [-photflag value] : skip matches to these flags\n");
+    gprint (GP_ERR, " [+photflag value] : keep matches to these flags\n");
+    gprint (GP_ERR, " [-time (start) (duration)]\n");
+    gprint (GP_ERR, " [-trange (start) (stop)]\n");
+    gprint (GP_ERR, " [-x] : exclude points larger / smaller than mag limits\n");
+    gprint (GP_ERR, " [-v] : verbose mode\n");
     return (FALSE);
   }
@@ -113,8 +191,10 @@
       m = catalog.average[i].measureOffset;
       for (k = 0; k < catalog.average[i].Nmeasure; k++) {
-	if (FlagClip) {
-	  flags = catalog.measure[m+k].dbFlags;
-	  if (!(flags & FlagChoice)) continue;
-	}
+	if ((dbFlagClip == FLAG_SKIP) &&  (catalog.measure[m+k].dbFlags & dbFlagChoice)) continue;
+	if ((dbFlagClip == FLAG_KEEP) && !(catalog.measure[m+k].dbFlags & dbFlagChoice)) continue;
+	if ((photFlagClip == FLAG_SKIP) &&  (catalog.measure[m+k].photFlags & photFlagChoice)) continue;
+	if ((photFlagClip == FLAG_KEEP) && !(catalog.measure[m+k].photFlags & photFlagChoice)) continue;
+	if (TimeSelect && (catalog.measure[m+k].t < tzero)) continue;
+	if (TimeSelect && (catalog.measure[m+k].t > tzero + trange)) continue;
 	if ((PhotcodeClip != -1) && (catalog.measure[m+k].photcode != PhotcodeClip)) continue;
 	mag = PhotCat (&catalog.measure[m+k]);
