IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Sep 30, 2012, 8:03:14 AM (14 years ago)
Author:
eugene
Message:

add "where" option to plot, zplot, zcplot

Location:
branches/eam_branches/ipp-20120905/Ohana/src/opihi
Files:
18 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/ipp-20120905/Ohana/src/opihi/cmd.astro/cgrid.c

    r30611 r34490  
    279279  graphmode.ptype = 100; /* connect a pair */
    280280  graphmode.etype = 0;
    281   PlotVectorPair (kapa, &Xvec, &Yvec, &graphmode);
     281  PlotVectorPair (kapa, &Xvec, &Yvec, NULL, &graphmode);
    282282
    283283  free (Xvec.elements.Ptr);
  • branches/eam_branches/ipp-20120905/Ohana/src/opihi/cmd.astro/cplot.c

    r21153 r34490  
    7878
    7979  graphmode.etype = 0;
    80   PlotVectorPair (kapa, &Xvec, &Yvec, &graphmode);
     80  PlotVectorPair (kapa, &Xvec, &Yvec, NULL, &graphmode);
    8181 
    8282  free (Xvec.elements.Ptr);
  • branches/eam_branches/ipp-20120905/Ohana/src/opihi/cmd.astro/czplot.c

    r31667 r34490  
    7676  graphmode.size = -1; /* point size determined by Zvec */
    7777  graphmode.etype = 0;
    78   PlotVectorTriplet (kapa, &Xvec, &Yvec, &Zvec, &graphmode);
     78  PlotVectorTriplet (kapa, &Xvec, &Yvec, &Zvec, NULL, &graphmode);
    7979
    8080  free (Xvec.elements.Flt);
  • branches/eam_branches/ipp-20120905/Ohana/src/opihi/cmd.data/grid.c

    r26258 r34490  
    178178  graphmode.ptype = 100; /* connect a pair */
    179179  graphmode.etype = 0;
    180   PlotVectorPair (kapa, &Xvec, &Yvec, &graphmode);
     180  PlotVectorPair (kapa, &Xvec, &Yvec, NULL, &graphmode);
    181181
    182182  free (Xvec.elements.Flt);
  • branches/eam_branches/ipp-20120905/Ohana/src/opihi/cmd.data/plot.c

    r32346 r34490  
    33int plot (int argc, char **argv) {
    44 
    5   int kapa, N, Npts;
     5  char *out;
     6  int kapa, N, Npts, valid, size, i;
    67  Graphdata graphmode;
    78  Vector *xvec, *yvec, *dxmvec, *dxpvec, *dymvec, *dypvec;
     
    3233  }
    3334
    34   if (argc != 3) {
     35  valid  = (argc == 3);
     36  valid |= (argc > 4) && !strcmp (argv[3], "where");
     37  if (!valid) {
    3538    gprint (GP_ERR, "USAGE: plot <x> <y> [style]\n");
     39    gprint (GP_ERR, "   OR: plot <x> <y> [style] where (condition)\n");
    3640    return (FALSE);
     41  }
     42
     43  // tvec is used for logical test (truth vector)
     44  Vector *tvec = NULL;
     45  char *mask = NULL;
     46  if (argc > 4) {
     47    out = dvomath (argc - 4, &argv[4], &size, 1);
     48    if (out == NULL) {
     49      print_error ();
     50      return FALSE;
     51    }
     52    if ((tvec = SelectVector (out, OLDVECTOR, TRUE)) == NULL) {
     53      gprint (GP_ERR, " invalid logic result\n");
     54      DeleteNamedVector (out);
     55      free (out);
     56      return (FALSE);
     57    }
    3758  }
    3859
     
    5374    return (FALSE);
    5475  }
     76  if (tvec && tvec[0].Nelements != yvec[0].Nelements) {
     77    gprint (GP_ERR, "logic test vector not the same length as data vectors\n");
     78    return (FALSE);
     79  }
    5580  if (dypvec && (dypvec->Nelements != xvec->Nelements)) goto mismatch;
    5681  if (dymvec && (dymvec->Nelements != xvec->Nelements)) goto mismatch;
     
    5984
    6085  Npts = xvec[0].Nelements;
    61   if (Npts == 0) return (TRUE);
     86  if (Npts == 0) {
     87    if (tvec) DeleteVector (tvec);
     88    return (TRUE);
     89  }
     90
     91  if (tvec) {
     92    Npts = 0;
     93    ALLOCATE (mask, char, tvec->Nelements);
     94    for (i = 0; i < tvec->Nelements; i++) {
     95      mask[i] = (tvec->type == OPIHI_FLT) ? (tvec->elements.Flt[i] == 0.0) : (tvec->elements.Int[i] == 0.0);
     96      if (!mask[i]) Npts ++;
     97    }
     98    if (Npts == 0) {
     99      DeleteVector (tvec);
     100      free (mask);
     101      return TRUE;
     102    }
     103  }
    62104
    63105  if (!KapaPrepPlot (kapa, Npts, &graphmode)) return (FALSE);
    64106 
    65   PlotVectorSingle (kapa, xvec, "x");
    66   PlotVectorSingle (kapa, yvec, "y");
     107  PlotVectorSingle (kapa, xvec, mask, "x");
     108  PlotVectorSingle (kapa, yvec, mask, "y");
    67109  if (graphmode.etype & 0x01) {
    68     PlotVectorSingle (kapa, dymvec, "dym");
    69     PlotVectorSingle (kapa, dypvec, "dyp");
     110    PlotVectorSingle (kapa, dymvec, mask, "dym");
     111    PlotVectorSingle (kapa, dypvec, mask, "dyp");
    70112  }
    71113  if (graphmode.etype & 0x02) {
    72     PlotVectorSingle (kapa, dxmvec, "dxm");
    73     PlotVectorSingle (kapa, dxpvec, "dxp");
     114    PlotVectorSingle (kapa, dxmvec, mask, "dxm");
     115    PlotVectorSingle (kapa, dxpvec, mask, "dxp");
     116  }
     117
     118  if (tvec) {
     119    free (mask);
     120    DeleteVector (tvec);
    74121  }
    75122  return (TRUE);
  • branches/eam_branches/ipp-20120905/Ohana/src/opihi/cmd.data/zplot.c

    r31667 r34490  
    33int zplot (int argc, char **argv) {
    44 
    5   int i, kapa;
     5  char *outname;
     6  int i, kapa, valid, size;
    67  opihi_flt *out;
    78  double min, range;
     
    1112  if (!style_args (&graphmode, &argc, argv, &kapa)) return (FALSE);
    1213
    13   if (argc != 6) {
     14  valid  = (argc == 6);
     15  valid |= (argc > 7) && !strcmp (argv[6], "where");
     16  if (!valid) {
    1417    gprint (GP_ERR, "USAGE: zplot <x> <y> <z> min max\n");
     18    gprint (GP_ERR, "   OR: zplot <x> <y> <z> min max where (condition)\n");
    1519    return (FALSE);
    1620  }
     
    1822  min = atof(argv[4]);
    1923  range = atof(argv[5]) - min;
     24
     25  // tvec is used for logical test (truth vector)
     26  Vector *tvec = NULL;
     27  char *mask = NULL;
     28  if (argc > 7) {
     29    outname = dvomath (argc - 7, &argv[7], &size, 1);
     30    if (outname == NULL) {
     31      print_error ();
     32      return FALSE;
     33    }
     34    if ((tvec = SelectVector (outname, OLDVECTOR, TRUE)) == NULL) {
     35      gprint (GP_ERR, " invalid logic result\n");
     36      DeleteNamedVector (outname);
     37      free (outname);
     38      return (FALSE);
     39    }
     40  }
    2041
    2142  /* find vectors */
     
    2950  if (xvec[0].Nelements != zvec[0].Nelements) {
    3051    gprint (GP_ERR, "vectors %s and %s not the same length\n", argv[1], argv[3]);
     52    return (FALSE);
     53  }
     54  if (tvec && tvec[0].Nelements != yvec[0].Nelements) {
     55    gprint (GP_ERR, "logic test vector not the same length as data vectors\n");
    3156    return (FALSE);
    3257  }
     
    4671  }
    4772
     73  if (tvec) {
     74    ALLOCATE (mask, char, tvec->Nelements);
     75    for (i = 0; i < tvec->Nelements; i++) {
     76      mask[i] = (tvec->type == OPIHI_FLT) ? (tvec->elements.Flt[i] == 0.0) : (tvec->elements.Int[i] == 0.0);
     77    }
     78  }
     79
    4880  /* point size determined by Zvec */
    4981  graphmode.style = 2; /* plot points */
    5082  graphmode.size = -1; /* point size determined by Zvec */
    5183  graphmode.etype = 0; /* no errorbars */
    52   PlotVectorTriplet (kapa, xvec, yvec, &Zvec, &graphmode);
     84  PlotVectorTriplet (kapa, xvec, yvec, &Zvec, mask, &graphmode);
    5385
    5486  free (Zvec.elements.Ptr);
     87  if (mask) free (mask);
     88  DeleteNamedVector (outname);
    5589
    5690  return (TRUE);
     
    6094int zcplot (int argc, char **argv) {
    6195 
    62   int i, kapa;
     96  char *outname;
     97  int i, kapa, valid, size;
    6398  opihi_flt *out;
    6499  double min, range;
     
    68103  if (!style_args (&graphmode, &argc, argv, &kapa)) return (FALSE);
    69104
    70   if (argc != 6) {
    71     gprint (GP_ERR, "USAGE: zplot <x> <y> <z> min max\n");
     105  valid  = (argc == 6);
     106  valid |= (argc > 7) && !strcmp (argv[6], "where");
     107  if (!valid) {
     108    gprint (GP_ERR, "USAGE: zcplot <x> <y> <z> min max\n");
     109    gprint (GP_ERR, "   OR: zcplot <x> <y> <z> min max where (condition)\n");
    72110    return (FALSE);
    73111  }
     
    75113  min = atof(argv[4]);
    76114  range = atof(argv[5]) - min;
     115
     116  // tvec is used for logical test (truth vector)
     117  Vector *tvec = NULL;
     118  char *mask = NULL;
     119  if (argc > 7) {
     120    outname = dvomath (argc - 7, &argv[7], &size, 1);
     121    if (outname == NULL) {
     122      print_error ();
     123      return FALSE;
     124    }
     125    if ((tvec = SelectVector (outname, OLDVECTOR, TRUE)) == NULL) {
     126      gprint (GP_ERR, " invalid logic result\n");
     127      DeleteNamedVector (outname);
     128      free (outname);
     129      return (FALSE);
     130    }
     131  }
    77132
    78133  /* find vectors */
     
    86141  if (xvec[0].Nelements != zvec[0].Nelements) {
    87142    gprint (GP_ERR, "vectors %s and %s not the same length\n", argv[1], argv[3]);
     143    return (FALSE);
     144  }
     145  if (tvec && tvec[0].Nelements != yvec[0].Nelements) {
     146    gprint (GP_ERR, "logic test vector not the same length as data vectors\n");
    88147    return (FALSE);
    89148  }
     
    103162  }
    104163
     164  if (tvec) {
     165    ALLOCATE (mask, char, tvec->Nelements);
     166    for (i = 0; i < tvec->Nelements; i++) {
     167      mask[i] = (tvec->type == OPIHI_FLT) ? (tvec->elements.Flt[i] == 0.0) : (tvec->elements.Int[i] == 0.0);
     168    }
     169  }
     170
    105171  /* point size determined by Zvec */
    106172  graphmode.style = 2; /* plot points */
    107173  graphmode.color = -1; /* point color determined by Zvec */
    108174  graphmode.etype = 0; /* no errorbars */
    109   PlotVectorTriplet (kapa, xvec, yvec, &Zvec, &graphmode);
     175  PlotVectorTriplet (kapa, xvec, yvec, &Zvec, mask, &graphmode);
    110176
    111177  free (Zvec.elements.Ptr);
     178  if (mask) free (mask);
     179  DeleteNamedVector (outname);
    112180
    113181  return (TRUE);
  • branches/eam_branches/ipp-20120905/Ohana/src/opihi/dvo/fitcolors.c

    r28241 r34490  
    311311        KapaBox (kapa, &graphdata);
    312312
    313         PlotVectorPair (kapa, xvec, yvec, &graphdata);
     313        PlotVectorPair (kapa, xvec, yvec, NULL, &graphdata);
    314314
    315315        for (i = 0; i < 11; i++) {
  • branches/eam_branches/ipp-20120905/Ohana/src/opihi/dvo/images.c

    r34088 r34490  
    350350    graphmode.ptype = 100; /* connect pairs of points */
    351351    graphmode.etype = 0;
    352     PlotVectorPair (kapa, &Xvec, &Yvec, &graphmode);
     352    PlotVectorPair (kapa, &Xvec, &Yvec, NULL, &graphmode);
    353353  }
    354354
  • branches/eam_branches/ipp-20120905/Ohana/src/opihi/dvo/imbox.c

    r27435 r34490  
    123123    graphmode.ptype = 100; /* connect pairs of points */
    124124    graphmode.etype = 0;
    125     PlotVectorPair (kapa, &Xvec, &Yvec, &graphmode);
     125    PlotVectorPair (kapa, &Xvec, &Yvec, NULL, &graphmode);
    126126  }
    127127
  • branches/eam_branches/ipp-20120905/Ohana/src/opihi/dvo/imdense.c

    r31635 r34490  
    6565    graphmode.style = 2; /* points */
    6666    graphmode.etype = 0;
    67     PlotVectorPair (kapa, &Xvec, &Yvec, &graphmode);
     67    PlotVectorPair (kapa, &Xvec, &Yvec, NULL, &graphmode);
    6868  }
    6969
  • branches/eam_branches/ipp-20120905/Ohana/src/opihi/dvo/imstats.c

    r31635 r34490  
    5454  graphmode.style = 2;
    5555  graphmode.etype = 0;
    56   PlotVectorPair (kapa, &Xvec, &Yvec, &graphmode);
     56  PlotVectorPair (kapa, &Xvec, &Yvec, NULL, &graphmode);
    5757 
    5858  free (Xvec.elements.Flt);
  • branches/eam_branches/ipp-20120905/Ohana/src/opihi/dvo/lcurve.c

    r34088 r34490  
    160160    PlotVectorPairErrors (kapa, &Xvec, &Yvec, &dYvec, &graphmode);
    161161  } else {
    162     PlotVectorPair (kapa, &Xvec, &Yvec, &graphmode);
     162    PlotVectorPair (kapa, &Xvec, &Yvec, NULL, &graphmode);
    163163  }
    164164
  • branches/eam_branches/ipp-20120905/Ohana/src/opihi/dvo/procks.c

    r20936 r34490  
    113113  graphmode.style = 2; /* set style to points */
    114114  graphmode.etype = 0; /* no errorbars */
    115   PlotVectorPair (kapa, &Xvec, &Yvec, &graphmode);
     115  PlotVectorPair (kapa, &Xvec, &Yvec, NULL, &graphmode);
    116116
    117117  /* now plot vectors between two extrema */
     
    146146  graphmode.etype = 0; /* no errorbars */
    147147
    148   PlotVectorPair (kapa, &Xvec, &Yvec, &graphmode);
     148  PlotVectorPair (kapa, &Xvec, &Yvec, NULL, &graphmode);
    149149
    150150  free (Xvec.elements.Flt);
  • branches/eam_branches/ipp-20120905/Ohana/src/opihi/dvo/showtile.c

    r20936 r34490  
    8686    graphmode.ptype = 100; /* connect pairs of points */
    8787    graphmode.etype = 0;
    88     PlotVectorPair (kapa, &Xvec, &Yvec, &graphmode);
     88    PlotVectorPair (kapa, &Xvec, &Yvec, NULL, &graphmode);
    8989  }
    9090
  • branches/eam_branches/ipp-20120905/Ohana/src/opihi/dvo/simage.c

    r34088 r34490  
    151151  graphmode.etype = 0;
    152152
    153   PlotVectorTriplet (kapa, &Xvec, &Yvec, &Zvec, &graphmode);
     153  PlotVectorTriplet (kapa, &Xvec, &Yvec, &Zvec, NULL, &graphmode);
    154154
    155155  free (Xvec.elements.Flt);
  • branches/eam_branches/ipp-20120905/Ohana/src/opihi/dvo/skycat.c

    r34088 r34490  
    100100    graphmode.ptype = 100; /* connect pairs of points */
    101101    graphmode.etype = 0;
    102     PlotVectorPair (kapa, &Xvec, &Yvec, &graphmode);
     102    PlotVectorPair (kapa, &Xvec, &Yvec, NULL, &graphmode);
    103103  }
    104104
  • branches/eam_branches/ipp-20120905/Ohana/src/opihi/include/display.h

    r31636 r34490  
    77
    88/*** kapa graph functions ***/
    9 int           PlotVectorSingle      PROTO((int kapa, Vector *vec, char *mode));
    10 int           PlotVectorPair        PROTO((int kapa, Vector *xVec, Vector *yVec, Graphdata *graphmode));
     9int           PlotVectorSingle      PROTO((int kapa, Vector *vec, char *mask, char *mode));
     10int           PlotVectorPair        PROTO((int kapa, Vector *xVec, Vector *yVec, char *mask, Graphdata *graphmode));
    1111int           PlotVectorPairErrors  PROTO((int kapa, Vector *xVec, Vector *yVec, Vector *dyValues, Graphdata *graphmode));
    12 int           PlotVectorTriplet     PROTO((int kapa, Vector *xVec, Vector *yVec, Vector *zValues, Graphdata *graphmode));
     12
     13int           PlotVectorTriplet     PROTO((int kapa, Vector *xVec, Vector *yVec, Vector *zValues, char *mask, Graphdata *graphmode));
    1314// int           GetGraphData          PROTO((Graphdata *data, int *kapa, char *name));
    1415int           GetGraph              PROTO((Graphdata *data, int *kapa, char *name));
  • branches/eam_branches/ipp-20120905/Ohana/src/opihi/lib.data/PlotVectors.c

    r20936 r34490  
    11# include "display.h"
    22
    3 int PlotVectorSingle (int kapa, Vector *vec, char *mode) {
    4 
    5   int i, Npts;
     3int PlotVectorSingle (int kapa, Vector *vec, char *mask, char *mode) {
     4
     5  int i, Npts, Nout;
    66  float *temp;
    77
     
    99  ALLOCATE (temp, float, Npts);
    1010
     11  Nout = 0;
    1112  if (vec->type == OPIHI_FLT) {
    1213    opihi_flt *value = vec->elements.Flt;
    1314    for (i = 0; i < Npts; i++) {
    14       temp[i] = value[i];
     15      if (mask && mask[i]) continue;
     16      temp[Nout] = value[i];
     17      Nout ++;
    1518    }
    1619  } else {
    1720    opihi_int *value = vec->elements.Int;
    1821    for (i = 0; i < Npts; i++) {
    19       temp[i] = value[i];
    20     }
    21   }
    22   KapaPlotVector (kapa, Npts, temp, mode);
    23 
    24   free (temp);
    25 
    26   return (TRUE);
    27 }
    28 
    29 int PlotVectorPair (int kapa, Vector *xVec, Vector *yVec, Graphdata *graphmode) {
    30 
    31   int i, Npts;
     22      if (mask && mask[i]) continue;
     23      temp[Nout] = value[i];
     24      Nout ++;
     25    }
     26  }
     27  KapaPlotVector (kapa, Nout, temp, mode);
     28
     29  free (temp);
     30
     31  return (TRUE);
     32}
     33
     34int PlotVectorPair (int kapa, Vector *xVec, Vector *yVec, char *mask, Graphdata *graphmode) {
     35
     36  int i, Npts, Nout;
    3237  float *temp;
    3338
     
    3742  ALLOCATE (temp, float, Npts);
    3843
    39   KapaPrepPlot (kapa, Npts, graphmode);
    40 
     44  Nout = 0;
    4145  if (xVec->type == OPIHI_FLT) {
    4246    opihi_flt *value = xVec->elements.Flt;
    4347    for (i = 0; i < Npts; i++) {
    44       temp[i] = value[i];
     48      if (mask && mask[i]) continue;
     49      temp[Nout] = value[i];
     50      Nout ++;
    4551    }
    4652  } else {
    4753    opihi_int *value = xVec->elements.Int;
    4854    for (i = 0; i < Npts; i++) {
    49       temp[i] = value[i];
    50     }
    51   }
    52   KapaPlotVector (kapa, Npts, temp, "x");
    53 
     55      if (mask && mask[i]) continue;
     56      temp[Nout] = value[i];
     57      Nout ++;
     58    }
     59  }
     60  KapaPrepPlot (kapa, Nout, graphmode);
     61  KapaPlotVector (kapa, Nout, temp, "x");
     62
     63  Nout = 0;
    5464  if (yVec->type == OPIHI_FLT) {
    5565    opihi_flt *value = yVec->elements.Flt;
    5666    for (i = 0; i < Npts; i++) {
    57       temp[i] = value[i];
     67      if (mask && mask[i]) continue;
     68      temp[Nout] = value[i];
     69      Nout ++;
    5870    }
    5971  } else {
    6072    opihi_int *value = yVec->elements.Int;
    6173    for (i = 0; i < Npts; i++) {
    62       temp[i] = value[i];
    63     }
    64   }
    65   KapaPlotVector (kapa, Npts, temp, "y");
    66 
    67   free (temp);
    68 
    69   return (TRUE);
    70 }
    71 
    72 int PlotVectorTriplet (int kapa, Vector *xVec, Vector *yVec, Vector *zVec, Graphdata *graphmode) {
    73 
    74   int i, Npts;
     74      if (mask && mask[i]) continue;
     75      temp[Nout] = value[i];
     76      Nout ++;
     77    }
     78  }
     79  KapaPlotVector (kapa, Nout, temp, "y");
     80
     81  free (temp);
     82
     83  return (TRUE);
     84}
     85
     86int PlotVectorTriplet (int kapa, Vector *xVec, Vector *yVec, Vector *zVec, char *mask, Graphdata *graphmode) {
     87
     88  int i, Npts, Nout;
    7589  float *temp;
    7690
     
    8195  ALLOCATE (temp, float, Npts);
    8296
    83   KapaPrepPlot (kapa, Npts, graphmode);
    84 
     97  Nout = 0;
    8598  if (xVec->type == OPIHI_FLT) {
    8699    opihi_flt *value = xVec->elements.Flt;
    87100    for (i = 0; i < Npts; i++) {
    88       temp[i] = value[i];
     101      if (mask && mask[i]) continue;
     102      temp[Nout] = value[i];
     103      Nout ++;
    89104    }
    90105  } else {
    91106    opihi_int *value = xVec->elements.Int;
    92107    for (i = 0; i < Npts; i++) {
    93       temp[i] = value[i];
    94     }
    95   }
    96   KapaPlotVector (kapa, Npts, temp, "x");
    97 
     108      if (mask && mask[i]) continue;
     109      temp[Nout] = value[i];
     110      Nout ++;
     111    }
     112  }
     113  KapaPrepPlot (kapa, Nout, graphmode);
     114  KapaPlotVector (kapa, Nout, temp, "x");
     115
     116  Nout = 0;
    98117  if (yVec->type == OPIHI_FLT) {
    99118    opihi_flt *value = yVec->elements.Flt;
    100119    for (i = 0; i < Npts; i++) {
    101       temp[i] = value[i];
     120      if (mask && mask[i]) continue;
     121      temp[Nout] = value[i];
     122      Nout ++;
    102123    }
    103124  } else {
    104125    opihi_int *value = yVec->elements.Int;
    105126    for (i = 0; i < Npts; i++) {
    106       temp[i] = value[i];
    107     }
    108   }
    109   KapaPlotVector (kapa, Npts, temp, "y");
    110 
     127      if (mask && mask[i]) continue;
     128      temp[Nout] = value[i];
     129      Nout ++;
     130    }
     131  }
     132  KapaPlotVector (kapa, Nout, temp, "y");
     133
     134  Nout = 0;
    111135  if (zVec->type == OPIHI_FLT) {
    112136    opihi_flt *value = zVec->elements.Flt;
    113137    for (i = 0; i < Npts; i++) {
    114       temp[i] = value[i];
     138      if (mask && mask[i]) continue;
     139      temp[Nout] = value[i];
     140      Nout ++;
    115141    }
    116142  } else {
    117143    opihi_int *value = zVec->elements.Int;
    118144    for (i = 0; i < Npts; i++) {
    119       temp[i] = value[i];
    120     }
    121   }
    122   KapaPlotVector (kapa, Npts, temp, "z");
     145      if (mask && mask[i]) continue;
     146      temp[Nout] = value[i];
     147      Nout ++;
     148    }
     149  }
     150  KapaPlotVector (kapa, Nout, temp, "z");
    123151
    124152  free (temp);
Note: See TracChangeset for help on using the changeset viewer.