package Subs::LocateBurst;
##############################################################################
#
# DESCRIPTION: This subroutine determines the best available position for
# DESCRIPTION: the burst.
#
# HISTORY:
# HISTORY: $Log: LocateBurst.pm,v $
# HISTORY: Revision 1.15 2007/02/27 19:32:10 apsop
# HISTORY: Fix bug keeping burst_cat_src and burst_veto from being updated. Store trigger time in job parameter.
# HISTORY:
# HISTORY: Revision 1.14 2007/01/31 19:19:18 apsop
# HISTORY: Add ra,dec to generic Burst object name.
# HISTORY:
# HISTORY: Revision 1.13 2006/03/06 15:04:10 apsop
# HISTORY: Set new parameter burst_pos_info.
# HISTORY:
# HISTORY: Revision 1.12 2005/06/01 19:57:07 apsop
# HISTORY: If bat does not think this is a burst rename Burst object to be Automatic Target.
# HISTORY:
# HISTORY: Revision 1.11 2004/11/29 16:33:09 apsop
# HISTORY: Add time test to use default Z values after launch.
# HISTORY:
# HISTORY: Revision 1.10 2004/09/14 18:52:34 apsop
# HISTORY: Fix bug which was introduced in the source priority
# HISTORY:
# HISTORY: Revision 1.9 2004/08/31 01:33:35 apsop
# HISTORY: Yet another bug fix for bat_z.
# HISTORY:
# HISTORY: Revision 1.8 2004/08/30 17:53:52 apsop
# HISTORY: Another fix for calculating bat_z and bat_origin_z.
# HISTORY:
# HISTORY: Revision 1.7 2004/08/30 16:40:27 apsop
# HISTORY: Test for zero when using inverse distance to calculate bat_z.
# HISTORY:
# HISTORY: Revision 1.6 2004/08/30 13:20:55 apsop
# HISTORY: Obtain values for bat_z and bat_origin_z from HK.
# HISTORY:
# HISTORY: Revision 1.5 2004/08/17 13:55:51 apsop
# HISTORY: Store info on burst in bat cataloge
# HISTORY:
# HISTORY: Revision 1.4 2004/05/06 20:02:34 dah
# HISTORY: Add version number back into the header comments.
# HISTORY:
# HISTORY: Revision 1.3 2004/04/16 20:21:18 dah
# HISTORY: Begin using embedded history records
# HISTORY:
#
# VERSION: 0.0
#
#
##############################################################################
use Subs::Sub;
@ISA = ("Subs::Sub");
use strict;
sub new {
my $proto=shift;
my $self=$proto->SUPER::new();
$self->{DESCRIPTION}="Determining burst position";
return $self;
}
##################
# METHODS:
##################
sub body {
my $self=shift;
my $log =$self->log();
my $filename=$self->filename();
my $procpar =$self->procpar();
my $jobpar =$self->jobpar();
$self->get_z_values();
my $bat_cen = $self->get_position();
###########################################################
# Record if the 'burst' is in the BAT source catalogue, or
# if it qualifies under the BAT criteria
###########################################################
if($bat_cen){
my $cen_fits = Util::FITSfile->new($bat_cen, 0);
my $trigtime = $cen_fits->keyword('TRIGTIME');
$jobpar->set({burst_time => $trigtime})
if $trigtime;
$jobpar->set({burst_cat_src => 'yes'})
if $cen_fits->keyword('CATSRC') eq 'T';
if( $cen_fits->keyword('GRBDETEC') eq 'F' ){
$jobpar->set({burst_veto => 'yes'});
if( $jobpar->read('object') eq 'Burst' ){
$jobpar->set({object => 'Automatic Target'});
}
}
}
##################################################
# If object is generic 'Burst', add in ra and dec
##################################################
if( $jobpar->read('object') =~ /^Burst/ ){
$jobpar->set({'object' =>
sprintf('Burst (%.3f, %.3f)', $jobpar->read('burst_ra'), $jobpar->read('burst_dec')) });
}
} # end of body method
sub get_z_values{
my $self=shift;
my $log =$self->log();
my $filename=$self->filename();
my $procpar =$self->procpar();
my $jobpar =$self->jobpar();
#################################################################
# Get bat_z and origin_z values from bat hk. For in-flight data
# go with default values in the parameter file.
#################################################################
my $launch = Util::Date->new('2004-11-20T17:16:00');
if( $jobpar->read('tstart') < $launch->seconds() ){
my $hkfile = $filename->get('enhk', 'bat', '', 0);
if( -f $hkfile ){
my $hkfits = Util::FITSfile->new($hkfile, 0);
my @hdus = $hkfits->list_hdus();
my $bat_z = 0;
unless( grep(/^hk161x001$/, @hdus) ){
$log->error(1, 'No 0x161 BAT HK data, using default Z values');
}else{
$hkfits->ext('hk161x001');
if( $hkfits->nrows() > 0 ){
my @invdist = $hkfits->cols('BBRIIMGINVDIST')->table();
my @flength = $hkfits->cols('BBRIIMGFLENGTH')->table();
$bat_z = 100.0 * (1.0 / $invdist[-1] + $flength[-1]) + 0.35
unless( $invdist[-1] == 0 );
$jobpar->set({bat_z => $bat_z,
bat_origin_z => $flength[-1] * 100.0 + 0.35});
}else{
$log->error(1, 'No 0x161 BAT HK data, using default Z values');
}
}
}else{
$log->error(1, 'No BAT HK data, using default Z values');
}
}
}
sub get_position{
my $self=shift;
my $log =$self->log();
my $filename=$self->filename();
my $procpar =$self->procpar();
my $jobpar =$self->jobpar();
################################################################
# Determine if a human assigned burst position is set.
# If so, we assume is more reliable than any machine-determined
# position.
################################################################
my $root = $filename->sequence_specific();
my $ra = $jobpar->read("burst_ra");
my $dec = $jobpar->read("burst_dec");
my $source = $jobpar->read("burst_pos_info");
my @bat_cen = $filename->get('tdmess', 'bat', 'ce', '*');
if( @bat_cen > 1 ){
@bat_cen = grep /^${root}/, @bat_cen;
if( @bat_cen > 1 ){
$log->entry("More than one bat centroid message.");
}
}
if($ra && $dec && $source eq "human") {
$log->entry("Using human assigned position RA=$ra Dec=$dec");
return $bat_cen[0];
}
my @xrt_cen = $filename->get('tdmess', 'xrt', 'ce', '*');
if( @xrt_cen > 1 ){
@xrt_cen = grep /^${root}/, @xrt_cen;
if( @xrt_cen > 1 ){
$log->entry("More than one xrt centroid message.");
}
}
if(@xrt_cen){
my $cen_fits = Util::FITSfile->new($xrt_cen[0], 0);
$ra = $cen_fits->keyword('XRA_OBJ');
$dec = $cen_fits->keyword('XDEC_OBJ');
$log->entry("Using $xrt_cen[0] for burst position, RA = $ra, DEC = $dec.");
$jobpar->set({burst_ra => $ra,
burst_dec => $dec,
burst_pos_info => 'xrt'});
return $bat_cen[0];
}
if(@bat_cen){
my $cen_fits = Util::FITSfile->new($bat_cen[0], 0);
$ra = $cen_fits->keyword('BRA_OBJ');
$dec = $cen_fits->keyword('BDEC_OBJ');
$log->entry("Using $bat_cen[0] for burst position, RA = $ra, DEC = $dec.");
$jobpar->set({burst_ra => $ra,
burst_dec => $dec,
burst_pos_info => 'bat'});
return $bat_cen[0];
}
#################################################################
# for the moment we will set the burst position to the nominal
# pointing direction. This is not the right thing to do.
# what if it isn't a burst?
#################################################################
if( $source eq 'unknown' ){
$log->entry("Setting target position to nominal pointing as a kludge");
$ra = $jobpar->read("ra");
$dec = $jobpar->read("dec");
$jobpar->set({burst_ra => $ra,
burst_dec => $dec,
burst_pos_info => 'pointing'});
}
return $bat_cen[0];
}
1;