Subs::XrtEvents (version 0.0)


package Subs::XrtEvents;
##############################################################################
#
# DESCRIPTION: This subroutine runs the XRT tools delivered in build 1
#
# HISTORY: 
# HISTORY: $Log: XrtEvents.pm,v $
# HISTORY: Revision 1.37  2011/01/20 18:52:43  apsop
# HISTORY: Added code to get ra and dec for source GRB in the same way as done
# HISTORY: in other place.
# HISTORY: Added code to use UVOT attitude file if available
# HISTORY:
# HISTORY: Revision 1.36  2007/09/11 17:56:32  apsop
# HISTORY: Add xrtpcbias task, and update parameters for build 21.1.
# HISTORY:
# HISTORY: Revision 1.35  2007/01/31 16:46:33  apsop
# HISTORY: Change to xrtwtcorr parameters.
# HISTORY:
# HISTORY: Revision 1.34  2006/10/06 18:15:14  apsop
# HISTORY: Update keywords in header file after running xrthkproc.
# HISTORY:
# HISTORY: Revision 1.33  2006/09/25 13:30:57  apsop
# HISTORY: Remove code for xrthkproc workaround.
# HISTORY:
# HISTORY: Revision 1.32  2006/09/20 20:35:32  apsop
# HISTORY: Temporary fix, which removes manual mode zero rows from the xrt header file before processing.
# HISTORY:
# HISTORY: Revision 1.31  2006/07/03 19:33:20  apsop
# HISTORY: Delete reconstructed event files if they are empty after filtering.
# HISTORY:
# HISTORY: Revision 1.30  2006/05/17 19:07:55  apsop
# HISTORY: Fix up creation of uf ufre event files for wt mode.
# HISTORY:
# HISTORY: Revision 1.29  2006/05/10 15:16:31  apsop
# HISTORY: Change transition from unfiltered to reconstructed event list in a window timing mode.
# HISTORY:
# HISTORY: Revision 1.28  2006/04/26 20:44:21  apsop
# HISTORY: Change ordering of when xrtflagpix is called. Trap case where 
# HISTORY: EVTPHA column does not exist in lt and wt files.
# HISTORY:
# HISTORY: Revision 1.27  2005/11/08 20:08:37  apsop
# HISTORY: Add in xrtwtcorr task, and update a couple of parameters.
# HISTORY:
# HISTORY: Revision 1.25  2005/10/04 13:35:27  apsop
# HISTORY: Pass XRT housekeeping trailer packets to xrttimetag.
# HISTORY:
# HISTORY: Revision 1.24  2005/05/26 13:00:06  apsop
# HISTORY: Param change for xrtpdcorr due to new version of xrt2fits.
# HISTORY:
# HISTORY: Revision 1.23  2005/05/02 13:49:34  apsop
# HISTORY: Fix bug in name of column that is deleted from reconstructed files (EVTPHA).
# HISTORY:
# HISTORY: Revision 1.22  2005/04/29 20:33:04  apsop
# HISTORY: Bug fixes for previous version in use of pifile.tmp.
# HISTORY:
# HISTORY: Revision 1.21  2005/04/29 15:52:00  apsop
# HISTORY: Several parameter changes.  Remove EVPHA columns after processing.
# HISTORY:
# HISTORY: Revision 1.20  2005/04/19 15:10:10  apsop
# HISTORY: Changes for build14 tasks, many now use header file. Stop if not header file.
# HISTORY:
# HISTORY: Revision 1.19  2005/04/06 15:46:19  apsop
# HISTORY: Change to using CALDB for cal parameters.
# HISTORY:
# HISTORY: Revision 1.18  2005/02/25 20:29:40  apsop
# HISTORY: Explicitly set method parameter in xrtpdcorr to SG.
# HISTORY:
# HISTORY: Revision 1.17  2004/11/16 15:32:09  apsop
# HISTORY: Changes to fix handling of window timing events.
# HISTORY:
# HISTORY: Revision 1.16  2004/11/09 23:54:56  apsop
# HISTORY: Rework order of tasks to make proper split between level 1 and level1a.
# HISTORY:
# HISTORY: Revision 1.15  2004/11/02 21:25:16  apsop
# HISTORY: Rearrange calling sequence and production of level 1a files.
# HISTORY:
# HISTORY: Revision 1.14  2004/08/30 13:18:37  apsop
# HISTORY: Changes for build 9.  NONE does not work, rearrangement for bias info.
# HISTORY:
# HISTORY: Revision 1.13  2004/07/23 16:04:13  apsop
# HISTORY: Fix stupid bug in _fetching_ attitude file. Should be _getting_.
# HISTORY:
# HISTORY: Revision 1.12  2004/07/19 16:04:55  apsop
# HISTORY: Fix bug in using fetch_cal() instead of fetch() to get attitude file.
# HISTORY:
# HISTORY: Revision 1.11  2004/07/11 20:43:51  apsop
# HISTORY: Turn chatter down on timetag and hkproc in order to reduce output to reasonable level.
# HISTORY:
# HISTORY: Revision 1.10  2004/06/29 14:35:33  apsop
# HISTORY: Substantial changes to support build 8.
# HISTORY:
# HISTORY: Revision 1.9  2004/05/06 20:02:34  dah
# HISTORY: Add version number back into the header comments.
# HISTORY:
# HISTORY: Revision 1.8  2004/05/04 16:31:47  dah
# HISTORY: Test for presence of header file before processing it.
# HISTORY:
# HISTORY: Revision 1.7  2004/04/28 13:56:43  dah
# HISTORY: Save reconstructed event lists in seperate files.  Change order in which xrtpdcorr 
# HISTORY: is called.  Fix bug in calling xrthkproc.
# HISTORY:
# HISTORY: Revision 1.6  2004/04/16 20:21:18  dah
# HISTORY: Begin using embedded history records
# HISTORY:
#
# VERSION: 0.0
#
#
##############################################################################


use Subs::Sub;
use Util::SwiftTags;

@ISA = ("Subs::Sub");
use strict;

sub new {
    my $proto=shift;
    my $self=$proto->SUPER::new();

    $self->{DESCRIPTION}="Running XRT tasks for event list processing";

    return $self;
}

##################
# METHODS:
##################

sub body {
    my $self=shift;

    my $log     =$self->log();
    my $filename=$self->filename();
    my $procpar =$self->procpar();
    my $jobpar  =$self->jobpar();


    my ($srcra, $srcdec) = $self->Subs::XrtProducts::GetRaDec();


    if (!defined $srcra or !defined $srcdec) {
      $log->error(1, "Unable to XrtEvents since coordinates are not fully defined");
      return;
    }

    ####################################
    # Get lists of event types
    ####################################
    my @phot = $filename->get('unfiltered', 'x', 'pc*', '*');
    my @diod = ($filename->get('unfiltered', 'x', 'lr*', '*'), 
		$filename->get('unfiltered', 'x', 'pu*', '*'));
    my @wind = $filename->get('unfiltered', 'x', 'wt*', '*');

    my (@wind1a, @diod1a);

    #####################################
    # get bad pixel table and teldef file
    #####################################
    my $attitude = $filename->get('attcorr', 'u');

    if (! -e $attitude) {
      $log->error(1, "$attitude UVOT attitude file not exist, trying pat file");
      $attitude = $filename->get('attcorr', 'p');
      if(! -e $attitude) {
	$log->error(1, "$attitude UVOT attitude file not exist, trying sat file");
	$attitude = $filename->get('attitude', 's');
	if(! -e $attitude) {
	  $log->error(1, "Unable to find attitude file");
	  return;
	}
      }
    }

    my $filter = $filename->get('filter', 's');

    #############################
    # xrthkproc
    #############################
    my $head = $filename->get('hk', 'x', 'hd', '*');
    my $trailer = $filename->get('hk', 'x', 'tr', '*');


    unless(-f $head){
      $log->error([ 1, XRT_NO_HDFILE ], "Unable to find xrt header file $head, cannot continue.");
      return;
    }

    unless(-f $trailer){
      $log->error([ 1, XRT_NO_HDFILE ], "Unable to find XRT trailer file $trailer, cannot continue.");
      return;
    }
    #############################################
    # First we have to fix up the hk header file
    #############################################
    my $xrthkproc = Util::HEAdas->new('xrthkproc');

    $log->entry("Running ".$xrthkproc->name()." on $head");
    $xrthkproc->params({hdfile   => $head,
			outfile  => 'hkout.tmp',
			attfile  => $attitude,
			srcdetx  => 300,
			srcdety  => 300,
			srcra    => $srcra,
			srcdec   => $srcdec,
			ranom    => $jobpar->read('ra'),
			decnom   => $jobpar->read('dec'),
			teldef   => 'CALDB',
			chatter  => 3,
			clobber  => 'yes',
			history  => 'yes'})
	         ->run();

    unless( $xrthkproc->had_error() ){
      unlink $head;
      rename 'hkout.tmp', $head;
    }

    #######################
    # update time keywords
    #######################
    my $head_fits =  Util::FITSfile->new($head);
    my $start = $head_fits->keyword('TSTART');
    my $stop  = $head_fits->keyword('TSTOP');
    my $start_date = Util::Date->new($start);
    my $stop_date  = Util::Date->new($stop);
    $head_fits->keyword('DATE-OBS', $start_date->date().'T'.$start_date->time() );
    $head_fits->keyword('DATE-END', $stop_date->date().'T'.$stop_date->time() );
    
    $head_fits->ext(0);
    $head_fits->keyword('DATE-OBS', $start_date->date().'T'.$start_date->time() );
    $head_fits->keyword('DATE-END', $stop_date->date().'T'.$stop_date->time() );
    $head_fits->keyword('TSTART', $start);
    $head_fits->keyword('TSTOP', $stop);

    #############
    # xrttimetag
    #############
    my $timetag = Util::HEAdas->new('xrttimetag');
    my $timefile = 'timefile.tmp';
    $timetag->params({outfile   => $timefile,
		      hdfile    => $head,
		      trfile    => $trailer,
		      usehkkey  => 'no',
		      attfile   => $attitude,
		      usesrcdet => 'no',
		      srcra     => $srcra,
		      srcdec    => $srcdec,
		      ranom     => $jobpar->read('ra'),
		      decnom    => $jobpar->read('dec'),
		      teldef    => 'CALDB',
		      colfile   => 'CALDB',
		      chatter   => 3,
                      clobber   => 'yes',
                      history   => 'yes'});

    my $unf;
    foreach $unf (@wind){
        $log->entry("Running ".$timetag->name()." on $unf");

        $timetag->params({infile => $unf})
                ->run();

	unless($timetag->had_error()) {
	  unlink $unf;
	  rename $timefile, $unf;
	}
    }

    foreach $unf (@diod){
        $log->entry("Running ".$timetag->name()." on $unf");

        $timetag->params({infile => $unf})
                ->run();

	if ($timetag->had_error()) {
	  unlink($timefile);
	}
	else {
	  unlink $unf;
	  rename $timefile, $unf;

	  #############################
	  # Filter using generated GTI
	  #############################
	  my $difile = $filename->corresponding('unfiltered', 'reconst', $unf);
	  my $fits = Util::FITSfile->new($unf, 'EVENTS', '[gtifilter()]');
	  $fits->copy($difile);
	  my $new_fits = Util::FITSfile->new($difile, 'EVENTS');
	  if( $new_fits->keyword('NAXIS2') > 0 ){
	    push @diod1a, $difile;
	  }else{
	    $log->entry("File $difile is empty. Deleting.");
	    unlink $difile;
	  }
	}
    }

    #############
    # xrtpcbias
    #############
    my $pcbias = Util::HEAdas->new('xrtpcbias');
    $pcbias->params({outfile  => 'biasfile.tmp',
		     teldef   => 'CALDB',
		     attfile  => $attitude,
		     mkffile  => $filter,
		     hdfile   => $head,
		     thrfile  => 'CALDB',
		     srcra    => $srcra,
		     srcdec   => $srcdec,
		     chatter  => 3,
		     clobber  => 'yes',
		     history  => 'yes'});

    foreach $unf (@phot){
        $log->entry("Running ".$pcbias->name()." on $unf");

        $pcbias->params({infile     => $unf})
               ->run();

	unless( $pcbias->had_error() ){
	  unlink $unf;
	  rename 'biasfile.tmp', $unf;
	}
    }

    #############
    # xrtflagpix
    #############
    my $flagpix = Util::HEAdas->new('xrtflagpix');
    $flagpix->params({outfile    => 'flagfile.tmp',
		      hdfile     => $head,
		      bpfile     => 'CALDB',
		      bptable    => 'CALDB',
		      srcfile    => 'CALDB',
		      thrfile    => 'CALDB',
		      phas1thr   => 80,
		      maxtemp    => 0,
                      userbpfile => 'NONE',
		      outbpfile  => 'NONE',
                      overstatus => 'yes',
                      chatter    => 3,
                      clobber    => 'yes',
                      history    => 'yes'});

    foreach $unf (@phot){
        $log->entry("Running ".$flagpix->name()." on $unf");

        $flagpix->params({infile     => $unf})
                ->run();

	unless( $flagpix->had_error() ){
	  unlink $unf;
	  rename 'flagfile.tmp', $unf;
	}
    }

    foreach $unf (@wind){
        $log->entry("Running ".$flagpix->name()." on $unf");

        $flagpix->params({infile     => $unf})
                ->run();

	if( $flagpix->had_error() ){
	  unlink 'flagfile.tmp';
	}else{
	  unlink $unf;
	  rename 'flagfile.tmp', $unf;
	  #############################
	  # Filter using generated GTI
	  #############################
	  my $wtfile = $filename->corresponding('unfiltered', 'reconst', $unf);
	  my $fits = Util::FITSfile->new($unf, 'EVENTS', '[gtifilter()]');
	  $fits->copy($wtfile);
	  my $new_fits = Util::FITSfile->new($wtfile, 'EVENTS');
	  if( $new_fits->keyword('NAXIS2') > 0 ){
	    push @wind1a, $wtfile;
	  }else{
	    $log->entry("File $wtfile is empty. Deleting.");
	    unlink $wtfile;
	  }
	}
    }

    ###############################
    # xrtwtcorr
    ###############################

    my $wtcorr = Util::HEAdas->new('xrtwtcorr');
    $wtcorr->params({outfile  => 'wtfile.tmp',
		     hdfile   => $head,
		     trfile   => $trailer,
		     colfile  => 'CALDB',
		     npixels  => 20,
		     biasth   => 200,
		     thrfile  => 'CALDB',
		     history  => 'yes',
		     nevents  => 20,
		     biasdiff => 2,
		     nframe   => 20,
		     biasmode => 'M20P',   
		     clobber  => 'yes',
		     chatter  => 5});

    foreach $unf (@wind1a) {
        $log->entry("Running ".$wtcorr->name()." on $unf");

        $wtcorr->params({infile => $unf})
	      ->run();

	unless( $wtcorr->had_error() ){
	  unlink $unf;
	  rename 'wtfile.tmp', $unf;
	}
    }

    ###############################
    # xrtpdcorr
    ###############################

    my $pdcorr = Util::HEAdas->new('xrtpdcorr');
    $pdcorr->params({outfile  => 'pdfile.tmp',
		     biasfile => 'CALDB',
		     thrfile  => 'CALDB',
		     hdfile   => $head,
		     method   => 'MN',
		     bias     => -1,
		     biasth   => 300,
		     biasdiff => 4095,
		     history  => 'yes',
		     clobber  => 'yes',
		     chatter  => 5});

    foreach $unf (@diod1a) {
        $log->entry("Running ".$pdcorr->name()." on $unf");

        $pdcorr->params({infile => $unf})
	      ->run();

	unless( $pdcorr->had_error() ){
	  unlink $unf;
	  rename 'pdfile.tmp', $unf;
	}
    }

    #############################
    # xrtevtrec
    #############################

    my $evtrec = Util::HEAdas->new('xrtevtrec');
    $evtrec->params({outfile => 'recfile.tmp',
		     hdfile => $head,
		     gradefile => 'CALDB',
		     thrfile   => 'CALDB',
		     addcol => 'no',
		     delnull => 'yes',
		     event => 80,
		     split => 80,
		     flagneigh => 'yes',
		     chatter => 5,
		     clobber => 'yes',
		     history => 'yes'});

    foreach $unf (@diod1a, @wind1a){
        $log->entry("Running ".$evtrec->name()." on $unf");
        $evtrec->params({infile => $unf})
	       ->run();

	unless( $evtrec->had_error() ){
	  unlink $unf;
	  rename 'recfile.tmp', $unf;
	}
    }

    ###############################
    # xrtpcgrade
    ###############################
    my $ph2br = Util::HEAdas->new('xrtpcgrade');
    $ph2br->params({outfile => 'gradefile.tmp',
		    hdfile => $head,
		    split   => 40,
		    gradefile => 'CALDB',
		    thrfile   => 'CALDB',
		    ascagrade => 'no',
                    history => 'yes',
                    clobber => 'yes',
                    chatter => 5    });

    foreach $unf (@phot) {
        $log->entry("Running ".$ph2br->name()." on $unf");
      
        $ph2br->params({infile => $unf})
	      ->run();

	unless( $ph2br->had_error() ){
	  unlink $unf;
	  rename 'gradefile.tmp', $unf;
	}
    }

    ###############################
    # xrthotpix
    ###############################
    my $hotpix = Util::HEAdas->new('xrthotpix');
    $hotpix->params({outfile => 'pixfile.tmp',
		     outbpfile => 'NONE',
		     phamax => 4095,
		     iterate => 'yes',
		     gradeiterate => 'yes',
		     overstatus => 'yes',
		     cellsize => 3,
		     hotneigh => 'no',
		     history => 'yes',
		     clobber => 'yes',
		     chatter => 5});

    foreach $unf (@phot) {
        $log->entry("Running ".$hotpix->name()." on $unf");

        $hotpix->params({infile => $unf})
	       ->run();

	unless( $hotpix->had_error() ){
	  unlink $unf;
	  rename 'pixfile.tmp', $unf;	
	}
    }

    ####################################
    # set up xrtcalcpi
    ####################################
    my $pha2pi = Util::HEAdas->new('xrtcalcpi');
    $pha2pi->params({outfile => 'pifile.tmp',
		     hdfile => $head,
		     gainfile => 'CALDB',
                     gainnom  => -99.0, # uses default from cal file
                     offset   => 0.0,
                     randomflag => 'yes',
                     seed     => -1457,
                     chatter  => 2,
                     clobber  => 'yes',
                     history  => 'yes' });

    foreach $unf (@phot) {
        my ($inst, $mode, $index) = $filename->parse($unf, 'unfiltered');

        $log->entry("Running ".$pha2pi->name()." on $unf");

        $pha2pi->params({infile  => $unf})
               ->run();

	unless( $pha2pi->had_error() ){
	  unlink $unf;
	  rename 'pifile.tmp', $unf;
	}
    }

    foreach $unf (@wind1a, @diod1a) {
        my ($inst, $mode, $index) = $filename->parse($unf, 'reconst');

        $log->entry("Running ".$pha2pi->name()." on $unf");

        $pha2pi->params({infile  => $unf})
               ->run();

	unless( $pha2pi->had_error() ){
	  unlink $unf;
	  my $copy = Util::HEAdas->new('ftcopy')
	                         ->params({infile => 'pifile.tmp[EVENTS][col -EVTPHA]',
					   outfile => $unf});
	  $copy->seriousness(1);
	  $copy->run();
	  if( $copy->had_error() ){
	    rename 'pifile.tmp', $unf;
	  }else{ 
	    unlink 'pifile.tmp';
	  }
	}
    }

} # end of body method



1;