#!/usr/bin/perl
# 以下は変更する必要なし
#-----------------------------------------------------------------------------
#
# log2datx (version  $Id: eodv,v 1.4 2007/05/22 02:22:33 Exp $) 
#
# logをdatxにする算出
# 
# Usage:
# > log2datx.pl hogehoge.csv
#
# options:
#         特に無し
#
# example:
# log2datx.pl hogehoge.csv                                #(1)
#
#-----------------------------------------------------------------------------
# Libraries
my @freq;
my @AZ00;
my @AZ10;
my @AZ15;
my @AZ20;
my @AZ30;
my @AZ40;

my @ave;
my @ave_cnt;
my @std;
my $cnt = -1;
my $tmp;

#-----------------------------------------------------------------------------
# Code begin
#-----------------------------------------------------------------------------
($opt) = @ARGV; 
if ($opt eq "-h") 
{
    &show_usage();
    exit;
}

# オプションがない場合
#-----------------------------------------------------------------------------
if ($#ARGV == -1)
{
	print "Error:ファイル名を指定してください\n";
}

# オプションが１つある場合
#-----------------------------------------------------------------------------
if ($#ARGV == 0)
{
	# 対象ファイルのオープン
	open(IN,"<$ARGV[0]") || die "Error: can't open $ARGV[0]\n";
		@line = <IN>;
	close(IN);
	
	# ログからのデータ取得
	foreach (@line)
	{
		# ヘッダ情報を飛ばす
		if ($cnt < 0){$cnt++; next;}
		
		# 値取り込み
		$freq[$cnt]	= (split(/\,/,$_))[0];
		$AZ00[$cnt]	= (split(/\,/,$_))[1];
		$AZ10[$cnt]	= (split(/\,/,$_))[2];
		$AZ15[$cnt]	= (split(/\,/,$_))[3];
		$AZ20[$cnt]	= (split(/\,/,$_))[4];
		$AZ30[$cnt]	= (split(/\,/,$_))[5];
		$AZ40[$cnt]	= (split(/\,/,$_))[6];
		
		# インクリメント処理
		$cnt++;
	}
	
	# 平均値算出
	for($i=0;$i<$cnt;$i++)
	{
		# x行目の処理
		$ave_cnt[$i] = 6;
		$ave[$i] = 0;
		
		# 平均値の個数集計
		if(int($AZ00[$i]) == 0){$ave_cnt[$i]--;}else{$ave[$i] += $AZ00[$i];}
		if(int($AZ10[$i]) == 0){$ave_cnt[$i]--;}else{$ave[$i] += $AZ10[$i];}
		if(int($AZ15[$i]) == 0){$ave_cnt[$i]--;}else{$ave[$i] += $AZ15[$i];}
		if(int($AZ20[$i]) == 0){$ave_cnt[$i]--;}else{$ave[$i] += $AZ20[$i];}
		if(int($AZ30[$i]) == 0){$ave_cnt[$i]--;}else{$ave[$i] += $AZ30[$i];}
		if(int($AZ40[$i]) == 0){$ave_cnt[$i]--;}else{$ave[$i] += $AZ40[$i];}
		
		# その行の個数が0ならaveも0
		if($ave_cnt[$i] == 0){
			$ave[$i] = 0;
		}else{
			$ave[$i] = $ave[$i]/$ave_cnt[$i];
		}
	}
	
	# 標準偏差算出
	for($i=0;$i<$cnt;$i++)
	{
		# x行目の処理
		$std[$i] = 0;
		
		# 標準偏差の処理 値が0なら飛ばす
		if(int($AZ00[$i]) != 0){$std[$i] += ($AZ00[$i] - $ave[$i])*($AZ00[$i] - $ave[$i]);}
		if(int($AZ10[$i]) != 0){$std[$i] += ($AZ10[$i] - $ave[$i])*($AZ10[$i] - $ave[$i]);}
		if(int($AZ15[$i]) != 0){$std[$i] += ($AZ15[$i] - $ave[$i])*($AZ15[$i] - $ave[$i]);}
		if(int($AZ20[$i]) != 0){$std[$i] += ($AZ20[$i] - $ave[$i])*($AZ20[$i] - $ave[$i]);}
		if(int($AZ30[$i]) != 0){$std[$i] += ($AZ30[$i] - $ave[$i])*($AZ30[$i] - $ave[$i]);}
		if(int($AZ40[$i]) != 0){$std[$i] += ($AZ40[$i] - $ave[$i])*($AZ40[$i] - $ave[$i]);}
		
		# その行のstdを出力
		if($ave_cnt[$i] <= 0){
			$std[$i] = 0;
		}else{
			# n法 標準偏差
			$std[$i] = sqrt($std[$i]/($ave_cnt[$i]));
		}
	}
	
	# 各方位－(平均＋標準偏差)
	for($i=0;$i<$cnt;$i++)
	{
		# x行目の処理
		$tmp = $AZ00[$i] - ($ave[$i] + $std[$i]);	if($tmp > 0){$AZ00[$i] = 0;}
		$tmp = $AZ10[$i] - ($ave[$i] + $std[$i]);	if($tmp > 0){$AZ10[$i] = 0;}
		$tmp = $AZ15[$i] - ($ave[$i] + $std[$i]);	if($tmp > 0){$AZ15[$i] = 0;}
		$tmp = $AZ20[$i] - ($ave[$i] + $std[$i]);	if($tmp > 0){$AZ20[$i] = 0;}
		$tmp = $AZ30[$i] - ($ave[$i] + $std[$i]);	if($tmp > 0){$AZ30[$i] = 0;}
		$tmp = $AZ40[$i] - ($ave[$i] + $std[$i]);	if($tmp > 0){$AZ40[$i] = 0;}
	}
	
	# ファイル出力
	$name = (split(/.csv/,$ARGV[0]))[0] . "_mask" . ".csv";
	open(OUT, ">$name") || die "Error: can't make $name\n";
	
	# ヘッダ出力
	$disp = sprintf("#周波数,AZ=0,10,15,20,30,40,ave,std\n");
	print OUT $disp;
	
	for($i=0;$i<$cnt;$i++)
	{
		$disp = sprintf("%f,%f,%f,%f,%f,%f,%f,%f,%f\n",
					$freq[$i],$AZ00[$i],$AZ10[$i],$AZ15[$i],$AZ20[$i],$AZ30[$i],$AZ40[$i],$ave[$i],$std[$i]);
		print OUT $disp;
	}

	close(OUT);
}

# オプションが２つある場合
#-----------------------------------------------------------------------------
if ($#ARGV == 1)
{

}
exit;

#-----------------------------------------------------------------------------
# Sub code begin
#-----------------------------------------------------------------------------
sub show_usage()
{
  print "Usage:\n";
  print "> eodv [-h]\n";
  print "\n";
  print "options:\n";
  print "         -h : 利用方法を提示する\n";
  print "      -make : Level-2を更新する\n";
  print "\n";
  print "example:\n";
  print "eodv -h                         #(1) HELP\n";
}

