Download

package RGSMakeFluxed;
use strict;
use English;
use Carp;
use vars
  qw(@ISA $VERSION $name $author $date $version @instList $numberOfStreams);
@ISA = qw(Module);
use ModuleResources;
use ModuleUtil;

$name    = __PACKAGE__;
$VERSION = '1.18';
$version = $VERSION;
$author  = 'Ian Stewart,Duncan John Fyfe,Ed Chapin';
$date    = '2013-12-05';

#
# ChangeLog
# =========
#
# version 1.18 - 2013-12-05 EC
# ------------
#
# Set tryspectrumgrid=no in rgsfluxer call
#
# version 1.12 - 2007-02-28 DJF
# ------------
#
# Change rgsfluxer back to 1000 bins.
#
# version 1.11 - 2007-01-17 DJF
# ------------
#
# Change rgsfluxer bins back to default 3400.
# Remove use of instrument number in the order field.  The degenerate namespace this resolved has been removed in rgssources.
# Explicitly use order 1.
#
# version 1.10 - 2007-01-05 DJF
# ------------
#
# Change instList from ('obs') to ('all').  ('obs') is a special case.
#
# version 1.09 - 2006-08-15 DJF
# ------------
#
# + Make fluxed plot X axis start at 0
#
# version 1.08 - 2006-07-28 DJF
# ------------
#
# + Changed title and axis lables for fluxed spectrum plot ala andy Pollocks suggestions.
# + Fluxed spectrum title now in mixed case.
#
# version 1.07 - 2006-07-13 DJF
# ------------
#
# + Change rgsfluxer bins from default 3400 to 1000.
#
# version 1.06 - 2006-02-02 DJF
# ------------
#
# + Rgd order added to PDF filenames.
#
# version 1.05 - 2005-12-01 IMS
# ------------
# + Added a test for the existence of the source list.
#
# version 1.04 - 2005-11-25 IMS
# ------------
# + The instrument for the fluxed spectrum output files is now 'rgs'. (Product file names had been without any instrument field and thus too short.)
#
# version 1.03 - 2005-11-24 IMS
# ------------
# + Added label to pdf fluxed spectrum.
#
# version 1.02 - 2005-11-24 IMS
# ------------
# + Shortened a few intermediate content strings - the 'device' file name was too long for fplot.
#
# version 1.01 - 2005-11-24 IMS
# ------------
# + Removed 'order' and 'rgsorder' from newFile calls in which the class is intermediate. These don't seem to be recognized arguments in this case.
#
# version 1.00 - 2005-11-23 IMS
# ------------
# + Now a PDF of the fluxed spectrum is also made.
# + Some source numbering of both the fits and the pdf product files is now done. This is tricky because the same source may have a different row number in the rgs1 source list to that in the rgs2. The scheme I have adopted is to use the row number from the rgs1 list if the source appears there, from the rgs2 list if not. Whether rgs 1 or 2 is indicated by the 'order' argument of newFile.
# + Added PStoPDF and writeASCIIFile to the list of subroutines of ModuleResources called.
#
# version 0.04 - 2005-11-22 IMS
# ------------
#
# + Added some prints to try to work out why it isn't running.
#
# version 0.03 - 2005-11-21 IMS
# ------------
#
# + Changed instrument from 'rgs' to 'obs' to try to get it to run!
#
# version 0.02 - 2005-11-14 IMS
# ------------
#
# + Task rgsfluxer now not called for a given source unless spectra/rmf lists (i) each contain at least 1 member; (ii) have the same number of members.
#
# version 0.01 - 2005-10-18 IMS
# ------------
#
# + Initial version.

# Declare instruments of interest
#@instList = qw(rgs);
@instList = qw(rgs);

# Number of Streams
sub numberOfStreams
{
    return 1;
}

# Rules evaluated to determine when this module can run.
sub evaluateRules
{

    # If upstream module has been ignored, so is this one

    if (allIgnored(module => 'RGSProducts'))
    {
return ignore();
#    } else {
    }

    if (allComplete(module => 'RGSProducts'))
    {
return start();
#    } else {
    }
}

# The guts of the module
sub performAction
{
    info("Module version number: $version");

	my $order = 1;
    my %collect = ();
    foreach my $inst ( "rgs2", "rgs1" )
    {
        foreach my $exp_id ( listExposures( instrument => $inst ) )
        {
            my $srcList = findFile( class => 'product'
                , instrument => $inst
                , exp_id => $exp_id
                , content => 'RGS source list'
            );

            if (!defined($srcList) || $srcList eq '' || !fileExists(file => $srcList))
            {
                info("Can't find $inst source list for expid $exp_id");
                next;
            }

			my %src_param = &ModuleUtil::get_rgssources_param( $srcList , 'SRCLIST' , $inst );

           # Cycle through the processed sources (proposal and pointing sources, which always occupy the first 2 rows of the rgs source list, are included unilaterally) and find all existing spectra for each source:
           foreach my $src ( sort ( keys %src_param ) )
           {
				my $src_num = $src_param{$src}{INDEX};
				my $src_label = $src_param{$src}{LABEL};
				my $srcSpecFile = findFile(
					class => 'product'
					, instrument => $inst
					, exp_id => $exp_id
					, src_num => $src_num
					, order => $order
					, rgsorder => $order
					, content => 'RGS SOURCE SPECTRUM'
				);
	### spectra must be paired with an appropriate rmf. However at present we are not making rmfs for order 2.
				my $ResponseMatrix = findFile(
					class => 'product'
					, instrument => $inst
					, exp_id => $exp_id
					, src_num => $src_num
					, order => $order
					, rgsorder => $order
					, content => "RGS RESPONSE MATRIX"
				);

				if ($srcSpecFile && $ResponseMatrix)
				{
					push @{ $collect{$src_label}{spectrum} } , $srcSpecFile;
					push @{ $collect{$src_label}{matrix} } , $ResponseMatrix ;
					$collect{$src_label}{src_num} ||= $src_num;
				}
            } # end loop over source list rows
        } # end loop over exposures
    } # end loop over instruments

	foreach my $group ( sort( keys( %collect ) ) )
	{
		&make_fluxed_spectrum( $collect{$group}{src_num} , $order , $collect{$group}{spectrum} , $collect{$group}{matrix} );
	}

    return success();
}

sub make_fluxed_spectrum
{
	my ( $src_num , $order , $spectra , $matrices ) = (@_);
	my $rtn = 1;
    # Now generate the fluxed spectrum for each source:
	my @allspectra  = @$spectra;
	my @allmatrices = @$matrices;

	if (!defined($allspectra[0]) || !defined($allmatrices[0]))
	{
		info("Empty list of spectra or RMFs");
		$rtn = 0;
	}
	elsif (@allspectra!=@allmatrices)
	{
		info("Different numbers in spectra and RMF lists");
		$rtn = 0;
	}

	if ($rtn)
	{
		my $fluxed = newFile(
			class => 'product'
			, instrument => 'rgs'
			, src_num => $src_num
			, order => $order
			, rgsorder => $order
			, content => 'RGS FLUXED SPECTRUM'
			, format => 'FITS'
		);
		doCommand(
			'rgsfluxer', file => $fluxed
			, pha => [@allspectra]
			, rmf => [@allmatrices]
                        , bins => 1000
                        , tryspectrumgrid => 'no'
		)
	  or return exception();

		my $tempFluxed = newFile(
			class => 'intermediate'
			, instrument => 'rgs'
			, src_num => $src_num
			, order => $order
			, rgsorder => $order
			, content => 'filt fluxed'
		);
		doCommand(
			'evselect'
			, table => "${fluxed}:FLUXED"
			, keepfilteroutput => 'yes'
			, withfilteredset => 'yes'
			, filteredset => $tempFluxed
			, writedss => 'no'
			, expression => '(CHANNEL in [5.98:38.02])&&(!isNull(FLUX))' # reccommended by Andy Pollock 22 Nov 05.
			, destruct => 'yes'
		  )
		  or return exception();

		my $fplotCommandFile = newFile(
			class => 'intermediate'
			, content => 'fluxed pco file'
			, format => 'ASCII'
		, extension => 'pco'
		);

		my $fname = $fluxed;
		$fname =~ s/\.FIT$|\.FTZ$//g;
		my $title = "Source $src_num RGS Fluxed Spectrum ($fname)";
		writeASCIIFile(
			name => $fplotCommandFile
			, text => [join("\n", "LA X Wavelength (Angstroms)"
				, 'LA Y Fluxed Counts (Photons/cm^2/s/Angstrom)'
				, "LA T $title"
				, 'RA X 0'
				, 'PLOT'
				, 'QUIT'
				, ''
			)]
		);
		my $fluxedPs = newFile(
			class => 'intermediate'
			, instrument => 'rgs'
			, src_num => $src_num
			, order => $order
			, rgsorder => $order
			, content => 'fluxed'
			, format => 'PS'
		);
		doCommand(
			'fplot'
			, infile => $tempFluxed
			, xparm => 'CHANNEL'
			, yparm => 'FLUX'
			, rows => '-'
			, device => "$fluxedPs/cps"
			, pltcmd => '@'."$fplotCommandFile"
		  )
		  or return exception();
		my $fluxedPdf = newFile(
			class => 'product'
			, instrument => 'rgs'
			, src_num => $src_num
			, order => $order
			, rgsorder => $order
			, content => 'RGS FLUXED SPECTRUM'
			, format => 'PDF'
		);
		PStoPDF(
			source => $fluxedPs
			, destination => $fluxedPdf
		)
		or return exception();
	}
	return $rtn;
}
1;