## mkxrsreg.pl by Ken Ebisawa (ebisawa@subaru.gsfc.nasa.gov)
## version 1.0 2004-05-16
if($#ARGV!=2){
    print "\n usage: mkxrsreg.pl Euler1 Euler2 Euler3\n\n";
    print " where Euler1,2,3 are the satellite Euler angles.\n\n";
    print " This script creates a ds9 format XRS pixel region file \n";
    print " (output in STDOUT) for given satellite Euler angles.\n\n";
    print " In ASTRO-E2, Z-axis is the pointing direction, and we adopt\n";
    print " Z-Y-Z rotation for the Euler angle definition.\n";
    print " Consequently, (Euler1, 90.0-Euler2) is the equatorial coordinates\n";
    print " of the pointing direction, and (90-Euler3) gives the roll angle that is \n";
    print " measured from North to DETY axis in counter-clockwise.\n";
    exit(0);
}
$Euler[0]=$ARGV[0];
$Euler[1]=$ARGV[1];
$Euler[2]=$ARGV[2];

$rad2deg = 45.0/atan2(1.0,1.0);
&set_matrix(@Euler,$matrix1,$matrix2,$matrix3);

#Definition of these parameters are needed, so that
#these values are taken from subroutines.
my @outvect1=(0.0, 0.0,0.0);
my @outvect2=(0.0, 0.0,0.0);
my @outvect3=(0.0, 0.0,0.0);

$FOCALLEN=4500.0; # XRS focal length 
for($pixel=0;$pixel<=31;$pixel++){
    if($pixel!=2&&$pixel!=3){
	printf("fk5;polygon(");
	for($corner=0;$corner<=3;$corner++){
	    
# Get the pixel corner positions from the teldef file
# Unit is mm, and center of XRS is (0,0), in
# "look-down" coordinates.
	    $focX =  &get_PixelXcorners($pixel,$corner);
	    $focY =  &get_PixelYcorners($pixel,$corner);
	    
# Determine the direction vector in FOC coordinates
	    $phi =atan2(sqrt($focX**2+$focY**2),$FOCALLEN);
	    $theta= atan2($focY,$focX);
	    $Foc[0]=-sin($phi)*cos($theta);
	    $Foc[1]=-sin($phi)*sin($theta);
	    $Foc[2]= cos($phi);
# Convert the direction vector in the equatorial coordinates
# with Euler rotation
	    &multi_matrix(@Foc,       $matrix1, @outvect1);
	    &multi_matrix(@outvect1,  $matrix2, @outvect2);
	    &multi_matrix(@outvect2,  $matrix3, @outvect3);
	    
# Project the tangential vector in alpha and delta
	    if($outvect3[0]==0.0E0){
		if($outvect3[1]==0.0E0){
		    $alpha = 0.0E0;
		}
		elsif($outvect3[1] > 0.0){
		    $alpha= 90.0E0;
		}
		else{
		    $alpha= -90.0E0;
		}
	    }
	    else{
		$alpha = atan2($outvect3[1],$outvect3[0])*$rad2deg;
	    }
	    if ($alpha<0.0){
		$alpha = $alpha + 360.0E0;
	    }
	    if(abs($outvect3[2]) > 1.0) {
		print "Error!\n";
		print "argument of asin below -1 or above 1\n";
		print "argument of asin',$outvect3[2]<\n";
		exit(0);
	    }
	    $delta = &asin($outvect3[2])*$rad2deg;
# Write the ds9 region file for each pixel
	    printf("%10.6f,%10.6f",$alpha,$delta);
	    if($corner<3){printf(",");}
	}
    printf(")\n");
    }
}

sub get_PixelXcorners{
    local($pixel, $corner);
    $pixel=$_[0];$corner=$_[1];
# This is taken from xrs_teldef_2003-02-15.fit
### for pixel X ###
    if($pixel==20){if($corner==0){return   -1.2720;}
		   if($corner==1){return   -0.6480;}
		   if($corner==2){return   -0.6480;}
		   if($corner==3){return   -1.2720;}
  	       }
    if($pixel==22){if($corner==0){return   -0.6320;}
		   if($corner==1){return   -0.0080;}
		   if($corner==2){return   -0.0080;}
		   if($corner==3){return   -0.6320;}
	       }
    if($pixel==31){if($corner==0){return    0.0080;}
		   if($corner==1){return    0.6320;}
		   if($corner==2){return    0.6320;}
		   if($corner==3){return    0.0080;}
	       }
    if($pixel==29){if($corner==0){return    0.6480;}
		   if($corner==1){return    1.2720;}
		   if($corner==2){return    1.2720;}
		   if($corner==3){return    0.6480;}
	       }
    if($pixel==18){if($corner==0){return   -1.9120;}
		   if($corner==1){return   -1.2880;}
		   if($corner==2){return   -1.2880;}
		   if($corner==3){return   -1.9120;}
	       }
    if($pixel==19){if($corner==0){return   -1.2720;}
		   if($corner==1){return   -0.6480;}
		   if($corner==2){return   -0.6480;}
		   if($corner==3){return   -1.2720;}
	       }
    if($pixel==21){if($corner==0){return   -0.6320;}
		   if($corner==1){return   -0.0080;}
		   if($corner==2){return   -0.0080;}
		   if($corner==3){return   -0.6320;}
	       }
    if($pixel==30){if($corner==0){return    0.0080;}
		   if($corner==1){return    0.6320;}
		   if($corner==2){return    0.6320;}
		   if($corner==3){return    0.0080;}
	       }
    if($pixel==28){if($corner==0){return    0.6480;}
		   if($corner==1){return    1.2720;}
		   if($corner==2){return    1.2720;}
		   if($corner==3){return    0.6480;}
	       }
    if($pixel==27){if($corner==0){return    1.2880;}
		   if($corner==1){return    1.9120;}
		   if($corner==2){return    1.9120;}
		   if($corner==3){return    1.2880;}
	       }
    if($pixel==16){if($corner==0){return   -1.9120;}
		   if($corner==1){return   -1.2880;}
		   if($corner==2){return   -1.2880;}
		   if($corner==3){return   -1.9120;}
	       }
    if($pixel==17){if($corner==0){return   -1.2720;}
		   if($corner==1){return   -0.6480;}
		   if($corner==2){return   -0.6480;}
		   if($corner==3){return   -1.2720;}
	       }
    if($pixel==23){if($corner==0){return   -0.6320;}
		   if($corner==1){return   -0.0080;}
		   if($corner==2){return   -0.0080;}
		   if($corner==3){return   -0.6320;}
	       }
    if($pixel==24){if($corner==0){return    0.0080;}
		   if($corner==1){return    0.6320;}
		   if($corner==2){return    0.6320;}
		   if($corner==3){return    0.0080;}
	       }
    if($pixel==26){if($corner==0){return    0.6480;}
		   if($corner==1){return    1.2720;}
		   if($corner==2){return    1.2720;}
		   if($corner==3){return    0.6480;}
	       }
    if($pixel==25){if($corner==0){return    1.2880;}
		   if($corner==1){return    1.9120;}
		   if($corner==2){return    1.9120;}
		   if($corner==3){return    1.2880;}
	       }
    if($pixel== 9){if($corner==0){return   -1.9120;}
		   if($corner==1){return   -1.2880;}
		   if($corner==2){return   -1.2880;}
		   if($corner==3){return   -1.9120;}
	       }
    if($pixel==10){if($corner==0){return   -1.2720;}
		   if($corner==1){return   -0.6480;}
		   if($corner==2){return   -0.6480;}
		   if($corner==3){return   -1.2720;}
	       }
    if($pixel== 8){if($corner==0){return   -0.6320;}
		   if($corner==1){return   -0.0080;}
		   if($corner==2){return   -0.0080;}
		   if($corner==3){return   -0.6320;}
	       }
    if($pixel== 7){if($corner==0){return    0.0080;}
		   if($corner==1){return    0.6320;}
		   if($corner==2){return    0.6320;}
		   if($corner==3){return    0.0080;}
	       }
    if($pixel== 1){if($corner==0){return    0.6480;}
		   if($corner==1){return    1.2720;}
		   if($corner==2){return    1.2720;}
		   if($corner==3){return    0.6480;}
              }
    if($pixel== 0){if($corner==0){return    1.2880;}
		   if($corner==1){return    1.9120;}
		   if($corner==2){return    1.9120;}
		   if($corner==3){return    1.2880;}
	       }
    if($pixel==11){if($corner==0){return   -1.9120;}
		   if($corner==1){return   -1.2880;}
		   if($corner==2){return   -1.2880;}
		   if($corner==3){return   -1.9120;}
	       }
    if($pixel==12){if($corner==0){return   -1.2720;}
		   if($corner==1){return   -0.6480;}
		   if($corner==2){return   -0.6480;}
		   if($corner==3){return   -1.2720;}
	       }
    if($pixel==14){if($corner==0){return   -0.6320;}
		   if($corner==1){return   -0.0080;}
		   if($corner==2){return   -0.0080;}
		   if($corner==3){return   -0.6320;}
	       }
    if($pixel== 5){if($corner==0){return    0.0080;}
		   if($corner==1){return    0.6320;}
		   if($corner==2){return    0.6320;}
		   if($corner==3){return    0.0080;}
	       }
    if($pixel== 3){if($corner==0){return    0.6480;}
		   if($corner==1){return    1.2720;}
		   if($corner==2){return    1.2720;}
		   if($corner==3){return    0.6480;}
	       }
    if($pixel==13){if($corner==0){return   -1.2720;}
		   if($corner==1){return   -0.6480;}
		   if($corner==2){return   -0.6480;}
		   if($corner==3){return   -1.2720;}
	       }
    if($pixel==15){if($corner==0){return   -0.6320;}
		   if($corner==1){return   -0.0080;}
		   if($corner==2){return   -0.0080;}
		   if($corner==3){return   -0.6320;}
	       }
    if($pixel== 6){if($corner==0){return    0.0080;}
		   if($corner==1){return    0.6320;}
		   if($corner==2){return    0.6320;}
		   if($corner==3){return    0.0080;}
	       }
    if($pixel== 4){if($corner==0){return    0.6480;}
		   if($corner==1){return    1.2720;}
		   if($corner==2){return    1.2720;}
		   if($corner==3){return    0.6480;}
	       }
    if($pixel== 2){if($corner==0){return    4.0440;}
		   if($corner==1){return    4.6680;}
		   if($corner==2){return    4.6680;}
		   if($corner==3){return    4.0440;}
	       }
}
sub get_PixelYcorners{
    local($pixel, $corner);
    $pixel=$_[0];$corner=$_[1];
# This is taken from xrs_teldef_2003-02-15.fit
### for pixel Y ###
    if($pixel==20){if($corner==0){return    1.2880;}
		   if($corner==1){return    1.2880;}
		   if($corner==2){return    1.9120;}
		   if($corner==3){return    1.9120;}
	       }
    if($pixel==22){if($corner==0){return    1.2880;}
		   if($corner==1){return    1.2880;}
		   if($corner==2){return    1.9120;}
		   if($corner==3){return    1.9120;}
	       }
    if($pixel==31){if($corner==0){return    1.2880;}
		   if($corner==1){return    1.2880;}
		   if($corner==2){return    1.9120;}
		   if($corner==3){return    1.9120;}
	       }
    if($pixel==29){if($corner==0){return    1.2880;}
		   if($corner==1){return    1.2880;}
		   if($corner==2){return    1.9120;}
		   if($corner==3){return    1.9120;}
	       }
    if($pixel==18){if($corner==0){return    0.6480;}
		   if($corner==1){return    0.6480;}
		   if($corner==2){return    1.2720;}
		   if($corner==3){return    1.2720;}
	       }
    if($pixel==19){if($corner==0){return    0.6480;}
		   if($corner==1){return    0.6480;}
		   if($corner==2){return    1.2720;}
		   if($corner==3){return    1.2720;}
	       }
    if($pixel==21){if($corner==0){return    0.6480;}
		   if($corner==1){return    0.6480;}
		   if($corner==2){return    1.2720;}
		   if($corner==3){return    1.2720;}
	       }
    if($pixel==30){if($corner==0){return    0.6480;}
		   if($corner==1){return    0.6480;}
		   if($corner==2){return    1.2720;}
		   if($corner==3){return    1.2720;}
	       }
    if($pixel==28){if($corner==0){return    0.6480;}
		   if($corner==1){return    0.6480;}
		   if($corner==2){return    1.2720;}
		   if($corner==3){return    1.2720;}
	       }
    if($pixel==27){if($corner==0){return    0.6480;}
		   if($corner==1){return    0.6480;}
		   if($corner==2){return    1.2720;}
		   if($corner==3){return    1.2720;}
	       }
    if($pixel==16){if($corner==0){return    0.0080;}
		   if($corner==1){return    0.0080;}
		   if($corner==2){return    0.6320;}
		   if($corner==3){return    0.6320;}
	       }
    if($pixel==17){if($corner==0){return    0.0080;}
		   if($corner==1){return    0.0080;}
		   if($corner==2){return    0.6320;}
		   if($corner==3){return    0.6320;}
	       }
    if($pixel==23){if($corner==0){return    0.0080;}
		   if($corner==1){return    0.0080;}
		   if($corner==2){return    0.6320;}
		   if($corner==3){return    0.6320;}
	       }
    if($pixel==24){if($corner==0){return    0.0080;}
		   if($corner==1){return    0.0080;}
		   if($corner==2){return    0.6320;}
		   if($corner==3){return    0.6320;}
	       }
    if($pixel==26){if($corner==0){return    0.0080;}
		   if($corner==1){return    0.0080;}
		   if($corner==2){return    0.6320;}
		   if($corner==3){return    0.6320;}
	       }
    if($pixel==25){if($corner==0){return    0.0080;}
		   if($corner==1){return    0.0080;}
		   if($corner==2){return    0.6320;}
		   if($corner==3){return    0.6320;}
	       }
    if($pixel== 9){if($corner==0){return   -0.6320;}
		   if($corner==1){return   -0.6320;}
		   if($corner==2){return   -0.0080;}
		   if($corner==3){return   -0.0080;}
	       }
    if($pixel==10){if($corner==0){return   -0.6320;}
		   if($corner==1){return   -0.6320;}
		   if($corner==2){return   -0.0080;}
		   if($corner==3){return   -0.0080;}
	       }
    if($pixel== 8){if($corner==0){return   -0.6320;}
		   if($corner==1){return   -0.6320;}
		   if($corner==2){return   -0.0080;}
		   if($corner==3){return   -0.0080;}
	       }
    if($pixel== 7){if($corner==0){return   -0.6320;}
		   if($corner==1){return   -0.6320;}
		   if($corner==2){return   -0.0080;}
		   if($corner==3){return   -0.0080;}
	       }
    if($pixel== 1){if($corner==0){return   -0.6320;}
		   if($corner==1){return   -0.6320;}
		   if($corner==2){return   -0.0080;}
		   if($corner==3){return   -0.0080;}
	       }
    if($pixel== 0){if($corner==0){return   -0.6320;}
		   if($corner==1){return   -0.6320;}
		   if($corner==2){return   -0.0080;}
		   if($corner==3){return   -0.0080;}
	       }
    if($pixel==11){if($corner==0){return   -1.2720;}
		   if($corner==1){return   -1.2720;}
		   if($corner==2){return   -0.6480;}
		   if($corner==3){return   -0.6480;}
	       }
    if($pixel==12){if($corner==0){return   -1.2720;}
		   if($corner==1){return   -1.2720;}
		   if($corner==2){return   -0.6480;}
		   if($corner==3){return   -0.6480;}
	       }
    if($pixel==14){if($corner==0){return   -1.2720;}
		   if($corner==1){return   -1.2720;}
		   if($corner==2){return   -0.6480;}
		   if($corner==3){return   -0.6480;}
	       }
    if($pixel== 5){if($corner==0){return   -1.2720;}
		   if($corner==1){return   -1.2720;}
		   if($corner==2){return   -0.6480;}
		   if($corner==3){return   -0.6480;}
	       }
    if($pixel== 3){if($corner==0){return   -1.2720;}
		   if($corner==1){return   -1.2720;}
		   if($corner==2){return   -0.6480;}
		   if($corner==3){return   -0.6480;}
	       }
    if($pixel==13){if($corner==0){return   -1.9120;}
		   if($corner==1){return   -1.9120;}
		   if($corner==2){return   -1.2880;}
		   if($corner==3){return   -1.2880;}
	       }
    if($pixel==15){if($corner==0){return   -1.9120;}
		   if($corner==1){return   -1.9120;}
		   if($corner==2){return   -1.2880;}
		   if($corner==3){return   -1.2880;}
	       }
    if($pixel== 6){if($corner==0){return   -1.9120;}
		   if($corner==1){return   -1.9120;}
		   if($corner==2){return   -1.2880;}
		   if($corner==3){return   -1.2880;}
	       }
    if($pixel== 4){if($corner==0){return   -1.9120;}
		   if($corner==1){return   -1.9120;}
		   if($corner==2){return   -1.2880;}
		   if($corner==3){return   -1.2880;}
              }
    if($pixel== 2){if($corner==0){return   -4.1870;}
		   if($corner==1){return   -4.1870;}
		   if($corner==2){return   -3.5630;}
		   if($corner==3){return   -3.5630;}
	       }
}

sub set_matrix{
# Set rotation matrix for Euler angles
    my($alpha,$delta,$theta);
    my($matrix1,$matrix2,$matrix3);
    my($dec2rag);
    $dec2rag = atan2(1.0,1.0)/45.0;
    $alpha = $_[0];
    $delta = $_[1];
    $theta = $_[2];
    $alpha = $dec2rag*$alpha;
    $delta = $dec2rag*$delta;
    $theta = $dec2rag*$theta;
    $matrix1->[0][0]= cos($theta);
    $matrix1->[0][1]= -sin($theta);
    $matrix1->[0][2]= 0.0E0;
    $matrix1->[1][0]= sin($theta);
    $matrix1->[1][1]= cos($theta);
    $matrix1->[1][2]= 0.0E0;
    $matrix1->[2][0]= 0.0E0;
    $matrix1->[2][1]= 0.0E0;
    $matrix1->[2][2]= 1.0E0;

    $matrix2->[0][0]= cos($delta);
    $matrix2->[0][1]= 0.0E0;
    $matrix2->[0][2]= sin($delta);
    $matrix2->[1][0]= 0.0E0;
    $matrix2->[1][1]= 1.0E0;
    $matrix2->[1][2]= 0.0E0;
    $matrix2->[2][0]= -sin($delta);
    $matrix2->[2][1]= 0.0E0;
    $matrix2->[2][2]= cos($delta);

    $matrix3->[0][0]= cos($alpha);
    $matrix3->[0][1]= -sin($alpha);
    $matrix3->[0][2]= 0.0E0;
    $matrix3->[1][0]= sin($alpha);
    $matrix3->[1][1]= cos($alpha);
    $matrix3->[1][2]= 0.0E0;
    $matrix3->[2][0]= 0.0E0;
    $matrix3->[2][1]= 0.0E0;
    $matrix3->[2][2]= 1.0E0;

    $_[3]=$matrix1; 
    $_[4]=$matrix2; 
    $_[5]=$matrix3; 
}
sub multi_matrix{
    my(@invect,$matrix,@outvect,$i,$j);
    $invect[0] =$_[0];
    $invect[1] =$_[1];
    $invect[2] =$_[2];
    $matrix    =$_[3];
    for($i=0;$i<=2;$i++){
	$outvect[$i]=0.0;
	for($j=0;$j<=2;$j++){
	    $outvect[$i] = $outvect[$i]+$matrix->[$i][$j]*$invect[$j];
	}
    }
    $_[4]=$outvect[0];
    $_[5]=$outvect[1];
    $_[6]=$outvect[2];
}

sub asin { atan2($_[0], sqrt(1 - $_[0] * $_[0])) }
