Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F93004535
bayesMass.pl
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Mon, Nov 25, 12:50
Size
3 KB
Mime Type
text/x-perl
Expires
Wed, Nov 27, 12:50 (2 d)
Engine
blob
Format
Raw Data
Handle
22549280
Attached To
R1448 Lenstool-HPC
bayesMass.pl
View Options
#!/usr/bin/env perl
# Return a meanmass.dat file which contains the mass profile and
# the error bars
#
# syntax : bayesMass.pl <.par>
#
sub mydfits
{
my ($filename, $regexp ) = @_;
my $fh;
open($fh, $filename) or die "ERROR: File $filename not found\n";
$str = "";
while( not $str =~ "END " and not $str =~ $regexp )
{
sysread($fh, $str, 80);
}
close($fh);
return $str;
}
use Getopt::Long;
do "$ENV{'LENSTOOL_DIR'}/perl/covariance.pl";
if( @ARGV < 1 )
{
print "Syntax : bayesMass.pl [-r -xc <xc> -yc <yc>] <.par>\n";
exit 1;
}
# Get options
my ($xc, $yc, $ring);
my $status = GetOptions("xc=f" => \$xc, "yc=f" => \$yc, "r" => \$ring);
# Create the tmp/mass??.fits files
#system("bayesMass $ARGV[0]");
# Get the properties of the fits files
#@fmass=<tmp/mass*.fits>; we cannot use globbing because of Unix glob limit
opendir(DIR,"./tmp") || die "Cannot open ./tmp directory : $!\n";
@fmass = grep { /fits$/ } readdir(DIR);
@fmass = @fmass[0..1000] if( scalar @fmass > 1000);
closedir DIR;
unless( defined $xc && defined $yc )
{
$imsize=mydfits("tmp/$fmass[0]", "NAXIS1");
$imsize=~s/.+=([\s|\w]+)/$1/;
$imsize=$imsize/2+0.5;
$xc = $imsize;
$yc = $imsize;
}
$pixsize=mydfits("tmp/$fmass[0]", "CDELT2");
$pixsize=~s/.+=([\s|\w]+)/$1/;
$pixsize*=3600;
if( $pixsize == 0 )
{
#$pixsize = 4.6875;
$pixsize = 8. / 1.28;
print "WARNING: pixel scale not found in FITS header. Default $pixsize\"/pix\n";
}
open(IN, "para.out") || die "ERROR: para.out file not found\n";
foreach ( <IN> )
{
$scale=$1 if( $_ =~ /Conversion.*==([\s|\d|\.]+)/ );
}
close(IN);
# Check intmass or ringmass
my $intsoft = "intmass";
if ( $ring )
{
print "Use ringmass to compute radial density profile\n";
$intsoft = "ringmass";
}
# Loop over the tmp/mass??.fits files
$nfiles = 0;
my @vm; # vector of all the mass from all the files
foreach $f ( @fmass )
{
$f="tmp/".$f;
printf "Process file %d/%d : %s dm/m:%.2f\r",$nfiles+1,$#fmass+1,$f,$erel;
$f=~s/\.fits$//;
if( ! -e "$f.dat" )
{
# Prepare the intmass script
open(IN, ">mass.int" );
print IN << "EOT";
input
filein $f.fits
xc $xc
yc $yc
eps 0.
theta 0.
pixel $pixsize
scale $scale
end
output
fileout $f.dat
end
fini
EOT
close(IN);
if( system("$intsoft mass 2>1 /dev/null") != 0 )
{
print "ERROR: $intsoft produced error $?\n";
exit 1;
}
}
# Analyse the produced file
open( IN2, "$f.dat") or die "ERROR: cannot open $f.dat\n";
$i=0;
$erel = 0.; # cumulated relative error
while( <IN2> )
{
($ra[$i],$rkpc[$i],$npix[$i],$m) = split(' ');
push @vm, $m;
$avg[$i]+=$m;
$sdev[$i]+=$m*$m;
# cumulated stats
$a = $avg[$i]/($nfiles+1);
$e = sqrt($sdev[$i]/($nfiles+1) - $a*$a);
$erel+= $e*$e/$a/$a if( $a != 0);
$i++;
}
close(IN2);
$ni=$i;
$nfiles++;
}
print "\n";
# Perform the statistics and write the result in meanmass.dat
#my $mmat = pdl( @vm )->reshape($ni, $nfiles);
#my $cov = covariance( $mmat );
open(OUT, ">meanmass.dat");
print OUT "# xc $xc yc $yc $ARGV[0]\n";
for( $i=0; $i<$ni; $i++ )
{
$avg[$i]/=$nfiles;
$sdev[$i] = sqrt($sdev[$i]/$nfiles - $avg[$i]*$avg[$i]);
# $sdev[$i] = sqrt( $cov->slice(",$i")->sum() );
print OUT "$ra[$i] $rkpc[$i] $npix[$i] $avg[$i] $sdev[$i]\n";
}
close OUT;
Event Timeline
Log In to Comment