Home | History | Annotate | Download | only in test
      1 #!/bin/bash
      2 
      3 # Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
      4 #
      5 # Use of this source code is governed by a BSD-style license
      6 # that can be found in the LICENSE file in the root of the source
      7 # tree. An additional intellectual property rights grant can be found
      8 # in the file PATENTS.  All contributing project authors may
      9 # be found in the AUTHORS file in the root of the source tree.
     10 
     11 # To set up in e.g. Eclipse, run a separate shell and pipe the output from the
     12 # test into this script.
     13 #
     14 # In Eclipse, that amounts to creating a Run Configuration which starts
     15 # "/bin/bash" with the arguments "-c [trunk_path]/out/Debug/modules_unittests
     16 # --gtest_filter=*BweTest* | [trunk_path]/webrtc/modules/
     17 # remote_bitrate_estimator/test/plot_bars.sh
     18 
     19 # This script supports multiple figures (windows), the figure is specified as an
     20 # identifier at the first argument after the PLOT command. Each figure has a
     21 # single y axis and a dual y axis mode. If any line specifies an axis by ending
     22 # with "#<axis number (1 or 2)>" two y axis will be used, the first will be
     23 # assumed to represent bitrate (in kbps) and the second will be assumed to
     24 # represent time deltas (in ms).
     25 
     26 log=$(</dev/stdin)
     27 
     28 # Plot histograms.
     29 function gen_gnuplot_bar_input {
     30   x_start=1
     31   x_end=3.75
     32   bars=$(echo "$log" | grep "BAR")
     33 
     34   labels=$(echo "$log" | grep "^LABEL")
     35   figures=($(echo "$bars" | cut -f 2 | sort | uniq))
     36 
     37   echo "reset"  # Clears previous settings.
     38 
     39   echo "set title font 'Verdana,22'"
     40   echo "set xtics font 'Verdana,24'"
     41   echo "set ytics font 'Verdana,14'"
     42   echo "set ylabel font 'Verdana,16'"
     43 
     44   echo "set xrange[$x_start:$x_end]"
     45   echo "set style fill solid 0.5"
     46   echo "set style fill solid border -1"
     47 
     48   declare -a ydist=(11.5 10.5 10.5)  # Used to correctly offset the y label.
     49   i=0
     50   for figure in "${figures[@]}" ; do
     51 
     52     echo "set terminal wxt $figure size 440,440 dashed"
     53     echo "set ylabel offset ${ydist[$i]}, -3"
     54     (( i++ ))
     55 
     56     title=$(echo "$labels" | grep "^LABEL.$figure" | cut -f 3 | \
     57                                          head -n 1 | sed 's/_/ /g')
     58     y_label=$(echo "$labels" | grep "^LABEL.$figure" | cut -f 4 | \
     59                                          head -n 1 | sed 's/_/ /g')
     60 
     61     # RMCAT flows.
     62     num_flows=$(echo "$labels" | grep "^LABEL.$figure" | cut -f 5 | \
     63                                          head -n 1)
     64 
     65     # RMCAT algorithm 1.
     66     x_label_1=$(echo "$log" | grep "BAR.$figure" | cut -f 3 | sed 's/_/\t/g' \
     67                                  | cut -f 1  | sort | uniq | head -n 1 )
     68 
     69     # RMCAT algorithm 2.
     70     x_label_2=$(echo "$log" | grep "BAR.$figure" | cut -f 3 | sed 's/_/\t/g' \
     71                                  | cut -f 1  | sort | uniq |  sed -n 2p)
     72 
     73     x_labels="('$x_label_1' 2, '$x_label_2' 3)"
     74     tcp_flow=false
     75 
     76     tcp_space=0.2  # Extra horizontal space between bars.
     77 
     78     # Parse labels if there are other flows in addition to RMCAT ones.
     79     IFS='x' read -ra split_label_1 <<< "$x_label_1"
     80 
     81     if (( ${#split_label_1[@]} > "1" )); then
     82       tcp_flow=true
     83       box_width=$(echo "(1.0-$tcp_space/2)/$num_flows" | bc -l)
     84       echo "set xtics font 'Verdana,16'"
     85       x_labels="("
     86       delimiter=""
     87       abscissa=$(echo $x_start + 0.5 + 0.5*$box_width | bc)
     88       for label in "${split_label_1[@]}" ; do
     89         x_labels+="$delimiter'$label' $abscissa"
     90         abscissa=$(echo $abscissa + $box_width | bc)
     91         delimiter=", "
     92       done
     93       abscissa=$(echo $abscissa + $tcp_space | bc)
     94       IFS='x' read -ra split_label_2 <<< "$x_label_2"
     95       for label in "${split_label_2[@]}" ; do
     96         x_labels+="$delimiter'$label' $abscissa"
     97         abscissa=$(echo $abscissa + $box_width | bc)
     98       done
     99       x_labels="$x_labels)"
    100     else
    101       box_width=$(echo 1.0/$num_flows | bc -l)
    102     fi
    103 
    104     echo "set boxwidth $box_width"
    105 
    106     # Plots can be directly exported to image files.
    107     file_name=$(echo "$labels" | grep "^LABEL.$figure" | cut -f 5 | head -n 1)
    108 
    109     y_max=0  # Used to scale the plot properly.
    110 
    111     # Scale all latency plots with the same vertical scale.
    112     delay_figure=5
    113     if (( $figure==$delay_figure )) ; then
    114       y_max=400
    115     else  # Take y_max = 1.1 * highest plot value.
    116 
    117       # Since only the optimal bitrate for the first flow is being ploted,
    118       # consider only this one for scalling purposes.
    119       data_sets=$(echo "$bars" | grep "LIMITERRORBAR.$figure" | cut -f 3 | \
    120                                      sed 's/_/\t/g' | cut -f 1 | sort | uniq)
    121 
    122       if (( ${#data_sets[@]} > "0" )); then
    123         for set in $data_sets ; do
    124           y=$(echo "$bars" | grep "LIMITERRORBAR.$figure.$set" | cut -f 8 | \
    125                                                                   head -n 1)
    126           if (( $(bc <<< "$y > $y_max") == 1 )); then
    127             y_max=$y
    128           fi
    129         done
    130       fi
    131 
    132       data_sets=$(echo "$bars" | grep "ERRORBAR.$figure" | cut -f 3 | \
    133                                                                sort | uniq)
    134       if (( ${#data_sets[@]} > "0" )); then
    135         for set in $data_sets ; do
    136           y=$(echo "$bars" | grep "ERRORBAR.$figure.$set" | cut -f 6 | \
    137                                                                  head -n 1)
    138           if (( $(bc <<< "$y > $y_max") == 1 )) ; then
    139             y_max=$y
    140           fi
    141         done
    142       fi
    143 
    144       data_sets=$(echo "$bars" | grep "BAR.$figure" | cut -f 3 | sort | uniq)
    145 
    146       for set in $data_sets ; do
    147         y=$(echo "$bars" | grep "BAR.$figure.$set" | cut -f 4 | head -n 1)
    148         if (( $(bc <<< "$y > $y_max") == 1 )) ; then
    149           y_max=$y
    150         fi
    151       done
    152 
    153       y_max=$(echo $y_max*1.1 | bc)
    154     fi
    155 
    156 
    157     echo "set ylabel \"$y_label\""
    158     echo "set yrange[0:$y_max]"
    159 
    160     echo "set multiplot"
    161 
    162     # Plot bars.
    163     data_sets=$(echo "$bars" | grep "BAR.$figure" | cut -f 3 | sort | uniq)
    164 
    165     echo "set xtics $x_labels"
    166     echo "plot '-' using 1:4:2 with boxes lc variable notitle"
    167 
    168     echo
    169 
    170     color=11  # Green.
    171     x_bar=$(echo $x_start + 0.5 + 0.5*$box_width | bc)
    172     for set in $data_sets ; do
    173       echo -n "$x_bar  $color  "
    174       echo "$bars" | grep "BAR.$figure.$set" | cut -f 3,4
    175 
    176       # Add extra space if TCP flows are being plotted.
    177       if $tcp_flow && \
    178           (( $(bc <<< "$x_bar < $x_start + 1.5 - 0.5*$tcp_space") == 1 )) && \
    179           (( $(bc <<< "$x_bar + $box_width > $x_start + 1.5 + 0.5*$tcp_space") \
    180            == 1 )); then
    181           x_bar=$(echo $x_bar + $tcp_space | bc)
    182       fi
    183 
    184       x_bar=$(echo $x_bar + $box_width | bc)
    185 
    186       if (( $(bc <<< "$x_bar > 2.5") == 1 )) ; then
    187         color=12  # Blue.
    188       fi
    189       # Different bar color for TCP flows:
    190       if $tcp_flow && \
    191          (( $(bc <<< "(100*$x_bar)%100 < 50") == 1 ))
    192       then
    193         color=18  # Gray.
    194       fi
    195     done
    196     echo "e"
    197 
    198     # Plot Baseline bars, e.g. one-way path delay on latency plots.
    199     data_sets=$(echo "$log" | grep "BASELINE.$figure" | cut -f 3 | sort | uniq)
    200 
    201     if (( ${#data_sets} > "0" )); then
    202       echo "set xtics $x_labels"
    203       echo "plot '-' using 1:4:2 with boxes lc variable notitle"
    204 
    205       echo
    206 
    207       color=18  # Gray.
    208       x_bar=$(echo $x_start + 0.5 + 0.5*$box_width | bc)
    209       for set in $data_sets ; do
    210         echo -n "$x_bar  $color  "
    211         echo "$log" | grep "BASELINE.$figure.$set" | cut -f 3,4
    212 
    213         # Add extra space if TCP flows are being plotted.
    214         if $tcp_flow && \
    215             (( $(bc <<< "$x_bar < $x_start + 1.5 - 0.5*$tcp_space") == 1 )) && \
    216             (( $(bc <<< "$x_bar + $box_width > $x_start + 1.5 \
    217             + 0.5*$tcp_space") == 1 )); then
    218             x_bar=$(echo $x_bar + $tcp_space | bc)
    219         fi
    220 
    221         x_bar=$(echo $x_bar + $box_width | bc)
    222 
    223       done
    224       echo "e"
    225     fi
    226 
    227     # Plot vertical error lines, e.g. y +- sigma.
    228     data_sets=$(echo "$bars" | grep "ERRORBAR.$figure" | cut -f 3 | sort | uniq)
    229 
    230     if (( ${#data_sets} > "0" )); then
    231 
    232       echo "set key left"
    233       error_title=$(echo "$bars" | grep "ERRORBAR.$figure" | cut -f 7 | \
    234                                                  head -n 1 | sed 's/_/ /g')
    235 
    236       echo "set xtics $x_labels"
    237       echo "plot '-' using 1:3:4:5 title '$error_title' with yerr"
    238 
    239       x_error_line=$(echo $x_start + 0.5 + 0.5*$box_width | bc)
    240       for set in $data_sets ; do
    241         echo -n "$x_error_line  "
    242         echo "$bars" | grep "ERRORBAR.$figure.$set" | cut -f 3,4,5,6
    243 
    244         # Add extra space if TCP flows are being plotted.
    245         if $tcp_flow && \
    246           (( $(bc <<< "$x_error_line < $x_start + 1.5 - 0.5*$tcp_space") == 1 \
    247           )) && (( $(bc <<< "$x_error_line + $box_width > $x_start + 1.5 \
    248           + 0.5*$tcp_space") == 1 )); then
    249           x_error_line=$(echo $x_error_line + $tcp_space | bc)
    250         fi
    251 
    252         x_error_line=$(echo $x_error_line + $box_width | bc)
    253       done
    254       echo "e"
    255     fi
    256 
    257     # Plot horizontal dashed lines, e.g. y = optimal bitrate.
    258     data_sets=$(echo "$bars" | grep "LIMITERRORBAR.$figure" | cut -f 3 \
    259                                                      | sort | uniq)
    260     if (( ${#data_sets} > "0" )); then
    261 
    262       echo "set style line 1 lt 1 lw 3 pt 3 ps 0 linecolor rgb 'black'"
    263 
    264       limit_titles=$(echo "$bars" | grep "LIMITERRORBAR.$figure" | cut -f 9 \
    265                                                          | sort | uniq)
    266 
    267       for title in $limit_titles ; do
    268         y_max=$(echo "$bars" | grep "LIMITERRORBAR.$figure" | grep "$title" \
    269                                                | cut -f 8 | head -n 1)
    270 
    271         retouched_title=$(echo "$title" | sed 's/#/\t/g' | cut -f 1 \
    272                                                          | sed 's/_/ /g')
    273 
    274         echo "set key right top"
    275         echo "set xtics $x_labels"
    276         echo "plot $y_max lt 7 lw 1 linecolor rgb 'black' \
    277                                   title '$retouched_title'"
    278       done
    279 
    280     fi
    281 
    282     echo "unset multiplot"
    283   done
    284 }
    285 
    286 gen_gnuplot_bar_input | gnuplot -persist
    287