def __init__(self, eyetrackfolder, subjectassessmentfilename,
              userfilename):
     super(Eyetrack_Subject_Analysis, self).__init__()
     self.subject_processor = SubjectAssessmentData(
         subjectassessmentfilename)
     self.curEyetrackDataFolder = eyetrackfolder
     self.eyetrackDataFeature = np.array([])
     self.mosForEachImage = {}
     self.meanFeatureValueForEachImage = {}
     self.pupilDiameterset = {}
     self.individualPupilFeature = {}
     self.meanvalueforpupilsize = {}
     self.userinfofilename = userfilename
     self.userInfo = {}
 def __init__(self, eyetrackfolder,subjectassessmentfilename,userfilename):
     super(Eyetrack_Subject_Analysis, self).__init__()
     self.subject_processor = SubjectAssessmentData(subjectassessmentfilename)
     self.curEyetrackDataFolder = eyetrackfolder
     self.eyetrackDataFeature = np.array([])
     self.mosForEachImage = {}
     self.meanFeatureValueForEachImage = {}
     self.pupilDiameterset = {}
     self.individualPupilFeature = {}
     self.meanvalueforpupilsize = {}
     self.userinfofilename = userfilename
     self.userInfo = {}
class Eyetrack_Subject_Analysis(object):
    """docstring for Eyetrack_Subject_Analysis"""
    def __init__(self, eyetrackfolder, subjectassessmentfilename,
                 userfilename):
        super(Eyetrack_Subject_Analysis, self).__init__()
        self.subject_processor = SubjectAssessmentData(
            subjectassessmentfilename)
        self.curEyetrackDataFolder = eyetrackfolder
        self.eyetrackDataFeature = np.array([])
        self.mosForEachImage = {}
        self.meanFeatureValueForEachImage = {}
        self.pupilDiameterset = {}
        self.individualPupilFeature = {}
        self.meanvalueforpupilsize = {}
        self.userinfofilename = userfilename
        self.userInfo = {}

    def getUserInfo(self):
        userinfoprocessor = UserInfo(self.userinfofilename)
        self.userInfo = userinfoprocessor.readUserInfoFile()

    def getDisparityAngularFile(self, disparityfilesavepath):
        files = os.listdir(self.curEyetrackDataFolder)
        featureSet = []
        index = 0
        for file in files:
            print index, file
            index = index + 1
            if os.path.splitext(file)[1] == ".csv":
                curfile = self.curEyetrackDataFolder + '/' + file
                curEyetrackDataProcessor = EyetrackerData(curfile)
                curEyetrackDataProcessor.getDisparityAngularFile(
                    disparityfilesavepath)

    def extrackEyetrackFeatures(self, basicEye):
        self.getUserInfo()
        files = os.listdir(self.curEyetrackDataFolder)
        featureSet = []
        index = 0
        for file in files:
            print index, file
            index = index + 1
            if os.path.splitext(file)[1] == ".csv":
                curRecord = []
                splitresult = file.split('_')
                if len(splitresult) == 4:
                    imgName = splitresult[3][:-4] + '.jpg'
                    userName = splitresult[2]
                else:
                    imgName = splitresult[4][:-4] + '.jpg'
                    userName = splitresult[2] + '_' + splitresult[3]
                curRecord.append(imgName)
                if basicEye == 'left' or basicEye == 'right':
                    curfile = self.curEyetrackDataFolder + '/' + file
                elif basicEye == 'main' or basicEye == 'nomain':
                    print "Please Modify the folder for your eyetracker data"
                    if self.userInfo[
                            userName] == -1:  #-1 means you choose the main eye and 1 means you choose the Auxiliary eye
                        curfile = "Your left eye folder" + '/' + file
                    else:
                        curfile = "Your right eye folder" + file
                else:
                    print "Wrong choosed for the basic eye!"
                    return
                curEyetrackDataProcessor = EyetrackerData(curfile)
                curEyetrackFeatures = curEyetrackDataProcessor.getFixationFeatures(
                )
                curRecord.extend(curEyetrackFeatures)
                featureSet.append(curRecord)
                print curRecord
        self.eyetrackDataFeature = np.array(featureSet)

    def getRelationBetweenEyetrackFeaturesAndSubjectScore(self, basicEye):
        """验证总体特征与主观评分之间的相关性"""
        self.extrackEyetrackFeatures(basicEye)
        self.mosForEachImage = self.subject_processor.getAvgMosForEachImage()
        #self.getPupilFeature()
        if len(self.meanFeatureValueForEachImage) == 0:
            self.getMeanFeatureValueForEachImage(basicEye)

        #self.svmTrain()
        # w,h = self.eyetrackDataFeature.shape
        # print w,h
        # percent=range(5,60,5)
        # plccset=np.array([])
        # for i in range(h-1):
        #     curPlcc = self.getRelationBetweenEyetrackFeatureAndSubjectScore(i)
        #     plccset = np.append(plccset,curPlcc)
        # plt.xlabel('Disparity Percent in front of the sorted serial')
        # plt.ylabel('LCC')
        # xmajorLocator = plt.MultipleLocator(5)
        # ymajorLocator = plt.MultipleLocator(0.1)
        # ax = plt.subplot(111)
        # plt.plot(percent,plccset,'-r*')
        # ax.xaxis.set_major_locator(xmajorLocator)
        # ax.yaxis.set_major_locator(ymajorLocator)
        # plt.grid()
        # plt.title('Relationship between the percentage we choosed and mos')
        #
        # plt.show()
        # self.getRelationBetweenEyetrackFeatureAndSubjectScore(6)

    def getRelationBetweenEyetrackFeatureAndSubjectScore(self, featureindex):
        """验证各特征与主观评分之间的相关性"""
        if len(self.mosForEachImage) != len(self.meanFeatureValueForEachImage):
            raise ValueError(
                'the number of mos and feature is not equal,please check it')
        else:
            feature_score_pairlist = []
            for key in self.mosForEachImage:
                curList = [
                    key, self.mosForEachImage[key],
                    self.meanFeatureValueForEachImage[key][featureindex]
                ]
                feature_score_pairlist.append(curList)
            feature_score_pairlist = np.array(feature_score_pairlist)
            feature_score_pairarray = np.array(feature_score_pairlist[:, 1:],
                                               dtype=float)
            x = feature_score_pairarray[:, 0]
            y = feature_score_pairarray[:, 1]
            plcc, pval = statstool.pearsonr(x, y)
            srocc, pval = statstool.spearmanr(x, y)
            print "feature %d,%f,%f" % (featureindex, plcc, srocc)
            return plcc
            #plt.plot(x,'b-')
            #plt.plot(y,'r-')
            #plt.show()

    def getMeanFeatureValueForEachImage(self, basicEye):
        """获取针对每幅图像的平均特征值"""
        if len(self.eyetrackDataFeature) == 0:
            self.extrackEyetrackFeatures(basicEye)
        classific = {}
        index = 0
        for item in self.eyetrackDataFeature:
            imgName = item[0]
            if imgName not in classific:
                classific[imgName] = set([index])
            else:
                classific[imgName].add(index)
            index += 1
        # blinkfeaturesprocessor = EyetrackingDataBlinkFeaturesFactory()
        # blinkfeatures = blinkfeaturesprocessor.getEyeBlinkFeatures()
        for key in classific:
            serial = list(classific[key])
            tmp2 = self.eyetrackDataFeature[serial, 1:]
            tmp = np.array(tmp2, dtype=float)
            self.meanFeatureValueForEachImage[key] = np.mean(tmp, axis=0)
            # tmp3 = np.mean(blinkfeatures[key],axis=0)
            # self.meanFeatureValueForEachImage[key] = np.hstack((tmp3,self.meanFeatureValueForEachImage[key]))
            #self.meanFeatureValueForEachImage[key] = np.append(self.meanFeatureValueForEachImage[key],self.meanvalueforpupilsize[key])
    def getPupilFeature(self):
        individualpupilsize = self.calAvgPupilDiameter()
        averagepupilsizeforrecord = self.calAvgPupilForRecord()
        meanvalueforpupilsize = {}
        for key in averagepupilsizeforrecord:
            splitResult = key.split('_')
            imgName = splitResult[-1]
            if len(splitResult) == 2:
                userName = splitResult[0]
            else:
                userName = splitResult[0] + '_' + splitResult[1]
            curpupilsize = averagepupilsizeforrecord[
                key] / individualpupilsize[userName]
            if imgName not in meanvalueforpupilsize:
                meanvalueforpupilsize[imgName] = curpupilsize
            else:
                meanvalueforpupilsize[imgName] = np.append(
                    meanvalueforpupilsize[imgName], curpupilsize)

        for key in meanvalueforpupilsize:
            meanvalueforpupilsize[key] = meanvalueforpupilsize[key].reshape(
                len(meanvalueforpupilsize[key]) / 2, 2)
            meanvalueforpupilsize[key] = np.mean(meanvalueforpupilsize[key],
                                                 axis=0)

        self.meanvalueforpupilsize = meanvalueforpupilsize

    def calAvgPupilDiameter(self):
        avgpupilsize = {}
        for key in self.pupilDiameterset:
            avgpupilsize[key] = np.mean(self.pupilDiameterset[key], axis=0)
        return avgpupilsize

    def calAvgPupilForRecord(self):
        avgpupilsizeForRecord = {}
        for key in self.individualPupilFeature:
            avgpupilsizeForRecord[key] = np.mean(
                self.individualPupilFeature[key], axis=0)
        return avgpupilsizeForRecord

    def getEyetrackerDataFeatures(self, basicEye, featuresfilesavename):
        """svm 学习训练 """
        self.getRelationBetweenEyetrackFeaturesAndSubjectScore(basicEye)
        feature_mos_set = np.array([])
        num = 0
        for key in self.mosForEachImage:
            cur_set = np.array(self.mosForEachImage[key])
            cur_set = np.append(cur_set,
                                self.meanFeatureValueForEachImage[key])
            length = len(cur_set)
            feature_mos_set = np.append(feature_mos_set, cur_set)
            num += 1
        feature_mos_set = feature_mos_set.reshape(num, length)
        csvfile = file(featuresfilesavename, 'a+')
        writer = csv.writer(csvfile)
        writer.writerows(feature_mos_set)
        csvfile.close()
class Eyetrack_Subject_Analysis(object):
    """docstring for Eyetrack_Subject_Analysis"""

    def __init__(self, eyetrackfolder,subjectassessmentfilename,userfilename):
        super(Eyetrack_Subject_Analysis, self).__init__()
        self.subject_processor = SubjectAssessmentData(subjectassessmentfilename)
        self.curEyetrackDataFolder = eyetrackfolder
        self.eyetrackDataFeature = np.array([])
        self.mosForEachImage = {}
        self.meanFeatureValueForEachImage = {}
        self.pupilDiameterset = {}
        self.individualPupilFeature = {}
        self.meanvalueforpupilsize = {}
        self.userinfofilename = userfilename
        self.userInfo = {}


    def getUserInfo(self):
        userinfoprocessor = UserInfo(self.userinfofilename)
        self.userInfo = userinfoprocessor.readUserInfoFile()

    def getDisparityAngularFile(self,disparityfilesavepath):
        files = os.listdir(self.curEyetrackDataFolder)
        featureSet = []
        index = 0
        for file in files:
            print index,file
            index = index+1
            if os.path.splitext(file)[1] == ".csv":
                curfile = self.curEyetrackDataFolder+'/'+file
                curEyetrackDataProcessor = EyetrackerData(curfile)
                curEyetrackDataProcessor.getDisparityAngularFile(disparityfilesavepath)


    def extrackEyetrackFeatures(self,basicEye):
        self.getUserInfo()
        files = os.listdir(self.curEyetrackDataFolder)
        featureSet = []
        index = 0
        for file in files:
            print index,file
            index = index+1
            if os.path.splitext(file)[1] == ".csv":
                curRecord = []
                splitresult = file.split('_')
                if len(splitresult) == 4:
                    imgName = splitresult[3][:-4]+'.jpg'
                    userName = splitresult[2]
                else:
                    imgName = splitresult[4][:-4]+'.jpg'
                    userName = splitresult[2]+'_'+splitresult[3]
                curRecord.append(imgName)
                if basicEye == 'left' or basicEye == 'right':
                    curfile = self.curEyetrackDataFolder+'/'+file
                elif basicEye == 'main' or basicEye == 'nomain':
                    print "Please Modify the folder for your eyetracker data"
                    if self.userInfo[userName] == -1:#-1 means you choose the main eye and 1 means you choose the Auxiliary eye
                        curfile = "Your left eye folder"+'/'+file
                    else:
                        curfile = "Your right eye folder"+file
                else:
                    print "Wrong choosed for the basic eye!";
                    return
                curEyetrackDataProcessor = EyetrackerData(curfile)
                curEyetrackFeatures = curEyetrackDataProcessor.getFixationFeatures()
                curRecord.extend(curEyetrackFeatures)
                featureSet.append(curRecord)
                print curRecord
        self.eyetrackDataFeature = np.array(featureSet)

    def getRelationBetweenEyetrackFeaturesAndSubjectScore(self,basicEye):
        """验证总体特征与主观评分之间的相关性"""
        self.extrackEyetrackFeatures(basicEye)
        self.mosForEachImage = self.subject_processor.getAvgMosForEachImage()
        #self.getPupilFeature()
        if len(self.meanFeatureValueForEachImage) == 0:
            self.getMeanFeatureValueForEachImage(basicEye)

        #self.svmTrain()
        # w,h = self.eyetrackDataFeature.shape
        # print w,h
        # percent=range(5,60,5)
        # plccset=np.array([])
        # for i in range(h-1):
        #     curPlcc = self.getRelationBetweenEyetrackFeatureAndSubjectScore(i)
        #     plccset = np.append(plccset,curPlcc)
        # plt.xlabel('Disparity Percent in front of the sorted serial')
        # plt.ylabel('LCC')
        # xmajorLocator = plt.MultipleLocator(5)
        # ymajorLocator = plt.MultipleLocator(0.1)
        # ax = plt.subplot(111)
        # plt.plot(percent,plccset,'-r*')
        # ax.xaxis.set_major_locator(xmajorLocator)
        # ax.yaxis.set_major_locator(ymajorLocator)
        # plt.grid()
        # plt.title('Relationship between the percentage we choosed and mos')
        #
        # plt.show()
        # self.getRelationBetweenEyetrackFeatureAndSubjectScore(6)

    def getRelationBetweenEyetrackFeatureAndSubjectScore(self,featureindex):
        """验证各特征与主观评分之间的相关性"""
        if len(self.mosForEachImage) != len(self.meanFeatureValueForEachImage):
            raise ValueError('the number of mos and feature is not equal,please check it')
        else:
            feature_score_pairlist = []
            for key in self.mosForEachImage:
                curList = [key,self.mosForEachImage[key],self.meanFeatureValueForEachImage[key][featureindex]]
                feature_score_pairlist.append(curList)
            feature_score_pairlist = np.array(feature_score_pairlist)
            feature_score_pairarray = np.array(feature_score_pairlist[:,1:], dtype=float)
            x = feature_score_pairarray[:,0]
            y = feature_score_pairarray[:,1]
            plcc,pval = statstool.pearsonr(x,y)
            srocc,pval = statstool.spearmanr(x,y)
            print "feature %d,%f,%f" %(featureindex,plcc,srocc)
            return plcc
            #plt.plot(x,'b-')
            #plt.plot(y,'r-')
            #plt.show()

    def getMeanFeatureValueForEachImage(self,basicEye):
        """获取针对每幅图像的平均特征值"""
        if len(self.eyetrackDataFeature) == 0:
            self.extrackEyetrackFeatures(basicEye)
        classific = {}
        index = 0
        for item in self.eyetrackDataFeature:
            imgName = item[0]
            if imgName not in classific:
                classific[imgName] = set([index])
            else:
                classific[imgName].add(index)
            index += 1
        # blinkfeaturesprocessor = EyetrackingDataBlinkFeaturesFactory()
        # blinkfeatures = blinkfeaturesprocessor.getEyeBlinkFeatures()
        for key in classific:
            serial = list(classific[key])
            tmp2 = self.eyetrackDataFeature[serial,1:]
            tmp = np.array(tmp2,dtype=float)
            self.meanFeatureValueForEachImage[key] = np.mean(tmp,axis = 0)
            # tmp3 = np.mean(blinkfeatures[key],axis=0)
            # self.meanFeatureValueForEachImage[key] = np.hstack((tmp3,self.meanFeatureValueForEachImage[key]))
            #self.meanFeatureValueForEachImage[key] = np.append(self.meanFeatureValueForEachImage[key],self.meanvalueforpupilsize[key])
    def getPupilFeature(self):
        individualpupilsize = self.calAvgPupilDiameter()
        averagepupilsizeforrecord = self.calAvgPupilForRecord()
        meanvalueforpupilsize = {}
        for key in averagepupilsizeforrecord:
            splitResult = key.split('_')
            imgName = splitResult[-1]
            if len(splitResult) == 2:
                userName = splitResult[0]
            else:
                userName = splitResult[0]+'_'+splitResult[1]
            curpupilsize = averagepupilsizeforrecord[key]/individualpupilsize[userName]
            if imgName not in meanvalueforpupilsize:
                meanvalueforpupilsize[imgName] = curpupilsize
            else:
                meanvalueforpupilsize[imgName] = np.append(meanvalueforpupilsize[imgName],curpupilsize)

        for key in meanvalueforpupilsize:
            meanvalueforpupilsize[key] = meanvalueforpupilsize[key].reshape(len(meanvalueforpupilsize[key])/2,2)
            meanvalueforpupilsize[key] = np.mean(meanvalueforpupilsize[key],axis=0)

        self.meanvalueforpupilsize = meanvalueforpupilsize


    def calAvgPupilDiameter(self):
        avgpupilsize = {}
        for key in self.pupilDiameterset:
            avgpupilsize[key] = np.mean(self.pupilDiameterset[key],axis=0)
        return avgpupilsize

    def calAvgPupilForRecord(self):
        avgpupilsizeForRecord = {}
        for key in self.individualPupilFeature:
            avgpupilsizeForRecord[key] = np.mean(self.individualPupilFeature[key],axis=0)
        return avgpupilsizeForRecord

    def getEyetrackerDataFeatures(self,basicEye,featuresfilesavename):
        """svm 学习训练 """
        self.getRelationBetweenEyetrackFeaturesAndSubjectScore(basicEye)
        feature_mos_set = np.array([])
        num = 0
        for key in self.mosForEachImage:
            cur_set = np.array(self.mosForEachImage[key])
            cur_set = np.append(cur_set,self.meanFeatureValueForEachImage[key])
            length = len(cur_set)
            feature_mos_set = np.append(feature_mos_set,cur_set)
            num += 1
        feature_mos_set = feature_mos_set.reshape(num,length)
        csvfile=file(featuresfilesavename,'a+')
        writer=csv.writer(csvfile)
        writer.writerows(feature_mos_set)
        csvfile.close()