package Subs::UVOTDB;
##############################################################################
#
# DESCRIPTION:
#
# HISTORY:
# HISTORY: $Log: UVOTDB.pm,v $
# HISTORY: Revision 1.3 2004/12/22 18:17:06 apsop
# HISTORY: Bug fixes to acquistion of UVOT db values.
# HISTORY:
# HISTORY: Revision 1.2 2004/12/14 02:45:37 apsop
# HISTORY: Test for existence of exposure catalog before making db file.
# HISTORY:
# HISTORY: Revision 1.1 2004/12/10 02:12:44 apsop
# HISTORY: Class for making uvot database files.
# HISTORY:
#
# VERSION: 0.0
#
#
##############################################################################
use Subs::Sub;
@ISA = ("Subs::Sub");
use strict;
use Astro::FITS::CFITSIO qw(:constants);
use Util::HEAdas;
use Util::Date;
use Util::FITStable;
use Subs::UvotNames;
sub new {
my $proto=shift;
my $self=$proto->SUPER::new();
$self->{DESCRIPTION}="Sort and organize UVOT 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();
# set up the database columns
my @db = (
# alert keys
{ name => 'name',
type => '80A',
# $jobpar->read('object')
},
{ name => 'orig_target_id',
type => '1J',
null => -1,
# $jobpar->read('target')
},
{ name => 'target_id',
type => '1J',
null => -1,
# substr(0, 8, $jobpar->read('sequence'))
},
{ name => 'ra',
type => '1D',
unit => 'degree',
disp => 'F10.5',
# $jobpar->read('ra')
},
{ name => 'dec',
type => '1D',
unit => 'degree',
disp => 'F10.5',
# $jobpar->read('dec')
},
{ name => 'roll_angle',
type => '1D',
unit => 'degree',
disp => 'F10.5',
# $jobpar->read('roll')
},
{ name => 'start_time',
type => '24A',
# ecat column ESTART
},
{ name => 'stop_time',
type => '24A',
# ecat column ESTOP
},
{ name => 'orig_obs_segment',
type => '1J',
disp => 'I3',
null => -1,
# $jobpar->read('obs')
},
{ name => 'obs_segment',
type => '1J',
disp => 'I3',
null => -1,
},
{ name => 'orig_obsid',
type => '11A',
},
{ name => 'obsid',
type => '11A',
},
{ name => 'integration_time',
type => '1E',
unit => 's',
},
{ name => 'window_size',
type => '80A',
},
{ name => 'filter',
type => '80A',
key => 'FILTER', # to string
},
{ name => 'operation_mode',
type => '80A',
# value IMAGE|EVENT|IMAGE&EVENT
},
{ name => 'pointing_mode',
type => '80A',
# SLEW|SETTLING|...
},
{ name => 'filename',
type => '80A',
# either IFILEREF or EFILEREF
},
);
my $db = Util::FITStable->new(\@db,
log => $log,
which => 'uvot',
);
my $path = $filename->get('hk', 'uvot', 'ct');
unless( $path && -f $path ) {
$log->entry("Unable to locate uvot exposure catalog");
return;
}
my $uecat = Util::SimpleFITS->open("<$path");
my $status = $uecat->status;
if (not $uecat or $status) {
$log->error(2, "unable to open uvot exposure catalog [$status]");
return;
}
$uecat->move('EXPCATALOG');
if ($uecat->status) {
$log->error(2, 'unable to move to EXPCATALOG extension');
return;
}
################################################
# Compile the data needed for the UVOT db file
################################################
my $rows;
$uecat->handle->get_num_rows($rows, $status);
my @indef = ('INDEF') x $rows;
# observation
$db->set(name => [ ("'".$jobpar->read('object')."'") x $rows ]);
$db->set(orig_target_id => [ ($jobpar->read('target')) x $rows ]);
$db->set(target_id => [ (substr $jobpar->read('sequence'), 0, 8) x $rows ]);
####################################################################
# Early observations (before PPSTs) had multiple pointings, so set
# pointing to indef
####################################################################
if( $jobpar->read('tstart') > 124383600 ){
$db->set(ra => [ ($jobpar->read('ra')) x $rows ]);
$db->set(dec => [ ($jobpar->read('dec')) x $rows ]);
$db->set(roll_angle => [ ($jobpar->read('roll')) x $rows ]);
}else{
$db->set(ra => \@indef );
$db->set(dec => \@indef );
$db->set(roll_angle => \@indef );
}
# per exposure data
my @estart;
my @estop;
my @segment;
my @enet;
my @windowDX;
my @windowDY;
my @filterID;
my @efile;
my @ifile;
my @mode;
$status = $uecat
->readcol('ESTART' => TDOUBLE, [ ], \@estart)
->readcol('ESTOP' => TDOUBLE, [ ], \@estop)
->readcol('SEGMENT' => TLONG, [ ], \@segment)
->readcol('ENET' => TDOUBLE, [ ], \@enet)
->readcol('WINDOWDX' => TLONG, [ ], \@windowDX)
->readcol('WINDOWDY' => TLONG, [ ], \@windowDY)
->readcol('FILTERID' => TSTRING, [ ], \@filterID)
->readcol('EFILEREF' => TSTRING, [ ], \@efile)
->readcol('IFILEREF' => TSTRING, [ ], \@ifile)
->readcol('MODEID' => TINT, [ ], \@mode)
->status;
if ($status) {
$log->error(2, 'unable to read EXPCATALOG data');
return;
}
my @start = map { $db->timeString($_) } @estart;
my @stop = map { $db->timeString($_) } @estop;
$db->set(start_time => \@start);
$db->set(stop_time => \@stop);
$db->set(orig_obs_segment => [ ($jobpar->read('obs')) x $rows ]);
$db->set(obs_segment => [ (substr $jobpar->read('sequence'), 8, 3) x $rows ]);
$db->set(orig_obsid => [ ($jobpar->read('target') . $jobpar->read('obs')) x $rows ]);
$db->set(obsid => [ ($jobpar->read('sequence')) x $rows ]);
$db->set(integration_time => \@enet);
my @window;
for (my $i = 0; $i < $rows; ++$i) {
push(@window, "'$windowDX[$i] x $windowDY[$i]'");
}
$db->set(window_size => \@window);
$db->set(filter => \@filterID);
my @mode_name = map { $Subs::UvotNames::modeNames->[$_] } @mode;
$db->set(operation_mode => \@mode_name);
my @filename;
my @pointing_mode;
for (my $i = 0; $i < $rows; ++$i) {
if( $efile[$i] ne 'NONE' ){
push(@filename, $efile[$i]);
push(@pointing_mode, $efile[$i] =~ /po_uf.evt/ ? 'POINTING' : 'SLEW');
}else{
push(@pointing_mode, 'INDEF');
push(@filename, $ifile[$i]);
}
}
$db->set(filename => \@filename);
$db->set(pointing_mode => \@pointing_mode);
my $outfile = $filename->get('uvdb', 'proc', '', 0);
$db->write($outfile);
} # end of body method