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)