From cc96aac692692a5553ade9bef9eb085b484dda94 Mon Sep 17 00:00:00 2001 From: Dima Kogan Date: Fri, 23 Jan 2009 16:56:57 -0800 Subject: [PATCH] realtime gnuplot driver: one window, multiple plots darcs-hash:20090124005657-0cb85-b53c7089a73ae521f3417e1871d68f31bcb78f7b.gz --- driveGnuPlots.pl | 125 +++++++++++++++++++++++------------------------ 1 file changed, 62 insertions(+), 63 deletions(-) diff --git a/driveGnuPlots.pl b/driveGnuPlots.pl index 82ed79f..9e64af0 100755 --- a/driveGnuPlots.pl +++ b/driveGnuPlots.pl @@ -6,15 +6,9 @@ sub usage { print < ...per stream2... -... - ...per streamN... - Stream1_YRangeMin Stream1_YRangeMax Min and Max values for stream 1 - Min and Max values for stream 2 -... - Min and Max values for stream N + NumberOfStreams How many streams to plot + Stream_WindowSampleSize this many samples + Stream_YRangeMin Stream_YRangeMax Min and Max y values OEF exit(1); @@ -28,77 +22,82 @@ sub Arg { $ARGV[int($_[0])]; } +sub plotHeader +{ + my ($xcounter, $samples, $numberOfStreams, $pipe) = @_; + #print "stream $streamIdx: "; + print $pipe "set xrange [".($xcounter-$samples).":".($xcounter+1)."]\n"; + print $pipe 'plot ' . join(', ' , ('"-" notitle') x $numberOfStreams) . "\n"; +} + sub main { my $argIdx = 0; my $numberOfStreams = Arg($argIdx++); - print "Will display $numberOfStreams Streams (in $numberOfStreams windows)...\n"; - my @sampleSizes; - for(my $i=0; $i<$numberOfStreams; $i++) { - my $samples = Arg($argIdx++); - push @sampleSizes, $samples; - print "Stream ".($i+1)." will use a window of $samples samples\n"; - } - my @ranges; - for(my $i=0; $i<$numberOfStreams; $i++) { - my $miny = Arg($argIdx++); - my $maxy = Arg($argIdx++); - push @ranges, [ $miny, $maxy ]; - print "Stream ".($i+1)." will use a range of [$miny, $maxy]\n"; - } - my @gnuplots; + print "Will display $numberOfStreams Streams...\n"; + + my $samples = Arg($argIdx++); + print "Will use a window of $samples samples\n"; + + my $miny = Arg($argIdx++); + my $maxy = Arg($argIdx++); + print "Will use a range of [$miny, $maxy]\n"; + my @buffers; shift @ARGV; # number of streams + shift @ARGV; # sample size + shift @ARGV; # miny + shift @ARGV; # maxy + local *PIPE; + + open PIPE, "|gnuplot" || die "Can't initialize gnuplot\n"; + + select((select(PIPE), $| = 1)[0]); + print PIPE "set xtics\n"; + print PIPE "set ytics\n"; + print PIPE "set yrange [". $miny . ":" . $maxy ."]\n"; + print PIPE "set style data points\n"; + print PIPE "set grid\n"; + for(my $i=0; $i<$numberOfStreams; $i++) { - shift @ARGV; # sample size - shift @ARGV; # miny - shift @ARGV; # maxy - local *PIPE; - open PIPE, "|gnuplot" || die "Can't initialize gnuplot number ".($i+1)."\n"; - select((select(PIPE), $| = 1)[0]); - push @gnuplots, *PIPE; - print PIPE "set xtics\n"; - print PIPE "set ytics\n"; - print PIPE "set yrange [".($ranges[$i]->[0]).":".($ranges[$i]->[1])."]\n"; - print PIPE "set style data linespoints\n"; - print PIPE "set grid\n"; - my @data = []; - push @buffers, @data; + my @data = []; + push @buffers, @data; } + my $streamIdx = 0; select((select(STDOUT), $| = 1)[0]); my $xcounter = 0; + plotHeader($xcounter, $samples, $numberOfStreams, *PIPE); while(<>) { chomp; - my $buf = $buffers[$streamIdx]; - my $pip = $gnuplots[$streamIdx]; - - # data buffering (up to stream sample size) - push @{$buf}, $_; - #print "stream $streamIdx: "; - print $pip "set xrange [".($xcounter-$sampleSizes[$streamIdx]).":".($xcounter+1)."]\n"; - print $pip "plot \"-\" notitle\n"; - my $cnt = 0; - for my $elem (reverse @{$buf}) { + my $line = $_; + foreach my $point ($line =~ /([-]?[0-9\.]+)/g) + { + my $buf = $buffers[$streamIdx]; + + # data buffering (up to stream sample size) + push @{$buf}, $point; + + my $cnt = 0; + for my $elem (reverse @{$buf}) { #print " ".$elem; - print $pip ($xcounter-$cnt)." ".$elem."\n"; - $cnt += 1; - } - #print "\n"; - print $pip "e\n"; - if ($cnt>=$sampleSizes[$streamIdx]) { + print PIPE ($xcounter-$cnt)." ".$elem."\n"; + $cnt++; + } + #print "\n"; + print PIPE "e\n"; + if ($cnt>=$samples) { shift @{$buf}; - } - $streamIdx++; - if ($streamIdx == $numberOfStreams) { + } + $streamIdx++; + if ($streamIdx == $numberOfStreams) { $streamIdx = 0; $xcounter++; - } - } - for(my $i=0; $i<$numberOfStreams; $i++) { - my $pip = $gnuplots[$i]; - print $pip "exit;\n"; - close $pip; + plotHeader($xcounter, $samples, $numberOfStreams, *PIPE); + } + } } + print PIPE "exit;\n"; + close PIPE; } main;