Index: trunk/Ohana/src/opihi/cmd.astro/coords.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.astro/coords.c	(revision 41378)
+++ trunk/Ohana/src/opihi/cmd.astro/coords.c	(revision 41379)
@@ -12,4 +12,27 @@
   Vector *xvec = NULL;
   Vector *yvec = NULL;
+
+  if ((N = get_argument (argc, argv, "-copy"))) {
+    Buffer *src = NULL;
+
+    remove_argument (N, &argc, argv);
+    if ((src = SelectBuffer (argv[N], OLDBUFFER, TRUE)) == NULL) goto escape;
+
+    if (!GetCoords (&coords, &src[0].header)) {
+      gprint (GP_ERR, "error getting WCS elements from src buffer %s\n", argv[N]);
+      return (FALSE);
+    }
+
+    remove_argument (N, &argc, argv);
+
+    if (argc != 2) goto syntax;
+
+    if ((buf = SelectBuffer (argv[1], OLDBUFFER, TRUE)) == NULL) goto escape;
+    if (!PutCoords (&coords, &buf[0].header)) {
+      gprint (GP_ERR, "error getting WCS elements from src buffer %s\n", argv[1]);
+      return (FALSE);
+    }
+    return TRUE;
+  }
 
   MOSAIC = NULL;
@@ -116,8 +139,10 @@
  syntax:
   gprint (GP_ERR, "USAGE: coords [buffer] (-c R D) | (-p X Y)\n");
-  gprint (GP_ERR, "only one of -p or -c can be used\n");
+  gprint (GP_ERR, "USAGE: coords [tgtbuffer] (-copy srcbuffer)\n");
+  gprint (GP_ERR, "only one of -p or -c or -copy can be used\n");
   gprint (GP_ERR, " -p : from pixels to ra/dec\n");
   gprint (GP_ERR, " -c : from ra/dec to pixels\n");
   gprint (GP_ERR, " coordinates are in degrees\n");
+  gprint (GP_ERR, " -copy : copy coordinate WCS keywords from srcbuffer to tgtbuffer\n");
  escape:
   if (MOSAIC != NULL) free (MOSAIC);
Index: trunk/Ohana/src/opihi/cmd.astro/init.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.astro/init.c	(revision 41378)
+++ trunk/Ohana/src/opihi/cmd.astro/init.c	(revision 41379)
@@ -34,4 +34,5 @@
 int imsub                   PROTO((int, char **));
 int jdtolst                 PROTO((int, char **));
+int mjdtolst                PROTO((int, char **));
 int medianmap               PROTO((int, char **));
 int galsectors              PROTO((int, char **));
@@ -105,4 +106,5 @@
   {1, "imsub",       imsub,        "subtract function"},
   {1, "jdtolst",     jdtolst,      "JD to LST conversion"},
+  {1, "mjdtolst",    mjdtolst,     "MJD to LST conversion"},
   {1, "medianmap",   medianmap,    "small median image"},
   {1, "mkgauss",     mkgauss,      "generate a 2-D gaussian centered in image"},
Index: trunk/Ohana/src/opihi/cmd.astro/jdtolst.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.astro/jdtolst.c	(revision 41378)
+++ trunk/Ohana/src/opihi/cmd.astro/jdtolst.c	(revision 41379)
@@ -23,10 +23,10 @@
   char *long_str = get_variable ("LONGITUDE");
   if (!long_str) {
-    gprint (GP_ERR, "please define $LONGITUDE\n");
+    gprint (GP_ERR, "please define $LONGITUDE (decimal hours, west positive)\n");
     FREE (OutputName);
     return FALSE;
   }
   double longitude = atof (long_str);
-  if (VERBOSE) gprint (GP_ERR, "using longitude of %f\n", longitude);
+  if (VERBOSE) gprint (GP_ERR, "using longitude of %f (decimal hours, west positive)\n", longitude);
   free (long_str);
 
@@ -87,4 +87,97 @@
   gprint (GP_ERR, "  (JD) may be a number or a vector.\n");
   gprint (GP_ERR, "  if (JD) is a vector, (output) must be supplied and is used as the name of the output vector \n");
+  gprint (GP_ERR, "  $LONGITUDE must be set (decimal hours, west positive)\n");
   return (FALSE);
 }
+
+# define MJD_OFFSET 2400000.5
+
+int mjdtolst (int argc, char **argv) {
+
+  int N;
+  Vector *mjdvec, *outvec;
+
+  int VERBOSE = FALSE;
+  VERBOSE = FALSE;
+  if ((N = get_argument (argc, argv, "-v"))) {
+    VERBOSE = TRUE;
+    remove_argument (N, &argc, argv);
+  }
+
+  char *OutputName = NULL;
+  if ((N = get_argument (argc, argv, "-output"))) {
+    remove_argument (N, &argc, argv);
+    OutputName = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+  if (argc != 2) goto syntax;
+
+  char *long_str = get_variable ("LONGITUDE");
+  if (!long_str) {
+    gprint (GP_ERR, "please define $LONGITUDE (decimal hours, west positive)\n");
+    FREE (OutputName);
+    return FALSE;
+  }
+  double longitude = atof (long_str);
+  if (VERBOSE) gprint (GP_ERR, "using longitude of %f (decimal hours, west positive)\n", longitude);
+  free (long_str);
+
+  if (ISNUM(argv[1][0])) {
+
+    char *endptr;
+    double mjd = strtod (argv[1], &endptr);
+    if (endptr == argv[1]) {
+      gprint (GP_ERR, "error interpretting %s as a number\n", argv[1]);
+      FREE (OutputName);
+      return FALSE;
+    }
+
+    double lst = ohana_lst (mjd + MJD_OFFSET, longitude);
+
+    if (OutputName) {
+      set_variable (OutputName, lst);
+      FREE (OutputName);
+      return (TRUE);
+    }
+    
+    gprint (GP_ERR, "lst: %f\n", lst);
+    return (TRUE);
+  }
+
+  if (!OutputName) {
+    gprint (GP_ERR, " if (MJD) is a vector, -output must be supplied\n");
+    return FALSE;
+  }
+
+  if ((mjdvec = SelectVector (argv[1], OLDVECTOR, TRUE)) == NULL) {
+    FREE (OutputName);
+    return FALSE;
+  }
+
+  if (mjdvec->type != OPIHI_FLT) {
+    gprint (GP_ERR, " (MJD) must be of type FLOAT\n");
+    FREE (OutputName);
+    return FALSE;
+  }
+
+  if ((outvec = SelectVector (OutputName, ANYVECTOR, TRUE)) == NULL) {
+    FREE (OutputName);
+    return FALSE;
+  }
+
+  ResetVector (outvec, OPIHI_FLT, mjdvec[0].Nelements);
+
+  for (int i = 0; i < mjdvec[0].Nelements; i++) {
+    double lst = ohana_lst (mjdvec->elements.Flt[i] + MJD_OFFSET, longitude);
+    outvec->elements.Flt[i] = lst;
+  }
+  FREE (OutputName);
+  return TRUE;
+
+ syntax:
+  gprint (GP_ERR, "USAGE: mjdtolst (MJD) [-output name]\n");
+  gprint (GP_ERR, "  (MJD) may be a number or a vector.\n");
+  gprint (GP_ERR, "  if (MJD) is a vector, (output) must be supplied and is used as the name of the output vector \n");
+  gprint (GP_ERR, "  $LONGITUDE must be set (decimal hours, west positive)\n");
+  return (FALSE);
+}
Index: trunk/Ohana/src/opihi/cmd.data/box.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/box.c	(revision 41378)
+++ trunk/Ohana/src/opihi/cmd.data/box.c	(revision 41379)
@@ -171,4 +171,33 @@
   }
 
+  if ((N = get_argument (argc, argv, "-dmajor"))) {
+    remove_argument (N, &argc, argv);
+    graphmode.dMajorXm = atof(argv[N]);
+    graphmode.dMajorXp = atof(argv[N]);
+    graphmode.dMajorYm = atof(argv[N]);
+    graphmode.dMajorYp = atof(argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+  if ((N = get_argument (argc, argv, "-xdmajor"))) {
+    remove_argument (N, &argc, argv);
+    graphmode.dMajorXm = atof(argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+  if ((N = get_argument (argc, argv, "+xdmajor"))) {
+    remove_argument (N, &argc, argv);
+    graphmode.dMajorXp = atof(argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+  if ((N = get_argument (argc, argv, "-ydmajor"))) {
+    remove_argument (N, &argc, argv);
+    graphmode.dMajorYm = atof(argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+  if ((N = get_argument (argc, argv, "+ydmajor"))) {
+    remove_argument (N, &argc, argv);
+    graphmode.dMajorYp = atof(argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+
   if ((N = get_argument (argc, argv, "-flabel"))) {
     remove_argument (N, &argc, argv);
@@ -257,8 +286,9 @@
   gprint (GP_ERR, "    +y refers to the right y-axis, \n");
   gprint (GP_ERR, "  \n");
-  gprint (GP_ERR, "  -ticks [NNNN]  : turn on (1), off (0), or use default for ticks\n");
-  gprint (GP_ERR, "  -labels [NNNN] : turn on (1), off (0), or use default for label\n");
-  gprint (GP_ERR, "  -axis [NNNN]   : turn on (1), off (0), or use default for axis\n");
+  gprint (GP_ERR, "  -ticks [NNNN]  : turn on (1), off (0), or use default (2) for ticks\n");
+  gprint (GP_ERR, "  -labels [NNNN] : turn on (1), off (0), or use default (2) for label\n");
+  gprint (GP_ERR, "  -axis [NNNN]   : turn on (1), off (0), or use default (2) for axis\n");
   gprint (GP_ERR, "    the order for the NNNN values in the above options is: -x, -y, +x, +y\n");
+  gprint (GP_ERR, "    for ticks, 1, 2, 3 give fewer values (larger tick spacing)\n");
   gprint (GP_ERR, "  \n");
   gprint (GP_ERR, "  -tickpad : set the spacing between the ticks and the tick text \n");
@@ -274,4 +304,8 @@
   gprint (GP_ERR, "         alternatively, set each axis independently with:\n");
   gprint (GP_ERR, "        -xfminor, -yfminor, +xfminor, +yfminor\n");
+  gprint (GP_ERR, "  \n");
+  gprint (GP_ERR, "  -dmajor : set the major tixk spacing (all axes)\n");
+  gprint (GP_ERR, "         alternatively, set each axis independently with:\n");
+  gprint (GP_ERR, "        -xdmajor, -ydmajor, +xdmajor, +ydmajor\n");
   gprint (GP_ERR, "  \n");
   gprint (GP_ERR, "  -flabel : set the fraction of axis over which major ticks have labels (all axes)\n");
Index: trunk/Ohana/src/opihi/cmd.data/list_header.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/list_header.c	(revision 41378)
+++ trunk/Ohana/src/opihi/cmd.data/list_header.c	(revision 41379)
@@ -1,3 +1,5 @@
 # include "data.h"
+
+# define SKIP_HEADER(NAME) { if (!strncmp(line, NAME, strlen(NAME))) continue; }
 
 int header (int argc, char **argv) {
@@ -16,11 +18,69 @@
     LOADHEAD = TRUE;
   }
+  if ((N = get_argument (argc, argv, "-file"))) {
+    remove_argument (N, &argc, argv);
+    strcpy (filename, argv[N]);
+    remove_argument (N, &argc, argv);
+    LOADHEAD = TRUE;
+  }
+
+  char *COPYHEAD = NULL;
+  if ((N = get_argument (argc, argv, "-copy"))) {
+    if (LOADHEAD) {
+      gprint (GP_ERR, "-copy and -w are incompatible\n");
+      return (FALSE);
+    }
+    remove_argument (N, &argc, argv);
+    COPYHEAD = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+  }
 
   if (argc != 2) {
-    gprint (GP_ERR, "USAGE: header <buffer> [-w filename]\n");
+    gprint (GP_ERR, "USAGE: header <buffer> [-w filename] [-file filename] [-copy buffer]\n");
+    gprint (GP_ERR, "  -file / -w : replace buffer header with contents from file (PHU only)\n");
+    gprint (GP_ERR, "  -copy : replace buffer header with contents of buffer\n");
     return (FALSE);
   }
 
   if ((buf = SelectBuffer (argv[1], OLDBUFFER, TRUE)) == NULL) return (FALSE);
+
+  if (COPYHEAD) {
+    Buffer *src = NULL;
+    if ((src = SelectBuffer (COPYHEAD, OLDBUFFER, TRUE)) == NULL) return (FALSE);
+
+    // loop over all lines in the header and copy one-by-one
+    // skip the special words:
+    
+    for (int i = 0; TRUE; i++) {
+      char *line = gfits_header_lineno (&src[0].header, i);
+      if (!line) break;
+
+      // skip special keywords
+      SKIP_HEADER ("SIMPLE");
+      SKIP_HEADER ("SIMPLE");
+      SKIP_HEADER ("BITPIX");
+      SKIP_HEADER ("NAXIS");
+      SKIP_HEADER ("EXTEND");
+      SKIP_HEADER ("UNSIGN");
+      SKIP_HEADER ("BSCALE");
+      SKIP_HEADER ("BZERO");
+      SKIP_HEADER ("NAXIS1");
+      SKIP_HEADER ("NAXIS2");
+      SKIP_HEADER ("NAXIS3");
+      SKIP_HEADER ("NAXIS4");
+      SKIP_HEADER ("NAXIS5");
+      SKIP_HEADER ("NAXIS6");
+      SKIP_HEADER ("NAXIS7");
+      SKIP_HEADER ("NAXIS8");
+      SKIP_HEADER ("NAXIS9");
+      SKIP_HEADER ("NAXIS10");
+      SKIP_HEADER ("PCOUNT");
+      SKIP_HEADER ("GCOUNT");
+
+      gfits_header_append_line_raw (&buf[0].header, line);
+    }
+    return TRUE;
+
+  }
 
   if (LOADHEAD) {
Index: trunk/Ohana/src/opihi/dvo/avperiodomatch.c
===================================================================
--- trunk/Ohana/src/opihi/dvo/avperiodomatch.c	(revision 41378)
+++ trunk/Ohana/src/opihi/dvo/avperiodomatch.c	(revision 41379)
@@ -367,4 +367,5 @@
   gprint (GP_ERR, "USAGE: avperiodomatch (output) (RA) (DEC) (RADIUS) -where-measure (expression)\n");
   gprint (GP_ERR, "  NOTE: the optional -where-measure (expression) MUST come after the required arguments\n");
+  gprint (GP_ERR, "   RADIUS is in arcseconds\n");
   return (FALSE);
 }
