Mercurial > hg > webaudioevaluationtool
comparison scripts/score_parser.py @ 1316:279930a008ca
All interfaces support comment boxes. Comment box identification matches presented tag (for instance, AB will be Comment on fragment A, rather than 1). Tighter buffer loading protocol, audioObjects register with the buffer rather than checking for buffer existence (which can be buggy depending on the buffer state). Buffers now have a state to ensure exact location in loading chain (downloading, decoding, LUFS, ready).
author | Nicholas Jillings <nickjillings@users.noreply.github.com> |
---|---|
date | Fri, 29 Jan 2016 11:11:57 +0000 |
parents | |
children | 8540d153caec |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 1316:279930a008ca |
---|---|
1 #!/usr/bin/python | |
2 | |
3 import xml.etree.ElementTree as ET | |
4 import os | |
5 import sys | |
6 import csv | |
7 | |
8 # COMMAND LINE ARGUMENTS | |
9 | |
10 assert len(sys.argv)<3, "score_parser takes at most 1 command line argument\n"+\ | |
11 "Use: python score_parser.py [rating_folder_location]" | |
12 | |
13 # XML results files location | |
14 if len(sys.argv) == 1: | |
15 folder_name = "../saves" # Looks in 'saves/' folder from 'scripts/' folder | |
16 print "Use: python score_parser.py [rating_folder_location]" | |
17 print "Using default path: " + folder_name | |
18 elif len(sys.argv) == 2: | |
19 folder_name = sys.argv[1] # First command line argument is folder | |
20 | |
21 # check if folder_name exists | |
22 if not os.path.exists(folder_name): | |
23 #the file is not there | |
24 print "Folder '"+folder_name+"' does not exist." | |
25 sys.exit() # terminate script execution | |
26 elif not os.access(os.path.dirname(folder_name), os.W_OK): | |
27 #the file does exist but write privileges are not given | |
28 print "No write privileges in folder '"+folder_name+"'." | |
29 | |
30 | |
31 # CODE | |
32 | |
33 # remember which files have been opened this time | |
34 file_history = [] | |
35 | |
36 # get every XML file in folder | |
37 for file in os.listdir(folder_name): | |
38 if file.endswith(".xml"): | |
39 tree = ET.parse(folder_name + '/' + file) | |
40 root = tree.getroot() | |
41 | |
42 # get subject ID from XML file | |
43 subject_id = file[:-4] # file name (without extension) as subject ID | |
44 | |
45 # get list of all pages this subject evaluated | |
46 for audioholder in root.findall("./audioholder"): # iterate over pages | |
47 page_name = audioholder.get('id') # get page name | |
48 | |
49 if page_name is None: # ignore 'empty' audio_holders | |
50 print "WARNING: " + file + " contains empty audio holder. (score_parser.py)" | |
51 break | |
52 | |
53 file_name = folder_name+'/ratings/'+page_name+'-ratings.csv' # score file name | |
54 | |
55 # create folder 'ratings' if not yet created | |
56 if not os.path.exists(folder_name + '/ratings'): | |
57 os.makedirs(folder_name + '/ratings') | |
58 | |
59 # header: fragment IDs in 'alphabetical' order | |
60 # go to fragment column, or create new column if it doesn't exist yet | |
61 | |
62 # get array of audio elements and number of audio elements | |
63 audiolist = audioholder.findall("./audioelement") | |
64 n_fragments = len(audiolist) | |
65 | |
66 # get alphabetical array of fragment IDs from this subject's XML | |
67 fragmentnamelist = [] # make empty list | |
68 for audioelement in audiolist: # iterate over all audioelements | |
69 fragmentnamelist.append(audioelement.get('id')) # add to list | |
70 | |
71 # if file exists, get header and add 'new' fragments | |
72 if os.path.isfile(file_name): | |
73 with open(file_name, 'r') as readfile: | |
74 filereader = csv.reader(readfile, delimiter=',') | |
75 headerrow = filereader.next() | |
76 | |
77 # If file hasn't been opened yet this time, remove all rows except header | |
78 if file_name not in file_history: | |
79 with open(file_name, 'w') as writefile: | |
80 filewriter = csv.writer(writefile, delimiter=',') | |
81 headerrow = sorted(headerrow) | |
82 filewriter.writerow(headerrow) | |
83 file_history.append(file_name) | |
84 | |
85 # Which of the fragmentes are in fragmentnamelist but not in headerrow? | |
86 newfragments = list(set(fragmentnamelist)-set(headerrow)) | |
87 newfragments = sorted(newfragments) # new fragments in alphabetical order | |
88 # If not empty, read file and rewrite adding extra columns | |
89 if newfragments: # if not empty | |
90 with open('temp.csv', 'w') as writefile: | |
91 filewriter = csv.writer(writefile, delimiter=',') | |
92 filewriter.writerow(headerrow + newfragments) # write new header | |
93 with open(file_name, 'r') as readfile: | |
94 filereader = csv.reader(readfile, delimiter=',') | |
95 filereader.next() # skip header | |
96 for row in filereader: # rewrite row plus empty cells for every new fragment name | |
97 filewriter.writerow(row + ['']*len(newfragments)) | |
98 os.rename('temp.csv', file_name) # replace old file with temp file | |
99 headerrow = headerrow + newfragments | |
100 | |
101 # if not, create file and make header | |
102 else: | |
103 headerrow = sorted(fragmentnamelist) # sort alphabetically | |
104 headerrow.insert(0,'') | |
105 fragmentnamelist = fragmentnamelist[1:] #HACKY FIX inserting in firstrow also affects fragmentnamelist | |
106 with open(file_name, 'w') as writefile: | |
107 filewriter = csv.writer(writefile, delimiter=',') | |
108 filewriter.writerow(headerrow) | |
109 | |
110 # open file to write for this page | |
111 writefile = open(file_name, 'a') | |
112 filewriter = csv.writer(writefile, delimiter=',') | |
113 | |
114 # prepare row to be written for this subject for this page | |
115 ratingrow = [subject_id] | |
116 | |
117 # get scores related to fragment [id] | |
118 for fragmentname in headerrow[1:]: # iterate over fragments in header (skip first empty column) | |
119 elementvalue = audioholder.find("./audioelement/[@id='" | |
120 + fragmentname | |
121 + "']/value") | |
122 if hasattr(elementvalue, 'text'): # if rating for this fragment exists | |
123 ratingrow.append(elementvalue.text) # add to rating row | |
124 else: # if this subject has not rated this fragment | |
125 ratingrow.append('') # append empty cell | |
126 | |
127 # write row: [subject ID, rating fragment ID 1, ..., rating fragment ID M] | |
128 if any(ratingrow[1:]): # append to file if row non-empty (except subject name) | |
129 filewriter.writerow(ratingrow) |