#!/usr/bin/perl

use lib 'd:/Programs/Perl/lib';

BEGIN {
#use lib 'd:/Programs/Perl/lib';
#use lib '/home/tkamiya/bin/lib';
my $BaseDir = $ENV{'PerlDir'};
$BaseDir = $ENV{'TkPerlDir'} unless(defined $BaseDir);
print "BaseDir: $BaseDir\n";
@INC = ("$BaseDir/lib", "$BaseDir/VNL", @INC);
}

use strict;
#use warnings;

use Math::Complex;

use CSV;
use Sci::Science;
use Sci::Optimize;
use Sci::Optics;
use GraphData;

my $pi   = Sci::pi();
my $e0   = Sci::e0();
my $e    = Sci::e();
my $c    = Sci::c();
my $h    = Sci::h();
my $hbar = Sci::hbar();
my $me   = Sci::me();
my $kB   = Sci::kB();


my $TRDataPath    = "TR.csv";
my $PowerDataPath = "Power-WL.csv";
my $IpDataPath    = "IP-10V.csv";
my $OutputCSV     = "Out.csv";

my $thickness         = 100e-9; # m, Thickness
my $ElectrodeDistance = 0.2e-3; # m, Electrode distance
my $ElectrodeWidth    = 1.0e-2; # m, Electrode width
my $AppliedVoltage    = 10.0; # V, Applied voltage
my $AppliedField = $AppliedVoltage / $ElectrodeDistance; # V/m

my $TRCSV = new CSV();
if(!$TRCSV->Read($TRDataPath)) {
	print "Can not read[$TRDataPath].\n";
	exit;
}
my $pTRLabelArray = $TRCSV->LabelArray();
my $pTRDataArray  = $TRCSV->DataArray();
for(my $i = 0 ; $i < @$pTRLabelArray ; $i++) {
	my $l = $pTRLabelArray->[$i];
	my $d = $pTRDataArray->[$i];
	print "s=$l [$d]\n";
}
my $TData = new GraphData;
$TData->SetXDataArray(0, $pTRDataArray->[0]);
$TData->SetYDataArray(0, $pTRDataArray->[1]);
$TData->CalMinMax();
my $RData = new GraphData;
$RData->SetXDataArray(0, $pTRDataArray->[0]);
$RData->SetYDataArray(0, $pTRDataArray->[2]);
$RData->CalMinMax();

my $PowerCSV = new CSV();
if(!$PowerCSV->Read($PowerDataPath)) {
	print "Can not read[$PowerDataPath].\n";
	exit;
}
my $pPowerLabelArray = $PowerCSV->LabelArray();
my $pPowerDataArray  = $PowerCSV->DataArray();
for(my $i = 0 ; $i < @$pPowerLabelArray ; $i++) {
	my $l = $pPowerLabelArray->[$i];
	my $d = $pPowerDataArray->[$i];
	print "s=$l [$d]\n";
}
my $PowerData = new GraphData;
$PowerData->SetXDataArray(0, $pPowerDataArray->[0]);
$PowerData->SetYDataArray(0, $pPowerDataArray->[1]);
$PowerData->CalMinMax();

my $IpCSV = new CSV();
if(!$IpCSV->Read($IpDataPath)) {
	print "Can not read[$IpDataPath].\n";
	exit;
}
my $pIpLabelArray = $IpCSV->LabelArray();
my $pIpDataArray  = $IpCSV->DataArray();
for(my $i = 0 ; $i < @$pPowerLabelArray ; $i++) {
	my $l = $pIpLabelArray->[$i];
	my $d = $pIpDataArray->[$i];
	print "s=$l [$d]\n";
}
my $pIpWL = $pIpDataArray->[0];
my $pIp   = $pIpDataArray->[1];
my $IpData = new GraphData;
$IpData->SetXDataArray(0, $pIpWL);
$IpData->SetYDataArray(0, $pIp);
$IpData->CalMinMax();

my $nData = @$pIpWL;

open(OUT, ">$OutputCSV") or die "$!\n";
print OUT "WL(nm),nu(Hz),E(eV),T,R,P,F0,F,Ip,alpha(cm-1),e.mu.tau(cm2/V)\n";
for(my $i = 0 ; $i < $nData ; $i++) {
	my $WL = $pIpWL->[$i]; # nm
	next if(!defined $WL or $WL eq '');
#print "WL=[$WL]\n";
	my $nu = $c / ($WL * 1.0e-9); # Hz
	my $E  = $h * $nu / $e; # eV
	my $T  = $TData->YVal(0, $WL);
	my $R  = $RData->YVal(0, $WL);
	my $P  = $PowerData->YVal(0, $WL);
	my $Ip = $IpData->YVal(0, $WL);

	my $F0 = $P / ($E*$e);
	my $F  = $F0 * (1.0 - $T - $R);
	my $Tnet = $T/(1.0-$R);
	
	my $sigma = $Ip * $ElectrodeDistance / $ElectrodeWidth / $AppliedField; # S/m
	my $eut   = $sigma / $e / $F * 1.0e4; # cm2/V
	my $alpha = -log($Tnet) / ($thickness * 1.0e-2); # cm-1, alpha
#	print "$WL,$nu,$E,$T,$R,$P,$Ip\n";
	print OUT "$WL,$nu,$E,$T,$R,$P,$F0,$F,$Ip,$alpha,$eut\n";
}
close(OUT);
exit;

sub Save
{
	my ($path, $nE) = @_;
	my @E;
	open(OUT, ">$path") or die "$!\n";
	print OUT "E(eV),e1(TL),e2(TL),f(KK)\n";
	for(my $i = 0 ; $i < $nE ; $i++) {
		print OUT "$E[$i]\n";
	}
}
