1224ba2bdSOllivier Robert#! @PATH_PERL@ -w 2ce265a54SOllivier Robert# $Id$ 3224ba2bdSOllivier Robert# 4224ba2bdSOllivier Robert# Use Gnuplot to display data in summary files produced by summary.pl. 5224ba2bdSOllivier Robert# This script requires GNUPLOT 3.7! 6224ba2bdSOllivier Robert# 7224ba2bdSOllivier Robert# Copyright (c) 1997, 1999 by Ulrich Windl <Ulrich.Windl@rz.uni-regensburg.de> 8224ba2bdSOllivier Robert# 9224ba2bdSOllivier Robert# This program is free software; you can redistribute it and/or modify 10224ba2bdSOllivier Robert# it under the terms of the GNU General Public License as published by 11224ba2bdSOllivier Robert# the Free Software Foundation; either version 2 of the License, or 12224ba2bdSOllivier Robert# (at your option) any later version. 13224ba2bdSOllivier Robert# 14224ba2bdSOllivier Robert# This program is distributed in the hope that it will be useful, but 15224ba2bdSOllivier Robert# WITHOUT ANY WARRANTY; without even the implied warranty of 16224ba2bdSOllivier Robert# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17224ba2bdSOllivier Robert# General Public License for more details. 18224ba2bdSOllivier Robert# 19224ba2bdSOllivier Robert# You should have received a copy of the GNU General Public License 20224ba2bdSOllivier Robert# along with this program; if not, write to the Free Software 21224ba2bdSOllivier Robert# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 22*2b15cb3dSCy Schubertpackage plot_summary; 23*2b15cb3dSCy Schubertuse 5.006_000; 24224ba2bdSOllivier Robertuse strict; 25224ba2bdSOllivier Robertuse Time::Local; 26224ba2bdSOllivier Robert 27*2b15cb3dSCy Schubertmy ($identifier, $offset_limit, $gnuplot_terminal, $wait_after_plot, 28*2b15cb3dSCy Schubert $output_file, $output_file_number); 29224ba2bdSOllivier Robert 30*2b15cb3dSCy Schubertexit run(@ARGV) unless caller; 31224ba2bdSOllivier Robert 32*2b15cb3dSCy Schubertsub run { 33*2b15cb3dSCy Schubert my $opts; 34*2b15cb3dSCy Schubert if (!processOptions(\@_, $opts)) { 35*2b15cb3dSCy Schubert usage(1); 36224ba2bdSOllivier Robert } 37224ba2bdSOllivier Robert 38*2b15cb3dSCy Schubert $identifier = $opts->{'identifier'}; 39*2b15cb3dSCy Schubert if (!$identifier) { 40*2b15cb3dSCy Schubert $identifier = "host".`hostname`; 41224ba2bdSOllivier Robert chomp $identifier; 42*2b15cb3dSCy Schubert } 43*2b15cb3dSCy Schubert $offset_limit = $opts->{'offset-limit'}; 44*2b15cb3dSCy Schubert $output_file = $opts->{'output-file'}; 45*2b15cb3dSCy Schubert $output_file_number = 1; 46*2b15cb3dSCy Schubert $gnuplot_terminal = $opts->{'plot-terminal'} 47*2b15cb3dSCy Schubert || ( $ENV{DISPLAY} ? "x11" : "dumb" ); 48*2b15cb3dSCy Schubert $wait_after_plot = !$opts->{'dont-wait'}; 49*2b15cb3dSCy Schubert 50224ba2bdSOllivier Robert die "illegal offset-limit: $offset_limit" unless $offset_limit > 0.0; 51224ba2bdSOllivier Robert $offset_limit *= 1e6; # scale to microseconds 52224ba2bdSOllivier Robert 53*2b15cb3dSCy Schubert my $summary_dir = $opts->{'directory'}; 54*2b15cb3dSCy Schubert 55*2b15cb3dSCy Schubert my $loop_summary ="$summary_dir/loop_summary"; 56*2b15cb3dSCy Schubert my $peer_summary ="$summary_dir/peer_summary"; 57*2b15cb3dSCy Schubert my $clock_summary="$summary_dir/clock_summary"; 58*2b15cb3dSCy Schubert 59*2b15cb3dSCy Schubert my @peer_list = @{$opts->{'peer'}}; 60*2b15cb3dSCy Schubert 61*2b15cb3dSCy Schubert do_loop($loop_summary); 62*2b15cb3dSCy Schubert do_peer($peer_summary, $_) for @peer_list; 63*2b15cb3dSCy Schubert} 64*2b15cb3dSCy Schubert 65224ba2bdSOllivier Robert# return the smallest value in the given list 66224ba2bdSOllivier Robertsub min 67224ba2bdSOllivier Robert{ 68224ba2bdSOllivier Robert my ($result, @rest) = @_; 69224ba2bdSOllivier Robert map { $result = $_ if ($_ < $result) } @rest; 70224ba2bdSOllivier Robert return($result); 71224ba2bdSOllivier Robert} 72224ba2bdSOllivier Robert 73224ba2bdSOllivier Robert# return the largest value in the given list 74224ba2bdSOllivier Robertsub max 75224ba2bdSOllivier Robert{ 76224ba2bdSOllivier Robert my ($result, @rest) = @_; 77224ba2bdSOllivier Robert map { $result = $_ if ($_ > $result) } @rest; 78224ba2bdSOllivier Robert return($result); 79224ba2bdSOllivier Robert} 80224ba2bdSOllivier Robert 81224ba2bdSOllivier Robert# maybe open alternate output file 82224ba2bdSOllivier Robertsub open_output 83224ba2bdSOllivier Robert{ 84224ba2bdSOllivier Robert my $file; 85224ba2bdSOllivier Robert if ($output_file) { 86224ba2bdSOllivier Robert while ( -r ($file = "$output_file$output_file_number") ) { 87224ba2bdSOllivier Robert ++$output_file_number; 88224ba2bdSOllivier Robert } 89224ba2bdSOllivier Robert open TOUCH, ">$file" and close TOUCH or die "$file: $!"; 90224ba2bdSOllivier Robert print "set output \"$file\"\n"; 91224ba2bdSOllivier Robert } 92224ba2bdSOllivier Robert} 93224ba2bdSOllivier Robert 94224ba2bdSOllivier Robert# make Gnuplot wait 95224ba2bdSOllivier Robertsub maybe_add_pause 96224ba2bdSOllivier Robert{ 97224ba2bdSOllivier Robert print "pause -1 \"Press key to continue...\"\n" if $wait_after_plot; 98224ba2bdSOllivier Robert} 99224ba2bdSOllivier Robert 100224ba2bdSOllivier Robert# plot data from loop summary 101224ba2bdSOllivier Robertsub do_loop 102224ba2bdSOllivier Robert{ 103224ba2bdSOllivier Robert my $fname = shift; 104224ba2bdSOllivier Robert my $line; 105224ba2bdSOllivier Robert my $out_file = "/tmp/tempdata$$"; 106224ba2bdSOllivier Robert my $cmd_file = "/tmp/tempcmd$$"; 107224ba2bdSOllivier Robert my ($first_day, $day_out) = ("", 0); 108224ba2bdSOllivier Robert my ($lower_bound, $upper_bound, $rms); 109224ba2bdSOllivier Robert my ($min_offs, $max_offs) = (1e9, -1e9); 110224ba2bdSOllivier Robert my ($min_rms, $max_rms) = (1e9, -1e9); 111224ba2bdSOllivier Robert open INPUT, "$fname" or die "$fname: $!"; 112224ba2bdSOllivier Robert open OUTPUT, ">$out_file" or die "$out_file: $!"; 113224ba2bdSOllivier Robert my @Fld; 114224ba2bdSOllivier Robert while (<INPUT>) { 115224ba2bdSOllivier Robert chop; # strip record separator 116224ba2bdSOllivier Robert @Fld = split; 117224ba2bdSOllivier Robert if ($#Fld == 0) { 118224ba2bdSOllivier Robert# loops.19960405 119224ba2bdSOllivier Robert $_ = $Fld[0]; s/.*([12]\d{3}[01]\d[0-3]\d)$/$1/; 120224ba2bdSOllivier Robert m/(\d{4})(\d{2})(\d{2})/; 121224ba2bdSOllivier Robert $line = timegm(59, 59, 23, $3, $2 - 1, $1 - 1900, 0, 0, 0); 122224ba2bdSOllivier Robert $line = int $line / 86400; # days relative to 1970 123224ba2bdSOllivier Robert $first_day = "$1-$2-$3 ($line)" unless $day_out; 124224ba2bdSOllivier Robert next; 125224ba2bdSOllivier Robert } 126224ba2bdSOllivier Robert if ($#Fld != 8) { 127224ba2bdSOllivier Robert warn "Illegal number of fields in file $fname, line $."; 128224ba2bdSOllivier Robert next; 129224ba2bdSOllivier Robert } 130224ba2bdSOllivier Robert# loop 216, 856106+/-874041.5, rms 117239.8, freq 67.52+/-10.335, var 4.850 131224ba2bdSOllivier Robert $_ = $Fld[1]; s/,/ /; $line .= " $_"; 132224ba2bdSOllivier Robert $_ = $Fld[2]; m:(.+?)\+/-(.+),:; 133224ba2bdSOllivier Robert $lower_bound = $1 - $2; 134224ba2bdSOllivier Robert $upper_bound = $1 + $2; 135224ba2bdSOllivier Robert $line .= "$1 $lower_bound $upper_bound"; 136224ba2bdSOllivier Robert $min_offs = min($min_offs, $lower_bound); 137224ba2bdSOllivier Robert $max_offs = max($max_offs, $upper_bound); 138224ba2bdSOllivier Robert $_ = $Fld[4]; s/,/ /; $rms = $_; 139224ba2bdSOllivier Robert $min_rms = min($min_rms, $rms); 140224ba2bdSOllivier Robert $max_rms = max($max_rms, $rms); 141224ba2bdSOllivier Robert $line .= " $rms"; 142224ba2bdSOllivier Robert $_ = $Fld[6]; m:(.+?)\+/-(.+),:; 143224ba2bdSOllivier Robert $line .= " $1 " . ($1-$2) . " " . ($1+$2); 144224ba2bdSOllivier Robert $line .= " $Fld[8]"; 145224ba2bdSOllivier Robert print OUTPUT "$line\n"; 146224ba2bdSOllivier Robert $day_out = 1; 147224ba2bdSOllivier Robert# 9621 216 856106 -17935.5 1730147.5 117239.8 67.52 57.185 77.855 4.850 148224ba2bdSOllivier Robert } 149224ba2bdSOllivier Robert close INPUT; 150224ba2bdSOllivier Robert close OUTPUT or die "close failed on $out_file: $!"; 151224ba2bdSOllivier Robert my $ylimit = "["; 152224ba2bdSOllivier Robert if ($min_offs < -$offset_limit) { 153224ba2bdSOllivier Robert $ylimit .= "-$offset_limit"; 154224ba2bdSOllivier Robert } 155224ba2bdSOllivier Robert $ylimit .= ":"; 156224ba2bdSOllivier Robert if ($max_offs > $offset_limit) { 157224ba2bdSOllivier Robert $ylimit .= "$offset_limit"; 158224ba2bdSOllivier Robert } 159224ba2bdSOllivier Robert if ( $ylimit eq "[:" ) { 160224ba2bdSOllivier Robert $ylimit = ""; 161224ba2bdSOllivier Robert } else { 162224ba2bdSOllivier Robert $ylimit = "[] $ylimit]"; 163224ba2bdSOllivier Robert } 164224ba2bdSOllivier Robert# build command file for GNUplot 165224ba2bdSOllivier Robert open OUTPUT, "> $cmd_file" or die "$cmd_file: $!"; 166224ba2bdSOllivier Robert my $oldfh = select OUTPUT; 167224ba2bdSOllivier Robert print "set term $gnuplot_terminal\n"; 168224ba2bdSOllivier Robert open_output; 169224ba2bdSOllivier Robert print "set grid\n"; 170224ba2bdSOllivier Robert print "set title \"Loop Summary for $identifier: " . 171224ba2bdSOllivier Robert "Daily mean values since $first_day\\n" . 172224ba2bdSOllivier Robert "(Offset limit is $offset_limit microseconds)\"\n"; 173224ba2bdSOllivier Robert print "set ylabel \"[us]\"\n"; 174*2b15cb3dSCy Schubert print "set style data yerrorbars\n"; 175224ba2bdSOllivier Robert print "set multiplot\n"; 176224ba2bdSOllivier Robert print "set size 1, 0.5\n"; 177224ba2bdSOllivier Robert print "set lmargin 8\n"; 178224ba2bdSOllivier Robert print "set origin 0, 0.5\n"; 179224ba2bdSOllivier Robert print "plot $ylimit \"$out_file\"" . 180224ba2bdSOllivier Robert " using 1:3:4:5 title \"mean offset\", "; 181224ba2bdSOllivier Robert print "\"$out_file\" using 1:(\$3-\$6/2) " . 182224ba2bdSOllivier Robert "title \"(sigma low)\" with lines, "; 183224ba2bdSOllivier Robert print "\"$out_file\" using 1:3 smooth bezier " . 184224ba2bdSOllivier Robert "title \"(Bezier med)\" with lines, "; 185224ba2bdSOllivier Robert print "\"$out_file\" using 1:(\$3+\$6/2) " . 186224ba2bdSOllivier Robert "title \"(sigma high)\" with lines\n"; 187224ba2bdSOllivier Robert print "set ylabel \"[ppm]\"\n"; 188224ba2bdSOllivier Robert print "set origin 0, 0.0\n"; 189224ba2bdSOllivier Robert print "set title\n"; 190224ba2bdSOllivier Robert print "set xlabel \"Days relative to 1970\"\n"; 191224ba2bdSOllivier Robert print "plot \"$out_file\" using 1:7:8:9 title \"mean frequency\", "; 192224ba2bdSOllivier Robert print "\"$out_file\" using 1:(\$7-\$10/2) " . 193224ba2bdSOllivier Robert "title \"(sigma low)\" with lines, "; 194224ba2bdSOllivier Robert print "\"$out_file\" using 1:7 smooth bezier " . 195224ba2bdSOllivier Robert "title \"(Bezier med)\" with lines, "; 196224ba2bdSOllivier Robert print "\"$out_file\" using 1:(\$7+\$10/2) " . 197224ba2bdSOllivier Robert "title \"(sigma high)\" with lines\n"; 198224ba2bdSOllivier Robert print "set nomultiplot\n"; 199224ba2bdSOllivier Robert maybe_add_pause; 200224ba2bdSOllivier Robert 201224ba2bdSOllivier Robert $ylimit = "["; 202224ba2bdSOllivier Robert if ($min_rms < -$offset_limit) { 203224ba2bdSOllivier Robert $ylimit .= "-$offset_limit"; 204224ba2bdSOllivier Robert } 205224ba2bdSOllivier Robert $ylimit .= ":"; 206224ba2bdSOllivier Robert if ($max_rms > $offset_limit) { 207224ba2bdSOllivier Robert $ylimit .= "$offset_limit"; 208224ba2bdSOllivier Robert } 209224ba2bdSOllivier Robert if ( $ylimit eq "[:" ) { 210224ba2bdSOllivier Robert $ylimit =""; 211224ba2bdSOllivier Robert } else { 212224ba2bdSOllivier Robert $ylimit = "[] $ylimit]"; 213224ba2bdSOllivier Robert } 214224ba2bdSOllivier Robert 215224ba2bdSOllivier Robert open_output; 216224ba2bdSOllivier Robert print "set title \"Loop Summary for $identifier: " . 217224ba2bdSOllivier Robert "Standard deviation since $first_day\\n" . 218224ba2bdSOllivier Robert "(Offset limit is $offset_limit microseconds)\"\n"; 219224ba2bdSOllivier Robert print "set xlabel\n"; 220224ba2bdSOllivier Robert print "set ylabel \"[us]\"\n"; 221224ba2bdSOllivier Robert print "set origin 0, 0.5\n"; 222*2b15cb3dSCy Schubert print "set style data linespoints\n"; 223224ba2bdSOllivier Robert print "set multiplot\n"; 224224ba2bdSOllivier Robert print "plot $ylimit \"$out_file\" using 1:6 title \"Offset\", "; 225224ba2bdSOllivier Robert print "\"$out_file\" using 1:6 smooth bezier " . 226224ba2bdSOllivier Robert "title \"(Bezier)\" with lines\n"; 227224ba2bdSOllivier Robert print "set title\n"; 228224ba2bdSOllivier Robert print "set origin 0, 0.0\n"; 229224ba2bdSOllivier Robert print "set xlabel \"Days relative to 1970\"\n"; 230224ba2bdSOllivier Robert print "set ylabel \"[ppm]\"\n"; 231224ba2bdSOllivier Robert print "plot \"$out_file\" using 1:10 title \"Frequency\", "; 232224ba2bdSOllivier Robert print "\"$out_file\" using 1:10 smooth bezier " . 233224ba2bdSOllivier Robert "title \"(Bezier)\" with lines\n"; 234224ba2bdSOllivier Robert print "set nomultiplot\n"; 235224ba2bdSOllivier Robert maybe_add_pause; 236224ba2bdSOllivier Robert 237224ba2bdSOllivier Robert close OUTPUT or die "close failed on $cmd_file: $!"; 238224ba2bdSOllivier Robert select $oldfh; 239224ba2bdSOllivier Robert print `gnuplot $cmd_file`; 240224ba2bdSOllivier Robert unlink $cmd_file; 241224ba2bdSOllivier Robert unlink $out_file; 242224ba2bdSOllivier Robert} 243224ba2bdSOllivier Robert 244224ba2bdSOllivier Robert# plot data form peer summary 245224ba2bdSOllivier Robertsub do_peer 246224ba2bdSOllivier Robert{ 247224ba2bdSOllivier Robert my $fname = shift; 248224ba2bdSOllivier Robert my $peer = shift; 249224ba2bdSOllivier Robert my $out_file = "/tmp/tempdata$$"; 250224ba2bdSOllivier Robert my $cmd_file = "/tmp/tempcmd$$"; 251224ba2bdSOllivier Robert my $line; 252224ba2bdSOllivier Robert my ($first_day, $day_out) = ("", 0); 253224ba2bdSOllivier Robert open INPUT, "$fname" or die "$fname: $!"; 254224ba2bdSOllivier Robert open OUTPUT, ">$out_file" or die "$out_file: $!"; 255224ba2bdSOllivier Robert my @Fld; 256224ba2bdSOllivier Robert while (<INPUT>) { 257224ba2bdSOllivier Robert chop; # strip record separator 258224ba2bdSOllivier Robert @Fld = split; 259224ba2bdSOllivier Robert if ($#Fld == 0) { 260224ba2bdSOllivier Robert# peers.19960405 261224ba2bdSOllivier Robert $_ = $Fld[0]; s/.*([12]\d{3}[01]\d[0-3]\d)$/$1/; 262224ba2bdSOllivier Robert m/(\d{4})(\d{2})(\d{2})/ or next; 263224ba2bdSOllivier Robert $line = timegm(59, 59, 23, $3, $2 - 1, $1 - 1900, 0, 0, 0); 264224ba2bdSOllivier Robert $line = int $line / 86400; # days relative to 1970 265224ba2bdSOllivier Robert $first_day = "$1-$2-$3 ($line)" unless $day_out; 266224ba2bdSOllivier Robert next; 267224ba2bdSOllivier Robert } 268224ba2bdSOllivier Robert if ($#Fld != 7) { 269224ba2bdSOllivier Robert warn "Illegal number of fields in file $fname, line $."; 270224ba2bdSOllivier Robert next; 271224ba2bdSOllivier Robert } 272224ba2bdSOllivier Robert next if ($Fld[0] ne $peer); 273224ba2bdSOllivier Robert# ident cnt mean rms max delay dist disp 274224ba2bdSOllivier Robert# 127.127.8.1 38 30.972 189.867 1154.607 0.000 879.760 111.037 275224ba2bdSOllivier Robert $Fld[0] = $line; 276224ba2bdSOllivier Robert print OUTPUT join(' ', @Fld) . "\n"; 277224ba2bdSOllivier Robert# 9969 38 30.972 189.867 1154.607 0.000 879.760 111.037 278224ba2bdSOllivier Robert $day_out = 1; 279224ba2bdSOllivier Robert } 280224ba2bdSOllivier Robert close INPUT; 281224ba2bdSOllivier Robert close OUTPUT or die "close failed on $out_file: $!"; 282224ba2bdSOllivier Robert die "no data found for peer $peer" if !$day_out; 283224ba2bdSOllivier Robert open OUTPUT, "> $cmd_file" or die "$cmd_file: $!"; 284224ba2bdSOllivier Robert my $oldfh = select OUTPUT; 285224ba2bdSOllivier Robert print "set term $gnuplot_terminal\n"; 286224ba2bdSOllivier Robert open_output; 287224ba2bdSOllivier Robert print "set grid\n"; 288224ba2bdSOllivier Robert print "set multiplot\n"; 289224ba2bdSOllivier Robert print "set lmargin 8\n"; 290224ba2bdSOllivier Robert print "set size 1, 0.34\n"; 291224ba2bdSOllivier Robert print "set origin 0, 0.66\n"; 292224ba2bdSOllivier Robert print "set title " . 293224ba2bdSOllivier Robert "\"Peer Summary for $peer on $identifier since $first_day\"\n"; 294*2b15cb3dSCy Schubert print "set style data linespoints\n"; 295224ba2bdSOllivier Robert print "set ylabel \"[us]\"\n"; 296224ba2bdSOllivier Robert print "plot \"$out_file\" using 1:3 title \"mean offset\", "; 297224ba2bdSOllivier Robert print "\"$out_file\" using 1:3 smooth bezier " . 298224ba2bdSOllivier Robert "title \"(Bezier)\" with lines, "; 299224ba2bdSOllivier Robert print "\"$out_file\" using 1:(\$3-\$7/2) " . 300224ba2bdSOllivier Robert "title \"(sigma low)\" with lines, "; 301224ba2bdSOllivier Robert print "\"$out_file\" using 1:(\$3+\$7/2) " . 302224ba2bdSOllivier Robert "title \"(sigma high)\" with lines\n"; 303224ba2bdSOllivier Robert print "set title\n"; 304224ba2bdSOllivier Robert print "set origin 0, 0.34\n"; 305224ba2bdSOllivier Robert print "set size 1, 0.32\n"; 306224ba2bdSOllivier Robert print "set ylabel\n"; 307224ba2bdSOllivier Robert print "plot \"$out_file\" using 1:7 title \"dist\", "; 308224ba2bdSOllivier Robert print "\"$out_file\" using 1:7 smooth bezier " . 309224ba2bdSOllivier Robert "title \"(Bezier)\" with lines\n"; 310224ba2bdSOllivier Robert print "set origin 0, 0.00\n"; 311224ba2bdSOllivier Robert print "set size 1, 0.35\n"; 312224ba2bdSOllivier Robert print "set xlabel \"Days relative to 1970\"\n"; 313224ba2bdSOllivier Robert print "plot \"$out_file\" using 1:8 title \"disp\", "; 314224ba2bdSOllivier Robert print "\"$out_file\" using 1:8 smooth bezier " . 315224ba2bdSOllivier Robert "title \"(Bezier)\" with lines\n"; 316224ba2bdSOllivier Robert print "set nomultiplot\n"; 317224ba2bdSOllivier Robert maybe_add_pause; 318224ba2bdSOllivier Robert 319224ba2bdSOllivier Robert select $oldfh; 320224ba2bdSOllivier Robert close OUTPUT or die "close failed on $cmd_file: $!"; 321224ba2bdSOllivier Robert print `gnuplot $cmd_file`; 322224ba2bdSOllivier Robert unlink $cmd_file; 323224ba2bdSOllivier Robert unlink $out_file; 324224ba2bdSOllivier Robert} 325224ba2bdSOllivier Robert 326*2b15cb3dSCy Schubert@plot_summary_opts@ 327224ba2bdSOllivier Robert 328*2b15cb3dSCy Schubert1; 329*2b15cb3dSCy Schubert__END__ 330