# HG changeset patch # User www-data # Date 1461180054 -3600 # Node ID 334b11f2b4182f1c193ddd2810e78c1c0e2537f7 # Parent 372a355779dedd30542e5a24449edd9d58c50e5e# Parent 17b7ab4f93f25e4f78b5a1da93d1a803f8a372b5 Merge branch 'master' of https://github.com/BrechtDeMan/WebAudioEvaluationTool diff -r 372a355779de -r 334b11f2b418 python/evaluation_stats.py --- a/python/evaluation_stats.py Wed Apr 20 19:20:48 2016 +0100 +++ b/python/evaluation_stats.py Wed Apr 20 20:20:54 2016 +0100 @@ -13,8 +13,8 @@ # XML results files location if len(sys.argv) == 1: folder_name = "../saves" # Looks in 'saves/' folder from 'scripts/' folder - print "Use: python evaluation_stats.py [results_folder]" - print "Using default path: " + folder_name + print("Use: python evaluation_stats.py [results_folder]") + print("Using default path: " + folder_name) elif len(sys.argv) == 2: folder_name = sys.argv[1] # First command line argument is folder @@ -48,35 +48,35 @@ tree = ET.parse(folder_name + '/' + file) root = tree.getroot() - print file # print file name (subject name) + print(file) # print file name (subject name) # reset for new subject total_duration = 0 page_number = 0 # get list of all page names - for audioholder in root.findall("./page"): # iterate over pages - page_name = audioholder.get('ref') # get page name + for page in root.findall("./page"): # iterate over pages + page_name = page.get('ref') # get page name if page_name is None: # ignore 'empty' audio_holders - print "WARNING: " + file + " contains empty audio holder. (evaluation_stats.py)" + print("\tWARNING: " + file + " contains empty audio holder. (evaluation_stats.py)") break # move on to next - if audioholder.get("state") != "complete": - print "WARNING" + file + " contains incomplete audio holder." + if page.get("state") != "complete": + print("\tWARNING: " + file + " contains incomplete audio holder.") break number_of_comments = 0 # for this page number_of_missing_comments = 0 # for this page not_played = 0 # for this page not_moved = 0 # for this page - # 'testTime' keeps total duration: subtract time so far for duration of this audioholder - duration = float(audioholder.find("./metric/metricresult[@id='testTime']").text) - total_duration + # 'testTime' keeps total duration: subtract time so far for duration of this page + duration = float(page.find("./metric/metricresult[@id='testTime']").text) - total_duration # total duration of test total_duration += duration # number of audio elements - audioelements = audioholder.findall("./audioelement") # get audioelements + audioelements = page.findall("./audioelement") # get audioelements number_of_fragments += len(audioelements) # add length of this list to total # number of comments (interesting if comments not mandatory) @@ -99,22 +99,22 @@ total_not_played += not_played total_not_moved += not_moved - # print audioholder id and duration - print " " + page_name + ": " + seconds2timestr(duration) + ", "\ + # print page id and duration + print(" " + page_name + ": " + seconds2timestr(duration) + ", "\ + str(number_of_comments)+"/"\ - +str(number_of_comments+number_of_missing_comments)+" comments" + +str(number_of_comments+number_of_missing_comments)+" comments") # number of audio elements not played if not_played > 1: - print 'ATTENTION: '+str(not_played)+' fragments were not listened to!' + print('ATTENTION: '+str(not_played)+' fragments were not listened to!') if not_played == 1: - print 'ATTENTION: one fragment was not listened to!' + print('ATTENTION: one fragment was not listened to!') # number of audio element markers not moved if not_moved > 1: - print 'ATTENTION: '+str(not_moved)+' markers were not moved!' + print('ATTENTION: '+str(not_moved)+' markers were not moved!') if not_moved == 1: - print 'ATTENTION: one marker was not moved!' + print('ATTENTION: one marker was not moved!') # keep track of duration in function of page index if len(duration_order)>page_number: @@ -122,9 +122,9 @@ else: duration_order.append([duration]) - # keep list of audioholder ids and count how many times each audioholder id + # keep list of page ids and count how many times each page id # was tested, how long it took, and how many fragments there were (if number of - # fragments is different, store as different audioholder id) + # fragments is different, store as different page id) if page_name in page_names: page_index = page_names.index(page_name) # get index # check if number of audioelements the same @@ -154,35 +154,28 @@ time_per_page_accum += duration # total duration (for average time spent per page) # print total duration of this test - print " TOTAL: " + seconds2timestr(total_duration) + print(" TOTAL: " + seconds2timestr(total_duration)) # PRINT EVERYTHING -print "Number of XML files: " + str(number_of_XML_files) -print "Number of pages: " + str(number_of_pages) -print "Number of fragments: " + str(number_of_fragments) -print "Number of empty comments: " + str(total_empty_comments) +\ - " (" + str(round(100.0*total_empty_comments/number_of_fragments,2)) + "%)" -print "Number of unplayed fragments: " + str(total_not_played) +\ - " (" + str(round(100.0*total_not_played/number_of_fragments,2)) + "%)" -print "Number of unmoved markers: " + str(total_not_moved) +\ - " (" + str(round(100.0*total_not_moved/number_of_fragments,2)) + "%)" -print "Average time per page: " + seconds2timestr(time_per_page_accum/number_of_pages) - -# Pages and number of times tested -page_count_strings = list(str(x) for x in page_count) -count_list = page_names + page_count_strings -count_list[::2] = page_names -count_list[1::2] = page_count_strings -print "Pages tested: " + str(count_list) +print("Number of XML files: " + str(number_of_XML_files)) +print("Number of pages: " + str(number_of_pages)) +print("Number of fragments: " + str(number_of_fragments)) +print("Number of empty comments: " + str(total_empty_comments) +\ + " (" + str(round(100.0*total_empty_comments/number_of_fragments,2)) + "%)") +print("Number of unplayed fragments: " + str(total_not_played) +\ + " (" + str(round(100.0*total_not_played/number_of_fragments,2)) + "%)") +print("Number of unmoved markers: " + str(total_not_moved) +\ + " (" + str(round(100.0*total_not_moved/number_of_fragments,2)) + "%)") +print("Average time per page: " + seconds2timestr(time_per_page_accum/number_of_pages)) # Average duration for first, second, ... page -print "Average duration per page:" +print("Average duration per ordered page:") for page_number in range(len(duration_order)): - print " page " + str(page_number+1) + ": " +\ + print(" page " + str(page_number+1) + ": " +\ seconds2timestr(sum(duration_order[page_number])/len(duration_order[page_number])) +\ - " ("+str(len(duration_order[page_number]))+" subjects)" + " ("+str(len(duration_order[page_number]))+" subjects)") # Sort pages by number of audioelements, then by duration @@ -199,12 +192,12 @@ combined_list = sorted(zip(*combined_list), key=operator.itemgetter(1, 2)) # sort # Show average duration for all songs -print "Average duration per audioholder:" +print("Average duration per page ID:") for page_index in range(len(page_names)): - print " "+combined_list[page_index][0] + ": " \ + print(" "+combined_list[page_index][0] + ": " \ + seconds2timestr(combined_list[page_index][1]) \ + " (" + str(combined_list[page_index][3]) + " subjects, " \ - + str(combined_list[page_index][2]) + " fragments)" + + str(combined_list[page_index][2]) + " fragments)") #TODO diff -r 372a355779de -r 334b11f2b418 python/generate_report.py --- a/python/generate_report.py Wed Apr 20 19:20:48 2016 +0100 +++ b/python/generate_report.py Wed Apr 20 20:20:54 2016 +0100 @@ -19,8 +19,8 @@ # XML results files location if len(sys.argv) == 1: folder_name = "../saves/" # Looks in 'saves/' folder from 'scripts/' folder - print "Use: python generate_report.py [results_folder] [no_render | -nr]" - print "Using default path: " + folder_name + print("Use: python generate_report.py [results_folder] [no_render | -nr]") + print("Using default path: " + folder_name) elif len(sys.argv) == 2: folder_name = sys.argv[1] # First command line argument is folder elif len(sys.argv) == 3: @@ -54,7 +54,7 @@ # arrays initialisation page_names = [] real_page_names = [] # regardless of differing numbers of fragments -subject_count = [] # subjects per audioholder name +subject_count = [] # subjects per page name page_count = [] duration_page = [] # duration of experiment in function of page content duration_order = [] # duration of experiment in function of page number @@ -150,11 +150,11 @@ #TODO add plot of age # get list of all page names - for audioholder in root.findall("./page"): # iterate over pages - page_name = audioholder.get('id') # get page name + for page in root.findall("./page"): # iterate over pages + page_name = page.get('ref') # get page name if page_name is None: # ignore 'empty' audio_holders - print "WARNING: " + file + " contains empty audio holder. (evaluation_stats.py)" + print("WARNING: " + file + " contains empty audio holder. (evaluation_stats.py)") break # move on to next number_of_comments = 0 # for this page @@ -162,9 +162,9 @@ not_played = [] # for this page not_moved = [] # for this page - if audioholder.find("./metric/metricresult[@id='testTime']") is not None: # check if time is included - # 'testTime' keeps total duration: subtract time so far for duration of this audioholder - duration = float(audioholder.find("./metric/metricresult[@id='testTime']").text) - total_duration + if page.find("./metric/metricresult[@id='testTime']") is not None: # check if time is included + # 'testTime' keeps total duration: subtract time so far for duration of this page + duration = float(page.find("./metric/metricresult[@id='testTime']").text)# - total_duration # total duration of test total_duration += duration @@ -173,22 +173,22 @@ total_duration = float('nan') # number of audio elements - audioelements = audioholder.findall("./audioelement") # get audioelements + audioelements = page.findall("./audioelement") # get audioelements number_of_fragments += len(audioelements) # add length of this list to total # number of comments (interesting if comments not mandatory) for audioelement in audioelements: response = audioelement.find("./comment/response") - was_played = audioelement.find("./metric/metricresult/[@name='elementFlagListenedTo']") - was_moved = audioelement.find("./metric/metricresult/[@name='elementFlagMoved']") - if response.text is not None and len(response.text) > 1: + was_played = audioelement.find("./metric/metricResult/[@name='elementFlagListenedTo']") + was_moved = audioelement.find("./metric/metricResult/[@name='elementFlagMoved']") + if response is not None and response.text is not None and len(response.text) > 1: number_of_comments += 1 else: number_of_missing_comments += 1 if was_played is not None and was_played.text == 'false': - not_played.append(audioelement.get('id')) + not_played.append(audioelement.get('name')) if was_moved is not None and was_moved.text == 'false': - not_moved.append(audioelement.get('id')) + not_moved.append(audioelement.get('name')) # update global counters total_empty_comments += number_of_missing_comments @@ -220,7 +220,7 @@ str(number_of_comments+number_of_missing_comments)+'&'+\ seconds2timestr(duration)+'\\\\\n' - # get timeline for this audioholder + # get timeline for this page img_path = 'timelines_movement/'+file[:-4]+'-'+page_name+'.pdf' # check if available @@ -235,9 +235,9 @@ else: duration_order.append([duration]) - # keep list of audioholder ids and count how many times each audioholder id + # keep list of page ids and count how many times each page id # was tested, how long it took, and how many fragments there were - # (if number of fragments is different, store as different audioholder id) + # (if number of fragments is different, store as different page id) if page_name in page_names: page_index = page_names.index(page_name) # get index # check if number of audioelements the same @@ -261,7 +261,7 @@ duration_page.append([duration]) fragments_per_page.append(len(audioelements)) - # number of subjects per audioholder regardless of differing numbers of + # number of subjects per page regardless of differing numbers of # fragments (for inclusion in box plots) if page_name in real_page_names: page_index = real_page_names.index(page_name) # get index @@ -354,15 +354,15 @@ # Show average duration for all songs body += r'''\vspace{.5cm} - Average duration per audioholder (see also Figure \ref{fig:avgtimeperaudioholder}): \\ + Average duration per page (see also Figure \ref{fig:avgtimeperpage}): \\ \begin{tabular}{llll} \textbf{Audioholder} & \textbf{Duration} & \textbf{\# subjects} & \textbf{\# fragments} \\''' -audioholder_names_ordered = [] -average_duration_audioholder_ordered = [] +page_names_ordered = [] +average_duration_page_ordered = [] number_of_subjects = [] for page_index in range(len(page_names)): - audioholder_names_ordered.append(combined_list[page_index][0]) - average_duration_audioholder_ordered.append(combined_list[page_index][1]) + page_names_ordered.append(combined_list[page_index][0]) + average_duration_page_ordered.append(combined_list[page_index][1]) number_of_subjects.append(combined_list[page_index][3]) body += '\n\t\t\t'+combined_list[page_index][0] + "&" +\ seconds2timestr(combined_list[page_index][1]) + "&" +\ @@ -371,25 +371,25 @@ body += '\n\t\t\\end{tabular}\n' # SHOW bar plot of average time per page -plt.bar(range(1,len(audioholder_names_ordered)+1), np.array(average_duration_audioholder_ordered)/60) +plt.bar(range(1,len(page_names_ordered)+1), np.array(average_duration_page_ordered)/60) plt.xlabel('Audioholder') -plt.xlim(.8, len(audioholder_names_ordered)+1) -plt.xticks(np.arange(1,len(audioholder_names_ordered)+1)+.4, audioholder_names_ordered, rotation=90) +plt.xlim(.8, len(page_names_ordered)+1) +plt.xticks(np.arange(1,len(page_names_ordered)+1)+.4, page_names_ordered, rotation=90) plt.ylabel('Average time [minutes]') -plt.savefig(folder_name+"time_per_audioholder.pdf", bbox_inches='tight') +plt.savefig(folder_name+"time_per_page.pdf", bbox_inches='tight') plt.close() # SHOW bar plot of average time per page -plt.bar(range(1,len(audioholder_names_ordered)+1), number_of_subjects) +plt.bar(range(1,len(page_names_ordered)+1), number_of_subjects) plt.xlabel('Audioholder') -plt.xlim(.8, len(audioholder_names_ordered)+1) -plt.xticks(np.arange(1,len(audioholder_names_ordered)+1)+.4, audioholder_names_ordered, rotation=90) +plt.xlim(.8, len(page_names_ordered)+1) +plt.xticks(np.arange(1,len(page_names_ordered)+1)+.4, page_names_ordered, rotation=90) plt.ylabel('Number of subjects') ax = plt.gca() ylims = ax.get_ylim() yint = np.arange(int(np.floor(ylims[0])), int(np.ceil(ylims[1]))+1) plt.yticks(yint) -plt.savefig(folder_name+"subjects_per_audioholder.pdf", bbox_inches='tight') +plt.savefig(folder_name+"subjects_per_page.pdf", bbox_inches='tight') plt.close() # SHOW both figures @@ -408,10 +408,10 @@ body += r'''\begin{figure}[htbp] \begin{center} \includegraphics[width=.65\textwidth]{'''+\ - folder_name+'time_per_audioholder.pdf'+\ + folder_name+'time_per_page.pdf'+\ r'''} - \caption{Average time spent per audioholder.} - \label{fig:avgtimeperaudioholder} + \caption{Average time spent per page.} + \label{fig:avgtimeperpage} \end{center} \end{figure} @@ -419,10 +419,10 @@ body += r'''\begin{figure}[htbp] \begin{center} \includegraphics[width=.65\textwidth]{'''+\ - folder_name+'subjects_per_audioholder.pdf'+\ + folder_name+'subjects_per_page.pdf'+\ r'''} - \caption{Number of subjects per audioholder.} - \label{fig:subjectsperaudioholder} + \caption{Number of subjects per page.} + \label{fig:subjectsperpage} \end{center} \end{figure} @@ -430,20 +430,20 @@ #TODO add error bars #TODO layout of figures -# SHOW boxplot per audioholder +# SHOW boxplot per page #TODO order in decreasing order of participants -for audioholder_name in page_names: # get each name +for page_name in page_names: # get each name # plot boxplot if exists (not so for the 'alt' names) - if os.path.isfile(folder_name+'ratings/'+audioholder_name+'-ratings-box.pdf'): + if os.path.isfile(folder_name+'ratings/'+page_name+'-ratings-box.pdf'): body += r'''\begin{figure}[htbp] \begin{center} \includegraphics[width=.65\textwidth]{'''+\ - folder_name+"ratings/"+audioholder_name+'-ratings-box.pdf'+\ + folder_name+"ratings/"+page_name+'-ratings-box.pdf'+\ r'''} - \caption{Box plot of ratings for audioholder '''+\ - audioholder_name+' ('+str(subject_count[real_page_names.index(audioholder_name)])+\ + \caption{Box plot of ratings for page '''+\ + page_name+' ('+str(subject_count[real_page_names.index(page_name)])+\ ''' participants).} - \label{fig:boxplot'''+audioholder_name.replace(" ", "")+'''} + \label{fig:boxplot'''+page_name.replace(" ", "")+'''} \end{center} \end{figure} @@ -509,7 +509,7 @@ texfile = header+body+footer # add bits together -print 'pdflatex -output-directory="'+folder_name+'"" "'+ folder_name + 'Report.tex"' # DEBUG +# print('pdflatex -output-directory="'+folder_name+'"" "'+ folder_name + 'Report.tex"')# DEBUG # write TeX file with open(folder_name + 'Report.tex','w') as f: