Compare commits

..

86 Commits

Author SHA1 Message Date
Dima Kogan
abc37bfa1e changelog bump 2014-01-24 15:51:10 -08:00
Dima Kogan
19c56ae041 Merge branch 'master' into debian 2014-01-24 15:48:57 -08:00
Dima Kogan
417ceb2bcc made the VCS links canonical 2013-12-04 02:37:11 -08:00
Dima Kogan
a374e71fae changelog bump 2013-12-04 02:05:29 -08:00
Dima Kogan
0551483616 Merge branch 'master' into debian 2013-12-04 02:02:21 -08:00
Dima Kogan
48fb730f0b Merge branch 'master' into debian 2013-12-04 01:59:56 -08:00
Dima Kogan
2fbc8f62d3 Removed Anton Gladky from the Uploaders 2013-12-04 01:59:40 -08:00
Dima Kogan
670a5b84f9 gnuplot dependency now favors graphical gnuplot packages 2013-12-02 23:53:53 -08:00
Anton Gladky
b92093464b Add libipc-run-perl to Build-Depends to execute tests. 2013-10-25 21:16:24 +02:00
Anton Gladky
516077cbd0 Merge changelog entries. 2013-10-25 21:01:50 +02:00
Dima Kogan
f8e69778a2 build-dep on gnuplot for tests 2013-10-20 01:26:28 -07:00
Dima Kogan
7dca5c31bf changelog bump 2013-10-20 01:19:59 -07:00
Dima Kogan
a6fef8c9f4 Merge branch 'master' into debian 2013-10-20 01:19:31 -07:00
Dima Kogan
987b7d90be bumped changelog, updated build-deps 2013-10-20 00:58:48 -07:00
Dima Kogan
d7e30ac655 Merge branch 'master' into debian 2013-10-20 00:56:39 -07:00
Dima Kogan
ece4b29a2a snapshot version bump 2013-09-23 06:15:21 -07:00
Dima Kogan
bbd2a44bf9 Merge branch 'master' into debian 2013-09-23 06:07:29 -07:00
Dima Kogan
d2613db253 version bump 2013-04-28 17:43:12 -07:00
Dima Kogan
2217a1a1ba Now building the html documentation from the correct POD source 2013-04-28 17:42:21 -07:00
Dima Kogan
184102a420 Merge remote-tracking branch 'gitdebian/debian' into debian 2013-02-08 02:27:46 -08:00
Dima Kogan
1cca6c8eb4 version bump 2013-02-08 02:19:47 -08:00
Dima Kogan
78368597c8 Merge branch 'master' into debian 2013-02-08 02:19:39 -08:00
Anton Gladky
4de5984551 Update email. 2013-02-03 17:56:55 +01:00
Anton Gladky
512d515ff6 Update watch-file. Thanks to Bart Martens. 2013-02-03 17:56:29 +01:00
Dima Kogan
1d1b5e6808 removed redundant pieces of debian/gbp.conf 2012-12-14 10:32:59 -08:00
Dima Kogan
40b18cf8f9 priority now optional 2012-12-14 10:32:28 -08:00
Dima Kogan
5283810abe fixed watchfile to work with newer github pages 2012-11-18 11:59:03 -08:00
Dima Kogan
9ab429e618 Small packaging tweaks:
These were suggested by paultag@debian.org

1. debian/changelog just has the one entry, to indicate what has changed from
the perspective of a user of this package. The old changes in that file have
never been uploaded to Debian

2. Uploading to unstable instead of experimental

3. Bumped up debhelper compat to 9

4. Removed DM-Upload-Allowed

5. Minor standards bump
2012-10-30 11:22:02 -07:00
Dima Kogan
14a39b6fd2 version bump 2012-09-29 16:42:50 -07:00
Dima Kogan
d705699459 gbp.conf knows about upstream tags 2012-09-29 16:42:34 -07:00
Dima Kogan
8867cf54f0 Merge remote-tracking branch 'upstream/master' into debian 2012-09-29 16:35:49 -07:00
Dima Kogan
52b9024320 version bump 2012-09-14 01:32:07 -07:00
Dima Kogan
6809545a16 added doc-base definition 2012-09-14 01:29:46 -07:00
Dima Kogan
a66e45adb5 added Anton Gladky as an Uploader 2012-09-14 01:14:29 -07:00
Dima Kogan
8557cd4870 more thorough cleanup of pod2html detritus 2012-09-11 14:30:34 -07:00
Dima Kogan
88fbd90a28 minor changelog update 2012-09-11 13:39:45 -07:00
Dima Kogan
d9906d8e88 Vcs-Git and Vcs-Browser now point to alioth 2012-09-11 13:37:19 -07:00
Dima Kogan
186b7a3ae0 added watch file to find tagged tarballs on github 2012-09-11 13:33:40 -07:00
Dima Kogan
62eb5f17bb building and installing the HTML documentation 2012-09-11 13:20:58 -07:00
Dima Kogan
a164c4ff29 Merge remote-tracking branch 'upstream/master' into debian 2012-09-11 13:12:55 -07:00
Dima Kogan
30d5b10fd6 debian-science is now the maintainer 2012-09-11 11:47:11 -07:00
Dima Kogan
f2d4b7d78b marking package as non-native 2012-09-11 11:44:11 -07:00
Dima Kogan
00d2f0d6a6 Merge tag 'upstream/1.22' into debian 2012-09-11 11:42:57 -07:00
Dima Kogan
0ccffde918 added git-buildpackage configuration 2012-09-11 11:41:57 -07:00
Dima Kogan
805060ba92 changelog now references a non-native package 2012-09-11 11:33:14 -07:00
Dima Kogan
6ba7fc053c allowing uploads by DMs 2012-09-10 23:40:29 -07:00
Dima Kogan
21c38efc2d debian changelog now closes the ITP bug 2012-09-10 23:30:59 -07:00
Dima Kogan
7833e63c32 debian/copyright has a single license for the whole package 2012-09-10 23:27:12 -07:00
Dima Kogan
d9e5067f20 more standard copyright file 2012-09-10 21:07:22 -07:00
Dima Kogan
44a81e153d updated debian standards version 2012-09-10 20:55:49 -07:00
Dima Kogan
458367883a version bump 2012-09-10 20:48:34 -07:00
Dima Kogan
d4997cbba7 cleaned up debian/control 2012-09-10 20:45:12 -07:00
Dima Kogan
5dcffaa62d updated package description 2012-09-10 18:31:28 -07:00
Dima Kogan
5cf323a97c removed debian/watch
I have a native package at this point, so I'll make new tags ONLY when a new
packaged release is cut. If this ever changes, a watch file will be re-added
2012-09-10 18:28:46 -07:00
Dima Kogan
229c08582d using more up-to-date copyright format spec 2012-09-10 18:26:21 -07:00
Dima Kogan
04876fa72e version bump 2012-09-03 08:33:36 -07:00
Dima Kogan
e61e831ef2 version bump 2012-09-02 23:53:17 -07:00
Dima Kogan
e5973e4fd6 version bump 2012-08-31 01:36:23 -07:00
Dima Kogan
df2c78a85e changelog bump 2012-02-11 21:05:07 -08:00
Dima Kogan
472520fdd8 made consistent my email addy in the debian changelog 2012-02-11 21:03:53 -08:00
Dima Kogan
54f7f17558 version bump 2011-12-27 16:48:13 -08:00
Dima Kogan
a8dc63c472 version bump 2011-11-20 19:20:11 -08:00
Dima Kogan
10a4d35e97 added zsh and bash completions to the package 2011-11-20 19:17:10 -08:00
Hermann Schwarting
70946c92c2 add build dependency libtest-script-run-perl
It's required to run the tests
2011-11-20 13:22:59 -08:00
Dima Kogan
a8f5b99c23 version bump 2011-11-11 00:11:41 -08:00
Dima Kogan
5cb7e3616a now building a native package 2011-11-11 00:10:05 -08:00
Dima Kogan
b9ce0ea175 I don't actually want to export the tree when building my package 2011-10-29 02:56:18 -07:00
Dima Kogan
d6381c747b bump 2011-10-23 13:39:03 -07:00
Dima Kogan
a054645a71 standards bump to make lintian happier 2011-10-23 13:38:00 -07:00
Dima Kogan
0ce0f8a3f0 added configuration to let git-buildpackage build this package 2011-10-23 13:37:39 -07:00
Dima Kogan
3171f272fc added source format for the debianization 2011-10-23 13:19:44 -07:00
Dima Kogan
1cced9a621 fixed wrong email address 2011-10-23 13:19:44 -07:00
Dima Kogan
3132b76caa version bump 2011-10-23 13:19:44 -07:00
Dima Kogan
b90e783f69 main homepage at github, not cpan 2011-10-16 11:31:30 -07:00
Dima Kogan
9b0bc07ae4 whitespace 2011-10-16 11:27:02 -07:00
Dima Kogan
7bcb3920a1 renamed main script feedGnuplot -> feedgnuplot 2011-10-16 11:25:22 -07:00
Dima Kogan
0ec6cb3d6d new email address 2011-09-15 18:58:18 -07:00
Dima Kogan
9edb99d4cd removed documentation-installing file that installed wrong documentation 2011-06-11 23:07:29 -07:00
Dima Kogan
a1fac377a8 version bump 2011-05-22 15:31:16 -07:00
Dima Kogan
80a5fac5f2 version bump 2011-04-26 14:25:23 -07:00
Dima Kogan
f6fc00f3f2 version bump 2011-04-19 11:04:07 -07:00
Dima Kogan
02d3f2bc92 version bump 2011-04-09 14:11:15 -07:00
Dima Kogan
f682fa0816 debian package depends on gnuplot 2011-04-03 17:26:22 -07:00
Dima Kogan
1e63a87a3d version bump 2011-04-03 17:26:22 -07:00
Dima Kogan
47846ea562 added debian directory 2011-02-06 16:01:00 -08:00
Dima Kogan
36d1db13a3 added realtime gnuplot script from
http://users.softlab.ece.ntua.gr/~ttsiod/gnuplotStreaming.html
2009-12-19 20:46:06 -08:00
17 changed files with 400 additions and 725 deletions

74
Changes
View File

@@ -1,80 +1,10 @@
feedgnuplot (1.39)
* by default, histograms are plotted in expected ways
-- Dima Kogan <dima@secretsauce.net> Sat, 15 Oct 2016 20:45:15 -0700
feedgnuplot (1.38)
* hardcopy defaults:
- no enhanced text mode
- larger font size
-- Dima Kogan <dima@secretsauce.net> Wed, 27 Jul 2016 22:15:11 -0700
feedgnuplot (1.37)
* At the end of a streaming plot, include the last chunk of data
* Added --equation to the completions
-- Dima Kogan <dima@secretsauce.net> Fri, 01 Jan 2016 08:09:43 -0800
feedgnuplot (1.36)
* Added --equation to plot symbolic equations
-- Dima Kogan <dima@secretsauce.net> Fri, 13 Nov 2015 11:08:26 -0800
feedgnuplot (1.35)
* replaced a 'say' with 'print'. Should work better with ancient perls
* an "exit" command now has effect even with triggered-only replotting
* More sophisticated handling of termination conditions:
- Without --exit, we always end up with an interactive plot when the
input data is exhausted or when the user sends a ^C to the pipeline
- When streaming, the first ^C does not kill feedgnuplot
* Removed threading
-- Dima Kogan <dima@secretsauce.net> Sun, 01 Nov 2015 12:50:33 -0800
feedgnuplot (1.34)
* Fix for "Use of implicit split to @_ is deprecated". Thanks to Corey
Putkunz
* Declaring feedgnuplot as a package to let MetaCPAN index this
distribution
-- Dima Kogan <dima@secretsauce.net> Wed, 14 May 2014 00:45:24 -0700
feedgnuplot (1.33)
* fixed incorrect plotting of --timefmt --rangesize plots
-- Dima Kogan <dima@secretsauce.net> Thu, 06 Feb 2014 23:17:21 -0800
feedgnuplot (1.32)
* Added --rangesize and --rangesizeall. Different curves can now plot
different-size tuples
-- Dima Kogan <dima@secretsauce.net> Wed, 05 Feb 2014 13:57:58 -0800
feedgnuplot (1.31)
* Test suite requires gawk to get strftime()
-- Dima Kogan <dima@secretsauce.net> Sat, 25 Jan 2014 20:49:38 -0800
feedgnuplot (1.30)
feedgnuplot (1.30) unstable; urgency=low
* Added --with, --set, --unset, --style, --styleall
-- Dima Kogan <dima@secretsauce.net> Fri, 24 Jan 2014 15:38:07 -0800
feedgnuplot (1.29)
feedgnuplot (1.29) unstable; urgency=low
* added CPAN meta-data to require IPC::Run at build time

View File

@@ -1,20 +1,19 @@
#!/usr/bin/perl
package feedgnuplot; # for the metacpan indexer
use strict;
use warnings;
use Getopt::Long;
use Time::HiRes qw( usleep gettimeofday tv_interval );
use IO::Handle;
use IO::Select;
use List::Util qw( first any );
use List::Util qw( first );
use Scalar::Util qw( looks_like_number );
use Text::ParseWords; # for shellwords
use Text::ParseWords;
use threads;
use threads::shared;
use Thread::Queue;
use Pod::Usage;
use Time::Piece;
my $VERSION = 1.39;
my $VERSION = 1.30;
my %options;
interpretCommandline();
@@ -27,11 +26,16 @@ interpretCommandline();
# with --xlen, the offsets are preserved by using $curve->{datastring_offset} to
# represent the offset IN THE ORIGINAL STRING of the current start of the
# datastring
my @curves = ();
# list mapping curve names to their indices in the @curves list
my %curveIndices = ();
# now start the data acquisition and plotting threads
my $dataQueue;
# Whether any new data has arrived since the last replot
my $haveNewData;
@@ -41,16 +45,39 @@ my $last_replot_time = [gettimeofday];
# whether the previous replot was timer based
my $last_replot_is_from_timer = 1;
my $streamingFinished : shared = undef;
my $prev_timed_replot_time = [gettimeofday];
my $this_replot_is_from_timer;
my $stdin = IO::Handle->new();
die "Couldn't open STDIN" unless $stdin->fdopen(fileno(STDIN),"r");
my $selector = IO::Select->new( $stdin );
if($options{stream})
{
$dataQueue = Thread::Queue->new();
my $addThr = threads->create(\&mainThread);
# spawn the plot updating thread. If I'm replotting from a data trigger, I don't need this
my $plotThr = threads->create(\&plotUpdateThread) if $options{stream} > 0;
while(<>)
{
chomp;
mainThread();
last if /^exit/;
# place every line of input to the queue, so that the plotting thread can process it. if we are
# using an implicit domain (x = line number), then we send it on the data queue also, since
# $. is not meaningful in the plotting thread
if(!$options{domain})
{
$_ .= " $.";
}
$dataQueue->enqueue($_);
}
$streamingFinished = 1;
$plotThr->join() if defined $plotThr;
$addThr->join();
}
else
{ mainThread(); }
@@ -89,25 +116,20 @@ sub interpretCommandline
$options{extracmds} = [];
$options{set} = [];
$options{unset} = [];
$options{equation} = [];
$options{curvestyleall} = '';
$options{styleall} = '';
$options{with} = '';
$options{rangesize} = [];
GetOptions(\%options, 'stream:s', 'domain!', 'dataid!', '3d!', 'colormap!', 'lines!', 'points!',
'circles', 'legend=s{2}', 'autolegend!', 'xlabel=s', 'ylabel=s', 'y2label=s', 'zlabel=s',
'title=s', 'xlen=f', 'ymin=f', 'ymax=f', 'xmin=s', 'xmax=s', 'y2min=f', 'y2max=f',
'zmin=f', 'zmax=f', 'y2=s@',
'style=s{2}', 'curvestyle=s{2}', 'curvestyleall=s', 'styleall=s', 'with=s', 'extracmds=s@', 'set=s@', 'unset=s@',
'square!', 'square_xy!', 'hardcopy=s', 'maxcurves=i', 'monotonic!', 'timefmt=s',
'equation=s@',
'histogram=s@', 'binwidth=f', 'histstyle=s',
'terminal=s',
'rangesize=s{2}', 'rangesizeall=i', 'extraValuesPerPoint=i',
'help', 'dump', 'exit', 'version',
'extraValuesPerPoint=i', 'help', 'dump', 'exit', 'version',
'geometry=s') or pod2usage( -exitval => 1,
-verbose => 1, # synopsis and args
-output => \*STDERR );
@@ -138,47 +160,23 @@ sub interpretCommandline
# --curvestyleall, so fill that in
if( $options{styleall} )
{
if($options{curvestyleall} ) { $options{curvestyleall} .= " $options{styleall}"; }
else { $options{curvestyleall} = $options{styleall}; }
delete $options{styleall};
if($options{curvestyleall} )
{
$options{curvestyleall} .= " $options{styleall}";
}
else
{
$options{curvestyleall} = $options{styleall};
}
}
push @{$options{curvestyle}}, @{$options{style}};
delete $options{style};
if( $options{curvestyleall} && $options{with} )
{
print STDERR "--curvestyleall and --with are mutually exclusive. Please just use one.\n";
exit -1;
}
if( $options{with} )
{
$options{curvestyleall} = "with $options{with}";
delete $options{with};
}
# If we're plotting histograms, then set the default histogram options for
# each histogram curve
#
# Apply this to plain (non-cumulative) histograms
if( !$options{curvestyleall} && $options{histstyle} =~ /freq|fnorm/ )
{
for my $hist_curve(@{$options{histogram}})
{
# If we don't specify any options specifically for this histogram, use
# the defaults: filled boxes with borders
if( !any { $options{curvestyle}[$_*2] eq $hist_curve } 0..(@{$options{curvestyle}}/2 - 1) )
{
push @{$options{curvestyle}}, ($hist_curve, 'with boxes fill solid border lt -1');
}
}
}
# --legend and --curvestyle options are conceptually hashes, but are parsed as
# arrays in order to preserve the ordering. I parse both of these into hashes
# because those are useful to have later. After this I can access individual
# legends with $options{legend_hash}{curveid}
for my $listkey (qw(legend curvestyle rangesize))
for my $listkey (qw(legend curvestyle))
{
$options{"${listkey}_hash"} = {};
@@ -195,37 +193,11 @@ sub interpretCommandline
exit -1;
}
if ( defined $options{rangesizeall} && defined $options{extraValuesPerPoint} )
{
print STDERR "Only one of --rangesizeall and --extraValuesPerPoint may be given\n";
exit -1;
}
# I now set up the rangesize to always be
# $options{rangesize_hash}{$id} // $options{rangesize_default}
if ( $options{rangesizeall} )
{
$options{rangesize_default} = $options{rangesizeall};
}
else
{
$options{rangesize_default} = 1;
$options{rangesize_default} += $options{extraValuesPerPoint} if ($options{extraValuesPerPoint});
$options{rangesize_default}++ if ($options{colormap});
$options{rangesize_default}++ if ($options{circles} );
}
# parse stream option. Allowed only numbers >= 0 or 'trigger'. After this code
# $options{stream} is
# -1 for triggered replotting
# >0 for timed replotting
# undef if not streaming
#
# Note that '0' is not allowed, so !$options{stream} will do the expected
# thing
if(defined $options{stream})
{
# if no streaming period is given, default to 1Hz.
@@ -255,6 +227,17 @@ sub interpretCommandline
}
}
if( $options{curvestyleall} && $options{with} )
{
print STDERR "--curvestyleall and --with are mutually exclusive. Please just use one.\n";
exit -1;
}
if( $options{with} )
{
$options{curvestyleall} = "with $options{with}";
$options{with} = '';
}
if ($options{colormap})
{
# colormap styles all curves with palette. Seems like there should be a way to do this with a
@@ -346,9 +329,9 @@ sub interpretCommandline
# --xlen implies an order to the data, so I force monotonicity
$options{monotonic} = 1 if defined $options{xlen};
if( $options{histstyle} !~ /freq|cum|uniq|cnorm|fnorm/ )
if( $options{histstyle} !~ /freq|cum|uniq|cnorm/ )
{
print STDERR "unknown histstyle. Allowed are 'freq...', 'fnorm...', 'cum...', 'uniq...', 'cnorm...'\n";
print STDERR "unknown histstyle. Allowed are 'freq...', 'cum...', 'uniq...', 'cnorm...'\n";
exit -1;
}
@@ -362,8 +345,10 @@ sub interpretCommandline
$options{timefmt} =~ s/^\s*//;
$options{timefmt} =~ s/\s*$//;
my $Nfields = () = split /\s+/, $options{timefmt}, -1;
my $Nfields = scalar split( ' ', $options{timefmt});
$options{timefmt_Ncols} = $Nfields;
my $regex_str = join( '\s+', ('\S+') x $Nfields );
$options{timefmt_regex} = qr/$regex_str/;
# make sure --xlen is an integer. With a timefmt xlen goes through strptime
# and strftime, and those are integer-only
@@ -371,7 +356,7 @@ sub interpretCommandline
{
if( $options{xlen} - int($options{xlen}) )
{
print STDERR "When streaming --xlen MUST be an integer. Rounding up to the nearest second\n";
say STDERR "When streaming --xlen MUST be an integer. Rounding up to the nearest second";
$options{xlen} = 1 + int($options{xlen});
}
}
@@ -392,6 +377,19 @@ sub getGnuplotVersion
return $gnuplotVersion;
}
sub plotUpdateThread
{
while(! $streamingFinished)
{
usleep( $options{stream} * 1e6 );
# indicate that the timer was the replot source
$dataQueue->enqueue('replot timertick');
}
$dataQueue->enqueue(undef);
}
sub sendRangeCommand
{
my ($name, $min, $max) = @_;
@@ -427,64 +425,21 @@ sub makeDomainNumeric
return $domain0;
}
sub getNextLine
{
while(1)
{
$this_replot_is_from_timer = undef;
# if we're not streaming, or we're doing triggered-only replotting, simply
# do a blocking read
return $stdin->getline()
if (! $options{stream} || $options{stream} < 0);
my $now = [gettimeofday];
my $time_remaining = $options{stream} - tv_interval($prev_timed_replot_time, $now);
if ( $time_remaining < 0 )
{
$prev_timed_replot_time = $now;
$this_replot_is_from_timer = 1;
return 'replot';
}
if ($selector->can_read($time_remaining))
{
return $stdin->getline();
}
}
}
sub mainThread
{
my $valuesPerPoint = 1;
if($options{extraValuesPerPoint}) { $valuesPerPoint += $options{extraValuesPerPoint}; }
if($options{colormap}) { $valuesPerPoint++; }
if($options{circles} ) { $valuesPerPoint++; }
local *PIPE;
my $dopersist = '';
if( getGnuplotVersion() >= 4.3 && # --persist not available before this
# --persist is needed for the "half-alive" state (see documentation for
# --exit). This state is only used with these options:
!$options{stream} && $options{exit})
if( !$options{stream} && getGnuplotVersion() >= 4.3)
{
$dopersist = '--persist';
}
# We trap SIGINT to kill the data input, but keep the plot up. see
# documentation for --exit
if ($options{stream} && !$options{exit})
{
$SIG{INT} = sub
{
print STDERR "$0 received SIGINT. Send again to quit\n";
$SIG{INT} = undef;
};
}
if(exists $options{dump})
{
*PIPE = *STDOUT;
@@ -510,11 +465,11 @@ sub mainThread
}
my %terminalOpts =
( eps => 'postscript noenhanced solid color enhanced eps',
ps => 'postscript noenhanced solid color landscape 12',
pdf => 'pdfcairo noenhanced solid color font ",12" size 11in,8.5in',
png => 'png noenhanced size 1280,1024',
svg => 'svg noenhanced');
( eps => 'postscript solid color enhanced eps',
ps => 'postscript solid color landscape 10',
pdf => 'pdfcairo solid color font ",10" size 11in,8.5in',
png => 'png size 1280,1024',
svg => 'svg');
if( !defined $options{terminal} &&
defined $outputfileType &&
@@ -565,7 +520,7 @@ sub mainThread
print(PIPE "set view equal xy\n");
}
# For the specified values, set the legend entries to 'title "blah blah"'
# For the specified values, set the legend entries to 'title "blah blah"'
if(@{$options{legend}})
{
# @{$options{legend}} is a list where consecutive pairs are (curveID,
@@ -580,11 +535,13 @@ sub mainThread
}
}
# add the extra curve options
# add the extra curve options
if(@{$options{curvestyle}})
{
# @{$options{curvestyle}} is a list where consecutive pairs are (curveID,
# style).
# style). I use $options{curvestyle} here instead of
# $options{curvestyle_hash} because I create a new curve when I see a new
# one, and the hash is unordered, thus messing up the ordering
my $n = scalar @{$options{curvestyle}}/2;
foreach my $idx (0..$n-1)
{
@@ -593,22 +550,22 @@ sub mainThread
}
}
# For the values requested to be printed on the y2 axis, set that
# For the values requested to be printed on the y2 axis, set that
addCurveOption($_, 'axes x1y2') foreach (@{$options{y2}});
# timefmt
# timefmt
if( $options{timefmt} )
{
print(PIPE "set timefmt '$options{timefmt}'\n");
print(PIPE "set xdata time\n");
}
# add the extra global options
# add the extra global options
print(PIPE "$_\n") foreach (@{$options{extracmds}});
print(PIPE "set $_\n") foreach (@{$options{set}});
print(PIPE "unset $_\n") foreach (@{$options{unset}});
# set up histograms
# set up histograms
$options{binwidth} ||= 1; # if no binwidth given, set it to 1
print PIPE
"set boxwidth $options{binwidth}\n" .
@@ -616,6 +573,21 @@ sub mainThread
setCurveAsHistogram( $_ ) foreach (@{$options{histogram}});
# regexp for a possibly floating point, possibly scientific notation number
my $numRE = '-?\d*\.?\d+(?:[Ee][-+]?\d+)?';
my $domainRE = $options{timefmt_regex} || $numRE;
# a point may be preceded by an id
my $pointRE = $options{dataid} ? '(\S+)\s+' : '()';
$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";
@@ -644,7 +616,8 @@ sub mainThread
# number of seconds since the UNIX epoch.
my $domain0_numeric;
while( defined ($_ = getNextLine()) )
# I should be using the // operator, but I'd like to be compatible with perl 5.8
while( $_ = (defined $dataQueue ? $dataQueue->dequeue() : <>))
{
next if /^#/o;
@@ -658,104 +631,89 @@ sub mainThread
if(/^replot/o )
{
replot( $domain0_numeric );
# /timertick/ determines if the timer was the source of the replot
replot( $domain0_numeric, /timertick/ );
next;
}
last if /^exit/o;
# /exit/ is handled in the data-reading thread
}
# parse the incoming data lines. The format is
# x id0 dat0 id1 dat1 ....
# where idX is the ID of the curve that datX corresponds to
#
# $options{domain} indicates whether the initial 'x' is given or not (if not, the line
# number is used)
# $options{dataid} indicates whether idX is given or not (if not, the point order in the
# line is used)
# 3d plots require $options{domain}, and dictate "x y" for the domain instead of just "x"
my @fields = split;
if($options{domain})
if(! /^replot/o)
{
if( $options{timefmt} )
{
# no point if doing anything unless I have at least the domain and
# 1 piece of data
next if @fields < $options{timefmt_Ncols}+1;
# parse the incoming data lines. The format is
# x id0 dat0 id1 dat1 ....
# where idX is the ID of the curve that datX corresponds to
#
# $options{domain} indicates whether the initial 'x' is given or not (if not, the line
# number is used)
# $options{dataid} indicates whether idX is given or not (if not, the point order in the
# line is used)
# 3d plots require $options{domain}, and dictate "x y" for the domain instead of just "x"
$domain[0] = join (' ', splice( @fields, 0, $options{timefmt_Ncols}) );
$domain0_numeric = makeDomainNumeric( $domain[0] );
}
elsif(!$options{'3d'})
if($options{domain})
{
# no point if doing anything unless I have at least the domain and
# 1 piece of data
next if @fields < 1+1;
/($domainRE)/go or next;
$domain[0] = $1;
$domain0_numeric = makeDomainNumeric( $domain[0] );
if($options{'3d'})
{
/($numRE)/go or next;
$domain[1] = $1;
}
elsif( $options{monotonic} )
{
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( $domain0_numeric );
clearCurves();
$latestX = undef;
}
else
{ $latestX = $domain0_numeric; }
}
$domain[0] = $domain0_numeric = shift @fields;
}
else
{
# no point if doing anything unless I have at least the domain and
# 1 piece of data
next if @fields < 2+1;
@domain = splice(@fields, 0, 2);
# since $. is not meaningful in the plotting thread if we're using the data queue, we pass
# $. on the data queue in that case
if(defined $dataQueue)
{
s/ ([\d]+)$//o;
$domain[0] = $1;
}
else
{
$domain[0] = $.;
}
$domain0_numeric = makeDomainNumeric( $domain[0] );
}
if( $options{monotonic} )
my $id = -1;
while (/$pointRE/go)
{
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( $domain0_numeric );
clearCurves();
$latestX = undef;
}
else
{ $latestX = $domain0_numeric; }
}
}
else
{
$domain[0] = $.;
$domain0_numeric = makeDomainNumeric( $domain[0] );
}
my $id = -1;
while(@fields)
{
if($options{dataid})
{
$id = shift @fields;
}
else
{
$id++;
}
# I'd like to use //, but I guess some people are still on perl 5.8
my $rangesize = exists $options{rangesize_hash}{$id} ?
$options{rangesize_hash}{$id} :
$options{rangesize_default};
last if @fields < $rangesize;
if($1 ne '') {$id = $1;}
else {$id++; }
pushPoint(getCurve($id),
join(' ',
@domain,
splice( @fields, 0, $rangesize ) ) . "\n",
$domain0_numeric);
"@domain $2\n", $domain0_numeric);
}
}
}
# if we were streaming, we're now done!
if( $options{stream} )
{
return;
}
# finished reading in all. Plot what we have
plotStoredData() unless $options{stream} && $options{exit};
plotStoredData();
if ( defined $options{hardcopy})
{
@@ -764,7 +722,7 @@ sub mainThread
# sleep until the plot file exists, and it is closed. Sometimes the output
# is still being written at this point. If the output filename starts with
# '|', gnuplot pipes the output to that process, instead of writing to a
# file. In that case I don't make sure the file exists, since there IS no
# file. In that case I don't make sure the file exists, since there IS not
# file
if( $options{hardcopy} !~ /^\|/ )
{
@@ -776,13 +734,6 @@ sub mainThread
return;
}
# data exhausted. If we're killed now, then we should peacefully die.
if($options{stream} && !$options{exit})
{
print STDERR "Input data exhausted\n";
$SIG{INT} = undef;
}
# we persist gnuplot, so we shouldn't need this sleep. However, once
# gnuplot exits, but the persistent window sticks around, you can no
# longer interactively zoom the plot. So we still sleep
@@ -826,9 +777,7 @@ sub plotStoredData
my @nonemptyCurves = grep { $_->{datastring} } @curves;
my @extraopts = map {$_->{options}} @nonemptyCurves;
my $body = join('', map { "$_," } @{$options{equation}});
$body .= join(', ' , map({ "'-' $_" } @extraopts) );
my $body = join(', ' , map({ "'-' $_" } @extraopts) );
if($options{'3d'}) { print PIPE "splot $body\n"; }
else { print PIPE "plot $body\n"; }
@@ -857,27 +806,28 @@ sub updateCurveOptions
{ $title = $id; }
my $titleoption = defined $title ? "title \"$title\"" : "notitle";
my ($curvestyleall);
if( defined $options{curvestyle_hash}{$id} )
{
# I have a curve-specific style set with --curvestyle. This style lives in
# $curve->{extraoptions}, and it overrides the global styles
$curvestyleall = '';
}
else
{
$curvestyleall = $options{curvestyleall};
}
my $histoptions = $curve->{histoptions} || '';
my $usingoptions = '';
if( $options{timefmt} )
{
# with --timefmt I need an explicit 'using' specification. I specify the
# columns as 1:2:3..... I need the right number of columns (this is given
# as 1 + rangesize). I also need to start the range at the first column
# past the timefmt
# I'd like to use //, but I guess some people are still on perl 5.8
my $rangesize = exists $options{rangesize_hash}{$id} ?
$options{rangesize_hash}{$id} :
$options{rangesize_default};
my @rest = map {$_ + $options{timefmt_Ncols}} (1..$rangesize);
$usingoptions = "using 1:" . join(':', @rest);
$usingoptions = "using 1:" . ($options{timefmt_Ncols}+1);
}
$curve->{options} = "$histoptions $usingoptions $titleoption $curve->{extraoptions} $options{curvestyleall}";
$curve->{options} = "$histoptions $usingoptions $titleoption $curve->{extraoptions} $curvestyleall";
}
sub getCurve
@@ -969,7 +919,7 @@ sub replot
# }
my ($domain0_numeric) = @_;
my ($domain0_numeric, $replot_is_from_timer) = @_;
my $now = [gettimeofday];
@@ -979,7 +929,7 @@ sub replot
# if the last replot was timer-based, but this one isn't, force a replot.
# This makes sure that a replot happens for a domain rollover shortly
# after a timer replot
!$this_replot_is_from_timer && $last_replot_is_from_timer ||
!$replot_is_from_timer && $last_replot_is_from_timer ||
# if enough time has elapsed since the last replot, it's ok to replot
tv_interval ( $last_replot_time, $now ) > 0.8*$options{stream} )
@@ -1005,7 +955,7 @@ sub replot
# update replot state
$last_replot_time = $now;
$last_replot_is_from_timer = $this_replot_is_from_timer;
$last_replot_is_from_timer = $replot_is_from_timer;
}
}
@@ -1162,24 +1112,17 @@ conjunction with C<--dataid>.
=head3 Multi-value style support
Depending on how gnuplot is plotting the data, more than one value may be needed
to represent the range of a single point. Basic 2D plots have 2 numbers
representing each point: 1 domain and 1 range. But if plotting with
C<--circles>, for instance, then there's an extra range value: the radius. A
similar situation exists with C<--colormap> where each point contains the
position I<and> the color. There are other gnuplot styles that require more data
(such as error bars), but none of these are directly supported by the script.
They can still be used, however, by specifying the specific style with
C<--style>, and specifying how many values are needed for each point with
C<--rangesizeall> or C<--rangesize> or C<--extraValuesPerPoint>. Those options
that specify the range size are required I<only> for styles not explicitly
supported by feedgnuplot; supported styles do the right thing automatically.
More examples: if making a 2d plot of y error bars where gnuplot expects a
(x,y,ydelta) tuple for each point, you want C<--rangesizeall 2> because you have
one domain value (x) and 2 range values (y,ydelta). Gnuplot can also plot
lopsided y errorbars by giving a tuple (x,y,ylow,yhigh). This is similar as
before, but you want C<--rangesizeall 3> instead.
to represent a single point. For example, the script has support to plot all the
data with C<--circles>. This requires a radius to be specified for each point in
addition to the position of the point. Thus, when plotting with C<--circles>, 2
numbers are read for each data point instead of 1. A similar situation exists
with C<--colormap> where each point contains the position I<and> the color.
There are other gnuplot styles that require more data (such as error bars), but
none of these are directly supported by the script. They can still be used,
though, by specifying the specific style with C<--style>, and specifying how
many extra values are needed for each point with C<--extraValuesPerPoint extra>.
C<--extraValuesPerPoint> is ONLY needed for the styles not explicitly supported;
supported styles set that variable automatically.
=head3 3D data
@@ -1214,7 +1157,7 @@ C<--xmin> and C<--xmax> I<must> use the format passed in to C<--timefmt>
Using this option changes both the way the input is parsed I<and> the way the
x-axis tics are labelled. Gnuplot tries to be intelligent in this labelling, but
it doesn't always do what the user wants. The labelling can be controlled with
it doesn't always to what the user wants. The labelling can be controlled with
the gnuplot C<set format> command, which takes the same type of format string as
C<--timefmt>. Example:
@@ -1422,7 +1365,8 @@ Interpret the X data as a time/date, parsed with the given format
C<--colormap>
Show a colormapped xy plot. Requires extra data for the color. zmin/zmax can be
used to set the extents of the colors. Automatically sets the C<--rangesize>.
used to set the extents of the colors. Automatically increments
C<--extraValuesPerPoint>
=item
@@ -1450,7 +1394,8 @@ Do [not] draw points
C<--circles>
Plot with circles. This requires a radius be specified for each point.
Automatically sets the C<--rangesize>. C<Not> supported for 3d plots.
Automatically increments C<--extraValuesPerPoint>). C<Not> supported for 3d
plots.
=item
@@ -1514,11 +1459,11 @@ passing something like
C<--histogram curveID>
Set up a this specific curve to plot a histogram. The bin width is given with
the C<--binwidth> option (assumed 1.0 if omitted). If a drawing style is not
specified for this curve (C<--curvestyle>) or all curves (C<--with>,
C<--curvestyleall>) then the default histogram style is set: filled boxes with
borders. This is what the user generally wants. This works with C<--domain>
the C<--binwidth> option (assumed 1.0 if omitted). C<--histogram> does I<not>
touch the drawing style. It is often desired to plot these with boxes, and this
I<must> be explicitly requested by C<--with boxes>. This works with C<--domain>
and/or C<--stream>, but in those cases the x-value is used I<only> to cull old
data because of C<--xlen> or C<--monotonic>. I.e. the x-values are I<not> drawn
in any way. Can be passed multiple times, or passed a comma- separated list
@@ -1534,14 +1479,12 @@ in the plot. Defaults to 1.0 if not given.
C<--histstyle style>
Normally, histograms are generated with the 'smooth frequency' gnuplot style.
C<--histstyle> can be used to select different C<smooth> settings (see the
gnuplot C<help smooth> page for more info). Allowed values are 'frequency' (the
default), 'fnormal' (available in very recent gnuplots), 'unique', 'cumulative'
and 'cnormal'. 'fnormal' is a normalized histogram. 'unique' indicates whether a
bin has at least one item in it: instead of counting the items, it'll always
report 0 or 1. 'cumulative' is the integral of the 'frequency' histogram.
'cnormal' is like 'cumulative', but rescaled to end up at 1.0.
Normally, histograms are generated with the 'smooth freq' gnuplot style.
C<--histstyle> can be used to select different 'smooth' settings. Allowed are
'unique', 'cumulative' and 'cnormal'. 'unique' indicates whether a bin has at
least one item in it: instead of counting the items, it'll always report 0 or 1.
'cumulative' is the integral of the "normal" histogram. 'cnormal' is like
'cumulative', but rescaled to end up at 1.0.
=item
@@ -1609,34 +1552,6 @@ times.
=item
C<--equation xxx>
Gnuplot can plot both data and symbolic equations. C<feedgnuplot> generally
plots data, but with this option can plot symbolic equations I<also>. This is
generally intended to augment data plots, since for equation-only plots you
don't need C<feedgnuplot>. C<--equation> can be passed multiple times for
multiple equations. The given strings are passed to gnuplot directly without any
thing added or removed, so styling and such should be applied in the string. A
basic example:
seq 100 | awk '{print $1/10, $1/100}' |
feedgnuplot --with 'lines lw 3' --domain --ymax 1
--equation 'sin(x)/x' --equation 'cos(x)/x with lines lw 4'
Here I plot the incoming data (points along a line) with the given style (a line
with thickness 3), I<and> I plot two damped sinusoids on the same plot. The
sinusoids are not affected by C<feedgnuplot> styling, so their styles are set
separately, as in this example. More complicated example:
seq 360 | perl -nE '$th=$_/360 * 3.14*2; $c=cos($th); $s=sin($th); say "$c $s"' |
feedgnuplot --domain --square
--set parametric --set "trange [0:2*3.14]" --equation "sin(t),cos(t)"
Here the data I generate is points along the unit circle. I plot these as
points, and I I<also> plot a true circle as a parametric equation.
=item
C<--square>
Plot data with aspect ratio 1. For 3D plots, this controls the aspect ratio for
@@ -1684,32 +1599,13 @@ replotted before being purged
=item
C<--rangesize curveID xxx>
The options C<--rangesizeall>, C<--rangesize> and C<--extraValuesPerPoint> set
the number of values are needed to represent each point being plotted (see
L</"Multi-value style support"> above). These options are I<only> needed if
unknown styles are used, with C<--styleall> or C<--with> for instance.
C<--rangesize> is used to set how many values are needed to represent the range
of a point for a particular curve. This overrides any defaults that may exist
for this curve only.
=item
C<--rangesizeall xxx>
Like C<--rangesize>, but applies to I<all> the curves.
C<--extraValuesPerPoint xxx>
Like C<--rangesizeall>, but instead of overriding the default, adds to it. For
example, if plotting non-lopsided y errorbars gnuplot wants (x,y,ydelta) tuples.
These can be specified both with C<--rangesizeall 2> (because there are 2 range
values) or C<--extraValuesPerPoint 1> (because there's 1 more value than usual).
This option is I<only> needed if unknown styles are used, with C<--styleall> or
C<--with> for instance.
How many extra values are given for each data point. Normally this is 0, and
does not need to be specified, but sometimes we want extra data, like for colors
or point sizes or error bars, etc. feedgnuplot options that require this
(colormap, circles) automatically set it. This option is ONLY needed if unknown
styles are used, with C<--styleall> or C<--with> for instance
=item
@@ -1722,80 +1618,10 @@ is possible to send the output produced this way to gnuplot directly.
C<--exit>
This controls the details of what happens when the input data is exhausted, or
when some part of the C<feedgnuplot> pipeline is killed. This option does
different things depending on whether C<--stream> is active, so read this
closely.
With interactive gnuplot terminals (qt, x11, wxt), the plot windows live in a
separate process from the main C<gnuplot> process. It is thus possible for the
main C<gnuplot> process to exit, while leaving the plot windows up (a caveat is
that such decapitated windows aren't interactive). To be clear, there are 3
possible states:
=over
=item Alive: C<feedgnuplot>, C<gnuplot> alive, plot window process alive, no
shell prompt (shell busy with C<feedgnuplot>)
=item Half-alive: C<feedgnuplot>, C<gnuplot> dead, plot window process alive
(but non-interactive), shell prompt available
=item Dead: C<feedgnuplot>, C<gnuplot> dead, plot window process dead, shell
prompt available
=back
The C<--exit> option controls the details of this behavior. The possibilities
are:
=over
=item No C<--stream>, input pipe is exhausted (all data read in)
=over
=item default; no C<--exit>
Alive. Need to Ctrl-C to get back into the shell
=item C<--exit>
Half-alive. Non-interactive prompt up, and the shell accepts new commands.
Without C<--stream> the goal is to show a plot, so a Dead state is not useful
here.
=back
=item C<--stream>, input pipe is exhausted (all data read in) or the
C<feedgnuplot> process terminated
=over
=item default; no C<--exit>
Alive. Need to Ctrl-C to get back into the shell
=item C<--exit>
Dead. No plot is shown, and the shell accepts new commands. With C<--stream> the
goal is to show a plot as the data comes in, which we have been doing. Now that
we're done, we can clean up everything.
=back
=back
Note that one usually invokes C<feedgnuplot> as a part of a shell pipeline:
$ write_data | feedgnuplot
If the user terminates this pipeline with ^C, then I<all> the processes in the
pipeline receive SIGINT. This normally kills C<feedgnuplot> and all its
C<gnuplot> children, and we let this happen unless C<--stream> and no C<--exit>.
If C<--stream> and no C<--exit>, then we ignore the first ^C. The data feeder
dies, and we behave as if the input data was exhausted. A second ^C kills us
also.
Terminate the feedgnuplot process after passing data to gnuplot. The window will
persist but will not be interactive. Without this option feedgnuplot keeps
running and must be killed by the user. Note that this option works only with
later versions of gnuplot and only with some gnuplot terminals.
=item
@@ -1849,12 +1675,10 @@ in a Thinkpad.
$ while true; do cat /proc/acpi/ibm/thermal | awk '{$1=""; print}' ; sleep 1; done |
feedgnuplot --stream --xlen 100 --lines --autolegend --ymax 100 --ymin 20 --ylabel 'Temperature (deg C)'
=head2 Plotting a histogram of file sizes in a directory, granular to 10MB
=head2 Plotting a histogram of file sizes in a directory
$ ls -l | awk '{print $5/1e6}' |
feedgnuplot --histogram 0
--binwidth 10
--ymin 0 --xlabel 'File size (MB)' --ylabel Frequency
feedgnuplot --histogram 0 --with boxes --ymin 0 --xlabel 'File size (MB)' --ylabel Frequency
=head1 ACKNOWLEDGEMENT

View File

@@ -15,12 +15,9 @@ complete -W \
--dump \
--exit \
--extraValuesPerPoint \
--rangesizeall \
--rangesize \
--extracmds \
--set \
--unset \
--equation \
--geometry \
--hardcopy \
--help \

View File

@@ -32,15 +32,12 @@ _arguments -S
'*--extracmds[Additional gnuplot commands]:command' \
'*--set[Additional 'set' gnuplot commands]:set-option' \
'*--unset[Additional 'unset' gnuplot commands]:unset-option' \
'*--equation[Raw symbolic equation]:equation' \
'--square[Plot data with square aspect ratio]' \
'--square_xy[For 3D plots, set square aspect ratio for ONLY the x,y axes]' \
'--hardcopy[Plot to a file]:filename' \
'--maxcurves[The maximum allowed number of curves]:number of curves' \
'(--3d)--monotonic[Resets plot if an X in the past is seen]' \
'(--rangesizeall)--extraValuesPerPoint[How many extra values are given for each data range]:N'\
'(--extraValuesPerPoint)--rangesizeall[How many values are given for each data range]:N'\
'*--rangesize[How many values comprise a data range in this curve]:curve id: :N:' \
'--extraValuesPerPoint[How many extra values are given for each data point]:N'\
'--dump[Instead of printing to gnuplot, print to STDOUT]' \
'--geometry[The X11 geometry string]:geometry string:' \
'*--curvestyle[Additional styles for a curve]:curve id: :style:' \

58
debian/changelog vendored Normal file
View File

@@ -0,0 +1,58 @@
feedgnuplot (1.30-1) unstable; urgency=low
* made the VCS links canonical
* added --set, --unset, --with, --style, --styleall
-- Dima Kogan <dima@secretsauce.net> Fri, 24 Jan 2014 15:50:03 -0800
feedgnuplot (1.28-1) unstable; urgency=low
* Upstream update:
- Removed example debianization
- Removed unreliable unit tests from automated testing (Closes: #731080)
* gnuplot dependency now favors graphical gnuplot packages
* Removed Anton Gladky from the Uploaders
-- Dima Kogan <dima@secretsauce.net> Wed, 04 Dec 2013 02:05:08 -0800
feedgnuplot (1.26-1) unstable; urgency=low
[ Dima Kogan ]
* Minor POD update
* Added test suite
* Added initial support for --timefmt. Currently time/date data is
supported only at the x-axis domain
* Added --exit option for force feedgnuplot to return even if gnuplot
may not yet be done rendering (patch by Eric Schulte)
* Reformatted the documentation
* y2-axis curves no longer have a thicker line by default
* --hardcopy now handles piped output (gnuplot 'set output |process'
syntax)
[ Anton Gladky ]
* Add libipc-run-perl to Build-Depends to execute tests
-- Dima Kogan <dima@secretsauce.net> Sun, 20 Oct 2013 01:19:51 -0700
feedgnuplot (1.24-2) unstable; urgency=low
* Now building the html documentation from the correct POD source
-- Dima Kogan <dima@secretsauce.net> Sun, 28 Apr 2013 17:42:52 -0700
feedgnuplot (1.24-1) unstable; urgency=low
* Fixed regression in --monotonic. This works again now
* moved POD back into the main source file. This fixes the broken usage
messages
* added --version
* fixed watchfile to work with newer github pages
* priority now optional
-- Dima Kogan <dima@secretsauce.net> Fri, 08 Feb 2013 02:01:32 -0800
feedgnuplot (1.23-2) unstable; urgency=low
* Initial Debian release (Closes: #686413)
-- Dima Kogan <dima@secretsauce.net> Tue, 30 Oct 2012 11:14:01 -0700

1
debian/compat vendored Normal file
View File

@@ -0,0 +1 @@
9

19
debian/control vendored Normal file
View File

@@ -0,0 +1,19 @@
Source: feedgnuplot
Section: science
Priority: optional
Build-Depends: debhelper (>= 9), libstring-shellquote-perl, perl, gawk, gnuplot, libipc-run-perl
Maintainer: Debian Science Maintainers <debian-science-maintainers@lists.alioth.debian.org>
Uploaders: Dima Kogan <dima@secretsauce.net>
Standards-Version: 3.9.4
Homepage: https://github.com/dkogan/feedgnuplot
Vcs-Git: git://anonscm.debian.org/debian-science/packages/feedgnuplot.git
Vcs-Browser: http://anonscm.debian.org/gitweb/?p=debian-science/packages/feedgnuplot.git
Package: feedgnuplot
Architecture: all
Depends: ${misc:Depends}, ${perl:Depends}, gnuplot-qt | gnuplot-x11 | gnuplot
Description: Pipe-oriented frontend to Gnuplot
Flexible, command-line-oriented frontend to Gnuplot. Creates plots from data
coming in on STDIN or given in a filename passed on the commandline. Various
data representations are supported, as is hardcopy output and streaming display
of live data.

24
debian/copyright vendored Normal file
View File

@@ -0,0 +1,24 @@
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Source: https://github.com/dkogan/feedgnuplot
Upstream-Contact: Dima Kogan, <dima@secretsauce.net>
Upstream-Name: feedgnuplot
Files: *
Copyright: 2011, Dima Kogan <dima@secretsauce.net>
License: Artistic or GPL-1+
License: Artistic
This program is free software; you can redistribute it and/or modify
it under the terms of the Artistic License, which comes with Perl.
.
On Debian GNU/Linux systems, the complete text of the Artistic License
can be found in `/usr/share/common-licenses/Artistic'.
License: GPL-1+
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 1, or (at your option)
any later version.
.
On Debian GNU/Linux systems, the complete text of version 1 of the
General Public License can be found in `/usr/share/common-licenses/GPL-1'.

9
debian/feedgnuplot.doc-base vendored Normal file
View File

@@ -0,0 +1,9 @@
Document: feedgnuplot
Title: Feedgnuplot Manual
Author: Dima Kogan
Abstract: Formatted manpage for feedgnuplot
Section: Science/Data Analysis
Format: HTML
Index: /usr/share/doc/feedgnuplot/feedgnuplot.html
Files: /usr/share/doc/feedgnuplot/feedgnuplot.html

1
debian/feedgnuplot.docs vendored Normal file
View File

@@ -0,0 +1 @@
feedgnuplot.html

2
debian/feedgnuplot.install vendored Normal file
View File

@@ -0,0 +1,2 @@
completions/bash/feedgnuplot /etc/bash_completion.d/
completions/zsh/_feedgnuplot /usr/share/zsh/vendor-completions

4
debian/gbp.conf vendored Normal file
View File

@@ -0,0 +1,4 @@
[DEFAULT]
debian-branch = debian
upstream-tag = v%(version)s
pristine-tar = True

12
debian/rules vendored Executable file
View File

@@ -0,0 +1,12 @@
#!/usr/bin/make -f
%:
dh $@
override_dh_auto_build:
dh_auto_build
pod2html --title=feedgnuplot bin/feedgnuplot > feedgnuplot.html
override_dh_auto_clean:
rm -rf feedgnuplot.html pod2htm*
dh_auto_clean

1
debian/source/format vendored Normal file
View File

@@ -0,0 +1 @@
3.0 (quilt)

4
debian/watch vendored Normal file
View File

@@ -0,0 +1,4 @@
version=3
opts=uversionmangle=s/(\d)[_\.\-\+]?((RC|rc|pre|dev|beta|alpha|b|a)\d*)$/$1~$2/,dversionmangle=s/\+(debian|dfsg|ds|deb)\d*$// \
https://github.com/dkogan/feedgnuplot/tags .*/v?(\d.*)\.(?:tgz|tbz2|txz|tar\.(?:gz|bz2|xz))
# Bart Martens <bartm@debian.org> Sat, 22 Dec 2012 12:54:18 +0000

View File

@@ -1,58 +0,0 @@
# Sample spec file for rpm-based systems. Debian-based systems already have this
# packaged, so we do not ship those here
Name: feedgnuplot
Version: 1.38
Release: 1%{?dist}
Summary: Pipe-oriented frontend to Gnuplot
BuildArch: noarch
License: Artistic or GPL-1+
URL: https://www.github.com/dkogan/feedgnuplot/
Source0: https://www.github.com/dkogan/feedgnuplot/archive/v%{version}.tar.gz#/%{name}-%{version}.tar.gz
BuildRequires: /usr/bin/pod2html
BuildRequires: perl-String-ShellQuote
BuildRequires: perl-ExtUtils-MakeMaker
BuildRequires: perl
BuildRequires: gawk
BuildRequires: gnuplot
BuildRequires: perl-IPC-Run
Requires: gnuplot
%description
Flexible, command-line-oriented frontend to Gnuplot. Creates plots from data
coming in on STDIN or given in a filename passed on the commandline. Various
data representations are supported, as is hardcopy output and streaming display
of live data.
%prep
%setup -q
%build
perl Makefile.PL INSTALLDIRS=vendor
make
pod2html --title=feedgnuplot bin/feedgnuplot > feedgnuplot.html
%install
make install DESTDIR=%{buildroot} PREFIX=/usr
mkdir -p %{buildroot}%{_defaultdocdir}/%{name}
cp Changes LICENSE feedgnuplot.html %{buildroot}%{_defaultdocdir}/%{name}
mkdir -p %{buildroot}%{_datadir}/zsh/site-functions
cp completions/zsh/* %{buildroot}%{_datadir}/zsh/site-functions
mkdir -p %{buildroot}%{_datadir}/bash-completion/completions
cp completions/bash/* %{buildroot}%{_datadir}/bash-completion/completions
rm -rf %{buildroot}/usr/lib64
%files
%{_bindir}/*
%{_datadir}/zsh/*
%{_datadir}/bash-completion/*
%doc %{_defaultdocdir}/%{name}/*
%doc %{_mandir}

202
t/plots.t
View File

@@ -17,20 +17,14 @@ BEGIN {
exit(0);
}
my $gawkversion = `gawk -V`;
if( !$gawkversion || $@ )
{
print("1..0 # Skip: gawk is required for strftime() in the test suite. Skipping tests.\n");
exit(0);
}
my $gnuplotVersion = `gnuplot --version`;
if( !$gnuplotVersion || $@)
open(my $pipe, 'gnuplot --version |');
if( !$pipe )
{
print("1..0 # Skip: gnuplot not installed. Tests require ver. 4.6.4; feedgnuplot works with any.\n");
exit(0);
}
my $gnuplotVersion = <$pipe>;
chomp $gnuplotVersion;
if ($gnuplotVersion ne "gnuplot 4.6 patchlevel 4")
{
@@ -39,7 +33,7 @@ BEGIN {
}
}
use Test::More tests => 58;
use Test::More tests => 52;
use File::Temp 'tempfile';
use IPC::Run 'run';
use String::ShellQuote;
@@ -326,7 +320,7 @@ tryplot( testname => 'basic line plot with bounds, square aspect ratio',
EOF
tryplot( testname => 'lines on both axes with labels, legends, titles',
cmd => q{seq 5 | gawk '{print 2*$1, $1*$1}'},
cmd => q{seq 5 | awk '{print 2*$1, $1*$1}'},
options => [qw(--lines --points),
'--legend', '0', 'data 0',
'--title', "Test plot",
@@ -375,7 +369,7 @@ tryplot( testname => 'lines on both axes with labels, legends, titles',
EOF
tryplot( testname => 'lines on both axes with labels, legends, titles; different styles',
cmd => q{seq 5 | gawk '{print 2*$1, $1*$1}'},
cmd => q{seq 5 | awk '{print 2*$1, $1*$1}'},
options => ['--legend', '0', 'data 0',
'--title', "Test plot",
qw(--y2 1 --y2label y2 --xlabel x --ylabel y --y2max 30),
@@ -425,7 +419,7 @@ tryplot( testname => 'lines on both axes with labels, legends, titles; different
EOF
tryplot( testname => 'domain plot',
cmd => q{seq 5 | gawk '{print 2*$1, $1*$1}'},
cmd => q{seq 5 | awk '{print 2*$1, $1*$1}'},
options => [qw(--lines --points), '--domain'],
refplot => <<'EOF' );
@@ -471,7 +465,7 @@ tryplot( testname => 'domain plot',
EOF
tryplot( testname => 'dataid plot',
cmd => q{seq 5 | gawk '{print 2*$1, $1*$1}'},
cmd => q{seq 5 | awk '{print 2*$1, $1*$1}'},
options => [qw(--lines --points),
qw(--dataid --autolegend)],
refplot => <<'EOF' );
@@ -518,7 +512,7 @@ tryplot( testname => 'dataid plot',
EOF
tryplot( testname => '3d spiral with bounds, labels',
cmd => q{seq 50 | gawk '{print 2*cos($1/5), sin($1/5), $1}'},
cmd => q{seq 50 | awk '{print 2*cos($1/5), sin($1/5), $1}'},
options => [qw(--lines --points),
qw(--3d --domain --zmin -5 --zmax 45 --zlabel z),
'--extracmds', 'set view 60,30'],
@@ -566,7 +560,7 @@ tryplot( testname => '3d spiral with bounds, labels',
EOF
tryplot( testname => '3d spiral with bounds, labels, square xy aspect ratio',
cmd => q{seq 50 | gawk '{print 2*cos($1/5), sin($1/5), $1}'},
cmd => q{seq 50 | awk '{print 2*cos($1/5), sin($1/5), $1}'},
options => [qw(--lines --points),
qw(--3d --domain --zmin -5 --zmax 45 --zlabel z),
'--extracmds', 'set view 60,30', '--square_xy'],
@@ -614,7 +608,7 @@ tryplot( testname => '3d spiral with bounds, labels, square xy aspect ratio',
EOF
tryplot( testname => 'Monotonicity check',
cmd => q{seq 10 | gawk '{print (NR-1)%5,NR}'},
cmd => q{seq 10 | awk '{print (NR-1)%5,NR}'},
options => [qw(--lines --points --domain --monotonic)],
refplot => <<'EOF' );
@@ -661,7 +655,7 @@ EOF
tryplot( testname => 'basic --timefmt plot',
cmd => q{seq 5 | gawk '{print strftime("%d %b %Y %T",1382249107+$1,1),$1}'},
cmd => q{seq 5 | awk '{print strftime("%d %b %Y %T",1382249107+$1,1),$1}'},
options => ['--domain', '--timefmt', '%d %b %Y %H:%M:%S'],
refplot => <<'EOF' );
@@ -707,7 +701,7 @@ tryplot( testname => 'basic --timefmt plot',
EOF
tryplot( testname => '--timefmt plot with bounds',
cmd => q{seq 5 | gawk '{print strftime("%d %b %Y %T",1382249107+$1,1),$1}'},
cmd => q{seq 5 | awk '{print strftime("%d %b %Y %T",1382249107+$1,1),$1}'},
options => ['--domain', '--timefmt', '%d %b %Y %H:%M:%S',
'--xmin', '20 Oct 2013 06:05:00',
'--xmax', '20 Oct 2013 06:05:20'],
@@ -755,7 +749,7 @@ tryplot( testname => '--timefmt plot with bounds',
EOF
tryplot( testname => '--timefmt plot with --monotonic',
cmd => q{seq 10 | gawk '{x=(NR-1)%5; print strftime("%d %b %Y %T",1382249107+x,1),$1}'},
cmd => q{seq 10 | awk '{x=(NR-1)%5; print strftime("%d %b %Y %T",1382249107+x,1),$1}'},
options => ['--domain', '--timefmt', '%d %b %Y %H:%M:%S',
'--monotonic'],
refplot => <<'EOF' );
@@ -801,57 +795,10 @@ tryplot( testname => '--timefmt plot with --monotonic',
EOF
tryplot( testname => '--timefmt with custom rangesize',
cmd => q{seq 5 | gawk '{print strftime("%d %b %Y %T",1382249107+$1,1),$1,$1/10}'},
options => ['--domain', '--timefmt', '%d %b %Y %H:%M:%S',
qw(--with errorbars --rangesizeall 2)],
refplot => <<'EOF' );
5.5 ++---------+-----------+----------+----------+----------+-----------+----------+---------**
+ + + + + + + + *
| *
5 ++ +A
| *
| *
| *
4.5 ++ **
| *** |
| * |
4 ++ A ++
| * |
| * |
| *** |
3.5 ++ ++
| *** |
| * |
3 ++ A ++
| * |
| * |
| *** |
2.5 ++ ++
| |
| *** |
2 ++ A ++
| * |
| *** |
| |
1.5 ++ ++
| |
| |
1 A* ++
** |
| |
+ + + + + + + + +
0.5 ++---------+-----------+----------+----------+----------+-----------+----------+---------++
05:08 05:08 05:09 05:09 05:10 05:10 05:11 05:11 05:12
EOF
tryplot( testname => 'Error bars (using extraValuesPerPoint)',
cmd => q{seq 5 | gawk '{print $1,$1,$1/10}'},
cmd => q{seq 5 | awk '{print $1,$1,$1/10}'},
options => [qw(--domain),
qw(--extraValuesPerPoint 1 --with errorbars)],
qw(--extraValuesPerPoint 1 --curvestyle 0), 'with errorbars'],
refplot => <<'EOF' );
@@ -896,103 +843,6 @@ tryplot( testname => 'Error bars (using extraValuesPerPoint)',
EOF
tryplot( testname => 'Error bars (using rangesizeall)',
cmd => q{seq 5 | gawk '{print $1,$1,$1/10}'},
options => [qw(--domain),
qw(--rangesizeall 2 --with errorbars)],
refplot => <<'EOF' );
5.5 ++---------+-----------+----------+----------+----------+-----------+----------+---------**
+ + + + + + + + *
| *
5 ++ +A
| *
| *
| *
4.5 ++ **
| *** |
| * |
4 ++ A ++
| * |
| * |
| *** |
3.5 ++ ++
| *** |
| * |
3 ++ A ++
| * |
| * |
| *** |
2.5 ++ ++
| |
| *** |
2 ++ A ++
| * |
| *** |
| |
1.5 ++ ++
| |
| |
1 A* ++
** |
| |
+ + + + + + + + +
0.5 ++---------+-----------+----------+----------+----------+-----------+----------+---------++
1 1.5 2 2.5 3 3.5 4 4.5 5
EOF
tryplot( testname => 'Error bars (using rangesize, rangesizeall)',
cmd => q{seq 5 | gawk '{print $1,"vert",$1,$1/10,"horiz",5-$1,$1-$1/5,$1+$1/20}'},
options => [qw(--domain --dataid),
qw(--rangesize vert 2 --rangesizeall 3 --with xerrorbars --style vert), 'with errorbars',
qw(--xmin 1 --xmax 5 --ymin 0.5 --ymax 5.5)],
refplot => <<'EOF' );
+-----------+----------+-----------+----------+-----------+----------+-----------+---------**
+ + + + + + + + *
| *
5 ++ +A
| *
| *
| *
| **
| *** |
## * |
4 B# A ++
## * |
| * |
| *** |
| |
| *** |
| # # * |
3 ++ #########B## A ++
| # # * |
| * |
| *** |
| |
| |
| *** # # |
2 ++ A ##############B### ++
| * # # |
| *** |
| |
| |
| |
| # # |
1 A* ##################B##### ++
** # # |
| |
+ + + + + + + + +
+-----------+----------+-----------+----------+-----------+----------+-----------+----------+
1 1.5 2 2.5 3 3.5 4 4.5 5
EOF
SKIP:
{
@@ -1010,7 +860,7 @@ skip "Skipping unreliable tests. Set RUN_ALL_TESTS environment variable to run t
tryplot( testname => 'Histogram plot',
cmd => q{seq 50 | gawk '{print $1*$1}'},
cmd => q{seq 50 | awk '{print $1*$1}'},
options => [qw(--lines --points),
qw(--histo 0 --binwidth 50 --ymin 0 --curvestyleall), 'with boxes'],
refplot => <<'EOF' );
@@ -1057,7 +907,7 @@ tryplot( testname => 'Histogram plot',
EOF
tryplot( testname => 'Cumulative histogram',
cmd => q{seq 50 | gawk '{print $1*$1}'},
cmd => q{seq 50 | awk '{print $1*$1}'},
options => [qw(--lines --points),
qw(--histo 0 --histstyle cum --binwidth 50 --ymin 0 --curvestyleall), 'with boxes'],
refplot => <<'EOF' );
@@ -1104,7 +954,7 @@ tryplot( testname => 'Cumulative histogram',
EOF
tryplot( testname => 'Circles',
cmd => q{seq 5 | gawk '{print $1,$1,$1/10}'},
cmd => q{seq 5 | awk '{print $1,$1,$1/10}'},
options => [qw(--circles --domain)],
refplot => <<'EOF' );
@@ -1158,7 +1008,7 @@ note( "Starting to run streaming tests. These will take several seconds each" );
# points, and then "exit", so I should have two frames worth of data plotted. I
# pre-send a 0 so that the gnuplot autoscaling is always well-defined
tryplot( testname => 'basic streaming test',
cmd => q{seq 500 | gawk 'BEGIN{ print 0; } {print (NR==3)? "exit" : $0; fflush(); system("sleep 1.2");}'},
cmd => q{seq 500 | awk 'BEGIN{ print 0; } {print (NR==3)? "exit" : $0; fflush(); system("sleep 1.2");}'},
options => [qw(--lines --points --stream)],
refplot => <<'EOF' );
@@ -1244,7 +1094,7 @@ tryplot( testname => 'basic streaming test',
EOF
tryplot( testname => 'basic streaming test, twice as fast',
cmd => q{seq 500 | gawk 'BEGIN{ print 0; } {print (NR==3)? "exit" : $0; fflush(); system("sleep 0.6");}'},
cmd => q{seq 500 | awk 'BEGIN{ print 0; } {print (NR==3)? "exit" : $0; fflush(); system("sleep 0.6");}'},
options => [qw(--lines --points --stream 0.4)],
refplot => <<'EOF' );
@@ -1331,7 +1181,7 @@ EOF
tryplot( testname => 'streaming with --xlen',
cmd => q{seq 500 | gawk 'BEGIN{ print 0; } {print (NR==3)? "exit" : $0; fflush(); system("sleep 0.6");}'},
cmd => q{seq 500 | awk 'BEGIN{ print 0; } {print (NR==3)? "exit" : $0; fflush(); system("sleep 0.6");}'},
options => [qw(--lines --points --stream 0.4 --xlen 1.1)],
refplot => <<'EOF' );
@@ -1417,7 +1267,7 @@ tryplot( testname => 'streaming with --xlen',
EOF
tryplot( testname => 'streaming with --monotonic',
cmd => q{seq 500 | gawk '{if(NR==11) {print "exit";} else {x=(NR-1)%5; if(x==0) {print -1,-1;} print x,NR;}; fflush(); system("sleep 0.6");}'},
cmd => q{seq 500 | awk '{if(NR==11) {print "exit";} else {x=(NR-1)%5; if(x==0) {print -1,-1;} print x,NR;}; fflush(); system("sleep 0.6");}'},
options => [qw(--lines --points --stream 0.4 --domain --monotonic)],
refplot => <<'EOF' );
@@ -1823,7 +1673,7 @@ tryplot( testname => 'streaming with --monotonic',
EOF
tryplot( testname => '--timefmt streaming plot with --xlen',
cmd => q{seq 5 | gawk 'BEGIN{ print strftime("%d %b %Y %T",1382249107-1,1),-4;} {if(NR==3) {print "exit";} else{ print strftime("%d %b %Y %T",1382249107+$1,1),$1;} fflush(); system("sleep 0.6")}'},
cmd => q{seq 5 | awk 'BEGIN{ print strftime("%d %b %Y %T",1382249107-1,1),-4;} {if(NR==3) {print "exit";} else{ print strftime("%d %b %Y %T",1382249107+$1,1),$1;} fflush(); system("sleep 0.6")}'},
options => ['--points', '--lines',
'--domain', '--timefmt', '%d %b %Y %H:%M:%S',
qw(--stream 0.4 --xlen 3)],
@@ -1911,7 +1761,7 @@ tryplot( testname => '--timefmt streaming plot with --xlen',
EOF
tryplot( testname => '--timefmt streaming plot with --monotonic',
cmd => q{seq 10 | gawk '{x=(NR-1)%5; if(x==0) {print strftime("%d %b %Y %T",1382249107-1,-4),-4;} print strftime("%d %b %Y %T",1382249107+x,1),NR; fflush(); system("sleep 0.6")}'},
cmd => q{seq 10 | awk '{x=(NR-1)%5; if(x==0) {print strftime("%d %b %Y %T",1382249107-1,-4),-4;} print strftime("%d %b %Y %T",1382249107+x,1),NR; fflush(); system("sleep 0.6")}'},
options => ['--points', '--lines',
'--domain', '--timefmt', '%d %b %Y %H:%M:%S',
qw(--stream 0.4 --monotonic)],
@@ -2327,7 +2177,7 @@ sub tryplot
my %args = @_;
my @options = ('--exit',
qw(--unset grid),
'--extracmds', 'unset grid',
'--terminal', 'dumb 100,40');
unshift @options, @{$args{options}};