通过Gnuplot生成ONE的仿真数据图表

在theONE模拟器的toolkit文件夹个有一个名叫getStats.pl的脚本,可以完成数据的图表输出,但是使用起来要手动输入一大堆参数,而且生成的是直方图,看起来不是很直观。

前天我花了一天时间学习perl,然后自己写了一个脚本,自动寻找当前目录的所有theONE的消息统计报告文件,然后将所有报告文件中的某一字段生成折线图。以下是文件的详细内容:

  1  # plot-reports.pl
  2  #extract the statistic data of a specific router of different parameters and then plot it
  3  #2011.11.27
  4  use  5.010;
  5  use Cwd  ' abs_path ';
  6  use strict;
  7  use warnings;
  8 
  9  # stat property name
 10  my  $stat_name =  " delivery_prob ";
 11  # mapping from router name to stat files
 12  my  %router_stats;
 13     
 14  # get the directory path thet this script lies in
 15  my  $script_path = abs_path($ 0);
 16  unless( $script_path =~ s/[ 0-9a-zA-Z-_]+\.pl//g){
 17      print  $script_path. " cannot be parsed!\n ";
 18      exit;
 19 }
 20 
 21 
 22  opendir DIR, $script_path;
 23 
 24  while( my  $file =  readdir(DIR)){
 25     # extract router name & buffer size
 26      my  $router;
 27     my  $bsize;
 28    
 29    
 30     $file =~ m/.+MessageStatsReport\.txt/ ||  next;
 31     $file =~ m/(\d+)M.*-([\w]+Router)_MessageStatsReport\.txt$/;
 32    
 33 
 34 
 35     $router = $ 2;
 36     $bsize = $ 1;
 37     $file =  $script_path. $file;
 38     # open the file and extract the value
 39      open FH, " <$file ";
 40     my  $value;
 41     while(<FH>){
 42         m/ $stat_name/ && (( $value) = m/ $stat_name: (.+)/); 
 43    }
 44     print  " $router-$bsize:    $value\n ";
 45     # open router.txt and write the value
 46      $router_stats{ $router}{ $bsize} =  $value;
 47     close FH;
 48     # print %{$router_stats{$router}};
 49     #open FH,">>$stat_file";
 50     #print FH "$bsize\t$value\n";
 51     #close FH;
 52  }
 53  closedir(DIR);
 54 
 55 
 56  sub by_number{
 57      $a<=> $b
 58 }
 59  # traverse the router_stats and save the data into text files.
 60  my  %router_files;
 61  foreach  my  $key( keys  %router_stats){
 62      print  " \nkey:$key\n ";
 63     
 64      # $router_stats{$key} = sort $router_stats{$key};
 65       my  %new_hash = %{ $router_stats{ $key}};
 66     
 67      my  $stat_file =  $key. " -stat.txt ";
 68      $router_files{ $key} =  $stat_file;
 69      open FH, " >$stat_file ";
 70     
 71      my  @bsize_list;
 72      foreach  my  $size( keys  %new_hash){
 73          push  @bsize_list, $size;
 74     }
 75      @bsize_list =  sort by_number  @bsize_list;
 76      foreach( @bsize_list){
 77          print FH  " $_\t$new_hash{$_}\n ";
 78     }
 79      close FH;
 80 }
 81  # start to print the plot file
 82  my  $plotfile =  " gnuplot.txt ";
 83  my  $imgfile =  " output.png ";
 84  open FH, " >$plotfile ";
 85  print FH  " set title \"$stat_name\" \n ";
 86  print FH  " set grid\n ";
 87  # print FH "set xrange [1:512]\n";
 88  print FH  " set key right top Left reverse width 0 box 3\n ";
 89  print FH  " set xlabel \"Buffer Size\" 0,0\n ";
 90  print FH  " set ylabel \"$stat_name\" 0,0\n ";
 91  print FH  " plot  ";
 92  # print the router names
 93  my  $router_cnt =  0;
 94  while( ( my  $keymy  $val) =  each  %router_files){
 95      if( $router_cnt >  0){
 96          print FH  " , ";
 97     }
 98      $router_cnt++;
 99      print FH  " \"$val\" using 2:xtic(1) title \"$key\" with linespoints  " ;
100 }
101  print FH  " \n ";
102  print FH  " set terminal png\n ";
103  print FH  " replot\n ";
104  close FH;
105 
106  # plot it and open the exported image file
107  system( " gnuplot $plotfile > $imgfile ") ==  0 or  die  " Error running gnuplot: $? ";

108 system("$imgfile") == 0 or die "Error opening file: $?"; 

 

这个脚本大大地简化了我的工作,只要scenario_name遵循我的约定,即%%Group.bufferSize%%-%%Group.router%%,所要做的仅仅是双击执行这个脚本,就可以直接呈现图表了。当然,前提是你的电脑上必须已经安装了perl和gnuplot,并且加入了环境变量中。

如果你对perl和正则表达式有一丁点了解,这个脚本也完全可以由你来定制:将需要统计的字段赋给$stat_name ,在第31行可以修改正则模式以匹配实际的文件名格式。

问题和改进建议请联系lcm.hust at gmail.com.

转载请注明来源。 

EOF. 

转载于:https://www.cnblogs.com/jcleung/archive/2011/11/28/2265864.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值