package Subs::XRTReport; ############################################################################## # # DESCRIPTION: This creates an HTML report of XRT exposures. It is largely # DESCRIPTION: a translation of the FITS head/tail HK files. # # HISTORY: # HISTORY: $Log: XRTReport.pm,v $ # HISTORY: Revision 1.20 2008/06/24 13:12:52 apsop # HISTORY: Removed good attitude calculation due to time constraints. # HISTORY: # HISTORY: Revision 1.19 2008/05/15 19:39:17 apsop # HISTORY: Add column for good attitude fraction. Use GTIfile method for summing exposures. # HISTORY: # HISTORY: Revision 1.18 2006/09/28 18:33:06 apsop # HISTORY: Fix bug in determining image exposure time, was always being set to zero. # HISTORY: # HISTORY: Revision 1.17 2006/04/26 20:45:59 apsop # HISTORY: Allow for either INDEF or NULL values returned from FITSfile class. # HISTORY: # HISTORY: Revision 1.16 2006/01/04 18:40:02 apsop # HISTORY: Remove attempt to combine exposures, as it was screwing up the image exposure values. # HISTORY: # HISTORY: Revision 1.15 2005/11/17 14:16:47 apsop # HISTORY: Test for presence of on-target GTI when calculating exposure. # HISTORY: # HISTORY: Revision 1.14 2005/11/08 20:06:05 apsop # HISTORY: <Previous comment bogus>Deal with undefined mode value. # HISTORY: # HISTORY: Revision 1.13 2005/11/08 19:22:28 apsop # HISTORY: Populate the TIMELIST and DATALIST hashes. Used to be an SWCheckInput. # HISTORY: # HISTORY: Revision 1.12 2005/09/19 13:33:56 apsop # HISTORY: Only count on-target time when calculating exposure for cleaned event lists. # HISTORY: # HISTORY: Revision 1.11 2005/03/09 16:44:49 apsop # HISTORY: Fix bug in test for INDEF value. # HISTORY: # HISTORY: Revision 1.10 2005/03/07 22:43:56 apsop # HISTORY: Changes to deal with UNDEF values in the input fits files. # HISTORY: # HISTORY: Revision 1.9 2004/10/12 16:24:02 apsop # HISTORY: Calculate unfiltered exposures using summed GTIs # HISTORY: # HISTORY: Revision 1.8 2004/09/05 19:06:21 apsop # HISTORY: Make sure that exposure param values always get initialize to zero. # HISTORY: # HISTORY: Revision 1.7 2004/09/01 14:34:57 apsop # HISTORY: Split up accumulation of lr and pu exposure times. # HISTORY: # HISTORY: Revision 1.6 2004/08/13 14:27:06 apsop # HISTORY: Update Report modules to record exposure information in job.par file. # 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/16 20:21:18 dah # HISTORY: Begin using embedded history records # HISTORY: # # VERSION: 0.0 # # ############################################################################## use Subs::SwiftSub; use Subs::HTMLPage; use Util::GTIfile; @ISA = ("Subs::HTMLPage"); use strict; sub new { my $proto=shift; my $file=$proto->filename()->get("report", "xrt"); my $seq = $proto->jobpar()->read('sequence') .".". $proto->jobpar()->read('seqprocnum'); my $self=$proto->SUPER::new($file, "XRT Exposure Report for $seq"); $self->{DESCRIPTION}="Making XRT HTML Exposure Report"; return $self; } ################## # METHODS: ################## ############################################################################## # ############################################################################## sub mode_name { my $self = shift; my $num = shift; if( $num && $num !~ /(INDEF|NULL)/ ){ if( $num == 1) { return "Null"; } elsif($num == 2) { return "Short Image"; } elsif($num == 3) { return "Long Image"; } elsif($num == 4) { return "Piled Up Photodiode"; } elsif($num == 5) { return "Low Rate Photodiode"; } elsif($num == 6) { return "Windowed Timing"; } elsif($num == 7) { return "PhotonCounting"; } elsif($num == 8) { return "Raw Data"; } elsif($num == 9) { return "Bias Map"; } elsif($num == 10) { return "Stop"; } } return "Unknown"; } ############################################################################## # ############################################################################## sub data_key { my $self = shift; my $key = join "|", (@_); $key =~ s/ //g; return $key; } ############################################################################## # ############################################################################## sub body { my $self=shift; my $log =$self->log(); my $filename=$self->filename(); my $procpar =$self->procpar(); my $jobpar =$self->jobpar(); ####################################### # get the exposure report file ####################################### my ($image_expo, $lr_expo, $pu_expo, $pc_expo, $wt_expo) = (0, 0, 0, 0, 0); my ($pu_evt_expo, $lr_evt_expo, $pc_evt_expo, $wt_evt_expo) = (0, 0, 0, 0); my $head_name = $filename->get("hk", "x", "hd", "*"); if ( ! -f $head_name ) { $log->entry("No XRT exposure header FITS file $head_name"); }else{ ######################################## # read the FITS file ######################################## my $head = Util::FITSfile->new($head_name,1); if ( $head->nhdus() <= 1 ){ $log->entry("XRT exposure header FITS file $head_name has no extensions"); } my @start = $head->cols( "TIME")->table(); my @stop = $head->cols("ENDTIME")->table(); my @mode = $head->cols("XRTMode")->table(); ######################### # write the HTML table ######################### $self->begin_table("Start Time", "duration", "Mode"); #^^^^ "Good Attitude Fraction"); my $nrows = $head->nrows(); for(my $i=0; $i<$nrows; $i++) { my $old_data = $self->data_key($mode[$i]); my $start = $start[$i]; #^^^^ my $good_att; my $duration = $stop[$i]; if( $duration =~ /(INDEF|NULL)/ || $start =~ /(INDEF|NULL)/ ){ $duration = 0; }else{ $duration -= $start; #^^^^ $good_att = Subs::SwiftSub::good_attitude_fraction($self, $start, $stop[$i]); } $self->table_row( $start !~ /(INDEF|NULL)/ ? $start : sprintf("%.14g", $start), sprintf("%.1f s", $duration ), $self->mode_name($mode[$i])); #^^^^ defined($good_att) ? sprintf("%.2f", $good_att) : 'n/a' ); $image_expo += $duration if($mode[$i] && $mode[$i] !~ /(INDEF|NULL)/ && ($mode[$i]==2 || $mode[$i]==3)); } $self->end_table(); my $tmpgti = 'otgti.tmp'; unlink $tmpgti; my $ontarget = $filename->get('gti', 's', 'ot', 0); my $merge = Util::Ftool->new('mgtime') ->params({merge => 'AND', outgti => $tmpgti}); foreach my $file ($filename->get("unfiltered", "xrt", "*", "*")) { my $mode = ($filename->parse($file, 'unfiltered'))[1]; my $gtifits; if( -f $ontarget ){ $merge->params({ingtis => "$ontarget $file\[GTI\]"}) ->run(); $gtifits = Util::GTIfile->new($tmpgti); }else{ $gtifits = Util::GTIfile->new($file); } my $expo_unf = $gtifits->sum(); unlink $tmpgti if -f $tmpgti; $pu_expo += $expo_unf if $mode=~/^pu/; $lr_expo += $expo_unf if $mode=~/^lr/; $pc_expo += $expo_unf if $mode=~/^pc/; $wt_expo += $expo_unf if $mode=~/^wt/; } foreach my $file ($filename->get("event", "xrt", "*", "*")) { my $mode = ($filename->parse($file, 'event'))[1]; my $gtifits; if( -f $ontarget ){ $merge->params({ingtis => "$ontarget $file\[GTI\]"}) ->run(); $gtifits = Util::GTIfile->new($tmpgti); }else{ $gtifits = Util::GTIfile->new($file); } my $expo_evt = $gtifits->sum(); unlink $tmpgti if -f $tmpgti; $pu_evt_expo += $expo_evt if $mode=~/^pu/; $lr_evt_expo += $expo_evt if $mode=~/^lr/; $pc_evt_expo += $expo_evt if $mode=~/^pc/; $wt_evt_expo += $expo_evt if $mode=~/^wt/; } } $jobpar->set({xrt_image => sprintf('%.03f', $image_expo), xrt_unf_piledup => sprintf('%.03f', $pu_expo), xrt_unf_lowrate => sprintf('%.03f', $lr_expo), xrt_unf_windowed => sprintf('%.03f', $wt_expo), xrt_unf_photon => sprintf('%.03f', $pc_expo), xrt_evt_piledup => sprintf('%.03f', $pu_evt_expo), xrt_evt_lowrate => sprintf('%.03f', $lr_evt_expo), xrt_evt_windowed => sprintf('%.03f', $wt_evt_expo), xrt_evt_photon => sprintf('%.03f', $pc_evt_expo) }); } # end of body method