changeset 2011:bc178ec0e3b1

Merge into dev_main
author Nicholas Jillings <nickjillings@users.noreply.github.com>
date Mon, 01 Jun 2015 09:18:02 +0100
parents 1c7cd4613a96 (diff) f99be82d9621 (current diff)
children f2ef4be20d7f
files ape.js core.js example_eval/project.xml
diffstat 6 files changed, 268 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- a/core.js	Sat May 30 11:23:41 2015 +0100
+++ b/core.js	Mon Jun 01 09:18:02 2015 +0100
@@ -203,6 +203,9 @@
 			for (var id=0; id<this.stateMap.length; id++){
 				var name = this.stateMap[id].nodeName;
 				var obj = document.createElement(name);
+				if (name == "audioHolder") {
+					obj.id = this.stateMap[id].id;
+				}
 				this.stateResults.push(obj);
 			}
 		} else {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/comment_parser.py	Mon Jun 01 09:18:02 2015 +0100
@@ -0,0 +1,38 @@
+import xml.etree.ElementTree as ET
+import os
+import csv
+
+# get every XML file in folder
+for file in os.listdir("."): # You have to put this script in folder where output XML files are.
+    if file.endswith(".xml"):
+        tree = ET.parse(file)
+        root = tree.getroot()
+
+        # get list of all page names
+        for audioholder in root.findall("./audioholder"):   # iterate over pages
+            page_name = audioholder.get('id')               # get page name
+
+            # create folder [page_name] if not yet created
+            if not os.path.exists(page_name):
+                os.makedirs(page_name)
+
+            # for page [page_name], print comments related to fragment [id]
+            for audioelement in root.findall("*/[@id='"+page_name+"']/audioelement"):
+                audio_id = str(audioelement.get('id'))
+                # append to file [page_name]/[page_name]-comments-[id].csv
+                with open(page_name+'/'+page_name+'-comments-'+audio_id+'.csv', 'a') as csvfile:
+                    commentstr = root.find("*/[@id='"
+                                           + page_name
+                                           + "']/audioelement/[@id='"
+                                           + audio_id
+                                           + "']/comment/response").text
+                    writer = csv.writer(csvfile, delimiter=',')
+                    writer.writerow([commentstr.encode("utf-8")])
+                    #TODO Comma doesn't act as delimiter now!
+                    # (when adding more than just a comment per line):
+                    # writer.writerow([file + ',' + commentstr.encode("utf-8")])
+
+                    #TODO Replace 'new line' with something else?
+
+                    #TODO 'Append' means duplicate entries if run several times...
+
--- a/scripts/output_parser.py	Sat May 30 11:23:41 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
-import xml.etree.ElementTree as ET
-import os
-import csv
-
-# Manually enter song names to extract data for (one or more).
-song_names = ['live-DAW', 'live-LeadMe', 'studio-DAW', 'studio-InTheMeantime']
-
-for song_name in song_names:    # iterate over songs
-    # create folder [song_name] if not yet created
-    if not os.path.exists(song_name):
-        os.makedirs(song_name)
-
-    # get every XML file in folder
-    for file in os.listdir("."): # You have to put this in folder where output XML files are.
-        if file.endswith(".xml"):
-            tree = ET.parse(file)
-            root = tree.getroot()
-
-            # for song [song_name], print comments related to mix [id]
-            for audioelement in root.findall("*/[@id='"+song_name+"']/audioelement"):
-                audio_id = str(audioelement.get('id'))
-                # append to file [song_name]/[song_name]-comments-[id].csv
-                with open(song_name+'/'+song_name+'-comments-'+audio_id+'.csv', 'a') as csvfile:
-                    commentstr = root.find("*/[@id='"
-                                           + song_name
-                                           + "']/audioelement/[@id='"
-                                           + audio_id
-                                           + "']/comment/response").text
-                    writer = csv.writer(csvfile, delimiter=',')
-                    writer.writerow([commentstr.encode("utf-8")])
-                    #TODO Comma doesn't act as delimiter now!
-                    # (when adding more than just a comment per line):
-                    # writer.writerow([file + ',' + commentstr.encode("utf-8")])
-
-                    #TODO Replace 'new line' with something else?
-
-                    #TODO 'Append' means duplicate entries if run several times...
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/score_boxplot.py	Mon Jun 01 09:18:02 2015 +0100
@@ -0,0 +1,71 @@
+import sys
+import os
+import csv
+import matplotlib.pyplot as plt
+import numpy as np
+
+rating_folder = 'ratings/' # folder with rating csv files
+show_individual = 'frank'
+
+# get every csv file in folder
+for file in os.listdir(rating_folder): # You have to put this in folder where rating csv files are.
+    if file.endswith(".csv"):
+        page_name = file[:-4] # file name (without extension) is page ID
+
+        # get header
+        with open(rating_folder+file, 'r') as readfile: # read this csv file
+            filereader = csv.reader(readfile, delimiter=',')
+            headerrow = filereader.next() # use headerrow as X-axis
+            headerrow = headerrow[1:]
+
+        # read ratings into matrix
+        ratings = np.loadtxt(open(rating_folder+file,"rb"),
+                            delimiter=",",
+                            skiprows=1,
+                            usecols=range(1,len(headerrow)+1)
+                            )
+
+        # draw boxplot
+        plt.boxplot(ratings)
+
+        # add rating of individual(s)
+        with open(rating_folder+file, 'r') as readfile: # read this csv file
+            filereader = csv.reader(readfile, delimiter=',')
+            headerrow = filereader.next() # use headerrow as X-axis
+            headerrow = headerrow[1:]
+            markerlist = ["x", ".", "o", "*", "+", "v", ">", "<", "8", "s", "p"]
+            increment = 0
+            linehandles = []
+            legendnames = []
+            for row in filereader:
+                subject_id = row[0][:-4]
+                if subject_id in show_individual:
+                    plothandle, = plt.plot(range(1,len(row)), # x-values
+                             row[1:], # y-values: csv values except subject name
+                             color='k',
+                             marker=markerlist[increment%len(markerlist)],
+                             markersize=10,
+                             linestyle='None',
+                             label=subject_id
+                            )
+                    increment += 1 # increase counter
+                    linehandles.append(plothandle)
+                    legendnames.append(subject_id)
+                    plt.legend(linehandles, legendnames,
+                           loc='upper right',
+                           bbox_to_anchor=(1.1, 1), borderaxespad=0.)
+
+
+        plt.xlabel('Fragment')
+        plt.title('Box plot '+page_name)
+        plt.xlim(0, len(headerrow)+1) # only show relevant region, leave space left & right)
+        plt.xticks(range(1, len(headerrow)+1), headerrow) # show fragment names
+
+        plt.ylabel('Rating')
+        plt.ylim(0,1)
+
+        plt.show()
+        #exit()
+
+        #TODO Save output automatically
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/score_individual.py	Mon Jun 01 09:18:02 2015 +0100
@@ -0,0 +1,59 @@
+import sys
+import os
+import csv
+import matplotlib.pyplot as plt
+
+rating_folder = 'ratings/' # folder with rating csv files
+
+colormap = ['b', 'r', 'g', 'c', 'm', 'y', 'k'] # colormap for to cycle through
+markerlist = ["x", ".", "o", "*", "+", "v", ">", "<", "8", "s", "p"]
+
+# get every csv file in folder
+for file in os.listdir(rating_folder): # You have to put this in folder where rating csv files are.
+    if file.endswith(".csv"):
+        page_name = file[:-4] # file name (without extension) is page ID
+
+        with open(rating_folder+file, 'r') as readfile: # read this csv file
+            filereader = csv.reader(readfile, delimiter=',')
+            headerrow = filereader.next() # use headerrow as X-axis
+            headerrow = headerrow[1:]
+
+
+            increment = 0
+            linehandles = []
+            legendnames = []
+            for row in filereader:
+                subject_id = row[0][:-4]
+                plothandle, = plt.plot(range(1,len(row)), # x-values
+                         row[1:], # y-values: csv values except subject name
+                         color=colormap[increment%len(colormap)],
+                         marker=markerlist[increment%len(markerlist)],
+                         markersize=10,
+                         linestyle='None',
+                         label=subject_id
+                        )
+                increment += 1 # increase counter
+                linehandles.append(plothandle)
+                legendnames.append(subject_id)
+
+
+            plt.xlabel('Fragment')
+            plt.title('Individual ratings '+page_name)
+            plt.xlim(0, len(headerrow)+1) # only show relevant region, leave space left & right)
+            plt.xticks(range(1, len(headerrow)+1), headerrow) # show fragment names
+
+            plt.ylabel('Rating')
+            plt.ylim(0,1)
+
+            plt.legend(linehandles, legendnames,
+                       loc='upper right',
+                       bbox_to_anchor=(1.1, 1), borderaxespad=0.)
+
+            #TODO Put legend outside of box
+            #TODO Why two markers in legend?
+
+            plt.show()
+            #exit()
+
+            #TODO Save output automatically
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/score_parser.py	Mon Jun 01 09:18:02 2015 +0100
@@ -0,0 +1,97 @@
+import xml.etree.ElementTree as ET
+import os
+import csv
+
+#TODO Remove DEBUG statements
+
+# get every XML file in folder
+for file in os.listdir("."): # You have to put this in folder where output XML files are.
+    if file.endswith(".xml"):
+        tree = ET.parse(file)
+        root = tree.getroot()
+        #print ["DEBUG Reading " + file + "..."]
+
+        # get subject ID from XML file
+        subject_id = file # file name as subject ID
+
+        # get list of all pages this subject evaluated
+        for audioholder in root.findall("./audioholder"):    # iterate over pages
+            page_name = audioholder.get('id') # get page name
+            #print ["DEBUG    page " + page_name]
+
+            file_name = 'ratings/'+page_name+'-ratings.csv' # score file name
+
+            # create folder 'ratings if not yet created
+            if not os.path.exists('ratings'):
+                os.makedirs('ratings')
+
+            # header: fragment IDs in 'alphabetical' order
+            # go to fragment column, or create new column if it doesn't exist yet
+
+            # get array of audio elements and number of audio elements
+            audiolist = root.findall("*/[@id='"+page_name+"']/audioelement")
+            n_fragments = len(audiolist)
+
+            # get alphabetical array of fragment IDs from this subject's XML
+            fragmentnamelist = []    # make empty list
+            for audioelement in audiolist: # iterate over all audioelements
+                fragmentnamelist.append(audioelement.get('id')) # add to list
+
+
+            # if file exists, get header and add 'new' fragments
+            if os.path.isfile(file_name):
+                #print ["DEBUG file " + file_name + " already exists - reading header"]
+                with open(file_name, 'r') as readfile:
+                    filereader = csv.reader(readfile, delimiter=',')
+                    headerrow = filereader.next()
+                    #headerrow = headerrow[1:] # remove first column (empty)
+
+                    # Which of the fragmentes are in fragmentnamelist but not in headerrow?
+                    newfragments = list(set(fragmentnamelist)-set(headerrow))
+                    newfragments = sorted(newfragments) # new fragments in alphabetical order
+                    # If not empty, read file and rewrite adding extra columns
+                    if newfragments: # if not empty
+                        print ["DEBUG New fragments found: " + str(newfragments)]
+                        with open('temp.csv', 'w') as writefile:
+                            filewriter = csv.writer(writefile, delimiter=',')
+                            filewriter.writerow(headerrow + newfragments) # write new header
+                            for row in filereader: # rewrite row plus empty cells for every new fragment name
+                                #print ["DEBUG Old row: " + str(row)]
+                                filewriter.writerow(row + ['']*len(newfragments))
+                                #print ["DEBUG New row: " + str(row + ['']*len(newfragments))]
+                        os.rename('temp.csv', file_name) # replace old file with temp file
+                        headerrow = headerrow + newfragments
+                        print ["DEBUG New header row: " + str(headerrow)]
+
+            # if not, create file and make header
+            else:
+                #print ["DEBUG file " + file_name + " doesn't exist yet - making new one"]
+                headerrow = sorted(fragmentnamelist) # sort alphabetically
+                headerrow.insert(0,'')
+                fragmentnamelist = fragmentnamelist[1:] #HACKY FIX inserting in firstrow also affects fragmentnamelist
+                with open(file_name, 'w') as writefile:
+                    filewriter = csv.writer(writefile, delimiter=',')
+                    filewriter.writerow(headerrow)
+
+            # open file to write for this page
+            writefile = open(file_name, 'a')
+            filewriter = csv.writer(writefile, delimiter=',')
+
+            # prepare row to be written for this subject for this page
+            ratingrow = [subject_id]
+
+            # get scores related to fragment [id]
+            for fragmentname in headerrow[1:]: # iterate over fragments in header (skip first empty column)
+                elementvalue = root.find("*/[@id='"
+                                       + page_name
+                                       + "']/audioelement/[@id='"
+                                       + fragmentname
+                                       + "']/value")
+                if hasattr(elementvalue, 'text'): # if rating for this fragment exists
+                    ratingrow.append(elementvalue.text) # add to rating row
+                else: # if this subject has not rated this fragment
+                    ratingrow.append('') # append empty cell
+
+            # write row: [subject ID, rating fragment ID 1, ..., rating fragment ID M]
+            filewriter.writerow(ratingrow)
+