#!/usr/bin/perl

use lib 'd:/Programs/Perl/lib';

use strict;
use Sci qw($pi2 $e0 $pi $kB $e $e0 $me $h $hbar $KToeV erfc);
use Sci::OpticalMaterial;
use Sci::Material;
use Sci::Optimize;
use IniFile;

my $Header = 'ZnO-SCAM';
$Header = $ARGV[0] if(defined $ARGV[0]);

my $DataPath  = $Header . ".csv";
my $PrmPath   = $Header . ".prm";
my $OutputCSV = $Header . "-Estimate.csv";
print "Data: $DataPath\n";
print "Prm : $PrmPath\n";
print "Out : $OutputCSV\n";

my $ini = new IniFile(undef, 0, 0);
&ReadIni($PrmPath, $ini);

my $csv = new CSV();
$csv->Read($DataPath, 1) or die "$!\n";
my $pT     = $csv->GetXData(".*T.*");
my $pmu    = $csv->GetXData(".*mu.*");
my $pNe    = $csv->GetYData(".*Ne.*");
my $pSigma = $csv->GetYData(".*sigma.*");
my $nData  = @$pT;
print "nData=$nData\n";
#print "p=$pT, $pmu, $pNe, $pSigma\n";

my $out = new JFile($OutputCSV, "w") or die "$!: can not write to [$OutputCSV]";

# w\`
my $FilmThickness = 300.0; # nm
my $d2  = (defined $ini->{d2})?  $ini->{d2}  : 0.3384;   #10.0;  # nm
my $Ne2 = (defined $ini->{Ne2})? $ini->{Ne2} : 1.705e18; #5e17;  # cm-3
my $mu2 = (defined $ini->{mu2})? $ini->{mu2} : 10.02;    #8.0;   # cm2/Vs

print("Values\n");
printf("  d2 =$d2 nm\n");
printf("  Ne2=%e cm-3\n", $Ne2);
printf("  mu2=$mu2 cm2/Vs\n");

my $T      = 300.0;

$out->print("T(K),mu(obs),mu(cal),Ne(obs),Ne(cal),mu(bulk),Ne(bulk)\n");
for(my $i = 0 ; $i < $nData ; $i++) {
	my $T = $pT->[$i];

	my $d  = $FilmThickness;
	my $d1 = $FilmThickness - $d2;
	my $Ne = $pNe->[$i];
	my $mu = $pmu->[$i];

print "tot=", $Ne * $d, "  layer2=", $Ne2*$d2, "\n";
	my $u = ($mu*$mu*$Ne*$d - $mu2*$mu2*$Ne2*$d2)    / ($mu    *$Ne*$d - $mu2     *$Ne2*$d2);
	my $n = ($mu    *$Ne*$d - $mu2     *$Ne2*$d2)**2 / ($mu*$mu*$Ne*$d - $mu2*$mu2*$Ne2*$d2) / $d1;

	printf "%d: T=%4.3f  ubulk=%8.3g (%8.3g)  Nebulk=%8.3g (%8.3g)\n",
			$i, $T, $u, $mu, $n, $Ne;
	$out->print("$T,$pmu->[$i],$u,$pNe->[$i],$n\n");
}
$out->Close();

exit;

sub ReadIni
{
	my ($PrmPath, $ini) = @_;
	open(IN, $PrmPath) or return;
	while(1) {
		my $line = <IN>;
		last if(!defined $line);
		my ($key, $val) = ($line =~ /^\s*(.*?)\s*=\s*(.*)\s*$/);
		next if(!defined $val);
#print "$key: $val\n";
		$ini->{$key} = $val;
	}
	close(IN);
	return $ini;
}

