#!/usr/local/bin/perl
#                                      (C) Hans Wolfgang Loidl, November 1995
#############################################################################
# Time-stamp: <Sun Nov  5 1995 00:23:45 Stardate: [-31]6545.08 hwloidl>
#
# Usage: SN [options] <gr-file>
#
# Create a summary of spark names that occur in gr-file (only END events in 
# gr-file are necessary). Creates a gnuplot impulses graph (spark names by 
# number of threads) as summary.
#
# Options:
#  -h        ... help; print this text.
#  -v        ... verbose mode.
#
#############################################################################

$gran_dir = $ENV{'GRANDIR'};
if ( $gran_dir eq "" ) {
    print STDERR "SN: Warning: Env variable GRANDIR is undefined\n";
}

push(@INC, $gran_dir, $gran_dir . "/bin");
# print STDERR "INC: " . join(':',@INC) . "\n";

require "getopts.pl";
require "aux.pl";
require "stats.pl";

&Getopts('hv');  

do process_options();

if ( $opt_v ) { do print_verbose_message(); }

# ---------------------------------------------------------------------------
# Init
# ---------------------------------------------------------------------------

chop($date = `date`);
chop($stardate = `stardate`);

open (IN,"<$input") || die "$!: $input";
$n = 0;
$is_end=0;
while (<IN>) {
    $is_end = 1 if /END\s+(\w+).*SN\s+(\d+).*RT\s*(\d+)/;
    next unless $is_end;
    $n++;
    $sn = $2;
    $rt = $3;
    #$sn_dec = hex($sn);
    $num_sns{$sn}++;
    $rts_sns{$sn} += $rt;
    #do inc ($sn_dec);
    $is_end=0;
}
close (IN);

@sorted_keys=sort {$a<=>$b} keys(%num_sns);
#$max_val=&list_max(@sorted_keys);

open (SUM,">$summary") || die "$!: $summary";

print SUM "# Generated by SN at $date $stardate\n";
print SUM "# Input file: $input\n";
print SUM "#" . "-"x77 . "\n";
print SUM "Total number of threads: $n\n";
print SUM "# Format: SN: Spark Site N: Number of threads AVG: average RT\n";
# . "RTS: Sum of RTs ";

foreach $k (@sorted_keys) {
    $num = $num_sns{$k};
    $rts = $rts_sns{$k};
    $avg = $rts/$num;
    #print SUM "SN: $k \tN: $num \tRTS: $rts \tAVG: $avg\n";
    print SUM "$k \t$num \t$avg\n";
}
close (SUM);

open (OUT,">$output") || die "$!: $output";
print OUT "# Generated by SN at $date $stardate\n";
print OUT "# Input file: $input\n";
print OUT "#" . "-"x77 . "\n";

$max_val=0;
foreach $k (@sorted_keys) {
    $num = $num_sns{$k};
    $max_val = $num      if $num > $max_val;
    print OUT "$k\t$num\n";
}
close (OUT);

do write_gp($gp_file,$ps_file); 

print "Gnu plotting figures ...\n";
system "gnuplot $gp_file";

print "Extending thickness of impulses ...\n";
$ext_size = 100;
$gray = 0.3;
do gp_ext($ps_file);

exit (0);

# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

sub inc {
    local ($sn) = @_;
    local (@k);
    
    @k = keys(%num_sns);
    if ( &is_elem($sn, @k) ) { 
	$num_sns{$sn}++;
    } else {
	$num_sns{$sn} = 1;
    }
}

# ----------------------------------------------------------------------------

sub is_elem { 
    local ($x,@list) = @_;
    local ($found);

    for ($found = 0, $y = shift(@list); 
	 $#list == -1 || $found;  
	 $found = ($x == $y), $y = shift(@list)) {}

    return ($found);
}

# ----------------------------------------------------------------------------

# -----------------------------------------------------------------------------

sub process_options {

    if ( $opt_h ) {                      
	open(ME,$0) || die "Can't open myself ($0): $!\n";
	$n = 0;
	while (<ME>) {
	    last if $_ =~ /^$/;
	    print $_;
	    $n++;
	}
	close(ME);
	exit ;
    }
    
    if ( $opt_s ) {
	$opt_s =~ s/[\(\)\[\]]//g;
	@sparks = split(/[,;. ]+/, $opt_s);
    } else {
	@sparks = ( 3, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15);
    }

    if ( $#ARGV != 0 ) {
	print "Usage: $0 [options] <gr-file>\n;";
	print "Use -h option to get details\n";
	exit 1;
    }

    $input = $ARGV[0];
    ($ps_file = $input) =~ s/\.gr/-SN.ps/;
    ($gp_file = $input) =~ s/\.gr/-SN.gp/;
    ($summary = $input) =~ s/\.gr/-SN.sn/;

    #($basename = $gr_file) =~ s/\.gr//;
    #$rts_file = $basename . ".rts";        # "RTS";
    #$gran_file = "g.ps"; # $basename . ".ps";
    #$rts_file = $gr_file;
    #$rts_file =~ s/\.gr/.rts/g;

    if ( $opt_o ) {
	$output = $opt_o;
    } else {
	($output = $input) =~ s/\.gr/-SN.dat/;
    }

    if ( $opt_e ) {
	$ext_size = $opt_e; 
    } else {
	$ext_size = 100; 
    }
    
    if ( $opt_i ) {
	$gray = $opt_i; 
    } else {
	$gray = 0; 
    }
}

# -----------------------------------------------------------------------------

sub print_verbose_message {
    print "Input: $input \tOutput: $output\n";
}

# -----------------------------------------------------------------------------

# ToDo: Takes these from global module:

# ----------------------------------------------------------------------------

sub gp_ext {
    local (@file_names) = @_;
    local ($file_name);
    local ($ps_file_name);
    local ($prg);

    #$prg = system "which gp-ext-imp";
    #print "  Using script $prg for impuls extension\n";
    $prg = $ENV{GRANDIR} ? $ENV{GRANDIR} . "/bin/gp-ext-imp" 
	                 : $ENV{HOME} . "/bin/gp-ext-imp" ;
    if ( $opt_v ) {
	print "    (using script $prg)\n";
    }

    foreach $file_name (@file_names) {
	$ps_file_name = $file_name; # NB change to orig !!!!&dat2ps_name($file_name);
        system "$prg -w $ext_size -g $gray " . 
               $ps_file_name  . " " . 
               $ps_file_name . "2" ;
        system "mv " . $ps_file_name . "2 " . $ps_file_name;
    }
}

# ----------------------------------------------------------------------------

sub write_gp { 
    local ($gp_file,$ps_file) = @_;
    local ($str);

    $xsize = 1;
    $ysize = 1;
    $xlabel = "Spark sites";
    $ylabel = "Number of threads";
    $xstart = &list_min(@sorted_keys);
    $xend = &list_max(@sorted_keys);
    $ymax = $max_val; 
    $xtics = ""; "(" . join(',',@sorted_keys) . ")\n";
    $in_file = $output;
    $out_file = $ps_file;

    open (GP,">$gp_file") || die "$!: $gp_file";
    print GP "set term postscript \"Roman\" 20\n";

    # identical to the part in write_gp_record of RTS2gran

    $str = "set size " . $xsize . "," . $ysize . "\n" .
           "set xlabel \"" . $xlabel . "\"\n" .
           "set ylabel \"" . $ylabel . "\"\n" .
           ($xstart eq "" ? "" 
                          : "set xrange [" . int($xstart) .":" . int($xend) . "]\n") .
           ($opt_Y ? 
	      ("set yrange [" . (index($logaxes,"y") != -1 ? 1 : 0) . ":$opt_Y]\n") :
	      ($ymax eq "" ? "" 
                        : "set yrange [" . (index($logaxes,"y") != -1 ? 1 : 0) . 
                          ":" . &list_max(2,int($ymax+$ymax/5)) . "]\n")) .
           ($xtics ne "" ? "set xtics $xtics" : "") . 
	   "set tics out\n" .
           "set border\n" .
           ( $nPEs!=0 ? "set title \"$nPEs PEs\"\n" : "" ) .
	   "set nokey \n" .
           "set nozeroaxis\n" .
	   "set format xy \"%8.8g\"\n" .
           (index($logaxes,"x") != -1 ? 
               "set logscale x\n" : 
               "set nologscale x\n") .
           (index($logaxes,"y") != -1 ? 
               "set logscale y\n" : 
               "set nologscale y\n") .
           "set output \"" . $out_file . "\"\n" .
	   "plot \"" . $in_file . "\" with impulses\n\n";
    print GP $str;
    close (GP);
}

# ----------------------------------------------------------------------------
