Index: trunk/pstamp/scripts/pstamp_finish.pl
===================================================================
--- trunk/pstamp/scripts/pstamp_finish.pl	(revision 19221)
+++ trunk/pstamp/scripts/pstamp_finish.pl	(revision 19265)
@@ -9,4 +9,5 @@
 use Pod::Usage qw( pod2usage );
 
+use Time::Local;
 use Sys::Hostname;
 use IPC::Cmd 0.36 qw( can_run run );
@@ -82,9 +83,20 @@
     }
 
-
-                        # this function is PStamp::RequestFile::read_request_file
+    if (! -e $req_file ) {
+        print STDERR "request file $req_file is missing\n";
+        stop_request($req_id, $PS_EXIT_CONFIG_ERROR, $dbname);
+        exit  $PS_EXIT_CONFIG_ERROR;
+    }
+
+    # this function is PStamp::RequestFile::read_request_file
     my ($header, $rows) = read_request_file($req_file);
 
-    die "failed to read request_file $req_file" if !$header or !$rows;
+    if (!$header or !$rows) {
+        # Since a request got queued, the request file must have been readable at some
+        # point 
+        print STDERR "failed to read request_file $req_file" 
+        stop_request($req_id, $PS_EXIT_CONFIG_ERROR, $dbname);
+        exit  $PS_EXIT_CONFIG_ERROR;
+    }
 
     # at this point we need to find out what kind of request type it is and
@@ -144,7 +156,13 @@
         my $rownum = $job->{rownum};
         my $fault = $job->{fault};
-
-        my $row_info = get_request_info($rows, $rownum);
-        # rownum fault img_name job_id
+        my $exp_id = $job->{exp_id};
+
+        # XXX: get the image_db from a table in the database, or maybe save it in the job
+        my $image_db = "ps_simtest";     
+        my $exp_info = get_exposure_info($image_db, $exp_id);
+
+        # unless $exp_id is null (e.g. stack images) get the metadata for this exposure
+        my ($row, $req_info) = get_request_info($rows, $rownum) if $exp_id;
+
         if (($job_type eq "stamp") || ($job_type eq "get_image")) {
             my $jreglist = "$out_dir/reglist$job_id";
@@ -158,18 +176,15 @@
                     my ($img_name, undef) = split '\|', $line;
 
-                    # XXX TODO: need to get these from somewhere. Maybe the stamp.
-                    #
-                    # ra_deg and dec_deg are the coordinates of center of the stamp
-                    # the rest of the metadata come from the original FPA.
-                    # we could get these out of the rawExp table in the database....
-                    #
-                    # Much of those data do not apply to stamps from Stack images.
-                    my ($ra_deg, $dec_deg, $mjd_obs, $ra_obs, $dec_obs, $filter, $exp_time, $fpa_id) =
-                        (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
-
                     # add line to the table definition file
                     print $tdf "$rownum|$fault|$img_name|$job_id|";
-                    print $tdf "$ra_deg|$dec_deg|$mjd_obs|$ra_obs|$dec_obs|$filter|$exp_time|$fpa_id|";
-                    print $tdf "$row_info";
+
+                    # ra_deg and dec_deg are the coordinates of center of the stamp
+                    #
+                    # XXX  we need to get the center coordinate of the stamp.
+                    # if request used -skycenter then we have it in the request info
+
+                    print $tdf "0.0|0.0|";
+                    print $tdf "$exp_info|";
+                    print $tdf "$req_info|";
                     print $tdf "\n";
                 }
@@ -178,8 +193,11 @@
                 print STDERR "no reglist file for job $job_id\n" if $verbose;
                 print $tdf "$rownum|$fault|0|$job_id|";
-                print $tdf "0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|\n";
+                print $tdf "0|0|";       # center of (non-existent) stamp
+                print $tdf "$exp_info|";
+                print $tdf "$req_info|";
             }
         } else {
             # XXX do list jobs
+            # we can probably arange things to use the code as above and skip the fileset registration
             print STDERR "Unknown jobType: $job_type";
             next;
@@ -226,4 +244,5 @@
     }
 }
+
 sub stop_request {
     my $req_id = shift;
@@ -252,6 +271,78 @@
     $rowinfo   .= "$row->{ID}|$row->{CLASS_ID}|$row->{OPTION_MASK}|$row->{MJD_MIN}|$row->{MJD_MAX}|";
     $rowinfo   .= "$row->{REQFILT}|$row->{COORD_MASK}|$row->{CENTER_X}|$row->{CENTER_Y}|";
-    $rowinfo   .= "$row->{WIDTH}|$row->{HEIGHT}|";
-
-    return $rowinfo;
-}
+    $rowinfo   .= "$row->{WIDTH}|$row->{HEIGHT}";
+
+    return ($row, $rowinfo);
+}
+
+sub get_exposure_info {
+    my $image_db= shift;
+    my $exp_id = shift;
+
+    if (!$exp_id) {
+        # no exposure id just return zeros
+        # XXX: we could put a value in for filter, but we don't have a good place to find it
+
+        #"$mjd_obs|$ra_obs|$dec_obs|$filter|$exp_time|$fpa_id";
+        return "0|0|0|0|0|0";
+    }
+
+    my $regtool = can_run('regtool') or (warn "Can't find regtool" and $missing_tools = 1);
+    if ($missing_tools) {
+        warn("Can't find required tools.");
+        exit ($PS_EXIT_CONFIG_ERROR);
+    }
+
+    my $command = "$regtool -processedexp -dbname $image_db -exp_id $exp_id";
+
+    # run the tool and parse the output
+    my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) =
+                run(command => $command, verbose => $verbose);
+    unless ($success) {
+        # not sure if we should die here
+        die "cannot get exposure information for $exp_id from image database $image_db";
+    }
+    my $mdcParser = PS::IPP::Metadata::Config->new; # Parser for metadata config files
+
+    my $output = join "", @$stdout_buf;
+    if (!$output) {
+        print STDERR "no output returned from $command\n" if $verbose;
+        return undef;
+    }
+    my $metadata = $mdcParser->parse($output) or die("Unable to parse metdata config doc");
+
+    my $exposures = parse_md_list($metadata);
+    my $numExp = @$exposures;
+
+    die "unexpected number of exposures $numExp found for exp_id: $exp_id in DB: $image_db" if $numExp != 1;
+    
+    my $exp = $exposures->[0];
+
+    #my $info = "$mjd_obs|$ra_obs|$dec_obs|$filter|$exp_time|$fpa_id";
+
+    use constant RADIANS_TO_DEGREES => 90. / atan2(1, 0);
+    my $ra_deg   = $exp->{ra} * RADIANS_TO_DEGREES;
+    my $decl_deg = $exp->{decl} * RADIANS_TO_DEGREES;
+    my $mjd_obs = dateobs_to_mjd($exp->{dateobs}, $exp->{exp_time});
+
+    my $info = "$mjd_obs|$ra_deg|$decl_deg|$exp->{filter}|$exp->{exp_time}|$exp->{exp_name}";
+            
+    return $info;
+}
+
+sub dateobs_to_mjd {
+    my $dateobs = shift;
+    my $exp_time = shift;
+
+    # dateobs is in format: 1970-01-01T00:00:00
+
+    my ($date, $time) = split "T", $dateobs;
+    my ($year, $mon, $day) = split "-", $date;
+    my ($hr, $min, $sec) = split ":", $time;
+
+    my $ticks = timegm($sec, $min, $hr, $day, $mon-1, $year-1900);
+
+    $ticks += $exp_time / 2.0;
+
+    return 40587.0 + ($ticks/86400.);
+}
