package Subs::Swift2FITS; ############################################################################## # # DESCRIPTION: # DESCRIPTION: # # HISTORY: # HISTORY: $Log: Swift2FITS.pm,v $ # HISTORY: Revision 1.14 2006/04/27 15:54:32 apsop # HISTORY: Split off combining of engineering files to a new combined_fits method. # HISTORY: # HISTORY: Revision 1.13 2006/01/29 19:38:36 apsop # HISTORY: Sort hkfiles before combining so extensions have coherent ordering. # HISTORY: # HISTORY: Revision 1.12 2004/12/24 02:02:36 apsop # HISTORY: Add 776, 782 to apids to be processed by uvot2fits. # HISTORY: # HISTORY: Revision 1.11 2004/11/03 15:46:40 apsop # HISTORY: Remove empty TUNIT keywords from hk files. # HISTORY: # HISTORY: Revision 1.10 2004/10/20 18:49:45 apsop # HISTORY: Add in additonal apids which are handled by uvot2fits. # HISTORY: # HISTORY: Revision 1.9 2004/08/22 18:42:25 apsop # HISTORY: Initial changes for new file classes and repository # HISTORY: # HISTORY: Revision 1.8 2004/07/19 16:02:05 apsop # HISTORY: Add 491 to list of BAT apids processed by bat2fits. # HISTORY: # HISTORY: Revision 1.7 2004/06/11 13:15:47 apsop # HISTORY: Add 605 as apid to be handled by uvot2fits. # HISTORY: # HISTORY: Revision 1.6 2004/06/08 00:04:26 apsop # HISTORY: Fix problem with deleting bad hk files. # HISTORY: # HISTORY: Revision 1.5 2004/05/06 20:02:34 dah # HISTORY: Add version number back into the header comments. # HISTORY: # HISTORY: Revision 1.4 2004/04/30 16:20:30 dah # HISTORY: Add in additional FITS info to hk files if available. Fix code for selecting APIDs for hk processing # HISTORY: # HISTORY: Revision 1.3 2004/04/28 13:47:35 dah # HISTORY: Make one method for extracting hk, and put it in Swift2FTIS superclass. # HISTORY: # HISTORY: Revision 1.2 2004/04/16 20:21:18 dah # HISTORY: Begin using embedded history records # HISTORY: # # VERSION: 0.0 # # ############################################################################## use Subs::SwiftSub; @ISA = ('Subs::SwiftSub'); use strict; my %sci_ids; sub BEGIN { ###################################################### # List of apid's NOT to be converter using 'unpacket' ###################################################### my @bat_ids = (299, 334, 335, 337, 338, 339, 341, 342, 351, 384, 385, 386, 387, 400, 401, 402, 403, 404, 416, 417, 481, 484, 485, 488, 489, 490, 491, 494, 496, 497, 526, 527, 528, 529, 530, 533, 567, 568, 570, 571); my @uvot_ids = (605, 688, 704, 776, 782, 843, 848, 850, 853, 854, 855, 856, 857, 858, 860, 861, 1104); my @xrt_ids = (1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, 1248, 1249, 1250, 1253, 1264, 1280, 1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1351); ####################################################### # Convert the lists into hashes and store in %sci_ids ####################################################### my (%bat_hash, %xrt_hash, %uvot_hash, %swift_hash); @bat_hash{@bat_ids} = (1) x @bat_ids; $sci_ids{'bat'} = \%bat_hash; @xrt_hash{@xrt_ids} = (1) x @xrt_ids; $sci_ids{'xrt'} = \%xrt_hash; @uvot_hash{@uvot_ids} = (1) x @uvot_ids; $sci_ids{'uvot'} = \%uvot_hash; $sci_ids{'swift'} = \%swift_hash; } sub new { my $proto=shift; my $self=$proto->SUPER::new(); return $self; } ############################################################################## # Extract the HK data ############################################################################## sub hk_extract { my $self=shift; my $inst=shift; my $log =$self->log(); my $filename=$self->filename(); my $procpar =$self->procpar(); my $jobpar =$self->jobpar(); $log->entry("Converting $inst HK to FITS"); my $veto = $sci_ids{$inst}; my $fthedit = Util::HEAdas->new('fthedit'); my $ftcopy = Util::HEAdas->new('ftcopy'); ################################## # set up to run the unpacket tool ################################## my $base = $filename->mission() . $filename->sequence(); my $bin = $procpar->read('fitspackets'); my $unpacket = Util::Tool->new($bin,'unpacket'); my $config = $procpar->read('packets_config'); my $telem; foreach $telem ($filename->get('telemetry', $inst, '*', '*') ) { ############################################### # skip APIDs which are converted by swift2fits ############################################### my ($inst, $mode, $apid) = $filename->parse($telem, 'telemetry'); next if $veto->{$apid}; ################################ # do the conversion ################################ $log->entry("converting $telem to FITS"); $unpacket->command_line("-infile $telem", '-apid_list /aps/lists/swift_apids.list', "-config_dir $config", '-prefix SwiftAPID', '-digits 4', '-suffix .db', "-base $base", "-instrument $inst", '-ext hk'); $unpacket->run(); if( $unpacket->had_error() ){ foreach my $hk ($filename->get('hk', $inst, sprintf('%x',$apid).'*', '*') ) { $log->entry("Deleting $hk because there was an error in unpacket"); unlink $hk; } next; } ########################################################## # Convert some of the hk data into a more meaningful form ########################################################## my $apid_string = sprintf('%04d', $apid); my $headmod = "$config/SwiftAPID${apid_string}.head"; my $calcmod = "$config/SwiftAPID${apid_string}.calc"; foreach my $hk ($filename->get('hk', $inst, sprintf('%03x',$apid).'*', '*') ){ if(-f $headmod){ $fthedit->params({infile => $hk, keyword => "\@$headmod"}) ->run(); } if(-f $calcmod){ $ftcopy->params({infile => "${hk}\[col \@'$calcmod'\]", outfile => 'convert.tmp'}); rename 'convert.tmp', $hk; } } } } # end of extract_hk method sub hk_combine { my $self=shift; my $inst=shift; my $log =$self->log(); my $filename=$self->filename(); my $procpar =$self->procpar(); my $jobpar =$self->jobpar(); my $eng_file; if($inst eq 'swift'){ $eng_file = $filename->get('scenhk', $inst, '', 0); }else{ $eng_file = $filename->get('enhk', $inst, '', 0); } my @hkfiles = $filename->get('hk', $inst, '[a-f0-9][a-f0-9][a-f0-9]x[0-9][0-9][0-9]', 0); $self->fits_combine($eng_file, @hkfiles) if @hkfiles; } sub fits_combine { my $self=shift; my $outfile=shift; my @infiles=@_; my $log =$self->log(); my $filename=$self->filename(); my $procpar =$self->procpar(); my $jobpar =$self->jobpar(); Util::Ftool->new('fextract') ->params({infile => $infiles[0] . '[0]', outfile => $outfile . '[0]'}) ->run(); my $append = Util::Ftool->new('fappend'); foreach my $infile (sort @infiles){ my @parse = $filename->parse($infile, 'hk'); my $hkfits = Util::FITSfile->new($infile); ############################### # Delete empty TUNIT keywords ############################### my %keywords = $hkfits->keywords(); $hkfits->begin_many_keywords(); $hkfits->keyword('EXTNAME', 'hk' . $parse[1]); foreach my $key (grep /^TUNIT/, keys %keywords){ if( $keywords{$key} =~ /^'?\s*'?$/ ){ $hkfits->keyword("-$key", ' '); } } $hkfits->end_many_keywords(); $append->params({infile => $infile . '[1]', outfile => $outfile}) ->run(); } unlink @infiles; } 1;