Fix bug in gnuplot error bars and create gnuplot example
authorMitch Watrous <watrous@u.washington.edu>
Wed, 07 Sep 2011 12:18:37 -0700
changeset 7477 4764c1472bd6
parent 7476 2761997c72b2
child 7478 768d1500f0c1
child 7487 82cd20da9650
Fix bug in gnuplot error bars and create gnuplot example
src/tools/examples/gnuplot-example.cc
src/tools/examples/wscript
src/tools/model/gnuplot.cc
src/tools/model/gnuplot.h
src/tools/test/examples-to-run.py
src/tools/wscript
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/examples/gnuplot-example.cc	Wed Sep 07 12:18:37 2011 -0700
@@ -0,0 +1,277 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mitch Watrous (watrous@u.washington.edu)
+ */
+
+#include <fstream>
+
+#include "ns3/gnuplot.h"
+
+using namespace ns3;
+
+namespace {
+
+//===========================================================================
+// Function: create2DPlotFile
+//
+//
+// This function creates a 2-D plot file.
+//===========================================================================
+
+void create2DPlotFile ()
+{
+  using namespace std;
+
+  string fileNameWithNoExtension = "plot-2d";
+  string graphicsFileName        = fileNameWithNoExtension + ".png";
+  string plotFileName            = fileNameWithNoExtension + ".plt";
+  string plotTitle               = "2-D Plot";
+  string dataTitle               = "2-D Data";
+
+  // Instantiate the plot and set its title.
+  Gnuplot plot (graphicsFileName);
+  plot.SetTitle (plotTitle);
+
+  // Make the graphics file, which the plot file will create when it
+  // is used with Gnuplot, be a PNG file.
+  plot.SetTerminal ("png");
+
+  // Set the labels for each axis.
+  plot.SetLegend ("X Values", "Y Values");
+
+  // Set the range for the x axis.
+  plot.AppendExtra ("set xrange [-6:+6]");
+
+  // Instantiate the dataset, set its title, and make the points be
+  // plotted along with connecting lines.
+  Gnuplot2dDataset dataset;
+  dataset.SetTitle (dataTitle);
+  dataset.SetStyle (Gnuplot2dDataset::LINES_POINTS);
+
+  double x;
+  double y;
+
+  // Create the 2-D dataset.
+  for (x = -5.0; x <= +5.0; x += 1.0)
+    {
+      // Calculate the 2-D curve
+      // 
+      //            2
+      //     y  =  x   .
+      //  
+      y = x * x;
+
+      // Add this point.
+      dataset.Add (x, y);
+    }
+
+  // Add the dataset to the plot.
+  plot.AddDataset (dataset);
+
+  // Open the plot file.
+  ofstream plotFile (plotFileName.c_str());
+
+  // Write the plot file.
+  plot.GenerateOutput (plotFile);
+
+  // Close the plot file.
+  plotFile.close ();
+}
+
+
+//===========================================================================
+// Function: create2DPlotWithErrorBarsFile
+//
+//
+// This function creates a 2-D plot with error bars file.
+//===========================================================================
+
+void create2DPlotWithErrorBarsFile ()
+{
+  using namespace std;
+
+  string fileNameWithNoExtension = "plot-2d-with-error-bars";
+  string graphicsFileName        = fileNameWithNoExtension + ".png";
+  string plotFileName            = fileNameWithNoExtension + ".plt";
+  string plotTitle               = "2-D Plot With Error Bars";
+  string dataTitle               = "2-D Data With Error Bars";
+
+  // Instantiate the plot and set its title.
+  Gnuplot plot (graphicsFileName);
+  plot.SetTitle (plotTitle);
+
+  // Make the graphics file, which the plot file will create when it
+  // is used with Gnuplot, be a PNG file.
+  plot.SetTerminal ("png");
+
+  // Set the labels for each axis.
+  plot.SetLegend ("X Values", "Y Values");
+
+  // Set the range for the x axis.
+  plot.AppendExtra ("set xrange [-6:+6]");
+
+  // Instantiate the dataset, set its title, and make the points be
+  // plotted with no connecting lines.
+  Gnuplot2dDataset dataset;
+  dataset.SetTitle (dataTitle);
+  dataset.SetStyle (Gnuplot2dDataset::POINTS);
+
+  // Make the dataset have error bars in both the x and y directions.
+  dataset.SetErrorBars (Gnuplot2dDataset::XY);
+
+  double x;
+  double xErrorDelta;
+  double y;
+  double yErrorDelta;
+
+  // Create the 2-D dataset.
+  for (x = -5.0; x <= +5.0; x += 1.0)
+    {
+      // Calculate the 2-D curve
+      // 
+      //            2
+      //     y  =  x   .
+      //  
+      y = x * x;
+
+      // Make the uncertainty in the x direction be constant and make
+      // the uncertainty in the y direction be a constant fraction of
+      // y's value.
+      xErrorDelta = 0.25;
+      yErrorDelta = 0.1 * y;
+
+      // Add this point with uncertainties in both the x and y
+      // direction.
+      dataset.Add (x, y, xErrorDelta, yErrorDelta);
+    }
+
+  // Add the dataset to the plot.
+  plot.AddDataset (dataset);
+
+  // Open the plot file.
+  ofstream plotFile (plotFileName.c_str());
+
+  // Write the plot file.
+  plot.GenerateOutput (plotFile);
+
+  // Close the plot file.
+  plotFile.close ();
+}
+
+
+//===========================================================================
+// Function: create3DPlotFile
+//
+//
+// This function creates a 3-D plot file.
+//===========================================================================
+
+void create3DPlotFile ()
+{
+  using namespace std;
+
+  string fileNameWithNoExtension = "plot-3d";
+  string graphicsFileName        = fileNameWithNoExtension + ".png";
+  string plotFileName            = fileNameWithNoExtension + ".plt";
+  string plotTitle               = "3-D Plot";
+  string dataTitle               = "3-D Data";
+
+  // Instantiate the plot and set its title.
+  Gnuplot plot (graphicsFileName);
+  plot.SetTitle (plotTitle);
+
+  // Make the graphics file, which the plot file will create when it
+  // is used with Gnuplot, be a PNG file.
+  plot.SetTerminal ("png");
+
+  // Rotate the plot 30 degrees around the x axis and then rotate the
+  // plot 120 degrees around the new z axis.
+  plot.AppendExtra ("set view 30, 120, 1.0, 1.0");
+
+  // Move the zero for the z axis be onto the xy plane.
+  plot.AppendExtra ("set ticslevel 0");
+
+  // Set the labels for each axis.
+  plot.AppendExtra ("set xlabel 'X Values'");
+  plot.AppendExtra ("set ylabel 'Y Values'");
+  plot.AppendExtra ("set zlabel 'Z Values'");
+
+  // Set the ranges for the x and y axis.
+  plot.AppendExtra ("set xrange [-5:+5]");
+  plot.AppendExtra ("set yrange [-5:+5]");
+
+  // Instantiate the dataset, set its title, and make the points be
+  // connected by lines.
+  Gnuplot3dDataset dataset;
+  dataset.SetTitle (dataTitle);
+  dataset.SetStyle ("with lines");
+
+  double x;
+  double y;
+  double z;
+
+  // Create the 3-D dataset.
+  for (x = -5.0; x <= +5.0; x += 1.0)
+    {
+    for (y = -5.0; y <= +5.0; y += 1.0)
+	{
+	  // Calculate the 3-D surface
+	  // 
+	  //            2      2
+	  //     z  =  x   *  y   .
+	  //  
+	  z = x * x * y * y;
+
+	  // Add this point.
+	  dataset.Add (x, y, z);
+	}
+
+    // The blank line is necessary at the end of each x value's data
+    // points for the 3-D surface grid to work.
+    dataset.AddEmptyLine ();
+    }
+
+  // Add the dataset to the plot.
+  plot.AddDataset (dataset);
+
+  // Open the plot file.
+  ofstream plotFile (plotFileName.c_str());
+
+  // Write the plot file.
+  plot.GenerateOutput (plotFile);
+
+  // Close the plot file.
+  plotFile.close ();
+}
+
+} // anonymous namespace
+
+
+int main (int argc, char *argv[])
+{
+  // Create a 2-D plot file.
+  create2DPlotFile();
+
+  // Create a 2-D plot with error bars file.
+  create2DPlotWithErrorBarsFile();
+
+  // Create a 3-D plot file.
+  create3DPlotFile();
+
+  return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/examples/wscript	Wed Sep 07 12:18:37 2011 -0700
@@ -0,0 +1,10 @@
+## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+
+def build(bld):
+    if not bld.env['ENABLE_EXAMPLES']:
+        return;
+
+    obj = bld.create_ns3_program('gnuplot-example', ['tools'])
+    obj.source = 'gnuplot-example.cc'
+
+
--- a/src/tools/model/gnuplot.cc	Wed Sep 07 10:40:15 2011 -0400
+++ b/src/tools/model/gnuplot.cc	Wed Sep 07 12:18:37 2011 -0700
@@ -317,17 +317,16 @@
 }
 
 void 
-Gnuplot2dDataset::Add (double x, double y, double minY, double maxY)
+Gnuplot2dDataset::Add (double x, double y, double xErrorDelta, double yErrorDelta)
 {
-  NS_ASSERT ( reinterpret_cast<Data2d*>(m_data)->m_errorBars == X ||
-              reinterpret_cast<Data2d*>(m_data)->m_errorBars == Y );
+  NS_ASSERT ( reinterpret_cast<Data2d*>(m_data)->m_errorBars == XY );
 
   struct Point data;
   data.empty = false;
   data.x = x;
   data.y = y;
-  data.dx = minY;
-  data.dy = maxY;
+  data.dx = xErrorDelta;
+  data.dy = yErrorDelta;
   reinterpret_cast<Data2d*>(m_data)->m_pointset.push_back (data);
 }
 
--- a/src/tools/model/gnuplot.h	Wed Sep 07 10:40:15 2011 -0400
+++ b/src/tools/model/gnuplot.h	Wed Sep 07 12:18:37 2011 -0700
@@ -177,7 +177,7 @@
   /**
    * \param x x coord to new data point
    * \param y y coord to new data point
-   * \param errorDelta data point error range.
+   * \param errorDelta x and y data point uncertainty
    *
    * Use this method with error bar style X or Y.
    */
@@ -186,12 +186,12 @@
   /**
    * \param x x coord to new data point
    * \param y y coord to new data point
-   * \param minY minimum error data point
-   * \param maxY maximum error data point
+   * \param xErrorDelta x data point uncertainty 
+   * \param yErrorDelta y data point uncertainty 
    *
-   * Use this method with error bar style X or Y.
+   * Use this method with error bar style XY.
    */
-  void Add (double x, double y, double minY, double maxY);
+  void Add (double x, double y, double xErrorDelta, double yErrorDelta);
 
   /**
    * Add an empty line in the data output sequence. Empty lines in the plot
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/test/examples-to-run.py	Wed Sep 07 12:18:37 2011 -0700
@@ -0,0 +1,20 @@
+#! /usr/bin/env python
+## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+
+# A list of C++ examples to run in order to ensure that they remain
+# buildable and runnable over time.  Each tuple in the list contains
+#
+#     (example_name, do_run, do_valgrind_run).
+#
+# See test.py for more information.
+cpp_examples = [
+    ("gnuplot-example", "False", "False"),
+]
+
+# A list of Python examples to run in order to ensure that they remain
+# runnable over time.  Each tuple in the list contains
+#
+#     (example_name, do_run).
+#
+# See test.py for more information.
+python_examples = []
--- a/src/tools/wscript	Wed Sep 07 10:40:15 2011 -0400
+++ b/src/tools/wscript	Wed Sep 07 12:18:37 2011 -0700
@@ -23,4 +23,7 @@
         'model/delay-jitter-estimation.h',
         ]
 
+    if (bld.env['ENABLE_EXAMPLES']):
+        bld.add_subdirs('examples')
+
     bld.ns3_python_bindings()