Mercurial > hg > webaudioevaluationtool
diff scripts/timeline_view.py @ 1457:c8a9825aaa05
Merge from branch "WAC2016"
author | Nicholas Jillings <nickjillings@users.noreply.github.com> |
---|---|
date | Mon, 23 Nov 2015 09:13:12 +0000 |
parents | 04e8a9c07c7e |
children | 1b6fa37d46a4 |
line wrap: on
line diff
--- a/scripts/timeline_view.py Tue Oct 13 10:20:04 2015 +0100 +++ b/scripts/timeline_view.py Mon Nov 23 09:13:12 2015 +0000 @@ -1,14 +1,36 @@ #!/usr/bin/python import xml.etree.ElementTree as ET -import os -import matplotlib.pyplot as plt +import os # list files in directory +import sys # command line arguments +import matplotlib.pyplot as plt # plots +import matplotlib.patches as patches # rectangles + +# COMMAND LINE ARGUMENTS + +assert len(sys.argv)<3, "timeline_view takes at most 1 command line argument\n"+\ + "Use: python timeline_view.py [XML_files_location]" + +# XML results files location +if len(sys.argv) == 1: + folder_name = "../saves" # Looks in 'saves/' folder from 'scripts/' folder + print "Use: python timeline_view.py [XML_files_location]" + print "Using default path: " + folder_name +elif len(sys.argv) == 2: + folder_name = sys.argv[1] # First command line argument is folder + +# check if folder_name exists +if not os.path.exists(folder_name): + #the file is not there + print "Folder '"+folder_name+"' does not exist." + sys.exit() # terminate script execution +elif not os.access(os.path.dirname(folder_name), os.W_OK): + #the file does exist but write privileges are not given + print "No write privileges in folder '"+folder_name+"'." + # CONFIGURATION -# XML results files location (modify as needed): -folder_name = "../saves" # Looks in 'saves/' folder from 'scripts/' folder - # Folder where to store timelines timeline_folder = folder_name + '/timelines/' # Stores in 'saves/timelines/' @@ -20,6 +42,16 @@ # Colormap for to cycle through colormap = ['b', 'r', 'g', 'c', 'm', 'y', 'k'] +# if enabled, x-axis shows time per audioholder, not total test time +show_audioholder_time = True + +# bar height (<1 to avoid overlapping) +bar_height = 0.6 + +# figure size +fig_width = 25 +fig_height = 5 + # CODE @@ -34,11 +66,14 @@ root = tree.getroot() subject_id = file[:-4] # drop '.xml' + time_offset = 0 # test starts at zero + # ONE TIMELINE PER PAGE - make new plot per page # get list of all page names for audioholder in root.findall("./audioholder"): # iterate over pages page_name = audioholder.get('id') # get page name + plot_empty = True # check if any data is plotted if page_name is None: # ignore 'empty' audio_holders break @@ -56,9 +91,13 @@ increment = 0 # increased for every new audioelement audioelements_names = [] # store names of audioelements + # get axes handle + fig = plt.figure(figsize=(fig_width, fig_height)) + ax = fig.add_subplot(111) #, aspect='equal' + # for page [page_name], print comments related to fragment [id] for tuple in data: - audioelement = tuple[1] + audioelement = tuple[1] if audioelement is not None: # Check it exists audio_id = str(audioelement.get('id')) audioelements_names.append(audio_id) @@ -66,41 +105,55 @@ # for this audioelement, loop over all listen events listen_events = audioelement.findall("./metric/metricresult/[@name='elementListenTracker']/event") for event in listen_events: + # mark this plot as not empty + plot_empty = False + # get testtime: start and stop - start_time = event.find('testtime').get('start') - stop_time = event.find('testtime').get('stop') + start_time = float(event.find('testtime').get('start'))-time_offset + stop_time = float(event.find('testtime').get('stop'))-time_offset # event lines: - plt.plot([start_time, start_time], # x-values + ax.plot([start_time, start_time], # x-values [0, N_audioelements+1], # y-values color='k' ) - plt.plot([stop_time, stop_time], # x-values + ax.plot([stop_time, stop_time], # x-values [0, N_audioelements+1], # y-values color='k' ) # plot time: - plt.plot([start_time, stop_time], # x-values - [N_audioelements-increment, N_audioelements-increment], # y-values - color=colormap[increment%len(colormap)], - linewidth=6 + ax.add_patch( + patches.Rectangle( + (start_time, N_audioelements-increment-bar_height/2), # (x, y) + stop_time - start_time, # width + bar_height, # height + color=colormap[increment%len(colormap)] # colour ) + ) - increment+=1 - + increment+=1 # to next audioelement + + # subtract total audioholder length from subsequent audioholder event times + audioholder_time = audioholder.find("./metric/metricresult/[@id='testTime']") + if audioholder_time is not None and show_audioholder_time: + time_offset = float(audioholder_time.text) + + if not plot_empty: + # set plot parameters + plt.title('Timeline ' + file + ": "+page_name) + plt.xlabel('Time [seconds]') + plt.ylabel('Fragment') + plt.ylim(0, N_audioelements+1) + + #y-ticks: fragment IDs, top to bottom + plt.yticks(range(N_audioelements, 0, -1), audioelements_names) # show fragment names + + + #plt.show() # uncomment to show plot; comment when just saving + #exit() + + plt.savefig(timeline_folder+subject_id+"-"+page_name+".pdf", bbox_inches='tight') + plt.close() + #TODO: if 'nonsensical' or unknown: dashed line until next event #TODO: Vertical lines for fragment looping point - - plt.title('Timeline ' + file) #TODO add song too - plt.xlabel('Time [seconds]') - plt.ylabel('Fragment') - plt.ylim(0, N_audioelements+1) - - #y-ticks: fragment IDs, top to bottom - plt.yticks(range(N_audioelements, 0, -1), audioelements_names) # show fragment names - - - #plt.show() # uncomment to show plot; comment when just saving - #exit() - - plt.savefig(timeline_folder+subject_id+"-"+page_name+".png") - plt.close() \ No newline at end of file + \ No newline at end of file