#!/usr/local/bin/perl

# @(#)$Id: wxsum,v 1.1 1998/09/06 03:35:24 twitham Rel $

# Copyright (C) 1998 Tim Witham <twitham@pcocd2.intel.com>

# (see the files README and COPYING for more details)

# This filter summarizes .tab to .day or .day to .mon by avg/min/max

$div = 16;			# how many wind direction buckets
$per = 360.0 / $div;		# degrees per division
$format0 = "\t%.3g\t%.3g\t%d\t%d\t%d\t%d"
    . "\t%.4g\t%.5g\t%d\t%.3g\t%d\t%.3g\t%d\t%d";
$format = "%d.5$format0$format0$format0\n";
@min = @MIN = qw(9999 9999 9999 9999 9999 9999 9999
		 9999 9999 9999 9999 9999 9999 9999);

sub bygust { $gust{$a} <=> $gust{$b}; }
sub bywind { $wind{$a} <=> $wind{$b}; }
sub unit_dir { int(($_[0] + ($per / 2.0)) / $per) % $div; }

sub out {
    grep($_ /= $total, @avg);	# mean
    @gust = sort bygust keys %gust; # 3 most-common wind direction buckets
    @wind = sort bywind keys %wind;
    $avg[8] = pop @gust; $avg[10] = pop @wind;
    $min[8] = pop @gust || $avg[8]; $min[10] = pop @wind || $avg[10];
    $max[8] = pop @gust || $avg[8]; $max[10] = pop @wind || $avg[10];
    $avg[8]--; $avg[10]--; $min[8]--; $min[10]--; $max[8]--; $max[10]--;
    printf $format, $hour, @avg, @min, @max;
    @min = @MIN; @max = @avg = %gust = %wind = (); $total = 0;
}

$day = 1 if grep(/day/, @ARGV);	# parsing .day or .tab files?
while (<>) {
    ($t, @d) = split;
    if ($day) {
	$next = $ARGV;
	&out if $hour != $next && defined $hour;
	for $i (0..13) {
	    $avg[$i] += $d[$i];
	    $min[$i] = $d[$i + 14] if $d[$i + 14] < $min[$i];
	    $max[$i] = $d[$i + 28] if $d[$i + 28] > $max[$i];
	}
    } else {
	$next = int($t);
	next if (($hour < 12 && $next > 12) ||
		 ($hour > 12 && $next < 12) || $next > 23);
	&out if $hour != $next && defined $hour;
	$i = 0;
	for (@d) {
	    $min[$i] = $_ if $_ < $min[$i];
	    $max[$i] = $_ if $_ > $max[$i];
	    $avg[$i++] += $_;
	}
    }
    $gust{int(&unit_dir($d[8]) * $per) + 1}++;
    $wind{int(&unit_dir($d[10]) * $per) + 1}++;
    $total++;
    $hour = $next;
}
&out;
