# Autor: Timo Smieszek
# Paper: Contact diaries versus wearable proximity sensors in measuring contact patterns at a conference: method comparison and participants’ attitudes

import csv
import sys
import random as rnd
from scipy import stats as sts
import numpy as npy
import matplotlib.pyplot as plt
import networkx as nx

DIR = "" # replace with directory of data files.

class Full_Data(object):

    def __init__(self, participants, survey, sensor, bs_sample_sz=10000):

        self.participants = participants
        self.survey = survey
        self.sensor = sensor

        self.id_list = self.participants.id_list

        self.bs_sample = self.bootstrap_list(bs_sample_sz)

    def bootstrap_list(self, sample_sz):

        bs_sample = []

        for i in range(0, sample_sz):
            tmp_sample = []
            for j in range(0,len(self.id_list)):
                tmp_sample.append(rnd.choice(self.id_list))
            bs_sample.append(tmp_sample)

        print "Full_Data.boostrap_list: created %0i x %0i boostrap samples" %(
                                              len(bs_sample),len(bs_sample[-1]))
        return bs_sample

    def degree_list(self):

        print
        print "id,se_deg_all,se_deg_5min,se_deg_15min,su_deg_all,su_deg_5min,sue_deg_15min"

        for id1 in self.id_list:

            sensor_deg_all = 0
            sensor_deg_5min = 0
            sensor_deg_15min = 0

            if id1 in self.sensor.duration:
                for id2 in self.sensor.duration[id1]:
                    if self.sensor.duration[id1][id2] >= 900:
                        sensor_deg_all += 1
                        sensor_deg_5min += 1
                        sensor_deg_15min += 1
                    elif self.sensor.duration[id1][id2] >= 300:
                        sensor_deg_all += 1
                        sensor_deg_5min += 1
                    elif self.sensor.duration[id1][id2] >= 20:
                        sensor_deg_all += 1

            survey_deg_all = 0
            survey_deg_5min = 0
            survey_deg_15min = 0

            if id1 in self.survey.duration:
                for id2 in self.survey.duration[id1]:
                    if self.survey.duration[id1][id2] in [3,4]:
                        survey_deg_all += 1
                        survey_deg_5min += 1
                        survey_deg_15min += 1
                    elif self.survey.duration[id1][id2] in [2]:
                        survey_deg_all += 1
                        survey_deg_5min += 1
                    else:
                        survey_deg_all += 1

            print "%0i,%0i,%0i,%0i,%0i,%0i,%0i" %(id1,
                                                  sensor_deg_all,
                                                  sensor_deg_5min,
                                                  sensor_deg_15min,
                                                  survey_deg_all,
                                                  survey_deg_5min,
                                                  survey_deg_15min)


    def degree_distribution(self):

        sensor_degs = []
        survey_degs = []
        survey_amended_degs = []

        for id1 in self.id_list:
            if id1 in self.sensor.duration:
                sensor_degs.append(len(self.sensor.duration[id1]))
            else:
                sensor_degs.append(0)

        for id1 in self.id_list:
            deg = 0
            if id1 in self.survey.duration:
                deg = len(self.survey.duration[id1])
                survey_degs.append(deg)
                for id2 in self.survey.duration:
                    if id1 in self.survey.duration[id2]:
                        if not id2 in self.survey.duration[id1]:
                            deg += 1
                survey_amended_degs.append(deg)
            else:
                survey_degs.append(0)
                for id2 in self.survey.duration:
                    if id1 in self.survey.duration[id2]:
                        deg += 1
                survey_amended_degs.append(deg)

        print 'Survey     mean %2.3f stdv %1.3f median %2.3f IQR %0i-%0i min %2i max %2i cv %3.3f' %(
                                                    npy.mean(survey_degs),
                                                    npy.std(survey_degs),
                                                    npy.median(survey_degs),
                                                    sts.scoreatpercentile(survey_degs,25),
                                                    sts.scoreatpercentile(survey_degs,75),
                                                    min(survey_degs),
                                                    max(survey_degs),
                                                    sts.variation(survey_degs))

        print 'Survey am. mean %2.3f stdv %1.3f median %2.3f IQR %0i-%0i min %2i max %2i cv %3.3f' %(
                                              npy.mean(survey_amended_degs),
                                              npy.std(survey_amended_degs),
                                              npy.median(survey_amended_degs),
                                              sts.scoreatpercentile(survey_amended_degs,25),
                                              sts.scoreatpercentile(survey_amended_degs,75),
                                              min(survey_amended_degs),
                                              max(survey_amended_degs),
                                              sts.variation(survey_amended_degs))

        print 'Sensor     mean %2.3f stdv %1.3f median %2.3f IQR %0i-%0i min %2i max %2i cv %3.3f' %(
                                                    npy.mean(sensor_degs),
                                                    npy.std(sensor_degs),
                                                    npy.median(sensor_degs),
                                                    sts.scoreatpercentile(sensor_degs,25),
                                                    sts.scoreatpercentile(sensor_degs,75),
                                                    min(sensor_degs),
                                                    max(sensor_degs),
                                                    sts.variation(sensor_degs))

    def degree_distribution_long_conts(self):

        sensor_degs = []
        survey_degs = []
        survey_amended_degs = []

        for id1 in self.id_list:
            if id1 in self.sensor.duration:
                degs = 0
                for id2 in self.sensor.duration[id1]:
                    if self.sensor.duration[id1][id2] >= 900: degs += 1
                sensor_degs.append(degs)
            else:
                sensor_degs.append(0)

        for id1 in self.id_list:
            deg = 0
            if id1 in self.survey.duration:
                degs = 0
                for id2 in self.survey.duration[id1]:
                    if self.survey.duration[id1][id2] in [3,4,5]: degs += 1
                survey_degs.append(degs)
                for id2 in self.survey.duration:
                    if id1 in self.survey.duration[id2]:
                        if not id2 in self.survey.duration[id1]:
                            if self.survey.duration[id2][id1] in [3,4,5]:
                                degs += 1
                survey_amended_degs.append(degs)
            else:
                survey_degs.append(0)
                for id2 in self.survey.duration:
                    if id1 in self.survey.duration[id2]:
                       if self.survey.duration[id2][id1] in [3,4,5]:
                           degs += 1
                survey_amended_degs.append(degs)

        print 'Survey     mean %2.3f stdv %1.3f median %2.3f IQR %0i-%0i min %2i max %2i cv %3.3f' %(
                                                    npy.mean(survey_degs),
                                                    npy.std(survey_degs),
                                                    npy.median(survey_degs),
                                                    sts.scoreatpercentile(survey_degs,25),
                                                    sts.scoreatpercentile(survey_degs,75),
                                                    min(survey_degs),
                                                    max(survey_degs),
                                                    sts.variation(survey_degs))

        print 'Survey am. mean %2.3f stdv %1.3f median %2.3f IQR %0i-%0i min %2i max %2i cv %3.3f' %(
                                              npy.mean(survey_amended_degs),
                                              npy.std(survey_amended_degs),
                                              npy.median(survey_amended_degs),
                                              sts.scoreatpercentile(survey_amended_degs,25),
                                              sts.scoreatpercentile(survey_amended_degs,75),
                                              min(survey_amended_degs),
                                              max(survey_amended_degs),
                                              sts.variation(survey_amended_degs))

        print 'Sensor     mean %2.3f stdv %1.3f median %2.3f IQR %0i-%0i min %2i max %2i cv %3.3f' %(
                                                    npy.mean(sensor_degs),
                                                    npy.std(sensor_degs),
                                                    npy.median(sensor_degs),
                                                    sts.scoreatpercentile(sensor_degs,25),
                                                    sts.scoreatpercentile(sensor_degs,75),
                                                    min(sensor_degs),
                                                    max(sensor_degs),
                                                    sts.variation(sensor_degs))

    def degree_strength_lists(self):

        sensor_strength = {}
        survey_strength_min = {}
        survey_strength_middle = {}
        survey_strength_max = {}

        pos_minus = 0
        pos_neutr = 0
        pos_plus  = 0

        dur_min = {1:20, 2:300, 3:900, 4:3600, 9:20}
        dur_mid = {1:150, 2:600, 3:2250, 4:5400, 9:2041} #2041 is the average of the middle durations
        dur_max = {1:300, 2:900, 3:3600, 4:7200, 9:7200}

        for id1 in self.id_list:
            sensor_strength[id1] = 0
            survey_strength_min[id1] = 0
            survey_strength_middle[id1] = 0
            survey_strength_max[id1] = 0

        for id1 in self.id_list:
            if id1 in self.sensor.duration:
                for id2 in self.sensor.duration[id1]:
                    sensor_strength[id1] += self.sensor.duration[id1][id2]

        print
        print 's_sensor,s_sury_min,s_surv_mid,s_surv_max,position'

        for id1 in self.id_list:

            if id1 in self.survey.duration:
                for id2 in self.survey.duration[id1]:

                    dur1 = self.survey.duration[id1][id2]
                    dur2 = 10

                    if id2 in self.survey.duration:
                        if id1 in self.survey.duration[id2]:
                            dur2 = self.survey.duration[id2][id1]

                    mi_dur = min(dur1,dur2)
                    ma_dur = max(dur1,dur2)

                    if ma_dur == 9:
                        survey_strength_min[id1] += dur_min[mi_dur]
                        survey_strength_middle[id1] += dur_mid[dur1]
                        survey_strength_max[id1] += dur_max[mi_dur]
                    elif ma_dur == 10:
                        survey_strength_middle[id1] += dur_mid[dur1]
                        survey_strength_max[id1] += dur_max[mi_dur]
                    else:
                        survey_strength_min[id1] += dur_min[mi_dur]
                        survey_strength_middle[id1] += dur_mid[dur1]
                        survey_strength_max[id1] += dur_max[ma_dur]

            for id2 in self.id_list:
                if id2 in self.survey.duration:
                    if id1 in self.survey.duration[id2]:
                        if id1 in self.survey.duration:
                            if id2 in self.survey.duration[id1]:
                                continue
                        survey_strength_max[id1] += dur_max[
                                                 self.survey.duration[id2][id1]]

            if sensor_strength[id1] >= survey_strength_min[id1]:
                if sensor_strength[id1] <= survey_strength_max[id1]:
                    position = 0
                    pos_neutr += 1
                else:
                    position = 1
                    pos_plus += 1
            else:
                position = -1
                pos_minus +=1

            print '%0i,%2.3f,%2.3f,%2.3f,%2.3f,%1i' %(
                                       id1,
                                       float(sensor_strength[id1])/3600.,
                                       float(survey_strength_min[id1])/3600.,
                                       float(survey_strength_middle[id1])/3600.,
                                       float(survey_strength_max[id1])/3600.,
                                       position)

        print
        print '- %0i   0 %0i   + %0i' %(pos_minus,pos_neutr,pos_plus)


    def create_duration_by_duration_table(self):

        # 1st is survey; 2nd is sensor
        table = {0:{0:0, 1:0, 2:0, 3:0, 4:0, 9:0},
                 1:{0:0, 1:0, 2:0, 3:0, 4:0, 9:0},
                 2:{0:0, 1:0, 2:0, 3:0, 4:0, 9:0},
                 3:{0:0, 1:0, 2:0, 3:0, 4:0, 9:0},
                 4:{0:0, 1:0, 2:0, 3:0, 4:0, 9:0},
                 9:{0:0, 1:0, 2:0, 3:0, 4:0, 9:0}}

        for id1 in self.id_list:
            for id2 in self.sensor.id_list:

                if id1 in self.survey.duration:
                    if id2 in self.survey.duration[id1]:
                        su = self.survey.duration[id1][id2]
                    else:
                        su = 0
                else:
                    su = 0

                if id1 in self.sensor.duration:
                    if id2 in self.sensor.duration[id1]:
                        if self.sensor.duration[id1][id2] <= 300:
                            se = 1
                        elif self.sensor.duration[id1][id2] <= 900:
                            se = 2
                        elif self.sensor.duration[id1][id2] <= 3600:
                            se = 3
                        else:
                            se = 4
                    else:
                        se = 0
                else:
                    se = 0

                table[su][se] += 1

            if id1 in self.survey.duration:
                for id2 in self.survey.duration[id1]:

                    if id2 > 800:
                        se = 9
                        su = self.survey.duration[id1][id2]
                        table[su][se] += 1

        print ' survey V    sensor > '
        print
        print '          no cont.  < 5 min   5-15 min  15-60 min > 60 min  unknown ID'
        print 'no cont.  --------- %9i %9i %9i %9i %9i' %(table[0][1],
                                                          table[0][2],
                                                          table[0][3],
                                                          table[0][4],
                                                          table[0][9])
        print '< 5 min   %9i %9i %9i %9i %9i %9i' %(table[1][0],
                                                    table[1][1],
                                                    table[1][2],
                                                    table[1][3],
                                                    table[1][4],
                                                    table[1][9])
        print '5-15 min  %9i %9i %9i %9i %9i %9i' %(table[2][0],
                                                    table[2][1],
                                                    table[2][2],
                                                    table[2][3],
                                                    table[2][4],
                                                    table[2][9])
        print '15-60 min %9i %9i %9i %9i %9i %9i' %(table[3][0],
                                                    table[3][1],
                                                    table[3][2],
                                                    table[3][3],
                                                    table[3][4],
                                                    table[3][9])
        print '> 60 min  %9i %9i %9i %9i %9i %9i' %(table[4][0],
                                                    table[4][1],
                                                    table[4][2],
                                                    table[4][3],
                                                    table[4][4],
                                                    table[4][9])
        print 'missing   %9i %9i %9i %9i %9i %9i' %(table[9][0],
                                                    table[9][1],
                                                    table[9][2],
                                                    table[9][3],
                                                    table[9][4],
                                                    table[9][9])

    def sensor_vs_survey_by_sensortime(self, time_min, time_max, sex_l, age_l):

        sensor_survey = 0
        sensor_not_survey = 0

        for id1 in self.id_list:

            if not self.participants.sex[id1] in sex_l: continue
            if not self.participants.age[id1] in age_l: continue

            for id2 in self.sensor.id_list:

                if id1 in self.sensor.duration:
                    if id2 in self.sensor.duration[id1]:
                        if self.sensor.duration[id1][id2] < time_min: continue
                        if self.sensor.duration[id1][id2] > time_max: continue
                    else:
                        continue
                else:
                    continue

                if id1 in self.survey.duration:
                    if id2 in self.survey.duration[id1]:
                        sensor_survey += 1
                    else:
                        sensor_not_survey += 1
                else:
                    sensor_not_survey += 1

        try:
            congruency = float(sensor_survey)/float(sensor_survey+sensor_not_survey)
        except:
            congruency = 9.999999999

        congr_frac = []

        for id_list in self.bs_sample:

            bs_sensor_survey = 0
            bs_sensor_not_survey = 0

            for id1 in id_list:

                if not self.participants.sex[id1] in sex_l: continue
                if not self.participants.age[id1] in age_l: continue

                for id2 in self.sensor.id_list:

                    if id1 in self.sensor.duration:
                        if id2 in self.sensor.duration[id1]:
                            if self.sensor.duration[id1][id2] < time_min:
                                continue
                            if self.sensor.duration[id1][id2] > time_max:
                                continue
                        else:
                            continue
                    else:
                        continue

                    if id1 in self.survey.duration:
                        if id2 in self.survey.duration[id1]:
                            bs_sensor_survey += 1
                        else:
                            bs_sensor_not_survey += 1
                    else:
                        bs_sensor_not_survey += 1

            a = bs_sensor_survey
            b = bs_sensor_not_survey
            if (a+b) > 0:
                congr_frac.append(float(a)/float(a+b))


        print 'se+ su+ ', sensor_survey
        print 'se+ su- ', sensor_not_survey
        if len(congr_frac) >0:
            print 'congruency %1.3f [%1.3f, %1.3f]' %(congruency,
                                                npy.percentile(congr_frac, 2.5),
                                                npy.percentile(congr_frac,97.5))



    def sensor_vs_survey_by_sensortime_sigdiff(self, time_min1, time_max1,
                                                     time_min2, time_max2,
                                                     sex_l, age_l):


        first_smaller = 0
        first_equal = 0
        first_larger = 0

        for id_list in self.bs_sample:

            bs_sensor_survey_1 = 0
            bs_sensor_not_survey_1 = 0
            bs_sensor_survey_2 = 0
            bs_sensor_not_survey_2 = 0

            for id1 in id_list:

                if not self.participants.sex[id1] in sex_l: continue
                if not self.participants.age[id1] in age_l: continue

                for id2 in self.sensor.id_list:

                    if id1 in self.sensor.duration:
                        if id2 in self.sensor.duration[id1]:
                            if self.sensor.duration[id1][id2] < time_min1:
                                continue
                            if self.sensor.duration[id1][id2] > time_max1:
                                continue
                        else:
                            continue
                    else:
                        continue

                    if id1 in self.survey.duration:
                        if id2 in self.survey.duration[id1]:
                            bs_sensor_survey_1 += 1
                        else:
                            bs_sensor_not_survey_1 += 1
                    else:
                        bs_sensor_not_survey_1 += 1

                for id2 in self.sensor.id_list:

                    if id1 in self.sensor.duration:
                        if id2 in self.sensor.duration[id1]:
                            if self.sensor.duration[id1][id2] < time_min2:
                                continue
                            if self.sensor.duration[id1][id2] > time_max2:
                                continue
                        else:
                            continue
                    else:
                        continue

                    if id1 in self.survey.duration:
                        if id2 in self.survey.duration[id1]:
                            bs_sensor_survey_2 += 1
                        else:
                            bs_sensor_not_survey_2 += 1
                    else:
                        bs_sensor_not_survey_2 += 1

            a = bs_sensor_survey_1
            b = bs_sensor_not_survey_1
            c = bs_sensor_survey_2
            d = bs_sensor_not_survey_2

            try:
                congruency_1 = float(a)/float(a+b)
                congruency_2 = float(c)/float(c+d)
                print congruency_1, congruency_2
                if congruency_1 < congruency_2:
                    first_smaller += 1
                elif congruency_1 == congruency_2:
                    first_equal += 1
                elif congruency_1 > congruency_2:
                    first_larger += 1
            except:
                pass


        total = first_smaller + first_equal + first_larger
        print first_smaller, first_equal, first_larger
        print 'first smaller: ', float(first_smaller)/float(total)
        print 'first larger: ', float(first_larger)/float(total)

    def survey_vs_sensor_by_surveytime(self, time_cat, sex_l, age_l):

        sensor_survey = 0
        not_sensor_survey = 0

        for id1 in self.id_list:

            if not self.participants.sex[id1] in sex_l: continue
            if not self.participants.age[id1] in age_l: continue

            if id1 in self.survey.duration:
                for id2 in self.survey.duration[id1]:
                    if self.survey.duration[id1][id2] != time_cat: continue

                    if id1 in self.sensor.duration:
                        if id2 in self.sensor.duration[id1]:
                            sensor_survey += 1
                        else:
                            not_sensor_survey += 1
                    else:
                        not_sensor_survey += 1

        try:
            congruency = float(sensor_survey)/float(sensor_survey+not_sensor_survey)
        except:
            congruency = 9.999999999

        congr_frac = []

        for id_list in self.bs_sample:

            bs_sensor_survey = 0
            bs_not_sensor_survey = 0

            for id1 in id_list:

                if not self.participants.sex[id1] in sex_l: continue
                if not self.participants.age[id1] in age_l: continue

                if id1 in self.survey.duration:
                    for id2 in self.survey.duration[id1]:
                        if self.survey.duration[id1][id2] != time_cat: continue

                        if id1 in self.sensor.duration:
                            if id2 in self.sensor.duration[id1]:
                                bs_sensor_survey += 1
                            else:
                                bs_not_sensor_survey += 1
                        else:
                            bs_not_sensor_survey += 1

            a = bs_sensor_survey
            b = bs_not_sensor_survey
            if (a+b) > 0:
                congr_frac.append(float(a)/float(a+b))

        print 'se+ su+ ', sensor_survey
        print 'se- su+ ', not_sensor_survey
        if len(congr_frac) >0:
            print 'congruency %1.3f [%1.3f, %1.3f]' %(congruency,
                                                npy.percentile(congr_frac, 2.5),
                                                npy.percentile(congr_frac,97.5))


    def survey_vs_sensor_by_surveytime_sigdiff(self, time_cat1, time_cat2,
                                                     sex_l, age_l):


        first_smaller = 0
        first_equal = 0
        first_larger = 0

        for id_list in self.bs_sample:

            bs_sensor_survey_1 = 0
            bs_not_sensor_survey_1 = 0
            bs_sensor_survey_2 = 0
            bs_not_sensor_survey_2 = 0

            for id1 in id_list:

                if not self.participants.sex[id1] in sex_l: continue
                if not self.participants.age[id1] in age_l: continue

                if id1 in self.survey.duration:
                    for id2 in self.survey.duration[id1]:
                        if self.survey.duration[id1][id2] != time_cat1: continue

                        if id1 in self.sensor.duration:
                            if id2 in self.sensor.duration[id1]:
                                bs_sensor_survey_1 += 1
                            else:
                                bs_not_sensor_survey_1 += 1
                        else:
                            bs_not_sensor_survey_1 += 1

                if id1 in self.survey.duration:
                    for id2 in self.survey.duration[id1]:
                        if self.survey.duration[id1][id2] != time_cat2: continue

                        if id1 in self.sensor.duration:
                            if id2 in self.sensor.duration[id1]:
                                bs_sensor_survey_2 += 1
                            else:
                                bs_not_sensor_survey_2 += 1
                        else:
                            bs_not_sensor_survey_2 += 1

            a = bs_sensor_survey_1
            b = bs_not_sensor_survey_1
            c = bs_sensor_survey_2
            d = bs_not_sensor_survey_2

            try:
                congr_1 = float(a)/float(a+b)
                congr_2 = float(c)/float(c+d)
                if congr_1 < congr_2:
                    first_smaller += 1
                elif congr_1 == congr_2:
                    first_equal += 1
                elif congr_1 > congr_2:
                    first_larger += 1
            except:
                pass

        total = first_smaller + first_equal + first_larger
        print first_smaller, first_equal, first_larger
        print 'first smaller', float(first_smaller)/float(total)
        print 'first larger', float(first_larger)/float(total)

    def survey_vs_survey(self, time_cat):

        concordant = 0
        discordant = 0

        for id1 in self.id_list:
            for id2 in self.id_list:

                if not id2 in self.survey.duration: continue
                if not id1 in self.survey.duration[id2]: continue

                dur2 = self.survey.duration[id2][id1]

                if id1 in self.survey.duration:
                    if id2 in self.survey.duration[id1]:
                        dur1 = self.survey.duration[id1][id2]
                    else:
                        dur1 = 0
                else:
                    dur1 = 0

                durations = [0]
                if dur1 in [0,1,2,3,4]:
                    durations.append(dur1)
                if dur2 in [0,1,2,3,4]:
                    durations.append(dur2)

                if max(durations) != time_cat: continue

                if dur1 == 0:
                    discordant += 1
                else:
                    concordant += 1

        congruency = float(concordant)/float(concordant+discordant)

        congr_frac = []

        for id_list in self.bs_sample:

            bs_concordant = 0
            bs_discordant = 0

            for id1 in id_list:
                for id2 in self.id_list:

                    if not id2 in self.survey.duration: continue
                    if not id1 in self.survey.duration[id2]: continue

                    dur2 = self.survey.duration[id2][id1]

                    if id1 in self.survey.duration:
                        if id2 in self.survey.duration[id1]:
                            dur1 = self.survey.duration[id1][id2]
                        else:
                            dur1 = 0
                    else:
                        dur1 = 0

                    durations = [0]
                    if dur1 in [0,1,2,3,4]:
                        durations.append(dur1)
                    if dur2 in [0,1,2,3,4]:
                        durations.append(dur2)

                    if max(durations) != time_cat: continue

                    if dur1 == 0:
                        bs_discordant += 1
                    else:
                        bs_concordant += 1

            a = float(bs_concordant)
            b = float(bs_discordant)
            try:
                congr = a/(a+b)
                congr_frac.append(congr)
            except:
                pass


        print 'concordant: ', concordant
        print 'discordant: ', discordant
        if len(congr_frac) >0:
            print 'congruency %1.3f [%1.3f, %1.3f]' %(congruency,
                                                npy.percentile(congr_frac, 2.5),
                                                npy.percentile(congr_frac,97.5))


    def survey_vs_survey_sigdiff(self, time_cat1, time_cat2):

        concordant_1 = 0
        discordant_1 = 0
        concordant_2 = 0
        discordant_2 = 0
        unknownID_1 = 0
        unknownID_2 = 0

        for id1 in self.id_list:
            for id2 in self.id_list:

                if not id2 in self.survey.duration: continue
                if not id1 in self.survey.duration[id2]: continue

                dur2 = self.survey.duration[id2][id1]

                if id1 in self.survey.duration:
                    if id2 in self.survey.duration[id1]:
                        dur1 = self.survey.duration[id1][id2]
                    else:
                        dur1 = 0
                else:
                    dur1 = 0

                durations = [0]
                if dur1 in [0,1,2,3,4]:
                    durations.append(dur1)
                if dur2 in [0,1,2,3,4]:
                    durations.append(dur2)

                if not max(durations) in (time_cat1, time_cat2): continue

                if max(durations) == time_cat1:
                    if dur1 == 0:
                        discordant_1 += 1
                    else:
                        concordant_1 += 1
                else:
                    if dur1 == 0:
                        discordant_2 += 1
                    else:
                        concordant_2 += 1

            if id1 in self.survey.duration:
                for id2 in self.survey.duration[id1]:
                    if id2 > 800:
                        if self.survey.duration[id1][id2] == time_cat1:
                            unknownID_1 += 1
                        elif self.survey.duration[id1][id2] == time_cat2:
                            unknownID_2 += 1

        congruency_1 = float(concordant_1)/float(concordant_1+discordant_1+unknownID_1)
        congruency_2 = float(concordant_2)/float(concordant_2+discordant_2+unknownID_2)

        congr_1_smaller = 0
        congr_1_equal = 0
        congr_1_larger = 0

        for id_list in self.bs_sample:

            bs_concordant_1 = 0
            bs_discordant_1 = 0
            bs_concordant_2 = 0
            bs_discordant_2 = 0

            unknownID_to_ID1 = {}
            unknownID_to_ID2 = {}

            for id1 in self.id_list:
                unknownID_to_ID1[id1] = 0
                unknownID_to_ID2[id1] = 0

            for i in range(0,unknownID_1):
                unknownID_to_ID1[rnd.choice(self.id_list)] += 1

            for i in range(0,unknownID_2):
                unknownID_to_ID2[rnd.choice(self.id_list)] += 1

            for id1 in id_list:

                bs_discordant_1 += unknownID_to_ID1[id1]
                bs_discordant_2 += unknownID_to_ID2[id1]

                for id2 in self.id_list:

                    if not id2 in self.survey.duration: continue
                    if not id1 in self.survey.duration[id2]: continue

                    dur2 = self.survey.duration[id2][id1]

                    if id1 in self.survey.duration:
                        if id2 in self.survey.duration[id1]:
                            dur1 = self.survey.duration[id1][id2]
                        else:
                            dur1 = 0
                    else:
                        dur1 = 0

                    durations = [0]
                    if dur1 in [0,1,2,3,4]:
                        durations.append(dur1)
                    if dur2 in [0,1,2,3,4]:
                        durations.append(dur2)

                    if not max(durations) in (time_cat1, time_cat2): continue

                    if max(durations) == time_cat1:
                        if dur1 == 0:
                            bs_discordant_1 += 1
                        else:
                            bs_concordant_1 += 1
                    else:
                        if dur1 == 0:
                            bs_discordant_2 += 1
                        else:
                            bs_concordant_2 += 1

            a = float(bs_concordant_1)
            b = float(bs_discordant_1)
            c = float(bs_concordant_2)
            d = float(bs_discordant_2)
            try:
                congr_1 = a/(a+b)
                congr_2 = c/(c+d)
                if congr_1 < congr_2:
                    congr_1_smaller += 1
                elif congr_1 == congr_2:
                    congr_1_equal += 1
                elif congr_1 > congr_2:
                    congr_1_larger += 1
            except:
                pass


        total = float(congr_1_smaller + congr_1_equal + congr_1_larger)
        print 'time category %0i: %1.4f' %(time_cat1, congruency_1)
        print 'time category %0i: %1.4f' %(time_cat2, congruency_2)
        print 'c1<c2  c1=c2  c1>c2:', congr_1_smaller, congr_1_equal, congr_1_larger
        print 'percentage c1<c2:', float(congr_1_smaller)/total
        print 'percentage c1>c2:', float(congr_1_larger)/total


    def survey_vs_survey_unknown_not_match(self, time_cat):

        concordant = 0
        discordant = 0

        unknownID = 0

        for id1 in self.id_list:

            for id2 in self.id_list:

                if not id2 in self.survey.duration: continue
                if not id1 in self.survey.duration[id2]: continue

                dur2 = self.survey.duration[id2][id1]

                if id1 in self.survey.duration:
                    if id2 in self.survey.duration[id1]:
                        dur1 = self.survey.duration[id1][id2]
                    else:
                        dur1 = 0
                else:
                    dur1 = 0

                durations = [0]
                if dur1 in [0,1,2,3,4]:
                    durations.append(dur1)
                if dur2 in [0,1,2,3,4]:
                    durations.append(dur2)

                if max(durations) != time_cat: continue

                if dur1 == 0:
                    discordant += 1
                else:
                    concordant += 1

            if id1 in self.survey.duration:
                for id2 in self.survey.duration[id1]:
                    if id2 > 800:
                        if self.survey.duration[id1][id2] == time_cat:
                            unknownID += 1

        congruency = float(concordant)/float(concordant+discordant+unknownID)

        congr_frac = []

        for id_list in self.bs_sample:

            bs_concordant = 0
            bs_discordant = 0

            unknownID_to_ID = {}

            for id1 in self.id_list:
                unknownID_to_ID[id1] = 0

            for i in range(0,unknownID):
                unknownID_to_ID[rnd.choice(self.id_list)] += 1

            for id1 in id_list:

                bs_discordant += unknownID_to_ID[id1]

                for id2 in self.id_list:

                    if not id2 in self.survey.duration: continue
                    if not id1 in self.survey.duration[id2]: continue

                    dur2 = self.survey.duration[id2][id1]

                    if id1 in self.survey.duration:
                        if id2 in self.survey.duration[id1]:
                            dur1 = self.survey.duration[id1][id2]
                        else:
                            dur1 = 0
                    else:
                        dur1 = 0

                    durations = [0]
                    if dur1 in [0,1,2,3,4]:
                        durations.append(dur1)
                    if dur2 in [0,1,2,3,4]:
                        durations.append(dur2)

                    if max(durations) != time_cat: continue

                    if dur1 == 0:
                        bs_discordant += 1
                    else:
                        bs_concordant += 1

            a = float(bs_concordant)
            b = float(bs_discordant)
            try:
                congr = a/(a+b)
                congr_frac.append(congr)
            except:
                pass


        print 'concordant: ', concordant
        print 'discordant: ', discordant
        print 'unknown ID: ', unknownID
        if len(congr_frac) >0:
            print 'congruency %1.3f [%1.3f, %1.3f]' %(congruency,
                                                npy.percentile(congr_frac, 2.5),
                                                npy.percentile(congr_frac,97.5))


    def overall_survey_vs_sensor(self):

        sensor_survey = 0
        sensor_not_survey = 0
        not_sensor_survey = 0

        for id1 in self.id_list:
            for id2 in self.sensor.id_list:

                if id1 in self.survey.duration:
                    if id2 in self.survey.duration[id1]:
                        survey = True
                    else:
                        survey = False
                else:
                    survey = False

                if id1 in self.sensor.duration:
                    if id2 in self.sensor.duration[id1]:
                        sensor = True
                    else:
                        sensor = False
                else:
                    sensor = False

                if survey == True and sensor == True:
                    sensor_survey += 1
                elif survey == True and sensor == False:
                    not_sensor_survey += 1
                elif survey == False and sensor == True:
                    sensor_not_survey += 1
                else:
                    pass

            if id1 in self.survey.duration:
                for id2 in self.survey.duration[id1]:
                    if id2 > 800: not_sensor_survey += 1

        print 'se+ su+ ', sensor_survey
        print 'se+ su- ', sensor_not_survey
        print 'se- su+ ', not_sensor_survey

    def individual_sensor_vs_survey(self):

        print
        print 'id,se+su+,se+su-,se-su+'

        for id1 in self.id_list:

            sensor_survey = 0
            sensor_not_survey = 0
            not_sensor_survey = 0

            for id2 in self.sensor.id_list:

                if id1 in self.survey.duration:
                    if id2 in self.survey.duration[id1]:
                        survey = True
                    else:
                        survey = False
                else:
                    survey = False

                if id1 in self.sensor.duration:
                    if id2 in self.sensor.duration[id1]:
                        sensor = True
                    else:
                        sensor = False
                else:
                    sensor = False

                if survey == True and sensor == True:
                    sensor_survey += 1
                elif survey == True and sensor == False:
                    not_sensor_survey += 1
                elif survey == False and sensor == True:
                    sensor_not_survey += 1
                else:
                    pass

            if id1 in self.survey.duration:
                for id2 in self.survey.duration[id1]:
                    if id2 > 800: not_sensor_survey += 1

            print '%0i,%0i,%0i,%0i' %(id1,
                                      sensor_survey,
                                      sensor_not_survey,
                                      not_sensor_survey)

    def extract_only_survey_links(self):

        count_fails = {}
        for id in self.id_list:
            count_fails[id] = 0

        G4=nx.Graph()
        G3=nx.Graph()
        G2=nx.Graph()
        G1=nx.Graph()

        for id1 in self.id_list:
            for id2 in self.id_list:

                if not id1 in self.survey.duration: continue
                if not id2 in self.survey.duration[id1]: continue

                if not id2 in self.survey.duration: continue
                if not id1 in self.survey.duration[id2]: continue

                if id1 in self.sensor.duration:
                    if id2 in self.sensor.duration[id1]: continue

                count_fails[id1] += 1

                print '%2i %2i   %1i %1i' %(id1, id2,
                                            self.survey.duration[id1][id2],
                                            self.survey.duration[id2][id1])

                durs = [self.survey.duration[id1][id2],
                        self.survey.duration[id2][id1]]

                if 4 in durs:
                    G4.add_edge(id1,id2)
                    G3.add_edge(id1,id2)
                    G2.add_edge(id1,id2)
                    G1.add_edge(id1,id2)
                elif 3 in durs:
                    G3.add_edge(id1,id2)
                    G2.add_edge(id1,id2)
                    G1.add_edge(id1,id2)
                elif 2 in durs:
                    G2.add_edge(id1,id2)
                    G1.add_edge(id1,id2)
                elif 1 in durs:
                    G1.add_edge(id1,id2)

        return G4, G3, G2, G1


class Participant_Data(object):

    def __init__(self, filename):

        global DIR
        P_ID = 0
        P_SEX = 1
        P_AGE = 2

        self.id_list = []

        self.sex = {}
        self.age = {}

        i_file = csv.reader(open(DIR+filename,'rb'))

        flag = True
        cnt = 0

        for line in i_file:

            if flag == True:
                flag = False
                continue

            cnt += 1
            id1 = int(line[P_ID])
            sex = int(line[P_SEX])
            age = int(line[P_AGE])

            self.id_list.append(id1)
            self.sex[id1] = sex
            self.age[id1] = age

        self.id_list.sort()

        print 'Participant_Data: Read %0i entries' %(cnt)

class Sensor_Data(object):

    def __init__(self, filename, id_list):

        global DIR
        P_ID1 = 0
        P_ID2 = 1
        P_DUR = 2

        self.id_list = id_list
        self.id_list.sort()

        self.duration = {}

        for id in id_list:
            self.duration[id] = {}

        i_file = csv.reader(open(DIR+filename,'rb'))

        flag = True
        cnt = 0

        for line in i_file:

            if flag == True:
                flag = False
                continue

            cnt += 1
            id1 = int(line[P_ID1])
            id2 = int(line[P_ID2])

            if not id1 in self.duration:
                print 'Problem: ID %0i not in id-list' %(id1)
                continue

            if id2 in self.duration[id1]:
                print 'Problem: ID %0i already mapped in ID %0i' %(id2,id1)

            self.duration[id1][id2] = int(line[P_DUR])

        print 'Sensor_Data: Read %0i arcs' %(cnt)


class Survey_Data(object):

    def __init__(self, filename, id_list):

        global DIR
        P_ID1 = 0
        P_ID2 = 1
        P_SEX = 2
        P_AGE = 3
        P_DUR = 4
        P_KND = 5
        P_KNW = 6

        self.id_list = id_list
        self.id_list.sort()

        self.sex = {}
        self.age = {}
        self.duration = {}
        self.kind = {}
        self.known = {}

        for id in id_list:
            self.sex[id] = {}
            self.age[id] = {}
            self.duration[id] = {}
            self.kind[id] = {}
            self.known[id] = {}

        i_file = csv.reader(open(DIR+filename,'rb'))

        flag = True
        cnt = 0

        for line in i_file:

            if flag == True:
                flag = False
                continue

            cnt += 1
            id1 = int(line[P_ID1])
            id2 = int(line[P_ID2])

            if not id1 in self.sex:
                print 'Problem: ID %0i not in id-list' %(id1)

            if id2 in self.sex[id1]:
                print 'Problem: ID %0i already mapped in ID %0i' %(id2,id1)

            self.sex[id1][id2] = int(line[P_SEX])
            self.age[id1][id2] = int(line[P_AGE])
            self.duration[id1][id2] = int(line[P_DUR])
            self.kind[id1][id2] = int(line[P_KND])
            self.known[id1][id2] = int(line[P_KNW])

        print 'Survey_Data: Read %0i arcs' %(cnt)

    def known_percentage(self):

        print 'id,known,unknown,missing'

        for id1 in self.id_list:

            known = 0
            unknown = 0
            missing = 0

            if id1 in self.known:
                for id2 in self.known[id1]:

                    if self.known[id1][id2] == 2:
                        unknown += 1
                    elif self.known[id1][id2] == 1:
                        known += 1
                    elif self.known[id1][id2] == 9:
                        missing += 1

            print '%0i,%0i,%0i,%0i' %(id1,known,unknown,missing)


    def create_duration_by_duration_table(self):

        # 1st is survey; 2nd is sensor
        table = {0:{1:0, 2:0, 3:0, 4:0, 9:0},
                 1:{1:0, 2:0, 3:0, 4:0, 9:0},
                 2:{1:0, 2:0, 3:0, 4:0, 9:0},
                 3:{1:0, 2:0, 3:0, 4:0, 9:0},
                 4:{1:0, 2:0, 3:0, 4:0, 9:0},
                 8:{1:0, 2:0, 3:0, 4:0, 9:0},
                 9:{1:0, 2:0, 3:0, 4:0, 9:0}}

        for id1 in self.id_list:
            for id2 in self.id_list:

                if id2 <= id1: continue

                if id1 in self.duration:
                    if id2 in self.duration[id1]:
                        dur1 = self.duration[id1][id2]
                    else:
                        dur1 = 0
                else:
                    dur1 = 0

                if id2 in self.duration:
                    if id1 in self.duration[id2]:
                        dur2 = self.duration[id2][id1]
                    else:
                        dur2 = 0
                else:
                    dur2 = 0

                if dur1 == 0 and dur2 == 0: continue
                elif dur1 in [1,2,3,4] and dur2 == 9:
                    dur1, dur2 = dur2, dur1
                elif dur1 == 9 and dur2 == 0:
                    dur1, dur2 = dur2, dur1
                elif dur1 in [0,1,2,3,4] and dur2 in [0,1,2,3,4]:
                    if dur1 > dur2: dur1, dur2 = dur2, dur1

                try:
                    table[dur1][dur2] += 1
                except:
                    print dur1, dur2

            if id1 in self.duration:
                for id2 in self.duration[id1]:

                    if id2 > 800:
                        dur1 = 8
                        dur2 = self.duration[id1][id2]
                        table[dur1][dur2] += 1


        print '          < 5 min   5-15 min  15-60 min > 60 min  missing   '
        print 'no cont.  %9i %9i %9i %9i %9i' %(table[0][1],
                                                          table[0][2],
                                                          table[0][3],
                                                          table[0][4],
                                                          table[0][9])
        print 'unmatched %9i %9i %9i %9i %9i' %(table[8][1],
                                                          table[8][2],
                                                          table[8][3],
                                                          table[8][4],
                                                          table[8][9])
        print '< 5 min   %9i %9i %9i %9i %9i' %(table[1][1],
                                                    table[1][2],
                                                    table[1][3],
                                                    table[1][4],
                                                    table[1][9])
        print '5-15 min  %9i %9i %9i %9i %9i' %(table[2][1],
                                                    table[2][2],
                                                    table[2][3],
                                                    table[2][4],
                                                    table[2][9])
        print '15-60 min %9i %9i %9i %9i %9i' %(table[3][1],
                                                    table[3][2],
                                                    table[3][3],
                                                    table[3][4],
                                                    table[3][9])
        print '> 60 min  %9i %9i %9i %9i %9i' %(table[4][1],
                                                    table[4][2],
                                                    table[4][3],
                                                    table[4][4],
                                                    table[4][9])
        print 'missing   %9i %9i %9i %9i %9i' %(table[9][1],
                                                    table[9][2],
                                                    table[9][3],
                                                    table[9][4],
                                                    table[9][9])

    def create_kind_by_kind_table(self):

        # 1st is survey; 2nd is sensor
        table = {0:{1:0, 2:0, 3:0, 9:0},
                 1:{1:0, 2:0, 3:0, 9:0},
                 2:{1:0, 2:0, 3:0, 9:0},
                 3:{1:0, 2:0, 3:0, 9:0},
                 8:{1:0, 2:0, 3:0, 9:0},
                 9:{1:0, 2:0, 3:0, 9:0}}

        for id1 in self.id_list:
            for id2 in self.id_list:

                if id2 <= id1: continue

                if id1 in self.kind:
                    if id2 in self.kind[id1]:
                        kd1 = self.kind[id1][id2]
                    else:
                        kd1 = 0
                else:
                    kd1 = 0

                if id2 in self.kind:
                    if id1 in self.kind[id2]:
                        kd2 = self.kind[id2][id1]
                    else:
                        kd2 = 0
                else:
                    kd2 = 0

                if kd1 == 0 and kd2 == 0: continue
                elif kd1 in [1,2,3] and kd2 == 9:
                    kd1, kd2 = kd2, kd1
                elif kd1 == 9 and kd2 == 0:
                    kd1, kd2 = kd2, kd1
                elif kd1 in [0,1,2,3] and kd2 in [0,1,2,3]:
                    if kd1 > kd2: kd1, kd2 = kd2, kd1

                try:
                    table[kd1][kd2] += 1
                except:
                    print kd1, kd2

            if id1 in self.kind:
                for id2 in self.kind[id1]:

                    if id2 > 800:
                        kd1 = 8
                        kd2 = self.kind[id1][id2]
                        table[kd1][kd2] += 1


        print '          convers.  physical  both      missing   '
        print 'no cont.  %9i %9i %9i %9i' %(table[0][1],
                                                          table[0][2],
                                                          table[0][3],
                                                          table[0][9])
        print 'unmatched %9i %9i %9i %9i' %(table[8][1],
                                                          table[8][2],
                                                          table[8][3],
                                                          table[8][9])
        print 'convers.  %9i %9i %9i %9i' %(table[1][1],
                                                    table[1][2],
                                                    table[1][3],
                                                    table[1][9])
        print 'physical  %9i %9i %9i %9i' %(table[2][1],
                                                    table[2][2],
                                                    table[2][3],
                                                    table[2][9])
        print 'both      %9i %9i %9i %9i' %(table[3][1],
                                                    table[3][2],
                                                    table[3][3],
                                                    table[3][9])
        print 'missing   %9i %9i %9i %9i' %(table[9][1],
                                                    table[9][2],
                                                    table[9][3],
                                                    table[9][9])

    def create_known_by_known_table(self):

        # 1st is survey; 2nd is sensor
        table = {0:{1:0, 2:0, 9:0},
                 1:{1:0, 2:0, 9:0},
                 2:{1:0, 2:0, 9:0},
                 8:{1:0, 2:0, 9:0},
                 9:{1:0, 2:0, 9:0}}

        for id1 in self.id_list:
            for id2 in self.id_list:

                if id2 <= id1: continue

                if id1 in self.kind:
                    if id2 in self.known[id1]:
                        kd1 = self.known[id1][id2]
                    else:
                        kd1 = 0
                else:
                    kd1 = 0

                if id2 in self.kind:
                    if id1 in self.known[id2]:
                        kd2 = self.known[id2][id1]
                    else:
                        kd2 = 0
                else:
                    kd2 = 0

                if kd1 == 0 and kd2 == 0: continue
                elif kd1 in [1,2,3] and kd2 == 9:
                    kd1, kd2 = kd2, kd1
                elif kd1 == 9 and kd2 == 0:
                    kd1, kd2 = kd2, kd1
                elif kd1 in [0,1,2,3] and kd2 in [0,1,2,3]:
                    if kd1 > kd2: kd1, kd2 = kd2, kd1

                try:
                    table[kd1][kd2] += 1
                except:
                    print kd1, kd2

            if id1 in self.known:
                for id2 in self.known[id1]:

                    if id2 > 800:
                        kd1 = 8
                        kd2 = self.known[id1][id2]
                        table[kd1][kd2] += 1


        print '          known     unknown   missing   '
        print 'no cont.  %9i %9i %9i' %(table[0][1],
                                                          table[0][2],
                                                          table[0][9])
        print 'unmatched %9i %9i %9i' %(table[8][1],
                                                          table[8][2],
                                                          table[8][9])
        print 'known     %9i %9i %9i' %(table[1][1],
                                                    table[1][2],
                                                    table[1][9])
        print 'unknown   %9i %9i %9i' %(table[2][1],
                                                    table[2][2],
                                                    table[2][9])
        print 'missing   %9i %9i %9i' %(table[9][1],
                                                    table[9][2],
                                                    table[9][9])


def sensor_survey_comparison(Data):

    print
    print 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
    print

    print 'Overall contingency table'
    print '-------------------------'
    print
    Data.overall_survey_vs_sensor()

    print
    print 'Sensor vs. survey by duration'
    print '-----------------------------'
    print
    print 'a) <5min ......................'
    Data.sensor_vs_survey_by_sensortime(20, 300,[1,2,9],[7,8,9])
    print 'b) 5-15min ....................'
    Data.sensor_vs_survey_by_sensortime(301, 900,[1,2,9],[7,8,9])
    print 'c) 15-60min ...................'
    Data.sensor_vs_survey_by_sensortime(901, 3600,[1,2,9],[7,8,9])
    print 'd) >60min .....................'
    Data.sensor_vs_survey_by_sensortime(3601, 99999999,[1,2,9],[7,8,9])

    print
    print 'Sensor vs. survey by duration (5 min more detailed)'
    print '---------------------------------------------------'
    print
    print 'a) 1min .......................'
    Data.sensor_vs_survey_by_sensortime(1, 60,[1,2,9],[7,8,9])
    print 'b) 1-2min .....................'
    Data.sensor_vs_survey_by_sensortime(61, 120,[1,2,9],[7,8,9])
    print 'c) 2-3min .....................'
    Data.sensor_vs_survey_by_sensortime(121, 180,[1,2,9],[7,8,9])
    print 'd) 3-4min .....................'
    Data.sensor_vs_survey_by_sensortime(181, 240,[1,2,9],[7,8,9])
    print 'e) 4-5min .....................'
    Data.sensor_vs_survey_by_sensortime(241, 300,[1,2,9],[7,8,9])
    print 'f) >5min ......................'
    Data.sensor_vs_survey_by_sensortime(301, 99999999,[1,2,9],[7,8,9])

    print
    print 'Sensor vs. survey by duration and gender'
    print '----------------------------------------'
    print
    print 'a) <5min f/m ..................'
    Data.sensor_vs_survey_by_sensortime(20, 300,[1],[7,8,9])
    Data.sensor_vs_survey_by_sensortime(20, 300,[2],[7,8,9])
    print 'b) 5-15min f/m ................'
    Data.sensor_vs_survey_by_sensortime(301, 900,[1],[7,8,9])
    Data.sensor_vs_survey_by_sensortime(301, 900,[2],[7,8,9])
    print 'c) 15-60min f/m ...............'
    Data.sensor_vs_survey_by_sensortime(901, 3600,[1],[7,8,9])
    Data.sensor_vs_survey_by_sensortime(901, 3600,[2],[7,8,9])
    print 'd) >60min f/m .................'
    Data.sensor_vs_survey_by_sensortime(3601, 99999999,[1],[7,8,9])
    Data.sensor_vs_survey_by_sensortime(3601, 99999999,[2],[7,8,9])

    print
    print 'Sensor vs. survey by duration and age'
    print '-------------------------------------'
    print
    print 'a) <5min <40/40+ ..............'
    Data.sensor_vs_survey_by_sensortime(20, 300,[1,2,9],[7])
    Data.sensor_vs_survey_by_sensortime(20, 300,[1,2,9],[8])
    print 'b) 5-15min <40/40+ ............'
    Data.sensor_vs_survey_by_sensortime(301, 900,[1,2,9],[7])
    Data.sensor_vs_survey_by_sensortime(301, 900,[1,2,9],[8])
    print 'c) 15-60min <40/40+ ...........'
    Data.sensor_vs_survey_by_sensortime(901, 3600,[1,2,9],[7])
    Data.sensor_vs_survey_by_sensortime(901, 3600,[1,2,9],[8])
    print 'd) >60min <40/40+ .............'
    Data.sensor_vs_survey_by_sensortime(3601, 99999999,[1,2,9],[7])
    Data.sensor_vs_survey_by_sensortime(3601, 99999999,[1,2,9],[8])

    print
    print 'Sensor vs. survey by duration, gender and age'
    print '---------------------------------------------'
    print
    print 'a) <5min <40/40+ ..............'
    print '   <40 & f'
    Data.sensor_vs_survey_by_sensortime(20, 300,[1],[7])
    print '   40+ & f'
    Data.sensor_vs_survey_by_sensortime(20, 300,[1],[8])
    print '   <40 & m'
    Data.sensor_vs_survey_by_sensortime(20, 300,[2],[7])
    print '   40+ & m'
    Data.sensor_vs_survey_by_sensortime(20, 300,[2],[8])
    print 'b) 5-15min <40/40+ ............'
    print '   <40 & f'
    Data.sensor_vs_survey_by_sensortime(301, 900,[1],[7])
    print '   40+ & f'
    Data.sensor_vs_survey_by_sensortime(301, 900,[1],[8])
    print '   <40 & m'
    Data.sensor_vs_survey_by_sensortime(301, 900,[2],[7])
    print '   40+ & m'
    Data.sensor_vs_survey_by_sensortime(301, 900,[2],[8])
    print 'c) 15-60min <40/40+ ...........'
    print '   <40 & f'
    Data.sensor_vs_survey_by_sensortime(901, 3600,[1],[7])
    print '   40+ & f'
    Data.sensor_vs_survey_by_sensortime(901, 3600,[1],[8])
    print '   <40 & m'
    Data.sensor_vs_survey_by_sensortime(901, 3600,[2],[7])
    print '   40+ & m'
    Data.sensor_vs_survey_by_sensortime(901, 3600,[2],[8])
    print 'd) >60min <40/40+ .............'
    print '   <40 & f'
    Data.sensor_vs_survey_by_sensortime(3601, 99999999,[1],[7])
    print '   40+ & f'
    Data.sensor_vs_survey_by_sensortime(3601, 99999999,[1],[8])
    print '   <40 & m'
    Data.sensor_vs_survey_by_sensortime(3601, 99999999,[2],[7])
    print '   40+ & m'
    Data.sensor_vs_survey_by_sensortime(3601, 99999999,[2],[8])

    print
    print 'Survey vs. sensor by duration'
    print '-----------------------------'
    print
    print 'a) <5min ......................'
    Data.survey_vs_sensor_by_surveytime(1,[1,2,9],[7,8,9])
    print 'b) 5-15min ....................'
    Data.survey_vs_sensor_by_surveytime(2,[1,2,9],[7,8,9])
    print 'c) 15-60min ...................'
    Data.survey_vs_sensor_by_surveytime(3,[1,2,9],[7,8,9])
    print 'd) >60min .....................'
    Data.survey_vs_sensor_by_surveytime(4,[1,2,9],[7,8,9])
    print 'd) missing duration data ......'
    Data.survey_vs_sensor_by_surveytime(9,[1,2,9],[7,8,9])

    print
    print 'Survey vs. sensor by duration and gender'
    print '----------------------------------------'
    print
    print 'a) <5min f/m ..................'
    Data.survey_vs_sensor_by_surveytime(1,[1],[7,8,9])
    Data.survey_vs_sensor_by_surveytime(1,[2],[7,8,9])
    print 'b) 5-15min f/m ................'
    Data.survey_vs_sensor_by_surveytime(2,[1],[7,8,9])
    Data.survey_vs_sensor_by_surveytime(2,[2],[7,8,9])
    print 'c) 15-60min f/m ...............'
    Data.survey_vs_sensor_by_surveytime(3,[1],[7,8,9])
    Data.survey_vs_sensor_by_surveytime(3,[2],[7,8,9])
    print 'd) >60min f/m .................'
    Data.survey_vs_sensor_by_surveytime(4,[1],[7,8,9])
    Data.survey_vs_sensor_by_surveytime(4,[2],[7,8,9])

    print
    print 'Survey vs. sensor by duration and age'
    print '-------------------------------------'
    print
    print 'a) <5min <40/40+ ..............'
    Data.survey_vs_sensor_by_surveytime(1,[1,2,9],[7])
    Data.survey_vs_sensor_by_surveytime(1,[1,2,9],[8])
    print 'b) 5-15min <40/40+ ............'
    Data.survey_vs_sensor_by_surveytime(2,[1,2,9],[7])
    Data.survey_vs_sensor_by_surveytime(2,[1,2,9],[8])
    print 'c) 15-60min <40/40+ ...........'
    Data.survey_vs_sensor_by_surveytime(3,[1,2,9],[7])
    Data.survey_vs_sensor_by_surveytime(3,[1,2,9],[8])
    print 'd) >60min <40/40+ .............'
    Data.survey_vs_sensor_by_surveytime(4,[1,2,9],[7])
    Data.survey_vs_sensor_by_surveytime(4,[1,2,9],[8])

    print
    print 'Survey vs. sensor by duration, gender and age'
    print '---------------------------------------------'
    print
    print 'a) <5min <40/40+ f/m ..........'
    print '   <40 & f'
    Data.survey_vs_sensor_by_surveytime(1,[1],[7])
    print '   40+ & f'
    Data.survey_vs_sensor_by_surveytime(1,[1],[8])
    print '   <40 & m'
    Data.survey_vs_sensor_by_surveytime(1,[2],[7])
    print '   40+ & m'
    Data.survey_vs_sensor_by_surveytime(1,[2],[8])
    print 'b) 5-15min <40/40+ f/m ........'
    print '   <40 & f'
    Data.survey_vs_sensor_by_surveytime(2,[1],[7])
    print '   40+ & f'
    Data.survey_vs_sensor_by_surveytime(2,[1],[8])
    print '   <40 & m'
    Data.survey_vs_sensor_by_surveytime(2,[2],[7])
    print '   40+ & m'
    Data.survey_vs_sensor_by_surveytime(2,[2],[8])
    print 'c) 15-60min <40/40+ f/m .......'
    print '   <40 & f'
    Data.survey_vs_sensor_by_surveytime(3,[1],[7])
    print '   40+ & f'
    Data.survey_vs_sensor_by_surveytime(3,[1],[8])
    print '   <40 & m'
    Data.survey_vs_sensor_by_surveytime(3,[2],[7])
    print '   40+ & m'
    Data.survey_vs_sensor_by_surveytime(3,[2],[8])
    print 'd) >60min <40/40+ f/m.........'
    print '   <40 & f'
    Data.survey_vs_sensor_by_surveytime(4,[1],[7])
    print '   40+ & f'
    Data.survey_vs_sensor_by_surveytime(4,[1],[8])
    print '   <40 & m'
    Data.survey_vs_sensor_by_surveytime(4,[2],[7])
    print '   40+ & m'
    Data.survey_vs_sensor_by_surveytime(4,[2],[8])


def survey_survey_comparison(Data):

    print
    print 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
    print
    print 'Survey vs. survey by duration'
    print '-----------------------------'
    print
    print 'a) <5min ......................'
    Data.survey_vs_survey_unknown_not_match(1)
    print 'b) 5-15min ....................'
    Data.survey_vs_survey_unknown_not_match(2)
    print 'c) 15-60min ...................'
    Data.survey_vs_survey_unknown_not_match(3)
    print 'd) >60min .....................'
    Data.survey_vs_survey_unknown_not_match(4)



# Main

Surv_Orig = Survey_Data("survey_contacts_unmatched.csv", range(1,75))
Parts = Participant_Data("survey_general_info_SexAgeImputed_final.csv")
Sensor_Orig = Sensor_Data("sensor_contacts_unfiltered.csv", range(1,77))
Sensor_Filt = Sensor_Data("sensor_contacts_group4_filter.csv", range(1,77))
Sensor_MaxFilt = Sensor_Data("sensor_contacts_group4_filter_ext.csv", range(1,77))
Surv_Match = Survey_Data("survey_contacts_matched_survey.csv", range(1,75))
Surv_SensMatch = Survey_Data("survey_contacts_matched_relaxed.csv", range(1,75))

Data_Surv_Orig = Full_Data(Parts,Surv_Orig,Sensor_Orig)
Data_Surv_Mtch = Full_Data(Parts,Surv_Match,Sensor_Orig)
Data_Orig = Full_Data(Parts,Surv_Orig,Sensor_Orig)
Data_Filt_Mtch_Surv_Orig = Full_Data(Parts,Surv_Orig,Sensor_Filt)
Data_MaxFilt_Mtch_Surv_Orig = Full_Data(Parts,Surv_Orig,Sensor_MaxFilt)
Data_Filt_Mtch = Full_Data(Parts,Surv_SensMatch,Sensor_Filt)
Data_MaxFilt_Mtch = Full_Data(Parts,Surv_SensMatch,Sensor_MaxFilt)
