#! /usr/bin/env perl

# $Id: detRawToFits 187 2007-05-02 04:36:57Z yamada $

#use lib '/home/yamada/prj/panstarrs/mops/src';

use warnings;
use strict;

use Getopt::Long;
use Pod::Usage;
use FileHandle;

use PS::MOPS::DET::table;
use PS::MOPS::DET::util;

my $help;
my $force = 0;
my $source_suffix = '.txt';
my $target_suffix = '.fits';
my $source_prefix = '';
my $target_prefix = '';

GetOptions(
	force => \$force,
    help => \$help,
	'source_prefix=s' => \$source_prefix,
	'source_suffix=s' => \$source_suffix,
	'prefix=s' => \$target_prefix,
	'suffix=s' => \$target_suffix,
) or pod2usage(2);                      # opts parse error
pod2usage(-verbose => 3) if $help;      # user asked for help

if ( $#ARGV < 0 ) {
	pod2usage(2);
	exit
}

#
# Read the field file, and store the value in a hash, using the
# column title as a key.
#

sub rdfield
{
}

#
# Open a detections file, and read the first line, which is expected to
# be a field description.
#

sub opendet
{
	my ( $fh, $detfile ) = @_;

	open($fh, $detfile) or die "Cannot open $detfile";

	my $line = <$fh>;
	chomp $line;
	my ($field_id, $epoch_mjd, $ra_deg, $dec_deg, $survey_mode, $time_start,
		$time_stop, $filter_id, $limiting_mag, $ra_sigma_deg, $dec_sigma_deg,
		$obscode, $de1, $de2, $de3, $de4, $de5, $de6, $de7, $de8, $de9, $de10,
		$ocnum, $status) = split(/\s+/, $line);

	return (
		field_id => $field_id, 
		epoch_mjd => $epoch_mjd, 
		ra_deg => $ra_deg, 
		dec_deg => $dec_deg, 
		survey_mode => $survey_mode, 
		time_start => $time_start,
		time_stop => $time_stop, 
		filter_id => $filter_id, 
		limiting_mag => $limiting_mag, 
		ra_sigma_deg => $ra_sigma_deg, 
		dec_sigma_deg => $dec_sigma_deg,
		obscode => $obscode, 
		de1 => $de1, 
		de2 => $de2, 
		de3 => $de3, 
		de4 => $de4, 
		de5 => $de5, 
		de6 => $de6, 
		de7 => $de7, 
		de8 => $de8, 
		de9 => $de9, 
		de10 => $de10,
		ocnum => $ocnum, 
		status => $status);
}

#
# Read a single line from a detections file, and return an array of
# values.
#

sub rddet
{
	my ( $fh ) = @_;

	my $input_line = <$fh>;
	unless (defined $input_line) {
		return;
	}

	chomp $input_line;
	my ($det_id, $field_id, $ra_deg, $dec_deg, $epoch_mjd, $mag, $ref_mag, 
		$flux, $filter, $s2n, $ra_sigma_deg, $dec_sigma_deg, $mag_sigma,
		$flux_sigma, $orient_deg, $orient_sigma_deg,
		$length_deg, $length_sigma_deg,
		$object_name, $obscode, $is_synthetic,
		$status) = split(/\s+/, $input_line);

	return (
		det_id => $det_id,
		field_id => $field_id,
		ra_deg => $ra_deg,
		dec_deg => $dec_deg,
		epoch_mjd => $epoch_mjd,
		mag => $mag,
		ref_mag => $ref_mag,
		flux => $flux,
		filter => $filter,
		s2n => $s2n,
		ra_sigma_deg => $ra_sigma_deg,
		dec_sigma_deg => $dec_sigma_deg,
		flux_sigma => $flux_sigma,
		orient_deg => $orient_deg,
		orient_sigma_deg => $orient_sigma_deg,
		length_deg => $length_deg,
		length_sigma_deg => $length_sigma_deg,
		object_name => $object_name,
		obscode => $obscode,
		is_synthetic => $is_synthetic,
		status => $status,
	);
}

#
# Close a detections file.
#

sub closedet
{
	my ( $fh ) = @_;

	close($fh);
}

sub process
{
	my ( $src, $dest ) = @_;

	#
	# Read the field file.
	#

	print "$src => $dest\n";

	my $fh = new FileHandle;

	my %field = opendet($fh, $src);

	my $p = new PS::MOPS::DET::table;

	#
	# Create the output file header, using the field file.
	#

	$p->createfile($dest, $force,
		'FPA_ID' => $field{'field_id'},
		'MJD-OBS' => ($field{'time_start'} + $field{'time_stop'}) / 2.0, 
		'RA' => PS::MOPS::DET::util::DDtoHMS($field{'ra_deg'}),
		'DEC' => PS::MOPS::DET::util::DDtoDMS($field{'dec_deg'}),
		'EXPTIME' => $field{'time_stop'} - $field{'time_start'},
		'ROTANGLE' => 0.0,
		'FILTER' => $field{'filter_id'},
		'STARPSF' => 0.0,
		'LIMITMAG' => $field{'limiting_mag'},
		'DE1' => $field{'de1'},
		'DE2' => $field{'de2'},
		'DE3' => $field{'de3'},
		'DE4' => $field{'de4'},
		'DE5' => $field{'de5'},
		'DE6' => $field{'de6'},
		'DE7' => $field{'de7'},
		'DE8' => $field{'de8'},
		'DE9' => $field{'de9'},
		'DE10' => $field{'de10'},
		'OBSCODE' => $field{'obscode'},
		'TEL_ALT' => 0.0,
		'TEL_AZ' => 0.0);

	#
	# Iterate through the detections file, and store the values in the
	# output file.
	#

	while ((my %det = rddet($fh))) {
		$p->writerecord(($det{'ra_deg'}, $det{'dec_deg'}, $det{'ra_sigma_deg'},
			$det{'dec_sigma_deg'}, $det{'flux'}, $det{'flux_sigma'},
			$det{'orient_deg'}, $det{'orient_sigma_deg'},
			$det{'length_deg'}, $det{'length_sigma_deg'}));
	}

	#
	# Close the input and output files.
	#

	closedet($fh);

	$p->closefile();
}

for my $detfile (@ARGV) {
	my $fitsfile = $detfile;

	$fitsfile =~ s/^$source_prefix/$target_prefix/;
	$fitsfile =~ s/$source_suffix$/$target_suffix/;

	process($detfile, $fitsfile);
}

__END__

=head1 NAME

rawToDetectionsFile - Convert text detections file to FITS format

=head1 SYNOPSIS

rawToDetectionsFile RAWFILE [RAWFILE [...]]

=head1 OPTIONS

=over 4

=item --force

Overwrite existing files.

=item --prefix=PREFIX

Used to generate the output file name from an input file name.  The
prefix is prepended to the file name.  The default value is an empty
string.

=item --source_prefix=SOURCEPREFIX

Used to generate the output file name from an input file name.  The
source prefix is removed from the input file name.  The default value
is an empty string.
 
=item --suffix=SUFFIX

Used to generate the output file name from an input file name.  The
suffix is appended to the file name.  The default value is ".fits".

=item --source_suffix=SOURCE_SUFFIX

Used to generate the output file name from an input file name.  The
source suffix is removed from the input file name.  The default value
is ".txt".

=back

=head1 ARGUMENTS

=over 4

=item RAWFILE

Input data file.

=item FITSFILE

Output fits file.

=back

=head1 DESCRIPTION

Convert a raw text description of a detection file (as generated by
createFalseRaw) and convert it to a FITS table file, appropriate for
submitting to the data store.

=head1 ENVIRONMENT VARIABLES

=head1 TO DO

=head1 BUGS

=cut
