#!/usr1/local/bin/perl5 # # Extract CD matrix from FITS file and calculate # corresponding cdelt1, cdelt2, crota2 # # Nov 17, 1999 -- Micah Johnson # Version 1.0 # require "getopts.pl"; require "interface.pl"; require "utils.pl"; # &Getopts('i:t:a:dh'); #** Note for using Getopts ** # Example # &Getopts('cde:hmqvw:x:'); # f and n require arguments # if (defined $opt_h) { print < 0 ) { print "WARNING: Right-hand coordinate system\n"; } $cdelt1 = $sgn*sqrt($cd11**2 + $cd21**2); $cdelt2 = sqrt($cd12**2 + $cd22**2); if ( $cdelt1 > 0 ) { $sgn1 = 1; } else { $sgn1 = -1; } $rot = atan2( -$cd21/$rad, $sgn1*$cd11/$rad); $rot2 = atan2($sgn1*$cd12/$rad, $cd22/$rad); if ( $debug ) { printf "cdelt1: %e\n", $cdelt1; printf "cdelt2: %e\n", $cdelt2; printf "rot : %f\n", $rot*$rad; printf "rot2 : %f\n", $rot2*$rad; } # CFITSIO way # $rot = atan2($cd21*$rad, $cd11*$rad); # $rot2 = atan2(-$cd12*$rad, $cd22*$rad); if ( $debug ) { $crot = atan2($cd21/$rad, $cd11/$rad); $crot2 = atan2(-$cd12/$rad, $cd22/$rad); printf "CFITSIO rot : %f\n", $rad*$crot; printf "CFITSIO rot2: %f\n", $rad*$crot2; printf "CFITSIO cdelt1: %e\n", $cd11 / cos(($crot+$crot2)/2.); printf "CFITSIO cdelt1: %e\n", $cd22 / cos(($crot+$crot2)/2.); } $rdiff = abs($rot - $rot2); if ( $rdiff > $toler ) { print " Angles don't agree : $rot $rot2\n"; print " Difference: $rdiff Tolerance: $toler\n"; print " Looks like there is some skewness between the axes.\n"; exit; } # $cdelt1 = $cd11 / cos(($rot+$rot2)/2.); # $cdelt2 = $cd22 / cos(($rot+$rot2)/2.); $crota2 = (($rot + $rot2)*$rad)/2.; } # # Check for swapped RA/DEC # @results = &runcom("fkeypar $input CTYPE1"); if ( $results[0] =~ /ERROR/ ) { die; } $exist = `pget fkeypar exist`; chop $exist; if ( $exist ne "yes" ) { die "Failed to get CTYPE1\n"; } else { $ctype1 = `pget fkeypar value`; chop $ctype1; } print " CTYPE1: $ctype1\n"; @results = &runcom("fkeypar $input CTYPE2"); if ( $results[0] =~ /ERROR/ ) { die; } $exist = `pget fkeypar exist`; chop $exist; if ( $exist ne "yes" ) { die "Failed to get CTYPE2\n"; } else { $ctype2 = `pget fkeypar value`; chop $ctype2; } print " CTYPE2: $ctype2\n"; $swap = 0; if ( substr($ctype1,1,4) eq "DEC-" || substr($ctype1,2,3) eq "LAT" ) { $swap = 1; print "The latitudinal axis is given first, so swap them\n"; # $crota2 = 90. - $crota2; $crota2 = 90. + $crota2; if ( $crota2 >= 360. ) { $crota2 = $crota2 - 360.; } $temp = $cdelt1; $cdelt1 = $cdelt2; $cdelt2 = -$temp; @results = &runcom("fkeypar $input CRVAL1"); if ( $results[0] =~ /ERROR/ ) { die; } $exist = `pget fkeypar exist`; chop $exist; if ( $exist ne "yes" ) { die "Failed to get CRVAL1\n"; } else { $crval1 = `pget fkeypar value`; chop $crval1; } print " CRVAL1: $crval1\n"; @results = &runcom("fkeypar $input CRVAL2"); if ( $results[0] =~ /ERROR/ ) { die; } $exist = `pget fkeypar exist`; chop $exist; if ( $exist ne "yes" ) { die "Failed to get CRVAL2\n"; } else { $crval2 = `pget fkeypar value`; chop $crval2; } print " CRVAL2: $crval2\n"; $temp = $crval1; $crval1 = $crval2; $crval2 = $temp; $temp = $ctype1; $ctype1 = $ctype2; $ctype2 = $temp; } # # Output values # print "\nFITS template output: $template\n\n"; if ( $template ) { $opstr = ">$template"; } else { $opstr = ">-"; } open TEMPLATE, $opstr or die "Failed to open for output\n"; if ( $swap ) { print TEMPLATE "CRVAL1 $crval1\n"; print TEMPLATE "CTYPE1 $ctype1\n"; print TEMPLATE "CRVAL2 $crval2\n"; print TEMPLATE "CTYPE2 $ctype2\n"; } print TEMPLATE "CDELT1 $cdelt1 / derived from CD matrix\n"; print TEMPLATE "CDELT2 $cdelt2 / derived from CD matrix\n"; print TEMPLATE "CROTA2 $crota2 / derived from CD matrix\n"; print TEMPLATE "OLDCD1_1 $cd11 / old CD matrix value\n"; print TEMPLATE "OLDCD1_2 $cd12 / old CD matrix value\n"; print TEMPLATE "OLDCD2_1 $cd21 / old CD matrix value\n"; print TEMPLATE "OLDCD2_2 $cd22 / old CD matrix value\n"; print TEMPLATE "-CD1_1\n"; print TEMPLATE "-CD1_2\n"; print TEMPLATE "-CD2_1\n"; print TEMPLATE "-CD2_2\n"; close TEMPLATE;