#!/usr/bin/env python

import os, sys

tmpfile = '/tmp/procrustes.tmp.%i' % os.getpid()

def unquote(s):
    s = s.strip()
    if s[0] == '"' and s[-1] == '"':
        return s[1:-1].replace('\\\\', '\n').replace('\\', '').replace('\n', '\\').strip()
    else:
        return s


def getline(fp, required = False):
    while True:
        line = fp.readline()
        if not line:
            break
        line = line.strip()
        if line and line[0] != '#':
            return unquote(line)

    assert not required
    return False

d, progname = os.path.split(sys.argv[0])

if len(sys.argv) != 4:
    sys.stderr.write('''
Usage: %s target source output

target: input vector file
source: input vector file to be rotated
output: output vector file

source can have less items than target

''' % progname)
    sys.exit()

target = sys.argv[1]
source = sys.argv[2]
output = sys.argv[3]

if os.access(output, os.F_OK):
    sys.stdout.write('\nError %s: file exists: %s\n\n' % (progname, output))
    sys.exit()

labels = []
items = {}

fp = open(source, 'r')
n = int(getline(fp, True))
while True:
    lbl = getline(fp)
    if not lbl:
        break
    labels.append(lbl)
    items[lbl] = {}
    items[lbl]['source'] = []
    items[lbl]['target'] = []
    for i in range(n):
        items[lbl]['source'].append(float(getline(fp, True)))
fp.close()

fp = open(target, 'r')
n2 = int(getline(fp, True))
assert n == n2
while True:
    lbl = getline(fp)
    if not lbl:
        break
    if not items.has_key(lbl):
        items[lbl] = {}
    items[lbl]['target'] = []
    for i in range(n):
        items[lbl]['target'].append(float(getline(fp, True)))
fp.close()

for lbl in labels:
    assert len(items[lbl]['target']) == n

fp = open(tmpfile, 'w')
fp.write('%i\n' % n)
for lbl in labels:
    fp.write('%s\n' % lbl)
    for i in range(n):
        fp.write('%g\n' % items[lbl]['target'][i])
fp.close()

fp = os.popen('R --quiet --no-save --no-restore', 'w')
fp.write('''
library(iL04)
library(vegan)
X <- read.vec("%(tmpfile)s")
Y <- read.vec("%(source)s")
Y2 <- procrustes(X, Y)$Yrot
write.vec(Y2, "%(output)s")
''' % vars())
fp.close()

os.remove(tmpfile)
