Index: /tags/ipp-20120216/PS-IPP-PStamp/lib/PS/IPP/PStamp/Job.pm
===================================================================
--- /tags/ipp-20120216/PS-IPP-PStamp/lib/PS/IPP/PStamp/Job.pm	(revision 33382)
+++ /tags/ipp-20120216/PS-IPP-PStamp/lib/PS/IPP/PStamp/Job.pm	(revision 33383)
@@ -850,4 +850,5 @@
     {
         my $command = "$whichimage $ra $dec";
+        $command .= " --tess_id $requested_tess_id" if $requested_tess_id;
         my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) =
                     run(command => $command, verbose => $verbose);
Index: /tags/ipp-20120216/PS-IPP-PStamp/lib/PS/IPP/PStamp/RequestFile.pm
===================================================================
--- /tags/ipp-20120216/PS-IPP-PStamp/lib/PS/IPP/PStamp/RequestFile.pm	(revision 33382)
+++ /tags/ipp-20120216/PS-IPP-PStamp/lib/PS/IPP/PStamp/RequestFile.pm	(revision 33383)
@@ -27,4 +27,5 @@
                     $PSTAMP_SELECT_PSF
                     $PSTAMP_SELECT_BACKMDL
+                    $PSTAMP_SELECT_JPEG
                     $PSTAMP_SELECT_INVERSE
                     $PSTAMP_SELECT_UNCONV
@@ -64,4 +65,5 @@
 our $PSTAMP_SELECT_PSF       = 16;
 our $PSTAMP_SELECT_BACKMDL   = 32;
+our $PSTAMP_SELECT_JPEG      = 64;
 our $PSTAMP_SELECT_INVERSE   = 1024;
 our $PSTAMP_SELECT_UNCONV    = 2048;
Index: /tags/ipp-20120216/ippconfig/recipes/filerules-mef.mdc
===================================================================
--- /tags/ipp-20120216/ippconfig/recipes/filerules-mef.mdc	(revision 33382)
+++ /tags/ipp-20120216/ippconfig/recipes/filerules-mef.mdc	(revision 33383)
@@ -311,4 +311,6 @@
 PPSTAMP.OUTPUT.MASK     OUTPUT {OUTPUT}.mk.fits                  MASK      COMP_MASK  FPA        TRUE      NONE
 PPSTAMP.OUTPUT.VARIANCE OUTPUT {OUTPUT}.wt.fits                  VARIANCE  COMP_WT    FPA        TRUE      NONE
+PPSTAMP.OUTPUT.JPEG     OUTPUT {OUTPUT}.jpg                      JPEG      NONE       FPA        TRUE      NONE
+PPSTAMP.OUTPUT.JPEG.FLIP OUTPUT {OUTPUT}.jpg                     JPEG      NONE       FPA        TRUE      NONE
 PPSTAMP.CHIP.MEF        OUTPUT {OUTPUT}.ch.fits                  IMAGE     NONE       CHIP       FALSE     MEF
                                                                                      
Index: /tags/ipp-20120216/ippconfig/recipes/filerules-simple.mdc
===================================================================
--- /tags/ipp-20120216/ippconfig/recipes/filerules-simple.mdc	(revision 33382)
+++ /tags/ipp-20120216/ippconfig/recipes/filerules-simple.mdc	(revision 33383)
@@ -291,4 +291,6 @@
 PPSTAMP.OUTPUT.MASK          OUTPUT {OUTPUT}.mk.fits              MASK            COMP_MASK  FPA        TRUE      NONE
 PPSTAMP.OUTPUT.VARIANCE      OUTPUT {OUTPUT}.wt.fits              VARIANCE        COMP_WT    FPA        TRUE      NONE
+PPSTAMP.OUTPUT.JPEG          OUTPUT {OUTPUT}.jpg                  JPEG            NONE       FPA        TRUE      NONE
+PPSTAMP.OUTPUT.JPEG.FLIP     OUTPUT {OUTPUT}.jpg                  JPEG            NONE       FPA        TRUE      NONE
 PPSTAMP.CHIP                 OUTPUT {OUTPUT}.ch.fits              IMAGE           NONE       CHIP       FALSE     NONE
                                                      
Index: /tags/ipp-20120216/ippconfig/recipes/filerules-split.mdc
===================================================================
--- /tags/ipp-20120216/ippconfig/recipes/filerules-split.mdc	(revision 33382)
+++ /tags/ipp-20120216/ippconfig/recipes/filerules-split.mdc	(revision 33383)
@@ -322,7 +322,8 @@
 PPSTAMP.OUTPUT.MASK          OUTPUT {OUTPUT}.mk.fits                  MASK            COMP_MASK  FPA        TRUE      NONE
 PPSTAMP.OUTPUT.VARIANCE      OUTPUT {OUTPUT}.wt.fits                  VARIANCE        COMP_WT    FPA        TRUE      NONE
+PPSTAMP.OUTPUT.JPEG         OUTPUT {OUTPUT}.jpg                      JPEG            NONE       FPA        TRUE      NONE
+PPSTAMP.OUTPUT.JPEG.FLIP    OUTPUT {OUTPUT}.jpg                      JPEG            NONE       FPA        TRUE      NONE
 # mosaic image used for making stamps of raw images. Not saved.
 PPSTAMP.CHIP                 OUTPUT {OUTPUT}.ch.fits                  IMAGE           NONE       CHIP       FALSE     MEF
-PPSTAMP.OUTPUT.JPEG1         OUTPUT {OUTPUT}.jpg                      JPEG            NONE       FPA        TRUE      NONE
                                                                                                               
 PPSIM.OUTPUT                 OUTPUT {OUTPUT}.{CHIP.NAME}.fits         IMAGE           NONE       CHIP       TRUE      SPLIT
Index: /tags/ipp-20120216/ippconfig/recipes/jpeg.mdc
===================================================================
--- /tags/ipp-20120216/ippconfig/recipes/jpeg.mdc	(revision 33382)
+++ /tags/ipp-20120216/ippconfig/recipes/jpeg.mdc	(revision 33383)
@@ -254,2 +254,17 @@
 END
 
+PPSTAMP.OUTPUT.JPEG  	        METADATA
+	COLORMAP	STR	greyscale
+	SCALE.MODE	STR	RANGE
+	SCALE.MIN	F32	 -5.0
+	SCALE.MAX	F32	+10.0
+	OPTIONS		STR	-SB,+X,+Y
+END
+
+PPSTAMP.OUTPUT.JPEG.FLIP        METADATA
+	COLORMAP	STR	greyscale
+	SCALE.MODE	STR	RANGE
+	SCALE.MIN	F32	 -5.0
+	SCALE.MAX	F32	+10.0
+	OPTIONS		STR	-SB,-X,+Y
+END
Index: /tags/ipp-20120216/pstamp/scripts/dqueryparse.pl
===================================================================
--- /tags/ipp-20120216/pstamp/scripts/dqueryparse.pl	(revision 33382)
+++ /tags/ipp-20120216/pstamp/scripts/dqueryparse.pl	(revision 33383)
@@ -17,4 +17,5 @@
 use Pod::Usage qw( pod2usage );
 use File::Temp qw( tempfile tempdir);
+use POSIX;  # for strftime
 
 use PS::IPP::PStamp::RequestFile qw( :standard );
@@ -98,4 +99,40 @@
 my_die("$request_file is version $extver expecting 1 or 2", $PS_EXIT_PROG_ERROR)
     if ($extver ne 1) and ($extver ne 2);
+
+if ($req_id) {
+    my $command = "$pstamptool -listreq  -name $req_name -not_req_id $req_id";
+    # set verbose to false so that error message about request not found doesn't appear in parse_error.txt
+    my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) =
+        run(command => $command, verbose => 0);
+    if ($success) {
+        # -listreq succeeded duplicate request name
+        print STDERR "QUERY_ID $req_name has already been used\n";
+        $command = "$pstamptool -addjob -job_type none -rownum 0 -state stop -fault $PSTAMP_DUP_REQUEST -req_id $req_id";
+        unless ($no_update) {
+            my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) =
+                run(command => $command, verbose => $verbose);
+            if (!$success) {
+                my_die("$command failed", $PS_EXIT_UNKNOWN_ERROR);
+            }
+        } else {
+            print STDERR "skipping $command\n";
+        }
+        
+        my $datestr = strftime "%Y%m%d%H%M%S.$req_id", gmtime;
+        $req_name = "ERROR.$datestr";
+    }
+    $command = "$pstamptool -updatereq -req_id $req_id  -set_name $req_name -set_outProduct $product";
+    unless ($no_update) {
+        ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) =
+            run(command => $command, verbose => $verbose);
+        unless ($success) {
+            my_die("$command failed", $PS_EXIT_UNKNOWN_ERROR);
+        }
+    } else {
+        print STDERR "skipping $command\n";
+    }
+    exit (0);
+}
+
 
 
@@ -357,5 +394,4 @@
             my $component = $query{$fpa_id}{COMPONENT_ID}[$i];
             print "Need to UPDATE $stage $stage_id $component from $data_state\n";
-    ####                           my ($req_id, $outdir, $label, $state, $stage, $stage_id, $component, $need_magic, $imagedb) = @_;
             $dep_id = queue_update_run($req_id, $outdir, $label, $data_state, $stage, $stage_id, $component, 0, $imagedb);
         }
@@ -413,9 +449,25 @@
 }
 
-# XXX: flesh this out once we have a request without duplicate ROWNUMS
 foreach my $rownum (keys %faulted_rows ) {
+    my $outputBase = "$outdir/$job_num" . "_";
     my $fault = $faulted_rows{$rownum};
     $fault = $PSTAMP_NO_IMAGE_MATCH if ($fault eq 'no_fault');
     print STDERR "insert faulted job for $rownum: $fault\n";
+    my $command = "$pstamptool -addjob -req_id $req_id -outputBase $outputBase -job_type detect_query -state stop -rownum $rownum -fault $fault";
+    unless ($no_update) {
+        my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) =
+            run(command => $command, verbose => $verbose);
+        if ($success) {
+            my $job_id = join "", @$stdout_buf;
+            print "   Queued job: $job_id\n";
+        } else {
+            my $exit_status = $error_code >> 8;
+            $exit_status = $PS_EXIT_UNKNOWN_ERROR unless $exit_status;
+            my_die("Unable to perform $command error code: $error_code", $exit_status);
+        }
+    } else {
+        print STDERR "skipping $command\n";
+    }
+    $job_num++;
 }
 
Index: /tags/ipp-20120216/pstamp/scripts/pstamp_job_run.pl
===================================================================
--- /tags/ipp-20120216/pstamp/scripts/pstamp_job_run.pl	(revision 33382)
+++ /tags/ipp-20120216/pstamp/scripts/pstamp_job_run.pl	(revision 33383)
@@ -225,4 +225,5 @@
 
     my $command = "$ppstamp $outputBase $argString $fileArgs";
+    $command .= " -write_jpeg" if ($options & $PSTAMP_SELECT_JPEG);
     $command .= " -dbname $dbname" if $dbname;
     $command .= " -dbserver $dbserver" if $dbserver;
@@ -249,9 +250,10 @@
 
         # Note: we are assuming the contents of the PSTAMP filerules here.
-        my %extensions = ( $PSTAMP_SELECT_IMAGE  => "fits", 
-                           $PSTAMP_SELECT_MASK   => "mk.fits",
-                           $PSTAMP_SELECT_VARIANCE => "wt.fits");
-
-        my $output_mask = $options & ($PSTAMP_SELECT_IMAGE | $PSTAMP_SELECT_MASK | $PSTAMP_SELECT_VARIANCE);
+        my %extensions = ( $PSTAMP_SELECT_IMAGE    => "fits", 
+                           $PSTAMP_SELECT_MASK     => "mk.fits",
+                           $PSTAMP_SELECT_VARIANCE => "wt.fits",
+                           $PSTAMP_SELECT_JPEG     => "jpg");
+
+        my $output_mask = $options & ($PSTAMP_SELECT_IMAGE | $PSTAMP_SELECT_MASK | $PSTAMP_SELECT_VARIANCE | $PSTAMP_SELECT_JPEG);
 
         foreach my $key (keys (%extensions)) {
Index: /tags/ipp-20120216/pstamp/src/ppstampArguments.c
===================================================================
--- /tags/ipp-20120216/pstamp/src/ppstampArguments.c	(revision 33382)
+++ /tags/ipp-20120216/pstamp/src/ppstampArguments.c	(revision 33383)
@@ -21,9 +21,11 @@
     fprintf(stderr, "\n");
     fprintf(stderr, "Optional arguments:\n");
-    fprintf(stderr, "   [-class_id class_id]     selects class_id (only used with -pixcenter)\n");
-    fprintf(stderr, "   [-astrom astrom.cmp] :   provide an alternative astrometry calibration\n");
-    fprintf(stderr, "   [-mask   mk_image] :     mask image\n");
-    fprintf(stderr, "   [-variance var_image] :  variance image\n");
-    fprintf(stderr, "   [-no_censor_masked] : do not set masked pixels to NAN\n");
+    fprintf(stderr, "   [-class_id class_id]  : selects class_id (only used with -pixcenter)\n");
+    fprintf(stderr, "   [-astrom astrom.cmp]  : provide an alternative astrometry calibration\n");
+    fprintf(stderr, "   [-mask   mk_image]    : mask image\n");
+    fprintf(stderr, "   [-variance var_image] : variance image\n");
+    fprintf(stderr, "   [-stage stage]        : stage of input image (raw, chip, warp, stack, diff)\n");
+    fprintf(stderr, "   [-write_jpeg]         : write a JPEG  format of the image stamp\n");
+    // fprintf(stderr, "   [-no_censor_masked]   : do not set masked pixels to NAN\n");
     fprintf(stderr, "\n");
 
@@ -84,4 +86,10 @@
         psArgumentRemove(argnum, &argc, argv);
     }
+    if ((argnum = psArgumentGet(argc, argv, "-write_jpeg"))) {
+        psArgumentRemove(argnum, &argc, argv);
+        options->writeJPEG = true;
+    } else {
+        options->writeJPEG = false;
+    }
 
     pmConfigFileSetsMD(config->arguments, &argc, argv, "ASTROM", "-astrom", "-astromlist");
Index: /tags/ipp-20120216/pstamp/src/ppstampOptions.h
===================================================================
--- /tags/ipp-20120216/pstamp/src/ppstampOptions.h	(revision 33382)
+++ /tags/ipp-20120216/pstamp/src/ppstampOptions.h	(revision 33383)
@@ -16,5 +16,5 @@
     psRegion    roi;            // roi in chip coordinates
     bool        censorMasked;
-
+    bool        writeJPEG;
 } ppstampOptions;
 
Index: /tags/ipp-20120216/pstamp/src/ppstampParseCamera.c
===================================================================
--- /tags/ipp-20120216/pstamp/src/ppstampParseCamera.c	(revision 33382)
+++ /tags/ipp-20120216/pstamp/src/ppstampParseCamera.c	(revision 33383)
@@ -8,5 +8,5 @@
 
 // Set up the ppstamp output Image file
-bool setupOutput(pmConfig *config, pmFPAfile *input, psString stage, bool doMask, bool doWeight)
+bool setupOutput(pmConfig *config, pmFPAfile *input, psString stage, bool doMask, bool doWeight, pmFPAfile **pOutput)
 {
     pmFPAfile *output;
@@ -22,4 +22,5 @@
         return false;
     }
+    *pOutput = output;
 
     output->save = true;
@@ -33,4 +34,5 @@
         outWeight->save = true;
     }
+
 
     return true;
@@ -76,5 +78,4 @@
         
 
-
     // XXX: create a filerule for PPSTAMP.ASTROM
     pmFPAfile *astrom = pmFPAfileDefineFromArgs(&status, config, "PSWARP.ASTROM", "ASTROM");
@@ -95,10 +96,11 @@
 
     // Set up the output target
-    if (!setupOutput(config, input, options->stage, doMask, doWeight)) {
+    pmFPAfile *output;
+    if (!setupOutput(config, input, options->stage, doMask, doWeight, &output)) {
         psError(PS_ERR_UNKNOWN, false, "Unable to setup output.");
         return false;
     }
 
-    pmFPAfile *chipImage = pmFPAfileDefineChipMosaic(config, input->fpa, "PPSTAMP.CHIP");
+    pmFPAfile *chipImage = pmFPAfileDefineChipMosaic(config, output->fpa, "PPSTAMP.CHIP");
     if (!chipImage) {
         psError(PS_ERR_IO, false, _("Unable to generate new file from PPSTAMP.CHIP"));
@@ -108,4 +110,26 @@
         psError(PS_ERR_IO, true, "PPSTAMP.CHIP is not of type IMAGE");
         return NULL;
+    }
+
+    if (options->writeJPEG) {
+        char *filerule;
+        // If stage is chip flip the X axis otherwise don't flip.
+        // XXX: is this the right thing to do?
+        // Shouldn't the JPEG match the stamp even for chip stage?
+        if (!options->stage || strcmp(options->stage, "chip")) {
+            filerule = "PPSTAMP.OUTPUT.JPEG";
+        } else {
+            filerule = "PPSTAMP.OUTPUT.JPEG.FLIP";
+        }
+        pmFPAfile *jpg = pmFPAfileDefineOutput(config, output->fpa, filerule);
+        if (!jpg) {
+            psError(PS_ERR_IO, false, "Unable to generate new file from %s", filerule);
+            return NULL;
+        }
+        if (jpg->type != PM_FPA_FILE_JPEG) {
+            psError(PS_ERR_IO, true, "%s is not of type JPEG", filerule);
+            return NULL;
+        }
+        jpg->save = true;
     }
 
