package Subs::ExtractGTIs;
##############################################################################
#
# DESCRIPTION:
#
# HISTORY:
# HISTORY: $Log: ExtractGTIs.pm,v $
# HISTORY: Revision 1.20 2008/05/16 14:14:16 apsop
# HISTORY: Make GTI files using the new GTIfile class.
# HISTORY:
# HISTORY: Revision 1.19 2007/01/31 17:22:07 apsop
# HISTORY: Bug fix for setting of MJDREF in image data GTIs.
# HISTORY:
# HISTORY: Revision 1.18 2005/03/28 19:18:49 apsop
# HISTORY: Set TSTART and TSTOP for image GTI extensions
# HISTORY:
# HISTORY: Revision 1.17 2004/08/16 15:23:09 apsop
# HISTORY: Turn on writing of HISTORY keywords.
# HISTORY:
# HISTORY: Revision 1.16 2004/07/06 20:01:18 apsop
# HISTORY: Add test for existence of nfi GTIs.
# HISTORY:
# HISTORY: Revision 1.15 2004/06/29 14:28:19 apsop
# HISTORY: Do not make a GTI for files where TSTART=TSTOP. Create a gti file just for the nfi instruments.
# HISTORY:
# HISTORY: Revision 1.14 2004/05/06 20:02:34 dah
# HISTORY: Add version number back into the header comments.
# HISTORY:
# HISTORY: Revision 1.13 2004/04/16 20:21:18 dah
# HISTORY: Begin using embedded history records
# HISTORY:
#
# VERSION: 0.0
#
#
##############################################################################
use Subs::Sub;
@ISA = ("Subs::Sub");
use Util::GTIfile;
use strict;
sub new {
my $proto=shift;
my $self=$proto->SUPER::new();
$self->{DESCRIPTION}="Extracting GTIs from unfiltered data";
return $self;
}
##################
# METHODS:
##################
sub body {
my $self=shift;
my $log =$self->log();
my $filename=$self->filename();
my $procpar =$self->procpar();
my $jobpar =$self->jobpar();
########################################################
# accumulate a list of all event file GTIs
########################################################
my $all_gtis = Util::GTIlist->new();
my $nfi_gtis = Util::GTIlist->new();
############################
# loop over XRT and BAT
############################
foreach my $inst ("bat", "xrt", "uvot") {
#################################
# make a list of event file GTIs
#################################
my $list;
if($inst eq "uvot" ) {
#####################################################
# UVOT event files have more than one GTI extension
# so we have to loop over all extensions of all files
# looking for them
#####################################################
$list = Util::GTIlist->new();
foreach my $file ($filename->get("unfiltered", $inst, "*", "*")) {
my $fits = Util::FITSfile->new($file);
my $nhdus = $fits->nhdus();
for(my $hdu=1; $hdu<$nhdus; $hdu++) {
$fits->ext($hdu);
my $extname = $fits->keyword("EXTNAME");
if($extname =~ /^GTI/) {
##########################
# this is a GTI extension
##########################
$list->add($file, $extname);
}
}
}
} else {
##########################################
# XRT and BAT have one GTI per event file
# so its easy to make a list of them.
##########################################
$list = Util::GTIlist->new( $filename->get("unfiltered", $inst, "*", "*") );
$list->extension("GTI");
}
##############################
# make the merged GTI file
##############################
if($list->count() > 0) {
my $gti = $filename->get("gti", $inst, "ev", "00");
$log->entry("Merging ".join(' ', $list->files_with_ext()).
" to make $gti");
$list->merge_or_extract($gti);
$all_gtis->add($gti, "GTI");
$nfi_gtis->add($gti, "GTI") if $inst ne 'bat';
}
##############################################
# now construct a GTI file for the image data
##############################################
my @gti_intervals;
my $file;
foreach $file ($filename->get("rawimage", $inst, "*", "*") ) {
my $fits = Util::FITSfile->new($file, 0);
if( $inst eq 'uvot' ){
my $nhdus = $fits->nhdus();
for(my $hdu=1; $hdu<$nhdus; $hdu++) {
$fits->ext($hdu);
my $tstart = $fits->keyword("TSTART");
my $tstop = $fits->keyword("TSTOP" );
if($tstart && $tstop) {
$log->entry("$file has TSTART=$tstart TSTOP=$tstop");
if( $tstart==$tstop ){
$log->entry("Do not make GTI because TSTART=TSTOP.");
}else{
push @gti_intervals, $tstart, $tstop;
}
}else{
$log->error(2,
"Could not get TSTART/TSTOP from $file, ext $hdu");
}
}
}else{
my $tstart = $fits->keyword("TSTART");
my $tstop = $fits->keyword("TSTOP" );
if($tstart && $tstop) {
$log->entry("$file has TSTART=$tstart TSTOP=$tstop");
if( $tstart==$tstop ){
$log->entry("Do not make GTI because TSTART=TSTOP.");
}else{
push @gti_intervals, $tstart, $tstop;
}
}else{
$log->error(2, "Could not get TSTART/TSTOP from $file");
}
}
} # end of loop over images
###################################
# create the image GTI file
# and sort it by start time
###################################
if( @gti_intervals ) {
my $image = $filename->get('gti', $inst, 'im', 0);
unlink $image;
$log->entry("creating $inst image GTIs in $image");
Util::GTIfile->new($image, @gti_intervals);
#####################################
# add it to the list of all the GTIs
#####################################
$all_gtis->add($image, "GTI");
$nfi_gtis->add($image, "GTI") if $inst ne 'bat';
}
} # end of loop over instruments
################################################
# now merge all the GTI files into a single one
################################################
if($all_gtis->count()) {
my $gti = $filename->get('gti', 's', 'to', 0);
my $nfi_gti = $filename->get('gti', 's', 'nf', 0);
$log->entry("Merging ".join(' ', $all_gtis->files_with_ext()) ." to make $gti");
$all_gtis->merge_or_extract($gti);
if($nfi_gtis->count()) {
$log->entry("Merging ".join(' ', $nfi_gtis->files_with_ext()) ." to make $nfi_gti");
$nfi_gtis->merge_or_extract($nfi_gti);
}
}
} # end if body method