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