#!/usr/bin/perl
#
use Statistics::OLS;
use Math::FFT;
use Math::Stat;
use Math::Spline qw(spline linsearch binsearch);
use Math::Derivative qw(Derivative2);
use Math::Approx;
use Astro::FITS::CFITSIO qw( :longnames :constants );
use PDL;
use PDL::Fit::Polynomial; 
use PDL::Filter::Linear;
use PGPLOT;  # Load PGPLOT module
use PDL::Fit::Gaussian;
use PDL::Slatec;
use PDL::Image2D;
#use PDL::Matrix;

#$F3D=$ENV{HIIEXPLORER_PATH};  $F3D=$ENV{HIIEXPLORER_PATH};  require("$F3D/my.pl"); #("$F3D/scripts/my.pl"); # "/work1/ssa/perl/MY/my.pl";
$F3D=$ENV{HIIEXPLORER_PATH};  $F3D=$ENV{HIIEXPLORER_PATH};  require("$F3D/my.pl"); #("$F3D/scripts/my.pl"); # "/home/sanchez/sda2/code/R3D/my.pl";
#/home/sanchez/3DSoft_Ubuntu/R3D/my.pl";


if ($#ARGV<6) {
    print "USE: isophot_seg.pl map.fits XC YC BOX NLEVELS MIN_FLUX SEGFILE.fits DIFFUSE_MASK.fits\n";
    exit;
}

$Ha_file=$ARGV[0];
$xc=int($ARGV[1]);
$yc=int($ARGV[2]);
$box=$ARGV[3];
#$min_dist=$ARGV[4];
$NC=$ARGV[4];
$MIN_FLUX=$ARGV[5];
$segfile=$ARGV[6];
$maskfile=$ARGV[7];

$Ha_map=rfits($Ha_file);
($nx,$ny)=$Ha_map->dims;
$seg_map=zeroes($nx,$ny);
$mask_map=ones($nx,$ny);


($ip,$jp)=find_max($xc,$yc,$box);
$f_max=$Ha_map->at($ip,$jp);

#print "$f_max $ip,$jp\n";
#$lHa_map=$Ha_map;
$lHa_map=$Ha_map->inplace->log10;
$f_map=(($lHa_map-log10($MIN_FLUX))/(log10($f_max)-log10($MIN_FLUX)))*$NC;
#$f_map=(($lHa_map)/log10($f_max))*$NC;

for ($i=0;$i<$NC;$i++) {
    $xp[$i]=0;
    $yp[$i]=0;
    $np[$i]=0;
    $max_dist[$i]=0;
}

$nup=0;
$isec_max=0;
for ($i=0;$i<$nx;$i++) {
    for ($j=0;$j<$ny;$j++) {
	$val=$lHa_map->at($i,$j);
	if (($val>log10($MIN_FLUX))&&($val<1e30)) {
	    $sec=$f_map->at($i,$j);
	    $isec=int($sec)+1;
	    $msec=0;
	} else {
	    $isec=1;
	    $msec=1;
	}
	$dist=sqrt(($i-$ip)**2+($j-$jp)**2);
	$K=$N[$isec];
	$D[$isec][$K]=$dist;
	$F[$isec][$K]=10**($val);
	$N[$isec]=$N[$isec]+1;
	if ($isec>$isec_max) {
	    $isec_max=$isec;
	}
	set($seg_map,$i,$j,$isec);
	set($mask_map,$i,$j,$msec);
    }
}

$rad_pt=$segfile;
$rad_pt =~ s/fits/pt/;
$rad_pt =~ s/fit/pt/;
open(FH,">$rad_pt");
for ($i=1;$i<=$isec_max;$i++) {
    if ($N[$i]>1) {
	my @d;
	for ($j=0;$j<$N[$i];$j++) {
	    $d[$j]=$D[$i][$j];
	}
	@stats=stats(pdl(@d));
	$dnow=$stats[0];
	$sdnow=$stats[1];
	my @f;
	for ($j=0;$j<$N[$i];$j++) {
	    $f[$j]=$F[$i][$j];
	}
	@stats=stats(pdl(@f));
	$fnow=$stats[0];
	$sfnow=$stats[1];

#	$fnow=mean(@f);
#	$sfnow=sigma(@f);
    } else {
	if ($N[$i]==0) {
	    $dnow=0;
	    $sdnow=0;
	    $fnow=0;
	    $sfnow=0;
	} else {
	    $dnow=0;
	    $sdnow=0;
	    $fnow=$F[$i][0];
	    $sfnow=0;
	}
    }    
#    if ($sdown eq "") {
#	$sdown=0;
#    }
#    print "$i '$dnow' '$sdnow' $fnow $sfnow\n"; <stdin>;
    print FH "$i $dnow $sdnow $fnow $sfnow\n";
}
close(FH);

$seg_map->wfits($segfile);
$mask_map->wfits($maskfile);
#$f_map->wfits("junk.fits");
exit;

# 1 larger than nearby
# 0 equal
# -1 smaller than nearby

sub find_max {
    my $i=$_[0];
    my $j=$_[1];
    my $box=$_[2];
    my $i1=$i-$box;
    my $i2=$i+$box+1;
    my $j1=$j-$box;
    my $j2=$j+$box+1;
    if ($i1<0) {
	$i1=0;
	$i2=$i1+$box+2;
    }
    if ($i2>$nx-$box) {
	$i2=$nx-$box;
	$i1=$i2-$box-2;
    }
    if ($j1<0) {
	$j1=0;
	$j2=$j1+$box+2;
    }
    if ($j2>$ny-$box) {
	$j2=$ny-$box;
	$j1=$j2-$box-2;
    }
    my @a=($i,$j);
    my $max=-1e30;
    for ($ii=$i1;$ii<$i2;$ii++) {
	for ($jj=$j1;$jj<$j2;$jj++) {
	    my $val=$Ha_map->at($ii,$jj);
	    if ($val>$max) {
		$max=$val;
		@a=($ii,$jj);
	    }
	}
    }
    return @a;
}


