[feedgnuplot] 14/42: timefmt plots now work with streaming and with --xlen

Dima Kogan dkogan-guest at alioth.debian.org
Sun Oct 20 08:04:04 UTC 2013


This is an automated email from the git hooks/post-receive script.

dkogan-guest pushed a commit to tag v1.25
in repository feedgnuplot.

commit c169330fca8dff61b238a8526f5c4a0af087339c
Author: Dima Kogan <dima at secretsauce.net>
Date:   Fri Sep 20 22:06:18 2013 -0700

    timefmt plots now work with streaming and with --xlen
---
 bin/feedgnuplot |  122 +++++++++++++++++++++++++++++++++++--------------------
 1 file changed, 77 insertions(+), 45 deletions(-)

diff --git a/bin/feedgnuplot b/bin/feedgnuplot
index 867aaac..b3c8d0f 100755
--- a/bin/feedgnuplot
+++ b/bin/feedgnuplot
@@ -11,6 +11,7 @@ use threads;
 use threads::shared;
 use Thread::Queue;
 use Pod::Usage;
+use Time::Piece;
 
 my $VERSION = 1.24;
 
@@ -355,6 +356,21 @@ sub sendRangeCommand
   print PIPE $cmd;
 }
 
+sub makeDomainNumeric
+{
+  my ($domain0) = @_;
+
+  if ( $options{timefmt} )
+  {
+    my $timepiece = Time::Piece->strptime( $domain0, $options{timefmt} )
+      or die "Couldn't parse time format. String '$domain0' doesn't fit format '$options{timefmt}'";
+
+    return $timepiece->epoch();
+  }
+
+  return $domain0;
+}
+
 sub mainThread
 {
     my $valuesPerPoint = 1;
@@ -406,18 +422,6 @@ sub mainThread
     print PIPE "set terminal $options{terminal}\n" if $options{terminal};
     print PIPE "set output \"$outputfile\"\n"      if $outputfile;
 
-
-    # If a bound isn't given I want to set it to the empty string, so I can communicate it simply to
-    # gnuplot
-    print PIPE "set xtics\n";
-    if($options{y2})
-    {
-      print PIPE "set ytics nomirror\n";
-      print PIPE "set y2tics\n";
-      # if any of the ranges are given, set the range
-      sendRangeCommand( "y2range", $options{y2min}, $options{y2max} );
-    }
-
     # set up plotting style
     my $style = '';
     if($options{lines})  { $style .= 'lines';}
@@ -427,11 +431,6 @@ sub mainThread
       $options{curvestyleall} = "with circles $options{curvestyleall}";
     }
 
-    # if any of the ranges are given, set the range
-    sendRangeCommand( "xrange", $options{xmin}, $options{xmax} );
-    sendRangeCommand( "yrange", $options{ymin}, $options{ymax} );
-    sendRangeCommand( "zrange", $options{zmin}, $options{zmax} );
-
     print PIPE "set style data $style\n" if $style;
     print PIPE "set grid\n";
 
@@ -459,13 +458,8 @@ sub mainThread
       print(PIPE "set view equal xy\n");
     }
 
-    if($options{colormap})
-    {
-      sendRangeCommand( "cbrange", $options{zmin}, $options{zmax} );
-    }
-
 # For the specified values, set the legend entries to 'title "blah blah"'
-    if(@{$options{legend}})
+    if(defined $options{legend} && @{$options{legend}})
     {
       # @{$options{legend}} is a list where consecutive pairs are (curveID,
       # legend). I use $options{legend} here instead of $options{legend_hash}
@@ -480,7 +474,7 @@ sub mainThread
     }
 
 # add the extra curve options
-    if(@{$options{curvestyle}})
+    if(defined $options{curvestyle} && @{$options{curvestyle}})
     {
       # @{$options{curvestyle}} is a list where consecutive pairs are (curveID,
       # style). I use $options{curvestyle} here instead of
@@ -495,9 +489,12 @@ sub mainThread
     }
 
 # For the values requested to be printed on the y2 axis, set that
-    foreach (@{$options{y2}})
+    if( defined $options{y2} )
     {
-      addCurveOption($_, 'axes x1y2 linewidth 3');
+      foreach (@{$options{y2}})
+      {
+        addCurveOption($_, 'axes x1y2 linewidth 3');
+      }
     }
 
 # timefmt
@@ -508,7 +505,7 @@ sub mainThread
     }
 
 # add the extra global options
-    if($options{extracmds})
+    if(defined $options{extracmds})
     {
       foreach (@{$options{extracmds}})
       {
@@ -517,13 +514,16 @@ sub mainThread
     }
 
 # set up histograms
-    $options{binwidth} ||= 1; # if no binwidth given, set it to 1
-    print PIPE
-      "set boxwidth $options{binwidth}\n" .
-      "histbin(x) = $options{binwidth} * floor(0.5 + x/$options{binwidth})\n";
-    foreach (@{$options{histogram}})
+    if( defined $options{histogram} )
     {
-      setCurveAsHistogram( $_ );
+      $options{binwidth} ||= 1; # if no binwidth given, set it to 1
+      print PIPE
+        "set boxwidth $options{binwidth}\n" .
+        "histbin(x) = $options{binwidth} * floor(0.5 + x/$options{binwidth})\n";
+      foreach (@{$options{histogram}})
+      {
+        setCurveAsHistogram( $_ );
+      }
     }
 
     # regexp for a possibly floating point, possibly scientific notation number
@@ -536,6 +536,26 @@ sub mainThread
     $pointRE .= '(' . join('\s+', ($numRE) x $valuesPerPoint) . ')';
     $pointRE = qr/$pointRE/;
 
+# set all the axis ranges
+    # If a bound isn't given I want to set it to the empty string, so I can communicate it simply to
+    # gnuplot
+    print PIPE "set xtics\n";
+
+    if($options{y2})
+    {
+      print PIPE "set ytics nomirror\n";
+      print PIPE "set y2tics\n";
+      # if any of the ranges are given, set the range
+      sendRangeCommand( "y2range", $options{y2min}, $options{y2max} );
+    }
+
+    # if any of the ranges are given, set the range
+    sendRangeCommand( "xrange",  $options{xmin}, $options{xmax} );
+    sendRangeCommand( "yrange",  $options{ymin}, $options{ymax} );
+    sendRangeCommand( "zrange",  $options{zmin}, $options{zmax} );
+    sendRangeCommand( "cbrange", $options{zmin}, $options{zmax} ) if($options{colormap});
+
+
 
 
     # latest domain variable present in our data
@@ -544,6 +564,10 @@ sub mainThread
     # The domain of the current point
     my @domain;
 
+    # The x-axis domain represented as a number. This is exactly the same as
+    # $domain[0] unless the x-axis domain uses a timefmt. Then this is the
+    # number of seconds since the UNIX epoch.
+    my $domain0_numeric;
 
     # I should be using the // operator, but I'd like to be compatible with perl 5.8
     while( $_ = (defined $dataQueue ? $dataQueue->dequeue() : <>))
@@ -556,7 +580,7 @@ sub mainThread
       elsif( $options{stream} && /^replot/o )
       {
         # /timertick/ determines if the timer was the source of the replot
-        replot( $domain[0], /timertick/ );
+        replot( $domain0_numeric, /timertick/ );
       }
       elsif(! /^replot/o)
       {
@@ -574,6 +598,8 @@ sub mainThread
         {
           /($domainRE)/go or next;
           $domain[0] = $1;
+          $domain0_numeric = makeDomainNumeric( $domain[0] );
+
           if($options{'3d'})
           {
             /($numRE)/go or next;
@@ -581,17 +607,17 @@ sub mainThread
           }
           elsif( $options{monotonic} )
           {
-            if( defined $latestX && $domain[0] < $latestX )
+            if( defined $latestX && $domain0_numeric < $latestX )
             {
               # the x-coordinate of the new point is in the past, so I wipe out
               # all the data and start anew. Before I wipe the old data, I
               # replot the old data
-              replot( $domain[0] );
+              replot( $domain0_numeric );
               clearCurves();
               $latestX = undef;
             }
             else
-            { $latestX = $domain[0]; }
+            { $latestX = $domain0_numeric; }
           }
 
         }
@@ -608,6 +634,7 @@ sub mainThread
           {
             $domain[0] = $.;
           }
+          $domain0_numeric = makeDomainNumeric( $domain[0] );
         }
 
         my $id = -1;
@@ -617,7 +644,7 @@ sub mainThread
           else         {$id++;   }
 
           pushPoint(getCurve($id),
-                    "@domain $2\n", $domain[0]);
+                    "@domain $2\n", $domain0_numeric);
         }
       }
     }
@@ -645,8 +672,7 @@ sub mainThread
 
 sub pruneOldData
 {
-  my ($x, $xlen) = @_;
-  my $oldestx = $x - $xlen;
+  my ($oldestx) = @_;
 
   foreach my $curve (@curves)
   {
@@ -815,7 +841,7 @@ sub replot
   # }
 
 
-  my ($domain0, $replot_is_from_timer) = @_;
+  my ($domain0_numeric, $replot_is_from_timer) = @_;
 
   my $now = [gettimeofday];
 
@@ -834,9 +860,15 @@ sub replot
     if ( defined $options{xlen} )
     {
       # we have an --xlen, so we need to clean out the old data
-      pruneOldData( $domain0, $options{xlen} );
+      pruneOldData( $domain0_numeric - $options{xlen} );
 
-      my ($xmin, $xmax) = ($domain0 - $options{xlen}, $domain0);
+      my ($xmin, $xmax) = ($domain0_numeric - $options{xlen}, $domain0_numeric);
+      if ( defined $options{timefmt} )
+      {
+        # if we're using a timefmt, I need to convert my xmin range from
+        # seconds-since-the-epoch BACK to the timefmt. Sheesh
+        ($xmin, $xmax) = map {Time::Piece->strptime( $_, '%s' )->strftime( $options{timefmt} ) } ($xmin, $xmax);
+      }
       sendRangeCommand( "xrange", $xmin, $xmax );
     }
 
@@ -852,10 +884,10 @@ sub replot
 # function to add a point to the plot. Assumes that the curve indexed by $idx already exists
 sub pushPoint
 {
-  my ($curve, $datastring, $domain0) = @_;
+  my ($curve, $datastring, $domain0_numeric) = @_;
 
   push @{$curve->{datastring_meta}}, { offset_start => length( $curve->{datastring} ) + $curve->{datastring_offset},
-                                       domain       => $domain0 };
+                                       domain       => $domain0_numeric };
   $curve->{datastring} .= $datastring;
 
   $haveNewData = 1;

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/feedgnuplot.git



More information about the debian-science-commits mailing list