package Util::GTIfile; ############################################################################## # # DESCRIPTION: # # HISTORY: # HISTORY: $Log: GTIfile.pm,v $ # HISTORY: Revision 1.1 2008/05/16 17:55:15 apsop # HISTORY: New FITSfile subclass with specialized GTI methods. # HISTORY: # HISTORY: # # VERSION: 0.0 # # ############################################################################## use Util::FITSfile; @ISA=("Util::FITSfile"); use Util::Ftool; use Util::HEAdas; use strict; sub new { my $self = shift; my $log = Util::Ftool->log(); my $file = shift; ######################################## # inherit the generic Tool constructor ######################################## $self=$self->SUPER::new($file); if( -f $self->{NAME} ){ $self->find_ext(); }else{ if( @_ > 1 ){ $self->create_file(@_); }else{ $log->error(3, "Invalid Arguments for new GTIfile method"); } } return $self; } ######################################################## # Find and set the first GTI extension, and complain if # there isn't one ######################################################## sub find_ext { my $self = shift; my $log=Util::Ftool->log(); my $nhdus = $self->nhdus(); my $gti_found = 0; for(my $hdu_num=1; $hdu_num <= $nhdus; $hdu_num++){ $self->ext($hdu_num); my $class_key = $self->keyword('HDUCLASS'); next unless ($class_key && $class_key eq 'OGIP'); my $class_key1 = $self->keyword('HDUCLAS1'); next unless ($class_key1 && $class_key1 eq 'GTI'); $gti_found = 1; last; } unless($gti_found){ $log->error(2, "File $self->{NAME} does not have a valid GTI extension."); } return; } ###################################################### # Create a gti file from a hash of start=>stop times. ###################################################### sub create_file { my $self = shift; my @intervals = @_; my $datafile = 'fits_data.tmp'; my $cdfile = 'fits_cols.tmp'; my $hdfile = 'fits_head.tmp'; open COLS, ">$cdfile"; print COLS "START 1D s\n"; print COLS "STOP 1D s\n"; close COLS; open HEAD, ">$hdfile"; print HEAD "EXTNAME = 'GTI ' / name of this binary table extension\n"; print HEAD "HDUCLASS= 'OGIP ' / format conforms to OGIP/GSFC conventions\n"; print HEAD "HDUCLAS1= 'GTI ' / Extension contains Good Time Intervals\n"; print HEAD "HDUCLAS2= 'STANDARD' / Extension contains Good Time Intervals\n"; print HEAD "TIMESYS = 'TT ' / time measured from\n"; print HEAD "MJDREFI = 51910 / MJD reference day\n"; print HEAD "MJDREFF = 7.428703700000000E-04 / MJD reference (fraction of day)\n"; print HEAD "CLOCKAPP= F / default\n"; print HEAD "TIMEUNIT= 's ' / unit for time keywords\n"; close HEAD; open DATA, ">$datafile"; print DATA join(' ', @intervals), "\n"; close DATA; my $table = Util::Ftool->new('fcreate') ->params({cdfile => $cdfile, datafile => $datafile, headfile => $hdfile, outfile => $self->{NAME}}) ->run(); unlink $cdfile, $datafile, $hdfile; $self->ext(1); $self->cols('START')->sort(); my @sorted_times = sort {$a <=> $b} @intervals; $self->keyword('TSTART', $intervals[0]); $self->keyword('TSTOP', $intervals[-1]); return; } ################################################ # Sum up and return all the good time intervals ################################################ sub sum { my $self = shift; $self->cols('START', 'STOP'); my %intervals = $self->table(); my $sum = 0; foreach my $start (keys %intervals){ $sum += $intervals{$start} - $start; } return $sum; } 1;