#!/usr/bin/perl

use strict;

use lib 'd:/Programs/Perl/lib';

use CSV;
use Sci::Algorism;

my $InputDir   = "BaMn2P2-AFM-InterplaneFM";
$InputDir = $ARGV[0] if($ARGV[0] ne '');

my ($lowE, $highE) = (-12, -8);
my ($Emin, $Emax)  = (-20, 10);
my $nSmooth = 11;
my $Ehalf0 = -9.945100;

my $SummaryFile = "Smoothed/Summary.csv";
my $summary = new JFile;
$summary->Open($SummaryFile, "w") or die "Error: can not write to [$SummaryFile].\n";
$summary->print("File,E(O2s),dE(eV)\n");

for(my $i = 0 ; $i <= 0 ; $i++) {
	my $key = sprintf("%02d", $i);

	my ($head1, $head2);
	if($i == 0) {
		$head1 = $head2 = $InputDir;
	}
	my $InFile = "$head1/DOS/DOS-up.csv";
	my $OutCSV = "Smoothed/${head2}-smoothened.csv";

	my $csv = new CSV;
	if(!$csv->Read($InFile)) {
#		die "Error: can not read [$InFile].\n";
		print "Error: can not read [$InFile].\n";
		next;
	}

	my $out = new JFile;
	$out->Open($OutCSV, "w") or die "Error: can not write to [$OutCSV].\n";
	$out->print("E(eV),TDOS(smooth),TDOS\n");

	my $pLabelArray = $csv->LabelArray();
	my $pDataArray  = $csv->DataArray();
	my $nData = $csv->nData();
	my $pE    = $csv->GetXData("Energy.*");
	my $pTDOS = $csv->GetXData("DOS*");
print "nData=$nData   pE=$pE  pTDOS=$pTDOS\n";

	my $pSmoothed = Algorism::SmoothingBySimpleAverage($pTDOS, $nSmooth);
#	my $pSmoothed = Algorism::AdaptiveSmoothing($pTDOS, $nSmooth);
	
	my $int = 0.0;
	for(my $i = 0 ; $i < $nData ; $i++) {
		next if($pE->[$i] < $lowE);
		last if($highE < $pE->[$i]);
		$int += $pSmoothed->[$i];
#print "i=$i: int=$int\n";
	}
if($int == 0.0) {
	print "Error: Data #$i does not contain deep levels\n";
#	exit;
}
	my $inthalf = $int / 2.0;
	$int = 0.0;
	my $Ehalf = 0.0;
	for(my $i = 0 ; $i < $nData ; $i++) {
		next if($pE->[$i] < $lowE);
		last if($highE < $pE->[$i]);
		$int += $pSmoothed->[$i];
		if($int >= $inthalf) {
			$Ehalf = $pE->[$i];
			last;
		}
	}
	my $dEhalf = -($Ehalf - $Ehalf0);
printf("$head2: E(half) = %f (%f)\n", $Ehalf, $dEhalf);
$summary->print("$head2,$Ehalf,$dEhalf\n");
	for(my $i = 0 ; $i < $nData ; $i++) {
		$pE->[$i] += $dEhalf;
		next if($pE->[$i] < $Emin or $Emax < $pE->[$i]);
#		print "$pE->[$i]: $pTDOS->[$i], $pSmoothed->[$i]\n";
		$out->print("$pE->[$i],$pSmoothed->[$i],$pTDOS->[$i]\n");
	}

	$out->Close();
}

$summary->Close();
