#!/usr/bin/perl -w use strict; use Getopt::Long; use Time::HiRes qw( usleep ); use Data::Dumper; # stream in the data by default # point plotting by default my %options = ( "stream" => 1, "points" => 0, "lines" => 0,); GetOptions(\%options, "stream!", "lines!", "legend=s@", "xlabel=s", "ylabel=s", "y2label=s", "title=s", "y2min=f", "y2max=f", "y2=i@", "hardcopy=s"); # set up plotting style my $style = ""; if($options{"lines"}) { $style .= "lines";} if($options{"points"}) { $style .= "points";} if(!$style) { $style = "points"; } sub usage { print "Usage: $0 \n"; print <) { chomp; my $line = $_; foreach my $point ($line =~ /$numRE/g) { my $buf = $buffers[$streamIdx]; # data buffering (up to stream sample size) push @{$buf}, $point; shift @{$buf} if(@{$buf} > $samples && $options{"stream"}); $streamIdx++; if ($streamIdx == $numberOfStreams) { $streamIdx = 0; plotStoredData($xlast, $samples, $numberOfStreams, *PIPE, \@buffers, \@extraopts) if($options{"stream"}); $xlast++; } } } if($options{"stream"}) { print PIPE "exit;\n"; close PIPE; } else { $samples = @{$buffers[0]}; plotStoredData($xlast, $samples, $numberOfStreams, *PIPE, \@buffers, \@extraopts); if( defined $options{"hardcopy"}) { print PIPE "set output\n"; # sleep until the plot file exists, and it is closed. Sometimes the output is # still being written at this point usleep(100_000) until -e $temphardcopyfile; usleep(100_000) until(system("fuser -s $temphardcopyfile")); if($outputfileType eq "pdf") { system("ps2pdf $temphardcopyfile $outputfile"); } else { system("mv $temphardcopyfile $outputfile"); } printf "Wrote output to $outputfile\n"; return; } } sleep 100000; } sub plotStoredData { my ($xlast, $samples, $numberOfStreams, $pipe, $buffers, $extraopts) = @_; my $x0 = $xlast - $samples + 1; print $pipe "set xrange [$x0:$xlast]\n"; print $pipe 'plot ' . join(', ' , map({ "\"-\" $_"} @$extraopts) ) . "\n"; foreach my $buf (@{$buffers}) { # if the buffer isn't yet complete, skip the appropriate number of points my $x = $x0 + $samples - @{$buf}; for my $elem (@{$buf}) { print $pipe "$x $elem\n"; $x++; } print PIPE "e\n"; } } main;