#!/usr/bin/env python

import os, re, sys

progname = os.path.basename(sys.argv.pop(0))

opts = []
optss = {}

while sys.argv:
    if sys.argv[0][0] != '-':
        break
    a = sys.argv.pop(0)
    if re.match(r'^-(min|max|mean|median|sd|n|\d+)$', a):
        o = a[1:]
        if optss.has_key(o):
            sys.stderr.write('\nError %s: Duplicate option: %s\n\n' % (progname, a))
            sys.exit(1)
        optss[o] = True
        opts.append(o)
    else:
        sys.stderr.write('\nError %s: Illegal option: %s\n\n' % (progname, a))
        sys.exit(1)

if not opts or not sys.argv:
    sys.stderr.write('''
Usage: %s [-min] [-max] [-mean] [-median] [-sd] [-n] [-1] [-2] ...  file(s)

  -min :    minimum by line
  -max :    maximum by line
  -mean :   mean by line
  -median : median by line
  -sd :     standard deviation by line
  -n :      total number of lines by location
  -1 :      column 1
  -2 :      column 2
            etc.

Except for option -n, all values are averaged by location

''' % progname)
    sys.exit(1)

data = {}

for filename in sys.argv:
    fp = open(filename, 'r')
    skipheader = True
    for line in fp:
        line = line.strip()
        if not line or line[0] == '#':
            continue

        if skipheader:
            skipheader = False
            continue

        loc, s, v = line.split('\t', 2)
        vals = [float(f) for f in v.split('\t')]

        if not data.has_key(loc):
            data[loc] = {'n': 0}
            for o in opts:
                if o != 'n':
                    data[loc][o] = 0.0

        data[loc]['n'] += 1

        for o in opts:
            if o == 'min':
                data[loc]['min'] += min(vals)
            elif o == 'max':
                data[loc]['max'] += max(vals)
            elif o == 'mean':
                data[loc]['mean'] += sum(vals) / len(vals)
            elif o == 'median':
                vals.sort()
                n = len(vals)
                if n % 2:
                    data[loc]['median'] += vals[int(n / 2)]
                else:
                    data[loc]['median'] += (vals[n / 2 - 1] + vals[n / 2]) / 2.0
            elif o == 'sd':
                ssum = sum([f * f for f in vals])
                n = float(len(vals))
                data[loc]['sd'] += ((ssum - sum(vals) ** 2 / n) / (n - 1)) ** .5
            elif o == 'n':
                pass
            else:
                data[loc][o] += vals[int(o) - 1]

    fp.close()

sys.stdout.write('LOCATION\t' + '\t'.join(opts) + '\n')
locs = data.keys()
locs.sort()
for loc in locs:
    sys.stdout.write(loc)
    for o in opts:
        if o == 'n':
            sys.stdout.write('\t%i' % data[loc]['n'])
        else:
            sys.stdout.write('\t%g' % (data[loc][o] / float(data[loc]['n'])))
    sys.stdout.write('\n')

