##################################
#                                #
# Last modified 03/11/2014       # 
#                                #
# Georgi Marinov                 #
#                                # 
##################################

import sys
import math
import random
import string

def CalculateRMSE(list1,list2):

    RMSE = 0

    for i in range(len(list1)):
        RMSE += (list1[i] - list2[i])*(list1[i] - list2[i])

    RMSE = math.sqrt(RMSE/len(list1))

    return RMSE

def run():

    if len(sys.argv) < 3:
        print 'usage: python %s table config outfilename' % sys.argv[0]
        print '\tconfig file format:'
        print '\tlabel\tfieldID1\tfieldID2'
        sys.exit(1)

    input = sys.argv[1]
    config = sys.argv[2]
    outputfilename = sys.argv[3]

    RMSEDict = {}
    WantedFields = {}
    DataDict = {}

    linelist = open(config)
    for line in linelist:
        fields = line.strip().split('\t')
        label = fields[0]
        ID1 = int(fields[1])
        ID2 = int(fields[2])
        RMSEDict[label] = (ID1,ID2)
        DataDict[ID1] = []
        DataDict[ID2] = []
        WantedFields[ID1] = 1
        WantedFields[ID2] = 1

    linelist = open(input)
    for line in linelist:
        if line.startswith('#'):
            continue
        fields = line.strip().split('\t')
        for ID in range(len(fields)):
            if WantedFields.has_key(ID):
                DataDict[ID].append(float(fields[ID]))

    labels = RMSEDict.keys()
    labels.sort()

    outfile = open(outputfilename,'w')
    outfile.write('#Name\tRMSE\n')

    for label in labels:
        (ID1,ID2) = RMSEDict[label]
        RMSE = CalculateRMSE(DataDict[ID1],DataDict[ID2])
        outline = label + '\t' + str(RMSE)
        outfile.write(outline + '\n')

    outfile.close()

run()

