package Subs::NominalPointing;
##############################################################################
#
# DESCRIPTION: Determine the mean pointing for the observation.
# DESCRIPTION: This subroutine first merges all attitude files into a
# DESCRIPTION: single file. It then runs the aspect FTOOL to calculate the
# DESCRIPTION: mean pointing. It applies an instrument to spacecraft mean
# DESCRIPTION: alignment file if there is one.
# DESCRIPTION: The result is a set of Euler angles giving the mean spacecraft
# DESCRIPTION: orientation, and a set of RA, Dec and Roll giving the mean
# DESCRIPTION: instrument pointing as offset by the alignment file.
# DESCRIPTION: The subroutine next calculates the galactic coordinates
# DESCRIPTION: corresponding to the mean instrument RA, Dec and Roll.
# DESCRIPTION: All of this information is logged and stored in the
# DESCRIPTION: job.par file.
#
# HISTORY: $Log: NominalPointing.pm,v $
# HISTORY: Revision 1.5 2014/02/27 06:38:17 apsop
# HISTORY: VERSION header now shows CVS Revision
# HISTORY:
# HISTORY: Revision 1.4 2012/08/03 05:18:31 apsop
# HISTORY: sub determine_pointing takes 2 new optional named arguments,
# HISTORY: ERROR_LEVEL and PROBLEM_REF; should be backward-compatible.
# HISTORY: (Change by Bob Wiegand.)
# HISTORY:
# HISTORY: Revision 1.5 2009/05/06 17:50:11 apsop
# HISTORY: stools was changed to ftcoco
# HISTORY:
# HISTORY: Revision 1.4 2006/08/24 13:34:35 apsop
# HISTORY: Add history entry for automatic CVS history update.
# HISTORY:
# HISTORY: 2.1 -> 3.0 2002-09-04
# HISTORY: Created this common subroutine from the ASCA-specific Aspecting.pm
# HISTORY: module version 2.1. This was done by stipping out the ASCA-specific
# HISTORY: "fixing" code and putting in a way to configure the file types.
#
# HISTORY: 3.0 -> 3.1 2003-08-21
# HISTORY: aspect tool has been moved to HEADAS, so call it from there now.
#
# VERSION: $Revision: 1.5 $
#
##############################################################################
use Subs::Sub;
@ISA = ("Subs::Sub");
use strict;
use Util::CoreTags;
sub new {
my $proto=shift;
my $self=$proto->SUPER::new();
$self->{DESCRIPTION}="Determine nominal pointing";
####################################################
# default file types for attitude file and
# mean alignment file. These may be overridden
# by subclasses. If there is no alignment file,
# then you should set the ALIGNMENT_TYPE to "none"
####################################################
$self->{ATTITUDE_TYPE}="attitude";
$self->{ALIGNMENT_TYPE}="alignment";
return $self;
}
################
# METHODS:
################
#############################################################################
# this body method just calls determine_pointing
# subclasses may override this to do other things
#############################################################################
sub body {
my $self=shift;
$self->determine_pointing();
}
#############################################################################
# determine the nominal pointing after merging all attitude files
#############################################################################
sub determine_pointing {
my ($self, $gtis, %args) = @_;
$gtis ||= "none";
my $log =$self->log();
my $filename=$self->filename();
my $procpar =$self->procpar();
my $jobpar =$self->jobpar();
$log->entry("Determining nominal pointing with GTI $gtis");
my $problem = '';
my $ref = $args{PROBLEM_REF};
my $attitude = $self->{ATTITUDE_TYPE};
my $alignment = $self->{ALIGNMENT_TYPE};
########################################
# get a list of all the attitude files
########################################
my @attfiles=$filename->any($attitude);
unless(@attfiles) {
$log->entry("No attitude data available");
$problem = 'No attitude data available';
return;
}
#####################################################
# merge the attitude files if there is more than one
#####################################################
my $tmp_file="merged_attitude.tmp";
my $merged=Util::FITSlist->new(@attfiles)
->merge($tmp_file);
#################################################
# calculate the aspect point
#################################################
my $alignfile;
if($alignment ne "none") { $alignfile='CALDB'; }
else { $alignfile = "none"; }
my $aspect=Util::HEAdas->new("aspect")
->params({attfile => $merged,
alignfile => $alignfile,
gtis => $gtis,
nbins => 100,
binsize => 0.01});
$aspect->run();
if ($aspect->had_error) {
my $level = $args{ERROR_LEVEL} || 2;
$log->error([ $level, ASPECT_FAILED ],
"unable to determine nominal pointing using GTIs $gtis");
if ($ref) {
$$ref = 'aspect failed';
}
}
my $euler1=0.0;
my $euler2=0.0;
my $euler3=0.0;
my $ra=0.0;
my $dec=0.0;
my $roll=0.0;
#############################################
# read the results from the aspect par file
#############################################
$euler1=$aspect->parfile()->read("euler1");
$euler2=$aspect->parfile()->read("euler2");
$euler3=$aspect->parfile()->read("euler3");
if($euler2==180. || $euler2 == 0. && $euler1 =~ /^NaN$/i ) {
$euler1=0.;
}
$ra =$aspect->parfile()->read("ra" );
$dec =$aspect->parfile()->read("dec" );
$roll=$aspect->parfile()->read("roll");
if($dec == 90. || $dec == -90. && $ra =~ /^NaN$/i ) {
$ra = 0.;
}
#############################################
# convert to galactic coordinates
#############################################
my $ftcoco = Util::HEAdas->new( 'ftcoco' )->is_script(1)->params( {
infile => 'NONE',
outfile => '',
incoord => 'R',
outcoord => 'G',
lon1 => $ra,
lat1 => $dec,
radecsys => 'FK5',
chatter => 0,
clobber => 'no',
history => 'no'
} )->run( );
#
# Get the output Lii/Bii params if no error
#
my $glon = 0.0;
my $glat = 0.0;
if ( $ftcoco->had_error( ) ) {
$log->error( 2, "Error in ftcoco!" );
} else {
$glon = $ftcoco->parfile( )->read( 'lon2', 1e-6 );
$glat = $ftcoco->parfile( )->read( 'lat2', 1e-6 );
}
####################################################
# log the results and write them to the jobpar file
####################################################
$log->entry("Nominal spacecraft Euler angles: ".
"Phi=$euler1 Theta=$euler2 Psi=$euler3");
$log->entry("Nominal telescope pointing: ".
"R.A.=$ra Dec=$dec Roll Angle=$roll");
$log->entry("Galactic Coordinates: ".
"Lii=$glon Bii=$glat");
$jobpar->set({euler1 => $euler1,
euler2 => $euler2,
euler3 => $euler3,
ra => $ra,
dec => $dec,
roll => $roll,
glon => $glon,
glat => $glat });
unlink $tmp_file;
} # end of body method