Index: /branches/eam_branches/ipp-20150625/Ohana/src/kapa2/include/structures.h
===================================================================
--- /branches/eam_branches/ipp-20150625/Ohana/src/kapa2/include/structures.h	(revision 38737)
+++ /branches/eam_branches/ipp-20150625/Ohana/src/kapa2/include/structures.h	(revision 38738)
@@ -143,4 +143,6 @@
   double fx, dfx, fy, dfy;  /* axis location on graphic */
   double lweight;
+  double fLabelRange;
+  double fMinor;
   int color;
 } Axis;
Index: /branches/eam_branches/ipp-20150625/Ohana/src/kapa2/src/DrawFrame.c
===================================================================
--- /branches/eam_branches/ipp-20150625/Ohana/src/kapa2/src/DrawFrame.c	(revision 38737)
+++ /branches/eam_branches/ipp-20150625/Ohana/src/kapa2/src/DrawFrame.c	(revision 38738)
@@ -159,5 +159,5 @@
   double lrange, factor, mantis, fmantis, power;
 
-  *range = (axis[0].max - axis[0].min);
+  *range = axis->fLabelRange*(axis[0].max - axis[0].min);
   if (fabs(*range) < MIN_RANGE) {
     *range = (*range < 0) ? -MIN_RANGE : +MIN_RANGE;
@@ -183,9 +183,7 @@
   if ((fmantis >= 1.0) && (fmantis <  1.999)) {
     *major = 0.5 * power;
-    *minor = 0.1 * power;
     *nsignif = factor - 1;
     if (axis[0].areticks == 1) {
       *major = 0.25 * power;
-      *minor = 0.05 * power;
       *nsignif = factor - 2;
     }	  
@@ -193,9 +191,7 @@
   if ((fmantis >= 1.999) && (fmantis <  3.999)) {
     *major = 1.0 * power;
-    *minor = 0.2 * power;
     *nsignif = factor;
     if (axis[0].areticks == 1) {
       *major = 0.5 * power;
-      *minor = 0.1 * power;
       *nsignif = factor - 1;
     }	  
@@ -203,9 +199,7 @@
   if ((fmantis >= 3.999) && (fmantis <  5.999)) {
     *major = 1.0 * power;
-    *minor = 0.5 * power;
     *nsignif = factor;
     if (axis[0].areticks == 1) {
       *major = 1.0 * power;
-      *minor = 0.2 * power;
       *nsignif = factor;
     }	  
@@ -213,9 +207,7 @@
   if ((fmantis >= 5.999) && (fmantis <   7.999)) {
     *major = 2.0 * power;
-    *minor = 0.5 * power;
     *nsignif = factor;
     if (axis[0].areticks == 1) {
       *major = 1.0 * power;
-      *minor = 0.5 * power;
       *nsignif = factor;
     }	  
@@ -223,12 +215,11 @@
   if ((fmantis >= 7.999) && (fmantis <  10.000)) {
     *major = 2.5 * power;
-    *minor = 0.5 * power;
       *nsignif = factor - 1;
     if (axis[0].areticks == 1) {
       *major = 2.0 * power;
-      *minor = 0.5 * power;
       *nsignif = factor;
     }	  
   }
+  *minor = *major / axis->fMinor;
 }
 
@@ -237,5 +228,5 @@
   TickMarkData *ticks;
   double range, major, minor, first, value;
-  int i, NTICKS, done, ifirst, nsignif;
+  int i, NTICKS, done, nsignif;
 
   *nticks = 0;
@@ -254,35 +245,19 @@
   ALLOCATE (ticks, TickMarkData, NTICKS);
 
-  // value of the tick mark
-  if (axis->min > 0.0) {
-    double minValue = axis->min / minor;
-    if (minValue - (int)minValue < +0.1) {
-      ifirst = (int) minValue;
-    } else {
-      ifirst = (int) (minValue + 1);
-    }
-  } else {
-    double minValue = axis->min / minor;
-    if (minValue - (int)minValue > -0.1) {
-      ifirst = (int) minValue;
-    } else {
-      ifirst = (int) (minValue - 1);
-    }
-  }
-  // ifirst = (axis->min < 0.0) ? (axis->min/minor - 0.01) : (axis->min/minor + 0.01);
+  // value of the first tick mark (near axis->min)
+  double minValue = axis->min / minor;
+  int ifirst = (int) minValue;
+
+  if ((axis->min > 0.0) && (minValue - ifirst > +0.1)) {
+    ifirst ++;
+  } 
+  if ((axis->min < 0.0) && (minValue - ifirst < -0.1)) {
+    ifirst --;
+  }
   first = minor*ifirst;
   
-  // allow undershoot by 1 pixel
-  // double overshoot = (axis->min - first) * dPixels;
-  // if (overshoot > 0.5) {
-  //   if (range > 0) {
-  //     first += minor;
-  //   } else {
-  //     first -= minor;
-  //   }
-  // }
-
-  // XXX need to fix first and last value for printing label: currently prints first label
-  // too early & fails to do last label if too close
+  // only write the labels for the inner fRange of the axies
+  double minLabelValue = 0.5*(1.0 - 1.001*axis->fLabelRange)*(axis->max - axis->min) + axis->min;
+  double maxLabelValue = 0.5*(1.0 + 1.001*axis->fLabelRange)*(axis->max - axis->min) + axis->min;
 
   // loop to find the ticks
@@ -294,5 +269,6 @@
     ticks[i].IsMajor |= (fabs((int)((value + 0.5*minor)/major) - (value/major)) < 0.5*(minor/major));
     ticks[i].IsMajor |= (fabs((int)((value - 0.5*minor)/major) - (value/major)) < 0.5*(minor/major));
-    ticks[i].IsLabel = (ticks[i].IsMajor && axis->islabel);
+    int inLabelRange = (range > 0) ? (value >= minLabelValue) && (value <= maxLabelValue) : (value <= minLabelValue) && (value >= maxLabelValue);
+    ticks[i].IsLabel = inLabelRange && ticks[i].IsMajor && axis->islabel;
     ticks[i].value = value;
     ticks[i].nsignif = nsignif;
Index: /branches/eam_branches/ipp-20150625/Ohana/src/kapa2/src/Graphs.c
===================================================================
--- /branches/eam_branches/ipp-20150625/Ohana/src/kapa2/src/Graphs.c	(revision 38737)
+++ /branches/eam_branches/ipp-20150625/Ohana/src/kapa2/src/Graphs.c	(revision 38738)
@@ -23,4 +23,6 @@
     graph[0].axis[i].labelPad = NAN;
     graph[0].axis[i].pad = NAN;
+    graph[0].axis[i].fLabelRange = 1.0;
+    graph[0].axis[i].fMinor = 5.0;
   }    
   graph[0].data.ticktextPad = NAN;
@@ -35,4 +37,14 @@
   graph[0].data.padYm = NAN;
   graph[0].data.padYp = NAN;
+
+  graph[0].data.fLabelRangeXm = 1.0;
+  graph[0].data.fLabelRangeXp = 1.0;
+  graph[0].data.fLabelRangeYm = 1.0;
+  graph[0].data.fLabelRangeYp = 1.0;
+
+  graph[0].data.fMinorXm = 5.0;
+  graph[0].data.fMinorXp = 5.0;
+  graph[0].data.fMinorYm = 5.0;
+  graph[0].data.fMinorYp = 5.0;
 
   for (i = 0; i < 8; i++) {
Index: /branches/eam_branches/ipp-20150625/Ohana/src/kapa2/src/LoadFrame.c
===================================================================
--- /branches/eam_branches/ipp-20150625/Ohana/src/kapa2/src/LoadFrame.c	(revision 38737)
+++ /branches/eam_branches/ipp-20150625/Ohana/src/kapa2/src/LoadFrame.c	(revision 38738)
@@ -36,4 +36,14 @@
   graph[0].axis[2].labelPad = graph[0].data.labelPadXp;
   graph[0].axis[3].labelPad = graph[0].data.labelPadYp;
+
+  graph[0].axis[0].fLabelRange = graph[0].data.fLabelRangeXm;
+  graph[0].axis[1].fLabelRange = graph[0].data.fLabelRangeYm;
+  graph[0].axis[2].fLabelRange = graph[0].data.fLabelRangeXp;
+  graph[0].axis[3].fLabelRange = graph[0].data.fLabelRangeYp;
+
+  graph[0].axis[0].fMinor = graph[0].data.fMinorXm;
+  graph[0].axis[1].fMinor = graph[0].data.fMinorYm;
+  graph[0].axis[2].fMinor = graph[0].data.fMinorXp;
+  graph[0].axis[3].fMinor = graph[0].data.fMinorYp;
 
   for (i = 0; i < 4; i++) {
Index: /branches/eam_branches/ipp-20150625/Ohana/src/kapa2/src/SetGraphData.c
===================================================================
--- /branches/eam_branches/ipp-20150625/Ohana/src/kapa2/src/SetGraphData.c	(revision 38737)
+++ /branches/eam_branches/ipp-20150625/Ohana/src/kapa2/src/SetGraphData.c	(revision 38738)
@@ -27,4 +27,14 @@
   graph[0].axis[2].labelPad = graph[0].data.labelPadXp;
   graph[0].axis[3].labelPad = graph[0].data.labelPadYp;
+
+  graph[0].axis[0].fLabelRange = graph[0].data.fLabelRangeXm;
+  graph[0].axis[1].fLabelRange = graph[0].data.fLabelRangeYm;
+  graph[0].axis[2].fLabelRange = graph[0].data.fLabelRangeXp;
+  graph[0].axis[3].fLabelRange = graph[0].data.fLabelRangeYp;
+
+  graph[0].axis[0].fMinor = graph[0].data.fMinorXm;
+  graph[0].axis[1].fMinor = graph[0].data.fMinorYm;
+  graph[0].axis[2].fMinor = graph[0].data.fMinorXp;
+  graph[0].axis[3].fMinor = graph[0].data.fMinorYp;
 
   graph[0].axis[0].pad = graph[0].data.padXm;
Index: /branches/eam_branches/ipp-20150625/Ohana/src/libdvo/include/get_graphdata.h
===================================================================
--- /branches/eam_branches/ipp-20150625/Ohana/src/libdvo/include/get_graphdata.h	(revision 38737)
+++ /branches/eam_branches/ipp-20150625/Ohana/src/libdvo/include/get_graphdata.h	(revision 38738)
@@ -11,4 +11,6 @@
   double labelPadXm, labelPadYm, labelPadXp, labelPadYp;
   double padXm, padXp, padYm, padYp;
+  double fLabelRangeXm, fLabelRangeXp, fLabelRangeYm, fLabelRangeYp;
+  double fMinorXm, fMinorXp, fMinorYm, fMinorYp;
   Coords coords;
   int flipeast, flipnorth;
Index: /branches/eam_branches/ipp-20150625/Ohana/src/opihi/cmd.data/box.c
===================================================================
--- /branches/eam_branches/ipp-20150625/Ohana/src/opihi/cmd.data/box.c	(revision 38737)
+++ /branches/eam_branches/ipp-20150625/Ohana/src/opihi/cmd.data/box.c	(revision 38738)
@@ -142,4 +142,62 @@
   }
 
+  if ((N = get_argument (argc, argv, "-fminor"))) {
+    remove_argument (N, &argc, argv);
+    graphmode.fMinorXm = atof(argv[N]);
+    graphmode.fMinorXp = atof(argv[N]);
+    graphmode.fMinorYm = atof(argv[N]);
+    graphmode.fMinorYp = atof(argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+  if ((N = get_argument (argc, argv, "-xfminor"))) {
+    remove_argument (N, &argc, argv);
+    graphmode.fMinorXm = atof(argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+  if ((N = get_argument (argc, argv, "+xfminor"))) {
+    remove_argument (N, &argc, argv);
+    graphmode.fMinorXp = atof(argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+  if ((N = get_argument (argc, argv, "-yfminor"))) {
+    remove_argument (N, &argc, argv);
+    graphmode.fMinorYm = atof(argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+  if ((N = get_argument (argc, argv, "+yfminor"))) {
+    remove_argument (N, &argc, argv);
+    graphmode.fMinorYp = atof(argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+
+  if ((N = get_argument (argc, argv, "-flabel"))) {
+    remove_argument (N, &argc, argv);
+    graphmode.fLabelRangeXm = atof(argv[N]);
+    graphmode.fLabelRangeXp = atof(argv[N]);
+    graphmode.fLabelRangeYm = atof(argv[N]);
+    graphmode.fLabelRangeYp = atof(argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+  if ((N = get_argument (argc, argv, "-xflabel"))) {
+    remove_argument (N, &argc, argv);
+    graphmode.fLabelRangeXm = atof(argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+  if ((N = get_argument (argc, argv, "+xflabel"))) {
+    remove_argument (N, &argc, argv);
+    graphmode.fLabelRangeXp = atof(argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+  if ((N = get_argument (argc, argv, "-yflabel"))) {
+    remove_argument (N, &argc, argv);
+    graphmode.fLabelRangeYm = atof(argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+  if ((N = get_argument (argc, argv, "+yflabel"))) {
+    remove_argument (N, &argc, argv);
+    graphmode.fLabelRangeYp = atof(argv[N]);
+    remove_argument (N, &argc, argv);
+  }
+
   if (argc != 1) goto usage;
 
@@ -174,4 +232,12 @@
   gprint (GP_ERR, "         alternatively, set each axis independently with:\n");
   gprint (GP_ERR, "        -xpad, -ypad, +xpad, +ypad\n");
+  gprint (GP_ERR, "  \n");
+  gprint (GP_ERR, "  -fminor : set the number of minor ticks per major (all axes)\n");
+  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, "  -flabel : set the fraction of axis over which major ticks have labels (all axes)\n");
+  gprint (GP_ERR, "         alternatively, set each axis independently with:\n");
+  gprint (GP_ERR, "        -xflabel, -yflabel, +xflabel, +yflabel\n");
 
   return (FALSE);
